Add tests for port invocation code

This commit is contained in:
Rob Bocchino 2025-11-17 17:35:27 -08:00
parent 2db9e58f1b
commit 17f6aa2097
15 changed files with 569 additions and 0 deletions

View File

@ -0,0 +1,262 @@
// ======================================================================
// \title TypedPortsTopologyAc.cpp
// \author Generated by fpp-to-cpp
// \brief cpp file for TypedPorts topology
// ======================================================================
#include "TypedPortsTopologyAc.hpp"
// ----------------------------------------------------------------------
// Component instances
// ----------------------------------------------------------------------
namespace M {
M::PassiveReceiver passiveReceiver(FW_OPTIONAL_NAME("passiveReceiver"));
}
namespace M {
M::PassiveSender passiveSender(FW_OPTIONAL_NAME("passiveSender"));
}
namespace M {
// ----------------------------------------------------------------------
// Helper functions
// ----------------------------------------------------------------------
void initComponents(const TopologyState& state) {
M::passiveReceiver.init(InstanceIds::M_passiveReceiver);
M::passiveSender.init(InstanceIds::M_passiveSender);
}
void configComponents(const TopologyState& state) {
// Nothing to do
}
void setBaseIds() {
M::passiveSender.setIdBase(BaseIds::M_passiveSender);
M::passiveReceiver.setIdBase(BaseIds::M_passiveReceiver);
}
void connectComponents() {
#ifndef FW_DIRECT_PORT_CALLS
// C
M::passiveSender.set_p1_OutputPort(
0,
M::passiveReceiver.get_p1_InputPort(0)
);
M::passiveSender.set_p1_OutputPort(
1,
M::passiveReceiver.get_p1_InputPort(0)
);
M::passiveSender.set_p2_OutputPort(
0,
M::passiveReceiver.get_p2_InputPort(1)
);
M::passiveSender.set_p2_OutputPort(
1,
M::passiveReceiver.get_p2_InputPort(0)
);
#endif
}
void regCommands() {
// Nothing to do
}
void readParameters() {
// Nothing to do
}
void loadParameters() {
// Nothing to do
}
void startTasks(const TopologyState& state) {
// Nothing to do
}
void stopTasks(const TopologyState& state) {
// Nothing to do
}
void freeThreads(const TopologyState& state) {
// Nothing to do
}
void tearDownComponents(const TopologyState& state) {
// Nothing to do
}
// ----------------------------------------------------------------------
// Setup and teardown functions
// ----------------------------------------------------------------------
void setup(const TopologyState& state) {
initComponents(state);
configComponents(state);
setBaseIds();
connectComponents();
regCommands();
readParameters();
loadParameters();
startTasks(state);
}
void teardown(const TopologyState& state) {
stopTasks(state);
freeThreads(state);
tearDownComponents(state);
}
}
#if FW_DIRECT_PORT_CALLS
// ----------------------------------------------------------------------
// Topology-dependent component implementation
// ----------------------------------------------------------------------
namespace M {
bool PassiveSenderComponentBase::isConnected_p1_OutputPort(FwIndexType portNum) const {
FW_ASSERT(
(0 <= portNum) && (portNum < NUM_P1_OUTPUT_PORTS),
static_cast<FwAssertArgType>(portNum),
static_cast<FwAssertArgType>(NUM_P1_OUTPUT_PORTS)
);
bool result = false;
const auto instance = this->getInstance();
switch (instance) {
case ::M::InstanceIds::M_passiveSender:
switch (portNum) {
case 0:
result = true;
break;
case 1:
result = true;
break;
default:
break;
}
break;
default:
FW_ASSERT(0, static_cast<FwAssertArgType>(instance));
break;
}
return result;
}
bool PassiveSenderComponentBase::isConnected_p2_OutputPort(FwIndexType portNum) const {
FW_ASSERT(
(0 <= portNum) && (portNum < NUM_P2_OUTPUT_PORTS),
static_cast<FwAssertArgType>(portNum),
static_cast<FwAssertArgType>(NUM_P2_OUTPUT_PORTS)
);
bool result = false;
const auto instance = this->getInstance();
switch (instance) {
case ::M::InstanceIds::M_passiveSender:
switch (portNum) {
case 0:
result = true;
break;
case 1:
result = true;
break;
default:
break;
}
break;
default:
FW_ASSERT(0, static_cast<FwAssertArgType>(instance));
break;
}
return result;
}
void PassiveSenderComponentBase::p1_out(
FwIndexType portNum,
U32 x
) const {
FW_ASSERT(
(0 <= portNum) && (portNum < NUM_P1_OUTPUT_PORTS),
static_cast<FwAssertArgType>(portNum),
static_cast<FwAssertArgType>(NUM_P1_OUTPUT_PORTS)
);
const auto instance = this->getInstance();
switch (instance) {
case ::M::InstanceIds::M_passiveSender:
switch (portNum) {
case 0:
M::passiveReceiver.p1_handlerBase(
0,
x
);
break;
case 1:
M::passiveReceiver.p1_handlerBase(
0,
x
);
break;
default:
FW_ASSERT(0, static_cast<FwAssertArgType>(portNum));
break;
}
break;
default:
FW_ASSERT(0, static_cast<FwAssertArgType>(instance));
break;
}
}
U32 PassiveSenderComponentBase::p2_out(
FwIndexType portNum,
U32 x
) const {
FW_ASSERT(
(0 <= portNum) && (portNum < NUM_P2_OUTPUT_PORTS),
static_cast<FwAssertArgType>(portNum),
static_cast<FwAssertArgType>(NUM_P2_OUTPUT_PORTS)
);
const auto instance = this->getInstance();
U32 _result = {};
switch (instance) {
case ::M::InstanceIds::M_passiveSender:
switch (portNum) {
case 0:
_result = M::passiveReceiver.p2_handlerBase(
1,
x
);
break;
case 1:
_result = M::passiveReceiver.p2_handlerBase(
0,
x
);
break;
default:
FW_ASSERT(0, static_cast<FwAssertArgType>(portNum));
break;
}
break;
default:
FW_ASSERT(0, static_cast<FwAssertArgType>(instance));
break;
}
return _result;
}
}
#endif

