eive-obsw/mission/devices/GomspaceDeviceHandler.cpp

386 lines
13 KiB
C++
Raw Normal View History

2020-12-20 13:31:44 +01:00
#include <mission/devices/GomspaceDeviceHandler.h>
#include <mission/devices/devicedefinitions/GomSpacePackets.h>
GomspaceDeviceHandler::GomspaceDeviceHandler(object_id_t objectId, object_id_t comIF,
2021-01-28 14:55:21 +01:00
CookieIF * comCookie, uint16_t maxConfigTableAddress, uint16_t maxHkTableAddress,
2021-02-03 08:09:54 +01:00
uint16_t hkTableSize, LocalPoolDataSetBase* hkTableDataset) :
DeviceHandlerBase(objectId, comIF, comCookie), maxConfigTableAddress(maxConfigTableAddress),
maxHkTableAddress(maxHkTableAddress), hkTableSize(hkTableSize), hkTableDataset(hkTableDataset) {
2021-01-28 14:55:21 +01:00
mode = MODE_NORMAL;
if (comCookie == NULL) {
2021-02-03 08:09:54 +01:00
sif::error << "GomspaceDeviceHandler::GomspaceDeviceHandler: Invalid com cookie"
<< std::endl;
}
if (hkTableDataset == NULL) {
sif::error << "GomspaceDeviceHandler::GomspaceDeviceHandler: Invalid hk table data set"
<< std::endl;
2021-01-28 14:55:21 +01:00
}
2020-12-20 13:31:44 +01:00
}
GomspaceDeviceHandler::~GomspaceDeviceHandler() {
}
void GomspaceDeviceHandler::doStartUp(){
}
void GomspaceDeviceHandler::doShutDown(){
}
ReturnValue_t GomspaceDeviceHandler::buildNormalDeviceCommand(
DeviceCommandId_t * id) {
return HasReturnvaluesIF::RETURN_OK;
}
ReturnValue_t GomspaceDeviceHandler::buildTransitionDeviceCommand(
DeviceCommandId_t * id){
return HasReturnvaluesIF::RETURN_OK;
}
ReturnValue_t GomspaceDeviceHandler::buildCommandFromCommand(
DeviceCommandId_t deviceCommand, const uint8_t * commandData,
size_t commandDataLen) {
ReturnValue_t result;
switch(deviceCommand) {
2021-01-28 14:55:21 +01:00
case(GOMSPACE::PING): {
2020-12-20 13:31:44 +01:00
result = generatePingCommand(commandData, commandDataLen);
if(result != HasReturnvaluesIF::RETURN_OK) {
return result;
}
break;
}
2021-01-28 14:55:21 +01:00
case(GOMSPACE::REBOOT): {
2020-12-20 13:31:44 +01:00
generateRebootCommand();
break;
}
2021-01-28 14:55:21 +01:00
case(GOMSPACE::PARAM_SET):{
2020-12-20 13:31:44 +01:00
result = generateSetParamCommand(commandData, commandDataLen);
if(result != HasReturnvaluesIF::RETURN_OK){
return result;
}
break;
}
2021-01-28 14:55:21 +01:00
case(GOMSPACE::PARAM_GET):{
2020-12-20 13:31:44 +01:00
result = generateGetParamCommand(commandData, commandDataLen);
if(result != HasReturnvaluesIF::RETURN_OK){
return result;
}
break;
}
2021-01-28 14:55:21 +01:00
case(GOMSPACE::GNDWDT_RESET): {
2020-12-20 13:31:44 +01:00
result = generateResetWatchdogCmd();
if(result != HasReturnvaluesIF::RETURN_OK){
return result;
}
2021-01-12 13:26:09 +01:00
break;
2020-12-20 13:31:44 +01:00
}
2021-01-28 14:55:21 +01:00
case(GOMSPACE::REQUEST_HK_TABLE): {
result = generateRequestFullHkTableCmd(hkTableSize);
if(result != HasReturnvaluesIF::RETURN_OK){
return result;
}
break;
2020-12-20 13:31:44 +01:00
}
default:
2021-01-08 09:34:43 +01:00
return DeviceHandlerIF::COMMAND_NOT_IMPLEMENTED;
2020-12-20 13:31:44 +01:00
}
2021-01-08 09:34:43 +01:00
return HasReturnvaluesIF::RETURN_FAILED;
2020-12-20 13:31:44 +01:00
}
void GomspaceDeviceHandler::fillCommandAndReplyMap(){
2021-01-28 14:55:21 +01:00
this->insertInCommandAndReplyMap(GOMSPACE::PING, 3);
this->insertInCommandMap(GOMSPACE::REBOOT);
this->insertInCommandAndReplyMap(GOMSPACE::PARAM_SET, 3);
this->insertInCommandAndReplyMap(GOMSPACE::PARAM_GET, 3);
2021-02-03 08:09:54 +01:00
this->insertInCommandAndReplyMap(GOMSPACE::REQUEST_HK_TABLE, 3, hkTableDataset);
2021-01-28 14:55:21 +01:00
this->insertInCommandMap(GOMSPACE::GNDWDT_RESET);
2020-12-20 13:31:44 +01:00
}
ReturnValue_t GomspaceDeviceHandler::scanForReply(const uint8_t *start,
size_t remainingSize, DeviceCommandId_t *foundId, size_t *foundLen) {
switch(rememberCommandId) {
2021-01-28 14:55:21 +01:00
case(GOMSPACE::PING):
*foundId = GOMSPACE::PING;
2020-12-20 13:31:44 +01:00
*foundLen = PING_REPLY_SIZE;
2021-01-28 14:55:21 +01:00
rememberCommandId = GOMSPACE::NONE;
2020-12-20 13:31:44 +01:00
break;
2021-01-28 14:55:21 +01:00
case(GOMSPACE::PARAM_GET): {
*foundId = GOMSPACE::PARAM_GET;
*foundLen = rememberRequestedSize + GOMSPACE::GS_HDR_LENGTH;
rememberCommandId = GOMSPACE::NONE;
2020-12-20 13:31:44 +01:00
break;
}
2021-01-28 14:55:21 +01:00
case(GOMSPACE::PARAM_SET): {
*foundId = GOMSPACE::PARAM_SET;
2020-12-20 13:31:44 +01:00
*foundLen = rememberRequestedSize;
2021-01-28 14:55:21 +01:00
rememberCommandId = GOMSPACE::NONE;
break;
}
case(GOMSPACE::REQUEST_HK_TABLE): {
*foundId = GOMSPACE::REQUEST_HK_TABLE;
*foundLen = rememberRequestedSize + GOMSPACE::GS_HDR_LENGTH;
rememberCommandId = GOMSPACE::NONE;
2020-12-20 13:31:44 +01:00
break;
}
default:
return IGNORE_REPLY_DATA;
}
return HasReturnvaluesIF::RETURN_OK;
}
ReturnValue_t GomspaceDeviceHandler::interpretDeviceReply(DeviceCommandId_t id,
const uint8_t *packet) {
switch(id) {
2021-01-28 14:55:21 +01:00
case(GOMSPACE::PING): {
2020-12-20 13:31:44 +01:00
SerializeElement<uint32_t> replyTime = *packet;
handleDeviceTM(&replyTime, id, true);
break;
}
2021-01-28 14:55:21 +01:00
case(GOMSPACE::PARAM_GET): {
2020-12-20 13:31:44 +01:00
// -2 to subtract address size from gomspace parameter reply packet
uint16_t payloadLength = (*(packet + 2) << 8 | *(packet + 3)) - 2;
2020-12-20 17:35:03 +01:00
if(payloadLength > sizeof(uint32_t)){
sif::error << "GomspaceDeviceHandler: PARAM_GET: Invalid payload "
<< "size in reply" << std::endl;
return INVALID_PAYLOAD_SIZE;
}
2020-12-20 13:31:44 +01:00
uint8_t tempPayloadBuffer[payloadLength];
/* Extract information from received data */
CspGetParamReply cspGetParamReply(tempPayloadBuffer, payloadLength);
2021-01-28 14:55:21 +01:00
size_t size = GOMSPACE::GS_HDR_LENGTH + payloadLength;
2020-12-20 13:31:44 +01:00
ReturnValue_t result = cspGetParamReply.deSerialize(&packet, &size,
SerializeIF::Endianness::BIG);
if(result != HasReturnvaluesIF::RETURN_OK){
sif::error << "GomspaceDeviceHandler: Failed to deserialize get parameter"
2020-12-20 17:35:03 +01:00
<< "reply" << std::endl;
return result;
2020-12-20 13:31:44 +01:00
}
uint8_t action = cspGetParamReply.getAction();
uint8_t tableId = cspGetParamReply.getTableId();
uint16_t address = cspGetParamReply.getAddress();
2020-12-20 17:35:03 +01:00
/* Pack relevant information into a tm packet */
2020-12-20 13:31:44 +01:00
ParamReply paramReply(action, tableId, address, payloadLength,
tempPayloadBuffer);
handleDeviceTM(&paramReply, id, true);
break;
}
2021-01-28 14:55:21 +01:00
case(GOMSPACE::PARAM_SET): {
2020-12-20 13:31:44 +01:00
/* When setting a parameter, the p60dock sends back the state of the
* operation */
if(*packet != PARAM_SET_OK){
return HasReturnvaluesIF::RETURN_FAILED;
}
break;
}
2021-01-28 14:55:21 +01:00
case(GOMSPACE::REQUEST_HK_TABLE): {
letChildHandleHkReply(id, packet);
break;
}
2020-12-20 13:31:44 +01:00
default:
break;
}
return HasReturnvaluesIF::RETURN_OK;
}
void GomspaceDeviceHandler::setNormalDatapoolEntriesInvalid(){
}
ReturnValue_t GomspaceDeviceHandler::generateSetParamCommand(
const uint8_t * commandData, size_t commandDataLen) {
SetParamMessageUnpacker setParamMessageUnpacker;
ReturnValue_t result = setParamMessageUnpacker.deSerialize(&commandData,
&commandDataLen, SerializeIF::Endianness::BIG);
if(result != HasReturnvaluesIF::RETURN_OK){
sif::error << "GomspaceDeviceHandler: Failed to deserialize set parameter "
"message" << std::endl;
2020-12-20 17:35:03 +01:00
return result;
2020-12-20 13:31:44 +01:00
}
/* Get and check address */
uint16_t address = setParamMessageUnpacker.getAddress();
if(address > maxConfigTableAddress){
sif::error << "GomspaceDeviceHandler: Invalid address for set parameter "
<< "action" << std::endl;
return INVALID_ADDRESS;
}
uint16_t checksum = GOMSPACE::IGNORE_CHECKSUM;
uint16_t seq = 0;
uint16_t total = 0;
/* CSP reply only contains the transaction state */
uint16_t querySize = 1;
const uint8_t* parameterPtr = setParamMessageUnpacker.getParameter();
uint8_t parameterSize = setParamMessageUnpacker.getParameterSize();
uint16_t payloadlength = sizeof(address) + parameterSize;
/* Generate command for CspComIF */
CspSetParamCommand setParamCmd(querySize, payloadlength, checksum, seq,
total, address, parameterPtr, parameterSize);
size_t cspPacketLen = 0;
uint8_t* buffer = cspPacket;
result = setParamCmd.serialize(&buffer, &cspPacketLen, sizeof(cspPacket),
SerializeIF::Endianness::BIG);
if(result != HasReturnvaluesIF::RETURN_OK){
sif::error << "GomspaceDeviceHandler: Failed to serialize command for "
<< "CspComIF" << std::endl;
2020-12-20 17:35:03 +01:00
return result;
2020-12-20 13:31:44 +01:00
}
if(cspPacketLen > MAX_PACKET_LEN){
sif::error << "GomspaceDeviceHandler: Invalid length of set parameter "
"command" << std::endl;
return PACKET_TOO_LONG;
}
rawPacket = cspPacket;
rawPacketLen = cspPacketLen;
rememberRequestedSize = querySize;
2021-01-28 14:55:21 +01:00
rememberCommandId = GOMSPACE::PARAM_SET;
2020-12-20 13:31:44 +01:00
return HasReturnvaluesIF::RETURN_OK;
}
ReturnValue_t GomspaceDeviceHandler::generateGetParamCommand(
const uint8_t * commandData, size_t commandDataLen){
ReturnValue_t result;
/* Unpack the received action message */
GetParamMessageUnpacker getParamMessage;
result = getParamMessage.deSerialize(&commandData, &commandDataLen,
SerializeIF::Endianness::BIG);
if(result != HasReturnvaluesIF::RETURN_OK) {
sif::error << "Failed to deserialize message to extract information "
"from get parameter message" << std::endl;
2020-12-20 17:35:03 +01:00
return result;
2020-12-20 13:31:44 +01:00
}
2020-12-20 17:35:03 +01:00
/* Get an check table id to read from */
2020-12-20 13:31:44 +01:00
uint8_t tableId = getParamMessage.getTableId();
2020-12-20 17:35:03 +01:00
if(tableId != CONFIG_TABLE_ID && tableId != HK_TABLE_ID){
sif::error << "GomspaceDeviceHandler: Invalid table id in get parameter"
" message" << std::endl;
2020-12-20 13:31:44 +01:00
return INVALID_TABLE_ID;
}
/* Get and check address */
uint16_t address = getParamMessage.getAddress();
if(address > maxHkTableAddress && tableId == HK_TABLE_ID){
sif::error << "GomspaceDeviceHandler: Invalid address to get parameter from "
<< "housekeeping table" << std::endl;
return INVALID_ADDRESS;
}
if(address > maxConfigTableAddress && tableId == CONFIG_TABLE_ID){
sif::error << "GomspaceDeviceHandler: Invalid address to get parameter from "
<< "configuration table" << std::endl;
return INVALID_ADDRESS;
}
uint16_t length = sizeof(address);
uint16_t checksum = GOMSPACE::IGNORE_CHECKSUM;
uint16_t seq = 0;
uint16_t total = 0;
2020-12-20 17:35:03 +01:00
uint8_t parameterSize = getParamMessage.getParameterSize();
if(parameterSize > sizeof(uint32_t)) {
sif::error << "GomspaceDeviceHandler: GET_PARAM: Invalid parameter "
<< "size" << std::endl;
return INVALID_PARAM_SIZE;
}
2021-01-28 14:55:21 +01:00
uint16_t querySize = parameterSize + GOMSPACE::GS_HDR_LENGTH;
2020-12-20 13:31:44 +01:00
/* Generate the CSP command to send to the P60 Dock */
CspGetParamCommand getParamCmd(querySize, tableId, length,
checksum, seq, total, address);
size_t cspPacketLen = 0;
uint8_t* buffer = cspPacket;
result = getParamCmd.serialize(&buffer, &cspPacketLen, sizeof(cspPacket),
SerializeIF::Endianness::BIG);
if(result != HasReturnvaluesIF::RETURN_OK){
sif::error << "GomspaceDeviceHandler: Failed to serialize command to "
<< "get parameter" << std::endl;
}
if(cspPacketLen > MAX_PACKET_LEN){
sif::error << "GomspaceDeviceHandler: Received invalid get parameter "
"command" << std::endl;
return PACKET_TOO_LONG;
}
rawPacket = cspPacket;
rawPacketLen = cspPacketLen;
rememberRequestedSize = querySize;
2021-01-28 14:55:21 +01:00
rememberCommandId = GOMSPACE::PARAM_GET;
2020-12-20 13:31:44 +01:00
return HasReturnvaluesIF::RETURN_OK;
}
ReturnValue_t GomspaceDeviceHandler::generatePingCommand(
const uint8_t * commandData, size_t commandDataLen) {
CspPingCommand cspPingCommand(commandData, commandDataLen);
size_t cspPacketLen = 0;
uint8_t* buffer = cspPacket;
ReturnValue_t result = cspPingCommand.serialize(&buffer, &cspPacketLen,
sizeof(cspPacket),
SerializeIF::Endianness::BIG);
if(result != HasReturnvaluesIF::RETURN_OK){
sif::error << "GomspaceDeviceHandler: Failed to serialize ping command"
<< std::endl;
2020-12-20 17:35:03 +01:00
return result;
2020-12-20 13:31:44 +01:00
}
if(cspPacketLen > MAX_PACKET_LEN){
sif::error << "GomspaceDeviceHandler: Received invalid ping message"
<< std::endl;
return PACKET_TOO_LONG;
}
rawPacket = cspPacket;
rawPacketLen = cspPacketLen;
2021-01-28 14:55:21 +01:00
rememberCommandId = GOMSPACE::PING;
2020-12-20 13:31:44 +01:00
return HasReturnvaluesIF::RETURN_OK;
}
void GomspaceDeviceHandler::generateRebootCommand(){
uint8_t cspPort = GOMSPACE::REBOOT_PORT;
uint16_t querySize = 0;
*cspPacket = GOMSPACE::REBOOT_PORT;
*(cspPacket + 1) = querySize;
size_t cspPacketLen = sizeof(cspPort) + sizeof(cspPacketLen);
rawPacket = cspPacket;
rawPacketLen = cspPacketLen;
}
ReturnValue_t GomspaceDeviceHandler::generateResetWatchdogCmd(){
WatchdogResetCommand watchdogResetCommand;
size_t cspPacketLen = 0;
uint8_t* buffer = cspPacket;
ReturnValue_t result = watchdogResetCommand.serialize(&buffer,
&cspPacketLen, sizeof(cspPacket), SerializeIF::Endianness::BIG);
if(result != HasReturnvaluesIF::RETURN_OK){
sif::error << "GomspaceDeviceHandler: Failed to serialize watchdog reset "
<< "command" << std::endl;
2020-12-20 17:35:03 +01:00
return result;
2020-12-20 13:31:44 +01:00
}
rawPacket = cspPacket;
rawPacketLen = cspPacketLen;
rememberRequestedSize = 0; // No bytes will be queried with the ground
// watchdog command.
2021-01-28 14:55:21 +01:00
rememberCommandId = GOMSPACE::GNDWDT_RESET;
2020-12-20 13:31:44 +01:00
return HasReturnvaluesIF::RETURN_OK;
}
2020-12-27 17:31:38 +01:00
2021-01-28 14:55:21 +01:00
ReturnValue_t GomspaceDeviceHandler::generateRequestFullHkTableCmd(uint16_t hkTableSize) {
uint16_t querySize = hkTableSize + GOMSPACE::GS_HDR_LENGTH;
uint8_t tableId = HK_TABLE_ID;
RequestFullTableCommand requestFullTableCommand(querySize, tableId);
size_t cspPacketLen = 0;
uint8_t* buffer = cspPacket;
ReturnValue_t result = requestFullTableCommand.serialize(&buffer,
&cspPacketLen, sizeof(cspPacket), SerializeIF::Endianness::BIG);
if(result != HasReturnvaluesIF::RETURN_OK){
sif::error << "GomspaceDeviceHandler::generateRequestFullHkTableCmd Failed to serialize "
"full table request command " << std::endl;
return result;
}
rawPacket = cspPacket;
rawPacketLen = cspPacketLen;
rememberRequestedSize = querySize;
rememberCommandId = GOMSPACE::REQUEST_HK_TABLE;
return RETURN_OK;
}
uint32_t GomspaceDeviceHandler::getTransitionDelayMs(Mode_t modeFrom,
Mode_t modeTo) {
2020-12-27 17:31:38 +01:00
return 0;
}