##// END OF EJS Templates
packet emission task added...
paul -
r33:1280850c4074 default
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.4) on: Thu Aug 1 15:31:06 2013
3 # Generated by qmake (2.01a) (Qt 4.8.5) on: Mon Sep 30 15:28:56 2013
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=0 -DSW_VERSION_N2=0 -DSW_VERSION_N3=0 -DSW_VERSION_N4=12 -DPRINT_MESSAGES_ON_CONSOLE
13 DEFINES = -DSW_VERSION_N1=0 -DSW_VERSION_N2=0 -DSW_VERSION_N3=0 -DSW_VERSION_N4=13 -DPRINT_MESSAGES_ON_CONSOLE
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
16 INCPATH = -I/usr/lib64/qt4/mkspecs/linux-g++ -I. -I../src -I../header
@@ -48,13 +48,15 SOURCES = ../src/wf_handler.c \
48 ../src/fsw_processing.c \
48 ../src/fsw_processing.c \
49 ../src/fsw_misc.c \
49 ../src/fsw_misc.c \
50 ../src/fsw_init.c \
50 ../src/fsw_init.c \
51 ../src/fsw_globals.c
51 ../src/fsw_globals.c \
52 ../src/fsw_spacewire.c
52 OBJECTS = obj/wf_handler.o \
53 OBJECTS = obj/wf_handler.o \
53 obj/tc_handler.o \
54 obj/tc_handler.o \
54 obj/fsw_processing.o \
55 obj/fsw_processing.o \
55 obj/fsw_misc.o \
56 obj/fsw_misc.o \
56 obj/fsw_init.o \
57 obj/fsw_init.o \
57 obj/fsw_globals.o
58 obj/fsw_globals.o \
59 obj/fsw_spacewire.o
58 DIST = /usr/lib64/qt4/mkspecs/common/unix.conf \
60 DIST = /usr/lib64/qt4/mkspecs/common/unix.conf \
59 /usr/lib64/qt4/mkspecs/common/linux.conf \
61 /usr/lib64/qt4/mkspecs/common/linux.conf \
60 /usr/lib64/qt4/mkspecs/common/gcc-base.conf \
62 /usr/lib64/qt4/mkspecs/common/gcc-base.conf \
@@ -70,6 +72,7 DIST = /usr/lib64/qt4/mkspecs/c
70 sparc.pri \
72 sparc.pri \
71 /usr/lib64/qt4/mkspecs/features/release.prf \
73 /usr/lib64/qt4/mkspecs/features/release.prf \
72 /usr/lib64/qt4/mkspecs/features/default_post.prf \
74 /usr/lib64/qt4/mkspecs/features/default_post.prf \
75 /usr/lib64/qt4/mkspecs/features/shared.prf \
73 /usr/lib64/qt4/mkspecs/features/unix/gdb_dwarf_index.prf \
76 /usr/lib64/qt4/mkspecs/features/unix/gdb_dwarf_index.prf \
74 /usr/lib64/qt4/mkspecs/features/warn_on.prf \
77 /usr/lib64/qt4/mkspecs/features/warn_on.prf \
75 /usr/lib64/qt4/mkspecs/features/resources.prf \
78 /usr/lib64/qt4/mkspecs/features/resources.prf \
@@ -125,6 +128,7 Makefile: fsw-qt.pro /usr/lib64/qt4/mks
125 sparc.pri \
128 sparc.pri \
126 /usr/lib64/qt4/mkspecs/features/release.prf \
129 /usr/lib64/qt4/mkspecs/features/release.prf \
127 /usr/lib64/qt4/mkspecs/features/default_post.prf \
130 /usr/lib64/qt4/mkspecs/features/default_post.prf \
131 /usr/lib64/qt4/mkspecs/features/shared.prf \
128 /usr/lib64/qt4/mkspecs/features/unix/gdb_dwarf_index.prf \
132 /usr/lib64/qt4/mkspecs/features/unix/gdb_dwarf_index.prf \
129 /usr/lib64/qt4/mkspecs/features/warn_on.prf \
133 /usr/lib64/qt4/mkspecs/features/warn_on.prf \
130 /usr/lib64/qt4/mkspecs/features/resources.prf \
134 /usr/lib64/qt4/mkspecs/features/resources.prf \
@@ -148,6 +152,7 Makefile: fsw-qt.pro /usr/lib64/qt4/mks
148 sparc.pri:
152 sparc.pri:
149 /usr/lib64/qt4/mkspecs/features/release.prf:
153 /usr/lib64/qt4/mkspecs/features/release.prf:
150 /usr/lib64/qt4/mkspecs/features/default_post.prf:
154 /usr/lib64/qt4/mkspecs/features/default_post.prf:
155 /usr/lib64/qt4/mkspecs/features/shared.prf:
151 /usr/lib64/qt4/mkspecs/features/unix/gdb_dwarf_index.prf:
156 /usr/lib64/qt4/mkspecs/features/unix/gdb_dwarf_index.prf:
152 /usr/lib64/qt4/mkspecs/features/warn_on.prf:
157 /usr/lib64/qt4/mkspecs/features/warn_on.prf:
153 /usr/lib64/qt4/mkspecs/features/resources.prf:
158 /usr/lib64/qt4/mkspecs/features/resources.prf:
@@ -215,6 +220,9 obj/fsw_init.o: ../src/fsw_init.c
215 obj/fsw_globals.o: ../src/fsw_globals.c
220 obj/fsw_globals.o: ../src/fsw_globals.c
216 $(CC) -c $(CFLAGS) $(INCPATH) -o obj/fsw_globals.o ../src/fsw_globals.c
221 $(CC) -c $(CFLAGS) $(INCPATH) -o obj/fsw_globals.o ../src/fsw_globals.c
217
222
223 obj/fsw_spacewire.o: ../src/fsw_spacewire.c
224 $(CC) -c $(CFLAGS) $(INCPATH) -o obj/fsw_spacewire.o ../src/fsw_spacewire.c
225
218 ####### Install
226 ####### Install
219
227
220 install: FORCE
228 install: FORCE
1 NO CONTENT: modified file, binary diff hidden
NO CONTENT: modified file, binary diff hidden
@@ -7,11 +7,11 CONFIG -= qt
7 include(./sparc.pri)
7 include(./sparc.pri)
8
8
9 # flight software version
9 # flight software version
10 SWVERSION=-0-12
10 SWVERSION=-0-13
11 DEFINES += SW_VERSION_N1=0
11 DEFINES += SW_VERSION_N1=0
12 DEFINES += SW_VERSION_N2=0
12 DEFINES += SW_VERSION_N2=0
13 DEFINES += SW_VERSION_N3=0
13 DEFINES += SW_VERSION_N3=0
14 DEFINES += SW_VERSION_N4=12
14 DEFINES += SW_VERSION_N4=13
15
15
16 contains( CONFIG, verbose ) {
16 contains( CONFIG, verbose ) {
17 DEFINES += PRINT_MESSAGES_ON_CONSOLE
17 DEFINES += PRINT_MESSAGES_ON_CONSOLE
@@ -37,7 +37,8 SOURCES += \
37 ../src/fsw_processing.c \
37 ../src/fsw_processing.c \
38 ../src/fsw_misc.c \
38 ../src/fsw_misc.c \
39 ../src/fsw_init.c \
39 ../src/fsw_init.c \
40 ../src/fsw_globals.c
40 ../src/fsw_globals.c \
41 ../src/fsw_spacewire.c
41
42
42 HEADERS += \
43 HEADERS += \
43 ../header/wf_handler.h \
44 ../header/wf_handler.h \
@@ -48,5 +49,6 HEADERS += \
48 ../header/fsw_misc.h \
49 ../header/fsw_misc.h \
49 ../header/fsw_init.h \
50 ../header/fsw_init.h \
50 ../header/ccsds_types.h \
51 ../header/ccsds_types.h \
51 ../header/fsw_params_processing.h
52 ../header/fsw_params_processing.h \
53 ../header/fsw_spacewire.h
52
54
@@ -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 2.8.0, 2013-08-01T13:38:09. -->
3 <!-- Written by QtCreator 2.8.0, 2013-10-01T07:01:25. -->
4 <qtcreator>
4 <qtcreator>
5 <data>
5 <data>
6 <variable>ProjectExplorer.Project.ActiveTarget</variable>
6 <variable>ProjectExplorer.Project.ActiveTarget</variable>
@@ -3,35 +3,61
3
3
4 #include <ccsds_types.h>
4 #include <ccsds_types.h>
5
5
6 #define PROTOCOLE_IDENTIFIER 0x02
7
6 // PACKET ID
8 // PACKET ID
7 #define TC_LFR_PACKET_ID 0x1ccc // PID 76 CAT 12
9 #define TC_LFR_PACKET_ID 0x1ccc // PID 76 CAT 12
8
10
9 #define PACKET_LENGTH_TC_LFR_LOAD_COMMON_PAR (14 - CCSDS_TC_TM_PACKET_OFFSET)
11 #define PACKET_LENGTH_TC_LFR_RESET (12 - CCSDS_TC_TM_PACKET_OFFSET)
10 #define PACKET_LENGTH_TC_LFR_LOAD_NORMAL_PAR (20 - CCSDS_TC_TM_PACKET_OFFSET)
12 #define PACKET_LENGTH_TC_LFR_LOAD_COMMON_PAR (14 - CCSDS_TC_TM_PACKET_OFFSET)
11 #define PACKET_LENGTH_TC_LFR_LOAD_BURST_PAR (14 - CCSDS_TC_TM_PACKET_OFFSET)
13 #define PACKET_LENGTH_TC_LFR_LOAD_NORMAL_PAR (20 - CCSDS_TC_TM_PACKET_OFFSET)
12 #define PACKET_LENGTH_TC_LFR_LOAD_SBM1_PAR (14 - CCSDS_TC_TM_PACKET_OFFSET)
14 #define PACKET_LENGTH_TC_LFR_LOAD_BURST_PAR (14 - CCSDS_TC_TM_PACKET_OFFSET)
13 #define PACKET_LENGTH_TC_LFR_LOAD_SBM2_PAR (14 - CCSDS_TC_TM_PACKET_OFFSET)
15 #define PACKET_LENGTH_TC_LFR_LOAD_SBM1_PAR (14 - CCSDS_TC_TM_PACKET_OFFSET)
14 #define PACKET_LENGTH_TC_LFR_DUMP_PAR (12 - CCSDS_TC_TM_PACKET_OFFSET)
16 #define PACKET_LENGTH_TC_LFR_LOAD_SBM2_PAR (14 - CCSDS_TC_TM_PACKET_OFFSET)
15 #define PACKET_LENGTH_TC_LFR_ENTER_MODE (20 - CCSDS_TC_TM_PACKET_OFFSET)
17 #define PACKET_LENGTH_TC_LFR_DUMP_PAR (12 - CCSDS_TC_TM_PACKET_OFFSET)
18 #define PACKET_LENGTH_TC_LFR_ENTER_MODE (20 - CCSDS_TC_TM_PACKET_OFFSET)
19 #define PACKET_LENGTH_TC_LFR_UPDATE_INFO (48 - CCSDS_TC_TM_PACKET_OFFSET)
20 #define PACKET_LENGTH_TC_LFR_ENABLE_CALIBRATION (12 - CCSDS_TC_TM_PACKET_OFFSET)
21 #define PACKET_LENGTH_TC_LFR_DISABLE_CALIBRATION (12 - CCSDS_TC_TM_PACKET_OFFSET)
22 #define PACKET_LENGTH_TC_LFR_UPDATE_TIME (18 - CCSDS_TC_TM_PACKET_OFFSET)
16
23
17 // TC TYPES
24 // TC TYPES
18 #define TC_TYPE_DEFAULT 181
25 #define TC_TYPE_DEFAULT 181
19 #define TC_TYPE_LFR_UPDATE_TIME 9
26 #define TC_TYPE_LFR_UPDATE_TIME 9
20
27
21 // TC SUBTYPES
28 // TC SUBTYPES
22 #define TC_SUBTYPE_LOAD_COMMON_PAR 11
29 #define TC_SUBTYPE_RESET 1
23 #define TC_SUBTYPE_LOAD_NORMAL_PAR 13
30 #define TC_SUBTYPE_LOAD_COMMON_PAR 11
24 #define TC_SUBTYPE_LOAD_BURST_PAR 19
31 #define TC_SUBTYPE_LOAD_NORMAL_PAR 13
25 #define TC_SUBTYPE_LOAD_SBM1_PAR 25
32 #define TC_SUBTYPE_LOAD_BURST_PAR 19
26 #define TC_SUBTYPE_LOAD_SBM2_PAR 27
33 #define TC_SUBTYPE_LOAD_SBM1_PAR 25
27 #define TC_SUBTYPE_DUMP_PAR 31
34 #define TC_SUBTYPE_LOAD_SBM2_PAR 27
28 #define TC_SUBTYPE_ENTER_MODE 41
35 #define TC_SUBTYPE_DUMP_PAR 31
36 #define TC_SUBTYPE_ENTER_MODE 41
37 #define TC_SUBTYPE_UPDATE_INFO 51
38 #define TC_SUBTYPE_ENABLE_CALIBRATION 61
39 #define TC_SUBTYPE_DISABLE_CALIBRATION 63
40 #define TC_SUBTYPE_UPDATE_TIME 129
29
41
30 // OTHER CONSTANTS
42 // OTHER CONSTANTS
31 #define TC_LFR_PACKET_SEQUENCE_CONTROL 0xc000 // PID 76 CAT 12
43 #define TC_LFR_PACKET_SEQUENCE_CONTROL 0xc000 // PID 76 CAT 12
32 #define TC_LFR_DATA_FIELD_HEADER0 0x19
44 #define TC_LFR_DATA_FIELD_HEADER0 0x19
33 #define TC_LFR_LOAD_COMMON_PAR_SPARE 0x00
45 #define TC_LFR_LOAD_COMMON_PAR_SPARE 0x00
34
46
47 struct Packet_TC_LFR_RESET_str
48 { // the CCSDS header is added by LPPMON
49 unsigned char packetID[2];
50 unsigned char packetSequenceControl[2];
51 unsigned char packetLength[2];
52 // DATA FIELD HEADER
53 unsigned char ccsdsSecHeaderFlag_pusVersion_ack;
54 unsigned char serviceType;
55 unsigned char serviceSubType;
56 unsigned char sourceID;
57 unsigned char crc[2];
58 };
59 typedef struct Packet_TC_LFR_RESET_str Packet_TC_LFR_RESET_t;
60
35 struct Packet_TC_LFR_ENTER_MODE_str
61 struct Packet_TC_LFR_ENTER_MODE_str
36 { // the CCSDS header is added by LPPMON
62 { // the CCSDS header is added by LPPMON
37 unsigned char packetID[2];
63 unsigned char packetID[2];
@@ -49,6 +75,29 struct Packet_TC_LFR_ENTER_MODE_str
49 };
75 };
50 typedef struct Packet_TC_LFR_ENTER_MODE_str Packet_TC_LFR_ENTER_MODE_t;
76 typedef struct Packet_TC_LFR_ENTER_MODE_str Packet_TC_LFR_ENTER_MODE_t;
51
77
78 struct Packet_TC_LFR_UPDATE_INFO_str
79 { // the CCSDS header is added by LPPMON
80 unsigned char packetID[2];
81 unsigned char packetSequenceControl[2];
82 unsigned char packetLength[2];
83 // DATA FIELD HEADER
84 unsigned char ccsdsSecHeaderFlag_pusVersion_ack;
85 unsigned char serviceType;
86 unsigned char serviceSubType;
87 unsigned char sourceID;
88 unsigned char set1;
89 unsigned char set2;
90 unsigned char set3_bias_setting_set1[6];
91 unsigned char set3_bias_setting_set2[6];
92 unsigned char set3_bias_voltage[4];
93 unsigned char set4[8];
94 unsigned char set5;
95 unsigned char set6;
96 unsigned char set7[8];
97 unsigned char crc[2];
98 };
99 typedef struct Packet_TC_LFR_UPDATE_INFO_str Packet_TC_LFR_UPDATE_INFO_t;
100
52 struct Packet_TC_LFR_DUMP_PAR_str
101 struct Packet_TC_LFR_DUMP_PAR_str
53 { // the CCSDS header is added by LPPMON
102 { // the CCSDS header is added by LPPMON
54 unsigned char packetID[2];
103 unsigned char packetID[2];
@@ -116,4 +165,33 struct Packet_TC_LFR_LOAD_BURST_SBM1_SBM
116 };
165 };
117 typedef struct Packet_TC_LFR_LOAD_BURST_SBM1_SBM2_PAR_str Packet_TC_LFR_LOAD_BURST_SBM1_SBM2_PAR_t;
166 typedef struct Packet_TC_LFR_LOAD_BURST_SBM1_SBM2_PAR_str Packet_TC_LFR_LOAD_BURST_SBM1_SBM2_PAR_t;
118
167
168 struct Packet_TC_LFR_ENABLE_DISABLE_CALIBRATION_str
169 { // the CCSDS header is added by LPPMON
170 unsigned char packetID[2];
171 unsigned char packetSequenceControl[2];
172 unsigned char packetLength[2];
173 // DATA FIELD HEADER
174 unsigned char ccsdsSecHeaderFlag_pusVersion_ack;
175 unsigned char serviceType;
176 unsigned char serviceSubType;
177 unsigned char sourceID;
178 unsigned char crc[2];
179 };
180 typedef struct Packet_TC_LFR_ENABLE_DISABLE_CALIBRATION_str Packet_TC_LFR_ENABLE_DISABLE_CALIBRATION_t;
181
182 struct Packet_TC_LFR_UPDATE_TIME_str
183 { // the CCSDS header is added by LPPMON
184 unsigned char packetID[2];
185 unsigned char packetSequenceControl[2];
186 unsigned char packetLength[2];
187 // DATA FIELD HEADER
188 unsigned char ccsdsSecHeaderFlag_pusVersion_ack;
189 unsigned char serviceType;
190 unsigned char serviceSubType;
191 unsigned char sourceID;
192 unsigned char cp_rpw_time[6];
193 unsigned char crc[2];
194 };
195 typedef struct Packet_TC_LFR_UPDATE_TIME_str Packet_TC_LFR_UPDATE_TIME_t;
196
119 #endif // TC_TYPES_H
197 #endif // TC_TYPES_H
@@ -13,20 +13,31
13 #define CCSDS_NODE_ADDRESS 0xfe
13 #define CCSDS_NODE_ADDRESS 0xfe
14 #define CCSDS_USER_APP 0x00
14 #define CCSDS_USER_APP 0x00
15
15
16 #define DEFAULT_SPARE1_PUSVERSION_SPARE2 0x10
17 #define DEFAULT_RESERVED 0x00
18 #define DEFAULT_HKBIA 0x1f
19
16 // PACKET ID
20 // PACKET ID
17 #define TM_PACKET_ID_TC_EXE 0x0cc1 // PID 76 CAT 1
21 #define TM_PACKET_ID_TC_EXE 0x0cc1 // PID 76 CAT 1
18 #define TM_PACKET_ID_HK 0x0cc4 // PID 76 CAT 4
22 #define TM_PACKET_ID_HK 0x0cc4 // PID 76 CAT 4
19 #define TM_PACKET_ID_PARAMETER_DUMP 0x0cc9 // PID 76 CAT 9
23 #define TM_PACKET_ID_PARAMETER_DUMP 0x0cc9 // PID 76 CAT 9
20 #define TM_PACKET_ID_SCIENCE_NORMAL 0x0ccc // PID 76 CAT 12
24 #define TM_PACKET_ID_SCIENCE_NORMAL 0x0ccc // PID 76 CAT 12
21 #define TM_PACKET_ID_SCIENCE_BURST_SBM1_SBM2 0x0cfc // PID 79 CAT 12
25 #define TM_PACKET_ID_SCIENCE_BURST_SBM1_SBM2 0x0cfc // PID 79 CAT 12
26 #define TM_PACKET_PID_DEFAULT 76
27 #define TM_PACKET_PID_BURST_SBM1_SBM2 79
28 #define TM_PACKET_CAT_TC_EXE 1
29 #define TM_PACKET_CAT_HK 4
30 #define TM_PACKET_CAT_PARAMETER_DUMP 9
31 #define TM_PACKET_CAT_SCIENCE 12
22
32
23 // PACKET SEQUENCE CONTROL
33 // PACKET SEQUENCE CONTROL
24 #define TM_PACKET_SEQ_CTRL_CONTINUATION 0
34 #define TM_PACKET_SEQ_CTRL_CONTINUATION 0x00 // [0000 0000]
25 #define TM_PACKET_SEQ_CTRL_FIRST 1
35 #define TM_PACKET_SEQ_CTRL_FIRST 0x40 // [0100 0000]
26 #define TM_PACKET_SEQ_CTRL_LAST 2
36 #define TM_PACKET_SEQ_CTRL_LAST 0x80 // [1000 0000]
27 #define TM_PACKET_SEQ_CTRL_STANDALONE 3
37 #define TM_PACKET_SEQ_CTRL_STANDALONE 0xc0 // [1100 0000]
38 #define TM_PACKET_SEQ_CNT_DEFAULT 0x00 // [0000 0000]
28
39
29 //
40 // DESTINATION ID
30 #define TM_DESTINATION_ID_GROUND 0
41 #define TM_DESTINATION_ID_GROUND 0
31 #define TM_DESTINATION_ID_MISSION_TIMELINE 110
42 #define TM_DESTINATION_ID_MISSION_TIMELINE 110
32 #define TM_DESTINATION_ID_TC_SEQUENCES 111
43 #define TM_DESTINATION_ID_TC_SEQUENCES 111
@@ -48,15 +59,6
48 #define SIZE_TM_LFR_TC_EXE_CORRUPTED 32
59 #define SIZE_TM_LFR_TC_EXE_CORRUPTED 32
49 #define SIZE_HK_PARAMETERS 112
60 #define SIZE_HK_PARAMETERS 112
50
61
51 #define ILLEGAL_APID 0
52 #define WRONG_LEN_PACKET 1
53 #define INCOR_CHECKSUM 2
54 #define ILL_TYPE 3
55 #define ILL_SUBTYPE 4
56 #define WRONG_APP_DATA 5
57 #define WRONG_CMD_CODE 6
58 #define CCSDS_TM_VALID 7
59
60 // TC TYPES
62 // TC TYPES
61 #define TC_TYPE_GEN 181
63 #define TC_TYPE_GEN 181
62 #define TC_TYPE_TIME 9
64 #define TC_TYPE_TIME 9
@@ -104,11 +106,21
104 #define TM_SUBTYPE_LFR_SCIENCE 3
106 #define TM_SUBTYPE_LFR_SCIENCE 3
105
107
106 // FAILURE CODES
108 // FAILURE CODES
109 #define ILLEGAL_APID 0
110 #define WRONG_LEN_PACKET 1
111 #define INCOR_CHECKSUM 2
112 #define ILL_TYPE 3
113 #define ILL_SUBTYPE 4
114 #define WRONG_APP_DATA 5
115 //
116 #define WRONG_CMD_CODE 6
117 #define CCSDS_TM_VALID 7
107 #define FAILURE_CODE_INCONSISTENT 5 // 0x00 0x05
118 #define FAILURE_CODE_INCONSISTENT 5 // 0x00 0x05
108 #define FAILURE_CODE_NOT_EXECUTABLE 42000 // 0xa4 0x10
119 #define FAILURE_CODE_NOT_EXECUTABLE 42000 // 0xa4 0x10
109 #define FAILURE_CODE_NOT_IMPLEMENTED 42002 // 0xa4 0x12
120 #define FAILURE_CODE_NOT_IMPLEMENTED 42002 // 0xa4 0x12
110 #define FAILURE_CODE_ERROR 42003 // 0xa4 0x13
121 #define FAILURE_CODE_ERROR 42003 // 0xa4 0x13
111 #define FAILURE_CODE_CORRUPTED 42005 // 0xa4 0x15
122 #define FAILURE_CODE_CORRUPTED 42005 // 0xa4 0x15
123
112 // TM SID
124 // TM SID
113 #define SID_DEFAULT 0
125 #define SID_DEFAULT 0
114 #define SID_EXE_INC 5
126 #define SID_EXE_INC 5
@@ -143,8 +155,8
143 #define SID_SBM1_BP2_F0 31
155 #define SID_SBM1_BP2_F0 31
144 #define SID_SBM2_BP1_F0 29
156 #define SID_SBM2_BP1_F0 29
145 #define SID_SBM2_BP2_F0 32
157 #define SID_SBM2_BP2_F0 32
146 #define SID_SBM1_BP1_F1 30
158 #define SID_SBM2_BP1_F1 30
147 #define SID_SBM1_BP2_F1 33
159 #define SID_SBM2_BP2_F1 33
148
160
149 // LENGTH (BYTES)
161 // LENGTH (BYTES)
150 #define LENGTH_TM_LFR_TC_EXE_MAX 32
162 #define LENGTH_TM_LFR_TC_EXE_MAX 32
@@ -166,13 +178,16
166
178
167 #define SPARE1_PUSVERSION_SPARE2 0x10
179 #define SPARE1_PUSVERSION_SPARE2 0x10
168
180
169 #define LEN_TM_LFR_HK 126 + 4
181 #define LEN_TM_LFR_HK 126 + 4
170 #define LEN_TM_LFR_TC_EXE_NOT_IMP 24 +4
182 #define LEN_TM_LFR_TC_EXE_NOT_IMP 24 +4
171
183
172 #define TM_LEN_SCI_SWF_340 340 * 12 + 10 + 12 - 1
184 #define TM_LEN_SCI_SWF_340 (340 * 12 + 10 + 12 - 1)
173 #define TM_LEN_SCI_SWF_8 8 * 12 + 10 + 12 - 1
185 #define TM_LEN_SCI_SWF_8 (8 * 12 + 10 + 12 - 1)
174 #define TM_LEN_SCI_CWF_340 340 * 12 + 10 + 10 - 1
186 #define TM_LEN_SCI_CWF_340 (340 * 12 + 10 + 10 - 1)
175 #define TM_LEN_SCI_CWF_8 8 * 12 + 10 + 10 - 1
187 #define TM_LEN_SCI_CWF_8 (8 * 12 + 10 + 10 - 1)
188 #define DEFAULT_PKTCNT 0x07
189 #define BLK_NR_340 0x0154
190 #define BLK_NR_8 0x0008
176
191
177 enum TM_TYPE{
192 enum TM_TYPE{
178 TM_LFR_TC_EXE_OK,
193 TM_LFR_TC_EXE_OK,
@@ -220,6 +235,35 struct Packet_TM_LFR_TC_EXE_str
220 };
235 };
221 typedef struct Packet_TM_LFR_TC_EXE_str Packet_TM_LFR_TC_EXE_t;
236 typedef struct Packet_TM_LFR_TC_EXE_str Packet_TM_LFR_TC_EXE_t;
222
237
238 struct Packet_TM_LFR_TC_EXE_CORRUPTED_str
239 {
240 volatile unsigned char targetLogicalAddress;
241 volatile unsigned char protocolIdentifier;
242 volatile unsigned char reserved;
243 volatile unsigned char userApplication;
244 // PACKET HEADER
245 volatile unsigned char packetID[2];
246 volatile unsigned char packetSequenceControl[2];
247 volatile unsigned char packetLength[2];
248 // DATA FIELD HEADER
249 volatile unsigned char spare1_pusVersion_spare2;
250 volatile unsigned char serviceType;
251 volatile unsigned char serviceSubType;
252 volatile unsigned char destinationID;
253 volatile unsigned char time[6];
254 //
255 volatile unsigned char tc_failure_code[2];
256 volatile unsigned char telecommand_pkt_id[2];
257 volatile unsigned char pkt_seq_control[2];
258 volatile unsigned char tc_service;
259 volatile unsigned char tc_subtype;
260 volatile unsigned char pkt_len_rcv_value[2];
261 volatile unsigned char pkt_datafieldsize_cnt[2];
262 volatile unsigned char rcv_crc[2];
263 volatile unsigned char computed_crc[2];
264 };
265 typedef struct Packet_TM_LFR_TC_EXE_CORRUPTED_str Packet_TM_LFR_TC_EXE_CORRUPTED_t;
266
223 struct Header_TM_LFR_SCIENCE_SWF_str
267 struct Header_TM_LFR_SCIENCE_SWF_str
224 {
268 {
225 volatile unsigned char targetLogicalAddress;
269 volatile unsigned char targetLogicalAddress;
@@ -320,7 +364,11 struct Packet_TM_LFR_HK_str
320 volatile unsigned char packetID[2];
364 volatile unsigned char packetID[2];
321 volatile unsigned char packetSequenceControl[2];
365 volatile unsigned char packetSequenceControl[2];
322 volatile unsigned char packetLength[2];
366 volatile unsigned char packetLength[2];
323 volatile unsigned char dataFieldHeader[10];
367 volatile unsigned char spare1_pusVersion_spare2;
368 volatile unsigned char serviceType;
369 volatile unsigned char serviceSubType;
370 volatile unsigned char destinationID;
371 volatile unsigned char time[6];
324 volatile unsigned char sid;
372 volatile unsigned char sid;
325
373
326 //**************
374 //**************
@@ -9,13 +9,15
9 #include <grspw.h>
9 #include <grspw.h>
10 #include <apbuart.h>
10 #include <apbuart.h>
11
11
12 #include <fsw_params.h>
12 #include "fsw_params.h"
13 #include <fsw_misc.h>
13 #include "fsw_misc.h"
14 #include <fsw_processing.h>
14 #include "fsw_processing.h"
15 #include <tc_handler.h>
15 #include "tc_handler.h"
16 #include <wf_handler.h>
16 #include "wf_handler.h"
17 #include <grlib_regs.h>
17 #include "grlib_regs.h"
18 #include <ccsds_types.h>
18 #include "ccsds_types.h"
19
20 #include "fsw_spacewire.h"
19
21
20 extern int sched_yield( void );
22 extern int sched_yield( void );
21 extern int errno;
23 extern int errno;
@@ -24,41 +26,30 extern rtems_name Task_name[ ]; /* a
24 extern rtems_name misc_name[ ]; /* arry of miscellaneous names for rtems objects */
26 extern rtems_name misc_name[ ]; /* arry of miscellaneous names for rtems objects */
25 extern int fdSPW; // grspw file descriptor
27 extern int fdSPW; // grspw file descriptor
26 extern int fdUART; // uart file descriptor
28 extern int fdUART; // uart file descriptor
27
29 extern unsigned char lfrCurrentMode;
28 void timecode_irq_handler(void *pDev, void *regs, int minor, unsigned int tc);
29
30
30 // MODE PARAMETERS
31 // MODE PARAMETERS
31 extern struct param_local_str param_local;
32 extern struct param_local_str param_local;
32 extern Packet_TM_LFR_PARAMETER_DUMP_t parameter_dump_packet;
33 extern Packet_TM_LFR_PARAMETER_DUMP_t parameter_dump_packet;
33 extern Packet_TM_LFR_HK_t housekeeping_packet;
34 extern unsigned short sequenceCounters[SEQ_CNT_NB_PID][SEQ_CNT_NB_CAT][SEQ_CNT_NB_DEST_ID];
34 extern unsigned short sequenceCounters[SEQ_CNT_NB_PID][SEQ_CNT_NB_CAT][SEQ_CNT_NB_DEST_ID];
35
35
36 // RTEMS TASKS
36 // RTEMS TASKS
37 rtems_task Init( rtems_task_argument argument); /* forward declaration needed */
37 rtems_task Init( rtems_task_argument argument); /* forward declaration needed */
38 rtems_task recv_task(rtems_task_argument argument);
38 rtems_task recv_task(rtems_task_argument argument);
39 rtems_task spiq_task(rtems_task_argument argument);
40 rtems_task stat_task(rtems_task_argument argument);
39 rtems_task stat_task(rtems_task_argument argument);
41 rtems_task wfrm_task(rtems_task_argument argument);
40 rtems_task wfrm_task(rtems_task_argument argument);
42 int create_names( void );
41 int create_names( void );
43 int create_all_tasks( void );
42 int create_all_tasks( void );
44 int start_all_tasks( void );
43 int start_all_tasks( void );
45 int create_message_queue( void );
44 int create_message_queue( void );
45 int create_message_queues( void );
46
46
47 // OTHER functions
47 // OTHER functions
48 void init_parameter_dump( void );
48 void init_parameter_dump( void );
49 void init_local_mode_parameters( void );
49 void init_local_mode_parameters( void );
50 void init_housekeeping_parameters( void );
50 void init_housekeeping_parameters( void );
51
51
52 int spacewire_configure_link( void );
53 int spacewire_wait_for_link(void);
54 void spacewire_set_NP(unsigned char val, unsigned int regAddr); // No Port force
55 void spacewire_set_RE(unsigned char val, unsigned int regAddr); // RMAP Enable
56 void spacewire_compute_stats_offsets();
57
58 extern int rtems_cpu_usage_report( void );
52 extern int rtems_cpu_usage_report( void );
59 extern int rtems_cpu_usage_reset( void );
53 extern int rtems_cpu_usage_reset( void );
60
54
61 rtems_status_code write_spw(spw_ioctl_pkt_send* spw_ioctl_send);
62 void (*grspw_timecode_callback) (void *pDev, void *regs, int minor, unsigned int tc);
63
64 #endif // FSW_RTEMS_CONFIG_H_INCLUDED
55 #endif // FSW_RTEMS_CONFIG_H_INCLUDED
@@ -4,16 +4,16
4 #include <rtems.h>
4 #include <rtems.h>
5 #include <stdio.h>
5 #include <stdio.h>
6
6
7 #include <fsw_init.h>
8 #include <fsw_params.h>
9 #include <grlib_regs.h>
10 #include <grspw.h>
7 #include <grspw.h>
11 #include <ccsds_types.h>
8
9 #include "fsw_init.h"
10 #include "fsw_params.h"
11 #include "grlib_regs.h"
12 #include "ccsds_types.h"
12
13
13 rtems_name HK_name; // name of the HK rate monotonic
14 rtems_name HK_name; // name of the HK rate monotonic
14 rtems_id HK_id; // id of the HK rate monotonic period
15 rtems_id HK_id; // id of the HK rate monotonic period
15 extern spw_stats spacewire_stats;
16 extern Packet_TM_LFR_HK_t housekeeping_packet;
16 extern spw_stats spacewire_stats_backup;
17
17
18 int configure_timer(gptimer_regs_t *gptimer_regs, unsigned char timer, unsigned int clock_divider,
18 int configure_timer(gptimer_regs_t *gptimer_regs, unsigned char timer, unsigned int clock_divider,
19 unsigned char interrupt_level, rtems_isr (*timer_isr)() );
19 unsigned char interrupt_level, rtems_isr (*timer_isr)() );
@@ -29,5 +29,6 int set_apbuart_scaler_reload_register(u
29 // RTEMS TASKS
29 // RTEMS TASKS
30 rtems_task stat_task(rtems_task_argument argument);
30 rtems_task stat_task(rtems_task_argument argument);
31 rtems_task hous_task(rtems_task_argument argument);
31 rtems_task hous_task(rtems_task_argument argument);
32 rtems_task send_task(rtems_task_argument argument);
32
33
33 #endif // FSW_MISC_H_INCLUDED
34 #endif // FSW_MISC_H_INCLUDED
@@ -24,7 +24,6
24 #define RTEMS_EVENT_MODE_BURST RTEMS_EVENT_2
24 #define RTEMS_EVENT_MODE_BURST RTEMS_EVENT_2
25 #define RTEMS_EVENT_MODE_SBM1 RTEMS_EVENT_3
25 #define RTEMS_EVENT_MODE_SBM1 RTEMS_EVENT_3
26 #define RTEMS_EVENT_MODE_SBM2 RTEMS_EVENT_4
26 #define RTEMS_EVENT_MODE_SBM2 RTEMS_EVENT_4
27 #define RTEMS_EVENT_MODE_NORMAL_CWF_F3 RTEMS_EVENT_5
28
27
29 //****************************
28 //****************************
30 // LFR DEFAULT MODE PARAMETERS
29 // LFR DEFAULT MODE PARAMETERS
@@ -47,6 +46,11
47 // SBM2
46 // SBM2
48 #define DEFAULT_SY_LFR_S2_BP_P0 1 // sec
47 #define DEFAULT_SY_LFR_S2_BP_P0 1 // sec
49 #define DEFAULT_SY_LFR_S2_BP_P1 5 // sec
48 #define DEFAULT_SY_LFR_S2_BP_P1 5 // sec
49 // ADDITIONAL PARAMETERS
50 #define TIME_BETWEEN_TWO_SWF_PACKETS 30 // nb x 10 ms => 300 ms
51 #define TIME_BETWEEN_TWO_CWF3_PACKETS 1000 // nb x 10 ms => 10 s
52 //
53 //****************************
50
54
51 //*****************************
55 //*****************************
52 // APB REGISTERS BASE ADDRESSES
56 // APB REGISTERS BASE ADDRESSES
@@ -106,8 +110,32
106 #define TASKID_HOUS 10
110 #define TASKID_HOUS 10
107 #define TASKID_MATR 11
111 #define TASKID_MATR 11
108 #define TASKID_CWF3 12
112 #define TASKID_CWF3 12
113 #define TASKID_CWF2 13
114 #define TASKID_CWF1 14
115 #define TASKID_SEND 15
116
117 //*********************************************************************
118 // ALL TASKS THAT USE THE SPACEWIRE DIRVER SHALL HAVE THE SAME PRIORITY
119 // OR CHANGE THE SEMAPHORE CREATION IN THE DRIVER...
120 #define TASK_PRIORITY_SPIQ 5
121 #define TASK_PRIORITY_SMIQ 10
122 #define TASK_PRIORITY_SEND 11
123 #define TASK_PRIORITY_RECV 12
124 #define TASK_PRIORITY_ACTN 12
125 #define TASK_PRIORITY_CWF1 14
126 #define TASK_PRIORITY_HOUS 15
127 #define TASK_PRIORITY_CWF2 15
128 #define TASK_PRIORITY_WFRM 15
129 #define TASK_PRIORITY_CWF3 15
130 #define TASK_PRIORITY_AVF0 50
131 #define TASK_PRIORITY_BPF0 50
132 #define TASK_PRIORITY_MATR 250
133 #define TASK_PRIORITY_STAT 251
134 #define TASK_PRIORITY_DUMB 251
109
135
110 #define ACTION_MSG_QUEUE_COUNT 10
136 #define ACTION_MSG_QUEUE_COUNT 10
137 #define ACTION_MSG_PKTS_COUNT 50
138 #define ACTION_MSG_PKTS_SIZE
111
139
112 //*******
140 //*******
113 // MACROS
141 // MACROS
@@ -121,6 +149,8
121 #define PRINTF2(x,y,z) ;
149 #define PRINTF2(x,y,z) ;
122 #endif
150 #endif
123
151
152 #define CPU_USAGE_REPORT_PERIOD 6 // * 10 s = period
153
124 #define NB_SAMPLES_PER_SNAPSHOT 2048
154 #define NB_SAMPLES_PER_SNAPSHOT 2048
125 #define TIME_OFFSET 2
155 #define TIME_OFFSET 2
126 #define WAVEFORM_EXTENDED_HEADER_OFFSET 22
156 #define WAVEFORM_EXTENDED_HEADER_OFFSET 22
@@ -8,9 +8,12
8 #include <sys/ioctl.h> // for the ioctl call
8 #include <sys/ioctl.h> // for the ioctl call
9 #include <ccsds_types.h>
9 #include <ccsds_types.h>
10 #include <grspw.h>
10 #include <grspw.h>
11 #include <fsw_init.h>
11
12 #include "fsw_init.h"
13 #include "fsw_misc.h"
12
14
13 extern int fdSPW;
15 extern int fdSPW;
16 extern unsigned char lfrCurrentMode;
14 extern rtems_name misc_name[ ];
17 extern rtems_name misc_name[ ];
15 extern rtems_name misc_id[ ];
18 extern rtems_name misc_id[ ];
16 extern rtems_id Task_id[ ]; // array of task ids
19 extern rtems_id Task_id[ ]; // array of task ids
@@ -18,7 +21,6 extern rtems_id Task_id[ ]; // a
18 extern struct param_sbm1_str param_sbm1;
21 extern struct param_sbm1_str param_sbm1;
19 extern struct param_sbm2_str param_sbm2;
22 extern struct param_sbm2_str param_sbm2;
20 extern Packet_TM_LFR_PARAMETER_DUMP_t parameter_dump_packet;
23 extern Packet_TM_LFR_PARAMETER_DUMP_t parameter_dump_packet;
21 extern Packet_TM_LFR_HK_t housekeeping_packet;
22 extern time_management_regs_t *time_management_regs;
24 extern time_management_regs_t *time_management_regs;
23 extern waveform_picker_regs_t *waveform_picker_regs;
25 extern waveform_picker_regs_t *waveform_picker_regs;
24 extern gptimer_regs_t *gptimer_regs;
26 extern gptimer_regs_t *gptimer_regs;
@@ -30,8 +32,10 rtems_isr commutation_isr2( rtems_vector
30
32
31 //**********************
33 //**********************
32 // GENERAL USE FUNCTIONS
34 // GENERAL USE FUNCTIONS
35 unsigned int Crc_opt( unsigned char D, unsigned int Chk);
33 void initLookUpTableForCRC( void );
36 void initLookUpTableForCRC( void );
34 void GetCRCAsTwoBytes(unsigned char* data, unsigned char* crcAsTwoBytes, unsigned int sizeOfData);
37 void GetCRCAsTwoBytes(unsigned char* data, unsigned char* crcAsTwoBytes, unsigned int sizeOfData);
38 void updateLFRCurrentMode();
35
39
36 //*********************
40 //*********************
37 // ACCEPTANCE FUNCTIONS
41 // ACCEPTANCE FUNCTIONS
@@ -40,41 +44,40 unsigned char TC_parser(ccsdsTelecommand
40
44
41 unsigned char TM_build_header( enum TM_TYPE tm_type, unsigned int packetLength,
45 unsigned char TM_build_header( enum TM_TYPE tm_type, unsigned int packetLength,
42 TMHeader_t *TMHeader, unsigned char tc_sid);
46 TMHeader_t *TMHeader, unsigned char tc_sid);
43 unsigned char TM_build_data(ccsdsTelecommandPacket_t *TC, char* data, unsigned int SID, unsigned char *computed_CRC);
44
47
45 //***********
48 //***********
46 // RTEMS TASK
49 // RTEMS TASK
47 rtems_task recv_task( rtems_task_argument unused );
50 rtems_task recv_task( rtems_task_argument unused );
48 rtems_task actn_task( rtems_task_argument unused );
51 rtems_task actn_task( rtems_task_argument unused );
49 rtems_task dumb_task( rtems_task_argument unused );
52 rtems_task dumb_task( rtems_task_argument unused );
50 int create_message_queue( void );
51
53
52 //***********
54 //***********
53 // TC ACTIONS
55 // TC ACTIONS
54 int action_default(ccsdsTelecommandPacket_t *TC);
56 int action_reset(ccsdsTelecommandPacket_t *TC);
55 int action_enter(ccsdsTelecommandPacket_t *TC);
57 int action_load_common_par(ccsdsTelecommandPacket_t *TC);
56 int action_updt_info(ccsdsTelecommandPacket_t *TC);
58 int action_load_normal_par(ccsdsTelecommandPacket_t *TC);
59 int action_load_burst_par(ccsdsTelecommandPacket_t *TC);
60 int action_load_sbm1_par(ccsdsTelecommandPacket_t *TC);
61 int action_load_sbm2_par(ccsdsTelecommandPacket_t *TC);
62 int action_dump_par(ccsdsTelecommandPacket_t *TC);
63 int action_enter_mode(ccsdsTelecommandPacket_t *TC);
64 int action_update_info(ccsdsTelecommandPacket_t *TC);
57 int action_enable_calibration(ccsdsTelecommandPacket_t *TC);
65 int action_enable_calibration(ccsdsTelecommandPacket_t *TC);
58 int action_disable_calibration(ccsdsTelecommandPacket_t *TC);
66 int action_disable_calibration(ccsdsTelecommandPacket_t *TC);
59 int action_updt_time(ccsdsTelecommandPacket_t *TC);
67 int action_update_time(ccsdsTelecommandPacket_t *TC);
68
60 // mode transition
69 // mode transition
61 int transition_validation(unsigned char requestedMode);
70 int transition_validation(unsigned char requestedMode);
62 int stop_current_mode();
71 int stop_current_mode();
63 int enter_mode(unsigned char mode, ccsdsTelecommandPacket_t *TC);
72 int enter_mode(unsigned char mode, ccsdsTelecommandPacket_t *TC);
64 int enter_standby_mode(ccsdsTelecommandPacket_t *TC);
73 int enter_standby_mode();
65 int enter_normal_mode(ccsdsTelecommandPacket_t *TC);
74 int enter_normal_mode();
66 int enter_burst_mode(ccsdsTelecommandPacket_t *TC);
75 int enter_burst_mode();
67 int enter_sbm1_mode(ccsdsTelecommandPacket_t *TC);
76 int enter_sbm1_mode();
68 int enter_sbm2_mode(ccsdsTelecommandPacket_t *TC);
77 int enter_sbm2_mode();
69 int restart_science_tasks();
78 int restart_science_tasks();
70 int suspend_science_tasks();
79 int suspend_science_tasks();
71 // parameters loading
80
72 int action_load_comm(ccsdsTelecommandPacket_t *TC);
73 int action_load_norm(ccsdsTelecommandPacket_t *TC);
74 int action_load_burst(ccsdsTelecommandPacket_t *TC);
75 int action_load_sbm1(ccsdsTelecommandPacket_t *TC);
76 int action_load_sbm2(ccsdsTelecommandPacket_t *TC);
77 int action_dump(ccsdsTelecommandPacket_t *TC);
78 // other functions
81 // other functions
79 void update_last_TC_exe(ccsdsTelecommandPacket_t *TC);
82 void update_last_TC_exe(ccsdsTelecommandPacket_t *TC);
80 void update_last_TC_rej(ccsdsTelecommandPacket_t *TC);
83 void update_last_TC_rej(ccsdsTelecommandPacket_t *TC);
@@ -2,14 +2,16
2 #define WF_HANDLER_H_INCLUDED
2 #define WF_HANDLER_H_INCLUDED
3
3
4 #include <rtems.h>
4 #include <rtems.h>
5 #include <fsw_params.h>
6 #include <grspw.h>
5 #include <grspw.h>
7 #include <grlib_regs.h>
6
8 #include <ccsds_types.h>
9 #include <stdio.h>
7 #include <stdio.h>
10 #include <fsw_init.h>
11 #include <math.h>
8 #include <math.h>
12
9
10 #include "fsw_params.h"
11 #include "grlib_regs.h"
12 #include "ccsds_types.h"
13 #include "fsw_init.h"
14
13 #define pi 3.1415
15 #define pi 3.1415
14
16
15 //#include <sys/ioctl.h>
17 //#include <sys/ioctl.h>
@@ -17,35 +19,38
17 extern rtems_id Task_id[]; /* array of task ids */
19 extern rtems_id Task_id[]; /* array of task ids */
18 extern int fdSPW;
20 extern int fdSPW;
19 extern volatile int wf_snap_f0[ ];
21 extern volatile int wf_snap_f0[ ];
22 //
20 extern volatile int wf_snap_f1[ ];
23 extern volatile int wf_snap_f1[ ];
21 extern volatile int wf_snap_f1_bis[ ];
24 extern volatile int wf_snap_f1_bis[ ];
25 extern volatile int wf_snap_f1_norm[ ];
26 //
22 extern volatile int wf_snap_f2[ ];
27 extern volatile int wf_snap_f2[ ];
23 extern volatile int wf_snap_f2_bis[ ];
28 extern volatile int wf_snap_f2_bis[ ];
29 extern volatile int wf_snap_f2_norm[ ];
30 //
24 extern volatile int wf_cont_f3[ ];
31 extern volatile int wf_cont_f3[ ];
25 extern volatile int wf_cont_f3_bis[ ];
32 extern volatile int wf_cont_f3_bis[ ];
26 extern waveform_picker_regs_t *waveform_picker_regs;
33 extern waveform_picker_regs_t *waveform_picker_regs;
34 extern unsigned char lfrCurrentMode;
27
35
28 rtems_isr waveforms_isr( rtems_vector_number vector );
36 rtems_isr waveforms_isr( rtems_vector_number vector );
29 rtems_isr waveforms_simulator_isr( rtems_vector_number vector );
37 rtems_isr waveforms_simulator_isr( rtems_vector_number vector );
30 rtems_task wfrm_task(rtems_task_argument argument);
38 rtems_task wfrm_task(rtems_task_argument argument);
31 rtems_task cwf3_task(rtems_task_argument argument);
39 rtems_task cwf3_task(rtems_task_argument argument);
40 rtems_task cwf2_task(rtems_task_argument argument);
41 rtems_task cwf1_task(rtems_task_argument argument);
32
42
33 //******************
43 //******************
34 // general functions
44 // general functions
35 void init_waveforms( void );
45 void init_waveforms( void );
36 void init_header_snapshot_wf( Header_TM_LFR_SCIENCE_SWF_t *header );
46 //
37 void init_header_continuous_wf( Header_TM_LFR_SCIENCE_CWF_t *header );
47 int init_header_snapshot_wf_table( unsigned int sid );
48 int init_header_continuous_wf_table(unsigned int sid , Header_TM_LFR_SCIENCE_CWF_t *headerCWF);
49 //
38 void reset_waveforms( void );
50 void reset_waveforms( void );
39 void send_waveform_norm( Header_TM_LFR_SCIENCE_SWF_t *header, spw_ioctl_pkt_send *spw_ioctl_send );
40 void send_waveform_burst( Header_TM_LFR_SCIENCE_CWF_t *header, spw_ioctl_pkt_send *spw_ioctl_send );
41 void send_waveform_sbm1( Header_TM_LFR_SCIENCE_CWF_t *header, spw_ioctl_pkt_send *spw_ioctl_send );
42 void send_waveform_sbm2( Header_TM_LFR_SCIENCE_CWF_t *header, spw_ioctl_pkt_send *spw_ioctl_send );
43 void send_waveform_norm_cwf_f3(Header_TM_LFR_SCIENCE_CWF_t *header, spw_ioctl_pkt_send *spw_ioctl_send );
44
51
45 void send_waveform_SWF( Header_TM_LFR_SCIENCE_SWF_t *header, volatile int *waveform,
52 int send_waveform_SWF(volatile int *waveform, unsigned int sid);
46 unsigned int sid, spw_ioctl_pkt_send *spw_ioctl_send );
53 int send_waveform_CWF(volatile int *waveform, unsigned int sid, Header_TM_LFR_SCIENCE_CWF_t *headerCWF);
47 void send_waveform_CWF( Header_TM_LFR_SCIENCE_CWF_t *header, volatile int *waveform,
48 unsigned int sid, spw_ioctl_pkt_send *spw_ioctl_send );
49
54
50 //**************
55 //**************
51 // wfp registers
56 // wfp registers
@@ -53,6 +58,7 void set_wfp_data_shaping();
53 char set_wfp_delta_snapshot();
58 char set_wfp_delta_snapshot();
54 void set_wfp_burst_enable_register( unsigned char mode);
59 void set_wfp_burst_enable_register( unsigned char mode);
55 void reset_wfp_burst_enable();
60 void reset_wfp_burst_enable();
61 void reset_wfp_status();
56 void reset_waveform_picker_regs();
62 void reset_waveform_picker_regs();
57
63
58 //*****************
64 //*****************
@@ -2,7 +2,7
2
2
3 // GRSPW0 resources
3 // GRSPW0 resources
4 struct drvmgr_key grlib_grspw_0n1_res[] = {
4 struct drvmgr_key grlib_grspw_0n1_res[] = {
5 {"txBdCnt", KEY_TYPE_INT, {(unsigned int)10}},
5 {"txBdCnt", KEY_TYPE_INT, {(unsigned int)50}}, // 7 SWF_F0, 7 SWF_F1, 7 SWF_F2, 7 CWF_F3, 7 CWF_F1 ou 7 CWF_F2
6 {"rxBdCnt", KEY_TYPE_INT, {(unsigned int)10}},
6 {"rxBdCnt", KEY_TYPE_INT, {(unsigned int)10}},
7 {"txDataSize", KEY_TYPE_INT, {(unsigned int)4096}},
7 {"txDataSize", KEY_TYPE_INT, {(unsigned int)4096}},
8 {"txHdrSize", KEY_TYPE_INT, {(unsigned int)20+12}}, // 12 is for the auxiliary header, when needed
8 {"txHdrSize", KEY_TYPE_INT, {(unsigned int)20+12}}, // 12 is for the auxiliary header, when needed
@@ -8,10 +8,11
8 // RTEMS GLOBAL VARIABLES
8 // RTEMS GLOBAL VARIABLES
9 rtems_name misc_name[5];
9 rtems_name misc_name[5];
10 rtems_name misc_id[5];
10 rtems_name misc_id[5];
11 rtems_id Task_id[15]; /* array of task ids */
11 rtems_id Task_id[20]; /* array of task ids */
12 rtems_name Task_name[15]; /* array of task names */
12 rtems_name Task_name[20]; /* array of task names */
13 int fdSPW = 0;
13 int fdSPW = 0;
14 int fdUART = 0;
14 int fdUART = 0;
15 unsigned char lfrCurrentMode;
15
16
16 // APB CONFIGURATION REGISTERS
17 // APB CONFIGURATION REGISTERS
17 time_management_regs_t *time_management_regs = (time_management_regs_t*) REGS_ADDR_TIME_MANAGEMENT;
18 time_management_regs_t *time_management_regs = (time_management_regs_t*) REGS_ADDR_TIME_MANAGEMENT;
@@ -24,10 +25,15 spectral_matrix_regs_t *spectral_matrix_
24
25
25 // WAVEFORMS GLOBAL VARIABLES // 2048 * 3 * 4 + 2 * 4 = 24576 + 8 bytes
26 // WAVEFORMS GLOBAL VARIABLES // 2048 * 3 * 4 + 2 * 4 = 24576 + 8 bytes
26 volatile int wf_snap_f0[ NB_SAMPLES_PER_SNAPSHOT * NB_WORDS_SWF_BLK + TIME_OFFSET];
27 volatile int wf_snap_f0[ NB_SAMPLES_PER_SNAPSHOT * NB_WORDS_SWF_BLK + TIME_OFFSET];
28 //
27 volatile int wf_snap_f1[ NB_SAMPLES_PER_SNAPSHOT * NB_WORDS_SWF_BLK + TIME_OFFSET];
29 volatile int wf_snap_f1[ NB_SAMPLES_PER_SNAPSHOT * NB_WORDS_SWF_BLK + TIME_OFFSET];
28 volatile int wf_snap_f1_bis[ NB_SAMPLES_PER_SNAPSHOT * NB_WORDS_SWF_BLK + TIME_OFFSET];
30 volatile int wf_snap_f1_bis[ NB_SAMPLES_PER_SNAPSHOT * NB_WORDS_SWF_BLK + TIME_OFFSET];
31 volatile int wf_snap_f1_norm[ NB_SAMPLES_PER_SNAPSHOT * NB_WORDS_SWF_BLK + TIME_OFFSET];
32 //
29 volatile int wf_snap_f2[ NB_SAMPLES_PER_SNAPSHOT * NB_WORDS_SWF_BLK + TIME_OFFSET];
33 volatile int wf_snap_f2[ NB_SAMPLES_PER_SNAPSHOT * NB_WORDS_SWF_BLK + TIME_OFFSET];
30 volatile int wf_snap_f2_bis[ NB_SAMPLES_PER_SNAPSHOT * NB_WORDS_SWF_BLK + TIME_OFFSET];
34 volatile int wf_snap_f2_bis[ NB_SAMPLES_PER_SNAPSHOT * NB_WORDS_SWF_BLK + TIME_OFFSET];
35 volatile int wf_snap_f2_norm[ NB_SAMPLES_PER_SNAPSHOT * NB_WORDS_SWF_BLK + TIME_OFFSET];
36 //
31 volatile int wf_cont_f3[ NB_SAMPLES_PER_SNAPSHOT * NB_WORDS_SWF_BLK + TIME_OFFSET];
37 volatile int wf_cont_f3[ NB_SAMPLES_PER_SNAPSHOT * NB_WORDS_SWF_BLK + TIME_OFFSET];
32 volatile int wf_cont_f3_bis[ NB_SAMPLES_PER_SNAPSHOT * NB_WORDS_SWF_BLK + TIME_OFFSET];
38 volatile int wf_cont_f3_bis[ NB_SAMPLES_PER_SNAPSHOT * NB_WORDS_SWF_BLK + TIME_OFFSET];
33
39
@@ -15,14 +15,14
15 #define CONFIGURE_APPLICATION_NEEDS_CONSOLE_DRIVER
15 #define CONFIGURE_APPLICATION_NEEDS_CONSOLE_DRIVER
16 #define CONFIGURE_APPLICATION_NEEDS_CLOCK_DRIVER
16 #define CONFIGURE_APPLICATION_NEEDS_CLOCK_DRIVER
17
17
18 #define CONFIGURE_MAXIMUM_TASKS 15
18 #define CONFIGURE_MAXIMUM_TASKS 20
19 #define CONFIGURE_RTEMS_INIT_TASKS_TABLE
19 #define CONFIGURE_RTEMS_INIT_TASKS_TABLE
20 #define CONFIGURE_EXTRA_TASK_STACKS (3 * RTEMS_MINIMUM_STACK_SIZE)
20 #define CONFIGURE_EXTRA_TASK_STACKS (3 * RTEMS_MINIMUM_STACK_SIZE)
21 #define CONFIGURE_LIBIO_MAXIMUM_FILE_DESCRIPTORS 32
21 #define CONFIGURE_LIBIO_MAXIMUM_FILE_DESCRIPTORS 32
22 #define CONFIGURE_INIT_TASK_PRIORITY 100
22 #define CONFIGURE_INIT_TASK_PRIORITY 5 // instead of 100
23 #define CONFIGURE_MAXIMUM_DRIVERS 16
23 #define CONFIGURE_MAXIMUM_DRIVERS 16
24 #define CONFIGURE_MAXIMUM_PERIODS 5
24 #define CONFIGURE_MAXIMUM_PERIODS 5
25 #define CONFIGURE_MAXIMUM_MESSAGE_QUEUES 1
25 #define CONFIGURE_MAXIMUM_MESSAGE_QUEUES 2
26
26
27 #include <rtems/confdefs.h>
27 #include <rtems/confdefs.h>
28
28
@@ -44,14 +44,6
44 #include <fsw_init.h>
44 #include <fsw_init.h>
45 #include <fsw_config.c>
45 #include <fsw_config.c>
46
46
47 char *lstates[6] = {"Error-reset",
48 "Error-wait",
49 "Ready",
50 "Started",
51 "Connecting",
52 "Run"
53 };
54
55 rtems_task Init( rtems_task_argument ignored )
47 rtems_task Init( rtems_task_argument ignored )
56 {
48 {
57 rtems_status_code status;
49 rtems_status_code status;
@@ -70,10 +62,11 rtems_task Init( rtems_task_argument ign
70 init_parameter_dump();
62 init_parameter_dump();
71 init_local_mode_parameters();
63 init_local_mode_parameters();
72 init_housekeeping_parameters();
64 init_housekeeping_parameters();
73 create_message_queue();
65 create_message_queues();
74
66
75 create_names(); // create all names
67 create_names(); // create all names
76 create_all_tasks(); // create all tasks
68 create_all_tasks(); // create all tasks
69
77 start_all_tasks(); // start all tasks
70 start_all_tasks(); // start all tasks
78 stop_current_mode(); // go in STANDBY mode
71 stop_current_mode(); // go in STANDBY mode
79
72
@@ -85,8 +78,7 rtems_task Init( rtems_task_argument ign
85 // Spectral Matrices simulator
78 // Spectral Matrices simulator
86 configure_timer((gptimer_regs_t*) REGS_ADDR_GPTIMER, TIMER_SM_SIMULATOR, CLKDIV_SM_SIMULATOR,
79 configure_timer((gptimer_regs_t*) REGS_ADDR_GPTIMER, TIMER_SM_SIMULATOR, CLKDIV_SM_SIMULATOR,
87 IRQ_SPARC_SM, spectral_matrices_isr );
80 IRQ_SPARC_SM, spectral_matrices_isr );
88 //**********
81 // WaveForms
89 // WAVEFORMS
90 configure_timer((gptimer_regs_t*) REGS_ADDR_GPTIMER, TIMER_WF_SIMULATOR, CLKDIV_WF_SIMULATOR,
82 configure_timer((gptimer_regs_t*) REGS_ADDR_GPTIMER, TIMER_WF_SIMULATOR, CLKDIV_WF_SIMULATOR,
91 IRQ_SPARC_WF, waveforms_simulator_isr );
83 IRQ_SPARC_WF, waveforms_simulator_isr );
92 LEON_Mask_interrupt( IRQ_SM );
84 LEON_Mask_interrupt( IRQ_SM );
@@ -108,8 +100,6 rtems_task Init( rtems_task_argument ign
108 LEON_Mask_interrupt( IRQ_SPECTRAL_MATRIX );
100 LEON_Mask_interrupt( IRQ_SPECTRAL_MATRIX );
109 #endif
101 #endif
110
102
111 //**********
112
113 status = rtems_task_delete(RTEMS_SELF);
103 status = rtems_task_delete(RTEMS_SELF);
114
104
115 }
105 }
@@ -122,8 +112,8 void init_parameter_dump(void)
122 parameter_dump_packet.userApplication = CCSDS_USER_APP;
112 parameter_dump_packet.userApplication = CCSDS_USER_APP;
123 parameter_dump_packet.packetID[0] = (unsigned char) (TM_PACKET_ID_PARAMETER_DUMP >> 8);
113 parameter_dump_packet.packetID[0] = (unsigned char) (TM_PACKET_ID_PARAMETER_DUMP >> 8);
124 parameter_dump_packet.packetID[1] = (unsigned char) TM_PACKET_ID_PARAMETER_DUMP;
114 parameter_dump_packet.packetID[1] = (unsigned char) TM_PACKET_ID_PARAMETER_DUMP;
125 parameter_dump_packet.packetSequenceControl[0] = (unsigned char) (TM_PACKET_SEQ_CTRL_STANDALONE << 6);
115 parameter_dump_packet.packetSequenceControl[0] = TM_PACKET_SEQ_CTRL_STANDALONE;
126 parameter_dump_packet.packetSequenceControl[1] = 0x00;
116 parameter_dump_packet.packetSequenceControl[1] = TM_PACKET_SEQ_CNT_DEFAULT;
127 parameter_dump_packet.packetLength[0] = (unsigned char) (PACKET_LENGTH_PARAMETER_DUMP >> 8);
117 parameter_dump_packet.packetLength[0] = (unsigned char) (PACKET_LENGTH_PARAMETER_DUMP >> 8);
128 parameter_dump_packet.packetLength[1] = (unsigned char) PACKET_LENGTH_PARAMETER_DUMP;
118 parameter_dump_packet.packetLength[1] = (unsigned char) PACKET_LENGTH_PARAMETER_DUMP;
129 // DATA FIELD HEADER
119 // DATA FIELD HEADER
@@ -147,11 +137,11 void init_parameter_dump(void)
147 //******************
137 //******************
148 // NORMAL PARAMETERS
138 // NORMAL PARAMETERS
149 parameter_dump_packet.sy_lfr_n_swf_l[0] = (unsigned char) (DEFAULT_SY_LFR_N_SWF_L >> 8);
139 parameter_dump_packet.sy_lfr_n_swf_l[0] = (unsigned char) (DEFAULT_SY_LFR_N_SWF_L >> 8);
150 parameter_dump_packet.sy_lfr_n_swf_l[1] = (unsigned char) DEFAULT_SY_LFR_N_SWF_L;
140 parameter_dump_packet.sy_lfr_n_swf_l[1] = (unsigned char) (DEFAULT_SY_LFR_N_SWF_L );
151 parameter_dump_packet.sy_lfr_n_swf_p[0] = (unsigned char) (DEFAULT_SY_LFR_N_SWF_P >> 8);
141 parameter_dump_packet.sy_lfr_n_swf_p[0] = (unsigned char) (DEFAULT_SY_LFR_N_SWF_P >> 8);
152 parameter_dump_packet.sy_lfr_n_swf_p[1] = (unsigned char) DEFAULT_SY_LFR_N_SWF_P;
142 parameter_dump_packet.sy_lfr_n_swf_p[1] = (unsigned char) (DEFAULT_SY_LFR_N_SWF_P );
153 parameter_dump_packet.sy_lfr_n_asm_p[0] = (unsigned char) (DEFAULT_SY_LFR_N_ASM_P >> 8);
143 parameter_dump_packet.sy_lfr_n_asm_p[0] = (unsigned char) (DEFAULT_SY_LFR_N_ASM_P >> 8);
154 parameter_dump_packet.sy_lfr_n_asm_p[1] = (unsigned char) DEFAULT_SY_LFR_N_ASM_P;
144 parameter_dump_packet.sy_lfr_n_asm_p[1] = (unsigned char) (DEFAULT_SY_LFR_N_ASM_P );
155 parameter_dump_packet.sy_lfr_n_bp_p0 = (unsigned char) DEFAULT_SY_LFR_N_BP_P0;
145 parameter_dump_packet.sy_lfr_n_bp_p0 = (unsigned char) DEFAULT_SY_LFR_N_BP_P0;
156 parameter_dump_packet.sy_lfr_n_bp_p1 = (unsigned char) DEFAULT_SY_LFR_N_BP_P1;
146 parameter_dump_packet.sy_lfr_n_bp_p1 = (unsigned char) DEFAULT_SY_LFR_N_BP_P1;
157
147
@@ -217,6 +207,7 void init_housekeeping_parameters(void)
217 }
207 }
218 }
208 }
219 }
209 }
210 updateLFRCurrentMode();
220 }
211 }
221
212
222 int create_names( void )
213 int create_names( void )
@@ -234,6 +225,9 int create_names( void )
234 Task_name[TASKID_HOUS] = rtems_build_name( 'H', 'O', 'U', 'S' );
225 Task_name[TASKID_HOUS] = rtems_build_name( 'H', 'O', 'U', 'S' );
235 Task_name[TASKID_MATR] = rtems_build_name( 'M', 'A', 'T', 'R' );
226 Task_name[TASKID_MATR] = rtems_build_name( 'M', 'A', 'T', 'R' );
236 Task_name[TASKID_CWF3] = rtems_build_name( 'C', 'W', 'F', '3' );
227 Task_name[TASKID_CWF3] = rtems_build_name( 'C', 'W', 'F', '3' );
228 Task_name[TASKID_CWF2] = rtems_build_name( 'C', 'W', 'F', '2' );
229 Task_name[TASKID_CWF1] = rtems_build_name( 'C', 'W', 'F', '1' );
230 Task_name[TASKID_SEND] = rtems_build_name( 'S', 'E', 'N', 'D' );
237
231
238 // rate monotonic period name
232 // rate monotonic period name
239 HK_name = rtems_build_name( 'H', 'O', 'U', 'S' );
233 HK_name = rtems_build_name( 'H', 'O', 'U', 'S' );
@@ -247,76 +241,94 int create_all_tasks( void )
247
241
248 // RECV
242 // RECV
249 status = rtems_task_create(
243 status = rtems_task_create(
250 Task_name[TASKID_RECV], 200, RTEMS_MINIMUM_STACK_SIZE * 2,
244 Task_name[TASKID_RECV], TASK_PRIORITY_RECV, RTEMS_MINIMUM_STACK_SIZE * 2,
251 RTEMS_DEFAULT_MODES,
245 RTEMS_DEFAULT_MODES,
252 RTEMS_DEFAULT_ATTRIBUTES, &Task_id[TASKID_RECV]
246 RTEMS_DEFAULT_ATTRIBUTES, &Task_id[TASKID_RECV]
253 );
247 );
254 // ACTN
248 // ACTN
255 status = rtems_task_create(
249 status = rtems_task_create(
256 Task_name[TASKID_ACTN], 100, RTEMS_MINIMUM_STACK_SIZE * 2,
250 Task_name[TASKID_ACTN], TASK_PRIORITY_ACTN, RTEMS_MINIMUM_STACK_SIZE * 2,
257 RTEMS_DEFAULT_MODES,
251 RTEMS_DEFAULT_MODES,
258 RTEMS_DEFAULT_ATTRIBUTES, &Task_id[TASKID_ACTN]
252 RTEMS_DEFAULT_ATTRIBUTES, &Task_id[TASKID_ACTN]
259 );
253 );
260 // SPIQ
254 // SPIQ
261 status = rtems_task_create(
255 status = rtems_task_create(
262 Task_name[TASKID_SPIQ], 5, RTEMS_MINIMUM_STACK_SIZE * 2,
256 Task_name[TASKID_SPIQ], TASK_PRIORITY_SPIQ, RTEMS_MINIMUM_STACK_SIZE * 2,
263 RTEMS_DEFAULT_MODES | RTEMS_NO_PREEMPT,
257 RTEMS_DEFAULT_MODES | RTEMS_NO_PREEMPT,
264 RTEMS_DEFAULT_ATTRIBUTES, &Task_id[TASKID_SPIQ]
258 RTEMS_DEFAULT_ATTRIBUTES, &Task_id[TASKID_SPIQ]
265 );
259 );
266 // SMIQ
260 // SMIQ
267 status = rtems_task_create(
261 status = rtems_task_create(
268 Task_name[TASKID_SMIQ], 10, RTEMS_MINIMUM_STACK_SIZE * 2,
262 Task_name[TASKID_SMIQ], TASK_PRIORITY_SMIQ, RTEMS_MINIMUM_STACK_SIZE * 2,
269 RTEMS_DEFAULT_MODES | RTEMS_NO_PREEMPT,
263 RTEMS_DEFAULT_MODES | RTEMS_NO_PREEMPT,
270 RTEMS_DEFAULT_ATTRIBUTES, &Task_id[TASKID_SMIQ]
264 RTEMS_DEFAULT_ATTRIBUTES, &Task_id[TASKID_SMIQ]
271 );
265 );
272 // STAT
266 // STAT
273 status = rtems_task_create(
267 status = rtems_task_create(
274 Task_name[TASKID_STAT], 251, RTEMS_MINIMUM_STACK_SIZE * 2,
268 Task_name[TASKID_STAT], TASK_PRIORITY_STAT, RTEMS_MINIMUM_STACK_SIZE * 2,
275 RTEMS_DEFAULT_MODES,
269 RTEMS_DEFAULT_MODES,
276 RTEMS_DEFAULT_ATTRIBUTES, &Task_id[TASKID_STAT]
270 RTEMS_DEFAULT_ATTRIBUTES, &Task_id[TASKID_STAT]
277 );
271 );
278 // AVF0
272 // AVF0
279 status = rtems_task_create(
273 status = rtems_task_create(
280 Task_name[TASKID_AVF0], 50, RTEMS_MINIMUM_STACK_SIZE * 2,
274 Task_name[TASKID_AVF0], TASK_PRIORITY_AVF0, RTEMS_MINIMUM_STACK_SIZE * 2,
281 RTEMS_DEFAULT_MODES | RTEMS_NO_PREEMPT,
275 RTEMS_DEFAULT_MODES | RTEMS_NO_PREEMPT,
282 RTEMS_DEFAULT_ATTRIBUTES | RTEMS_FLOATING_POINT, &Task_id[TASKID_AVF0]
276 RTEMS_DEFAULT_ATTRIBUTES | RTEMS_FLOATING_POINT, &Task_id[TASKID_AVF0]
283 );
277 );
284 // BPF0
278 // BPF0
285 status = rtems_task_create(
279 status = rtems_task_create(
286 Task_name[TASKID_BPF0], 50, RTEMS_MINIMUM_STACK_SIZE * 2,
280 Task_name[TASKID_BPF0], TASK_PRIORITY_BPF0, RTEMS_MINIMUM_STACK_SIZE * 2,
287 RTEMS_DEFAULT_MODES,
281 RTEMS_DEFAULT_MODES,
288 RTEMS_DEFAULT_ATTRIBUTES | RTEMS_FLOATING_POINT, &Task_id[TASKID_BPF0]
282 RTEMS_DEFAULT_ATTRIBUTES | RTEMS_FLOATING_POINT, &Task_id[TASKID_BPF0]
289 );
283 );
290 // WFRM
284 // WFRM
291 status = rtems_task_create(
285 status = rtems_task_create(
292 Task_name[TASKID_WFRM], 50, RTEMS_MINIMUM_STACK_SIZE * 2,
286 Task_name[TASKID_WFRM], TASK_PRIORITY_WFRM, RTEMS_MINIMUM_STACK_SIZE * 2,
293 RTEMS_DEFAULT_MODES,
287 RTEMS_DEFAULT_MODES,
294 RTEMS_DEFAULT_ATTRIBUTES | RTEMS_FLOATING_POINT, &Task_id[TASKID_WFRM]
288 RTEMS_DEFAULT_ATTRIBUTES | RTEMS_FLOATING_POINT, &Task_id[TASKID_WFRM]
295 );
289 );
296 // DUMB
290 // DUMB
297 status = rtems_task_create(
291 status = rtems_task_create(
298 Task_name[TASKID_DUMB], 200, RTEMS_MINIMUM_STACK_SIZE * 2,
292 Task_name[TASKID_DUMB], TASK_PRIORITY_DUMB, RTEMS_MINIMUM_STACK_SIZE * 2,
299 RTEMS_DEFAULT_MODES,
293 RTEMS_DEFAULT_MODES,
300 RTEMS_DEFAULT_ATTRIBUTES, &Task_id[TASKID_DUMB]
294 RTEMS_DEFAULT_ATTRIBUTES, &Task_id[TASKID_DUMB]
301 );
295 );
302 // HOUS
296 // HOUS
303 status = rtems_task_create(
297 status = rtems_task_create(
304 Task_name[TASKID_HOUS], 199, RTEMS_MINIMUM_STACK_SIZE * 2,
298 Task_name[TASKID_HOUS], TASK_PRIORITY_HOUS, RTEMS_MINIMUM_STACK_SIZE * 2,
305 RTEMS_DEFAULT_MODES,
299 RTEMS_DEFAULT_MODES,
306 RTEMS_DEFAULT_ATTRIBUTES, &Task_id[TASKID_HOUS]
300 RTEMS_DEFAULT_ATTRIBUTES, &Task_id[TASKID_HOUS]
307 );
301 );
308 // MATR
302 // MATR
309 status = rtems_task_create(
303 status = rtems_task_create(
310 Task_name[TASKID_MATR], 250, RTEMS_MINIMUM_STACK_SIZE * 2,
304 Task_name[TASKID_MATR], TASK_PRIORITY_MATR, RTEMS_MINIMUM_STACK_SIZE * 2,
311 RTEMS_DEFAULT_MODES,
305 RTEMS_DEFAULT_MODES,
312 RTEMS_DEFAULT_ATTRIBUTES | RTEMS_FLOATING_POINT, &Task_id[TASKID_MATR]
306 RTEMS_DEFAULT_ATTRIBUTES | RTEMS_FLOATING_POINT, &Task_id[TASKID_MATR]
313 );
307 );
314 // CWF3
308 // CWF3
315 status = rtems_task_create(
309 status = rtems_task_create(
316 Task_name[TASKID_CWF3], 250, RTEMS_MINIMUM_STACK_SIZE * 2,
310 Task_name[TASKID_CWF3], TASK_PRIORITY_CWF3, RTEMS_MINIMUM_STACK_SIZE * 2,
317 RTEMS_DEFAULT_MODES,
311 RTEMS_DEFAULT_MODES,
318 RTEMS_DEFAULT_ATTRIBUTES, &Task_id[TASKID_CWF3]
312 RTEMS_DEFAULT_ATTRIBUTES, &Task_id[TASKID_CWF3]
319 );
313 );
314 // CWF2
315 status = rtems_task_create(
316 Task_name[TASKID_CWF2], TASK_PRIORITY_CWF2, RTEMS_MINIMUM_STACK_SIZE * 2,
317 RTEMS_DEFAULT_MODES,
318 RTEMS_DEFAULT_ATTRIBUTES, &Task_id[TASKID_CWF2]
319 );
320 // CWF1
321 status = rtems_task_create(
322 Task_name[TASKID_CWF1], TASK_PRIORITY_CWF1, RTEMS_MINIMUM_STACK_SIZE * 2,
323 RTEMS_DEFAULT_MODES,
324 RTEMS_DEFAULT_ATTRIBUTES, &Task_id[TASKID_CWF1]
325 );
326 // SEND
327 status = rtems_task_create(
328 Task_name[TASKID_SEND], TASK_PRIORITY_SEND, RTEMS_MINIMUM_STACK_SIZE * 2,
329 RTEMS_DEFAULT_MODES,
330 RTEMS_DEFAULT_ATTRIBUTES, &Task_id[TASKID_SEND]
331 );
320
332
321 return 0;
333 return 0;
322 }
334 }
@@ -385,206 +397,41 int start_all_tasks( void )
385 PRINTF("in INIT *** Error starting TASK_CWF3\n")
397 PRINTF("in INIT *** Error starting TASK_CWF3\n")
386 }
398 }
387
399
400 status = rtems_task_start( Task_id[TASKID_CWF2], cwf2_task, 1 );
401 if (status!=RTEMS_SUCCESSFUL) {
402 PRINTF("in INIT *** Error starting TASK_CWF2\n")
403 }
404
405 status = rtems_task_start( Task_id[TASKID_CWF1], cwf1_task, 1 );
406 if (status!=RTEMS_SUCCESSFUL) {
407 PRINTF("in INIT *** Error starting TASK_CWF1\n")
408 }
409 status = rtems_task_start( Task_id[TASKID_SEND], send_task, 1 );
410 if (status!=RTEMS_SUCCESSFUL) {
411 PRINTF("in INIT *** Error starting TASK_SEND\n")
412 }
413
388 return 0;
414 return 0;
389 }
415 }
390
416
391 // SPACEWIRE
417 int create_message_queues( void )
392
393 rtems_task spiq_task(rtems_task_argument unused)
394 {
395 rtems_event_set event_out;
396 rtems_status_code status;
397 unsigned char lfrMode;
398
399 while(true){
400 PRINTF("in SPIQ *** Waiting for SPW_LINKERR_EVENT\n")
401 rtems_event_receive(SPW_LINKERR_EVENT, RTEMS_WAIT, RTEMS_NO_TIMEOUT, &event_out); // wait for an SPW_LINKERR_EVENT
402
403 lfrMode = (housekeeping_packet.lfr_status_word[0] & 0xf0) >> 4; // get the current mode
404
405 status = spacewire_wait_for_link();
406
407 if (status != RTEMS_SUCCESSFUL)
408 {
409 //****************
410 // STOP THE SYSTEM
411 spacewire_compute_stats_offsets();
412 stop_current_mode();
413 if (rtems_task_suspend(Task_id[TASKID_RECV])!=RTEMS_SUCCESSFUL) { // suspend RECV task
414 PRINTF("in SPIQ *** Error suspending RECV Task\n")
415 }
416 if (rtems_task_suspend(Task_id[TASKID_HOUS])!=RTEMS_SUCCESSFUL) { // suspend HOUS task
417 PRINTF("in SPIQ *** Error suspending HOUS Task\n")
418 }
419
420 //***************************
421 // RESTART THE SPACEWIRE LINK
422 spacewire_configure_link();
423
424 //*******************
425 // RESTART THE SYSTEM
426 //ioctl(fdSPW, SPACEWIRE_IOCTRL_CLR_STATISTICS); // clear statistics
427 status = rtems_task_restart( Task_id[TASKID_HOUS], 1 );
428 if (status != RTEMS_SUCCESSFUL) {
429 PRINTF1("in SPIQ *** Error restarting HOUS Task *** code %d\n", status)
430 }
431 if (rtems_task_restart(Task_id[TASKID_RECV], 1) != RTEMS_SUCCESSFUL) { // restart RECV task
432 PRINTF("in SPIQ *** Error restarting RECV Task\n")
433 }
434 //enter_mode(lfrMode, NULL); // enter the mode that was running before the SpaceWire interruption
435 }
436 }
437 }
438
439 int spacewire_configure_link( void )
440 {
418 {
441 rtems_status_code status;
419 rtems_status_code status;
442
420
443 close(fdSPW); // close the device if it is already open
421 misc_name[0] = rtems_build_name( 'Q', 'U', 'E', 'U' );
444 PRINTF("OK *** in configure_spw_link *** try to open "GRSPW_DEVICE_NAME"\n")
422 misc_name[1] = rtems_build_name( 'P', 'K', 'T', 'S' );
445 fdSPW = open(GRSPW_DEVICE_NAME, O_RDWR); // open the device. the open call reset the hardware
446 if ( fdSPW<0 ) {
447 PRINTF("ERR *** in configure_spw_link *** Error opening"GRSPW_DEVICE_NAME"\n")
448 }
449
450 while(ioctl(fdSPW, SPACEWIRE_IOCTRL_START, -1) != RTEMS_SUCCESSFUL){
451 PRINTF(".")
452 fflush( stdout );
453 close( fdSPW ); // close the device
454 fdSPW = open( GRSPW_DEVICE_NAME, O_RDWR ); // open the device. the open call reset the hardware
455 if (fdSPW<0) {
456 PRINTF("ERR *** In configure_spw_link *** Error opening"GRSPW_DEVICE_NAME"\n")
457 }
458 rtems_task_wake_after(100);
459 }
460
461 PRINTF("OK *** In configure_spw_link *** "GRSPW_DEVICE_NAME" opened and started successfully\n")
462
463 spacewire_set_NP(1, REGS_ADDR_GRSPW); // No Port force
464 spacewire_set_RE(1, REGS_ADDR_GRSPW); // the dedicated call seems to break the no port force configuration
465
423
466 status = ioctl(fdSPW, SPACEWIRE_IOCTRL_SET_RXBLOCK, 1); // sets the blocking mode for reception
424 status = rtems_message_queue_create( misc_name[0], ACTION_MSG_QUEUE_COUNT, CCSDS_TC_PKT_MAX_SIZE,
467 if (status!=RTEMS_SUCCESSFUL) PRINTF("in SPIQ *** Error SPACEWIRE_IOCTRL_SET_RXBLOCK\n")
425 RTEMS_FIFO | RTEMS_LOCAL, &misc_id[0] );
468 //
426 if (status!=RTEMS_SUCCESSFUL) {
469 status = ioctl(fdSPW, SPACEWIRE_IOCTRL_SET_EVENT_ID, Task_id[TASKID_SPIQ]); // sets the task ID to which an event is sent when a
427 PRINTF("in create_message_queues *** error creating QUEU\n")
470 if (status!=RTEMS_SUCCESSFUL) PRINTF("in SPIQ *** Error SPACEWIRE_IOCTRL_SET_EVENT_ID\n") // link-error interrupt occurs
471 //
472 status = ioctl(fdSPW, SPACEWIRE_IOCTRL_SET_DISABLE_ERR, 0); // automatic link-disabling due to link-error interrupts
473 if (status!=RTEMS_SUCCESSFUL) PRINTF("in SPIQ *** Error SPACEWIRE_IOCTRL_SET_DISABLE_ERR\n")
474 //
475 status = ioctl(fdSPW, SPACEWIRE_IOCTRL_SET_LINK_ERR_IRQ, 1); // sets the link-error interrupt bit
476 if (status!=RTEMS_SUCCESSFUL) PRINTF("in SPIQ *** Error SPACEWIRE_IOCTRL_SET_LINK_ERR_IRQ\n")
477 //
478 status = ioctl(fdSPW, SPACEWIRE_IOCTRL_SET_TXBLOCK, 0); // transmission blocks
479 if (status!=RTEMS_SUCCESSFUL) PRINTF("in SPIQ *** Error SPACEWIRE_IOCTRL_SET_TXBLOCK\n")
480 //
481 status = ioctl(fdSPW, SPACEWIRE_IOCTRL_SET_TXBLOCK_ON_FULL, 0); // transmission blocks on full
482 if (status!=RTEMS_SUCCESSFUL) PRINTF("in SPIQ *** Error SPACEWIRE_IOCTRL_SET_TXBLOCK_ON_FULL\n")
483 //
484 status = ioctl(fdSPW, SPACEWIRE_IOCTRL_SET_TCODE_CTRL, 0x0909);
485 if (status!=RTEMS_SUCCESSFUL) PRINTF("in SPIQ *** Error SPACEWIRE_IOCTRL_SET_TCODE_CTRL,\n")
486
487 PRINTF("OK *** in configure_spw_link *** "GRSPW_DEVICE_NAME" configured successfully\n")
488
489 return RTEMS_SUCCESSFUL;
490 }
491
492 int spacewire_wait_for_link(void)
493 {
494 unsigned int i;
495 int linkStatus;
496 rtems_status_code status = RTEMS_UNSATISFIED;
497
498 for(i = 0; i< 10; i++){
499 PRINTF(".")
500 fflush( stdout );
501 ioctl(fdSPW, SPACEWIRE_IOCTRL_GET_LINK_STATUS, &linkStatus); // get the link status
502 PRINTF1("in spacewire_wait_for_link *** link status is: %s\n", lstates[linkStatus])
503 if ( linkStatus == 5) {
504 PRINTF("in spacewire_wait_for_link *** link is running\n")
505 status = RTEMS_SUCCESSFUL;
506 break;
507 }
508 rtems_task_wake_after(100);
509 }
428 }
510
429
511 return status;
430 status = rtems_message_queue_create( misc_name[1], ACTION_MSG_PKTS_COUNT, sizeof(spw_ioctl_pkt_send),
512 }
431 RTEMS_FIFO | RTEMS_LOCAL, &misc_id[1] );
513
432 if (status!=RTEMS_SUCCESSFUL) {
514 void spacewire_set_NP(unsigned char val, unsigned int regAddr) // [N]o [P]ort force
433 PRINTF("in create_message_queues *** error creating PKTS\n")
515 {
516 unsigned int *spwptr = (unsigned int*) regAddr;
517
518 if (val == 1) {
519 *spwptr = *spwptr | 0x00100000; // [NP] set the No port force bit
520 }
521 if (val== 0) {
522 *spwptr = *spwptr & 0xffdfffff;
523 }
434 }
524 }
525
526 void spacewire_set_RE(unsigned char val, unsigned int regAddr) // [R]MAP [E]nable
527 {
528 unsigned int *spwptr = (unsigned int*) regAddr;
529
530 if (val == 1)
531 {
532 *spwptr = *spwptr | 0x00010000; // [RE] set the RMAP Enable bit
533 }
534 if (val== 0)
535 {
536 *spwptr = *spwptr & 0xfffdffff;
537 }
538 }
539
540 void spacewire_compute_stats_offsets()
541 {
542 spw_stats spacewire_stats_grspw;
543 rtems_status_code status;
544
545 status = ioctl( fdSPW, SPACEWIRE_IOCTRL_GET_STATISTICS, &spacewire_stats_grspw );
546
435
547 spacewire_stats_backup.packets_received = spacewire_stats_grspw.packets_received
436 return 0;
548 + spacewire_stats.packets_received;
549 spacewire_stats_backup.packets_sent = spacewire_stats_grspw.packets_sent
550 + spacewire_stats.packets_sent;
551 spacewire_stats_backup.parity_err = spacewire_stats_grspw.parity_err
552 + spacewire_stats.parity_err;
553 spacewire_stats_backup.disconnect_err = spacewire_stats_grspw.disconnect_err
554 + spacewire_stats.disconnect_err;
555 spacewire_stats_backup.escape_err = spacewire_stats_grspw.escape_err
556 + spacewire_stats.escape_err;
557 spacewire_stats_backup.credit_err = spacewire_stats_grspw.credit_err
558 + spacewire_stats.credit_err;
559 spacewire_stats_backup.write_sync_err = spacewire_stats_grspw.write_sync_err
560 + spacewire_stats.write_sync_err;
561 spacewire_stats_backup.rx_rmap_header_crc_err = spacewire_stats_grspw.rx_rmap_header_crc_err
562 + spacewire_stats.rx_rmap_header_crc_err;
563 spacewire_stats_backup.rx_rmap_data_crc_err = spacewire_stats_grspw.rx_rmap_data_crc_err
564 + spacewire_stats.rx_rmap_data_crc_err;
565 spacewire_stats_backup.early_ep = spacewire_stats_grspw.early_ep
566 + spacewire_stats.early_ep;
567 spacewire_stats_backup.invalid_address = spacewire_stats_grspw.invalid_address
568 + spacewire_stats.invalid_address;
569 spacewire_stats_backup.rx_eep_err = spacewire_stats_grspw.rx_eep_err
570 + spacewire_stats.rx_eep_err;
571 spacewire_stats_backup.rx_truncated = spacewire_stats_grspw.rx_truncated
572 + spacewire_stats.rx_truncated;
573 }
437 }
574
575 rtems_status_code write_spw(spw_ioctl_pkt_send* spw_ioctl_send)
576 {
577 rtems_status_code status;
578 status = ioctl( fdSPW, SPACEWIRE_IOCTRL_SEND, spw_ioctl_send );
579 if (status != RTEMS_SUCCESSFUL){
580 //PRINTF1("ERR *** in write_spw *** write operation failed with code: %d\n", status)
581 }
582 return status;
583 }
584
585 void timecode_irq_handler(void *pDev, void *regs, int minor, unsigned int tc)
586 {
587 if (rtems_event_send( Task_id[TASKID_DUMB], RTEMS_EVENT_1 ) != RTEMS_SUCCESSFUL) {
588 printf("In timecode_irq_handler *** Error sending event to DUMB\n");
589 }
590 }
@@ -1,12 +1,6
1 #include <fsw_misc.h>
1 #include <fsw_misc.h>
2 #include <fsw_params.h>
2 #include <fsw_params.h>
3
3
4 extern rtems_id Task_id[]; /* array of task ids */
5 extern int fdSPW;
6 extern TMHeader_t housekeeping_header;
7 extern char housekeeping_data[];
8 extern Packet_TM_LFR_HK_t housekeeping_packet;
9
10 int configure_timer(gptimer_regs_t *gptimer_regs, unsigned char timer, unsigned int clock_divider,
4 int configure_timer(gptimer_regs_t *gptimer_regs, unsigned char timer, unsigned int clock_divider,
11 unsigned char interrupt_level, rtems_isr (*timer_isr)() )
5 unsigned char interrupt_level, rtems_isr (*timer_isr)() )
12 { // configure the timer for the waveforms simulation
6 { // configure the timer for the waveforms simulation
@@ -149,11 +143,11 rtems_task stat_task(rtems_task_argument
149 while(1){
143 while(1){
150 rtems_task_wake_after(1000);
144 rtems_task_wake_after(1000);
151 PRINTF1("%d\n", j)
145 PRINTF1("%d\n", j)
152 if (i == 2) {
146 if (i == CPU_USAGE_REPORT_PERIOD) {
153 #ifdef PRINT_TASK_STATISTICS
147 // #ifdef PRINT_TASK_STATISTICS
154 rtems_cpu_usage_report();
148 // rtems_cpu_usage_report();
155 rtems_cpu_usage_reset();
149 // rtems_cpu_usage_reset();
156 #endif
150 // #endif
157 i = 0;
151 i = 0;
158 }
152 }
159 else i++;
153 else i++;
@@ -163,8 +157,14 rtems_task stat_task(rtems_task_argument
163
157
164 rtems_task hous_task(rtems_task_argument argument)
158 rtems_task hous_task(rtems_task_argument argument)
165 {
159 {
166 int result;
167 rtems_status_code status;
160 rtems_status_code status;
161 spw_ioctl_pkt_send spw_ioctl_send;
162
163 spw_ioctl_send.hlen = 0;
164 spw_ioctl_send.hdr = NULL;
165 spw_ioctl_send.dlen = sizeof(spw_ioctl_send);
166 spw_ioctl_send.data = (char*) &housekeeping_packet;
167 spw_ioctl_send.options = 0;
168
168
169 PRINTF("in HOUS ***\n")
169 PRINTF("in HOUS ***\n")
170
170
@@ -177,18 +177,18 rtems_task hous_task(rtems_task_argument
177
177
178 housekeeping_packet.targetLogicalAddress = CCSDS_DESTINATION_ID;
178 housekeeping_packet.targetLogicalAddress = CCSDS_DESTINATION_ID;
179 housekeeping_packet.protocolIdentifier = CCSDS_PROTOCOLE_ID;
179 housekeeping_packet.protocolIdentifier = CCSDS_PROTOCOLE_ID;
180 housekeeping_packet.reserved = 0x00;
180 housekeeping_packet.reserved = DEFAULT_RESERVED;
181 housekeeping_packet.userApplication = 0x00;
181 housekeeping_packet.userApplication = CCSDS_USER_APP;
182 housekeeping_packet.packetID[0] = (unsigned char) (TM_PACKET_ID_HK >> 8);
182 housekeeping_packet.packetID[0] = (unsigned char) (TM_PACKET_ID_HK >> 8);
183 housekeeping_packet.packetID[1] = (unsigned char) (TM_PACKET_ID_HK);
183 housekeeping_packet.packetID[1] = (unsigned char) (TM_PACKET_ID_HK);
184 housekeeping_packet.packetSequenceControl[0] = 0xc0;
184 housekeeping_packet.packetSequenceControl[0] = TM_PACKET_SEQ_CTRL_STANDALONE;
185 housekeeping_packet.packetSequenceControl[1] = 0x00;
185 housekeeping_packet.packetSequenceControl[1] = TM_PACKET_SEQ_CNT_DEFAULT;
186 housekeeping_packet.packetLength[0] = 0x00;
186 housekeeping_packet.packetLength[0] = (unsigned char) (PACKET_LENGTH_HK >> 8);
187 housekeeping_packet.packetLength[1] = 0x77;
187 housekeeping_packet.packetLength[1] = (unsigned char) (PACKET_LENGTH_HK );
188 housekeeping_packet.dataFieldHeader[0] = 0x10;
188 housekeeping_packet.spare1_pusVersion_spare2 = DEFAULT_SPARE1_PUSVERSION_SPARE2;
189 housekeeping_packet.dataFieldHeader[1] = TM_TYPE_HK;
189 housekeeping_packet.serviceType = TM_TYPE_HK;
190 housekeeping_packet.dataFieldHeader[2] = TM_SUBTYPE_HK;
190 housekeeping_packet.serviceSubType = TM_SUBTYPE_HK;
191 housekeeping_packet.dataFieldHeader[3] = TM_DESTINATION_ID_GROUND;
191 housekeeping_packet.destinationID = TM_DESTINATION_ID_GROUND;
192
192
193 status = rtems_rate_monotonic_cancel(HK_id);
193 status = rtems_rate_monotonic_cancel(HK_id);
194 if( status != RTEMS_SUCCESSFUL ) {
194 if( status != RTEMS_SUCCESSFUL ) {
@@ -204,30 +204,21 rtems_task hous_task(rtems_task_argument
204 PRINTF1( "ERR *** in HOUS *** rtems_rate_monotonic_period *** code %d\n", status);
204 PRINTF1( "ERR *** in HOUS *** rtems_rate_monotonic_period *** code %d\n", status);
205 }
205 }
206 else {
206 else {
207 housekeeping_packet.dataFieldHeader[4] = (unsigned char) (time_management_regs->coarse_time>>24);
207 housekeeping_packet.time[0] = (unsigned char) (time_management_regs->coarse_time>>24);
208 housekeeping_packet.dataFieldHeader[5] = (unsigned char) (time_management_regs->coarse_time>>16);
208 housekeeping_packet.time[1] = (unsigned char) (time_management_regs->coarse_time>>16);
209 housekeeping_packet.dataFieldHeader[6] = (unsigned char) (time_management_regs->coarse_time>>8);
209 housekeeping_packet.time[2] = (unsigned char) (time_management_regs->coarse_time>>8);
210 housekeeping_packet.dataFieldHeader[7] = (unsigned char) (time_management_regs->coarse_time);
210 housekeeping_packet.time[3] = (unsigned char) (time_management_regs->coarse_time);
211 housekeeping_packet.dataFieldHeader[8] = (unsigned char) (time_management_regs->fine_time>>8);
211 housekeeping_packet.time[4] = (unsigned char) (time_management_regs->fine_time>>8);
212 housekeeping_packet.dataFieldHeader[9] = (unsigned char) (time_management_regs->fine_time);
212 housekeeping_packet.time[5] = (unsigned char) (time_management_regs->fine_time);
213 housekeeping_packet.sid = SID_HK;
213 housekeeping_packet.sid = SID_HK;
214
214
215 update_spacewire_statistics();
215 update_spacewire_statistics();
216
216
217 // SEND PACKET
217 // SEND PACKET
218 result = write ( fdSPW, &housekeeping_packet, LEN_TM_LFR_HK);
218 //result = write( fdSPW, &housekeeping_packet, LEN_TM_LFR_HK);
219 if (status == -1) {
219 status = rtems_message_queue_send( misc_id[1], &spw_ioctl_send, sizeof(spw_ioctl_send));
220 while (true) {
220 if (status != RTEMS_SUCCESSFUL) {
221 if (status != RTEMS_SUCCESSFUL) {
221 PRINTF1("in HOUS *** ERR %d\n", (int) status)
222 result = write ( fdSPW, &housekeeping_packet, LEN_TM_LFR_HK);
223 PRINTF("x")
224 sched_yield();
225 }
226 else {
227 PRINTF("\n")
228 break;
229 }
230 }
231 }
222 }
232 }
223 }
233 }
224 }
@@ -239,3 +230,25 rtems_task hous_task(rtems_task_argument
239 exit( 1 );
230 exit( 1 );
240 }
231 }
241
232
233 rtems_task send_task( rtems_task_argument argument)
234 {
235 rtems_status_code status; // RTEMS status code
236 spw_ioctl_pkt_send spw_ioctl_send_CWF; // incoming spw_ioctl_pkt_send structure
237 size_t size; // size of the incoming TC packet
238
239 PRINTF("in SEND *** \n")
240
241 while(1)
242 {
243 status = rtems_message_queue_receive(misc_id[1], (char*) &spw_ioctl_send_CWF, &size,
244 RTEMS_WAIT, RTEMS_NO_TIMEOUT);
245 if (status!=RTEMS_SUCCESSFUL) PRINTF1("ERR *** in task ACTN *** error receiving a message, code %d \n", status)
246 else
247 {
248 status = write_spw(&spw_ioctl_send_CWF);
249 if (status != RTEMS_SUCCESSFUL) {
250 PRINTF("in SEND *** TRAFFIC JAM\n")
251 }
252 }
253 }
254 }
@@ -72,35 +72,69 void GetCRCAsTwoBytes(unsigned char* dat
72 crcAsTwoBytes[1] = (unsigned char) (Chk & 0x00ff);
72 crcAsTwoBytes[1] = (unsigned char) (Chk & 0x00ff);
73 }
73 }
74
74
75 void updateLFRCurrentMode()
76 {
77 lfrCurrentMode = (housekeeping_packet.lfr_status_word[0] & 0xf0) >> 4;
78 }
79
75 //*********************
80 //*********************
76 // ACCEPTANCE FUNCTIONS
81 // ACCEPTANCE FUNCTIONS
77 int TC_acceptance(ccsdsTelecommandPacket_t *TC, unsigned int tc_len_recv)
82 int TC_acceptance(ccsdsTelecommandPacket_t *TC, unsigned int tc_len_recv)
78 {
83 {
79 int ret = 0;
84 int ret = 0;
80 rtems_status_code status;
85 rtems_status_code status;
81 spw_ioctl_pkt_send spw_ioctl_send;
86 Packet_TM_LFR_TC_EXE_CORRUPTED_t packet;
82 TMHeader_t TM_header;
87 unsigned int parserCode = 0;
83 unsigned int code = 0;
84 unsigned char computed_CRC[2];
88 unsigned char computed_CRC[2];
85 char data[ PACKET_LENGTH_TC_EXE_CORRUPTED + CCSDS_TC_TM_PACKET_OFFSET - TM_HEADER_LEN ];
89 unsigned int packetLength;
86
90
87 GetCRCAsTwoBytes( (unsigned char*) TC->packetID, computed_CRC, tc_len_recv + 5 );
91 GetCRCAsTwoBytes( (unsigned char*) TC->packetID, computed_CRC, tc_len_recv + 5 );
88 code = TC_parser( TC, tc_len_recv ) ;
92 parserCode = TC_parser( TC, tc_len_recv ) ;
89 if ( (code == ILLEGAL_APID) | (code == WRONG_LEN_PACKET) | (code == INCOR_CHECKSUM)
93 if ( (parserCode == ILLEGAL_APID) | (parserCode == WRONG_LEN_PACKET) | (parserCode == INCOR_CHECKSUM)
90 | (code == ILL_TYPE) | (code == ILL_SUBTYPE) | (code == WRONG_APP_DATA) )
94 | (parserCode == ILL_TYPE) | (parserCode == ILL_SUBTYPE) | (parserCode == WRONG_APP_DATA) )
91 { // generate TM_LFR_TC_EXE_CORRUPTED
95 { // generate TM_LFR_TC_EXE_CORRUPTED
92 // BUILD HEADER
96 packetLength = (TC->packetLength[0] * 256) + TC->packetLength[1];
93 TM_build_header( TM_LFR_TC_EXE_ERR, PACKET_LENGTH_TC_EXE_CORRUPTED,
97 packet.targetLogicalAddress = CCSDS_DESTINATION_ID;
94 &TM_header, TC->sourceID); // TC source ID
98 packet.protocolIdentifier = CCSDS_PROTOCOLE_ID;
95 // BUILD DATA
99 packet.reserved = DEFAULT_RESERVED;
96 TM_build_data( TC, data, SID_EXE_CORR, computed_CRC);
100 packet.userApplication = CCSDS_USER_APP;
97 // PREPARE TM SENDING
101 // PACKET HEADER
98 spw_ioctl_send.hlen = TM_HEADER_LEN + 4; // + 4 is for the protocole extra header
102 packet.packetID[0] = (unsigned char) (TM_PACKET_ID_TC_EXE >> 8);
99 spw_ioctl_send.hdr = (char*) &TM_header;
103 packet.packetID[1] = (unsigned char) (TM_PACKET_ID_TC_EXE );
100 spw_ioctl_send.dlen = 16;
104 packet.packetSequenceControl[0] = TM_PACKET_SEQ_CTRL_STANDALONE;
101 spw_ioctl_send.data = data;
105 packet.packetSequenceControl[1] = TM_PACKET_SEQ_CNT_DEFAULT;
106 packet.packetLength[0] = (unsigned char) (PACKET_LENGTH_TC_EXE_CORRUPTED >> 8);
107 packet.packetLength[1] = (unsigned char) (PACKET_LENGTH_TC_EXE_CORRUPTED );
108 // DATA FIELD HEADER
109 packet.spare1_pusVersion_spare2 = DEFAULT_SPARE1_PUSVERSION_SPARE2;
110 packet.serviceType = TM_TYPE_TC_EXE;
111 packet.serviceSubType = TM_SUBTYPE_EXE_NOK;
112 packet.destinationID = TM_DESTINATION_ID_GROUND;
113 packet.time[0] = (time_management_regs->coarse_time>>24 );
114 packet.time[1] = (time_management_regs->coarse_time>>16 );
115 packet.time[2] = (time_management_regs->coarse_time>>8 );
116 packet.time[3] = (time_management_regs->coarse_time );
117 packet.time[4] = (time_management_regs->fine_time>>8 );
118 packet.time[5] = (time_management_regs->fine_time );
119 //
120 packet.tc_failure_code[0] = (unsigned char) (FAILURE_CODE_CORRUPTED >> 8);
121 packet.tc_failure_code[1] = (unsigned char) (FAILURE_CODE_CORRUPTED );
122 packet.telecommand_pkt_id[0] = TC->packetID[0];
123 packet.telecommand_pkt_id[1] = TC->packetID[1];
124 packet.pkt_seq_control[0] = TC->packetSequenceControl[0];
125 packet.pkt_seq_control[0] = TC->packetSequenceControl[1];
126 packet.tc_service = TC->serviceType;
127 packet.tc_subtype = TC->serviceSubType;
128 packet.pkt_len_rcv_value[0] = TC->packetLength[0];
129 packet.pkt_len_rcv_value[1] = TC->packetLength[1];
130 packet.pkt_datafieldsize_cnt[0] = currentTC_LEN_RCV[0];
131 packet.pkt_datafieldsize_cnt[1] = currentTC_LEN_RCV[1];
132 packet.rcv_crc[0] = TC->dataAndCRC[packetLength];
133 packet.rcv_crc[1] = TC->dataAndCRC[packetLength];
134 packet.computed_crc[0] = computed_CRC[0];
135 packet.computed_crc[1] = computed_CRC[1];
102 // SEND PACKET
136 // SEND PACKET
103 status = ioctl( fdSPW, SPACEWIRE_IOCTRL_SEND, &spw_ioctl_send );
137 status = write( fdSPW, (char *) &packet, PACKET_LENGTH_TC_EXE_CORRUPTED + CCSDS_TC_TM_PACKET_OFFSET + 4);
104 }
138 }
105 else { // send valid TC to the action launcher
139 else { // send valid TC to the action launcher
106 status = rtems_message_queue_send( misc_id[0], TC, tc_len_recv + CCSDS_TC_TM_PACKET_OFFSET + 3);
140 status = rtems_message_queue_send( misc_id[0], TC, tc_len_recv + CCSDS_TC_TM_PACKET_OFFSET + 3);
@@ -328,62 +362,6 unsigned char TM_build_header( enum TM_T
328 return LFR_SUCCESSFUL;
362 return LFR_SUCCESSFUL;
329 }
363 }
330
364
331 unsigned char TM_build_data(ccsdsTelecommandPacket_t *TC, char* data, unsigned int SID, unsigned char *computed_CRC)
332 {
333 unsigned int packetLength;
334 packetLength = (TC->packetLength[0] * 256) + TC->packetLength[1];
335 switch (SID){
336 case (SID_NOT_EXE):
337 break;
338 case (SID_NOT_IMP):
339 data[0] = (unsigned char) (SID_NOT_IMP >> 8);
340 data[1] = (unsigned char) SID_NOT_IMP;
341 data[2] = TC->packetID[0];
342 data[3] = TC->packetID[1];
343 data[4] = TC->packetSequenceControl[0];
344 data[5] = TC->packetSequenceControl[1];
345 data[6] = TC->serviceType; // type
346 data[7] = TC->serviceSubType; // subtype
347 break;
348 case (SID_EXE_ERR):
349 break;
350 case (SID_EXE_CORR):
351 data[0] = (unsigned char) (SID_EXE_CORR >> 8);
352 data[1] = (unsigned char) SID_EXE_CORR;
353 data[2] = TC->packetID[0];
354 data[3] = TC->packetID[1];
355 data[4] = TC->packetSequenceControl[0];
356 data[5] = TC->packetSequenceControl[1];
357 data[6] = TC->serviceType; // type
358 data[7] = TC->serviceSubType; // subtype
359 data[8] = currentTC_LEN_RCV[0];
360 data[9] = currentTC_LEN_RCV[1];
361 data[10] = TC->packetLength[0];
362 data[11] = TC->packetLength[1];
363 data[12] = TC->dataAndCRC[packetLength];
364 data[13] = TC->dataAndCRC[packetLength+1];
365 data[14] = computed_CRC[0];
366 data[15] = computed_CRC[1];
367 break;
368 default:
369 return 0;
370 }
371 return 1;
372 }
373
374 int create_message_queue( void )
375 {
376 rtems_status_code status;
377 misc_name[0] = rtems_build_name( 'Q', 'U', 'E', 'U' );
378 status = rtems_message_queue_create( misc_name[0], ACTION_MSG_QUEUE_COUNT, CCSDS_TC_PKT_MAX_SIZE,
379 RTEMS_FIFO | RTEMS_LOCAL, &misc_id[0] );
380 if (status!=RTEMS_SUCCESSFUL) {
381 PRINTF("in create_message_queue *** error creating message queue\n")
382 }
383
384 return 0;
385 }
386
387 //***********
365 //***********
388 // RTEMS TASK
366 // RTEMS TASK
389 rtems_task recv_task( rtems_task_argument unused )
367 rtems_task recv_task( rtems_task_argument unused )
@@ -453,46 +431,47 rtems_task actn_task( rtems_task_argumen
453 switch(subtype)
431 switch(subtype)
454 {
432 {
455 case TC_SUBTYPE_RESET:
433 case TC_SUBTYPE_RESET:
456 result = action_default( &TC );
434 result = action_reset( &TC );
435 close_action( &TC, result );
457 break;
436 break;
458 //
437 //
459 case TC_SUBTYPE_LOAD_COMM:
438 case TC_SUBTYPE_LOAD_COMM:
460 result = action_load_comm( &TC );
439 result = action_load_common_par( &TC );
461 close_action( &TC, result );
440 close_action( &TC, result );
462 break;
441 break;
463 //
442 //
464 case TC_SUBTYPE_LOAD_NORM:
443 case TC_SUBTYPE_LOAD_NORM:
465 result = action_load_norm( &TC );
444 result = action_load_normal_par( &TC );
466 close_action( &TC, result );
445 close_action( &TC, result );
467 break;
446 break;
468 //
447 //
469 case TC_SUBTYPE_LOAD_BURST:
448 case TC_SUBTYPE_LOAD_BURST:
470 result = action_load_burst( &TC );
449 result = action_load_burst_par( &TC );
471 close_action( &TC, result );
450 close_action( &TC, result );
472 break;
451 break;
473 //
452 //
474 case TC_SUBTYPE_LOAD_SBM1:
453 case TC_SUBTYPE_LOAD_SBM1:
475 result = action_load_sbm1( &TC );
454 result = action_load_sbm1_par( &TC );
476 close_action( &TC, result );
455 close_action( &TC, result );
477 break;
456 break;
478 //
457 //
479 case TC_SUBTYPE_LOAD_SBM2:
458 case TC_SUBTYPE_LOAD_SBM2:
480 result = action_load_sbm2( &TC );
459 result = action_load_sbm2_par( &TC );
481 close_action( &TC, result );
460 close_action( &TC, result );
482 break;
461 break;
483 //
462 //
484 case TC_SUBTYPE_DUMP:
463 case TC_SUBTYPE_DUMP:
485 result = action_dump( &TC );
464 result = action_dump_par( &TC );
486 close_action( &TC, result );
465 close_action( &TC, result );
487 break;
466 break;
488 //
467 //
489 case TC_SUBTYPE_ENTER:
468 case TC_SUBTYPE_ENTER:
490 result = action_enter( &TC );
469 result = action_enter_mode( &TC );
491 close_action( &TC, result );
470 close_action( &TC, result );
492 break;
471 break;
493 //
472 //
494 case TC_SUBTYPE_UPDT_INFO:
473 case TC_SUBTYPE_UPDT_INFO:
495 result = action_updt_info( &TC );
474 result = action_update_info( &TC );
496 close_action( &TC, result );
475 close_action( &TC, result );
497 break;
476 break;
498 //
477 //
@@ -507,7 +486,8 rtems_task actn_task( rtems_task_argumen
507 break;
486 break;
508 //
487 //
509 case TC_SUBTYPE_UPDT_TIME:
488 case TC_SUBTYPE_UPDT_TIME:
510 result = action_updt_time( &TC );
489 result = action_update_time( &TC );
490 close_action( &TC, result );
511 break;
491 break;
512 //
492 //
513 default:
493 default:
@@ -546,73 +526,13 rtems_task dumb_task( rtems_task_argumen
546 //***********
526 //***********
547 // TC ACTIONS
527 // TC ACTIONS
548
528
549 int action_default(ccsdsTelecommandPacket_t *TC)
529 int action_reset(ccsdsTelecommandPacket_t *TC)
550 {
530 {
551 rtems_status_code status;
531 send_tm_lfr_tc_exe_not_implemented( TC );
552 TMHeader_t header;
553 spw_ioctl_pkt_send spw_ioctl_send;
554 unsigned char data[10];
555
556 TM_build_header( TM_LFR_TC_EXE_ERR, PACKET_LENGTH_TC_EXE_NOT_IMPLEMENTED,
557 &header, TC->sourceID);
558
559 spw_ioctl_send.hlen = TM_HEADER_LEN + 4;
560 spw_ioctl_send.hdr = (char *) &header;
561 spw_ioctl_send.dlen = 8;
562 spw_ioctl_send.data = (char *) data;
563 spw_ioctl_send.options = 0;
564
565 data[0] = (char) (FAILURE_CODE_NOT_IMPLEMENTED >> 8);
566 data[1] = (char) FAILURE_CODE_NOT_IMPLEMENTED;
567 data[2] = TC->packetID[0];
568 data[3] = TC->packetID[1];
569 data[4] = TC->packetSequenceControl[0];
570 data[5] = TC->packetSequenceControl[1];
571 data[6] = TC->serviceType; // type
572 data[7] = TC->serviceSubType; // subtype
573
574 // SEND DATA
575 status = write_spw(&spw_ioctl_send);
576 if (status != RTEMS_SUCCESSFUL)
577 {
578 PRINTF("ERR *** in action_default *** send TM packet\n")
579 }
580
581 return LFR_DEFAULT;
532 return LFR_DEFAULT;
582 }
533 }
583
534
584 int action_enter(ccsdsTelecommandPacket_t *TC)
535 int action_load_common_par(ccsdsTelecommandPacket_t *TC)
585 {
586 rtems_status_code status;
587 unsigned char requestedMode;
588
589 requestedMode = TC->dataAndCRC[1];
590
591 printf("try to enter mode %d\n", requestedMode);
592
593 status = transition_validation(requestedMode);
594
595 if ( status == LFR_SUCCESSFUL ) {
596 if ( (housekeeping_packet.lfr_status_word[0] & 0xf0) != LFR_MODE_STANDBY)
597 {
598 status = stop_current_mode();
599 }
600 if (status != RTEMS_SUCCESSFUL)
601 {
602 PRINTF("ERR *** in action_enter *** stop_current_mode\n")
603 }
604 status = enter_mode(requestedMode, TC);
605 }
606 else
607 {
608 PRINTF("ERR *** in action_enter *** transition rejected\n")
609 send_tm_lfr_tc_exe_not_executable( TC );
610 }
611
612 return status;
613 }
614
615 int action_load_comm(ccsdsTelecommandPacket_t *TC)
616 {
536 {
617 parameter_dump_packet.unused0 = TC->dataAndCRC[0];
537 parameter_dump_packet.unused0 = TC->dataAndCRC[0];
618 parameter_dump_packet.bw_sp0_sp1_r0_r1 = TC->dataAndCRC[1];
538 parameter_dump_packet.bw_sp0_sp1_r0_r1 = TC->dataAndCRC[1];
@@ -622,7 +542,7 int action_load_comm(ccsdsTelecommandPac
622 return LFR_SUCCESSFUL;
542 return LFR_SUCCESSFUL;
623 }
543 }
624
544
625 int action_load_norm(ccsdsTelecommandPacket_t *TC)
545 int action_load_normal_par(ccsdsTelecommandPacket_t *TC)
626 {
546 {
627 int result;
547 int result;
628 unsigned char lfrMode;
548 unsigned char lfrMode;
@@ -652,7 +572,7 int action_load_norm(ccsdsTelecommandPac
652 return result;
572 return result;
653 }
573 }
654
574
655 int action_load_burst(ccsdsTelecommandPacket_t *TC)
575 int action_load_burst_par(ccsdsTelecommandPacket_t *TC)
656 {
576 {
657 int result;
577 int result;
658 unsigned char lfrMode;
578 unsigned char lfrMode;
@@ -674,7 +594,7 int action_load_burst(ccsdsTelecommandPa
674 return result;
594 return result;
675 }
595 }
676
596
677 int action_load_sbm1(ccsdsTelecommandPacket_t *TC)
597 int action_load_sbm1_par(ccsdsTelecommandPacket_t *TC)
678 {
598 {
679 int result;
599 int result;
680 unsigned char lfrMode;
600 unsigned char lfrMode;
@@ -696,7 +616,7 int action_load_sbm1(ccsdsTelecommandPac
696 return result;
616 return result;
697 }
617 }
698
618
699 int action_load_sbm2(ccsdsTelecommandPacket_t *TC)
619 int action_load_sbm2_par(ccsdsTelecommandPacket_t *TC)
700 {
620 {
701 int result;
621 int result;
702 unsigned char lfrMode;
622 unsigned char lfrMode;
@@ -718,7 +638,7 int action_load_sbm2(ccsdsTelecommandPac
718 return result;
638 return result;
719 }
639 }
720
640
721 int action_dump(ccsdsTelecommandPacket_t *TC)
641 int action_dump_par(ccsdsTelecommandPacket_t *TC)
722 {
642 {
723 int status;
643 int status;
724 // send parameter dump packet
644 // send parameter dump packet
@@ -737,7 +657,45 int action_dump(ccsdsTelecommandPacket_t
737 return status;
657 return status;
738 }
658 }
739
659
740 int action_updt_info(ccsdsTelecommandPacket_t *TC) {
660 int action_enter_mode(ccsdsTelecommandPacket_t *TC)
661 {
662 rtems_status_code status;
663 unsigned char requestedMode;
664
665 requestedMode = TC->dataAndCRC[1];
666
667 printf("try to enter mode %d\n", requestedMode);
668
669 #ifdef PRINT_TASK_STATISTICS
670 if (requestedMode != LFR_MODE_STANDBY)
671 {
672 rtems_cpu_usage_reset();
673 }
674 #endif
675
676 status = transition_validation(requestedMode);
677
678 if ( status == LFR_SUCCESSFUL ) {
679 if ( lfrCurrentMode != LFR_MODE_STANDBY)
680 {
681 status = stop_current_mode();
682 }
683 if (status != RTEMS_SUCCESSFUL)
684 {
685 PRINTF("ERR *** in action_enter *** stop_current_mode\n")
686 }
687 status = enter_mode(requestedMode, TC);
688 }
689 else
690 {
691 PRINTF("ERR *** in action_enter *** transition rejected\n")
692 send_tm_lfr_tc_exe_not_executable( TC );
693 }
694
695 return status;
696 }
697
698 int action_update_info(ccsdsTelecommandPacket_t *TC) {
741 unsigned int val;
699 unsigned int val;
742 int result;
700 int result;
743 unsigned char lfrMode;
701 unsigned char lfrMode;
@@ -746,7 +704,7 int action_updt_info(ccsdsTelecommandPac
746 lfrMode = (housekeeping_packet.lfr_status_word[0] & 0xf0) >> 4;
704 lfrMode = (housekeeping_packet.lfr_status_word[0] & 0xf0) >> 4;
747
705
748 if ( (lfrMode == LFR_MODE_STANDBY) ) {
706 if ( (lfrMode == LFR_MODE_STANDBY) ) {
749 send_tm_lfr_tc_exe_not_executable( TC );
707 send_tm_lfr_tc_exe_not_implemented( TC );
750 result = LFR_DEFAULT;
708 result = LFR_DEFAULT;
751 }
709 }
752 else {
710 else {
@@ -799,7 +757,7 int action_disable_calibration(ccsdsTele
799 return result;
757 return result;
800 }
758 }
801
759
802 int action_updt_time(ccsdsTelecommandPacket_t *TC)
760 int action_update_time(ccsdsTelecommandPacket_t *TC)
803 {
761 {
804 unsigned int val;
762 unsigned int val;
805
763
@@ -812,7 +770,7 int action_updt_time(ccsdsTelecommandPac
812 val++;
770 val++;
813 housekeeping_packet.hk_lfr_update_time_tc_cnt[0] = (unsigned char) (val >> 8);
771 housekeeping_packet.hk_lfr_update_time_tc_cnt[0] = (unsigned char) (val >> 8);
814 housekeeping_packet.hk_lfr_update_time_tc_cnt[1] = (unsigned char) (val);
772 housekeeping_packet.hk_lfr_update_time_tc_cnt[1] = (unsigned char) (val);
815 //time_management_regs->ctrl = time_management_regs->ctrl | 1;
773 time_management_regs->ctrl = time_management_regs->ctrl | 1;
816
774
817 return LFR_SUCCESSFUL;
775 return LFR_SUCCESSFUL;
818 }
776 }
@@ -823,14 +781,11 int action_updt_time(ccsdsTelecommandPac
823 int transition_validation(unsigned char requestedMode)
781 int transition_validation(unsigned char requestedMode)
824 {
782 {
825 int status;
783 int status;
826 unsigned char lfrMode;
827
828 lfrMode = (housekeeping_packet.lfr_status_word[0] & 0xf0) >> 4;
829
784
830 switch (requestedMode)
785 switch (requestedMode)
831 {
786 {
832 case LFR_MODE_STANDBY:
787 case LFR_MODE_STANDBY:
833 if ( lfrMode == LFR_MODE_STANDBY ) {
788 if ( lfrCurrentMode == LFR_MODE_STANDBY ) {
834 status = LFR_DEFAULT;
789 status = LFR_DEFAULT;
835 }
790 }
836 else
791 else
@@ -839,7 +794,7 int transition_validation(unsigned char
839 }
794 }
840 break;
795 break;
841 case LFR_MODE_NORMAL:
796 case LFR_MODE_NORMAL:
842 if ( lfrMode == LFR_MODE_NORMAL ) {
797 if ( lfrCurrentMode == LFR_MODE_NORMAL ) {
843 status = LFR_DEFAULT;
798 status = LFR_DEFAULT;
844 }
799 }
845 else {
800 else {
@@ -847,7 +802,7 int transition_validation(unsigned char
847 }
802 }
848 break;
803 break;
849 case LFR_MODE_BURST:
804 case LFR_MODE_BURST:
850 if ( lfrMode == LFR_MODE_BURST ) {
805 if ( lfrCurrentMode == LFR_MODE_BURST ) {
851 status = LFR_DEFAULT;
806 status = LFR_DEFAULT;
852 }
807 }
853 else {
808 else {
@@ -855,7 +810,7 int transition_validation(unsigned char
855 }
810 }
856 break;
811 break;
857 case LFR_MODE_SBM1:
812 case LFR_MODE_SBM1:
858 if ( lfrMode == LFR_MODE_SBM1 ) {
813 if ( lfrCurrentMode == LFR_MODE_SBM1 ) {
859 status = LFR_DEFAULT;
814 status = LFR_DEFAULT;
860 }
815 }
861 else {
816 else {
@@ -863,7 +818,7 int transition_validation(unsigned char
863 }
818 }
864 break;
819 break;
865 case LFR_MODE_SBM2:
820 case LFR_MODE_SBM2:
866 if ( lfrMode == LFR_MODE_SBM2 ) {
821 if ( lfrCurrentMode == LFR_MODE_SBM2 ) {
867 status = LFR_DEFAULT;
822 status = LFR_DEFAULT;
868 }
823 }
869 else {
824 else {
@@ -897,9 +852,11 int stop_current_mode()
897 #else
852 #else
898 LEON_Mask_interrupt( IRQ_WAVEFORM_PICKER ); // mask waveform picker interrupt
853 LEON_Mask_interrupt( IRQ_WAVEFORM_PICKER ); // mask waveform picker interrupt
899 LEON_Clear_interrupt( IRQ_WAVEFORM_PICKER ); // clear waveform picker interrupt
854 LEON_Clear_interrupt( IRQ_WAVEFORM_PICKER ); // clear waveform picker interrupt
855 LEON_Mask_interrupt( IRQ_SPECTRAL_MATRIX ); // mask spectral matrix interrupt
856 LEON_Clear_interrupt( IRQ_SPECTRAL_MATRIX ); // clear spectral matrix interrupt
900 #endif
857 #endif
858 //**********************
901 // suspend several tasks
859 // suspend several tasks
902
903 if (lfrMode != LFR_MODE_STANDBY) {
860 if (lfrMode != LFR_MODE_STANDBY) {
904 suspend_science_tasks();
861 suspend_science_tasks();
905 }
862 }
@@ -909,10 +866,12 int stop_current_mode()
909 PRINTF("ERR *** in stop_current_mode *** suspending tasks\n")
866 PRINTF("ERR *** in stop_current_mode *** suspending tasks\n")
910 }
867 }
911
868
869 //*************************
912 // initialize the registers
870 // initialize the registers
913 #ifdef GSA
871 #ifdef GSA
914 #else
872 #else
915 waveform_picker_regs->burst_enable = 0x00; // initialize
873 reset_wfp_burst_enable(); // reset burst and enable bits
874 reset_wfp_status(); // reset all the status bits
916 #endif
875 #endif
917
876
918 return status;
877 return status;
@@ -922,6 +881,11 int enter_mode(unsigned char mode, ccsds
922 {
881 {
923 rtems_status_code status;
882 rtems_status_code status;
924
883
884 status = RTEMS_UNSATISFIED;
885
886 housekeeping_packet.lfr_status_word[0] = (unsigned char) ((mode << 4) + 0x0d);
887 lfrCurrentMode = mode;
888
925 switch(mode){
889 switch(mode){
926 case LFR_MODE_STANDBY:
890 case LFR_MODE_STANDBY:
927 status = enter_standby_mode( TC );
891 status = enter_standby_mode( TC );
@@ -942,20 +906,25 int enter_mode(unsigned char mode, ccsds
942 status = RTEMS_UNSATISFIED;
906 status = RTEMS_UNSATISFIED;
943 }
907 }
944
908
945 if (status == RTEMS_SUCCESSFUL)
909 if (status != RTEMS_SUCCESSFUL)
946 {
910 {
947 housekeeping_packet.lfr_status_word[0] = (unsigned char) ((mode << 4) + 0x0d);
911 PRINTF("in enter_mode *** ERR\n")
912 status = RTEMS_UNSATISFIED;
948 }
913 }
949
914
950 return status;
915 return status;
951 }
916 }
952
917
953 int enter_standby_mode(ccsdsTelecommandPacket_t *TC)
918 int enter_standby_mode()
954 {
919 {
920 reset_waveform_picker_regs();
921 #ifdef PRINT_TASK_STATISTICS
922 rtems_cpu_usage_report();
923 #endif
955 return LFR_SUCCESSFUL;
924 return LFR_SUCCESSFUL;
956 }
925 }
957
926
958 int enter_normal_mode( ccsdsTelecommandPacket_t *TC )
927 int enter_normal_mode()
959 {
928 {
960 rtems_status_code status;
929 rtems_status_code status;
961
930
@@ -971,13 +940,14 int enter_normal_mode( ccsdsTelecommandP
971 LEON_Clear_interrupt( IRQ_SM ); // the IRQ_SM seems to be incompatible with the IRQ_WF on the xilinx board
940 LEON_Clear_interrupt( IRQ_SM ); // the IRQ_SM seems to be incompatible with the IRQ_WF on the xilinx board
972 LEON_Unmask_interrupt( IRQ_SM );
941 LEON_Unmask_interrupt( IRQ_SM );
973 #else
942 #else
943 //****************
974 // waveform picker
944 // waveform picker
975 LEON_Clear_interrupt( IRQ_WAVEFORM_PICKER );
945 LEON_Clear_interrupt( IRQ_WAVEFORM_PICKER );
976 LEON_Unmask_interrupt( IRQ_WAVEFORM_PICKER );
946 LEON_Unmask_interrupt( IRQ_WAVEFORM_PICKER );
977 reset_waveform_picker_regs();
947 reset_waveform_picker_regs();
978 set_wfp_burst_enable_register(LFR_MODE_NORMAL);
948 set_wfp_burst_enable_register(LFR_MODE_NORMAL);
949 //****************
979 // spectral matrix
950 // spectral matrix
980 //
981 set_local_nb_interrupt_f0_MAX();
951 set_local_nb_interrupt_f0_MAX();
982 LEON_Clear_interrupt( IRQ_SPECTRAL_MATRIX ); // the IRQ_SM seems to be incompatible with the IRQ_WF on the xilinx board
952 LEON_Clear_interrupt( IRQ_SPECTRAL_MATRIX ); // the IRQ_SM seems to be incompatible with the IRQ_WF on the xilinx board
983 LEON_Unmask_interrupt( IRQ_SPECTRAL_MATRIX );
953 LEON_Unmask_interrupt( IRQ_SPECTRAL_MATRIX );
@@ -988,7 +958,7 int enter_normal_mode( ccsdsTelecommandP
988 return status;
958 return status;
989 }
959 }
990
960
991 int enter_burst_mode(ccsdsTelecommandPacket_t *TC)
961 int enter_burst_mode()
992 {
962 {
993 rtems_status_code status;
963 rtems_status_code status;
994 unsigned char lfrMode;
964 unsigned char lfrMode;
@@ -998,22 +968,18 int enter_burst_mode(ccsdsTelecommandPac
998 status = restart_science_tasks();
968 status = restart_science_tasks();
999
969
1000 #ifdef GSA
970 #ifdef GSA
971 LEON_Unmask_interrupt( IRQ_SM );
1001 #else
972 #else
1002 LEON_Clear_interrupt( IRQ_WAVEFORM_PICKER );
973 LEON_Clear_interrupt( IRQ_WAVEFORM_PICKER );
1003 LEON_Unmask_interrupt( IRQ_WAVEFORM_PICKER );
974 LEON_Unmask_interrupt( IRQ_WAVEFORM_PICKER );
1004 reset_waveform_picker_regs();
975 reset_waveform_picker_regs();
1005 set_wfp_burst_enable_register(LFR_MODE_BURST);
976 set_wfp_burst_enable_register(LFR_MODE_BURST);
1006 waveform_picker_regs->burst_enable = 0x40; // [0100 0000] burst f2, f1, f0 enable f3 f2 f1 f0
1007 waveform_picker_regs->burst_enable = waveform_picker_regs->burst_enable | 0x04;
1008 waveform_picker_regs->status = 0x00;
1009 #endif
977 #endif
1010
978
1011 LEON_Unmask_interrupt( IRQ_SM );
1012
1013 return status;
979 return status;
1014 }
980 }
1015
981
1016 int enter_sbm1_mode(ccsdsTelecommandPacket_t *TC)
982 int enter_sbm1_mode()
1017 {
983 {
1018 rtems_status_code status;
984 rtems_status_code status;
1019
985
@@ -1024,20 +990,18 int enter_sbm1_mode(ccsdsTelecommandPack
1024 reset_local_sbm1_nb_cwf_sent();
990 reset_local_sbm1_nb_cwf_sent();
1025
991
1026 #ifdef GSA
992 #ifdef GSA
993 LEON_Unmask_interrupt( IRQ_SM );
1027 #else
994 #else
1028 LEON_Clear_interrupt( IRQ_WAVEFORM_PICKER );
995 LEON_Clear_interrupt( IRQ_WAVEFORM_PICKER );
1029 LEON_Unmask_interrupt( IRQ_WAVEFORM_PICKER );
996 LEON_Unmask_interrupt( IRQ_WAVEFORM_PICKER );
1030 reset_waveform_picker_regs();
997 reset_waveform_picker_regs();
1031 set_wfp_burst_enable_register(LFR_MODE_SBM1);
998 set_wfp_burst_enable_register(LFR_MODE_SBM1);
1032 waveform_picker_regs->status = 0x00;
1033 #endif
999 #endif
1034
1000
1035 LEON_Unmask_interrupt( IRQ_SM );
1036
1037 return status;
1001 return status;
1038 }
1002 }
1039
1003
1040 int enter_sbm2_mode(ccsdsTelecommandPacket_t *TC)
1004 int enter_sbm2_mode()
1041 {
1005 {
1042 rtems_status_code status;
1006 rtems_status_code status;
1043
1007
@@ -1048,54 +1012,63 int enter_sbm2_mode(ccsdsTelecommandPack
1048 reset_local_sbm2_nb_cwf_sent();
1012 reset_local_sbm2_nb_cwf_sent();
1049
1013
1050 #ifdef GSA
1014 #ifdef GSA
1015 LEON_Unmask_interrupt( IRQ_SM );
1051 #else
1016 #else
1052 LEON_Clear_interrupt( IRQ_WAVEFORM_PICKER );
1017 LEON_Clear_interrupt( IRQ_WAVEFORM_PICKER );
1053 LEON_Unmask_interrupt( IRQ_WAVEFORM_PICKER );
1018 LEON_Unmask_interrupt( IRQ_WAVEFORM_PICKER );
1054 reset_waveform_picker_regs();
1019 reset_waveform_picker_regs();
1055 set_wfp_burst_enable_register(LFR_MODE_SBM2);
1020 set_wfp_burst_enable_register(LFR_MODE_SBM2);
1056 waveform_picker_regs->status = 0x00;
1057 #endif
1021 #endif
1058
1022
1059 LEON_Unmask_interrupt( IRQ_SM );
1060
1061 return status;
1023 return status;
1062 }
1024 }
1063
1025
1064 int restart_science_tasks()
1026 int restart_science_tasks()
1065 {
1027 {
1066 rtems_status_code status;
1028 rtems_status_code status[6];
1029 rtems_status_code ret;
1067
1030
1068 status = rtems_task_restart( Task_id[TASKID_AVF0], 0 );
1031 ret = RTEMS_SUCCESSFUL;
1069
1032
1070 if (status == RTEMS_SUCCESSFUL) {
1033 status[0] = rtems_task_restart( Task_id[TASKID_AVF0], 1 );
1071 status = rtems_task_restart( Task_id[TASKID_BPF0], 0 );
1034 status[1] = rtems_task_restart( Task_id[TASKID_BPF0],1 );
1072 if (status == RTEMS_SUCCESSFUL) {
1035 status[2] = rtems_task_restart( Task_id[TASKID_WFRM],1 );
1073 status = rtems_task_restart( Task_id[TASKID_WFRM], 0 );
1036 status[3] = rtems_task_restart( Task_id[TASKID_CWF3],1 );
1074 if (status == RTEMS_SUCCESSFUL) {
1037 status[4] = rtems_task_restart( Task_id[TASKID_CWF2],1 );
1075 status = rtems_task_restart( Task_id[TASKID_CWF3], 0 );
1038 status[5] = rtems_task_restart( Task_id[TASKID_CWF1],1 );
1076 }
1039
1077 }
1040 if ( (status[0] != RTEMS_SUCCESSFUL) || (status[1] != RTEMS_SUCCESSFUL) || (status[2] != RTEMS_SUCCESSFUL) ||
1041 (status[3] != RTEMS_SUCCESSFUL) || (status[4] != RTEMS_SUCCESSFUL) || (status[5] != RTEMS_SUCCESSFUL) )
1042 {
1043 ret = RTEMS_UNSATISFIED;
1044 PRINTF("in restart_science_tasks *** ERR\n")
1078 }
1045 }
1079
1046
1080 return status;
1047 return ret;
1081 }
1048 }
1082
1049
1083 int suspend_science_tasks()
1050 int suspend_science_tasks()
1084 {
1051 {
1085 rtems_status_code status;
1052 rtems_status_code status[6];
1053 rtems_status_code ret;
1054
1055 ret = RTEMS_SUCCESSFUL;
1086
1056
1087 status = rtems_task_suspend( Task_id[TASKID_AVF0] );
1057 status[0] = rtems_task_suspend( Task_id[TASKID_AVF0] );
1088 if (status == RTEMS_SUCCESSFUL) {
1058 status[1] = rtems_task_suspend( Task_id[TASKID_BPF0] );
1089 status = rtems_task_suspend( Task_id[TASKID_BPF0] );
1059 status[2] = rtems_task_suspend( Task_id[TASKID_WFRM] );
1090 if (status == RTEMS_SUCCESSFUL) {
1060 status[3] = rtems_task_suspend( Task_id[TASKID_CWF3] );
1091 status = rtems_task_suspend( Task_id[TASKID_WFRM] );
1061 status[4] = rtems_task_suspend( Task_id[TASKID_CWF2] );
1092 if (status == RTEMS_SUCCESSFUL) {
1062 status[5] = rtems_task_suspend( Task_id[TASKID_CWF1] );
1093 status = rtems_task_suspend( Task_id[TASKID_CWF3] );
1063
1094 }
1064 if ( (status[0] != RTEMS_SUCCESSFUL) || (status[1] != RTEMS_SUCCESSFUL) || (status[2] != RTEMS_SUCCESSFUL) ||
1095 }
1065 (status[3] != RTEMS_SUCCESSFUL) || (status[4] != RTEMS_SUCCESSFUL) || (status[5] != RTEMS_SUCCESSFUL) )
1066 {
1067 ret = RTEMS_UNSATISFIED;
1068 PRINTF("in suspend_science_tasks *** ERR\n")
1096 }
1069 }
1097
1070
1098 return status;
1071 return ret;
1099 }
1072 }
1100
1073
1101 //****************
1074 //****************
@@ -1103,6 +1076,7 int suspend_science_tasks()
1103
1076
1104 int send_tm_lfr_tc_exe_success(ccsdsTelecommandPacket_t *TC)
1077 int send_tm_lfr_tc_exe_success(ccsdsTelecommandPacket_t *TC)
1105 {
1078 {
1079 int ret;
1106 rtems_status_code status;
1080 rtems_status_code status;
1107 TMHeader_t TM_header;
1081 TMHeader_t TM_header;
1108 char data[4];
1082 char data[4];
@@ -1125,9 +1099,14 int send_tm_lfr_tc_exe_success(ccsdsTele
1125 spw_ioctl_send.options = 0;
1099 spw_ioctl_send.options = 0;
1126
1100
1127 // SEND DATA
1101 // SEND DATA
1128 status = ioctl( fdSPW, SPACEWIRE_IOCTRL_SEND, &spw_ioctl_send );
1102 //status = ioctl( fdSPW, SPACEWIRE_IOCTRL_SEND, &spw_ioctl_send );
1103 status = rtems_message_queue_send( misc_id[1], &spw_ioctl_send, sizeof(spw_ioctl_send));
1104 if (status != RTEMS_SUCCESSFUL) {
1105 PRINTF("in send_tm_lfr_tc_exe_success *** ERR\n")
1106 ret = LFR_DEFAULT;
1107 }
1129
1108
1130 return LFR_SUCCESSFUL;
1109 return ret;
1131 }
1110 }
1132
1111
1133 int send_tm_lfr_tc_exe_not_executable(ccsdsTelecommandPacket_t *TC)
1112 int send_tm_lfr_tc_exe_not_executable(ccsdsTelecommandPacket_t *TC)
@@ -1268,7 +1247,10 void close_action(ccsdsTelecommandPacket
1268 unsigned int val = 0;
1247 unsigned int val = 0;
1269 if (result == LFR_SUCCESSFUL)
1248 if (result == LFR_SUCCESSFUL)
1270 {
1249 {
1271 send_tm_lfr_tc_exe_success( TC );
1250 if ( !( (TC->serviceType==TC_TYPE_TIME) && (TC->serviceSubType==TC_SUBTYPE_UPDT_TIME) ) )
1251 {
1252 send_tm_lfr_tc_exe_success( TC );
1253 }
1272 update_last_TC_exe( TC );
1254 update_last_TC_exe( TC );
1273 val = housekeeping_packet.hk_dpu_exe_tc_lfr_cnt[0] * 256 + housekeeping_packet.hk_dpu_exe_tc_lfr_cnt[1];
1255 val = housekeeping_packet.hk_dpu_exe_tc_lfr_cnt[0] * 256 + housekeeping_packet.hk_dpu_exe_tc_lfr_cnt[1];
1274 val++;
1256 val++;
This diff has been collapsed as it changes many lines, (924 lines changed) Show them Hide them
@@ -1,15 +1,23
1 #include <wf_handler.h>
1 #include <wf_handler.h>
2
2
3 Header_TM_LFR_SCIENCE_SWF_t headerSWF_F0_F1_F2[3][7];
4 Header_TM_LFR_SCIENCE_CWF_t headerCWF_F1[7];
5 Header_TM_LFR_SCIENCE_CWF_t headerCWF_F2_BURST[7];
6 Header_TM_LFR_SCIENCE_CWF_t headerCWF_F2_SBM1[7];
7 Header_TM_LFR_SCIENCE_CWF_t headerCWF_F3[7];
8
9 unsigned char doubleSendCWF1 = 0;
10 unsigned char doubleSendCWF2 = 0;
11
3 rtems_isr waveforms_isr( rtems_vector_number vector )
12 rtems_isr waveforms_isr( rtems_vector_number vector )
4 {
13 {
5 unsigned char lfrMode;
6 lfrMode = (housekeeping_packet.lfr_status_word[0] & 0xf0) >> 4;
7
14
8 #ifdef GSA
15 #ifdef GSA
9 #else
16 #else
10 if ( (lfrMode != LFR_MODE_STANDBY) & (lfrMode != LFR_MODE_BURST) )
17 if ( (lfrCurrentMode == LFR_MODE_NORMAL)
18 || (lfrCurrentMode == LFR_MODE_SBM1) || (lfrCurrentMode == LFR_MODE_SBM2) )
11 { // in modes other than STANDBY and BURST, send the CWF_F3 data
19 { // in modes other than STANDBY and BURST, send the CWF_F3 data
12 if ((waveform_picker_regs->status & 0x08) == 0x08){ // f3 is full
20 if ((waveform_picker_regs->status & 0x08) == 0x08){ // [1000] f3 is full
13 // (1) change the receiving buffer for the waveform picker
21 // (1) change the receiving buffer for the waveform picker
14 if (waveform_picker_regs->addr_data_f3 == (int) wf_cont_f3) {
22 if (waveform_picker_regs->addr_data_f3 == (int) wf_cont_f3) {
15 waveform_picker_regs->addr_data_f3 = (int) (wf_cont_f3_bis);
23 waveform_picker_regs->addr_data_f3 = (int) (wf_cont_f3_bis);
@@ -18,132 +26,134 rtems_isr waveforms_isr( rtems_vector_nu
18 waveform_picker_regs->addr_data_f3 = (int) (wf_cont_f3);
26 waveform_picker_regs->addr_data_f3 = (int) (wf_cont_f3);
19 }
27 }
20 // (2) send an event for the waveforms transmission
28 // (2) send an event for the waveforms transmission
21 if (rtems_event_send( Task_id[TASKID_CWF3], RTEMS_EVENT_MODE_NORMAL_CWF_F3 ) != RTEMS_SUCCESSFUL) {
29 if (rtems_event_send( Task_id[TASKID_CWF3], RTEMS_EVENT_0 ) != RTEMS_SUCCESSFUL) {
22 rtems_event_send( Task_id[TASKID_DUMB], RTEMS_EVENT_2 );
30 rtems_event_send( Task_id[TASKID_DUMB], RTEMS_EVENT_2 );
23 }
31 }
24 waveform_picker_regs->status = waveform_picker_regs->status & 0x0007; // reset the f3 full bit to 0
32 waveform_picker_regs->status = waveform_picker_regs->status & 0xfffff777; // reset f3 bits to 0, [1111 0111 0111 0111]
25 }
33 }
26 }
34 }
27 #endif
35 #endif
28
36
29 switch(lfrMode)
37 switch(lfrCurrentMode)
30 {
38 {
31 //********
39 //********
32 // STANDBY
40 // STANDBY
33 case(LFR_MODE_STANDBY):
41 case(LFR_MODE_STANDBY):
34 break;
42 break;
35
43
36 //******
44 //******
37 // NORMAL
45 // NORMAL
38 case(LFR_MODE_NORMAL):
46 case(LFR_MODE_NORMAL):
39 #ifdef GSA
47 #ifdef GSA
40 PRINTF("in waveform_isr *** unexpected waveform picker interruption\n")
48 PRINTF("in waveform_isr *** unexpected waveform picker interruption\n")
41 #else
49 #else
42 if ( (waveform_picker_regs->burst_enable & 0x7) == 0x0 ){ // if no channel is enable
50 if ( (waveform_picker_regs->status & 0x7) == 0x7 ){ // [0111] f2 f1 and f0 are full
51 if (rtems_event_send( Task_id[TASKID_WFRM], RTEMS_EVENT_MODE_NORMAL ) != RTEMS_SUCCESSFUL) {
43 rtems_event_send( Task_id[TASKID_DUMB], RTEMS_EVENT_2 );
52 rtems_event_send( Task_id[TASKID_DUMB], RTEMS_EVENT_2 );
44 }
53 }
45 else {
54 }
46 if ( (waveform_picker_regs->status & 0x7) == 0x7 ){ // f2 f1 and f0 are full
55 waveform_picker_regs->status = waveform_picker_regs->status & 0xf888; // [1111 1000 1000 1000] f2, f1, f0 bits =0
47 waveform_picker_regs->burst_enable = waveform_picker_regs->burst_enable & 0x08;
48 if (rtems_event_send( Task_id[TASKID_WFRM], RTEMS_EVENT_MODE_NORMAL ) != RTEMS_SUCCESSFUL) {
49 rtems_event_send( Task_id[TASKID_DUMB], RTEMS_EVENT_2 );
50 }
51 }
52 }
53 #endif
56 #endif
54 break;
57 break;
55
58
56 //******
59 //******
57 // BURST
60 // BURST
58 case(LFR_MODE_BURST):
61 case(LFR_MODE_BURST):
59 #ifdef GSA
62 #ifdef GSA
60 PRINTF("in waveform_isr *** unexpected waveform picker interruption\n")
63 PRINTF("in waveform_isr *** unexpected waveform picker interruption\n")
61 #else
64 #else
62 if (waveform_picker_regs->burst_enable == 0x44) {
65 if ((waveform_picker_regs->status & 0x04) == 0x04){ // [0100] check the f2 full bit
63 if (waveform_picker_regs->addr_data_f2 == (int) wf_snap_f2) {
66 // (1) change the receiving buffer for the waveform picker
64 waveform_picker_regs->addr_data_f2 = (int) (wf_snap_f2_bis);
67 if (waveform_picker_regs->addr_data_f2 == (int) wf_snap_f2) {
65 }
68 waveform_picker_regs->addr_data_f2 = (int) (wf_snap_f2_bis);
66 else {
69 }
67 waveform_picker_regs->addr_data_f2 = (int) (wf_snap_f2);
70 else {
68 }
71 waveform_picker_regs->addr_data_f2 = (int) (wf_snap_f2);
69 if (rtems_event_send( Task_id[TASKID_WFRM], RTEMS_EVENT_MODE_BURST ) != RTEMS_SUCCESSFUL) {
70 PRINTF("in waveforms_isr *** Error sending event to WFRM\n")
71 rtems_event_send( Task_id[TASKID_DUMB], RTEMS_EVENT_2 );
72 }
73 }
72 }
74 waveform_picker_regs->status = 0x00;
73 // (2) send an event for the waveforms transmission
74 if (rtems_event_send( Task_id[TASKID_CWF2], RTEMS_EVENT_MODE_BURST ) != RTEMS_SUCCESSFUL) {
75 rtems_event_send( Task_id[TASKID_DUMB], RTEMS_EVENT_2 );
76 }
77 waveform_picker_regs->status = waveform_picker_regs->status & 0xfffffbbb; // [1111 1011 1011 1011] f2 bits = 0
78 }
75 #endif
79 #endif
76 break;
80 break;
77
81
78 //*****
82 //*****
79 // SBM1
83 // SBM1
80 case(LFR_MODE_SBM1):
84 case(LFR_MODE_SBM1):
81 #ifdef GSA
85 #ifdef GSA
82 PRINTF("in waveform_isr *** unexpected waveform picker interruption\n")
86 PRINTF("in waveform_isr *** unexpected waveform picker interruption\n")
83 #else
87 #else
84 if ((waveform_picker_regs->status & 0x02) == 0x02){ // [0010] check the f1 full bit
88 if ((waveform_picker_regs->status & 0x02) == 0x02){ // [0010] check the f1 full bit
85 // (1) change the receiving buffer for the waveform picker
89 // (1) change the receiving buffer for the waveform picker
86 if (waveform_picker_regs->addr_data_f1 == (int) wf_snap_f1) {
90 if ( param_local.local_sbm1_nb_cwf_sent == (param_local.local_sbm1_nb_cwf_max-1) )
87 waveform_picker_regs->addr_data_f1 = (int) (wf_snap_f1_bis);
91 {
88 }
92 waveform_picker_regs->addr_data_f1 = (int) (wf_snap_f1_norm);
89 else {
93 }
90 waveform_picker_regs->addr_data_f1 = (int) (wf_snap_f1);
94 else if ( waveform_picker_regs->addr_data_f1 == (int) wf_snap_f1_norm )
91 }
95 {
92 // (2) send an event for the waveforms transmission
96 doubleSendCWF1 = 1;
93 if (rtems_event_send( Task_id[TASKID_WFRM], RTEMS_EVENT_MODE_SBM1 ) != RTEMS_SUCCESSFUL) {
97 waveform_picker_regs->addr_data_f1 = (int) (wf_snap_f1);
94 PRINTF("in waveforms_isr *** Error sending event to WFRM\n")
98 }
95 rtems_event_send( Task_id[TASKID_DUMB], RTEMS_EVENT_2 );
99 else if ( waveform_picker_regs->addr_data_f1 == (int) wf_snap_f1 ) {
96 }
100 waveform_picker_regs->addr_data_f1 = (int) (wf_snap_f1_bis);
97 waveform_picker_regs->status = waveform_picker_regs->status & 0x000d; // reset the f1 full bit to 0
98 }
101 }
99 if ( ( (waveform_picker_regs->status & 0x05) == 0x05 ) ) { // [0101] check the f2 and f0 full bit
102 else {
100 if (rtems_event_send( Task_id[TASKID_WFRM], RTEMS_EVENT_MODE_NORMAL ) != RTEMS_SUCCESSFUL) {
103 waveform_picker_regs->addr_data_f1 = (int) (wf_snap_f1);
101 PRINTF("in waveforms_isr *** Error sending event to WFRM\n")
104 }
102 rtems_event_send( Task_id[TASKID_DUMB], RTEMS_EVENT_2 );
105 // (2) send an event for the waveforms transmission
103 }
106 if (rtems_event_send( Task_id[TASKID_CWF1], RTEMS_EVENT_MODE_SBM1 ) != RTEMS_SUCCESSFUL) {
104 waveform_picker_regs->burst_enable = waveform_picker_regs->burst_enable | 0x05; // [0101] // enable f2 and f0
107 rtems_event_send( Task_id[TASKID_DUMB], RTEMS_EVENT_2 );
105 waveform_picker_regs->status = waveform_picker_regs->status & 0xfffffaaa; // set to 0 the bits related to f2 and f0
106 }
108 }
109 waveform_picker_regs->status = waveform_picker_regs->status & 0xfffffddd; // [1111 1101 1101 1101] f1 bit = 0
110 }
111 if ( ( (waveform_picker_regs->status & 0x05) == 0x05 ) ) { // [0101] check the f2 and f0 full bit
112 if (rtems_event_send( Task_id[TASKID_WFRM], RTEMS_EVENT_MODE_NORMAL ) != RTEMS_SUCCESSFUL) {
113 rtems_event_send( Task_id[TASKID_DUMB], RTEMS_EVENT_2 );
114 }
115 waveform_picker_regs->status = waveform_picker_regs->status & 0xfffffaaa; // [1111 1010 1010 1010] f2 and f0 bits = 0
116 reset_local_sbm1_nb_cwf_sent();
117 }
107
118
108 #endif
119 #endif
109 break;
120 break;
110
121
111 //*****
122 //*****
112 // SBM2
123 // SBM2
113 case(LFR_MODE_SBM2):
124 case(LFR_MODE_SBM2):
114 #ifdef GSA
125 #ifdef GSA
115 PRINTF("in waveform_isr *** unexpected waveform picker interruption\n")
126 PRINTF("in waveform_isr *** unexpected waveform picker interruption\n")
116 #else
127 #else
117 if ((waveform_picker_regs->status & 0x04) == 0x04){ // check the f2 full bit
128 if ((waveform_picker_regs->status & 0x04) == 0x04){ // [0100] check the f2 full bit
118 // (1) change the receiving buffer for the waveform picker
129 // (1) change the receiving buffer for the waveform picker
119 if (waveform_picker_regs->addr_data_f2 == (int) wf_snap_f2) {
130 if ( waveform_picker_regs->addr_data_f2 == (int) wf_snap_f2 ) {
120 waveform_picker_regs->addr_data_f2 = (int) (wf_snap_f2_bis);
131 waveform_picker_regs->addr_data_f2 = (int) (wf_snap_f2_bis);
121 }
132 }
122 else {
133 else {
123 waveform_picker_regs->addr_data_f2 = (int) (wf_snap_f2);
134 waveform_picker_regs->addr_data_f2 = (int) (wf_snap_f2);
124 }
135 }
125 // (2) send an event for the waveforms transmission
136 // (2) send an event for the waveforms transmission
126 if (rtems_event_send( Task_id[TASKID_WFRM], RTEMS_EVENT_MODE_SBM2 ) != RTEMS_SUCCESSFUL) {
137 if (rtems_event_send( Task_id[TASKID_CWF2], RTEMS_EVENT_MODE_SBM2 ) != RTEMS_SUCCESSFUL) {
127 PRINTF("in waveforms_isr *** Error sending event to WFRM\n")
138 rtems_event_send( Task_id[TASKID_DUMB], RTEMS_EVENT_2 );
128 rtems_event_send( Task_id[TASKID_DUMB], RTEMS_EVENT_2 );
129 }
130 waveform_picker_regs->status = waveform_picker_regs->status & 0xfffffbbb; // [1011]
131 }
139 }
132 if ( ( (waveform_picker_regs->status & 0x03) == 0x03 ) ) { // [0011] f3 f2 f1 f0, check the f2 and f0 full bit
140 waveform_picker_regs->status = waveform_picker_regs->status & 0xfffffbbb; // [1111 1011 1011 1011] f2 bit = 0
133 if (rtems_event_send( Task_id[TASKID_WFRM], RTEMS_EVENT_MODE_NORMAL ) != RTEMS_SUCCESSFUL) {
141 }
134 PRINTF("in waveforms_isr *** Error sending event to WFRM\n")
142 if ( ( (waveform_picker_regs->status & 0x03) == 0x03 ) ) { // [0011] f3 f2 f1 f0, f1 and f0 are full
135 rtems_event_send( Task_id[TASKID_DUMB], RTEMS_EVENT_2 );
143 if (rtems_event_send( Task_id[TASKID_WFRM], RTEMS_EVENT_MODE_SBM2 ) != RTEMS_SUCCESSFUL) {
136 }
144 rtems_event_send( Task_id[TASKID_DUMB], RTEMS_EVENT_2 );
137 waveform_picker_regs->burst_enable = waveform_picker_regs->burst_enable | 0x03; // [0011] // enable f2 and f0
138 waveform_picker_regs->status = waveform_picker_regs->status & 0xfffffccc; // set to 0 the bits related to f1 and f0
139 }
145 }
146 waveform_picker_regs->status = waveform_picker_regs->status & 0xfffffccc; // [1111 1100 1100 1100] f1, f0 bits = 0
147 doubleSendCWF2 = 1;
148 reset_local_sbm2_nb_cwf_sent();
149 }
140 #endif
150 #endif
141 break;
151 break;
142
152
143 //********
153 //********
144 // DEFAULT
154 // DEFAULT
145 default:
155 default:
146 break;
156 break;
147 }
157 }
148 }
158 }
149
159
@@ -171,25 +181,11 rtems_isr waveforms_simulator_isr( rtems
171
181
172 rtems_task wfrm_task(rtems_task_argument argument) //used with the waveform picker VHDL IP
182 rtems_task wfrm_task(rtems_task_argument argument) //used with the waveform picker VHDL IP
173 {
183 {
174 unsigned int i;
175 unsigned int intEventOut;
176 spw_ioctl_pkt_send spw_ioctl_send_SWF;
177 spw_ioctl_pkt_send spw_ioctl_send_CWF;
178 rtems_event_set event_out;
184 rtems_event_set event_out;
179 Header_TM_LFR_SCIENCE_SWF_t headerSWF;
180 Header_TM_LFR_SCIENCE_CWF_t headerCWF;
181
185
182 init_header_snapshot_wf( &headerSWF );
186 init_header_snapshot_wf_table( SID_NORM_SWF_F0 );
183 init_header_continuous_wf( &headerCWF );
187 init_header_snapshot_wf_table( SID_NORM_SWF_F1 );
184
188 init_header_snapshot_wf_table( SID_NORM_SWF_F2 );
185 // BUILD THE PACKET HEADERS
186 spw_ioctl_send_SWF.hlen = TM_HEADER_LEN + 4 + 12; // + 4 is for the protocole extra header, + 12 is for the auxiliary header
187 spw_ioctl_send_SWF.hdr = (char*) &headerSWF;
188 spw_ioctl_send_SWF.options = 0;
189
190 spw_ioctl_send_CWF.hlen = TM_HEADER_LEN + 4 + 10; // + 4 is for the protocole extra header, + 10 is for the auxiliary header
191 spw_ioctl_send_CWF.hdr = (char*) &headerCWF;
192 spw_ioctl_send_CWF.options = 0;
193
189
194 init_waveforms();
190 init_waveforms();
195
191
@@ -197,91 +193,154 rtems_task wfrm_task(rtems_task_argument
197
193
198 while(1){
194 while(1){
199 // wait for an RTEMS_EVENT
195 // wait for an RTEMS_EVENT
200 rtems_event_receive(RTEMS_EVENT_0 | RTEMS_EVENT_1 | RTEMS_EVENT_2 | RTEMS_EVENT_3 | RTEMS_EVENT_4,
196 rtems_event_receive(RTEMS_EVENT_MODE_NORMAL | RTEMS_EVENT_MODE_SBM1 | RTEMS_EVENT_MODE_SBM2,
201 RTEMS_WAIT | RTEMS_EVENT_ANY, RTEMS_NO_TIMEOUT, &event_out);
197 RTEMS_WAIT | RTEMS_EVENT_ANY, RTEMS_NO_TIMEOUT, &event_out);
202 intEventOut = (unsigned int) event_out;
203 for (i = 0; i< 5; i++) {
204 if ( ( (intEventOut >> i) & 0x0001) != 0 ) {
205
198
206 switch(i) {
199 switch( event_out) {
207
200
208 case(LFR_MODE_NORMAL):
201 case RTEMS_EVENT_MODE_NORMAL:
209 send_waveform_norm( &headerSWF, &spw_ioctl_send_SWF );
202 send_waveform_SWF(wf_snap_f0, SID_NORM_SWF_F0);
210 break;
203 send_waveform_SWF(wf_snap_f1, SID_NORM_SWF_F1);
204 send_waveform_SWF(wf_snap_f2, SID_NORM_SWF_F2);
205 #ifdef GSA
206 waveform_picker_regs->status = waveform_picker_regs->status & 0xf888; // [1111 1000 1000 1000] f2, f1, f0 bits =0
207 #endif
208 break;
211
209
212 case(LFR_MODE_BURST):
210 case RTEMS_EVENT_MODE_SBM1:
213 send_waveform_burst( &headerCWF, &spw_ioctl_send_CWF );
211 send_waveform_SWF(wf_snap_f0, SID_NORM_SWF_F0);
214 break;
212 send_waveform_SWF(wf_snap_f1_norm, SID_NORM_SWF_F1);
215
213 send_waveform_SWF(wf_snap_f2, SID_NORM_SWF_F2);
216 case(LFR_MODE_SBM1):
217 send_waveform_sbm1( &headerCWF, &spw_ioctl_send_CWF );
218 #ifdef GSA
214 #ifdef GSA
219 #else
215 waveform_picker_regs->status = waveform_picker_regs->status & 0xfffffaaa; // [1111 1010 1010 1010] f2, f0 bits = 0
220 if ( param_local.local_sbm1_nb_cwf_sent == (param_local.local_sbm1_nb_cwf_max-1) ) {
221 // send the f1 buffer as a NORM snapshot
222 if (waveform_picker_regs->addr_data_f1 == (int) wf_snap_f1) {
223 send_waveform_SWF( &headerSWF, wf_snap_f1_bis, SID_NORM_SWF_F1, &spw_ioctl_send_SWF );
224 }
225 else {
226 send_waveform_SWF( &headerSWF, wf_snap_f1, SID_NORM_SWF_F1, &spw_ioctl_send_SWF );
227 }
228 reset_local_sbm1_nb_cwf_sent();
229 }
230 else {
231 param_local.local_sbm1_nb_cwf_sent ++;
232 }
233 #endif
216 #endif
234 break;
217 break;
235
218
236 case(LFR_MODE_SBM2):
219 case RTEMS_EVENT_MODE_SBM2:
237 send_waveform_sbm2( &headerCWF, &spw_ioctl_send_CWF );
220 send_waveform_SWF(wf_snap_f0, SID_NORM_SWF_F0);
221 send_waveform_SWF(wf_snap_f1, SID_NORM_SWF_F1);
238 #ifdef GSA
222 #ifdef GSA
239 #else
223 waveform_picker_regs->status = waveform_picker_regs->status & 0xfffffccc; // [1111 1100 1100 1100] f1, f0 bits = 0
240 if ( param_local.local_sbm2_nb_cwf_sent == (param_local.local_sbm2_nb_cwf_max-1) ) {
241 // send the f2 buffer as a NORM snapshot
242 if (waveform_picker_regs->addr_data_f2 == (int) wf_snap_f2) {
243 send_waveform_SWF( &headerSWF, wf_snap_f2_bis, SID_NORM_SWF_F2, &spw_ioctl_send_SWF );
244 }
245 else {
246 send_waveform_SWF( &headerSWF, wf_snap_f2, SID_NORM_SWF_F2, &spw_ioctl_send_SWF );
247 }
248 reset_local_sbm2_nb_cwf_sent();
249 }
250 else {
251 param_local.local_sbm2_nb_cwf_sent ++;
252 }
253 #endif
224 #endif
254 break;
225 break;
226
227 default:
228 break;
229 }
255
230
256 default:
231 #ifdef GSA
257 break;
232 // irq processed, reset the related register of the timer unit
258 }
233 gptimer_regs->timer[TIMER_WF_SIMULATOR].ctrl = gptimer_regs->timer[TIMER_WF_SIMULATOR].ctrl | 0x00000010;
259 }
234 // clear the interruption
260 }
235 LEON_Unmask_interrupt( IRQ_WF );
236 #endif
261 }
237 }
262 }
238 }
263
239
264 rtems_task cwf3_task(rtems_task_argument argument) //used with the waveform picker VHDL IP
240 rtems_task cwf3_task(rtems_task_argument argument) //used with the waveform picker VHDL IP
265 {
241 {
266 spw_ioctl_pkt_send spw_ioctl_send_CWF;
267 rtems_event_set event_out;
242 rtems_event_set event_out;
268 Header_TM_LFR_SCIENCE_CWF_t headerCWF;
269
243
270 init_header_continuous_wf( &headerCWF );
244 init_header_continuous_wf_table( SID_NORM_CWF_F3, headerCWF_F3 );
271
272 // BUILD THE PACKET HEADER
273 spw_ioctl_send_CWF.hlen = TM_HEADER_LEN + 4 + 10; // + 4 is for the protocole extra header, + 10 is for the auxiliary header
274 spw_ioctl_send_CWF.hdr = (char*) &headerCWF;
275 spw_ioctl_send_CWF.options = 0;
276
245
277 PRINTF("in CWF3 ***\n")
246 PRINTF("in CWF3 ***\n")
278
247
279 while(1){
248 while(1){
280 // wait for an RTEMS_EVENT
249 // wait for an RTEMS_EVENT
281 rtems_event_receive( RTEMS_EVENT_5,
250 rtems_event_receive( RTEMS_EVENT_0,
282 RTEMS_WAIT | RTEMS_EVENT_ANY, RTEMS_NO_TIMEOUT, &event_out);
251 RTEMS_WAIT | RTEMS_EVENT_ANY, RTEMS_NO_TIMEOUT, &event_out);
283 PRINTF("send CWF F3 \n")
252 PRINTF("send CWF F3 \n")
284 send_waveform_norm_cwf_f3( &headerCWF, &spw_ioctl_send_CWF );
253 #ifdef GSA
254 #else
255 if (waveform_picker_regs->addr_data_f3 == (int) wf_cont_f3) {
256 send_waveform_CWF( wf_cont_f3_bis, SID_NORM_CWF_F3, headerCWF_F3 );
257 }
258 else {
259 send_waveform_CWF( wf_cont_f3, SID_NORM_CWF_F3, headerCWF_F3 );
260 }
261 #endif
262 }
263 }
264
265 rtems_task cwf2_task(rtems_task_argument argument) // ONLY USED IN BURST AND SBM2
266 {
267 rtems_event_set event_out;
268
269 init_header_continuous_wf_table( SID_BURST_CWF_F2, headerCWF_F2_BURST );
270 init_header_continuous_wf_table( SID_SBM2_CWF_F2, headerCWF_F2_SBM1 );
271
272 PRINTF("in CWF2 ***\n")
273
274 while(1){
275 // wait for an RTEMS_EVENT
276 rtems_event_receive( RTEMS_EVENT_MODE_BURST | RTEMS_EVENT_MODE_SBM2,
277 RTEMS_WAIT | RTEMS_EVENT_ANY, RTEMS_NO_TIMEOUT, &event_out);
278 if (event_out == RTEMS_EVENT_MODE_BURST)
279 {
280 // F2
281 #ifdef GSA
282 #else
283 if (waveform_picker_regs->addr_data_f2 == (int) wf_snap_f2) {
284 send_waveform_CWF( wf_snap_f2_bis, SID_BURST_CWF_F2, headerCWF_F2_BURST );
285 }
286 else {
287 send_waveform_CWF( wf_snap_f2, SID_BURST_CWF_F2, headerCWF_F2_BURST );
288 }
289 #endif
290 }
291 else if (event_out == RTEMS_EVENT_MODE_SBM2)
292 {
293 #ifdef GSA
294 #else
295 if (waveform_picker_regs->addr_data_f2 == (int) wf_snap_f2) {
296 send_waveform_CWF( wf_snap_f2_bis, SID_SBM2_CWF_F2, headerCWF_F2_SBM1 );
297 }
298 else {
299 send_waveform_CWF( wf_snap_f2, SID_SBM2_CWF_F2, headerCWF_F2_SBM1 );
300 }
301 #endif
302 }
303 else
304 {
305 PRINTF1("in CWF2 *** ERR mode = %d\n", lfrCurrentMode)
306 }
307 }
308 }
309
310 rtems_task cwf1_task(rtems_task_argument argument) // ONLY USED IN SBM1
311 {
312 rtems_event_set event_out;
313
314 init_header_continuous_wf_table( SID_SBM1_CWF_F1, headerCWF_F1 );
315
316 PRINTF("in CWF1 ***\n")
317
318 while(1){
319 // wait for an RTEMS_EVENT
320 rtems_event_receive( RTEMS_EVENT_MODE_SBM1,
321 RTEMS_WAIT | RTEMS_EVENT_ANY, RTEMS_NO_TIMEOUT, &event_out);
322 if (event_out == RTEMS_EVENT_MODE_SBM1)
323 {
324 #ifdef GSA
325 #else
326 if (doubleSendCWF1 == 1)
327 {
328 doubleSendCWF1 = 0;
329 send_waveform_CWF( wf_snap_f1_norm, SID_SBM1_CWF_F1, headerCWF_F1 );
330 }
331 else if (waveform_picker_regs->addr_data_f1 == (int) wf_snap_f1) {
332 send_waveform_CWF( wf_snap_f1_bis, SID_SBM1_CWF_F1, headerCWF_F1 );
333 }
334 else {
335 send_waveform_CWF( wf_snap_f1, SID_SBM1_CWF_F1, headerCWF_F1);
336 }
337 param_local.local_sbm1_nb_cwf_sent ++;
338 #endif
339 }
340 else
341 {
342 PRINTF1("in CWF1 *** ERR mode = %d\n", lfrCurrentMode)
343 }
285 }
344 }
286 }
345 }
287
346
@@ -319,66 +378,136 void init_waveforms( void )
319 }
378 }
320 }
379 }
321
380
322 void init_header_snapshot_wf( Header_TM_LFR_SCIENCE_SWF_t *header)
381 int init_header_snapshot_wf_table( unsigned int sid)
323 {
382 {
324 header->targetLogicalAddress = CCSDS_DESTINATION_ID;
383 unsigned char i;
325 header->protocolIdentifier = CCSDS_PROTOCOLE_ID;
384 unsigned char j;
326 header->reserved = 0x00;
385
327 header->userApplication = CCSDS_USER_APP;
386 j = 0;
328 header->packetID[0] = (unsigned char) (TM_PACKET_ID_SCIENCE_NORMAL >> 8);
387
329 header->packetID[1] = (unsigned char) (TM_PACKET_ID_SCIENCE_NORMAL);
388 switch(sid)
330 header->packetSequenceControl[0] = 0xc0;
389 {
331 header->packetSequenceControl[1] = 0x00;
390 case SID_NORM_SWF_F0:
332 header->packetLength[0] = 0x00;
391 j = 0;
333 header->packetLength[1] = 0x00;
392 break;
334 // DATA FIELD HEADER
393 case SID_NORM_SWF_F1:
335 header->spare1_pusVersion_spare2 = 0x10;
394 j = 1;
336 header->serviceType = TM_TYPE_LFR_SCIENCE; // service type
395 break;
337 header->serviceSubType = TM_SUBTYPE_LFR_SCIENCE; // service subtype
396 case SID_NORM_SWF_F2:
338 header->destinationID = TM_DESTINATION_ID_GROUND;
397 j = 2;
339 // AUXILIARY DATA HEADER
398 break;
340 header->sid = 0x00;
399 default:
341 header->hkBIA = 0x1f;
400 return LFR_DEFAULT;
342 header->pktCnt = 0x07; // PKT_CNT
401 }
343 header->pktNr = 0x00; // PKT_NR
402
344 header->time[0] = 0x00;
403 for (i=0; i<7; i++)
345 header->time[0] = 0x00;
404 {
346 header->time[0] = 0x00;
405 headerSWF_F0_F1_F2[j][i].targetLogicalAddress = CCSDS_DESTINATION_ID;
347 header->time[0] = 0x00;
406 headerSWF_F0_F1_F2[j][i].protocolIdentifier = CCSDS_PROTOCOLE_ID;
348 header->time[0] = 0x00;
407 headerSWF_F0_F1_F2[j][i].reserved = DEFAULT_RESERVED;
349 header->time[0] = 0x00;
408 headerSWF_F0_F1_F2[j][i].userApplication = CCSDS_USER_APP;
350 header->blkNr[0] = 0x00; // BLK_NR MSB
409 headerSWF_F0_F1_F2[j][i].packetID[0] = (unsigned char) (TM_PACKET_ID_SCIENCE_NORMAL >> 8);
351 header->blkNr[1] = 0x00; // BLK_NR LSB
410 headerSWF_F0_F1_F2[j][i].packetID[1] = (unsigned char) (TM_PACKET_ID_SCIENCE_NORMAL);
411 if (i == 0)
412 {
413 headerSWF_F0_F1_F2[j][i].packetSequenceControl[0] = TM_PACKET_SEQ_CTRL_FIRST;
414 headerSWF_F0_F1_F2[j][i].packetLength[0] = (unsigned char) (TM_LEN_SCI_SWF_340 >> 8);
415 headerSWF_F0_F1_F2[j][i].packetLength[1] = (unsigned char) (TM_LEN_SCI_SWF_340 );
416 headerSWF_F0_F1_F2[j][i].blkNr[0] = (unsigned char) (BLK_NR_340 >> 8);
417 headerSWF_F0_F1_F2[j][i].blkNr[1] = (unsigned char) (BLK_NR_340 );
418 }
419 else if (i == 6)
420 {
421 headerSWF_F0_F1_F2[j][i].packetSequenceControl[0] = TM_PACKET_SEQ_CTRL_LAST;
422 headerSWF_F0_F1_F2[j][i].packetLength[0] = (unsigned char) (TM_LEN_SCI_SWF_8 >> 8);
423 headerSWF_F0_F1_F2[j][i].packetLength[1] = (unsigned char) (TM_LEN_SCI_SWF_8 );
424 headerSWF_F0_F1_F2[j][i].blkNr[0] = (unsigned char) (BLK_NR_8 >> 8);
425 headerSWF_F0_F1_F2[j][i].blkNr[1] = (unsigned char) (BLK_NR_8 );
426 }
427 else
428 {
429 headerSWF_F0_F1_F2[j][i].packetSequenceControl[0] = TM_PACKET_SEQ_CTRL_CONTINUATION;
430 headerSWF_F0_F1_F2[j][i].packetLength[0] = (unsigned char) (TM_LEN_SCI_SWF_340 >> 8);
431 headerSWF_F0_F1_F2[j][i].packetLength[1] = (unsigned char) (TM_LEN_SCI_SWF_340 );
432 headerSWF_F0_F1_F2[j][i].blkNr[0] = (unsigned char) (BLK_NR_340 >> 8);
433 headerSWF_F0_F1_F2[j][i].blkNr[1] = (unsigned char) (BLK_NR_340 );
434 }
435 headerSWF_F0_F1_F2[j][i].packetSequenceControl[1] = TM_PACKET_SEQ_CNT_DEFAULT;
436 headerSWF_F0_F1_F2[j][i].pktCnt = DEFAULT_PKTCNT; // PKT_CNT
437 headerSWF_F0_F1_F2[j][i].pktNr = i+1; // PKT_NR
438 // DATA FIELD HEADER
439 headerSWF_F0_F1_F2[j][i].spare1_pusVersion_spare2 = DEFAULT_SPARE1_PUSVERSION_SPARE2;
440 headerSWF_F0_F1_F2[j][i].serviceType = TM_TYPE_LFR_SCIENCE; // service type
441 headerSWF_F0_F1_F2[j][i].serviceSubType = TM_SUBTYPE_LFR_SCIENCE; // service subtype
442 headerSWF_F0_F1_F2[j][i].destinationID = TM_DESTINATION_ID_GROUND;
443 // AUXILIARY DATA HEADER
444 headerSWF_F0_F1_F2[j][i].sid = sid;
445 headerSWF_F0_F1_F2[j][i].hkBIA = DEFAULT_HKBIA;
446 headerSWF_F0_F1_F2[j][i].time[0] = 0x00;
447 headerSWF_F0_F1_F2[j][i].time[0] = 0x00;
448 headerSWF_F0_F1_F2[j][i].time[0] = 0x00;
449 headerSWF_F0_F1_F2[j][i].time[0] = 0x00;
450 headerSWF_F0_F1_F2[j][i].time[0] = 0x00;
451 headerSWF_F0_F1_F2[j][i].time[0] = 0x00;
452 }
453 return LFR_SUCCESSFUL;
352 }
454 }
353
455
354 void init_header_continuous_wf( Header_TM_LFR_SCIENCE_CWF_t *header)
456 int init_header_continuous_wf_table( unsigned int sid, Header_TM_LFR_SCIENCE_CWF_t *headerCWF )
355 {
457 {
356 header->targetLogicalAddress = CCSDS_DESTINATION_ID;
458 unsigned int i;
357 header->protocolIdentifier = CCSDS_PROTOCOLE_ID;
459
358 header->reserved = 0x00;
460 for (i=0; i<7; i++)
359 header->userApplication = CCSDS_USER_APP;
461 {
360 header->packetID[0] = 0x00;
462 headerCWF[ i ].targetLogicalAddress = CCSDS_DESTINATION_ID;
361 header->packetID[1] = 0x00;
463 headerCWF[ i ].protocolIdentifier = CCSDS_PROTOCOLE_ID;
362 header->packetSequenceControl[0] = 0xc0;
464 headerCWF[ i ].reserved = DEFAULT_RESERVED;
363 header->packetSequenceControl[1] = 0x00;
465 headerCWF[ i ].userApplication = CCSDS_USER_APP;
364 header->packetLength[0] = 0x00;
466 headerCWF[ i ].packetID[0] = (unsigned char) (TM_PACKET_ID_SCIENCE_BURST_SBM1_SBM2 >> 8);
365 header->packetLength[1] = 0x00;
467 headerCWF[ i ].packetID[1] = (unsigned char) (TM_PACKET_ID_SCIENCE_BURST_SBM1_SBM2);
366 // DATA FIELD HEADER
468 if (i == 0)
367 header->spare1_pusVersion_spare2 = 0x10;
469 {
368 header->serviceType = TM_TYPE_LFR_SCIENCE; // service type
470 headerCWF[ i ].packetSequenceControl[0] = TM_PACKET_SEQ_CTRL_FIRST;
369 header->serviceSubType = TM_SUBTYPE_LFR_SCIENCE; // service subtype
471 headerCWF[ i ].packetLength[0] = (unsigned char) (TM_LEN_SCI_CWF_340 >> 8);
370 header->destinationID = TM_DESTINATION_ID_GROUND;
472 headerCWF[ i ].packetLength[1] = (unsigned char) (TM_LEN_SCI_CWF_340 );
371 // AUXILIARY DATA HEADER
473 headerCWF[ i ].blkNr[0] = (unsigned char) (BLK_NR_340 >> 8);
372 header->sid = 0x00;
474 headerCWF[ i ].blkNr[1] = (unsigned char) (BLK_NR_340 );
373 header->hkBIA = 0x1f;
475 }
374 header->time[0] = 0x00;
476 else if (i == 6)
375 header->time[0] = 0x00;
477 {
376 header->time[0] = 0x00;
478 headerCWF[ i ].packetSequenceControl[0] = TM_PACKET_SEQ_CTRL_LAST;
377 header->time[0] = 0x00;
479 headerCWF[ i ].packetLength[0] = (unsigned char) (TM_LEN_SCI_CWF_8 >> 8);
378 header->time[0] = 0x00;
480 headerCWF[ i ].packetLength[1] = (unsigned char) (TM_LEN_SCI_CWF_8 );
379 header->time[0] = 0x00;
481 headerCWF[ i ].blkNr[0] = (unsigned char) (BLK_NR_8 >> 8);
380 header->blkNr[0] = 0x00; // BLK_NR MSB
482 headerCWF[ i ].blkNr[1] = (unsigned char) (BLK_NR_8 );
381 header->blkNr[1] = 0x00; // BLK_NR LSB
483 }
484 else
485 {
486 headerCWF[ i ].packetSequenceControl[0] = TM_PACKET_SEQ_CTRL_CONTINUATION;
487 headerCWF[ i ].packetLength[0] = (unsigned char) (TM_LEN_SCI_CWF_340 >> 8);
488 headerCWF[ i ].packetLength[1] = (unsigned char) (TM_LEN_SCI_CWF_340 );
489 headerCWF[ i ].blkNr[0] = (unsigned char) (BLK_NR_340 >> 8);
490 headerCWF[ i ].blkNr[1] = (unsigned char) (BLK_NR_340 );
491 }
492 headerCWF[ i ].packetSequenceControl[1] = TM_PACKET_SEQ_CNT_DEFAULT;
493 // PKT_CNT
494 // PKT_NR
495 // DATA FIELD HEADER
496 headerCWF[ i ].spare1_pusVersion_spare2 = DEFAULT_SPARE1_PUSVERSION_SPARE2;
497 headerCWF[ i ].serviceType = TM_TYPE_LFR_SCIENCE; // service type
498 headerCWF[ i ].serviceSubType = TM_SUBTYPE_LFR_SCIENCE; // service subtype
499 headerCWF[ i ].destinationID = TM_DESTINATION_ID_GROUND;
500 // AUXILIARY DATA HEADER
501 headerCWF[ i ].sid = sid;
502 headerCWF[ i ].hkBIA = DEFAULT_HKBIA;
503 headerCWF[ i ].time[0] = 0x00;
504 headerCWF[ i ].time[0] = 0x00;
505 headerCWF[ i ].time[0] = 0x00;
506 headerCWF[ i ].time[0] = 0x00;
507 headerCWF[ i ].time[0] = 0x00;
508 headerCWF[ i ].time[0] = 0x00;
509 }
510 return LFR_SUCCESSFUL;
382 }
511 }
383
512
384 void reset_waveforms( void )
513 void reset_waveforms( void )
@@ -411,276 +540,131 void reset_waveforms( void )
411 }
540 }
412 }
541 }
413
542
414 void send_waveform_SWF( Header_TM_LFR_SCIENCE_SWF_t *header, volatile int *waveform,
543 int send_waveform_SWF( volatile int *waveform, unsigned int sid )
415 unsigned int sid, spw_ioctl_pkt_send *spw_ioctl_send)
416 {
544 {
417 unsigned int i = 0;
545 unsigned int i;
418 unsigned int length = 0;
546 unsigned int j;
547 int ret;
419 rtems_status_code status;
548 rtems_status_code status;
549 spw_ioctl_pkt_send spw_ioctl_send_SWF;
420
550
421 header->sid = (unsigned char) sid;
551 spw_ioctl_send_SWF.hlen = TM_HEADER_LEN + 4 + 12; // + 4 is for the protocole extra header, + 12 is for the auxiliary header
552 spw_ioctl_send_SWF.options = 0;
422
553
423 for (i=0; i<7; i++) // send waveform
554 j = 0;
555 ret = LFR_DEFAULT;
556
557 switch(sid)
424 {
558 {
425 header->pktNr = (unsigned char) i+1; // PKT_NR
559 case SID_NORM_SWF_F0:
426 // BUILD THE DATA
560 j = 0;
427 if (i==6) {
561 break;
428 spw_ioctl_send->dlen = 8 * NB_BYTES_SWF_BLK;
562 case SID_NORM_SWF_F1:
429 length = TM_LEN_SCI_SWF_8;
563 j = 1;
430 header->blkNr[0] = 0x00; // BLK_NR MSB
564 break;
431 header->blkNr[1] = 0x08; // BLK_NR LSB
565 case SID_NORM_SWF_F2:
432 }
566 j = 2;
433 else {
567 break;
434 spw_ioctl_send->dlen = 340 * NB_BYTES_SWF_BLK;
568 default:
435 length = TM_LEN_SCI_SWF_340;
569 ret = LFR_DEFAULT;
436 header->blkNr[0] = 0x01; // BLK_NR MSB
570 break;
437 header->blkNr[1] = 0x54; // BLK_NR LSB
438 }
439 spw_ioctl_send->data = (char*) &waveform[ (i * 340 * NB_WORDS_SWF_BLK) ];
440 // BUILD THE HEADER
441 header->packetLength[0] = (unsigned char) (length>>8);
442 header->packetLength[1] = (unsigned char) (length);
443 header->sid = (unsigned char) sid; // SID
444 // SET PACKET TIME
445 header->time[0] = (unsigned char) (time_management_regs->coarse_time>>24);
446 header->time[1] = (unsigned char) (time_management_regs->coarse_time>>16);
447 header->time[2] = (unsigned char) (time_management_regs->coarse_time>>8);
448 header->time[3] = (unsigned char) (time_management_regs->coarse_time);
449 header->time[4] = (unsigned char) (time_management_regs->fine_time>>8);
450 header->time[5] = (unsigned char) (time_management_regs->fine_time);
451 header->acquisitionTime[0] = (unsigned char) (time_management_regs->coarse_time>>24);
452 header->acquisitionTime[1] = (unsigned char) (time_management_regs->coarse_time>>16);
453 header->acquisitionTime[2] = (unsigned char) (time_management_regs->coarse_time>>8);
454 header->acquisitionTime[3] = (unsigned char) (time_management_regs->coarse_time);
455 header->acquisitionTime[4] = (unsigned char) (time_management_regs->fine_time>>8);
456 header->acquisitionTime[5] = (unsigned char) (time_management_regs->fine_time);
457 // SEND PACKET
458 status = write_spw(spw_ioctl_send);
459 if (status != RTEMS_SUCCESSFUL) {
460 while (true) {
461 if (status != RTEMS_SUCCESSFUL) {
462 status = write_spw(spw_ioctl_send);
463 //PRINTF1("%d", i)
464 sched_yield();
465 }
466 else {
467 //PRINTF("\n")
468 break;
469 }
470 }
471 }
472 }
571 }
473 }
474
475 void send_waveform_CWF( Header_TM_LFR_SCIENCE_CWF_t *header, volatile int *waveform,
476 unsigned int sid, spw_ioctl_pkt_send *spw_ioctl_send)
477 {
478 unsigned int i = 0;
479 unsigned int length = 0;
480 rtems_status_code status;
481
482 header->sid = (unsigned char) sid;
483
572
484 for (i=0; i<7; i++) // send waveform
573 for (i=0; i<7; i++) // send waveform
485 {
574 {
575 spw_ioctl_send_SWF.data = (char*) &waveform[ (i * 340 * NB_WORDS_SWF_BLK) ];
576 spw_ioctl_send_SWF.hdr = (char*) &headerSWF_F0_F1_F2[j][i];
486 // BUILD THE DATA
577 // BUILD THE DATA
487 if (i==6) {
578 if (i==6) {
488 spw_ioctl_send->dlen = 8 * NB_BYTES_SWF_BLK;
579 spw_ioctl_send_SWF.dlen = 8 * NB_BYTES_SWF_BLK;
489 length = TM_LEN_SCI_CWF_8;
490 header->blkNr[0] = 0x00; // BLK_NR MSB
491 header->blkNr[1] = 0x08; // BLK_NR LSB
492 }
580 }
493 else {
581 else {
494 spw_ioctl_send->dlen = 340 * NB_BYTES_SWF_BLK;
582 spw_ioctl_send_SWF.dlen = 340 * NB_BYTES_SWF_BLK;
495 length = TM_LEN_SCI_CWF_340;
496 header->blkNr[0] = 0x01; // BLK_NR MSB
497 header->blkNr[1] = 0x54; // BLK_NR LSB
498 }
499 spw_ioctl_send->data = (char*) &waveform[ (i * 340 * NB_WORDS_SWF_BLK) ];
500 // BUILD THE HEADER
501 header->packetLength[0] = (unsigned char) (length>>8);
502 header->packetLength[1] = (unsigned char) (length);
503 // SET PACKET TIME
504 header->time[0] = (unsigned char) (time_management_regs->coarse_time>>24);
505 header->time[1] = (unsigned char) (time_management_regs->coarse_time>>16);
506 header->time[2] = (unsigned char) (time_management_regs->coarse_time>>8);
507 header->time[3] = (unsigned char) (time_management_regs->coarse_time);
508 header->time[4] = (unsigned char) (time_management_regs->fine_time>>8);
509 header->time[5] = (unsigned char) (time_management_regs->fine_time);
510 header->acquisitionTime[0] = (unsigned char) (time_management_regs->coarse_time>>24);
511 header->acquisitionTime[1] = (unsigned char) (time_management_regs->coarse_time>>16);
512 header->acquisitionTime[2] = (unsigned char) (time_management_regs->coarse_time>>8);
513 header->acquisitionTime[3] = (unsigned char) (time_management_regs->coarse_time);
514 header->acquisitionTime[4] = (unsigned char) (time_management_regs->fine_time>>8);
515 header->acquisitionTime[5] = (unsigned char) (time_management_regs->fine_time);
516 // SEND PACKET
517 status = write_spw(spw_ioctl_send);
518 if (status != RTEMS_SUCCESSFUL) {
519 while (true) {
520 if (status != RTEMS_SUCCESSFUL) {
521 status = write_spw(spw_ioctl_send);
522 //PRINTF1("%d", i)
523 sched_yield();
524 }
525 else {
526 //PRINTF("\n")
527 break;
528 }
529 }
530 }
583 }
531 }
584 // SET PACKET TIME
532 }
585 headerSWF_F0_F1_F2[j][i].time[0] = (unsigned char) (time_management_regs->coarse_time>>24);
533
586 headerSWF_F0_F1_F2[j][i].time[1] = (unsigned char) (time_management_regs->coarse_time>>16);
534 void send_waveform_norm(Header_TM_LFR_SCIENCE_SWF_t *header, spw_ioctl_pkt_send *spw_ioctl_send)
587 headerSWF_F0_F1_F2[j][i].time[2] = (unsigned char) (time_management_regs->coarse_time>>8);
535 {
588 headerSWF_F0_F1_F2[j][i].time[3] = (unsigned char) (time_management_regs->coarse_time);
536 unsigned char lfrMode;
589 headerSWF_F0_F1_F2[j][i].time[4] = (unsigned char) (time_management_regs->fine_time>>8);
537 lfrMode = (housekeeping_packet.lfr_status_word[0] & 0xf0) >> 4;
590 headerSWF_F0_F1_F2[j][i].time[5] = (unsigned char) (time_management_regs->fine_time);
538
591 headerSWF_F0_F1_F2[j][i].acquisitionTime[0] = (unsigned char) (time_management_regs->coarse_time>>24);
539 header->packetID[0] = (unsigned char) (TM_PACKET_ID_SCIENCE_NORMAL >> 8);
592 headerSWF_F0_F1_F2[j][i].acquisitionTime[1] = (unsigned char) (time_management_regs->coarse_time>>16);
540 header->packetID[1] = (unsigned char) (TM_PACKET_ID_SCIENCE_NORMAL);
593 headerSWF_F0_F1_F2[j][i].acquisitionTime[2] = (unsigned char) (time_management_regs->coarse_time>>8);
541 // TIME
594 headerSWF_F0_F1_F2[j][i].acquisitionTime[3] = (unsigned char) (time_management_regs->coarse_time);
542 header->time[0] = (unsigned char) (time_management_regs->coarse_time>>24);
595 headerSWF_F0_F1_F2[j][i].acquisitionTime[4] = (unsigned char) (time_management_regs->fine_time>>8);
543 header->time[1] = (unsigned char) (time_management_regs->coarse_time>>16);
596 headerSWF_F0_F1_F2[j][i].acquisitionTime[5] = (unsigned char) (time_management_regs->fine_time);
544 header->time[2] = (unsigned char) (time_management_regs->coarse_time>>8);
597 // SEND PACKET
545 header->time[3] = (unsigned char) (time_management_regs->coarse_time);
598 //status = write_spw(&spw_ioctl_send_SWF);
546 header->time[4] = (unsigned char) (time_management_regs->fine_time>>8);
599 status = rtems_message_queue_send( misc_id[1], &spw_ioctl_send_SWF, sizeof(spw_ioctl_send_SWF));
547 header->time[5] = (unsigned char) (time_management_regs->fine_time);
600 if (status != RTEMS_SUCCESSFUL) {
548
601 PRINTF2("sid %d, i = %d\n", sid, i)
549 switch(lfrMode) {
602 ret = LFR_DEFAULT;
550
603 }
551 case LFR_MODE_NORMAL:
604 rtems_task_wake_after(TIME_BETWEEN_TWO_SWF_PACKETS); // 300 ms between each packet => 7 * 3 = 21 packets => 6.3 seconds
552 send_waveform_SWF( header, wf_snap_f0, SID_NORM_SWF_F0, spw_ioctl_send);
553 send_waveform_SWF( header, wf_snap_f1, SID_NORM_SWF_F1, spw_ioctl_send);
554 send_waveform_SWF( header, wf_snap_f2, SID_NORM_SWF_F2, spw_ioctl_send);
555 #ifdef GSA
556 #else
557 waveform_picker_regs->status = waveform_picker_regs->status & 0x00;
558 waveform_picker_regs->burst_enable = waveform_picker_regs->burst_enable | 0x07; // [0111] enable f2 f1 f0
559 #endif
560 break;
561
562 case LFR_MODE_SBM1:
563 send_waveform_SWF( header, wf_snap_f0, SID_NORM_SWF_F0, spw_ioctl_send);
564 // F1 data are sent by the send_waveform_sbm1 function
565 send_waveform_SWF( header, wf_snap_f2, SID_NORM_SWF_F2, spw_ioctl_send);
566 break;
567
568 case LFR_MODE_SBM2:
569 send_waveform_SWF( header, wf_snap_f0, SID_NORM_SWF_F0, spw_ioctl_send);
570 send_waveform_SWF( header, wf_snap_f1, SID_NORM_SWF_F1, spw_ioctl_send);
571 // F2 data are sent by the send_waveform_sbm2 function
572 break;
573
574 default:
575 break;
576 }
605 }
577
606
578 #ifdef GSA
607 return ret;
579 // irq processed, reset the related register of the timer unit
580 gptimer_regs->timer[TIMER_WF_SIMULATOR].ctrl = gptimer_regs->timer[TIMER_WF_SIMULATOR].ctrl | 0x00000010;
581 // clear the interruption
582 LEON_Unmask_interrupt( IRQ_WF );
583 #endif
584
585 }
586
587 void send_waveform_norm_cwf_f3(Header_TM_LFR_SCIENCE_CWF_t *header, spw_ioctl_pkt_send *spw_ioctl_send)
588 {
589 header->packetID[0] = (unsigned char) (TM_PACKET_ID_SCIENCE_NORMAL >> 8);
590 header->packetID[1] = (unsigned char) (TM_PACKET_ID_SCIENCE_NORMAL);
591 // TIME
592 header->time[0] = (unsigned char) (time_management_regs->coarse_time>>24);
593 header->time[1] = (unsigned char) (time_management_regs->coarse_time>>16);
594 header->time[2] = (unsigned char) (time_management_regs->coarse_time>>8);
595 header->time[3] = (unsigned char) (time_management_regs->coarse_time);
596 header->time[4] = (unsigned char) (time_management_regs->fine_time>>8);
597 header->time[5] = (unsigned char) (time_management_regs->fine_time);
598
599 //*******************************
600 // send continuous waveform at f3
601 // F3
602 #ifdef GSA
603 #else
604 if (waveform_picker_regs->addr_data_f3 == (int) wf_cont_f3) {
605 send_waveform_CWF( header, wf_cont_f3_bis, SID_NORM_CWF_F3, spw_ioctl_send);
606 }
607 else {
608 send_waveform_CWF( header, wf_cont_f3, SID_NORM_CWF_F3, spw_ioctl_send);
609 }
610 #endif
611 }
608 }
612
609
613 void send_waveform_burst(Header_TM_LFR_SCIENCE_CWF_t *header, spw_ioctl_pkt_send *spw_ioctl_send)
610 int send_waveform_CWF( volatile int *waveform, unsigned int sid, Header_TM_LFR_SCIENCE_CWF_t *headerCWF)
614 {
615 header->packetID[0] = (unsigned char) (TM_PACKET_ID_SCIENCE_BURST_SBM1_SBM2 >> 8);
616 header->packetID[1] = (unsigned char) (TM_PACKET_ID_SCIENCE_BURST_SBM1_SBM2);
617 // TIME
618 header->time[0] = (unsigned char) (time_management_regs->coarse_time>>24);
619 header->time[1] = (unsigned char) (time_management_regs->coarse_time>>16);
620 header->time[2] = (unsigned char) (time_management_regs->coarse_time>>8);
621 header->time[3] = (unsigned char) (time_management_regs->coarse_time);
622 header->time[4] = (unsigned char) (time_management_regs->fine_time>>8);
623 header->time[5] = (unsigned char) (time_management_regs->fine_time);
624 // ACQUISITION TIME
625
626 // F2
627 #ifdef GSA
628 #else
629 if (waveform_picker_regs->addr_data_f2 == (int) wf_snap_f2) {
630 send_waveform_CWF( header, wf_snap_f2_bis, SID_BURST_CWF_F2, spw_ioctl_send);
631 }
632 else {
633 send_waveform_CWF( header, wf_snap_f2, SID_BURST_CWF_F2, spw_ioctl_send);
634 }
635 #endif
636 }
637
638 void send_waveform_sbm1(Header_TM_LFR_SCIENCE_CWF_t *header, spw_ioctl_pkt_send *spw_ioctl_send)
639 {
611 {
640 header->packetID[0] = (unsigned char) (TM_PACKET_ID_SCIENCE_BURST_SBM1_SBM2 >> 8);
612 unsigned int i;
641 header->packetID[1] = (unsigned char) (TM_PACKET_ID_SCIENCE_BURST_SBM1_SBM2);
613 int ret;
642 // TIME
614 rtems_status_code status;
643 header->time[0] = (unsigned char) (time_management_regs->coarse_time>>24);
615 spw_ioctl_pkt_send spw_ioctl_send_CWF;
644 header->time[1] = (unsigned char) (time_management_regs->coarse_time>>16);
645 header->time[2] = (unsigned char) (time_management_regs->coarse_time>>8);
646 header->time[3] = (unsigned char) (time_management_regs->coarse_time);
647 header->time[4] = (unsigned char) (time_management_regs->fine_time>>8);
648 header->time[5] = (unsigned char) (time_management_regs->fine_time);
649
616
650 // F1
617 spw_ioctl_send_CWF.hlen = TM_HEADER_LEN + 4 + 10; // + 4 is for the protocole extra header, + 10 is for the auxiliary header
651 #ifdef GSA
618 spw_ioctl_send_CWF.options = 0;
652 #else
619
653 if (waveform_picker_regs->addr_data_f1 == (int) wf_snap_f1) {
620 ret = LFR_DEFAULT;
654 send_waveform_CWF( header, wf_snap_f1_bis, SID_SBM1_CWF_F1, spw_ioctl_send );
655 }
656 else {
657 send_waveform_CWF( header, wf_snap_f1, SID_SBM1_CWF_F1, spw_ioctl_send );
658 }
659 #endif
660 }
661
621
662 void send_waveform_sbm2(Header_TM_LFR_SCIENCE_CWF_t *header, spw_ioctl_pkt_send *spw_ioctl_send)
622 for (i=0; i<7; i++) // send waveform
663 {
623 {
664 header->packetID[0] = (unsigned char) (TM_PACKET_ID_SCIENCE_BURST_SBM1_SBM2 >> 8);
624 int coarseTime = 0x00;
665 header->packetID[1] = (unsigned char) (TM_PACKET_ID_SCIENCE_BURST_SBM1_SBM2);
625 int fineTime = 0x00;
666 // TIME
626 spw_ioctl_send_CWF.data = (char*) &waveform[ (i * 340 * NB_WORDS_SWF_BLK) ];
667 header->time[0] = (unsigned char) (time_management_regs->coarse_time>>24);
627 spw_ioctl_send_CWF.hdr = (char*) &headerCWF[ i ];
668 header->time[1] = (unsigned char) (time_management_regs->coarse_time>>16);
628 // BUILD THE DATA
669 header->time[2] = (unsigned char) (time_management_regs->coarse_time>>8);
629 if (i==6) {
670 header->time[3] = (unsigned char) (time_management_regs->coarse_time);
630 spw_ioctl_send_CWF.dlen = 8 * NB_BYTES_SWF_BLK;
671 header->time[4] = (unsigned char) (time_management_regs->fine_time>>8);
631 }
672 header->time[5] = (unsigned char) (time_management_regs->fine_time);
632 else {
633 spw_ioctl_send_CWF.dlen = 340 * NB_BYTES_SWF_BLK;
634 }
635 // SET PACKET TIME
636 coarseTime = time_management_regs->coarse_time;
637 fineTime = time_management_regs->fine_time;
638 headerCWF[ i ].time[0] = (unsigned char) (coarseTime>>24);
639 headerCWF[ i ].time[1] = (unsigned char) (coarseTime>>16);
640 headerCWF[ i ].time[2] = (unsigned char) (coarseTime>>8);
641 headerCWF[ i ].time[3] = (unsigned char) (coarseTime);
642 headerCWF[ i ].time[4] = (unsigned char) (fineTime>>8);
643 headerCWF[ i ].time[5] = (unsigned char) (fineTime);
644 headerCWF[ i ].acquisitionTime[0] = (unsigned char) (coarseTime>>24);
645 headerCWF[ i ].acquisitionTime[1] = (unsigned char) (coarseTime>>16);
646 headerCWF[ i ].acquisitionTime[2] = (unsigned char) (coarseTime>>8);
647 headerCWF[ i ].acquisitionTime[3] = (unsigned char) (coarseTime);
648 headerCWF[ i ].acquisitionTime[4] = (unsigned char) (fineTime>>8);
649 headerCWF[ i ].acquisitionTime[5] = (unsigned char) (fineTime);
650 // SEND PACKET
651 //status = write_spw(&spw_ioctl_send_CWF);
652 status = rtems_message_queue_urgent( misc_id[1], &spw_ioctl_send_CWF, sizeof(spw_ioctl_send_CWF));
653 if (status != RTEMS_SUCCESSFUL) {
654 PRINTF2("sid %d, i = %d\n", sid, i)
655 ret = LFR_DEFAULT;
656 }
657 else
658 {
659 sched_yield();
660 }
661 if (sid == SID_NORM_CWF_F3)
662 {
663 rtems_task_wake_after(TIME_BETWEEN_TWO_CWF3_PACKETS);
664 }
665 }
673
666
674 // F2
667 return ret;
675 #ifdef GSA
676 #else
677 if (waveform_picker_regs->addr_data_f2 == (int) wf_snap_f2) {
678 send_waveform_CWF( header, wf_snap_f2_bis, SID_SBM2_CWF_F2, spw_ioctl_send);
679 }
680 else {
681 send_waveform_CWF( header, wf_snap_f2, SID_SBM2_CWF_F2, spw_ioctl_send);
682 }
683 #endif
684 }
668 }
685
669
686 //**************
670 //**************
@@ -770,6 +754,14 void reset_wfp_burst_enable()
770 #endif
754 #endif
771 }
755 }
772
756
757 void reset_wfp_status()
758 {
759 #ifdef GSA
760 #else
761 waveform_picker_regs->status = 0x00; // burst f2, f1, f0 enable f3, f2, f1, f0
762 #endif
763 }
764
773 void reset_waveform_picker_regs()
765 void reset_waveform_picker_regs()
774 {
766 {
775 #ifdef GSA
767 #ifdef GSA
@@ -781,8 +773,8 void reset_waveform_picker_regs()
781 waveform_picker_regs->addr_data_f2 = (int) (wf_snap_f2); //
773 waveform_picker_regs->addr_data_f2 = (int) (wf_snap_f2); //
782 waveform_picker_regs->addr_data_f3 = (int) (wf_cont_f3); //
774 waveform_picker_regs->addr_data_f3 = (int) (wf_cont_f3); //
783 set_wfp_delta_snapshot(); // time in seconds between two snapshots
775 set_wfp_delta_snapshot(); // time in seconds between two snapshots
784 waveform_picker_regs->delta_f2_f1 = 0xffff; // max 4 bytes
776 waveform_picker_regs->delta_f2_f1 = 0xffff; // 0x16800 => 92160 (max 4 bytes)
785 waveform_picker_regs->delta_f2_f0 = 0x17c00; // max 5 bytes
777 waveform_picker_regs->delta_f2_f0 = 0x17c00; // 97 280 (max 5 bytes)
786 waveform_picker_regs->nb_burst_available = 0x180; // max 3 bytes, size of the buffer in burst (1 burst = 16 x 4 octets)
778 waveform_picker_regs->nb_burst_available = 0x180; // max 3 bytes, size of the buffer in burst (1 burst = 16 x 4 octets)
787 waveform_picker_regs->nb_snapshot_param = 0x7ff; // max 3 octets, 2048 - 1
779 waveform_picker_regs->nb_snapshot_param = 0x7ff; // max 3 octets, 2048 - 1
788 waveform_picker_regs->status = 0x00; //
780 waveform_picker_regs->status = 0x00; //
@@ -793,11 +785,11 void reset_waveform_picker_regs()
793 // local parameters
785 // local parameters
794 void set_local_sbm1_nb_cwf_max()
786 void set_local_sbm1_nb_cwf_max()
795 {
787 {
796 // (2 snapshots of 2048 points per seconds) * (period of the NORM snashots)
788 // (2 snapshots of 2048 points per seconds) * (period of the NORM snashots) - 8 s (duration of the f2 snapshot)
797 param_local.local_sbm1_nb_cwf_max = 2 * (
789 param_local.local_sbm1_nb_cwf_max = 2 * (
798 parameter_dump_packet.sy_lfr_n_swf_p[0] * 256
790 parameter_dump_packet.sy_lfr_n_swf_p[0] * 256
799 + parameter_dump_packet.sy_lfr_n_swf_p[1]
791 + parameter_dump_packet.sy_lfr_n_swf_p[1]
800 );
792 ) - 8; // 16 CWF1 parts during 1 SWF2
801 }
793 }
802
794
803 void set_local_sbm2_nb_cwf_max()
795 void set_local_sbm2_nb_cwf_max()
General Comments 0
You need to be logged in to leave comments. Login now