View File

@ -0,0 +1,117 @@
// ======================================================================
// \title TypedPortsTopologyAc.hpp
// \author Generated by fpp-to-cpp
// \brief hpp file for TypedPorts topology
// ======================================================================
#ifndef M_TypedPortsTopologyAc_HPP
#define M_TypedPortsTopologyAc_HPP
#include "PassiveReceiver.hpp"
#include "PassiveSender.hpp"
#include "TypedPortsTopologyDefs.hpp"
// ----------------------------------------------------------------------
// Component instances
// ----------------------------------------------------------------------
namespace M {
//! passiveReceiver
extern M::PassiveReceiver passiveReceiver;
}
namespace M {
//! passiveSender
extern M::PassiveSender passiveSender;
}
namespace M {
// ----------------------------------------------------------------------
// Constants
// ----------------------------------------------------------------------
namespace BaseIds {
enum {
M_passiveSender = 0x100,
M_passiveReceiver = 0x200,
};
}
namespace InstanceIds {
enum {
M_passiveReceiver,
M_passiveSender,
};
}
// ----------------------------------------------------------------------
// Helper functions
// ----------------------------------------------------------------------
//! Initialize components
void initComponents(
const TopologyState& state //!< The topology state
);
//! Configure components
void configComponents(
const TopologyState& state //!< The topology state
);
//! Set component base Ids
void setBaseIds();
//! Connect components
void connectComponents();
//! Register commands
void regCommands();
//! Read parameters
void readParameters();
//! Load parameters
void loadParameters();
//! Start tasks
void startTasks(
const TopologyState& state //!< The topology state
);
//! Stop tasks
void stopTasks(
const TopologyState& state //!< The topology state
);
//! Free threads
void freeThreads(
const TopologyState& state //!< The topology state
);
//! Tear down components
void tearDownComponents(
const TopologyState& state //!< The topology state
);
// ----------------------------------------------------------------------
// Setup and teardown functions
// ----------------------------------------------------------------------
//! Set up the topology
void setup(
const TopologyState& state //!< The topology state
);
//! Tear down the topology
void teardown(
const TopologyState& state //!< The topology state
);
}
#endif

