##// END OF EJS Templates
New version of ASM packets transmission...
paul -
r173:c2ac646b3bc4 VHDL_0_1_28
parent child
Show More
@@ -1,6 +1,6
1 #############################################################################
1 #############################################################################
2 # Makefile for building: bin/fsw
2 # Makefile for building: bin/fsw
3 # Generated by qmake (2.01a) (Qt 4.8.6) on: Thu Nov 13 07:59:00 2014
3 # Generated by qmake (2.01a) (Qt 4.8.6) on: Fri Nov 14 07:56:09 2014
4 # Project: fsw-qt.pro
4 # Project: fsw-qt.pro
5 # Template: app
5 # Template: app
6 # Command: /usr/bin/qmake-qt4 -spec /usr/lib64/qt4/mkspecs/linux-g++ -o Makefile fsw-qt.pro
6 # Command: /usr/bin/qmake-qt4 -spec /usr/lib64/qt4/mkspecs/linux-g++ -o Makefile fsw-qt.pro
@@ -1,6 +1,6
1 <?xml version="1.0" encoding="UTF-8"?>
1 <?xml version="1.0" encoding="UTF-8"?>
2 <!DOCTYPE QtCreatorProject>
2 <!DOCTYPE QtCreatorProject>
3 <!-- Written by QtCreator 3.2.1, 2014-11-12T16:01:52. -->
3 <!-- Written by QtCreator 3.2.1, 2014-11-13T16:06:58. -->
4 <qtcreator>
4 <qtcreator>
5 <data>
5 <data>
6 <variable>EnvironmentId</variable>
6 <variable>EnvironmentId</variable>
@@ -16,9 +16,11
16 #define NB_RING_NODES_SM_F1 12 // AT LEAST 8 due to the way the averaging is done
16 #define NB_RING_NODES_SM_F1 12 // AT LEAST 8 due to the way the averaging is done
17 #define NB_RING_NODES_ASM_BURST_SBM_F1 5 // AT LEAST 3
17 #define NB_RING_NODES_ASM_BURST_SBM_F1 5 // AT LEAST 3
18 #define NB_RING_NODES_ASM_NORM_F1 5 // AT LEAST 3
18 #define NB_RING_NODES_ASM_NORM_F1 5 // AT LEAST 3
19 #define NB_RING_NODES_ASM_F1 3 // AT LEAST 3
19 #define NB_RING_NODES_SM_F2 3 // AT LEAST 3
20 #define NB_RING_NODES_SM_F2 3 // AT LEAST 3
20 #define NB_RING_NODES_ASM_BURST_SBM_F2 3 // AT LEAST 3
21 #define NB_RING_NODES_ASM_BURST_SBM_F2 3 // AT LEAST 3
21 #define NB_RING_NODES_ASM_NORM_F2 3 // AT LEAST 3
22 #define NB_RING_NODES_ASM_NORM_F2 3 // AT LEAST 3
23 #define NB_RING_NODES_ASM_F2 3 // AT LEAST 3
22 //
24 //
23 #define NB_BINS_PER_ASM_F0 88
25 #define NB_BINS_PER_ASM_F0 88
24 #define NB_BINS_PER_PKT_ASM_F0 44
26 #define NB_BINS_PER_PKT_ASM_F0 44
@@ -30,7 +30,7 void reset_nb_sm_f0( unsigned char lfrMo
30
30
31 //*******
31 //*******
32 // EXTERN
32 // EXTERN
33 extern ring_node_sm *ring_node_for_averaging_sm_f0;
33 extern ring_node *ring_node_for_averaging_sm_f0;
34 extern rtems_status_code get_message_queue_id_prc0( rtems_id *queue_id );
34 extern rtems_status_code get_message_queue_id_prc0( rtems_id *queue_id );
35
35
36 #endif // AVF0_PRC0_H_INCLUDED
36 #endif // AVF0_PRC0_H_INCLUDED
@@ -27,7 +27,7 void reset_nb_sm_f1( unsigned char lfrMo
27
27
28 //*******
28 //*******
29 // EXTERN
29 // EXTERN
30 extern struct ring_node_sm *ring_node_for_averaging_sm_f1;
30 extern struct ring_node *ring_node_for_averaging_sm_f1;
31 extern rtems_status_code get_message_queue_id_prc1( rtems_id *queue_id );
31 extern rtems_status_code get_message_queue_id_prc1( rtems_id *queue_id );
32
32
33 #endif // AVF1_PRC1_H
33 #endif // AVF1_PRC1_H
@@ -18,11 +18,11 rtems_task prc2_task( rtems_task_argumen
18 // FUNCTIONS
18 // FUNCTIONS
19
19
20 void reset_nb_sm_f2( void );
20 void reset_nb_sm_f2( void );
21 void SM_average_f2(float *averaged_spec_mat_f2, ring_node_sm *ring_node, unsigned int nbAverageNormF2 );
21 void SM_average_f2(float *averaged_spec_mat_f2, ring_node *ring_node, unsigned int nbAverageNormF2 );
22
22
23 //*******
23 //*******
24 // EXTERN
24 // EXTERN
25 extern struct ring_node_sm *ring_node_for_averaging_sm_f2;
25 extern struct ring_node *ring_node_for_averaging_sm_f2;
26 extern rtems_status_code get_message_queue_id_prc2( rtems_id *queue_id );
26 extern rtems_status_code get_message_queue_id_prc2( rtems_id *queue_id );
27
27
28 #endif // AVF2_PRC2_H
28 #endif // AVF2_PRC2_H
@@ -11,16 +11,6
11 #include "fsw_params.h"
11 #include "fsw_params.h"
12 #include "fsw_spacewire.h"
12 #include "fsw_spacewire.h"
13
13
14 typedef struct ring_node_sm
15 {
16 struct ring_node_sm *previous;
17 struct ring_node_sm *next;
18 int buffer_address;
19 unsigned int status;
20 unsigned int coarseTime;
21 unsigned int fineTime;
22 } ring_node_sm;
23
24 typedef struct ring_node_asm
14 typedef struct ring_node_asm
25 {
15 {
26 struct ring_node_asm *next;
16 struct ring_node_asm *next;
@@ -75,9 +65,6 void SM_init_rings( void );
75 void SM_reset_current_ring_nodes( void );
65 void SM_reset_current_ring_nodes( void );
76 // ASM
66 // ASM
77 void ASM_generic_init_ring(ring_node_asm *ring, unsigned char nbNodes );
67 void ASM_generic_init_ring(ring_node_asm *ring, unsigned char nbNodes );
78 void ASM_init_header( Header_TM_LFR_SCIENCE_ASM_t *header);
79 void ASM_send(Header_TM_LFR_SCIENCE_ASM_t *header, char *spectral_matrix,
80 unsigned int sid, spw_ioctl_pkt_send *spw_ioctl_send, rtems_id queue_id);
81
68
82 //*****************
69 //*****************
83 // Basic Parameters
70 // Basic Parameters
@@ -100,7 +87,7 void reset_spectral_matrix_regs( void );
100 void set_time(unsigned char *time, unsigned char *timeInBuffer );
87 void set_time(unsigned char *time, unsigned char *timeInBuffer );
101 unsigned long long int get_acquisition_time( unsigned char *timePtr );
88 unsigned long long int get_acquisition_time( unsigned char *timePtr );
102 void close_matrix_actions( unsigned int *nb_sm, unsigned int nb_sm_before_avf, rtems_id avf_task_id,
89 void close_matrix_actions( unsigned int *nb_sm, unsigned int nb_sm_before_avf, rtems_id avf_task_id,
103 ring_node_sm *node_for_averaging, ring_node_sm *ringNode, unsigned long long int time );
90 ring_node *node_for_averaging, ring_node *ringNode, unsigned long long int time );
104 unsigned char getSID( rtems_event_set event );
91 unsigned char getSID( rtems_event_set event );
105
92
106 extern rtems_status_code get_message_queue_id_prc1( rtems_id *queue_id );
93 extern rtems_status_code get_message_queue_id_prc1( rtems_id *queue_id );
@@ -109,10 +96,10 extern rtems_status_code get_message_que
109 //***************************************
96 //***************************************
110 // DEFINITIONS OF STATIC INLINE FUNCTIONS
97 // DEFINITIONS OF STATIC INLINE FUNCTIONS
111 static inline void SM_average(float *averaged_spec_mat_NORM, float *averaged_spec_mat_SBM,
98 static inline void SM_average(float *averaged_spec_mat_NORM, float *averaged_spec_mat_SBM,
112 ring_node_sm *ring_node_tab[],
99 ring_node *ring_node_tab[],
113 unsigned int nbAverageNORM, unsigned int nbAverageSBM );
100 unsigned int nbAverageNORM, unsigned int nbAverageSBM );
114 static inline void SM_average_debug( float *averaged_spec_mat_NORM, float *averaged_spec_mat_SBM,
101 static inline void SM_average_debug( float *averaged_spec_mat_NORM, float *averaged_spec_mat_SBM,
115 ring_node_sm *ring_node_tab[],
102 ring_node *ring_node_tab[],
116 unsigned int nbAverageNORM, unsigned int nbAverageSBM );
103 unsigned int nbAverageNORM, unsigned int nbAverageSBM );
117 static inline void ASM_reorganize_and_divide(float *averaged_spec_mat, float *averaged_spec_mat_reorganized,
104 static inline void ASM_reorganize_and_divide(float *averaged_spec_mat, float *averaged_spec_mat_reorganized,
118 float divider );
105 float divider );
@@ -121,8 +108,8 static inline void ASM_compress_reorgani
121 unsigned char nbBinsCompressedMatrix, unsigned char nbBinsToAverage , unsigned char ASMIndexStart);
108 unsigned char nbBinsCompressedMatrix, unsigned char nbBinsToAverage , unsigned char ASMIndexStart);
122 static inline void ASM_convert(volatile float *input_matrix, char *output_matrix);
109 static inline void ASM_convert(volatile float *input_matrix, char *output_matrix);
123
110
124 void SM_average_debug( float *averaged_spec_mat_NORM, float *averaged_spec_mat_SBM,
111 void SM_average( float *averaged_spec_mat_NORM, float *averaged_spec_mat_SBM,
125 ring_node_sm *ring_node_tab[],
112 ring_node *ring_node_tab[],
126 unsigned int nbAverageNORM, unsigned int nbAverageSBM )
113 unsigned int nbAverageNORM, unsigned int nbAverageSBM )
127 {
114 {
128 float sum;
115 float sum;
@@ -161,8 +148,8 void SM_average_debug( float *averaged_s
161 }
148 }
162 }
149 }
163
150
164 void SM_average( float *averaged_spec_mat_NORM, float *averaged_spec_mat_SBM,
151 void SM_average_debug( float *averaged_spec_mat_NORM, float *averaged_spec_mat_SBM,
165 ring_node_sm *ring_node_tab[],
152 ring_node *ring_node_tab[],
166 unsigned int nbAverageNORM, unsigned int nbAverageSBM )
153 unsigned int nbAverageNORM, unsigned int nbAverageSBM )
167 {
154 {
168 float sum;
155 float sum;
@@ -18,7 +18,7 ring_node_asm asm_ring_norm_f0 [ NB
18 ring_node_asm asm_ring_burst_sbm_f0 [ NB_RING_NODES_ASM_BURST_SBM_F0 ];
18 ring_node_asm asm_ring_burst_sbm_f0 [ NB_RING_NODES_ASM_BURST_SBM_F0 ];
19
19
20 ring_node ring_to_send_asm_f0 [ NB_RING_NODES_ASM_F0 ];
20 ring_node ring_to_send_asm_f0 [ NB_RING_NODES_ASM_F0 ];
21 char buffer_asm_f0 [ NB_RING_NODES_ASM_F0 * TOTAL_SIZE_SM ];
21 int buffer_asm_f0 [ NB_RING_NODES_ASM_F0 * TOTAL_SIZE_SM ];
22
22
23 float asm_f0_reorganized [ TOTAL_SIZE_SM ];
23 float asm_f0_reorganized [ TOTAL_SIZE_SM ];
24 char asm_f0_char [ TIME_OFFSET_IN_BYTES + (TOTAL_SIZE_SM * 2) ];
24 char asm_f0_char [ TIME_OFFSET_IN_BYTES + (TOTAL_SIZE_SM * 2) ];
@@ -38,7 +38,7 rtems_task avf0_task( rtems_task_argumen
38 rtems_status_code status;
38 rtems_status_code status;
39 rtems_id queue_id_prc0;
39 rtems_id queue_id_prc0;
40 asm_msg msgForMATR;
40 asm_msg msgForMATR;
41 ring_node_sm *ring_node_tab[8];
41 ring_node *ring_node_tab[8];
42 ring_node_asm *current_ring_node_asm_burst_sbm_f0;
42 ring_node_asm *current_ring_node_asm_burst_sbm_f0;
43 ring_node_asm *current_ring_node_asm_norm_f0;
43 ring_node_asm *current_ring_node_asm_norm_f0;
44
44
@@ -75,7 +75,7 rtems_task avf0_task( rtems_task_argumen
75 // initialize the mesage for the MATR task
75 // initialize the mesage for the MATR task
76 msgForMATR.norm = current_ring_node_asm_norm_f0;
76 msgForMATR.norm = current_ring_node_asm_norm_f0;
77 msgForMATR.burst_sbm = current_ring_node_asm_burst_sbm_f0;
77 msgForMATR.burst_sbm = current_ring_node_asm_burst_sbm_f0;
78 msgForMATR.event = 0x00; // this composite event will be sent to the MATR task
78 msgForMATR.event = 0x00; // this composite event will be sent to the PRC0 task
79 msgForMATR.coarseTime = ring_node_for_averaging_sm_f0->coarseTime;
79 msgForMATR.coarseTime = ring_node_for_averaging_sm_f0->coarseTime;
80 msgForMATR.fineTime = ring_node_for_averaging_sm_f0->fineTime;
80 msgForMATR.fineTime = ring_node_for_averaging_sm_f0->fineTime;
81 //
81 //
@@ -182,21 +182,17 rtems_task prc0_task( rtems_task_argumen
182 asm_msg *incomingMsg;
182 asm_msg *incomingMsg;
183 //
183 //
184 unsigned char sid;
184 unsigned char sid;
185 spw_ioctl_pkt_send spw_ioctl_send_ASM;
186 rtems_status_code status;
185 rtems_status_code status;
187 rtems_id queue_id;
186 rtems_id queue_id;
188 rtems_id queue_id_q_p0;
187 rtems_id queue_id_q_p0;
189 Header_TM_LFR_SCIENCE_ASM_t headerASM;
188 bp_packet_with_spare packet_norm_bp1_f0;
190 bp_packet_with_spare packet_norm_bp1_f0;
189 bp_packet packet_norm_bp2_f0;
191 bp_packet packet_norm_bp2_f0;
190 bp_packet packet_sbm_bp1_f0;
192 bp_packet packet_sbm_bp1_f0;
191 bp_packet packet_sbm_bp2_f0;
193 bp_packet packet_sbm_bp2_f0;
192 ring_node *current_ring_node_to_send_asm_f0;
194 ring_node *current_ring_node_to_send_asm_f0;
195
193
196 unsigned long long int localTime;
194 unsigned long long int localTime;
197
195
198 ASM_init_header( &headerASM );
199
200 // init the ring of the averaged spectral matrices which will be transmitted to the DPU
196 // init the ring of the averaged spectral matrices which will be transmitted to the DPU
201 init_ring( ring_to_send_asm_f0, NB_RING_NODES_ASM_F0, (volatile int*) buffer_asm_f0, TOTAL_SIZE_SM );
197 init_ring( ring_to_send_asm_f0, NB_RING_NODES_ASM_F0, (volatile int*) buffer_asm_f0, TOTAL_SIZE_SM );
202 current_ring_node_to_send_asm_f0 = ring_to_send_asm_f0;
198 current_ring_node_to_send_asm_f0 = ring_to_send_asm_f0;
@@ -335,29 +331,19 rtems_task prc0_task( rtems_task_argumen
335
331
336 if (incomingMsg->event & RTEMS_EVENT_NORM_ASM_F0)
332 if (incomingMsg->event & RTEMS_EVENT_NORM_ASM_F0)
337 {
333 {
338 // // 1) reorganize the ASM and divide
339 // ASM_reorganize_and_divide( incomingMsg->norm->matrix,
340 // asm_f0_reorganized,
341 // nb_sm_before_f0.norm_bp1 );
342 // // 2) convert the float array in a char array
343 // ASM_convert( asm_f0_reorganized, (char*) current_ring_node_to_send_asm_f0->buffer_address );
344 // current_ring_node_to_send_asm_f0->coarseTime = incomingMsg->coarseTime;
345 // current_ring_node_to_send_asm_f0->fineTime = incomingMsg->fineTime;
346 // current_ring_node_to_send_asm_f0->sid = SID_NORM_ASM_F0;
347 // // 3) send the spectral matrix packets
348 // status = rtems_message_queue_send( queue_id, &current_ring_node_to_send_asm_f0, sizeof( ring_node* ) );
349 // // change asm ring node
350 // current_ring_node_to_send_asm_f0 = current_ring_node_to_send_asm_f0->next;
351 // 1) reorganize the ASM and divide
334 // 1) reorganize the ASM and divide
352 ASM_reorganize_and_divide( incomingMsg->norm->matrix,
335 ASM_reorganize_and_divide( incomingMsg->norm->matrix,
353 asm_f0_reorganized,
336 asm_f0_reorganized,
354 nb_sm_before_f0.norm_bp1 );
337 nb_sm_before_f0.norm_bp1 );
355 // 2) convert the float array in a char array
338 // 2) convert the float array in a char array
356 ASM_convert( asm_f0_reorganized, asm_f0_char);
339 ASM_convert( asm_f0_reorganized, (char*) current_ring_node_to_send_asm_f0->buffer_address );
340 current_ring_node_to_send_asm_f0->coarseTime = incomingMsg->coarseTime;
341 current_ring_node_to_send_asm_f0->fineTime = incomingMsg->fineTime;
342 current_ring_node_to_send_asm_f0->sid = SID_NORM_ASM_F0;
357 // 3) send the spectral matrix packets
343 // 3) send the spectral matrix packets
358 set_time( headerASM.time , (unsigned char *) &incomingMsg->coarseTime );
344 status = rtems_message_queue_send( queue_id, &current_ring_node_to_send_asm_f0, sizeof( ring_node* ) );
359 set_time( headerASM.acquisitionTime, (unsigned char *) &incomingMsg->coarseTime );
345 // change asm ring node
360 ASM_send( &headerASM, asm_f0_char, SID_NORM_ASM_F0, &spw_ioctl_send_ASM, queue_id);
346 current_ring_node_to_send_asm_f0 = current_ring_node_to_send_asm_f0->next;
361 }
347 }
362
348
363 }
349 }
@@ -13,8 +13,11 nb_sm_before_bp_asm_f1 nb_sm_before_f1;
13
13
14 //***
14 //***
15 // F1
15 // F1
16 ring_node_asm asm_ring_norm_f1 [ NB_RING_NODES_ASM_NORM_F1 ];
16 ring_node_asm asm_ring_norm_f1 [ NB_RING_NODES_ASM_NORM_F1 ];
17 ring_node_asm asm_ring_burst_sbm_f1[ NB_RING_NODES_ASM_BURST_SBM_F1 ];
17 ring_node_asm asm_ring_burst_sbm_f1 [ NB_RING_NODES_ASM_BURST_SBM_F1 ];
18
19 ring_node ring_to_send_asm_f1 [ NB_RING_NODES_ASM_F1 ];
20 int buffer_asm_f1 [ NB_RING_NODES_ASM_F1 * TOTAL_SIZE_SM ];
18
21
19 float asm_f1_reorganized [ TOTAL_SIZE_SM ];
22 float asm_f1_reorganized [ TOTAL_SIZE_SM ];
20 char asm_f1_char [ TIME_OFFSET_IN_BYTES + (TOTAL_SIZE_SM * 2) ];
23 char asm_f1_char [ TIME_OFFSET_IN_BYTES + (TOTAL_SIZE_SM * 2) ];
@@ -32,7 +35,7 rtems_task avf1_task( rtems_task_argumen
32 rtems_status_code status;
35 rtems_status_code status;
33 rtems_id queue_id_prc1;
36 rtems_id queue_id_prc1;
34 asm_msg msgForMATR;
37 asm_msg msgForMATR;
35 ring_node_sm *ring_node_tab[8];
38 ring_node *ring_node_tab[8];
36 ring_node_asm *current_ring_node_asm_burst_sbm_f1;
39 ring_node_asm *current_ring_node_asm_burst_sbm_f1;
37 ring_node_asm *current_ring_node_asm_norm_f1;
40 ring_node_asm *current_ring_node_asm_norm_f1;
38
41
@@ -67,9 +70,9 rtems_task avf1_task( rtems_task_argumen
67
70
68 //****************************************
71 //****************************************
69 // initialize the mesage for the MATR task
72 // initialize the mesage for the MATR task
70 msgForMATR.event = 0x00; // this composite event will be sent to the PRC1 task
73 msgForMATR.norm = current_ring_node_asm_norm_f1;
71 msgForMATR.burst_sbm = current_ring_node_asm_burst_sbm_f1;
74 msgForMATR.burst_sbm = current_ring_node_asm_burst_sbm_f1;
72 msgForMATR.norm = current_ring_node_asm_norm_f1;
75 msgForMATR.event = 0x00; // this composite event will be sent to the PRC1 task
73 msgForMATR.coarseTime = ring_node_for_averaging_sm_f1->coarseTime;
76 msgForMATR.coarseTime = ring_node_for_averaging_sm_f1->coarseTime;
74 msgForMATR.fineTime = ring_node_for_averaging_sm_f1->fineTime;
77 msgForMATR.fineTime = ring_node_for_averaging_sm_f1->fineTime;
75 //
78 //
@@ -175,19 +178,20 rtems_task prc1_task( rtems_task_argumen
175 asm_msg *incomingMsg;
178 asm_msg *incomingMsg;
176 //
179 //
177 unsigned char sid;
180 unsigned char sid;
178 spw_ioctl_pkt_send spw_ioctl_send_ASM;
179 rtems_status_code status;
181 rtems_status_code status;
180 rtems_id queue_id_send;
182 rtems_id queue_id_send;
181 rtems_id queue_id_q_p1;
183 rtems_id queue_id_q_p1;
182 Header_TM_LFR_SCIENCE_ASM_t headerASM;
184 bp_packet_with_spare packet_norm_bp1;
183 bp_packet_with_spare packet_norm_bp1;
185 bp_packet packet_norm_bp2;
184 bp_packet packet_norm_bp2;
186 bp_packet packet_sbm_bp1;
185 bp_packet packet_sbm_bp1;
187 bp_packet packet_sbm_bp2;
186 bp_packet packet_sbm_bp2;
188 ring_node *current_ring_node_to_send_asm_f1;
187
189
188 unsigned long long int localTime;
190 unsigned long long int localTime;
189
191
190 ASM_init_header( &headerASM );
192 // init the ring of the averaged spectral matrices which will be transmitted to the DPU
193 init_ring( ring_to_send_asm_f1, NB_RING_NODES_ASM_F1, (volatile int*) buffer_asm_f1, TOTAL_SIZE_SM );
194 current_ring_node_to_send_asm_f1 = ring_to_send_asm_f1;
191
195
192 //*************
196 //*************
193 // NORM headers
197 // NORM headers
@@ -318,11 +322,14 rtems_task prc1_task( rtems_task_argumen
318 asm_f1_reorganized,
322 asm_f1_reorganized,
319 nb_sm_before_f1.norm_bp1 );
323 nb_sm_before_f1.norm_bp1 );
320 // 2) convert the float array in a char array
324 // 2) convert the float array in a char array
321 ASM_convert( asm_f1_reorganized, asm_f1_char);
325 ASM_convert( asm_f1_reorganized, (char*) current_ring_node_to_send_asm_f1->buffer_address );
326 current_ring_node_to_send_asm_f1->coarseTime = incomingMsg->coarseTime;
327 current_ring_node_to_send_asm_f1->fineTime = incomingMsg->fineTime;
328 current_ring_node_to_send_asm_f1->sid = SID_NORM_ASM_F1;
322 // 3) send the spectral matrix packets
329 // 3) send the spectral matrix packets
323 set_time( headerASM.time , (unsigned char *) &incomingMsg->coarseTime );
330 status = rtems_message_queue_send( queue_id_send, &current_ring_node_to_send_asm_f1, sizeof( ring_node* ) );
324 set_time( headerASM.acquisitionTime, (unsigned char *) &incomingMsg->coarseTime );
331 // change asm ring node
325 ASM_send( &headerASM, asm_f1_char, SID_NORM_ASM_F1, &spw_ioctl_send_ASM, queue_id_send);
332 current_ring_node_to_send_asm_f1 = current_ring_node_to_send_asm_f1->next;
326 }
333 }
327
334
328 }
335 }
@@ -16,6 +16,9 nb_sm_before_bp_asm_f2 nb_sm_before_f2;
16 ring_node_asm asm_ring_norm_f2 [ NB_RING_NODES_ASM_NORM_F2 ];
16 ring_node_asm asm_ring_norm_f2 [ NB_RING_NODES_ASM_NORM_F2 ];
17 ring_node_asm asm_ring_burst_sbm_f2[ NB_RING_NODES_ASM_BURST_SBM_F2 ];
17 ring_node_asm asm_ring_burst_sbm_f2[ NB_RING_NODES_ASM_BURST_SBM_F2 ];
18
18
19 ring_node ring_to_send_asm_f2 [ NB_RING_NODES_ASM_F2 ];
20 int buffer_asm_f2 [ NB_RING_NODES_ASM_F2 * TOTAL_SIZE_SM ];
21
19 float asm_f2_reorganized [ TOTAL_SIZE_SM ];
22 float asm_f2_reorganized [ TOTAL_SIZE_SM ];
20 char asm_f2_char [ TIME_OFFSET_IN_BYTES + (TOTAL_SIZE_SM * 2) ];
23 char asm_f2_char [ TIME_OFFSET_IN_BYTES + (TOTAL_SIZE_SM * 2) ];
21 float compressed_sm_norm_f2[ TOTAL_SIZE_COMPRESSED_ASM_NORM_F2];
24 float compressed_sm_norm_f2[ TOTAL_SIZE_COMPRESSED_ASM_NORM_F2];
@@ -59,9 +62,9 rtems_task avf2_task( rtems_task_argumen
59
62
60 //****************************************
63 //****************************************
61 // initialize the mesage for the MATR task
64 // initialize the mesage for the MATR task
62 msgForMATR.event = 0x00; // this composite event will be sent to the MATR task
65 msgForMATR.norm = current_ring_node_asm_norm_f2;
63 msgForMATR.burst_sbm = NULL;
66 msgForMATR.burst_sbm = NULL;
64 msgForMATR.norm = current_ring_node_asm_norm_f2;
67 msgForMATR.event = 0x00; // this composite event will be sent to the PRC2 task
65 msgForMATR.coarseTime = ring_node_for_averaging_sm_f2->coarseTime;
68 msgForMATR.coarseTime = ring_node_for_averaging_sm_f2->coarseTime;
66 msgForMATR.fineTime = ring_node_for_averaging_sm_f2->fineTime;
69 msgForMATR.fineTime = ring_node_for_averaging_sm_f2->fineTime;
67 //
70 //
@@ -129,19 +132,20 rtems_task prc2_task( rtems_task_argumen
129 size_t size; // size of the incoming TC packet
132 size_t size; // size of the incoming TC packet
130 asm_msg *incomingMsg;
133 asm_msg *incomingMsg;
131 //
134 //
132 spw_ioctl_pkt_send spw_ioctl_send_ASM;
133 rtems_status_code status;
135 rtems_status_code status;
134 rtems_id queue_id;
136 rtems_id queue_id;
135 rtems_id queue_id_q_p2;
137 rtems_id queue_id_q_p2;
136 Header_TM_LFR_SCIENCE_ASM_t headerASM;
138 bp_packet packet_norm_bp1_f2;
137 bp_packet packet_norm_bp1_f2;
139 bp_packet packet_norm_bp2_f2;
138 bp_packet packet_norm_bp2_f2;
140 ring_node *current_ring_node_to_send_asm_f2;
139
141
140 unsigned long long int localTime;
142 unsigned long long int localTime;
141
143
142 incomingMsg = NULL;
144 // init the ring of the averaged spectral matrices which will be transmitted to the DPU
145 init_ring( ring_to_send_asm_f2, NB_RING_NODES_ASM_F2, (volatile int*) buffer_asm_f2, TOTAL_SIZE_SM );
146 current_ring_node_to_send_asm_f2 = ring_to_send_asm_f2;
143
147
144 ASM_init_header( &headerASM );
148 incomingMsg = NULL;
145
149
146 //*************
150 //*************
147 // NORM headers
151 // NORM headers
@@ -213,11 +217,14 rtems_task prc2_task( rtems_task_argumen
213 asm_f2_reorganized,
217 asm_f2_reorganized,
214 nb_sm_before_f2.norm_bp1 );
218 nb_sm_before_f2.norm_bp1 );
215 // 2) convert the float array in a char array
219 // 2) convert the float array in a char array
216 ASM_convert( asm_f2_reorganized, asm_f2_char);
220 ASM_convert( asm_f2_reorganized, (char*) current_ring_node_to_send_asm_f2->buffer_address );
221 current_ring_node_to_send_asm_f2->coarseTime = incomingMsg->coarseTime;
222 current_ring_node_to_send_asm_f2->fineTime = incomingMsg->fineTime;
223 current_ring_node_to_send_asm_f2->sid = SID_NORM_ASM_F2;
217 // 3) send the spectral matrix packets
224 // 3) send the spectral matrix packets
218 set_time( headerASM.time , (unsigned char *) &incomingMsg->coarseTime );
225 status = rtems_message_queue_send( queue_id, &current_ring_node_to_send_asm_f2, sizeof( ring_node* ) );
219 set_time( headerASM.acquisitionTime, (unsigned char *) &incomingMsg->coarseTime );
226 // change asm ring node
220 ASM_send( &headerASM, asm_f2_char, SID_NORM_ASM_F2, &spw_ioctl_send_ASM, queue_id);
227 current_ring_node_to_send_asm_f2 = current_ring_node_to_send_asm_f2->next;
221 }
228 }
222
229
223 }
230 }
@@ -234,7 +241,7 void reset_nb_sm_f2( void )
234 }
241 }
235
242
236 void SM_average_f2( float *averaged_spec_mat_f2,
243 void SM_average_f2( float *averaged_spec_mat_f2,
237 ring_node_sm *ring_node,
244 ring_node *ring_node,
238 unsigned int nbAverageNormF2 )
245 unsigned int nbAverageNormF2 )
239 {
246 {
240 float sum;
247 float sum;
@@ -17,15 +17,15 unsigned int nb_sm_f0_aux_f2;
17
17
18 //************************
18 //************************
19 // spectral matrices rings
19 // spectral matrices rings
20 ring_node_sm sm_ring_f0[ NB_RING_NODES_SM_F0 ];
20 ring_node sm_ring_f0[ NB_RING_NODES_SM_F0 ];
21 ring_node_sm sm_ring_f1[ NB_RING_NODES_SM_F1 ];
21 ring_node sm_ring_f1[ NB_RING_NODES_SM_F1 ];
22 ring_node_sm sm_ring_f2[ NB_RING_NODES_SM_F2 ];
22 ring_node sm_ring_f2[ NB_RING_NODES_SM_F2 ];
23 ring_node_sm *current_ring_node_sm_f0;
23 ring_node *current_ring_node_sm_f0;
24 ring_node_sm *current_ring_node_sm_f1;
24 ring_node *current_ring_node_sm_f1;
25 ring_node_sm *current_ring_node_sm_f2;
25 ring_node *current_ring_node_sm_f2;
26 ring_node_sm *ring_node_for_averaging_sm_f0;
26 ring_node *ring_node_for_averaging_sm_f0;
27 ring_node_sm *ring_node_for_averaging_sm_f1;
27 ring_node *ring_node_for_averaging_sm_f1;
28 ring_node_sm *ring_node_for_averaging_sm_f2;
28 ring_node *ring_node_for_averaging_sm_f2;
29
29
30 //***********************************************************
30 //***********************************************************
31 // Interrupt Service Routine for spectral matrices processing
31 // Interrupt Service Routine for spectral matrices processing
@@ -261,79 +261,20 void reset_nb_sm( void )
261 nb_sm_f1 = 0;
261 nb_sm_f1 = 0;
262 }
262 }
263
263
264 //void SM_init_rings_alt( void )
265 //{
266 // init_ring( sm_ring_f0, NB_RING_NODES_SM_F0, sm_f0, TOTAL_SIZE_SM );
267 // init_ring( sm_ring_f1, NB_RING_NODES_SM_F1, sm_f0, TOTAL_SIZE_SM );
268 // init_ring( sm_ring_f2, NB_RING_NODES_SM_F2, sm_f0, TOTAL_SIZE_SM );
269
270 // DEBUG_PRINTF1("sm_ring_f0 @%x\n", (unsigned int) sm_ring_f0)
271 // DEBUG_PRINTF1("sm_ring_f1 @%x\n", (unsigned int) sm_ring_f1)
272 // DEBUG_PRINTF1("sm_ring_f2 @%x\n", (unsigned int) sm_ring_f2)
273 // DEBUG_PRINTF1("sm_f0 @%x\n", (unsigned int) sm_f0)
274 // DEBUG_PRINTF1("sm_f1 @%x\n", (unsigned int) sm_f1)
275 // DEBUG_PRINTF1("sm_f2 @%x\n", (unsigned int) sm_f2)
276 //}
277
278 void SM_init_rings( void )
264 void SM_init_rings( void )
279 {
265 {
280 unsigned char i;
266 init_ring( sm_ring_f0, NB_RING_NODES_SM_F0, sm_f0, TOTAL_SIZE_SM );
281 // F0 RING
267 init_ring( sm_ring_f1, NB_RING_NODES_SM_F1, sm_f1, TOTAL_SIZE_SM );
282 sm_ring_f0[0].next = (ring_node_sm*) &sm_ring_f0[1];
268 init_ring( sm_ring_f2, NB_RING_NODES_SM_F2, sm_f2, TOTAL_SIZE_SM );
283 sm_ring_f0[0].previous = (ring_node_sm*) &sm_ring_f0[NB_RING_NODES_SM_F0-1];
269
284 sm_ring_f0[0].buffer_address =
270 DEBUG_PRINTF1("sm_ring_f0 @%x\n", (unsigned int) sm_ring_f0)
285 (int) &sm_f0[ 0 ];
271 DEBUG_PRINTF1("sm_ring_f1 @%x\n", (unsigned int) sm_ring_f1)
286 sm_ring_f0[NB_RING_NODES_SM_F0-1].next = (ring_node_sm*) &sm_ring_f0[0];
272 DEBUG_PRINTF1("sm_ring_f2 @%x\n", (unsigned int) sm_ring_f2)
287 sm_ring_f0[NB_RING_NODES_SM_F0-1].previous = (ring_node_sm*) &sm_ring_f0[NB_RING_NODES_SM_F0-2];
273 DEBUG_PRINTF1("sm_f0 @%x\n", (unsigned int) sm_f0)
288 sm_ring_f0[NB_RING_NODES_SM_F0-1].buffer_address =
274 DEBUG_PRINTF1("sm_f1 @%x\n", (unsigned int) sm_f1)
289 (int) &sm_f0[ (NB_RING_NODES_SM_F0-1) * TOTAL_SIZE_SM ];
275 DEBUG_PRINTF1("sm_f2 @%x\n", (unsigned int) sm_f2)
290 for(i=1; i<NB_RING_NODES_SM_F0-1; i++)
291 {
292 sm_ring_f0[i].next = (ring_node_sm*) &sm_ring_f0[i+1];
293 sm_ring_f0[i].previous = (ring_node_sm*) &sm_ring_f0[i-1];
294 sm_ring_f0[i].buffer_address =
295 (int) &sm_f0[ i * TOTAL_SIZE_SM ];
296 }
297 // F1 RING
298 sm_ring_f1[0].next = (ring_node_sm*) &sm_ring_f1[1];
299 sm_ring_f1[0].previous = (ring_node_sm*) &sm_ring_f1[NB_RING_NODES_SM_F1-1];
300 sm_ring_f1[0].buffer_address =
301 (int) &sm_f1[ 0 ];
302 sm_ring_f1[NB_RING_NODES_SM_F1-1].next = (ring_node_sm*) &sm_ring_f1[0];
303 sm_ring_f1[NB_RING_NODES_SM_F1-1].previous = (ring_node_sm*) &sm_ring_f1[NB_RING_NODES_SM_F1-2];
304 sm_ring_f1[NB_RING_NODES_SM_F1-1].buffer_address =
305 (int) &sm_f1[ (NB_RING_NODES_SM_F1-1) * TOTAL_SIZE_SM ];
306 for(i=1; i<NB_RING_NODES_SM_F1-1; i++)
307 {
308 sm_ring_f1[i].next = (ring_node_sm*) &sm_ring_f1[i+1];
309 sm_ring_f1[i].previous = (ring_node_sm*) &sm_ring_f1[i-1];
310 sm_ring_f1[i].buffer_address =
311 (int) &sm_f1[ i * TOTAL_SIZE_SM ];
312 }
313 // F2 RING
314 sm_ring_f2[0].next = (ring_node_sm*) &sm_ring_f2[1];
315 sm_ring_f2[0].previous = (ring_node_sm*) &sm_ring_f2[NB_RING_NODES_SM_F2-1];
316 sm_ring_f2[0].buffer_address =
317 (int) &sm_f2[ 0 ];
318 sm_ring_f2[NB_RING_NODES_SM_F2-1].next = (ring_node_sm*) &sm_ring_f2[0];
319 sm_ring_f2[NB_RING_NODES_SM_F2-1].previous = (ring_node_sm*) &sm_ring_f2[NB_RING_NODES_SM_F2-2];
320 sm_ring_f2[NB_RING_NODES_SM_F2-1].buffer_address =
321 (int) &sm_f2[ (NB_RING_NODES_SM_F2-1) * TOTAL_SIZE_SM ];
322 for(i=1; i<NB_RING_NODES_SM_F2-1; i++)
323 {
324 sm_ring_f2[i].next = (ring_node_sm*) &sm_ring_f2[i+1];
325 sm_ring_f2[i].previous = (ring_node_sm*) &sm_ring_f2[i-1];
326 sm_ring_f2[i].buffer_address =
327 (int) &sm_f2[ i * TOTAL_SIZE_SM ];
328 }
329 DEBUG_PRINTF1("asm_ring_f0 @%x\n", (unsigned int) sm_ring_f0)
330 DEBUG_PRINTF1("asm_ring_f1 @%x\n", (unsigned int) sm_ring_f1)
331 DEBUG_PRINTF1("asm_ring_f2 @%x\n", (unsigned int) sm_ring_f2)
332 spectral_matrix_regs->f0_0_address = sm_ring_f0[0].buffer_address;
333 DEBUG_PRINTF1("spectral_matrix_regs->matrixF0_Address0 @%x\n", spectral_matrix_regs->f0_0_address)
334 }
276 }
335
277
336
337 void ASM_generic_init_ring( ring_node_asm *ring, unsigned char nbNodes )
278 void ASM_generic_init_ring( ring_node_asm *ring, unsigned char nbNodes )
338 {
279 {
339 unsigned char i;
280 unsigned char i;
@@ -358,116 +299,6 void SM_reset_current_ring_nodes( void )
358 ring_node_for_averaging_sm_f2 = sm_ring_f2;
299 ring_node_for_averaging_sm_f2 = sm_ring_f2;
359 }
300 }
360
301
361 void ASM_init_header( Header_TM_LFR_SCIENCE_ASM_t *header)
362 {
363 header->targetLogicalAddress = CCSDS_DESTINATION_ID;
364 header->protocolIdentifier = CCSDS_PROTOCOLE_ID;
365 header->reserved = 0x00;
366 header->userApplication = CCSDS_USER_APP;
367 header->packetID[0] = (unsigned char) (APID_TM_SCIENCE_NORMAL_BURST >> 8);
368 header->packetID[1] = (unsigned char) (APID_TM_SCIENCE_NORMAL_BURST);
369 header->packetSequenceControl[0] = 0xc0;
370 header->packetSequenceControl[1] = 0x00;
371 header->packetLength[0] = 0x00;
372 header->packetLength[1] = 0x00;
373 // DATA FIELD HEADER
374 header->spare1_pusVersion_spare2 = 0x10;
375 header->serviceType = TM_TYPE_LFR_SCIENCE; // service type
376 header->serviceSubType = TM_SUBTYPE_LFR_SCIENCE; // service subtype
377 header->destinationID = TM_DESTINATION_ID_GROUND;
378 header->time[0] = 0x00;
379 header->time[0] = 0x00;
380 header->time[0] = 0x00;
381 header->time[0] = 0x00;
382 header->time[0] = 0x00;
383 header->time[0] = 0x00;
384 // AUXILIARY DATA HEADER
385 header->sid = 0x00;
386 header->biaStatusInfo = 0x00;
387 header->pa_lfr_pkt_cnt_asm = 0x00;
388 header->pa_lfr_pkt_nr_asm = 0x00;
389 header->pa_lfr_asm_blk_nr[0] = 0x00; // BLK_NR MSB
390 header->pa_lfr_asm_blk_nr[1] = 0x00; // BLK_NR LSB
391 }
392
393 void ASM_send(Header_TM_LFR_SCIENCE_ASM_t *header, char *spectral_matrix,
394 unsigned int sid, spw_ioctl_pkt_send *spw_ioctl_send, rtems_id queue_id)
395 {
396 unsigned int i;
397 unsigned int length = 0;
398 rtems_status_code status;
399
400 for (i=0; i<2; i++)
401 {
402 // (1) BUILD THE DATA
403 switch(sid)
404 {
405 case SID_NORM_ASM_F0:
406 spw_ioctl_send->dlen = TOTAL_SIZE_ASM_F0_IN_BYTES / 2; // 2 packets will be sent
407 spw_ioctl_send->data = &spectral_matrix[
408 ( (ASM_F0_INDICE_START + (i*NB_BINS_PER_PKT_ASM_F0) ) * NB_VALUES_PER_SM ) * 2
409 ];
410 length = PACKET_LENGTH_TM_LFR_SCIENCE_ASM_F0;
411 header->pa_lfr_asm_blk_nr[0] = (unsigned char) ( (NB_BINS_PER_PKT_ASM_F0) >> 8 ); // BLK_NR MSB
412 header->pa_lfr_asm_blk_nr[1] = (unsigned char) (NB_BINS_PER_PKT_ASM_F0); // BLK_NR LSB
413 break;
414 case SID_NORM_ASM_F1:
415 spw_ioctl_send->dlen = TOTAL_SIZE_ASM_F1_IN_BYTES / 2; // 2 packets will be sent
416 spw_ioctl_send->data = &spectral_matrix[
417 ( (ASM_F1_INDICE_START + (i*NB_BINS_PER_PKT_ASM_F1) ) * NB_VALUES_PER_SM ) * 2
418 ];
419 length = PACKET_LENGTH_TM_LFR_SCIENCE_ASM_F1;
420 header->pa_lfr_asm_blk_nr[0] = (unsigned char) ( (NB_BINS_PER_PKT_ASM_F1) >> 8 ); // BLK_NR MSB
421 header->pa_lfr_asm_blk_nr[1] = (unsigned char) (NB_BINS_PER_PKT_ASM_F1); // BLK_NR LSB
422 break;
423 case SID_NORM_ASM_F2:
424 spw_ioctl_send->dlen = TOTAL_SIZE_ASM_F2_IN_BYTES / 2; // 2 packets will be sent
425 spw_ioctl_send->data = &spectral_matrix[
426 ( (ASM_F2_INDICE_START + (i*NB_BINS_PER_PKT_ASM_F2) ) * NB_VALUES_PER_SM ) * 2
427 ];
428 length = PACKET_LENGTH_TM_LFR_SCIENCE_ASM_F2;
429 header->pa_lfr_asm_blk_nr[0] = (unsigned char) ( (NB_BINS_PER_PKT_ASM_F2) >> 8 ); // BLK_NR MSB
430 header->pa_lfr_asm_blk_nr[1] = (unsigned char) (NB_BINS_PER_PKT_ASM_F2); // BLK_NR LSB
431 break;
432 default:
433 PRINTF1("ERR *** in ASM_send *** unexpected sid %d\n", sid)
434 break;
435 }
436 spw_ioctl_send->hlen = HEADER_LENGTH_TM_LFR_SCIENCE_ASM + CCSDS_PROTOCOLE_EXTRA_BYTES;
437 spw_ioctl_send->hdr = (char *) header;
438 spw_ioctl_send->options = 0;
439
440 // (2) BUILD THE HEADER
441 increment_seq_counter_source_id( header->packetSequenceControl, sid );
442 header->packetLength[0] = (unsigned char) (length>>8);
443 header->packetLength[1] = (unsigned char) (length);
444 header->sid = (unsigned char) sid; // SID
445 header->pa_lfr_pkt_cnt_asm = 2;
446 header->pa_lfr_pkt_nr_asm = (unsigned char) (i+1);
447
448 // (3) SET PACKET TIME
449 header->time[0] = (unsigned char) (time_management_regs->coarse_time>>24);
450 header->time[1] = (unsigned char) (time_management_regs->coarse_time>>16);
451 header->time[2] = (unsigned char) (time_management_regs->coarse_time>>8);
452 header->time[3] = (unsigned char) (time_management_regs->coarse_time);
453 header->time[4] = (unsigned char) (time_management_regs->fine_time>>8);
454 header->time[5] = (unsigned char) (time_management_regs->fine_time);
455 //
456 header->acquisitionTime[0] = header->time[0];
457 header->acquisitionTime[1] = header->time[1];
458 header->acquisitionTime[2] = header->time[2];
459 header->acquisitionTime[3] = header->time[3];
460 header->acquisitionTime[4] = header->time[4];
461 header->acquisitionTime[5] = header->time[5];
462
463 // (4) SEND PACKET
464 status = rtems_message_queue_send( queue_id, spw_ioctl_send, ACTION_MSG_SPW_IOCTL_SEND_SIZE);
465 if (status != RTEMS_SUCCESSFUL) {
466 printf("in ASM_send *** ERR %d\n", (int) status);
467 }
468 }
469 }
470
471 //*****************
302 //*****************
472 // Basic Parameters
303 // Basic Parameters
473
304
@@ -619,7 +450,7 unsigned long long int get_acquisition_t
619 }
450 }
620
451
621 void close_matrix_actions(unsigned int *nb_sm, unsigned int nb_sm_before_avf, rtems_id avf_task_id,
452 void close_matrix_actions(unsigned int *nb_sm, unsigned int nb_sm_before_avf, rtems_id avf_task_id,
622 ring_node_sm *node_for_averaging, ring_node_sm *ringNode,
453 ring_node *node_for_averaging, ring_node *ringNode,
623 unsigned long long int time )
454 unsigned long long int time )
624 {
455 {
625 unsigned char *timePtr;
456 unsigned char *timePtr;
General Comments 0
You need to be logged in to leave comments. Login now