TC_handler.c
74 lines
| 2.8 KiB
| text/x-c
|
CLexer
/ src / TC_handler.c
paul
|
r0 | #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; | ||||
} | ||||