View File

@ -0,0 +1,4 @@
*.xml
*.o
*Ac.*
*Ai.*

View File

@ -0,0 +1,29 @@
#ifndef M_Passive_HPP
#define M_Passive_HPP
#include "PassiveComponentAc.hpp"
namespace M {
class Passive :
public PassiveComponentBase
{
public:
Passive(const char* name) {
}
void init(U32 instanceId) {
}
};
// Simulate a concrete implementation
typedef Passive ConcretePassive;
}
#endif

View File

@ -0,0 +1,42 @@
#ifndef M_PassiveReceiver_HPP
#define M_PassiveReceiver_HPP
#include "PassiveReceiverComponentAc.hpp"
namespace M {
class PassiveReceiver :
public PassiveReceiverComponentBase
{
public:
PassiveReceiver() {
}
PassiveReceiver(const char* name) {
}
//! Handler for input port p1
virtual void p1_handler(
FwIndexType portNum, //!< The port number
U32 x
) {
}
//! Handler for input port p2
virtual U32 p2_handler(
FwIndexType portNum, //!< The port number
U32 x
) {
return 0;
}
};
}
#endif

View File

@ -0,0 +1,26 @@
#ifndef M_PassiveSender_HPP
#define M_PassiveSender_HPP
#include "PassiveSenderComponentAc.hpp"
namespace M {
class PassiveSender :
public PassiveSenderComponentBase
{
public:
PassiveSender() {
}
PassiveSender(const char* name) {
}
};
}
#endif

View File

@ -0,0 +1,5 @@
namespace M {
typedef int TopologyState;
}

View File

@ -0,0 +1,25 @@
#!/bin/sh -e
fpp_to_cpp=../../../../../../bin/fpp-to-cpp
fprime_gcc=../../../../../../scripts/fprime-gcc
echo ' removing old files'
./clean
dir=`cd ../..; echo $PWD`
echo ' generating C++'
$fpp_to_cpp -p $dir ../../typed_ports.fpp
for suffix in hpp cpp
do
cp ../../TypedPortsTopologyAc.ref.$suffix TypedPortsTopologyAc.$suffix
done
flags="-I.. -I../../../fprime -I../../../fprime/config -Wno-unused-parameter -c"
echo ' compiling C++'
for variable_flags in '' '-DFW_DIRECT_PORT_CALLS'
do
echo " variable_flags=$variable_flags"
$fprime_gcc $variable_flags $flags TypedPortsTopologyAc.cpp
done

View File

@ -0,0 +1,6 @@
#!/bin/sh -e
for file in `find . -name '*~' -or -name '*Ac.*' -or -name '*Ai.xml' -or -name '*.o'`
do
rm $file
done

View File

@ -3,3 +3,4 @@ Commands
Health
Params
TlmPackets
TypedPorts

View File

@ -49,3 +49,8 @@ tlm_packets()
diff_cpp TwoInstances_P1TlmPackets
}
typed_ports()
{
run_test "-p $PWD" typed_ports && \
diff_cpp TypedPortsTopology
}

View File

@ -6,4 +6,5 @@ nested_namespaces
no_namespace
params
tlm_packets
typed_ports
"

View File

@ -0,0 +1,40 @@
module M {
port P1(x: U32)
port P2(x: U32) -> U32
passive component PassiveSender {
output port p1: [2] P1
output port p2: [2] P2
}
passive component PassiveReceiver {
sync input port p1: [2] P1
sync input port p2: [2] P2
}
instance passiveSender: PassiveSender base id 0x100
instance passiveReceiver: PassiveReceiver base id 0x200
topology TypedPorts {
instance passiveSender
instance passiveReceiver
connections C {
passiveSender.p1 -> passiveReceiver.p1
passiveSender.p1 -> passiveReceiver.p1
passiveSender.p2[0] -> passiveReceiver.p2[1]
passiveSender.p2[1] -> passiveReceiver.p2[0]
}
}
}

View File

@ -48,3 +48,9 @@ tlm_packets()
move_cpp TwoInstancesTopology
move_cpp TwoInstances_P1TlmPackets
}
typed_ports()
{
update "-p $PWD" typed_ports
move_cpp TypedPortsTopology
}