##// END OF EJS Templates
Version 0-1
paul@pc-solar1.lab-lpp.local -
r13:662dfd68ecbc default
parent child
Show More
@@ -1,46 +1,46
1 1 <?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
2 2 <CodeBlocks_layout_file>
3 3 <ActiveTarget name="Debug" />
4 <File name="../header/ccsds_types.h" open="0" top="0" tabpos="3">
5 <Cursor position="3403" topLine="101" />
4 <File name="../header/ccsds_types.h" open="1" top="0" tabpos="2">
5 <Cursor position="553" topLine="24" />
6 6 </File>
7 7 <File name="../header/fsw_init.h" open="0" top="0" tabpos="3">
8 <Cursor position="378" topLine="0" />
8 <Cursor position="1521" topLine="15" />
9 9 </File>
10 10 <File name="../header/fsw_misc.h" open="0" top="0" tabpos="0">
11 11 <Cursor position="114" topLine="0" />
12 12 </File>
13 13 <File name="../header/fsw_params.h" open="0" top="0" tabpos="2">
14 14 <Cursor position="1358" topLine="31" />
15 15 </File>
16 16 <File name="../header/fsw_processing.h" open="0" top="0" tabpos="0">
17 17 <Cursor position="628" topLine="7" />
18 18 </File>
19 19 <File name="../header/grlib_regs.h" open="0" top="0" tabpos="4">
20 20 <Cursor position="1153" topLine="11" />
21 21 </File>
22 22 <File name="../header/tc_handler.h" open="0" top="0" tabpos="4">
23 23 <Cursor position="624" topLine="2" />
24 24 </File>
25 25 <File name="../header/wf_handler.h" open="0" top="0" tabpos="0">
26 26 <Cursor position="318" topLine="0" />
27 27 </File>
28 28 <File name="../src/fsw_globals.c" open="0" top="0" tabpos="3">
29 29 <Cursor position="378" topLine="1" />
30 30 </File>
31 31 <File name="../src/fsw_init.c" open="1" top="0" tabpos="1">
32 <Cursor position="2303" topLine="54" />
32 <Cursor position="10747" topLine="81" />
33 33 </File>
34 34 <File name="../src/fsw_misc.c" open="0" top="0" tabpos="2">
35 35 <Cursor position="475" topLine="0" />
36 36 </File>
37 37 <File name="../src/fsw_processing.c" open="0" top="0" tabpos="0">
38 38 <Cursor position="1696" topLine="59" />
39 39 </File>
40 <File name="../src/tc_handler.c" open="1" top="1" tabpos="2">
41 <Cursor position="17607" topLine="36" />
40 <File name="../src/tc_handler.c" open="1" top="1" tabpos="3">
41 <Cursor position="11453" topLine="39" />
42 42 </File>
43 43 <File name="../src/wf_handler.c" open="0" top="0" tabpos="4">
44 44 <Cursor position="1660" topLine="24" />
45 45 </File>
46 46 </CodeBlocks_layout_file>
1 NO CONTENT: modified file, binary diff hidden
@@ -1,141 +1,142
1 1 #ifndef CCSDS_H_INCLUDED
2 2 #define CCSDS_H_INCLUDED
3 3
4 4 #define CCSDS_TELEMETRY_HEADER_LENGTH 16+4
5 5 #define CCSDS_TM_PKT_MAX_SIZE 4412
6 6 #define CCSDS_TELECOMMAND_HEADER_LENGTH 10+4
7 7 #define CCSDS_TC_PKT_MAX_SIZE 50 // size of the TC_LFR_UPDATE_INFO packet
8 8 #define CCSDS_TC_TM_PACKET_OFFSET 7
9 9 #define CCSDS_PROCESS_ID 76
10 10 #define CCSDS_PACKET_CATEGORY 12
11 #define CCSDS_DESTINATION_ID 0x21
11 #define CCSDS_NODE_ADDRESS 0x01 // SY_DPU_LFR_LA 1 is not allowed by the StarDundee brick, use 101 instead 0x65
12 #define CCSDS_DESTINATION_ID 0x02 // SY_LFR_DPU_LA 2 is not allowed by the StarDundee brick, use 102 instead 0x66
12 13 #define CCSDS_PROTOCOLE_ID 0x02
13 14 #define CCSDS_USER_APP 0x00
14 15
15 16 #define SIZE_TM_LFR_TC_EXE_NOT_IMPLEMENTED 24
16 17 #define SIZE_TM_LFR_TC_EXE_CORRUPTED 32
17 18
18 19 #define ILLEGAL_APID 0
19 20 #define WRONG_LEN_PACKET 1
20 21 #define INCOR_CHECKSUM 2
21 22 #define ILL_TYPE 3
22 23 #define ILL_SUBTYPE 4
23 24 #define WRONG_APP_DATA 5
24 25 #define WRONG_CMD_CODE 6
25 26 #define CCSDS_TM_VALID 7
26 27 //
27 28 #define TC_NOT_EXE 40000
28 29 #define WRONG_SRC_ID 40001
29 30 #define FUNCT_NOT_IMPL 40002
30 31 #define FAIL_DETECTED 40003
31 32 #define NOT_ALLOWED 40004
32 33 #define CORRUPTED 40005
33 34
34 35 // // TC SUBTYPES
35 36 #define TC_SUBTYPE_RESET 3
36 37 #define TC_SUBTYPE_LOAD_COMM 20
37 38 #define TC_SUBTYPE_LOAD_NORM 21
38 39 #define TC_SUBTYPE_LOAD_BURST 24
39 40 #define TC_SUBTYPE_LOAD_SBM1 27
40 41 #define TC_SUBTYPE_LOAD_SBM2 28
41 42 #define TC_SUBTYPE_DUMP 30
42 43 #define TC_SUBTYPE_ENTER 40
43 44 #define TC_SUBTYPE_UPDT_INFO 50
44 45 #define TC_SUBTYPE_EN_CAL 60
45 46 #define TC_SUBTYPE_DIS_CAL 61
46 47 #define TC_SUBTYPE_UPDT_TIME 129
47 48
48 49 #define SID_DEFAULT 0
49 50 #define SID_EXE_INC 5
50 51 #define SID_NOT_EXE 40000
51 52 #define SID_NOT_IMP 40002
52 53 #define SID_EXE_ERR 40003
53 54 #define SID_EXE_CORR 40005
54 55
55 56 #define SID_NORM_SWF_F0 3
56 57 #define SID_NORM_SWF_F1 4
57 58 #define SID_NORM_SWF_F2 5
58 59 #define SID_NORM_CWF_F3 1
59 60 #define SID_BURST_CWF_F2 2
60 61 #define SID_SBM1_CWF_F1 24
61 62 #define SID_SBM2_CWF_F2 25
62 63 #define SID_NORM_ASM_F0 11
63 64 #define SID_NORM_ASM_F1 12
64 65 #define SID_NORM_ASM_F2 13
65 66 #define SID_NORM_BP1_F0 14
66 67 #define SID_NORM_BP1_F1 15
67 68 #define SID_NORM_BP1_F2 16
68 69 #define SID_NORM_BP2_F0 19
69 70 #define SID_NORM_BP2_F1 20
70 71 #define SID_NORM_BP2_F2 21
71 72 #define SID_BURST_BP1_F0 17
72 73 #define SID_BURST_BP2_F0 22
73 74 #define SID_BURST_BP1_F1 18
74 75 #define SID_BURST_BP2_F1 23
75 76 #define SID_SBM1_BP1_F0 28
76 77 #define SID_SBM1_BP2_F0 31
77 78 #define SID_SBM2_BP1_F0 29
78 79 #define SID_SBM2_BP2_F0 32
79 80 #define SID_SBM1_BP1_F1 30
80 81 #define SID_SBM1_BP2_F1 33
81 82
82 83 #define TM_LEN_EXE 20 - CCSDS_TC_TM_PACKET_OFFSET
83 84 #define TM_LEN_NOT_EXE 26 - CCSDS_TC_TM_PACKET_OFFSET
84 85 #define TM_LEN_NOT_IMP 24 - CCSDS_TC_TM_PACKET_OFFSET
85 86 #define TM_LEN_EXE_ERR 24 - CCSDS_TC_TM_PACKET_OFFSET
86 87 #define TM_LEN_EXE_CORR 32 - CCSDS_TC_TM_PACKET_OFFSET
87 88 #define TM_HEADER_LEN 16
88 89 #define TM_LEN_SCI_NORM_SWF_340 340 * 12 + 6 + 10 - 1
89 90 #define TM_LEN_SCI_NORM_SWF_8 8 * 12 + 6 + 10 - 1
90 91
91 92 enum TM_TYPE{
92 93 TM_LFR_TC_EXE_OK,
93 94 TM_LFR_TC_EXE_ERR,
94 95 TM_LFR_HK,
95 96 TM_LFR_SCI,
96 97 TM_LFR_SCI_SBM,
97 98 TM_LFR_PAR_DUMP
98 99 };
99 100
100 101 struct TMHeader_str
101 102 {
102 103 volatile unsigned char targetLogicalAddress;
103 104 volatile unsigned char protocolIdentifier;
104 105 volatile unsigned char reserved;
105 106 volatile unsigned char userApplication;
106 107 volatile unsigned char packetID[2];
107 108 volatile unsigned char packetSequenceControl[2];
108 109 volatile unsigned char packetLength[2];
109 110 volatile unsigned char dataFieldHeader[10];
110 111 };
111 112 typedef struct TMHeader_str TMHeader_t;
112 113
113 114 struct ExtendedTMHeader_str
114 115 {
115 116 volatile unsigned char targetLogicalAddress;
116 117 volatile unsigned char protocolIdentifier;
117 118 volatile unsigned char reserved;
118 119 volatile unsigned char userApplication;
119 120 volatile unsigned char packetID[2];
120 121 volatile unsigned char packetSequenceControl[2];
121 122 volatile unsigned char packetLength[2];
122 123 volatile unsigned char dataFieldHeader[10];
123 124 volatile unsigned char auxiliaryHeader[6];
124 125 };
125 126 typedef struct ExtendedTMHeader_str ExtendedTMHeader_t;
126 127
127 128 struct ccsdsTelecommandPacket_str
128 129 {
129 130 //unsigned char targetLogicalAddress; // removed by the grspw module
130 131 volatile unsigned char protocolIdentifier;
131 132 volatile unsigned char reserved;
132 133 volatile unsigned char userApplication;
133 134 volatile unsigned char packetID[2];
134 135 volatile unsigned char packetSequenceControl[2];
135 136 volatile unsigned char packetLength[2];
136 137 volatile unsigned char dataFieldHeader[4];
137 138 volatile unsigned char dataAndCRC[CCSDS_TC_PKT_MAX_SIZE-10];
138 139 };
139 140 typedef struct ccsdsTelecommandPacket_str ccsdsTelecommandPacket_t;
140 141
141 142 #endif // CCSDS_H_INCLUDED
@@ -1,299 +1,304
1 1 //*************************
2 2 // GPL reminder to be added
3 3 //*************************
4 4
5 5 #include <rtems.h>
6 6
7 7 /* configuration information */
8 8
9 9 #define CONFIGURE_INIT
10 10
11 11 #include <bsp.h> /* for device driver prototypes */
12 12
13 13 /* configuration information */
14 14
15 15 #define CONFIGURE_APPLICATION_NEEDS_CONSOLE_DRIVER
16 16 #define CONFIGURE_APPLICATION_NEEDS_CLOCK_DRIVER
17 17
18 18 #define CONFIGURE_MAXIMUM_TASKS 10
19 19 #define CONFIGURE_RTEMS_INIT_TASKS_TABLE
20 20 #define CONFIGURE_EXTRA_TASK_STACKS (3 * RTEMS_MINIMUM_STACK_SIZE)
21 21 #define CONFIGURE_LIBIO_MAXIMUM_FILE_DESCRIPTORS 32
22 22 #define CONFIGURE_INIT_TASK_PRIORITY 100
23 23 #define CONFIGURE_MAXIMUM_DRIVERS 16
24 24 #define CONFIGURE_MAXIMUM_PERIODS 1
25 25 #define CONFIGURE_MAXIMUM_MESSAGE_QUEUES 1
26 26
27 27 #include <rtems/confdefs.h>
28 28
29 29 /* If --drvmgr was enabled during the configuration of the RTEMS kernel */
30 30 #ifdef RTEMS_DRVMGR_STARTUP
31 31 #ifdef LEON3
32 32 /* Add Timer and UART Driver */
33 33 #ifdef CONFIGURE_APPLICATION_NEEDS_CLOCK_DRIVER
34 34 #define CONFIGURE_DRIVER_AMBAPP_GAISLER_GPTIMER
35 35 #endif
36 36 #ifdef CONFIGURE_APPLICATION_NEEDS_CONSOLE_DRIVER
37 37 #define CONFIGURE_DRIVER_AMBAPP_GAISLER_APBUART
38 38 #endif
39 39 #endif
40 40 #define CONFIGURE_DRIVER_AMBAPP_GAISLER_GRSPW /* GRSPW Driver */
41 41 #include <drvmgr/drvmgr_confdefs.h>
42 42 #endif
43 43
44 44 #include <fsw_init.h>
45 45 #include <fsw_config.c>
46 46
47 47 char *link_status(int status);
48 48
49 49 char *lstates[6] = {"Error-reset",
50 50 "Error-wait",
51 51 "Ready",
52 52 "Started",
53 53 "Connecting",
54 54 "Run"
55 55 };
56 56
57 57 rtems_task Init( rtems_task_argument ignored )
58 58 {
59 59 rtems_status_code status;
60 60 rtems_isr_entry old_isr_handler;
61 61
62 62 //send_console_outputs_on_serial_port();
63 63
64 64 initLookUpTableForCRC(); // in tc_handler.h
65 65 init_default_mode_parameters();
66 66 create_message_queue();
67 67 create_all_tasks();
68 68 start_all_tasks();
69 69
70 70 configure_spw_link();
71 71 configure_timer((gptimer_regs_t*) REGS_ADDR_GPTIMER, TIMER_SM_SIMULATOR, CLKDIV_SM_SIMULATOR,
72 72 IRQ_SPARC_SM, spectral_matrices_isr );
73 73 configure_timer((gptimer_regs_t*) REGS_ADDR_GPTIMER, TIMER_WF_SIMULATOR, CLKDIV_WF_SIMULATOR,
74 74 IRQ_SPARC_WF, waveforms_isr );
75 75
76 76 // irq handling of the time management unit
77 /*status = rtems_interrupt_catch( commutation_isr1,
77 status = rtems_interrupt_catch( commutation_isr1,
78 78 IRQ_SPARC_TIME1,
79 79 &old_isr_handler) ; // see sparcv8.pdf p.76 for interrupt levels
80 80 if (status==RTEMS_SUCCESSFUL)
81 81 PRINTF("commutation_isr1 *** rtems_interrupt_catch successfullly configured\n")
82 82
83 83 status = rtems_interrupt_catch( commutation_isr2,
84 84 IRQ_SPARC_TIME2,
85 85 &old_isr_handler) ; // see sparcv8.pdf p.76 for interrupt levels
86 86 if (status==RTEMS_SUCCESSFUL)
87 87 PRINTF("commutation_isr2 *** rtems_interrupt_catch successfullly configured\n")
88 88
89 89 LEON_Unmask_interrupt( IRQ_TIME1 );
90 LEON_Unmask_interrupt( IRQ_TIME2 );*/
90 LEON_Unmask_interrupt( IRQ_TIME2 );
91 91
92 92 status = rtems_task_delete(RTEMS_SELF);
93 93 }
94 94
95 95 rtems_task spiq_task(rtems_task_argument unused)
96 96 {
97 97 rtems_event_set event_out;
98 98 struct grspw_regs_str *grspw_regs;
99 99 grspw_regs = (struct grspw_regs_str *) REGS_ADDR_GRSPW;
100 100
101 101 while(1){
102 102 PRINTF("In SPIQ *** Waiting for SPW_LINKERR_EVENT\n")
103 103 rtems_event_receive(SPW_LINKERR_EVENT, RTEMS_WAIT, RTEMS_NO_TIMEOUT, &event_out); // wait for an SPW_LINKERR_EVENT
104 104
105 105 if (rtems_task_suspend(Task_id[1])!=RTEMS_SUCCESSFUL) // suspend RECV task
106 106 PRINTF("In SPIQ *** Error suspending RECV Task\n")
107 107
108 108 configure_spw_link();
109 109
110 110 if (rtems_task_restart(Task_id[1], 1)!=RTEMS_SUCCESSFUL) // restart RECV task
111 111 PRINTF("In SPIQ *** Error resume RECV Task\n")
112 112 }
113 113 }
114 114
115 115 void init_default_mode_parameters()
116 116 {
117 117 // COMMON PARAMETERS
118 118 param_common[0] = 0x00;
119 119 param_common[1] = 0x10; // default value 0 0 0 1 0 0 0 0
120 120 // NORMAL MODE
121 121 param_norm.sy_lfr_n_swf_l = 2048; // nb sample
122 122 param_norm.sy_lfr_n_swf_p = 300; // sec
123 123 param_norm.sy_lfr_n_asm_p = 3600; // sec
124 124 param_norm.sy_lfr_n_bp_p0 = 4; // sec
125 125 param_norm.sy_lfr_n_bp_p1 = 20; // sec
126 126 // BURST MODE
127 127 param_burst.sy_lfr_b_bp_p0 = 1; // sec
128 128 param_burst.sy_lfr_b_bp_p1 = 5; // sec
129 129 // SBM1 MODE
130 130 param_sbm1.sy_lfr_s1_bp_p0 = 1; // sec
131 131 param_sbm1.sy_lfr_s1_bp_p1 = 1; // sec
132 132 // SBM2 MODE
133 133 param_sbm2.sy_lfr_s2_bp_p0 = 1; // sec
134 134 param_sbm2.sy_lfr_s2_bp_p0 = 5; // sec
135 135 }
136 136
137 137 int create_all_tasks()
138 138 {
139 139 rtems_status_code status;
140 140
141 141 Task_name[1] = rtems_build_name( 'R', 'E', 'C', 'V' );
142 142 Task_name[2] = rtems_build_name( 'A', 'C', 'T', 'N' );
143 143 Task_name[3] = rtems_build_name( 'S', 'P', 'I', 'Q' );
144 144 Task_name[4] = rtems_build_name( 'S', 'M', 'I', 'Q' );
145 145 Task_name[5] = rtems_build_name( 'S', 'T', 'A', 'T' );
146 146 Task_name[6] = rtems_build_name( 'A', 'V', 'F', '0' );
147 147 Task_name[7] = rtems_build_name( 'B', 'P', 'F', '0' );
148 148 Task_name[8] = rtems_build_name( 'W', 'F', 'R', 'M' );
149 //Task_name[9] = rtems_build_name( 'D', 'U', 'M', 'B' );
149 Task_name[9] = rtems_build_name( 'D', 'U', 'M', 'B' );
150 150
151 151 // RECV
152 152 status = rtems_task_create(
153 153 Task_name[1], 200, RTEMS_MINIMUM_STACK_SIZE * 2,
154 154 RTEMS_DEFAULT_MODES,
155 155 RTEMS_DEFAULT_ATTRIBUTES, &Task_id[1]
156 156 );
157 157 // ACTN
158 158 status = rtems_task_create(
159 159 Task_name[2], 50, RTEMS_MINIMUM_STACK_SIZE * 2,
160 160 RTEMS_DEFAULT_MODES,
161 161 RTEMS_DEFAULT_ATTRIBUTES, &Task_id[2]
162 162 );
163 163 // SPIQ
164 164 status = rtems_task_create(
165 165 Task_name[3], 50, RTEMS_MINIMUM_STACK_SIZE * 2,
166 166 RTEMS_DEFAULT_MODES,
167 167 RTEMS_DEFAULT_ATTRIBUTES, &Task_id[3]
168 168 );
169 169 // SMIQ
170 170 status = rtems_task_create(
171 171 Task_name[4], 10, RTEMS_MINIMUM_STACK_SIZE * 2,
172 172 RTEMS_DEFAULT_MODES | RTEMS_NO_PREEMPT,
173 173 RTEMS_DEFAULT_ATTRIBUTES, &Task_id[4]
174 174 );
175 175 // STAT
176 176 status = rtems_task_create(
177 177 Task_name[5], 150, RTEMS_MINIMUM_STACK_SIZE * 2,
178 178 RTEMS_DEFAULT_MODES,
179 179 RTEMS_DEFAULT_ATTRIBUTES, &Task_id[5]
180 180 );
181 181 // AVF0
182 182 status = rtems_task_create(
183 183 Task_name[6], 50, RTEMS_MINIMUM_STACK_SIZE * 2,
184 184 RTEMS_DEFAULT_MODES | RTEMS_NO_PREEMPT,
185 185 RTEMS_DEFAULT_ATTRIBUTES | RTEMS_FLOATING_POINT, &Task_id[6]
186 186 );
187 187 // BPF0
188 188 status = rtems_task_create(
189 189 Task_name[7], 50, RTEMS_MINIMUM_STACK_SIZE * 2,
190 190 RTEMS_DEFAULT_MODES,
191 191 RTEMS_DEFAULT_ATTRIBUTES | RTEMS_FLOATING_POINT, &Task_id[7]
192 192 );
193 193 // WFRM
194 194 status = rtems_task_create(
195 195 Task_name[8], 100, RTEMS_MINIMUM_STACK_SIZE * 2,
196 196 RTEMS_DEFAULT_MODES,
197 197 RTEMS_DEFAULT_ATTRIBUTES | RTEMS_FLOATING_POINT, &Task_id[8]
198 198 );
199 199 // DUMB
200 /*status = rtems_task_create(
200 status = rtems_task_create(
201 201 Task_name[9], 200, RTEMS_MINIMUM_STACK_SIZE * 2,
202 202 RTEMS_DEFAULT_MODES,
203 203 RTEMS_DEFAULT_ATTRIBUTES, &Task_id[9]
204 );*/
204 );
205 205
206 206 return 0;
207 207 }
208 208
209 209 int start_all_tasks()
210 210 {
211 211 rtems_status_code status;
212 212
213 213 status = rtems_task_start( Task_id[3], spiq_task, 1 );
214 214 if (status!=RTEMS_SUCCESSFUL) PRINTF("In INIT *** Error starting TASK_SPIQ\n")
215 215
216 216 status = rtems_task_start( Task_id[1], recv_task, 1 );
217 217 if (status!=RTEMS_SUCCESSFUL) PRINTF("In INIT *** Error starting TASK_RECV\n")
218 218
219 219 status = rtems_task_start( Task_id[2], actn_task, 1 );
220 220 if (status!=RTEMS_SUCCESSFUL) PRINTF("In INIT *** Error starting TASK_ACTN\n")
221 221
222 222 status = rtems_task_start( Task_id[4], smiq_task, 1 );
223 223 if (status!=RTEMS_SUCCESSFUL) PRINTF("In INIT *** Error starting TASK_BPPR\n")
224 224
225 225 status = rtems_task_start( Task_id[5], stat_task, 1 );
226 226 if (status!=RTEMS_SUCCESSFUL) PRINTF("In INIT *** Error starting TASK_STAT\n")
227 227
228 228 status = rtems_task_start( Task_id[6], avf0_task, 1 );
229 229 if (status!=RTEMS_SUCCESSFUL) PRINTF("In INIT *** Error starting TASK_AVF0\n")
230 230
231 231 status = rtems_task_start( Task_id[7], bpf0_task, 1 );
232 232 if (status!=RTEMS_SUCCESSFUL) PRINTF("In INIT *** Error starting TASK_BPF0\n")
233 233
234 234 status = rtems_task_start( Task_id[8], wfrm_task, 1 );
235 235 if (status!=RTEMS_SUCCESSFUL) PRINTF("In INIT *** Error starting TASK_WFRM\n")
236 236
237 /*status = rtems_task_start( Task_id[9], dumb_task, 1 );
238 if (status!=RTEMS_SUCCESSFUL) PRINTF("In INIT *** Error starting TASK_DUMB\n")*/
237 status = rtems_task_start( Task_id[9], dumb_task, 1 );
238 if (status!=RTEMS_SUCCESSFUL) PRINTF("In INIT *** Error starting TASK_DUMB\n")
239 239
240 240 return 0;
241 241 }
242 242
243 243 int configure_spw_link()
244 244 {
245 245 rtems_status_code status;
246 246
247 247 close(fdSPW); // close the device if it is already open
248 248 fdSPW = open(GRSPW_DEVICE_NAME, O_RDWR); // open the device. the open call reset the hardware
249 249 if (fdSPW<0) PRINTF("In configure_spw_link *** Error opening"GRSPW_DEVICE_NAME"\n")
250 250 while(ioctl(fdSPW, SPACEWIRE_IOCTRL_START, 0) != RTEMS_SUCCESSFUL){
251 251 PRINTF("In configure_spw_link *** "GRSPW_DEVICE_NAME" not started, retry\n")
252 252 close(fdSPW); // close the device
253 253 fdSPW = open(GRSPW_DEVICE_NAME, O_RDWR); // open the device. the open call reset the hardware
254 254 if (fdSPW<0) PRINTF("In configure_spw_link *** Error opening"GRSPW_DEVICE_NAME"\n")
255 255 rtems_task_wake_after(100);
256 256 }
257 257
258 258 PRINTF("In configure_spw_link *** "GRSPW_DEVICE_NAME" opened and started successfully\n")
259 259
260 260 // sets a few parameters of the link
261 261 status = ioctl(fdSPW, SPACEWIRE_IOCTRL_SET_RMAPEN, 1); // sets the RMAP enable bit
262 262 if (status!=RTEMS_SUCCESSFUL) PRINTF("In RECV *** Error SPACEWIRE_IOCTRL_SET_RMAPEN\n")
263 263 //
264 264 status = ioctl(fdSPW, SPACEWIRE_IOCTRL_SET_RXBLOCK, 1); // sets the blocking mode for reception
265 265 if (status!=RTEMS_SUCCESSFUL) PRINTF("In RECV *** Error SPACEWIRE_IOCTRL_SET_RXBLOCK\n")
266 266 //
267 267 status = ioctl(fdSPW, SPACEWIRE_IOCTRL_SET_EVENT_ID, Task_id[3]); // sets the task ID to which an event is sent when a
268 268 if (status!=RTEMS_SUCCESSFUL) PRINTF("In RECV *** Error SPACEWIRE_IOCTRL_SET_EVENT_ID\n") // link-error interrupt occurs
269 269 //
270 270 status = ioctl(fdSPW, SPACEWIRE_IOCTRL_SET_DISABLE_ERR, 1); // automatic link-disabling due to link-error interrupts
271 271 if (status!=RTEMS_SUCCESSFUL) PRINTF("In RECV *** Error SPACEWIRE_IOCTRL_SET_DISABLE_ERR\n")
272 272 //
273 273 status = ioctl(fdSPW, SPACEWIRE_IOCTRL_SET_LINK_ERR_IRQ, 1); // sets the link-error interrupt bit
274 274 if (status!=RTEMS_SUCCESSFUL) PRINTF("In RECV *** Error SPACEWIRE_IOCTRL_SET_LINK_ERR_IRQ\n")
275 275
276 276 status = ioctl(fdSPW, SPACEWIRE_IOCTRL_SET_TXBLOCK_ON_FULL, 1); // sets the link-error interrupt bit
277 277 if (status!=RTEMS_SUCCESSFUL) PRINTF("In RECV *** Error SPACEWIRE_IOCTRL_SET_TXBLOCK_ON_FULL\n")
278 //
279 //status = ioctl(fdSPW, SPACEWIRE_IOCTRL_SET_DESTKEY, CCSDS_DESTINATION_ID); // sets the destination key
280 //if (status!=RTEMS_SUCCESSFUL) PRINTF("In RECV *** Error SPACEWIRE_IOCTRL_SET_LINK_ERR_IRQ\n")
281 //
278
279 status = ioctl(fdSPW, SPACEWIRE_IOCTRL_SET_DESTKEY, CCSDS_DESTINATION_ID); // sets the destination key
280 PRINTF1("destination address set to: %d\n", CCSDS_DESTINATION_ID)
281 if (status!=RTEMS_SUCCESSFUL) PRINTF("In RECV *** Error SPACEWIRE_IOCTRL_SET_LINK_ERR_IRQ\n")
282
283 status = ioctl(fdSPW, SPACEWIRE_IOCTRL_SET_NODEADDR, CCSDS_NODE_ADDRESS); // sets the destination key
284 PRINTF1("node address set to: %d\n", CCSDS_NODE_ADDRESS)
285 if (status!=RTEMS_SUCCESSFUL) PRINTF("In RECV *** Error SPACEWIRE_IOCTRL_SET_LINK_ERR_IRQ\n")
286
282 287 PRINTF("In configure_spw_link *** "GRSPW_DEVICE_NAME" configured successfully\n")
283 288
284 289 return RTEMS_SUCCESSFUL;
285 290 }
286 291
287 292 char *link_status(int status){
288 293 return lstates[status];
289 294 }
290 295
291 296 rtems_status_code write_spw(spw_ioctl_pkt_send* spw_ioctl_send)
292 297 {
293 298 rtems_status_code status;
294 299 status = ioctl( fdSPW, SPACEWIRE_IOCTRL_SEND, spw_ioctl_send );
295 300 if (status!=RTEMS_SUCCESSFUL) printf("In write_spw *** Error SPACEWIRE_IOCTRL_SEND\n");
296 301 return status;
297 302 }
298 303
299 304
@@ -1,520 +1,520
1 1 #include <tc_handler.h>
2 2 #include <fsw_params.h>
3 3
4 4 char *errorCCSDSMsg[8] = { "ILLEGAL_APID 0",
5 5 "WRONG_LEN_PACKET 1",
6 6 "INCOR_CHECKSUM 2",
7 7 "ILL_TYPE 3",
8 8 "ILL_SUBTYPE 4",
9 9 "WRONG_APP_DATA 5",
10 10 "WRONG_CMD_CODE 6",
11 11 "CCSDS_TM_VALID 7"
12 12 };
13 13
14 14 //**********************
15 15 // GENERAL USE FUNCTIONS
16 16 unsigned int Crc_opt( unsigned char D, unsigned int Chk)
17 17 {
18 18 return(((Chk << 8) & 0xff00)^lookUpTableForCRC [(((Chk >> 8)^D) & 0x00ff)]);
19 19 }
20 20
21 21 void initLookUpTableForCRC()
22 22 {
23 23 unsigned int i, tmp;
24 24 for (i=0; i<256; i++)
25 25 {
26 26 tmp = 0;
27 27 if((i & 1) != 0) tmp = tmp ^ 0x1021;
28 28 if((i & 2) != 0) tmp = tmp ^ 0x2042;
29 29 if((i & 4) != 0) tmp = tmp ^ 0x4084;
30 30 if((i & 8) != 0) tmp = tmp ^ 0x8108;
31 31 if((i & 16) != 0) tmp = tmp ^ 0x1231;
32 32 if((i & 32) != 0) tmp = tmp ^ 0x2462;
33 33 if((i & 64) != 0) tmp = tmp ^ 0x48c4;
34 34 if((i & 128) != 0) tmp = tmp ^ 0x9188;
35 35 lookUpTableForCRC[i] = tmp;
36 36 }
37 37 }
38 38
39 39 void GetCRCAsTwoBytes(unsigned char* data, unsigned char* crcAsTwoBytes, unsigned int sizeOfData)
40 40 {
41 41 unsigned int Chk;
42 42 int j;
43 43 Chk = 0xffff; // reset the syndrom to all ones
44 44 for (j=0; j<sizeOfData; j++) {
45 45 Chk = Crc_opt(data[j], Chk);
46 46 }
47 47 crcAsTwoBytes[0] = (unsigned char) (Chk >> 8);
48 48 crcAsTwoBytes[1] = (unsigned char) (Chk & 0x00ff);
49 49 }
50 50
51 51
52 52 //*********************
53 53 // ACCEPTANCE FUNCTIONS
54 54 int TC_checker(ccsdsTelecommandPacket_t *TC, unsigned int tc_len_recv)
55 55 {
56 56 rtems_status_code status;
57 57 spw_ioctl_pkt_send spw_ioctl_send;
58 58 TMHeader_t TM_header;
59 59 unsigned int code = 0;
60 60 unsigned char computed_CRC[2];
61 61 char data[ TM_LEN_EXE_CORR + CCSDS_TC_TM_PACKET_OFFSET - TM_HEADER_LEN ];
62 62
63 63 GetCRCAsTwoBytes( (unsigned char*) TC->packetID, computed_CRC, tc_len_recv + 5 );
64 64 code = acceptTM( TC, tc_len_recv ) ;
65 65 if ( (code == 0) | (code == 1) | (code == 2)
66 66 | (code == 3) | (code == 4) | (code == 5) )
67 67 { // generate TM_LFR_TC_EXE_CORRUPTED
68 68 // BUILD HEADER
69 69 TM_build_header( TM_LFR_TC_EXE_ERR, TM_LEN_EXE_CORR, 0, 0, &TM_header);
70 70 // BUILD DATA
71 71 TM_build_data( TC, data, SID_EXE_CORR, computed_CRC);
72 72 // PREPARE TM SENDING
73 73 spw_ioctl_send.hlen = TM_HEADER_LEN + 4; // + 4 is for the protocole extra header
74 74 spw_ioctl_send.hdr = (char*) &TM_header;
75 75 spw_ioctl_send.dlen = 16;
76 76 spw_ioctl_send.data = data;
77 77 // SEND PACKET
78 78 write_spw(&spw_ioctl_send);
79 79 }
80 80 else { // send valid TC to the action launcher
81 81 status = rtems_message_queue_send( misc_id[0], TC, tc_len_recv + CCSDS_TC_TM_PACKET_OFFSET + 3);
82 82 return -1;
83 83 }
84 84 return -1;
85 85 }
86 86
87 87 unsigned char acceptTM(ccsdsTelecommandPacket_t * TMPacket, unsigned int TC_LEN_RCV)
88 88 {
89 89 unsigned char pid = 0;
90 90 unsigned char category = 0;
91 91 unsigned int length = 0;
92 92 unsigned char packetType = 0;
93 93 unsigned char packetSubtype = 0;
94 94 unsigned char * CCSDSContent;
95 95
96 96 // APID check *** APID on 2 bytes
97 97 pid = ((TMPacket->packetID[0] & 0x07)<<4) + ( (TMPacket->packetID[1]>>4) & 0x0f ); // PID = 11 *** 7 bits xxxxx210 7654xxxx
98 98 category = (TMPacket->packetID[1] & 0x0f); // PACKET_CATEGORY = 12 *** 4 bits xxxxxxxx xxxx3210
99 99 if (pid!=CCSDS_PROCESS_ID) return ILLEGAL_APID;
100 100 if (category!=CCSDS_PACKET_CATEGORY) return ILLEGAL_APID;
101 101
102 102 // packet length check
103 103 length = TMPacket->packetLength[0] * 256 + TMPacket->packetLength[1];
104 104 if (length != TC_LEN_RCV ) return WRONG_LEN_PACKET; // LEN RCV != SIZE FIELD
105 105 if (length >= CCSDS_TC_PKT_MAX_SIZE) return WRONG_LEN_PACKET; // check that the packet does not exceed the MAX size
106 106
107 107 packetType = TMPacket->dataFieldHeader[1];
108 108 packetSubtype = TMPacket->dataFieldHeader[2];
109 109 // service type, subtype and packet length check
110 110 if (packetType == 181){
111 111 switch(packetSubtype){ //subtype, autorized values are 3, 20, 21, 24, 27, 28, 30, 40, 50, 60, 61
112 112 case 3:
113 113 if (length!=(12-CCSDS_TC_TM_PACKET_OFFSET)) return WRONG_LEN_PACKET;
114 114 break;
115 115 case 20:
116 116 if (length!=(14-CCSDS_TC_TM_PACKET_OFFSET)) return WRONG_LEN_PACKET;
117 117 break;
118 118 case 21:
119 119 if (length!=(20-CCSDS_TC_TM_PACKET_OFFSET)) return WRONG_LEN_PACKET;
120 120 break;
121 121 case 24:
122 122 if (length!=(14-CCSDS_TC_TM_PACKET_OFFSET)) return WRONG_LEN_PACKET;
123 123 break;
124 124 case 27:
125 125 if (length!=(14-CCSDS_TC_TM_PACKET_OFFSET)) return WRONG_LEN_PACKET;
126 126 break;
127 127 case 28:
128 128 if (length!=(14-CCSDS_TC_TM_PACKET_OFFSET)) return WRONG_LEN_PACKET;
129 129 break;
130 130 case 30:
131 131 if (length!=(12-CCSDS_TC_TM_PACKET_OFFSET)) return WRONG_LEN_PACKET;
132 132 break;
133 133 case 40:
134 134 if (length!=(20-CCSDS_TC_TM_PACKET_OFFSET)) return WRONG_LEN_PACKET;
135 135 break;
136 136 case 50:
137 137 if (length!=(50-CCSDS_TC_TM_PACKET_OFFSET)) return WRONG_LEN_PACKET;
138 138 break;
139 139 case 60:
140 140 if (length!=(12-CCSDS_TC_TM_PACKET_OFFSET)) return WRONG_LEN_PACKET;
141 141 break;
142 142 case 61:
143 143 if (length!=(12-CCSDS_TC_TM_PACKET_OFFSET)) return WRONG_LEN_PACKET;
144 144 break;
145 145 default:
146 146 return ILL_SUBTYPE;
147 147 break;
148 148 }
149 149 }
150 150 else if (packetType == 9){
151 151 if (packetSubtype!=129) return ILL_SUBTYPE;
152 152 if (length!=(18-CCSDS_TC_TM_PACKET_OFFSET)) return WRONG_LEN_PACKET;
153 153 }
154 154 else return ILL_TYPE;
155 155
156 156 // source ID check // Source ID not documented in the ICD
157 157
158 158 // packet error control, CRC check
159 159 CCSDSContent = (unsigned char*) TMPacket->packetID;
160 160 GetCRCAsTwoBytes(CCSDSContent, currentTC_COMPUTED_CRC, length + CCSDS_TC_TM_PACKET_OFFSET - 2); // 2 CRC bytes removed from the calculation of the CRC
161 161 if (currentTC_COMPUTED_CRC[0] != CCSDSContent[length + CCSDS_TC_TM_PACKET_OFFSET -2]) return INCOR_CHECKSUM;
162 162 if (currentTC_COMPUTED_CRC[1] != CCSDSContent[length + CCSDS_TC_TM_PACKET_OFFSET -1]) return INCOR_CHECKSUM;
163 163
164 164 return CCSDS_TM_VALID;
165 165 }
166 166
167 167 unsigned char TM_build_header( enum TM_TYPE tm_type, unsigned int packetLength,
168 168 unsigned int coarseTime, unsigned int fineTime, TMHeader_t *TMHeader)
169 169 {
170 170 TMHeader->targetLogicalAddress = CCSDS_DESTINATION_ID;
171 171 TMHeader->protocolIdentifier = 0x02;
172 172 TMHeader->reserved = 0x00;
173 173 TMHeader->userApplication = 0x00;
174 174 TMHeader->packetID[0] = 0x0c;
175 175 TMHeader->packetSequenceControl[0] = 0xc0;
176 176 TMHeader->packetSequenceControl[1] = 0x00;
177 177 TMHeader->packetLength[0] = (unsigned char) (packetLength>>8);
178 178 TMHeader->packetLength[1] = (unsigned char) packetLength;
179 179 TMHeader->dataFieldHeader[0] = 0x10;
180 180 TMHeader->dataFieldHeader[3] = CCSDS_DESTINATION_ID;
181 181 switch (tm_type){
182 182 case(TM_LFR_TC_EXE_OK):
183 183 TMHeader->packetID[1] = 0xc1;
184 184 TMHeader->dataFieldHeader[1] = 1; // type
185 185 TMHeader->dataFieldHeader[2] = 7; // subtype
186 186 break;
187 187 case(TM_LFR_TC_EXE_ERR):
188 188 TMHeader->packetID[1] = 0xc1;
189 189 TMHeader->dataFieldHeader[1] = 1; // type
190 190 TMHeader->dataFieldHeader[2] = 8; // subtype
191 191 break;
192 192 case(TM_LFR_HK):
193 193 TMHeader->packetID[1] = 0xc4;
194 194 TMHeader->dataFieldHeader[1] = 3; // type
195 195 TMHeader->dataFieldHeader[2] = 25; // subtype
196 196 break;
197 197 case(TM_LFR_SCI):
198 198 TMHeader->packetID[1] = 0xcc;
199 199 TMHeader->dataFieldHeader[1] = 21; // type
200 200 TMHeader->dataFieldHeader[2] = 3; // subtype
201 201 break;
202 202 case(TM_LFR_SCI_SBM):
203 203 TMHeader->packetID[1] = 0xfc;
204 204 TMHeader->dataFieldHeader[1] = 21; // type
205 205 TMHeader->dataFieldHeader[2] = 3; // subtype
206 206 break;
207 207 case(TM_LFR_PAR_DUMP):
208 208 TMHeader->packetID[1] = 0xc9;
209 209 TMHeader->dataFieldHeader[1] = 181; // type
210 210 TMHeader->dataFieldHeader[2] = 31; // subtype
211 211 break;
212 212 default:
213 213 return 0;
214 214 }
215 215 TMHeader->dataFieldHeader[4] = (unsigned char) (time_management_regs->coarse_time>>24);
216 216 TMHeader->dataFieldHeader[5] = (unsigned char) (time_management_regs->coarse_time>>16);
217 217 TMHeader->dataFieldHeader[6] = (unsigned char) (time_management_regs->coarse_time>>8);
218 218 TMHeader->dataFieldHeader[7] = (unsigned char) (time_management_regs->coarse_time);
219 219 TMHeader->dataFieldHeader[8] = (unsigned char) (time_management_regs->fine_time>>8);
220 220 TMHeader->dataFieldHeader[9] = (unsigned char) (time_management_regs->fine_time);
221 221 return 1;
222 222 }
223 223
224 224 unsigned char TM_build_data(ccsdsTelecommandPacket_t *TC, char* data, unsigned int SID, unsigned char *computed_CRC)
225 225 {
226 226 unsigned int packetLength;
227 227 packetLength = TC->packetLength[0] * 256 + TC->packetLength[1];
228 228 switch (SID){
229 229 case (SID_NOT_EXE):
230 230 break;
231 231 case (SID_NOT_IMP):
232 232 data[0] = 0x9c;
233 233 data[1] = 0x42;
234 234 data[2] = TC->packetID[0];
235 235 data[3] = TC->packetID[1];
236 236 data[4] = TC->packetSequenceControl[0];
237 237 data[5] = TC->packetSequenceControl[1];
238 238 data[6] = TC->dataFieldHeader[1]; // type
239 239 data[7] = TC->dataFieldHeader[2]; // subtype
240 240 break;
241 241 case (SID_EXE_ERR):
242 242 break;
243 243 case (SID_EXE_CORR):
244 244 data[0] = 0x9c;
245 245 data[1] = 0x45;
246 246 data[2] = TC->packetID[0];
247 247 data[3] = TC->packetID[1];
248 248 data[4] = TC->packetSequenceControl[0];
249 249 data[5] = TC->packetSequenceControl[1];
250 250 data[6] = TC->dataFieldHeader[1]; // type
251 251 data[7] = TC->dataFieldHeader[2]; // subtype
252 252 data[8] = currentTC_LEN_RCV[0];
253 253 data[9] = currentTC_LEN_RCV[1];
254 254 data[10] = TC->packetLength[0];
255 255 data[11] = TC->packetLength[1];
256 256 data[12] = TC->dataAndCRC[packetLength];
257 257 data[13] = TC->dataAndCRC[packetLength+1];
258 258 data[14] = computed_CRC[0];
259 259 data[15] = computed_CRC[1];
260 260 break;
261 261 default:
262 262 return 0;
263 263 }
264 264 return 1;
265 265 }
266 266
267 267 //***********
268 268 // RTEMS TASK
269 269 rtems_task recv_task( rtems_task_argument unused )
270 270 {
271 271 int len = 0;
272 272 unsigned int i = 0;
273 273 unsigned int data_length = 0;
274 274 ccsdsTelecommandPacket_t currentTC;
275 275 char data[100];
276 276
277 277 for(i=0; i<100; i++) data[i] = 0;
278 278
279 279 PRINTF("In RECV *** \n")
280 280
281 281 while(1)
282 282 {
283 283 len = read(fdSPW, (char*) &currentTC, CCSDS_TC_PKT_MAX_SIZE); // the call to read is blocking
284 284 if (len == -1){ // error during the read call
285 285 PRINTF("In RECV *** last read call returned -1\n")
286 286 if (rtems_event_send( Task_id[3], SPW_LINKERR_EVENT ) != RTEMS_SUCCESSFUL)
287 287 PRINTF("IN RECV *** Error: rtems_event_send SPW_LINKERR_EVENT\n")
288 288 if (rtems_task_suspend(RTEMS_SELF) != RTEMS_SUCCESSFUL)
289 289 PRINTF("In RECV *** Error: rtems_task_suspend(RTEMS_SELF)\n")
290 290 }
291 291 else {
292 PRINTF1("In RECV *** Got Message of length %d\n", len)
292 PRINTF1("Got pck of length %d\n", len+1)
293 293 currentTC_LEN_RCV[0] = 0x00;
294 294 currentTC_LEN_RCV[1] = (unsigned char) len - CCSDS_TC_TM_PACKET_OFFSET - 3; // build the corresponding packet size field
295 295 currentTC_LEN_RCV_AsUnsignedInt = (unsigned int) len - CCSDS_TC_TM_PACKET_OFFSET - 3; // => -3 is for Prot ID, Reserved and User App bytes
296 296 // CHECK THE TC AND BUILD THE APPROPRIATE TM
297 297 data_length = TC_checker(&currentTC, currentTC_LEN_RCV_AsUnsignedInt);
298 298 if (data_length!=-1)
299 299 {
300 300 }
301 301 }
302 302 }
303 303 }
304 304
305 305 rtems_task actn_task( rtems_task_argument unused )
306 306 {
307 307 int result = 0;
308 308 rtems_status_code status; // RTEMS status code
309 309 ccsdsTelecommandPacket_t TC; // TC sent to the ACTN task
310 310 size_t size; // size of the incoming TC packet
311 311 unsigned char subtype = 0; // subtype of the current TC packet
312 312
313 313 PRINTF("In ACTN *** \n")
314 314
315 315 while(1)
316 316 {
317 317 status = rtems_message_queue_receive(misc_id[0], (char*) &TC, &size,
318 318 RTEMS_WAIT, RTEMS_NO_TIMEOUT);
319 319 if (status!=RTEMS_SUCCESSFUL) PRINTF1("in task ACTN *** error receiving a message, code %d \n", status)
320 320 else
321 321 {
322 322 subtype = TC.dataFieldHeader[2];
323 323 switch(subtype)
324 324 {
325 325 case TC_SUBTYPE_RESET:
326 326 result = action_default( &TC );
327 327 break;
328 328 //
329 329 case TC_SUBTYPE_LOAD_COMM:
330 330 result = action_default( &TC );
331 331 break;
332 332 //
333 333 case TC_SUBTYPE_LOAD_NORM:
334 334 result = action_load_norm( &TC );
335 335 send_tm_lfr_tc_exe_success( &TC );
336 336 break;
337 337 //
338 338 case TC_SUBTYPE_LOAD_BURST:
339 339 result = action_default( &TC );
340 340 break;
341 341 //
342 342 case TC_SUBTYPE_LOAD_SBM1:
343 343 result = action_default( &TC );
344 344 break;
345 345 //
346 346 case TC_SUBTYPE_LOAD_SBM2:
347 347 result = action_default( &TC );
348 348 break;
349 349 //
350 350 case TC_SUBTYPE_DUMP:
351 351 result = action_default( &TC );
352 352 break;
353 353 //
354 354 case TC_SUBTYPE_ENTER:
355 355 result = action_enter( &TC );
356 356 send_tm_lfr_tc_exe_success( &TC );
357 357 break;
358 358 //
359 359 case TC_SUBTYPE_UPDT_INFO:
360 360 result = action_default( &TC );
361 361 break;
362 362 //
363 363 case TC_SUBTYPE_EN_CAL:
364 364 result = action_default( &TC );
365 365 break;
366 366 //
367 367 case TC_SUBTYPE_DIS_CAL:
368 368 result = action_default( &TC );
369 369 break;
370 370 //
371 371 case TC_SUBTYPE_UPDT_TIME:
372 372 result = action_updt_time( &TC );
373 373 send_tm_lfr_tc_exe_success( &TC );
374 374 break;
375 375 //
376 376 default:
377 377 break;
378 378 }
379 379 }
380 380 }
381 381 }
382 382
383 383 int create_message_queue()
384 384 {
385 385 rtems_status_code status;
386 386 misc_name[0] = rtems_build_name( 'Q', 'U', 'E', 'U' );
387 387 status = rtems_message_queue_create( misc_name[0], ACTION_MSG_QUEUE_COUNT, CCSDS_TC_PKT_MAX_SIZE,
388 388 RTEMS_FIFO | RTEMS_LOCAL, &misc_id[0] );
389 389 if (status!=RTEMS_SUCCESSFUL) PRINTF("in create_message_queue *** error creating message queue\n")
390 390
391 391 return 0;
392 392 }
393 393
394 394 //***********
395 395 // TC ACTIONS
396 396 int action_default(ccsdsTelecommandPacket_t *TC)
397 397 {
398 398 char data[100]; // buffer for the generic TM packet
399 399 TMHeader_t TM_header; // TM header
400 400 spw_ioctl_pkt_send spw_ioctl_send; // structure to send the TM packet if any
401 401 // BUILD HEADER
402 402 TM_build_header( TM_LFR_TC_EXE_ERR, TM_LEN_NOT_IMP, 0, 0, &TM_header);
403 403 // BUILD DATA
404 404 TM_build_data( TC, data, SID_NOT_IMP, NULL);
405 405 // filling the strture for the spcawire transmission
406 406 spw_ioctl_send.hlen = TM_HEADER_LEN + 4; // + 4 is for the protocole extra header
407 407 spw_ioctl_send.hdr = (char*) &TM_header;
408 408 spw_ioctl_send.dlen = 8;
409 409 spw_ioctl_send.data = data;
410 410 // SEND DATA
411 411 write_spw(&spw_ioctl_send);
412 412
413 413 return 0;
414 414 }
415 415
416 416 int action_enter(ccsdsTelecommandPacket_t *TC)
417 417 {
418 418 unsigned char lfr_mode = TC->dataAndCRC[1];
419 419 printf("enter mode %d\n", lfr_mode);
420 420 switch(lfr_mode)
421 421 {
422 422 case(LFR_MODE_STANDBY):
423 423 LEON_Mask_interrupt( IRQ_WF );
424 424 LEON_Mask_interrupt( IRQ_SM );
425 425 break;
426 426 case(LFR_MODE_NORMAL):
427 427 LEON_Unmask_interrupt( IRQ_WF );
428 428 LEON_Unmask_interrupt( IRQ_SM );
429 429 break;
430 430 case(LFR_MODE_BURST):
431 431 break;
432 432 case(LFR_MODE_SBM1):
433 433 break;
434 434 case(LFR_MODE_SBM2):
435 435 break;
436 436 }
437 437 return 0;
438 438 }
439 439
440 440 int action_load_norm(ccsdsTelecommandPacket_t *TC)
441 441 {
442 442 param_norm.sy_lfr_n_swf_l = TC->dataAndCRC[0] * 256 + TC->dataAndCRC[1];
443 443 param_norm.sy_lfr_n_swf_p = TC->dataAndCRC[2] * 256 + TC->dataAndCRC[3];
444 444 param_norm.sy_lfr_n_asm_p = TC->dataAndCRC[4] * 256 + TC->dataAndCRC[5];
445 445 param_norm.sy_lfr_n_bp_p0 = TC->dataAndCRC[6];
446 446 param_norm.sy_lfr_n_bp_p1 = TC->dataAndCRC[7];
447 447 /*printf("sy_lfr_n_ => swf_l %d, swf_p %d, asm_p %d, bsp_p0 %d, bsp_p1 %d\n",
448 448 param_norm.sy_lfr_n_swf_l, param_norm.sy_lfr_n_swf_p,
449 449 param_norm.sy_lfr_n_asm_p, param_norm.sy_lfr_n_bp_p0, param_norm.sy_lfr_n_bp_p1);*/
450 450 return 0;
451 451 }
452 452
453 453 int action_updt_time(ccsdsTelecommandPacket_t *TC)
454 454 {
455 455 time_management_regs->coarse_time_load = (TC->dataAndCRC[0] << 24)
456 456 + (TC->dataAndCRC[1] << 16)
457 457 + (TC->dataAndCRC[2] << 8)
458 458 + TC->dataAndCRC[3];
459 459 //time_management_regs->ctrl = time_management_regs->ctrl | 1;
460 460 return 0;
461 461 }
462 462
463 463 int send_tm_lfr_tc_exe_success(ccsdsTelecommandPacket_t *TC)
464 464 {
465 465 TMHeader_t TM_header;
466 466 char data[4];
467 467 spw_ioctl_pkt_send spw_ioctl_send;
468 468
469 469 TM_build_header( TM_LFR_TC_EXE_OK, TM_LEN_EXE,
470 470 time_management_regs->coarse_time, time_management_regs->fine_time, &TM_header);
471 471
472 472 data[0] = TC->packetID[0];
473 473 data[1] = TC->packetID[1];
474 474 data[2] = TC->packetSequenceControl[0];
475 475 data[3] = TC->packetSequenceControl[1];
476 476
477 477 // filling the structure for the spacewire transmission
478 478 spw_ioctl_send.hlen = TM_HEADER_LEN + 3; // + 4 is for the protocole extra header
479 479 spw_ioctl_send.hdr = (char*) &TM_header;
480 480 spw_ioctl_send.dlen = 3;
481 481 spw_ioctl_send.data = data;
482 482
483 483 // SEND DATA
484 484 write_spw(&spw_ioctl_send);
485 485
486 486 return 0;
487 487 }
488 488
489 489 //***************************
490 490 // Interrupt Service Routines
491 491 rtems_isr commutation_isr1( rtems_vector_number vector )
492 492 {
493 493 if (rtems_event_send( Task_id[TASKID_DUMB], RTEMS_EVENT_0 ) != RTEMS_SUCCESSFUL)
494 494 printf("In spectral_matrices_isr *** Error sending event to DUMB\n");
495 495 }
496 496
497 497 rtems_isr commutation_isr2( rtems_vector_number vector )
498 498 {
499 499 if (rtems_event_send( Task_id[TASKID_DUMB], RTEMS_EVENT_0 ) != RTEMS_SUCCESSFUL)
500 500 printf("In spectral_matrices_isr *** Error sending event to DUMB\n");
501 501 }
502 502
503 503 rtems_task dumb_task( rtems_task_argument unused )
504 504 {
505 505 unsigned int coarse_time;
506 506 unsigned int fine_time;
507 507 rtems_event_set event_out;
508 508
509 509 PRINTF("In DUMB *** \n")
510 510
511 511 while(1){
512 512 rtems_event_receive(RTEMS_EVENT_0, RTEMS_WAIT, RTEMS_NO_TIMEOUT, &event_out); // wait for an RTEMS_EVENT0
513 513 coarse_time = time_management_regs->coarse_time;
514 514 fine_time = time_management_regs->fine_time;
515 515 printf("commutation_isr*, coarse time = %x, fine time = %x\n", coarse_time, fine_time);
516 516 }
517 517 }
518 518
519 519
520 520
General Comments 0
You need to be logged in to leave comments. Login now