#ifndef MISSION_DEVICES_DEVICEDEFINITIONS_IMTQDEFINITIONS_H_ #define MISSION_DEVICES_DEVICEDEFINITIONS_IMTQDEFINITIONS_H_ namespace IMTQ { static const DeviceCommandId_t NONE = 0x0; static const DeviceCommandId_t GET_ENG_HK_DATA = 0x1; static const DeviceCommandId_t START_ACTUATION_DIPOLE = 0x2; static const uint8_t GET_TEMP_REPLY_SIZE = 2; static const uint8_t CFGR_CMD_SIZE = 3; static const uint8_t POINTER_REG_SIZE = 1; static const uint32_t ENG_HK_DATA_SET_ID = GET_ENG_HK_DATA; static const uint8_t SIZE_ENG_HK_COMMAND = 1; static const uint8_t SIZE_ENG_HK_DATA_REPLY = 24; static const uint8_t MAX_REPLY_SIZE = SIZE_ENG_HK_DATA_REPLY; static const uint8_t MAX_COMMAND_SIZE = 9; static const uint8_t POOL_ENTRIES = 8; /** * Command code definitions. Each command or reply of an IMTQ request will begin with one of * the following command codes. */ namespace CC { static const uint8_t START_ACTUATION_DIPOLE = 0x6; static const uint8_t SOFTWARE_RESET = 0xAA; static const uint8_t GET_ENG_HK_DATA = 0x4A; }; enum IMTQPoolIds: lp_id_t { DIGITAL_VOLTAGE_MV, ANALOG_VOLTAGE_MV, DIGITAL_CURRENT_A, ANALOG_CURRENT_A, COIL_X_CURRENT_A, COIL_Y_CURRENT_A, COIL_Z_CURRENT_A, COIL_X_TEMPERATURE, COIL_Y_TEMPERATURE, COIL_Z_TEMPERATURE, MCU_TEMPERATURE }; class EngHkDataset: public StaticLocalDataSet { public: EngHkDataset(HasLocalDataPoolIF* owner): StaticLocalDataSet(owner, ENG_HK_DATA_SET_ID) { } EngHkDataset(object_id_t objectId): StaticLocalDataSet(sid_t(objectId, ENG_HK_DATA_SET_ID)) { } lp_var_t digitalVoltageMv = lp_var_t(sid.objectId, DIGITAL_VOLTAGE_MV, this); lp_var_t analogVoltageMv = lp_var_t(sid.objectId, ANALOG_VOLTAGE_MV, this); lp_var_t digitalCurrentA = lp_var_t(sid.objectId, DIGITAL_CURRENT_A, this); lp_var_t analogCurrentA = lp_var_t(sid.objectId, ANALOG_CURRENT_A, this); lp_var_t coilXcurrentA = lp_var_t(sid.objectId, COIL_X_CURRENT_A, this); lp_var_t coilYcurrentA = lp_var_t(sid.objectId, COIL_Y_CURRENT_A, this); lp_var_t coilZcurrentA = lp_var_t(sid.objectId, COIL_Z_CURRENT_A, this); /** All temperatures in [°C] */ lp_var_t coilXTemperature = lp_var_t(sid.objectId, COIL_X_TEMPERATURE, this); lp_var_t coilYTemperature = lp_var_t(sid.objectId, COIL_Y_TEMPERATURE, this); lp_var_t coilZTemperature = lp_var_t(sid.objectId, COIL_Z_TEMPERATURE, this); lp_var_t mcuTemperature = lp_var_t(sid.objectId, MCU_TEMPERATURE, this); }; /** * @brief This class can be used to ease the generation of an action message commanding the * IMTQHandler to configure the magnettorquer with the desired dipoles. * * @details Deserialize the packet, write the deserialized data to the ipc store and store the * the ipc store address in the action message. */ class CommandDipolePacket : public SerialLinkedListAdapter { public: CommandDipolePacket() { setLinks(); } private: /** * @brief Constructor * * @param xDipole The dipole of the x coil in 10^-4*Am^2 * @param yDipole The dipole of the y coil in 10^-4*Am^2 * @param zDipole The dipole of the z coil in 10^-4*Am^2 * @param duration The duration in milliseconds the dipole will be generated by the coils. * When set to 0, the dipole will be generated until a new dipole actuation * command is sent. */ CommandDipolePacket(uint16_t xDipole, uint16_t yDipole, uint16_t zDipole, uint16_t duration) : xDipole(xDipole), yDipole(yDipole), zDipole(zDipole), duration(duration) { } void setLinks() { setStart(&xDipole); xDipole.setNext(&yDipole); yDipole.setNext(&zDipole); zDipole.setNext(&duration); } SerializeElement xDipole; SerializeElement yDipole; SerializeElement zDipole; SerializeElement duration; }; } #endif /* MISSION_DEVICES_DEVICEDEFINITIONS_IMTQDEFINITIONS_H_ */