我有一些硬件信号是根据与场景相关的属性进行切换的,在这些场景中可以切换各个信号。问题在于,定义场景的信号和属性可能会全部更改。我被迫考虑一个基于模块化框架的设计,其中有SignalManager处理信号的产生,并且有一个SignalPropertiesData与之SignalPropertiesDataManager关联的特定SignalScenario结构,所有这些都是由SignalManager。我希望遵循C编程范例中的公共接口,私有数据。
当遇到类型安全和此类问题时,我的困境通常是C。唯一的解决方案是丢失类型安全,并对所有类型的数据使用“ void”。您能指出我在广阔的开源海洋中的任何代码或组件,它们都可以作为此问题的正确参考。
signal_manager.h:
#ifdef _SIGNAL_MANAGER_H #define _SIGNAL_MANAGER_H int createSignal(SignalDescPtr signalDescPtr); int destroySignal(); typedef struct SignalDesc* SignalDescPtr; #endif
signal_manager.c:
#include "signal_manager.h" typedef struct { char* signalName; unsigned int signalId; SignalPropertiesDataPtr signalProperties; } SignalDesc;
signal_properties_data.h:
#ifdef _SIGNAL_PROPERTIES_DATA #define _SIGNAL_PROPERTIES_DATA typedef enum { SIGNAL_DATA_INT_TYPE, SIGNAL_DATA_UNSIGNED_INT_TYPE, SIGNAL_DATA_FLOAT_TYPE, : SIGNAL_DATA_UNSPECIFIED_BASIC_TYPE } eSignalBasicType; typedef enum { SIGNAL_DATA_LIST_ARRAY_TYPE, SIGNAL_DATA_LIST_ADT_TYPE, : : SIGNAL_DATA_LIST_UNSPECIFIED_TYPE } eSignalComplexType typdef union { eSignalBasicType signalBasicType; eSignalComplexType signalComplexType; } eSignalType; typedef struct { eSignalType signalType; unsigned int signalDataLen; } SignalDataValueType; typedef SignalPropertiesData* SignalPropertiesDataPtr; result_t setSignalType(..); result_ getSignalType(..); result_t setSignalData(..); result_t getSignalData(..); result_t setSignalDataLen(..); result_t getSignalDataLen(..); #endif
signal_properties_data.c:
#include "signal_properties_data.h" typdef struct { SignalDataValueType signalPropertiesDataType; void* signalPropertiesDataValue; } SignalPropertiesData;
signal_properties_data_mgr.h:
#ifdef _SIGNAL_PROPERTIES_DATA_MGR_H #define _SIGNAL_PROPERTIES_DATA_MGR_H #include "signal_properties_data.h" #include "signal_scenario.h" typedef SignalScenarioDesc* SignalScenarioDescPtr; result_t createSignalPropertiesData(SignalPropertiesDataPtr *signalPropDataPtr, eSignalType desiredSignalType); result_t freeSignalPropertiesData(..); result_t associateSignalToggleScenario(SignalPropertiesDataPtr *signalPropDataPtr, SignalScenPtr signalScenPtr); result_t disassociateSignalToggleScenario(SignalPropertiesDataPtr *signalPropDataPtr, SignalScenarioDescPtr signalScenPtr); #endif
signal_properties_data_mgr.c:
#include "signal_properties_data_mgr.h" typedef struct { toggleFuncPtr fptr; } SignalScenarioDesc;