##// END OF EJS Templates
sy_lfr_n_swf_p implemented...
paul -
r32:796c5aa15417 default
parent child
Show More
@@ -0,0 +1,119
1 #ifndef TC_TYPES_H
2 #define TC_TYPES_H
3
4 #include <ccsds_types.h>
5
6 // PACKET ID
7 #define TC_LFR_PACKET_ID 0x1ccc // PID 76 CAT 12
8
9 #define PACKET_LENGTH_TC_LFR_LOAD_COMMON_PAR (14 - CCSDS_TC_TM_PACKET_OFFSET)
10 #define PACKET_LENGTH_TC_LFR_LOAD_NORMAL_PAR (20 - CCSDS_TC_TM_PACKET_OFFSET)
11 #define PACKET_LENGTH_TC_LFR_LOAD_BURST_PAR (14 - CCSDS_TC_TM_PACKET_OFFSET)
12 #define PACKET_LENGTH_TC_LFR_LOAD_SBM1_PAR (14 - CCSDS_TC_TM_PACKET_OFFSET)
13 #define PACKET_LENGTH_TC_LFR_LOAD_SBM2_PAR (14 - CCSDS_TC_TM_PACKET_OFFSET)
14 #define PACKET_LENGTH_TC_LFR_DUMP_PAR (12 - CCSDS_TC_TM_PACKET_OFFSET)
15 #define PACKET_LENGTH_TC_LFR_ENTER_MODE (20 - CCSDS_TC_TM_PACKET_OFFSET)
16
17 // TC TYPES
18 #define TC_TYPE_DEFAULT 181
19 #define TC_TYPE_LFR_UPDATE_TIME 9
20
21 // TC SUBTYPES
22 #define TC_SUBTYPE_LOAD_COMMON_PAR 11
23 #define TC_SUBTYPE_LOAD_NORMAL_PAR 13
24 #define TC_SUBTYPE_LOAD_BURST_PAR 19
25 #define TC_SUBTYPE_LOAD_SBM1_PAR 25
26 #define TC_SUBTYPE_LOAD_SBM2_PAR 27
27 #define TC_SUBTYPE_DUMP_PAR 31
28 #define TC_SUBTYPE_ENTER_MODE 41
29
30 // OTHER CONSTANTS
31 #define TC_LFR_PACKET_SEQUENCE_CONTROL 0xc000 // PID 76 CAT 12
32 #define TC_LFR_DATA_FIELD_HEADER0 0x19
33 #define TC_LFR_LOAD_COMMON_PAR_SPARE 0x00
34
35 struct Packet_TC_LFR_ENTER_MODE_str
36 { // the CCSDS header is added by LPPMON
37 unsigned char packetID[2];
38 unsigned char packetSequenceControl[2];
39 unsigned char packetLength[2];
40 // DATA FIELD HEADER
41 unsigned char ccsdsSecHeaderFlag_pusVersion_ack;
42 unsigned char serviceType;
43 unsigned char serviceSubType;
44 unsigned char sourceID;
45 unsigned char spare;
46 unsigned char mode;
47 unsigned char enterModeTime[6];
48 unsigned char crc[2];
49 };
50 typedef struct Packet_TC_LFR_ENTER_MODE_str Packet_TC_LFR_ENTER_MODE_t;
51
52 struct Packet_TC_LFR_DUMP_PAR_str
53 { // the CCSDS header is added by LPPMON
54 unsigned char packetID[2];
55 unsigned char packetSequenceControl[2];
56 unsigned char packetLength[2];
57 // DATA FIELD HEADER
58 unsigned char ccsdsSecHeaderFlag_pusVersion_ack;
59 unsigned char serviceType;
60 unsigned char serviceSubType;
61 unsigned char sourceID;
62 unsigned char crc[2];
63
64 };
65 typedef struct Packet_TC_LFR_DUMP_PAR_str Packet_TC_LFR_DUMP_PAR_t;
66
67 struct Packet_TC_LFR_LOAD_COMMON_PAR_str
68 { // the CCSDS header is added by LPPMON
69 unsigned char packetID[2];
70 unsigned char packetSequenceControl[2];
71 unsigned char packetLength[2];
72 // DATA FIELD HEADER
73 unsigned char ccsdsSecHeaderFlag_pusVersion_ack;
74 unsigned char serviceType;
75 unsigned char serviceSubType;
76 unsigned char sourceID;
77 unsigned char spare;
78 unsigned char bw_sp0_sp1_r0_r1;
79 unsigned char crc[2];
80
81 };
82 typedef struct Packet_TC_LFR_LOAD_COMMON_PAR_str Packet_TC_LFR_LOAD_COMMON_PAR_t;
83
84 struct Packet_TC_LFR_LOAD_NORMAL_PAR_str
85 { // the CCSDS header is added by LPPMON
86 unsigned char packetID[2];
87 unsigned char packetSequenceControl[2];
88 unsigned char packetLength[2];
89 // DATA FIELD HEADER
90 unsigned char ccsdsSecHeaderFlag_pusVersion_ack;
91 unsigned char serviceType;
92 unsigned char serviceSubType;
93 unsigned char sourceID;
94 unsigned char sy_lfr_n_swf_l[2];
95 unsigned char sy_lfr_n_swf_p[2];
96 unsigned char sy_lfr_n_asm_p[2];
97 unsigned char sy_lfr_n_bp_p0;
98 unsigned char sy_lfr_n_bp_p1;
99 unsigned char crc[2];
100 };
101 typedef struct Packet_TC_LFR_LOAD_NORMAL_PAR_str Packet_TC_LFR_LOAD_NORMAL_PAR_t;
102
103 struct Packet_TC_LFR_LOAD_BURST_SBM1_SBM2_PAR_str
104 { // the CCSDS header is added by LPPMON
105 unsigned char packetID[2];
106 unsigned char packetSequenceControl[2];
107 unsigned char packetLength[2];
108 // DATA FIELD HEADER
109 unsigned char ccsdsSecHeaderFlag_pusVersion_ack;
110 unsigned char serviceType;
111 unsigned char serviceSubType;
112 unsigned char sourceID;
113 unsigned char sy_lfr_bp_p0;
114 unsigned char sy_lfr_bp_p1;
115 unsigned char crc[2];
116 };
117 typedef struct Packet_TC_LFR_LOAD_BURST_SBM1_SBM2_PAR_str Packet_TC_LFR_LOAD_BURST_SBM1_SBM2_PAR_t;
118
119 #endif // TC_TYPES_H
@@ -1,225 +1,225
1 1 #############################################################################
2 # Makefile for building: bin/fsw-gsa
3 # Generated by qmake (2.01a) (Qt 4.8.4) on: Thu Jul 25 10:29:57 2013
2 # Makefile for building: bin/fsw
3 # Generated by qmake (2.01a) (Qt 4.8.4) on: Thu Aug 1 15:31:06 2013
4 4 # Project: fsw-qt.pro
5 5 # Template: app
6 6 # Command: /usr/bin/qmake-qt4 -spec /usr/lib64/qt4/mkspecs/linux-g++ -o Makefile fsw-qt.pro
7 7 #############################################################################
8 8
9 9 ####### Compiler, tools and options
10 10
11 11 CC = sparc-rtems-gcc
12 12 CXX = sparc-rtems-g++
13 DEFINES = -DSW_VERSION_N1=0 -DSW_VERSION_N2=0 -DSW_VERSION_N3=0 -DSW_VERSION_N4=11 -DPRINT_MESSAGES_ON_CONSOLE -DGSA
13 DEFINES = -DSW_VERSION_N1=0 -DSW_VERSION_N2=0 -DSW_VERSION_N3=0 -DSW_VERSION_N4=12 -DPRINT_MESSAGES_ON_CONSOLE
14 14 CFLAGS = -pipe -O3 -Wall $(DEFINES)
15 15 CXXFLAGS = -pipe -O3 -Wall $(DEFINES)
16 16 INCPATH = -I/usr/lib64/qt4/mkspecs/linux-g++ -I. -I../src -I../header
17 17 LINK = sparc-rtems-g++
18 18 LFLAGS =
19 19 LIBS = $(SUBLIBS)
20 20 AR = sparc-rtems-ar rcs
21 21 RANLIB =
22 22 QMAKE = /usr/bin/qmake-qt4
23 23 TAR = tar -cf
24 24 COMPRESS = gzip -9f
25 25 COPY = cp -f
26 26 SED = sed
27 27 COPY_FILE = $(COPY)
28 28 COPY_DIR = $(COPY) -r
29 29 STRIP = sparc-rtems-strip
30 30 INSTALL_FILE = install -m 644 -p
31 31 INSTALL_DIR = $(COPY_DIR)
32 32 INSTALL_PROGRAM = install -m 755 -p
33 33 DEL_FILE = rm -f
34 34 SYMLINK = ln -f -s
35 35 DEL_DIR = rmdir
36 36 MOVE = mv -f
37 37 CHK_DIR_EXISTS= test -d
38 38 MKDIR = mkdir -p
39 39
40 40 ####### Output directory
41 41
42 42 OBJECTS_DIR = obj/
43 43
44 44 ####### Files
45 45
46 46 SOURCES = ../src/wf_handler.c \
47 47 ../src/tc_handler.c \
48 48 ../src/fsw_processing.c \
49 49 ../src/fsw_misc.c \
50 50 ../src/fsw_init.c \
51 51 ../src/fsw_globals.c
52 52 OBJECTS = obj/wf_handler.o \
53 53 obj/tc_handler.o \
54 54 obj/fsw_processing.o \
55 55 obj/fsw_misc.o \
56 56 obj/fsw_init.o \
57 57 obj/fsw_globals.o
58 58 DIST = /usr/lib64/qt4/mkspecs/common/unix.conf \
59 59 /usr/lib64/qt4/mkspecs/common/linux.conf \
60 60 /usr/lib64/qt4/mkspecs/common/gcc-base.conf \
61 61 /usr/lib64/qt4/mkspecs/common/gcc-base-unix.conf \
62 62 /usr/lib64/qt4/mkspecs/common/g++-base.conf \
63 63 /usr/lib64/qt4/mkspecs/common/g++-unix.conf \
64 64 /usr/lib64/qt4/mkspecs/qconfig.pri \
65 65 /usr/lib64/qt4/mkspecs/modules/qt_webkit.pri \
66 66 /usr/lib64/qt4/mkspecs/features/qt_functions.prf \
67 67 /usr/lib64/qt4/mkspecs/features/qt_config.prf \
68 68 /usr/lib64/qt4/mkspecs/features/exclusive_builds.prf \
69 69 /usr/lib64/qt4/mkspecs/features/default_pre.prf \
70 70 sparc.pri \
71 71 /usr/lib64/qt4/mkspecs/features/release.prf \
72 72 /usr/lib64/qt4/mkspecs/features/default_post.prf \
73 73 /usr/lib64/qt4/mkspecs/features/unix/gdb_dwarf_index.prf \
74 74 /usr/lib64/qt4/mkspecs/features/warn_on.prf \
75 75 /usr/lib64/qt4/mkspecs/features/resources.prf \
76 76 /usr/lib64/qt4/mkspecs/features/uic.prf \
77 77 /usr/lib64/qt4/mkspecs/features/yacc.prf \
78 78 /usr/lib64/qt4/mkspecs/features/lex.prf \
79 79 /usr/lib64/qt4/mkspecs/features/include_source_dir.prf \
80 80 fsw-qt.pro
81 QMAKE_TARGET = fsw-gsa
81 QMAKE_TARGET = fsw
82 82 DESTDIR = bin/
83 TARGET = bin/fsw-gsa
83 TARGET = bin/fsw
84 84
85 85 first: all
86 86 ####### Implicit rules
87 87
88 88 .SUFFIXES: .o .c .cpp .cc .cxx .C
89 89
90 90 .cpp.o:
91 91 $(CXX) -c $(CXXFLAGS) $(INCPATH) -o "$@" "$<"
92 92
93 93 .cc.o:
94 94 $(CXX) -c $(CXXFLAGS) $(INCPATH) -o "$@" "$<"
95 95
96 96 .cxx.o:
97 97 $(CXX) -c $(CXXFLAGS) $(INCPATH) -o "$@" "$<"
98 98
99 99 .C.o:
100 100 $(CXX) -c $(CXXFLAGS) $(INCPATH) -o "$@" "$<"
101 101
102 102 .c.o:
103 103 $(CC) -c $(CFLAGS) $(INCPATH) -o "$@" "$<"
104 104
105 105 ####### Build rules
106 106
107 107 all: Makefile $(TARGET)
108 108
109 109 $(TARGET): $(OBJECTS)
110 110 @$(CHK_DIR_EXISTS) bin/ || $(MKDIR) bin/
111 111 $(LINK) $(LFLAGS) -o $(TARGET) $(OBJECTS) $(OBJCOMP) $(LIBS)
112 112
113 113 Makefile: fsw-qt.pro /usr/lib64/qt4/mkspecs/linux-g++/qmake.conf /usr/lib64/qt4/mkspecs/common/unix.conf \
114 114 /usr/lib64/qt4/mkspecs/common/linux.conf \
115 115 /usr/lib64/qt4/mkspecs/common/gcc-base.conf \
116 116 /usr/lib64/qt4/mkspecs/common/gcc-base-unix.conf \
117 117 /usr/lib64/qt4/mkspecs/common/g++-base.conf \
118 118 /usr/lib64/qt4/mkspecs/common/g++-unix.conf \
119 119 /usr/lib64/qt4/mkspecs/qconfig.pri \
120 120 /usr/lib64/qt4/mkspecs/modules/qt_webkit.pri \
121 121 /usr/lib64/qt4/mkspecs/features/qt_functions.prf \
122 122 /usr/lib64/qt4/mkspecs/features/qt_config.prf \
123 123 /usr/lib64/qt4/mkspecs/features/exclusive_builds.prf \
124 124 /usr/lib64/qt4/mkspecs/features/default_pre.prf \
125 125 sparc.pri \
126 126 /usr/lib64/qt4/mkspecs/features/release.prf \
127 127 /usr/lib64/qt4/mkspecs/features/default_post.prf \
128 128 /usr/lib64/qt4/mkspecs/features/unix/gdb_dwarf_index.prf \
129 129 /usr/lib64/qt4/mkspecs/features/warn_on.prf \
130 130 /usr/lib64/qt4/mkspecs/features/resources.prf \
131 131 /usr/lib64/qt4/mkspecs/features/uic.prf \
132 132 /usr/lib64/qt4/mkspecs/features/yacc.prf \
133 133 /usr/lib64/qt4/mkspecs/features/lex.prf \
134 134 /usr/lib64/qt4/mkspecs/features/include_source_dir.prf
135 135 $(QMAKE) -spec /usr/lib64/qt4/mkspecs/linux-g++ -o Makefile fsw-qt.pro
136 136 /usr/lib64/qt4/mkspecs/common/unix.conf:
137 137 /usr/lib64/qt4/mkspecs/common/linux.conf:
138 138 /usr/lib64/qt4/mkspecs/common/gcc-base.conf:
139 139 /usr/lib64/qt4/mkspecs/common/gcc-base-unix.conf:
140 140 /usr/lib64/qt4/mkspecs/common/g++-base.conf:
141 141 /usr/lib64/qt4/mkspecs/common/g++-unix.conf:
142 142 /usr/lib64/qt4/mkspecs/qconfig.pri:
143 143 /usr/lib64/qt4/mkspecs/modules/qt_webkit.pri:
144 144 /usr/lib64/qt4/mkspecs/features/qt_functions.prf:
145 145 /usr/lib64/qt4/mkspecs/features/qt_config.prf:
146 146 /usr/lib64/qt4/mkspecs/features/exclusive_builds.prf:
147 147 /usr/lib64/qt4/mkspecs/features/default_pre.prf:
148 148 sparc.pri:
149 149 /usr/lib64/qt4/mkspecs/features/release.prf:
150 150 /usr/lib64/qt4/mkspecs/features/default_post.prf:
151 151 /usr/lib64/qt4/mkspecs/features/unix/gdb_dwarf_index.prf:
152 152 /usr/lib64/qt4/mkspecs/features/warn_on.prf:
153 153 /usr/lib64/qt4/mkspecs/features/resources.prf:
154 154 /usr/lib64/qt4/mkspecs/features/uic.prf:
155 155 /usr/lib64/qt4/mkspecs/features/yacc.prf:
156 156 /usr/lib64/qt4/mkspecs/features/lex.prf:
157 157 /usr/lib64/qt4/mkspecs/features/include_source_dir.prf:
158 158 qmake: FORCE
159 159 @$(QMAKE) -spec /usr/lib64/qt4/mkspecs/linux-g++ -o Makefile fsw-qt.pro
160 160
161 161 dist:
162 @$(CHK_DIR_EXISTS) obj/fsw-gsa1.0.0 || $(MKDIR) obj/fsw-gsa1.0.0
163 $(COPY_FILE) --parents $(SOURCES) $(DIST) obj/fsw-gsa1.0.0/ && (cd `dirname obj/fsw-gsa1.0.0` && $(TAR) fsw-gsa1.0.0.tar fsw-gsa1.0.0 && $(COMPRESS) fsw-gsa1.0.0.tar) && $(MOVE) `dirname obj/fsw-gsa1.0.0`/fsw-gsa1.0.0.tar.gz . && $(DEL_FILE) -r obj/fsw-gsa1.0.0
162 @$(CHK_DIR_EXISTS) obj/fsw1.0.0 || $(MKDIR) obj/fsw1.0.0
163 $(COPY_FILE) --parents $(SOURCES) $(DIST) obj/fsw1.0.0/ && (cd `dirname obj/fsw1.0.0` && $(TAR) fsw1.0.0.tar fsw1.0.0 && $(COMPRESS) fsw1.0.0.tar) && $(MOVE) `dirname obj/fsw1.0.0`/fsw1.0.0.tar.gz . && $(DEL_FILE) -r obj/fsw1.0.0
164 164
165 165
166 166 clean:compiler_clean
167 167 -$(DEL_FILE) $(OBJECTS)
168 168 -$(DEL_FILE) *~ core *.core
169 169
170 170
171 171 ####### Sub-libraries
172 172
173 173 distclean: clean
174 174 -$(DEL_FILE) $(TARGET)
175 175 -$(DEL_FILE) Makefile
176 176
177 177
178 178 grmon:
179 179 cd bin && C:/opt/grmon-eval-2.0.29b/win32/bin/grmon.exe -uart COM4 -u
180 180
181 181 check: first
182 182
183 183 compiler_rcc_make_all:
184 184 compiler_rcc_clean:
185 185 compiler_uic_make_all:
186 186 compiler_uic_clean:
187 187 compiler_image_collection_make_all: qmake_image_collection.cpp
188 188 compiler_image_collection_clean:
189 189 -$(DEL_FILE) qmake_image_collection.cpp
190 190 compiler_yacc_decl_make_all:
191 191 compiler_yacc_decl_clean:
192 192 compiler_yacc_impl_make_all:
193 193 compiler_yacc_impl_clean:
194 194 compiler_lex_make_all:
195 195 compiler_lex_clean:
196 196 compiler_clean:
197 197
198 198 ####### Compile
199 199
200 200 obj/wf_handler.o: ../src/wf_handler.c
201 201 $(CC) -c $(CFLAGS) $(INCPATH) -o obj/wf_handler.o ../src/wf_handler.c
202 202
203 203 obj/tc_handler.o: ../src/tc_handler.c
204 204 $(CC) -c $(CFLAGS) $(INCPATH) -o obj/tc_handler.o ../src/tc_handler.c
205 205
206 206 obj/fsw_processing.o: ../src/fsw_processing.c
207 207 $(CC) -c $(CFLAGS) $(INCPATH) -o obj/fsw_processing.o ../src/fsw_processing.c
208 208
209 209 obj/fsw_misc.o: ../src/fsw_misc.c
210 210 $(CC) -c $(CFLAGS) $(INCPATH) -o obj/fsw_misc.o ../src/fsw_misc.c
211 211
212 212 obj/fsw_init.o: ../src/fsw_init.c
213 213 $(CC) -c $(CFLAGS) $(INCPATH) -o obj/fsw_init.o ../src/fsw_init.c
214 214
215 215 obj/fsw_globals.o: ../src/fsw_globals.c
216 216 $(CC) -c $(CFLAGS) $(INCPATH) -o obj/fsw_globals.o ../src/fsw_globals.c
217 217
218 218 ####### Install
219 219
220 220 install: FORCE
221 221
222 222 uninstall: FORCE
223 223
224 224 FORCE:
225 225
1 NO CONTENT: modified file, binary diff hidden
1 NO CONTENT: modified file, binary diff hidden
@@ -1,52 +1,52
1 1 TEMPLATE = app
2 2 # CONFIG += console v8 sim
3 3 # CONFIG options = verbose *** cpu_usage_report *** gsa
4 CONFIG += console verbose gsa
4 CONFIG += console verbose
5 5 CONFIG -= qt
6 6
7 7 include(./sparc.pri)
8 8
9 9 # flight software version
10 SWVERSION=-0-11
10 SWVERSION=-0-12
11 11 DEFINES += SW_VERSION_N1=0
12 12 DEFINES += SW_VERSION_N2=0
13 13 DEFINES += SW_VERSION_N3=0
14 DEFINES += SW_VERSION_N4=11
14 DEFINES += SW_VERSION_N4=12
15 15
16 16 contains( CONFIG, verbose ) {
17 17 DEFINES += PRINT_MESSAGES_ON_CONSOLE
18 18 }
19 19
20 20 contains( CONFIG, cpu_usage_report ) {
21 21 DEFINES += PRINT_TASK_STATISTICS
22 22 }
23 23
24 24 TARGET = fsw
25 25 contains( CONFIG, gsa ) {
26 26 DEFINES += GSA
27 27 TARGET = fsw-gsa
28 28 }
29 29
30 30 INCLUDEPATH += \
31 31 ../src \
32 32 ../header
33 33
34 34 SOURCES += \
35 35 ../src/wf_handler.c \
36 36 ../src/tc_handler.c \
37 37 ../src/fsw_processing.c \
38 38 ../src/fsw_misc.c \
39 39 ../src/fsw_init.c \
40 40 ../src/fsw_globals.c
41 41
42 42 HEADERS += \
43 43 ../header/wf_handler.h \
44 44 ../header/tc_handler.h \
45 45 ../header/grlib_regs.h \
46 46 ../header/fsw_processing.h \
47 47 ../header/fsw_params.h \
48 48 ../header/fsw_misc.h \
49 49 ../header/fsw_init.h \
50 50 ../header/ccsds_types.h \
51 51 ../header/fsw_params_processing.h
52 52
@@ -1,255 +1,257
1 1 <?xml version="1.0" encoding="UTF-8"?>
2 2 <!DOCTYPE QtCreatorProject>
3 <!-- Written by QtCreator 2.7.0, 2013-07-25T07:26:34. -->
3 <!-- Written by QtCreator 2.8.0, 2013-08-01T13:38:09. -->
4 4 <qtcreator>
5 5 <data>
6 6 <variable>ProjectExplorer.Project.ActiveTarget</variable>
7 7 <value type="int">0</value>
8 8 </data>
9 9 <data>
10 10 <variable>ProjectExplorer.Project.EditorSettings</variable>
11 11 <valuemap type="QVariantMap">
12 12 <value type="bool" key="EditorConfiguration.AutoIndent">true</value>
13 13 <value type="bool" key="EditorConfiguration.AutoSpacesForTabs">false</value>
14 14 <value type="bool" key="EditorConfiguration.CamelCaseNavigation">true</value>
15 15 <valuemap type="QVariantMap" key="EditorConfiguration.CodeStyle.0">
16 <value type="QByteArray" key="language">Cpp</value>
16 <value type="QString" key="language">Cpp</value>
17 17 <valuemap type="QVariantMap" key="value">
18 18 <value type="QString" key="CurrentPreferences">CppGlobal</value>
19 19 </valuemap>
20 20 </valuemap>
21 21 <valuemap type="QVariantMap" key="EditorConfiguration.CodeStyle.1">
22 <value type="QByteArray" key="language">QmlJS</value>
22 <value type="QString" key="language">QmlJS</value>
23 23 <valuemap type="QVariantMap" key="value">
24 24 <value type="QString" key="CurrentPreferences">QmlJSGlobal</value>
25 25 </valuemap>
26 26 </valuemap>
27 27 <value type="int" key="EditorConfiguration.CodeStyle.Count">2</value>
28 28 <value type="QByteArray" key="EditorConfiguration.Codec">System</value>
29 29 <value type="bool" key="EditorConfiguration.ConstrainTooltips">false</value>
30 30 <value type="int" key="EditorConfiguration.IndentSize">4</value>
31 31 <value type="bool" key="EditorConfiguration.KeyboardTooltips">false</value>
32 32 <value type="bool" key="EditorConfiguration.MouseNavigation">true</value>
33 33 <value type="int" key="EditorConfiguration.PaddingMode">1</value>
34 34 <value type="bool" key="EditorConfiguration.ScrollWheelZooming">true</value>
35 35 <value type="int" key="EditorConfiguration.SmartBackspaceBehavior">0</value>
36 36 <value type="bool" key="EditorConfiguration.SpacesForTabs">true</value>
37 37 <value type="int" key="EditorConfiguration.TabKeyBehavior">0</value>
38 38 <value type="int" key="EditorConfiguration.TabSize">8</value>
39 39 <value type="bool" key="EditorConfiguration.UseGlobal">true</value>
40 40 <value type="int" key="EditorConfiguration.Utf8BomBehavior">1</value>
41 41 <value type="bool" key="EditorConfiguration.addFinalNewLine">true</value>
42 42 <value type="bool" key="EditorConfiguration.cleanIndentation">true</value>
43 43 <value type="bool" key="EditorConfiguration.cleanWhitespace">true</value>
44 44 <value type="bool" key="EditorConfiguration.inEntireDocument">false</value>
45 45 </valuemap>
46 46 </data>
47 47 <data>
48 48 <variable>ProjectExplorer.Project.PluginSettings</variable>
49 49 <valuemap type="QVariantMap"/>
50 50 </data>
51 51 <data>
52 52 <variable>ProjectExplorer.Project.Target.0</variable>
53 53 <valuemap type="QVariantMap">
54 54 <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Desktop-Qt 4.8.2 in PATH (System)</value>
55 55 <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Desktop-Qt 4.8.2 in PATH (System)</value>
56 <value type="QByteArray" key="ProjectExplorer.ProjectConfiguration.Id">{5289e843-9ef2-45ce-88c6-ad27d8e08def}</value>
56 <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">{5289e843-9ef2-45ce-88c6-ad27d8e08def}</value>
57 57 <value type="int" key="ProjectExplorer.Target.ActiveBuildConfiguration">0</value>
58 58 <value type="int" key="ProjectExplorer.Target.ActiveDeployConfiguration">0</value>
59 59 <value type="int" key="ProjectExplorer.Target.ActiveRunConfiguration">0</value>
60 60 <valuemap type="QVariantMap" key="ProjectExplorer.Target.BuildConfiguration.0">
61 61 <valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.0">
62 62 <valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
63 63 <value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
64 64 <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">qmake</value>
65 65 <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
66 <value type="QByteArray" key="ProjectExplorer.ProjectConfiguration.Id">QtProjectManager.QMakeBuildStep</value>
66 <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">QtProjectManager.QMakeBuildStep</value>
67 67 <value type="bool" key="QtProjectManager.QMakeBuildStep.LinkQmlDebuggingLibrary">false</value>
68 68 <value type="bool" key="QtProjectManager.QMakeBuildStep.LinkQmlDebuggingLibraryAuto">true</value>
69 69 <value type="QString" key="QtProjectManager.QMakeBuildStep.QMakeArguments"></value>
70 70 <value type="bool" key="QtProjectManager.QMakeBuildStep.QMakeForced">false</value>
71 71 </valuemap>
72 72 <valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.1">
73 73 <value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
74 74 <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Make</value>
75 75 <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
76 <value type="QByteArray" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.MakeStep</value>
76 <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.MakeStep</value>
77 77 <valuelist type="QVariantList" key="Qt4ProjectManager.MakeStep.AutomaticallyAddedMakeArguments">
78 78 <value type="QString">-w</value>
79 79 <value type="QString">-r</value>
80 80 </valuelist>
81 81 <value type="bool" key="Qt4ProjectManager.MakeStep.Clean">false</value>
82 82 <value type="QString" key="Qt4ProjectManager.MakeStep.MakeArguments">-r -w </value>
83 83 <value type="QString" key="Qt4ProjectManager.MakeStep.MakeCommand"></value>
84 84 </valuemap>
85 85 <value type="int" key="ProjectExplorer.BuildStepList.StepsCount">2</value>
86 86 <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Build</value>
87 87 <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
88 <value type="QByteArray" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Build</value>
88 <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Build</value>
89 89 </valuemap>
90 90 <valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.1">
91 91 <valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
92 92 <value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
93 93 <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Make</value>
94 94 <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
95 <value type="QByteArray" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.MakeStep</value>
95 <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.MakeStep</value>
96 96 <valuelist type="QVariantList" key="Qt4ProjectManager.MakeStep.AutomaticallyAddedMakeArguments">
97 97 <value type="QString">-w</value>
98 98 <value type="QString">-r</value>
99 99 </valuelist>
100 100 <value type="bool" key="Qt4ProjectManager.MakeStep.Clean">true</value>
101 101 <value type="QString" key="Qt4ProjectManager.MakeStep.MakeArguments">-r -w clean</value>
102 102 <value type="QString" key="Qt4ProjectManager.MakeStep.MakeCommand"></value>
103 103 </valuemap>
104 104 <value type="int" key="ProjectExplorer.BuildStepList.StepsCount">1</value>
105 105 <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Clean</value>
106 106 <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
107 <value type="QByteArray" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Clean</value>
107 <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Clean</value>
108 108 </valuemap>
109 109 <value type="int" key="ProjectExplorer.BuildConfiguration.BuildStepListCount">2</value>
110 110 <value type="bool" key="ProjectExplorer.BuildConfiguration.ClearSystemEnvironment">false</value>
111 111 <valuelist type="QVariantList" key="ProjectExplorer.BuildConfiguration.UserEnvironmentChanges"/>
112 112 <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Qt 4.8.2 in PATH (System) Release</value>
113 113 <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
114 <value type="QByteArray" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.Qt4BuildConfiguration</value>
114 <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.Qt4BuildConfiguration</value>
115 115 <value type="int" key="Qt4ProjectManager.Qt4BuildConfiguration.BuildConfiguration">0</value>
116 116 <value type="QString" key="Qt4ProjectManager.Qt4BuildConfiguration.BuildDirectory">/opt/DEV_PLE/FSW-qt</value>
117 117 <value type="bool" key="Qt4ProjectManager.Qt4BuildConfiguration.UseShadowBuild">false</value>
118 118 </valuemap>
119 119 <valuemap type="QVariantMap" key="ProjectExplorer.Target.BuildConfiguration.1">
120 120 <valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.0">
121 121 <valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
122 122 <value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
123 123 <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">qmake</value>
124 124 <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
125 <value type="QByteArray" key="ProjectExplorer.ProjectConfiguration.Id">QtProjectManager.QMakeBuildStep</value>
125 <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">QtProjectManager.QMakeBuildStep</value>
126 126 <value type="bool" key="QtProjectManager.QMakeBuildStep.LinkQmlDebuggingLibrary">false</value>
127 127 <value type="bool" key="QtProjectManager.QMakeBuildStep.LinkQmlDebuggingLibraryAuto">true</value>
128 128 <value type="QString" key="QtProjectManager.QMakeBuildStep.QMakeArguments"></value>
129 129 <value type="bool" key="QtProjectManager.QMakeBuildStep.QMakeForced">false</value>
130 130 </valuemap>
131 131 <valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.1">
132 132 <value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
133 133 <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Make</value>
134 134 <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
135 <value type="QByteArray" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.MakeStep</value>
135 <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.MakeStep</value>
136 136 <valuelist type="QVariantList" key="Qt4ProjectManager.MakeStep.AutomaticallyAddedMakeArguments">
137 137 <value type="QString">-w</value>
138 138 <value type="QString">-r</value>
139 139 </valuelist>
140 140 <value type="bool" key="Qt4ProjectManager.MakeStep.Clean">false</value>
141 141 <value type="QString" key="Qt4ProjectManager.MakeStep.MakeArguments">-r -w </value>
142 142 <value type="QString" key="Qt4ProjectManager.MakeStep.MakeCommand"></value>
143 143 </valuemap>
144 144 <value type="int" key="ProjectExplorer.BuildStepList.StepsCount">2</value>
145 145 <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Build</value>
146 146 <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
147 <value type="QByteArray" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Build</value>
147 <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Build</value>
148 148 </valuemap>
149 149 <valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.1">
150 150 <valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
151 151 <value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
152 152 <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Make</value>
153 153 <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
154 <value type="QByteArray" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.MakeStep</value>
154 <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.MakeStep</value>
155 155 <valuelist type="QVariantList" key="Qt4ProjectManager.MakeStep.AutomaticallyAddedMakeArguments">
156 156 <value type="QString">-w</value>
157 157 <value type="QString">-r</value>
158 158 </valuelist>
159 159 <value type="bool" key="Qt4ProjectManager.MakeStep.Clean">true</value>
160 160 <value type="QString" key="Qt4ProjectManager.MakeStep.MakeArguments">-r -w clean</value>
161 161 <value type="QString" key="Qt4ProjectManager.MakeStep.MakeCommand"></value>
162 162 </valuemap>
163 163 <value type="int" key="ProjectExplorer.BuildStepList.StepsCount">1</value>
164 164 <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Clean</value>
165 165 <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
166 <value type="QByteArray" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Clean</value>
166 <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Clean</value>
167 167 </valuemap>
168 168 <value type="int" key="ProjectExplorer.BuildConfiguration.BuildStepListCount">2</value>
169 169 <value type="bool" key="ProjectExplorer.BuildConfiguration.ClearSystemEnvironment">false</value>
170 170 <valuelist type="QVariantList" key="ProjectExplorer.BuildConfiguration.UserEnvironmentChanges"/>
171 171 <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Qt 4.8.2 in PATH (System) Debug</value>
172 172 <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
173 <value type="QByteArray" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.Qt4BuildConfiguration</value>
173 <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.Qt4BuildConfiguration</value>
174 174 <value type="int" key="Qt4ProjectManager.Qt4BuildConfiguration.BuildConfiguration">2</value>
175 175 <value type="QString" key="Qt4ProjectManager.Qt4BuildConfiguration.BuildDirectory">/opt/DEV_PLE/FSW-qt</value>
176 176 <value type="bool" key="Qt4ProjectManager.Qt4BuildConfiguration.UseShadowBuild">false</value>
177 177 </valuemap>
178 178 <value type="int" key="ProjectExplorer.Target.BuildConfigurationCount">2</value>
179 179 <valuemap type="QVariantMap" key="ProjectExplorer.Target.DeployConfiguration.0">
180 180 <valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.0">
181 181 <value type="int" key="ProjectExplorer.BuildStepList.StepsCount">0</value>
182 182 <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Deploy</value>
183 183 <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
184 <value type="QByteArray" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Deploy</value>
184 <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Deploy</value>
185 185 </valuemap>
186 186 <value type="int" key="ProjectExplorer.BuildConfiguration.BuildStepListCount">1</value>
187 187 <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">No deployment</value>
188 188 <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
189 <value type="QByteArray" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.DefaultDeployConfiguration</value>
189 <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.DefaultDeployConfiguration</value>
190 190 </valuemap>
191 191 <value type="int" key="ProjectExplorer.Target.DeployConfigurationCount">1</value>
192 <valuemap type="QVariantMap" key="ProjectExplorer.Target.PluginSettings"/>
192 193 <valuemap type="QVariantMap" key="ProjectExplorer.Target.RunConfiguration.0">
193 194 <value type="bool" key="Analyzer.Project.UseGlobal">true</value>
194 195 <valuelist type="QVariantList" key="Analyzer.Valgrind.AddedSuppressionFiles"/>
195 196 <value type="bool" key="Analyzer.Valgrind.Callgrind.CollectBusEvents">false</value>
196 197 <value type="bool" key="Analyzer.Valgrind.Callgrind.CollectSystime">false</value>
197 198 <value type="bool" key="Analyzer.Valgrind.Callgrind.EnableBranchSim">false</value>
198 199 <value type="bool" key="Analyzer.Valgrind.Callgrind.EnableCacheSim">false</value>
199 200 <value type="bool" key="Analyzer.Valgrind.Callgrind.EnableEventToolTips">true</value>
200 201 <value type="double" key="Analyzer.Valgrind.Callgrind.MinimumCostRatio">0.01</value>
201 202 <value type="double" key="Analyzer.Valgrind.Callgrind.VisualisationMinimumCostRatio">10</value>
202 203 <value type="bool" key="Analyzer.Valgrind.FilterExternalIssues">true</value>
203 204 <value type="int" key="Analyzer.Valgrind.NumCallers">25</value>
204 205 <valuelist type="QVariantList" key="Analyzer.Valgrind.RemovedSuppressionFiles"/>
205 206 <value type="bool" key="Analyzer.Valgrind.TrackOrigins">true</value>
206 207 <value type="QString" key="Analyzer.Valgrind.ValgrindExecutable">valgrind</value>
207 208 <valuelist type="QVariantList" key="Analyzer.Valgrind.VisibleErrorKinds">
208 209 <value type="int">0</value>
209 210 <value type="int">1</value>
210 211 <value type="int">2</value>
211 212 <value type="int">3</value>
212 213 <value type="int">4</value>
213 214 <value type="int">5</value>
214 215 <value type="int">6</value>
215 216 <value type="int">7</value>
216 217 <value type="int">8</value>
217 218 <value type="int">9</value>
218 219 <value type="int">10</value>
219 220 <value type="int">11</value>
220 221 <value type="int">12</value>
221 222 <value type="int">13</value>
222 223 <value type="int">14</value>
223 224 </valuelist>
225 <value type="int" key="PE.EnvironmentAspect.Base">2</value>
226 <valuelist type="QVariantList" key="PE.EnvironmentAspect.Changes"/>
224 227 <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">fsw-qt</value>
225 228 <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
226 <value type="QByteArray" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.Qt4RunConfiguration:/opt/DEV_PLE/FSW-qt/fsw-qt.pro</value>
227 <value type="int" key="Qt4ProjectManager.Qt4RunConfiguration.BaseEnvironmentBase">2</value>
229 <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.Qt4RunConfiguration:/opt/DEV_PLE/FSW-qt/fsw-qt.pro</value>
228 230 <value type="QString" key="Qt4ProjectManager.Qt4RunConfiguration.CommandLineArguments"></value>
229 231 <value type="QString" key="Qt4ProjectManager.Qt4RunConfiguration.ProFile">fsw-qt.pro</value>
230 232 <value type="bool" key="Qt4ProjectManager.Qt4RunConfiguration.UseDyldImageSuffix">false</value>
231 233 <value type="bool" key="Qt4ProjectManager.Qt4RunConfiguration.UseTerminal">true</value>
232 <valuelist type="QVariantList" key="Qt4ProjectManager.Qt4RunConfiguration.UserEnvironmentChanges"/>
233 234 <value type="QString" key="Qt4ProjectManager.Qt4RunConfiguration.UserWorkingDirectory"></value>
234 235 <value type="uint" key="RunConfiguration.QmlDebugServerPort">3768</value>
235 236 <value type="bool" key="RunConfiguration.UseCppDebugger">true</value>
237 <value type="bool" key="RunConfiguration.UseCppDebuggerAuto">false</value>
236 238 <value type="bool" key="RunConfiguration.UseMultiProcess">false</value>
237 239 <value type="bool" key="RunConfiguration.UseQmlDebugger">false</value>
238 240 <value type="bool" key="RunConfiguration.UseQmlDebuggerAuto">false</value>
239 241 </valuemap>
240 242 <value type="int" key="ProjectExplorer.Target.RunConfigurationCount">1</value>
241 243 </valuemap>
242 244 </data>
243 245 <data>
244 246 <variable>ProjectExplorer.Project.TargetCount</variable>
245 247 <value type="int">1</value>
246 248 </data>
247 249 <data>
248 250 <variable>ProjectExplorer.Project.Updater.EnvironmentId</variable>
249 <value type="QString">{2e58a81f-9962-4bba-ae6b-760177f0656c}</value>
251 <value type="QByteArray">{2e58a81f-9962-4bba-ae6b-760177f0656c}</value>
250 252 </data>
251 253 <data>
252 254 <variable>ProjectExplorer.Project.Updater.FileVersion</variable>
253 <value type="int">12</value>
255 <value type="int">14</value>
254 256 </data>
255 257 </qtcreator>
@@ -1,459 +1,460
1 1 #ifndef CCSDS_H_INCLUDED
2 2 #define CCSDS_H_INCLUDED
3 3
4 4 #define CCSDS_PROTOCOLE_EXTRA_BYTES 4
5 5 #define CCSDS_TELEMETRY_HEADER_LENGTH 16+4
6 6 #define CCSDS_TM_PKT_MAX_SIZE 4412
7 7 #define CCSDS_TELECOMMAND_HEADER_LENGTH 10+4
8 8 #define CCSDS_TC_PKT_MAX_SIZE 256
9 9 #define CCSDS_TC_PKT_MIN_SIZE 16
10 10 #define CCSDS_TC_TM_PACKET_OFFSET 7
11 11 #define CCSDS_PROCESS_ID 76
12 12 #define CCSDS_PACKET_CATEGORY 12
13 13 #define CCSDS_NODE_ADDRESS 0xfe
14 #define CCSDS_USER_APP 0x00
14 15
15 16 // PACKET ID
16 17 #define TM_PACKET_ID_TC_EXE 0x0cc1 // PID 76 CAT 1
17 18 #define TM_PACKET_ID_HK 0x0cc4 // PID 76 CAT 4
18 19 #define TM_PACKET_ID_PARAMETER_DUMP 0x0cc9 // PID 76 CAT 9
19 20 #define TM_PACKET_ID_SCIENCE_NORMAL 0x0ccc // PID 76 CAT 12
20 21 #define TM_PACKET_ID_SCIENCE_BURST_SBM1_SBM2 0x0cfc // PID 79 CAT 12
21 22
22 23 // PACKET SEQUENCE CONTROL
23 24 #define TM_PACKET_SEQ_CTRL_CONTINUATION 0
24 25 #define TM_PACKET_SEQ_CTRL_FIRST 1
25 26 #define TM_PACKET_SEQ_CTRL_LAST 2
26 27 #define TM_PACKET_SEQ_CTRL_STANDALONE 3
27 28
28 29 //
29 30 #define TM_DESTINATION_ID_GROUND 0
30 31 #define TM_DESTINATION_ID_MISSION_TIMELINE 110
31 32 #define TM_DESTINATION_ID_TC_SEQUENCES 111
32 33 #define TM_DESTINATION_ID_RECOVERY_ACTION_COMMAND 112
33 34 #define TM_DESTINATION_ID_BACKUP_MISSION_TIMELINE 113
34 35 #define TM_DESTINATION_ID_DIRECT_CMD 120
35 36 #define TM_DESTINATION_ID_SPARE_GRD_SRC1 121
36 37 #define TM_DESTINATION_ID_SPARE_GRD_SRC2 122
37 38 #define TM_DESTINATION_ID_OBCP 15
38 39 #define TM_DESTINATION_ID_SYSTEM_CONTROL 14
39 40 #define TM_DESTINATION_ID_AOCS 11
40 41
41 42 #define CCSDS_DESTINATION_ID 0x01
42 43 #define CCSDS_PROTOCOLE_ID 0x02
43 44 #define CCSDS_RESERVED 0x00
44 45 #define CCSDS_USER_APP 0x00
45 46
46 47 #define SIZE_TM_LFR_TC_EXE_NOT_IMPLEMENTED 24
47 48 #define SIZE_TM_LFR_TC_EXE_CORRUPTED 32
48 49 #define SIZE_HK_PARAMETERS 112
49 50
50 51 #define ILLEGAL_APID 0
51 52 #define WRONG_LEN_PACKET 1
52 53 #define INCOR_CHECKSUM 2
53 54 #define ILL_TYPE 3
54 55 #define ILL_SUBTYPE 4
55 56 #define WRONG_APP_DATA 5
56 57 #define WRONG_CMD_CODE 6
57 58 #define CCSDS_TM_VALID 7
58 59
59 60 // TC TYPES
60 61 #define TC_TYPE_GEN 181
61 62 #define TC_TYPE_TIME 9
62 63
63 64 // TC SUBTYPES
64 65 #define TC_SUBTYPE_RESET 1
65 66 #define TC_SUBTYPE_LOAD_COMM 11
66 67 #define TC_SUBTYPE_LOAD_NORM 13
67 68 #define TC_SUBTYPE_LOAD_BURST 19
68 69 #define TC_SUBTYPE_LOAD_SBM1 25
69 70 #define TC_SUBTYPE_LOAD_SBM2 27
70 71 #define TC_SUBTYPE_DUMP 31
71 72 #define TC_SUBTYPE_ENTER 41
72 73 #define TC_SUBTYPE_UPDT_INFO 51
73 74 #define TC_SUBTYPE_EN_CAL 61
74 75 #define TC_SUBTYPE_DIS_CAL 63
75 76 #define TC_SUBTYPE_UPDT_TIME 129
76 77
77 78 // TC LEN
78 79 #define TC_LEN_RESET 12
79 80 #define TC_LEN_LOAD_COMM 14
80 81 #define TC_LEN_LOAD_NORM 20
81 82 #define TC_LEN_LOAD_BURST 14
82 83 #define TC_LEN_LOAD_SBM1 14
83 84 #define TC_LEN_LOAD_SBM2 14
84 85 #define TC_LEN_DUMP 12
85 86 #define TC_LEN_ENTER 20
86 87 #define TC_LEN_UPDT_INFO 48
87 88 #define TC_LEN_EN_CAL 12
88 89 #define TC_LEN_DIS_CAL 12
89 90 #define TC_LEN_UPDT_TIME 18
90 91
91 92 // TM TYPES
92 93 #define TM_TYPE_TC_EXE 1
93 94 #define TM_TYPE_HK 3
94 95 #define TM_TYPE_PARAMETER_DUMP 3
95 96 #define TM_TYPE_LFR_SCIENCE 21
96 97
97 98 // TM SUBTYPES
98 99 #define TM_SUBTYPE_EXE_OK 7
99 100 #define TM_SUBTYPE_EXE_NOK 8
100 101 #define TM_SUBTYPE_HK 25
101 102 #define TM_SUBTYPE_PARAMETER_DUMP 25
102 103 #define TM_SUBTYPE_SCIENCE 3
103 104 #define TM_SUBTYPE_LFR_SCIENCE 3
104 105
105 106 // FAILURE CODES
106 107 #define FAILURE_CODE_INCONSISTENT 5 // 0x00 0x05
107 108 #define FAILURE_CODE_NOT_EXECUTABLE 42000 // 0xa4 0x10
108 109 #define FAILURE_CODE_NOT_IMPLEMENTED 42002 // 0xa4 0x12
109 110 #define FAILURE_CODE_ERROR 42003 // 0xa4 0x13
110 111 #define FAILURE_CODE_CORRUPTED 42005 // 0xa4 0x15
111 112 // TM SID
112 113 #define SID_DEFAULT 0
113 114 #define SID_EXE_INC 5
114 115 #define SID_NOT_EXE 42000 // 0xa4 0x10
115 116 #define SID_NOT_IMP 42002 // 0xa4 0x12
116 117 #define SID_EXE_ERR 42003 // 0xa4 0x13
117 118 #define SID_EXE_CORR 42005 // 0xa4 0x15
118 119 #define SID_HK 1
119 120 #define SID_PARAMETER_DUMP 10
120 121
121 122 #define SID_NORM_SWF_F0 3
122 123 #define SID_NORM_SWF_F1 4
123 124 #define SID_NORM_SWF_F2 5
124 125 #define SID_NORM_CWF_F3 1
125 126 #define SID_BURST_CWF_F2 2
126 127 #define SID_SBM1_CWF_F1 24
127 128 #define SID_SBM2_CWF_F2 25
128 129 #define SID_NORM_ASM_F0 11
129 130 #define SID_NORM_ASM_F1 12
130 131 #define SID_NORM_ASM_F2 13
131 132 #define SID_NORM_BP1_F0 14
132 133 #define SID_NORM_BP1_F1 15
133 134 #define SID_NORM_BP1_F2 16
134 135 #define SID_NORM_BP2_F0 19
135 136 #define SID_NORM_BP2_F1 20
136 137 #define SID_NORM_BP2_F2 21
137 138 #define SID_BURST_BP1_F0 17
138 139 #define SID_BURST_BP2_F0 22
139 140 #define SID_BURST_BP1_F1 18
140 141 #define SID_BURST_BP2_F1 23
141 142 #define SID_SBM1_BP1_F0 28
142 143 #define SID_SBM1_BP2_F0 31
143 144 #define SID_SBM2_BP1_F0 29
144 145 #define SID_SBM2_BP2_F0 32
145 146 #define SID_SBM1_BP1_F1 30
146 147 #define SID_SBM1_BP2_F1 33
147 148
148 149 // LENGTH (BYTES)
149 150 #define LENGTH_TM_LFR_TC_EXE_MAX 32
150 151 #define LENGTH_TM_LFR_HK 126
151 152
152 153 // HEADER_LENGTH
153 154 #define TM_HEADER_LEN 16
154 155 #define HEADER_LENGTH_TM_LFR_SCIENCE_ASM 28
155 156 // PACKET_LENGTH
156 157 #define PACKET_LENGTH_TC_EXE_SUCCESS (20 - CCSDS_TC_TM_PACKET_OFFSET)
157 158 #define PACKET_LENGTH_TC_EXE_INCONSISTENT (26 - CCSDS_TC_TM_PACKET_OFFSET)
158 159 #define PACKET_LENGTH_TC_EXE_NOT_EXECUTABLE (26 - CCSDS_TC_TM_PACKET_OFFSET)
159 160 #define PACKET_LENGTH_TC_EXE_NOT_IMPLEMENTED (24 - CCSDS_TC_TM_PACKET_OFFSET)
160 161 #define PACKET_LENGTH_TC_EXE_ERROR (24 - CCSDS_TC_TM_PACKET_OFFSET)
161 162 #define PACKET_LENGTH_TC_EXE_CORRUPTED (32 - CCSDS_TC_TM_PACKET_OFFSET)
162 163 #define PACKET_LENGTH_HK (126 - CCSDS_TC_TM_PACKET_OFFSET)
163 164 #define PACKET_LENGTH_PARAMETER_DUMP (34 - CCSDS_TC_TM_PACKET_OFFSET)
164 165 #define PACKET_LENGTH_TM_LFR_SCIENCE_ASM (TOTAL_SIZE_SM + HEADER_LENGTH_TM_LFR_SCIENCE_ASM - CCSDS_TC_TM_PACKET_OFFSET)
165 166
166 167 #define SPARE1_PUSVERSION_SPARE2 0x10
167 168
168 169 #define LEN_TM_LFR_HK 126 + 4
169 170 #define LEN_TM_LFR_TC_EXE_NOT_IMP 24 +4
170 171
171 172 #define TM_LEN_SCI_SWF_340 340 * 12 + 10 + 12 - 1
172 173 #define TM_LEN_SCI_SWF_8 8 * 12 + 10 + 12 - 1
173 174 #define TM_LEN_SCI_CWF_340 340 * 12 + 10 + 10 - 1
174 175 #define TM_LEN_SCI_CWF_8 8 * 12 + 10 + 10 - 1
175 176
176 177 enum TM_TYPE{
177 178 TM_LFR_TC_EXE_OK,
178 179 TM_LFR_TC_EXE_ERR,
179 180 TM_LFR_HK,
180 181 TM_LFR_SCI,
181 182 TM_LFR_SCI_SBM,
182 183 TM_LFR_PAR_DUMP
183 184 };
184 185
185 186 struct TMHeader_str
186 187 {
187 188 volatile unsigned char targetLogicalAddress;
188 189 volatile unsigned char protocolIdentifier;
189 190 volatile unsigned char reserved;
190 191 volatile unsigned char userApplication;
191 192 volatile unsigned char packetID[2];
192 193 volatile unsigned char packetSequenceControl[2];
193 194 volatile unsigned char packetLength[2];
194 195 // DATA FIELD HEADER
195 196 volatile unsigned char spare1_pusVersion_spare2;
196 197 volatile unsigned char serviceType;
197 198 volatile unsigned char serviceSubType;
198 199 volatile unsigned char destinationID;
199 200 volatile unsigned char time[6];
200 201 };
201 202 typedef struct TMHeader_str TMHeader_t;
202 203
203 204 struct Packet_TM_LFR_TC_EXE_str
204 205 {
205 206 volatile unsigned char targetLogicalAddress;
206 207 volatile unsigned char protocolIdentifier;
207 208 volatile unsigned char reserved;
208 209 volatile unsigned char userApplication;
209 210 volatile unsigned char packetID[2];
210 211 volatile unsigned char packetSequenceControl[2];
211 212 volatile unsigned char packetLength[2];
212 213 // DATA FIELD HEADER
213 214 volatile unsigned char spare1_pusVersion_spare2;
214 215 volatile unsigned char serviceType;
215 216 volatile unsigned char serviceSubType;
216 217 volatile unsigned char destinationID;
217 218 volatile unsigned char time[6];
218 219 volatile unsigned char data[LENGTH_TM_LFR_TC_EXE_MAX - 10 + 1];
219 220 };
220 221 typedef struct Packet_TM_LFR_TC_EXE_str Packet_TM_LFR_TC_EXE_t;
221 222
222 223 struct Header_TM_LFR_SCIENCE_SWF_str
223 224 {
224 225 volatile unsigned char targetLogicalAddress;
225 226 volatile unsigned char protocolIdentifier;
226 227 volatile unsigned char reserved;
227 228 volatile unsigned char userApplication;
228 229 volatile unsigned char packetID[2];
229 230 volatile unsigned char packetSequenceControl[2];
230 231 volatile unsigned char packetLength[2];
231 232 // DATA FIELD HEADER
232 233 volatile unsigned char spare1_pusVersion_spare2;
233 234 volatile unsigned char serviceType;
234 235 volatile unsigned char serviceSubType;
235 236 volatile unsigned char destinationID;
236 237 volatile unsigned char time[6];
237 238 // AUXILIARY HEADER
238 239 volatile unsigned char sid;
239 240 volatile unsigned char hkBIA;
240 241 volatile unsigned char pktCnt;
241 242 volatile unsigned char pktNr;
242 243 volatile unsigned char acquisitionTime[6];
243 244 volatile unsigned char blkNr[2];
244 245 };
245 246 typedef struct Header_TM_LFR_SCIENCE_SWF_str Header_TM_LFR_SCIENCE_SWF_t;
246 247
247 248 struct Header_TM_LFR_SCIENCE_CWF_str
248 249 {
249 250 volatile unsigned char targetLogicalAddress;
250 251 volatile unsigned char protocolIdentifier;
251 252 volatile unsigned char reserved;
252 253 volatile unsigned char userApplication;
253 254 volatile unsigned char packetID[2];
254 255 volatile unsigned char packetSequenceControl[2];
255 256 volatile unsigned char packetLength[2];
256 257 // DATA FIELD HEADER
257 258 volatile unsigned char spare1_pusVersion_spare2;
258 259 volatile unsigned char serviceType;
259 260 volatile unsigned char serviceSubType;
260 261 volatile unsigned char destinationID;
261 262 volatile unsigned char time[6];
262 263 // AUXILIARY DATA HEADER
263 264 volatile unsigned char sid;
264 265 volatile unsigned char hkBIA;
265 266 volatile unsigned char acquisitionTime[6];
266 267 volatile unsigned char blkNr[2];
267 268 };
268 269 typedef struct Header_TM_LFR_SCIENCE_CWF_str Header_TM_LFR_SCIENCE_CWF_t;
269 270
270 271 struct Header_TM_LFR_SCIENCE_ASM_str
271 272 {
272 273 volatile unsigned char targetLogicalAddress;
273 274 volatile unsigned char protocolIdentifier;
274 275 volatile unsigned char reserved;
275 276 volatile unsigned char userApplication;
276 277 volatile unsigned char packetID[2];
277 278 volatile unsigned char packetSequenceControl[2];
278 279 volatile unsigned char packetLength[2];
279 280 // DATA FIELD HEADER
280 281 volatile unsigned char spare1_pusVersion_spare2;
281 282 volatile unsigned char serviceType;
282 283 volatile unsigned char serviceSubType;
283 284 volatile unsigned char destinationID;
284 285 volatile unsigned char time[6];
285 286 // AUXILIARY HEADER
286 287 volatile unsigned char sid;
287 288 volatile unsigned char biaStatusInfo;
288 289 volatile unsigned char cntASM;
289 290 volatile unsigned char nrASM;
290 291 volatile unsigned char acquisitionTime[6];
291 292 volatile unsigned char blkNr[2];
292 293 };
293 294 typedef struct Header_TM_LFR_SCIENCE_ASM_str Header_TM_LFR_SCIENCE_ASM_t;
294 295
295 296 struct ccsdsTelecommandPacket_str
296 297 {
297 298 //unsigned char targetLogicalAddress; // removed by the grspw module
298 299 volatile unsigned char protocolIdentifier;
299 300 volatile unsigned char reserved;
300 301 volatile unsigned char userApplication;
301 302 volatile unsigned char packetID[2];
302 303 volatile unsigned char packetSequenceControl[2];
303 304 volatile unsigned char packetLength[2];
304 305 // DATA FIELD HEADER
305 306 volatile unsigned char headerFlag_pusVersion_Ack;
306 307 volatile unsigned char serviceType;
307 308 volatile unsigned char serviceSubType;
308 309 volatile unsigned char sourceID;
309 310 volatile unsigned char dataAndCRC[CCSDS_TC_PKT_MAX_SIZE-10];
310 311 };
311 312 typedef struct ccsdsTelecommandPacket_str ccsdsTelecommandPacket_t;
312 313
313 314 struct Packet_TM_LFR_HK_str
314 315 {
315 316 volatile unsigned char targetLogicalAddress;
316 317 volatile unsigned char protocolIdentifier;
317 318 volatile unsigned char reserved;
318 319 volatile unsigned char userApplication;
319 320 volatile unsigned char packetID[2];
320 321 volatile unsigned char packetSequenceControl[2];
321 322 volatile unsigned char packetLength[2];
322 323 volatile unsigned char dataFieldHeader[10];
323 324 volatile unsigned char sid;
324 325
325 326 //**************
326 327 // HK PARAMETERS
327 328 unsigned char lfr_status_word[2];
328 329 unsigned char lfr_sw_version[4];
329 330 // tc statistics
330 331 unsigned char hk_lfr_update_info_tc_cnt[2];
331 332 unsigned char hk_lfr_update_time_tc_cnt[2];
332 333 unsigned char hk_dpu_exe_tc_lfr_cnt[2];
333 334 unsigned char hk_dpu_rej_tc_lfr_cnt[2];
334 335 unsigned char hk_lfr_last_exe_tc_id[2];
335 336 unsigned char hk_lfr_last_exe_tc_type[2];
336 337 unsigned char hk_lfr_last_exe_tc_subtype[2];
337 338 unsigned char hk_lfr_last_exe_tc_time[6];
338 339 unsigned char hk_lfr_last_rej_tc_id[2];
339 340 unsigned char hk_lfr_last_rej_tc_type[2];
340 341 unsigned char hk_lfr_last_rej_tc_subtype[2];
341 342 unsigned char hk_lfr_last_rej_tc_time[6];
342 343 // anomaly statistics
343 344 unsigned char hk_lfr_le_cnt[2];
344 345 unsigned char hk_lfr_me_cnt[2];
345 346 unsigned char hk_lfr_he_cnt[2];
346 347 unsigned char hk_lfr_last_er_rid[2];
347 348 unsigned char hk_lfr_last_er_code;
348 349 unsigned char hk_lfr_last_er_time[6];
349 350 // vhdl_blk_status
350 351 unsigned char hk_lfr_vhdl_aa_sm;
351 352 unsigned char hk_lfr_vhdl_fft_sr;
352 353 unsigned char hk_lfr_vhdl_cic_hk;
353 354 unsigned char hk_lfr_vhdl_iir_cal;
354 355 // spacewire_if_statistics
355 356 unsigned char hk_lfr_dpu_spw_pkt_rcv_cnt[2];
356 357 unsigned char hk_lfr_dpu_spw_pkt_sent_cnt[2];
357 358 unsigned char hk_lfr_dpu_spw_tick_out_cnt;
358 359 unsigned char hk_lfr_dpu_spw_last_timc;
359 360 // ahb error statistics
360 361 unsigned int hk_lfr_last_fail_addr;
361 362 // temperatures
362 363 unsigned char hk_lfr_temp_scm[2];
363 364 unsigned char hk_lfr_temp_pcb[2];
364 365 unsigned char hk_lfr_temp_fpga[2];
365 366 // error counters
366 367 unsigned char hk_lfr_dpu_spw_parity;
367 368 unsigned char hk_lfr_dpu_spw_disconnect;
368 369 unsigned char hk_lfr_dpu_spw_escape;
369 370 unsigned char hk_lfr_dpu_spw_credit;
370 371 unsigned char hk_lfr_dpu_spw_write_sync;
371 372 unsigned char hk_lfr_dpu_spw_rx_ahb;
372 373 unsigned char hk_lfr_dpu_spw_tx_ahb;
373 374 unsigned char hk_lfr_dpu_spw_header_crc;
374 375 unsigned char hk_lfr_dpu_spw_data_crc;
375 376 unsigned char hk_lfr_dpu_spw_early_eop;
376 377 unsigned char hk_lfr_dpu_spw_invalid_addr;
377 378 unsigned char hk_lfr_dpu_spw_eep;
378 379 unsigned char hk_lfr_dpu_spw_rx_too_big;
379 380 // timecode
380 381 unsigned char hk_lfr_timecode_erroneous;
381 382 unsigned char hk_lfr_timecode_missing;
382 383 unsigned char hk_lfr_timecode_invalid;
383 384 // time
384 385 unsigned char hk_lfr_time_timecode_it;
385 386 unsigned char hk_lfr_time_not_synchro;
386 387 unsigned char hk_lfr_time_timecode_ctr;
387 388 // hk_lfr_buffer_dpu_
388 389 unsigned char hk_lfr_buffer_dpu_tc_fifo;
389 390 unsigned char hk_lfr_buffer_dpu_tm_fifo;
390 391 // hk_lfr_ahb_
391 392 unsigned char hk_lfr_ahb_correctable;
392 393 unsigned char hk_lfr_ahb_uncorrectable;
393 394 unsigned char hk_lfr_ahb_fails_trans;
394 395 // hk_lfr_adc_
395 396 unsigned char hk_lfr_adc_failure;
396 397 unsigned char hk_lfr_adc_timeout;
397 398 unsigned char hk_lfr_toomany_err;
398 399 // hk_lfr_cpu_
399 400 unsigned char hk_lfr_cpu_write_err;
400 401 unsigned char hk_lfr_cpu_ins_access_err;
401 402 unsigned char hk_lfr_cpu_illegal_ins;
402 403 unsigned char hk_lfr_cpu_privilegied_ins;
403 404 unsigned char hk_lfr_cpu_register_hw;
404 405 unsigned char hk_lfr_cpu_not_aligned;
405 406 unsigned char hk_lfr_cpu_data_exception;
406 407 unsigned char hk_lfr_cpu_div_exception;
407 408 unsigned char hk_lfr_cpu_arith_overflow;
408 409 };
409 410 typedef struct Packet_TM_LFR_HK_str Packet_TM_LFR_HK_t;
410 411
411 412 struct Packet_TM_LFR_PARAMETER_DUMP_str
412 413 {
413 414 volatile unsigned char targetLogicalAddress;
414 415 volatile unsigned char protocolIdentifier;
415 416 volatile unsigned char reserved;
416 417 volatile unsigned char userApplication;
417 418 volatile unsigned char packetID[2];
418 419 volatile unsigned char packetSequenceControl[2];
419 420 volatile unsigned char packetLength[2];
420 421 // DATA FIELD HEADER
421 422 volatile unsigned char spare1_pusVersion_spare2;
422 423 volatile unsigned char serviceType;
423 424 volatile unsigned char serviceSubType;
424 425 volatile unsigned char destinationID;
425 426 volatile unsigned char time[6];
426 427 volatile unsigned char sid;
427 428
428 429 //******************
429 430 // COMMON PARAMETERS
430 431 volatile unsigned char unused0;
431 432 volatile unsigned char bw_sp0_sp1_r0_r1;
432 433
433 434 //******************
434 435 // NORMAL PARAMETERS
435 436 volatile unsigned char sy_lfr_n_swf_l[2];
436 437 volatile unsigned char sy_lfr_n_swf_p[2];
437 438 volatile unsigned char sy_lfr_n_asm_p[2];
438 439 volatile unsigned char sy_lfr_n_bp_p0;
439 440 volatile unsigned char sy_lfr_n_bp_p1;
440 441
441 442 //*****************
442 443 // BURST PARAMETERS
443 444 volatile unsigned char sy_lfr_b_bp_p0;
444 445 volatile unsigned char sy_lfr_b_bp_p1;
445 446
446 447 //****************
447 448 // SBM1 PARAMETERS
448 449 volatile unsigned char sy_lfr_s1_bp_p0;
449 450 volatile unsigned char sy_lfr_s1_bp_p1;
450 451
451 452 //****************
452 453 // SBM2 PARAMETERS
453 454 volatile unsigned char sy_lfr_s2_bp_p0;
454 455 volatile unsigned char sy_lfr_s2_bp_p1;
455 456 };
456 457 typedef struct Packet_TM_LFR_PARAMETER_DUMP_str Packet_TM_LFR_PARAMETER_DUMP_t;
457 458
458 459
459 460 #endif // CCSDS_H_INCLUDED
@@ -1,159 +1,164
1 1 #ifndef FSW_RTEMS_CONFIG_H_INCLUDED
2 2 #define FSW_RTEMS_CONFIG_H_INCLUDED
3 3
4 4 #include <fsw_params_processing.h>
5 5
6 6 #define GRSPW_DEVICE_NAME "/dev/grspw0"
7 7 #define UART_DEVICE_NAME "/dev/console"
8 8
9 9 //************************
10 10 // flight software version
11 11 // this parameters is handled by the Qt project options
12 12
13 13 //**********
14 14 // LFR MODES
15 15 #define LFR_MODE_STANDBY 0
16 16 #define LFR_MODE_NORMAL 1
17 17 #define LFR_MODE_BURST 2
18 18 #define LFR_MODE_SBM1 3
19 19 #define LFR_MODE_SBM2 4
20 #define LFR_MODE_NORMAL_CWF_F3 5
20 21
21 22 #define RTEMS_EVENT_MODE_STANDBY RTEMS_EVENT_0
22 23 #define RTEMS_EVENT_MODE_NORMAL RTEMS_EVENT_1
23 24 #define RTEMS_EVENT_MODE_BURST RTEMS_EVENT_2
24 25 #define RTEMS_EVENT_MODE_SBM1 RTEMS_EVENT_3
25 26 #define RTEMS_EVENT_MODE_SBM2 RTEMS_EVENT_4
27 #define RTEMS_EVENT_MODE_NORMAL_CWF_F3 RTEMS_EVENT_5
26 28
27 29 //****************************
28 30 // LFR DEFAULT MODE PARAMETERS
29 31 // COMMON
30 32 #define DEFAULT_SY_LFR_COMMON0 0x00
31 33 #define DEFAULT_SY_LFR_COMMON1 0x10 // default value 0 0 0 1 0 0 0 0
32 34 // NORM
33 35 #define DEFAULT_SY_LFR_N_SWF_L 2048 // nb sample
34 36 #define DEFAULT_SY_LFR_N_SWF_P 16 // sec
35 #define DEFAULT_SY_LFR_N_ASM_P 16 // sec
37 #define DEFAULT_SY_LFR_N_ASM_P 16 // sec
36 38 #define DEFAULT_SY_LFR_N_BP_P0 4 // sec
37 39 #define DEFAULT_SY_LFR_N_BP_P1 20 // sec
40 #define MIN_DELTA_SNAPSHOT 16 // sec
38 41 // BURST
39 42 #define DEFAULT_SY_LFR_B_BP_P0 1 // sec
40 43 #define DEFAULT_SY_LFR_B_BP_P1 5 // sec
41 44 // SBM1
42 45 #define DEFAULT_SY_LFR_S1_BP_P0 1 // sec
43 46 #define DEFAULT_SY_LFR_S1_BP_P1 1 // sec
44 47 // SBM2
45 48 #define DEFAULT_SY_LFR_S2_BP_P0 1 // sec
46 49 #define DEFAULT_SY_LFR_S2_BP_P1 5 // sec
47 50
48 51 //*****************************
49 52 // APB REGISTERS BASE ADDRESSES
50 53 #define REGS_ADDR_APBUART 0x80000100
51 54 #define REGS_ADDR_GPTIMER 0x80000300
52 55 #define REGS_ADDR_GRSPW 0x80000500
53 56 #define REGS_ADDR_TIME_MANAGEMENT 0x80000600
54 57 #define REGS_ADDR_SPECTRAL_MATRIX 0x80000f00
55 58
56 59 #ifdef GSA
57 60 #else
58 61 #define REGS_ADDR_WAVEFORM_PICKER 0x80000f20
59 62 #endif
60 63
61 64 #define APBUART_CTRL_REG_MASK_DB 0xfffff7ff
62 65 #define APBUART_SCALER_RELOAD_VALUE 0x00000050 // 25 MHz => about 38400 (0x50)
63 66
64 67 //**********
65 68 // IRQ LINES
66 69 #define IRQ_SM 9
67 70 #define IRQ_SPARC_SM 0x19 // see sparcv8.pdf p.76 for interrupt levels
68 71 #define IRQ_WF 10
69 72 #define IRQ_SPARC_WF 0x1a // see sparcv8.pdf p.76 for interrupt levels
70 73 #define IRQ_TIME1 12
71 74 #define IRQ_SPARC_TIME1 0x1c // see sparcv8.pdf p.76 for interrupt levels
72 75 #define IRQ_TIME2 13
73 76 #define IRQ_SPARC_TIME2 0x1d // see sparcv8.pdf p.76 for interrupt levels
74 77 #define IRQ_WAVEFORM_PICKER 14
75 78 #define IRQ_SPARC_WAVEFORM_PICKER 0x1e // see sparcv8.pdf p.76 for interrupt levels
76 79 #define IRQ_SPECTRAL_MATRIX 6
77 80 #define IRQ_SPARC_SPECTRAL_MATRIX 0x16 // see sparcv8.pdf p.76 for interrupt levels
78 81
79 82 //*****
80 83 // TIME
81 84 #define CLKDIV_SM_SIMULATOR (10000 - 1) // 10 ms
82 85 #define CLKDIV_WF_SIMULATOR (10000000 - 1) // 10 000 000 * 1 us = 10 s
83 86 #define TIMER_SM_SIMULATOR 1
84 87 #define TIMER_WF_SIMULATOR 2
85 88 #define HK_PERIOD 100 // 100 * 10ms => 1sec
86 89
87 90 //**********
88 91 // LPP CODES
89 92 #define LFR_SUCCESSFUL 0
90 93 #define LFR_DEFAULT 1
91 94
92 95 //******
93 96 // RTEMS
94 97 #define TASKID_RECV 1
95 98 #define TASKID_ACTN 2
96 99 #define TASKID_SPIQ 3
97 100 #define TASKID_SMIQ 4
98 101 #define TASKID_STAT 5
99 102 #define TASKID_AVF0 6
100 103 #define TASKID_BPF0 7
101 104 #define TASKID_WFRM 8
102 105 #define TASKID_DUMB 9
103 106 #define TASKID_HOUS 10
104 107 #define TASKID_MATR 11
108 #define TASKID_CWF3 12
105 109
106 110 #define ACTION_MSG_QUEUE_COUNT 10
107 111
108 112 //*******
109 113 // MACROS
110 114 #ifdef PRINT_MESSAGES_ON_CONSOLE
111 115 #define PRINTF(x) printf(x);
112 116 #define PRINTF1(x,y) printf(x,y);
113 117 #define PRINTF2(x,y,z) printf(x,y,z);
114 118 #else
115 119 #define PRINTF(x) ;
116 120 #define PRINTF1(x,y) ;
117 121 #define PRINTF2(x,y,z) ;
118 122 #endif
119 123
120 124 #define NB_SAMPLES_PER_SNAPSHOT 2048
121 125 #define TIME_OFFSET 2
122 126 #define WAVEFORM_EXTENDED_HEADER_OFFSET 22
123 127 #define NB_BYTES_SWF_BLK 2 * 6
124 128 #define NB_WORDS_SWF_BLK 3
125 129
126 130 //******************
127 131 // SEQUENCE COUNTERS
128 132 #define SEQ_CNT_NB_PID 2
129 133 #define SEQ_CNT_NB_CAT 4
130 134 #define SEQ_CNT_NB_DEST_ID 11
131 135 // pid
132 136 #define SEQ_CNT_PID_76 0
133 137 #define SEQ_CNT_PID_79 1
134 138 //cat
135 139 #define SEQ_CNT_CAT_1 0
136 140 #define SEQ_CNT_CAT_4 1
137 141 #define SEQ_CNT_CAT_9 2
138 142 #define SEQ_CNT_CAT_12 3
139 143 // destination id
140 144 #define SEQ_CNT_DST_ID_GROUND 0
141 145 #define SEQ_CNT_DST_ID_MISSION_TIMELINE 1
142 146 #define SEQ_CNT_DST_ID_TC_SEQUENCES 2
143 147 #define SEQ_CNT_DST_ID_RECOVERY_ACTION_CMD 3
144 148 #define SEQ_CNT_DST_ID_BACKUP_MISSION_TIMELINE 4
145 149 #define SEQ_CNT_DST_ID_DIRECT_CMD 5
146 150 #define SEQ_CNT_DST_ID_SPARE_GRD_SRC1 6
147 151 #define SEQ_CNT_DST_ID_SPARE_GRD_SRC2 7
148 152 #define SEQ_CNT_DST_ID_OBCP 8
149 153 #define SEQ_CNT_DST_ID_SYSTEM_CONTROL 9
150 154 #define SEQ_CNT_DST_ID_AOCS 10
151 155
152 156 struct param_local_str{
153 157 unsigned int local_sbm1_nb_cwf_sent;
154 158 unsigned int local_sbm1_nb_cwf_max;
155 159 unsigned int local_sbm2_nb_cwf_sent;
156 160 unsigned int local_sbm2_nb_cwf_max;
161 unsigned int local_nb_interrupt_f0_MAX;
157 162 };
158 163
159 164 #endif // FSW_RTEMS_CONFIG_H_INCLUDED
@@ -1,26 +1,27
1 1 #ifndef FSW_PARAMS_PROCESSING_H
2 2 #define FSW_PARAMS_PROCESSING_H
3 3
4 4 #define NB_BINS_PER_SM 128
5 5 #define NB_VALUES_PER_SM 25
6 6 #define TOTAL_SIZE_SM (NB_BINS_PER_SM * NB_VALUES_PER_SM)
7 #define SM_HEADER 4
7 8
8 9 #define NB_BINS_COMPRESSED_SM_F0 11
9 10 #define NB_BINS_COMPRESSED_SM_F1 13
10 11 #define NB_BINS_COMPRESSED_SM_F2 12
11 12 #define TOTAL_SIZE_COMPRESSED_MATRIX_f0 (NB_BINS_COMPRESSED_SM_F0 * NB_VALUES_PER_SM)
12 13 #define NB_AVERAGE_NORMAL_f0 96*4
13 14 #define NB_SM_TO_RECEIVE_BEFORE_AVF0 8
14 15
15 16 struct BP1_str{
16 17 volatile unsigned char PE[2];
17 18 volatile unsigned char PB[2];
18 19 volatile unsigned char V0;
19 20 volatile unsigned char V1;
20 21 volatile unsigned char V2_ELLIP_DOP;
21 22 volatile unsigned char SZ;
22 23 volatile unsigned char VPHI;
23 24 };
24 25 typedef struct BP1_str BP1_t;
25 26
26 27 #endif // FSW_PARAMS_PROCESSING_H
@@ -1,55 +1,67
1 1 #ifndef FSW_RTEMS_PROCESSING_H_INCLUDED
2 2 #define FSW_RTEMS_PROCESSING_H_INCLUDED
3 3
4 4 #include <rtems.h>
5 5 #include <grspw.h>
6 6 #include <leon.h>
7 7
8 8 #include <fsw_init.h>
9 9 #include <fsw_params.h>
10 10 #include <grlib_regs.h>
11 11 #include <ccsds_types.h>
12 12
13 13 #include <stdio.h>
14 14 #include <stdlib.h>
15 15
16 extern volatile int spec_mat_f0_a[ ];
17 extern volatile int spec_mat_f0_b[ ];
16 extern volatile int spec_mat_f0_0[ ];
17 extern volatile int spec_mat_f0_1[ ];
18 18 extern volatile int spec_mat_f0_c[ ];
19 19 extern volatile int spec_mat_f0_d[ ];
20 20 extern volatile int spec_mat_f0_e[ ];
21 21 extern volatile int spec_mat_f0_f[ ];
22 22 extern volatile int spec_mat_f0_g[ ];
23 23 extern volatile int spec_mat_f0_h[ ];
24 24
25 extern volatile int spec_mat_f1[ ];
26 extern volatile int spec_mat_f2[ ];
27
28 extern volatile int spec_mat_f1_bis[ ];
29 extern volatile int spec_mat_f2_bis[ ];
30 extern volatile int spec_mat_f0_0_bis[ ];
31 extern volatile int spec_mat_f0_1_bis[ ];
32
25 33 extern rtems_id Task_id[ ]; /* array of task ids */
26 34
35 // parameters
36 extern struct param_local_str param_local;
37
38 // registers
27 39 extern time_management_regs_t *time_management_regs;
28 40 extern spectral_matrix_regs_t *spectral_matrix_regs;
29 41
30 42 // ISR
31 43 rtems_isr spectral_matrices_isr( rtems_vector_number vector );
32 44
33 45 // RTEMS TASKS
34 46 rtems_task spw_bppr_task(rtems_task_argument argument);
35 47 rtems_task avf0_task(rtems_task_argument argument);
36 48 rtems_task bpf0_task(rtems_task_argument argument);
37 49 rtems_task smiq_task(rtems_task_argument argument); // added to test the spectral matrix simulator
38 50 rtems_task matr_task(rtems_task_argument argument);
39 51
40 52 rtems_task spw_bppr_task_rate_monotonic(rtems_task_argument argument);
41 53
42 54 void matrix_average(volatile int *spec_mat, volatile float *averaged_spec_mat);
43 55 void matrix_compression(volatile float *averaged_spec_mat, unsigned char fChannel, float *compressed_spec_mat);
44 56 void matrix_reset(volatile float *averaged_spec_mat);
45 57 void BP1_set(float * compressed_spec_mat, unsigned char nb_bins_compressed_spec_mat, unsigned char * LFR_BP1);
46 58 void BP2_set(float * compressed_spec_mat, unsigned char nb_bins_compressed_spec_mat);
47 59 //
48 60 void init_header_asm( Header_TM_LFR_SCIENCE_ASM_t *header);
49 61 void send_spectral_matrix(Header_TM_LFR_SCIENCE_ASM_t *header, char *spectral_matrix,
50 62 unsigned int sid, spw_ioctl_pkt_send *spw_ioctl_send);
51 63 void convert_averaged_spectral_matrix(volatile float *input_matrix, char *output_matrix);
52 void init_averaged_spectral_matrix();
64 void fill_averaged_spectral_matrix();
53 65 void reset_spectral_matrix_regs();
54 66
55 67 #endif // FSW_RTEMS_PROCESSING_H_INCLUDED
@@ -1,88 +1,90
1 1 #ifndef TC_HANDLER_H_INCLUDED
2 2 #define TC_HANDLER_H_INCLUDED
3 3
4 4 #include <rtems.h>
5 5 #include <bsp.h> // for the LEON_Unmask_interrupt function
6 6 #include <stdio.h>
7 7 #include <unistd.h> // for the read call
8 8 #include <sys/ioctl.h> // for the ioctl call
9 9 #include <ccsds_types.h>
10 10 #include <grspw.h>
11 11 #include <fsw_init.h>
12 12
13 13 extern int fdSPW;
14 14 extern rtems_name misc_name[ ];
15 15 extern rtems_name misc_id[ ];
16 16 extern rtems_id Task_id[ ]; // array of task ids
17 17 // MODE PARAMETERS
18 18 extern struct param_sbm1_str param_sbm1;
19 19 extern struct param_sbm2_str param_sbm2;
20 20 extern Packet_TM_LFR_PARAMETER_DUMP_t parameter_dump_packet;
21 21 extern Packet_TM_LFR_HK_t housekeeping_packet;
22 22 extern time_management_regs_t *time_management_regs;
23 23 extern waveform_picker_regs_t *waveform_picker_regs;
24 24 extern gptimer_regs_t *gptimer_regs;
25 25
26 26 //****
27 27 // ISR
28 28 rtems_isr commutation_isr1( rtems_vector_number vector );
29 29 rtems_isr commutation_isr2( rtems_vector_number vector );
30 30
31 31 //**********************
32 32 // GENERAL USE FUNCTIONS
33 33 void initLookUpTableForCRC( void );
34 34 void GetCRCAsTwoBytes(unsigned char* data, unsigned char* crcAsTwoBytes, unsigned int sizeOfData);
35 35
36 36 //*********************
37 37 // ACCEPTANCE FUNCTIONS
38 38 int TC_acceptance(ccsdsTelecommandPacket_t *TC, unsigned int TC_LEN_RCV);
39 39 unsigned char TC_parser(ccsdsTelecommandPacket_t * TMPacket, unsigned int TC_LEN_RCV);
40 40
41 41 unsigned char TM_build_header( enum TM_TYPE tm_type, unsigned int packetLength,
42 42 TMHeader_t *TMHeader, unsigned char tc_sid);
43 43 unsigned char TM_build_data(ccsdsTelecommandPacket_t *TC, char* data, unsigned int SID, unsigned char *computed_CRC);
44 44
45 45 //***********
46 46 // RTEMS TASK
47 47 rtems_task recv_task( rtems_task_argument unused );
48 48 rtems_task actn_task( rtems_task_argument unused );
49 49 rtems_task dumb_task( rtems_task_argument unused );
50 50 int create_message_queue( void );
51 51
52 52 //***********
53 53 // TC ACTIONS
54 54 int action_default(ccsdsTelecommandPacket_t *TC);
55 55 int action_enter(ccsdsTelecommandPacket_t *TC);
56 56 int action_updt_info(ccsdsTelecommandPacket_t *TC);
57 57 int action_enable_calibration(ccsdsTelecommandPacket_t *TC);
58 58 int action_disable_calibration(ccsdsTelecommandPacket_t *TC);
59 59 int action_updt_time(ccsdsTelecommandPacket_t *TC);
60 60 // mode transition
61 61 int transition_validation(unsigned char requestedMode);
62 62 int stop_current_mode();
63 63 int enter_mode(unsigned char mode, ccsdsTelecommandPacket_t *TC);
64 64 int enter_standby_mode(ccsdsTelecommandPacket_t *TC);
65 65 int enter_normal_mode(ccsdsTelecommandPacket_t *TC);
66 66 int enter_burst_mode(ccsdsTelecommandPacket_t *TC);
67 67 int enter_sbm1_mode(ccsdsTelecommandPacket_t *TC);
68 68 int enter_sbm2_mode(ccsdsTelecommandPacket_t *TC);
69 int restart_science_tasks();
70 int suspend_science_tasks();
69 71 // parameters loading
70 72 int action_load_comm(ccsdsTelecommandPacket_t *TC);
71 73 int action_load_norm(ccsdsTelecommandPacket_t *TC);
72 74 int action_load_burst(ccsdsTelecommandPacket_t *TC);
73 75 int action_load_sbm1(ccsdsTelecommandPacket_t *TC);
74 76 int action_load_sbm2(ccsdsTelecommandPacket_t *TC);
75 77 int action_dump(ccsdsTelecommandPacket_t *TC);
76 78 // other functions
77 79 void update_last_TC_exe(ccsdsTelecommandPacket_t *TC);
78 80 void update_last_TC_rej(ccsdsTelecommandPacket_t *TC);
79 81 void close_action(ccsdsTelecommandPacket_t *TC, int result);
80 82 int send_tm_lfr_tc_exe_success(ccsdsTelecommandPacket_t *TC);
81 83 int send_tm_lfr_tc_exe_not_executable(ccsdsTelecommandPacket_t *TC);
82 84 int send_tm_lfr_tc_exe_not_implemented(ccsdsTelecommandPacket_t *TC);
83 85 int send_tm_lfr_tc_exe_error(ccsdsTelecommandPacket_t *TC);
84 86
85 87 #endif // TC_HANDLER_H_INCLUDED
86 88
87 89
88 90
@@ -1,55 +1,66
1 1 #ifndef WF_HANDLER_H_INCLUDED
2 2 #define WF_HANDLER_H_INCLUDED
3 3
4 4 #include <rtems.h>
5 5 #include <fsw_params.h>
6 6 #include <grspw.h>
7 7 #include <grlib_regs.h>
8 8 #include <ccsds_types.h>
9 9 #include <stdio.h>
10 10 #include <fsw_init.h>
11 11 #include <math.h>
12 12
13 13 #define pi 3.1415
14 14
15 15 //#include <sys/ioctl.h>
16 16
17 17 extern rtems_id Task_id[]; /* array of task ids */
18 18 extern int fdSPW;
19 19 extern volatile int wf_snap_f0[ ];
20 20 extern volatile int wf_snap_f1[ ];
21 21 extern volatile int wf_snap_f1_bis[ ];
22 22 extern volatile int wf_snap_f2[ ];
23 23 extern volatile int wf_snap_f2_bis[ ];
24 24 extern volatile int wf_cont_f3[ ];
25 extern volatile int wf_cont_f3_bis[ ];
25 26 extern waveform_picker_regs_t *waveform_picker_regs;
26 27
27 28 rtems_isr waveforms_isr( rtems_vector_number vector );
28 29 rtems_isr waveforms_simulator_isr( rtems_vector_number vector );
29 30 rtems_task wfrm_task(rtems_task_argument argument);
31 rtems_task cwf3_task(rtems_task_argument argument);
30 32
31 33 //******************
32 34 // general functions
33 35 void init_waveforms( void );
34 36 void init_header_snapshot_wf( Header_TM_LFR_SCIENCE_SWF_t *header );
35 37 void init_header_continuous_wf( Header_TM_LFR_SCIENCE_CWF_t *header );
36 38 void reset_waveforms( void );
37 void send_waveform_norm(Header_TM_LFR_SCIENCE_SWF_t *header, spw_ioctl_pkt_send *spw_ioctl_send);
38 void send_waveform_burst(Header_TM_LFR_SCIENCE_CWF_t *header, spw_ioctl_pkt_send *spw_ioctl_send);
39 void send_waveform_sbm1(Header_TM_LFR_SCIENCE_CWF_t *header, spw_ioctl_pkt_send *spw_ioctl_send);
40 void send_waveform_sbm2(Header_TM_LFR_SCIENCE_CWF_t *header, spw_ioctl_pkt_send *spw_ioctl_send);
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
41 45 void send_waveform_SWF( Header_TM_LFR_SCIENCE_SWF_t *header, volatile int *waveform,
42 unsigned int sid, spw_ioctl_pkt_send *spw_ioctl_send);
46 unsigned int sid, spw_ioctl_pkt_send *spw_ioctl_send );
43 47 void send_waveform_CWF( Header_TM_LFR_SCIENCE_CWF_t *header, volatile int *waveform,
44 unsigned int sid, spw_ioctl_pkt_send *spw_ioctl_send);
48 unsigned int sid, spw_ioctl_pkt_send *spw_ioctl_send );
45 49
46 50 //**************
47 51 // wfp registers
48 void set_wfp_data_shaping(unsigned char data_shaping);
49 void set_wfp_delta_snapshot(unsigned int delta_snapshot);
52 void set_wfp_data_shaping();
53 char set_wfp_delta_snapshot();
54 void set_wfp_burst_enable_register( unsigned char mode);
50 55 void reset_wfp_burst_enable();
51 56 void reset_waveform_picker_regs();
52 //
53 int build_value(int value1, int value0);
57
58 //*****************
59 // local parameters
60 void set_local_sbm1_nb_cwf_max();
61 void set_local_sbm2_nb_cwf_max();
62 void set_local_nb_interrupt_f0_MAX();
63 void reset_local_sbm1_nb_cwf_sent();
64 void reset_local_sbm2_nb_cwf_sent();
54 65
55 66 #endif // WF_HANDLER_H_INCLUDED
@@ -1,61 +1,63
1 1 //#include <fsw_processing.h>
2 2 #include <rtems.h>
3 3 #include <grspw.h>
4 4 #include <ccsds_types.h>
5 5 #include <grlib_regs.h>
6 6 #include <fsw_params.h>
7 7
8 8 // RTEMS GLOBAL VARIABLES
9 9 rtems_name misc_name[5];
10 10 rtems_name misc_id[5];
11 11 rtems_id Task_id[15]; /* array of task ids */
12 12 rtems_name Task_name[15]; /* array of task names */
13 13 int fdSPW = 0;
14 14 int fdUART = 0;
15 15
16 16 // APB CONFIGURATION REGISTERS
17 17 time_management_regs_t *time_management_regs = (time_management_regs_t*) REGS_ADDR_TIME_MANAGEMENT;
18 18 gptimer_regs_t *gptimer_regs = (gptimer_regs_t *) REGS_ADDR_GPTIMER;
19 19 #ifdef GSA
20 20 #else
21 21 waveform_picker_regs_t *waveform_picker_regs = (waveform_picker_regs_t*) REGS_ADDR_WAVEFORM_PICKER;
22 22 #endif
23 23 spectral_matrix_regs_t *spectral_matrix_regs = (spectral_matrix_regs_t*) REGS_ADDR_SPECTRAL_MATRIX;
24 24
25 25 // WAVEFORMS GLOBAL VARIABLES // 2048 * 3 * 4 + 2 * 4 = 24576 + 8 bytes
26 26 volatile int wf_snap_f0[ NB_SAMPLES_PER_SNAPSHOT * NB_WORDS_SWF_BLK + TIME_OFFSET];
27 27 volatile int wf_snap_f1[ NB_SAMPLES_PER_SNAPSHOT * NB_WORDS_SWF_BLK + TIME_OFFSET];
28 28 volatile int wf_snap_f1_bis[ NB_SAMPLES_PER_SNAPSHOT * NB_WORDS_SWF_BLK + TIME_OFFSET];
29 29 volatile int wf_snap_f2[ NB_SAMPLES_PER_SNAPSHOT * NB_WORDS_SWF_BLK + TIME_OFFSET];
30 30 volatile int wf_snap_f2_bis[ NB_SAMPLES_PER_SNAPSHOT * NB_WORDS_SWF_BLK + TIME_OFFSET];
31 31 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];
32 33
33 34 // SPECTRAL MATRICES GLOBAL VARIABLES
34 volatile int spec_mat_f0_a[ TOTAL_SIZE_SM ];
35 volatile int spec_mat_f0_b[ TOTAL_SIZE_SM ];
36 volatile int spec_mat_f0_c[ TOTAL_SIZE_SM ];
37 volatile int spec_mat_f0_d[ TOTAL_SIZE_SM ];
38 volatile int spec_mat_f0_e[ TOTAL_SIZE_SM ];
39 volatile int spec_mat_f0_f[ TOTAL_SIZE_SM ];
40 volatile int spec_mat_f0_g[ TOTAL_SIZE_SM ];
41 volatile int spec_mat_f0_h[ TOTAL_SIZE_SM ];
35 volatile int spec_mat_f0_0[ SM_HEADER + TOTAL_SIZE_SM ];
36 volatile int spec_mat_f0_1[ SM_HEADER + TOTAL_SIZE_SM ];
37 volatile int spec_mat_f0_c[ SM_HEADER + TOTAL_SIZE_SM ];
38 volatile int spec_mat_f0_d[ SM_HEADER + TOTAL_SIZE_SM ];
39 volatile int spec_mat_f0_e[ SM_HEADER + TOTAL_SIZE_SM ];
40 volatile int spec_mat_f0_f[ SM_HEADER + TOTAL_SIZE_SM ];
41 volatile int spec_mat_f0_g[ SM_HEADER + TOTAL_SIZE_SM ];
42 volatile int spec_mat_f0_h[ SM_HEADER + TOTAL_SIZE_SM ];
43 volatile int spec_mat_f0_0_bis[ SM_HEADER + TOTAL_SIZE_SM ];
44 volatile int spec_mat_f0_1_bis[ SM_HEADER + TOTAL_SIZE_SM ];
42 45 //
43 volatile int spec_mat_f1_a[ TOTAL_SIZE_SM ];
44 volatile int spec_mat_f2_a[ TOTAL_SIZE_SM ];
46 volatile int spec_mat_f1[ SM_HEADER + TOTAL_SIZE_SM ];
47 volatile int spec_mat_f1_bis[ SM_HEADER + TOTAL_SIZE_SM ];
45 48 //
46 volatile int spec_mat_f0_a_bis[ TOTAL_SIZE_SM ];
47 volatile int spec_mat_f1_a_bis[ TOTAL_SIZE_SM ];
48 volatile int spec_mat_f2_a_bis[ TOTAL_SIZE_SM ];
49 volatile int spec_mat_f2[ SM_HEADER + TOTAL_SIZE_SM ];
50 volatile int spec_mat_f2_bis[ SM_HEADER + TOTAL_SIZE_SM ];
49 51
50 52 // MODE PARAMETERS
51 53 Packet_TM_LFR_PARAMETER_DUMP_t parameter_dump_packet;
52 54 struct param_local_str param_local;
53 55
54 56 // HK PACKETS
55 57 Packet_TM_LFR_HK_t housekeeping_packet;
56 58 // sequence counters are incremented by APID (PID + CAT) and destination ID
57 59 unsigned short sequenceCounters[SEQ_CNT_NB_PID][SEQ_CNT_NB_CAT][SEQ_CNT_NB_DEST_ID];
58 60 spw_stats spacewire_stats;
59 61 spw_stats spacewire_stats_backup;
60 62
61 63
@@ -1,585 +1,590
1 1 //*************************
2 2 // GPL reminder to be added
3 3 //*************************
4 4
5 5 #include <rtems.h>
6 6
7 7 /* configuration information */
8 8
9 9 #define CONFIGURE_INIT
10 10
11 11 #include <bsp.h> /* for device driver prototypes */
12 12
13 13 /* configuration information */
14 14
15 15 #define CONFIGURE_APPLICATION_NEEDS_CONSOLE_DRIVER
16 16 #define CONFIGURE_APPLICATION_NEEDS_CLOCK_DRIVER
17 17
18 18 #define CONFIGURE_MAXIMUM_TASKS 15
19 19 #define CONFIGURE_RTEMS_INIT_TASKS_TABLE
20 20 #define CONFIGURE_EXTRA_TASK_STACKS (3 * RTEMS_MINIMUM_STACK_SIZE)
21 21 #define CONFIGURE_LIBIO_MAXIMUM_FILE_DESCRIPTORS 32
22 22 #define CONFIGURE_INIT_TASK_PRIORITY 100
23 23 #define CONFIGURE_MAXIMUM_DRIVERS 16
24 24 #define CONFIGURE_MAXIMUM_PERIODS 5
25 25 #define CONFIGURE_MAXIMUM_MESSAGE_QUEUES 1
26 26
27 27 #include <rtems/confdefs.h>
28 28
29 29 /* If --drvmgr was enabled during the configuration of the RTEMS kernel */
30 30 #ifdef RTEMS_DRVMGR_STARTUP
31 31 #ifdef LEON3
32 32 /* Add Timer and UART Driver */
33 33 #ifdef CONFIGURE_APPLICATION_NEEDS_CLOCK_DRIVER
34 34 #define CONFIGURE_DRIVER_AMBAPP_GAISLER_GPTIMER
35 35 #endif
36 36 #ifdef CONFIGURE_APPLICATION_NEEDS_CONSOLE_DRIVER
37 37 #define CONFIGURE_DRIVER_AMBAPP_GAISLER_APBUART
38 38 #endif
39 39 #endif
40 40 #define CONFIGURE_DRIVER_AMBAPP_GAISLER_GRSPW /* GRSPW Driver */
41 41 #include <drvmgr/drvmgr_confdefs.h>
42 42 #endif
43 43
44 44 #include <fsw_init.h>
45 45 #include <fsw_config.c>
46 46
47 47 char *lstates[6] = {"Error-reset",
48 48 "Error-wait",
49 49 "Ready",
50 50 "Started",
51 51 "Connecting",
52 52 "Run"
53 53 };
54 54
55 55 rtems_task Init( rtems_task_argument ignored )
56 56 {
57 57 rtems_status_code status;
58 58 rtems_isr_entry old_isr_handler;
59 59
60 60 PRINTF("\n\n\n\n\n")
61 61 PRINTF("***************************\n")
62 62 PRINTF("** START Flight Software **\n")
63 63 PRINTF("***************************\n")
64 64 PRINTF("\n\n")
65 65
66 66 //send_console_outputs_on_apbuart_port();
67 67 set_apbuart_scaler_reload_register(REGS_ADDR_APBUART, APBUART_SCALER_RELOAD_VALUE);
68 68
69 69 initLookUpTableForCRC(); // in tc_handler.h
70 70 init_parameter_dump();
71 71 init_local_mode_parameters();
72 72 init_housekeeping_parameters();
73 73 create_message_queue();
74 74
75 75 create_names(); // create all names
76 76 create_all_tasks(); // create all tasks
77 77 start_all_tasks(); // start all tasks
78 78 stop_current_mode(); // go in STANDBY mode
79 79
80 80 grspw_timecode_callback = &timecode_irq_handler;
81 81
82 82 spacewire_configure_link();
83 83
84 //****************************
84 #ifdef GSA
85 85 // Spectral Matrices simulator
86 86 configure_timer((gptimer_regs_t*) REGS_ADDR_GPTIMER, TIMER_SM_SIMULATOR, CLKDIV_SM_SIMULATOR,
87 87 IRQ_SPARC_SM, spectral_matrices_isr );
88
89 88 //**********
90 89 // WAVEFORMS
91
92 #ifdef GSA
93 // simulator
94 90 configure_timer((gptimer_regs_t*) REGS_ADDR_GPTIMER, TIMER_WF_SIMULATOR, CLKDIV_WF_SIMULATOR,
95 91 IRQ_SPARC_WF, waveforms_simulator_isr );
92 LEON_Mask_interrupt( IRQ_SM );
96 93 LEON_Mask_interrupt( IRQ_WF );
97 94 #else
98 // configure the waveform picker
95 // reset configuration registers
99 96 reset_waveform_picker_regs();
97 reset_spectral_matrix_regs();
98 // configure IRQ handling for the waveform picker unit
100 99 status = rtems_interrupt_catch( waveforms_isr,
101 100 IRQ_SPARC_WAVEFORM_PICKER,
102 101 &old_isr_handler) ;
103 LEON_Mask_interrupt( IRQ_WAVEFORM_PICKER );
104 // configure the spectral matrix
105 reset_spectral_matrix_regs();
106 status = rtems_interrupt_catch( waveforms_isr,
102 // configure IRQ handling for the spectral matrix unit
103 status = rtems_interrupt_catch( spectral_matrices_isr,
107 104 IRQ_SPARC_SPECTRAL_MATRIX,
108 105 &old_isr_handler) ;
106 // mask IRQ lines
107 LEON_Mask_interrupt( IRQ_WAVEFORM_PICKER );
109 108 LEON_Mask_interrupt( IRQ_SPECTRAL_MATRIX );
110 109 #endif
111 110
112 111 //**********
113 112
114 113 status = rtems_task_delete(RTEMS_SELF);
115 114
116 115 }
117 116
118 117 void init_parameter_dump(void)
119 118 {
120 119 parameter_dump_packet.targetLogicalAddress = CCSDS_DESTINATION_ID;
121 120 parameter_dump_packet.protocolIdentifier = CCSDS_PROTOCOLE_ID;
122 121 parameter_dump_packet.reserved = CCSDS_RESERVED;
123 122 parameter_dump_packet.userApplication = CCSDS_USER_APP;
124 123 parameter_dump_packet.packetID[0] = (unsigned char) (TM_PACKET_ID_PARAMETER_DUMP >> 8);
125 124 parameter_dump_packet.packetID[1] = (unsigned char) TM_PACKET_ID_PARAMETER_DUMP;
126 125 parameter_dump_packet.packetSequenceControl[0] = (unsigned char) (TM_PACKET_SEQ_CTRL_STANDALONE << 6);
127 126 parameter_dump_packet.packetSequenceControl[1] = 0x00;
128 127 parameter_dump_packet.packetLength[0] = (unsigned char) (PACKET_LENGTH_PARAMETER_DUMP >> 8);
129 128 parameter_dump_packet.packetLength[1] = (unsigned char) PACKET_LENGTH_PARAMETER_DUMP;
130 129 // DATA FIELD HEADER
131 130 parameter_dump_packet.spare1_pusVersion_spare2 = SPARE1_PUSVERSION_SPARE2;
132 131 parameter_dump_packet.serviceType = TM_TYPE_PARAMETER_DUMP;
133 132 parameter_dump_packet.serviceSubType = TM_SUBTYPE_PARAMETER_DUMP;
134 133 parameter_dump_packet.destinationID = TM_DESTINATION_ID_GROUND;
135 134 parameter_dump_packet.time[0] = (unsigned char) (time_management_regs->coarse_time>>24);
136 135 parameter_dump_packet.time[1] = (unsigned char) (time_management_regs->coarse_time>>16);
137 136 parameter_dump_packet.time[2] = (unsigned char) (time_management_regs->coarse_time>>8);
138 137 parameter_dump_packet.time[3] = (unsigned char) (time_management_regs->coarse_time);
139 138 parameter_dump_packet.time[4] = (unsigned char) (time_management_regs->fine_time>>8);
140 139 parameter_dump_packet.time[5] = (unsigned char) (time_management_regs->fine_time);
141 140 parameter_dump_packet.sid = SID_PARAMETER_DUMP;
142 141
143 142 //******************
144 143 // COMMON PARAMETERS
145 144 parameter_dump_packet.unused0 = DEFAULT_SY_LFR_COMMON0;
146 145 parameter_dump_packet.bw_sp0_sp1_r0_r1 = DEFAULT_SY_LFR_COMMON1;
147 146
148 147 //******************
149 148 // NORMAL PARAMETERS
150 149 parameter_dump_packet.sy_lfr_n_swf_l[0] = (unsigned char) (DEFAULT_SY_LFR_N_SWF_L >> 8);
151 150 parameter_dump_packet.sy_lfr_n_swf_l[1] = (unsigned char) DEFAULT_SY_LFR_N_SWF_L;
152 151 parameter_dump_packet.sy_lfr_n_swf_p[0] = (unsigned char) (DEFAULT_SY_LFR_N_SWF_P >> 8);
153 152 parameter_dump_packet.sy_lfr_n_swf_p[1] = (unsigned char) DEFAULT_SY_LFR_N_SWF_P;
154 153 parameter_dump_packet.sy_lfr_n_asm_p[0] = (unsigned char) (DEFAULT_SY_LFR_N_ASM_P >> 8);
155 154 parameter_dump_packet.sy_lfr_n_asm_p[1] = (unsigned char) DEFAULT_SY_LFR_N_ASM_P;
156 155 parameter_dump_packet.sy_lfr_n_bp_p0 = (unsigned char) DEFAULT_SY_LFR_N_BP_P0;
157 156 parameter_dump_packet.sy_lfr_n_bp_p1 = (unsigned char) DEFAULT_SY_LFR_N_BP_P1;
158 157
159 158 //*****************
160 159 // BURST PARAMETERS
161 160 parameter_dump_packet.sy_lfr_b_bp_p0 = (unsigned char) DEFAULT_SY_LFR_B_BP_P0;
162 161 parameter_dump_packet.sy_lfr_b_bp_p1 = (unsigned char) DEFAULT_SY_LFR_B_BP_P1;
163 162
164 163 //****************
165 164 // SBM1 PARAMETERS
166 parameter_dump_packet.sy_lfr_s1_bp_p0 = (unsigned char) DEFAULT_SY_LFR_S1_BP_P0;
167 parameter_dump_packet.sy_lfr_s1_bp_p1 = (unsigned char) DEFAULT_SY_LFR_S1_BP_P0;
165 parameter_dump_packet.sy_lfr_s1_bp_p0 = (unsigned char) DEFAULT_SY_LFR_S1_BP_P0; // min value is 0.25 s for the period
166 parameter_dump_packet.sy_lfr_s1_bp_p1 = (unsigned char) DEFAULT_SY_LFR_S1_BP_P1;
168 167
169 168 //****************
170 169 // SBM2 PARAMETERS
171 170 parameter_dump_packet.sy_lfr_s2_bp_p0 = (unsigned char) DEFAULT_SY_LFR_S2_BP_P0;
172 parameter_dump_packet.sy_lfr_s2_bp_p1 = (unsigned char) DEFAULT_SY_LFR_S2_BP_P0;
171 parameter_dump_packet.sy_lfr_s2_bp_p1 = (unsigned char) DEFAULT_SY_LFR_S2_BP_P1;
173 172 }
174 173
175 174 void init_local_mode_parameters(void)
176 175 {
177 176 // LOCAL PARAMETERS
178 // (2 snapshots of 2048 points per seconds) * (period of the NORM snashots)
179 param_local.local_sbm1_nb_cwf_max = 2 * (
180 parameter_dump_packet.sy_lfr_n_swf_p[0] * 256
181 + parameter_dump_packet.sy_lfr_n_swf_p[1]
182 );
183 // (period of the NORM snashots) / (8 seconds per snapshot at f2 = 256 Hz)
184 param_local.local_sbm2_nb_cwf_max = (
185 parameter_dump_packet.sy_lfr_n_swf_p[0] * 256
186 + parameter_dump_packet.sy_lfr_n_swf_p[1]
187 )/ 8;
177 set_local_sbm1_nb_cwf_max();
178 set_local_sbm2_nb_cwf_max();
179 set_local_nb_interrupt_f0_MAX();
188 180
189 181 PRINTF1("local_sbm1_nb_cwf_max %d \n", param_local.local_sbm1_nb_cwf_max)
190 182 PRINTF1("local_sbm2_nb_cwf_max %d \n", param_local.local_sbm2_nb_cwf_max)
183 PRINTF1("nb_interrupt_f0_MAX = %d\n", param_local.local_nb_interrupt_f0_MAX)
191 184
192 param_local.local_sbm1_nb_cwf_sent = 0;
193 param_local.local_sbm2_nb_cwf_sent = 0;
185 reset_local_sbm1_nb_cwf_sent();
186 reset_local_sbm2_nb_cwf_sent();
194 187 }
195 188
196 189 void init_housekeeping_parameters(void)
197 190 {
198 191 unsigned int i = 0;
199 192 unsigned int j = 0;
200 193 unsigned int k = 0;
201 194 char *parameters;
202 195
203 196 parameters = (char*) &housekeeping_packet.lfr_status_word;
204 197 for(i = 0; i< SIZE_HK_PARAMETERS; i++)
205 198 {
206 199 parameters[i] = 0x00;
207 200 }
208 201 // init status word
209 202 housekeeping_packet.lfr_status_word[0] = 0x00;
210 203 housekeeping_packet.lfr_status_word[1] = 0x00;
211 204 // init software version
212 205 housekeeping_packet.lfr_sw_version[0] = SW_VERSION_N1;
213 206 housekeeping_packet.lfr_sw_version[1] = SW_VERSION_N2;
214 207 housekeeping_packet.lfr_sw_version[2] = SW_VERSION_N3;
215 208 housekeeping_packet.lfr_sw_version[3] = SW_VERSION_N4;
216 209 // init sequence counters
217 210 for (i = 0; i<SEQ_CNT_NB_PID; i++)
218 211 {
219 212 for(j = 0; j<SEQ_CNT_NB_CAT; j++)
220 213 {
221 214 for(k = 0; k<SEQ_CNT_NB_DEST_ID; k++)
222 215 {
223 216 sequenceCounters[i][j][k] = 0x00;
224 217 }
225 218 }
226 219 }
227 220 }
228 221
229 222 int create_names( void )
230 223 {
231 224 // task names
232 225 Task_name[TASKID_RECV] = rtems_build_name( 'R', 'E', 'C', 'V' );
233 226 Task_name[TASKID_ACTN] = rtems_build_name( 'A', 'C', 'T', 'N' );
234 227 Task_name[TASKID_SPIQ] = rtems_build_name( 'S', 'P', 'I', 'Q' );
235 228 Task_name[TASKID_SMIQ] = rtems_build_name( 'S', 'M', 'I', 'Q' );
236 229 Task_name[TASKID_STAT] = rtems_build_name( 'S', 'T', 'A', 'T' );
237 230 Task_name[TASKID_AVF0] = rtems_build_name( 'A', 'V', 'F', '0' );
238 231 Task_name[TASKID_BPF0] = rtems_build_name( 'B', 'P', 'F', '0' );
239 232 Task_name[TASKID_WFRM] = rtems_build_name( 'W', 'F', 'R', 'M' );
240 233 Task_name[TASKID_DUMB] = rtems_build_name( 'D', 'U', 'M', 'B' );
241 234 Task_name[TASKID_HOUS] = rtems_build_name( 'H', 'O', 'U', 'S' );
242 235 Task_name[TASKID_MATR] = rtems_build_name( 'M', 'A', 'T', 'R' );
236 Task_name[TASKID_CWF3] = rtems_build_name( 'C', 'W', 'F', '3' );
243 237
244 238 // rate monotonic period name
245 239 HK_name = rtems_build_name( 'H', 'O', 'U', 'S' );
246 240
247 241 return 0;
248 242 }
249 243
250 244 int create_all_tasks( void )
251 245 {
252 246 rtems_status_code status;
253 247
254 248 // RECV
255 249 status = rtems_task_create(
256 250 Task_name[TASKID_RECV], 200, RTEMS_MINIMUM_STACK_SIZE * 2,
257 251 RTEMS_DEFAULT_MODES,
258 252 RTEMS_DEFAULT_ATTRIBUTES, &Task_id[TASKID_RECV]
259 253 );
260 254 // ACTN
261 255 status = rtems_task_create(
262 256 Task_name[TASKID_ACTN], 100, RTEMS_MINIMUM_STACK_SIZE * 2,
263 257 RTEMS_DEFAULT_MODES,
264 258 RTEMS_DEFAULT_ATTRIBUTES, &Task_id[TASKID_ACTN]
265 259 );
266 260 // SPIQ
267 261 status = rtems_task_create(
268 262 Task_name[TASKID_SPIQ], 5, RTEMS_MINIMUM_STACK_SIZE * 2,
269 263 RTEMS_DEFAULT_MODES | RTEMS_NO_PREEMPT,
270 264 RTEMS_DEFAULT_ATTRIBUTES, &Task_id[TASKID_SPIQ]
271 265 );
272 266 // SMIQ
273 267 status = rtems_task_create(
274 268 Task_name[TASKID_SMIQ], 10, RTEMS_MINIMUM_STACK_SIZE * 2,
275 269 RTEMS_DEFAULT_MODES | RTEMS_NO_PREEMPT,
276 270 RTEMS_DEFAULT_ATTRIBUTES, &Task_id[TASKID_SMIQ]
277 271 );
278 272 // STAT
279 273 status = rtems_task_create(
280 Task_name[TASKID_STAT], 150, RTEMS_MINIMUM_STACK_SIZE * 2,
274 Task_name[TASKID_STAT], 251, RTEMS_MINIMUM_STACK_SIZE * 2,
281 275 RTEMS_DEFAULT_MODES,
282 276 RTEMS_DEFAULT_ATTRIBUTES, &Task_id[TASKID_STAT]
283 277 );
284 278 // AVF0
285 279 status = rtems_task_create(
286 280 Task_name[TASKID_AVF0], 50, RTEMS_MINIMUM_STACK_SIZE * 2,
287 281 RTEMS_DEFAULT_MODES | RTEMS_NO_PREEMPT,
288 282 RTEMS_DEFAULT_ATTRIBUTES | RTEMS_FLOATING_POINT, &Task_id[TASKID_AVF0]
289 283 );
290 284 // BPF0
291 285 status = rtems_task_create(
292 286 Task_name[TASKID_BPF0], 50, RTEMS_MINIMUM_STACK_SIZE * 2,
293 287 RTEMS_DEFAULT_MODES,
294 288 RTEMS_DEFAULT_ATTRIBUTES | RTEMS_FLOATING_POINT, &Task_id[TASKID_BPF0]
295 289 );
296 290 // WFRM
297 291 status = rtems_task_create(
298 292 Task_name[TASKID_WFRM], 50, RTEMS_MINIMUM_STACK_SIZE * 2,
299 293 RTEMS_DEFAULT_MODES,
300 294 RTEMS_DEFAULT_ATTRIBUTES | RTEMS_FLOATING_POINT, &Task_id[TASKID_WFRM]
301 295 );
302 296 // DUMB
303 297 status = rtems_task_create(
304 298 Task_name[TASKID_DUMB], 200, RTEMS_MINIMUM_STACK_SIZE * 2,
305 299 RTEMS_DEFAULT_MODES,
306 300 RTEMS_DEFAULT_ATTRIBUTES, &Task_id[TASKID_DUMB]
307 301 );
308 302 // HOUS
309 303 status = rtems_task_create(
310 304 Task_name[TASKID_HOUS], 199, RTEMS_MINIMUM_STACK_SIZE * 2,
311 305 RTEMS_DEFAULT_MODES,
312 306 RTEMS_DEFAULT_ATTRIBUTES, &Task_id[TASKID_HOUS]
313 307 );
314 308 // MATR
315 309 status = rtems_task_create(
316 310 Task_name[TASKID_MATR], 250, RTEMS_MINIMUM_STACK_SIZE * 2,
317 311 RTEMS_DEFAULT_MODES,
318 312 RTEMS_DEFAULT_ATTRIBUTES | RTEMS_FLOATING_POINT, &Task_id[TASKID_MATR]
319 313 );
314 // CWF3
315 status = rtems_task_create(
316 Task_name[TASKID_CWF3], 250, RTEMS_MINIMUM_STACK_SIZE * 2,
317 RTEMS_DEFAULT_MODES,
318 RTEMS_DEFAULT_ATTRIBUTES, &Task_id[TASKID_CWF3]
319 );
320 320
321 321 return 0;
322 322 }
323 323
324 324 int start_all_tasks( void )
325 325 {
326 326 rtems_status_code status;
327 327
328 328 status = rtems_task_start( Task_id[TASKID_SPIQ], spiq_task, 1 );
329 329 if (status!=RTEMS_SUCCESSFUL) {
330 PRINTF("In INIT *** Error starting TASK_SPIQ\n")
330 PRINTF("in INIT *** Error starting TASK_SPIQ\n")
331 331 }
332 332
333 333 status = rtems_task_start( Task_id[TASKID_RECV], recv_task, 1 );
334 334 if (status!=RTEMS_SUCCESSFUL) {
335 PRINTF("In INIT *** Error starting TASK_RECV\n")
335 PRINTF("in INIT *** Error starting TASK_RECV\n")
336 336 }
337 337
338 338 status = rtems_task_start( Task_id[TASKID_ACTN], actn_task, 1 );
339 339 if (status!=RTEMS_SUCCESSFUL) {
340 PRINTF("In INIT *** Error starting TASK_ACTN\n")
340 PRINTF("in INIT *** Error starting TASK_ACTN\n")
341 341 }
342 342
343 343 status = rtems_task_start( Task_id[TASKID_SMIQ], smiq_task, 1 );
344 344 if (status!=RTEMS_SUCCESSFUL) {
345 PRINTF("In INIT *** Error starting TASK_BPPR\n")
345 PRINTF("in INIT *** Error starting TASK_BPPR\n")
346 346 }
347 347
348 348 status = rtems_task_start( Task_id[TASKID_STAT], stat_task, 1 );
349 349 if (status!=RTEMS_SUCCESSFUL) {
350 PRINTF("In INIT *** Error starting TASK_STAT\n")
350 PRINTF("in INIT *** Error starting TASK_STAT\n")
351 351 }
352 352
353 353 status = rtems_task_start( Task_id[TASKID_AVF0], avf0_task, 1 );
354 354 if (status!=RTEMS_SUCCESSFUL) {
355 PRINTF("In INIT *** Error starting TASK_AVF0\n")
355 PRINTF("in INIT *** Error starting TASK_AVF0\n")
356 356 }
357 357
358 358 status = rtems_task_start( Task_id[TASKID_BPF0], bpf0_task, 1 );
359 359 if (status!=RTEMS_SUCCESSFUL) {
360 PRINTF("In INIT *** Error starting TASK_BPF0\n")
360 PRINTF("in INIT *** Error starting TASK_BPF0\n")
361 361 }
362 362
363 363 status = rtems_task_start( Task_id[TASKID_WFRM], wfrm_task, 1 );
364 364 if (status!=RTEMS_SUCCESSFUL) {
365 PRINTF("In INIT *** Error starting TASK_WFRM\n")
365 PRINTF("in INIT *** Error starting TASK_WFRM\n")
366 366 }
367 367
368 368 status = rtems_task_start( Task_id[TASKID_DUMB], dumb_task, 1 );
369 369 if (status!=RTEMS_SUCCESSFUL) {
370 PRINTF("In INIT *** Error starting TASK_DUMB\n")
370 PRINTF("in INIT *** Error starting TASK_DUMB\n")
371 371 }
372 372
373 373 status = rtems_task_start( Task_id[TASKID_HOUS], hous_task, 1 );
374 374 if (status!=RTEMS_SUCCESSFUL) {
375 PRINTF("In INIT *** Error starting TASK_HOUS\n")
375 PRINTF("in INIT *** Error starting TASK_HOUS\n")
376 376 }
377 377
378 378 status = rtems_task_start( Task_id[TASKID_MATR], matr_task, 1 );
379 379 if (status!=RTEMS_SUCCESSFUL) {
380 PRINTF("In INIT *** Error starting TASK_MATR\n")
380 PRINTF("in INIT *** Error starting TASK_MATR\n")
381 }
382
383 status = rtems_task_start( Task_id[TASKID_CWF3], cwf3_task, 1 );
384 if (status!=RTEMS_SUCCESSFUL) {
385 PRINTF("in INIT *** Error starting TASK_CWF3\n")
381 386 }
382 387
383 388 return 0;
384 389 }
385 390
386 391 // SPACEWIRE
387 392
388 393 rtems_task spiq_task(rtems_task_argument unused)
389 394 {
390 395 rtems_event_set event_out;
391 396 rtems_status_code status;
392 397 unsigned char lfrMode;
393 398
394 399 while(true){
395 400 PRINTF("in SPIQ *** Waiting for SPW_LINKERR_EVENT\n")
396 401 rtems_event_receive(SPW_LINKERR_EVENT, RTEMS_WAIT, RTEMS_NO_TIMEOUT, &event_out); // wait for an SPW_LINKERR_EVENT
397 402
398 403 lfrMode = (housekeeping_packet.lfr_status_word[0] & 0xf0) >> 4; // get the current mode
399 404
400 405 status = spacewire_wait_for_link();
401 406
402 407 if (status != RTEMS_SUCCESSFUL)
403 408 {
404 409 //****************
405 410 // STOP THE SYSTEM
406 411 spacewire_compute_stats_offsets();
407 412 stop_current_mode();
408 413 if (rtems_task_suspend(Task_id[TASKID_RECV])!=RTEMS_SUCCESSFUL) { // suspend RECV task
409 414 PRINTF("in SPIQ *** Error suspending RECV Task\n")
410 415 }
411 416 if (rtems_task_suspend(Task_id[TASKID_HOUS])!=RTEMS_SUCCESSFUL) { // suspend HOUS task
412 417 PRINTF("in SPIQ *** Error suspending HOUS Task\n")
413 418 }
414 419
415 420 //***************************
416 421 // RESTART THE SPACEWIRE LINK
417 422 spacewire_configure_link();
418 423
419 424 //*******************
420 425 // RESTART THE SYSTEM
421 426 //ioctl(fdSPW, SPACEWIRE_IOCTRL_CLR_STATISTICS); // clear statistics
422 427 status = rtems_task_restart( Task_id[TASKID_HOUS], 1 );
423 428 if (status != RTEMS_SUCCESSFUL) {
424 429 PRINTF1("in SPIQ *** Error restarting HOUS Task *** code %d\n", status)
425 430 }
426 431 if (rtems_task_restart(Task_id[TASKID_RECV], 1) != RTEMS_SUCCESSFUL) { // restart RECV task
427 432 PRINTF("in SPIQ *** Error restarting RECV Task\n")
428 433 }
429 434 //enter_mode(lfrMode, NULL); // enter the mode that was running before the SpaceWire interruption
430 435 }
431 436 }
432 437 }
433 438
434 439 int spacewire_configure_link( void )
435 440 {
436 441 rtems_status_code status;
437 442
438 443 close(fdSPW); // close the device if it is already open
439 444 PRINTF("OK *** in configure_spw_link *** try to open "GRSPW_DEVICE_NAME"\n")
440 445 fdSPW = open(GRSPW_DEVICE_NAME, O_RDWR); // open the device. the open call reset the hardware
441 446 if ( fdSPW<0 ) {
442 447 PRINTF("ERR *** in configure_spw_link *** Error opening"GRSPW_DEVICE_NAME"\n")
443 448 }
444 449
445 450 while(ioctl(fdSPW, SPACEWIRE_IOCTRL_START, -1) != RTEMS_SUCCESSFUL){
446 451 PRINTF(".")
447 452 fflush( stdout );
448 453 close( fdSPW ); // close the device
449 454 fdSPW = open( GRSPW_DEVICE_NAME, O_RDWR ); // open the device. the open call reset the hardware
450 455 if (fdSPW<0) {
451 456 PRINTF("ERR *** In configure_spw_link *** Error opening"GRSPW_DEVICE_NAME"\n")
452 457 }
453 458 rtems_task_wake_after(100);
454 459 }
455 460
456 461 PRINTF("OK *** In configure_spw_link *** "GRSPW_DEVICE_NAME" opened and started successfully\n")
457 462
458 463 spacewire_set_NP(1, REGS_ADDR_GRSPW); // No Port force
459 464 spacewire_set_RE(1, REGS_ADDR_GRSPW); // the dedicated call seems to break the no port force configuration
460 465
461 466 status = ioctl(fdSPW, SPACEWIRE_IOCTRL_SET_RXBLOCK, 1); // sets the blocking mode for reception
462 467 if (status!=RTEMS_SUCCESSFUL) PRINTF("in SPIQ *** Error SPACEWIRE_IOCTRL_SET_RXBLOCK\n")
463 468 //
464 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
465 470 if (status!=RTEMS_SUCCESSFUL) PRINTF("in SPIQ *** Error SPACEWIRE_IOCTRL_SET_EVENT_ID\n") // link-error interrupt occurs
466 471 //
467 472 status = ioctl(fdSPW, SPACEWIRE_IOCTRL_SET_DISABLE_ERR, 0); // automatic link-disabling due to link-error interrupts
468 473 if (status!=RTEMS_SUCCESSFUL) PRINTF("in SPIQ *** Error SPACEWIRE_IOCTRL_SET_DISABLE_ERR\n")
469 474 //
470 475 status = ioctl(fdSPW, SPACEWIRE_IOCTRL_SET_LINK_ERR_IRQ, 1); // sets the link-error interrupt bit
471 476 if (status!=RTEMS_SUCCESSFUL) PRINTF("in SPIQ *** Error SPACEWIRE_IOCTRL_SET_LINK_ERR_IRQ\n")
472 477 //
473 478 status = ioctl(fdSPW, SPACEWIRE_IOCTRL_SET_TXBLOCK, 0); // transmission blocks
474 479 if (status!=RTEMS_SUCCESSFUL) PRINTF("in SPIQ *** Error SPACEWIRE_IOCTRL_SET_TXBLOCK\n")
475 480 //
476 481 status = ioctl(fdSPW, SPACEWIRE_IOCTRL_SET_TXBLOCK_ON_FULL, 0); // transmission blocks on full
477 482 if (status!=RTEMS_SUCCESSFUL) PRINTF("in SPIQ *** Error SPACEWIRE_IOCTRL_SET_TXBLOCK_ON_FULL\n")
478 483 //
479 484 status = ioctl(fdSPW, SPACEWIRE_IOCTRL_SET_TCODE_CTRL, 0x0909);
480 485 if (status!=RTEMS_SUCCESSFUL) PRINTF("in SPIQ *** Error SPACEWIRE_IOCTRL_SET_TCODE_CTRL,\n")
481 486
482 487 PRINTF("OK *** in configure_spw_link *** "GRSPW_DEVICE_NAME" configured successfully\n")
483 488
484 489 return RTEMS_SUCCESSFUL;
485 490 }
486 491
487 492 int spacewire_wait_for_link(void)
488 493 {
489 494 unsigned int i;
490 495 int linkStatus;
491 496 rtems_status_code status = RTEMS_UNSATISFIED;
492 497
493 498 for(i = 0; i< 10; i++){
494 499 PRINTF(".")
495 500 fflush( stdout );
496 501 ioctl(fdSPW, SPACEWIRE_IOCTRL_GET_LINK_STATUS, &linkStatus); // get the link status
497 502 PRINTF1("in spacewire_wait_for_link *** link status is: %s\n", lstates[linkStatus])
498 503 if ( linkStatus == 5) {
499 504 PRINTF("in spacewire_wait_for_link *** link is running\n")
500 505 status = RTEMS_SUCCESSFUL;
501 506 break;
502 507 }
503 508 rtems_task_wake_after(100);
504 509 }
505 510
506 511 return status;
507 512 }
508 513
509 514 void spacewire_set_NP(unsigned char val, unsigned int regAddr) // [N]o [P]ort force
510 515 {
511 516 unsigned int *spwptr = (unsigned int*) regAddr;
512 517
513 518 if (val == 1) {
514 519 *spwptr = *spwptr | 0x00100000; // [NP] set the No port force bit
515 520 }
516 521 if (val== 0) {
517 522 *spwptr = *spwptr & 0xffdfffff;
518 523 }
519 524 }
520 525
521 526 void spacewire_set_RE(unsigned char val, unsigned int regAddr) // [R]MAP [E]nable
522 527 {
523 528 unsigned int *spwptr = (unsigned int*) regAddr;
524 529
525 530 if (val == 1)
526 531 {
527 532 *spwptr = *spwptr | 0x00010000; // [RE] set the RMAP Enable bit
528 533 }
529 534 if (val== 0)
530 535 {
531 536 *spwptr = *spwptr & 0xfffdffff;
532 537 }
533 538 }
534 539
535 540 void spacewire_compute_stats_offsets()
536 541 {
537 542 spw_stats spacewire_stats_grspw;
538 543 rtems_status_code status;
539 544
540 545 status = ioctl( fdSPW, SPACEWIRE_IOCTRL_GET_STATISTICS, &spacewire_stats_grspw );
541 546
542 547 spacewire_stats_backup.packets_received = spacewire_stats_grspw.packets_received
543 548 + spacewire_stats.packets_received;
544 549 spacewire_stats_backup.packets_sent = spacewire_stats_grspw.packets_sent
545 550 + spacewire_stats.packets_sent;
546 551 spacewire_stats_backup.parity_err = spacewire_stats_grspw.parity_err
547 552 + spacewire_stats.parity_err;
548 553 spacewire_stats_backup.disconnect_err = spacewire_stats_grspw.disconnect_err
549 554 + spacewire_stats.disconnect_err;
550 555 spacewire_stats_backup.escape_err = spacewire_stats_grspw.escape_err
551 556 + spacewire_stats.escape_err;
552 557 spacewire_stats_backup.credit_err = spacewire_stats_grspw.credit_err
553 558 + spacewire_stats.credit_err;
554 559 spacewire_stats_backup.write_sync_err = spacewire_stats_grspw.write_sync_err
555 560 + spacewire_stats.write_sync_err;
556 561 spacewire_stats_backup.rx_rmap_header_crc_err = spacewire_stats_grspw.rx_rmap_header_crc_err
557 562 + spacewire_stats.rx_rmap_header_crc_err;
558 563 spacewire_stats_backup.rx_rmap_data_crc_err = spacewire_stats_grspw.rx_rmap_data_crc_err
559 564 + spacewire_stats.rx_rmap_data_crc_err;
560 565 spacewire_stats_backup.early_ep = spacewire_stats_grspw.early_ep
561 566 + spacewire_stats.early_ep;
562 567 spacewire_stats_backup.invalid_address = spacewire_stats_grspw.invalid_address
563 568 + spacewire_stats.invalid_address;
564 569 spacewire_stats_backup.rx_eep_err = spacewire_stats_grspw.rx_eep_err
565 570 + spacewire_stats.rx_eep_err;
566 571 spacewire_stats_backup.rx_truncated = spacewire_stats_grspw.rx_truncated
567 572 + spacewire_stats.rx_truncated;
568 573 }
569 574
570 575 rtems_status_code write_spw(spw_ioctl_pkt_send* spw_ioctl_send)
571 576 {
572 577 rtems_status_code status;
573 578 status = ioctl( fdSPW, SPACEWIRE_IOCTRL_SEND, spw_ioctl_send );
574 579 if (status != RTEMS_SUCCESSFUL){
575 580 //PRINTF1("ERR *** in write_spw *** write operation failed with code: %d\n", status)
576 581 }
577 582 return status;
578 583 }
579 584
580 585 void timecode_irq_handler(void *pDev, void *regs, int minor, unsigned int tc)
581 586 {
582 587 if (rtems_event_send( Task_id[TASKID_DUMB], RTEMS_EVENT_1 ) != RTEMS_SUCCESSFUL) {
583 588 printf("In timecode_irq_handler *** Error sending event to DUMB\n");
584 589 }
585 590 }
@@ -1,575 +1,662
1 1 #include <fsw_processing.h>
2 2 #include <math.h>
3 3
4 4 #include <fsw_processing_globals.c>
5 5
6 6 unsigned char LFR_BP1_F0[ NB_BINS_COMPRESSED_SM_F0 * 9 ];
7 7 BP1_t data_BP1[ NB_BINS_COMPRESSED_SM_F0 ];
8 8 float averaged_spec_mat_f0[ TOTAL_SIZE_SM ];
9 9 char averaged_spec_mat_f0_char[ TOTAL_SIZE_SM * 2 ];
10 10 float compressed_spec_mat_f0[ TOTAL_SIZE_COMPRESSED_MATRIX_f0 ];
11 11
12 12 //***********************************************************
13 13 // Interrupt Service Routine for spectral matrices processing
14 14 rtems_isr spectral_matrices_isr( rtems_vector_number vector )
15 15 {
16 unsigned char status;
17 unsigned char i;
18
19 status = spectral_matrix_regs->status; //[f2 f1 f0_1 f0_0]
20 for (i=0; i<4; i++)
21 {
22 if ( ( (status >> i) & 0x01) == 1) // (1) buffer rotation
23 {
24 switch(i)
25 {
26 case 0:
27 if (spectral_matrix_regs->matrixF0_Address0 == (int) spec_mat_f0_0)
28 {
29 spectral_matrix_regs->matrixF0_Address0 = (int) spec_mat_f0_0_bis;
30 }
31 else
32 {
33 spectral_matrix_regs->matrixF0_Address0 = (int) spec_mat_f0_0;
34 }
35 spectral_matrix_regs->status = spectral_matrix_regs->status & 0xfffffffe;
36 break;
37 case 1:
38 if (spectral_matrix_regs->matrixFO_Address1 == (int) spec_mat_f0_1)
39 {
40 spectral_matrix_regs->matrixFO_Address1 = (int) spec_mat_f0_1_bis;
41 }
42 else
43 {
44 spectral_matrix_regs->matrixFO_Address1 = (int) spec_mat_f0_1;
45 }
46 spectral_matrix_regs->status = spectral_matrix_regs->status & 0xfffffffd;
47 break;
48 case 2:
49 if (spectral_matrix_regs->matrixF1_Address == (int) spec_mat_f1)
50 {
51 spectral_matrix_regs->matrixF1_Address = (int) spec_mat_f1_bis;
52 }
53 else
54 {
55 spectral_matrix_regs->matrixF1_Address = (int) spec_mat_f1;
56 }
57 spectral_matrix_regs->status = spectral_matrix_regs->status & 0xfffffffb;
58 break;
59 case 3:
60 if (spectral_matrix_regs->matrixF2_Address == (int) spec_mat_f2)
61 {
62 spectral_matrix_regs->matrixF2_Address = (int) spec_mat_f2_bis;
63 }
64 else
65 {
66 spectral_matrix_regs->matrixF2_Address = (int) spec_mat_f2;
67 }
68 spectral_matrix_regs->status = spectral_matrix_regs->status & 0xfffffff7;
69 break;
70 default:
71 break;
72 }
73 }
74 }
75
76 // reset error codes to 0
77 spectral_matrix_regs->status = spectral_matrix_regs->status & 0xffffffcf; // [1100 1111]
78
16 79 if (rtems_event_send( Task_id[TASKID_SMIQ], RTEMS_EVENT_0 ) != RTEMS_SUCCESSFUL) {
17 80 rtems_event_send( Task_id[TASKID_DUMB], RTEMS_EVENT_4 );
18 81 }
19 82 }
20 83
21 84 //************
22 85 // RTEMS TASKS
23 86 rtems_task smiq_task(rtems_task_argument argument) // process the Spectral Matrices IRQ
24 87 {
25 88 rtems_event_set event_out;
26 89 unsigned int nb_interrupt_f0 = 0;
27 unsigned int nb_interrupt_f0_MAX = 0;
28
29 nb_interrupt_f0_MAX = ( (parameter_dump_packet.sy_lfr_n_asm_p[0]) * 256
30 + parameter_dump_packet.sy_lfr_n_asm_p[1] ) * 100;
31 90
32 91 PRINTF("in SMIQ *** \n")
33 92
34 93 while(1){
35 94 rtems_event_receive(RTEMS_EVENT_0, RTEMS_WAIT, RTEMS_NO_TIMEOUT, &event_out); // wait for an RTEMS_EVENT0
36 95 nb_interrupt_f0 = nb_interrupt_f0 + 1;
37 if (nb_interrupt_f0 == nb_interrupt_f0_MAX ){
96 if (nb_interrupt_f0 == param_local.local_nb_interrupt_f0_MAX ){
38 97 if (rtems_event_send( Task_id[TASKID_MATR], RTEMS_EVENT_0 ) != RTEMS_SUCCESSFUL)
39 98 {
40 99 rtems_event_send( Task_id[TASKID_DUMB], RTEMS_EVENT_3 );
41 100 }
42 101 nb_interrupt_f0 = 0;
43 102 }
44 103 }
45 104 }
46 105
47 106 rtems_task spw_bppr_task(rtems_task_argument argument)
48 107 {
49 108 rtems_status_code status;
50 109 rtems_event_set event_out;
51 110 static int Nb_average_f0 = 0;
52 111 //static int nb_average_f1 = 0;
53 112 //static int nb_average_f2 = 0;
54 113
55 114 printf("in BPPR ***\n");
56 115
57 116 while(true){ // wait for an event to begin with the processing
58 117 status = rtems_event_receive(RTEMS_EVENT_0, RTEMS_WAIT, RTEMS_NO_TIMEOUT, &event_out);
59 118 if (status == RTEMS_SUCCESSFUL) {
60 119 if ((spectral_matrix_regs->status & 0x00000001)==1) {
61 matrix_average(spec_mat_f0_a, averaged_spec_mat_f0);
120 matrix_average(spec_mat_f0_0, averaged_spec_mat_f0);
62 121 spectral_matrix_regs->status = spectral_matrix_regs->status & 0xfffffffe;
63 122 //printf("f0_a\n");
64 123 Nb_average_f0++;
65 124 }
66 125 if (((spectral_matrix_regs->status>>1) & 0x00000001)==1) {
67 matrix_average(spec_mat_f0_b, compressed_spec_mat_f0);
126 matrix_average(spec_mat_f0_1, compressed_spec_mat_f0);
68 127 spectral_matrix_regs->status = spectral_matrix_regs->status & 0xfffffffd;
69 128 //printf("f0_b\n");
70 129 Nb_average_f0++;
71 130 }
72 131 if (Nb_average_f0 == NB_AVERAGE_NORMAL_f0) {
73 132 matrix_compression(averaged_spec_mat_f0, 0, compressed_spec_mat_f0);
74 133 //printf("f0 compressed\n");
75 134 Nb_average_f0 = 0;
76 135 matrix_reset(averaged_spec_mat_f0);
77 136 }
78 137 }
79 138 }
80 139 }
81 140
82 141 rtems_task avf0_task(rtems_task_argument argument)
83 142 {
84 143 //int i;
85 144 static int nb_average;
86 145 rtems_event_set event_out;
87 146 rtems_status_code status;
88 147
89 148 nb_average = 0;
90 149
91 150 PRINTF("in AVFO *** \n")
92 151
93 152 while(1){
94 153 rtems_event_receive(RTEMS_EVENT_0, RTEMS_WAIT, RTEMS_NO_TIMEOUT, &event_out); // wait for an RTEMS_EVENT0
95 154 /*for(i=0; i<TOTAL_SIZE_SM; i++){
96 155 averaged_spec_mat_f0[i] = averaged_spec_mat_f0[i] + spec_mat_f0_a[i]
97 156 + spec_mat_f0_b[i]
98 157 + spec_mat_f0_c[i]
99 158 + spec_mat_f0_d[i]
100 159 + spec_mat_f0_e[i]
101 160 + spec_mat_f0_f[i]
102 161 + spec_mat_f0_g[i]
103 162 + spec_mat_f0_h[i];
104 163 }*/
105 164 nb_average = nb_average + NB_SM_TO_RECEIVE_BEFORE_AVF0;
106 165 if (nb_average == NB_AVERAGE_NORMAL_f0) {
107 166 nb_average = 0;
108 167 status = rtems_event_send( Task_id[TASKID_MATR], RTEMS_EVENT_0 ); // sending an event to the task 7, BPF0
109 168 if (status != RTEMS_SUCCESSFUL) {
110 169 printf("in AVF0 *** Error sending RTEMS_EVENT_0, code %d\n", status);
111 170 }
112 171 }
113 172 }
114 173 }
115 174
116 175 rtems_task bpf0_task(rtems_task_argument argument)
117 176 {
118 177 rtems_event_set event_out;
119 178
120 179 PRINTF("in BPFO *** \n")
121 180
122 181 while(1){
123 182 rtems_event_receive(RTEMS_EVENT_0, RTEMS_WAIT, RTEMS_NO_TIMEOUT, &event_out); // wait for an RTEMS_EVENT0
124 183 matrix_compression(averaged_spec_mat_f0, 0, compressed_spec_mat_f0);
125 184 BP1_set(compressed_spec_mat_f0, NB_BINS_COMPRESSED_SM_F0, LFR_BP1_F0);
126 185 //PRINTF("IN TASK BPF0 *** Matrix compressed, parameters calculated\n")
127 186 }
128 187 }
129 188
130 189 rtems_task matr_task(rtems_task_argument argument)
131 190 {
132 191 spw_ioctl_pkt_send spw_ioctl_send_ASM;
133 192 rtems_event_set event_out;
134 193 Header_TM_LFR_SCIENCE_ASM_t headerASM;
135 194
136 195 init_header_asm( &headerASM );
137 196
138 197 PRINTF("in MATR *** \n")
139 198
140 init_averaged_spectral_matrix( );
199 fill_averaged_spectral_matrix( );
141 200
142 201 while(1){
143 202 rtems_event_receive(RTEMS_EVENT_0, RTEMS_WAIT, RTEMS_NO_TIMEOUT, &event_out); // wait for an RTEMS_EVENT0
144 203
204 #ifdef GSA
205 #else
206 fill_averaged_spectral_matrix( );
207 #endif
145 208 convert_averaged_spectral_matrix( averaged_spec_mat_f0, averaged_spec_mat_f0_char);
146 209
147 210 send_spectral_matrix( &headerASM, averaged_spec_mat_f0_char, SID_NORM_ASM_F0, &spw_ioctl_send_ASM);
148 211 }
149 212 }
150 213
151 214 //*****************************
152 215 // Spectral matrices processing
153 216 void matrix_average(volatile int *spec_mat, volatile float *averaged_spec_mat)
154 217 {
155 218 int i;
156 219 for(i=0; i<TOTAL_SIZE_SM; i++){
157 averaged_spec_mat[i] = averaged_spec_mat[i] + spec_mat_f0_a[i]
158 + spec_mat_f0_b[i]
220 averaged_spec_mat[i] = averaged_spec_mat[i] + spec_mat_f0_0[i]
221 + spec_mat_f0_1[i]
159 222 + spec_mat_f0_c[i]
160 223 + spec_mat_f0_d[i]
161 224 + spec_mat_f0_e[i]
162 225 + spec_mat_f0_f[i]
163 226 + spec_mat_f0_g[i]
164 227 + spec_mat_f0_h[i];
165 228 }
166 229 }
167 230
168 231 void matrix_reset(volatile float *averaged_spec_mat)
169 232 {
170 233 // int i;
171 234 // for(i=0; i<TOTAL_SIZE_SM; i++){
172 235 // averaged_spec_mat_f0[i] = 0;
173 236 // }
174 237 }
175 238
176 239 void matrix_compression(volatile float *averaged_spec_mat, unsigned char fChannel, float *compressed_spec_mat)
177 240 {
178 241 int i;
179 242 int j;
180 243 switch (fChannel){
181 244 case 0:
182 245 for(i=0;i<NB_BINS_COMPRESSED_SM_F0;i++){
183 246 j = 17 + (i * 8);
184 247 compressed_spec_mat[i] = (averaged_spec_mat[j]
185 248 + averaged_spec_mat[j+1]
186 249 + averaged_spec_mat[j+2]
187 250 + averaged_spec_mat[j+3]
188 251 + averaged_spec_mat[j+4]
189 252 + averaged_spec_mat[j+5]
190 253 + averaged_spec_mat[j+6]
191 254 + averaged_spec_mat[j+7])/(8*NB_AVERAGE_NORMAL_f0);
192 255 }
193 256 break;
194 257 case 1:
195 258 // case fChannel = f1 to be completed later
196 259 break;
197 260 case 2:
198 261 // case fChannel = f1 to be completed later
199 262 break;
200 263 default:
201 264 break;
202 265 }
203 266 }
204 267
205 268 void BP1_set(float * compressed_spec_mat, unsigned char nb_bins_compressed_spec_mat, unsigned char * LFR_BP1){
206 269 int i;
207 270 int j;
208 271 unsigned char tmp_u_char;
209 272 unsigned char * pt_char = NULL;
210 273 float PSDB, PSDE;
211 274 float NVEC_V0;
212 275 float NVEC_V1;
213 276 float NVEC_V2;
214 277 //float significand;
215 278 //int exponent;
216 279 float aux;
217 280 float tr_SB_SB;
218 281 float tmp;
219 282 float sx_re;
220 283 float sx_im;
221 284 float nebx_re = 0;
222 285 float nebx_im = 0;
223 286 float ny = 0;
224 287 float nz = 0;
225 288 float bx_bx_star = 0;
226 289 for(i=0; i<nb_bins_compressed_spec_mat; i++){
227 290 //==============================================
228 291 // BP1 PSD == B PAR_LFR_SC_BP1_PE_FL0 == 16 bits
229 292 PSDB = compressed_spec_mat[i*30] // S11
230 293 + compressed_spec_mat[(i*30) + 10] // S22
231 294 + compressed_spec_mat[(i*30) + 18]; // S33
232 295 //significand = frexp(PSDB, &exponent);
233 296 pt_char = (unsigned char*) &PSDB;
234 297 LFR_BP1[(i*9) + 2] = pt_char[0]; // bits 31 downto 24 of the float
235 298 LFR_BP1[(i*9) + 3] = pt_char[1]; // bits 23 downto 16 of the float
236 299 //==============================================
237 300 // BP1 PSD == E PAR_LFR_SC_BP1_PB_FL0 == 16 bits
238 301 PSDE = compressed_spec_mat[(i*30) + 24] * K44_pe // S44
239 302 + compressed_spec_mat[(i*30) + 28] * K55_pe // S55
240 303 + compressed_spec_mat[(i*30) + 26] * K45_pe_re // S45
241 304 - compressed_spec_mat[(i*30) + 27] * K45_pe_im; // S45
242 305 pt_char = (unsigned char*) &PSDE;
243 306 LFR_BP1[(i*9) + 0] = pt_char[0]; // bits 31 downto 24 of the float
244 307 LFR_BP1[(i*9) + 1] = pt_char[1]; // bits 23 downto 16 of the float
245 308 //==============================================================================
246 309 // BP1 normal wave vector == PAR_LFR_SC_BP1_NVEC_V0_F0 == 8 bits
247 310 // == PAR_LFR_SC_BP1_NVEC_V1_F0 == 8 bits
248 311 // == PAR_LFR_SC_BP1_NVEC_V2_F0 == 1 bits
249 312 tmp = sqrt(
250 313 compressed_spec_mat[(i*30) + 3]*compressed_spec_mat[(i*30) + 3] //Im S12
251 314 +compressed_spec_mat[(i*30) + 5]*compressed_spec_mat[(i*30) + 5] //Im S13
252 315 +compressed_spec_mat[(i*30) + 13]*compressed_spec_mat[(i*30) + 13] //Im S23
253 316 );
254 317 NVEC_V0 = compressed_spec_mat[(i*30) + 13] / tmp; // Im S23
255 318 NVEC_V1 = -compressed_spec_mat[(i*30) + 5] / tmp; // Im S13
256 319 NVEC_V2 = compressed_spec_mat[(i*30) + 3] / tmp; // Im S12
257 320 LFR_BP1[(i*9) + 4] = (char) (NVEC_V0*127);
258 321 LFR_BP1[(i*9) + 5] = (char) (NVEC_V1*127);
259 322 pt_char = (unsigned char*) &NVEC_V2;
260 323 LFR_BP1[(i*9) + 6] = pt_char[0] & 0x80; // extract the sign of NVEC_V2
261 324 //=======================================================
262 325 // BP1 ellipticity == PAR_LFR_SC_BP1_ELLIP_F0 == 4 bits
263 326 aux = 2*tmp / PSDB; // compute the ellipticity
264 327 tmp_u_char = (unsigned char) (aux*(16-1)); // convert the ellipticity
265 328 LFR_BP1[i*9+6] = LFR_BP1[i*9+6] | ((tmp_u_char&0x0f)<<3); // keeps 4 bits of the resulting unsigned char
266 329 //==============================================================
267 330 // BP1 degree of polarization == PAR_LFR_SC_BP1_DOP_F0 == 3 bits
268 331 for(j = 0; j<NB_VALUES_PER_SM;j++){
269 332 tr_SB_SB = compressed_spec_mat[i*30] * compressed_spec_mat[i*30]
270 333 + compressed_spec_mat[(i*30) + 10] * compressed_spec_mat[(i*30) + 10]
271 334 + compressed_spec_mat[(i*30) + 18] * compressed_spec_mat[(i*30) + 18]
272 335 + 2 * compressed_spec_mat[(i*30) + 2] * compressed_spec_mat[(i*30) + 2]
273 336 + 2 * compressed_spec_mat[(i*30) + 3] * compressed_spec_mat[(i*30) + 3]
274 337 + 2 * compressed_spec_mat[(i*30) + 4] * compressed_spec_mat[(i*30) + 4]
275 338 + 2 * compressed_spec_mat[(i*30) + 5] * compressed_spec_mat[(i*30) + 5]
276 339 + 2 * compressed_spec_mat[(i*30) + 12] * compressed_spec_mat[(i*30) + 12]
277 340 + 2 * compressed_spec_mat[(i*30) + 13] * compressed_spec_mat[(i*30) + 13];
278 341 }
279 342 aux = PSDB*PSDB;
280 343 tmp = sqrt( abs( ( 3*tr_SB_SB - aux ) / ( 2 * aux ) ) );
281 344 tmp_u_char = (unsigned char) (NVEC_V0*(8-1));
282 345 LFR_BP1[(i*9) + 6] = LFR_BP1[(i*9) + 6] | (tmp_u_char & 0x07); // keeps 3 bits of the resulting unsigned char
283 346 //=======================================================================================
284 347 // BP1 x-component of the normalized Poynting flux == PAR_LFR_SC_BP1_SZ_F0 == 8 bits (7+1)
285 348 sx_re = compressed_spec_mat[(i*30) + 20] * K34_sx_re
286 349 + compressed_spec_mat[(i*30) + 6] * K14_sx_re
287 350 + compressed_spec_mat[(i*30) + 8] * K15_sx_re
288 351 + compressed_spec_mat[(i*30) + 14] * K24_sx_re
289 352 + compressed_spec_mat[(i*30) + 16] * K25_sx_re
290 353 + compressed_spec_mat[(i*30) + 22] * K35_sx_re;
291 354 sx_im = compressed_spec_mat[(i*30) + 21] * K34_sx_im
292 355 + compressed_spec_mat[(i*30) + 7] * K14_sx_im
293 356 + compressed_spec_mat[(i*30) + 9] * K15_sx_im
294 357 + compressed_spec_mat[(i*30) + 15] * K24_sx_im
295 358 + compressed_spec_mat[(i*30) + 17] * K25_sx_im
296 359 + compressed_spec_mat[(i*30) + 23] * K35_sx_im;
297 360 LFR_BP1[(i*9) + 7] = ((unsigned char) (sx_re * 128)) & 0x7f; // cf DOC for the compression
298 361 if ( abs(sx_re) > abs(sx_im) ) {
299 362 LFR_BP1[(i*9) + 7] = LFR_BP1[(i*9) + 1] | (0x80); // extract the sector of sx
300 363 }
301 364 else {
302 365 LFR_BP1[(i*9) + 7] = LFR_BP1[(i*9) + 1] & (0x7f); // extract the sector of sx
303 366 }
304 367 //======================================================================
305 368 // BP1 phase velocity estimator == PAR_LFR_SC_BP1_VPHI_F0 == 8 bits (7+1)
306 369 ny = sin(Alpha_M)*NVEC_V1 + cos(Alpha_M)*NVEC_V2;
307 370 nz = NVEC_V0;
308 371 bx_bx_star = cos(Alpha_M) * cos(Alpha_M) * compressed_spec_mat[i*30+10] // re S22
309 372 + sin(Alpha_M) * sin(Alpha_M) * compressed_spec_mat[i*30+18] // re S33
310 373 - 2 * sin(Alpha_M) * cos(Alpha_M) * compressed_spec_mat[i*30+12]; // re S23
311 374 nebx_re = ny * (compressed_spec_mat[(i*30) + 14] * K24_ny_re
312 375 +compressed_spec_mat[(i*30) + 16] * K25_ny_re
313 376 +compressed_spec_mat[(i*30) + 20] * K34_ny_re
314 377 +compressed_spec_mat[(i*30) + 22] * K35_ny_re)
315 378 + nz * (compressed_spec_mat[(i*30) + 14] * K24_nz_re
316 379 +compressed_spec_mat[(i*30) + 16] * K25_nz_re
317 380 +compressed_spec_mat[(i*30) + 20] * K34_nz_re
318 381 +compressed_spec_mat[(i*30) + 22] * K35_nz_re);
319 382 nebx_im = ny * (compressed_spec_mat[(i*30) + 15]*K24_ny_re
320 383 +compressed_spec_mat[(i*30) + 17] * K25_ny_re
321 384 +compressed_spec_mat[(i*30) + 21] * K34_ny_re
322 385 +compressed_spec_mat[(i*30) + 23] * K35_ny_re)
323 386 + nz * (compressed_spec_mat[(i*30) + 15] * K24_nz_im
324 387 +compressed_spec_mat[(i*30) + 17] * K25_nz_im
325 388 +compressed_spec_mat[(i*30) + 21] * K34_nz_im
326 389 +compressed_spec_mat[(i*30) + 23] * K35_nz_im);
327 390 tmp = nebx_re / bx_bx_star;
328 391 LFR_BP1[(i*9) + 8] = ((unsigned char) (tmp * 128)) & 0x7f; // cf DOC for the compression
329 392 if ( abs(nebx_re) > abs(nebx_im) ) {
330 393 LFR_BP1[(i*9) + 8] = LFR_BP1[(i*9) + 8] | (0x80); // extract the sector of nebx
331 394 }
332 395 else {
333 396 LFR_BP1[(i*9) + 8] = LFR_BP1[(i*9) + 8] & (0x7f); // extract the sector of nebx
334 397 }
335 398 }
336 399
337 400 }
338 401
339 402 void BP2_set(float * compressed_spec_mat, unsigned char nb_bins_compressed_spec_mat){
340 403 // BP2 autocorrelation
341 404 int i;
342 405 int aux = 0;
343 406
344 407 for(i = 0; i<nb_bins_compressed_spec_mat; i++){
345 408 // S12
346 409 aux = sqrt(compressed_spec_mat[i*30]*compressed_spec_mat[(i*30) + 10]);
347 410 compressed_spec_mat[(i*30) + 2] = compressed_spec_mat[(i*30) + 2] / aux;
348 411 compressed_spec_mat[(i*30) + 3] = compressed_spec_mat[(i*30) + 3] / aux;
349 412 // S13
350 413 aux = sqrt(compressed_spec_mat[i*30]*compressed_spec_mat[(i*30) + 18]);
351 414 compressed_spec_mat[(i*30) + 4] = compressed_spec_mat[(i*30) + 4] / aux;
352 415 compressed_spec_mat[(i*30) + 5] = compressed_spec_mat[(i*30) + 5] / aux;
353 416 // S23
354 417 aux = sqrt(compressed_spec_mat[i*30+12]*compressed_spec_mat[(i*30) + 18]);
355 418 compressed_spec_mat[(i*30) + 12] = compressed_spec_mat[(i*30) + 12] / aux;
356 419 compressed_spec_mat[(i*30) + 13] = compressed_spec_mat[(i*30) + 13] / aux;
357 420 // S45
358 421 aux = sqrt(compressed_spec_mat[i*30+24]*compressed_spec_mat[(i*30) + 28]);
359 422 compressed_spec_mat[(i*30) + 26] = compressed_spec_mat[(i*30) + 26] / aux;
360 423 compressed_spec_mat[(i*30) + 27] = compressed_spec_mat[(i*30) + 27] / aux;
361 424 // S14
362 425 aux = sqrt(compressed_spec_mat[i*30]*compressed_spec_mat[(i*30) +24]);
363 426 compressed_spec_mat[(i*30) + 6] = compressed_spec_mat[(i*30) + 6] / aux;
364 427 compressed_spec_mat[(i*30) + 7] = compressed_spec_mat[(i*30) + 7] / aux;
365 428 // S15
366 429 aux = sqrt(compressed_spec_mat[i*30]*compressed_spec_mat[(i*30) + 28]);
367 430 compressed_spec_mat[(i*30) + 8] = compressed_spec_mat[(i*30) + 8] / aux;
368 431 compressed_spec_mat[(i*30) + 9] = compressed_spec_mat[(i*30) + 9] / aux;
369 432 // S24
370 433 aux = sqrt(compressed_spec_mat[i*10]*compressed_spec_mat[(i*30) + 24]);
371 434 compressed_spec_mat[(i*30) + 14] = compressed_spec_mat[(i*30) + 14] / aux;
372 435 compressed_spec_mat[(i*30) + 15] = compressed_spec_mat[(i*30) + 15] / aux;
373 436 // S25
374 437 aux = sqrt(compressed_spec_mat[i*10]*compressed_spec_mat[(i*30) + 28]);
375 438 compressed_spec_mat[(i*30) + 16] = compressed_spec_mat[(i*30) + 16] / aux;
376 439 compressed_spec_mat[(i*30) + 17] = compressed_spec_mat[(i*30) + 17] / aux;
377 440 // S34
378 441 aux = sqrt(compressed_spec_mat[i*18]*compressed_spec_mat[(i*30) + 24]);
379 442 compressed_spec_mat[(i*30) + 20] = compressed_spec_mat[(i*30) + 20] / aux;
380 443 compressed_spec_mat[(i*30) + 21] = compressed_spec_mat[(i*30) + 21] / aux;
381 444 // S35
382 445 aux = sqrt(compressed_spec_mat[i*18]*compressed_spec_mat[(i*30) + 28]);
383 446 compressed_spec_mat[(i*30) + 22] = compressed_spec_mat[(i*30) + 22] / aux;
384 447 compressed_spec_mat[(i*30) + 23] = compressed_spec_mat[(i*30) + 23] / aux;
385 448 }
386 449 }
387 450
388 451 void init_header_asm( Header_TM_LFR_SCIENCE_ASM_t *header)
389 452 {
390 453 header->targetLogicalAddress = CCSDS_DESTINATION_ID;
391 454 header->protocolIdentifier = CCSDS_PROTOCOLE_ID;
392 455 header->reserved = 0x00;
393 456 header->userApplication = CCSDS_USER_APP;
394 457 header->packetID[0] = (unsigned char) (TM_PACKET_ID_SCIENCE_NORMAL >> 8);
395 458 header->packetID[1] = (unsigned char) (TM_PACKET_ID_SCIENCE_NORMAL);
396 459 header->packetSequenceControl[0] = 0xc0;
397 460 header->packetSequenceControl[1] = 0x00;
398 461 header->packetLength[0] = 0x00;
399 462 header->packetLength[1] = 0x00;
400 463 // DATA FIELD HEADER
401 464 header->spare1_pusVersion_spare2 = 0x10;
402 465 header->serviceType = TM_TYPE_LFR_SCIENCE; // service type
403 466 header->serviceSubType = TM_SUBTYPE_LFR_SCIENCE; // service subtype
404 467 header->destinationID = TM_DESTINATION_ID_GROUND;
405 468 // AUXILIARY DATA HEADER
406 469 header->sid = 0x00;
407 470 header->biaStatusInfo = 0x00;
408 471 header->cntASM = 0x00;
409 472 header->nrASM = 0x00;
410 473 header->time[0] = 0x00;
411 474 header->time[0] = 0x00;
412 475 header->time[0] = 0x00;
413 476 header->time[0] = 0x00;
414 477 header->time[0] = 0x00;
415 478 header->time[0] = 0x00;
416 479 header->blkNr[0] = 0x00; // BLK_NR MSB
417 480 header->blkNr[1] = 0x00; // BLK_NR LSB
418 481 }
419 482
420 483 void send_spectral_matrix(Header_TM_LFR_SCIENCE_ASM_t *header, char *spectral_matrix,
421 484 unsigned int sid, spw_ioctl_pkt_send *spw_ioctl_send)
422 485 {
423 486 unsigned int i;
424 487 unsigned int length = 0;
425 488 rtems_status_code status;
426 489
427 490 header->sid = (unsigned char) sid;
428 491
429 492 for (i=0; i<2; i++)
430 493 {
431 494 // BUILD THE DATA
432 495 spw_ioctl_send->dlen = TOTAL_SIZE_SM;
433 496 spw_ioctl_send->data = &spectral_matrix[ i * TOTAL_SIZE_SM];
434 497 spw_ioctl_send->hlen = HEADER_LENGTH_TM_LFR_SCIENCE_ASM + CCSDS_PROTOCOLE_EXTRA_BYTES;
435 498 spw_ioctl_send->hdr = (char *) header;
436 499 spw_ioctl_send->options = 0;
437 500
438 501 // BUILD THE HEADER
439 502 length = PACKET_LENGTH_TM_LFR_SCIENCE_ASM;
440 503 header->packetLength[0] = (unsigned char) (length>>8);
441 504 header->packetLength[1] = (unsigned char) (length);
442 505 header->sid = (unsigned char) sid; // SID
443 506 header->cntASM = 2;
444 507 header->nrASM = (unsigned char) (i+1);
445 508 header->blkNr[0] =(unsigned char) ( (NB_BINS_PER_SM/2) >> 8 ); // BLK_NR MSB
446 509 header->blkNr[1] = (unsigned char) (NB_BINS_PER_SM/2); // BLK_NR LSB
447 510 // SET PACKET TIME
448 511 header->time[0] = (unsigned char) (time_management_regs->coarse_time>>24);
449 512 header->time[1] = (unsigned char) (time_management_regs->coarse_time>>16);
450 513 header->time[2] = (unsigned char) (time_management_regs->coarse_time>>8);
451 514 header->time[3] = (unsigned char) (time_management_regs->coarse_time);
452 515 header->time[4] = (unsigned char) (time_management_regs->fine_time>>8);
453 516 header->time[5] = (unsigned char) (time_management_regs->fine_time);
454 517 header->acquisitionTime[0] = (unsigned char) (time_management_regs->coarse_time>>24);
455 518 header->acquisitionTime[1] = (unsigned char) (time_management_regs->coarse_time>>16);
456 519 header->acquisitionTime[2] = (unsigned char) (time_management_regs->coarse_time>>8);
457 520 header->acquisitionTime[3] = (unsigned char) (time_management_regs->coarse_time);
458 521 header->acquisitionTime[4] = (unsigned char) (time_management_regs->fine_time>>8);
459 522 header->acquisitionTime[5] = (unsigned char) (time_management_regs->fine_time);
460 523 // SEND PACKET
461 524 status = write_spw(spw_ioctl_send);
462 525 if (status != RTEMS_SUCCESSFUL) {
463 526 while (true) {
464 527 if (status != RTEMS_SUCCESSFUL) {
465 528 status = write_spw(spw_ioctl_send);
466 529 //PRINTF1("%d", i)
467 530 sched_yield();
468 531 }
469 532 else {
470 533 //PRINTF("\n")
471 534 break;
472 535 }
473 536 }
474 537 }
475 538 }
476 539 }
477 540
478 541 void convert_averaged_spectral_matrix( volatile float *input_matrix, char *output_matrix)
479 542 {
480 543 unsigned int i;
481 544 unsigned int j;
482 545 char * pt_char_input;
483 546 char * pt_char_output;
484 547
485 548 pt_char_input = NULL;
486 549 pt_char_output = NULL;
487 550
488 551 for( i=0; i<NB_BINS_PER_SM; i++)
489 552 {
490 553 for ( j=0; j<NB_VALUES_PER_SM; j++)
491 554 {
492 555 pt_char_input = (char*) &input_matrix[ (i*NB_VALUES_PER_SM) + j ];
493 556 pt_char_output = (char*) &output_matrix[ 2 * ( (i*NB_VALUES_PER_SM) + j ) ];
494 557 pt_char_output[0] = pt_char_input[0]; // bits 31 downto 24 of the float
495 558 pt_char_output[1] = pt_char_input[1]; // bits 23 downto 16 of the float
496 559 }
497 560 }
498 561 }
499 562
500 void init_averaged_spectral_matrix( )
563 void fill_averaged_spectral_matrix( )
501 564 {
565
566 #ifdef GSA
502 567 float offset = 10.;
503 568 float coeff = 100000.;
569
504 570 averaged_spec_mat_f0[ 0 + 25 * 0 ] = 0. + offset;
505 571 averaged_spec_mat_f0[ 0 + 25 * 1 ] = 1. + offset;
506 572 averaged_spec_mat_f0[ 0 + 25 * 2 ] = 2. + offset;
507 573 averaged_spec_mat_f0[ 0 + 25 * 3 ] = 3. + offset;
508 574 averaged_spec_mat_f0[ 0 + 25 * 4 ] = 4. + offset;
509 575 averaged_spec_mat_f0[ 0 + 25 * 5 ] = 5. + offset;
510 576 averaged_spec_mat_f0[ 0 + 25 * 6 ] = 6. + offset;
511 577 averaged_spec_mat_f0[ 0 + 25 * 7 ] = 7. + offset;
512 578 averaged_spec_mat_f0[ 0 + 25 * 8 ] = 8. + offset;
513 579 averaged_spec_mat_f0[ 0 + 25 * 9 ] = 9. + offset;
514 580 averaged_spec_mat_f0[ 0 + 25 * 10 ] = 10. + offset;
515 581 averaged_spec_mat_f0[ 0 + 25 * 11 ] = 11. + offset;
516 582 averaged_spec_mat_f0[ 0 + 25 * 12 ] = 12. + offset;
517 583 averaged_spec_mat_f0[ 0 + 25 * 13 ] = 13. + offset;
518 584 averaged_spec_mat_f0[ 0 + 25 * 14 ] = 14. + offset;
519 585 averaged_spec_mat_f0[ 9 + 25 * 0 ] = -(0. + offset)* coeff;
520 586 averaged_spec_mat_f0[ 9 + 25 * 1 ] = -(1. + offset)* coeff;
521 587 averaged_spec_mat_f0[ 9 + 25 * 2 ] = -(2. + offset)* coeff;
522 588 averaged_spec_mat_f0[ 9 + 25 * 3 ] = -(3. + offset)* coeff;
523 589 averaged_spec_mat_f0[ 9 + 25 * 4 ] = -(4. + offset)* coeff;
524 590 averaged_spec_mat_f0[ 9 + 25 * 5 ] = -(5. + offset)* coeff;
525 591 averaged_spec_mat_f0[ 9 + 25 * 6 ] = -(6. + offset)* coeff;
526 592 averaged_spec_mat_f0[ 9 + 25 * 7 ] = -(7. + offset)* coeff;
527 593 averaged_spec_mat_f0[ 9 + 25 * 8 ] = -(8. + offset)* coeff;
528 594 averaged_spec_mat_f0[ 9 + 25 * 9 ] = -(9. + offset)* coeff;
529 595 averaged_spec_mat_f0[ 9 + 25 * 10 ] = -(10. + offset)* coeff;
530 596 averaged_spec_mat_f0[ 9 + 25 * 11 ] = -(11. + offset)* coeff;
531 597 averaged_spec_mat_f0[ 9 + 25 * 12 ] = -(12. + offset)* coeff;
532 598 averaged_spec_mat_f0[ 9 + 25 * 13 ] = -(13. + offset)* coeff;
533 599 averaged_spec_mat_f0[ 9 + 25 * 14 ] = -(14. + offset)* coeff;
534 600 offset = 10000000;
535 601 averaged_spec_mat_f0[ 16 + 25 * 0 ] = (0. + offset)* coeff;
536 602 averaged_spec_mat_f0[ 16 + 25 * 1 ] = (1. + offset)* coeff;
537 603 averaged_spec_mat_f0[ 16 + 25 * 2 ] = (2. + offset)* coeff;
538 604 averaged_spec_mat_f0[ 16 + 25 * 3 ] = (3. + offset)* coeff;
539 605 averaged_spec_mat_f0[ 16 + 25 * 4 ] = (4. + offset)* coeff;
540 606 averaged_spec_mat_f0[ 16 + 25 * 5 ] = (5. + offset)* coeff;
541 607 averaged_spec_mat_f0[ 16 + 25 * 6 ] = (6. + offset)* coeff;
542 608 averaged_spec_mat_f0[ 16 + 25 * 7 ] = (7. + offset)* coeff;
543 609 averaged_spec_mat_f0[ 16 + 25 * 8 ] = (8. + offset)* coeff;
544 610 averaged_spec_mat_f0[ 16 + 25 * 9 ] = (9. + offset)* coeff;
545 611 averaged_spec_mat_f0[ 16 + 25 * 10 ] = (10. + offset)* coeff;
546 612 averaged_spec_mat_f0[ 16 + 25 * 11 ] = (11. + offset)* coeff;
547 613 averaged_spec_mat_f0[ 16 + 25 * 12 ] = (12. + offset)* coeff;
548 614 averaged_spec_mat_f0[ 16 + 25 * 13 ] = (13. + offset)* coeff;
549 615 averaged_spec_mat_f0[ 16 + 25 * 14 ] = (14. + offset)* coeff;
550 616
551 617 averaged_spec_mat_f0[ (TOTAL_SIZE_SM/2) + 0 ] = averaged_spec_mat_f0[ 0 ];
552 618 averaged_spec_mat_f0[ (TOTAL_SIZE_SM/2) + 1 ] = averaged_spec_mat_f0[ 1 ];
553 619 averaged_spec_mat_f0[ (TOTAL_SIZE_SM/2) + 2 ] = averaged_spec_mat_f0[ 2 ];
554 620 averaged_spec_mat_f0[ (TOTAL_SIZE_SM/2) + 3 ] = averaged_spec_mat_f0[ 3 ];
555 621 averaged_spec_mat_f0[ (TOTAL_SIZE_SM/2) + 4 ] = averaged_spec_mat_f0[ 4 ];
556 622 averaged_spec_mat_f0[ (TOTAL_SIZE_SM/2) + 5 ] = averaged_spec_mat_f0[ 5 ];
557 623 averaged_spec_mat_f0[ (TOTAL_SIZE_SM/2) + 6 ] = averaged_spec_mat_f0[ 6 ];
558 624 averaged_spec_mat_f0[ (TOTAL_SIZE_SM/2) + 7 ] = averaged_spec_mat_f0[ 7 ];
559 625 averaged_spec_mat_f0[ (TOTAL_SIZE_SM/2) + 8 ] = averaged_spec_mat_f0[ 8 ];
560 626 averaged_spec_mat_f0[ (TOTAL_SIZE_SM/2) + 9 ] = averaged_spec_mat_f0[ 9 ];
561 627 averaged_spec_mat_f0[ (TOTAL_SIZE_SM/2) + 10 ] = averaged_spec_mat_f0[ 10 ];
562 628 averaged_spec_mat_f0[ (TOTAL_SIZE_SM/2) + 11 ] = averaged_spec_mat_f0[ 11 ];
563 629 averaged_spec_mat_f0[ (TOTAL_SIZE_SM/2) + 12 ] = averaged_spec_mat_f0[ 12 ];
564 630 averaged_spec_mat_f0[ (TOTAL_SIZE_SM/2) + 13 ] = averaged_spec_mat_f0[ 13 ];
565 631 averaged_spec_mat_f0[ (TOTAL_SIZE_SM/2) + 14 ] = averaged_spec_mat_f0[ 14 ];
566 632 averaged_spec_mat_f0[ (TOTAL_SIZE_SM/2) + 15 ] = averaged_spec_mat_f0[ 15 ];
633 #else
634 unsigned int i;
635
636 for(i=0; i<TOTAL_SIZE_SM; i++)
637 {
638 if (spectral_matrix_regs->matrixF0_Address0 == (int) spec_mat_f0_0)
639 averaged_spec_mat_f0[i] = (float) spec_mat_f0_0_bis[ SM_HEADER + i ];
640 else
641 averaged_spec_mat_f0[i] = (float) spec_mat_f0_0[ SM_HEADER + i ];
642 }
643 #endif
567 644 }
568 645
569 646 void reset_spectral_matrix_regs()
570 647 {
571 648 #ifdef GSA
572 649 #else
573
650 spectral_matrix_regs->matrixF0_Address0 = (int) spec_mat_f0_0;
651 spectral_matrix_regs->matrixFO_Address1 = (int) spec_mat_f0_1;
652 spectral_matrix_regs->matrixF1_Address = (int) spec_mat_f1;
653 spectral_matrix_regs->matrixF2_Address = (int) spec_mat_f2;
574 654 #endif
575 655 }
656
657 //******************
658 // general functions
659
660
661
662
@@ -1,1291 +1,1306
1 1 #include <tc_handler.h>
2 2 #include <fsw_params.h>
3 3
4 4 char *DumbMessages[6] = {"in DUMB *** default", // RTEMS_EVENT_0
5 5 "in DUMB *** timecode_irq_handler", // RTEMS_EVENT_1
6 6 "in DUMB *** waveforms_isr", // RTEMS_EVENT_2
7 7 "in DUMB *** in SMIQ *** Error sending event to AVF0", // RTEMS_EVENT_3
8 8 "in DUMB *** spectral_matrices_isr *** Error sending event to SMIQ", // RTEMS_EVENT_4
9 9 "in DUMB *** waveforms_simulator_isr" // RTEMS_EVENT_5
10 10 };
11 11
12 12 unsigned char currentTC_LEN_RCV[2]; // SHALL be equal to the current TC packet estimated packet length field
13 13 unsigned char currentTC_COMPUTED_CRC[2];
14 14 unsigned int currentTC_LEN_RCV_AsUnsignedInt;
15 15 unsigned int currentTM_length;
16 16 unsigned char currentTC_processedFlag;
17 17
18 18 unsigned int lookUpTableForCRC[256];
19 19
20 20 //**********************
21 21 // GENERAL USE FUNCTIONS
22 22 unsigned int Crc_opt( unsigned char D, unsigned int Chk)
23 23 {
24 24 return(((Chk << 8) & 0xff00)^lookUpTableForCRC [(((Chk >> 8)^D) & 0x00ff)]);
25 25 }
26 26
27 27 void initLookUpTableForCRC( void )
28 28 {
29 29 unsigned int i;
30 30 unsigned int tmp;
31 31
32 32 for (i=0; i<256; i++)
33 33 {
34 34 tmp = 0;
35 35 if((i & 1) != 0) {
36 36 tmp = tmp ^ 0x1021;
37 37 }
38 38 if((i & 2) != 0) {
39 39 tmp = tmp ^ 0x2042;
40 40 }
41 41 if((i & 4) != 0) {
42 42 tmp = tmp ^ 0x4084;
43 43 }
44 44 if((i & 8) != 0) {
45 45 tmp = tmp ^ 0x8108;
46 46 }
47 47 if((i & 16) != 0) {
48 48 tmp = tmp ^ 0x1231;
49 49 }
50 50 if((i & 32) != 0) {
51 51 tmp = tmp ^ 0x2462;
52 52 }
53 53 if((i & 64) != 0) {
54 54 tmp = tmp ^ 0x48c4;
55 55 }
56 56 if((i & 128) != 0) {
57 57 tmp = tmp ^ 0x9188;
58 58 }
59 59 lookUpTableForCRC[i] = tmp;
60 60 }
61 61 }
62 62
63 63 void GetCRCAsTwoBytes(unsigned char* data, unsigned char* crcAsTwoBytes, unsigned int sizeOfData)
64 64 {
65 65 unsigned int Chk;
66 66 int j;
67 67 Chk = 0xffff; // reset the syndrom to all ones
68 68 for (j=0; j<sizeOfData; j++) {
69 69 Chk = Crc_opt(data[j], Chk);
70 70 }
71 71 crcAsTwoBytes[0] = (unsigned char) (Chk >> 8);
72 72 crcAsTwoBytes[1] = (unsigned char) (Chk & 0x00ff);
73 73 }
74 74
75 75 //*********************
76 76 // ACCEPTANCE FUNCTIONS
77 77 int TC_acceptance(ccsdsTelecommandPacket_t *TC, unsigned int tc_len_recv)
78 78 {
79 79 int ret = 0;
80 80 rtems_status_code status;
81 81 spw_ioctl_pkt_send spw_ioctl_send;
82 82 TMHeader_t TM_header;
83 83 unsigned int code = 0;
84 84 unsigned char computed_CRC[2];
85 85 char data[ PACKET_LENGTH_TC_EXE_CORRUPTED + CCSDS_TC_TM_PACKET_OFFSET - TM_HEADER_LEN ];
86 86
87 87 GetCRCAsTwoBytes( (unsigned char*) TC->packetID, computed_CRC, tc_len_recv + 5 );
88 88 code = TC_parser( TC, tc_len_recv ) ;
89 89 if ( (code == ILLEGAL_APID) | (code == WRONG_LEN_PACKET) | (code == INCOR_CHECKSUM)
90 90 | (code == ILL_TYPE) | (code == ILL_SUBTYPE) | (code == WRONG_APP_DATA) )
91 91 { // generate TM_LFR_TC_EXE_CORRUPTED
92 92 // BUILD HEADER
93 93 TM_build_header( TM_LFR_TC_EXE_ERR, PACKET_LENGTH_TC_EXE_CORRUPTED,
94 94 &TM_header, TC->sourceID); // TC source ID
95 95 // BUILD DATA
96 96 TM_build_data( TC, data, SID_EXE_CORR, computed_CRC);
97 97 // PREPARE TM SENDING
98 98 spw_ioctl_send.hlen = TM_HEADER_LEN + 4; // + 4 is for the protocole extra header
99 99 spw_ioctl_send.hdr = (char*) &TM_header;
100 100 spw_ioctl_send.dlen = 16;
101 101 spw_ioctl_send.data = data;
102 102 // SEND PACKET
103 103 status = ioctl( fdSPW, SPACEWIRE_IOCTRL_SEND, &spw_ioctl_send );
104 104 }
105 105 else { // send valid TC to the action launcher
106 106 status = rtems_message_queue_send( misc_id[0], TC, tc_len_recv + CCSDS_TC_TM_PACKET_OFFSET + 3);
107 107 ret = -1;
108 108 }
109 109 return ret;
110 110 }
111 111
112 112 unsigned char TC_parser(ccsdsTelecommandPacket_t * TMPacket, unsigned int TC_LEN_RCV)
113 113 {
114 114 unsigned char ret = 0;
115 115 unsigned char pid = 0;
116 116 unsigned char category = 0;
117 117 unsigned int length = 0;
118 118 unsigned char packetType = 0;
119 119 unsigned char packetSubtype = 0;
120 120 unsigned char * CCSDSContent = NULL;
121 121
122 122 // APID check *** APID on 2 bytes
123 123 pid = ((TMPacket->packetID[0] & 0x07)<<4) + ( (TMPacket->packetID[1]>>4) & 0x0f ); // PID = 11 *** 7 bits xxxxx210 7654xxxx
124 124 category = (TMPacket->packetID[1] & 0x0f); // PACKET_CATEGORY = 12 *** 4 bits xxxxxxxx xxxx3210
125 125 length = (TMPacket->packetLength[0] * 256) + TMPacket->packetLength[1];
126 126 packetType = TMPacket->serviceType;
127 127 packetSubtype = TMPacket->serviceSubType;
128 128
129 129 if ( pid != CCSDS_PROCESS_ID ) {
130 130 ret = ILLEGAL_APID;
131 131 }
132 132 else if ( category != CCSDS_PACKET_CATEGORY ) {
133 133 ret = ILLEGAL_APID;
134 134 }
135 135 else if (length != TC_LEN_RCV ) { // packet length check
136 136 ret = WRONG_LEN_PACKET; // LEN RCV != SIZE FIELD
137 137 }
138 138 else if ( length >= CCSDS_TC_PKT_MAX_SIZE ) {
139 139 ret = WRONG_LEN_PACKET; // check that the packet does not exceed the MAX size
140 140 }
141 141 else if ( packetType == TC_TYPE_GEN ){ // service type, subtype and packet length check
142 142 switch(packetSubtype){ //subtype, autorized values are 3, 20, 21, 24, 27, 28, 30, 40, 50, 60, 61
143 143 case TC_SUBTYPE_RESET:
144 144 if (length!=(TC_LEN_RESET-CCSDS_TC_TM_PACKET_OFFSET)) {
145 145 ret = WRONG_LEN_PACKET;
146 146 }
147 147 else {
148 148 ret = CCSDS_TM_VALID;
149 149 }
150 150 break;
151 151 case TC_SUBTYPE_LOAD_COMM:
152 152 if (length!=(TC_LEN_LOAD_COMM-CCSDS_TC_TM_PACKET_OFFSET)) {
153 153 ret = WRONG_LEN_PACKET;
154 154 }
155 155 else {
156 156 ret = CCSDS_TM_VALID;
157 157 }
158 158 break;
159 159 case TC_SUBTYPE_LOAD_NORM:
160 160 if (length!=(TC_LEN_LOAD_NORM-CCSDS_TC_TM_PACKET_OFFSET)) {
161 161 ret = WRONG_LEN_PACKET;
162 162 }
163 163 else {
164 164 ret = CCSDS_TM_VALID;
165 165 }
166 166 break;
167 167 case TC_SUBTYPE_LOAD_BURST:
168 168 if (length!=(TC_LEN_LOAD_BURST-CCSDS_TC_TM_PACKET_OFFSET)) {
169 169 ret = WRONG_LEN_PACKET;
170 170 }
171 171 else {
172 172 ret = CCSDS_TM_VALID;
173 173 }
174 174 break;
175 175 case TC_SUBTYPE_LOAD_SBM1:
176 176 if (length!=(TC_LEN_LOAD_SBM1-CCSDS_TC_TM_PACKET_OFFSET)) {
177 177 ret = WRONG_LEN_PACKET;
178 178 }
179 179 else {
180 180 ret = CCSDS_TM_VALID;
181 181 }
182 182 break;
183 183 case TC_SUBTYPE_LOAD_SBM2:
184 184 if (length!=(TC_LEN_LOAD_SBM2-CCSDS_TC_TM_PACKET_OFFSET)) {
185 185 ret = WRONG_LEN_PACKET;
186 186 }
187 187 else {
188 188 ret = CCSDS_TM_VALID;
189 189 }
190 190 break;
191 191 case TC_SUBTYPE_DUMP:
192 192 if (length!=(TC_LEN_DUMP-CCSDS_TC_TM_PACKET_OFFSET)) {
193 193 ret = WRONG_LEN_PACKET;
194 194 }
195 195 else {
196 196 ret = CCSDS_TM_VALID;
197 197 }
198 198 break;
199 199 case TC_SUBTYPE_ENTER:
200 200 if (length!=(TC_LEN_ENTER-CCSDS_TC_TM_PACKET_OFFSET)) {
201 201 ret = WRONG_LEN_PACKET;
202 202 }
203 203 else {
204 204 ret = CCSDS_TM_VALID;
205 205 }
206 206 break;
207 207 case TC_SUBTYPE_UPDT_INFO:
208 208 if (length!=(TC_LEN_UPDT_INFO-CCSDS_TC_TM_PACKET_OFFSET)) {
209 209 ret = WRONG_LEN_PACKET;
210 210 }
211 211 else {
212 212 ret = CCSDS_TM_VALID;
213 213 }
214 214 break;
215 215 case TC_SUBTYPE_EN_CAL:
216 216 if (length!=(TC_LEN_EN_CAL-CCSDS_TC_TM_PACKET_OFFSET)) {
217 217 ret = WRONG_LEN_PACKET;
218 218 }
219 219 else {
220 220 ret = CCSDS_TM_VALID;
221 221 }
222 222 break;
223 223 case TC_SUBTYPE_DIS_CAL:
224 224 if (length!=(TC_LEN_DIS_CAL-CCSDS_TC_TM_PACKET_OFFSET)) {
225 225 ret = WRONG_LEN_PACKET;
226 226 }
227 227 else {
228 228 ret = CCSDS_TM_VALID;
229 229 }
230 230 break;
231 231 default:
232 232 ret = ILL_SUBTYPE;
233 233 break;
234 234 }
235 235 }
236 236 else if ( packetType == TC_TYPE_TIME ){
237 237 if (packetSubtype!=TC_SUBTYPE_UPDT_TIME) {
238 238 ret = ILL_SUBTYPE;
239 239 }
240 240 else if (length!=(TC_LEN_UPDT_TIME-CCSDS_TC_TM_PACKET_OFFSET)) {
241 241 ret = WRONG_LEN_PACKET;
242 242 }
243 243 else {
244 244 ret = CCSDS_TM_VALID;
245 245 }
246 246 }
247 247 else {
248 248 ret = ILL_TYPE;
249 249 }
250 250
251 251 // source ID check // Source ID not documented in the ICD
252 252
253 253 // packet error control, CRC check
254 254 if ( ret == CCSDS_TM_VALID ) {
255 255 CCSDSContent = (unsigned char*) TMPacket->packetID;
256 256 GetCRCAsTwoBytes(CCSDSContent, currentTC_COMPUTED_CRC, length + CCSDS_TC_TM_PACKET_OFFSET - 2); // 2 CRC bytes removed from the calculation of the CRC
257 257 if (currentTC_COMPUTED_CRC[0] != CCSDSContent[length + CCSDS_TC_TM_PACKET_OFFSET -2]) {
258 258 ret = INCOR_CHECKSUM;
259 259 }
260 260 else if (currentTC_COMPUTED_CRC[1] != CCSDSContent[length + CCSDS_TC_TM_PACKET_OFFSET -1]) {
261 261 ret = INCOR_CHECKSUM;
262 262 }
263 263 else {
264 264 ret = CCSDS_TM_VALID;
265 265 }
266 266 }
267 267
268 268 return ret;
269 269 }
270 270
271 271 unsigned char TM_build_header( enum TM_TYPE tm_type, unsigned int packetLength,
272 272 TMHeader_t *TMHeader, unsigned char tc_sid)
273 273 {
274 274 TMHeader->targetLogicalAddress = CCSDS_DESTINATION_ID;
275 275 TMHeader->protocolIdentifier = CCSDS_PROTOCOLE_ID;
276 276 TMHeader->reserved = 0x00;
277 277 TMHeader->userApplication = 0x00;
278 278 TMHeader->packetID[0] = 0x0c;
279 279 TMHeader->packetSequenceControl[0] = 0xc0;
280 280 TMHeader->packetSequenceControl[1] = 0x00;
281 281 TMHeader->packetLength[0] = (unsigned char) (packetLength>>8);
282 282 TMHeader->packetLength[1] = (unsigned char) packetLength;
283 283 TMHeader->spare1_pusVersion_spare2 = 0x10;
284 284 TMHeader->destinationID = TM_DESTINATION_ID_GROUND; // default destination id
285 285 switch (tm_type){
286 286 case(TM_LFR_TC_EXE_OK):
287 287 TMHeader->packetID[1] = (unsigned char) TM_PACKET_ID_TC_EXE;
288 288 TMHeader->serviceType = TM_TYPE_TC_EXE; // type
289 289 TMHeader->serviceSubType = TM_SUBTYPE_EXE_OK; // subtype
290 290 TMHeader->destinationID = tc_sid; // destination id
291 291 break;
292 292 case(TM_LFR_TC_EXE_ERR):
293 293 TMHeader->packetID[1] = (unsigned char) TM_PACKET_ID_TC_EXE;
294 294 TMHeader->serviceType = TM_TYPE_TC_EXE; // type
295 295 TMHeader->serviceSubType = TM_SUBTYPE_EXE_NOK; // subtype
296 296 TMHeader->destinationID = tc_sid;
297 297 break;
298 298 case(TM_LFR_HK):
299 299 TMHeader->packetID[1] = (unsigned char) TM_PACKET_ID_HK;
300 300 TMHeader->serviceType = TM_TYPE_HK; // type
301 301 TMHeader->serviceSubType = TM_SUBTYPE_HK; // subtype
302 302 break;
303 303 case(TM_LFR_SCI):
304 304 TMHeader->packetID[1] = (unsigned char) TM_PACKET_ID_SCIENCE_NORMAL;
305 305 TMHeader->serviceType = TM_TYPE_LFR_SCIENCE; // type
306 306 TMHeader->serviceSubType = TM_SUBTYPE_SCIENCE; // subtype
307 307 break;
308 308 case(TM_LFR_SCI_SBM):
309 309 TMHeader->packetID[1] = (unsigned char) TM_PACKET_ID_SCIENCE_BURST_SBM1_SBM2;
310 310 TMHeader->serviceType = TM_TYPE_LFR_SCIENCE; // type
311 311 TMHeader->serviceSubType = TM_SUBTYPE_SCIENCE; // subtype
312 312 break;
313 313 case(TM_LFR_PAR_DUMP):
314 314 TMHeader->packetID[1] = (unsigned char) TM_PACKET_ID_PARAMETER_DUMP;
315 315 TMHeader->serviceType = TM_TYPE_HK; // type
316 316 TMHeader->serviceSubType = TM_SUBTYPE_HK; // subtype
317 317 break;
318 318 default:
319 319 return 0;
320 320 }
321 321 TMHeader->time[0] = (unsigned char) (time_management_regs->coarse_time>>24);
322 322 TMHeader->time[1] = (unsigned char) (time_management_regs->coarse_time>>16);
323 323 TMHeader->time[2] = (unsigned char) (time_management_regs->coarse_time>>8);
324 324 TMHeader->time[3] = (unsigned char) (time_management_regs->coarse_time);
325 325 TMHeader->time[4] = (unsigned char) (time_management_regs->fine_time>>8);
326 326 TMHeader->time[5] = (unsigned char) (time_management_regs->fine_time);
327 327
328 328 return LFR_SUCCESSFUL;
329 329 }
330 330
331 331 unsigned char TM_build_data(ccsdsTelecommandPacket_t *TC, char* data, unsigned int SID, unsigned char *computed_CRC)
332 332 {
333 333 unsigned int packetLength;
334 334 packetLength = (TC->packetLength[0] * 256) + TC->packetLength[1];
335 335 switch (SID){
336 336 case (SID_NOT_EXE):
337 337 break;
338 338 case (SID_NOT_IMP):
339 339 data[0] = (unsigned char) (SID_NOT_IMP >> 8);
340 340 data[1] = (unsigned char) SID_NOT_IMP;
341 341 data[2] = TC->packetID[0];
342 342 data[3] = TC->packetID[1];
343 343 data[4] = TC->packetSequenceControl[0];
344 344 data[5] = TC->packetSequenceControl[1];
345 345 data[6] = TC->serviceType; // type
346 346 data[7] = TC->serviceSubType; // subtype
347 347 break;
348 348 case (SID_EXE_ERR):
349 349 break;
350 350 case (SID_EXE_CORR):
351 351 data[0] = (unsigned char) (SID_EXE_CORR >> 8);
352 352 data[1] = (unsigned char) SID_EXE_CORR;
353 353 data[2] = TC->packetID[0];
354 354 data[3] = TC->packetID[1];
355 355 data[4] = TC->packetSequenceControl[0];
356 356 data[5] = TC->packetSequenceControl[1];
357 357 data[6] = TC->serviceType; // type
358 358 data[7] = TC->serviceSubType; // subtype
359 359 data[8] = currentTC_LEN_RCV[0];
360 360 data[9] = currentTC_LEN_RCV[1];
361 361 data[10] = TC->packetLength[0];
362 362 data[11] = TC->packetLength[1];
363 363 data[12] = TC->dataAndCRC[packetLength];
364 364 data[13] = TC->dataAndCRC[packetLength+1];
365 365 data[14] = computed_CRC[0];
366 366 data[15] = computed_CRC[1];
367 367 break;
368 368 default:
369 369 return 0;
370 370 }
371 371 return 1;
372 372 }
373 373
374 374 int create_message_queue( void )
375 375 {
376 376 rtems_status_code status;
377 377 misc_name[0] = rtems_build_name( 'Q', 'U', 'E', 'U' );
378 378 status = rtems_message_queue_create( misc_name[0], ACTION_MSG_QUEUE_COUNT, CCSDS_TC_PKT_MAX_SIZE,
379 379 RTEMS_FIFO | RTEMS_LOCAL, &misc_id[0] );
380 380 if (status!=RTEMS_SUCCESSFUL) {
381 381 PRINTF("in create_message_queue *** error creating message queue\n")
382 382 }
383 383
384 384 return 0;
385 385 }
386 386
387 387 //***********
388 388 // RTEMS TASK
389 389 rtems_task recv_task( rtems_task_argument unused )
390 390 {
391 391 int len = 0;
392 392 unsigned int i = 0;
393 393 unsigned int data_length = 0;
394 394 ccsdsTelecommandPacket_t currentTC;
395 395 char data[100];
396 396
397 397 for(i=0; i<100; i++) data[i] = 0;
398 398
399 399 PRINTF("in RECV *** \n")
400 400
401 401 while(1)
402 402 {
403 403 len = read(fdSPW, (char*) &currentTC, CCSDS_TC_PKT_MAX_SIZE); // the call to read is blocking
404 404 if (len == -1){ // error during the read call
405 405 PRINTF("In RECV *** last read call returned -1\n")
406 406 //if (rtems_event_send( Task_id[TASKID_SPIQ], SPW_LINKERR_EVENT ) != RTEMS_SUCCESSFUL) {
407 407 // PRINTF("IN RECV *** Error: rtems_event_send SPW_LINKERR_EVENT\n")
408 408 //}
409 409 //if (rtems_task_suspend(RTEMS_SELF) != RTEMS_SUCCESSFUL) {
410 410 // PRINTF("In RECV *** Error: rtems_task_suspend(RTEMS_SELF)\n")
411 411 //}
412 412 }
413 413 else {
414 414 PRINTF1("Got pck of length %d\n", len+1)
415 415 if ( (len+1) < CCSDS_TC_PKT_MIN_SIZE ) {
416 416 PRINTF("In RECV *** packet lenght too short\n")
417 417 }
418 418 else {
419 419 currentTC_LEN_RCV[0] = 0x00;
420 420 currentTC_LEN_RCV[1] = (unsigned char) (len - CCSDS_TC_TM_PACKET_OFFSET - 3); // build the corresponding packet size field
421 421 currentTC_LEN_RCV_AsUnsignedInt = (unsigned int) (len - CCSDS_TC_TM_PACKET_OFFSET - 3); // => -3 is for Prot ID, Reserved and User App bytes
422 422 // CHECK THE TC AND BUILD THE APPROPRIATE TM
423 423 data_length = TC_acceptance(&currentTC, currentTC_LEN_RCV_AsUnsignedInt);
424 424 if (data_length!=-1)
425 425 {
426 426 }
427 427 }
428 428 }
429 429 }
430 430 }
431 431
432 432 rtems_task actn_task( rtems_task_argument unused )
433 433 {
434 434 int result;
435 435 rtems_status_code status; // RTEMS status code
436 436 ccsdsTelecommandPacket_t TC; // TC sent to the ACTN task
437 437 size_t size; // size of the incoming TC packet
438 438 unsigned char subtype; // subtype of the current TC packet
439 439
440 440 result = LFR_SUCCESSFUL;
441 441 subtype = 0; // subtype of the current TC packet
442 442
443 443 PRINTF("in ACTN *** \n")
444 444
445 445 while(1)
446 446 {
447 447 status = rtems_message_queue_receive(misc_id[0], (char*) &TC, &size,
448 448 RTEMS_WAIT, RTEMS_NO_TIMEOUT);
449 449 if (status!=RTEMS_SUCCESSFUL) PRINTF1("ERR *** in task ACTN *** error receiving a message, code %d \n", status)
450 450 else
451 451 {
452 452 subtype = TC.serviceSubType;
453 453 switch(subtype)
454 454 {
455 455 case TC_SUBTYPE_RESET:
456 456 result = action_default( &TC );
457 457 break;
458 458 //
459 459 case TC_SUBTYPE_LOAD_COMM:
460 460 result = action_load_comm( &TC );
461 461 close_action( &TC, result );
462 462 break;
463 463 //
464 464 case TC_SUBTYPE_LOAD_NORM:
465 465 result = action_load_norm( &TC );
466 466 close_action( &TC, result );
467 467 break;
468 468 //
469 469 case TC_SUBTYPE_LOAD_BURST:
470 result = action_default( &TC );
470 result = action_load_burst( &TC );
471 471 close_action( &TC, result );
472 472 break;
473 473 //
474 474 case TC_SUBTYPE_LOAD_SBM1:
475 result = action_default( &TC );
475 result = action_load_sbm1( &TC );
476 476 close_action( &TC, result );
477 477 break;
478 478 //
479 479 case TC_SUBTYPE_LOAD_SBM2:
480 result = action_default( &TC );
480 result = action_load_sbm2( &TC );
481 481 close_action( &TC, result );
482 482 break;
483 483 //
484 484 case TC_SUBTYPE_DUMP:
485 485 result = action_dump( &TC );
486 486 close_action( &TC, result );
487 487 break;
488 488 //
489 489 case TC_SUBTYPE_ENTER:
490 490 result = action_enter( &TC );
491 491 close_action( &TC, result );
492 492 break;
493 493 //
494 494 case TC_SUBTYPE_UPDT_INFO:
495 495 result = action_updt_info( &TC );
496 496 close_action( &TC, result );
497 497 break;
498 498 //
499 499 case TC_SUBTYPE_EN_CAL:
500 500 result = action_enable_calibration( &TC );
501 501 close_action( &TC, result );
502 502 break;
503 503 //
504 504 case TC_SUBTYPE_DIS_CAL:
505 505 result = action_disable_calibration( &TC );
506 506 close_action( &TC, result );
507 507 break;
508 508 //
509 509 case TC_SUBTYPE_UPDT_TIME:
510 510 result = action_updt_time( &TC );
511 511 break;
512 512 //
513 513 default:
514 514 break;
515 515 }
516 516 }
517 517 }
518 518 }
519 519
520 520 rtems_task dumb_task( rtems_task_argument unused )
521 521 {
522 522 unsigned int i;
523 523 unsigned int intEventOut;
524 524 unsigned int coarse_time = 0;
525 525 unsigned int fine_time = 0;
526 526 rtems_event_set event_out;
527 527
528 528 PRINTF("in DUMB *** \n")
529 529
530 530 while(1){
531 531 rtems_event_receive(RTEMS_EVENT_0 | RTEMS_EVENT_1 | RTEMS_EVENT_2 | RTEMS_EVENT_3 | RTEMS_EVENT_4 | RTEMS_EVENT_5,
532 532 RTEMS_WAIT | RTEMS_EVENT_ANY, RTEMS_NO_TIMEOUT, &event_out); // wait for an RTEMS_EVENT
533 533 intEventOut = (unsigned int) event_out;
534 534 for ( i=0; i<32; i++)
535 535 {
536 536 if ( ((intEventOut >> i) & 0x0001) != 0)
537 537 {
538 538 coarse_time = time_management_regs->coarse_time;
539 539 fine_time = time_management_regs->fine_time;
540 540 printf("in DUMB *** time = coarse: %x, fine: %x, %s\n", coarse_time, fine_time, DumbMessages[i]);
541 541 }
542 542 }
543 543 }
544 544 }
545 545
546 546 //***********
547 547 // TC ACTIONS
548 548
549 549 int action_default(ccsdsTelecommandPacket_t *TC)
550 550 {
551 551 rtems_status_code status;
552 552 TMHeader_t header;
553 553 spw_ioctl_pkt_send spw_ioctl_send;
554 554 unsigned char data[10];
555 555
556 556 TM_build_header( TM_LFR_TC_EXE_ERR, PACKET_LENGTH_TC_EXE_NOT_IMPLEMENTED,
557 557 &header, TC->sourceID);
558 558
559 559 spw_ioctl_send.hlen = TM_HEADER_LEN + 4;
560 560 spw_ioctl_send.hdr = (char *) &header;
561 561 spw_ioctl_send.dlen = 8;
562 562 spw_ioctl_send.data = (char *) data;
563 563 spw_ioctl_send.options = 0;
564 564
565 565 data[0] = (char) (FAILURE_CODE_NOT_IMPLEMENTED >> 8);
566 566 data[1] = (char) FAILURE_CODE_NOT_IMPLEMENTED;
567 567 data[2] = TC->packetID[0];
568 568 data[3] = TC->packetID[1];
569 569 data[4] = TC->packetSequenceControl[0];
570 570 data[5] = TC->packetSequenceControl[1];
571 571 data[6] = TC->serviceType; // type
572 572 data[7] = TC->serviceSubType; // subtype
573 573
574 574 // SEND DATA
575 575 status = write_spw(&spw_ioctl_send);
576 576 if (status != RTEMS_SUCCESSFUL)
577 577 {
578 578 PRINTF("ERR *** in action_default *** send TM packet\n")
579 579 }
580 580
581 581 return LFR_DEFAULT;
582 582 }
583 583
584 584 int action_enter(ccsdsTelecommandPacket_t *TC)
585 585 {
586 586 rtems_status_code status;
587 587 unsigned char requestedMode;
588 588
589 589 requestedMode = TC->dataAndCRC[1];
590 590
591 591 printf("try to enter mode %d\n", requestedMode);
592 592
593 593 status = transition_validation(requestedMode);
594 594
595 595 if ( status == LFR_SUCCESSFUL ) {
596 596 if ( (housekeeping_packet.lfr_status_word[0] & 0xf0) != LFR_MODE_STANDBY)
597 597 {
598 598 status = stop_current_mode();
599 599 }
600 600 if (status != RTEMS_SUCCESSFUL)
601 601 {
602 602 PRINTF("ERR *** in action_enter *** stop_current_mode\n")
603 603 }
604 604 status = enter_mode(requestedMode, TC);
605 605 }
606 606 else
607 607 {
608 608 PRINTF("ERR *** in action_enter *** transition rejected\n")
609 609 send_tm_lfr_tc_exe_not_executable( TC );
610 610 }
611 611
612 612 return status;
613 613 }
614 614
615 615 int action_load_comm(ccsdsTelecommandPacket_t *TC)
616 616 {
617 617 parameter_dump_packet.unused0 = TC->dataAndCRC[0];
618 618 parameter_dump_packet.bw_sp0_sp1_r0_r1 = TC->dataAndCRC[1];
619 619
620 620 set_wfp_data_shaping(parameter_dump_packet.bw_sp0_sp1_r0_r1);
621 621
622 622 return LFR_SUCCESSFUL;
623 623 }
624 624
625 625 int action_load_norm(ccsdsTelecommandPacket_t *TC)
626 626 {
627 627 int result;
628 628 unsigned char lfrMode;
629 629
630 630 lfrMode = (housekeeping_packet.lfr_status_word[0] & 0xf0) >> 4;
631 631
632 632 if ( lfrMode == LFR_MODE_NORMAL ) {
633 633 send_tm_lfr_tc_exe_not_executable( TC );
634 634 result = LFR_DEFAULT;
635 635 }
636 636 else {
637 637 parameter_dump_packet.sy_lfr_n_swf_l[0] = TC->dataAndCRC[0];
638 638 parameter_dump_packet.sy_lfr_n_swf_l[1] = TC->dataAndCRC[1];
639 639
640 640 parameter_dump_packet.sy_lfr_n_swf_p[0] = TC->dataAndCRC[2];
641 641 parameter_dump_packet.sy_lfr_n_swf_p[1] = TC->dataAndCRC[3];
642 642
643 643 parameter_dump_packet.sy_lfr_n_asm_p[0] = TC->dataAndCRC[4];
644 644 parameter_dump_packet.sy_lfr_n_asm_p[1] = TC->dataAndCRC[5];
645 645
646 646 parameter_dump_packet.sy_lfr_n_bp_p0 = TC->dataAndCRC[6];
647 647 parameter_dump_packet.sy_lfr_n_bp_p1 = TC->dataAndCRC[7];
648 648
649 649 result = LFR_SUCCESSFUL;
650 650 }
651 651
652 652 return result;
653 653 }
654 654
655 655 int action_load_burst(ccsdsTelecommandPacket_t *TC)
656 656 {
657 657 int result;
658 658 unsigned char lfrMode;
659 659
660 660 result = LFR_DEFAULT;
661 661 lfrMode = (housekeeping_packet.lfr_status_word[0] & 0xf0) >> 4;
662 662
663 663 if ( lfrMode == LFR_MODE_BURST ) {
664 664 send_tm_lfr_tc_exe_not_executable( TC );
665 665 result = LFR_DEFAULT;
666 666 }
667 667 else {
668 send_tm_lfr_tc_exe_not_implemented( TC );
669 result = LFR_DEFAULT;
668 parameter_dump_packet.sy_lfr_b_bp_p0 = TC->dataAndCRC[0];
669 parameter_dump_packet.sy_lfr_b_bp_p1 = TC->dataAndCRC[1];
670
671 result = LFR_SUCCESSFUL;
670 672 }
671 673
672 674 return result;
673 675 }
674 676
675 677 int action_load_sbm1(ccsdsTelecommandPacket_t *TC)
676 678 {
677 679 int result;
678 680 unsigned char lfrMode;
679 681
680 682 result = LFR_DEFAULT;
681 683 lfrMode = (housekeeping_packet.lfr_status_word[0] & 0xf0) >> 4;
682 684
683 if ( (lfrMode == LFR_MODE_SBM1) | (lfrMode == LFR_MODE_SBM2) ) {
685 if ( lfrMode == LFR_MODE_SBM1 ) {
684 686 send_tm_lfr_tc_exe_not_executable( TC );
685 687 result = LFR_DEFAULT;
686 688 }
687 689 else {
688 send_tm_lfr_tc_exe_not_implemented( TC );
689 result = LFR_DEFAULT;
690 parameter_dump_packet.sy_lfr_s1_bp_p0 = TC->dataAndCRC[0];
691 parameter_dump_packet.sy_lfr_s1_bp_p1 = TC->dataAndCRC[1];
692
693 result = LFR_SUCCESSFUL;
690 694 }
691 695
692 696 return result;
693 697 }
694 698
695 699 int action_load_sbm2(ccsdsTelecommandPacket_t *TC)
696 700 {
697 701 int result;
698 702 unsigned char lfrMode;
699 703
700 704 result = LFR_DEFAULT;
701 705 lfrMode = (housekeeping_packet.lfr_status_word[0] & 0xf0) >> 4;
702 706
703 if ( (lfrMode == LFR_MODE_SBM1) | (lfrMode == LFR_MODE_SBM2) ) {
707 if ( lfrMode == LFR_MODE_SBM2 ) {
704 708 send_tm_lfr_tc_exe_not_executable( TC );
705 709 result = LFR_DEFAULT;
706 710 }
707 711 else {
708 send_tm_lfr_tc_exe_not_implemented( TC );
709 result = LFR_DEFAULT;
712 parameter_dump_packet.sy_lfr_s2_bp_p0 = TC->dataAndCRC[0];
713 parameter_dump_packet.sy_lfr_s2_bp_p1 = TC->dataAndCRC[1];
714
715 result = LFR_SUCCESSFUL;
710 716 }
711 717
712 718 return result;
713 719 }
714 720
715 721 int action_dump(ccsdsTelecommandPacket_t *TC)
716 722 {
717 723 int status;
718 724 // send parameter dump packet
719 725 status = write(fdSPW, (char *) &parameter_dump_packet,
720 726 PACKET_LENGTH_PARAMETER_DUMP + CCSDS_TC_TM_PACKET_OFFSET + 4);
721 727 if (status == -1)
722 728 {
723 729 PRINTF1("in action_dump *** ERR sending packet, code %d", status)
724 730 status = RTEMS_UNSATISFIED;
725 731 }
726 732 else
727 733 {
728 734 status = RTEMS_SUCCESSFUL;
729 735 }
730 736
731 737 return status;
732 738 }
733 739
734 740 int action_updt_info(ccsdsTelecommandPacket_t *TC) {
735 741 unsigned int val;
736 742 int result;
737 743 unsigned char lfrMode;
738 744
739 745 result = LFR_DEFAULT;
740 746 lfrMode = (housekeeping_packet.lfr_status_word[0] & 0xf0) >> 4;
741 747
742 748 if ( (lfrMode == LFR_MODE_STANDBY) ) {
743 749 send_tm_lfr_tc_exe_not_executable( TC );
744 750 result = LFR_DEFAULT;
745 751 }
746 752 else {
747 753 val = housekeeping_packet.hk_lfr_update_info_tc_cnt[0] * 256
748 754 + housekeeping_packet.hk_lfr_update_info_tc_cnt[1];
749 755 val++;
750 756 housekeeping_packet.hk_lfr_update_info_tc_cnt[0] = (unsigned char) (val >> 8);
751 757 housekeeping_packet.hk_lfr_update_info_tc_cnt[1] = (unsigned char) (val);
752 758 result = LFR_SUCCESSFUL;
753 759 }
754 760
755 761 return result;
756 762 }
757 763
758 764 int action_enable_calibration(ccsdsTelecommandPacket_t *TC)
759 765 {
760 766 int result;
761 767 unsigned char lfrMode;
762 768
763 769 result = LFR_DEFAULT;
764 770 lfrMode = (housekeeping_packet.lfr_status_word[0] & 0xf0) >> 4;
765 771
766 772 if ( (lfrMode == LFR_MODE_STANDBY) | (lfrMode == LFR_MODE_BURST) | (lfrMode == LFR_MODE_SBM2) ) {
767 773 send_tm_lfr_tc_exe_not_executable( TC );
768 774 result = LFR_DEFAULT;
769 775 }
770 776 else {
771 777 send_tm_lfr_tc_exe_not_implemented( TC );
772 778 result = LFR_DEFAULT;
773 779 }
774 780 return result;
775 781 }
776 782
777 783 int action_disable_calibration(ccsdsTelecommandPacket_t *TC)
778 784 {
779 785 int result;
780 786 unsigned char lfrMode;
781 787
782 788 result = LFR_DEFAULT;
783 789 lfrMode = (housekeeping_packet.lfr_status_word[0] & 0xf0) >> 4;
784 790
785 791 if ( (lfrMode == LFR_MODE_STANDBY) | (lfrMode == LFR_MODE_BURST) | (lfrMode == LFR_MODE_SBM2) ) {
786 792 send_tm_lfr_tc_exe_not_executable( TC );
787 793 result = LFR_DEFAULT;
788 794 }
789 795 else {
790 796 send_tm_lfr_tc_exe_not_implemented( TC );
791 797 result = LFR_DEFAULT;
792 798 }
793 799 return result;
794 800 }
795 801
796 802 int action_updt_time(ccsdsTelecommandPacket_t *TC)
797 803 {
798 804 unsigned int val;
799 805
800 806 time_management_regs->coarse_time_load = (TC->dataAndCRC[0] << 24)
801 807 + (TC->dataAndCRC[1] << 16)
802 808 + (TC->dataAndCRC[2] << 8)
803 809 + TC->dataAndCRC[3];
804 810 val = housekeeping_packet.hk_lfr_update_time_tc_cnt[0] * 256
805 811 + housekeeping_packet.hk_lfr_update_time_tc_cnt[1];
806 812 val++;
807 813 housekeeping_packet.hk_lfr_update_time_tc_cnt[0] = (unsigned char) (val >> 8);
808 814 housekeeping_packet.hk_lfr_update_time_tc_cnt[1] = (unsigned char) (val);
809 815 //time_management_regs->ctrl = time_management_regs->ctrl | 1;
810 816
811 817 return LFR_SUCCESSFUL;
812 818 }
813 819
814 820 //*******************
815 821 // ENTERING THE MODES
816 822
817 823 int transition_validation(unsigned char requestedMode)
818 824 {
819 825 int status;
820 826 unsigned char lfrMode;
821 827
822 828 lfrMode = (housekeeping_packet.lfr_status_word[0] & 0xf0) >> 4;
823 829
824 830 switch (requestedMode)
825 831 {
826 832 case LFR_MODE_STANDBY:
827 833 if ( lfrMode == LFR_MODE_STANDBY ) {
828 834 status = LFR_DEFAULT;
829 835 }
830 836 else
831 837 {
832 838 status = LFR_SUCCESSFUL;
833 839 }
834 840 break;
835 841 case LFR_MODE_NORMAL:
836 842 if ( lfrMode == LFR_MODE_NORMAL ) {
837 843 status = LFR_DEFAULT;
838 844 }
839 845 else {
840 846 status = LFR_SUCCESSFUL;
841 847 }
842 848 break;
843 849 case LFR_MODE_BURST:
844 if ( lfrMode == LFR_MODE_STANDBY ) {
850 if ( lfrMode == LFR_MODE_BURST ) {
845 851 status = LFR_DEFAULT;
846 852 }
847 853 else {
848 854 status = LFR_SUCCESSFUL;
849 855 }
850 856 break;
851 857 case LFR_MODE_SBM1:
852 858 if ( lfrMode == LFR_MODE_SBM1 ) {
853 859 status = LFR_DEFAULT;
854 860 }
855 861 else {
856 862 status = LFR_SUCCESSFUL;
857 863 }
858 864 break;
859 865 case LFR_MODE_SBM2:
860 866 if ( lfrMode == LFR_MODE_SBM2 ) {
861 867 status = LFR_DEFAULT;
862 868 }
863 869 else {
864 870 status = LFR_SUCCESSFUL;
865 871 }
866 872 break;
867 873 default:
868 874 status = LFR_DEFAULT;
869 875 break;
870 876 }
871 877
872 878 return status;
873 879 }
874 880
875 881 int stop_current_mode()
876 882 {
877 883 rtems_status_code status;
878 884 unsigned char lfrMode;
879 885
880 886 status = RTEMS_SUCCESSFUL;
881 887 lfrMode = (housekeeping_packet.lfr_status_word[0] & 0xf0) >> 4; // get the current mode
882 888
883 889 // mask all IRQ lines related to signal processing
884 890 LEON_Mask_interrupt( IRQ_SM ); // mask spectral matrices interrupt (coming from the timer VHDL IP)
885 891 LEON_Clear_interrupt( IRQ_SM ); // clear spectral matrices interrupt (coming from the timer VHDL IP)
886 892
887 893 #ifdef GSA
888 894 LEON_Mask_interrupt( IRQ_WF ); // mask waveform interrupt (coming from the timer VHDL IP)
889 895 LEON_Clear_interrupt( IRQ_WF ); // clear waveform interrupt (coming from the timer VHDL IP)
890 896 timer_stop( (gptimer_regs_t*) REGS_ADDR_GPTIMER, TIMER_WF_SIMULATOR );
891 897 #else
892 898 LEON_Mask_interrupt( IRQ_WAVEFORM_PICKER ); // mask waveform picker interrupt
893 899 LEON_Clear_interrupt( IRQ_WAVEFORM_PICKER ); // clear waveform picker interrupt
894 900 #endif
895 901 // suspend several tasks
896 902
897 903 if (lfrMode != LFR_MODE_STANDBY) {
898 status = rtems_task_suspend( Task_id[TASKID_AVF0] );
899 if (status == RTEMS_SUCCESSFUL) {
900 status = rtems_task_suspend( Task_id[TASKID_BPF0] );
901 if (status == RTEMS_SUCCESSFUL) {
902 status = rtems_task_suspend( Task_id[TASKID_WFRM] );
903 }
904 }
904 suspend_science_tasks();
905 905 }
906 906
907 907 if (status != RTEMS_SUCCESSFUL)
908 908 {
909 909 PRINTF("ERR *** in stop_current_mode *** suspending tasks\n")
910 910 }
911 911
912 912 // initialize the registers
913 913 #ifdef GSA
914 914 #else
915 915 waveform_picker_regs->burst_enable = 0x00; // initialize
916 916 #endif
917 917
918 918 return status;
919 919 }
920 920
921 921 int enter_mode(unsigned char mode, ccsdsTelecommandPacket_t *TC )
922 922 {
923 923 rtems_status_code status;
924 924
925 925 switch(mode){
926 926 case LFR_MODE_STANDBY:
927 927 status = enter_standby_mode( TC );
928 928 break;
929 929 case LFR_MODE_NORMAL:
930 930 status = enter_normal_mode( TC );
931 931 break;
932 932 case LFR_MODE_BURST:
933 933 status = enter_burst_mode( TC );
934 934 break;
935 935 case LFR_MODE_SBM1:
936 936 status = enter_sbm1_mode( TC );
937 937 break;
938 938 case LFR_MODE_SBM2:
939 939 status = enter_sbm2_mode( TC );
940 940 break;
941 941 default:
942 942 status = RTEMS_UNSATISFIED;
943 943 }
944 944
945 945 if (status == RTEMS_SUCCESSFUL)
946 946 {
947 947 housekeeping_packet.lfr_status_word[0] = (unsigned char) ((mode << 4) + 0x0d);
948 948 }
949 949
950 950 return status;
951 951 }
952 952
953 953 int enter_standby_mode(ccsdsTelecommandPacket_t *TC)
954 954 {
955 955 return LFR_SUCCESSFUL;
956 956 }
957 957
958 958 int enter_normal_mode( ccsdsTelecommandPacket_t *TC )
959 959 {
960 960 rtems_status_code status;
961 961
962 status = rtems_task_restart( Task_id[TASKID_AVF0], 0 );
963 if (status == RTEMS_SUCCESSFUL) {
964 status = rtems_task_restart( Task_id[TASKID_BPF0], 0 );
965 if (status == RTEMS_SUCCESSFUL) {
966 status = rtems_task_restart( Task_id[TASKID_WFRM], 0 );
967 }
968 }
962 status = restart_science_tasks();
969 963
970 964 #ifdef GSA
971 965 timer_start( (gptimer_regs_t*) REGS_ADDR_GPTIMER, TIMER_WF_SIMULATOR );
972 966 timer_start( (gptimer_regs_t*) REGS_ADDR_GPTIMER, TIMER_SM_SIMULATOR );
973 967 LEON_Clear_interrupt( IRQ_WF );
974 968 LEON_Unmask_interrupt( IRQ_WF );
969 //
970 set_local_nb_interrupt_f0_MAX();
975 971 LEON_Clear_interrupt( IRQ_SM ); // the IRQ_SM seems to be incompatible with the IRQ_WF on the xilinx board
976 972 LEON_Unmask_interrupt( IRQ_SM );
977 973 #else
974 // waveform picker
978 975 LEON_Clear_interrupt( IRQ_WAVEFORM_PICKER );
979 976 LEON_Unmask_interrupt( IRQ_WAVEFORM_PICKER );
980 waveform_picker_regs->burst_enable = 0x07;
981 waveform_picker_regs->addr_data_f1 = (int) wf_snap_f1;
982 waveform_picker_regs->status = 0x00;
983 LEON_Clear_interrupt( IRQ_SM ); // the IRQ_SM seems to be incompatible with the IRQ_WF on the xilinx board
984 LEON_Unmask_interrupt( IRQ_SM );
977 reset_waveform_picker_regs();
978 set_wfp_burst_enable_register(LFR_MODE_NORMAL);
979 // spectral matrix
980 //
981 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
983 LEON_Unmask_interrupt( IRQ_SPECTRAL_MATRIX );
984 spectral_matrix_regs->config = 0x01;
985 spectral_matrix_regs->status = 0x00;
985 986 #endif
986 987
987 988 return status;
988 989 }
989 990
990 991 int enter_burst_mode(ccsdsTelecommandPacket_t *TC)
991 992 {
992 993 rtems_status_code status;
993 994 unsigned char lfrMode;
994 995
995 996 lfrMode = (housekeeping_packet.lfr_status_word[0] & 0xf0) >> 4;
996 997
997 status = rtems_task_restart( Task_id[TASKID_AVF0], 0 );
998 if (status == RTEMS_SUCCESSFUL) {
999 status = rtems_task_restart( Task_id[TASKID_BPF0], 0 );
1000 if (status == RTEMS_SUCCESSFUL) {
1001 status = rtems_task_restart( Task_id[TASKID_WFRM], 0 );
1002 }
1003 }
998 status = restart_science_tasks();
1004 999
1005 1000 #ifdef GSA
1006 1001 #else
1007 1002 LEON_Clear_interrupt( IRQ_WAVEFORM_PICKER );
1008 1003 LEON_Unmask_interrupt( IRQ_WAVEFORM_PICKER );
1009 waveform_picker_regs->addr_data_f2 = (int) wf_snap_f2;
1004 reset_waveform_picker_regs();
1005 set_wfp_burst_enable_register(LFR_MODE_BURST);
1010 1006 waveform_picker_regs->burst_enable = 0x40; // [0100 0000] burst f2, f1, f0 enable f3 f2 f1 f0
1011 1007 waveform_picker_regs->burst_enable = waveform_picker_regs->burst_enable | 0x04;
1012 1008 waveform_picker_regs->status = 0x00;
1013 1009 #endif
1014 1010
1015 1011 LEON_Unmask_interrupt( IRQ_SM );
1016 1012
1017 1013 return status;
1018 1014 }
1019 1015
1020 1016 int enter_sbm1_mode(ccsdsTelecommandPacket_t *TC)
1021 1017 {
1022 1018 rtems_status_code status;
1023 1019
1024 status = rtems_task_restart( Task_id[TASKID_AVF0], 0 );
1025 if (status == RTEMS_SUCCESSFUL) {
1026 status = rtems_task_restart( Task_id[TASKID_BPF0], 0 );
1027 if (status == RTEMS_SUCCESSFUL) {
1028 status = rtems_task_restart( Task_id[TASKID_WFRM], 0 );
1029 }
1030 }
1020 status = restart_science_tasks();
1031 1021
1032 // at the beginning of the mode, the parameter local_sbm1_nb_cwf_max has a specific value
1033 param_local.local_sbm1_nb_cwf_max = 2 * (
1034 (parameter_dump_packet.sy_lfr_n_swf_p[0] * 256)
1035 + parameter_dump_packet.sy_lfr_n_swf_p[1]
1036 )/ 4;
1022 set_local_sbm1_nb_cwf_max();
1023
1024 reset_local_sbm1_nb_cwf_sent();
1037 1025
1038 1026 #ifdef GSA
1039 1027 #else
1040 1028 LEON_Clear_interrupt( IRQ_WAVEFORM_PICKER );
1041 1029 LEON_Unmask_interrupt( IRQ_WAVEFORM_PICKER );
1042 waveform_picker_regs->addr_data_f1 = (int) wf_snap_f1;
1043 waveform_picker_regs->burst_enable = 0x20; // [0010 0000] burst f2, f1, f0 enable f3 f2 f1 f0
1044 waveform_picker_regs->burst_enable = waveform_picker_regs->burst_enable | 0x07; // [0111] enable f3 f2 f1 f0
1030 reset_waveform_picker_regs();
1031 set_wfp_burst_enable_register(LFR_MODE_SBM1);
1045 1032 waveform_picker_regs->status = 0x00;
1046 1033 #endif
1047 1034
1048 1035 LEON_Unmask_interrupt( IRQ_SM );
1049 1036
1050 1037 return status;
1051 1038 }
1052 1039
1053 1040 int enter_sbm2_mode(ccsdsTelecommandPacket_t *TC)
1054 1041 {
1055 1042 rtems_status_code status;
1056 1043
1057 status = rtems_task_restart( Task_id[TASKID_AVF0], 0 );
1058 if (status == RTEMS_SUCCESSFUL) {
1059 status = rtems_task_restart( Task_id[TASKID_BPF0], 0 );
1060 if (status == RTEMS_SUCCESSFUL) {
1061 status = rtems_task_restart( Task_id[TASKID_WFRM], 0 );
1062 }
1063 }
1044 status = restart_science_tasks();
1064 1045
1065 // at the beginning of the mode, the parameter local_sbm2_nb_cwf_max has a specific value
1066 param_local.local_sbm1_nb_cwf_max = (
1067 (parameter_dump_packet.sy_lfr_n_swf_p[0] * 256)
1068 + parameter_dump_packet.sy_lfr_n_swf_p[1]
1069 ) / 16;
1046 set_local_sbm2_nb_cwf_max();
1047
1048 reset_local_sbm2_nb_cwf_sent();
1070 1049
1071 1050 #ifdef GSA
1072 1051 #else
1073 1052 LEON_Clear_interrupt( IRQ_WAVEFORM_PICKER );
1074 1053 LEON_Unmask_interrupt( IRQ_WAVEFORM_PICKER );
1075 waveform_picker_regs->addr_data_f2 = (int) wf_snap_f2;
1076 waveform_picker_regs->burst_enable = 0x40; // [0100 0000] burst f2, f1, f0 enable f3 f2 f1 f0
1077 waveform_picker_regs->burst_enable = waveform_picker_regs->burst_enable | 0x04;
1054 reset_waveform_picker_regs();
1055 set_wfp_burst_enable_register(LFR_MODE_SBM2);
1078 1056 waveform_picker_regs->status = 0x00;
1079 1057 #endif
1080 1058
1081 1059 LEON_Unmask_interrupt( IRQ_SM );
1082 1060
1083 1061 return status;
1084 1062 }
1085 1063
1064 int restart_science_tasks()
1065 {
1066 rtems_status_code status;
1067
1068 status = rtems_task_restart( Task_id[TASKID_AVF0], 0 );
1069
1070 if (status == RTEMS_SUCCESSFUL) {
1071 status = rtems_task_restart( Task_id[TASKID_BPF0], 0 );
1072 if (status == RTEMS_SUCCESSFUL) {
1073 status = rtems_task_restart( Task_id[TASKID_WFRM], 0 );
1074 if (status == RTEMS_SUCCESSFUL) {
1075 status = rtems_task_restart( Task_id[TASKID_CWF3], 0 );
1076 }
1077 }
1078 }
1079
1080 return status;
1081 }
1082
1083 int suspend_science_tasks()
1084 {
1085 rtems_status_code status;
1086
1087 status = rtems_task_suspend( Task_id[TASKID_AVF0] );
1088 if (status == RTEMS_SUCCESSFUL) {
1089 status = rtems_task_suspend( Task_id[TASKID_BPF0] );
1090 if (status == RTEMS_SUCCESSFUL) {
1091 status = rtems_task_suspend( Task_id[TASKID_WFRM] );
1092 if (status == RTEMS_SUCCESSFUL) {
1093 status = rtems_task_suspend( Task_id[TASKID_CWF3] );
1094 }
1095 }
1096 }
1097
1098 return status;
1099 }
1100
1086 1101 //****************
1087 1102 // CLOSING ACTIONS
1088 1103
1089 1104 int send_tm_lfr_tc_exe_success(ccsdsTelecommandPacket_t *TC)
1090 1105 {
1091 1106 rtems_status_code status;
1092 1107 TMHeader_t TM_header;
1093 1108 char data[4];
1094 1109 spw_ioctl_pkt_send spw_ioctl_send;
1095 1110
1096 1111 TM_build_header( TM_LFR_TC_EXE_OK, PACKET_LENGTH_TC_EXE_SUCCESS,
1097 1112 &TM_header,
1098 1113 TC->sourceID); // TC source ID
1099 1114
1100 1115 data[0] = TC->packetID[0];
1101 1116 data[1] = TC->packetID[1];
1102 1117 data[2] = TC->packetSequenceControl[0];
1103 1118 data[3] = TC->packetSequenceControl[1];
1104 1119
1105 1120 // filling the structure for the spacewire transmission
1106 1121 spw_ioctl_send.hlen = TM_HEADER_LEN + 4; // + 4 is for the protocole extra header
1107 1122 spw_ioctl_send.hdr = (char*) &TM_header;
1108 1123 spw_ioctl_send.dlen = 4;
1109 1124 spw_ioctl_send.data = data;
1110 1125 spw_ioctl_send.options = 0;
1111 1126
1112 1127 // SEND DATA
1113 1128 status = ioctl( fdSPW, SPACEWIRE_IOCTRL_SEND, &spw_ioctl_send );
1114 1129
1115 1130 return LFR_SUCCESSFUL;
1116 1131 }
1117 1132
1118 1133 int send_tm_lfr_tc_exe_not_executable(ccsdsTelecommandPacket_t *TC)
1119 1134 {
1120 1135 rtems_status_code status;
1121 1136 TMHeader_t TM_header;
1122 1137 char data[10];
1123 1138 spw_ioctl_pkt_send spw_ioctl_send;
1124 1139
1125 1140 TM_build_header( TM_LFR_TC_EXE_ERR, PACKET_LENGTH_TC_EXE_NOT_EXECUTABLE,
1126 1141 &TM_header,
1127 1142 TC->sourceID); // TC source ID
1128 1143
1129 1144 data[0] = (char) (FAILURE_CODE_NOT_EXECUTABLE >> 8);
1130 1145 data[1] = (char) FAILURE_CODE_NOT_EXECUTABLE;
1131 1146 data[2] = TC->packetID[0];
1132 1147 data[3] = TC->packetID[1];
1133 1148 data[4] = TC->packetSequenceControl[0];
1134 1149 data[5] = TC->packetSequenceControl[1];
1135 1150 data[6] = TC->serviceType; // type of the rejected TC
1136 1151 data[7] = TC->serviceSubType; // subtype of the rejected TC
1137 1152 data[8] = housekeeping_packet.lfr_status_word[0];
1138 1153 data[6] = housekeeping_packet.lfr_status_word[1];
1139 1154
1140 1155 // filling the structure for the spacewire transmission
1141 1156 spw_ioctl_send.hlen = TM_HEADER_LEN + 4; // + 4 is for the protocole extra header
1142 1157 spw_ioctl_send.hdr = (char*) &TM_header;
1143 1158 spw_ioctl_send.dlen = 10;
1144 1159 spw_ioctl_send.data = data;
1145 1160 spw_ioctl_send.options = 0;
1146 1161
1147 1162 // SEND DATA
1148 1163 status = ioctl( fdSPW, SPACEWIRE_IOCTRL_SEND, &spw_ioctl_send );
1149 1164
1150 1165 return LFR_SUCCESSFUL;
1151 1166 }
1152 1167
1153 1168 int send_tm_lfr_tc_exe_not_implemented(ccsdsTelecommandPacket_t *TC)
1154 1169 {
1155 1170 rtems_status_code status;
1156 1171 TMHeader_t TM_header;
1157 1172 char data[8];
1158 1173 spw_ioctl_pkt_send spw_ioctl_send;
1159 1174
1160 1175 TM_build_header( TM_LFR_TC_EXE_ERR, PACKET_LENGTH_TC_EXE_NOT_IMPLEMENTED,
1161 1176 &TM_header,
1162 1177 TC->sourceID); // TC source ID
1163 1178
1164 1179 data[0] = (char) (FAILURE_CODE_NOT_IMPLEMENTED >> 8);
1165 1180 data[1] = (char) FAILURE_CODE_NOT_IMPLEMENTED;
1166 1181 data[2] = TC->packetID[0];
1167 1182 data[3] = TC->packetID[1];
1168 1183 data[4] = TC->packetSequenceControl[0];
1169 1184 data[5] = TC->packetSequenceControl[1];
1170 1185 data[6] = TC->serviceType; // type of the rejected TC
1171 1186 data[7] = TC->serviceSubType; // subtype of the rejected TC
1172 1187
1173 1188 // filling the structure for the spacewire transmission
1174 1189 spw_ioctl_send.hlen = TM_HEADER_LEN + 4; // + 4 is for the protocole extra header
1175 1190 spw_ioctl_send.hdr = (char*) &TM_header;
1176 1191 spw_ioctl_send.dlen = 8;
1177 1192 spw_ioctl_send.data = data;
1178 1193 spw_ioctl_send.options = 0;
1179 1194
1180 1195 // SEND DATA
1181 1196 status = ioctl( fdSPW, SPACEWIRE_IOCTRL_SEND, &spw_ioctl_send );
1182 1197
1183 1198 return LFR_SUCCESSFUL;
1184 1199 }
1185 1200
1186 1201 int send_tm_lfr_tc_exe_error(ccsdsTelecommandPacket_t *TC)
1187 1202 {
1188 1203 rtems_status_code status;
1189 1204 TMHeader_t TM_header;
1190 1205 char data[8];
1191 1206 spw_ioctl_pkt_send spw_ioctl_send;
1192 1207
1193 1208 TM_build_header( TM_LFR_TC_EXE_ERR, PACKET_LENGTH_TC_EXE_ERROR,
1194 1209 &TM_header,
1195 1210 TC->sourceID); // TC source ID
1196 1211
1197 1212 data[0] = (char) (FAILURE_CODE_ERROR >> 8);
1198 1213 data[1] = (char) FAILURE_CODE_ERROR;
1199 1214 data[2] = TC->packetID[0];
1200 1215 data[3] = TC->packetID[1];
1201 1216 data[4] = TC->packetSequenceControl[0];
1202 1217 data[5] = TC->packetSequenceControl[1];
1203 1218 data[6] = TC->serviceType; // type of the rejected TC
1204 1219 data[7] = TC->serviceSubType; // subtype of the rejected TC
1205 1220
1206 1221 // filling the structure for the spacewire transmission
1207 1222 spw_ioctl_send.hlen = TM_HEADER_LEN + 4; // + 4 is for the protocole extra header
1208 1223 spw_ioctl_send.hdr = (char*) &TM_header;
1209 1224 spw_ioctl_send.dlen = 8;
1210 1225 spw_ioctl_send.data = data;
1211 1226 spw_ioctl_send.options = 0;
1212 1227
1213 1228 // SEND DATA
1214 1229 status = ioctl( fdSPW, SPACEWIRE_IOCTRL_SEND, &spw_ioctl_send );
1215 1230
1216 1231 return LFR_SUCCESSFUL;
1217 1232 }
1218 1233
1219 1234 void update_last_TC_exe(ccsdsTelecommandPacket_t *TC)
1220 1235 {
1221 1236 housekeeping_packet.hk_lfr_last_exe_tc_id[0] = TC->packetID[0];
1222 1237 housekeeping_packet.hk_lfr_last_exe_tc_id[1] = TC->packetID[1];
1223 1238 housekeeping_packet.hk_lfr_last_exe_tc_type[0] = 0x00;
1224 1239 housekeeping_packet.hk_lfr_last_exe_tc_type[1] = TC->serviceType;
1225 1240 housekeeping_packet.hk_lfr_last_exe_tc_subtype[0] = 0x00;
1226 1241 housekeeping_packet.hk_lfr_last_exe_tc_subtype[1] = TC->serviceSubType;
1227 1242 housekeeping_packet.hk_lfr_last_exe_tc_time[0] = (unsigned char) (time_management_regs->coarse_time>>24);
1228 1243 housekeeping_packet.hk_lfr_last_exe_tc_time[1] = (unsigned char) (time_management_regs->coarse_time>>16);
1229 1244 housekeeping_packet.hk_lfr_last_exe_tc_time[2] = (unsigned char) (time_management_regs->coarse_time>>8);
1230 1245 housekeeping_packet.hk_lfr_last_exe_tc_time[3] = (unsigned char) (time_management_regs->coarse_time);
1231 1246 housekeeping_packet.hk_lfr_last_exe_tc_time[4] = (unsigned char) (time_management_regs->fine_time>>8);
1232 1247 housekeeping_packet.hk_lfr_last_exe_tc_time[5] = (unsigned char) (time_management_regs->fine_time);
1233 1248 }
1234 1249
1235 1250 void update_last_TC_rej(ccsdsTelecommandPacket_t *TC)
1236 1251 {
1237 1252 housekeeping_packet.hk_lfr_last_rej_tc_id[0] = TC->packetID[0];
1238 1253 housekeeping_packet.hk_lfr_last_rej_tc_id[1] = TC->packetID[1];
1239 1254 housekeeping_packet.hk_lfr_last_rej_tc_type[0] = 0x00;
1240 1255 housekeeping_packet.hk_lfr_last_rej_tc_type[1] = TC->serviceType;
1241 1256 housekeeping_packet.hk_lfr_last_rej_tc_subtype[0] = 0x00;
1242 1257 housekeeping_packet.hk_lfr_last_rej_tc_subtype[1] = TC->serviceSubType;
1243 1258 housekeeping_packet.hk_lfr_last_rej_tc_time[0] = (unsigned char) (time_management_regs->coarse_time>>24);
1244 1259 housekeeping_packet.hk_lfr_last_rej_tc_time[1] = (unsigned char) (time_management_regs->coarse_time>>16);
1245 1260 housekeeping_packet.hk_lfr_last_rej_tc_time[2] = (unsigned char) (time_management_regs->coarse_time>>8);
1246 1261 housekeeping_packet.hk_lfr_last_rej_tc_time[3] = (unsigned char) (time_management_regs->coarse_time);
1247 1262 housekeeping_packet.hk_lfr_last_rej_tc_time[4] = (unsigned char) (time_management_regs->fine_time>>8);
1248 1263 housekeeping_packet.hk_lfr_last_rej_tc_time[5] = (unsigned char) (time_management_regs->fine_time);
1249 1264 }
1250 1265
1251 1266 void close_action(ccsdsTelecommandPacket_t *TC, int result)
1252 1267 {
1253 1268 unsigned int val = 0;
1254 1269 if (result == LFR_SUCCESSFUL)
1255 1270 {
1256 1271 send_tm_lfr_tc_exe_success( TC );
1257 1272 update_last_TC_exe( TC );
1258 1273 val = housekeeping_packet.hk_dpu_exe_tc_lfr_cnt[0] * 256 + housekeeping_packet.hk_dpu_exe_tc_lfr_cnt[1];
1259 1274 val++;
1260 1275 housekeeping_packet.hk_dpu_exe_tc_lfr_cnt[0] = (unsigned char) (val >> 8);
1261 1276 housekeeping_packet.hk_dpu_exe_tc_lfr_cnt[1] = (unsigned char) (val);
1262 1277 }
1263 1278 else
1264 1279 {
1265 1280 update_last_TC_rej( TC );
1266 1281 val = housekeeping_packet.hk_dpu_rej_tc_lfr_cnt[0] * 256 + housekeeping_packet.hk_dpu_rej_tc_lfr_cnt[1];
1267 1282 val++;
1268 1283 housekeeping_packet.hk_dpu_rej_tc_lfr_cnt[0] = (unsigned char) (val >> 8);
1269 1284 housekeeping_packet.hk_dpu_rej_tc_lfr_cnt[1] = (unsigned char) (val);
1270 1285 }
1271 1286 }
1272 1287
1273 1288 //***************************
1274 1289 // Interrupt Service Routines
1275 1290 rtems_isr commutation_isr1( rtems_vector_number vector )
1276 1291 {
1277 1292 if (rtems_event_send( Task_id[TASKID_DUMB], RTEMS_EVENT_0 ) != RTEMS_SUCCESSFUL) {
1278 1293 printf("In commutation_isr1 *** Error sending event to DUMB\n");
1279 1294 }
1280 1295 }
1281 1296
1282 1297 rtems_isr commutation_isr2( rtems_vector_number vector )
1283 1298 {
1284 1299 if (rtems_event_send( Task_id[TASKID_DUMB], RTEMS_EVENT_0 ) != RTEMS_SUCCESSFUL) {
1285 1300 printf("In commutation_isr2 *** Error sending event to DUMB\n");
1286 1301 }
1287 1302 }
1288 1303
1289 1304
1290 1305
1291 1306
@@ -1,694 +1,826
1 1 #include <wf_handler.h>
2 2
3 3 rtems_isr waveforms_isr( rtems_vector_number vector )
4 4 {
5 5 unsigned char lfrMode;
6 6 lfrMode = (housekeeping_packet.lfr_status_word[0] & 0xf0) >> 4;
7 7
8 #ifdef GSA
9 #else
10 if ( (lfrMode != LFR_MODE_STANDBY) & (lfrMode != LFR_MODE_BURST) )
11 { // in modes other than STANDBY and BURST, send the CWF_F3 data
12 if ((waveform_picker_regs->status & 0x08) == 0x08){ // f3 is full
13 // (1) change the receiving buffer for the waveform picker
14 if (waveform_picker_regs->addr_data_f3 == (int) wf_cont_f3) {
15 waveform_picker_regs->addr_data_f3 = (int) (wf_cont_f3_bis);
16 }
17 else {
18 waveform_picker_regs->addr_data_f3 = (int) (wf_cont_f3);
19 }
20 // (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) {
22 rtems_event_send( Task_id[TASKID_DUMB], RTEMS_EVENT_2 );
23 }
24 waveform_picker_regs->status = waveform_picker_regs->status & 0x0007; // reset the f3 full bit to 0
25 }
26 }
27 #endif
28
8 29 switch(lfrMode)
9 30 {
10 31 //********
11 32 // STANDBY
12 33 case(LFR_MODE_STANDBY):
13 34 break;
14 35
15 36 //******
16 37 // NORMAL
17 38 case(LFR_MODE_NORMAL):
18 39 #ifdef GSA
19 40 PRINTF("in waveform_isr *** unexpected waveform picker interruption\n")
20 41 #else
21 if ( (waveform_picker_regs->burst_enable & 0x7) == 0x0 ){// if no channel is enable
22 if (rtems_event_send( Task_id[TASKID_DUMB], RTEMS_EVENT_2 ) != RTEMS_SUCCESSFUL) {
23 PRINTF("in waveform_isr *** Error sending event to DUMB\n");
24 }
42 if ( (waveform_picker_regs->burst_enable & 0x7) == 0x0 ){ // if no channel is enable
43 rtems_event_send( Task_id[TASKID_DUMB], RTEMS_EVENT_2 );
25 44 }
26 45 else {
27 if ( (waveform_picker_regs->status & 0x7) == 0x7 ){ // f2 f1 and f0 are full
28 waveform_picker_regs->burst_enable = 0x00;
46 if ( (waveform_picker_regs->status & 0x7) == 0x7 ){ // f2 f1 and f0 are full
47 waveform_picker_regs->burst_enable = waveform_picker_regs->burst_enable & 0x08;
29 48 if (rtems_event_send( Task_id[TASKID_WFRM], RTEMS_EVENT_MODE_NORMAL ) != RTEMS_SUCCESSFUL) {
30 if (rtems_event_send( Task_id[TASKID_DUMB], RTEMS_EVENT_2 ) != RTEMS_SUCCESSFUL) {
31 PRINTF("in waveform_isr *** Error sending event to DUMB\n");
32 }
49 rtems_event_send( Task_id[TASKID_DUMB], RTEMS_EVENT_2 );
33 50 }
34 51 }
35 52 }
36 53 #endif
37 54 break;
38 55
39 56 //******
40 57 // BURST
41 58 case(LFR_MODE_BURST):
42 59 #ifdef GSA
43 60 PRINTF("in waveform_isr *** unexpected waveform picker interruption\n")
44 61 #else
45 62 if (waveform_picker_regs->burst_enable == 0x44) {
46 63 if (waveform_picker_regs->addr_data_f2 == (int) wf_snap_f2) {
47 64 waveform_picker_regs->addr_data_f2 = (int) (wf_snap_f2_bis);
48 65 }
49 66 else {
50 67 waveform_picker_regs->addr_data_f2 = (int) (wf_snap_f2);
51 68 }
52 69 if (rtems_event_send( Task_id[TASKID_WFRM], RTEMS_EVENT_MODE_BURST ) != RTEMS_SUCCESSFUL) {
53 70 PRINTF("in waveforms_isr *** Error sending event to WFRM\n")
54 71 rtems_event_send( Task_id[TASKID_DUMB], RTEMS_EVENT_2 );
55 72 }
56 73 }
57 74 waveform_picker_regs->status = 0x00;
58 75 #endif
59 76 break;
60 77
61 78 //*****
62 79 // SBM1
63 80 case(LFR_MODE_SBM1):
64 81 #ifdef GSA
65 82 PRINTF("in waveform_isr *** unexpected waveform picker interruption\n")
66 83 #else
67 if ((waveform_picker_regs->status & 0x02) == 0x02){ // check the f1 full bit
84 if ((waveform_picker_regs->status & 0x02) == 0x02){ // [0010] check the f1 full bit
68 85 // (1) change the receiving buffer for the waveform picker
69 86 if (waveform_picker_regs->addr_data_f1 == (int) wf_snap_f1) {
70 87 waveform_picker_regs->addr_data_f1 = (int) (wf_snap_f1_bis);
71 88 }
72 89 else {
73 90 waveform_picker_regs->addr_data_f1 = (int) (wf_snap_f1);
74 91 }
75 92 // (2) send an event for the waveforms transmission
76 93 if (rtems_event_send( Task_id[TASKID_WFRM], RTEMS_EVENT_MODE_SBM1 ) != RTEMS_SUCCESSFUL) {
77 94 PRINTF("in waveforms_isr *** Error sending event to WFRM\n")
78 95 rtems_event_send( Task_id[TASKID_DUMB], RTEMS_EVENT_2 );
79 96 }
80 97 waveform_picker_regs->status = waveform_picker_regs->status & 0x000d; // reset the f1 full bit to 0
81 98 }
82 if ( ( (waveform_picker_regs->status & 0x05) == 0x05 ) ) { // [0101] f3 f2 f1 f0, check the f2 and f0 full bit
99 if ( ( (waveform_picker_regs->status & 0x05) == 0x05 ) ) { // [0101] check the f2 and f0 full bit
83 100 if (rtems_event_send( Task_id[TASKID_WFRM], RTEMS_EVENT_MODE_NORMAL ) != RTEMS_SUCCESSFUL) {
84 101 PRINTF("in waveforms_isr *** Error sending event to WFRM\n")
85 102 rtems_event_send( Task_id[TASKID_DUMB], RTEMS_EVENT_2 );
86 103 }
87 104 waveform_picker_regs->burst_enable = waveform_picker_regs->burst_enable | 0x05; // [0101] // enable f2 and f0
88 105 waveform_picker_regs->status = waveform_picker_regs->status & 0xfffffaaa; // set to 0 the bits related to f2 and f0
89 106 }
107
90 108 #endif
91 109 break;
92 110
93 111 //*****
94 112 // SBM2
95 113 case(LFR_MODE_SBM2):
96 114 #ifdef GSA
97 115 PRINTF("in waveform_isr *** unexpected waveform picker interruption\n")
98 116 #else
99 117 if ((waveform_picker_regs->status & 0x04) == 0x04){ // check the f2 full bit
100 118 // (1) change the receiving buffer for the waveform picker
101 119 if (waveform_picker_regs->addr_data_f2 == (int) wf_snap_f2) {
102 120 waveform_picker_regs->addr_data_f2 = (int) (wf_snap_f2_bis);
103 121 }
104 122 else {
105 123 waveform_picker_regs->addr_data_f2 = (int) (wf_snap_f2);
106 124 }
107 125 // (2) send an event for the waveforms transmission
108 126 if (rtems_event_send( Task_id[TASKID_WFRM], RTEMS_EVENT_MODE_SBM2 ) != RTEMS_SUCCESSFUL) {
109 127 PRINTF("in waveforms_isr *** Error sending event to WFRM\n")
110 128 rtems_event_send( Task_id[TASKID_DUMB], RTEMS_EVENT_2 );
111 129 }
112 130 waveform_picker_regs->status = waveform_picker_regs->status & 0xfffffbbb; // [1011]
113 131 }
114 132 if ( ( (waveform_picker_regs->status & 0x03) == 0x03 ) ) { // [0011] f3 f2 f1 f0, check the f2 and f0 full bit
115 133 if (rtems_event_send( Task_id[TASKID_WFRM], RTEMS_EVENT_MODE_NORMAL ) != RTEMS_SUCCESSFUL) {
116 134 PRINTF("in waveforms_isr *** Error sending event to WFRM\n")
117 135 rtems_event_send( Task_id[TASKID_DUMB], RTEMS_EVENT_2 );
118 136 }
119 137 waveform_picker_regs->burst_enable = waveform_picker_regs->burst_enable | 0x03; // [0011] // enable f2 and f0
120 138 waveform_picker_regs->status = waveform_picker_regs->status & 0xfffffccc; // set to 0 the bits related to f1 and f0
121 139 }
122 140 #endif
123 141 break;
124 142
125 143 //********
126 144 // DEFAULT
127 145 default:
128 146 break;
129 147 }
130 148 }
131 149
132 150 rtems_isr waveforms_simulator_isr( rtems_vector_number vector )
133 151 {
134 152 unsigned char lfrMode;
135 153 lfrMode = (housekeeping_packet.lfr_status_word[0] & 0xf0) >> 4;
136 154
137 155 switch(lfrMode) {
138 156 case (LFR_MODE_STANDBY):
139 157 break;
140 158 case (LFR_MODE_NORMAL):
141 159 if (rtems_event_send( Task_id[TASKID_WFRM], RTEMS_EVENT_MODE_NORMAL ) != RTEMS_SUCCESSFUL) {
142 160 rtems_event_send( Task_id[TASKID_DUMB], RTEMS_EVENT_5 );
143 161 }
144 162 break;
145 163 case (LFR_MODE_BURST):
146 164 break;
147 165 case (LFR_MODE_SBM1):
148 166 break;
149 167 case (LFR_MODE_SBM2):
150 168 break;
151 169 }
152 170 }
153 171
154 172 rtems_task wfrm_task(rtems_task_argument argument) //used with the waveform picker VHDL IP
155 173 {
156 174 unsigned int i;
157 175 unsigned int intEventOut;
158 176 spw_ioctl_pkt_send spw_ioctl_send_SWF;
159 177 spw_ioctl_pkt_send spw_ioctl_send_CWF;
160 178 rtems_event_set event_out;
161 179 Header_TM_LFR_SCIENCE_SWF_t headerSWF;
162 180 Header_TM_LFR_SCIENCE_CWF_t headerCWF;
163 181
164 182 init_header_snapshot_wf( &headerSWF );
165 183 init_header_continuous_wf( &headerCWF );
166 184
167 185 // BUILD THE PACKET HEADERS
168 186 spw_ioctl_send_SWF.hlen = TM_HEADER_LEN + 4 + 12; // + 4 is for the protocole extra header, + 12 is for the auxiliary header
169 187 spw_ioctl_send_SWF.hdr = (char*) &headerSWF;
170 188 spw_ioctl_send_SWF.options = 0;
171 189
172 190 spw_ioctl_send_CWF.hlen = TM_HEADER_LEN + 4 + 10; // + 4 is for the protocole extra header, + 10 is for the auxiliary header
173 191 spw_ioctl_send_CWF.hdr = (char*) &headerCWF;
174 192 spw_ioctl_send_CWF.options = 0;
175 193
176 194 init_waveforms();
177 195
178 196 PRINTF("in WFRM ***\n")
179 197
180 198 while(1){
181 199 // wait for an RTEMS_EVENT
182 200 rtems_event_receive(RTEMS_EVENT_0 | RTEMS_EVENT_1 | RTEMS_EVENT_2 | RTEMS_EVENT_3 | RTEMS_EVENT_4,
183 201 RTEMS_WAIT | RTEMS_EVENT_ANY, RTEMS_NO_TIMEOUT, &event_out);
184 202 intEventOut = (unsigned int) event_out;
185 203 for (i = 0; i< 5; i++) {
186 204 if ( ( (intEventOut >> i) & 0x0001) != 0 ) {
205
187 206 switch(i) {
207
188 208 case(LFR_MODE_NORMAL):
189 send_waveform_norm( &headerSWF, &spw_ioctl_send_SWF);
209 send_waveform_norm( &headerSWF, &spw_ioctl_send_SWF );
190 210 break;
211
191 212 case(LFR_MODE_BURST):
192 send_waveform_burst( &headerCWF, &spw_ioctl_send_CWF);
213 send_waveform_burst( &headerCWF, &spw_ioctl_send_CWF );
193 214 break;
215
194 216 case(LFR_MODE_SBM1):
195 send_waveform_sbm1( &headerCWF, &spw_ioctl_send_CWF);
217 send_waveform_sbm1( &headerCWF, &spw_ioctl_send_CWF );
196 218 #ifdef GSA
197 219 #else
198 param_local.local_sbm1_nb_cwf_sent ++;
199 220 if ( param_local.local_sbm1_nb_cwf_sent == (param_local.local_sbm1_nb_cwf_max-1) ) {
200 221 // send the f1 buffer as a NORM snapshot
201 222 if (waveform_picker_regs->addr_data_f1 == (int) wf_snap_f1) {
202 223 send_waveform_SWF( &headerSWF, wf_snap_f1_bis, SID_NORM_SWF_F1, &spw_ioctl_send_SWF );
203 224 }
204 225 else {
205 226 send_waveform_SWF( &headerSWF, wf_snap_f1, SID_NORM_SWF_F1, &spw_ioctl_send_SWF );
206 227 }
228 reset_local_sbm1_nb_cwf_sent();
229 }
230 else {
231 param_local.local_sbm1_nb_cwf_sent ++;
207 232 }
208 233 #endif
209 234 break;
235
210 236 case(LFR_MODE_SBM2):
211 send_waveform_sbm2( &headerCWF, &spw_ioctl_send_CWF);
237 send_waveform_sbm2( &headerCWF, &spw_ioctl_send_CWF );
212 238 #ifdef GSA
213 239 #else
214 param_local.local_sbm2_nb_cwf_sent ++;
215 240 if ( param_local.local_sbm2_nb_cwf_sent == (param_local.local_sbm2_nb_cwf_max-1) ) {
216 241 // send the f2 buffer as a NORM snapshot
217 242 if (waveform_picker_regs->addr_data_f2 == (int) wf_snap_f2) {
218 243 send_waveform_SWF( &headerSWF, wf_snap_f2_bis, SID_NORM_SWF_F2, &spw_ioctl_send_SWF );
219 244 }
220 245 else {
221 246 send_waveform_SWF( &headerSWF, wf_snap_f2, SID_NORM_SWF_F2, &spw_ioctl_send_SWF );
222 247 }
248 reset_local_sbm2_nb_cwf_sent();
249 }
250 else {
251 param_local.local_sbm2_nb_cwf_sent ++;
223 252 }
224 253 #endif
225 254 break;
255
226 256 default:
227 257 break;
228 258 }
229 259 }
230 260 }
231 261 }
232 262 }
233 263
264 rtems_task cwf3_task(rtems_task_argument argument) //used with the waveform picker VHDL IP
265 {
266 spw_ioctl_pkt_send spw_ioctl_send_CWF;
267 rtems_event_set event_out;
268 Header_TM_LFR_SCIENCE_CWF_t headerCWF;
269
270 init_header_continuous_wf( &headerCWF );
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
277 PRINTF("in CWF3 ***\n")
278
279 while(1){
280 // wait for an RTEMS_EVENT
281 rtems_event_receive( RTEMS_EVENT_5,
282 RTEMS_WAIT | RTEMS_EVENT_ANY, RTEMS_NO_TIMEOUT, &event_out);
283 PRINTF("send CWF F3 \n")
284 send_waveform_norm_cwf_f3( &headerCWF, &spw_ioctl_send_CWF );
285 }
286 }
287
234 288 //******************
235 289 // general functions
236 290 void init_waveforms( void )
237 291 {
238 292 int i = 0;
239 293
240 294 for (i=0; i< NB_SAMPLES_PER_SNAPSHOT; i++)
241 295 {
242 296 //***
243 297 // F0
244 298 wf_snap_f0[ (i* NB_WORDS_SWF_BLK) + 0 + TIME_OFFSET ] = 0x88887777; //
245 299 wf_snap_f0[ (i* NB_WORDS_SWF_BLK) + 1 + TIME_OFFSET ] = 0x22221111; //
246 300 wf_snap_f0[ (i* NB_WORDS_SWF_BLK) + 2 + TIME_OFFSET ] = 0x44443333; //
247 301
248 302 //***
249 303 // F1
250 304 wf_snap_f1[ (i* NB_WORDS_SWF_BLK) + 0 + TIME_OFFSET ] = 0x22221111;
251 305 wf_snap_f1[ (i* NB_WORDS_SWF_BLK) + 1 + TIME_OFFSET ] = 0x44443333;
252 306 wf_snap_f1[ (i* NB_WORDS_SWF_BLK) + 2 + TIME_OFFSET ] = 0xaaaa0000;
253 307
254 308 //***
255 309 // F2
256 310 wf_snap_f2[ (i* NB_WORDS_SWF_BLK) + 0 + TIME_OFFSET ] = 0x44443333;
257 311 wf_snap_f2[ (i* NB_WORDS_SWF_BLK) + 1 + TIME_OFFSET ] = 0x22221111;
258 312 wf_snap_f2[ (i* NB_WORDS_SWF_BLK) + 2 + TIME_OFFSET ] = 0xaaaa0000;
259 313
260 314 //***
261 315 // F3
262 316 //wf_cont_f3[ (i* NB_WORDS_SWF_BLK) + 0 ] = val1;
263 317 //wf_cont_f3[ (i* NB_WORDS_SWF_BLK) + 1 ] = val2;
264 318 //wf_cont_f3[ (i* NB_WORDS_SWF_BLK) + 2 ] = 0xaaaa0000;
265 319 }
266 320 }
267 321
268 322 void init_header_snapshot_wf( Header_TM_LFR_SCIENCE_SWF_t *header)
269 323 {
270 324 header->targetLogicalAddress = CCSDS_DESTINATION_ID;
271 325 header->protocolIdentifier = CCSDS_PROTOCOLE_ID;
272 326 header->reserved = 0x00;
273 327 header->userApplication = CCSDS_USER_APP;
274 328 header->packetID[0] = (unsigned char) (TM_PACKET_ID_SCIENCE_NORMAL >> 8);
275 329 header->packetID[1] = (unsigned char) (TM_PACKET_ID_SCIENCE_NORMAL);
276 330 header->packetSequenceControl[0] = 0xc0;
277 331 header->packetSequenceControl[1] = 0x00;
278 332 header->packetLength[0] = 0x00;
279 333 header->packetLength[1] = 0x00;
280 334 // DATA FIELD HEADER
281 335 header->spare1_pusVersion_spare2 = 0x10;
282 336 header->serviceType = TM_TYPE_LFR_SCIENCE; // service type
283 337 header->serviceSubType = TM_SUBTYPE_LFR_SCIENCE; // service subtype
284 338 header->destinationID = TM_DESTINATION_ID_GROUND;
285 339 // AUXILIARY DATA HEADER
286 340 header->sid = 0x00;
287 341 header->hkBIA = 0x1f;
288 342 header->pktCnt = 0x07; // PKT_CNT
289 343 header->pktNr = 0x00; // PKT_NR
290 344 header->time[0] = 0x00;
291 345 header->time[0] = 0x00;
292 346 header->time[0] = 0x00;
293 347 header->time[0] = 0x00;
294 348 header->time[0] = 0x00;
295 349 header->time[0] = 0x00;
296 350 header->blkNr[0] = 0x00; // BLK_NR MSB
297 351 header->blkNr[1] = 0x00; // BLK_NR LSB
298 352 }
299 353
300 354 void init_header_continuous_wf( Header_TM_LFR_SCIENCE_CWF_t *header)
301 355 {
302 356 header->targetLogicalAddress = CCSDS_DESTINATION_ID;
303 357 header->protocolIdentifier = CCSDS_PROTOCOLE_ID;
304 358 header->reserved = 0x00;
305 359 header->userApplication = CCSDS_USER_APP;
306 360 header->packetID[0] = 0x00;
307 361 header->packetID[1] = 0x00;
308 362 header->packetSequenceControl[0] = 0xc0;
309 363 header->packetSequenceControl[1] = 0x00;
310 364 header->packetLength[0] = 0x00;
311 365 header->packetLength[1] = 0x00;
312 366 // DATA FIELD HEADER
313 367 header->spare1_pusVersion_spare2 = 0x10;
314 368 header->serviceType = TM_TYPE_LFR_SCIENCE; // service type
315 369 header->serviceSubType = TM_SUBTYPE_LFR_SCIENCE; // service subtype
316 370 header->destinationID = TM_DESTINATION_ID_GROUND;
317 371 // AUXILIARY DATA HEADER
318 372 header->sid = 0x00;
319 373 header->hkBIA = 0x1f;
320 374 header->time[0] = 0x00;
321 375 header->time[0] = 0x00;
322 376 header->time[0] = 0x00;
323 377 header->time[0] = 0x00;
324 378 header->time[0] = 0x00;
325 379 header->time[0] = 0x00;
326 380 header->blkNr[0] = 0x00; // BLK_NR MSB
327 381 header->blkNr[1] = 0x00; // BLK_NR LSB
328 382 }
329 383
330 384 void reset_waveforms( void )
331 385 {
332 386 int i = 0;
333 387
334 388 for (i=0; i< NB_SAMPLES_PER_SNAPSHOT; i++)
335 389 {
336 390 wf_snap_f0[ (i* NB_WORDS_SWF_BLK) + 0 + TIME_OFFSET] = 0x10002000;
337 391 wf_snap_f0[ (i* NB_WORDS_SWF_BLK) + 1 + TIME_OFFSET] = 0x20001000;
338 392 wf_snap_f0[ (i* NB_WORDS_SWF_BLK) + 2 + TIME_OFFSET] = 0x40008000;
339 393
340 394 //***
341 395 // F1
342 396 wf_snap_f1[ (i* NB_WORDS_SWF_BLK) + 0 + TIME_OFFSET] = 0x1000f000;
343 397 wf_snap_f1[ (i* NB_WORDS_SWF_BLK) + 1 + TIME_OFFSET] = 0xf0001000;
344 398 wf_snap_f1[ (i* NB_WORDS_SWF_BLK) + 2 + TIME_OFFSET] = 0x40008000;
345 399
346 400 //***
347 401 // F2
348 402 wf_snap_f2[ (i* NB_WORDS_SWF_BLK) + 0 + TIME_OFFSET] = 0x40008000;
349 403 wf_snap_f2[ (i* NB_WORDS_SWF_BLK) + 1 + TIME_OFFSET] = 0x20001000;
350 404 wf_snap_f2[ (i* NB_WORDS_SWF_BLK) + 2 + TIME_OFFSET] = 0x10002000;
351 405
352 406 //***
353 407 // F3
354 408 /*wf_cont_f3[ i* NB_WORDS_SWF_BLK + 0 ] = build_value( i, i ); // v and 1
355 409 wf_cont_f3[ i* NB_WORDS_SWF_BLK + 1 ] = build_value( i, i ); // e2 and b1
356 410 wf_cont_f3[ i* NB_WORDS_SWF_BLK + 2 ] = build_value( i, i ); // b2 and b3*/
357 411 }
358 412 }
359 413
360 414 void send_waveform_SWF( Header_TM_LFR_SCIENCE_SWF_t *header, volatile int *waveform,
361 415 unsigned int sid, spw_ioctl_pkt_send *spw_ioctl_send)
362 416 {
363 417 unsigned int i = 0;
364 418 unsigned int length = 0;
365 419 rtems_status_code status;
366 420
367 421 header->sid = (unsigned char) sid;
368 422
369 423 for (i=0; i<7; i++) // send waveform
370 424 {
371 425 header->pktNr = (unsigned char) i+1; // PKT_NR
372 426 // BUILD THE DATA
373 427 if (i==6) {
374 428 spw_ioctl_send->dlen = 8 * NB_BYTES_SWF_BLK;
375 429 length = TM_LEN_SCI_SWF_8;
376 430 header->blkNr[0] = 0x00; // BLK_NR MSB
377 431 header->blkNr[1] = 0x08; // BLK_NR LSB
378 432 }
379 433 else {
380 434 spw_ioctl_send->dlen = 340 * NB_BYTES_SWF_BLK;
381 435 length = TM_LEN_SCI_SWF_340;
382 436 header->blkNr[0] = 0x01; // BLK_NR MSB
383 437 header->blkNr[1] = 0x54; // BLK_NR LSB
384 438 }
385 439 spw_ioctl_send->data = (char*) &waveform[ (i * 340 * NB_WORDS_SWF_BLK) ];
386 440 // BUILD THE HEADER
387 441 header->packetLength[0] = (unsigned char) (length>>8);
388 442 header->packetLength[1] = (unsigned char) (length);
389 443 header->sid = (unsigned char) sid; // SID
390 444 // SET PACKET TIME
391 445 header->time[0] = (unsigned char) (time_management_regs->coarse_time>>24);
392 446 header->time[1] = (unsigned char) (time_management_regs->coarse_time>>16);
393 447 header->time[2] = (unsigned char) (time_management_regs->coarse_time>>8);
394 448 header->time[3] = (unsigned char) (time_management_regs->coarse_time);
395 449 header->time[4] = (unsigned char) (time_management_regs->fine_time>>8);
396 450 header->time[5] = (unsigned char) (time_management_regs->fine_time);
397 451 header->acquisitionTime[0] = (unsigned char) (time_management_regs->coarse_time>>24);
398 452 header->acquisitionTime[1] = (unsigned char) (time_management_regs->coarse_time>>16);
399 453 header->acquisitionTime[2] = (unsigned char) (time_management_regs->coarse_time>>8);
400 454 header->acquisitionTime[3] = (unsigned char) (time_management_regs->coarse_time);
401 455 header->acquisitionTime[4] = (unsigned char) (time_management_regs->fine_time>>8);
402 456 header->acquisitionTime[5] = (unsigned char) (time_management_regs->fine_time);
403 457 // SEND PACKET
404 458 status = write_spw(spw_ioctl_send);
405 459 if (status != RTEMS_SUCCESSFUL) {
406 460 while (true) {
407 461 if (status != RTEMS_SUCCESSFUL) {
408 462 status = write_spw(spw_ioctl_send);
409 463 //PRINTF1("%d", i)
410 464 sched_yield();
411 465 }
412 466 else {
413 467 //PRINTF("\n")
414 468 break;
415 469 }
416 470 }
417 471 }
418 472 }
419 473 }
420 474
421 475 void send_waveform_CWF( Header_TM_LFR_SCIENCE_CWF_t *header, volatile int *waveform,
422 476 unsigned int sid, spw_ioctl_pkt_send *spw_ioctl_send)
423 477 {
424 478 unsigned int i = 0;
425 479 unsigned int length = 0;
426 480 rtems_status_code status;
427 481
428 482 header->sid = (unsigned char) sid;
429 483
430 484 for (i=0; i<7; i++) // send waveform
431 485 {
432 486 // BUILD THE DATA
433 487 if (i==6) {
434 488 spw_ioctl_send->dlen = 8 * NB_BYTES_SWF_BLK;
435 489 length = TM_LEN_SCI_CWF_8;
436 490 header->blkNr[0] = 0x00; // BLK_NR MSB
437 491 header->blkNr[1] = 0x08; // BLK_NR LSB
438 492 }
439 493 else {
440 494 spw_ioctl_send->dlen = 340 * NB_BYTES_SWF_BLK;
441 495 length = TM_LEN_SCI_CWF_340;
442 496 header->blkNr[0] = 0x01; // BLK_NR MSB
443 497 header->blkNr[1] = 0x54; // BLK_NR LSB
444 498 }
445 499 spw_ioctl_send->data = (char*) &waveform[ (i * 340 * NB_WORDS_SWF_BLK) ];
446 500 // BUILD THE HEADER
447 501 header->packetLength[0] = (unsigned char) (length>>8);
448 502 header->packetLength[1] = (unsigned char) (length);
449 503 // SET PACKET TIME
450 504 header->time[0] = (unsigned char) (time_management_regs->coarse_time>>24);
451 505 header->time[1] = (unsigned char) (time_management_regs->coarse_time>>16);
452 506 header->time[2] = (unsigned char) (time_management_regs->coarse_time>>8);
453 507 header->time[3] = (unsigned char) (time_management_regs->coarse_time);
454 508 header->time[4] = (unsigned char) (time_management_regs->fine_time>>8);
455 509 header->time[5] = (unsigned char) (time_management_regs->fine_time);
456 510 header->acquisitionTime[0] = (unsigned char) (time_management_regs->coarse_time>>24);
457 511 header->acquisitionTime[1] = (unsigned char) (time_management_regs->coarse_time>>16);
458 512 header->acquisitionTime[2] = (unsigned char) (time_management_regs->coarse_time>>8);
459 513 header->acquisitionTime[3] = (unsigned char) (time_management_regs->coarse_time);
460 514 header->acquisitionTime[4] = (unsigned char) (time_management_regs->fine_time>>8);
461 515 header->acquisitionTime[5] = (unsigned char) (time_management_regs->fine_time);
462 516 // SEND PACKET
463 517 status = write_spw(spw_ioctl_send);
464 518 if (status != RTEMS_SUCCESSFUL) {
465 519 while (true) {
466 520 if (status != RTEMS_SUCCESSFUL) {
467 521 status = write_spw(spw_ioctl_send);
468 522 //PRINTF1("%d", i)
469 523 sched_yield();
470 524 }
471 525 else {
472 526 //PRINTF("\n")
473 527 break;
474 528 }
475 529 }
476 530 }
477 531 }
478 532 }
479 533
480 int build_value(int value1, int value0)
481 {
482 int aux = 0;
483 int aux1 = 0;
484 int aux0 = 0;
485 int value1_aux = 0;
486 int value0_aux = 0;
487
488 value1_aux = value1;
489 value0_aux = value0;
490
491 //******
492 // B3 B2
493 if (value1_aux > 8191) value1_aux = 8191;
494 if (value1_aux < -8192) value1_aux = -8192;
495 aux1 = ( (int) ( ( (unsigned char) (value1_aux / 256 ) ) << 8 ) )
496 + ( (int) ( (unsigned char) (value1_aux ) ) );
497
498 //******
499 // B1 B0
500 if (value0_aux > 8191) value0_aux = 8191;
501 if (value0_aux < -8192) value0_aux = -8192;
502 aux0 = ( (int) ( ( (unsigned char) (value0_aux / 256) ) << 8 ) )
503 + ( (int) ( (unsigned char) (value0_aux ) ) );
504
505 aux = (aux1 << 16) + aux0;
506
507 return aux;
508 }
509
510 534 void send_waveform_norm(Header_TM_LFR_SCIENCE_SWF_t *header, spw_ioctl_pkt_send *spw_ioctl_send)
511 535 {
512 536 unsigned char lfrMode;
513 537 lfrMode = (housekeeping_packet.lfr_status_word[0] & 0xf0) >> 4;
514 538
515 539 header->packetID[0] = (unsigned char) (TM_PACKET_ID_SCIENCE_NORMAL >> 8);
516 540 header->packetID[1] = (unsigned char) (TM_PACKET_ID_SCIENCE_NORMAL);
517 541 // TIME
518 542 header->time[0] = (unsigned char) (time_management_regs->coarse_time>>24);
519 543 header->time[1] = (unsigned char) (time_management_regs->coarse_time>>16);
520 544 header->time[2] = (unsigned char) (time_management_regs->coarse_time>>8);
521 545 header->time[3] = (unsigned char) (time_management_regs->coarse_time);
522 546 header->time[4] = (unsigned char) (time_management_regs->fine_time>>8);
523 547 header->time[5] = (unsigned char) (time_management_regs->fine_time);
524 548
525 //***************
526 // send snapshots
527 // F0
528 send_waveform_SWF( header, wf_snap_f0, SID_NORM_SWF_F0, spw_ioctl_send);
529 // F1
530 if (lfrMode == LFR_MODE_NORMAL) // in SBM1 mode, the snapshot is sent by the send_waveform_sbm1 function
531 {
549 switch(lfrMode) {
550
551 case LFR_MODE_NORMAL:
552 send_waveform_SWF( header, wf_snap_f0, SID_NORM_SWF_F0, spw_ioctl_send);
532 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;
533 576 }
534 // F2
535 send_waveform_SWF( header, wf_snap_f2, SID_NORM_SWF_F2, spw_ioctl_send);
577
536 578 #ifdef GSA
537 579 // irq processed, reset the related register of the timer unit
538 580 gptimer_regs->timer[TIMER_WF_SIMULATOR].ctrl = gptimer_regs->timer[TIMER_WF_SIMULATOR].ctrl | 0x00000010;
539 581 // clear the interruption
540 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
541 603 #else
542 // irq processed, reset the related register of the waveform picker
543 if (lfrMode == LFR_MODE_SBM1) {
544 param_local.local_sbm1_nb_cwf_sent = 0;
545 // after the first transmission of the swf at F1, the period is set to local_sbm1_nb_cwf_max
546 param_local.local_sbm1_nb_cwf_max = 2 * (
547 ( parameter_dump_packet.sy_lfr_n_swf_p[0] * 256 )
548 + parameter_dump_packet.sy_lfr_n_swf_p[1]
549 );
550 }
551 else if (lfrMode == LFR_MODE_SBM2) {
552 param_local.local_sbm2_nb_cwf_sent = 0;
553 // after the first transmission of the swf at F2, the period is set to local_sbm2_nb_cwf_max
554 param_local.local_sbm2_nb_cwf_max = (
555 ( parameter_dump_packet.sy_lfr_n_swf_p[0] * 256 )
556 + parameter_dump_packet.sy_lfr_n_swf_p[1]
557 )/ 8;
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);
558 606 }
559 607 else {
560 waveform_picker_regs->status = waveform_picker_regs->status & 0x00;
561 waveform_picker_regs->burst_enable = 0x07; // [0111] enable f2 f1 f0
608 send_waveform_CWF( header, wf_cont_f3, SID_NORM_CWF_F3, spw_ioctl_send);
562 609 }
563 610 #endif
564
565 611 }
566 612
567 613 void send_waveform_burst(Header_TM_LFR_SCIENCE_CWF_t *header, spw_ioctl_pkt_send *spw_ioctl_send)
568 614 {
569 615 header->packetID[0] = (unsigned char) (TM_PACKET_ID_SCIENCE_BURST_SBM1_SBM2 >> 8);
570 616 header->packetID[1] = (unsigned char) (TM_PACKET_ID_SCIENCE_BURST_SBM1_SBM2);
571 617 // TIME
572 618 header->time[0] = (unsigned char) (time_management_regs->coarse_time>>24);
573 619 header->time[1] = (unsigned char) (time_management_regs->coarse_time>>16);
574 620 header->time[2] = (unsigned char) (time_management_regs->coarse_time>>8);
575 621 header->time[3] = (unsigned char) (time_management_regs->coarse_time);
576 622 header->time[4] = (unsigned char) (time_management_regs->fine_time>>8);
577 623 header->time[5] = (unsigned char) (time_management_regs->fine_time);
578 624 // ACQUISITION TIME
579 625
580 626 // F2
581 627 #ifdef GSA
582 628 #else
583 629 if (waveform_picker_regs->addr_data_f2 == (int) wf_snap_f2) {
584 630 send_waveform_CWF( header, wf_snap_f2_bis, SID_BURST_CWF_F2, spw_ioctl_send);
585 631 }
586 632 else {
587 633 send_waveform_CWF( header, wf_snap_f2, SID_BURST_CWF_F2, spw_ioctl_send);
588 634 }
589 635 #endif
590 636 }
591 637
592 638 void send_waveform_sbm1(Header_TM_LFR_SCIENCE_CWF_t *header, spw_ioctl_pkt_send *spw_ioctl_send)
593 639 {
594 640 header->packetID[0] = (unsigned char) (TM_PACKET_ID_SCIENCE_BURST_SBM1_SBM2 >> 8);
595 641 header->packetID[1] = (unsigned char) (TM_PACKET_ID_SCIENCE_BURST_SBM1_SBM2);
596 642 // TIME
597 643 header->time[0] = (unsigned char) (time_management_regs->coarse_time>>24);
598 644 header->time[1] = (unsigned char) (time_management_regs->coarse_time>>16);
599 645 header->time[2] = (unsigned char) (time_management_regs->coarse_time>>8);
600 646 header->time[3] = (unsigned char) (time_management_regs->coarse_time);
601 647 header->time[4] = (unsigned char) (time_management_regs->fine_time>>8);
602 648 header->time[5] = (unsigned char) (time_management_regs->fine_time);
603 649
604 650 // F1
605 651 #ifdef GSA
606 652 #else
607 653 if (waveform_picker_regs->addr_data_f1 == (int) wf_snap_f1) {
608 654 send_waveform_CWF( header, wf_snap_f1_bis, SID_SBM1_CWF_F1, spw_ioctl_send );
609 655 }
610 656 else {
611 657 send_waveform_CWF( header, wf_snap_f1, SID_SBM1_CWF_F1, spw_ioctl_send );
612 658 }
613 659 #endif
614 660 }
615 661
616 662 void send_waveform_sbm2(Header_TM_LFR_SCIENCE_CWF_t *header, spw_ioctl_pkt_send *spw_ioctl_send)
617 663 {
618 664 header->packetID[0] = (unsigned char) (TM_PACKET_ID_SCIENCE_BURST_SBM1_SBM2 >> 8);
619 665 header->packetID[1] = (unsigned char) (TM_PACKET_ID_SCIENCE_BURST_SBM1_SBM2);
620 666 // TIME
621 667 header->time[0] = (unsigned char) (time_management_regs->coarse_time>>24);
622 668 header->time[1] = (unsigned char) (time_management_regs->coarse_time>>16);
623 669 header->time[2] = (unsigned char) (time_management_regs->coarse_time>>8);
624 670 header->time[3] = (unsigned char) (time_management_regs->coarse_time);
625 671 header->time[4] = (unsigned char) (time_management_regs->fine_time>>8);
626 672 header->time[5] = (unsigned char) (time_management_regs->fine_time);
627 673
628 674 // F2
629 675 #ifdef GSA
630 676 #else
631 677 if (waveform_picker_regs->addr_data_f2 == (int) wf_snap_f2) {
632 678 send_waveform_CWF( header, wf_snap_f2_bis, SID_SBM2_CWF_F2, spw_ioctl_send);
633 679 }
634 680 else {
635 681 send_waveform_CWF( header, wf_snap_f2, SID_SBM2_CWF_F2, spw_ioctl_send);
636 682 }
637 683 #endif
638 684 }
639 685
640 686 //**************
641 687 // wfp registers
642 void set_wfp_data_shaping(unsigned char data_shaping)
688 void set_wfp_data_shaping()
643 689 {
690 unsigned char data_shaping;
691
644 692 // get the parameters for the data shaping [BW SP0 SP1 R0 R1] in sy_lfr_common1 and configure the register
645 693 // waveform picker : [R1 R0 SP1 SP0 BW]
694
695 data_shaping = parameter_dump_packet.bw_sp0_sp1_r0_r1;
696
646 697 #ifdef GSA
647 698 #else
648 699 waveform_picker_regs->data_shaping =
649 700 ( (data_shaping & 0x10) >> 4 ) // BW
650 701 + ( (data_shaping & 0x08) >> 2 ) // SP0
651 702 + ( (data_shaping & 0x04) ) // SP1
652 703 + ( (data_shaping & 0x02) << 2 ) // R0
653 704 + ( (data_shaping & 0x01) << 4 ); // R1
654 705 #endif
655 706 }
656 707
657 void set_wfp_delta_snapshot(unsigned int delta_snapshot)
708 char set_wfp_delta_snapshot()
709 {
710 char ret;
711 unsigned int delta_snapshot;
712 ret = LFR_DEFAULT;
713
714 delta_snapshot = parameter_dump_packet.sy_lfr_n_swf_p[0]*256
715 + parameter_dump_packet.sy_lfr_n_swf_p[1];
716
717 #ifdef GSA
718 #else
719 unsigned char aux = 0;
720 if ( delta_snapshot < MIN_DELTA_SNAPSHOT )
721 {
722 aux = MIN_DELTA_SNAPSHOT;
723 ret = LFR_DEFAULT;
724 }
725 else
726 {
727 aux = delta_snapshot ;
728 ret = LFR_SUCCESSFUL;
729 }
730 waveform_picker_regs->delta_snapshot = aux; // max 2 bytes
731 #endif
732
733 return ret;
734 }
735
736 void set_wfp_burst_enable_register( unsigned char mode)
658 737 {
659 738 #ifdef GSA
660 739 #else
661 unsigned char aux = 0;
662 aux = delta_snapshot / 2 ;
663 waveform_picker_regs->delta_snapshot = aux; // max 2 bytes
740 // [0000 0000] burst f2, f1, f0 enable f3 f2 f1 f0
741 // the burst bits shall be set first, before the enable bits
742 switch(mode) {
743 case(LFR_MODE_NORMAL):
744 waveform_picker_regs->burst_enable = 0x0f; // [0000 1111] enable f3 f2 f1 f0
745 break;
746 case(LFR_MODE_BURST):
747 waveform_picker_regs->burst_enable = 0x40; // [0100 0000] f2 burst enabled
748 waveform_picker_regs->burst_enable = waveform_picker_regs->burst_enable | 0x04; // [0100] enable f2
749 break;
750 case(LFR_MODE_SBM1):
751 waveform_picker_regs->burst_enable = 0x20; // [0010 0000] f1 burst enabled
752 waveform_picker_regs->burst_enable = waveform_picker_regs->burst_enable | 0x0f; // [1111] enable f3 f2 f1 f0
753 break;
754 case(LFR_MODE_SBM2):
755 waveform_picker_regs->burst_enable = 0x40; // [0100 0000] f2 burst enabled
756 waveform_picker_regs->burst_enable = waveform_picker_regs->burst_enable | 0x0f; // [1111] enable f3 f2 f1 f0
757 break;
758 default:
759 waveform_picker_regs->burst_enable = 0x00; // [0000 0000] no burst enabled, no waveform enabled
760 break;
761 }
664 762 #endif
665 763 }
666 764
667 765 void reset_wfp_burst_enable()
668 766 {
669 767 #ifdef GSA
670 768 #else
671 769 waveform_picker_regs->burst_enable = 0x00; // burst f2, f1, f0 enable f3, f2, f1, f0
672 770 #endif
673 771 }
674 772
675 773 void reset_waveform_picker_regs()
676 774 {
677 775 #ifdef GSA
678 776 #else
679 set_wfp_data_shaping(parameter_dump_packet.bw_sp0_sp1_r0_r1);
777 set_wfp_data_shaping();
680 778 reset_wfp_burst_enable();
681 779 waveform_picker_regs->addr_data_f0 = (int) (wf_snap_f0); //
682 780 waveform_picker_regs->addr_data_f1 = (int) (wf_snap_f1); //
683 781 waveform_picker_regs->addr_data_f2 = (int) (wf_snap_f2); //
684 782 waveform_picker_regs->addr_data_f3 = (int) (wf_cont_f3); //
685 waveform_picker_regs->status = 0x00; //
686 set_wfp_delta_snapshot(
687 ( parameter_dump_packet.sy_lfr_n_swf_p[0]*256)
688 + parameter_dump_packet.sy_lfr_n_swf_p[1] ); // time in seconds between two snapshots
689 waveform_picker_regs->delta_f2_f1 = 0xffff; // max 4 bytes
690 waveform_picker_regs->delta_f2_f0 = 0x17c00; // max 5 bytes
691 waveform_picker_regs->nb_burst_available = 0x180; // max 3 bytes, size of the buffer in burst (1 burst = 16 x 4 octets)
692 waveform_picker_regs->nb_snapshot_param = 0x7ff; // max 3 octets, 2048 - 1
783 set_wfp_delta_snapshot(); // time in seconds between two snapshots
784 waveform_picker_regs->delta_f2_f1 = 0xffff; // max 4 bytes
785 waveform_picker_regs->delta_f2_f0 = 0x17c00; // 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)
787 waveform_picker_regs->nb_snapshot_param = 0x7ff; // max 3 octets, 2048 - 1
788 waveform_picker_regs->status = 0x00; //
693 789 #endif
694 790 }
791
792 //*****************
793 // local parameters
794 void set_local_sbm1_nb_cwf_max()
795 {
796 // (2 snapshots of 2048 points per seconds) * (period of the NORM snashots)
797 param_local.local_sbm1_nb_cwf_max = 2 * (
798 parameter_dump_packet.sy_lfr_n_swf_p[0] * 256
799 + parameter_dump_packet.sy_lfr_n_swf_p[1]
800 );
801 }
802
803 void set_local_sbm2_nb_cwf_max()
804 {
805 // (period of the NORM snashots) / (8 seconds per snapshot at f2 = 256 Hz)
806 param_local.local_sbm2_nb_cwf_max = (
807 parameter_dump_packet.sy_lfr_n_swf_p[0] * 256
808 + parameter_dump_packet.sy_lfr_n_swf_p[1]
809 )/ 8;
810 }
811
812 void set_local_nb_interrupt_f0_MAX()
813 {
814 param_local.local_nb_interrupt_f0_MAX = ( (parameter_dump_packet.sy_lfr_n_asm_p[0]) * 256
815 + parameter_dump_packet.sy_lfr_n_asm_p[1] ) * 100;
816 }
817
818 void reset_local_sbm1_nb_cwf_sent()
819 {
820 param_local.local_sbm1_nb_cwf_sent = 0;
821 }
822
823 void reset_local_sbm2_nb_cwf_sent()
824 {
825 param_local.local_sbm2_nb_cwf_sent = 0;
826 }
General Comments 0
You need to be logged in to leave comments. Login now