#include #include #include char *errorCCSDSMsg[8] = { "ILLEGAL_APID 0", "WRONG_LEN_PACKET 1", "INCOR_CHECKSUM 2", "ILL_TYPE 3", "ILL_SUBTYPE 4", "WRONG_APP_DATA 5", "WRONG_CMD_CODE 6", "CCSDS_TM_VALID 7" }; char *tmGeneratorMsg[2] = { "NOTHING_TO_DO", "TM_GENERATED" }; void test_TC_handler(){ ccsdsTelecommandPacket_t TCPacketToCheck; unsigned char result; unsigned char CRCAsTwoBytes[2] = {0, 0}; unsigned char *ccsdsContent; unsigned int i = 0; unsigned int length = 0; unsigned int packetLengthField = 0; printf("\n*** start of test_TC_handler()\n"); //******************* // TC_LFR_DUMP_PAR TC printf("\n =============> TEST TC_LFR_DUMP_PAR_TC <============\n"); length = 12; packetLengthField = length - 6 - 1; // -6 for the header and -1 to meet the definition of PACKET_LENGTH currentTC_LEN_RCV[0] = 0x00; currentTC_LEN_RCV[1] = packetLengthField; // //TCPacketToCheck.targetLogicalAddress = 0xfe; TCPacketToCheck.protocolIdentifier = 0x02; TCPacketToCheck.reserved = 0x00; TCPacketToCheck.userApplication = 0x00; // TCPacketToCheck.packetID[0] = 0x1c; TCPacketToCheck.packetID[1] = 0xcc; TCPacketToCheck.packetSequenceControl[0] = 0xc0; TCPacketToCheck.packetSequenceControl[1] = 0x00; TCPacketToCheck.packetLength[0] = 0x00; TCPacketToCheck.packetLength[1] = packetLengthField; TCPacketToCheck.dataFieldHeader[0] = 0x19; // TCPacketToCheck.dataFieldHeader[1] = 0xb5; // type TCPacketToCheck.dataFieldHeader[2] = 0x1e; // subtype TCPacketToCheck.dataFieldHeader[3] = 0x00; // source ID // no data, the CRC comes immediately after the packet header GetCRCAsTwoBytes((unsigned char*)TCPacketToCheck.packetID, CRCAsTwoBytes, packetLengthField + 5); TCPacketToCheck.dataAndCRC[length-10-2] = CRCAsTwoBytes[0]; TCPacketToCheck.dataAndCRC[length-10-1] = CRCAsTwoBytes[1]; ccsdsContent = (unsigned char*)TCPacketToCheck.packetID; // TEST 1 result = TM_checker(&TCPacketToCheck); printf(" => test TC_LFR_DUMP_PAR %s\n", errorCCSDSMsg[result]); // TEST 2 TCPacketToCheck.dataFieldHeader[2] = 0x04; // subtype result = TM_checker(&TCPacketToCheck); printf(" => test TC_LFR_DUMP_PAR (with wrong subtype) %s\n", errorCCSDSMsg[result]); // TEST 3 TCPacketToCheck.dataFieldHeader[2] = 0x1e; // subtype result = TM_checker(&TCPacketToCheck); printf(" => test TC_LFR_DUMP_PAR %s\n", errorCCSDSMsg[result]); // TEST 4 TCPacketToCheck.packetLength[1] = 49; // length result = TM_checker(&TCPacketToCheck); printf(" => test TC_LFR_DUMP_PAR (with wrong length) %s\n", errorCCSDSMsg[result]); // TEST 5 TCPacketToCheck.packetLength[1] = packetLengthField; // length TCPacketToCheck.dataAndCRC[0] = 0; result = TM_checker(&TCPacketToCheck); printf(" => test TC_LFR_DUMP_PAR (with wrong CRC) %s\n", errorCCSDSMsg[result]); //******************* // TC_LFR_UPDATE_INFO printf("\n =============> TEST TC_LFR_UPDATE_INFO <============\n"); length = 50; packetLengthField = length - 6 - 1; // -6 for the header and -1 to meet the definition of PACKET_LENGTH currentTC_LEN_RCV[0] = 0x00; currentTC_LEN_RCV[1] = packetLengthField; // //TCPacketToCheck.targetLogicalAddress = 0xfe; TCPacketToCheck.protocolIdentifier = 0x02; TCPacketToCheck.reserved = 0x00; TCPacketToCheck.userApplication = 0x00; // TCPacketToCheck.packetID[0] = 0x1c; TCPacketToCheck.packetID[1] = 0xcc; TCPacketToCheck.packetSequenceControl[0] = 0xc0; TCPacketToCheck.packetSequenceControl[1] = 0x00; TCPacketToCheck.packetLength[0] = 0x00; TCPacketToCheck.packetLength[1] = packetLengthField; TCPacketToCheck.dataFieldHeader[0] = 0x19; // TCPacketToCheck.dataFieldHeader[1] = 0xb5; // type TCPacketToCheck.dataFieldHeader[2] = 0x32; // subtype TCPacketToCheck.dataFieldHeader[3] = 0x00; // source ID // no data, the CRC comes immediately after the packet header for (i=0; i test TC_LFR_UPDATE_INFO %s\n", errorCCSDSMsg[result]); // TEST 2 TCPacketToCheck.dataFieldHeader[2] = 0x05; // subtype result = TM_checker(&TCPacketToCheck); printf(" => test TC_LFR_UPDATE_INFO (with wrong subtype) %s\n", errorCCSDSMsg[result]); // TEST 3 TCPacketToCheck.dataFieldHeader[2] = 0x32; // subtype result = TM_checker(&TCPacketToCheck); printf(" => test TC_LFR_UPDATE_INFO %s\n", errorCCSDSMsg[result]); // TEST 4 TCPacketToCheck.packetLength[1] = 49; // length result = TM_checker(&TCPacketToCheck); printf(" => test TC_LFR_UPDATE_INFO (invalid length) %s\n", errorCCSDSMsg[result]); // TEST 5 TCPacketToCheck.packetLength[1] = packetLengthField; // length reset to the right value TCPacketToCheck.dataAndCRC[0] = TCPacketToCheck.dataAndCRC[0]+1; // introduce error in the CRC result = TM_checker(&TCPacketToCheck); printf(" => test TC_LFR_UPDATE_INFO (wrong CRC) %s\n", errorCCSDSMsg[result]); // TEST 6 currentTC_LEN_RCV[1] = 0; // introduce error in the receive packet length GetCRCAsTwoBytes((unsigned char*)TCPacketToCheck.packetID, CRCAsTwoBytes, packetLengthField + 5); TCPacketToCheck.dataAndCRC[packetLengthField-3-2] = CRCAsTwoBytes[0]; TCPacketToCheck.dataAndCRC[packetLengthField-3-1] = CRCAsTwoBytes[1]; result = TM_checker(&TCPacketToCheck); printf(" => test TC_LFR_UPDATE_INFO (LEN RCV != SIZE) %s\n", errorCCSDSMsg[result]); // TEST 6 currentTC_LEN_RCV[1] = packetLengthField; // introduce error in the receive packet length result = TM_checker(&TCPacketToCheck); printf(" => test TC_LFR_UPDATE_INFO %s\n", errorCCSDSMsg[result]); printf("*** end of test_TC_handler()\n"); } void test_GetCRC(){ unsigned char indata[2]; unsigned char indata0[3]; unsigned char indata1[4]; unsigned char indata2[6]; unsigned char indata3[10]; unsigned char crcAsTwoBytes[2]; printf("\n*** start of test_GetCRC()\n"); indata[0] = 0x00; indata[1] = 0x00; GetCRCAsTwoBytes(indata, crcAsTwoBytes, 2); printf("crc is %x %x, should be 0x1d 0x0f\n", crcAsTwoBytes[0], crcAsTwoBytes[1]); indata0[0] = 0x00; indata0[1] = 0x00; indata0[2] = 0x00; GetCRCAsTwoBytes(indata0, crcAsTwoBytes, 3); printf("crc is %x %x, should be 0xcc 0x9c\n", crcAsTwoBytes[0], crcAsTwoBytes[1]); indata1[0] = 0xab; indata1[1] = 0xcd; indata1[2] = 0xef; indata1[3] = 0x01; GetCRCAsTwoBytes(indata1, crcAsTwoBytes, 4); printf("crc is %x %x, should be 0x04 0xa2\n", crcAsTwoBytes[0], crcAsTwoBytes[1]); indata2[0] = 0x14; indata2[1] = 0x56; indata2[2] = 0xf8; indata2[3] = 0x9a; indata2[4] = 0x00; indata2[5] = 0x01; GetCRCAsTwoBytes(indata2, crcAsTwoBytes, 6); printf("crc is %x %x, should be 0x7f 0xd5\n", crcAsTwoBytes[0], crcAsTwoBytes[1]); indata3[0] = 0x1c; indata3[1] = 0xcc; indata3[2] = 0xc0; indata3[3] = 0x00; indata3[4] = 0x00; indata3[5] = 0x0c; indata3[6] = 0x19; // indata3[7] = 0xb5; // type indata3[8] = 0x1e; // subtype indata3[9] = 0x00; // source ID GetCRCAsTwoBytes(indata3, crcAsTwoBytes, 10); printf("crc is %x %x\n", crcAsTwoBytes[0], crcAsTwoBytes[1]); printf("*** end of test_GetCRC()\n"); } void test_TM_acceptance_generator() { unsigned char result = 0; unsigned char code = 0; unsigned char CRCAsTwoBytes[2] = {0,0}; unsigned char * ccsdsContent; unsigned int length = 0; unsigned int packetLengthField = 0; ccsdsTelemetryPacket_t TMPacket; ccsdsTelecommandPacket_t TCPacket; //******************* // TC_LFR_DUMP_PAR TC length = 12; packetLengthField = length - 6 - 1; // -6 for the header and -1 to meet the definition of PACKET_LENGTH currentTC_LEN_RCV[0] = 0x00; currentTC_LEN_RCV[01] = packetLengthField; // //TCPacket.targetLogicalAddress = 0xfe; TCPacket.protocolIdentifier = 0x02; TCPacket.reserved = 0x00; TCPacket.userApplication = 0x00; // TCPacket.packetID[0] = 0x1c; TCPacket.packetID[1] = 0xcc; TCPacket.packetSequenceControl[0] = 0xc0; TCPacket.packetSequenceControl[1] = 0x00; TCPacket.packetLength[0] = 0x00; TCPacket.packetLength[1] = packetLengthField; TCPacket.dataFieldHeader[0] = 0x19; // TCPacket.dataFieldHeader[1] = 0xb5; // type TCPacket.dataFieldHeader[2] = 0x1e; // subtype TCPacket.dataFieldHeader[3] = 0x00; // source ID // no data, the CRC comes immediately after the packet header GetCRCAsTwoBytes((unsigned char*)TCPacket.packetID, CRCAsTwoBytes, packetLengthField + 5); TCPacket.dataAndCRC[length-10-2] = CRCAsTwoBytes[0]; TCPacket.dataAndCRC[length-10-1] = CRCAsTwoBytes[1]; ccsdsContent = (unsigned char*)TCPacket.packetID; // TEST 1 code = TM_checker(&TCPacket); result = TM_acceptance_generator(&TCPacket, code, &TMPacket); printf(" => TEST 1\n"); printf(" => test TC_LFR_DUMP_PAR %s\n", errorCCSDSMsg[code]); printf(" => result %s\n", tmGeneratorMsg[result]); // TEST 2 TCPacket.dataFieldHeader[2] = 0x04; // subtype code = TM_checker(&TCPacket); result = TM_acceptance_generator(&TCPacket, code, &TMPacket); printf(" => TEST 2\n"); printf(" => test TC_LFR_DUMP_PAR (with wrong subtype) %s\n", errorCCSDSMsg[code]); printf(" => result %s\n", tmGeneratorMsg[result]); // TEST 3 TCPacket.dataFieldHeader[2] = 0x1e; // subtype code = TM_checker(&TCPacket); result = TM_acceptance_generator(&TCPacket, code, &TMPacket); printf(" => TEST 2\n"); printf(" => test TC_LFR_DUMP_PAR %s\n", errorCCSDSMsg[code]); printf(" => result %s\n", tmGeneratorMsg[result]); // TEST 4 TCPacket.packetLength[1] = 49; // length code = TM_checker(&TCPacket); result = TM_acceptance_generator(&TCPacket, code, &TMPacket); printf(" => TEST 4\n"); printf(" => test TC_LFR_DUMP_PAR (invalid length) %s\n", errorCCSDSMsg[code]); printf(" => result %s\n", tmGeneratorMsg[result]); // TEST 5 TCPacket.packetLength[1] = packetLengthField; // length TCPacket.dataAndCRC[0] = 0; code = TM_checker(&TCPacket); result = TM_acceptance_generator(&TCPacket, code, &TMPacket); printf(" => TEST 5\n"); printf(" => test TC_LFR_DUMP_PAR (with wrong CRC) %s\n", errorCCSDSMsg[code]); printf(" => result %s\n", tmGeneratorMsg[result]); printf(" => received CRC: [%x, %x], should be [%x, %x]\n", TCPacket.dataAndCRC[0], TCPacket.dataAndCRC[1], currentTC_COMPUTED_CRC[0], TCPacket.dataAndCRC[1]); // TEST 6 GetCRCAsTwoBytes((unsigned char*)TCPacket.packetID, CRCAsTwoBytes, packetLengthField + 5); TCPacket.dataAndCRC[length-10-2] = CRCAsTwoBytes[0]; // restore the CRC currentTC_LEN_RCV[1] = 1; // put error in the received packet length code = TM_checker(&TCPacket); result = TM_acceptance_generator(&TCPacket, code, &TMPacket); printf(" => TEST 6\n"); printf(" => test TC_LFR_DUMP_PAR (RCV LEN != SIZE FIELD) %s\n", errorCCSDSMsg[code]); printf(" => result: %s\n", tmGeneratorMsg[result]); printf(" => RCV LEN: [%x, %x], should be [%x, %x]\n", currentTC_LEN_RCV[0], currentTC_LEN_RCV[1], TCPacket.packetLength[0], TCPacket.packetLength[1]); } int main() { InitLookUpTableForCRC(); //test_GetCRC(); //test_TC_handler(); test_TM_acceptance_generator(); return 0; }