#ifndef FSFW_POWER_POWERSENSOR_H_ #define FSFW_POWER_POWERSENSOR_H_ #include "../datapoollocal/StaticLocalDataSet.h" #include "../devicehandlers/HealthDevice.h" #include "../monitoring/LimitMonitor.h" #include "../parameters/ParameterHelper.h" #include "../objectmanager/SystemObject.h" #include "../ipc/MessageQueueIF.h" class PowerController; /** * @brief Does magic. */ class PowerSensor: public SystemObject, public ReceivesParameterMessagesIF, public HasHealthIF { friend class PowerController; public: struct VariableIds { gp_id_t pidCurrent; gp_id_t pidVoltage; gp_id_t poolIdPower; }; struct DefaultLimits { float currentMin; float currentMax; float voltageMin; float voltageMax; }; struct SensorEvents { Event currentLow; Event currentHigh; Event voltageLow; Event voltageHigh; }; PowerSensor(object_id_t objectId, sid_t sid, VariableIds setIds, DefaultLimits limits, SensorEvents events, uint16_t confirmationCount = 0); virtual ~PowerSensor(); ReturnValue_t calculatePower(); ReturnValue_t performOperation(uint8_t opCode); void setAllMonitorsToUnchecked(); MessageQueueId_t getCommandQueue() const; ReturnValue_t initialize(); void setDataPoolEntriesInvalid(); float getPower(); ReturnValue_t setHealth(HealthState health); HasHealthIF::HealthState getHealth(); ReturnValue_t getParameter(uint8_t domainId, uint8_t uniqueId, ParameterWrapper *parameterWrapper, const ParameterWrapper *newValues, uint16_t startAtIndex); private: MessageQueueIF* commandQueue = nullptr; ParameterHelper parameterHelper; HealthHelper healthHelper; //GlobDataSet set; StaticLocalDataSet<3> powerSensorSet; //Variables in lp_var_t current; lp_var_t voltage; //PIDReader current; //PIDReader voltage; //Variables out lp_var_t power; //gp_float_t power; static const uint8_t MODULE_ID_CURRENT = 1; static const uint8_t MODULE_ID_VOLTAGE = 2; void checkCommandQueue(); protected: LimitMonitor currentLimit; LimitMonitor voltageLimit; }; #endif /* FSFW_POWER_POWERSENSOR_H_ */