/* * GomspaceDefinitions.h * * @brief This file holds all definitions specific for devices from gomspace. * @date 20.12.2020 * @author J. Meier */ #ifndef MISSION_DEVICES_DEVICEDEFINITIONS_GOMSPACEDEFINITIONS_H_ #define MISSION_DEVICES_DEVICEDEFINITIONS_GOMSPACEDEFINITIONS_H_ #include #include #include #include namespace GOMSPACE{ static const uint16_t IGNORE_CHECKSUM = 0xbb0; /** The size of the header of a gomspace CSP packet. */ static const uint8_t GS_HDR_LENGTH = 12; /** CSP port to ping gomspace devices. */ static const uint8_t PING_PORT = 1; static const uint8_t REBOOT_PORT = 4; /** CSP port of gomspace devices to request or set parameters */ static const uint8_t PARAM_PORT = 7; static const uint8_t P60_PORT_GNDWDT_RESET = 9; /* Device commands are derived from the rparam.h of the gomspace lib */ static const DeviceCommandId_t PING = 0x1; //!< [EXPORT] : [COMMAND] static const DeviceCommandId_t NONE = 0x2; // Set when no command is pending static const DeviceCommandId_t REBOOT = 0x4; //!< [EXPORT] : [COMMAND] static const DeviceCommandId_t GNDWDT_RESET = 0x9; //!< [EXPORT] : [COMMAND] static const DeviceCommandId_t PARAM_GET = 0x00; //!< [EXPORT] : [COMMAND] static const DeviceCommandId_t PARAM_SET = 0xFF; //!< [EXPORT] : [COMMAND] static const DeviceCommandId_t REQUEST_HK_TABLE = 0x10; //!< [EXPORT] : [COMMAND] } namespace P60System { enum P60SytemPoolIds: lp_id_t { // typedef struct CurrentOut { // int16_t acuVcc; // int16_t pdu1Vcc; // int16_t x3VccIdle; // int16_t pdu2Vcc; // int16_t acuVbat; // int16_t pdu1Vbat; // int16_t x3VbatIdle; // int16_t pdu2Vbat; // int16_t stackVbat; // int16_t stack3V3; // int16_t stackV5; // int16_t gs3v3; // int16_t gs5V; // } CurrentOut_t; P60DOCK_CURRENT_ACU_VCC, P60DOCK_CURRENT_PDU1_VCC, P60DOCK_CURRENT_X3_IDLE_VCC, P60DOCK_CURRENT_PDU2_VCC, P60DOCK_CURRENT_ACU_VBAT, P60DOCK_CURRENT_PDU1_VBAT, P60DOCK_CURRENT_X3_IDLE_VBAT, P60DOCK_CURRENT_PDU2_VBAT, P60DOCK_CURRENT_STACK_VBAT, P60DOCK_CURRENT_STACK_3V3, P60DOCK_CURRENT_STACK_5V, P60DOCK_CURRENT_GS3V3, P60DOCK_CURRENT_GS5V, P60DOCK_VOLTAGE_ACU_VCC, P60DOCK_VOLTAGE_PDU1_VCC, P60DOCK_VOLTAGE_X3_IDLE_VCC, P60DOCK_VOLTAGE_PDU2_VCC, P60DOCK_VOLTAGE_ACU_VBAT, P60DOCK_VOLTAGE_PDU1_VBAT, P60DOCK_VOLTAGE_X3_IDLE_VBAT, P60DOCK_VOLTAGE_PDU2_VBAT, P60DOCK_VOLTAGE_STACK_VBAT, P60DOCK_VOLTAGE_STACK_3V3, P60DOCK_VOLTAGE_STACK_5V, P60DOCK_VOLTAGE_GS3V3, P60DOCK_VOLTAGE_GS5V, P60DOCK_OUTPUT_ENABLE_STATES, P60DOCK_TEMPERATURE, P60DOCK_BOOT_CAUSE, P60DOCK_BOOT_CNT, P60DOCK_UPTIME, P60DOCK_RESETCAUSE, P60DOCK_BATT_MODE, P60DOCK_HEATER_ON, P60DOCK_CONV_5V_ENABLE_STATUS, P60DOCK_LATCHUP_GROUP, P60DOCK_VBAT_VALUE, P60DOCK_VCC_CURRENT_VALUE, P60DOCK_BATTERY_CURRENT, P60DOCK_BATTERY_VOLTAGE, P60DOCK_BATTERY_TEMPERATURES, P60DOCK_DEVICE_TYPE_GROUP, P60DOCK_DEVICE_STATUS_GROUP, P60DOCK_DEARM_STATUS, P60DOCK_WDT_CNT_GND, P60DOCK_WDT_CNT_I2C, P60DOCK_WDT_CNT_CAN, P60DOCK_WDT_CNT_CSP_1, P60DOCK_WDT_CNT_CSP_2, P60DOCK_WDT_GND_LEFT, P60DOCK_WDT_I2C_LEFT, P60DOCK_WDT_CAN_LEFT, P60DOCK_WDT_CSP_LEFT_1, P60DOCK_WDT_CSP_LEFT_2, P60DOCK_BATT_CHARGE_CURRENT, P60DOCK_BATT_DISCHARGE_CURRENT, P60DOCK_ANT6_DEPL, P60DOCK_AR6_DEPL, PDU1_CURRENT_OUT_TCS_BOARD_3V3, PDU1_CURRENT_OUT_SYRLINKS, PDU1_CURRENT_OUT_STAR_TRACKER, PDU1_CURRENT_OUT_MGT, PDU1_CURRENT_OUT_SUS_NOMINAL, PDU1_CURRENT_OUT_SOLAR_CELL_EXP, PDU1_CURRENT_OUT_PLOC, PDU1_CURRENT_OUT_ACS_BOARD_SIDE_A, PDU1_CURRENT_OUT_CHANNEL8, PDU1_VOLTAGE_OUT_TCS_BOARD_3V3, PDU1_VOLTAGE_OUT_SYRLINKS, PDU1_VOLTAGE_OUT_STAR_TRACKER, PDU1_VOLTAGE_OUT_MGT, PDU1_VOLTAGE_OUT_SUS_NOMINAL, PDU1_VOLTAGE_OUT_SOLAR_CELL_EXP, PDU1_VOLTAGE_OUT_PLOC, PDU1_VOLTAGE_OUT_ACS_BOARD_SIDE_A, PDU1_VOLTAGE_OUT_CHANNEL8, PDU1_VCC, PDU1_VBAT, PDU1_TEMPERATURE, PDU1_CONV_EN, PDU1_OUT_EN_TCS_BOARD_3V3, PDU1_OUT_EN_SYRLINKS, PDU1_OUT_EN_STAR_TRACKER, PDU1_OUT_EN_MGT, PDU1_OUT_EN_SUS_NOMINAL, PDU1_OUT_EN_SOLAR_CELL_EXP, PDU1_OUT_EN_PLOC, PDU1_OUT_EN_ACS_BOARD_SIDE_A, PDU1_OUT_EN_CHANNEL8, PDU1_BOOTCAUSE, PDU1_BOOTCNT, PDU1_UPTIME, PDU1_RESETCAUSE, PDU1_BATT_MODE, PDU1_LATCHUP, PDU1_DEVICE_0, PDU1_DEVICE_1, PDU1_DEVICE_2, PDU1_DEVICE_3, PDU1_DEVICE_4, PDU1_DEVICE_5, PDU1_DEVICE_6, PDU1_DEVICE_7, PDU1_DEVICE_0_STATUS, PDU1_DEVICE_1_STATUS, PDU1_DEVICE_2_STATUS, PDU1_DEVICE_3_STATUS, PDU1_DEVICE_4_STATUS, PDU1_DEVICE_5_STATUS, PDU1_DEVICE_6_STATUS, PDU1_DEVICE_7_STATUS, PDU1_WDT_CNT_GND, PDU1_WDT_CNT_I2C, PDU1_WDT_CNT_CAN, PDU1_WDT_CNT_CSP, PDU1_WDT_GND_LEFT, PDU1_WDT_I2C_LEFT, PDU1_WDT_CAN_LEFT, PDU1_WDT_CSP_LEFT, PDU2_CURRENT_OUT_Q7S, PDU2_CURRENT_OUT_PAYLOAD_PCDU_CH1, PDU2_CURRENT_OUT_RW, PDU2_CURRENT_OUT_TCS_BOARD_HEATER_IN, PDU2_CURRENT_OUT_SUS_REDUNDANT, PDU2_CURRENT_OUT_DEPLOYMENT_MECHANISM, PDU2_CURRENT_OUT_PAYLOAD_PCDU_CH6, PDU2_CURRENT_OUT_ACS_BOARD_SIDE_B, PDU2_CURRENT_OUT_PAYLOAD_CAMERA, PDU2_VOLTAGE_OUT_Q7S, PDU2_VOLTAGE_OUT_PAYLOAD_PCDU_CH1, PDU2_VOLTAGE_OUT_RW, PDU2_VOLTAGE_OUT_TCS_BOARD_HEATER_IN, PDU2_VOLTAGE_OUT_SUS_REDUNDANT, PDU2_VOLTAGE_OUT_DEPLOYMENT_MECHANISM, PDU2_VOLTAGE_OUT_PAYLOAD_PCDU_CH6, PDU2_VOLTAGE_OUT_ACS_BOARD_SIDE_B, PDU2_VOLTAGE_OUT_PAYLOAD_CAMERA, PDU2_VCC, PDU2_VBAT, PDU2_TEMPERATURE, PDU2_CONV_EN, PDU2_OUT_EN_Q7S, PDU2_OUT_EN_PAYLOAD_PCDU_CH1, PDU2_OUT_EN_RW, PDU2_OUT_EN_TCS_BOARD_HEATER_IN, PDU2_OUT_EN_SUS_REDUNDANT, PDU2_OUT_EN_DEPLOYMENT_MECHANISM, PDU2_OUT_EN_PAYLOAD_PCDU_CH6, PDU2_OUT_EN_ACS_BOARD_SIDE_B, PDU2_OUT_EN_PAYLOAD_CAMERA, PDU2_BOOTCAUSE, PDU2_BOOTCNT, PDU2_UPTIME, PDU2_RESETCAUSE, PDU2_BATT_MODE, PDU2_LATCHUP, PDU2_DEVICE_0, PDU2_DEVICE_1, PDU2_DEVICE_2, PDU2_DEVICE_3, PDU2_DEVICE_4, PDU2_DEVICE_5, PDU2_DEVICE_6, PDU2_DEVICE_7, PDU2_DEVICE_0_STATUS, PDU2_DEVICE_1_STATUS, PDU2_DEVICE_2_STATUS, PDU2_DEVICE_3_STATUS, PDU2_DEVICE_4_STATUS, PDU2_DEVICE_5_STATUS, PDU2_DEVICE_6_STATUS, PDU2_DEVICE_7_STATUS, PDU2_WDT_CNT_GND, PDU2_WDT_CNT_I2C, PDU2_WDT_CNT_CAN, PDU2_WDT_CNT_CSP, PDU2_WDT_GND_LEFT, PDU2_WDT_I2C_LEFT, PDU2_WDT_CAN_LEFT, PDU2_WDT_CSP_LEFT, ACU_CURRENT_IN_GROUP, ACU_VOLTAGE_IN_GROUP, ACU_VCC, ACU_VBAT, ACU_TEMPERATURE_GROUP, ACU_MPPT_MODE, ACU_VBOOST_GROUP, ACU_POWER_GROUP, ACU_DAC_EN_GROUP, ACU_DAC_VAL_GROUP, ACU_BOOTCAUSE, ACU_BOOTCNT, ACU_UPTIME, ACU_RESET_CAUSE, ACU_MPPT_TIME, ACU_MPPT_PERIOD, ACU_DEVICE_TYPE_GROUP, ACU_DEVICE_STATUS_GROUP, ACU_WDT_CNT_GND, ACU_WDT_GND_LEFT }; } namespace P60Dock { /* The maximum size of a reply from the P60 dock. Maximum size is reached * when retrieving the full parameter configuration table. 412 bytes of * payload data and 12 bytes of CSP header data. */ static const uint16_t MAX_REPLY_LENGTH = 424; static const uint16_t MAX_CONFIGTABLE_ADDRESS = 408; static const uint16_t MAX_HKTABLE_ADDRESS = 187; static const uint16_t HK_TABLE_SIZE = 188; static const uint8_t HK_TABLE_DATA_SET_ID = 0x3; static const uint8_t HK_TABLE_ENTRIES = 35; typedef struct VoltageOut { uint16_t acuVcc; uint16_t pdu1Vcc; uint16_t x3VccIdle; uint16_t pdu2Vcc; uint16_t acuVbat; uint16_t pdu1Vbat; uint16_t x3VbatIdle; uint16_t pdu2Vbat; uint16_t stackVbat; uint16_t stack3V3; uint16_t stackV5; uint16_t gs3v3; uint16_t gs5V; } VoltageOut_t; /** 1 - output is enabled, 0 - output disabled. */ typedef struct OuputEnableState { uint8_t acuVcc; uint8_t pdu1Vcc; uint8_t x3VccIdle; uint8_t pdu2Vcc; uint8_t acuVbat; uint8_t pdu1Vbat; uint8_t x3VbatIdle; uint8_t pdu2Vbat; uint8_t stackVbat; uint8_t stack3V3; uint8_t stackV5; uint8_t gs3v3; uint8_t gs5V; } OuputEnableState_t; /** Latchup count for output channels */ typedef struct LatchupGroup { uint16_t acuVcc; uint16_t pdu1Vcc; uint16_t x3VccIdle; uint16_t pdu2Vcc; uint16_t acuVbat; uint16_t pdu1Vbat; uint16_t x3VbatIdle; uint16_t pdu2Vbat; uint16_t stackVbat; uint16_t stack3V3; uint16_t stackV5; uint16_t gs3v3; uint16_t gs5V; } LatchupGroup_t; typedef struct Temperature { int16_t location1; int16_t location2; } Temperature_t; typedef struct BatteryPackTemperature { int16_t location1; int16_t location2; } BatteryPackTemperature_t; typedef struct DeviceTypeGroup { uint8_t device0; uint8_t device1; uint8_t device2; uint8_t device3; uint8_t device4; uint8_t device5; uint8_t device6; uint8_t device7; } DeviceTypeGroup_t; typedef struct DeviceStatusGroup { uint8_t device0; uint8_t device1; uint8_t device2; uint8_t device3; uint8_t device4; uint8_t device5; uint8_t device6; uint8_t device7; } DeviceStatusGroup_t; /** * @brief This class defines a dataset for the hk table of the P60 Dock. */ class HkTableDataset: public StaticLocalDataSet { public: HkTableDataset(HasLocalDataPoolIF* owner): StaticLocalDataSet(owner, HK_TABLE_DATA_SET_ID) { } HkTableDataset(object_id_t objectId): StaticLocalDataSet(sid_t(objectId, HK_TABLE_DATA_SET_ID)) { } lp_var_t currentsOut = lp_var_t(sid.objectId, P60System::P60DOCK_CURRENTS_OUT, this); lp_var_t voltagesOut = lp_var_t(sid.objectId, P60System::P60DOCK_VOLTAGES_OUT, this); lp_var_t outputEnableStates = lp_var_t(sid.objectId, P60System::P60DOCK_OUTPUT_ENABLE_STATES, this); lp_var_t temperatures = lp_var_t(sid.objectId, P60System::P60DOCK_TEMPERATURE, this); lp_var_t bootcause = lp_var_t(sid.objectId, P60System::P60DOCK_BOOT_CAUSE, this); lp_var_t bootCount = lp_var_t(sid.objectId, P60System::P60DOCK_BOOT_CNT, this); lp_var_t uptime = lp_var_t(sid.objectId, P60System::P60DOCK_UPTIME, this); lp_var_t resetcause = lp_var_t(sid.objectId, P60System::P60DOCK_RESETCAUSE, this); lp_var_t battMode = lp_var_t(sid.objectId, P60System::P60DOCK_BATT_MODE, this); /** Battery heater control only possible on BP4 packs */ lp_var_t heaterOn = lp_var_t(sid.objectId, P60System::P60DOCK_HEATER_ON, this); lp_var_t converter5VStatus = lp_var_t(sid.objectId, P60System::P60DOCK_CONV_5V_ENABLE_STATUS, this); lp_var_t latchupGroup = lp_var_t(sid.objectId, P60System::P60DOCK_LATCHUP_GROUP, this); lp_var_t vbatVoltageValue = lp_var_t(sid.objectId, P60System::P60DOCK_VBAT_VALUE, this); lp_var_t vccCurrent = lp_var_t(sid.objectId, P60System::P60DOCK_VCC_CURRENT_VALUE, this); lp_var_t batteryCurrent = lp_var_t(sid.objectId, P60System::P60DOCK_BATTERY_CURRENT, this); lp_var_t batteryVoltage = lp_var_t(sid.objectId, P60System::P60DOCK_BATTERY_VOLTAGE, this); lp_var_t batteryTemperatures = lp_var_t(sid.objectId, P60System::P60DOCK_BATTERY_TEMPERATURES, this); lp_var_t deviceTypeGroup = lp_var_t(sid.objectId, P60System::P60DOCK_DEVICE_TYPE_GROUP, this); lp_var_t deviceStatusGroup = lp_var_t(sid.objectId, P60System::P60DOCK_DEVICE_STATUS_GROUP, this); lp_var_t dearmSatus = lp_var_t(sid.objectId, P60System::P60DOCK_DEARM_STATUS, this); lp_var_t wdtCntGnd = lp_var_t(sid.objectId, P60System::P60DOCK_WDT_CNT_GND, this); lp_var_t wdtCntI2c = lp_var_t(sid.objectId, P60System::P60DOCK_WDT_CNT_I2C, this); lp_var_t wdtCntCan = lp_var_t(sid.objectId, P60System::P60DOCK_WDT_CNT_CAN, this); lp_var_t wdtCntCsp1 = lp_var_t(sid.objectId, P60System::P60DOCK_WDT_CNT_CSP_1, this); lp_var_t wdtCntCsp2 = lp_var_t(sid.objectId, P60System::P60DOCK_WDT_CNT_CSP_2, this); lp_var_t wdtGndLeft = lp_var_t(sid.objectId, P60System::P60DOCK_WDT_GND_LEFT, this); lp_var_t wdtI2cLeft = lp_var_t(sid.objectId, P60System::P60DOCK_WDT_I2C_LEFT, this); lp_var_t wdtCanLeft = lp_var_t(sid.objectId, P60System::P60DOCK_WDT_CAN_LEFT, this); lp_var_t wdtCspLeft1 = lp_var_t(sid.objectId, P60System::P60DOCK_WDT_CSP_LEFT_1, this); lp_var_t wdtCspLeft2 = lp_var_t(sid.objectId, P60System::P60DOCK_WDT_CSP_LEFT_2, this); lp_var_t batteryChargeCurrent = lp_var_t(sid.objectId, P60System::P60DOCK_BATT_CHARGE_CURRENT, this); lp_var_t batteryDishargeCurrent = lp_var_t(sid.objectId, P60System::P60DOCK_BATT_DISCHARGE_CURRENT, this); lp_var_t ant6Depl = lp_var_t(sid.objectId, P60System::P60DOCK_ANT6_DEPL, this); lp_var_t ar6Depl = lp_var_t(sid.objectId, P60System::P60DOCK_AR6_DEPL, this); }; } /** * @brief Constants common for both PDU1 and PDU2. */ namespace PDU{ /* When retrieving full configuration parameter table */ static const uint16_t MAX_REPLY_LENGTH = 318; static const uint16_t MAX_CONFIGTABLE_ADDRESS = 316; static const uint16_t MAX_HKTABLE_ADDRESS = 140; static const uint16_t HK_TABLE_SIZE = 145; static const uint8_t HK_TABLE_ENTRIES = 60; } namespace PDU1 { static const uint32_t HK_TABLE_DATA_SET_ID = 0x1; // hk table has table id 4 /** * Addresses within configuration table to enable or disable output channels. Refer also to * gs-man-nanopower-p60-pdu-200.pdf on page 16. */ static const uint16_t CONFIG_ADDRESS_OUT_EN_TCS_BOARD_3V3 = 0x48; static const uint16_t CONFIG_ADDRESS_OUT_EN_SYRLINKS = 0x49; static const uint16_t CONFIG_ADDRESS_OUT_EN_STAR_TRACKER = 0x50; static const uint16_t CONFIG_ADDRESS_OUT_EN_MGT = 0x51; static const uint16_t CONFIG_ADDRESS_OUT_EN_SUS_NOMINAL = 0x52; static const uint16_t CONFIG_ADDRESS_OUT_EN_SOLAR_CELL_EXP = 0x53; static const uint16_t CONFIG_ADDRESS_OUT_EN_PLOC = 0x54; static const uint16_t CONFIG_ADDRESS_OUT_EN_ACS_BOARD_SIDE_A = 0x55; static const uint16_t CONFIG_ADDRESS_OUT_EN_CHANNEL8 = 0x56; /** * @brief This class defines a dataset for the hk table of the PDU1. */ class PDU1HkTableDataset : public StaticLocalDataSet { public: PDU1HkTableDataset(HasLocalDataPoolIF* owner): StaticLocalDataSet(owner, PDU1::HK_TABLE_DATA_SET_ID) { } PDU1HkTableDataset(object_id_t objectId): StaticLocalDataSet(sid_t(objectId, PDU1::HK_TABLE_DATA_SET_ID)) { } /** Measured output currents */ lp_var_t currentOutTCSBoard3V3 = lp_var_t(sid.objectId, P60System::PDU1_CURRENT_OUT_TCS_BOARD_3V3, this); lp_var_t currentOutSyrlinks = lp_var_t(sid.objectId, P60System::PDU1_CURRENT_OUT_SYRLINKS, this); lp_var_t currentOutStarTracker = lp_var_t(sid.objectId, P60System::PDU1_CURRENT_OUT_STAR_TRACKER, this); lp_var_t currentOutMGT = lp_var_t(sid.objectId, P60System::PDU1_CURRENT_OUT_MGT, this); lp_var_t currentOutSUSNominal = lp_var_t(sid.objectId, P60System::PDU1_CURRENT_OUT_SUS_NOMINAL, this); lp_var_t currentOutSolarCellExp = lp_var_t(sid.objectId, P60System::PDU1_CURRENT_OUT_SOLAR_CELL_EXP, this); lp_var_t currentOutPLOC = lp_var_t(sid.objectId, P60System::PDU1_CURRENT_OUT_PLOC, this); lp_var_t currentOutACSBoardSideA = lp_var_t(sid.objectId, P60System::PDU1_CURRENT_OUT_ACS_BOARD_SIDE_A, this); lp_var_t currentOutChannel8 = lp_var_t(sid.objectId, P60System::PDU1_CURRENT_OUT_CHANNEL8, this); /** Measured voltage of output channels */ lp_var_t voltageOutTCSBoard3V3 = lp_var_t(sid.objectId, P60System::PDU1_VOLTAGE_OUT_TCS_BOARD_3V3, this); lp_var_t voltageOutSyrlinks = lp_var_t(sid.objectId, P60System::PDU1_VOLTAGE_OUT_SYRLINKS, this); lp_var_t voltageOutStarTracker = lp_var_t(sid.objectId, P60System::PDU1_VOLTAGE_OUT_STAR_TRACKER, this); lp_var_t voltageOutMGT = lp_var_t(sid.objectId, P60System::PDU1_VOLTAGE_OUT_MGT, this); lp_var_t voltageOutSUSNominal = lp_var_t(sid.objectId, P60System::PDU1_VOLTAGE_OUT_SUS_NOMINAL, this); lp_var_t voltageOutSolarCellExp = lp_var_t(sid.objectId, P60System::PDU1_VOLTAGE_OUT_SOLAR_CELL_EXP, this); lp_var_t voltageOutPLOC = lp_var_t(sid.objectId, P60System::PDU1_VOLTAGE_OUT_PLOC, this); lp_var_t voltageOutACSBoardSideA = lp_var_t(sid.objectId, P60System::PDU1_VOLTAGE_OUT_ACS_BOARD_SIDE_A, this); lp_var_t voltageOutChannel8 = lp_var_t(sid.objectId, P60System::PDU1_VOLTAGE_OUT_CHANNEL8, this); /** Measured VCC */ lp_var_t vcc = lp_var_t(sid.objectId, P60System::PDU1_VCC, this); /** Measured VBAT */ lp_var_t vbat = lp_var_t(sid.objectId, P60System::PDU1_VBAT, this); lp_var_t temperature = lp_var_t(sid.objectId, P60System::PDU1_TEMPERATURE, this); /** Output converter enable status */ lp_var_t converterEnable = lp_var_t(sid.objectId, P60System::PDU1_CONV_EN, this); /** Output channels enable status */ lp_var_t outEnabledTCSBoard3V3 = lp_var_t(sid.objectId, P60System::PDU1_OUT_EN_TCS_BOARD_3V3, this); lp_var_t outEnabledSyrlinks = lp_var_t(sid.objectId, P60System::PDU1_OUT_EN_SYRLINKS, this); lp_var_t outEnabledStarTracker = lp_var_t(sid.objectId, P60System::PDU1_OUT_EN_STAR_TRACKER, this); lp_var_t outEnabledMGT = lp_var_t(sid.objectId, P60System::PDU1_OUT_EN_MGT, this); lp_var_t outEnabledSUSNominal = lp_var_t(sid.objectId, P60System::PDU1_OUT_EN_SUS_NOMINAL, this); lp_var_t outEnabledSolarCellExp = lp_var_t(sid.objectId, P60System::PDU1_OUT_EN_SOLAR_CELL_EXP, this); lp_var_t outEnabledPLOC = lp_var_t(sid.objectId, P60System::PDU1_OUT_EN_PLOC, this); lp_var_t outEnabledAcsBoardSideA = lp_var_t(sid.objectId, P60System::PDU1_OUT_EN_ACS_BOARD_SIDE_A, this); lp_var_t outEnabledChannel8 = lp_var_t(sid.objectId, P60System::PDU1_OUT_EN_CHANNEL8, this); lp_var_t bootcause = lp_var_t(sid.objectId, P60System::PDU1_BOOTCAUSE, this); /** Number of reboots */ lp_var_t bootcount = lp_var_t(sid.objectId, P60System::PDU1_BOOTCNT, this); /** Uptime in seconds */ lp_var_t uptime = lp_var_t(sid.objectId, P60System::PDU1_UPTIME, this); lp_var_t resetcause = lp_var_t(sid.objectId, P60System::PDU1_RESETCAUSE, this); /** Battery mode: 1 = Critical, 2 = Safe, 3 = Normal, 4 = Full */ lp_var_t battMode = lp_var_t(sid.objectId, P60System::PDU1_BATT_MODE, this); /** * There are 8 devices on the PDU. FRAM, ADCs, temperature sensor etc. Each device is * identified by an ID. Refer also to gs-man-nanopower-p60-pdu-200-1.pdf on pages 17 and 18. */ lp_var_t device0 = lp_var_t(sid.objectId, P60System::PDU1_DEVICE_0, this); lp_var_t device1 = lp_var_t(sid.objectId, P60System::PDU1_DEVICE_1, this); lp_var_t device2 = lp_var_t(sid.objectId, P60System::PDU1_DEVICE_2, this); lp_var_t device3 = lp_var_t(sid.objectId, P60System::PDU1_DEVICE_3, this); lp_var_t device4 = lp_var_t(sid.objectId, P60System::PDU1_DEVICE_4, this); lp_var_t device5 = lp_var_t(sid.objectId, P60System::PDU1_DEVICE_5, this); lp_var_t device6 = lp_var_t(sid.objectId, P60System::PDU1_DEVICE_6, this); lp_var_t device7 = lp_var_t(sid.objectId, P60System::PDU1_DEVICE_7, this); /** The status of each device. 0 = None, 1 = Ok, 2 = Error, 3 = Not found */ lp_var_t device0Status = lp_var_t(sid.objectId, P60System::PDU1_DEVICE_0_STATUS, this); lp_var_t device1Status = lp_var_t(sid.objectId, P60System::PDU1_DEVICE_1_STATUS, this); lp_var_t device2Status = lp_var_t(sid.objectId, P60System::PDU1_DEVICE_2_STATUS, this); lp_var_t device3Status = lp_var_t(sid.objectId, P60System::PDU1_DEVICE_3_STATUS, this); lp_var_t device4Status = lp_var_t(sid.objectId, P60System::PDU1_DEVICE_4_STATUS, this); lp_var_t device5Status = lp_var_t(sid.objectId, P60System::PDU1_DEVICE_5_STATUS, this); lp_var_t device6Status = lp_var_t(sid.objectId, P60System::PDU1_DEVICE_6_STATUS, this); lp_var_t device7Status = lp_var_t(sid.objectId, P60System::PDU1_DEVICE_7_STATUS, this); /** Number of reboots triggered by the ground watchdog */ lp_var_t gndWdtReboots = lp_var_t(sid.objectId, P60System::PDU1_WDT_CNT_GND, this); /** Number of reboots triggered through the I2C watchdog. Not relevant for EIVE. */ lp_var_t i2cWdtReboots = lp_var_t(sid.objectId, P60System::PDU1_WDT_CNT_I2C, this); /** Number of reboots triggered through the CAN watchdog */ lp_var_t canWdtReboots = lp_var_t(sid.objectId, P60System::PDU1_WDT_CNT_CAN, this); /** Number of reboots triggered through the CSP watchdog */ lp_var_t cspWdtReboots = lp_var_t(sid.objectId, P60System::PDU1_WDT_CNT_CSP, this); /** Ground watchdog remaining seconds before rebooting */ lp_var_t groundWatchdogSecondsLeft = lp_var_t(sid.objectId, P60System::PDU1_WDT_GND_LEFT, this); /** I2C watchdog remaining seconds before rebooting. Not relevant for EIVE. */ lp_var_t i2cWatchdogSecondsLeft = lp_var_t(sid.objectId, P60System::PDU1_WDT_I2C_LEFT, this); /** CAN watchdog remaining seconds before rebooting. */ lp_var_t canWatchdogSecondsLeft = lp_var_t(sid.objectId, P60System::PDU1_WDT_CAN_LEFT, this); /** CSP watchdog remaining seconds before rebooting. */ lp_var_t cspWatchdogSecondsLeft = lp_var_t(sid.objectId, P60System::PDU1_WDT_CSP_LEFT, this); }; } namespace PDU2 { static const uint32_t HK_TABLE_DATA_SET_ID = 0x2; /** * Addresses within configuration table to enable or disable output channels. Refer also to * gs-man-nanopower-p60-pdu-200.pdf on page 16. */ static const uint16_t CONFIG_ADDRESS_OUT_EN_Q7S = 0x48; static const uint16_t CONFIG_ADDRESS_OUT_EN_PAYLOAD_PCDU_CH1 = 0x49; static const uint16_t CONFIG_ADDRESS_OUT_EN_RW = 0x50; static const uint16_t CONFIG_ADDRESS_OUT_EN_TCS_BOARD_HEATER_IN = 0x51; static const uint16_t CONFIG_ADDRESS_OUT_EN_SUS_REDUNDANT = 0x52; static const uint16_t CONFIG_ADDRESS_OUT_EN_DEPLOYMENT_MECHANISM = 0x53; static const uint16_t CONFIG_ADDRESS_OUT_EN_PAYLOAD_PCDU_CH6PLOC = 0x54; static const uint16_t CONFIG_ADDRESS_OUT_EN_ACS_BOARD_SIDE_B = 0x55; static const uint16_t CONFIG_ADDRESS_OUT_EN_PAYLOAD_CAMERA = 0x56; /** * @brief This class defines a dataset for the hk table of the PDU2. */ class PDU2HkTableDataset: public StaticLocalDataSet { public: PDU2HkTableDataset(HasLocalDataPoolIF* owner): StaticLocalDataSet(owner, PDU2::HK_TABLE_DATA_SET_ID) { } PDU2HkTableDataset(object_id_t objectId): StaticLocalDataSet(sid_t(objectId, PDU2::HK_TABLE_DATA_SET_ID)) { } /** Measured output currents */ lp_var_t currentOutQ7S = lp_var_t(sid.objectId, P60System::PDU2_CURRENT_OUT_Q7S, this); lp_var_t currentOutPayloadPCDUCh1 = lp_var_t(sid.objectId, P60System::PDU2_CURRENT_OUT_PAYLOAD_PCDU_CH1, this); lp_var_t currentOutReactionWheels = lp_var_t(sid.objectId, P60System::PDU2_CURRENT_OUT_RW, this); lp_var_t currentOutTCSBoardHeaterIn = lp_var_t(sid.objectId, P60System::PDU2_CURRENT_OUT_TCS_BOARD_HEATER_IN, this); lp_var_t currentOutSUSRedundant = lp_var_t(sid.objectId, P60System::PDU2_CURRENT_OUT_SUS_REDUNDANT, this); lp_var_t currentOutDeplMechanism = lp_var_t(sid.objectId, P60System::PDU2_CURRENT_OUT_DEPLOYMENT_MECHANISM, this); lp_var_t currentOutPayloadPCDUCh6 = lp_var_t(sid.objectId, P60System::PDU2_CURRENT_OUT_PAYLOAD_PCDU_CH6, this); lp_var_t currentOutACSBoard = lp_var_t(sid.objectId, P60System::PDU2_CURRENT_OUT_ACS_BOARD_SIDE_B, this); lp_var_t currentOutPayloadCamera = lp_var_t(sid.objectId, P60System::PDU2_CURRENT_OUT_PAYLOAD_CAMERA, this); /** Measured voltage of output channels */ lp_var_t voltageOutQ7S = lp_var_t(sid.objectId, P60System::PDU2_VOLTAGE_OUT_Q7S, this); lp_var_t voltageOutPayloadPCDUCh1 = lp_var_t(sid.objectId, P60System::PDU2_VOLTAGE_OUT_PAYLOAD_PCDU_CH1, this); lp_var_t voltageOutReactionWheels = lp_var_t(sid.objectId, P60System::PDU2_VOLTAGE_OUT_RW, this); lp_var_t voltageOutTCSBoardHeaterIn = lp_var_t(sid.objectId, P60System::PDU2_VOLTAGE_OUT_TCS_BOARD_HEATER_IN, this); lp_var_t voltageOutSUS = lp_var_t(sid.objectId, P60System::PDU2_VOLTAGE_OUT_SUS_REDUNDANT, this); lp_var_t voltageOutDeplMechanism = lp_var_t(sid.objectId, P60System::PDU2_VOLTAGE_OUT_DEPLOYMENT_MECHANISM, this); lp_var_t voltageOutPayloadPCDUCh6 = lp_var_t(sid.objectId, P60System::PDU2_VOLTAGE_OUT_PAYLOAD_PCDU_CH6, this); lp_var_t voltageOutACSBoard = lp_var_t(sid.objectId, P60System::PDU2_VOLTAGE_OUT_ACS_BOARD_SIDE_B, this); lp_var_t voltageOutPayloadCamera = lp_var_t(sid.objectId, P60System::PDU2_VOLTAGE_OUT_PAYLOAD_CAMERA, this); /** Measured VCC */ lp_var_t vcc = lp_var_t(sid.objectId, P60System::PDU2_VCC, this); /** Measured VBAT */ lp_var_t vbat = lp_var_t(sid.objectId, P60System::PDU2_VBAT, this); lp_var_t temperature = lp_var_t(sid.objectId, P60System::PDU2_TEMPERATURE, this); /** Output converter enable status */ lp_var_t converterEnable = lp_var_t(sid.objectId, P60System::PDU2_CONV_EN, this); /** Output channels enable status */ lp_var_t outEnabledQ7S = lp_var_t(sid.objectId, P60System::PDU2_OUT_EN_Q7S, this); lp_var_t outEnabledPlPCDUCh1 = lp_var_t(sid.objectId, P60System::PDU2_OUT_EN_PAYLOAD_PCDU_CH1, this); lp_var_t outEnabledReactionWheels = lp_var_t(sid.objectId, P60System::PDU2_OUT_EN_RW, this); lp_var_t outEnabledTCSBoardHeaterIn = lp_var_t(sid.objectId, P60System::PDU2_OUT_EN_TCS_BOARD_HEATER_IN, this); lp_var_t outEnabledSUS = lp_var_t(sid.objectId, P60System::PDU2_OUT_EN_SUS_REDUNDANT, this); lp_var_t outEnabledDeplMechanism = lp_var_t(sid.objectId, P60System::PDU2_OUT_EN_DEPLOYMENT_MECHANISM, this); lp_var_t outEnabledPlPCDUCh6 = lp_var_t(sid.objectId, P60System::PDU2_OUT_EN_PAYLOAD_PCDU_CH6, this); lp_var_t outEnabledAcsBoard = lp_var_t(sid.objectId, P60System::PDU2_OUT_EN_ACS_BOARD_SIDE_B, this); lp_var_t outEnabledPayloadCamera = lp_var_t(sid.objectId, P60System::PDU2_OUT_EN_PAYLOAD_CAMERA, this); lp_var_t bootcause = lp_var_t(sid.objectId, P60System::PDU2_BOOTCAUSE, this); /** Number of reboots */ lp_var_t bootcount = lp_var_t(sid.objectId, P60System::PDU2_BOOTCNT, this); /** Uptime in seconds */ lp_var_t uptime = lp_var_t(sid.objectId, P60System::PDU2_UPTIME, this); lp_var_t resetcause = lp_var_t(sid.objectId, P60System::PDU2_RESETCAUSE, this); /** Battery mode: 1 = Critical, 2 = Safe, 3 = Normal, 4 = Full */ lp_var_t battMode = lp_var_t(sid.objectId, P60System::PDU2_BATT_MODE, this); /** * There are 8 devices on the PDU. FRAM, ADCs, temperature sensor etc. Each device is * identified by an ID. Refer also to gs-man-nanopower-p60-pdu-200-1.pdf on pages 17 and 18. */ lp_var_t device0 = lp_var_t(sid.objectId, P60System::PDU2_DEVICE_0, this); lp_var_t device1 = lp_var_t(sid.objectId, P60System::PDU2_DEVICE_1, this); lp_var_t device2 = lp_var_t(sid.objectId, P60System::PDU2_DEVICE_2, this); lp_var_t device3 = lp_var_t(sid.objectId, P60System::PDU2_DEVICE_3, this); lp_var_t device4 = lp_var_t(sid.objectId, P60System::PDU2_DEVICE_4, this); lp_var_t device5 = lp_var_t(sid.objectId, P60System::PDU2_DEVICE_5, this); lp_var_t device6 = lp_var_t(sid.objectId, P60System::PDU2_DEVICE_6, this); lp_var_t device7 = lp_var_t(sid.objectId, P60System::PDU2_DEVICE_7, this); /** The status of each device. 0 = None, 1 = Ok, 2 = Error, 3 = Not found */ lp_var_t device0Status = lp_var_t(sid.objectId, P60System::PDU2_DEVICE_0_STATUS, this); lp_var_t device1Status = lp_var_t(sid.objectId, P60System::PDU2_DEVICE_1_STATUS, this); lp_var_t device2Status = lp_var_t(sid.objectId, P60System::PDU2_DEVICE_2_STATUS, this); lp_var_t device3Status = lp_var_t(sid.objectId, P60System::PDU2_DEVICE_3_STATUS, this); lp_var_t device4Status = lp_var_t(sid.objectId, P60System::PDU2_DEVICE_4_STATUS, this); lp_var_t device5Status = lp_var_t(sid.objectId, P60System::PDU2_DEVICE_5_STATUS, this); lp_var_t device6Status = lp_var_t(sid.objectId, P60System::PDU2_DEVICE_6_STATUS, this); lp_var_t device7Status = lp_var_t(sid.objectId, P60System::PDU2_DEVICE_7_STATUS, this); /** Number of reboots triggered by the ground watchdog */ lp_var_t gndWdtReboots = lp_var_t(sid.objectId, P60System::PDU2_WDT_CNT_GND, this); /** Number of reboots triggered through the I2C watchdog. Not relevant for EIVE. */ lp_var_t i2cWdtReboots = lp_var_t(sid.objectId, P60System::PDU2_WDT_CNT_I2C, this); /** Number of reboots triggered through the CAN watchdog */ lp_var_t canWdtReboots = lp_var_t(sid.objectId, P60System::PDU2_WDT_CNT_CAN, this); /** Number of reboots triggered through the CSP watchdog */ lp_var_t cspWdtReboots = lp_var_t(sid.objectId, P60System::PDU2_WDT_CNT_CSP, this); /** Ground watchdog remaining seconds before rebooting */ lp_var_t groundWatchdogSecondsLeft = lp_var_t(sid.objectId, P60System::PDU2_WDT_GND_LEFT, this); /** I2C watchdog remaining seconds before rebooting. Not relevant for EIVE. */ lp_var_t i2cWatchdogSecondsLeft = lp_var_t(sid.objectId, P60System::PDU2_WDT_I2C_LEFT, this); /** CAN watchdog remaining seconds before rebooting. */ lp_var_t canWatchdogSecondsLeft = lp_var_t(sid.objectId, P60System::PDU2_WDT_CAN_LEFT, this); /** CSP watchdog remaining seconds before rebooting. */ lp_var_t cspWatchdogSecondsLeft = lp_var_t(sid.objectId, P60System::PDU2_WDT_CSP_LEFT, this); }; } namespace ACU { static const uint32_t HK_TABLE_DATA_SET_ID = 0x2; /* When receiving full housekeeping (telemetry) table */ static const uint16_t MAX_REPLY_LENGTH = 124; static const uint16_t MAX_CONFIGTABLE_ADDRESS = 26; static const uint16_t MAX_HKTABLE_ADDRESS = 120; static const uint16_t HK_TABLE_SIZE = 125; static const uint8_t HK_TABLE_ENTRIES = 21; typedef struct CurrentInGroup { int16_t channel0; int16_t channel1; int16_t channel2; int16_t channel3; int16_t channel4; int16_t channel5; } CurrentInGroup_t; typedef struct VoltageInGroup { uint16_t channel0; uint16_t channel1; uint16_t channel2; uint16_t channel3; uint16_t channel4; uint16_t channel5; } VoltageInGroup_t; typedef struct TemperatureGroup { int16_t location1; int16_t location2; int16_t location3; } TemperatureGroup_t; typedef struct VboostGroup { uint16_t channel0; uint16_t channel1; uint16_t channel2; uint16_t channel3; uint16_t channel4; uint16_t channel5; } VboostGroup_t; typedef struct PowerGroup { uint16_t channel0; uint16_t channel1; uint16_t channel2; uint16_t channel3; uint16_t channel4; uint16_t channel5; } PowerGroup_t; typedef struct DacEnablestatus { uint8_t dac0; uint8_t dac1; uint8_t dac2; } DacEnablestatus_t; typedef struct DacRawChannelValues { uint16_t channel0; uint16_t channel1; uint16_t channel2; uint16_t channel3; uint16_t channel4; uint16_t channel5; } DacRawChannelValues_t; typedef struct DeviceTypeGroup { uint8_t device0; uint8_t device1; uint8_t device2; uint8_t device3; uint8_t device4; uint8_t device5; uint8_t device6; uint8_t device7; } DeviceTypeGroup_t; typedef struct DeviceStatusGroup { uint8_t device0; uint8_t device1; uint8_t device2; uint8_t device3; uint8_t device4; uint8_t device5; uint8_t device6; uint8_t device7; } DeviceStatusGroup_t; /** * @brief This class defines a dataset for the hk table of the ACU. */ class HkTableDataset: public StaticLocalDataSet { public: HkTableDataset(HasLocalDataPoolIF* owner): StaticLocalDataSet(owner, HK_TABLE_DATA_SET_ID) { } HkTableDataset(object_id_t objectId): StaticLocalDataSet(sid_t(objectId, HK_TABLE_DATA_SET_ID)) { } lp_var_t currentInGroup = lp_var_t(sid.objectId, P60System::ACU_CURRENT_IN_GROUP, this); lp_var_t voltageInGroup = lp_var_t(sid.objectId, P60System::ACU_VOLTAGE_IN_GROUP, this); lp_var_t vcc = lp_var_t(sid.objectId, P60System::ACU_VCC, this); lp_var_t vbat = lp_var_t(sid.objectId, P60System::ACU_VBAT, this); lp_var_t temperatureGroup = lp_var_t(sid.objectId, P60System::ACU_TEMPERATURE_GROUP, this); lp_var_t mpptMode = lp_var_t(sid.objectId, P60System::ACU_MPPT_MODE, this); lp_var_t vboostGroup = lp_var_t(sid.objectId, P60System::ACU_VBOOST_GROUP, this); lp_var_t powerGroup = lp_var_t(sid.objectId, P60System::ACU_POWER_GROUP, this); lp_var_t dacEnableStatusGroup = lp_var_t(sid.objectId, P60System::ACU_DAC_EN_GROUP, this); lp_var_t dacRawChannelValues = lp_var_t(sid.objectId, P60System::ACU_DAC_VAL_GROUP, this); lp_var_t bootCause = lp_var_t(sid.objectId, P60System::ACU_BOOTCAUSE, this); lp_var_t bootcause = lp_var_t(sid.objectId, P60System::ACU_BOOTCAUSE, this); lp_var_t bootcnt = lp_var_t(sid.objectId, P60System::ACU_BOOTCNT, this); lp_var_t uptime = lp_var_t(sid.objectId, P60System::ACU_UPTIME, this); lp_var_t resetCause = lp_var_t(sid.objectId, P60System::ACU_RESET_CAUSE, this); lp_var_t mpptTime = lp_var_t(sid.objectId, P60System::ACU_MPPT_TIME, this); lp_var_t mpptPeriod = lp_var_t(sid.objectId, P60System::ACU_MPPT_PERIOD, this); lp_var_t deviceTypeGroup = lp_var_t(sid.objectId, P60System::ACU_DEVICE_TYPE_GROUP, this); lp_var_t deviceStatusGroup = lp_var_t(sid.objectId, P60System::ACU_DEVICE_STATUS_GROUP, this); lp_var_t wdtCntGnd = lp_var_t(sid.objectId, P60System::ACU_WDT_CNT_GND, this); lp_var_t wdtGndLeft = lp_var_t(sid.objectId, P60System::ACU_WDT_GND_LEFT, this); }; } #endif /* MISSION_DEVICES_DEVICEDEFINITIONS_GOMSPACEDEFINITIONS_H_ */