#include "ACUHandler.h" #include "OBSWConfig.h" ACUHandler::ACUHandler(object_id_t objectId, object_id_t comIF, CookieIF * comCookie) : GomspaceDeviceHandler(objectId, comIF, comCookie, ACU::MAX_CONFIGTABLE_ADDRESS, ACU::MAX_HKTABLE_ADDRESS, ACU::HK_TABLE_REPLY_SIZE, &acuHkTableDataset), acuHkTableDataset( this) { } ACUHandler::~ACUHandler() { } ReturnValue_t ACUHandler::buildNormalDeviceCommand( DeviceCommandId_t * id) { *id = GOMSPACE::REQUEST_HK_TABLE; return buildCommandFromCommand(*id, NULL, 0); } void ACUHandler::letChildHandleHkReply(DeviceCommandId_t id, const uint8_t *packet) { parseHkTableReply(packet); handleDeviceTM(&acuHkTableDataset, id, true); #if OBSW_ENHANCED_PRINTOUT == 1 && OBSW_DEBUG_ACU == 1 acuHkTableDataset.read(); float temperatureC_1 = acuHkTableDataset.temperature1.value * 0.1; float temperatureC_2 = acuHkTableDataset.temperature2.value * 0.1; float temperatureC_3 = acuHkTableDataset.temperature3.value * 0.1; sif::info << "ACU: Temperature 1: " << temperatureC_1 << " °C" << std::endl; sif::info << "ACU: Temperature 2: " << temperatureC_2 << " °C" << std::endl; sif::info << "ACU: Temperature 3: " << temperatureC_3 << " °C" << std::endl; sif::info << "ACU: Ground Watchdog Timer Count: " << acuHkTableDataset.wdtCntGnd.value << std::endl; sif::info << "ACU: Ground watchdog timer, seconds left before reboot: " << acuHkTableDataset.wdtGndLeft.value << std::endl; acuHkTableDataset.commit(); #endif } void ACUHandler::parseHkTableReply(const uint8_t *packet) { uint16_t dataOffset = 0; acuHkTableDataset.read(); dataOffset += 12; acuHkTableDataset.currentInChannel0 = *(packet + dataOffset) << 8 | *(packet + dataOffset + 1); dataOffset += 4; acuHkTableDataset.currentInChannel1 = *(packet + dataOffset) << 8 | *(packet + dataOffset + 1); dataOffset += 4; acuHkTableDataset.currentInChannel2 = *(packet + dataOffset) << 8 | *(packet + dataOffset + 1); dataOffset += 4; acuHkTableDataset.currentInChannel3 = *(packet + dataOffset) << 8 | *(packet + dataOffset + 1); dataOffset += 4; acuHkTableDataset.currentInChannel4 = *(packet + dataOffset) << 8 | *(packet + dataOffset + 1); dataOffset += 4; acuHkTableDataset.currentInChannel5 = *(packet + dataOffset) << 8 | *(packet + dataOffset + 1); dataOffset += 4; acuHkTableDataset.voltageInChannel0 = *(packet + dataOffset) << 8 | *(packet + dataOffset + 1); dataOffset += 4; acuHkTableDataset.voltageInChannel1 = *(packet + dataOffset) << 8 | *(packet + dataOffset + 1); dataOffset += 4; acuHkTableDataset.voltageInChannel2 = *(packet + dataOffset) << 8 | *(packet + dataOffset + 1); dataOffset += 4; acuHkTableDataset.voltageInChannel3 = *(packet + dataOffset) << 8 | *(packet + dataOffset + 1); dataOffset += 4; acuHkTableDataset.voltageInChannel4 = *(packet + dataOffset) << 8 | *(packet + dataOffset + 1); dataOffset += 4; acuHkTableDataset.voltageInChannel5 = *(packet + dataOffset) << 8 | *(packet + dataOffset + 1); dataOffset += 4; acuHkTableDataset.vcc = *(packet + dataOffset) << 8 | *(packet + dataOffset + 1); dataOffset += 4; acuHkTableDataset.vbat = *(packet + dataOffset) << 8 | *(packet + dataOffset + 1); dataOffset += 4; acuHkTableDataset.temperature1 = *(packet + dataOffset) << 8 | *(packet + dataOffset + 1); dataOffset += 4; acuHkTableDataset.temperature2 = *(packet + dataOffset) << 8 | *(packet + dataOffset + 1); dataOffset += 4; acuHkTableDataset.temperature3 = *(packet + dataOffset) << 8 | *(packet + dataOffset + 1); dataOffset += 4; acuHkTableDataset.mpptMode = *(packet + dataOffset); dataOffset += 3; acuHkTableDataset.vboostInChannel0 = *(packet + dataOffset) << 8 | *(packet + dataOffset + 1); dataOffset += 4; acuHkTableDataset.vboostInChannel1 = *(packet + dataOffset) << 8 | *(packet + dataOffset + 1); dataOffset += 4; acuHkTableDataset.vboostInChannel2 = *(packet + dataOffset) << 8 | *(packet + dataOffset + 1); dataOffset += 4; acuHkTableDataset.vboostInChannel3 = *(packet + dataOffset) << 8 | *(packet + dataOffset + 1); dataOffset += 4; acuHkTableDataset.vboostInChannel4 = *(packet + dataOffset) << 8 | *(packet + dataOffset + 1); dataOffset += 4; acuHkTableDataset.vboostInChannel5 = *(packet + dataOffset) << 8 | *(packet + dataOffset + 1); dataOffset += 4; acuHkTableDataset.powerInChannel0 = *(packet + dataOffset) << 8 | *(packet + dataOffset + 1); dataOffset += 4; acuHkTableDataset.powerInChannel1 = *(packet + dataOffset) << 8 | *(packet + dataOffset + 1); dataOffset += 4; acuHkTableDataset.powerInChannel2 = *(packet + dataOffset) << 8 | *(packet + dataOffset + 1); dataOffset += 4; acuHkTableDataset.powerInChannel3 = *(packet + dataOffset) << 8 | *(packet + dataOffset + 1); dataOffset += 4; acuHkTableDataset.powerInChannel4 = *(packet + dataOffset) << 8 | *(packet + dataOffset + 1); dataOffset += 4; acuHkTableDataset.powerInChannel5 = *(packet + dataOffset) << 8 | *(packet + dataOffset + 1); dataOffset += 4; acuHkTableDataset.dac0Enable = *(packet + dataOffset); dataOffset += 3; acuHkTableDataset.dac1Enable = *(packet + dataOffset); dataOffset += 3; acuHkTableDataset.dac2Enable = *(packet + dataOffset); dataOffset += 3; acuHkTableDataset.dacRawChannelVal0 = *(packet + dataOffset) << 8 | *(packet + dataOffset + 1); dataOffset += 4; acuHkTableDataset.dacRawChannelVal1 = *(packet + dataOffset) << 8 | *(packet + dataOffset + 1); dataOffset += 4; acuHkTableDataset.dacRawChannelVal2 = *(packet + dataOffset) << 8 | *(packet + dataOffset + 1); dataOffset += 4; acuHkTableDataset.dacRawChannelVal3 = *(packet + dataOffset) << 8 | *(packet + dataOffset + 1); dataOffset += 4; acuHkTableDataset.dacRawChannelVal4 = *(packet + dataOffset) << 8 | *(packet + dataOffset + 1); dataOffset += 4; acuHkTableDataset.dacRawChannelVal5 = *(packet + dataOffset) << 8 | *(packet + dataOffset + 1); dataOffset += 4; acuHkTableDataset.bootCause = *(packet + dataOffset) << 24 | *(packet + dataOffset + 1) << 16 | *(packet + dataOffset + 2) << 8 | *(packet + dataOffset + 3); dataOffset += 6; acuHkTableDataset.bootcnt = *(packet + dataOffset) << 24 | *(packet + dataOffset + 1) << 16 | *(packet + dataOffset + 2) << 8 | *(packet + dataOffset + 3); dataOffset += 6; acuHkTableDataset.uptime = *(packet + dataOffset) << 24 | *(packet + dataOffset + 1) << 16 | *(packet + dataOffset + 2) << 8 | *(packet + dataOffset + 3); dataOffset += 6; acuHkTableDataset.resetCause = *(packet + dataOffset) << 8 | *(packet + dataOffset + 1); dataOffset += 4; acuHkTableDataset.mpptTime = *(packet + dataOffset) << 8 | *(packet + dataOffset + 1); /* +12 because here starts the second csp packet */ dataOffset += 2 + 12; acuHkTableDataset.mpptPeriod = *(packet + dataOffset) << 8 | *(packet + dataOffset + 1); dataOffset += 4; acuHkTableDataset.device0 = *(packet + dataOffset); dataOffset += 3; acuHkTableDataset.device1 = *(packet + dataOffset); dataOffset += 3; acuHkTableDataset.device2 = *(packet + dataOffset); dataOffset += 3; acuHkTableDataset.device3 = *(packet + dataOffset); dataOffset += 3; acuHkTableDataset.device4 = *(packet + dataOffset); dataOffset += 3; acuHkTableDataset.device5 = *(packet + dataOffset); dataOffset += 3; acuHkTableDataset.device6 = *(packet + dataOffset); dataOffset += 3; acuHkTableDataset.device7 = *(packet + dataOffset); dataOffset += 3; acuHkTableDataset.device0Status = *(packet + dataOffset); dataOffset += 3; acuHkTableDataset.device1Status = *(packet + dataOffset); dataOffset += 3; acuHkTableDataset.device2Status = *(packet + dataOffset); dataOffset += 3; acuHkTableDataset.device3Status = *(packet + dataOffset); dataOffset += 3; acuHkTableDataset.device4Status = *(packet + dataOffset); dataOffset += 3; acuHkTableDataset.device5Status = *(packet + dataOffset); dataOffset += 3; acuHkTableDataset.device6Status = *(packet + dataOffset); dataOffset += 3; acuHkTableDataset.device7Status = *(packet + dataOffset); dataOffset += 3; acuHkTableDataset.wdtCntGnd = *(packet + dataOffset) << 24 | *(packet + dataOffset + 1) << 16 | *(packet + dataOffset + 2) << 8 | *(packet + dataOffset + 3); dataOffset += 6; acuHkTableDataset.wdtGndLeft = *(packet + dataOffset) << 24 | *(packet + dataOffset + 1) << 16 | *(packet + dataOffset + 2) << 8 | *(packet + dataOffset + 3); dataOffset += 6; acuHkTableDataset.commit(); } ReturnValue_t ACUHandler::initializeLocalDataPool( localpool::DataPool &localDataPoolMap, LocalDataPoolManager &poolManager) { localDataPoolMap.emplace(P60System::ACU_CURRENT_IN_CHANNEL0, new PoolEntry( { 0 })); localDataPoolMap.emplace(P60System::ACU_CURRENT_IN_CHANNEL1, new PoolEntry( { 0 })); localDataPoolMap.emplace(P60System::ACU_CURRENT_IN_CHANNEL2, new PoolEntry( { 0 })); localDataPoolMap.emplace(P60System::ACU_CURRENT_IN_CHANNEL3, new PoolEntry( { 0 })); localDataPoolMap.emplace(P60System::ACU_CURRENT_IN_CHANNEL4, new PoolEntry( { 0 })); localDataPoolMap.emplace(P60System::ACU_CURRENT_IN_CHANNEL5, new PoolEntry( { 0 })); localDataPoolMap.emplace(P60System::ACU_VOLTAGE_IN_CHANNEL0, new PoolEntry( { 0 })); localDataPoolMap.emplace(P60System::ACU_VOLTAGE_IN_CHANNEL1, new PoolEntry( { 0 })); localDataPoolMap.emplace(P60System::ACU_VOLTAGE_IN_CHANNEL2, new PoolEntry( { 0 })); localDataPoolMap.emplace(P60System::ACU_VOLTAGE_IN_CHANNEL3, new PoolEntry( { 0 })); localDataPoolMap.emplace(P60System::ACU_VOLTAGE_IN_CHANNEL4, new PoolEntry( { 0 })); localDataPoolMap.emplace(P60System::ACU_VOLTAGE_IN_CHANNEL5, new PoolEntry( { 0 })); localDataPoolMap.emplace(P60System::ACU_VCC, new PoolEntry( { 0 })); localDataPoolMap.emplace(P60System::ACU_VBAT, new PoolEntry( { 0 })); localDataPoolMap.emplace(P60System::ACU_TEMPERATURE_1, new PoolEntry( { 0 })); localDataPoolMap.emplace(P60System::ACU_TEMPERATURE_2, new PoolEntry( { 0 })); localDataPoolMap.emplace(P60System::ACU_TEMPERATURE_3, new PoolEntry( { 0 })); localDataPoolMap.emplace(P60System::ACU_MPPT_MODE, new PoolEntry( { 0 })); localDataPoolMap.emplace(P60System::ACU_VBOOST_CHANNEL0, new PoolEntry( { 0 })); localDataPoolMap.emplace(P60System::ACU_VBOOST_CHANNEL1, new PoolEntry( { 0 })); localDataPoolMap.emplace(P60System::ACU_VBOOST_CHANNEL2, new PoolEntry( { 0 })); localDataPoolMap.emplace(P60System::ACU_VBOOST_CHANNEL3, new PoolEntry( { 0 })); localDataPoolMap.emplace(P60System::ACU_VBOOST_CHANNEL4, new PoolEntry( { 0 })); localDataPoolMap.emplace(P60System::ACU_VBOOST_CHANNEL5, new PoolEntry( { 0 })); localDataPoolMap.emplace(P60System::ACU_POWER_CHANNEL0, new PoolEntry( { 0 })); localDataPoolMap.emplace(P60System::ACU_POWER_CHANNEL1, new PoolEntry( { 0 })); localDataPoolMap.emplace(P60System::ACU_POWER_CHANNEL2, new PoolEntry( { 0 })); localDataPoolMap.emplace(P60System::ACU_POWER_CHANNEL3, new PoolEntry( { 0 })); localDataPoolMap.emplace(P60System::ACU_POWER_CHANNEL4, new PoolEntry( { 0 })); localDataPoolMap.emplace(P60System::ACU_POWER_CHANNEL5, new PoolEntry( { 0 })); localDataPoolMap.emplace(P60System::ACU_DAC_EN_0, new PoolEntry( { 0 })); localDataPoolMap.emplace(P60System::ACU_DAC_EN_1, new PoolEntry( { 0 })); localDataPoolMap.emplace(P60System::ACU_DAC_EN_2, new PoolEntry( { 0 })); localDataPoolMap.emplace(P60System::ACU_DAC_RAW_0, new PoolEntry( { 0 })); localDataPoolMap.emplace(P60System::ACU_DAC_RAW_1, new PoolEntry( { 0 })); localDataPoolMap.emplace(P60System::ACU_DAC_RAW_2, new PoolEntry( { 0 })); localDataPoolMap.emplace(P60System::ACU_DAC_RAW_3, new PoolEntry( { 0 })); localDataPoolMap.emplace(P60System::ACU_DAC_RAW_4, new PoolEntry( { 0 })); localDataPoolMap.emplace(P60System::ACU_DAC_RAW_5, new PoolEntry( { 0 })); localDataPoolMap.emplace(P60System::ACU_BOOTCAUSE, new PoolEntry( { 0 })); localDataPoolMap.emplace(P60System::ACU_BOOTCNT, new PoolEntry( { 0 })); localDataPoolMap.emplace(P60System::ACU_UPTIME, new PoolEntry( { 0 })); localDataPoolMap.emplace(P60System::ACU_RESET_CAUSE, new PoolEntry( { 0 })); localDataPoolMap.emplace(P60System::ACU_MPPT_TIME, new PoolEntry( { 0 })); localDataPoolMap.emplace(P60System::ACU_MPPT_PERIOD, new PoolEntry( { 0 })); localDataPoolMap.emplace(P60System::ACU_DEVICE_0, new PoolEntry( { 0 })); localDataPoolMap.emplace(P60System::ACU_DEVICE_1, new PoolEntry( { 0 })); localDataPoolMap.emplace(P60System::ACU_DEVICE_2, new PoolEntry( { 0 })); localDataPoolMap.emplace(P60System::ACU_DEVICE_3, new PoolEntry( { 0 })); localDataPoolMap.emplace(P60System::ACU_DEVICE_4, new PoolEntry( { 0 })); localDataPoolMap.emplace(P60System::ACU_DEVICE_5, new PoolEntry( { 0 })); localDataPoolMap.emplace(P60System::ACU_DEVICE_6, new PoolEntry( { 0 })); localDataPoolMap.emplace(P60System::ACU_DEVICE_7, new PoolEntry( { 0 })); localDataPoolMap.emplace(P60System::ACU_DEVICE_0_STATUS, new PoolEntry( { 0 })); localDataPoolMap.emplace(P60System::ACU_DEVICE_1_STATUS, new PoolEntry( { 0 })); localDataPoolMap.emplace(P60System::ACU_DEVICE_2_STATUS, new PoolEntry( { 0 })); localDataPoolMap.emplace(P60System::ACU_DEVICE_3_STATUS, new PoolEntry( { 0 })); localDataPoolMap.emplace(P60System::ACU_DEVICE_4_STATUS, new PoolEntry( { 0 })); localDataPoolMap.emplace(P60System::ACU_DEVICE_5_STATUS, new PoolEntry( { 0 })); localDataPoolMap.emplace(P60System::ACU_DEVICE_6_STATUS, new PoolEntry( { 0 })); localDataPoolMap.emplace(P60System::ACU_DEVICE_7_STATUS, new PoolEntry( { 0 })); localDataPoolMap.emplace(P60System::ACU_WDT_CNT_GND, new PoolEntry( { 0 })); localDataPoolMap.emplace(P60System::ACU_WDT_GND_LEFT, new PoolEntry( { 0 })); return HasReturnvaluesIF::RETURN_OK; }