Repository: nasa/fprime (language: python)

Issue:
Create F´ Interfaces From Existing Concepts
| | |
|:---|:---|
|**_F´ Version_**| |
|**_Affected Component_**|  |
---
## Feature Description

Many F´ concepts can be reworked as F´ interfaces. These are specialized `.fppi` files that define a set of ports.  An example would be: https://github.com/nasa/fprime/blob/devel/Drv/Interfaces/ByteStreamDriverInterface.fppi.

Interfaces are expected to live in a folder `Interfaces` under a given package (e.g. `Drv/Interfaces` or `Svc/Sinterfaces`).

> New interfaces should use the filename pattern `*.interface.fppi` and not just `.fppi`. This is a change since the example was created.

Here is a list of interfaces that should be created:
- [x] Event Ports: https://github.com/nasa/fprime/issues/2584
- [x] Telemetry Ports: https://github.com/nasa/fprime/issues/2585
- [x] Command Ports: https://github.com/nasa/fprime/issues/2586
- [ ] `Svc::ComInterface`: https://github.com/nasa/fprime/issues/2257
- [ ] `Drv::I2cDriver`: https://github.com/nasa/fprime/issues/2580
- [x] `Drv::GpioDriver`: https://github.com/nasa/fprime/issues/2581
- [ ] `Drv::SpiDriver`: https://github.com/nasa/fprime/issues/2582
- [x] `Drv::TickDriver`: https://github.com/nasa/fprime/issues/2583
- [x] UART and TCP Driver: https://github.com/nasa/fprime/issues/2255
- [x] Time: https://github.com/nasa/fprime/issues/2579, https://github.com/nasa/fprime/issues/2256

> I2c, Gpio, Spi, and ByteStreamDriver items should also have a `*UserInterface.fppi` for callers/managers using these inferaces.  These issues have not been created.  These are the same ports with the directions reversed.



Discussion / hints:

Fix patch:
diff --git a/Fw/Interfaces/ChannelInterface.fppi b/Fw/Interfaces/ChannelInterface.fppi
new file mode 100644
index 0000000000..7e62cf4cc3
--- /dev/null
+++ b/Fw/Interfaces/ChannelInterface.fppi
@@ -0,0 +1,2 @@
+    @ Telemetry port
+    telemetry port tlmOut
\ No newline at end of file
diff --git a/Ref/SignalGen/SignalGen.fpp b/Ref/SignalGen/SignalGen.fpp
index 6cbdfe0360..ec94b4bc1a 100644
--- a/Ref/SignalGen/SignalGen.fpp
+++ b/Ref/SignalGen/SignalGen.fpp
@@ -50,9 +50,6 @@ module Ref {
     @ Time get port
     time get port timeCaller
 
-    @ Telemetry port
-    telemetry port tlmOut
-
     @ Signal generation data product record
     product record DataRecord: SignalInfo id 0
 
@@ -83,6 +80,7 @@ module Ref {
     # ----------------------------------------------------------------------
     include "../../Fw/Interfaces/EventsInterface.fppi"
     include "../../Fw/Interfaces/CommandInterface.fppi"
+    include "../../Fw/Interfaces/ChannelInterface.fppi"
 
   }
 


Test patch:
diff --git a/cmake/test/src/test_ref_shared.py b/cmake/test/src/test_ref_shared.py
index 8c1bba6acc..4681fa9893 100644
--- a/cmake/test/src/test_ref_shared.py
+++ b/cmake/test/src/test_ref_shared.py
@@ -109,7 +109,15 @@ def test_ref_module_info(REF_BUILD):
     assert ["SignalGen.cpp"] == [
         Path(source).name for source in sources
     ], "Did not find expected sources"
-    expected_ac = ["SignalGen.fpp", "Commands.fppi", "Events.fppi", "Telemetry.fppi"]
+    expected_ac = [
+        "SignalGen.fpp",
+        "Commands.fppi",
+        "Events.fppi",
+        "Telemetry.fppi",
+        "CommandInterface.fppi",
+        "ChannelInterface.fppi",
+        "EventsInterface.fppi",
+    ]
     actual_ac = [Path(source).name for source in ac_sources]
     assert sorted(expected_ac) == sorted(
         actual_ac
diff --git a/cmake/test/src/test_unittests.py b/cmake/test/src/test_unittests.py
index 7a07c3471d..d353901c3b 100644
--- a/cmake/test/src/test_unittests.py
+++ b/cmake/test/src/test_unittests.py
@@ -130,7 +130,15 @@ def test_unittest_module_ut_info(UT_BUILD):
     assert sorted(["SignalGenTester.cpp", "SignalGenTestMain.cpp"]) == sorted(
         [Path(source).name for source in sources]
     ), "Did not find expected sources"
-    expected_ac = ["SignalGen.fpp", "Commands.fppi", "Events.fppi", "Telemetry.fppi"]
+    expected_ac = [
+        "SignalGen.fpp",
+        "Commands.fppi",
+        "Events.fppi",
+        "Telemetry.fppi",
+        "CommandInterface.fppi",
+        "ChannelInterface.fppi",
+        "EventsInterface.fppi",
+    ]
     actual_ac = [Path(source).name for source in ac_sources]
     assert sorted(expected_ac) == sorted(
         actual_ac