#include <..\header\TC_handler.h> char TM_checker(ccsdsTelecommandSourcePacketHeader_t * TMPacket) { unsigned char pid = 0; unsigned char category = 0; unsigned int length = 0; // APID check *** APID on 2 bytes pid = ((TMPacket->packetID[0] & 0x07)<<4) + ( (TMPacket->packetID[1]>>4) & 0x0f ); // PID = 11 *** 7 bits xxxxx210 7654xxxx category = (TMPacket->packetID[1] & 0x0f); // PACKET_CATEGORY = 12 *** 4 bits xxxxxxxx xxxx3210 if (pid!=CCSDS_PROCESS_ID) return CCSDS_ERR_PID; if (category!=CCSDS_PACKET_CATEGORY) return CCSDS_ERR_CAT; // packet length check length = TMPacket->packetLength[1] + TMPacket->packetLength[0] * 256; if (category<=CCSDS_TELECOMMAND_MAX_PACKET_LENGTH) return CCSDS_ERR_LENGTH; // check that the packet does not exceed the MAX size // service type, subtype and packet length check switch(TMPacket->dataFieldHeader[1]) { // service type, authorized values are 181 and 9 case 181: switch(TMPacket->dataFieldHeader[2]){ //subtype, autorized values are 3, 20, 21, 24, 27, 28, 30, 40, 50, 60, 61 case 3: if (length!=12) return CCSDS_ERR_LENGTH; break; case 20: if (length!=14) return CCSDS_ERR_LENGTH; break; case 21: if (length!=20) return CCSDS_ERR_LENGTH; break; case 24: if (length!=14) return CCSDS_ERR_LENGTH; break; case 27: if (length!=14) return CCSDS_ERR_LENGTH; break; case 28: if (length!=14) return CCSDS_ERR_LENGTH; break; case 30: if (length!=12) return CCSDS_ERR_LENGTH; break; case 40: if (length!=20) return CCSDS_ERR_LENGTH; break; case 50: if (length!=50) return CCSDS_ERR_LENGTH; break; case 60: if (length!=12) return CCSDS_ERR_LENGTH; break; case 61: if (length!=12) return CCSDS_ERR_LENGTH; break; default: return CCSDS_ERR_SUBTYPE; break; } case 9: if (TMPacket->dataFieldHeader[2]==129) return CCSDS_ERR_SUBTYPE; if (length!=18) return CCSDS_ERR_LENGTH; break; default: return CCSDS_ERR_TYPE; break; } // source ID check // Source ID not documented in the ICD // packet error control, CRC check return CCSDS_TM_VALID; }