##// END OF EJS Templates
Minor updates
paul@pc-solar1.lab-lpp.local -
r7:8567eb30bf83 default
parent child
Show More
@@ -1,64 +1,69
1 <?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
1 <?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
2 <CodeBlocks_project_file>
2 <CodeBlocks_project_file>
3 <FileVersion major="1" minor="6" />
3 <FileVersion major="1" minor="6" />
4 <Project>
4 <Project>
5 <Option title="FSW-rtems" />
5 <Option title="FSW-rtems" />
6 <Option pch_mode="2" />
6 <Option pch_mode="2" />
7 <Option compiler="sparc_rtems_gcc" />
7 <Option compiler="sparc_rtems_gcc" />
8 <Build>
8 <Build>
9 <Target title="Debug">
9 <Target title="Debug">
10 <Option output="bin/Debug/fsw" prefix_auto="1" extension_auto="1" />
10 <Option output="bin/Debug/fsw" prefix_auto="1" extension_auto="1" />
11 <Option object_output="obj/Debug/" />
11 <Option object_output="obj/Debug/" />
12 <Option type="1" />
12 <Option type="1" />
13 <Option compiler="sparc_rtems_gcc_compiler" />
13 <Option compiler="sparc_rtems_gcc_compiler" />
14 <Compiler>
14 <Compiler>
15 <Add option="-fexpensive-optimizations" />
15 <Add option="-fexpensive-optimizations" />
16 <Add option="-O3" />
16 <Add option="-O3" />
17 <Add option="-g" />
17 <Add option="-g" />
18 <Add directory="../header" />
18 <Add directory="../header" />
19 <Add directory="../src" />
19 <Add directory="../src" />
20 </Compiler>
20 </Compiler>
21 </Target>
21 </Target>
22 <Target title="Release">
22 <Target title="Release">
23 <Option output="bin/Release/FSW-rtems" prefix_auto="1" extension_auto="1" />
23 <Option output="bin/Release/FSW-rtems" prefix_auto="1" extension_auto="1" />
24 <Option object_output="obj/Release/" />
24 <Option object_output="obj/Release/" />
25 <Option type="1" />
25 <Option type="1" />
26 <Option compiler="sparc_rtems_gcc" />
26 <Option compiler="sparc_rtems_gcc" />
27 <Compiler>
27 <Compiler>
28 <Add option="-O2" />
28 <Add option="-O2" />
29 </Compiler>
29 </Compiler>
30 <Linker>
30 <Linker>
31 <Add option="-s" />
31 <Add option="-s" />
32 </Linker>
32 </Linker>
33 </Target>
33 </Target>
34 </Build>
34 </Build>
35 <Compiler>
35 <Compiler>
36 <Add option="-Wall" />
36 <Add option="-Wall" />
37 </Compiler>
37 </Compiler>
38 <Unit filename="../header/FSW-config.h" />
39 <Unit filename="../header/FSW-rtems-processing.h" />
40 <Unit filename="../header/TC_handler.h" />
41 <Unit filename="../header/WF_handler.h" />
42 <Unit filename="../header/ccsds_types.h" />
38 <Unit filename="../header/ccsds_types.h" />
43 <Unit filename="../header/grlibregs.h" />
39 <Unit filename="../header/fsw_init.h" />
44 <Unit filename="../src/FSW-config.c">
40 <Unit filename="../header/fsw_misc.h" />
41 <Unit filename="../header/fsw_params.h" />
42 <Unit filename="../header/fsw_processing.h" />
43 <Unit filename="../header/grlib_regs.h" />
44 <Unit filename="../header/tc_handler.h" />
45 <Unit filename="../header/wf_handler.h" />
46 <Unit filename="../src/fsw_globals.c">
45 <Option compilerVar="CC" />
47 <Option compilerVar="CC" />
46 </Unit>
48 </Unit>
47 <Unit filename="../src/FSW-rtems-processing.c">
49 <Unit filename="../src/fsw_init.c">
50 <Option compilerVar="CC" />
51 </Unit>
52 <Unit filename="../src/fsw_misc.c">
48 <Option compilerVar="CC" />
53 <Option compilerVar="CC" />
49 </Unit>
54 </Unit>
50 <Unit filename="../src/FSW-rtems.c">
55 <Unit filename="../src/fsw_processing.c">
51 <Option compilerVar="CC" />
56 <Option compilerVar="CC" />
52 </Unit>
57 </Unit>
53 <Unit filename="../src/TC_handler.c">
58 <Unit filename="../src/tc_handler.c">
54 <Option compilerVar="CC" />
59 <Option compilerVar="CC" />
55 </Unit>
60 </Unit>
56 <Unit filename="../src/WF_handler.c">
61 <Unit filename="../src/wf_handler.c">
57 <Option compilerVar="CC" />
62 <Option compilerVar="CC" />
58 </Unit>
63 </Unit>
59 <Extensions>
64 <Extensions>
60 <code_completion />
65 <code_completion />
61 <debugger />
66 <debugger />
62 </Extensions>
67 </Extensions>
63 </Project>
68 </Project>
64 </CodeBlocks_project_file>
69 </CodeBlocks_project_file>
@@ -1,31 +1,43
1 <?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
1 <?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
2 <CodeBlocks_layout_file>
2 <CodeBlocks_layout_file>
3 <ActiveTarget name="Debug" />
3 <ActiveTarget name="Debug" />
4 <File name="../header/FSW-config.h" open="0" top="0" tabpos="0">
4 <File name="../header/ccsds_types.h" open="1" top="0" tabpos="5">
5 <Cursor position="581" topLine="0" />
5 <Cursor position="1172" topLine="24" />
6 </File>
6 </File>
7 <File name="../header/FSW-rtems-processing.h" open="0" top="0" tabpos="4">
7 <File name="../header/fsw_init.h" open="0" top="0" tabpos="0">
8 <Cursor position="995" topLine="6" />
8 <Cursor position="307" topLine="0" />
9 </File>
10 <File name="../header/fsw_misc.h" open="0" top="0" tabpos="0">
11 <Cursor position="114" topLine="0" />
9 </File>
12 </File>
10 <File name="../header/TC_handler.h" open="0" top="0" tabpos="5">
13 <File name="../header/fsw_params.h" open="0" top="0" tabpos="0">
11 <Cursor position="963" topLine="0" />
14 <Cursor position="1320" topLine="8" />
12 </File>
15 </File>
13 <File name="../header/ccsds_types.h" open="0" top="0" tabpos="4">
16 <File name="../header/fsw_processing.h" open="0" top="0" tabpos="0">
14 <Cursor position="1753" topLine="39" />
17 <Cursor position="175" topLine="1" />
18 </File>
19 <File name="../header/tc_handler.h" open="1" top="0" tabpos="4">
20 <Cursor position="634" topLine="0" />
15 </File>
21 </File>
16 <File name="../header/grlibregs.h" open="0" top="0" tabpos="6">
22 <File name="../header/wf_handler.h" open="0" top="0" tabpos="0">
17 <Cursor position="915" topLine="1" />
23 <Cursor position="212" topLine="0" />
18 </File>
24 </File>
19 <File name="../src/FSW-config.c" open="0" top="0" tabpos="3">
25 <File name="../src/fsw_globals.c" open="0" top="0" tabpos="0">
20 <Cursor position="259" topLine="0" />
26 <Cursor position="908" topLine="0" />
27 </File>
28 <File name="../src/fsw_init.c" open="1" top="0" tabpos="1">
29 <Cursor position="1703" topLine="42" />
21 </File>
30 </File>
22 <File name="../src/FSW-rtems-processing.c" open="0" top="0" tabpos="2">
31 <File name="../src/fsw_misc.c" open="0" top="0" tabpos="0">
23 <Cursor position="416" topLine="17" />
32 <Cursor position="20" topLine="0" />
33 </File>
34 <File name="../src/fsw_processing.c" open="1" top="0" tabpos="2">
35 <Cursor position="1175" topLine="46" />
24 </File>
36 </File>
25 <File name="../src/FSW-rtems.c" open="1" top="1" tabpos="1">
37 <File name="../src/tc_handler.c" open="1" top="1" tabpos="3">
26 <Cursor position="14643" topLine="95" />
38 <Cursor position="2672" topLine="26" />
27 </File>
39 </File>
28 <File name="../src/TC_handler.c" open="0" top="0" tabpos="2">
40 <File name="../src/wf_handler.c" open="0" top="0" tabpos="0">
29 <Cursor position="2441" topLine="9" />
41 <Cursor position="3936" topLine="62" />
30 </File>
42 </File>
31 </CodeBlocks_layout_file>
43 </CodeBlocks_layout_file>
1 NO CONTENT: modified file, binary diff hidden
NO CONTENT: modified file, binary diff hidden
@@ -1,36 +1,40
1 #ifndef TC_HANDLER_H_INCLUDED
1 #ifndef TC_HANDLER_H_INCLUDED
2 #define TC_HANDLER_H_INCLUDED
2 #define TC_HANDLER_H_INCLUDED
3
3
4 #include <rtems.h>
4 #include <rtems.h>
5 #include <stdio.h>
5 #include <stdio.h>
6 #include <unistd.h> // for the read call
6 #include <unistd.h> // for the read call
7 #include <sys/ioctl.h> // for the ioctl call
7 #include <sys/ioctl.h> // for the ioctl call
8 #include <ccsds_types.h>
8 #include <ccsds_types.h>
9 #include <grspw.h>
9 #include <grspw.h>
10
10
11 extern int fdSPW;
11 extern int fdSPW;
12 extern rtems_id Task_id[ ]; /* array of task ids */
12 extern rtems_id Task_id[ ]; /* array of task ids */
13
13
14 unsigned char currentTC_LEN_RCV[2]; // SHALL be equal to the current TC packet estimated packet length field
14 unsigned char currentTC_LEN_RCV[2]; // SHALL be equal to the current TC packet estimated packet length field
15 unsigned char currentTC_COMPUTED_CRC[2];
15 unsigned char currentTC_COMPUTED_CRC[2];
16 unsigned int currentTC_LEN_RCV_AsUnsignedInt;
16 unsigned int currentTC_LEN_RCV_AsUnsignedInt;
17 unsigned int currentTM_length;
17 unsigned int currentTM_length;
18 unsigned char currentTC_processedFlag;
18 unsigned char currentTC_processedFlag;
19
19
20 //**********************
21 // GENERAL USE FUNCTIONS
20 unsigned int lookUpTableForCRC[256];
22 unsigned int lookUpTableForCRC[256];
21 void InitLookUpTableForCRC();
23 void InitLookUpTableForCRC();
22 void GetCRCAsTwoBytes(unsigned char* data, unsigned char* crcAsTwoBytes, unsigned int sizeOfData);
24 void GetCRCAsTwoBytes(unsigned char* data, unsigned char* crcAsTwoBytes, unsigned int sizeOfData);
23
25
26 //*********************
24 // ACCEPTANCE FUNCTIONS
27 // ACCEPTANCE FUNCTIONS
25 unsigned char acceptTM(ccsdsTelecommandPacket_t * TMPacket, unsigned int TC_LEN_RCV);
28 unsigned char acceptTM(ccsdsTelecommandPacket_t * TMPacket, unsigned int TC_LEN_RCV);
26
29
27 unsigned char TM_build_header( enum TM_TYPE tm_type, unsigned int SID, unsigned int packetLength,
30 unsigned char TM_build_header( enum TM_TYPE tm_type, unsigned int SID, unsigned int packetLength,
28 unsigned int coarseTime, unsigned int fineTime, TMHeader_t *TMHeader);
31 unsigned int coarseTime, unsigned int fineTime, TMHeader_t *TMHeader);
29 unsigned char TM_build_data(ccsdsTelecommandPacket_t *TC, char* data, unsigned int SID, unsigned char *computed_CRC);
32 unsigned char TM_build_data(ccsdsTelecommandPacket_t *TC, char* data, unsigned int SID, unsigned char *computed_CRC);
30 unsigned int TC_checker(ccsdsTelecommandPacket_t *TC, unsigned int TC_LEN_RCV,
33 unsigned int TC_checker(ccsdsTelecommandPacket_t *TC, unsigned int TC_LEN_RCV,
31 TMHeader_t *TM_Header, unsigned int *hlen, char *data);
34 TMHeader_t *TM_Header, unsigned int *hlen, char *data);
32
35
36 //***********
33 // RTEMS TASK
37 // RTEMS TASK
34 rtems_task spw_recv_task( rtems_task_argument unused );
38 rtems_task spw_recv_task( rtems_task_argument unused );
35
39
36 #endif // TC_HANDLER_H_INCLUDED
40 #endif // TC_HANDLER_H_INCLUDED
@@ -1,319 +1,331
1 #include <tc_handler.h>
1 #include <tc_handler.h>
2 #include <fsw_params.h>
2 #include <fsw_params.h>
3
3
4 char *errorCCSDSMsg[8] = { "ILLEGAL_APID 0",
4 char *errorCCSDSMsg[8] = { "ILLEGAL_APID 0",
5 "WRONG_LEN_PACKET 1",
5 "WRONG_LEN_PACKET 1",
6 "INCOR_CHECKSUM 2",
6 "INCOR_CHECKSUM 2",
7 "ILL_TYPE 3",
7 "ILL_TYPE 3",
8 "ILL_SUBTYPE 4",
8 "ILL_SUBTYPE 4",
9 "WRONG_APP_DATA 5",
9 "WRONG_APP_DATA 5",
10 "WRONG_CMD_CODE 6",
10 "WRONG_CMD_CODE 6",
11 "CCSDS_TM_VALID 7"
11 "CCSDS_TM_VALID 7"
12 };
12 };
13
13
14 //**********************
15 // GENERAL USE FUNCTIONS
14 unsigned int Crc_opt( unsigned char D, unsigned int Chk)
16 unsigned int Crc_opt( unsigned char D, unsigned int Chk)
15 {
17 {
16 return(((Chk << 8) & 0xff00)^lookUpTableForCRC [(((Chk >> 8)^D) & 0x00ff)]);
18 return(((Chk << 8) & 0xff00)^lookUpTableForCRC [(((Chk >> 8)^D) & 0x00ff)]);
17 }
19 }
18
20
19 void InitLookUpTableForCRC()
21 void InitLookUpTableForCRC()
20 {
22 {
21 unsigned int i, tmp;
23 unsigned int i, tmp;
22 for (i=0; i<256; i++)
24 for (i=0; i<256; i++)
23 {
25 {
24 tmp = 0;
26 tmp = 0;
25 if((i & 1) != 0) tmp = tmp ^ 0x1021;
27 if((i & 1) != 0) tmp = tmp ^ 0x1021;
26 if((i & 2) != 0) tmp = tmp ^ 0x2042;
28 if((i & 2) != 0) tmp = tmp ^ 0x2042;
27 if((i & 4) != 0) tmp = tmp ^ 0x4084;
29 if((i & 4) != 0) tmp = tmp ^ 0x4084;
28 if((i & 8) != 0) tmp = tmp ^ 0x8108;
30 if((i & 8) != 0) tmp = tmp ^ 0x8108;
29 if((i & 16) != 0) tmp = tmp ^ 0x1231;
31 if((i & 16) != 0) tmp = tmp ^ 0x1231;
30 if((i & 32) != 0) tmp = tmp ^ 0x2462;
32 if((i & 32) != 0) tmp = tmp ^ 0x2462;
31 if((i & 64) != 0) tmp = tmp ^ 0x48c4;
33 if((i & 64) != 0) tmp = tmp ^ 0x48c4;
32 if((i & 128) != 0) tmp = tmp ^ 0x9188;
34 if((i & 128) != 0) tmp = tmp ^ 0x9188;
33 lookUpTableForCRC[i] = tmp;
35 lookUpTableForCRC[i] = tmp;
34 }
36 }
35 }
37 }
36
38
37 void GetCRCAsTwoBytes(unsigned char* data, unsigned char* crcAsTwoBytes, unsigned int sizeOfData)
39 void GetCRCAsTwoBytes(unsigned char* data, unsigned char* crcAsTwoBytes, unsigned int sizeOfData)
38 {
40 {
39 unsigned int Chk;
41 unsigned int Chk;
40 int j;
42 int j;
41 Chk = 0xffff; // reset the syndrom to all ones
43 Chk = 0xffff; // reset the syndrom to all ones
42 for (j=0; j<sizeOfData; j++) {
44 for (j=0; j<sizeOfData; j++) {
43 Chk = Crc_opt(data[j], Chk);
45 Chk = Crc_opt(data[j], Chk);
44 }
46 }
45 crcAsTwoBytes[0] = (unsigned char) (Chk >> 8);
47 crcAsTwoBytes[0] = (unsigned char) (Chk >> 8);
46 crcAsTwoBytes[1] = (unsigned char) (Chk & 0x00ff);
48 crcAsTwoBytes[1] = (unsigned char) (Chk & 0x00ff);
47 }
49 }
48
50
51
52 //*********************
53 // ACCEPTANCE FUNCTIONS
49 unsigned int TC_checker(ccsdsTelecommandPacket_t *TC, unsigned int TC_LEN_RCV,
54 unsigned int TC_checker(ccsdsTelecommandPacket_t *TC, unsigned int TC_LEN_RCV,
50 TMHeader_t *TM_Header, unsigned int *hlen, char *data)
55 TMHeader_t *TM_Header, unsigned int *hlen, char *data)
51 {
56 {
52 unsigned int code = 0;
57 unsigned int code = 0;
53 unsigned int data_length = 0;
58 unsigned int data_length = 0;
54 unsigned char computed_CRC[2];
59 unsigned char computed_CRC[2];
55 unsigned char subtype = 0;
60 unsigned char subtype = 0;
56
61
57 subtype = TC->dataFieldHeader[2];
62 subtype = TC->dataFieldHeader[2];
58 GetCRCAsTwoBytes( (unsigned char*) TC->packetID, computed_CRC, TC_LEN_RCV + 5 );
63 GetCRCAsTwoBytes( (unsigned char*) TC->packetID, computed_CRC, TC_LEN_RCV + 5 );
59 code = acceptTM( TC, TC_LEN_RCV ) ;
64 code = acceptTM( TC, TC_LEN_RCV ) ;
60 //PRINTF1("in TC_checker *** %s\n", errorCCSDSMsg[code]);
65 //PRINTF1("in TC_checker *** %s\n", errorCCSDSMsg[code]);
61 if ( (code == 0) | (code == 1) | (code == 2)
66 if ( (code == 0) | (code == 1) | (code == 2)
62 | (code == 3) | (code == 4) | (code == 5) )
67 | (code == 3) | (code == 4) | (code == 5) )
63 { // generate TM_LFR_TC_EXE_CORRUPTED
68 { // generate TM_LFR_TC_EXE_CORRUPTED
64 // BUILD HEADER
69 // BUILD HEADER
65 TM_build_header( TM_LFR_TC_EXE_ERR, SID_EXE_CORR, TM_LEN_EXE_CORR, 0, 0, TM_Header);
70 TM_build_header( TM_LFR_TC_EXE_ERR, SID_EXE_CORR, TM_LEN_EXE_CORR, 0, 0, TM_Header);
66 // BUILD DATA
71 // BUILD DATA
67 TM_build_data( TC, data, SID_EXE_CORR, computed_CRC);
72 TM_build_data( TC, data, SID_EXE_CORR, computed_CRC);
68 data_length = TM_LEN_EXE_CORR + CCSDS_TC_TM_PACKET_OFFSET - TM_HEADER_LEN;
73 data_length = TM_LEN_EXE_CORR + CCSDS_TC_TM_PACKET_OFFSET - TM_HEADER_LEN;
69 }
74 }
70 if (subtype == SID_TC_UPDT_TIME){
75 if (subtype == SID_TC_UPDT_TIME){
71 // BUILD HEADER
76 // BUILD HEADER
72 TM_build_header( TM_LFR_TC_EXE_OK, SID_DEFAULT, TM_LEN_EXE, 0, 0, TM_Header);
77 TM_build_header( TM_LFR_TC_EXE_OK, SID_DEFAULT, TM_LEN_EXE, 0, 0, TM_Header);
73 // BUILD DATA
78 // BUILD DATA
74 TM_build_data( TC, data, SID_DEFAULT, computed_CRC);
79 TM_build_data( TC, data, SID_DEFAULT, computed_CRC);
75 data_length = TM_LEN_NOT_IMP + CCSDS_TC_TM_PACKET_OFFSET - TM_HEADER_LEN;
80 data_length = TM_LEN_NOT_IMP + CCSDS_TC_TM_PACKET_OFFSET - TM_HEADER_LEN;
76 }
81 }
77 else { // TM_LFR_TC_EXE_NOT_IMPLEMENTED
82 else { // TM_LFR_TC_EXE_NOT_IMPLEMENTED
78 // BUILD HEADER
83 // BUILD HEADER
79 TM_build_header( TM_LFR_TC_EXE_ERR, SID_NOT_IMP, TM_LEN_NOT_IMP, 0, 0, TM_Header);
84 TM_build_header( TM_LFR_TC_EXE_ERR, SID_NOT_IMP, TM_LEN_NOT_IMP, 0, 0, TM_Header);
80 // BUILD DATA
85 // BUILD DATA
81 TM_build_data( TC, data, SID_NOT_IMP, computed_CRC);
86 TM_build_data( TC, data, SID_NOT_IMP, computed_CRC);
82 data_length = TM_LEN_NOT_IMP + CCSDS_TC_TM_PACKET_OFFSET - TM_HEADER_LEN;
87 data_length = TM_LEN_NOT_IMP + CCSDS_TC_TM_PACKET_OFFSET - TM_HEADER_LEN;
83 }
88 }
84
89
85 return data_length;
90 return data_length;
86 }
91 }
87
92
88 unsigned char acceptTM(ccsdsTelecommandPacket_t * TMPacket, unsigned int TC_LEN_RCV)
93 unsigned char acceptTM(ccsdsTelecommandPacket_t * TMPacket, unsigned int TC_LEN_RCV)
89 {
94 {
90 unsigned char pid = 0;
95 unsigned char pid = 0;
91 unsigned char category = 0;
96 unsigned char category = 0;
92 unsigned int length = 0;
97 unsigned int length = 0;
93 unsigned char packetType = 0;
98 unsigned char packetType = 0;
94 unsigned char packetSubtype = 0;
99 unsigned char packetSubtype = 0;
95 unsigned char * CCSDSContent;
100 unsigned char * CCSDSContent;
96
101
97 // APID check *** APID on 2 bytes
102 // APID check *** APID on 2 bytes
98 pid = ((TMPacket->packetID[0] & 0x07)<<4) + ( (TMPacket->packetID[1]>>4) & 0x0f ); // PID = 11 *** 7 bits xxxxx210 7654xxxx
103 pid = ((TMPacket->packetID[0] & 0x07)<<4) + ( (TMPacket->packetID[1]>>4) & 0x0f ); // PID = 11 *** 7 bits xxxxx210 7654xxxx
99 category = (TMPacket->packetID[1] & 0x0f); // PACKET_CATEGORY = 12 *** 4 bits xxxxxxxx xxxx3210
104 category = (TMPacket->packetID[1] & 0x0f); // PACKET_CATEGORY = 12 *** 4 bits xxxxxxxx xxxx3210
100 if (pid!=CCSDS_PROCESS_ID) return ILLEGAL_APID;
105 if (pid!=CCSDS_PROCESS_ID) return ILLEGAL_APID;
101 if (category!=CCSDS_PACKET_CATEGORY) return ILLEGAL_APID;
106 if (category!=CCSDS_PACKET_CATEGORY) return ILLEGAL_APID;
102
107
103 // packet length check
108 // packet length check
104 length = TMPacket->packetLength[0] * 256 + TMPacket->packetLength[1];
109 length = TMPacket->packetLength[0] * 256 + TMPacket->packetLength[1];
105 if (length != TC_LEN_RCV ) return WRONG_LEN_PACKET; // LEN RCV != SIZE FIELD
110 if (length != TC_LEN_RCV ) return WRONG_LEN_PACKET; // LEN RCV != SIZE FIELD
106 if (length >= CCSDS_TC_PKT_MAX_SIZE) return WRONG_LEN_PACKET; // check that the packet does not exceed the MAX size
111 if (length >= CCSDS_TC_PKT_MAX_SIZE) return WRONG_LEN_PACKET; // check that the packet does not exceed the MAX size
107
112
108 packetType = TMPacket->dataFieldHeader[1];
113 packetType = TMPacket->dataFieldHeader[1];
109 packetSubtype = TMPacket->dataFieldHeader[2];
114 packetSubtype = TMPacket->dataFieldHeader[2];
110 // service type, subtype and packet length check
115 // service type, subtype and packet length check
111 if (packetType == 181){
116 if (packetType == 181){
112 switch(packetSubtype){ //subtype, autorized values are 3, 20, 21, 24, 27, 28, 30, 40, 50, 60, 61
117 switch(packetSubtype){ //subtype, autorized values are 3, 20, 21, 24, 27, 28, 30, 40, 50, 60, 61
113 case 3:
118 case 3:
114 if (length!=(12-CCSDS_TC_TM_PACKET_OFFSET)) return WRONG_LEN_PACKET;
119 if (length!=(12-CCSDS_TC_TM_PACKET_OFFSET)) return WRONG_LEN_PACKET;
115 break;
120 break;
116 case 20:
121 case 20:
117 if (length!=(14-CCSDS_TC_TM_PACKET_OFFSET)) return WRONG_LEN_PACKET;
122 if (length!=(14-CCSDS_TC_TM_PACKET_OFFSET)) return WRONG_LEN_PACKET;
118 break;
123 break;
119 case 21:
124 case 21:
120 if (length!=(20-CCSDS_TC_TM_PACKET_OFFSET)) return WRONG_LEN_PACKET;
125 if (length!=(20-CCSDS_TC_TM_PACKET_OFFSET)) return WRONG_LEN_PACKET;
121 break;
126 break;
122 case 24:
127 case 24:
123 if (length!=(14-CCSDS_TC_TM_PACKET_OFFSET)) return WRONG_LEN_PACKET;
128 if (length!=(14-CCSDS_TC_TM_PACKET_OFFSET)) return WRONG_LEN_PACKET;
124 break;
129 break;
125 case 27:
130 case 27:
126 if (length!=(14-CCSDS_TC_TM_PACKET_OFFSET)) return WRONG_LEN_PACKET;
131 if (length!=(14-CCSDS_TC_TM_PACKET_OFFSET)) return WRONG_LEN_PACKET;
127 break;
132 break;
128 case 28:
133 case 28:
129 if (length!=(14-CCSDS_TC_TM_PACKET_OFFSET)) return WRONG_LEN_PACKET;
134 if (length!=(14-CCSDS_TC_TM_PACKET_OFFSET)) return WRONG_LEN_PACKET;
130 break;
135 break;
131 case 30:
136 case 30:
132 if (length!=(12-CCSDS_TC_TM_PACKET_OFFSET)) return WRONG_LEN_PACKET;
137 if (length!=(12-CCSDS_TC_TM_PACKET_OFFSET)) return WRONG_LEN_PACKET;
133 break;
138 break;
134 case 40:
139 case 40:
135 if (length!=(20-CCSDS_TC_TM_PACKET_OFFSET)) return WRONG_LEN_PACKET;
140 if (length!=(20-CCSDS_TC_TM_PACKET_OFFSET)) return WRONG_LEN_PACKET;
136 break;
141 break;
137 case 50:
142 case 50:
138 if (length!=(50-CCSDS_TC_TM_PACKET_OFFSET)) return WRONG_LEN_PACKET;
143 if (length!=(50-CCSDS_TC_TM_PACKET_OFFSET)) return WRONG_LEN_PACKET;
139 break;
144 break;
140 case 60:
145 case 60:
141 if (length!=(12-CCSDS_TC_TM_PACKET_OFFSET)) return WRONG_LEN_PACKET;
146 if (length!=(12-CCSDS_TC_TM_PACKET_OFFSET)) return WRONG_LEN_PACKET;
142 break;
147 break;
143 case 61:
148 case 61:
144 if (length!=(12-CCSDS_TC_TM_PACKET_OFFSET)) return WRONG_LEN_PACKET;
149 if (length!=(12-CCSDS_TC_TM_PACKET_OFFSET)) return WRONG_LEN_PACKET;
145 break;
150 break;
146 default:
151 default:
147 return ILL_SUBTYPE;
152 return ILL_SUBTYPE;
148 break;
153 break;
149 }
154 }
150 }
155 }
151 else if (packetType == 9){
156 else if (packetType == 9){
152 if (packetSubtype!=129) return ILL_SUBTYPE;
157 if (packetSubtype!=129) return ILL_SUBTYPE;
153 if (length!=(18-CCSDS_TC_TM_PACKET_OFFSET)) return WRONG_LEN_PACKET;
158 if (length!=(18-CCSDS_TC_TM_PACKET_OFFSET)) return WRONG_LEN_PACKET;
154 }
159 }
155 else return ILL_TYPE;
160 else return ILL_TYPE;
156
161
157 // source ID check // Source ID not documented in the ICD
162 // source ID check // Source ID not documented in the ICD
158
163
159 // packet error control, CRC check
164 // packet error control, CRC check
160 CCSDSContent = (unsigned char*) TMPacket->packetID;
165 CCSDSContent = (unsigned char*) TMPacket->packetID;
161 GetCRCAsTwoBytes(CCSDSContent, currentTC_COMPUTED_CRC, length + CCSDS_TC_TM_PACKET_OFFSET - 2); // 2 CRC bytes removed from the calculation of the CRC
166 GetCRCAsTwoBytes(CCSDSContent, currentTC_COMPUTED_CRC, length + CCSDS_TC_TM_PACKET_OFFSET - 2); // 2 CRC bytes removed from the calculation of the CRC
162 if (currentTC_COMPUTED_CRC[0] != CCSDSContent[length + CCSDS_TC_TM_PACKET_OFFSET -2]) return INCOR_CHECKSUM;
167 if (currentTC_COMPUTED_CRC[0] != CCSDSContent[length + CCSDS_TC_TM_PACKET_OFFSET -2]) return INCOR_CHECKSUM;
163 if (currentTC_COMPUTED_CRC[1] != CCSDSContent[length + CCSDS_TC_TM_PACKET_OFFSET -1]) return INCOR_CHECKSUM;
168 if (currentTC_COMPUTED_CRC[1] != CCSDSContent[length + CCSDS_TC_TM_PACKET_OFFSET -1]) return INCOR_CHECKSUM;
164
169
165 return CCSDS_TM_VALID;
170 return CCSDS_TM_VALID;
166 }
171 }
167
172
168 unsigned char TM_build_header( enum TM_TYPE tm_type, unsigned int SID, unsigned int packetLength,
173 unsigned char TM_build_header( enum TM_TYPE tm_type, unsigned int SID, unsigned int packetLength,
169 unsigned int coarseTime, unsigned int fineTime, TMHeader_t *TMHeader)
174 unsigned int coarseTime, unsigned int fineTime, TMHeader_t *TMHeader)
170 {
175 {
171 TMHeader->targetLogicalAddress = CCSDS_DESTINATION_ID;
176 TMHeader->targetLogicalAddress = CCSDS_DESTINATION_ID;
172 TMHeader->protocolIdentifier = 0x02;
177 TMHeader->protocolIdentifier = 0x02;
173 TMHeader->reserved = 0x00;
178 TMHeader->reserved = 0x00;
174 TMHeader->userApplication = 0x00;
179 TMHeader->userApplication = 0x00;
175 TMHeader->packetID[0] = 0x0c;
180 TMHeader->packetID[0] = 0x0c;
176 TMHeader->packetSequenceControl[0] = 0xc0;
181 TMHeader->packetSequenceControl[0] = 0xc0;
177 TMHeader->packetSequenceControl[1] = 0x00;
182 TMHeader->packetSequenceControl[1] = 0x00;
178 TMHeader->packetLength[0] = (unsigned char) (packetLength>>8);
183 TMHeader->packetLength[0] = (unsigned char) (packetLength>>8);
179 TMHeader->packetLength[1] = (unsigned char) packetLength;
184 TMHeader->packetLength[1] = (unsigned char) packetLength;
180 TMHeader->dataFieldHeader[0] = 0x10;
185 TMHeader->dataFieldHeader[0] = 0x10;
181 TMHeader->dataFieldHeader[3] = CCSDS_DESTINATION_ID;
186 TMHeader->dataFieldHeader[3] = CCSDS_DESTINATION_ID;
182 switch (tm_type){
187 switch (tm_type){
183 case(TM_LFR_TC_EXE_OK):
188 case(TM_LFR_TC_EXE_OK):
184 TMHeader->packetID[1] = 0xc1;
189 TMHeader->packetID[1] = 0xc1;
185 TMHeader->dataFieldHeader[1] = 1; // type
190 TMHeader->dataFieldHeader[1] = 1; // type
186 TMHeader->dataFieldHeader[2] = 7; // subtype
191 TMHeader->dataFieldHeader[2] = 7; // subtype
187 break;
192 break;
188 case(TM_LFR_TC_EXE_ERR):
193 case(TM_LFR_TC_EXE_ERR):
189 TMHeader->packetID[1] = 0xc1;
194 TMHeader->packetID[1] = 0xc1;
190 TMHeader->dataFieldHeader[1] = 1; // type
195 TMHeader->dataFieldHeader[1] = 1; // type
191 TMHeader->dataFieldHeader[2] = 8; // subtype
196 TMHeader->dataFieldHeader[2] = 8; // subtype
192 break;
197 break;
193 case(TM_LFR_HK):
198 case(TM_LFR_HK):
194 TMHeader->packetID[1] = 0xc4;
199 TMHeader->packetID[1] = 0xc4;
195 TMHeader->dataFieldHeader[1] = 3; // type
200 TMHeader->dataFieldHeader[1] = 3; // type
196 TMHeader->dataFieldHeader[2] = 25; // subtype
201 TMHeader->dataFieldHeader[2] = 25; // subtype
197 break;
202 break;
198 case(TM_LFR_SCI):
203 case(TM_LFR_SCI):
199 TMHeader->packetID[1] = 0xcc;
204 TMHeader->packetID[1] = 0xcc;
200 TMHeader->dataFieldHeader[1] = 21; // type
205 TMHeader->dataFieldHeader[1] = 21; // type
201 TMHeader->dataFieldHeader[2] = 3; // subtype
206 TMHeader->dataFieldHeader[2] = 3; // subtype
202 break;
207 break;
203 case(TM_LFR_SCI_SBM):
208 case(TM_LFR_SCI_SBM):
204 TMHeader->packetID[1] = 0xfc;
209 TMHeader->packetID[1] = 0xfc;
205 TMHeader->dataFieldHeader[1] = 21; // type
210 TMHeader->dataFieldHeader[1] = 21; // type
206 TMHeader->dataFieldHeader[2] = 3; // subtype
211 TMHeader->dataFieldHeader[2] = 3; // subtype
207 break;
212 break;
208 case(TM_LFR_PAR_DUMP):
213 case(TM_LFR_PAR_DUMP):
209 TMHeader->packetID[1] = 0xc9;
214 TMHeader->packetID[1] = 0xc9;
210 TMHeader->dataFieldHeader[1] = 181; // type
215 TMHeader->dataFieldHeader[1] = 181; // type
211 TMHeader->dataFieldHeader[2] = 31; // subtype
216 TMHeader->dataFieldHeader[2] = 31; // subtype
212 break;
217 break;
213 default:
218 default:
214 return 0;
219 return 0;
215 }
220 }
216 /*TMHeader->dataFieldHeader[4] = (unsigned char) (coarseTime>>24);
221 /*TMHeader->dataFieldHeader[4] = (unsigned char) (coarseTime>>24);
217 TMHeader->dataFieldHeader[5] = (unsigned char) (coarseTime>>16);
222 TMHeader->dataFieldHeader[5] = (unsigned char) (coarseTime>>16);
218 TMHeader->dataFieldHeader[6] = (unsigned char) (coarseTime>>8);
223 TMHeader->dataFieldHeader[6] = (unsigned char) (coarseTime>>8);
219 TMHeader->dataFieldHeader[7] = (unsigned char) (coarseTime);
224 TMHeader->dataFieldHeader[7] = (unsigned char) (coarseTime);
220 TMHeader->dataFieldHeader[8] = (unsigned char) (fineTime>>8);
225 TMHeader->dataFieldHeader[8] = (unsigned char) (fineTime>>8);
221 TMHeader->dataFieldHeader[9] = (unsigned char) (fineTime);*/
226 TMHeader->dataFieldHeader[9] = (unsigned char) (fineTime);*/
222 TMHeader->dataFieldHeader[4] = 0xaa;
227 TMHeader->dataFieldHeader[4] = 0xaa;
223 TMHeader->dataFieldHeader[5] = 0xbb;
228 TMHeader->dataFieldHeader[5] = 0xbb;
224 TMHeader->dataFieldHeader[6] = 0xcc;
229 TMHeader->dataFieldHeader[6] = 0xcc;
225 TMHeader->dataFieldHeader[7] = 0xdd;
230 TMHeader->dataFieldHeader[7] = 0xdd;
226 TMHeader->dataFieldHeader[8] = 0xee;
231 TMHeader->dataFieldHeader[8] = 0xee;
227 TMHeader->dataFieldHeader[9] = 0xff;
232 TMHeader->dataFieldHeader[9] = 0xff;
228 return 1;
233 return 1;
229 }
234 }
230
235
231 unsigned char TM_build_data(ccsdsTelecommandPacket_t *TC, char* data, unsigned int SID, unsigned char *computed_CRC)
236 unsigned char TM_build_data(ccsdsTelecommandPacket_t *TC, char* data, unsigned int SID, unsigned char *computed_CRC)
232 {
237 {
233 unsigned int packetLength;
238 unsigned int packetLength;
234 packetLength = TC->packetLength[0] * 256 + TC->packetLength[1];
239 packetLength = TC->packetLength[0] * 256 + TC->packetLength[1];
235 switch (SID){
240 switch (SID){
236 case (SID_NOT_EXE):
241 case (SID_NOT_EXE):
237 break;
242 break;
238 case (SID_NOT_IMP):
243 case (SID_NOT_IMP):
239 data[0] = 0x9c;
244 data[0] = 0x9c;
240 data[1] = 0x42;
245 data[1] = 0x42;
241 data[2] = TC->packetID[0];
246 data[2] = TC->packetID[0];
242 data[3] = TC->packetID[1];
247 data[3] = TC->packetID[1];
243 data[4] = TC->packetSequenceControl[0];
248 data[4] = TC->packetSequenceControl[0];
244 data[5] = TC->packetSequenceControl[1];
249 data[5] = TC->packetSequenceControl[1];
245 data[6] = TC->dataFieldHeader[1]; // type
250 data[6] = TC->dataFieldHeader[1]; // type
246 data[7] = TC->dataFieldHeader[2]; // subtype
251 data[7] = TC->dataFieldHeader[2]; // subtype
247 break;
252 break;
248 case (SID_EXE_ERR):
253 case (SID_EXE_ERR):
249 break;
254 break;
250 case (SID_EXE_CORR):
255 case (SID_EXE_CORR):
251 data[0] = 0x9c;
256 data[0] = 0x9c;
252 data[1] = 0x45;
257 data[1] = 0x45;
253 data[2] = TC->packetID[0];
258 data[2] = TC->packetID[0];
254 data[3] = TC->packetID[1];
259 data[3] = TC->packetID[1];
255 data[4] = TC->packetSequenceControl[0];
260 data[4] = TC->packetSequenceControl[0];
256 data[5] = TC->packetSequenceControl[1];
261 data[5] = TC->packetSequenceControl[1];
257 data[6] = TC->dataFieldHeader[1]; // type
262 data[6] = TC->dataFieldHeader[1]; // type
258 data[7] = TC->dataFieldHeader[2]; // subtype
263 data[7] = TC->dataFieldHeader[2]; // subtype
259 data[8] = currentTC_LEN_RCV[0];
264 data[8] = currentTC_LEN_RCV[0];
260 data[9] = currentTC_LEN_RCV[1];
265 data[9] = currentTC_LEN_RCV[1];
261 data[10] = TC->packetLength[0];
266 data[10] = TC->packetLength[0];
262 data[11] = TC->packetLength[1];
267 data[11] = TC->packetLength[1];
263 data[12] = TC->dataAndCRC[packetLength];
268 data[12] = TC->dataAndCRC[packetLength];
264 data[13] = TC->dataAndCRC[packetLength+1];
269 data[13] = TC->dataAndCRC[packetLength+1];
265 data[14] = computed_CRC[0];
270 data[14] = computed_CRC[0];
266 data[15] = computed_CRC[1];
271 data[15] = computed_CRC[1];
267 break;
272 break;
268 default:
273 default:
269 return 0;
274 return 0;
270 }
275 }
271 return 1;
276 return 1;
272 }
277 }
273
278
279 unsigned char actionLauncher(unsigned int sid)
280 {
281
282 }
283
284 //***********
285 // RTEMS TASK
274 rtems_task spw_recv_task( rtems_task_argument unused )
286 rtems_task spw_recv_task( rtems_task_argument unused )
275 {
287 {
276 rtems_status_code status;
288 rtems_status_code status;
277 int len = 0;
289 int len = 0;
278 unsigned int i = 0;
290 unsigned int i = 0;
279 unsigned int data_length = 0;
291 unsigned int data_length = 0;
280 ccsdsTelecommandPacket_t currentTC;
292 ccsdsTelecommandPacket_t currentTC;
281 spw_ioctl_pkt_send spw_ioctl_send;
293 spw_ioctl_pkt_send spw_ioctl_send;
282 TMHeader_t TM_header;
294 TMHeader_t TM_header;
283 char data[100];
295 char data[100];
284
296
285 for(i=0; i<100; i++) data[i] = 0;
297 for(i=0; i<100; i++) data[i] = 0;
286
298
287 PRINTF("In RECV *** \n")
299 PRINTF("In RECV *** \n")
288
300
289 while(1){
301 while(1){
290 len = read(fdSPW, (char*) &currentTC, CCSDS_TC_PKT_MAX_SIZE); // the call to read is blocking
302 len = read(fdSPW, (char*) &currentTC, CCSDS_TC_PKT_MAX_SIZE); // the call to read is blocking
291 if (len == -1){ // error during the read call
303 if (len == -1){ // error during the read call
292 PRINTF("In RECV *** last read call returned -1\n")
304 PRINTF("In RECV *** last read call returned -1\n")
293 if (rtems_event_send( Task_id[3], SPW_LINKERR_EVENT ) != RTEMS_SUCCESSFUL)
305 if (rtems_event_send( Task_id[3], SPW_LINKERR_EVENT ) != RTEMS_SUCCESSFUL)
294 PRINTF("IN RECV *** Error: rtems_event_send SPW_LINKERR_EVENT\n")
306 PRINTF("IN RECV *** Error: rtems_event_send SPW_LINKERR_EVENT\n")
295 if (rtems_task_suspend(RTEMS_SELF) != RTEMS_SUCCESSFUL)
307 if (rtems_task_suspend(RTEMS_SELF) != RTEMS_SUCCESSFUL)
296 PRINTF("In RECV *** Error: rtems_task_suspend(RTEMS_SELF)\n")
308 PRINTF("In RECV *** Error: rtems_task_suspend(RTEMS_SELF)\n")
297 }
309 }
298 else {
310 else {
299 //PRINTF1("In RECV *** Got Message of length %d\n", len)
311 //PRINTF1("In RECV *** Got Message of length %d\n", len)
300 currentTC_LEN_RCV[0] = 0x00;
312 currentTC_LEN_RCV[0] = 0x00;
301 currentTC_LEN_RCV[1] = (unsigned char) len - CCSDS_TC_TM_PACKET_OFFSET - 3; // build the corresponding packet size field
313 currentTC_LEN_RCV[1] = (unsigned char) len - CCSDS_TC_TM_PACKET_OFFSET - 3; // build the corresponding packet size field
302 currentTC_LEN_RCV_AsUnsignedInt = (unsigned int) len - CCSDS_TC_TM_PACKET_OFFSET - 3; // => -3 is for Prot ID, Reserved and User App bytes
314 currentTC_LEN_RCV_AsUnsignedInt = (unsigned int) len - CCSDS_TC_TM_PACKET_OFFSET - 3; // => -3 is for Prot ID, Reserved and User App bytes
303 // CHECK THE TC AND BUILD THE APPROPRIATE TM
315 // CHECK THE TC AND BUILD THE APPROPRIATE TM
304 data_length = TC_checker(&currentTC, currentTC_LEN_RCV_AsUnsignedInt,
316 data_length = TC_checker(&currentTC, currentTC_LEN_RCV_AsUnsignedInt,
305 &TM_header, &spw_ioctl_send.hlen, data);
317 &TM_header, &spw_ioctl_send.hlen, data);
306 spw_ioctl_send.hlen = TM_HEADER_LEN + 4; // + 4 is for the protocole extra header
318 spw_ioctl_send.hlen = TM_HEADER_LEN + 4; // + 4 is for the protocole extra header
307 spw_ioctl_send.hdr = (char*) &TM_header;
319 spw_ioctl_send.hdr = (char*) &TM_header;
308 spw_ioctl_send.dlen = data_length;
320 spw_ioctl_send.dlen = data_length;
309 spw_ioctl_send.data = data;
321 spw_ioctl_send.data = data;
310 //printf("hlen %d, dlen %d\n", spw_ioctl_send.hlen, spw_ioctl_send.dlen);
322 //printf("hlen %d, dlen %d\n", spw_ioctl_send.hlen, spw_ioctl_send.dlen);
311 // SEND PACKET
323 // SEND PACKET
312 status = ioctl( fdSPW, SPACEWIRE_IOCTRL_SEND, &spw_ioctl_send );
324 status = ioctl( fdSPW, SPACEWIRE_IOCTRL_SEND, &spw_ioctl_send );
313 if (status!=RTEMS_SUCCESSFUL) printf("In TC_checker *** Error SPACEWIRE_IOCTRL_SEND\n");
325 if (status!=RTEMS_SUCCESSFUL) printf("In TC_checker *** Error SPACEWIRE_IOCTRL_SEND\n");
314 //PRINTF1("In TC_checker *** packet of size %d sent\n", spw_ioctl_send.sent)
326 //PRINTF1("In TC_checker *** packet of size %d sent\n", spw_ioctl_send.sent)
315 }
327 }
316 }
328 }
317 }
329 }
318
330
319
331
General Comments 0
You need to be logged in to leave comments. Login now