@@ -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.5) on: Tue Mar |
|
3 | # Generated by qmake (2.01a) (Qt 4.8.5) on: Tue Mar 11 15:58:37 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 | |
@@ -10,7 +10,7 | |||||
10 |
|
10 | |||
11 | CC = sparc-rtems-gcc |
|
11 | CC = sparc-rtems-gcc | |
12 | CXX = sparc-rtems-g++ |
|
12 | CXX = sparc-rtems-g++ | |
13 | DEFINES = -DSW_VERSION_N1=1 -DSW_VERSION_N2=0 -DSW_VERSION_N3=0 -DSW_VERSION_N4=3 -DPRINT_MESSAGES_ON_CONSOLE |
|
13 | DEFINES = -DSW_VERSION_N1=1 -DSW_VERSION_N2=0 -DSW_VERSION_N3=0 -DSW_VERSION_N4=3 -DPRINT_MESSAGES_ON_CONSOLE -DDEBUG_MESSAGES | |
14 | CFLAGS = -pipe -O3 -Wall $(DEFINES) |
|
14 | CFLAGS = -pipe -O3 -Wall $(DEFINES) | |
15 | CXXFLAGS = -pipe -O3 -Wall $(DEFINES) |
|
15 | CXXFLAGS = -pipe -O3 -Wall $(DEFINES) | |
16 | INCPATH = -I/usr/lib64/qt4/mkspecs/linux-g++ -I. -I../src -I../header -I../../LFR_basic-parameters |
|
16 | INCPATH = -I/usr/lib64/qt4/mkspecs/linux-g++ -I. -I../src -I../header -I../../LFR_basic-parameters |
@@ -1,7 +1,7 | |||||
1 | TEMPLATE = app |
|
1 | TEMPLATE = app | |
2 | # CONFIG += console v8 sim |
|
2 | # CONFIG += console v8 sim | |
3 | # CONFIG options = verbose *** boot_messages *** debug_messages *** cpu_usage_report *** stack_report |
|
3 | # CONFIG options = verbose *** boot_messages *** debug_messages *** cpu_usage_report *** stack_report *** vhdl_dev | |
4 | CONFIG += console verbose |
|
4 | CONFIG += console verbose debug_messages | |
5 | CONFIG -= qt |
|
5 | CONFIG -= qt | |
6 |
|
6 | |||
7 | include(./sparc.pri) |
|
7 | include(./sparc.pri) | |
@@ -13,6 +13,10 DEFINES += SW_VERSION_N2=0 # minor | |||||
13 | DEFINES += SW_VERSION_N3=0 # patch |
|
13 | DEFINES += SW_VERSION_N3=0 # patch | |
14 | DEFINES += SW_VERSION_N4=3 # internal |
|
14 | DEFINES += SW_VERSION_N4=3 # internal | |
15 |
|
15 | |||
|
16 | contains( CONFIG, vhdl_dev ) { | |||
|
17 | DEFINES += VHDL_DEV | |||
|
18 | } | |||
|
19 | ||||
16 | contains( CONFIG, verbose ) { |
|
20 | contains( CONFIG, verbose ) { | |
17 | DEFINES += PRINT_MESSAGES_ON_CONSOLE |
|
21 | DEFINES += PRINT_MESSAGES_ON_CONSOLE | |
18 | } |
|
22 | } |
@@ -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.0. |
|
3 | <!-- Written by QtCreator 3.0.1, 2014-03-13T15:53:26. --> | |
4 | <qtcreator> |
|
4 | <qtcreator> | |
5 | <data> |
|
5 | <data> | |
6 | <variable>ProjectExplorer.Project.ActiveTarget</variable> |
|
6 | <variable>ProjectExplorer.Project.ActiveTarget</variable> |
@@ -35,9 +35,6 typedef struct ring_node | |||||
35 | #define NB_RING_NODES_F0 3 // AT LEAST 3 |
|
35 | #define NB_RING_NODES_F0 3 // AT LEAST 3 | |
36 | #define NB_RING_NODES_F1 5 // AT LEAST 3 |
|
36 | #define NB_RING_NODES_F1 5 // AT LEAST 3 | |
37 | #define NB_RING_NODES_F2 5 // AT LEAST 3 |
|
37 | #define NB_RING_NODES_F2 5 // AT LEAST 3 | |
38 | #define NB_RING_NODES_ASM_F0 12 // AT LEAST 3 |
|
|||
39 | #define NB_RING_NODES_ASM_F1 2 // AT LEAST 3 |
|
|||
40 | #define NB_RING_NODES_ASM_F2 2 // AT LEAST 3 |
|
|||
41 |
|
38 | |||
42 | //********** |
|
39 | //********** | |
43 | // LFR MODES |
|
40 | // LFR MODES | |
@@ -107,8 +104,14 typedef struct ring_node | |||||
107 | #define REGS_ADDR_GPTIMER 0x80000300 |
|
104 | #define REGS_ADDR_GPTIMER 0x80000300 | |
108 | #define REGS_ADDR_GRSPW 0x80000500 |
|
105 | #define REGS_ADDR_GRSPW 0x80000500 | |
109 | #define REGS_ADDR_TIME_MANAGEMENT 0x80000600 |
|
106 | #define REGS_ADDR_TIME_MANAGEMENT 0x80000600 | |
|
107 | ||||
|
108 | #ifdef VHDL_DEV | |||
|
109 | #define REGS_ADDR_SPECTRAL_MATRIX 0x80000f00 | |||
|
110 | #define REGS_ADDR_WAVEFORM_PICKER 0x80000f40 | |||
|
111 | #else | |||
110 | #define REGS_ADDR_SPECTRAL_MATRIX 0x80000f00 |
|
112 | #define REGS_ADDR_SPECTRAL_MATRIX 0x80000f00 | |
111 | #define REGS_ADDR_WAVEFORM_PICKER 0x80000f20 |
|
113 | #define REGS_ADDR_WAVEFORM_PICKER 0x80000f20 | |
|
114 | #endif | |||
112 |
|
115 | |||
113 | #define APBUART_CTRL_REG_MASK_DB 0xfffff7ff |
|
116 | #define APBUART_CTRL_REG_MASK_DB 0xfffff7ff | |
114 | #define APBUART_CTRL_REG_MASK_TE 0x00000002 |
|
117 | #define APBUART_CTRL_REG_MASK_TE 0x00000002 | |
@@ -161,9 +164,9 typedef struct ring_node | |||||
161 | #define TASK_PRIORITY_HOUS 30 |
|
164 | #define TASK_PRIORITY_HOUS 30 | |
162 | #define TASK_PRIORITY_CWF1 35 // CWF1 and CWF2 are never running together |
|
165 | #define TASK_PRIORITY_CWF1 35 // CWF1 and CWF2 are never running together | |
163 | #define TASK_PRIORITY_CWF2 35 // |
|
166 | #define TASK_PRIORITY_CWF2 35 // | |
|
167 | #define TASK_PRIORITY_SWBD 37 // SWBD has a lower priority than WFRM, this is to extract the snapshot before sending it | |||
164 | #define TASK_PRIORITY_WFRM 40 |
|
168 | #define TASK_PRIORITY_WFRM 40 | |
165 | #define TASK_PRIORITY_CWF3 40 // there is a printf in this function, be careful with its priority wrt CWF1 |
|
169 | #define TASK_PRIORITY_CWF3 40 // there is a printf in this function, be careful with its priority wrt CWF1 | |
166 | #define TASK_PRIORITY_SWBD 40 |
|
|||
167 | #define TASK_PRIORITY_SEND 45 |
|
170 | #define TASK_PRIORITY_SEND 45 | |
168 | #define TASK_PRIORITY_RECV 50 |
|
171 | #define TASK_PRIORITY_RECV 50 | |
169 | #define TASK_PRIORITY_ACTN 50 |
|
172 | #define TASK_PRIORITY_ACTN 50 |
@@ -1,10 +1,13 | |||||
1 | #ifndef FSW_PARAMS_PROCESSING_H |
|
1 | #ifndef FSW_PARAMS_PROCESSING_H | |
2 | #define FSW_PARAMS_PROCESSING_H |
|
2 | #define FSW_PARAMS_PROCESSING_H | |
3 |
|
3 | |||
4 |
#define NB_BINS_PER_SM |
|
4 | #define NB_BINS_PER_SM 128 | |
5 |
#define NB_VALUES_PER_SM |
|
5 | #define NB_VALUES_PER_SM 25 | |
6 | #define TOTAL_SIZE_SM 3200 // 25 * 128 |
|
6 | #define TOTAL_SIZE_SM 3200 // 25 * 128 | |
7 | #define SM_HEADER 0 // |
|
7 | // | |
|
8 | #define NB_RING_NODES_ASM_F0 12 // AT LEAST 3 | |||
|
9 | #define NB_RING_NODES_ASM_F1 2 // AT LEAST 3 | |||
|
10 | #define NB_RING_NODES_ASM_F2 2 // AT LEAST 3 | |||
8 | // |
|
11 | // | |
9 | #define NB_BINS_PER_ASM_F0 88 |
|
12 | #define NB_BINS_PER_ASM_F0 88 | |
10 | #define NB_BINS_PER_PKT_ASM_F0 44 |
|
13 | #define NB_BINS_PER_PKT_ASM_F0 44 |
@@ -12,9 +12,9 | |||||
12 | #include "fsw_spacewire.h" |
|
12 | #include "fsw_spacewire.h" | |
13 | #include "basic_parameters.h" |
|
13 | #include "basic_parameters.h" | |
14 |
|
14 | |||
15 |
extern volatile int sm_f0[ ] |
|
15 | extern volatile int sm_f0[ ]; | |
16 |
extern volatile int sm_f1[ ] |
|
16 | extern volatile int sm_f1[ ]; | |
17 |
extern volatile int sm_f2[ ] |
|
17 | extern volatile int sm_f2[ ]; | |
18 |
|
18 | |||
19 | // parameters |
|
19 | // parameters | |
20 | extern struct param_local_str param_local; |
|
20 | extern struct param_local_str param_local; |
@@ -81,6 +81,15 typedef struct { | |||||
81 | volatile int matrixFO_Address1; |
|
81 | volatile int matrixFO_Address1; | |
82 | volatile int matrixF1_Address; |
|
82 | volatile int matrixF1_Address; | |
83 | volatile int matrixF2_Address; |
|
83 | volatile int matrixF2_Address; | |
|
84 | volatile int coarse_time_F0_0; | |||
|
85 | volatile int coarse_time_F0_1; | |||
|
86 | volatile int coarse_time_F1; | |||
|
87 | volatile int coarse_time_F2; | |||
|
88 | volatile int fine_time_FO_0; | |||
|
89 | volatile int fine_time_F0_1; | |||
|
90 | volatile int fine_time_F1; | |||
|
91 | volatile int fine_time_F2; | |||
|
92 | volatile int debug; | |||
84 | } spectral_matrix_regs_t; |
|
93 | } spectral_matrix_regs_t; | |
85 |
|
94 | |||
86 | #endif // GRLIB_REGS_H_INCLUDED |
|
95 | #endif // GRLIB_REGS_H_INCLUDED |
@@ -39,8 +39,8 int restart_science_tasks(); | |||||
39 | int suspend_science_tasks(); |
|
39 | int suspend_science_tasks(); | |
40 | void launch_waveform_picker( unsigned char mode ); |
|
40 | void launch_waveform_picker( unsigned char mode ); | |
41 | void launch_spectral_matrix( unsigned char mode ); |
|
41 | void launch_spectral_matrix( unsigned char mode ); | |
42 |
void |
|
42 | void set_irq_on_new_ready_matrix(unsigned char value ); | |
43 | void disable_irq_on_new_ready_matrix( void ); |
|
43 | void set_run_matrix_spectral( unsigned char value ); | |
44 | void launch_spectral_matrix_simu( unsigned char mode ); |
|
44 | void launch_spectral_matrix_simu( unsigned char mode ); | |
45 |
|
45 | |||
46 | // other functions |
|
46 | // other functions |
@@ -42,6 +42,7 extern unsigned char lfrCurrentMode; | |||||
42 |
|
42 | |||
43 | //********** |
|
43 | //********** | |
44 | // RTEMS_ISR |
|
44 | // RTEMS_ISR | |
|
45 | void reset_extractSWF( void ); | |||
45 | rtems_isr waveforms_isr( rtems_vector_number vector ); |
|
46 | rtems_isr waveforms_isr( rtems_vector_number vector ); | |
46 |
|
47 | |||
47 | //*********** |
|
48 | //*********** | |
@@ -69,7 +70,8 int send_waveform_CWF3_light( volatile i | |||||
69 | // |
|
70 | // | |
70 | void compute_acquisition_time(unsigned int coarseTime, unsigned int fineTime, |
|
71 | void compute_acquisition_time(unsigned int coarseTime, unsigned int fineTime, | |
71 | unsigned int sid, unsigned char pa_lfr_pkt_nr, unsigned char *acquisitionTime ); |
|
72 | unsigned int sid, unsigned char pa_lfr_pkt_nr, unsigned char *acquisitionTime ); | |
72 | void build_snapshot_from_ring( void ); |
|
73 | void build_snapshot_from_ring(ring_node *ring_node_to_send , unsigned char frequencyChannel ); | |
|
74 | void build_acquisition_time( unsigned long long int * acquisitionTimeAslong, ring_node *current_ring_node ); | |||
73 | // |
|
75 | // | |
74 | rtems_id get_pkts_queue_id( void ); |
|
76 | rtems_id get_pkts_queue_id( void ); | |
75 |
|
77 |
@@ -46,9 +46,10 volatile int wf_cont_f3_b [ (NB_SAMPL | |||||
46 | char wf_cont_f3_light[ (NB_SAMPLES_PER_SNAPSHOT) * NB_BYTES_CWF3_LIGHT_BLK + TIME_OFFSET_IN_BYTES ] __attribute__((aligned(0x100))); |
|
46 | char wf_cont_f3_light[ (NB_SAMPLES_PER_SNAPSHOT) * NB_BYTES_CWF3_LIGHT_BLK + TIME_OFFSET_IN_BYTES ] __attribute__((aligned(0x100))); | |
47 |
|
47 | |||
48 | // SPECTRAL MATRICES GLOBAL VARIABLES |
|
48 | // SPECTRAL MATRICES GLOBAL VARIABLES | |
49 | volatile int sm_f0[ NB_RING_NODES_ASM_F0 ][ TIME_OFFSET + TOTAL_SIZE_SM + 62 ] __attribute__((aligned(0x100))); |
|
49 | // alignment constraints for the spectral matrices buffers => the first data after the time (8 bytes) shall be aligned on 0x00 | |
50 |
volatile int sm_f |
|
50 | volatile int sm_f0[ NB_RING_NODES_ASM_F0 * TOTAL_SIZE_SM ] __attribute__((aligned(0x100))); | |
51 |
volatile int sm_f |
|
51 | volatile int sm_f1[ NB_RING_NODES_ASM_F1 * TOTAL_SIZE_SM ] __attribute__((aligned(0x100))); | |
|
52 | volatile int sm_f2[ NB_RING_NODES_ASM_F2 * TOTAL_SIZE_SM ] __attribute__((aligned(0x100))); | |||
52 |
|
53 | |||
53 | // APB CONFIGURATION REGISTERS |
|
54 | // APB CONFIGURATION REGISTERS | |
54 | time_management_regs_t *time_management_regs = (time_management_regs_t*) REGS_ADDR_TIME_MANAGEMENT; |
|
55 | time_management_regs_t *time_management_regs = (time_management_regs_t*) REGS_ADDR_TIME_MANAGEMENT; |
@@ -36,20 +36,63 void init_sm_rings( void ) | |||||
36 | // F0 RING |
|
36 | // F0 RING | |
37 | sm_ring_f0[0].next = (ring_node*) &sm_ring_f0[1]; |
|
37 | sm_ring_f0[0].next = (ring_node*) &sm_ring_f0[1]; | |
38 | sm_ring_f0[0].previous = (ring_node*) &sm_ring_f0[NB_RING_NODES_ASM_F0-1]; |
|
38 | sm_ring_f0[0].previous = (ring_node*) &sm_ring_f0[NB_RING_NODES_ASM_F0-1]; | |
39 |
sm_ring_f0[0].buffer_address = |
|
39 | sm_ring_f0[0].buffer_address = | |
|
40 | (int) &sm_f0[ 0 ]; | |||
40 |
|
41 | |||
41 | sm_ring_f0[NB_RING_NODES_ASM_F0-1].next = (ring_node*) &sm_ring_f0[0]; |
|
42 | sm_ring_f0[NB_RING_NODES_ASM_F0-1].next = (ring_node*) &sm_ring_f0[0]; | |
42 | sm_ring_f0[NB_RING_NODES_ASM_F0-1].previous = (ring_node*) &sm_ring_f0[NB_RING_NODES_ASM_F0-2]; |
|
43 | sm_ring_f0[NB_RING_NODES_ASM_F0-1].previous = (ring_node*) &sm_ring_f0[NB_RING_NODES_ASM_F0-2]; | |
43 |
sm_ring_f0[NB_RING_NODES_ASM_F0-1].buffer_address = |
|
44 | sm_ring_f0[NB_RING_NODES_ASM_F0-1].buffer_address = | |
|
45 | (int) &sm_f0[ (NB_RING_NODES_ASM_F0-1) * TOTAL_SIZE_SM ]; | |||
44 |
|
46 | |||
45 | for(i=1; i<NB_RING_NODES_ASM_F0-1; i++) |
|
47 | for(i=1; i<NB_RING_NODES_ASM_F0-1; i++) | |
46 | { |
|
48 | { | |
47 | sm_ring_f0[i].next = (ring_node*) &sm_ring_f0[i+1]; |
|
49 | sm_ring_f0[i].next = (ring_node*) &sm_ring_f0[i+1]; | |
48 | sm_ring_f0[i].previous = (ring_node*) &sm_ring_f0[i-1]; |
|
50 | sm_ring_f0[i].previous = (ring_node*) &sm_ring_f0[i-1]; | |
49 |
sm_ring_f0[i].buffer_address = |
|
51 | sm_ring_f0[i].buffer_address = | |
|
52 | (int) &sm_f0[ i * TOTAL_SIZE_SM ]; | |||
|
53 | } | |||
|
54 | ||||
|
55 | // F1 RING | |||
|
56 | sm_ring_f1[0].next = (ring_node*) &sm_ring_f1[1]; | |||
|
57 | sm_ring_f1[0].previous = (ring_node*) &sm_ring_f1[NB_RING_NODES_ASM_F1-1]; | |||
|
58 | sm_ring_f1[0].buffer_address = | |||
|
59 | (int) &sm_f1[ 0 ]; | |||
|
60 | ||||
|
61 | sm_ring_f1[NB_RING_NODES_ASM_F1-1].next = (ring_node*) &sm_ring_f1[0]; | |||
|
62 | sm_ring_f1[NB_RING_NODES_ASM_F1-1].previous = (ring_node*) &sm_ring_f1[NB_RING_NODES_ASM_F1-2]; | |||
|
63 | sm_ring_f1[NB_RING_NODES_ASM_F1-1].buffer_address = | |||
|
64 | (int) &sm_f1[ (NB_RING_NODES_ASM_F1-1) * TOTAL_SIZE_SM ]; | |||
|
65 | ||||
|
66 | for(i=1; i<NB_RING_NODES_ASM_F1-1; i++) | |||
|
67 | { | |||
|
68 | sm_ring_f1[i].next = (ring_node*) &sm_ring_f1[i+1]; | |||
|
69 | sm_ring_f1[i].previous = (ring_node*) &sm_ring_f1[i-1]; | |||
|
70 | sm_ring_f1[i].buffer_address = | |||
|
71 | (int) &sm_f1[ i * TOTAL_SIZE_SM ]; | |||
|
72 | } | |||
|
73 | ||||
|
74 | // F2 RING | |||
|
75 | sm_ring_f2[0].next = (ring_node*) &sm_ring_f2[1]; | |||
|
76 | sm_ring_f2[0].previous = (ring_node*) &sm_ring_f2[NB_RING_NODES_ASM_F2-1]; | |||
|
77 | sm_ring_f2[0].buffer_address = | |||
|
78 | (int) &sm_f2[ 0 ]; | |||
|
79 | ||||
|
80 | sm_ring_f2[NB_RING_NODES_ASM_F2-1].next = (ring_node*) &sm_ring_f2[0]; | |||
|
81 | sm_ring_f2[NB_RING_NODES_ASM_F2-1].previous = (ring_node*) &sm_ring_f2[NB_RING_NODES_ASM_F2-2]; | |||
|
82 | sm_ring_f2[NB_RING_NODES_ASM_F2-1].buffer_address = | |||
|
83 | (int) &sm_f2[ (NB_RING_NODES_ASM_F2-1) * TOTAL_SIZE_SM ]; | |||
|
84 | ||||
|
85 | for(i=1; i<NB_RING_NODES_ASM_F2-1; i++) | |||
|
86 | { | |||
|
87 | sm_ring_f2[i].next = (ring_node*) &sm_ring_f2[i+1]; | |||
|
88 | sm_ring_f2[i].previous = (ring_node*) &sm_ring_f2[i-1]; | |||
|
89 | sm_ring_f2[i].buffer_address = | |||
|
90 | (int) &sm_f2[ i * TOTAL_SIZE_SM ]; | |||
50 | } |
|
91 | } | |
51 |
|
92 | |||
52 | DEBUG_PRINTF1("asm_ring_f0 @%x\n", (unsigned int) sm_ring_f0) |
|
93 | DEBUG_PRINTF1("asm_ring_f0 @%x\n", (unsigned int) sm_ring_f0) | |
|
94 | DEBUG_PRINTF1("asm_ring_f1 @%x\n", (unsigned int) sm_ring_f1) | |||
|
95 | DEBUG_PRINTF1("asm_ring_f2 @%x\n", (unsigned int) sm_ring_f2) | |||
53 |
|
96 | |||
54 | spectral_matrix_regs->matrixF0_Address0 = sm_ring_f0[0].buffer_address; |
|
97 | spectral_matrix_regs->matrixF0_Address0 = sm_ring_f0[0].buffer_address; | |
55 | DEBUG_PRINTF1("spectral_matrix_regs->matrixF0_Address0 @%x\n", spectral_matrix_regs->matrixF0_Address0) |
|
98 | DEBUG_PRINTF1("spectral_matrix_regs->matrixF0_Address0 @%x\n", spectral_matrix_regs->matrixF0_Address0) | |
@@ -58,6 +101,9 void init_sm_rings( void ) | |||||
58 | void reset_current_sm_ring_nodes( void ) |
|
101 | void reset_current_sm_ring_nodes( void ) | |
59 | { |
|
102 | { | |
60 |
current_ring_node_sm_f0 |
|
103 | current_ring_node_sm_f0 = sm_ring_f0; | |
|
104 | current_ring_node_sm_f1 = sm_ring_f1; | |||
|
105 | current_ring_node_sm_f2 = sm_ring_f2; | |||
|
106 | ||||
61 | ring_node_for_averaging_sm_f0 = sm_ring_f0; |
|
107 | ring_node_for_averaging_sm_f0 = sm_ring_f0; | |
62 | } |
|
108 | } | |
63 |
|
109 | |||
@@ -112,31 +158,6 rtems_isr spectral_matrices_isr( rtems_v | |||||
112 |
|
158 | |||
113 | rtems_isr spectral_matrices_isr_simu( rtems_vector_number vector ) |
|
159 | rtems_isr spectral_matrices_isr_simu( rtems_vector_number vector ) | |
114 | { |
|
160 | { | |
115 | rtems_event_send( Task_id[TASKID_DUMB], RTEMS_EVENT_8 ); |
|
|||
116 |
|
||||
117 | if ( (spectral_matrix_regs->status & 0x1) == 0x01) |
|
|||
118 | { |
|
|||
119 | current_ring_node_sm_f0 = current_ring_node_sm_f0->next; |
|
|||
120 | spectral_matrix_regs->matrixF0_Address0 = current_ring_node_sm_f0->buffer_address; |
|
|||
121 | spectral_matrix_regs->status = spectral_matrix_regs->status & 0xfffffffe; // 1110 |
|
|||
122 | nb_sm_f0 = nb_sm_f0 + 1; |
|
|||
123 | } |
|
|||
124 | else if ( (spectral_matrix_regs->status & 0x2) == 0x02) |
|
|||
125 | { |
|
|||
126 | current_ring_node_sm_f0 = current_ring_node_sm_f0->next; |
|
|||
127 | spectral_matrix_regs->matrixFO_Address1 = current_ring_node_sm_f0->buffer_address; |
|
|||
128 | spectral_matrix_regs->status = spectral_matrix_regs->status & 0xfffffffd; // 1101 |
|
|||
129 | nb_sm_f0 = nb_sm_f0 + 1; |
|
|||
130 | } |
|
|||
131 |
|
||||
132 | if ( (spectral_matrix_regs->status & 0x30) != 0x00) |
|
|||
133 | { |
|
|||
134 | rtems_event_send( Task_id[TASKID_DUMB], RTEMS_EVENT_8 ); |
|
|||
135 | spectral_matrix_regs->status = spectral_matrix_regs->status & 0xffffffcf; // 1100 1111 |
|
|||
136 | } |
|
|||
137 |
|
||||
138 | spectral_matrix_regs->status = spectral_matrix_regs->status & 0xfffffff3; // 0011 |
|
|||
139 |
|
||||
140 | if (nb_sm_f0 == (NB_SM_TO_RECEIVE_BEFORE_AVF0-1) ) |
|
161 | if (nb_sm_f0 == (NB_SM_TO_RECEIVE_BEFORE_AVF0-1) ) | |
141 | { |
|
162 | { | |
142 | ring_node_for_averaging_sm_f0 = current_ring_node_sm_f0; |
|
163 | ring_node_for_averaging_sm_f0 = current_ring_node_sm_f0; |
@@ -403,9 +403,13 int stop_current_mode(void) | |||||
403 | LEON_Clear_interrupt( IRQ_SPECTRAL_MATRIX ); // clear spectral matrix interrupt |
|
403 | LEON_Clear_interrupt( IRQ_SPECTRAL_MATRIX ); // clear spectral matrix interrupt | |
404 |
|
404 | |||
405 | // (3) reset registers |
|
405 | // (3) reset registers | |
|
406 | // waveform picker | |||
406 | reset_wfp_burst_enable(); // reset burst and enable bits |
|
407 | reset_wfp_burst_enable(); // reset burst and enable bits | |
407 | reset_wfp_status(); // reset all the status bits |
|
408 | reset_wfp_status(); // reset all the status bits | |
408 | disable_irq_on_new_ready_matrix(); // stop the spectral matrices |
|
409 | // spectral matrices | |
|
410 | set_irq_on_new_ready_matrix( 0 ); // stop the spectral matrices | |||
|
411 | set_run_matrix_spectral( 0 ); // run_matrix_spectral is set to 0 | |||
|
412 | reset_extractSWF(); // reset the extractSWF flag to false | |||
409 |
|
413 | |||
410 | // <Spectral Matrices simulator> |
|
414 | // <Spectral Matrices simulator> | |
411 | LEON_Mask_interrupt( IRQ_SM_SIMULATOR ); // mask spectral matrix interrupt simulator |
|
415 | LEON_Mask_interrupt( IRQ_SM_SIMULATOR ); // mask spectral matrix interrupt simulator | |
@@ -605,8 +609,10 void launch_waveform_picker( unsigned ch | |||||
605 | reset_current_ring_nodes(); |
|
609 | reset_current_ring_nodes(); | |
606 | reset_waveform_picker_regs(); |
|
610 | reset_waveform_picker_regs(); | |
607 | set_wfp_burst_enable_register( mode ); |
|
611 | set_wfp_burst_enable_register( mode ); | |
|
612 | ||||
608 | LEON_Clear_interrupt( IRQ_WAVEFORM_PICKER ); |
|
613 | LEON_Clear_interrupt( IRQ_WAVEFORM_PICKER ); | |
609 | LEON_Unmask_interrupt( IRQ_WAVEFORM_PICKER ); |
|
614 | LEON_Unmask_interrupt( IRQ_WAVEFORM_PICKER ); | |
|
615 | ||||
610 | startDate = time_management_regs->coarse_time + 2; |
|
616 | startDate = time_management_regs->coarse_time + 2; | |
611 | waveform_picker_regs->run_burst_enable = waveform_picker_regs->run_burst_enable | 0x80; // [1000 0000] |
|
617 | waveform_picker_regs->run_burst_enable = waveform_picker_regs->run_burst_enable | 0x80; // [1000 0000] | |
612 | waveform_picker_regs->start_date = startDate; |
|
618 | waveform_picker_regs->start_date = startDate; | |
@@ -618,22 +624,42 void launch_spectral_matrix( unsigned ch | |||||
618 | reset_current_sm_ring_nodes(); |
|
624 | reset_current_sm_ring_nodes(); | |
619 | reset_spectral_matrix_regs(); |
|
625 | reset_spectral_matrix_regs(); | |
620 |
|
626 | |||
621 | enable_irq_on_new_ready_matrix(); |
|
627 | #ifdef VHDL_DEV | |
622 |
|
628 | set_irq_on_new_ready_matrix( 1 ); | ||
623 | LEON_Clear_interrupt( IRQ_SPECTRAL_MATRIX ); |
|
629 | LEON_Clear_interrupt( IRQ_SPECTRAL_MATRIX ); | |
624 | LEON_Unmask_interrupt( IRQ_SPECTRAL_MATRIX ); |
|
630 | LEON_Unmask_interrupt( IRQ_SPECTRAL_MATRIX ); | |
|
631 | set_run_matrix_spectral( 1 ); | |||
|
632 | #else | |||
|
633 | // Spectral Matrices simulator | |||
|
634 | timer_start( (gptimer_regs_t*) REGS_ADDR_GPTIMER, TIMER_SM_SIMULATOR ); | |||
|
635 | LEON_Clear_interrupt( IRQ_SM_SIMULATOR ); | |||
|
636 | LEON_Unmask_interrupt( IRQ_SM_SIMULATOR ); | |||
|
637 | #endif | |||
625 | } |
|
638 | } | |
626 |
|
639 | |||
627 |
void |
|
640 | void set_irq_on_new_ready_matrix( unsigned char value ) | |
|
641 | { | |||
|
642 | if (value == 1) | |||
628 | { |
|
643 | { | |
629 | spectral_matrix_regs->config = spectral_matrix_regs->config | 0x01; |
|
644 | spectral_matrix_regs->config = spectral_matrix_regs->config | 0x01; | |
630 | } |
|
645 | } | |
631 |
|
646 | else | ||
632 | void disable_irq_on_new_ready_matrix( void ) |
|
|||
633 | { |
|
647 | { | |
634 | spectral_matrix_regs->config = spectral_matrix_regs->config & 0xfffffffe; // 1110 |
|
648 | spectral_matrix_regs->config = spectral_matrix_regs->config & 0xfffffffe; // 1110 | |
635 | } |
|
649 | } | |
|
650 | } | |||
636 |
|
651 | |||
|
652 | void set_run_matrix_spectral( unsigned char value ) | |||
|
653 | { | |||
|
654 | if (value == 1) | |||
|
655 | { | |||
|
656 | spectral_matrix_regs->config = spectral_matrix_regs->config | 0x4; // 0100 set run_matrix spectral to 1 | |||
|
657 | } | |||
|
658 | else | |||
|
659 | { | |||
|
660 | spectral_matrix_regs->config = spectral_matrix_regs->config & 0xfffffffb; // 1011 set run_matrix spectral to 0 | |||
|
661 | } | |||
|
662 | } | |||
637 |
|
663 | |||
638 | void launch_spectral_matrix_simu( unsigned char mode ) |
|
664 | void launch_spectral_matrix_simu( unsigned char mode ) | |
639 | { |
|
665 | { |
@@ -37,8 +37,22 ring_node *ring_node_to_send_swf_f2; | |||||
37 | ring_node *ring_node_to_send_cwf_f2; |
|
37 | ring_node *ring_node_to_send_cwf_f2; | |
38 |
|
38 | |||
39 | bool extractSWF = false; |
|
39 | bool extractSWF = false; | |
|
40 | bool swf_f0_ready = false; | |||
|
41 | bool swf_f1_ready = false; | |||
|
42 | bool swf_f2_ready = false; | |||
40 |
|
43 | |||
41 |
int wf_snap_ |
|
44 | int wf_snap_extracted[ (NB_SAMPLES_PER_SNAPSHOT * NB_WORDS_SWF_BLK) + TIME_OFFSET ]; | |
|
45 | ||||
|
46 | //********************* | |||
|
47 | // Interrupt SubRoutine | |||
|
48 | ||||
|
49 | void reset_extractSWF( void ) | |||
|
50 | { | |||
|
51 | extractSWF = false; | |||
|
52 | swf_f0_ready = false; | |||
|
53 | swf_f1_ready = false; | |||
|
54 | swf_f2_ready = false; | |||
|
55 | } | |||
42 |
|
56 | |||
43 | rtems_isr waveforms_isr( rtems_vector_number vector ) |
|
57 | rtems_isr waveforms_isr( rtems_vector_number vector ) | |
44 | { |
|
58 | { | |
@@ -50,6 +64,7 rtems_isr waveforms_isr( rtems_vector_nu | |||||
50 | * |
|
64 | * | |
51 | */ |
|
65 | */ | |
52 |
|
66 | |||
|
67 | rtems_status_code status; | |||
53 | static unsigned char nb_swf = 0; |
|
68 | static unsigned char nb_swf = 0; | |
54 |
|
69 | |||
55 | if ( (lfrCurrentMode == LFR_MODE_NORMAL) |
|
70 | if ( (lfrCurrentMode == LFR_MODE_NORMAL) | |
@@ -143,29 +158,36 rtems_isr waveforms_isr( rtems_vector_nu | |||||
143 | if (extractSWF == true) |
|
158 | if (extractSWF == true) | |
144 | { |
|
159 | { | |
145 | ring_node_to_send_swf_f1 = current_ring_node_f1; |
|
160 | ring_node_to_send_swf_f1 = current_ring_node_f1; | |
146 | if (rtems_event_send( Task_id[TASKID_SWBD], RTEMS_EVENT_0 ) != RTEMS_SUCCESSFUL) { |
|
161 | // extract the snapshot | |
147 |
|
|
162 | status = rtems_event_send( Task_id[TASKID_SWBD], RTEMS_EVENT_MODE_SBM1 ); | |
148 | } |
|
|||
149 | extractSWF = false; |
|
163 | extractSWF = false; | |
|
164 | swf_f1_ready = true; | |||
150 | } |
|
165 | } | |
151 | // (1) change the receiving buffer for the waveform picker |
|
166 | // (1) change the receiving buffer for the waveform picker | |
152 | ring_node_to_send_cwf_f1 = current_ring_node_f1; |
|
167 | ring_node_to_send_cwf_f1 = current_ring_node_f1; | |
153 | current_ring_node_f1 = current_ring_node_f1->next; |
|
168 | current_ring_node_f1 = current_ring_node_f1->next; | |
154 | waveform_picker_regs->addr_data_f1 = current_ring_node_f1->buffer_address; |
|
169 | waveform_picker_regs->addr_data_f1 = current_ring_node_f1->buffer_address; | |
155 | // (2) send an event for the the CWF1 task for transmission |
|
170 | // (2) send an event for the the CWF1 task for transmission | |
156 |
|
|
171 | status = rtems_event_send( Task_id[TASKID_CWF1], RTEMS_EVENT_MODE_SBM1 ); | |
157 | rtems_event_send( Task_id[TASKID_DUMB], RTEMS_EVENT_2 ); |
|
172 | waveform_picker_regs->status = waveform_picker_regs->status & 0xfffffddd; // [1111 1101 1101 1101] f1 bits = 0 | |
|
173 | if (swf_f0_ready == true) | |||
|
174 | { | |||
|
175 | extractSWF = true; | |||
|
176 | swf_f0_ready = false; | |||
158 | } |
|
177 | } | |
159 | waveform_picker_regs->status = waveform_picker_regs->status & 0xfffffddd; // [1111 1101 1101 1101] f1 bits = 0 |
|
178 | if ((swf_f1_ready == true) && (swf_f2_ready == true)) | |
|
179 | { | |||
|
180 | status = rtems_event_send( Task_id[TASKID_WFRM], RTEMS_EVENT_MODE_SBM1 ); | |||
|
181 | swf_f1_ready = false; | |||
|
182 | swf_f2_ready = false; | |||
|
183 | } | |||
160 | } |
|
184 | } | |
161 | if ( (waveform_picker_regs->status & 0x01) == 0x01 ) { // [0001] check the f0 full bit |
|
185 | if ( (waveform_picker_regs->status & 0x01) == 0x01 ) { // [0001] check the f0 full bit | |
162 |
|
|
186 | swf_f0_ready = true; | |
163 | waveform_picker_regs->status = waveform_picker_regs->status & 0xfffffeee; // [1111 1110 1110 1110] f0 bits = 0 |
|
187 | waveform_picker_regs->status = waveform_picker_regs->status & 0xfffffeee; // [1111 1110 1110 1110] f0 bits = 0 | |
164 | } |
|
188 | } | |
165 | if ( (waveform_picker_regs->status & 0x04) == 0x04 ) { // [0100] check the f2 full bit |
|
189 | if ( (waveform_picker_regs->status & 0x04) == 0x04 ) { // [0100] check the f2 full bit | |
166 | if (rtems_event_send( Task_id[TASKID_WFRM], RTEMS_EVENT_MODE_SBM1 ) != RTEMS_SUCCESSFUL) { |
|
190 | swf_f2_ready = true; | |
167 | rtems_event_send( Task_id[TASKID_DUMB], RTEMS_EVENT_2 ); |
|
|||
168 | } |
|
|||
169 | waveform_picker_regs->status = waveform_picker_regs->status & 0xfffffbbb; // [1111 1011 1011 1011] f2 bits = 0 |
|
191 | waveform_picker_regs->status = waveform_picker_regs->status & 0xfffffbbb; // [1111 1011 1011 1011] f2 bits = 0 | |
170 | } |
|
192 | } | |
171 | break; |
|
193 | break; | |
@@ -174,24 +196,38 rtems_isr waveforms_isr( rtems_vector_nu | |||||
174 | // SBM2 |
|
196 | // SBM2 | |
175 | case(LFR_MODE_SBM2): |
|
197 | case(LFR_MODE_SBM2): | |
176 | if ( (waveform_picker_regs->status & 0x04) == 0x04 ){ // [0100] check the f2 full bit |
|
198 | if ( (waveform_picker_regs->status & 0x04) == 0x04 ){ // [0100] check the f2 full bit | |
|
199 | // (0) launch snapshot extraction if needed | |||
|
200 | if (extractSWF == true) | |||
|
201 | { | |||
|
202 | ring_node_to_send_swf_f2 = current_ring_node_f2; | |||
|
203 | // extract the snapshot | |||
|
204 | status = rtems_event_send( Task_id[TASKID_SWBD], RTEMS_EVENT_MODE_SBM2 ); | |||
|
205 | // send the snapshot when build, SWBD priority < WFRM priority | |||
|
206 | status = rtems_event_send( Task_id[TASKID_WFRM], RTEMS_EVENT_MODE_SBM2 ); | |||
|
207 | extractSWF = false; | |||
|
208 | } | |||
177 | // (1) change the receiving buffer for the waveform picker |
|
209 | // (1) change the receiving buffer for the waveform picker | |
178 | ring_node_to_send_cwf_f2 = current_ring_node_f2; |
|
210 | ring_node_to_send_cwf_f2 = current_ring_node_f2; | |
179 | current_ring_node_f2 = current_ring_node_f2->next; |
|
211 | current_ring_node_f2 = current_ring_node_f2->next; | |
180 | waveform_picker_regs->addr_data_f2 = current_ring_node_f2->buffer_address; |
|
212 | waveform_picker_regs->addr_data_f2 = current_ring_node_f2->buffer_address; | |
181 | // (2) send an event for the waveforms transmission |
|
213 | // (2) send an event for the waveforms transmission | |
182 |
|
|
214 | status = rtems_event_send( Task_id[TASKID_CWF2], RTEMS_EVENT_MODE_SBM2 ); | |
183 | rtems_event_send( Task_id[TASKID_DUMB], RTEMS_EVENT_2 ); |
|
215 | waveform_picker_regs->status = waveform_picker_regs->status & 0xfffffbbb; // [1111 1011 1011 1011] f2 bit = 0 | |
|
216 | // (3) check whether swf_fo and swf_f& are ready or not | |||
|
217 | if (swf_f0_ready && swf_f1_ready) | |||
|
218 | { | |||
|
219 | extractSWF = true; | |||
|
220 | swf_f0_ready = false; | |||
|
221 | swf_f1_ready = false; | |||
184 | } |
|
222 | } | |
185 | waveform_picker_regs->status = waveform_picker_regs->status & 0xfffffbbb; // [1111 1011 1011 1011] f2 bit = 0 |
|
|||
186 | } |
|
223 | } | |
187 | if ( (waveform_picker_regs->status & 0x01) == 0x01 ) { // [0001] check the f0 full bit |
|
224 | if ( (waveform_picker_regs->status & 0x01) == 0x01 ) { // [0001] check the f0 full bit | |
188 | ring_node_to_send_swf_f2 = current_ring_node_f2->previous; |
|
225 | swf_f0_ready = true; | |
|
226 | waveform_picker_regs->status = waveform_picker_regs->status & 0xfffffeee; // [1111 1110 1110 1110] f0 bits = 0 | |||
189 | } |
|
227 | } | |
190 | if ( (waveform_picker_regs->status & 0x02) == 0x02 ) { // [0010] check the f1 full bit |
|
228 | if ( (waveform_picker_regs->status & 0x02) == 0x02 ) { // [0010] check the f1 full bit | |
191 | if (rtems_event_send( Task_id[TASKID_WFRM], RTEMS_EVENT_MODE_NORMAL ) != RTEMS_SUCCESSFUL) { |
|
229 | swf_f1_ready = true; | |
192 | rtems_event_send( Task_id[TASKID_DUMB], RTEMS_EVENT_2 ); |
|
230 | waveform_picker_regs->status = waveform_picker_regs->status & 0xfffffddd; // [1111 1101 1101 1101] f1, f0 bits = 0 | |
193 | } |
|
|||
194 | waveform_picker_regs->status = waveform_picker_regs->status & 0xfffffccc; // [1111 1100 1100 1100] f1, f0 bits = 0 |
|
|||
195 | } |
|
231 | } | |
196 | break; |
|
232 | break; | |
197 |
|
233 | |||
@@ -202,6 +238,9 rtems_isr waveforms_isr( rtems_vector_nu | |||||
202 | } |
|
238 | } | |
203 | } |
|
239 | } | |
204 |
|
240 | |||
|
241 | //************ | |||
|
242 | // RTEMS TASKS | |||
|
243 | ||||
205 | rtems_task wfrm_task(rtems_task_argument argument) //used with the waveform picker VHDL IP |
|
244 | rtems_task wfrm_task(rtems_task_argument argument) //used with the waveform picker VHDL IP | |
206 | { |
|
245 | { | |
207 | /** This RTEMS task is dedicated to the transmission of snapshots of the NORMAL mode. |
|
246 | /** This RTEMS task is dedicated to the transmission of snapshots of the NORMAL mode. | |
@@ -240,18 +279,25 rtems_task wfrm_task(rtems_task_argument | |||||
240 | RTEMS_WAIT | RTEMS_EVENT_ANY, RTEMS_NO_TIMEOUT, &event_out); |
|
279 | RTEMS_WAIT | RTEMS_EVENT_ANY, RTEMS_NO_TIMEOUT, &event_out); | |
241 | if (event_out == RTEMS_EVENT_MODE_NORMAL) |
|
280 | if (event_out == RTEMS_EVENT_MODE_NORMAL) | |
242 | { |
|
281 | { | |
243 | PRINTF("WFRM received RTEMS_EVENT_MODE_NORMAL\n") |
|
282 | DEBUG_PRINTF("WFRM received RTEMS_EVENT_MODE_NORMAL\n") | |
244 | send_waveform_SWF((volatile int*) ring_node_to_send_swf_f0->buffer_address, SID_NORM_SWF_F0, headerSWF_F0, queue_id); |
|
283 | send_waveform_SWF((volatile int*) ring_node_to_send_swf_f0->buffer_address, SID_NORM_SWF_F0, headerSWF_F0, queue_id); | |
245 | send_waveform_SWF((volatile int*) ring_node_to_send_swf_f1->buffer_address, SID_NORM_SWF_F1, headerSWF_F1, queue_id); |
|
284 | send_waveform_SWF((volatile int*) ring_node_to_send_swf_f1->buffer_address, SID_NORM_SWF_F1, headerSWF_F1, queue_id); | |
246 | send_waveform_SWF((volatile int*) ring_node_to_send_swf_f2->buffer_address, SID_NORM_SWF_F2, headerSWF_F2, queue_id); |
|
285 | send_waveform_SWF((volatile int*) ring_node_to_send_swf_f2->buffer_address, SID_NORM_SWF_F2, headerSWF_F2, queue_id); | |
247 | } |
|
286 | } | |
248 | if (event_out == RTEMS_EVENT_MODE_SBM1) |
|
287 | if (event_out == RTEMS_EVENT_MODE_SBM1) | |
249 | { |
|
288 | { | |
250 | PRINTF("WFRM received RTEMS_EVENT_MODE_SBM1\n") |
|
289 | DEBUG_PRINTF("WFRM received RTEMS_EVENT_MODE_SBM1\n") | |
251 | send_waveform_SWF((volatile int*) ring_node_to_send_swf_f0->buffer_address, SID_NORM_SWF_F0, headerSWF_F0, queue_id); |
|
290 | send_waveform_SWF((volatile int*) ring_node_to_send_swf_f0->buffer_address, SID_NORM_SWF_F0, headerSWF_F0, queue_id); | |
252 |
send_waveform_SWF((volatile int*) wf_snap_ |
|
291 | send_waveform_SWF((volatile int*) wf_snap_extracted , SID_NORM_SWF_F1, headerSWF_F1, queue_id); | |
253 | send_waveform_SWF((volatile int*) ring_node_to_send_swf_f2->buffer_address, SID_NORM_SWF_F2, headerSWF_F2, queue_id); |
|
292 | send_waveform_SWF((volatile int*) ring_node_to_send_swf_f2->buffer_address, SID_NORM_SWF_F2, headerSWF_F2, queue_id); | |
254 | } |
|
293 | } | |
|
294 | if (event_out == RTEMS_EVENT_MODE_SBM2) | |||
|
295 | { | |||
|
296 | DEBUG_PRINTF("WFRM received RTEMS_EVENT_MODE_SBM2\n") | |||
|
297 | send_waveform_SWF((volatile int*) ring_node_to_send_swf_f0->buffer_address, SID_NORM_SWF_F0, headerSWF_F0, queue_id); | |||
|
298 | send_waveform_SWF((volatile int*) ring_node_to_send_swf_f1->buffer_address, SID_NORM_SWF_F1, headerSWF_F1, queue_id); | |||
|
299 | send_waveform_SWF((volatile int*) wf_snap_extracted , SID_NORM_SWF_F2, headerSWF_F2, queue_id); | |||
|
300 | } | |||
255 | } |
|
301 | } | |
256 | } |
|
302 | } | |
257 |
|
303 | |||
@@ -407,9 +453,20 rtems_task swbd_task(rtems_task_argument | |||||
407 |
|
453 | |||
408 | while(1){ |
|
454 | while(1){ | |
409 | // wait for an RTEMS_EVENT |
|
455 | // wait for an RTEMS_EVENT | |
410 |
rtems_event_receive( RTEMS_EVENT_ |
|
456 | rtems_event_receive( RTEMS_EVENT_MODE_SBM1 | RTEMS_EVENT_MODE_SBM2, | |
411 | RTEMS_WAIT | RTEMS_EVENT_ANY, RTEMS_NO_TIMEOUT, &event_out); |
|
457 | RTEMS_WAIT | RTEMS_EVENT_ANY, RTEMS_NO_TIMEOUT, &event_out); | |
412 | build_snapshot_from_ring(); |
|
458 | if (event_out == RTEMS_EVENT_MODE_SBM1) | |
|
459 | { | |||
|
460 | build_snapshot_from_ring( ring_node_to_send_swf_f1, 1 ); | |||
|
461 | } | |||
|
462 | else if (event_out == RTEMS_EVENT_MODE_SBM2) | |||
|
463 | { | |||
|
464 | build_snapshot_from_ring( ring_node_to_send_swf_f2, 2 ); | |||
|
465 | } | |||
|
466 | else | |||
|
467 | { | |||
|
468 | PRINTF1("in SWBD *** unexpected rtems event received %x\n", (int) event_out) | |||
|
469 | } | |||
413 | } |
|
470 | } | |
414 | } |
|
471 | } | |
415 |
|
472 | |||
@@ -677,9 +734,6 int send_waveform_SWF( volatile int *wav | |||||
677 |
|
734 | |||
678 | ret = LFR_DEFAULT; |
|
735 | ret = LFR_DEFAULT; | |
679 |
|
736 | |||
680 | DEBUG_PRINTF1("sid = %d, ", sid) |
|
|||
681 | DEBUG_PRINTF2("coarse = %x, fine = %x\n", waveform[0], waveform[1]) |
|
|||
682 |
|
||||
683 | coarseTime = waveform[0]; |
|
737 | coarseTime = waveform[0]; | |
684 | fineTime = waveform[1]; |
|
738 | fineTime = waveform[1]; | |
685 |
|
739 | |||
@@ -935,45 +989,91 void compute_acquisition_time( unsigned | |||||
935 |
|
989 | |||
936 | } |
|
990 | } | |
937 |
|
991 | |||
938 | void build_snapshot_from_ring( void ) |
|
992 | void build_snapshot_from_ring( ring_node *ring_node_to_send, unsigned char frequencyChannel ) | |
939 | { |
|
993 | { | |
940 | unsigned int i; |
|
994 | unsigned int i; | |
941 | unsigned long long int centerTime_asLong; |
|
995 | unsigned long long int centerTime_asLong; | |
942 | unsigned long long int acquisitionTimeF0_asLong; |
|
996 | unsigned long long int acquisitionTimeF0_asLong; | |
943 |
unsigned long long int acquisitionTime |
|
997 | unsigned long long int acquisitionTime_asLong; | |
944 |
unsigned |
|
998 | unsigned long long int bufferAcquisitionTime_asLong; | |
945 | unsigned char *acquisitionTimeF1; |
|
|||
946 | unsigned char *ptr1; |
|
999 | unsigned char *ptr1; | |
947 | unsigned char *ptr2; |
|
1000 | unsigned char *ptr2; | |
|
1001 | unsigned char nb_ring_nodes; | |||
|
1002 | unsigned long long int frequency_asLong; | |||
|
1003 | unsigned long long int nbTicksPerSample_asLong; | |||
|
1004 | unsigned long long int nbSamplesPart1_asLong; | |||
|
1005 | unsigned long long int sampleOffset_asLong; | |||
948 |
|
1006 | |||
949 | unsigned int deltaT; |
|
1007 | unsigned int deltaT_F0; | |
|
1008 | unsigned int deltaT_F1; | |||
|
1009 | unsigned long long int deltaT_F2; | |||
950 |
|
1010 | |||
951 | deltaT = 2731; // (2048. / 24576. / 2.) * 65536. = 2730.667; |
|
1011 | deltaT_F0 = 2731; // (2048. / 24576. / 2.) * 65536. = 2730.667; | |
|
1012 | deltaT_F1 = 16384; // (2048. / 4096. / 2.) * 65536. = 16384; | |||
|
1013 | deltaT_F2 = 262144; // (2048. / 256. / 2.) * 65536. = 262144; | |||
|
1014 | sampleOffset_asLong = 0x00; | |||
952 |
|
1015 | |||
953 | acquisitionTimeF0 = (unsigned char*) current_ring_node_f0->buffer_address; |
|
1016 | // get the f0 acquisition time | |
954 | acquisitionTimeF1 = (unsigned char*) ring_node_to_send_cwf_f1->buffer_address; |
|
1017 | build_acquisition_time( &acquisitionTimeF0_asLong, current_ring_node_f0 ); | |
|
1018 | PRINTF1("acquisitionTimeF0_asLong %llx \n", acquisitionTimeF0_asLong) | |||
|
1019 | ||||
|
1020 | // compute the central reference time | |||
|
1021 | centerTime_asLong = acquisitionTimeF0_asLong + deltaT_F0; | |||
|
1022 | PRINTF1("centerTime_asLong %llx \n", centerTime_asLong) | |||
955 |
|
1023 | |||
956 | acquisitionTimeF0_asLong = 0x00; |
|
1024 | // compute the acquisition time of the current snapshot | |
957 | acquisitionTimeF1_asLong = 0x00; |
|
1025 | switch(frequencyChannel) | |
958 | acquisitionTimeF0_asLong = ( acquisitionTimeF0[0] << 24 ) |
|
1026 | { | |
959 | + ( acquisitionTimeF0[1] << 16 ) |
|
1027 | case 1: // 1 is for F1 = 4096 Hz | |
960 | + ( (unsigned long long int) acquisitionTimeF0[2] << 40 ) |
|
1028 | acquisitionTime_asLong = centerTime_asLong - deltaT_F1; | |
961 | + ( (unsigned long long int) acquisitionTimeF0[3] << 32 ) |
|
1029 | nb_ring_nodes = NB_RING_NODES_F1; | |
962 | + ( acquisitionTimeF0[4] << 8 ) |
|
1030 | frequency_asLong = 4096; | |
963 | + ( acquisitionTimeF0[5] ); |
|
1031 | nbTicksPerSample_asLong = 16; // 65536 / 4096; | |
|
1032 | break; | |||
|
1033 | case 2: // 2 is for F2 = 256 Hz | |||
|
1034 | acquisitionTime_asLong = centerTime_asLong - deltaT_F2; | |||
|
1035 | nb_ring_nodes = NB_RING_NODES_F2; | |||
|
1036 | frequency_asLong = 256; | |||
|
1037 | nbTicksPerSample_asLong = 256; // 65536 / 256; | |||
|
1038 | break; | |||
|
1039 | default: | |||
|
1040 | acquisitionTime_asLong = centerTime_asLong; | |||
|
1041 | frequency_asLong = 256; | |||
|
1042 | nbTicksPerSample_asLong = 256; | |||
|
1043 | break; | |||
|
1044 | } | |||
|
1045 | PRINTF1("acquisitionTime_asLong %llx\n", acquisitionTime_asLong) | |||
964 |
|
1046 | |||
965 | acquisitionTimeF1_asLong = ( acquisitionTimeF1[0] << 24 ) |
|
1047 | //**************************************************************************** | |
966 | + ( acquisitionTimeF1[1] << 16 ) |
|
1048 | // 1) search the ring_node with the acquisition time <= acquisitionTime_asLong | |
967 | + ( (unsigned long long int) acquisitionTimeF1[2] << 40 ) |
|
1049 | for (i=0; i<nb_ring_nodes; i++) | |
968 | + ( (unsigned long long int) acquisitionTimeF1[3] << 32 ) |
|
1050 | { | |
969 | + ( acquisitionTimeF1[4] << 8 ) |
|
1051 | PRINTF1("%d ... ", i) | |
970 | + ( acquisitionTimeF1[5] ); |
|
1052 | build_acquisition_time( &bufferAcquisitionTime_asLong, ring_node_to_send ); | |
|
1053 | if (bufferAcquisitionTime_asLong <= acquisitionTime_asLong) | |||
|
1054 | { | |||
|
1055 | PRINTF1("buffer found with acquisition time = %llx\n", bufferAcquisitionTime_asLong) | |||
|
1056 | break; | |||
|
1057 | } | |||
|
1058 | ring_node_to_send = ring_node_to_send->previous; | |||
|
1059 | } | |||
971 |
|
1060 | |||
972 | centerTime_asLong = acquisitionTimeF0_asLong + deltaT; |
|
1061 | //************************************************* | |
|
1062 | // (2) once the buffer is found, build the snapshot | |||
|
1063 | ||||
|
1064 | // compute the number of samples to take in the current buffer | |||
|
1065 | sampleOffset_asLong = ((acquisitionTime_asLong - bufferAcquisitionTime_asLong) * frequency_asLong ) >> 16; | |||
|
1066 | nbSamplesPart1_asLong = NB_SAMPLES_PER_SNAPSHOT - sampleOffset_asLong; | |||
|
1067 | PRINTF2("sampleOffset_asLong = %lld, nbSamplesPart1 = %lld\n", sampleOffset_asLong, nbSamplesPart1_asLong) | |||
973 |
|
1068 | |||
974 | ptr1 = (unsigned char*) &acquisitionTimeF1_asLong; |
|
1069 | // compute the final acquisition time | |
975 | ptr2 = (unsigned char*) wf_snap_f1_extracted; |
|
1070 | acquisitionTime_asLong = bufferAcquisitionTime_asLong + | |
|
1071 | sampleOffset_asLong * nbTicksPerSample_asLong; | |||
|
1072 | PRINTF1("FINAL acquisitionTime_asLong %llx\n\n", acquisitionTime_asLong) | |||
976 |
|
1073 | |||
|
1074 | // copy the acquisition time at the beginning of the extrated snapshot | |||
|
1075 | ptr1 = (unsigned char*) &acquisitionTime_asLong; | |||
|
1076 | ptr2 = (unsigned char*) wf_snap_extracted; | |||
977 | ptr2[0] = ptr1[ 2 + 2 ]; |
|
1077 | ptr2[0] = ptr1[ 2 + 2 ]; | |
978 | ptr2[1] = ptr1[ 3 + 2 ]; |
|
1078 | ptr2[1] = ptr1[ 3 + 2 ]; | |
979 | ptr2[2] = ptr1[ 0 + 2 ]; |
|
1079 | ptr2[2] = ptr1[ 0 + 2 ]; | |
@@ -981,10 +1081,37 void build_snapshot_from_ring( void ) | |||||
981 | ptr2[4] = ptr1[ 4 + 2 ]; |
|
1081 | ptr2[4] = ptr1[ 4 + 2 ]; | |
982 | ptr2[5] = ptr1[ 5 + 2 ]; |
|
1082 | ptr2[5] = ptr1[ 5 + 2 ]; | |
983 |
|
1083 | |||
984 | for (i=0; i<(NB_SAMPLES_PER_SNAPSHOT * NB_WORDS_SWF_BLK); i++ ) |
|
1084 | // re set the synchronization bit | |
|
1085 | ||||
|
1086 | ||||
|
1087 | // copy the part 1 of the snapshot in the extracted buffer | |||
|
1088 | for ( i = 0; i < (nbSamplesPart1_asLong * NB_WORDS_SWF_BLK); i++ ) | |||
|
1089 | { | |||
|
1090 | wf_snap_extracted[i + TIME_OFFSET] = | |||
|
1091 | ((int*) ring_node_to_send->buffer_address)[i + (sampleOffset_asLong * NB_WORDS_SWF_BLK) + TIME_OFFSET]; | |||
|
1092 | } | |||
|
1093 | // copy the part 2 of the snapshot in the extracted buffer | |||
|
1094 | ring_node_to_send = ring_node_to_send->next; | |||
|
1095 | for ( i = (nbSamplesPart1_asLong * NB_WORDS_SWF_BLK); i < (NB_SAMPLES_PER_SNAPSHOT * NB_WORDS_SWF_BLK); i++ ) | |||
985 | { |
|
1096 | { | |
986 | wf_snap_f1_extracted[i + TIME_OFFSET] = ((int*)(ring_node_to_send_cwf_f1->buffer_address))[i + TIME_OFFSET]; |
|
1097 | wf_snap_extracted[i + TIME_OFFSET] = | |
|
1098 | ((int*) ring_node_to_send->buffer_address)[(i-(nbSamplesPart1_asLong * NB_WORDS_SWF_BLK)) + TIME_OFFSET]; | |||
|
1099 | } | |||
987 | } |
|
1100 | } | |
|
1101 | ||||
|
1102 | void build_acquisition_time( unsigned long long int *acquisitionTimeAslong, ring_node *current_ring_node ) | |||
|
1103 | { | |||
|
1104 | unsigned char *acquisitionTimeCharPtr; | |||
|
1105 | ||||
|
1106 | acquisitionTimeCharPtr = (unsigned char*) current_ring_node->buffer_address; | |||
|
1107 | ||||
|
1108 | *acquisitionTimeAslong = 0x00; | |||
|
1109 | *acquisitionTimeAslong = ( acquisitionTimeCharPtr[0] << 24 ) | |||
|
1110 | + ( acquisitionTimeCharPtr[1] << 16 ) | |||
|
1111 | + ( (unsigned long long int) (acquisitionTimeCharPtr[2] & 0x7f) << 40 ) // [0111 1111] mask the synchronization bit | |||
|
1112 | + ( (unsigned long long int) acquisitionTimeCharPtr[3] << 32 ) | |||
|
1113 | + ( acquisitionTimeCharPtr[4] << 8 ) | |||
|
1114 | + ( acquisitionTimeCharPtr[5] ); | |||
988 | } |
|
1115 | } | |
989 |
|
1116 | |||
990 | //************** |
|
1117 | //************** |
General Comments 0
You need to be logged in to leave comments.
Login now