##// END OF EJS Templates
Ignore doc files...
paul -
r46:72fea9e87fcb default
parent child
Show More
@@ -1,248 +1,248
1 1 #############################################################################
2 2 # Makefile for building: bin/fsw
3 # Generated by qmake (2.01a) (Qt 4.8.5) on: Fri Oct 18 15:44:51 2013
3 # Generated by qmake (2.01a) (Qt 4.8.5) on: Thu Oct 24 15:59:05 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=16 -DPRINT_MESSAGES_ON_CONSOLE
13 DEFINES = -DSW_VERSION_N1=0 -DSW_VERSION_N2=0 -DSW_VERSION_N3=0 -DSW_VERSION_N4=16 -DPRINT_MESSAGES_ON_CONSOLE -DPRINT_TASK_STATISTICS
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 ../src/fsw_spacewire.c \
53 53 ../src/tc_load_dump_parameters.c \
54 54 ../src/tm_lfr_tc_exe.c \
55 55 ../src/tc_acceptance.c
56 56 OBJECTS = obj/wf_handler.o \
57 57 obj/tc_handler.o \
58 58 obj/fsw_processing.o \
59 59 obj/fsw_misc.o \
60 60 obj/fsw_init.o \
61 61 obj/fsw_globals.o \
62 62 obj/fsw_spacewire.o \
63 63 obj/tc_load_dump_parameters.o \
64 64 obj/tm_lfr_tc_exe.o \
65 65 obj/tc_acceptance.o
66 66 DIST = /usr/lib64/qt4/mkspecs/common/unix.conf \
67 67 /usr/lib64/qt4/mkspecs/common/linux.conf \
68 68 /usr/lib64/qt4/mkspecs/common/gcc-base.conf \
69 69 /usr/lib64/qt4/mkspecs/common/gcc-base-unix.conf \
70 70 /usr/lib64/qt4/mkspecs/common/g++-base.conf \
71 71 /usr/lib64/qt4/mkspecs/common/g++-unix.conf \
72 72 /usr/lib64/qt4/mkspecs/qconfig.pri \
73 73 /usr/lib64/qt4/mkspecs/modules/qt_webkit.pri \
74 74 /usr/lib64/qt4/mkspecs/features/qt_functions.prf \
75 75 /usr/lib64/qt4/mkspecs/features/qt_config.prf \
76 76 /usr/lib64/qt4/mkspecs/features/exclusive_builds.prf \
77 77 /usr/lib64/qt4/mkspecs/features/default_pre.prf \
78 78 sparc.pri \
79 79 /usr/lib64/qt4/mkspecs/features/release.prf \
80 80 /usr/lib64/qt4/mkspecs/features/default_post.prf \
81 81 /usr/lib64/qt4/mkspecs/features/shared.prf \
82 82 /usr/lib64/qt4/mkspecs/features/unix/gdb_dwarf_index.prf \
83 83 /usr/lib64/qt4/mkspecs/features/warn_on.prf \
84 84 /usr/lib64/qt4/mkspecs/features/resources.prf \
85 85 /usr/lib64/qt4/mkspecs/features/uic.prf \
86 86 /usr/lib64/qt4/mkspecs/features/yacc.prf \
87 87 /usr/lib64/qt4/mkspecs/features/lex.prf \
88 88 /usr/lib64/qt4/mkspecs/features/include_source_dir.prf \
89 89 fsw-qt.pro
90 90 QMAKE_TARGET = fsw
91 91 DESTDIR = bin/
92 92 TARGET = bin/fsw
93 93
94 94 first: all
95 95 ####### Implicit rules
96 96
97 97 .SUFFIXES: .o .c .cpp .cc .cxx .C
98 98
99 99 .cpp.o:
100 100 $(CXX) -c $(CXXFLAGS) $(INCPATH) -o "$@" "$<"
101 101
102 102 .cc.o:
103 103 $(CXX) -c $(CXXFLAGS) $(INCPATH) -o "$@" "$<"
104 104
105 105 .cxx.o:
106 106 $(CXX) -c $(CXXFLAGS) $(INCPATH) -o "$@" "$<"
107 107
108 108 .C.o:
109 109 $(CXX) -c $(CXXFLAGS) $(INCPATH) -o "$@" "$<"
110 110
111 111 .c.o:
112 112 $(CC) -c $(CFLAGS) $(INCPATH) -o "$@" "$<"
113 113
114 114 ####### Build rules
115 115
116 116 all: Makefile $(TARGET)
117 117
118 118 $(TARGET): $(OBJECTS)
119 119 @$(CHK_DIR_EXISTS) bin/ || $(MKDIR) bin/
120 120 $(LINK) $(LFLAGS) -o $(TARGET) $(OBJECTS) $(OBJCOMP) $(LIBS)
121 121
122 122 Makefile: fsw-qt.pro /usr/lib64/qt4/mkspecs/linux-g++/qmake.conf /usr/lib64/qt4/mkspecs/common/unix.conf \
123 123 /usr/lib64/qt4/mkspecs/common/linux.conf \
124 124 /usr/lib64/qt4/mkspecs/common/gcc-base.conf \
125 125 /usr/lib64/qt4/mkspecs/common/gcc-base-unix.conf \
126 126 /usr/lib64/qt4/mkspecs/common/g++-base.conf \
127 127 /usr/lib64/qt4/mkspecs/common/g++-unix.conf \
128 128 /usr/lib64/qt4/mkspecs/qconfig.pri \
129 129 /usr/lib64/qt4/mkspecs/modules/qt_webkit.pri \
130 130 /usr/lib64/qt4/mkspecs/features/qt_functions.prf \
131 131 /usr/lib64/qt4/mkspecs/features/qt_config.prf \
132 132 /usr/lib64/qt4/mkspecs/features/exclusive_builds.prf \
133 133 /usr/lib64/qt4/mkspecs/features/default_pre.prf \
134 134 sparc.pri \
135 135 /usr/lib64/qt4/mkspecs/features/release.prf \
136 136 /usr/lib64/qt4/mkspecs/features/default_post.prf \
137 137 /usr/lib64/qt4/mkspecs/features/shared.prf \
138 138 /usr/lib64/qt4/mkspecs/features/unix/gdb_dwarf_index.prf \
139 139 /usr/lib64/qt4/mkspecs/features/warn_on.prf \
140 140 /usr/lib64/qt4/mkspecs/features/resources.prf \
141 141 /usr/lib64/qt4/mkspecs/features/uic.prf \
142 142 /usr/lib64/qt4/mkspecs/features/yacc.prf \
143 143 /usr/lib64/qt4/mkspecs/features/lex.prf \
144 144 /usr/lib64/qt4/mkspecs/features/include_source_dir.prf
145 145 $(QMAKE) -spec /usr/lib64/qt4/mkspecs/linux-g++ -o Makefile fsw-qt.pro
146 146 /usr/lib64/qt4/mkspecs/common/unix.conf:
147 147 /usr/lib64/qt4/mkspecs/common/linux.conf:
148 148 /usr/lib64/qt4/mkspecs/common/gcc-base.conf:
149 149 /usr/lib64/qt4/mkspecs/common/gcc-base-unix.conf:
150 150 /usr/lib64/qt4/mkspecs/common/g++-base.conf:
151 151 /usr/lib64/qt4/mkspecs/common/g++-unix.conf:
152 152 /usr/lib64/qt4/mkspecs/qconfig.pri:
153 153 /usr/lib64/qt4/mkspecs/modules/qt_webkit.pri:
154 154 /usr/lib64/qt4/mkspecs/features/qt_functions.prf:
155 155 /usr/lib64/qt4/mkspecs/features/qt_config.prf:
156 156 /usr/lib64/qt4/mkspecs/features/exclusive_builds.prf:
157 157 /usr/lib64/qt4/mkspecs/features/default_pre.prf:
158 158 sparc.pri:
159 159 /usr/lib64/qt4/mkspecs/features/release.prf:
160 160 /usr/lib64/qt4/mkspecs/features/default_post.prf:
161 161 /usr/lib64/qt4/mkspecs/features/shared.prf:
162 162 /usr/lib64/qt4/mkspecs/features/unix/gdb_dwarf_index.prf:
163 163 /usr/lib64/qt4/mkspecs/features/warn_on.prf:
164 164 /usr/lib64/qt4/mkspecs/features/resources.prf:
165 165 /usr/lib64/qt4/mkspecs/features/uic.prf:
166 166 /usr/lib64/qt4/mkspecs/features/yacc.prf:
167 167 /usr/lib64/qt4/mkspecs/features/lex.prf:
168 168 /usr/lib64/qt4/mkspecs/features/include_source_dir.prf:
169 169 qmake: FORCE
170 170 @$(QMAKE) -spec /usr/lib64/qt4/mkspecs/linux-g++ -o Makefile fsw-qt.pro
171 171
172 172 dist:
173 173 @$(CHK_DIR_EXISTS) obj/fsw1.0.0 || $(MKDIR) obj/fsw1.0.0
174 174 $(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
175 175
176 176
177 177 clean:compiler_clean
178 178 -$(DEL_FILE) $(OBJECTS)
179 179 -$(DEL_FILE) *~ core *.core
180 180
181 181
182 182 ####### Sub-libraries
183 183
184 184 distclean: clean
185 185 -$(DEL_FILE) $(TARGET)
186 186 -$(DEL_FILE) Makefile
187 187
188 188
189 189 grmon:
190 190 cd bin && C:/opt/grmon-eval-2.0.29b/win32/bin/grmon.exe -uart COM4 -u
191 191
192 192 check: first
193 193
194 194 compiler_rcc_make_all:
195 195 compiler_rcc_clean:
196 196 compiler_uic_make_all:
197 197 compiler_uic_clean:
198 198 compiler_image_collection_make_all: qmake_image_collection.cpp
199 199 compiler_image_collection_clean:
200 200 -$(DEL_FILE) qmake_image_collection.cpp
201 201 compiler_yacc_decl_make_all:
202 202 compiler_yacc_decl_clean:
203 203 compiler_yacc_impl_make_all:
204 204 compiler_yacc_impl_clean:
205 205 compiler_lex_make_all:
206 206 compiler_lex_clean:
207 207 compiler_clean:
208 208
209 209 ####### Compile
210 210
211 211 obj/wf_handler.o: ../src/wf_handler.c
212 212 $(CC) -c $(CFLAGS) $(INCPATH) -o obj/wf_handler.o ../src/wf_handler.c
213 213
214 214 obj/tc_handler.o: ../src/tc_handler.c
215 215 $(CC) -c $(CFLAGS) $(INCPATH) -o obj/tc_handler.o ../src/tc_handler.c
216 216
217 217 obj/fsw_processing.o: ../src/fsw_processing.c ../src/fsw_processing_globals.c
218 218 $(CC) -c $(CFLAGS) $(INCPATH) -o obj/fsw_processing.o ../src/fsw_processing.c
219 219
220 220 obj/fsw_misc.o: ../src/fsw_misc.c
221 221 $(CC) -c $(CFLAGS) $(INCPATH) -o obj/fsw_misc.o ../src/fsw_misc.c
222 222
223 223 obj/fsw_init.o: ../src/fsw_init.c ../src/fsw_config.c
224 224 $(CC) -c $(CFLAGS) $(INCPATH) -o obj/fsw_init.o ../src/fsw_init.c
225 225
226 226 obj/fsw_globals.o: ../src/fsw_globals.c
227 227 $(CC) -c $(CFLAGS) $(INCPATH) -o obj/fsw_globals.o ../src/fsw_globals.c
228 228
229 229 obj/fsw_spacewire.o: ../src/fsw_spacewire.c
230 230 $(CC) -c $(CFLAGS) $(INCPATH) -o obj/fsw_spacewire.o ../src/fsw_spacewire.c
231 231
232 232 obj/tc_load_dump_parameters.o: ../src/tc_load_dump_parameters.c
233 233 $(CC) -c $(CFLAGS) $(INCPATH) -o obj/tc_load_dump_parameters.o ../src/tc_load_dump_parameters.c
234 234
235 235 obj/tm_lfr_tc_exe.o: ../src/tm_lfr_tc_exe.c
236 236 $(CC) -c $(CFLAGS) $(INCPATH) -o obj/tm_lfr_tc_exe.o ../src/tm_lfr_tc_exe.c
237 237
238 238 obj/tc_acceptance.o: ../src/tc_acceptance.c
239 239 $(CC) -c $(CFLAGS) $(INCPATH) -o obj/tc_acceptance.o ../src/tc_acceptance.c
240 240
241 241 ####### Install
242 242
243 243 install: FORCE
244 244
245 245 uninstall: FORCE
246 246
247 247 FORCE:
248 248
1 NO CONTENT: modified file, binary diff hidden
@@ -1,74 +1,74
1 1 TEMPLATE = app
2 2 # CONFIG += console v8 sim
3 3 # CONFIG options = verbose *** boot_messages *** debug_messages *** cpu_usage_report *** stack_report *** gsa
4 CONFIG += console verbose
4 CONFIG += console verbose cpu_usage_report
5 5 CONFIG -= qt
6 6
7 7 include(./sparc.pri)
8 8
9 9 # flight software version
10 10 SWVERSION=-0-16
11 11 DEFINES += SW_VERSION_N1=0
12 12 DEFINES += SW_VERSION_N2=0
13 13 DEFINES += SW_VERSION_N3=0
14 14 DEFINES += SW_VERSION_N4=16
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 contains( CONFIG, stack_report ) {
25 25 DEFINES += PRINT_STACK_REPORT
26 26 }
27 27
28 28 contains( CONFIG, boot_messages ) {
29 29 DEFINES += BOOT_MESSAGES
30 30 }
31 31
32 32 #doxygen.target = doxygen
33 33 #doxygen.commands = doxygen ../doc/Doxyfile
34 34 #QMAKE_EXTRA_TARGETS += doxygen
35 35
36 36 TARGET = fsw
37 37 contains( CONFIG, gsa ) {
38 38 DEFINES += GSA
39 39 TARGET = fsw-gsa
40 40 }
41 41
42 42 INCLUDEPATH += \
43 43 ../src \
44 44 ../header
45 45
46 46 SOURCES += \
47 47 ../src/wf_handler.c \
48 48 ../src/tc_handler.c \
49 49 ../src/fsw_processing.c \
50 50 ../src/fsw_misc.c \
51 51 ../src/fsw_init.c \
52 52 ../src/fsw_globals.c \
53 53 ../src/fsw_spacewire.c \
54 54 ../src/tc_load_dump_parameters.c \
55 55 ../src/tm_lfr_tc_exe.c \
56 56 ../src/tc_acceptance.c
57 57
58 58
59 59 HEADERS += \
60 60 ../header/wf_handler.h \
61 61 ../header/tc_handler.h \
62 62 ../header/grlib_regs.h \
63 63 ../header/fsw_processing.h \
64 64 ../header/fsw_params.h \
65 65 ../header/fsw_misc.h \
66 66 ../header/fsw_init.h \
67 67 ../header/ccsds_types.h \
68 68 ../header/fsw_params_processing.h \
69 69 ../header/fsw_spacewire.h \
70 70 ../header/tm_byte_positions.h \
71 71 ../header/tc_load_dump_parameters.h \
72 72 ../header/tm_lfr_tc_exe.h \
73 73 ../header/tc_acceptance.h
74 74
@@ -1,305 +1,305
1 1 <?xml version="1.0" encoding="UTF-8"?>
2 2 <!DOCTYPE QtCreatorProject>
3 <!-- Written by QtCreator 2.8.0, 2013-10-18T15:44:56. -->
3 <!-- Written by QtCreator 2.8.0, 2013-10-24T06:53:47. -->
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 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 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 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">1</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 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 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 -j 4</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 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 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 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 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 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 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 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 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 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 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 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 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 192 <valuemap type="QVariantMap" key="ProjectExplorer.Target.PluginSettings"/>
193 193 <valuemap type="QVariantMap" key="ProjectExplorer.Target.RunConfiguration.0">
194 194 <value type="bool" key="Analyzer.Project.UseGlobal">true</value>
195 195 <valuelist type="QVariantList" key="Analyzer.Valgrind.AddedSuppressionFiles"/>
196 196 <value type="bool" key="Analyzer.Valgrind.Callgrind.CollectBusEvents">false</value>
197 197 <value type="bool" key="Analyzer.Valgrind.Callgrind.CollectSystime">false</value>
198 198 <value type="bool" key="Analyzer.Valgrind.Callgrind.EnableBranchSim">false</value>
199 199 <value type="bool" key="Analyzer.Valgrind.Callgrind.EnableCacheSim">false</value>
200 200 <value type="bool" key="Analyzer.Valgrind.Callgrind.EnableEventToolTips">true</value>
201 201 <value type="double" key="Analyzer.Valgrind.Callgrind.MinimumCostRatio">0.01</value>
202 202 <value type="double" key="Analyzer.Valgrind.Callgrind.VisualisationMinimumCostRatio">10</value>
203 203 <value type="bool" key="Analyzer.Valgrind.FilterExternalIssues">true</value>
204 204 <value type="int" key="Analyzer.Valgrind.NumCallers">25</value>
205 205 <valuelist type="QVariantList" key="Analyzer.Valgrind.RemovedSuppressionFiles"/>
206 206 <value type="bool" key="Analyzer.Valgrind.TrackOrigins">true</value>
207 207 <value type="QString" key="Analyzer.Valgrind.ValgrindExecutable">valgrind</value>
208 208 <valuelist type="QVariantList" key="Analyzer.Valgrind.VisibleErrorKinds">
209 209 <value type="int">0</value>
210 210 <value type="int">1</value>
211 211 <value type="int">2</value>
212 212 <value type="int">3</value>
213 213 <value type="int">4</value>
214 214 <value type="int">5</value>
215 215 <value type="int">6</value>
216 216 <value type="int">7</value>
217 217 <value type="int">8</value>
218 218 <value type="int">9</value>
219 219 <value type="int">10</value>
220 220 <value type="int">11</value>
221 221 <value type="int">12</value>
222 222 <value type="int">13</value>
223 223 <value type="int">14</value>
224 224 </valuelist>
225 225 <value type="int" key="PE.EnvironmentAspect.Base">2</value>
226 226 <valuelist type="QVariantList" key="PE.EnvironmentAspect.Changes"/>
227 227 <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">fsw-qt</value>
228 228 <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
229 229 <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.Qt4RunConfiguration:/opt/DEV_PLE/FSW-qt/fsw-qt.pro</value>
230 230 <value type="QString" key="Qt4ProjectManager.Qt4RunConfiguration.CommandLineArguments"></value>
231 231 <value type="QString" key="Qt4ProjectManager.Qt4RunConfiguration.ProFile">fsw-qt.pro</value>
232 232 <value type="bool" key="Qt4ProjectManager.Qt4RunConfiguration.UseDyldImageSuffix">false</value>
233 233 <value type="bool" key="Qt4ProjectManager.Qt4RunConfiguration.UseTerminal">true</value>
234 234 <value type="QString" key="Qt4ProjectManager.Qt4RunConfiguration.UserWorkingDirectory"></value>
235 235 <value type="uint" key="RunConfiguration.QmlDebugServerPort">3768</value>
236 236 <value type="bool" key="RunConfiguration.UseCppDebugger">true</value>
237 237 <value type="bool" key="RunConfiguration.UseCppDebuggerAuto">false</value>
238 238 <value type="bool" key="RunConfiguration.UseMultiProcess">false</value>
239 239 <value type="bool" key="RunConfiguration.UseQmlDebugger">false</value>
240 240 <value type="bool" key="RunConfiguration.UseQmlDebuggerAuto">false</value>
241 241 </valuemap>
242 242 <valuemap type="QVariantMap" key="ProjectExplorer.Target.RunConfiguration.1">
243 243 <value type="bool" key="Analyzer.Project.UseGlobal">true</value>
244 244 <valuelist type="QVariantList" key="Analyzer.Valgrind.AddedSuppressionFiles"/>
245 245 <value type="bool" key="Analyzer.Valgrind.Callgrind.CollectBusEvents">false</value>
246 246 <value type="bool" key="Analyzer.Valgrind.Callgrind.CollectSystime">false</value>
247 247 <value type="bool" key="Analyzer.Valgrind.Callgrind.EnableBranchSim">false</value>
248 248 <value type="bool" key="Analyzer.Valgrind.Callgrind.EnableCacheSim">false</value>
249 249 <value type="bool" key="Analyzer.Valgrind.Callgrind.EnableEventToolTips">true</value>
250 250 <value type="double" key="Analyzer.Valgrind.Callgrind.MinimumCostRatio">0.01</value>
251 251 <value type="double" key="Analyzer.Valgrind.Callgrind.VisualisationMinimumCostRatio">10</value>
252 252 <value type="bool" key="Analyzer.Valgrind.FilterExternalIssues">true</value>
253 253 <value type="int" key="Analyzer.Valgrind.NumCallers">25</value>
254 254 <valuelist type="QVariantList" key="Analyzer.Valgrind.RemovedSuppressionFiles"/>
255 255 <value type="bool" key="Analyzer.Valgrind.TrackOrigins">true</value>
256 256 <value type="QString" key="Analyzer.Valgrind.ValgrindExecutable">valgrind</value>
257 257 <valuelist type="QVariantList" key="Analyzer.Valgrind.VisibleErrorKinds">
258 258 <value type="int">0</value>
259 259 <value type="int">1</value>
260 260 <value type="int">2</value>
261 261 <value type="int">3</value>
262 262 <value type="int">4</value>
263 263 <value type="int">5</value>
264 264 <value type="int">6</value>
265 265 <value type="int">7</value>
266 266 <value type="int">8</value>
267 267 <value type="int">9</value>
268 268 <value type="int">10</value>
269 269 <value type="int">11</value>
270 270 <value type="int">12</value>
271 271 <value type="int">13</value>
272 272 <value type="int">14</value>
273 273 </valuelist>
274 274 <value type="int" key="PE.EnvironmentAspect.Base">2</value>
275 275 <valuelist type="QVariantList" key="PE.EnvironmentAspect.Changes"/>
276 276 <value type="QString" key="ProjectExplorer.CustomExecutableRunConfiguration.Arguments"></value>
277 277 <value type="QString" key="ProjectExplorer.CustomExecutableRunConfiguration.Executable">doxygen</value>
278 278 <value type="bool" key="ProjectExplorer.CustomExecutableRunConfiguration.UseTerminal">true</value>
279 279 <value type="QString" key="ProjectExplorer.CustomExecutableRunConfiguration.WorkingDirectory">/opt/DEV_PLE/doc</value>
280 280 <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Run doxygen</value>
281 281 <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
282 282 <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.CustomExecutableRunConfiguration</value>
283 283 <value type="uint" key="RunConfiguration.QmlDebugServerPort">3768</value>
284 284 <value type="bool" key="RunConfiguration.UseCppDebugger">true</value>
285 285 <value type="bool" key="RunConfiguration.UseCppDebuggerAuto">false</value>
286 286 <value type="bool" key="RunConfiguration.UseMultiProcess">false</value>
287 287 <value type="bool" key="RunConfiguration.UseQmlDebugger">false</value>
288 288 <value type="bool" key="RunConfiguration.UseQmlDebuggerAuto">true</value>
289 289 </valuemap>
290 290 <value type="int" key="ProjectExplorer.Target.RunConfigurationCount">2</value>
291 291 </valuemap>
292 292 </data>
293 293 <data>
294 294 <variable>ProjectExplorer.Project.TargetCount</variable>
295 295 <value type="int">1</value>
296 296 </data>
297 297 <data>
298 298 <variable>ProjectExplorer.Project.Updater.EnvironmentId</variable>
299 299 <value type="QByteArray">{2e58a81f-9962-4bba-ae6b-760177f0656c}</value>
300 300 </data>
301 301 <data>
302 302 <variable>ProjectExplorer.Project.Updater.FileVersion</variable>
303 303 <value type="int">14</value>
304 304 </data>
305 305 </qtcreator>
1 NO CONTENT: modified file, binary diff hidden
@@ -1,627 +1,641
1 1 #ifndef CCSDS_TYPES_H_INCLUDED
2 2 #define CCSDS_TYPES_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 14 #define CCSDS_USER_APP 0x00
15 15
16 16 #define DEFAULT_SPARE1_PUSVERSION_SPARE2 0x10
17 17 #define DEFAULT_RESERVED 0x00
18 18 #define DEFAULT_HKBIA 0x1e // 0001 1110
19 19
20 20 // PACKET ID
21 21 #define TM_PACKET_ID_TC_EXE 0x0cc1 // PID 76 CAT 1
22 22 #define TM_PACKET_ID_HK 0x0cc4 // PID 76 CAT 4
23 23 #define TM_PACKET_ID_PARAMETER_DUMP 0x0cc9 // PID 76 CAT 9
24 24 #define TM_PACKET_ID_SCIENCE_NORMAL_BURST 0x0ccc // PID 76 CAT 12
25 25 #define TM_PACKET_ID_SCIENCE_SBM1_SBM2 0x0cfc // PID 79 CAT 12
26 26 #define TM_PACKET_PID_DEFAULT 76
27 27 #define TM_PACKET_PID_BURST_SBM1_SBM2 79
28 28 #define TM_PACKET_CAT_TC_EXE 1
29 29 #define TM_PACKET_CAT_HK 4
30 30 #define TM_PACKET_CAT_PARAMETER_DUMP 9
31 31 #define TM_PACKET_CAT_SCIENCE 12
32 32
33 33 // PACKET SEQUENCE CONTROL
34 34 #define TM_PACKET_SEQ_CTRL_CONTINUATION 0x00 // [0000 0000]
35 35 #define TM_PACKET_SEQ_CTRL_FIRST 0x40 // [0100 0000]
36 36 #define TM_PACKET_SEQ_CTRL_LAST 0x80 // [1000 0000]
37 37 #define TM_PACKET_SEQ_CTRL_STANDALONE 0xc0 // [1100 0000]
38 38 #define TM_PACKET_SEQ_CNT_DEFAULT 0x00 // [0000 0000]
39 39
40 40 // DESTINATION ID
41 41 #define TM_DESTINATION_ID_GROUND 0
42 42 #define TM_DESTINATION_ID_MISSION_TIMELINE 110
43 43 #define TM_DESTINATION_ID_TC_SEQUENCES 111
44 44 #define TM_DESTINATION_ID_RECOVERY_ACTION_COMMAND 112
45 45 #define TM_DESTINATION_ID_BACKUP_MISSION_TIMELINE 113
46 46 #define TM_DESTINATION_ID_DIRECT_CMD 120
47 47 #define TM_DESTINATION_ID_SPARE_GRD_SRC1 121
48 48 #define TM_DESTINATION_ID_SPARE_GRD_SRC2 122
49 49 #define TM_DESTINATION_ID_OBCP 15
50 50 #define TM_DESTINATION_ID_SYSTEM_CONTROL 14
51 51 #define TM_DESTINATION_ID_AOCS 11
52 52
53 53 #define CCSDS_DESTINATION_ID 0x01
54 54 #define CCSDS_PROTOCOLE_ID 0x02
55 55 #define CCSDS_RESERVED 0x00
56 56 #define CCSDS_USER_APP 0x00
57 57
58 58 #define SIZE_TM_LFR_TC_EXE_NOT_IMPLEMENTED 24
59 59 #define SIZE_TM_LFR_TC_EXE_CORRUPTED 32
60 60 #define SIZE_HK_PARAMETERS 112
61 61
62 62 // TC TYPES
63 63 #define TC_TYPE_GEN 181
64 64 #define TC_TYPE_TIME 9
65 65
66 66 // TC SUBTYPES
67 67 #define TC_SUBTYPE_RESET 1
68 68 #define TC_SUBTYPE_LOAD_COMM 11
69 69 #define TC_SUBTYPE_LOAD_NORM 13
70 70 #define TC_SUBTYPE_LOAD_BURST 19
71 71 #define TC_SUBTYPE_LOAD_SBM1 25
72 72 #define TC_SUBTYPE_LOAD_SBM2 27
73 73 #define TC_SUBTYPE_DUMP 31
74 74 #define TC_SUBTYPE_ENTER 41
75 75 #define TC_SUBTYPE_UPDT_INFO 51
76 76 #define TC_SUBTYPE_EN_CAL 61
77 77 #define TC_SUBTYPE_DIS_CAL 63
78 78 #define TC_SUBTYPE_UPDT_TIME 129
79 79
80 80 // TC LEN
81 81 #define TC_LEN_RESET 12
82 82 #define TC_LEN_LOAD_COMM 14
83 83 #define TC_LEN_LOAD_NORM 20
84 84 #define TC_LEN_LOAD_BURST 14
85 85 #define TC_LEN_LOAD_SBM1 14
86 86 #define TC_LEN_LOAD_SBM2 14
87 87 #define TC_LEN_DUMP 12
88 88 #define TC_LEN_ENTER 20
89 89 #define TC_LEN_UPDT_INFO 48
90 90 #define TC_LEN_EN_CAL 12
91 91 #define TC_LEN_DIS_CAL 12
92 92 #define TC_LEN_UPDT_TIME 18
93 93
94 94 // TM TYPES
95 95 #define TM_TYPE_TC_EXE 1
96 96 #define TM_TYPE_HK 3
97 97 #define TM_TYPE_PARAMETER_DUMP 3
98 98 #define TM_TYPE_LFR_SCIENCE 21
99 99
100 100 // TM SUBTYPES
101 101 #define TM_SUBTYPE_EXE_OK 7
102 102 #define TM_SUBTYPE_EXE_NOK 8
103 103 #define TM_SUBTYPE_HK 25
104 104 #define TM_SUBTYPE_PARAMETER_DUMP 25
105 105 #define TM_SUBTYPE_SCIENCE 3
106 106 #define TM_SUBTYPE_LFR_SCIENCE 3
107 107
108 108 // FAILURE CODES
109 109 #define ILLEGAL_APID 0
110 110 #define WRONG_LEN_PACKET 1
111 111 #define INCOR_CHECKSUM 2
112 112 #define ILL_TYPE 3
113 113 #define ILL_SUBTYPE 4
114 114 #define WRONG_APP_DATA 5 // 0x00 0x05
115 115 //
116 116 #define CCSDS_TM_VALID 7
117 117 #define TC_NOT_EXE 42000 // 0xa4 0x10
118 118 #define FUNCT_NOT_IMPL 42002 // 0xa4 0x12
119 119 #define FAIL_DETECTED 42003 // 0xa4 0x13
120 120 #define CORRUPTED 42005 // 0xa4 0x15
121 121
122 #define SID_TC_DEFAULT 0 // the default SID for TC sent to the LFR
123 #define SID_TC_GROUND 0
124 #define SID_TC_MISSION_TIMELINE 110
125 #define SID_TC_TC_SEQUENCES 111
126 #define SID_TC_RECOVERY_ACTION_CMD 112
127 #define SID_TC_BACKUP_MISSION_TIMELINE 113
128 #define SID_TC_DIRECT_CMD 120
129 #define SID_TC_SPARE_GRD_SRC1 121
130 #define SID_TC_SPARE_GRD_SRC2 122
131 #define SID_TC_OBCP 15
132 #define SID_TC_SYSTEM_CONTROL 14
133 #define SID_TC_AOCS 11
134 #define SID_TC_RPW_INTERNAL 254
135
122 136 // TM SID
123 137 #define SID_HK 1
124 138 #define SID_PARAMETER_DUMP 10
125 139
126 140 #define SID_NORM_SWF_F0 3
127 141 #define SID_NORM_SWF_F1 4
128 142 #define SID_NORM_SWF_F2 5
129 143 #define SID_NORM_CWF_F3 1
130 144 #define SID_BURST_CWF_F2 2
131 145 #define SID_SBM1_CWF_F1 24
132 146 #define SID_SBM2_CWF_F2 25
133 147 #define SID_NORM_ASM_F0 11
134 148 #define SID_NORM_ASM_F1 12
135 149 #define SID_NORM_ASM_F2 13
136 150 #define SID_NORM_BP1_F0 14
137 151 #define SID_NORM_BP1_F1 15
138 152 #define SID_NORM_BP1_F2 16
139 153 #define SID_NORM_BP2_F0 19
140 154 #define SID_NORM_BP2_F1 20
141 155 #define SID_NORM_BP2_F2 21
142 156 #define SID_BURST_BP1_F0 17
143 157 #define SID_BURST_BP2_F0 22
144 158 #define SID_BURST_BP1_F1 18
145 159 #define SID_BURST_BP2_F1 23
146 160 #define SID_SBM1_BP1_F0 28
147 161 #define SID_SBM1_BP2_F0 31
148 162 #define SID_SBM2_BP1_F0 29
149 163 #define SID_SBM2_BP2_F0 32
150 164 #define SID_SBM2_BP1_F1 30
151 165 #define SID_SBM2_BP2_F1 33
152 166
153 167 // LENGTH (BYTES)
154 168 #define LENGTH_TM_LFR_TC_EXE_MAX 32
155 169 #define LENGTH_TM_LFR_HK 126
156 170
157 171 // HEADER_LENGTH
158 172 #define TM_HEADER_LEN 16
159 173 #define HEADER_LENGTH_TM_LFR_SCIENCE_ASM 28
160 174 // PACKET_LENGTH
161 175 #define PACKET_LENGTH_TC_EXE_SUCCESS (20 - CCSDS_TC_TM_PACKET_OFFSET)
162 176 #define PACKET_LENGTH_TC_EXE_INCONSISTENT (26 - CCSDS_TC_TM_PACKET_OFFSET)
163 177 #define PACKET_LENGTH_TC_EXE_NOT_EXECUTABLE (26 - CCSDS_TC_TM_PACKET_OFFSET)
164 178 #define PACKET_LENGTH_TC_EXE_NOT_IMPLEMENTED (24 - CCSDS_TC_TM_PACKET_OFFSET)
165 179 #define PACKET_LENGTH_TC_EXE_ERROR (24 - CCSDS_TC_TM_PACKET_OFFSET)
166 180 #define PACKET_LENGTH_TC_EXE_CORRUPTED (32 - CCSDS_TC_TM_PACKET_OFFSET)
167 181 #define PACKET_LENGTH_HK (126 - CCSDS_TC_TM_PACKET_OFFSET)
168 182 #define PACKET_LENGTH_PARAMETER_DUMP (34 - CCSDS_TC_TM_PACKET_OFFSET)
169 183 #define PACKET_LENGTH_TM_LFR_SCIENCE_ASM (TOTAL_SIZE_SM + HEADER_LENGTH_TM_LFR_SCIENCE_ASM - CCSDS_TC_TM_PACKET_OFFSET)
170 184
171 185 #define SPARE1_PUSVERSION_SPARE2 0x10
172 186
173 187 #define LEN_TM_LFR_HK 130 // 126 + 4
174 188 #define LEN_TM_LFR_TC_EXE_NOT_IMP 28 // 24 + 4
175 189
176 190 #define TM_LEN_SCI_SWF_340 4101 // 340 * 12 + 10 + 12 - 1
177 191 #define TM_LEN_SCI_SWF_8 117 // 8 * 12 + 10 + 12 - 1
178 192 #define TM_LEN_SCI_CWF_340 4099 // 340 * 12 + 10 + 10 - 1
179 193 #define TM_LEN_SCI_CWF_8 115 // 8 * 12 + 10 + 10 - 1
180 194 #define TM_LEN_SCI_CWF3_LIGHT_340 2059 // 340 * 6 + 10 + 10 - 1
181 195 #define TM_LEN_SCI_CWF3_LIGHT_8 67 // 8 * 6 + 10 + 10 - 1
182 196 #define DEFAULT_PKTCNT 0x07
183 197 #define BLK_NR_340 0x0154
184 198 #define BLK_NR_8 0x0008
185 199
186 200 enum TM_TYPE{
187 201 TM_LFR_TC_EXE_OK,
188 202 TM_LFR_TC_EXE_ERR,
189 203 TM_LFR_HK,
190 204 TM_LFR_SCI,
191 205 TM_LFR_SCI_SBM,
192 206 TM_LFR_PAR_DUMP
193 207 };
194 208
195 209 struct TMHeader_str
196 210 {
197 211 volatile unsigned char targetLogicalAddress;
198 212 volatile unsigned char protocolIdentifier;
199 213 volatile unsigned char reserved;
200 214 volatile unsigned char userApplication;
201 215 volatile unsigned char packetID[2];
202 216 volatile unsigned char packetSequenceControl[2];
203 217 volatile unsigned char packetLength[2];
204 218 // DATA FIELD HEADER
205 219 volatile unsigned char spare1_pusVersion_spare2;
206 220 volatile unsigned char serviceType;
207 221 volatile unsigned char serviceSubType;
208 222 volatile unsigned char destinationID;
209 223 volatile unsigned char time[6];
210 224 };
211 225 typedef struct TMHeader_str TMHeader_t;
212 226
213 227 struct Packet_TM_LFR_TC_EXE_str
214 228 {
215 229 volatile unsigned char targetLogicalAddress;
216 230 volatile unsigned char protocolIdentifier;
217 231 volatile unsigned char reserved;
218 232 volatile unsigned char userApplication;
219 233 volatile unsigned char packetID[2];
220 234 volatile unsigned char packetSequenceControl[2];
221 235 volatile unsigned char packetLength[2];
222 236 // DATA FIELD HEADER
223 237 volatile unsigned char spare1_pusVersion_spare2;
224 238 volatile unsigned char serviceType;
225 239 volatile unsigned char serviceSubType;
226 240 volatile unsigned char destinationID;
227 241 volatile unsigned char time[6];
228 242 volatile unsigned char data[LENGTH_TM_LFR_TC_EXE_MAX - 10 + 1];
229 243 };
230 244 typedef struct Packet_TM_LFR_TC_EXE_str Packet_TM_LFR_TC_EXE_t;
231 245
232 246 struct Packet_TM_LFR_TC_EXE_SUCCESS_str
233 247 {
234 248 volatile unsigned char targetLogicalAddress;
235 249 volatile unsigned char protocolIdentifier;
236 250 volatile unsigned char reserved;
237 251 volatile unsigned char userApplication;
238 252 // PACKET HEADER
239 253 volatile unsigned char packetID[2];
240 254 volatile unsigned char packetSequenceControl[2];
241 255 volatile unsigned char packetLength[2];
242 256 // DATA FIELD HEADER
243 257 volatile unsigned char spare1_pusVersion_spare2;
244 258 volatile unsigned char serviceType;
245 259 volatile unsigned char serviceSubType;
246 260 volatile unsigned char destinationID;
247 261 volatile unsigned char time[6];
248 262 //
249 263 volatile unsigned char telecommand_pkt_id[2];
250 264 volatile unsigned char pkt_seq_control[2];
251 265 };
252 266 typedef struct Packet_TM_LFR_TC_EXE_SUCCESS_str Packet_TM_LFR_TC_EXE_SUCCESS_t;
253 267
254 268 struct Packet_TM_LFR_TC_EXE_INCONSISTENT_str
255 269 {
256 270 volatile unsigned char targetLogicalAddress;
257 271 volatile unsigned char protocolIdentifier;
258 272 volatile unsigned char reserved;
259 273 volatile unsigned char userApplication;
260 274 // PACKET HEADER
261 275 volatile unsigned char packetID[2];
262 276 volatile unsigned char packetSequenceControl[2];
263 277 volatile unsigned char packetLength[2];
264 278 // DATA FIELD HEADER
265 279 volatile unsigned char spare1_pusVersion_spare2;
266 280 volatile unsigned char serviceType;
267 281 volatile unsigned char serviceSubType;
268 282 volatile unsigned char destinationID;
269 283 volatile unsigned char time[6];
270 284 //
271 285 volatile unsigned char tc_failure_code[2];
272 286 volatile unsigned char telecommand_pkt_id[2];
273 287 volatile unsigned char pkt_seq_control[2];
274 288 volatile unsigned char tc_service;
275 289 volatile unsigned char tc_subtype;
276 290 volatile unsigned char byte_position;
277 291 volatile unsigned char rcv_value;
278 292 };
279 293 typedef struct Packet_TM_LFR_TC_EXE_INCONSISTENT_str Packet_TM_LFR_TC_EXE_INCONSISTENT_t;
280 294
281 295 struct Packet_TM_LFR_TC_EXE_NOT_EXECUTABLE_str
282 296 {
283 297 volatile unsigned char targetLogicalAddress;
284 298 volatile unsigned char protocolIdentifier;
285 299 volatile unsigned char reserved;
286 300 volatile unsigned char userApplication;
287 301 // PACKET HEADER
288 302 volatile unsigned char packetID[2];
289 303 volatile unsigned char packetSequenceControl[2];
290 304 volatile unsigned char packetLength[2];
291 305 // DATA FIELD HEADER
292 306 volatile unsigned char spare1_pusVersion_spare2;
293 307 volatile unsigned char serviceType;
294 308 volatile unsigned char serviceSubType;
295 309 volatile unsigned char destinationID;
296 310 volatile unsigned char time[6];
297 311 //
298 312 volatile unsigned char tc_failure_code[2];
299 313 volatile unsigned char telecommand_pkt_id[2];
300 314 volatile unsigned char pkt_seq_control[2];
301 315 volatile unsigned char tc_service;
302 316 volatile unsigned char tc_subtype;
303 317 volatile unsigned char lfr_status_word[2];
304 318 };
305 319 typedef struct Packet_TM_LFR_TC_EXE_NOT_EXECUTABLE_str Packet_TM_LFR_TC_EXE_NOT_EXECUTABLE_t;
306 320
307 321 struct Packet_TM_LFR_TC_EXE_NOT_IMPLEMENTED_str
308 322 {
309 323 volatile unsigned char targetLogicalAddress;
310 324 volatile unsigned char protocolIdentifier;
311 325 volatile unsigned char reserved;
312 326 volatile unsigned char userApplication;
313 327 // PACKET HEADER
314 328 volatile unsigned char packetID[2];
315 329 volatile unsigned char packetSequenceControl[2];
316 330 volatile unsigned char packetLength[2];
317 331 // DATA FIELD HEADER
318 332 volatile unsigned char spare1_pusVersion_spare2;
319 333 volatile unsigned char serviceType;
320 334 volatile unsigned char serviceSubType;
321 335 volatile unsigned char destinationID;
322 336 volatile unsigned char time[6];
323 337 //
324 338 volatile unsigned char tc_failure_code[2];
325 339 volatile unsigned char telecommand_pkt_id[2];
326 340 volatile unsigned char pkt_seq_control[2];
327 341 volatile unsigned char tc_service;
328 342 volatile unsigned char tc_subtype;
329 343 };
330 344 typedef struct Packet_TM_LFR_TC_EXE_NOT_IMPLEMENTED_str Packet_TM_LFR_TC_EXE_NOT_IMPLEMENTED_t;
331 345
332 346 struct Packet_TM_LFR_TC_EXE_ERROR_str
333 347 {
334 348 volatile unsigned char targetLogicalAddress;
335 349 volatile unsigned char protocolIdentifier;
336 350 volatile unsigned char reserved;
337 351 volatile unsigned char userApplication;
338 352 // PACKET HEADER
339 353 volatile unsigned char packetID[2];
340 354 volatile unsigned char packetSequenceControl[2];
341 355 volatile unsigned char packetLength[2];
342 356 // DATA FIELD HEADER
343 357 volatile unsigned char spare1_pusVersion_spare2;
344 358 volatile unsigned char serviceType;
345 359 volatile unsigned char serviceSubType;
346 360 volatile unsigned char destinationID;
347 361 volatile unsigned char time[6];
348 362 //
349 363 volatile unsigned char tc_failure_code[2];
350 364 volatile unsigned char telecommand_pkt_id[2];
351 365 volatile unsigned char pkt_seq_control[2];
352 366 volatile unsigned char tc_service;
353 367 volatile unsigned char tc_subtype;
354 368 };
355 369 typedef struct Packet_TM_LFR_TC_EXE_ERROR_str Packet_TM_LFR_TC_EXE_ERROR_t;
356 370
357 371 struct Packet_TM_LFR_TC_EXE_CORRUPTED_str
358 372 {
359 373 volatile unsigned char targetLogicalAddress;
360 374 volatile unsigned char protocolIdentifier;
361 375 volatile unsigned char reserved;
362 376 volatile unsigned char userApplication;
363 377 // PACKET HEADER
364 378 volatile unsigned char packetID[2];
365 379 volatile unsigned char packetSequenceControl[2];
366 380 volatile unsigned char packetLength[2];
367 381 // DATA FIELD HEADER
368 382 volatile unsigned char spare1_pusVersion_spare2;
369 383 volatile unsigned char serviceType;
370 384 volatile unsigned char serviceSubType;
371 385 volatile unsigned char destinationID;
372 386 volatile unsigned char time[6];
373 387 //
374 388 volatile unsigned char tc_failure_code[2];
375 389 volatile unsigned char telecommand_pkt_id[2];
376 390 volatile unsigned char pkt_seq_control[2];
377 391 volatile unsigned char tc_service;
378 392 volatile unsigned char tc_subtype;
379 393 volatile unsigned char pkt_len_rcv_value[2];
380 394 volatile unsigned char pkt_datafieldsize_cnt[2];
381 395 volatile unsigned char rcv_crc[2];
382 396 volatile unsigned char computed_crc[2];
383 397 };
384 398 typedef struct Packet_TM_LFR_TC_EXE_CORRUPTED_str Packet_TM_LFR_TC_EXE_CORRUPTED_t;
385 399
386 400 struct Header_TM_LFR_SCIENCE_SWF_str
387 401 {
388 402 volatile unsigned char targetLogicalAddress;
389 403 volatile unsigned char protocolIdentifier;
390 404 volatile unsigned char reserved;
391 405 volatile unsigned char userApplication;
392 406 volatile unsigned char packetID[2];
393 407 volatile unsigned char packetSequenceControl[2];
394 408 volatile unsigned char packetLength[2];
395 409 // DATA FIELD HEADER
396 410 volatile unsigned char spare1_pusVersion_spare2;
397 411 volatile unsigned char serviceType;
398 412 volatile unsigned char serviceSubType;
399 413 volatile unsigned char destinationID;
400 414 volatile unsigned char time[6];
401 415 // AUXILIARY HEADER
402 416 volatile unsigned char sid;
403 417 volatile unsigned char hkBIA;
404 418 volatile unsigned char pktCnt;
405 419 volatile unsigned char pktNr;
406 420 volatile unsigned char acquisitionTime[6];
407 421 volatile unsigned char blkNr[2];
408 422 };
409 423 typedef struct Header_TM_LFR_SCIENCE_SWF_str Header_TM_LFR_SCIENCE_SWF_t;
410 424
411 425 struct Header_TM_LFR_SCIENCE_CWF_str
412 426 {
413 427 volatile unsigned char targetLogicalAddress;
414 428 volatile unsigned char protocolIdentifier;
415 429 volatile unsigned char reserved;
416 430 volatile unsigned char userApplication;
417 431 volatile unsigned char packetID[2];
418 432 volatile unsigned char packetSequenceControl[2];
419 433 volatile unsigned char packetLength[2];
420 434 // DATA FIELD HEADER
421 435 volatile unsigned char spare1_pusVersion_spare2;
422 436 volatile unsigned char serviceType;
423 437 volatile unsigned char serviceSubType;
424 438 volatile unsigned char destinationID;
425 439 volatile unsigned char time[6];
426 440 // AUXILIARY DATA HEADER
427 441 volatile unsigned char sid;
428 442 volatile unsigned char hkBIA;
429 443 volatile unsigned char acquisitionTime[6];
430 444 volatile unsigned char blkNr[2];
431 445 };
432 446 typedef struct Header_TM_LFR_SCIENCE_CWF_str Header_TM_LFR_SCIENCE_CWF_t;
433 447
434 448 struct Header_TM_LFR_SCIENCE_ASM_str
435 449 {
436 450 volatile unsigned char targetLogicalAddress;
437 451 volatile unsigned char protocolIdentifier;
438 452 volatile unsigned char reserved;
439 453 volatile unsigned char userApplication;
440 454 volatile unsigned char packetID[2];
441 455 volatile unsigned char packetSequenceControl[2];
442 456 volatile unsigned char packetLength[2];
443 457 // DATA FIELD HEADER
444 458 volatile unsigned char spare1_pusVersion_spare2;
445 459 volatile unsigned char serviceType;
446 460 volatile unsigned char serviceSubType;
447 461 volatile unsigned char destinationID;
448 462 volatile unsigned char time[6];
449 463 // AUXILIARY HEADER
450 464 volatile unsigned char sid;
451 465 volatile unsigned char biaStatusInfo;
452 466 volatile unsigned char cntASM;
453 467 volatile unsigned char nrASM;
454 468 volatile unsigned char acquisitionTime[6];
455 469 volatile unsigned char blkNr[2];
456 470 };
457 471 typedef struct Header_TM_LFR_SCIENCE_ASM_str Header_TM_LFR_SCIENCE_ASM_t;
458 472
459 473 struct ccsdsTelecommandPacket_str
460 474 {
461 475 //unsigned char targetLogicalAddress; // removed by the grspw module
462 476 volatile unsigned char protocolIdentifier;
463 477 volatile unsigned char reserved;
464 478 volatile unsigned char userApplication;
465 479 volatile unsigned char packetID[2];
466 480 volatile unsigned char packetSequenceControl[2];
467 481 volatile unsigned char packetLength[2];
468 482 // DATA FIELD HEADER
469 483 volatile unsigned char headerFlag_pusVersion_Ack;
470 484 volatile unsigned char serviceType;
471 485 volatile unsigned char serviceSubType;
472 486 volatile unsigned char sourceID;
473 487 volatile unsigned char dataAndCRC[CCSDS_TC_PKT_MAX_SIZE-10];
474 488 };
475 489 typedef struct ccsdsTelecommandPacket_str ccsdsTelecommandPacket_t;
476 490
477 491 struct Packet_TM_LFR_HK_str
478 492 {
479 493 volatile unsigned char targetLogicalAddress;
480 494 volatile unsigned char protocolIdentifier;
481 495 volatile unsigned char reserved;
482 496 volatile unsigned char userApplication;
483 497 volatile unsigned char packetID[2];
484 498 volatile unsigned char packetSequenceControl[2];
485 499 volatile unsigned char packetLength[2];
486 500 volatile unsigned char spare1_pusVersion_spare2;
487 501 volatile unsigned char serviceType;
488 502 volatile unsigned char serviceSubType;
489 503 volatile unsigned char destinationID;
490 504 volatile unsigned char time[6];
491 505 volatile unsigned char sid;
492 506
493 507 //**************
494 508 // HK PARAMETERS
495 509 unsigned char lfr_status_word[2];
496 510 unsigned char lfr_sw_version[4];
497 511 // tc statistics
498 512 unsigned char hk_lfr_update_info_tc_cnt[2];
499 513 unsigned char hk_lfr_update_time_tc_cnt[2];
500 514 unsigned char hk_dpu_exe_tc_lfr_cnt[2];
501 515 unsigned char hk_dpu_rej_tc_lfr_cnt[2];
502 516 unsigned char hk_lfr_last_exe_tc_id[2];
503 517 unsigned char hk_lfr_last_exe_tc_type[2];
504 518 unsigned char hk_lfr_last_exe_tc_subtype[2];
505 519 unsigned char hk_lfr_last_exe_tc_time[6];
506 520 unsigned char hk_lfr_last_rej_tc_id[2];
507 521 unsigned char hk_lfr_last_rej_tc_type[2];
508 522 unsigned char hk_lfr_last_rej_tc_subtype[2];
509 523 unsigned char hk_lfr_last_rej_tc_time[6];
510 524 // anomaly statistics
511 525 unsigned char hk_lfr_le_cnt[2];
512 526 unsigned char hk_lfr_me_cnt[2];
513 527 unsigned char hk_lfr_he_cnt[2];
514 528 unsigned char hk_lfr_last_er_rid[2];
515 529 unsigned char hk_lfr_last_er_code;
516 530 unsigned char hk_lfr_last_er_time[6];
517 531 // vhdl_blk_status
518 532 unsigned char hk_lfr_vhdl_aa_sm;
519 533 unsigned char hk_lfr_vhdl_fft_sr;
520 534 unsigned char hk_lfr_vhdl_cic_hk;
521 535 unsigned char hk_lfr_vhdl_iir_cal;
522 536 // spacewire_if_statistics
523 537 unsigned char hk_lfr_dpu_spw_pkt_rcv_cnt[2];
524 538 unsigned char hk_lfr_dpu_spw_pkt_sent_cnt[2];
525 539 unsigned char hk_lfr_dpu_spw_tick_out_cnt;
526 540 unsigned char hk_lfr_dpu_spw_last_timc;
527 541 // ahb error statistics
528 542 unsigned int hk_lfr_last_fail_addr;
529 543 // temperatures
530 544 unsigned char hk_lfr_temp_scm[2];
531 545 unsigned char hk_lfr_temp_pcb[2];
532 546 unsigned char hk_lfr_temp_fpga[2];
533 547 // error counters
534 548 unsigned char hk_lfr_dpu_spw_parity;
535 549 unsigned char hk_lfr_dpu_spw_disconnect;
536 550 unsigned char hk_lfr_dpu_spw_escape;
537 551 unsigned char hk_lfr_dpu_spw_credit;
538 552 unsigned char hk_lfr_dpu_spw_write_sync;
539 553 unsigned char hk_lfr_dpu_spw_rx_ahb;
540 554 unsigned char hk_lfr_dpu_spw_tx_ahb;
541 555 unsigned char hk_lfr_dpu_spw_header_crc;
542 556 unsigned char hk_lfr_dpu_spw_data_crc;
543 557 unsigned char hk_lfr_dpu_spw_early_eop;
544 558 unsigned char hk_lfr_dpu_spw_invalid_addr;
545 559 unsigned char hk_lfr_dpu_spw_eep;
546 560 unsigned char hk_lfr_dpu_spw_rx_too_big;
547 561 // timecode
548 562 unsigned char hk_lfr_timecode_erroneous;
549 563 unsigned char hk_lfr_timecode_missing;
550 564 unsigned char hk_lfr_timecode_invalid;
551 565 // time
552 566 unsigned char hk_lfr_time_timecode_it;
553 567 unsigned char hk_lfr_time_not_synchro;
554 568 unsigned char hk_lfr_time_timecode_ctr;
555 569 // hk_lfr_buffer_dpu_
556 570 unsigned char hk_lfr_buffer_dpu_tc_fifo;
557 571 unsigned char hk_lfr_buffer_dpu_tm_fifo;
558 572 // hk_lfr_ahb_
559 573 unsigned char hk_lfr_ahb_correctable;
560 574 unsigned char hk_lfr_ahb_uncorrectable;
561 575 unsigned char hk_lfr_ahb_fails_trans;
562 576 // hk_lfr_adc_
563 577 unsigned char hk_lfr_adc_failure;
564 578 unsigned char hk_lfr_adc_timeout;
565 579 unsigned char hk_lfr_toomany_err;
566 580 // hk_lfr_cpu_
567 581 unsigned char hk_lfr_cpu_write_err;
568 582 unsigned char hk_lfr_cpu_ins_access_err;
569 583 unsigned char hk_lfr_cpu_illegal_ins;
570 584 unsigned char hk_lfr_cpu_privilegied_ins;
571 585 unsigned char hk_lfr_cpu_register_hw;
572 586 unsigned char hk_lfr_cpu_not_aligned;
573 587 unsigned char hk_lfr_cpu_data_exception;
574 588 unsigned char hk_lfr_cpu_div_exception;
575 589 unsigned char hk_lfr_cpu_arith_overflow;
576 590 };
577 591 typedef struct Packet_TM_LFR_HK_str Packet_TM_LFR_HK_t;
578 592
579 593 struct Packet_TM_LFR_PARAMETER_DUMP_str
580 594 {
581 595 volatile unsigned char targetLogicalAddress;
582 596 volatile unsigned char protocolIdentifier;
583 597 volatile unsigned char reserved;
584 598 volatile unsigned char userApplication;
585 599 volatile unsigned char packetID[2];
586 600 volatile unsigned char packetSequenceControl[2];
587 601 volatile unsigned char packetLength[2];
588 602 // DATA FIELD HEADER
589 603 volatile unsigned char spare1_pusVersion_spare2;
590 604 volatile unsigned char serviceType;
591 605 volatile unsigned char serviceSubType;
592 606 volatile unsigned char destinationID;
593 607 volatile unsigned char time[6];
594 608 volatile unsigned char sid;
595 609
596 610 //******************
597 611 // COMMON PARAMETERS
598 612 volatile unsigned char unused0;
599 613 volatile unsigned char bw_sp0_sp1_r0_r1;
600 614
601 615 //******************
602 616 // NORMAL PARAMETERS
603 617 volatile unsigned char sy_lfr_n_swf_l[2];
604 618 volatile unsigned char sy_lfr_n_swf_p[2];
605 619 volatile unsigned char sy_lfr_n_asm_p[2];
606 620 volatile unsigned char sy_lfr_n_bp_p0;
607 621 volatile unsigned char sy_lfr_n_bp_p1;
608 622
609 623 //*****************
610 624 // BURST PARAMETERS
611 625 volatile unsigned char sy_lfr_b_bp_p0;
612 626 volatile unsigned char sy_lfr_b_bp_p1;
613 627
614 628 //****************
615 629 // SBM1 PARAMETERS
616 630 volatile unsigned char sy_lfr_s1_bp_p0;
617 631 volatile unsigned char sy_lfr_s1_bp_p1;
618 632
619 633 //****************
620 634 // SBM2 PARAMETERS
621 635 volatile unsigned char sy_lfr_s2_bp_p0;
622 636 volatile unsigned char sy_lfr_s2_bp_p1;
623 637 };
624 638 typedef struct Packet_TM_LFR_PARAMETER_DUMP_str Packet_TM_LFR_PARAMETER_DUMP_t;
625 639
626 640
627 641 #endif // CCSDS_TYPES_H_INCLUDED
@@ -1,49 +1,48
1 1 #ifndef FSW_INIT_H_INCLUDED
2 2 #define FSW_INIT_H_INCLUDED
3 3
4 4 #include <rtems.h>
5 5 #include <leon.h>
6 6
7 7 #include "fsw_params.h"
8 8 #include "fsw_misc.h"
9 9 #include "fsw_processing.h"
10 10 #include "tc_handler.h"
11 11 #include "wf_handler.h"
12 12
13 13 #include "fsw_spacewire.h"
14 14
15 15 extern rtems_name misc_name[5];
16 16 extern rtems_id misc_id[5];
17 17 extern rtems_name Task_name[20]; /* array of task names */
18 18 extern rtems_id Task_id[20]; /* array of task ids */
19 19 extern unsigned int maxCount;
20 20 extern int fdSPW; // grspw file descriptor
21 21 extern int fdUART; // uart file descriptor
22 22 extern unsigned char lfrCurrentMode;
23 23
24 24 // MODE PARAMETERS
25 25 extern struct param_local_str param_local;
26 26 extern Packet_TM_LFR_PARAMETER_DUMP_t parameter_dump_packet;
27 27 extern unsigned short sequenceCounters[SEQ_CNT_NB_PID][SEQ_CNT_NB_CAT][SEQ_CNT_NB_DEST_ID];
28 28
29 29 // RTEMS TASKS
30 30 rtems_task Init( rtems_task_argument argument);
31 31
32 32 // OTHER functions
33 int create_names( void );
33 void create_names( void );
34 rtems_status_code create_message_queues( void );
34 35 int create_all_tasks( void );
35 36 int start_all_tasks( void );
36 rtems_status_code create_message_queues( void );
37 int start_recv_send_tasks( void );
37 38 //
38 void init_parameter_dump( void );
39 39 void init_local_mode_parameters( void );
40 void init_housekeeping_parameters( void );
41 40
42 41 extern int rtems_cpu_usage_report( void );
43 42 extern int rtems_cpu_usage_reset( void );
44 43 extern void rtems_stack_checker_report_usage( void );
45 44
46 45 extern int sched_yield( void );
47 46 extern int errno;
48 47
49 48 #endif // FSW_INIT_H_INCLUDED
@@ -1,33 +1,35
1 1 #ifndef FSW_MISC_H_INCLUDED
2 2 #define FSW_MISC_H_INCLUDED
3 3
4 4 #include <rtems.h>
5 5 #include <stdio.h>
6 6 #include <grspw.h>
7 7
8 8 #include "fsw_params.h"
9 9 #include "fsw_spacewire.h"
10 10
11 rtems_name HK_name; // name of the HK rate monotonic
11 rtems_name name_hk_rate_monotonic; // name of the HK rate monotonic
12 12 rtems_id HK_id; // id of the HK rate monotonic period
13 13
14 14 extern rtems_name misc_name[5];
15 15 time_management_regs_t *time_management_regs;
16 16 extern Packet_TM_LFR_HK_t housekeeping_packet;
17 17
18 18 int configure_timer(gptimer_regs_t *gptimer_regs, unsigned char timer, unsigned int clock_divider,
19 19 unsigned char interrupt_level, rtems_isr (*timer_isr)() );
20 20 int timer_start( gptimer_regs_t *gptimer_regs, unsigned char timer );
21 21 int timer_stop( gptimer_regs_t *gptimer_regs, unsigned char timer );
22 22 int timer_set_clock_divider(gptimer_regs_t *gptimer_regs, unsigned char timer, unsigned int clock_divider);
23 23
24 24 // SERIAL LINK
25 25 int send_console_outputs_on_apbuart_port( void );
26 26 void set_apbuart_scaler_reload_register(unsigned int regs, unsigned int value);
27 27
28 28 // RTEMS TASKS
29 29 rtems_task stat_task( rtems_task_argument argument );
30 30 rtems_task hous_task( rtems_task_argument argument );
31 31 rtems_task dumb_task( rtems_task_argument unused );
32 32
33 void init_housekeeping_parameters( void );
34
33 35 #endif // FSW_MISC_H_INCLUDED
@@ -1,225 +1,233
1 1 #ifndef FSW_PARAMS_H_INCLUDED
2 2 #define FSW_PARAMS_H_INCLUDED
3 3
4 4 #include "grlib_regs.h"
5 5 #include "fsw_params_processing.h"
6 6 #include "tm_byte_positions.h"
7 7 #include "ccsds_types.h"
8 8
9 9 #define GRSPW_DEVICE_NAME "/dev/grspw0"
10 10 #define UART_DEVICE_NAME "/dev/console"
11 11
12 12 //************************
13 13 // flight software version
14 14 // this parameters is handled by the Qt project options
15 15
16 16 //**********
17 17 // LFR MODES
18 18 #define LFR_MODE_STANDBY 0
19 19 #define LFR_MODE_NORMAL 1
20 20 #define LFR_MODE_BURST 2
21 21 #define LFR_MODE_SBM1 3
22 22 #define LFR_MODE_SBM2 4
23 23 #define LFR_MODE_NORMAL_CWF_F3 5
24 24
25 25 #define RTEMS_EVENT_MODE_STANDBY RTEMS_EVENT_0
26 26 #define RTEMS_EVENT_MODE_NORMAL RTEMS_EVENT_1
27 27 #define RTEMS_EVENT_MODE_BURST RTEMS_EVENT_2
28 28 #define RTEMS_EVENT_MODE_SBM1 RTEMS_EVENT_3
29 29 #define RTEMS_EVENT_MODE_SBM2 RTEMS_EVENT_4
30 30 #define RTEMS_EVENT_MODE_SBM2_WFRM RTEMS_EVENT_5
31 31
32 32 //****************************
33 33 // LFR DEFAULT MODE PARAMETERS
34 34 // COMMON
35 35 #define DEFAULT_SY_LFR_COMMON0 0x00
36 36 #define DEFAULT_SY_LFR_COMMON1 0x10 // default value 0 0 0 1 0 0 0 0
37 37 // NORM
38 #define DEFAULT_SY_LFR_N_SWF_L 2048 // nb sample
39 #define DEFAULT_SY_LFR_N_SWF_P 16 // sec
40 #define DEFAULT_SY_LFR_N_ASM_P 16 // sec
41 #define DEFAULT_SY_LFR_N_BP_P0 4 // sec
42 #define DEFAULT_SY_LFR_N_BP_P1 20 // sec
38 #define SY_LFR_N_SWF_L 2048 // nb sample
39 #define SY_LFR_N_SWF_P 300 // sec
40 #define SY_LFR_N_ASM_P 3600 // sec
41 #define SY_LFR_N_BP_P0 4 // sec
42 #define SY_LFR_N_BP_P1 20 // sec
43 43 #define MIN_DELTA_SNAPSHOT 16 // sec
44 44 // BURST
45 45 #define DEFAULT_SY_LFR_B_BP_P0 1 // sec
46 46 #define DEFAULT_SY_LFR_B_BP_P1 5 // sec
47 47 // SBM1
48 48 #define DEFAULT_SY_LFR_S1_BP_P0 1 // sec
49 49 #define DEFAULT_SY_LFR_S1_BP_P1 1 // sec
50 50 // SBM2
51 51 #define DEFAULT_SY_LFR_S2_BP_P0 1 // sec
52 52 #define DEFAULT_SY_LFR_S2_BP_P1 5 // sec
53 53 // ADDITIONAL PARAMETERS
54 54 #define TIME_BETWEEN_TWO_SWF_PACKETS 30 // nb x 10 ms => 300 ms
55 55 #define TIME_BETWEEN_TWO_CWF3_PACKETS 1000 // nb x 10 ms => 10 s
56 // STATUS WORD
57 #define DEFAULT_STATUS_WORD_BYTE0 0x0d // [0000] [1] [101] mode 4 bits / SPW enabled 1 bit / state is run 3 bits
58 #define DEFAULT_STATUS_WORD_BYTE1 0x00
56 59 //
60 #define SY_LFR_DPU_CONNECT_TIMEOUT 100 // 100 * 10 ms = 1 s
61 #define SY_LFR_DPU_CONNECT_ATTEMPT 3
57 62 //****************************
58 63
59 64 //*****************************
60 65 // APB REGISTERS BASE ADDRESSES
61 66 #define REGS_ADDR_APBUART 0x80000100
62 67 #define REGS_ADDR_GPTIMER 0x80000300
63 68 #define REGS_ADDR_GRSPW 0x80000500
64 69 #define REGS_ADDR_TIME_MANAGEMENT 0x80000600
65 70 #define REGS_ADDR_SPECTRAL_MATRIX 0x80000f00
66 71
67 72 #ifdef GSA
68 73 #else
69 74 #define REGS_ADDR_WAVEFORM_PICKER 0x80000f20
70 75 #endif
71 76
72 77 #define APBUART_CTRL_REG_MASK_DB 0xfffff7ff
73 78 #define APBUART_SCALER_RELOAD_VALUE 0x00000050 // 25 MHz => about 38400 (0x50)
74 79
75 80 //**********
76 81 // IRQ LINES
77 82 #define IRQ_SM 9
78 83 #define IRQ_SPARC_SM 0x19 // see sparcv8.pdf p.76 for interrupt levels
79 84 #define IRQ_WF 10
80 85 #define IRQ_SPARC_WF 0x1a // see sparcv8.pdf p.76 for interrupt levels
81 86 #define IRQ_TIME1 12
82 87 #define IRQ_SPARC_TIME1 0x1c // see sparcv8.pdf p.76 for interrupt levels
83 88 #define IRQ_TIME2 13
84 89 #define IRQ_SPARC_TIME2 0x1d // see sparcv8.pdf p.76 for interrupt levels
85 90 #define IRQ_WAVEFORM_PICKER 14
86 91 #define IRQ_SPARC_WAVEFORM_PICKER 0x1e // see sparcv8.pdf p.76 for interrupt levels
87 92 #define IRQ_SPECTRAL_MATRIX 6
88 93 #define IRQ_SPARC_SPECTRAL_MATRIX 0x16 // see sparcv8.pdf p.76 for interrupt levels
89 94
90 95 //*****
91 96 // TIME
92 97 #define CLKDIV_SM_SIMULATOR (10000 - 1) // 10 ms
93 98 #define CLKDIV_WF_SIMULATOR (10000000 - 1) // 10 000 000 * 1 us = 10 s
94 99 #define TIMER_SM_SIMULATOR 1
95 100 #define TIMER_WF_SIMULATOR 2
96 101 #define HK_PERIOD 100 // 100 * 10ms => 1sec
97 102
98 103 //**********
99 104 // LPP CODES
100 105 #define LFR_SUCCESSFUL 0
101 106 #define LFR_DEFAULT 1
102 107
103 108 //******
104 109 // RTEMS
105 110 #define TASKID_RECV 1
106 111 #define TASKID_ACTN 2
107 112 #define TASKID_SPIQ 3
108 113 #define TASKID_SMIQ 4
109 114 #define TASKID_STAT 5
110 115 #define TASKID_AVF0 6
111 116 #define TASKID_BPF0 7
112 117 #define TASKID_WFRM 8
113 118 #define TASKID_DUMB 9
114 119 #define TASKID_HOUS 10
115 120 #define TASKID_MATR 11
116 121 #define TASKID_CWF3 12
117 122 #define TASKID_CWF2 13
118 123 #define TASKID_CWF1 14
119 124 #define TASKID_SEND 15
125 #define TASKID_WTDG 16
120 126
121 127 #define TASK_PRIORITY_SPIQ 5
122 128 #define TASK_PRIORITY_SMIQ 10
123 129 //
124 #define TASK_PRIORITY_RECV 20
130 #define TASK_PRIORITY_WTDG 20
131 //
125 132 #define TASK_PRIORITY_ACTN 30
126 133 //
127 134 #define TASK_PRIORITY_HOUS 40
128 135 #define TASK_PRIORITY_CWF1 40
129 136 #define TASK_PRIORITY_CWF2 40
130 137 #define TASK_PRIORITY_WFRM 40
131 138 #define TASK_PRIORITY_CWF3 40
139 #define TASK_PRIORITY_SEND 40
132 140 //
133 #define TASK_PRIORITY_SEND 40
141 #define TASK_PRIORITY_RECV 50 // this priority prevents the blocking of of other tasks in case of link deconnexion
134 142 //
135 143 #define TASK_PRIORITY_AVF0 60
136 144 #define TASK_PRIORITY_BPF0 60
137 145 #define TASK_PRIORITY_MATR 100
138 146 #define TASK_PRIORITY_STAT 200
139 147 #define TASK_PRIORITY_DUMB 200
140 148
141 149 #define ACTION_MSG_QUEUE_COUNT 10
142 150 #define ACTION_MSG_PKTS_COUNT 50
143 #define ACTION_MSG_PKTS_MAX_SIZE (PACKET_LENGTH_PARAMETER_DUMP + CCSDS_TC_TM_PACKET_OFFSET + CCSDS_PROTOCOLE_EXTRA_BYTES)
151 #define ACTION_MSG_PKTS_MAX_SIZE (PACKET_LENGTH_HK + CCSDS_TC_TM_PACKET_OFFSET + CCSDS_PROTOCOLE_EXTRA_BYTES)
144 152 #define ACTION_MSG_SPW_IOCTL_SEND_SIZE 24 // hlen *hdr dlen *data sent options
145 153
146 154 #define QUEUE_RECV 0
147 155 #define QUEUE_SEND 1
148 156
149 157 //*******
150 158 // MACROS
151 159 #ifdef PRINT_MESSAGES_ON_CONSOLE
152 160 #define PRINTF(x) printf(x);
153 161 #define PRINTF1(x,y) printf(x,y);
154 162 #define PRINTF2(x,y,z) printf(x,y,z);
155 163 #else
156 164 #define PRINTF(x) ;
157 165 #define PRINTF1(x,y) ;
158 166 #define PRINTF2(x,y,z) ;
159 167 #endif
160 168
161 169 #ifdef BOOT_MESSAGES
162 170 #define BOOT_PRINTF(x) printf(x);
163 171 #define BOOT_PRINTF1(x,y) printf(x,y);
164 172 #define BOOT_PRINTF2(x,y,z) printf(x,y,z);
165 173 #else
166 174 #define BOOT_PRINTF(x) ;
167 175 #define BOOT_PRINTF1(x,y) ;
168 176 #define BOOT_PRINTF2(x,y,z) ;
169 177 #endif
170 178
171 179 #ifdef DEBUG_MESSAGES
172 180 #define DEBUG_PRINTF(x) printf(x);
173 181 #define DEBUG_PRINTF1(x,y) printf(x,y);
174 182 #define DEBUG_PRINTF2(x,y,z) printf(x,y,z);
175 183 #else
176 184 #define DEBUG_PRINTF(x) ;
177 185 #define DEBUG_PRINTF1(x,y) ;
178 186 #define DEBUG_PRINTF2(x,y,z) ;
179 187 #endif
180 188
181 189 #define CPU_USAGE_REPORT_PERIOD 6 // * 10 s = period
182 190
183 191 #define NB_SAMPLES_PER_SNAPSHOT 2048
184 192 #define TIME_OFFSET 2
185 193 #define WAVEFORM_EXTENDED_HEADER_OFFSET 22
186 194 #define NB_BYTES_SWF_BLK (2 * 6)
187 195 #define NB_WORDS_SWF_BLK 3
188 196 #define NB_BYTES_CWF3_LIGHT_BLK 6
189 197 #define WFRM_INDEX_OF_LAST_PACKET 6 // waveforms are transmitted in groups of 2048 blocks, 6 packets of 340 and 1 of 8
190 198
191 199 //******************
192 200 // SEQUENCE COUNTERS
193 201 #define SEQ_CNT_NB_PID 2
194 202 #define SEQ_CNT_NB_CAT 4
195 203 #define SEQ_CNT_NB_DEST_ID 11
196 204 // pid
197 205 #define SEQ_CNT_PID_76 0
198 206 #define SEQ_CNT_PID_79 1
199 207 //cat
200 208 #define SEQ_CNT_CAT_1 0
201 209 #define SEQ_CNT_CAT_4 1
202 210 #define SEQ_CNT_CAT_9 2
203 211 #define SEQ_CNT_CAT_12 3
204 212 // destination id
205 213 #define SEQ_CNT_DST_ID_GROUND 0
206 214 #define SEQ_CNT_DST_ID_MISSION_TIMELINE 1
207 215 #define SEQ_CNT_DST_ID_TC_SEQUENCES 2
208 216 #define SEQ_CNT_DST_ID_RECOVERY_ACTION_CMD 3
209 217 #define SEQ_CNT_DST_ID_BACKUP_MISSION_TIMELINE 4
210 218 #define SEQ_CNT_DST_ID_DIRECT_CMD 5
211 219 #define SEQ_CNT_DST_ID_SPARE_GRD_SRC1 6
212 220 #define SEQ_CNT_DST_ID_SPARE_GRD_SRC2 7
213 221 #define SEQ_CNT_DST_ID_OBCP 8
214 222 #define SEQ_CNT_DST_ID_SYSTEM_CONTROL 9
215 223 #define SEQ_CNT_DST_ID_AOCS 10
216 224
217 225 struct param_local_str{
218 226 unsigned int local_sbm1_nb_cwf_sent;
219 227 unsigned int local_sbm1_nb_cwf_max;
220 228 unsigned int local_sbm2_nb_cwf_sent;
221 229 unsigned int local_sbm2_nb_cwf_max;
222 230 unsigned int local_nb_interrupt_f0_MAX;
223 231 };
224 232
225 233 #endif // FSW_PARAMS_H_INCLUDED
@@ -1,27 +1,29
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 #define TOTAL_SIZE_SM (NB_BINS_PER_SM * NB_VALUES_PER_SM)
7 #define SM_HEADER 4
6 //#define TOTAL_SIZE_SM (NB_BINS_PER_SM * NB_VALUES_PER_SM)
7 //#define SM_HEADER 4
8 #define TOTAL_SIZE_SM 0
9 #define SM_HEADER 0
8 10
9 11 #define NB_BINS_COMPRESSED_SM_F0 11
10 12 #define NB_BINS_COMPRESSED_SM_F1 13
11 13 #define NB_BINS_COMPRESSED_SM_F2 12
12 14 #define TOTAL_SIZE_COMPRESSED_MATRIX_f0 (NB_BINS_COMPRESSED_SM_F0 * NB_VALUES_PER_SM)
13 15 #define NB_AVERAGE_NORMAL_f0 96*4
14 16 #define NB_SM_TO_RECEIVE_BEFORE_AVF0 8
15 17
16 18 struct BP1_str{
17 19 volatile unsigned char PE[2];
18 20 volatile unsigned char PB[2];
19 21 volatile unsigned char V0;
20 22 volatile unsigned char V1;
21 23 volatile unsigned char V2_ELLIP_DOP;
22 24 volatile unsigned char SZ;
23 25 volatile unsigned char VPHI;
24 26 };
25 27 typedef struct BP1_str BP1_t;
26 28
27 29 #endif // FSW_PARAMS_PROCESSING_H
@@ -1,36 +1,40
1 1 #ifndef FSW_SPACEWIRE_H_INCLUDED
2 2 #define FSW_SPACEWIRE_H_INCLUDED
3 3
4 4 #include <rtems.h>
5 5 #include <grspw.h>
6 6
7 7 #include <fcntl.h> // for O_RDWR
8 8 #include <unistd.h> // for the read call
9 9 #include <sys/ioctl.h> // for the ioctl call
10 10 #include <errno.h>
11 11
12 12 #include "fsw_params.h"
13 13 #include "tc_handler.h"
14 14
15 15 extern spw_stats spacewire_stats;
16 16 extern spw_stats spacewire_stats_backup;
17 17 extern Packet_TM_LFR_HK_t housekeeping_packet;
18 18 extern rtems_id Task_id[20]; /* array of task ids */
19 19
20 20 // RTEMS TASK
21 21 rtems_task spiq_task( rtems_task_argument argument );
22 22 rtems_task recv_task( rtems_task_argument unused );
23 23 rtems_task send_task( rtems_task_argument argument );
24 rtems_task wtdg_task( rtems_task_argument argument );
24 25
25 int spacewire_configure_link( void );
26 int spacewire_wait_for_link( void );
26 int spacewire_open_link( void );
27 int spacewire_start_link( int fd );
28 int spacewire_configure_link(int fd );
29 int spacewire_reset_link( void );
27 30 void spacewire_set_NP( unsigned char val, unsigned int regAddr ); // No Port force
28 31 void spacewire_set_RE( unsigned char val, unsigned int regAddr ); // RMAP Enable
29 32 void spacewire_compute_stats_offsets( void );
30 33 void spacewire_update_statistics( void );
31 34
32 35 void timecode_irq_handler( void *pDev, void *regs, int minor, unsigned int tc );
36 rtems_timer_service_routine user_routine( rtems_id timer_id, void *user_data );
33 37
34 38 void (*grspw_timecode_callback) ( void *pDev, void *regs, int minor, unsigned int tc );
35 39
36 40 #endif // FSW_SPACEWIRE_H_INCLUDED
@@ -1,24 +1,25
1 1 #ifndef TC_ACCEPTANCE_H_INCLUDED
2 2 #define TC_ACCEPTANCE_H_INCLUDED
3 3
4 4 //#include "tm_lfr_tc_exe.h"
5 5 #include "fsw_params.h"
6 6
7 7 //**********************
8 8 // GENERAL USE FUNCTIONS
9 9 unsigned int Crc_opt( unsigned char D, unsigned int Chk);
10 10 void initLookUpTableForCRC( void );
11 11 void GetCRCAsTwoBytes(unsigned char* data, unsigned char* crcAsTwoBytes, unsigned int sizeOfData);
12 12
13 13 //*********************
14 14 // ACCEPTANCE FUNCTIONS
15 15 int tc_parser(ccsdsTelecommandPacket_t * TCPacket, unsigned int TC_LEN_RCV, unsigned char *computed_CRC);
16 16 int tc_check_type( unsigned char packetType );
17 17 int tc_check_subtype( unsigned char packetType );
18 int tc_check_sid( unsigned char sid );
18 19 int tc_check_length( unsigned char packetType, unsigned int length );
19 20 int tc_check_crc(ccsdsTelecommandPacket_t * TCPacket, unsigned int length , unsigned char *computed_CRC);
20 21
21 22 #endif // TC_ACCEPTANCE_H_INCLUDED
22 23
23 24
24 25
@@ -1,29 +1,31
1 1 #ifndef TC_LOAD_DUMP_PARAMETERS_H
2 2 #define TC_LOAD_DUMP_PARAMETERS_H
3 3
4 4 #include <rtems.h>
5 5 #include <stdio.h>
6 6
7 7 #include "fsw_params.h"
8 8 #include "wf_handler.h"
9 9 #include "tm_lfr_tc_exe.h"
10 10
11 11 extern int fdSPW;
12 12 extern unsigned char lfrCurrentMode;
13 13 extern Packet_TM_LFR_PARAMETER_DUMP_t parameter_dump_packet;
14 14 extern Packet_TM_LFR_HK_t housekeeping_packet;
15 15
16 16 int action_load_common_par( ccsdsTelecommandPacket_t *TC );
17 17 int action_load_normal_par( ccsdsTelecommandPacket_t *TC, rtems_id queue_id );
18 18 int action_load_burst_par( ccsdsTelecommandPacket_t *TC, rtems_id queue_id );
19 19 int action_load_sbm1_par( ccsdsTelecommandPacket_t *TC, rtems_id queue_id );
20 20 int action_load_sbm2_par( ccsdsTelecommandPacket_t *TC, rtems_id queue_id );
21 21 int action_dump_par(rtems_id queue_id );
22 22
23 23 int set_sy_lfr_n_swf_l( ccsdsTelecommandPacket_t *TC, rtems_id queue_id );
24 24 int set_sy_lfr_n_swf_p( ccsdsTelecommandPacket_t *TC, rtems_id queue_id );
25 25 int set_sy_lfr_n_asm_p( ccsdsTelecommandPacket_t *TC, rtems_id queue_id );
26 26 int set_sy_lfr_n_bp_p0( ccsdsTelecommandPacket_t *TC, rtems_id queue_id );
27 27 int set_sy_lfr_n_bp_p1( ccsdsTelecommandPacket_t *TC, rtems_id queue_id );
28 28
29 void init_parameter_dump( void );
30
29 31 #endif // TC_LOAD_DUMP_PARAMETERS_H
@@ -1,78 +1,80
1 1 #ifndef WF_HANDLER_H_INCLUDED
2 2 #define WF_HANDLER_H_INCLUDED
3 3
4 4 #include <rtems.h>
5 5 #include <grspw.h>
6 6 #include <stdio.h>
7 7 #include <math.h>
8 8
9 9 #include "fsw_params.h"
10 10
11 11 #define pi 3.1415
12 12
13 13 extern int fdSPW;
14 14 extern volatile int wf_snap_f0[ ];
15 15 //
16 16 extern volatile int wf_snap_f1[ ];
17 17 extern volatile int wf_snap_f1_bis[ ];
18 18 extern volatile int wf_snap_f1_norm[ ];
19 19 //
20 20 extern volatile int wf_snap_f2[ ];
21 21 extern volatile int wf_snap_f2_bis[ ];
22 22 extern volatile int wf_snap_f2_norm[ ];
23 23 //
24 24 extern volatile int wf_cont_f3[ ];
25 25 extern volatile int wf_cont_f3_bis[ ];
26 26 extern char wf_cont_f3_light[ ];
27 27 extern waveform_picker_regs_t *waveform_picker_regs;
28 28 extern time_management_regs_t *time_management_regs;
29 29 extern Packet_TM_LFR_HK_t housekeeping_packet;
30 30 extern Packet_TM_LFR_PARAMETER_DUMP_t parameter_dump_packet;
31 31 extern struct param_local_str param_local;
32 32
33 33 extern rtems_name misc_name[5];
34 extern rtems_name Task_name[20]; /* array of task ids */
34 35 extern rtems_id Task_id[20]; /* array of task ids */
36
35 37 extern unsigned char lfrCurrentMode;
36 38
37 39 rtems_isr waveforms_isr( rtems_vector_number vector );
38 40 rtems_isr waveforms_simulator_isr( rtems_vector_number vector );
39 41 rtems_task wfrm_task( rtems_task_argument argument );
40 42 rtems_task cwf3_task( rtems_task_argument argument );
41 43 rtems_task cwf2_task( rtems_task_argument argument );
42 44 rtems_task cwf1_task( rtems_task_argument argument );
43 45
44 46 //******************
45 47 // general functions
46 48 void init_waveforms( void );
47 49 //
48 50 int init_header_snapshot_wf_table( unsigned int sid, Header_TM_LFR_SCIENCE_SWF_t *headerSWF );
49 51 int init_header_continuous_wf_table( unsigned int sid, Header_TM_LFR_SCIENCE_CWF_t *headerCWF );
50 52 int init_header_continuous_wf3_light_table( Header_TM_LFR_SCIENCE_CWF_t *headerCWF );
51 53 //
52 54 void reset_waveforms( void );
53 55 //
54 56 int send_waveform_SWF( volatile int *waveform, unsigned int sid, Header_TM_LFR_SCIENCE_SWF_t *headerSWF, rtems_id queue_id );
55 57 int send_waveform_CWF( volatile int *waveform, unsigned int sid, Header_TM_LFR_SCIENCE_CWF_t *headerCWF, rtems_id queue_id );
56 58 int send_waveform_CWF3( volatile int *waveform, unsigned int sid, Header_TM_LFR_SCIENCE_CWF_t *headerCWF, rtems_id queue_id );
57 59 int send_waveform_CWF3_light( volatile int *waveform, Header_TM_LFR_SCIENCE_CWF_t *headerCWF, rtems_id queue_id );
58 60 //
59 61 rtems_id get_pkts_queue_id( void );
60 62
61 63 //**************
62 64 // wfp registers
63 65 void set_wfp_data_shaping();
64 66 char set_wfp_delta_snapshot();
65 67 void set_wfp_burst_enable_register( unsigned char mode);
66 68 void reset_wfp_burst_enable();
67 69 void reset_wfp_status();
68 70 void reset_waveform_picker_regs();
69 71
70 72 //*****************
71 73 // local parameters
72 74 void set_local_sbm1_nb_cwf_max();
73 75 void set_local_sbm2_nb_cwf_max();
74 76 void set_local_nb_interrupt_f0_MAX();
75 77 void reset_local_sbm1_nb_cwf_sent();
76 78 void reset_local_sbm2_nb_cwf_sent();
77 79
78 80 #endif // WF_HANDLER_H_INCLUDED
@@ -1,605 +1,595
1 1 /** This is the RTEMS initialization module.
2 2 *
3 3 * @file
4 4 * @author P. LEROY
5 5 *
6 6 * This module contains two very different information:
7 7 * - specific instructions to configure the compilation of the RTEMS executive
8 8 * - functions related to the fligth softwre initialization, especially the INIT RTEMS task
9 9 *
10 10 */
11 11
12 12 //*************************
13 13 // GPL reminder to be added
14 14 //*************************
15 15
16 16 #include <rtems.h>
17 17
18 18 /* configuration information */
19 19
20 20 #define CONFIGURE_INIT
21 21
22 22 #include <bsp.h> /* for device driver prototypes */
23 23
24 24 /* configuration information */
25 25
26 26 #define CONFIGURE_APPLICATION_NEEDS_CONSOLE_DRIVER
27 27 #define CONFIGURE_APPLICATION_NEEDS_CLOCK_DRIVER
28 28
29 29 #define CONFIGURE_MAXIMUM_TASKS 20
30 30 #define CONFIGURE_RTEMS_INIT_TASKS_TABLE
31 31 #define CONFIGURE_EXTRA_TASK_STACKS (3 * RTEMS_MINIMUM_STACK_SIZE)
32 32 #define CONFIGURE_LIBIO_MAXIMUM_FILE_DESCRIPTORS 32
33 33 #define CONFIGURE_INIT_TASK_PRIORITY 1 // instead of 100
34 34 #define CONFIGURE_INIT_TASK_MODE (RTEMS_DEFAULT_MODES | RTEMS_NO_PREEMPT)
35 35 #define CONFIGURE_MAXIMUM_DRIVERS 16
36 36 #define CONFIGURE_MAXIMUM_PERIODS 5
37 37 #define CONFIGURE_MAXIMUM_TIMERS 5 // STAT (1s), send SWF (0.3s), send CWF3 (1s)
38 38 #define CONFIGURE_MAXIMUM_MESSAGE_QUEUES 2
39 39 #ifdef PRINT_STACK_REPORT
40 40 #define CONFIGURE_STACK_CHECKER_ENABLED
41 41 #endif
42 42
43 43 #include <rtems/confdefs.h>
44 44
45 45 /* If --drvmgr was enabled during the configuration of the RTEMS kernel */
46 46 #ifdef RTEMS_DRVMGR_STARTUP
47 47 #ifdef LEON3
48 48 /* Add Timer and UART Driver */
49 49 #ifdef CONFIGURE_APPLICATION_NEEDS_CLOCK_DRIVER
50 50 #define CONFIGURE_DRIVER_AMBAPP_GAISLER_GPTIMER
51 51 #endif
52 52 #ifdef CONFIGURE_APPLICATION_NEEDS_CONSOLE_DRIVER
53 53 #define CONFIGURE_DRIVER_AMBAPP_GAISLER_APBUART
54 54 #endif
55 55 #endif
56 56 #define CONFIGURE_DRIVER_AMBAPP_GAISLER_GRSPW /* GRSPW Driver */
57 57 #include <drvmgr/drvmgr_confdefs.h>
58 58 #endif
59 59
60 60 #include "fsw_init.h"
61 61 #include "fsw_config.c"
62 62
63 63 rtems_task Init( rtems_task_argument ignored )
64 64 {
65 65 /** This is the RTEMS INIT taks, it the first task launched by the system.
66 66 *
67 67 * @param unused is the starting argument of the RTEMS task
68 68 *
69 69 * The INIT task create and run all other RTEMS tasks.
70 70 *
71 71 */
72 72
73 73
74 74 rtems_status_code status;
75 rtems_status_code status_spw;
75 76 rtems_isr_entry old_isr_handler;
76 77
77 78 BOOT_PRINTF("\n\n\n\n\n")
78 79 BOOT_PRINTF("***************************\n")
79 80 BOOT_PRINTF("** START Flight Software **\n")
80 81 BOOT_PRINTF("***************************\n")
81 82 BOOT_PRINTF("\n\n")
82 83
83 84 //send_console_outputs_on_apbuart_port();
84 85 set_apbuart_scaler_reload_register(REGS_ADDR_APBUART, APBUART_SCALER_RELOAD_VALUE);
85 86
86 87 init_parameter_dump();
87 88 init_local_mode_parameters();
88 89 init_housekeeping_parameters();
89 90
90 91 create_names(); // create all names
91
92 create_message_queues();
92 status = create_message_queues(); // create message queues
93 if (status != RTEMS_SUCCESSFUL)
94 {
95 PRINTF1("in INIT *** ERR in create_message_queues, code %d", status)
96 }
93 97
94 98 status = create_all_tasks(); // create all tasks
95 99 if (status != RTEMS_SUCCESSFUL)
96 100 {
97 101 PRINTF1("in INIT *** ERR in create_all_tasks, code %d", status)
98 102 }
99 103
104 // **************************
105 // <SPACEWIRE INITIALIZATION>
106 grspw_timecode_callback = &timecode_irq_handler;
107
108 status_spw = spacewire_open_link(); // (1) open the link
109 if ( status_spw != RTEMS_SUCCESSFUL )
110 {
111 PRINTF1("in INIT *** ERR spacewire_open_link code %d\n", status_spw )
112 }
113
114 if ( status_spw == RTEMS_SUCCESSFUL ) // (2) configure the link
115 {
116 status_spw = spacewire_configure_link( fdSPW );
117 if ( status_spw != RTEMS_SUCCESSFUL )
118 {
119 PRINTF1("in INIT *** ERR spacewire_configure_link code %d\n", status_spw )
120 }
121 }
122
123 if ( status_spw == RTEMS_SUCCESSFUL) // (3) start the link
124 {
125 status_spw = spacewire_start_link( fdSPW );
126 if ( status_spw != RTEMS_SUCCESSFUL )
127 {
128 PRINTF1("in INIT *** ERR spacewire_start_link code %d\n", status_spw )
129 }
130 }
131 // </SPACEWIRE INITIALIZATION>
132 // ***************************
133
100 134 status = start_all_tasks(); // start all tasks
101 135 if (status != RTEMS_SUCCESSFUL)
102 136 {
103 137 PRINTF1("in INIT *** ERR in start_all_tasks, code %d", status)
104 138 }
105 139
140 status = start_recv_send_tasks();
141 if ( status != RTEMS_SUCCESSFUL )
142 {
143 PRINTF1("in INIT *** ERR start_recv_send_tasks code %d\n", status )
144 }
145
106 146 status = stop_current_mode(); // go in STANDBY mode
107 147 if (status != RTEMS_SUCCESSFUL)
108 148 {
109 149 PRINTF1("in INIT *** ERR in stop_current_mode, code %d", status)
110 150 }
111 151
112 grspw_timecode_callback = &timecode_irq_handler;
113
114 spacewire_configure_link();
115
116 152 #ifdef GSA
117 153 // mask IRQ lines
118 154 LEON_Mask_interrupt( IRQ_SM );
119 155 LEON_Mask_interrupt( IRQ_WF );
120 156 // Spectral Matrices simulator
121 157 configure_timer((gptimer_regs_t*) REGS_ADDR_GPTIMER, TIMER_SM_SIMULATOR, CLKDIV_SM_SIMULATOR,
122 158 IRQ_SPARC_SM, spectral_matrices_isr );
123 159 // WaveForms
124 160 configure_timer((gptimer_regs_t*) REGS_ADDR_GPTIMER, TIMER_WF_SIMULATOR, CLKDIV_WF_SIMULATOR,
125 161 IRQ_SPARC_WF, waveforms_simulator_isr );
126 162 #else
127 163 // mask IRQ lines
128 164 LEON_Mask_interrupt( IRQ_WAVEFORM_PICKER );
129 165 LEON_Mask_interrupt( IRQ_SPECTRAL_MATRIX );
130 166 // reset configuration registers
131 167 reset_waveform_picker_regs();
132 168 reset_spectral_matrix_regs();
133 169 // configure IRQ handling for the waveform picker unit
134 170 status = rtems_interrupt_catch( waveforms_isr,
135 171 IRQ_SPARC_WAVEFORM_PICKER,
136 172 &old_isr_handler) ;
137 173 // configure IRQ handling for the spectral matrix unit
138 174 // status = rtems_interrupt_catch( spectral_matrices_isr,
139 175 // IRQ_SPARC_SPECTRAL_MATRIX,
140 176 // &old_isr_handler) ;
141 177 // Spectral Matrices simulator
142 178 configure_timer((gptimer_regs_t*) REGS_ADDR_GPTIMER, TIMER_SM_SIMULATOR, CLKDIV_SM_SIMULATOR,
143 179 IRQ_SPARC_SM, spectral_matrices_isr_simu );
144 180 #endif
145 181
182 if ( status_spw != RTEMS_SUCCESSFUL )
183 {
184 status = rtems_event_send( Task_id[TASKID_SPIQ], SPW_LINKERR_EVENT );
185 if ( status != RTEMS_SUCCESSFUL ) {
186 PRINTF1("in INIT *** ERR rtems_event_send to SPIQ code %d\n", status )
187 }
188 }
189
146 190 BOOT_PRINTF("delete INIT\n")
147 191
148 192 status = rtems_task_delete(RTEMS_SELF);
149 193
150 194 }
151 195
152 void init_parameter_dump( void )
153 {
154 /** This function initialize the parameter_dump_packet global variable with default values.
155 *
156 */
157
158 parameter_dump_packet.targetLogicalAddress = CCSDS_DESTINATION_ID;
159 parameter_dump_packet.protocolIdentifier = CCSDS_PROTOCOLE_ID;
160 parameter_dump_packet.reserved = CCSDS_RESERVED;
161 parameter_dump_packet.userApplication = CCSDS_USER_APP;
162 parameter_dump_packet.packetID[0] = (unsigned char) (TM_PACKET_ID_PARAMETER_DUMP >> 8);
163 parameter_dump_packet.packetID[1] = (unsigned char) TM_PACKET_ID_PARAMETER_DUMP;
164 parameter_dump_packet.packetSequenceControl[0] = TM_PACKET_SEQ_CTRL_STANDALONE;
165 parameter_dump_packet.packetSequenceControl[1] = TM_PACKET_SEQ_CNT_DEFAULT;
166 parameter_dump_packet.packetLength[0] = (unsigned char) (PACKET_LENGTH_PARAMETER_DUMP >> 8);
167 parameter_dump_packet.packetLength[1] = (unsigned char) PACKET_LENGTH_PARAMETER_DUMP;
168 // DATA FIELD HEADER
169 parameter_dump_packet.spare1_pusVersion_spare2 = SPARE1_PUSVERSION_SPARE2;
170 parameter_dump_packet.serviceType = TM_TYPE_PARAMETER_DUMP;
171 parameter_dump_packet.serviceSubType = TM_SUBTYPE_PARAMETER_DUMP;
172 parameter_dump_packet.destinationID = TM_DESTINATION_ID_GROUND;
173 parameter_dump_packet.time[0] = (unsigned char) (time_management_regs->coarse_time>>24);
174 parameter_dump_packet.time[1] = (unsigned char) (time_management_regs->coarse_time>>16);
175 parameter_dump_packet.time[2] = (unsigned char) (time_management_regs->coarse_time>>8);
176 parameter_dump_packet.time[3] = (unsigned char) (time_management_regs->coarse_time);
177 parameter_dump_packet.time[4] = (unsigned char) (time_management_regs->fine_time>>8);
178 parameter_dump_packet.time[5] = (unsigned char) (time_management_regs->fine_time);
179 parameter_dump_packet.sid = SID_PARAMETER_DUMP;
180
181 //******************
182 // COMMON PARAMETERS
183 parameter_dump_packet.unused0 = DEFAULT_SY_LFR_COMMON0;
184 parameter_dump_packet.bw_sp0_sp1_r0_r1 = DEFAULT_SY_LFR_COMMON1;
185
186 //******************
187 // NORMAL PARAMETERS
188 parameter_dump_packet.sy_lfr_n_swf_l[0] = (unsigned char) (DEFAULT_SY_LFR_N_SWF_L >> 8);
189 parameter_dump_packet.sy_lfr_n_swf_l[1] = (unsigned char) (DEFAULT_SY_LFR_N_SWF_L );
190 parameter_dump_packet.sy_lfr_n_swf_p[0] = (unsigned char) (DEFAULT_SY_LFR_N_SWF_P >> 8);
191 parameter_dump_packet.sy_lfr_n_swf_p[1] = (unsigned char) (DEFAULT_SY_LFR_N_SWF_P );
192 parameter_dump_packet.sy_lfr_n_asm_p[0] = (unsigned char) (DEFAULT_SY_LFR_N_ASM_P >> 8);
193 parameter_dump_packet.sy_lfr_n_asm_p[1] = (unsigned char) (DEFAULT_SY_LFR_N_ASM_P );
194 parameter_dump_packet.sy_lfr_n_bp_p0 = (unsigned char) DEFAULT_SY_LFR_N_BP_P0;
195 parameter_dump_packet.sy_lfr_n_bp_p1 = (unsigned char) DEFAULT_SY_LFR_N_BP_P1;
196
197 //*****************
198 // BURST PARAMETERS
199 parameter_dump_packet.sy_lfr_b_bp_p0 = (unsigned char) DEFAULT_SY_LFR_B_BP_P0;
200 parameter_dump_packet.sy_lfr_b_bp_p1 = (unsigned char) DEFAULT_SY_LFR_B_BP_P1;
201
202 //****************
203 // SBM1 PARAMETERS
204 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
205 parameter_dump_packet.sy_lfr_s1_bp_p1 = (unsigned char) DEFAULT_SY_LFR_S1_BP_P1;
206
207 //****************
208 // SBM2 PARAMETERS
209 parameter_dump_packet.sy_lfr_s2_bp_p0 = (unsigned char) DEFAULT_SY_LFR_S2_BP_P0;
210 parameter_dump_packet.sy_lfr_s2_bp_p1 = (unsigned char) DEFAULT_SY_LFR_S2_BP_P1;
211 }
212
213 196 void init_local_mode_parameters( void )
214 197 {
215 198 /** This function initialize the param_local global variable with default values.
216 199 *
217 200 */
218 201
202 unsigned int i;
203 unsigned int j;
204 unsigned int k;
205
219 206 // LOCAL PARAMETERS
220 207 set_local_sbm1_nb_cwf_max();
221 208 set_local_sbm2_nb_cwf_max();
222 209 set_local_nb_interrupt_f0_MAX();
223 210
224 211 BOOT_PRINTF1("local_sbm1_nb_cwf_max %d \n", param_local.local_sbm1_nb_cwf_max)
225 212 BOOT_PRINTF1("local_sbm2_nb_cwf_max %d \n", param_local.local_sbm2_nb_cwf_max)
226 213 BOOT_PRINTF1("nb_interrupt_f0_MAX = %d\n", param_local.local_nb_interrupt_f0_MAX)
227 214
228 215 reset_local_sbm1_nb_cwf_sent();
229 216 reset_local_sbm2_nb_cwf_sent();
230 }
231 217
232 void init_housekeeping_parameters( void )
233 {
234 /** This function initialize the housekeeping_packet global variable with default values.
235 *
236 */
237
238 unsigned int i = 0;
239 unsigned int j = 0;
240 unsigned int k = 0;
241 char *parameters;
242
243 parameters = (char*) &housekeeping_packet.lfr_status_word;
244 for(i = 0; i< SIZE_HK_PARAMETERS; i++)
245 {
246 parameters[i] = 0x00;
247 }
248 // init status word
249 housekeeping_packet.lfr_status_word[0] = 0x00;
250 housekeeping_packet.lfr_status_word[1] = 0x00;
251 // init software version
252 housekeeping_packet.lfr_sw_version[0] = SW_VERSION_N1;
253 housekeeping_packet.lfr_sw_version[1] = SW_VERSION_N2;
254 housekeeping_packet.lfr_sw_version[2] = SW_VERSION_N3;
255 housekeeping_packet.lfr_sw_version[3] = SW_VERSION_N4;
256 218 // init sequence counters
257 219 for (i = 0; i<SEQ_CNT_NB_PID; i++)
258 220 {
259 221 for(j = 0; j<SEQ_CNT_NB_CAT; j++)
260 222 {
261 223 for(k = 0; k<SEQ_CNT_NB_DEST_ID; k++)
262 224 {
263 225 sequenceCounters[i][j][k] = 0x00;
264 226 }
265 227 }
266 228 }
267 updateLFRCurrentMode();
268 229 }
269 230
270 int create_names( void ) // create all names for tasks and queues
231 void create_names( void ) // create all names for tasks and queues
271 232 {
272 233 /** This function creates all RTEMS names used in the software for tasks and queues.
273 234 *
274 235 * @return RTEMS directive status codes:
275 236 * - RTEMS_SUCCESSFUL - successful completion
276 237 *
277 238 */
278 239
279 240 // task names
280 241 Task_name[TASKID_RECV] = rtems_build_name( 'R', 'E', 'C', 'V' );
281 242 Task_name[TASKID_ACTN] = rtems_build_name( 'A', 'C', 'T', 'N' );
282 243 Task_name[TASKID_SPIQ] = rtems_build_name( 'S', 'P', 'I', 'Q' );
283 244 Task_name[TASKID_SMIQ] = rtems_build_name( 'S', 'M', 'I', 'Q' );
284 245 Task_name[TASKID_STAT] = rtems_build_name( 'S', 'T', 'A', 'T' );
285 246 Task_name[TASKID_AVF0] = rtems_build_name( 'A', 'V', 'F', '0' );
286 247 Task_name[TASKID_BPF0] = rtems_build_name( 'B', 'P', 'F', '0' );
287 248 Task_name[TASKID_WFRM] = rtems_build_name( 'W', 'F', 'R', 'M' );
288 249 Task_name[TASKID_DUMB] = rtems_build_name( 'D', 'U', 'M', 'B' );
289 250 Task_name[TASKID_HOUS] = rtems_build_name( 'H', 'O', 'U', 'S' );
290 251 Task_name[TASKID_MATR] = rtems_build_name( 'M', 'A', 'T', 'R' );
291 252 Task_name[TASKID_CWF3] = rtems_build_name( 'C', 'W', 'F', '3' );
292 253 Task_name[TASKID_CWF2] = rtems_build_name( 'C', 'W', 'F', '2' );
293 254 Task_name[TASKID_CWF1] = rtems_build_name( 'C', 'W', 'F', '1' );
294 255 Task_name[TASKID_SEND] = rtems_build_name( 'S', 'E', 'N', 'D' );
295
296 // rate monotonic period name
297 HK_name = rtems_build_name( 'H', 'O', 'U', 'S' );
256 Task_name[TASKID_WTDG] = rtems_build_name( 'W', 'T', 'D', 'G' );
298 257
299 misc_name[QUEUE_RECV] = rtems_build_name( 'Q', 'U', 'E', 'U' );
300 misc_name[QUEUE_SEND] = rtems_build_name( 'P', 'K', 'T', 'S' );
258 // rate monotonic period names
259 name_hk_rate_monotonic = rtems_build_name( 'H', 'O', 'U', 'S' );
301 260
302 return RTEMS_SUCCESSFUL;
261 misc_name[QUEUE_RECV] = rtems_build_name( 'Q', '_', 'R', 'V' );
262 misc_name[QUEUE_SEND] = rtems_build_name( 'Q', '_', 'S', 'D' );
303 263 }
304 264
305 265 int create_all_tasks( void ) // create all tasks which run in the software
306 266 {
307 267 /** This function creates all RTEMS tasks used in the software.
308 268 *
309 269 * @return RTEMS directive status codes:
310 270 * - RTEMS_SUCCESSFUL - task created successfully
311 271 * - RTEMS_INVALID_ADDRESS - id is NULL
312 272 * - RTEMS_INVALID_NAME - invalid task name
313 273 * - RTEMS_INVALID_PRIORITY - invalid task priority
314 274 * - RTEMS_MP_NOT_CONFIGURED - multiprocessing not configured
315 275 * - RTEMS_TOO_MANY - too many tasks created
316 276 * - RTEMS_UNSATISFIED - not enough memory for stack/FP context
317 277 * - RTEMS_TOO_MANY - too many global objects
318 278 *
319 279 */
320 280
321 281 rtems_status_code status;
322 282
323 283 // RECV
324 284 status = rtems_task_create(
325 285 Task_name[TASKID_RECV], TASK_PRIORITY_RECV, RTEMS_MINIMUM_STACK_SIZE,
326 286 RTEMS_DEFAULT_MODES,
327 287 RTEMS_DEFAULT_ATTRIBUTES, &Task_id[TASKID_RECV]
328 288 );
329 289
330 290 if (status == RTEMS_SUCCESSFUL) // ACTN
331 291 {
332 292 status = rtems_task_create(
333 293 Task_name[TASKID_ACTN], TASK_PRIORITY_ACTN, RTEMS_MINIMUM_STACK_SIZE,
334 294 RTEMS_DEFAULT_MODES,
335 295 RTEMS_DEFAULT_ATTRIBUTES | RTEMS_FLOATING_POINT, &Task_id[TASKID_ACTN]
336 296 );
337 297 }
338 298 if (status == RTEMS_SUCCESSFUL) // SPIQ
339 299 {
340 300 status = rtems_task_create(
341 301 Task_name[TASKID_SPIQ], TASK_PRIORITY_SPIQ, RTEMS_MINIMUM_STACK_SIZE,
342 302 RTEMS_DEFAULT_MODES | RTEMS_NO_PREEMPT,
343 303 RTEMS_DEFAULT_ATTRIBUTES, &Task_id[TASKID_SPIQ]
344 304 );
345 305 }
346 306 if (status == RTEMS_SUCCESSFUL) // SMIQ
347 307 {
348 308 status = rtems_task_create(
349 309 Task_name[TASKID_SMIQ], TASK_PRIORITY_SMIQ, RTEMS_MINIMUM_STACK_SIZE,
350 310 RTEMS_DEFAULT_MODES | RTEMS_NO_PREEMPT,
351 311 RTEMS_DEFAULT_ATTRIBUTES, &Task_id[TASKID_SMIQ]
352 312 );
353 313 }
354 314 if (status == RTEMS_SUCCESSFUL) // STAT
355 315 {
356 316 status = rtems_task_create(
357 317 Task_name[TASKID_STAT], TASK_PRIORITY_STAT, RTEMS_MINIMUM_STACK_SIZE,
358 318 RTEMS_DEFAULT_MODES,
359 319 RTEMS_DEFAULT_ATTRIBUTES, &Task_id[TASKID_STAT]
360 320 );
361 321 }
362 322 if (status == RTEMS_SUCCESSFUL) // AVF0
363 323 {
364 324 status = rtems_task_create(
365 325 Task_name[TASKID_AVF0], TASK_PRIORITY_AVF0, RTEMS_MINIMUM_STACK_SIZE,
366 326 RTEMS_DEFAULT_MODES | RTEMS_NO_PREEMPT,
367 327 RTEMS_DEFAULT_ATTRIBUTES | RTEMS_FLOATING_POINT, &Task_id[TASKID_AVF0]
368 328 );
369 329 }
370 330 if (status == RTEMS_SUCCESSFUL) // BPF0
371 331 {
372 332 status = rtems_task_create(
373 333 Task_name[TASKID_BPF0], TASK_PRIORITY_BPF0, RTEMS_MINIMUM_STACK_SIZE,
374 334 RTEMS_DEFAULT_MODES,
375 335 RTEMS_DEFAULT_ATTRIBUTES | RTEMS_FLOATING_POINT, &Task_id[TASKID_BPF0]
376 336 );
377 337 }
378 338 if (status == RTEMS_SUCCESSFUL) // WFRM
379 339 {
380 340 status = rtems_task_create(
381 341 Task_name[TASKID_WFRM], TASK_PRIORITY_WFRM, RTEMS_MINIMUM_STACK_SIZE,
382 342 RTEMS_DEFAULT_MODES,
383 343 RTEMS_DEFAULT_ATTRIBUTES | RTEMS_FLOATING_POINT, &Task_id[TASKID_WFRM]
384 344 );
385 345 }
386 346 if (status == RTEMS_SUCCESSFUL) // DUMB
387 347 {
388 348 status = rtems_task_create(
389 349 Task_name[TASKID_DUMB], TASK_PRIORITY_DUMB, RTEMS_MINIMUM_STACK_SIZE,
390 350 RTEMS_DEFAULT_MODES,
391 351 RTEMS_DEFAULT_ATTRIBUTES, &Task_id[TASKID_DUMB]
392 352 );
393 353 }
394 354 if (status == RTEMS_SUCCESSFUL) // HOUS
395 355 {
396 356 status = rtems_task_create(
397 357 Task_name[TASKID_HOUS], TASK_PRIORITY_HOUS, RTEMS_MINIMUM_STACK_SIZE,
398 358 RTEMS_DEFAULT_MODES,
399 359 RTEMS_DEFAULT_ATTRIBUTES, &Task_id[TASKID_HOUS]
400 360 );
401 361 }
402 362 if (status == RTEMS_SUCCESSFUL) // MATR
403 363 {
404 364 status = rtems_task_create(
405 365 Task_name[TASKID_MATR], TASK_PRIORITY_MATR, RTEMS_MINIMUM_STACK_SIZE,
406 366 RTEMS_DEFAULT_MODES,
407 367 RTEMS_DEFAULT_ATTRIBUTES | RTEMS_FLOATING_POINT, &Task_id[TASKID_MATR]
408 368 );
409 369 }
410 370 if (status == RTEMS_SUCCESSFUL) // CWF3
411 371 {
412 372 status = rtems_task_create(
413 373 Task_name[TASKID_CWF3], TASK_PRIORITY_CWF3, RTEMS_MINIMUM_STACK_SIZE,
414 374 RTEMS_DEFAULT_MODES,
415 375 RTEMS_DEFAULT_ATTRIBUTES, &Task_id[TASKID_CWF3]
416 376 );
417 377 }
418 378 if (status == RTEMS_SUCCESSFUL) // CWF2
419 379 {
420 380 status = rtems_task_create(
421 381 Task_name[TASKID_CWF2], TASK_PRIORITY_CWF2, RTEMS_MINIMUM_STACK_SIZE,
422 382 RTEMS_DEFAULT_MODES,
423 383 RTEMS_DEFAULT_ATTRIBUTES, &Task_id[TASKID_CWF2]
424 384 );
425 385 }
426 386 if (status == RTEMS_SUCCESSFUL) // CWF1
427 387 {
428 388 status = rtems_task_create(
429 389 Task_name[TASKID_CWF1], TASK_PRIORITY_CWF1, RTEMS_MINIMUM_STACK_SIZE,
430 390 RTEMS_DEFAULT_MODES,
431 391 RTEMS_DEFAULT_ATTRIBUTES, &Task_id[TASKID_CWF1]
432 392 );
433 393 }
434 394 if (status == RTEMS_SUCCESSFUL) // SEND
435 395 {
436 396 status = rtems_task_create(
437 397 Task_name[TASKID_SEND], TASK_PRIORITY_SEND, RTEMS_MINIMUM_STACK_SIZE,
438 398 RTEMS_DEFAULT_MODES | RTEMS_NO_PREEMPT,
439 399 RTEMS_DEFAULT_ATTRIBUTES, &Task_id[TASKID_SEND]
440 400 );
441 401 }
402 if (status == RTEMS_SUCCESSFUL) // WTDG
403 {
404 status = rtems_task_create(
405 Task_name[TASKID_WTDG], TASK_PRIORITY_WTDG, RTEMS_MINIMUM_STACK_SIZE,
406 RTEMS_DEFAULT_MODES,
407 RTEMS_DEFAULT_ATTRIBUTES, &Task_id[TASKID_WTDG]
408 );
409 }
442 410
443 411 return status;
444 412 }
445 413
446 int start_all_tasks( void )
414 int start_recv_send_tasks( void )
415 {
416 rtems_status_code status;
417
418 status = rtems_task_start( Task_id[TASKID_RECV], recv_task, 1 );
419 if (status!=RTEMS_SUCCESSFUL) {
420 BOOT_PRINTF("in INIT *** Error starting TASK_RECV\n")
421 }
422
423 if (status == RTEMS_SUCCESSFUL) // SEND
424 {
425 status = rtems_task_start( Task_id[TASKID_SEND], send_task, 1 );
426 if (status!=RTEMS_SUCCESSFUL) {
427 BOOT_PRINTF("in INIT *** Error starting TASK_SEND\n")
428 }
429 }
430
431 return status;
432 }
433
434 int start_all_tasks( void ) // start all tasks except SEND RECV and HOUS
447 435 {
448 436 /** This function starts all RTEMS tasks used in the software.
449 437 *
450 438 * @return RTEMS directive status codes:
451 439 * - RTEMS_SUCCESSFUL - ask started successfully
452 440 * - RTEMS_INVALID_ADDRESS - invalid task entry point
453 441 * - RTEMS_INVALID_ID - invalid task id
454 442 * - RTEMS_INCORRECT_STATE - task not in the dormant state
455 443 * - RTEMS_ILLEGAL_ON_REMOTE_OBJECT - cannot start remote task
456 444 *
457 445 */
458 446 // starts all the tasks fot eh flight software
459 447
460 448 rtems_status_code status;
461 449
462 450 status = rtems_task_start( Task_id[TASKID_SPIQ], spiq_task, 1 );
463 451 if (status!=RTEMS_SUCCESSFUL) {
464 452 BOOT_PRINTF("in INIT *** Error starting TASK_SPIQ\n")
465 453 }
466 454
455 if (status == RTEMS_SUCCESSFUL) // WTDG
456 {
457 status = rtems_task_start( Task_id[TASKID_WTDG], wtdg_task, 1 );
458 if (status!=RTEMS_SUCCESSFUL) {
459 BOOT_PRINTF("in INIT *** Error starting TASK_WTDG\n")
460 }
461 }
462
467 463 if (status == RTEMS_SUCCESSFUL) // SMIQ
468 464 {
469 465 status = rtems_task_start( Task_id[TASKID_SMIQ], smiq_task, 1 );
470 466 if (status!=RTEMS_SUCCESSFUL) {
471 467 BOOT_PRINTF("in INIT *** Error starting TASK_BPPR\n")
472 468 }
473 469 }
474 470
475 if (status == RTEMS_SUCCESSFUL) // RECV
476 {
477 status = rtems_task_start( Task_id[TASKID_RECV], recv_task, 1 );
478 if (status!=RTEMS_SUCCESSFUL) {
479 BOOT_PRINTF("in INIT *** Error starting TASK_RECV\n")
480 }
481 }
482
483 if (status == RTEMS_SUCCESSFUL) // SEND
484 {
485 status = rtems_task_start( Task_id[TASKID_SEND], send_task, 1 );
486 if (status!=RTEMS_SUCCESSFUL) {
487 BOOT_PRINTF("in INIT *** Error starting TASK_SEND\n")
488 }
489 }
490
491 471 if (status == RTEMS_SUCCESSFUL) // ACTN
492 472 {
493 473 status = rtems_task_start( Task_id[TASKID_ACTN], actn_task, 1 );
494 474 if (status!=RTEMS_SUCCESSFUL) {
495 475 BOOT_PRINTF("in INIT *** Error starting TASK_ACTN\n")
496 476 }
497 477 }
498 478
499 479 if (status == RTEMS_SUCCESSFUL) // STAT
500 480 {
501 481 status = rtems_task_start( Task_id[TASKID_STAT], stat_task, 1 );
502 482 if (status!=RTEMS_SUCCESSFUL) {
503 483 BOOT_PRINTF("in INIT *** Error starting TASK_STAT\n")
504 484 }
505 485 }
506 486
507 487 if (status == RTEMS_SUCCESSFUL) // AVF0
508 488 {
509 489 status = rtems_task_start( Task_id[TASKID_AVF0], avf0_task, 1 );
510 490 if (status!=RTEMS_SUCCESSFUL) {
511 491 BOOT_PRINTF("in INIT *** Error starting TASK_AVF0\n")
512 492 }
513 493 }
514 494
515 495 if (status == RTEMS_SUCCESSFUL) // BPF0
516 496 {
517 497 status = rtems_task_start( Task_id[TASKID_BPF0], bpf0_task, 1 );
518 498 if (status!=RTEMS_SUCCESSFUL) {
519 499 BOOT_PRINTF("in INIT *** Error starting TASK_BPF0\n")
520 500 }
521 501 }
522 502
523 503 if (status == RTEMS_SUCCESSFUL) // WFRM
524 504 {
525 505 status = rtems_task_start( Task_id[TASKID_WFRM], wfrm_task, 1 );
526 506 if (status!=RTEMS_SUCCESSFUL) {
527 507 BOOT_PRINTF("in INIT *** Error starting TASK_WFRM\n")
528 508 }
529 509 }
530 510
531 511 if (status == RTEMS_SUCCESSFUL) // DUMB
532 512 {
533 513 status = rtems_task_start( Task_id[TASKID_DUMB], dumb_task, 1 );
534 514 if (status!=RTEMS_SUCCESSFUL) {
535 515 BOOT_PRINTF("in INIT *** Error starting TASK_DUMB\n")
536 516 }
537 517 }
538 518
539 519 if (status == RTEMS_SUCCESSFUL) // HOUS
540 520 {
541 521 status = rtems_task_start( Task_id[TASKID_HOUS], hous_task, 1 );
542 522 if (status!=RTEMS_SUCCESSFUL) {
543 523 BOOT_PRINTF("in INIT *** Error starting TASK_HOUS\n")
544 524 }
545 525 }
546 526
547 527 if (status == RTEMS_SUCCESSFUL) // MATR
548 528 {
549 529 status = rtems_task_start( Task_id[TASKID_MATR], matr_task, 1 );
550 530 if (status!=RTEMS_SUCCESSFUL) {
551 531 BOOT_PRINTF("in INIT *** Error starting TASK_MATR\n")
552 532 }
553 533 }
554 534
555 535 if (status == RTEMS_SUCCESSFUL) // CWF3
556 536 {
557 537 status = rtems_task_start( Task_id[TASKID_CWF3], cwf3_task, 1 );
558 538 if (status!=RTEMS_SUCCESSFUL) {
559 539 BOOT_PRINTF("in INIT *** Error starting TASK_CWF3\n")
560 540 }
561 541 }
562 542
563 543 if (status == RTEMS_SUCCESSFUL) // CWF2
564 544 {
565 545 status = rtems_task_start( Task_id[TASKID_CWF2], cwf2_task, 1 );
566 546 if (status!=RTEMS_SUCCESSFUL) {
567 547 BOOT_PRINTF("in INIT *** Error starting TASK_CWF2\n")
568 548 }
569 549 }
570 550
571 551 if (status == RTEMS_SUCCESSFUL) // CWF1
572 552 {
573 553 status = rtems_task_start( Task_id[TASKID_CWF1], cwf1_task, 1 );
574 554 if (status!=RTEMS_SUCCESSFUL) {
575 555 BOOT_PRINTF("in INIT *** Error starting TASK_CWF1\n")
576 556 }
577 557 }
578
579 558 return status;
580 559 }
581 560
582 561 rtems_status_code create_message_queues( void ) // create the two message queues used in the software
583 562 {
584 rtems_status_code status;
563 rtems_status_code status_recv;
564 rtems_status_code status_send;
585 565 rtems_status_code ret;
586 566 rtems_id queue_id;
587 567
588 568 // create the queue for handling valid TCs
589 status = rtems_message_queue_create( misc_name[QUEUE_RECV], ACTION_MSG_QUEUE_COUNT, CCSDS_TC_PKT_MAX_SIZE,
569 status_recv = rtems_message_queue_create( misc_name[QUEUE_RECV],
570 ACTION_MSG_QUEUE_COUNT, CCSDS_TC_PKT_MAX_SIZE,
590 571 RTEMS_FIFO | RTEMS_LOCAL, &queue_id );
591 if (status != RTEMS_SUCCESSFUL) {
592 ret = status;
593 BOOT_PRINTF1("in create_message_queues *** ERR creating QUEU queue, %d\n", ret)
572 if ( status_recv != RTEMS_SUCCESSFUL ) {
573 PRINTF1("in create_message_queues *** ERR creating QUEU queue, %d\n", status_recv)
594 574 }
595 575
596 576 // create the queue for handling TM packet sending
597 ret = rtems_message_queue_create( misc_name[QUEUE_SEND], ACTION_MSG_PKTS_COUNT,
598 ACTION_MSG_PKTS_MAX_SIZE,
577 status_send = rtems_message_queue_create( misc_name[QUEUE_SEND],
578 ACTION_MSG_PKTS_COUNT, ACTION_MSG_PKTS_MAX_SIZE,
599 579 RTEMS_FIFO | RTEMS_LOCAL, &queue_id );
600 if (ret != RTEMS_SUCCESSFUL) {
601 BOOT_PRINTF1("in create_message_queues *** ERR creating PKTS queue, %d\n", ret)
580 if ( status_send != RTEMS_SUCCESSFUL ) {
581 PRINTF1("in create_message_queues *** ERR creating PKTS queue, %d\n", status_send)
582 }
583
584 if ( status_recv != RTEMS_SUCCESSFUL )
585 {
586 ret = status_recv;
587 }
588 else
589 {
590 ret = status_send;
602 591 }
603 592
604 593 return ret;
605 594 }
595
@@ -1,274 +1,293
1 1 /** General usage functions and RTEMS tasks.
2 2 *
3 3 * @file
4 4 * @author P. LEROY
5 5 *
6 6 */
7 7
8 8 #include "fsw_misc.h"
9 9
10 10 char *DumbMessages[6] = {"in DUMB *** default", // RTEMS_EVENT_0
11 11 "in DUMB *** timecode_irq_handler", // RTEMS_EVENT_1
12 12 "in DUMB *** waveforms_isr", // RTEMS_EVENT_2
13 13 "in DUMB *** in SMIQ *** Error sending event to AVF0", // RTEMS_EVENT_3
14 14 "in DUMB *** spectral_matrices_isr *** Error sending event to SMIQ", // RTEMS_EVENT_4
15 15 "in DUMB *** waveforms_simulator_isr" // RTEMS_EVENT_5
16 16 };
17 17
18 18 int configure_timer(gptimer_regs_t *gptimer_regs, unsigned char timer, unsigned int clock_divider,
19 19 unsigned char interrupt_level, rtems_isr (*timer_isr)() )
20 20 {
21 21 /** This function configures a GPTIMER timer instantiated in the VHDL design.
22 22 *
23 23 * @param gptimer_regs points to the APB registers of the GPTIMER IP core.
24 24 * @param timer is the number of the timer in the IP core (several timers can be instantiated).
25 25 * @param clock_divider is the divider of the 1 MHz clock that will be configured.
26 26 * @param interrupt_level is the interrupt level that the timer drives.
27 27 * @param timer_isr is the interrupt subroutine that will be attached to the IRQ driven by the timer.
28 28 *
29 29 * @return
30 30 *
31 31 * Interrupt levels are described in the SPARC documentation sparcv8.pdf p.76
32 32 *
33 33 */
34 34
35 35 rtems_status_code status;
36 36 rtems_isr_entry old_isr_handler;
37 37
38 38 status = rtems_interrupt_catch( timer_isr, interrupt_level, &old_isr_handler) ; // see sparcv8.pdf p.76 for interrupt levels
39 39 if (status!=RTEMS_SUCCESSFUL)
40 40 {
41 41 PRINTF("in configure_timer *** ERR rtems_interrupt_catch\n")
42 42 }
43 43
44 44 timer_set_clock_divider( gptimer_regs, timer, clock_divider);
45 45
46 46 return 1;
47 47 }
48 48
49 49 int timer_start(gptimer_regs_t *gptimer_regs, unsigned char timer)
50 50 {
51 51 /** This function starts a GPTIMER timer.
52 52 *
53 53 * @param gptimer_regs points to the APB registers of the GPTIMER IP core.
54 54 * @param timer is the number of the timer in the IP core (several timers can be instantiated).
55 55 *
56 56 * @return 1
57 57 *
58 58 */
59 59
60 60 gptimer_regs->timer[timer].ctrl = gptimer_regs->timer[timer].ctrl | 0x00000010; // clear pending IRQ if any
61 61 gptimer_regs->timer[timer].ctrl = gptimer_regs->timer[timer].ctrl | 0x00000004; // LD load value from the reload register
62 62 gptimer_regs->timer[timer].ctrl = gptimer_regs->timer[timer].ctrl | 0x00000001; // EN enable the timer
63 63 gptimer_regs->timer[timer].ctrl = gptimer_regs->timer[timer].ctrl | 0x00000002; // RS restart
64 64 gptimer_regs->timer[timer].ctrl = gptimer_regs->timer[timer].ctrl | 0x00000008; // IE interrupt enable
65 65
66 66 return 1;
67 67 }
68 68
69 69 int timer_stop(gptimer_regs_t *gptimer_regs, unsigned char timer)
70 70 {
71 71 /** This function stops a GPTIMER timer.
72 72 *
73 73 * @param gptimer_regs points to the APB registers of the GPTIMER IP core.
74 74 * @param timer is the number of the timer in the IP core (several timers can be instantiated).
75 75 *
76 76 * @return 1
77 77 *
78 78 */
79 79
80 80 gptimer_regs->timer[timer].ctrl = gptimer_regs->timer[timer].ctrl & 0xfffffffe; // EN enable the timer
81 81 gptimer_regs->timer[timer].ctrl = gptimer_regs->timer[timer].ctrl & 0xffffffef; // IE interrupt enable
82 82 gptimer_regs->timer[timer].ctrl = gptimer_regs->timer[timer].ctrl | 0x00000010; // clear pending IRQ if any
83 83
84 84 return 1;
85 85 }
86 86
87 87 int timer_set_clock_divider(gptimer_regs_t *gptimer_regs, unsigned char timer, unsigned int clock_divider)
88 88 {
89 89 /** This function sets the clock divider of a GPTIMER timer.
90 90 *
91 91 * @param gptimer_regs points to the APB registers of the GPTIMER IP core.
92 92 * @param timer is the number of the timer in the IP core (several timers can be instantiated).
93 93 * @param clock_divider is the divider of the 1 MHz clock that will be configured.
94 94 *
95 95 * @return 1
96 96 *
97 97 */
98 98
99 99 gptimer_regs->timer[timer].reload = clock_divider; // base clock frequency is 1 MHz
100 100
101 101 return 1;
102 102 }
103 103
104 104 int send_console_outputs_on_apbuart_port( void ) // Send the console outputs on the apbuart port
105 105 {
106 106 struct apbuart_regs_str *apbuart_regs = (struct apbuart_regs_str *) REGS_ADDR_APBUART;
107 107
108 108 apbuart_regs->ctrl = apbuart_regs->ctrl & APBUART_CTRL_REG_MASK_DB;
109 109 PRINTF("\n\n\n\n\nIn INIT *** Now the console is on port COM1\n")
110 110
111 111 return 0;
112 112 }
113 113
114 114 void set_apbuart_scaler_reload_register(unsigned int regs, unsigned int value)
115 115 {
116 116 /** This function sets the scaler reload register of the apbuart module
117 117 *
118 118 * @param regs is the address of the apbuart registers in memory
119 119 * @param value is the value that will be stored in the scaler register
120 120 *
121 121 * The value shall be set by the software to get data on the serial interface.
122 122 *
123 123 */
124 124
125 125 struct apbuart_regs_str *apbuart_regs = (struct apbuart_regs_str *) regs;
126 126
127 127 apbuart_regs->scaler = value;
128 128 BOOT_PRINTF1("OK *** apbuart port scaler reload register set to 0x%x\n", value)
129 129 }
130 130
131 131 //************
132 132 // RTEMS TASKS
133 133
134 134 rtems_task stat_task(rtems_task_argument argument)
135 135 {
136 136 int i;
137 137 int j;
138 138 i = 0;
139 139 j = 0;
140 140 BOOT_PRINTF("in STAT *** \n")
141 141 while(1){
142 142 rtems_task_wake_after(1000);
143 143 PRINTF1("%d\n", j)
144 144 if (i == CPU_USAGE_REPORT_PERIOD) {
145 145 // #ifdef PRINT_TASK_STATISTICS
146 146 // rtems_cpu_usage_report();
147 147 // rtems_cpu_usage_reset();
148 148 // #endif
149 149 i = 0;
150 150 }
151 151 else i++;
152 152 j++;
153 153 }
154 154 }
155 155
156 156 rtems_task hous_task(rtems_task_argument argument)
157 157 {
158 158 rtems_status_code status;
159 spw_ioctl_pkt_send spw_ioctl_send;
160 159 rtems_id queue_id;
161 160
162 spw_ioctl_send.hlen = 0;
163 spw_ioctl_send.hdr = NULL;
164 spw_ioctl_send.dlen = PACKET_LENGTH_HK + CCSDS_TC_TM_PACKET_OFFSET + CCSDS_PROTOCOLE_EXTRA_BYTES;
165 spw_ioctl_send.data = (char*) &housekeeping_packet;
166 spw_ioctl_send.options = 0;
167
168 161 status = rtems_message_queue_ident( misc_name[QUEUE_SEND], 0, &queue_id );
169 162 if (status != RTEMS_SUCCESSFUL)
170 163 {
171 164 PRINTF1("in HOUS *** ERR %d\n", status)
172 165 }
173 166
174 167 BOOT_PRINTF("in HOUS ***\n")
175 168
176 if (rtems_rate_monotonic_ident( HK_name, &HK_id) != RTEMS_SUCCESSFUL) {
177 status = rtems_rate_monotonic_create( HK_name, &HK_id );
169 if (rtems_rate_monotonic_ident( name_hk_rate_monotonic, &HK_id) != RTEMS_SUCCESSFUL) {
170 status = rtems_rate_monotonic_create( name_hk_rate_monotonic, &HK_id );
178 171 if( status != RTEMS_SUCCESSFUL ) {
179 172 PRINTF1( "rtems_rate_monotonic_create failed with status of %d\n", status )
180 173 }
181 174 }
182 175
183 176 housekeeping_packet.targetLogicalAddress = CCSDS_DESTINATION_ID;
184 177 housekeeping_packet.protocolIdentifier = CCSDS_PROTOCOLE_ID;
185 178 housekeeping_packet.reserved = DEFAULT_RESERVED;
186 179 housekeeping_packet.userApplication = CCSDS_USER_APP;
187 180 housekeeping_packet.packetID[0] = (unsigned char) (TM_PACKET_ID_HK >> 8);
188 181 housekeeping_packet.packetID[1] = (unsigned char) (TM_PACKET_ID_HK);
189 182 housekeeping_packet.packetSequenceControl[0] = TM_PACKET_SEQ_CTRL_STANDALONE;
190 183 housekeeping_packet.packetSequenceControl[1] = TM_PACKET_SEQ_CNT_DEFAULT;
191 184 housekeeping_packet.packetLength[0] = (unsigned char) (PACKET_LENGTH_HK >> 8);
192 185 housekeeping_packet.packetLength[1] = (unsigned char) (PACKET_LENGTH_HK );
193 186 housekeeping_packet.spare1_pusVersion_spare2 = DEFAULT_SPARE1_PUSVERSION_SPARE2;
194 187 housekeeping_packet.serviceType = TM_TYPE_HK;
195 188 housekeeping_packet.serviceSubType = TM_SUBTYPE_HK;
196 189 housekeeping_packet.destinationID = TM_DESTINATION_ID_GROUND;
197 190
198 191 status = rtems_rate_monotonic_cancel(HK_id);
199 192 if( status != RTEMS_SUCCESSFUL ) {
200 193 PRINTF1( "ERR *** in HOUS *** rtems_rate_monotonic_cancel(HK_id) ***code: %d\n", status )
201 194 }
202 195 else {
203 196 DEBUG_PRINTF("OK *** in HOUS *** rtems_rate_monotonic_cancel(HK_id)\n")
204 197 }
205 198
206 199 while(1){ // launch the rate monotonic task
207 200 status = rtems_rate_monotonic_period( HK_id, HK_PERIOD );
208 201 if ( status != RTEMS_SUCCESSFUL ) {
209 202 PRINTF1( "ERR *** in HOUS *** rtems_rate_monotonic_period *** code %d\n", status);
210 203 }
211 204 else {
212 205 housekeeping_packet.time[0] = (unsigned char) (time_management_regs->coarse_time>>24);
213 206 housekeeping_packet.time[1] = (unsigned char) (time_management_regs->coarse_time>>16);
214 207 housekeeping_packet.time[2] = (unsigned char) (time_management_regs->coarse_time>>8);
215 208 housekeeping_packet.time[3] = (unsigned char) (time_management_regs->coarse_time);
216 209 housekeeping_packet.time[4] = (unsigned char) (time_management_regs->fine_time>>8);
217 210 housekeeping_packet.time[5] = (unsigned char) (time_management_regs->fine_time);
218 211 housekeeping_packet.sid = SID_HK;
219 212
220 213 spacewire_update_statistics();
221 214
222 215 // SEND PACKET
223 status = rtems_message_queue_send( queue_id, &spw_ioctl_send, ACTION_MSG_SPW_IOCTL_SEND_SIZE);
216 status = rtems_message_queue_send( queue_id, &housekeeping_packet,
217 PACKET_LENGTH_HK + CCSDS_TC_TM_PACKET_OFFSET + CCSDS_PROTOCOLE_EXTRA_BYTES);
224 218 if (status != RTEMS_SUCCESSFUL) {
225 219 PRINTF1("in HOUS *** ERR %d\n", status)
226 220 }
227 221 }
228 222 }
229 223
230 224 PRINTF("in HOUS *** deleting task\n")
231 225
232 226 status = rtems_task_delete( RTEMS_SELF ); // should not return
233 227 printf( "rtems_task_delete returned with status of %d.\n", status );
234 228 return;
235 229 }
236 230
237 231 rtems_task dumb_task( rtems_task_argument unused )
238 232 {
239 233 /** This RTEMS taks is used to print messages without affecting the general behaviour of the software.
240 234 *
241 235 * @param unused is the starting argument of the RTEMS task
242 236 *
243 237 * The DUMB taks waits for RTEMS events and print messages depending on the incoming events.
244 238 *
245 239 */
246 240
247 241 unsigned int i;
248 242 unsigned int intEventOut;
249 243 unsigned int coarse_time = 0;
250 244 unsigned int fine_time = 0;
251 245 rtems_event_set event_out;
252 246
253 247 BOOT_PRINTF("in DUMB *** \n")
254 248
255 249 while(1){
256 250 rtems_event_receive(RTEMS_EVENT_0 | RTEMS_EVENT_1 | RTEMS_EVENT_2 | RTEMS_EVENT_3 | RTEMS_EVENT_4 | RTEMS_EVENT_5,
257 251 RTEMS_WAIT | RTEMS_EVENT_ANY, RTEMS_NO_TIMEOUT, &event_out); // wait for an RTEMS_EVENT
258 252 intEventOut = (unsigned int) event_out;
259 253 for ( i=0; i<32; i++)
260 254 {
261 255 if ( ((intEventOut >> i) & 0x0001) != 0)
262 256 {
263 257 coarse_time = time_management_regs->coarse_time;
264 258 fine_time = time_management_regs->fine_time;
265 259 printf("in DUMB *** time = coarse: %x, fine: %x, %s\n", coarse_time, fine_time, DumbMessages[i]);
266 260 }
267 261 }
268 262 }
269 263 }
270 264
265 //*****************************
266 // init housekeeping parameters
271 267
268 void init_housekeeping_parameters( void )
269 {
270 /** This function initialize the housekeeping_packet global variable with default values.
271 *
272 */
273
274 unsigned int i = 0;
275 char *parameters;
272 276
277 parameters = (char*) &housekeeping_packet.lfr_status_word;
278 for(i = 0; i< SIZE_HK_PARAMETERS; i++)
279 {
280 parameters[i] = 0x00;
281 }
282 // init status word
283 housekeeping_packet.lfr_status_word[0] = DEFAULT_STATUS_WORD_BYTE0;
284 housekeeping_packet.lfr_status_word[1] = DEFAULT_STATUS_WORD_BYTE1;
285 // init software version
286 housekeeping_packet.lfr_sw_version[0] = SW_VERSION_N1;
287 housekeeping_packet.lfr_sw_version[1] = SW_VERSION_N2;
288 housekeeping_packet.lfr_sw_version[2] = SW_VERSION_N3;
289 housekeeping_packet.lfr_sw_version[3] = SW_VERSION_N4;
273 290
291 updateLFRCurrentMode();
292 }
274 293
@@ -1,486 +1,580
1 1 /** Functions related to the SpaceWire interface.
2 2 *
3 3 * @file
4 4 * @author P. LEROY
5 5 *
6 6 * A group of functions to handle SpaceWire transmissions:
7 7 * - configuration of the SpaceWire link
8 8 * - SpaceWire related interruption requests processing
9 9 * - transmission of TeleMetry packets by a dedicated RTEMS task
10 10 * - reception of TeleCommands by a dedicated RTEMS task
11 11 *
12 12 */
13 13
14 14 #include "fsw_spacewire.h"
15 15
16 16 char *lstates[6] = {"Error-reset",
17 17 "Error-wait",
18 18 "Ready",
19 19 "Started",
20 20 "Connecting",
21 21 "Run"
22 22 };
23 23
24 24 //***********
25 25 // RTEMS TASK
26 26 rtems_task spiq_task(rtems_task_argument unused)
27 27 {
28 /** This RTEMS task is dedicated to the handling of interruption requests raised by the SpaceWire driver.
28 /** This RTEMS task is awaken by an rtems_event sent by the interruption subroutine of the SpaceWire driver.
29 29 *
30 30 * @param unused is the starting argument of the RTEMS task
31 31 *
32 32 */
33 33
34 34 rtems_event_set event_out;
35 35 rtems_status_code status;
36 unsigned char lfrMode;
36 int linkStatus;
37
38 BOOT_PRINTF("in SPIQ *** \n")
37 39
38 40 while(true){
39 BOOT_PRINTF("in SPIQ *** Waiting for SPW_LINKERR_EVENT\n")
40 41 rtems_event_receive(SPW_LINKERR_EVENT, RTEMS_WAIT, RTEMS_NO_TIMEOUT, &event_out); // wait for an SPW_LINKERR_EVENT
41 42
42 lfrMode = (housekeeping_packet.lfr_status_word[0] & 0xf0) >> 4; // get the current mode
43 // CHECK THE LINK
44 ioctl(fdSPW, SPACEWIRE_IOCTRL_GET_LINK_STATUS, &linkStatus); // get the link status (1)
45 if ( linkStatus != 5) {
46 rtems_task_suspend( Task_id[ TASKID_RECV ] );
47 rtems_task_suspend( Task_id[ TASKID_SEND ] );
48 PRINTF1("in SPIQ *** linkStatus %d, wait...\n", linkStatus)
49 rtems_task_wake_after( SY_LFR_DPU_CONNECT_TIMEOUT ); // wait SY_LFR_DPU_CONNECT_TIMEOUT 1000 ms
50 }
43 51
44 status = spacewire_wait_for_link();
45
52 // RECHECK THE LINK AFTER SY_LFR_DPU_CONNECT_TIMEOUT
53 ioctl(fdSPW, SPACEWIRE_IOCTRL_GET_LINK_STATUS, &linkStatus); // get the link status (2)
54 if ( linkStatus != 5 ) // not in run state, reset the link
55 {
56 spacewire_compute_stats_offsets();
57 status = spacewire_reset_link( );
58 }
59 else
60 { // in run state, restart the link
61 status = spacewire_start_link( fdSPW ); // restart the link
46 62 if (status != RTEMS_SUCCESSFUL)
47 63 {
48 //****************
49 // STOP THE SYSTEM
50 spacewire_compute_stats_offsets();
51 stop_current_mode();
52 if (rtems_task_suspend(Task_id[TASKID_RECV])!=RTEMS_SUCCESSFUL) { // suspend RECV task
53 PRINTF("in SPIQ *** Error suspending RECV Task\n")
64 PRINTF1("in SPIQ *** ERR spacewire_start_link %d\n", status)
54 65 }
55 if (rtems_task_suspend(Task_id[TASKID_HOUS])!=RTEMS_SUCCESSFUL) { // suspend HOUS task
56 PRINTF("in SPIQ *** Error suspending HOUS Task\n")
57 66 }
58 67
59 //***************************
60 // RESTART THE SPACEWIRE LINK
61 spacewire_configure_link();
62
63 //*******************
64 // RESTART THE SYSTEM
65 //ioctl(fdSPW, SPACEWIRE_IOCTRL_CLR_STATISTICS); // clear statistics
66 status = rtems_task_restart( Task_id[TASKID_HOUS], 1 );
68 if ( status == RTEMS_SUCCESSFUL ) // the link is in run state and has been started successfully
69 {
70 status = rtems_task_resume( Task_id[ TASKID_SEND ] );
71 if ( status != RTEMS_SUCCESSFUL ) {
72 PRINTF("in SPIQ *** ERR resuming SEND Task\n")
73 }
74 status = rtems_task_resume( Task_id[ TASKID_RECV ] );
67 75 if (status != RTEMS_SUCCESSFUL) {
68 PRINTF1("in SPIQ *** Error restarting HOUS Task *** code %d\n", status)
76 PRINTF("in SPIQ *** ERR resuming RECV Task\n")
77 }
69 78 }
70 status = rtems_task_restart(Task_id[TASKID_RECV], 1);
79 else // if the link is not up after SY_LFR_DPU_CONNECT_ATTEMPT tries, go in STANDBY mode
80 {
81 status = enter_mode( LFR_MODE_STANDBY, NULL ); // enter the STANDBY mode
71 82 if ( status != RTEMS_SUCCESSFUL) {
72 PRINTF("in SPIQ *** Error restarting RECV Task\n")
83 PRINTF1("in SPIQ *** ERR enter_mode *** code %d\n", status)
73 84 }
74 enter_mode(lfrMode, NULL); // enter the mode that was running before the SpaceWire interruption
85 // wake the WTDG task
86 status = rtems_event_send ( Task_id[TASKID_WTDG], RTEMS_EVENT_0 );
87 rtems_task_suspend( RTEMS_SELF );
75 88 }
76 89 }
77 90 }
78 91
79 92 rtems_task recv_task( rtems_task_argument unused )
80 93 {
81 94 /** This RTEMS task is dedicated to the reception of incoming TeleCommands.
82 95 *
83 96 * @param unused is the starting argument of the RTEMS task
84 97 *
85 98 * The RECV task blocks on a call to the read system call, waiting for incoming SpaceWire data. When unblocked:
86 99 * 1. It reads the incoming data.
87 100 * 2. Launches the acceptance procedure.
88 101 * 3. If the Telecommand is valid, sends it to a dedicated RTEMS message queue.
89 102 *
90 103 */
91 104
92 105 int len;
93 106 ccsdsTelecommandPacket_t currentTC;
94 107 unsigned char computed_CRC[ 2 ];
95 108 unsigned char currentTC_LEN_RCV[ 2 ];
96 109 unsigned int currentTC_LEN_RCV_AsUnsignedInt;
97 110 unsigned int parserCode;
98 111 rtems_status_code status;
99 112 rtems_id queue_recv_id;
100 113 rtems_id queue_send_id;
101 114
102 115 initLookUpTableForCRC(); // the table is used to compute Cyclic Redundancy Codes
103 116
104 117 status = rtems_message_queue_ident( misc_name[QUEUE_RECV], 0, &queue_recv_id );
105 118 if (status != RTEMS_SUCCESSFUL)
106 119 {
107 120 PRINTF1("in RECV *** ERR getting QUEUE_RECV id, %d\n", status)
108 121 }
109 122
110 123 status = rtems_message_queue_ident( misc_name[QUEUE_SEND], 0, &queue_send_id );
111 124 if (status != RTEMS_SUCCESSFUL)
112 125 {
113 126 PRINTF1("in RECV *** ERR getting QUEUE_SEND id, %d\n", status)
114 127 }
115 128
116 129 BOOT_PRINTF("in RECV *** \n")
117 130
118 131 while(1)
119 132 {
120 133 len = read(fdSPW, (char*) &currentTC, CCSDS_TC_PKT_MAX_SIZE); // the call to read is blocking
121 134 if (len == -1){ // error during the read call
122 PRINTF("In RECV *** last read call returned -1\n")
135 PRINTF1("in RECV *** last read call returned -1, ERRNO %d\n", errno)
123 136 }
124 137 else {
125 138 if ( (len+1) < CCSDS_TC_PKT_MIN_SIZE ) {
126 PRINTF("In RECV *** packet lenght too short\n")
139 PRINTF("in RECV *** packet lenght too short\n")
127 140 }
128 141 else {
129 142 currentTC_LEN_RCV_AsUnsignedInt = (unsigned int) (len - CCSDS_TC_TM_PACKET_OFFSET - 3); // => -3 is for Prot ID, Reserved and User App bytes
130 143 currentTC_LEN_RCV[ 0 ] = (unsigned char) (currentTC_LEN_RCV_AsUnsignedInt >> 8);
131 144 currentTC_LEN_RCV[ 1 ] = (unsigned char) (currentTC_LEN_RCV_AsUnsignedInt );
132 145 // CHECK THE TC
133 146 parserCode = tc_parser( &currentTC, currentTC_LEN_RCV_AsUnsignedInt, computed_CRC ) ;
134 147 if ( (parserCode == ILLEGAL_APID) || (parserCode == WRONG_LEN_PACKET) || (parserCode == INCOR_CHECKSUM)
135 148 | (parserCode == ILL_TYPE) || (parserCode == ILL_SUBTYPE) || (parserCode == WRONG_APP_DATA) )
136 149 { // send TM_LFR_TC_EXE_CORRUPTED
137 150 send_tm_lfr_tc_exe_corrupted( &currentTC, queue_send_id, computed_CRC, currentTC_LEN_RCV );
138 151 }
139 152 else
140 153 { // send valid TC to the action launcher
141 154 status = rtems_message_queue_send( queue_recv_id, &currentTC,
142 155 currentTC_LEN_RCV_AsUnsignedInt + CCSDS_TC_TM_PACKET_OFFSET + 3);
143 156 }
144 157 }
145 158 }
146 159 }
147 160 }
148 161
149 162 rtems_task send_task( rtems_task_argument argument)
150 163 {
151 164 /** This RTEMS task is dedicated to the transmission of TeleMetry packets.
152 165 *
153 166 * @param unused is the starting argument of the RTEMS task
154 167 *
155 168 * The SEND task waits for a message to become available in the dedicated RTEMS queue. When a message arrives:
156 169 * - if the first byte is equal to CCSDS_DESTINATION_ID, the message is sent as is using the write system call.
157 170 * - if the first byte is not equal to CCSDS_DESTINATION_ID, the message is handled as a spw_ioctl_pkt_send. After
158 171 * analyzis, the packet is sent either using the write system call or using the ioctl call SPACEWIRE_IOCTRL_SEND, depending on the
159 172 * data it contains.
160 173 *
161 174 */
162 175
163 176 rtems_status_code status; // RTEMS status code
164 177 char incomingData[ACTION_MSG_PKTS_MAX_SIZE]; // incoming data buffer
165 178 spw_ioctl_pkt_send *spw_ioctl_send;
166 179 size_t size; // size of the incoming TC packet
167 180 u_int32_t count;
168 181 rtems_id queue_id;
169 182
170 183 status = rtems_message_queue_ident( misc_name[QUEUE_SEND], 0, &queue_id );
171 184 if (status != RTEMS_SUCCESSFUL)
172 185 {
173 186 PRINTF1("in SEND *** ERR getting queue id, %d\n", status)
174 187 }
175 188
176 189 BOOT_PRINTF("in SEND *** \n")
177 190
178 191 while(1)
179 192 {
180 193 status = rtems_message_queue_receive( queue_id, incomingData, &size,
181 194 RTEMS_WAIT, RTEMS_NO_TIMEOUT );
182 195
183 196 if (status!=RTEMS_SUCCESSFUL)
184 197 {
185 198 PRINTF1("in SEND *** (1) ERR = %d\n", status)
186 199 }
187 200 else
188 201 {
189 202 if ( incomingData[0] == CCSDS_DESTINATION_ID) // the incoming message is a ccsds packet
190 203 {
191 204 status = write( fdSPW, incomingData, size );
192 205 if (status == -1){
193 206 PRINTF2("in SEND *** (2.a) ERR = %d, size = %d\n", status, size)
194 207 }
195 208 }
196 209 else // the incoming message is a spw_ioctl_pkt_send structure
197 210 {
198 211 spw_ioctl_send = (spw_ioctl_pkt_send*) incomingData;
199 212 if (spw_ioctl_send->hlen == 0)
200 213 {
201 214 status = write( fdSPW, spw_ioctl_send->data, spw_ioctl_send->dlen );
202 215 if (status == -1){
203 216 PRINTF2("in SEND *** (2.b) ERR = %d, dlen = %d\n", status, spw_ioctl_send->dlen)
204 217 }
205 218 }
206 219 else
207 220 {
208 221 status = ioctl( fdSPW, SPACEWIRE_IOCTRL_SEND, spw_ioctl_send );
209 222 if (status == -1){
210 223 PRINTF2("in SEND *** (2.c) ERR = %d, dlen = %d\n", status, spw_ioctl_send->dlen)
211 224 PRINTF1(" hlen = %d\n", spw_ioctl_send->hlen)
212 225 }
213 226 }
214 227 }
215 228 }
216 229
217 230 status = rtems_message_queue_get_number_pending( queue_id, &count );
218 231 if (status != RTEMS_SUCCESSFUL)
219 232 {
220 233 PRINTF1("in SEND *** (3) ERR = %d\n", status)
221 234 }
222 235 else
223 236 {
224 237 if (count > maxCount)
225 238 {
226 239 maxCount = count;
227 240 }
228 241 }
229 242 }
230 243 }
231 244
245 rtems_task wtdg_task( rtems_task_argument argument )
246 {
247 rtems_event_set event_out;
248 rtems_status_code status;
249 int linkStatus;
250
251 BOOT_PRINTF("in WTDG ***\n")
252
253 while(1){
254 // wait for an RTEMS_EVENT
255 rtems_event_receive( RTEMS_EVENT_0,
256 RTEMS_WAIT | RTEMS_EVENT_ANY, RTEMS_NO_TIMEOUT, &event_out);
257 PRINTF("in WTDG *** wait for the link\n")
258 ioctl(fdSPW, SPACEWIRE_IOCTRL_GET_LINK_STATUS, &linkStatus); // get the link status
259 while( linkStatus != 5) // wait for the link
260 {
261 rtems_task_wake_after( 10 );
262 ioctl(fdSPW, SPACEWIRE_IOCTRL_GET_LINK_STATUS, &linkStatus); // get the link status
263 }
264
265 // if START is not called, subsequent call to read and write will fail
266 status = ioctl( fdSPW, SPACEWIRE_IOCTRL_START, -1); // returns successfuly if the link is in run state
267 if ( status == RTEMS_SUCCESSFUL )
268 {
269 PRINTF("in WTDG *** link started\n")
270 }
271 else
272 {
273 PRINTF1("in WTDG *** ERR start, code %d\n", status)
274 }
275
276 rtems_task_restart( Task_id[TASKID_SPIQ], 1 );
277
278 rtems_task_resume( Task_id[TASKID_RECV] );
279
280 rtems_task_resume( Task_id[TASKID_SEND] );
281 }
282 }
283
232 284 //****************
233 285 // OTHER FUNCTIONS
234 int spacewire_configure_link( void )
286 int spacewire_open_link( void )
287 {
288 /** This function opens the SpaceWire link.
289 *
290 * @return a valid file descriptor in case of success, -1 in case of a failure
291 *
292 */
293 rtems_status_code status;
294
295 close( fdSPW ); // close the device if it is already open
296 fdSPW = open(GRSPW_DEVICE_NAME, O_RDWR); // open the device. the open call resets the hardware
297 if ( fdSPW < 0 ) {
298 PRINTF1("ERR *** in configure_spw_link *** error opening "GRSPW_DEVICE_NAME" with ERR %d\n", errno)
299 }
300 else
301 {
302 status = RTEMS_SUCCESSFUL;
303 }
304
305 return status;
306 }
307
308 int spacewire_start_link( int fd )
309 {
310 rtems_status_code status;
311
312 status = ioctl( fdSPW, SPACEWIRE_IOCTRL_START, -1); // returns successfuly if the link is in run state
313 // -1 default hardcoded driver timeout
314
315 return status;
316 }
317
318 int spacewire_configure_link( int fd )
235 319 {
236 320 /** This function configures the SpaceWire link.
237 321 *
238 322 * @return GR-RTEMS-DRIVER directive status codes:
239 323 * - 22 EINVAL - Null pointer or an out of range value was given as the argument.
240 324 * - 16 EBUSY - Only used for SEND. Returned when no descriptors are avialble in non-blocking mode.
241 325 * - 88 ENOSYS - Returned for SET_DESTKEY if RMAP command handler is not available or if a non-implemented call is used.
242 326 * - 116 ETIMEDOUT - REturned for SET_PACKET_SIZE and START if the link could not be brought up.
243 327 * - 12 ENOMEM - Returned for SET_PACKETSIZE if it was unable to allocate the new buffers.
244 328 * - 5 EIO - Error when writing to grswp hardware registers.
245 329 * - 2 ENOENT - No such file or directory
246 330 */
247 331
248 332 rtems_status_code status;
249 333
250 close(fdSPW); // close the device if it is already open
251 BOOT_PRINTF("OK *** in configure_spw_link *** try to open "GRSPW_DEVICE_NAME"\n")
252 fdSPW = open(GRSPW_DEVICE_NAME, O_RDWR); // open the device. the open call resets the hardware
253 if ( fdSPW<0 ) {
254 PRINTF1("ERR *** in configure_spw_link *** Error opening"GRSPW_DEVICE_NAME" with ERR %d\n", errno)
255 }
256
257 while(ioctl(fdSPW, SPACEWIRE_IOCTRL_START, -1) != RTEMS_SUCCESSFUL){
258 PRINTF(".")
259 fflush( stdout );
260 close( fdSPW ); // close the device
261 fdSPW = open( GRSPW_DEVICE_NAME, O_RDWR ); // open the device. the open call reset the hardware
262 if (fdSPW<0) {
263 PRINTF1("ERR *** in configure_spw_link *** Error opening"GRSPW_DEVICE_NAME" with ERR %d\n", errno)
264 }
265 rtems_task_wake_after(100);
266 }
267
268 BOOT_PRINTF("OK *** In configure_spw_link *** "GRSPW_DEVICE_NAME" opened and started successfully\n")
269
270 334 spacewire_set_NP(1, REGS_ADDR_GRSPW); // [N]o [P]ort force
271 335 spacewire_set_RE(1, REGS_ADDR_GRSPW); // [R]MAP [E]nable, the dedicated call seems to break the no port force configuration
272 336
273 status = ioctl(fdSPW, SPACEWIRE_IOCTRL_SET_RXBLOCK, 1); // sets the blocking mode for reception
337 status = ioctl(fd, SPACEWIRE_IOCTRL_SET_RXBLOCK, 1); // sets the blocking mode for reception
274 338 if (status!=RTEMS_SUCCESSFUL) PRINTF("in SPIQ *** Error SPACEWIRE_IOCTRL_SET_RXBLOCK\n")
275 339 //
276 status = ioctl(fdSPW, SPACEWIRE_IOCTRL_SET_EVENT_ID, Task_id[TASKID_SPIQ]); // sets the task ID to which an event is sent when a
340 status = ioctl(fd, SPACEWIRE_IOCTRL_SET_EVENT_ID, Task_id[TASKID_SPIQ]); // sets the task ID to which an event is sent when a
277 341 if (status!=RTEMS_SUCCESSFUL) PRINTF("in SPIQ *** Error SPACEWIRE_IOCTRL_SET_EVENT_ID\n") // link-error interrupt occurs
278 342 //
279 status = ioctl(fdSPW, SPACEWIRE_IOCTRL_SET_DISABLE_ERR, 0); // automatic link-disabling due to link-error interrupts
343 status = ioctl(fd, SPACEWIRE_IOCTRL_SET_DISABLE_ERR, 0); // automatic link-disabling due to link-error interrupts
280 344 if (status!=RTEMS_SUCCESSFUL) PRINTF("in SPIQ *** Error SPACEWIRE_IOCTRL_SET_DISABLE_ERR\n")
281 345 //
282 status = ioctl(fdSPW, SPACEWIRE_IOCTRL_SET_LINK_ERR_IRQ, 1); // sets the link-error interrupt bit
346 status = ioctl(fd, SPACEWIRE_IOCTRL_SET_LINK_ERR_IRQ, 1); // sets the link-error interrupt bit
283 347 if (status!=RTEMS_SUCCESSFUL) PRINTF("in SPIQ *** Error SPACEWIRE_IOCTRL_SET_LINK_ERR_IRQ\n")
284 348 //
285 status = ioctl(fdSPW, SPACEWIRE_IOCTRL_SET_TXBLOCK, 0); // transmission blocks
349 status = ioctl(fd, SPACEWIRE_IOCTRL_SET_TXBLOCK, 0); // transmission blocks
286 350 if (status!=RTEMS_SUCCESSFUL) PRINTF("in SPIQ *** Error SPACEWIRE_IOCTRL_SET_TXBLOCK\n")
287 351 //
288 status = ioctl(fdSPW, SPACEWIRE_IOCTRL_SET_TXBLOCK_ON_FULL, 0); // transmission blocks on full
352 status = ioctl(fd, SPACEWIRE_IOCTRL_SET_TXBLOCK_ON_FULL, 0); // transmission blocks on full
289 353 if (status!=RTEMS_SUCCESSFUL) PRINTF("in SPIQ *** Error SPACEWIRE_IOCTRL_SET_TXBLOCK_ON_FULL\n")
290 354 //
291 status = ioctl(fdSPW, SPACEWIRE_IOCTRL_SET_TCODE_CTRL, 0x0909); // [Time Rx : Time Tx : Link error : Tick-out IRQ]
355 status = ioctl(fd, SPACEWIRE_IOCTRL_SET_TCODE_CTRL, 0x0909); // [Time Rx : Time Tx : Link error : Tick-out IRQ]
292 356 if (status!=RTEMS_SUCCESSFUL) PRINTF("in SPIQ *** Error SPACEWIRE_IOCTRL_SET_TCODE_CTRL,\n")
293 357
294 BOOT_PRINTF("OK *** in configure_spw_link *** "GRSPW_DEVICE_NAME" configured successfully\n")
295
296 return RTEMS_SUCCESSFUL;
358 return status;
297 359 }
298 360
299 int spacewire_wait_for_link( void )
361 int spacewire_reset_link( void )
300 362 {
301 /** This function is executed when an interruption is raised by the SpaceWire driver.
363 /** This function is executed by the SPIQ rtems_task wehn it has been awaken by an interruption raised by the SpaceWire driver.
302 364 *
303 365 * @return RTEMS directive status code:
304 366 * - RTEMS_UNSATISFIED is returned is the link is not in the running state after 10 s.
305 367 * - RTEMS_SUCCESSFUL is returned if the link is up before the timeout.
306 368 *
307 369 */
308 370
309 unsigned int i;
310 int linkStatus;
311 rtems_status_code status = RTEMS_UNSATISFIED;
371 rtems_status_code status_spw;
372 int i;
373
374 for ( i=0; i<SY_LFR_DPU_CONNECT_ATTEMPT; i++ )
375 {
376 PRINTF1("in spacewire_reset_link *** link recovery, try %d\n", i);
377 status_spw = spacewire_open_link(); // (1) open the link
378 if ( status_spw != RTEMS_SUCCESSFUL )
379 {
380 PRINTF1("in spacewire_reset_link *** ERR spacewire_open_link code %d\n", status_spw)
381 }
312 382
313 for(i = 0; i< 10; i++){
314 PRINTF(".")
315 fflush( stdout );
316 ioctl(fdSPW, SPACEWIRE_IOCTRL_GET_LINK_STATUS, &linkStatus); // get the link status
317 PRINTF1("in spacewire_wait_for_link *** link status is: %s\n", lstates[linkStatus])
318 if ( linkStatus == 5) {
319 PRINTF("in spacewire_wait_for_link *** link is running\n")
320 status = RTEMS_SUCCESSFUL;
383 if ( status_spw == RTEMS_SUCCESSFUL ) // (2) configure the link
384 {
385 status_spw = spacewire_configure_link( fdSPW );
386 if ( status_spw != RTEMS_SUCCESSFUL )
387 {
388 PRINTF1("in spacewire_reset_link *** ERR spacewire_configure_link code %d\n", status_spw)
389 }
390 }
391
392 if ( status_spw == RTEMS_SUCCESSFUL) // (3) start the link
393 {
394 status_spw = spacewire_start_link( fdSPW );
395 if ( status_spw != RTEMS_SUCCESSFUL )
396 {
397 PRINTF1("in spacewire_reset_link *** ERR spacewire_start_link code %d\n", status_spw)
398 }
399 }
400
401 if ( status_spw == RTEMS_SUCCESSFUL)
402 {
321 403 break;
322 404 }
323 rtems_task_wake_after(100);
324 405 }
325 406
326 return status;
407 return status_spw;
327 408 }
328 409
329 410 void spacewire_set_NP( unsigned char val, unsigned int regAddr ) // [N]o [P]ort force
330 411 {
331 412 /** This function sets the [N]o [P]ort force bit of the GRSPW control register.
332 413 *
333 414 * @param val is the value, 0 or 1, used to set the value of the NP bit.
334 415 * @param regAddr is the address of the GRSPW control register.
335 416 *
336 417 * NP is the bit 20 of the GRSPW control register.
337 418 *
338 419 */
339 420
340 421 unsigned int *spwptr = (unsigned int*) regAddr;
341 422
342 423 if (val == 1) {
343 424 *spwptr = *spwptr | 0x00100000; // [NP] set the No port force bit
344 425 }
345 426 if (val== 0) {
346 427 *spwptr = *spwptr & 0xffdfffff;
347 428 }
348 429 }
349 430
350 431 void spacewire_set_RE( unsigned char val, unsigned int regAddr ) // [R]MAP [E]nable
351 432 {
352 433 /** This function sets the [R]MAP [E]nable bit of the GRSPW control register.
353 434 *
354 435 * @param val is the value, 0 or 1, used to set the value of the RE bit.
355 436 * @param regAddr is the address of the GRSPW control register.
356 437 *
357 438 * RE is the bit 16 of the GRSPW control register.
358 439 *
359 440 */
360 441
361 442 unsigned int *spwptr = (unsigned int*) regAddr;
362 443
363 444 if (val == 1)
364 445 {
365 446 *spwptr = *spwptr | 0x00010000; // [RE] set the RMAP Enable bit
366 447 }
367 448 if (val== 0)
368 449 {
369 450 *spwptr = *spwptr & 0xfffdffff;
370 451 }
371 452 }
372 453
373 454 void spacewire_compute_stats_offsets( void )
374 455 {
375 456 /** This function computes the SpaceWire statistics offsets in case of a SpaceWire related interruption raising.
376 457 *
377 458 * The offsets keep a record of the statistics in case of a reset of the statistics. They are added to the current statistics
378 459 * to keep the counters consistent even after a reset of the SpaceWire driver (the counter are set to zero by the driver when it
379 460 * during the open systel call).
380 461 *
381 462 */
382 463
383 464 spw_stats spacewire_stats_grspw;
384 465 rtems_status_code status;
385 466
386 467 status = ioctl( fdSPW, SPACEWIRE_IOCTRL_GET_STATISTICS, &spacewire_stats_grspw );
387 468
388 469 spacewire_stats_backup.packets_received = spacewire_stats_grspw.packets_received
389 470 + spacewire_stats.packets_received;
390 471 spacewire_stats_backup.packets_sent = spacewire_stats_grspw.packets_sent
391 472 + spacewire_stats.packets_sent;
392 473 spacewire_stats_backup.parity_err = spacewire_stats_grspw.parity_err
393 474 + spacewire_stats.parity_err;
394 475 spacewire_stats_backup.disconnect_err = spacewire_stats_grspw.disconnect_err
395 476 + spacewire_stats.disconnect_err;
396 477 spacewire_stats_backup.escape_err = spacewire_stats_grspw.escape_err
397 478 + spacewire_stats.escape_err;
398 479 spacewire_stats_backup.credit_err = spacewire_stats_grspw.credit_err
399 480 + spacewire_stats.credit_err;
400 481 spacewire_stats_backup.write_sync_err = spacewire_stats_grspw.write_sync_err
401 482 + spacewire_stats.write_sync_err;
402 483 spacewire_stats_backup.rx_rmap_header_crc_err = spacewire_stats_grspw.rx_rmap_header_crc_err
403 484 + spacewire_stats.rx_rmap_header_crc_err;
404 485 spacewire_stats_backup.rx_rmap_data_crc_err = spacewire_stats_grspw.rx_rmap_data_crc_err
405 486 + spacewire_stats.rx_rmap_data_crc_err;
406 487 spacewire_stats_backup.early_ep = spacewire_stats_grspw.early_ep
407 488 + spacewire_stats.early_ep;
408 489 spacewire_stats_backup.invalid_address = spacewire_stats_grspw.invalid_address
409 490 + spacewire_stats.invalid_address;
410 491 spacewire_stats_backup.rx_eep_err = spacewire_stats_grspw.rx_eep_err
411 492 + spacewire_stats.rx_eep_err;
412 493 spacewire_stats_backup.rx_truncated = spacewire_stats_grspw.rx_truncated
413 494 + spacewire_stats.rx_truncated;
414 495 }
415 496
416 497 void spacewire_update_statistics( void )
417 498 {
418 499 rtems_status_code status;
419 500 spw_stats spacewire_stats_grspw;
420 501
421 502 status = ioctl( fdSPW, SPACEWIRE_IOCTRL_GET_STATISTICS, &spacewire_stats_grspw );
422 503
423 504 spacewire_stats.packets_received = spacewire_stats_backup.packets_received
424 505 + spacewire_stats_grspw.packets_received;
425 506 spacewire_stats.packets_sent = spacewire_stats_backup.packets_sent
426 507 + spacewire_stats_grspw.packets_sent;
427 508 spacewire_stats.parity_err = spacewire_stats_backup.parity_err
428 509 + spacewire_stats_grspw.parity_err;
429 510 spacewire_stats.disconnect_err = spacewire_stats_backup.disconnect_err
430 511 + spacewire_stats_grspw.disconnect_err;
431 512 spacewire_stats.escape_err = spacewire_stats_backup.escape_err
432 513 + spacewire_stats_grspw.escape_err;
433 514 spacewire_stats.credit_err = spacewire_stats_backup.credit_err
434 515 + spacewire_stats_grspw.credit_err;
435 516 spacewire_stats.write_sync_err = spacewire_stats_backup.write_sync_err
436 517 + spacewire_stats_grspw.write_sync_err;
437 518 spacewire_stats.rx_rmap_header_crc_err = spacewire_stats_backup.rx_rmap_header_crc_err
438 519 + spacewire_stats_grspw.rx_rmap_header_crc_err;
439 520 spacewire_stats.rx_rmap_data_crc_err = spacewire_stats_backup.rx_rmap_data_crc_err
440 521 + spacewire_stats_grspw.rx_rmap_data_crc_err;
441 522 spacewire_stats.early_ep = spacewire_stats_backup.early_ep
442 523 + spacewire_stats_grspw.early_ep;
443 524 spacewire_stats.invalid_address = spacewire_stats_backup.invalid_address
444 525 + spacewire_stats_grspw.invalid_address;
445 526 spacewire_stats.rx_eep_err = spacewire_stats_backup.rx_eep_err
446 527 + spacewire_stats_grspw.rx_eep_err;
447 528 spacewire_stats.rx_truncated = spacewire_stats_backup.rx_truncated
448 529 + spacewire_stats_grspw.rx_truncated;
449 530 //spacewire_stats.tx_link_err;
450 531
451 532 //****************************
452 533 // DPU_SPACEWIRE_IF_STATISTICS
453 534 housekeeping_packet.hk_lfr_dpu_spw_pkt_rcv_cnt[0] = (unsigned char) (spacewire_stats.packets_received >> 8);
454 535 housekeeping_packet.hk_lfr_dpu_spw_pkt_rcv_cnt[1] = (unsigned char) (spacewire_stats.packets_received);
455 536 housekeeping_packet.hk_lfr_dpu_spw_pkt_sent_cnt[0] = (unsigned char) (spacewire_stats.packets_sent >> 8);
456 537 housekeeping_packet.hk_lfr_dpu_spw_pkt_sent_cnt[1] = (unsigned char) (spacewire_stats.packets_sent);
457 538 //housekeeping_packet.hk_lfr_dpu_spw_tick_out_cnt;
458 539 //housekeeping_packet.hk_lfr_dpu_spw_last_timc;
459 540
460 541 //******************************************
461 542 // ERROR COUNTERS / SPACEWIRE / LOW SEVERITY
462 543 housekeeping_packet.hk_lfr_dpu_spw_parity = (unsigned char) spacewire_stats.parity_err;
463 544 housekeeping_packet.hk_lfr_dpu_spw_disconnect = (unsigned char) spacewire_stats.disconnect_err;
464 545 housekeeping_packet.hk_lfr_dpu_spw_escape = (unsigned char) spacewire_stats.escape_err;
465 546 housekeeping_packet.hk_lfr_dpu_spw_credit = (unsigned char) spacewire_stats.credit_err;
466 547 housekeeping_packet.hk_lfr_dpu_spw_write_sync = (unsigned char) spacewire_stats.write_sync_err;
467 548 // housekeeping_packet.hk_lfr_dpu_spw_rx_ahb;
468 549 // housekeeping_packet.hk_lfr_dpu_spw_tx_ahb;
469 550 housekeeping_packet.hk_lfr_dpu_spw_header_crc = (unsigned char) spacewire_stats.rx_rmap_header_crc_err;
470 551 housekeeping_packet.hk_lfr_dpu_spw_data_crc = (unsigned char) spacewire_stats.rx_rmap_data_crc_err;
471 552
472 553 //*********************************************
473 554 // ERROR COUNTERS / SPACEWIRE / MEDIUM SEVERITY
474 555 housekeeping_packet.hk_lfr_dpu_spw_early_eop = (unsigned char) spacewire_stats.early_ep;
475 556 housekeeping_packet.hk_lfr_dpu_spw_invalid_addr = (unsigned char) spacewire_stats.invalid_address;
476 557 housekeeping_packet.hk_lfr_dpu_spw_eep = (unsigned char) spacewire_stats.rx_eep_err;
477 558 housekeeping_packet.hk_lfr_dpu_spw_rx_too_big = (unsigned char) spacewire_stats.rx_truncated;
478 559
479 560 }
480 561
481 562 void timecode_irq_handler( void *pDev, void *regs, int minor, unsigned int tc )
482 563 {
483 564 //if (rtems_event_send( Task_id[TASKID_DUMB], RTEMS_EVENT_1 ) != RTEMS_SUCCESSFUL) {
484 565 // printf("In timecode_irq_handler *** Error sending event to DUMB\n");
485 566 //}
486 567 }
568
569 rtems_timer_service_routine user_routine( rtems_id timer_id, void *user_data )
570 {
571 int linkStatus;
572 rtems_status_code status;
573
574 ioctl(fdSPW, SPACEWIRE_IOCTRL_GET_LINK_STATUS, &linkStatus); // get the link status
575
576 if ( linkStatus == 5) {
577 PRINTF("in spacewire_reset_link *** link is running\n")
578 status = RTEMS_SUCCESSFUL;
579 }
580 }
@@ -1,374 +1,414
1 1 /** Functions related to TeleCommand acceptance.
2 2 *
3 3 * @file
4 4 * @author P. LEROY
5 5 *
6 6 * A group of functions to handle TeleCommands parsing.\n
7 7 *
8 8 */
9 9
10 10 #include "tc_acceptance.h"
11 11
12 12 unsigned int lookUpTableForCRC[256];
13 13
14 14 //**********************
15 15 // GENERAL USE FUNCTIONS
16 16 unsigned int Crc_opt( unsigned char D, unsigned int Chk)
17 17 {
18 18 /** This function generate the CRC for one byte and returns the value of the new syndrome.
19 19 *
20 20 * @param D is the current byte of data.
21 21 * @param Chk is the current syndrom value.
22 22 * @return the value of the new syndrome on two bytes.
23 23 *
24 24 */
25 25
26 26 return(((Chk << 8) & 0xff00)^lookUpTableForCRC [(((Chk >> 8)^D) & 0x00ff)]);
27 27 }
28 28
29 29 void initLookUpTableForCRC( void )
30 30 {
31 31 /** This function is used to initiates the look-up table for fast CRC computation.
32 32 *
33 33 * The global table lookUpTableForCRC[256] is initiated.
34 34 *
35 35 */
36 36
37 37 unsigned int i;
38 38 unsigned int tmp;
39 39
40 40 for (i=0; i<256; i++)
41 41 {
42 42 tmp = 0;
43 43 if((i & 1) != 0) {
44 44 tmp = tmp ^ 0x1021;
45 45 }
46 46 if((i & 2) != 0) {
47 47 tmp = tmp ^ 0x2042;
48 48 }
49 49 if((i & 4) != 0) {
50 50 tmp = tmp ^ 0x4084;
51 51 }
52 52 if((i & 8) != 0) {
53 53 tmp = tmp ^ 0x8108;
54 54 }
55 55 if((i & 16) != 0) {
56 56 tmp = tmp ^ 0x1231;
57 57 }
58 58 if((i & 32) != 0) {
59 59 tmp = tmp ^ 0x2462;
60 60 }
61 61 if((i & 64) != 0) {
62 62 tmp = tmp ^ 0x48c4;
63 63 }
64 64 if((i & 128) != 0) {
65 65 tmp = tmp ^ 0x9188;
66 66 }
67 67 lookUpTableForCRC[i] = tmp;
68 68 }
69 69 }
70 70
71 71 void GetCRCAsTwoBytes(unsigned char* data, unsigned char* crcAsTwoBytes, unsigned int sizeOfData)
72 72 {
73 73 /** This function calculates a two bytes Cyclic Redundancy Code.
74 74 *
75 75 * @param data points to a buffer containing the data on which to compute the CRC.
76 76 * @param crcAsTwoBytes points points to a two bytes buffer in which the CRC is stored.
77 77 * @param sizeOfData is the number of bytes of *data* used to compute the CRC.
78 78 *
79 79 * The specification of the Cyclic Redundancy Code is described in the following document: ECSS-E-70-41-A.
80 80 *
81 81 */
82 82
83 83 unsigned int Chk;
84 84 int j;
85 85 Chk = 0xffff; // reset the syndrom to all ones
86 86 for (j=0; j<sizeOfData; j++) {
87 87 Chk = Crc_opt(data[j], Chk);
88 88 }
89 89 crcAsTwoBytes[0] = (unsigned char) (Chk >> 8);
90 90 crcAsTwoBytes[1] = (unsigned char) (Chk & 0x00ff);
91 91 }
92 92
93 93 //*********************
94 94 // ACCEPTANCE FUNCTIONS
95 95 int tc_parser(ccsdsTelecommandPacket_t * TCPacket, unsigned int TC_LEN_RCV, unsigned char *computed_CRC)
96 96 {
97 97 /** This function parses TeleCommands.
98 98 *
99 99 * @param TC points to the TeleCommand that will be parsed.
100 100 * @param TC_LEN_RCV is the received packet length.
101 *
101 102 * @return Status code of the parsing.
102 103 *
103 104 * The parsing checks:
104 105 * - process id
105 106 * - category
106 107 * - length: a global check is performed and a per subtype check also
107 108 * - type
108 109 * - subtype
109 110 * - crc
110 111 *
111 112 */
112 113
113 114 int status;
114 115 unsigned char pid;
115 116 unsigned char category;
116 117 unsigned int length;
117 118 unsigned char packetType;
118 119 unsigned char packetSubtype;
120 unsigned char sid;
119 121
120 122 status = CCSDS_TM_VALID;
121 123
122 124 // APID check *** APID on 2 bytes
123 125 pid = ((TCPacket->packetID[0] & 0x07)<<4) + ( (TCPacket->packetID[1]>>4) & 0x0f ); // PID = 11 *** 7 bits xxxxx210 7654xxxx
124 126 category = (TCPacket->packetID[1] & 0x0f); // PACKET_CATEGORY = 12 *** 4 bits xxxxxxxx xxxx3210
125 127 length = (TCPacket->packetLength[0] * 256) + TCPacket->packetLength[1];
126 128 packetType = TCPacket->serviceType;
127 129 packetSubtype = TCPacket->serviceSubType;
130 sid = TCPacket->sourceID;
128 131
129 132 if ( pid != CCSDS_PROCESS_ID ) // CHECK THE PROCESS ID
130 133 {
131 134 status = ILLEGAL_APID;
132 135 }
133 136 if (status == CCSDS_TM_VALID) // CHECK THE CATEGORY
134 137 {
135 138 if ( category != CCSDS_PACKET_CATEGORY )
136 139 {
137 140 status = ILLEGAL_APID;
138 141 }
139 142 }
140 143 if (status == CCSDS_TM_VALID) // CHECK THE PACKET LENGTH FIELD AND THE ACTUAL LENGTH COMPLIANCE
141 144 {
142 145 if (length != TC_LEN_RCV ) {
143 146 status = WRONG_LEN_PACKET;
144 147 }
145 148 }
146 149 if (status == CCSDS_TM_VALID) // CHECK THAT THE PACKET DOES NOT EXCEED THE MAX SIZE
147 150 {
148 151 if ( length >= CCSDS_TC_PKT_MAX_SIZE ) {
149 152 status = WRONG_LEN_PACKET;
150 153 }
151 154 }
152 155 if (status == CCSDS_TM_VALID) // CHECK THE TYPE
153 156 {
154 157 status = tc_check_type( packetType );
155 158 }
156 159 if (status == CCSDS_TM_VALID) // CHECK THE SUBTYPE
157 160 {
158 161 status = tc_check_subtype( packetSubtype );
159 162 }
163 if (status == CCSDS_TM_VALID) // CHECK THE SID
164 {
165 status = tc_check_sid( sid );
166 }
160 167 if (status == CCSDS_TM_VALID) // CHECK THE SUBTYPE AND LENGTH COMPLIANCE
161 168 {
162 169 status = tc_check_length( packetSubtype, length );
163 170 }
164 171 if (status == CCSDS_TM_VALID ) // CHECK CRC
165 172 {
166 173 status = tc_check_crc( TCPacket, length, computed_CRC );
167 174 }
168 175
169 176 return status;
170 177 }
171 178
172 179 int tc_check_type( unsigned char packetType )
173 180 {
174 181 /** This function checks that the type of a TeleCommand is valid.
175 182 *
176 183 * @param packetType is the type to check.
184 *
177 185 * @return Status code CCSDS_TM_VALID or ILL_TYPE.
178 186 *
179 187 */
180 188
181 189 int status;
182 190
183 191 if ( (packetType == TC_TYPE_GEN) || (packetType == TC_TYPE_TIME))
184 192 {
185 193 status = CCSDS_TM_VALID;
186 194 }
187 195 else
188 196 {
189 197 status = ILL_TYPE;
190 198 }
191 199
192 200 return status;
193 201 }
194 202
195 203 int tc_check_subtype( unsigned char packetSubType )
196 204 {
197 205 /** This function checks that the subtype of a TeleCommand is valid.
198 206 *
199 207 * @param packetSubType is the subtype to check.
208 *
200 209 * @return Status code CCSDS_TM_VALID or ILL_SUBTYPE.
201 210 *
202 211 */
203 212
204 213 int status;
205 214
206 215 if ( (packetSubType == TC_SUBTYPE_RESET)
207 216 || (packetSubType == TC_SUBTYPE_LOAD_COMM)
208 217 || (packetSubType == TC_SUBTYPE_LOAD_NORM) || (packetSubType == TC_SUBTYPE_LOAD_BURST)
209 218 || (packetSubType == TC_SUBTYPE_LOAD_SBM1) || (packetSubType == TC_SUBTYPE_LOAD_SBM2)
210 219 || (packetSubType == TC_SUBTYPE_DUMP)
211 220 || (packetSubType == TC_SUBTYPE_ENTER)
212 221 || (packetSubType == TC_SUBTYPE_UPDT_INFO) || (packetSubType == TC_SUBTYPE_UPDT_TIME)
213 222 || (packetSubType == TC_SUBTYPE_EN_CAL) || (packetSubType == TC_SUBTYPE_DIS_CAL) )
214 223 {
215 224 status = CCSDS_TM_VALID;
216 225 }
217 226 else
218 227 {
219 228 status = ILL_TYPE;
220 229 }
221 230
222 231 return status;
223 232 }
224 233
234 int tc_check_sid( unsigned char sid )
235 {
236 /** This function checks that the sid of a TeleCommand is valid.
237 *
238 * @param sid is the sid to check.
239 *
240 * @return Status code CCSDS_TM_VALID or CORRUPTED.
241 *
242 */
243
244 int status;
245
246 if ( (sid == SID_TC_GROUND)
247 || (sid == SID_TC_MISSION_TIMELINE) || (sid == SID_TC_TC_SEQUENCES) || (sid == SID_TC_RECOVERY_ACTION_CMD)
248 || (sid == SID_TC_BACKUP_MISSION_TIMELINE)
249 || (sid == SID_TC_DIRECT_CMD) || (sid == SID_TC_SPARE_GRD_SRC1) || (sid == SID_TC_SPARE_GRD_SRC2)
250 || (sid == SID_TC_OBCP) || (sid == SID_TC_SYSTEM_CONTROL) || (sid == SID_TC_AOCS)
251 || (sid == SID_TC_RPW_INTERNAL))
252 {
253 status = CCSDS_TM_VALID;
254 }
255 else
256 {
257 status = CORRUPTED;
258 }
259
260 return status;
261 }
262
225 263 int tc_check_length( unsigned char packetSubType, unsigned int length )
226 264 {
227 265 /** This function checks that the subtype and the length are compliant.
228 266 *
229 267 * @param packetSubType is the subtype to check.
230 268 * @param length is the length to check.
269 *
231 270 * @return Status code CCSDS_TM_VALID or ILL_TYPE.
232 271 *
233 272 */
234 273
235 274 int status;
236 275
237 276 status = LFR_SUCCESSFUL;
238 277
239 278 switch(packetSubType)
240 279 {
241 280 case TC_SUBTYPE_RESET:
242 281 if (length!=(TC_LEN_RESET-CCSDS_TC_TM_PACKET_OFFSET)) {
243 282 status = WRONG_LEN_PACKET;
244 283 }
245 284 else {
246 285 status = CCSDS_TM_VALID;
247 286 }
248 287 break;
249 288 case TC_SUBTYPE_LOAD_COMM:
250 289 if (length!=(TC_LEN_LOAD_COMM-CCSDS_TC_TM_PACKET_OFFSET)) {
251 290 status = WRONG_LEN_PACKET;
252 291 }
253 292 else {
254 293 status = CCSDS_TM_VALID;
255 294 }
256 295 break;
257 296 case TC_SUBTYPE_LOAD_NORM:
258 297 if (length!=(TC_LEN_LOAD_NORM-CCSDS_TC_TM_PACKET_OFFSET)) {
259 298 status = WRONG_LEN_PACKET;
260 299 }
261 300 else {
262 301 status = CCSDS_TM_VALID;
263 302 }
264 303 break;
265 304 case TC_SUBTYPE_LOAD_BURST:
266 305 if (length!=(TC_LEN_LOAD_BURST-CCSDS_TC_TM_PACKET_OFFSET)) {
267 306 status = WRONG_LEN_PACKET;
268 307 }
269 308 else {
270 309 status = CCSDS_TM_VALID;
271 310 }
272 311 break;
273 312 case TC_SUBTYPE_LOAD_SBM1:
274 313 if (length!=(TC_LEN_LOAD_SBM1-CCSDS_TC_TM_PACKET_OFFSET)) {
275 314 status = WRONG_LEN_PACKET;
276 315 }
277 316 else {
278 317 status = CCSDS_TM_VALID;
279 318 }
280 319 break;
281 320 case TC_SUBTYPE_LOAD_SBM2:
282 321 if (length!=(TC_LEN_LOAD_SBM2-CCSDS_TC_TM_PACKET_OFFSET)) {
283 322 status = WRONG_LEN_PACKET;
284 323 }
285 324 else {
286 325 status = CCSDS_TM_VALID;
287 326 }
288 327 break;
289 328 case TC_SUBTYPE_DUMP:
290 329 if (length!=(TC_LEN_DUMP-CCSDS_TC_TM_PACKET_OFFSET)) {
291 330 status = WRONG_LEN_PACKET;
292 331 }
293 332 else {
294 333 status = CCSDS_TM_VALID;
295 334 }
296 335 break;
297 336 case TC_SUBTYPE_ENTER:
298 337 if (length!=(TC_LEN_ENTER-CCSDS_TC_TM_PACKET_OFFSET)) {
299 338 status = WRONG_LEN_PACKET;
300 339 }
301 340 else {
302 341 status = CCSDS_TM_VALID;
303 342 }
304 343 break;
305 344 case TC_SUBTYPE_UPDT_INFO:
306 345 if (length!=(TC_LEN_UPDT_INFO-CCSDS_TC_TM_PACKET_OFFSET)) {
307 346 status = WRONG_LEN_PACKET;
308 347 }
309 348 else {
310 349 status = CCSDS_TM_VALID;
311 350 }
312 351 break;
313 352 case TC_SUBTYPE_EN_CAL:
314 353 if (length!=(TC_LEN_EN_CAL-CCSDS_TC_TM_PACKET_OFFSET)) {
315 354 status = WRONG_LEN_PACKET;
316 355 }
317 356 else {
318 357 status = CCSDS_TM_VALID;
319 358 }
320 359 break;
321 360 case TC_SUBTYPE_DIS_CAL:
322 361 if (length!=(TC_LEN_DIS_CAL-CCSDS_TC_TM_PACKET_OFFSET)) {
323 362 status = WRONG_LEN_PACKET;
324 363 }
325 364 else {
326 365 status = CCSDS_TM_VALID;
327 366 }
328 367 break;
329 368 case TC_SUBTYPE_UPDT_TIME:
330 369 if (length!=(TC_LEN_UPDT_TIME-CCSDS_TC_TM_PACKET_OFFSET)) {
331 370 status = WRONG_LEN_PACKET;
332 371 }
333 372 else {
334 373 status = CCSDS_TM_VALID;
335 374 }
336 375 break;
337 376 default: // if the subtype is not a legal value, return ILL_SUBTYPE
338 377 status = ILL_SUBTYPE;
339 378 break ;
340 379 }
341 380
342 381 return status;
343 382 }
344 383
345 384 int tc_check_crc( ccsdsTelecommandPacket_t * TCPacket, unsigned int length, unsigned char *computed_CRC )
346 385 {
347 386 /** This function checks the CRC validity of the corresponding TeleCommand packet.
348 387 *
349 388 * @param TCPacket points to the TeleCommand packet to check.
350 389 * @param length is the length of the TC packet.
390 *
351 391 * @return Status code CCSDS_TM_VALID or INCOR_CHECKSUM.
352 392 *
353 393 */
354 394
355 395 int status;
356 396 unsigned char * CCSDSContent;
357 397
358 398 CCSDSContent = (unsigned char*) TCPacket->packetID;
359 399 GetCRCAsTwoBytes(CCSDSContent, computed_CRC, length + CCSDS_TC_TM_PACKET_OFFSET - 2); // 2 CRC bytes removed from the calculation of the CRC
360 400 if (computed_CRC[0] != CCSDSContent[length + CCSDS_TC_TM_PACKET_OFFSET -2]) {
361 401 status = INCOR_CHECKSUM;
362 402 }
363 403 else if (computed_CRC[1] != CCSDSContent[length + CCSDS_TC_TM_PACKET_OFFSET -1]) {
364 404 status = INCOR_CHECKSUM;
365 405 }
366 406 else {
367 407 status = CCSDS_TM_VALID;
368 408 }
369 409
370 410 return status;
371 411 }
372 412
373 413
374 414
@@ -1,780 +1,780
1 1 /** Functions and tasks related to TeleCommand handling.
2 2 *
3 3 * @file
4 4 * @author P. LEROY
5 5 *
6 6 * A group of functions to handle TeleCommands:\n
7 7 * action launching\n
8 8 * TC parsing\n
9 9 * ...
10 10 *
11 11 */
12 12
13 13 #include "tc_handler.h"
14 14
15 15 //***********
16 16 // RTEMS TASK
17 17
18 18 rtems_task actn_task( rtems_task_argument unused )
19 19 {
20 20 /** This RTEMS task is responsible for launching actions upton the reception of valid TeleCommands.
21 21 *
22 22 * @param unused is the starting argument of the RTEMS task
23 23 *
24 24 * The ACTN task waits for data coming from an RTEMS msesage queue. When data arrives, it launches specific actions depending
25 25 * on the incoming TeleCommand.
26 26 *
27 27 */
28 28
29 29 int result;
30 30 rtems_status_code status; // RTEMS status code
31 31 ccsdsTelecommandPacket_t TC; // TC sent to the ACTN task
32 32 size_t size; // size of the incoming TC packet
33 33 unsigned char subtype; // subtype of the current TC packet
34 34 rtems_id queue_rcv_id;
35 35 rtems_id queue_snd_id;
36 36
37 37 status = rtems_message_queue_ident( misc_name[QUEUE_RECV], 0, &queue_rcv_id );
38 38 if (status != RTEMS_SUCCESSFUL)
39 39 {
40 40 PRINTF1("in ACTN *** ERR getting queue_rcv_id %d\n", status)
41 41 }
42 42
43 43 status = rtems_message_queue_ident( misc_name[QUEUE_SEND], 0, &queue_snd_id );
44 44 if (status != RTEMS_SUCCESSFUL)
45 45 {
46 46 PRINTF1("in ACTN *** ERR getting queue_snd_id %d\n", status)
47 47 }
48 48
49 49 result = LFR_SUCCESSFUL;
50 50 subtype = 0; // subtype of the current TC packet
51 51
52 52 BOOT_PRINTF("in ACTN *** \n")
53 53
54 54 while(1)
55 55 {
56 56 status = rtems_message_queue_receive( queue_rcv_id, (char*) &TC, &size,
57 57 RTEMS_WAIT, RTEMS_NO_TIMEOUT);
58 58 if (status!=RTEMS_SUCCESSFUL) PRINTF1("ERR *** in task ACTN *** error receiving a message, code %d \n", status)
59 59 else
60 60 {
61 61 subtype = TC.serviceSubType;
62 62 switch(subtype)
63 63 {
64 64 case TC_SUBTYPE_RESET:
65 65 result = action_reset( &TC, queue_snd_id );
66 66 close_action( &TC, result, queue_snd_id );
67 67 break;
68 68 //
69 69 case TC_SUBTYPE_LOAD_COMM:
70 70 result = action_load_common_par( &TC );
71 71 close_action( &TC, result, queue_snd_id );
72 72 break;
73 73 //
74 74 case TC_SUBTYPE_LOAD_NORM:
75 75 result = action_load_normal_par( &TC, queue_snd_id );
76 76 close_action( &TC, result, queue_snd_id );
77 77 break;
78 78 //
79 79 case TC_SUBTYPE_LOAD_BURST:
80 80 result = action_load_burst_par( &TC, queue_snd_id );
81 81 close_action( &TC, result, queue_snd_id );
82 82 break;
83 83 //
84 84 case TC_SUBTYPE_LOAD_SBM1:
85 85 result = action_load_sbm1_par( &TC, queue_snd_id );
86 86 close_action( &TC, result, queue_snd_id );
87 87 break;
88 88 //
89 89 case TC_SUBTYPE_LOAD_SBM2:
90 90 result = action_load_sbm2_par( &TC, queue_snd_id );
91 91 close_action( &TC, result, queue_snd_id );
92 92 break;
93 93 //
94 94 case TC_SUBTYPE_DUMP:
95 95 result = action_dump_par( queue_snd_id );
96 96 close_action( &TC, result, queue_snd_id );
97 97 break;
98 98 //
99 99 case TC_SUBTYPE_ENTER:
100 100 result = action_enter_mode( &TC, queue_snd_id );
101 101 close_action( &TC, result, queue_snd_id );
102 102 break;
103 103 //
104 104 case TC_SUBTYPE_UPDT_INFO:
105 105 result = action_update_info( &TC, queue_snd_id );
106 106 close_action( &TC, result, queue_snd_id );
107 107 break;
108 108 //
109 109 case TC_SUBTYPE_EN_CAL:
110 110 result = action_enable_calibration( &TC, queue_snd_id );
111 111 close_action( &TC, result, queue_snd_id );
112 112 break;
113 113 //
114 114 case TC_SUBTYPE_DIS_CAL:
115 115 result = action_disable_calibration( &TC, queue_snd_id );
116 116 close_action( &TC, result, queue_snd_id );
117 117 break;
118 118 //
119 119 case TC_SUBTYPE_UPDT_TIME:
120 120 result = action_update_time( &TC );
121 121 close_action( &TC, result, queue_snd_id );
122 122 break;
123 123 //
124 124 default:
125 125 break;
126 126 }
127 127 }
128 128 }
129 129 }
130 130
131 131 //***********
132 132 // TC ACTIONS
133 133
134 134 int action_reset(ccsdsTelecommandPacket_t *TC, rtems_id queue_id)
135 135 {
136 136 /** This function executes specific actions when a TC_LFR_RESET TeleCommand has been received.
137 137 *
138 138 * @param TC points to the TeleCommand packet that is being processed
139 139 * @param queue_id is the id of the queue which handles TM transmission by the SpaceWire driver
140 140 *
141 141 */
142 142
143 143 send_tm_lfr_tc_exe_not_implemented( TC, queue_id );
144 144 return LFR_DEFAULT;
145 145 }
146 146
147 147 int action_enter_mode(ccsdsTelecommandPacket_t *TC, rtems_id queue_id)
148 148 {
149 149 /** This function executes specific actions when a TC_LFR_ENTER_MODE TeleCommand has been received.
150 150 *
151 151 * @param TC points to the TeleCommand packet that is being processed
152 152 * @param queue_id is the id of the queue which handles TM transmission by the SpaceWire driver
153 153 *
154 154 */
155 155
156 156 rtems_status_code status;
157 157 unsigned char requestedMode;
158 158
159 159 requestedMode = TC->dataAndCRC[1];
160 160
161 161 if ( (requestedMode != LFR_MODE_STANDBY)
162 162 && (requestedMode != LFR_MODE_NORMAL) && (requestedMode != LFR_MODE_BURST)
163 163 && (requestedMode != LFR_MODE_SBM1) && (requestedMode != LFR_MODE_SBM2) )
164 164 {
165 165 status = RTEMS_UNSATISFIED;
166 166 send_tm_lfr_tc_exe_inconsistent( TC, queue_id, BYTE_POS_CP_LFR_MODE, requestedMode );
167 167 }
168 168 else
169 169 {
170 170 printf("try to enter mode %d\n", requestedMode);
171 171
172 172 #ifdef PRINT_TASK_STATISTICS
173 173 if (requestedMode != LFR_MODE_STANDBY)
174 174 {
175 175 rtems_cpu_usage_reset();
176 176 maxCount = 0;
177 177 }
178 178 #endif
179 179
180 180 status = transition_validation(requestedMode);
181 181
182 182 if ( status == LFR_SUCCESSFUL ) {
183 183 if ( lfrCurrentMode != LFR_MODE_STANDBY)
184 184 {
185 185 status = stop_current_mode();
186 186 }
187 187 if (status != RTEMS_SUCCESSFUL)
188 188 {
189 189 PRINTF("ERR *** in action_enter *** stop_current_mode\n")
190 190 }
191 191 status = enter_mode(requestedMode, TC);
192 192 }
193 193 else
194 194 {
195 195 PRINTF("ERR *** in action_enter *** transition rejected\n")
196 196 send_tm_lfr_tc_exe_not_executable( TC, queue_id );
197 197 }
198 198 }
199 199
200 200 return status;
201 201 }
202 202
203 203 int action_update_info(ccsdsTelecommandPacket_t *TC, rtems_id queue_id)
204 204 {
205 205 /** This function executes specific actions when a TC_LFR_UPDATE_INFO TeleCommand has been received.
206 206 *
207 207 * @param TC points to the TeleCommand packet that is being processed
208 208 * @param queue_id is the id of the queue which handles TM transmission by the SpaceWire driver
209 209 *
210 * @return LFR directive status code:
211 * - LFR_DEFAULT
212 * - LFR_SUCCESSFUL
213 *
210 214 */
211 215
212 216 unsigned int val;
213 217 int result;
214 unsigned char lfrMode;
215 218
216 219 result = LFR_DEFAULT;
217 lfrMode = (housekeeping_packet.lfr_status_word[0] & 0xf0) >> 4;
218 220
219 if ( (lfrMode == LFR_MODE_STANDBY) ) {
220 send_tm_lfr_tc_exe_not_implemented( TC, queue_id );
221 result = LFR_DEFAULT;
222 }
223 else {
224 221 val = housekeeping_packet.hk_lfr_update_info_tc_cnt[0] * 256
225 222 + housekeeping_packet.hk_lfr_update_info_tc_cnt[1];
226 223 val++;
227 224 housekeeping_packet.hk_lfr_update_info_tc_cnt[0] = (unsigned char) (val >> 8);
228 225 housekeeping_packet.hk_lfr_update_info_tc_cnt[1] = (unsigned char) (val);
229 result = LFR_SUCCESSFUL;
230 }
231 226
232 227 return result;
233 228 }
234 229
235 230 int action_enable_calibration(ccsdsTelecommandPacket_t *TC, rtems_id queue_id)
236 231 {
237 232 /** This function executes specific actions when a TC_LFR_ENABLE_CALIBRATION TeleCommand has been received.
238 233 *
239 234 * @param TC points to the TeleCommand packet that is being processed
240 235 * @param queue_id is the id of the queue which handles TM transmission by the SpaceWire driver
241 236 *
242 237 */
243 238
244 239 int result;
245 240 unsigned char lfrMode;
246 241
247 242 result = LFR_DEFAULT;
248 243 lfrMode = (housekeeping_packet.lfr_status_word[0] & 0xf0) >> 4;
249 244
250 245 if ( (lfrMode == LFR_MODE_STANDBY) | (lfrMode == LFR_MODE_BURST) | (lfrMode == LFR_MODE_SBM2) ) {
251 246 send_tm_lfr_tc_exe_not_executable( TC, queue_id );
252 247 result = LFR_DEFAULT;
253 248 }
254 249 else {
255 250 send_tm_lfr_tc_exe_not_implemented( TC, queue_id );
256 251 result = LFR_DEFAULT;
257 252 }
258 253 return result;
259 254 }
260 255
261 256 int action_disable_calibration(ccsdsTelecommandPacket_t *TC, rtems_id queue_id)
262 257 {
263 258 /** This function executes specific actions when a TC_LFR_DISABLE_CALIBRATION TeleCommand has been received.
264 259 *
265 260 * @param TC points to the TeleCommand packet that is being processed
266 261 * @param queue_id is the id of the queue which handles TM transmission by the SpaceWire driver
267 262 *
268 263 */
269 264
270 265 int result;
271 266 unsigned char lfrMode;
272 267
273 268 result = LFR_DEFAULT;
274 269 lfrMode = (housekeeping_packet.lfr_status_word[0] & 0xf0) >> 4;
275 270
276 271 if ( (lfrMode == LFR_MODE_STANDBY) | (lfrMode == LFR_MODE_BURST) | (lfrMode == LFR_MODE_SBM2) ) {
277 272 send_tm_lfr_tc_exe_not_executable( TC, queue_id );
278 273 result = LFR_DEFAULT;
279 274 }
280 275 else {
281 276 send_tm_lfr_tc_exe_not_implemented( TC, queue_id );
282 277 result = LFR_DEFAULT;
283 278 }
284 279 return result;
285 280 }
286 281
287 282 int action_update_time(ccsdsTelecommandPacket_t *TC)
288 283 {
289 284 /** This function executes specific actions when a TC_LFR_UPDATE_TIME TeleCommand has been received.
290 285 *
291 286 * @param TC points to the TeleCommand packet that is being processed
292 287 * @param queue_id is the id of the queue which handles TM transmission by the SpaceWire driver
293 288 *
289 * @return LFR_SUCCESSFUL
290 *
294 291 */
295 292
296 293 unsigned int val;
297 294
298 295 time_management_regs->coarse_time_load = (TC->dataAndCRC[0] << 24)
299 296 + (TC->dataAndCRC[1] << 16)
300 297 + (TC->dataAndCRC[2] << 8)
301 298 + TC->dataAndCRC[3];
302 299 val = housekeeping_packet.hk_lfr_update_time_tc_cnt[0] * 256
303 300 + housekeeping_packet.hk_lfr_update_time_tc_cnt[1];
304 301 val++;
305 302 housekeeping_packet.hk_lfr_update_time_tc_cnt[0] = (unsigned char) (val >> 8);
306 303 housekeeping_packet.hk_lfr_update_time_tc_cnt[1] = (unsigned char) (val);
307 304 time_management_regs->ctrl = time_management_regs->ctrl | 1;
308 305
309 306 return LFR_SUCCESSFUL;
310 307 }
311 308
312 309 //*******************
313 310 // ENTERING THE MODES
314 311
315 312 int transition_validation(unsigned char requestedMode)
316 313 {
317 314 int status;
318 315
319 316 switch (requestedMode)
320 317 {
321 318 case LFR_MODE_STANDBY:
322 319 if ( lfrCurrentMode == LFR_MODE_STANDBY ) {
323 320 status = LFR_DEFAULT;
324 321 }
325 322 else
326 323 {
327 324 status = LFR_SUCCESSFUL;
328 325 }
329 326 break;
330 327 case LFR_MODE_NORMAL:
331 328 if ( lfrCurrentMode == LFR_MODE_NORMAL ) {
332 329 status = LFR_DEFAULT;
333 330 }
334 331 else {
335 332 status = LFR_SUCCESSFUL;
336 333 }
337 334 break;
338 335 case LFR_MODE_BURST:
339 336 if ( lfrCurrentMode == LFR_MODE_BURST ) {
340 337 status = LFR_DEFAULT;
341 338 }
342 339 else {
343 340 status = LFR_SUCCESSFUL;
344 341 }
345 342 break;
346 343 case LFR_MODE_SBM1:
347 344 if ( lfrCurrentMode == LFR_MODE_SBM1 ) {
348 345 status = LFR_DEFAULT;
349 346 }
350 347 else {
351 348 status = LFR_SUCCESSFUL;
352 349 }
353 350 break;
354 351 case LFR_MODE_SBM2:
355 352 if ( lfrCurrentMode == LFR_MODE_SBM2 ) {
356 353 status = LFR_DEFAULT;
357 354 }
358 355 else {
359 356 status = LFR_SUCCESSFUL;
360 357 }
361 358 break;
362 359 default:
363 360 status = LFR_DEFAULT;
364 361 break;
365 362 }
366 363
367 364 return status;
368 365 }
369 366
370 367 int stop_current_mode()
371 368 {
372 369 /** This function stops the current mode by masking interrupt lines and suspending science tasks.
373 370 *
374 371 * @return RTEMS directive status codes:
375 372 * - RTEMS_SUCCESSFUL - task restarted successfully
376 373 * - RTEMS_INVALID_ID - task id invalid
377 374 * - RTEMS_ALREADY_SUSPENDED - task already suspended
378 375 *
379 376 */
380 377
381 378 rtems_status_code status;
382 379
383 380 status = RTEMS_SUCCESSFUL;
384 381
385 382 // mask all IRQ lines related to signal processing
386 383 LEON_Mask_interrupt( IRQ_SM ); // mask spectral matrices interrupt (coming from the timer VHDL IP)
387 384 LEON_Clear_interrupt( IRQ_SM ); // clear spectral matrices interrupt (coming from the timer VHDL IP)
388 385
389 386 #ifdef GSA
390 387 LEON_Mask_interrupt( IRQ_WF ); // mask waveform interrupt (coming from the timer VHDL IP)
391 388 LEON_Clear_interrupt( IRQ_WF ); // clear waveform interrupt (coming from the timer VHDL IP)
392 389 timer_stop( (gptimer_regs_t*) REGS_ADDR_GPTIMER, TIMER_WF_SIMULATOR );
393 390 #else
394 391 LEON_Mask_interrupt( IRQ_WAVEFORM_PICKER ); // mask waveform picker interrupt
395 392 LEON_Clear_interrupt( IRQ_WAVEFORM_PICKER ); // clear waveform picker interrupt
396 393 LEON_Mask_interrupt( IRQ_SPECTRAL_MATRIX ); // mask spectral matrix interrupt
397 394 LEON_Clear_interrupt( IRQ_SPECTRAL_MATRIX ); // clear spectral matrix interrupt
398 395 LEON_Mask_interrupt( IRQ_SM ); // for SM simulation
399 396 LEON_Clear_interrupt( IRQ_SM ); // for SM simulation
400 397 #endif
401 398 //**********************
402 399 // suspend several tasks
403 400 if (lfrCurrentMode != LFR_MODE_STANDBY) {
404 401 status = suspend_science_tasks();
405 402 }
406 403
407 404 if (status != RTEMS_SUCCESSFUL)
408 405 {
409 406 PRINTF1("in stop_current_mode *** in suspend_science_tasks *** ERR code: %d\n", status)
410 407 }
411 408
412 409 //*************************
413 410 // initialize the registers
414 411 #ifdef GSA
415 412 #else
416 413 reset_wfp_burst_enable(); // reset burst and enable bits
417 414 reset_wfp_status(); // reset all the status bits
418 415 #endif
419 416
420 417 return status;
421 418 }
422 419
423 420 int enter_mode(unsigned char mode, ccsdsTelecommandPacket_t *TC )
424 421 {
425 422 rtems_status_code status;
426 423
427 424 status = RTEMS_UNSATISFIED;
428 425
429 426 housekeeping_packet.lfr_status_word[0] = (unsigned char) ((mode << 4) + 0x0d);
430 427 lfrCurrentMode = mode;
431 428
432 429 switch(mode){
433 430 case LFR_MODE_STANDBY:
434 431 status = enter_standby_mode( TC );
435 432 break;
436 433 case LFR_MODE_NORMAL:
437 434 status = enter_normal_mode( TC );
438 435 break;
439 436 case LFR_MODE_BURST:
440 437 status = enter_burst_mode( TC );
441 438 break;
442 439 case LFR_MODE_SBM1:
443 440 status = enter_sbm1_mode( TC );
444 441 break;
445 442 case LFR_MODE_SBM2:
446 443 status = enter_sbm2_mode( TC );
447 444 break;
448 445 default:
449 446 status = RTEMS_UNSATISFIED;
450 447 }
451 448
452 449 if (status != RTEMS_SUCCESSFUL)
453 450 {
454 451 PRINTF("in enter_mode *** ERR\n")
455 452 status = RTEMS_UNSATISFIED;
456 453 }
457 454
458 455 return status;
459 456 }
460 457
461 458 int enter_standby_mode()
462 459 {
463 460 reset_waveform_picker_regs();
464 461
465 462 PRINTF1("maxCount = %d\n", maxCount)
466 463
467 464 #ifdef PRINT_TASK_STATISTICS
468 465 rtems_cpu_usage_report();
469 466 #endif
470 467
471 468 #ifdef PRINT_STACK_REPORT
472 469 rtems_stack_checker_report_usage();
473 470 #endif
474 471
475 472 return LFR_SUCCESSFUL;
476 473 }
477 474
478 475 int enter_normal_mode()
479 476 {
480 477 rtems_status_code status;
481 478
482 479 status = restart_science_tasks();
483 480
484 481 #ifdef GSA
485 482 timer_start( (gptimer_regs_t*) REGS_ADDR_GPTIMER, TIMER_WF_SIMULATOR );
486 483 timer_start( (gptimer_regs_t*) REGS_ADDR_GPTIMER, TIMER_SM_SIMULATOR );
487 484 LEON_Clear_interrupt( IRQ_WF );
488 485 LEON_Unmask_interrupt( IRQ_WF );
489 486 //
490 487 set_local_nb_interrupt_f0_MAX();
491 488 LEON_Clear_interrupt( IRQ_SM ); // the IRQ_SM seems to be incompatible with the IRQ_WF on the xilinx board
492 489 LEON_Unmask_interrupt( IRQ_SM );
493 490 #else
494 491 //****************
495 492 // waveform picker
496 493 LEON_Clear_interrupt( IRQ_WAVEFORM_PICKER );
497 494 LEON_Unmask_interrupt( IRQ_WAVEFORM_PICKER );
498 495 reset_waveform_picker_regs();
499 496 set_wfp_burst_enable_register(LFR_MODE_NORMAL);
500 497 //****************
501 498 // spectral matrix
502 499 // set_local_nb_interrupt_f0_MAX();
503 500 // LEON_Clear_interrupt( IRQ_SPECTRAL_MATRIX ); // the IRQ_SM seems to be incompatible with the IRQ_WF on the xilinx board
504 501 // LEON_Unmask_interrupt( IRQ_SPECTRAL_MATRIX );
505 502 // spectral_matrix_regs->config = 0x01;
506 503 // spectral_matrix_regs->status = 0x00;
507 504 #endif
508 505
509 506 return status;
510 507 }
511 508
512 509 int enter_burst_mode()
513 510 {
514 511 rtems_status_code status;
515 512
516 513 status = restart_science_tasks();
517 514
518 515 #ifdef GSA
519 516 LEON_Unmask_interrupt( IRQ_SM );
520 517 #else
521 518 LEON_Clear_interrupt( IRQ_WAVEFORM_PICKER );
522 519 LEON_Unmask_interrupt( IRQ_WAVEFORM_PICKER );
523 520 reset_waveform_picker_regs();
524 521 set_wfp_burst_enable_register(LFR_MODE_BURST);
525 522 #endif
526 523
527 524 return status;
528 525 }
529 526
530 527 int enter_sbm1_mode()
531 528 {
532 529 rtems_status_code status;
533 530
534 531 status = restart_science_tasks();
535 532
536 533 set_local_sbm1_nb_cwf_max();
537 534
538 535 reset_local_sbm1_nb_cwf_sent();
539 536
540 537 #ifdef GSA
541 538 LEON_Unmask_interrupt( IRQ_SM );
542 539 #else
543 540 LEON_Clear_interrupt( IRQ_WAVEFORM_PICKER );
544 541 LEON_Unmask_interrupt( IRQ_WAVEFORM_PICKER );
545 542 reset_waveform_picker_regs();
546 543 set_wfp_burst_enable_register(LFR_MODE_SBM1);
547 544 // SM simulation
548 545 // timer_start( (gptimer_regs_t*) REGS_ADDR_GPTIMER, TIMER_SM_SIMULATOR );
549 546 // LEON_Clear_interrupt( IRQ_SM ); // the IRQ_SM seems to be incompatible with the IRQ_WF on the xilinx board
550 547 // LEON_Unmask_interrupt( IRQ_SM );
551 548 #endif
552 549
553 550 return status;
554 551 }
555 552
556 553 int enter_sbm2_mode()
557 554 {
558 555 rtems_status_code status;
559 556
560 557 status = restart_science_tasks();
561 558
562 559 set_local_sbm2_nb_cwf_max();
563 560
564 561 reset_local_sbm2_nb_cwf_sent();
565 562
566 563 #ifdef GSA
567 564 LEON_Unmask_interrupt( IRQ_SM );
568 565 #else
569 566 LEON_Clear_interrupt( IRQ_WAVEFORM_PICKER );
570 567 LEON_Unmask_interrupt( IRQ_WAVEFORM_PICKER );
571 568 reset_waveform_picker_regs();
572 569 set_wfp_burst_enable_register(LFR_MODE_SBM2);
573 570 #endif
574 571
575 572 return status;
576 573 }
577 574
578 575 int restart_science_tasks()
579 576 {
580 577 rtems_status_code status[6];
581 578 rtems_status_code ret;
582 579
583 580 ret = RTEMS_SUCCESSFUL;
584 581
585 582 status[0] = rtems_task_restart( Task_id[TASKID_AVF0], 1 );
586 583 if (status[0] != RTEMS_SUCCESSFUL)
587 584 {
588 585 PRINTF1("in restart_science_task *** 0 ERR %d\n", status[0])
589 586 }
590 587
591 588 status[1] = rtems_task_restart( Task_id[TASKID_BPF0],1 );
592 589 if (status[1] != RTEMS_SUCCESSFUL)
593 590 {
594 591 PRINTF1("in restart_science_task *** 1 ERR %d\n", status[1])
595 592 }
596 593
597 594 status[2] = rtems_task_restart( Task_id[TASKID_WFRM],1 );
598 595 if (status[2] != RTEMS_SUCCESSFUL)
599 596 {
600 597 PRINTF1("in restart_science_task *** 2 ERR %d\n", status[2])
601 598 }
602 599
603 600 status[3] = rtems_task_restart( Task_id[TASKID_CWF3],1 );
604 601 if (status[3] != RTEMS_SUCCESSFUL)
605 602 {
606 603 PRINTF1("in restart_science_task *** 3 ERR %d\n", status[3])
607 604 }
608 605
609 606 status[4] = rtems_task_restart( Task_id[TASKID_CWF2],1 );
610 607 if (status[4] != RTEMS_SUCCESSFUL)
611 608 {
612 609 PRINTF1("in restart_science_task *** 4 ERR %d\n", status[4])
613 610 }
614 611
615 612 status[5] = rtems_task_restart( Task_id[TASKID_CWF1],1 );
616 613 if (status[5] != RTEMS_SUCCESSFUL)
617 614 {
618 615 PRINTF1("in restart_science_task *** 5 ERR %d\n", status[5])
619 616 }
620 617
621 618 if ( (status[0] != RTEMS_SUCCESSFUL) || (status[1] != RTEMS_SUCCESSFUL) || (status[2] != RTEMS_SUCCESSFUL) ||
622 619 (status[3] != RTEMS_SUCCESSFUL) || (status[4] != RTEMS_SUCCESSFUL) || (status[5] != RTEMS_SUCCESSFUL) )
623 620 {
624 621 ret = RTEMS_UNSATISFIED;
625 622 }
626 623
627 624 return ret;
628 625 }
629 626
630 627 int suspend_science_tasks()
631 628 {
632 629 /** This function suspends the science tasks.
633 630 *
634 631 * @return RTEMS directive status codes:
635 632 * - RTEMS_SUCCESSFUL - task restarted successfully
636 633 * - RTEMS_INVALID_ID - task id invalid
637 634 * - RTEMS_ALREADY_SUSPENDED - task already suspended
638 635 *
639 636 */
640 637
641 638 rtems_status_code status;
642 639
643 640 status = rtems_task_suspend( Task_id[TASKID_AVF0] );
644 641 if (status != RTEMS_SUCCESSFUL)
645 642 {
646 643 PRINTF1("in suspend_science_task *** AVF0 ERR %d\n", status)
647 644 }
648 645 if (status == RTEMS_SUCCESSFUL) // suspend BPF0
649 646 {
650 647 status = rtems_task_suspend( Task_id[TASKID_BPF0] );
651 648 if (status != RTEMS_SUCCESSFUL)
652 649 {
653 650 PRINTF1("in suspend_science_task *** BPF0 ERR %d\n", status)
654 651 }
655 652 }
656 653 if (status == RTEMS_SUCCESSFUL) // suspend WFRM
657 654 {
658 655 status = rtems_task_suspend( Task_id[TASKID_WFRM] );
659 656 if (status != RTEMS_SUCCESSFUL)
660 657 {
661 658 PRINTF1("in suspend_science_task *** WFRM ERR %d\n", status)
662 659 }
663 660 }
664 661
665 662 if (status == RTEMS_SUCCESSFUL) // suspend CWF3
666 663 {
667 664 status = rtems_task_suspend( Task_id[TASKID_CWF3] );
668 665 if (status != RTEMS_SUCCESSFUL)
669 666 {
670 667 PRINTF1("in suspend_science_task *** CWF3 ERR %d\n", status)
671 668 }
672 669 }
673 670 if (status == RTEMS_SUCCESSFUL) // suspend CWF2
674 671 {
675 672 status = rtems_task_suspend( Task_id[TASKID_CWF2] );
676 673 if (status != RTEMS_SUCCESSFUL)
677 674 {
678 675 PRINTF1("in suspend_science_task *** CWF2 ERR %d\n", status)
679 676 }
680 677 }
681 678 if (status == RTEMS_SUCCESSFUL) // suspend CWF1
682 679 {
683 680 status = rtems_task_suspend( Task_id[TASKID_CWF1] );
684 681 if (status != RTEMS_SUCCESSFUL)
685 682 {
686 683 PRINTF1("in suspend_science_task *** CWF1 ERR %d\n", status)
687 684 }
688 685 }
689 686
690 687 return status;
691 688 }
692 689
693 690 //****************
694 691 // CLOSING ACTIONS
695 692 void update_last_TC_exe(ccsdsTelecommandPacket_t *TC)
696 693 {
697 694 housekeeping_packet.hk_lfr_last_exe_tc_id[0] = TC->packetID[0];
698 695 housekeeping_packet.hk_lfr_last_exe_tc_id[1] = TC->packetID[1];
699 696 housekeeping_packet.hk_lfr_last_exe_tc_type[0] = 0x00;
700 697 housekeeping_packet.hk_lfr_last_exe_tc_type[1] = TC->serviceType;
701 698 housekeeping_packet.hk_lfr_last_exe_tc_subtype[0] = 0x00;
702 699 housekeeping_packet.hk_lfr_last_exe_tc_subtype[1] = TC->serviceSubType;
703 700 housekeeping_packet.hk_lfr_last_exe_tc_time[0] = (unsigned char) (time_management_regs->coarse_time>>24);
704 701 housekeeping_packet.hk_lfr_last_exe_tc_time[1] = (unsigned char) (time_management_regs->coarse_time>>16);
705 702 housekeeping_packet.hk_lfr_last_exe_tc_time[2] = (unsigned char) (time_management_regs->coarse_time>>8);
706 703 housekeeping_packet.hk_lfr_last_exe_tc_time[3] = (unsigned char) (time_management_regs->coarse_time);
707 704 housekeeping_packet.hk_lfr_last_exe_tc_time[4] = (unsigned char) (time_management_regs->fine_time>>8);
708 705 housekeeping_packet.hk_lfr_last_exe_tc_time[5] = (unsigned char) (time_management_regs->fine_time);
709 706 }
710 707
711 708 void update_last_TC_rej(ccsdsTelecommandPacket_t *TC)
712 709 {
713 710 housekeeping_packet.hk_lfr_last_rej_tc_id[0] = TC->packetID[0];
714 711 housekeeping_packet.hk_lfr_last_rej_tc_id[1] = TC->packetID[1];
715 712 housekeeping_packet.hk_lfr_last_rej_tc_type[0] = 0x00;
716 713 housekeeping_packet.hk_lfr_last_rej_tc_type[1] = TC->serviceType;
717 714 housekeeping_packet.hk_lfr_last_rej_tc_subtype[0] = 0x00;
718 715 housekeeping_packet.hk_lfr_last_rej_tc_subtype[1] = TC->serviceSubType;
719 716 housekeeping_packet.hk_lfr_last_rej_tc_time[0] = (unsigned char) (time_management_regs->coarse_time>>24);
720 717 housekeeping_packet.hk_lfr_last_rej_tc_time[1] = (unsigned char) (time_management_regs->coarse_time>>16);
721 718 housekeeping_packet.hk_lfr_last_rej_tc_time[2] = (unsigned char) (time_management_regs->coarse_time>>8);
722 719 housekeeping_packet.hk_lfr_last_rej_tc_time[3] = (unsigned char) (time_management_regs->coarse_time);
723 720 housekeeping_packet.hk_lfr_last_rej_tc_time[4] = (unsigned char) (time_management_regs->fine_time>>8);
724 721 housekeeping_packet.hk_lfr_last_rej_tc_time[5] = (unsigned char) (time_management_regs->fine_time);
725 722 }
726 723
727 724 void close_action(ccsdsTelecommandPacket_t *TC, int result, rtems_id queue_id)
728 725 {
729 726 unsigned int val = 0;
730 727 if (result == LFR_SUCCESSFUL)
731 728 {
732 if ( !( (TC->serviceType==TC_TYPE_TIME) && (TC->serviceSubType==TC_SUBTYPE_UPDT_TIME) ) )
729 if ( !( (TC->serviceType==TC_TYPE_TIME) && (TC->serviceSubType==TC_SUBTYPE_UPDT_TIME) )
730 &&
731 !( (TC->serviceType==TC_TYPE_GEN) && (TC->serviceSubType==TC_SUBTYPE_UPDT_INFO))
732 )
733 733 {
734 734 send_tm_lfr_tc_exe_success( TC, queue_id );
735 735 }
736 736 update_last_TC_exe( TC );
737 737 val = housekeeping_packet.hk_dpu_exe_tc_lfr_cnt[0] * 256 + housekeeping_packet.hk_dpu_exe_tc_lfr_cnt[1];
738 738 val++;
739 739 housekeeping_packet.hk_dpu_exe_tc_lfr_cnt[0] = (unsigned char) (val >> 8);
740 740 housekeeping_packet.hk_dpu_exe_tc_lfr_cnt[1] = (unsigned char) (val);
741 741 }
742 742 else
743 743 {
744 744 update_last_TC_rej( TC );
745 745 val = housekeeping_packet.hk_dpu_rej_tc_lfr_cnt[0] * 256 + housekeeping_packet.hk_dpu_rej_tc_lfr_cnt[1];
746 746 val++;
747 747 housekeeping_packet.hk_dpu_rej_tc_lfr_cnt[0] = (unsigned char) (val >> 8);
748 748 housekeeping_packet.hk_dpu_rej_tc_lfr_cnt[1] = (unsigned char) (val);
749 749 }
750 750 }
751 751
752 752 //***************************
753 753 // Interrupt Service Routines
754 754 rtems_isr commutation_isr1( rtems_vector_number vector )
755 755 {
756 756 if (rtems_event_send( Task_id[TASKID_DUMB], RTEMS_EVENT_0 ) != RTEMS_SUCCESSFUL) {
757 757 printf("In commutation_isr1 *** Error sending event to DUMB\n");
758 758 }
759 759 }
760 760
761 761 rtems_isr commutation_isr2( rtems_vector_number vector )
762 762 {
763 763 if (rtems_event_send( Task_id[TASKID_DUMB], RTEMS_EVENT_0 ) != RTEMS_SUCCESSFUL) {
764 764 printf("In commutation_isr2 *** Error sending event to DUMB\n");
765 765 }
766 766 }
767 767
768 768 //****************
769 769 // OTHER FUNCTIONS
770 770 void updateLFRCurrentMode()
771 771 {
772 772 /** This function updates the value of the global variable lfrCurrentMode.
773 773 *
774 774 * lfrCurrentMode is a parameter used by several functions to know in which mode LFR is running.
775 775 *
776 776 */
777 777 // update the local value of lfrCurrentMode with the value contained in the housekeeping_packet structure
778 778 lfrCurrentMode = (housekeeping_packet.lfr_status_word[0] & 0xf0) >> 4;
779 779 }
780 780
@@ -1,380 +1,448
1 1 /** Functions to load and dump parameters in the LFR registers.
2 2 *
3 3 * @file
4 4 * @author P. LEROY
5 5 *
6 6 * A group of functions to handle TC related to parameter loading and dumping.\n
7 7 * TC_LFR_LOAD_COMMON_PAR\n
8 8 * TC_LFR_LOAD_NORMAL_PAR\n
9 9 * TC_LFR_LOAD_BURST_PAR\n
10 10 * TC_LFR_LOAD_SBM1_PAR\n
11 11 * TC_LFR_LOAD_SBM2_PAR\n
12 12 *
13 13 */
14 14
15 15 #include "tc_load_dump_parameters.h"
16 16
17 17 int action_load_common_par(ccsdsTelecommandPacket_t *TC)
18 18 {
19 19 /** This function updates the LFR registers with the incoming common parameters.
20 20 *
21 21 * @param TC points to the TeleCommand packet that is being processed
22 22 *
23 23 *
24 24 */
25 25
26 26 parameter_dump_packet.unused0 = TC->dataAndCRC[0];
27 27 parameter_dump_packet.bw_sp0_sp1_r0_r1 = TC->dataAndCRC[1];
28 28 set_wfp_data_shaping(parameter_dump_packet.bw_sp0_sp1_r0_r1);
29 29 return LFR_SUCCESSFUL;
30 30 }
31 31
32 32 int action_load_normal_par(ccsdsTelecommandPacket_t *TC, rtems_id queue_id)
33 33 {
34 34 /** This function updates the LFR registers with the incoming normal parameters.
35 35 *
36 36 * @param TC points to the TeleCommand packet that is being processed
37 37 * @param queue_id is the id of the queue which handles TM related to this execution step
38 38 *
39 39 */
40 40
41 41 int result;
42 42 int flag;
43 43
44 44 flag = LFR_SUCCESSFUL;
45 45 result = LFR_SUCCESSFUL;
46 46
47 47 if ( lfrCurrentMode == LFR_MODE_NORMAL ) {
48 48 send_tm_lfr_tc_exe_not_executable( TC, queue_id );
49 49 flag = LFR_DEFAULT;
50 50 }
51 51
52 52 //***************
53 53 // sy_lfr_n_swf_l
54 54 if (flag == LFR_SUCCESSFUL)
55 55 {
56 56 result = set_sy_lfr_n_swf_l( TC, queue_id );
57 57 if (result != LFR_SUCCESSFUL)
58 58 {
59 59 flag = LFR_DEFAULT;
60 60 }
61 61 }
62 62
63 63 //***************
64 64 // sy_lfr_n_swf_p
65 65 if (flag == LFR_SUCCESSFUL)
66 66 {
67 67 result = set_sy_lfr_n_swf_p( TC, queue_id );
68 68 if (result != LFR_SUCCESSFUL)
69 69 {
70 70 flag = LFR_DEFAULT;
71 71 }
72 72 }
73 73
74 74 //***************
75 // sy_lfr_n_asm_p
75 // SY_LFR_N_ASM_P
76 76 if (flag == LFR_SUCCESSFUL)
77 77 {
78 78 result = set_sy_lfr_n_asm_p( TC, queue_id );
79 79 if (result != LFR_SUCCESSFUL)
80 80 {
81 81 flag = LFR_DEFAULT;
82 82 }
83 83 }
84 84
85 85 //***************
86 // sy_lfr_n_bp_p0
86 // SY_LFR_N_BP_P0
87 87 if (flag == LFR_SUCCESSFUL)
88 88 {
89 89 result = set_sy_lfr_n_bp_p0( TC, queue_id );
90 90 if (result != LFR_SUCCESSFUL)
91 91 {
92 92 flag = LFR_DEFAULT;
93 93 }
94 94 }
95 95
96 96 //***************
97 97 // sy_lfr_n_bp_p1
98 98 if (flag == LFR_SUCCESSFUL)
99 99 {
100 100 result = set_sy_lfr_n_bp_p1( TC, queue_id );
101 101 if (result != LFR_SUCCESSFUL)
102 102 {
103 103 flag = LFR_DEFAULT;
104 104 }
105 105 }
106 106
107 107 return result;
108 108 }
109 109
110 110 int action_load_burst_par(ccsdsTelecommandPacket_t *TC, rtems_id queue_id)
111 111 {
112 112 /** This function updates the LFR registers with the incoming burst parameters.
113 113 *
114 114 * @param TC points to the TeleCommand packet that is being processed
115 115 * @param queue_id is the id of the queue which handles TM related to this execution step
116 116 *
117 117 */
118 118
119 119 int result;
120 120 unsigned char lfrMode;
121 121
122 122 result = LFR_DEFAULT;
123 123 lfrMode = (housekeeping_packet.lfr_status_word[0] & 0xf0) >> 4;
124 124
125 125 if ( lfrMode == LFR_MODE_BURST ) {
126 126 send_tm_lfr_tc_exe_not_executable( TC, queue_id );
127 127 result = LFR_DEFAULT;
128 128 }
129 129 else {
130 130 parameter_dump_packet.sy_lfr_b_bp_p0 = TC->dataAndCRC[0];
131 131 parameter_dump_packet.sy_lfr_b_bp_p1 = TC->dataAndCRC[1];
132 132
133 133 result = LFR_SUCCESSFUL;
134 134 }
135 135
136 136 return result;
137 137 }
138 138
139 139 int action_load_sbm1_par(ccsdsTelecommandPacket_t *TC, rtems_id queue_id)
140 140 {
141 141 /** This function updates the LFR registers with the incoming sbm1 parameters.
142 142 *
143 143 * @param TC points to the TeleCommand packet that is being processed
144 144 * @param queue_id is the id of the queue which handles TM related to this execution step
145 145 *
146 146 */
147 147 int result;
148 148 unsigned char lfrMode;
149 149
150 150 result = LFR_DEFAULT;
151 151 lfrMode = (housekeeping_packet.lfr_status_word[0] & 0xf0) >> 4;
152 152
153 153 if ( lfrMode == LFR_MODE_SBM1 ) {
154 154 send_tm_lfr_tc_exe_not_executable( TC, queue_id );
155 155 result = LFR_DEFAULT;
156 156 }
157 157 else {
158 158 parameter_dump_packet.sy_lfr_s1_bp_p0 = TC->dataAndCRC[0];
159 159 parameter_dump_packet.sy_lfr_s1_bp_p1 = TC->dataAndCRC[1];
160 160
161 161 result = LFR_SUCCESSFUL;
162 162 }
163 163
164 164 return result;
165 165 }
166 166
167 167 int action_load_sbm2_par(ccsdsTelecommandPacket_t *TC, rtems_id queue_id)
168 168 {
169 169 /** This function updates the LFR registers with the incoming sbm2 parameters.
170 170 *
171 171 * @param TC points to the TeleCommand packet that is being processed
172 172 * @param queue_id is the id of the queue which handles TM related to this execution step
173 173 *
174 174 */
175 175
176 176 int result;
177 177 unsigned char lfrMode;
178 178
179 179 result = LFR_DEFAULT;
180 180 lfrMode = (housekeeping_packet.lfr_status_word[0] & 0xf0) >> 4;
181 181
182 182 if ( lfrMode == LFR_MODE_SBM2 ) {
183 183 send_tm_lfr_tc_exe_not_executable( TC, queue_id );
184 184 result = LFR_DEFAULT;
185 185 }
186 186 else {
187 187 parameter_dump_packet.sy_lfr_s2_bp_p0 = TC->dataAndCRC[0];
188 188 parameter_dump_packet.sy_lfr_s2_bp_p1 = TC->dataAndCRC[1];
189 189
190 190 result = LFR_SUCCESSFUL;
191 191 }
192 192
193 193 return result;
194 194 }
195 195
196 196 int action_dump_par( rtems_id queue_id )
197 197 {
198 198 /** This function dumps the LFR parameters by sending the appropriate TM packet to the dedicated RTEMS message queue.
199 199 *
200 200 * @param queue_id is the id of the queue which handles TM related to this execution step.
201 201 *
202 202 * @return RTEMS directive status codes:
203 203 * - RTEMS_SUCCESSFUL - message sent successfully
204 204 * - RTEMS_INVALID_ID - invalid queue id
205 205 * - RTEMS_INVALID_SIZE - invalid message size
206 206 * - RTEMS_INVALID_ADDRESS - buffer is NULL
207 207 * - RTEMS_UNSATISFIED - out of message buffers
208 208 * - RTEMS_TOO_MANY - queue s limit has been reached
209 209 *
210 210 */
211 211
212 212 int status;
213 213
214 // UPDATE TIME
215 parameter_dump_packet.time[0] = (unsigned char) (time_management_regs->coarse_time>>24);
216 parameter_dump_packet.time[1] = (unsigned char) (time_management_regs->coarse_time>>16);
217 parameter_dump_packet.time[2] = (unsigned char) (time_management_regs->coarse_time>>8);
218 parameter_dump_packet.time[3] = (unsigned char) (time_management_regs->coarse_time);
219 parameter_dump_packet.time[4] = (unsigned char) (time_management_regs->fine_time>>8);
220 parameter_dump_packet.time[5] = (unsigned char) (time_management_regs->fine_time);
214 221 // SEND DATA
215 222 status = rtems_message_queue_send( queue_id, &parameter_dump_packet,
216 223 PACKET_LENGTH_PARAMETER_DUMP + CCSDS_TC_TM_PACKET_OFFSET + CCSDS_PROTOCOLE_EXTRA_BYTES);
217 224 if (status != RTEMS_SUCCESSFUL) {
218 225 PRINTF1("in action_dump *** ERR sending packet, code %d", status)
219 226 }
220 227
221 228 return status;
222 229 }
223 230
224 231 //***********************
225 232 // NORMAL MODE PARAMETERS
226 233
227 234 int set_sy_lfr_n_swf_l( ccsdsTelecommandPacket_t *TC, rtems_id queue_id )
228 235 {
229 236 /** This function sets the number of points of a snapshot (sy_lfr_n_swf_l).
230 237 *
231 238 * @param TC points to the TeleCommand packet that is being processed
232 239 * @param queue_id is the id of the queue which handles TM related to this execution step
233 240 *
234 241 */
235 242
236 243 unsigned int tmp;
237 244 int result;
238 245 unsigned char msb;
239 246 unsigned char lsb;
240 247
241 248 msb = TC->dataAndCRC[ BYTE_POS_SY_LFR_N_SWF_L ];
242 249 lsb = TC->dataAndCRC[ BYTE_POS_SY_LFR_N_SWF_L+1 ];
243 250
244 251 tmp = ( unsigned int ) floor(
245 252 ( ( msb*256 ) + lsb ) / 16
246 253 ) * 16;
247 254
248 255 if ( (tmp < 16) || (tmp > 2048) ) // the snapshot period is a multiple of 16
249 256 { // 2048 is the maximum limit due to thesize of the buffers
250 257 send_tm_lfr_tc_exe_inconsistent( TC, queue_id, BYTE_POS_SY_LFR_N_SWF_L+10, lsb );
251 258 result = WRONG_APP_DATA;
252 259 }
253 260 else if (tmp != 2048)
254 261 {
255 262 send_tm_lfr_tc_exe_not_implemented( TC, queue_id );
256 263 result = FUNCT_NOT_IMPL;
257 264 }
258 265 else
259 266 {
260 267 parameter_dump_packet.sy_lfr_n_swf_l[0] = (unsigned char) (tmp >> 8);
261 268 parameter_dump_packet.sy_lfr_n_swf_l[1] = (unsigned char) (tmp );
262 269 result = LFR_SUCCESSFUL;
263 270 }
264 271
265 272 return result;
266 273 }
267 274
268 275 int set_sy_lfr_n_swf_p( ccsdsTelecommandPacket_t *TC, rtems_id queue_id )
269 276 {
270 277 /** This function sets the time between two snapshots, in s (sy_lfr_n_swf_p).
271 278 *
272 279 * @param TC points to the TeleCommand packet that is being processed
273 280 * @param queue_id is the id of the queue which handles TM related to this execution step
274 281 *
275 282 */
276 283
277 284 unsigned int tmp;
278 285 int result;
279 286 unsigned char msb;
280 287 unsigned char lsb;
281 288
282 289 msb = TC->dataAndCRC[ BYTE_POS_SY_LFR_N_SWF_P ];
283 290 lsb = TC->dataAndCRC[ BYTE_POS_SY_LFR_N_SWF_P+1 ];
284 291
285 292 tmp = ( unsigned int ) floor(
286 293 ( ( msb*256 ) + lsb ) / 8
287 294 ) * 8;
288 295
289 296 if ( (tmp < 16) || (tmp > 65528) )
290 297 {
291 298 send_tm_lfr_tc_exe_inconsistent( TC, queue_id, BYTE_POS_SY_LFR_N_SWF_P+10, lsb );
292 299 result = WRONG_APP_DATA;
293 300 }
294 301 else
295 302 {
296 303 parameter_dump_packet.sy_lfr_n_swf_p[0] = (unsigned char) (tmp >> 8);
297 304 parameter_dump_packet.sy_lfr_n_swf_p[1] = (unsigned char) (tmp );
298 305 result = LFR_SUCCESSFUL;
299 306 }
300 307
301 308 return result;
302 309 }
303 310
304 311 int set_sy_lfr_n_asm_p( ccsdsTelecommandPacket_t *TC, rtems_id queue_id )
305 312 {
306 /** This function sets the time between two full spectral matrices transmission, in s (sy_lfr_n_asm_p).
313 /** This function sets the time between two full spectral matrices transmission, in s (SY_LFR_N_ASM_P).
307 314 *
308 315 * @param TC points to the TeleCommand packet that is being processed
309 316 * @param queue_id is the id of the queue which handles TM related to this execution step
310 317 *
311 318 */
312 319
313 320 int result;
314 321 unsigned char msb;
315 322 unsigned char lsb;
316 323
317 324 msb = TC->dataAndCRC[ BYTE_POS_SY_LFR_N_ASM_P ];
318 325 lsb = TC->dataAndCRC[ BYTE_POS_SY_LFR_N_ASM_P+1 ];
319 326
320 327 parameter_dump_packet.sy_lfr_n_asm_p[0] = msb;
321 328 parameter_dump_packet.sy_lfr_n_asm_p[1] = lsb;
322 329 result = LFR_SUCCESSFUL;
323 330
324 331 return result;
325 332 }
326 333
327 334 int set_sy_lfr_n_bp_p0( ccsdsTelecommandPacket_t *TC, rtems_id queue_id )
328 335 {
329 /** This function sets the time between two basic parameter sets, in s (sy_lfr_n_bp_p0).
336 /** This function sets the time between two basic parameter sets, in s (SY_LFR_N_BP_P0).
330 337 *
331 338 * @param TC points to the TeleCommand packet that is being processed
332 339 * @param queue_id is the id of the queue which handles TM related to this execution step
333 340 *
334 341 */
335 342
336 343 int status;
337 344
338 345 status = LFR_SUCCESSFUL;
339 346
340 347 parameter_dump_packet.sy_lfr_n_bp_p0 = TC->dataAndCRC[ BYTE_POS_SY_LFR_N_BP_P0 ];
341 348
342 349 return status;
343 350 }
344 351
345 352 int set_sy_lfr_n_bp_p1(ccsdsTelecommandPacket_t *TC, rtems_id queue_id)
346 353 {
347 354 /** This function sets the time between two basic parameter sets (autocorrelation + crosscorrelation), in s (sy_lfr_n_bp_p1).
348 355 *
349 356 * @param TC points to the TeleCommand packet that is being processed
350 357 * @param queue_id is the id of the queue which handles TM related to this execution step
351 358 *
352 359 */
353 360
354 361 int status;
355 362
356 363 status = LFR_SUCCESSFUL;
357 364
358 365 parameter_dump_packet.sy_lfr_n_bp_p1 = TC->dataAndCRC[ BYTE_POS_SY_LFR_N_BP_P1 ];
359 366
360 367 return status;
361 368 }
362 369
363 370 //**********************
364 371 // BURST MODE PARAMETERS
365 372
366 373 //*********************
367 374 // SBM1 MODE PARAMETERS
368 375
369 376 //*********************
370 377 // SBM2 MODE PARAMETERS
371 378
379 //**********
380 // init dump
381
382 void init_parameter_dump( void )
383 {
384 /** This function initialize the parameter_dump_packet global variable with default values.
385 *
386 */
387
388 parameter_dump_packet.targetLogicalAddress = CCSDS_DESTINATION_ID;
389 parameter_dump_packet.protocolIdentifier = CCSDS_PROTOCOLE_ID;
390 parameter_dump_packet.reserved = CCSDS_RESERVED;
391 parameter_dump_packet.userApplication = CCSDS_USER_APP;
392 parameter_dump_packet.packetID[0] = (unsigned char) (TM_PACKET_ID_PARAMETER_DUMP >> 8);
393 parameter_dump_packet.packetID[1] = (unsigned char) TM_PACKET_ID_PARAMETER_DUMP;
394 parameter_dump_packet.packetSequenceControl[0] = TM_PACKET_SEQ_CTRL_STANDALONE;
395 parameter_dump_packet.packetSequenceControl[1] = TM_PACKET_SEQ_CNT_DEFAULT;
396 parameter_dump_packet.packetLength[0] = (unsigned char) (PACKET_LENGTH_PARAMETER_DUMP >> 8);
397 parameter_dump_packet.packetLength[1] = (unsigned char) PACKET_LENGTH_PARAMETER_DUMP;
398 // DATA FIELD HEADER
399 parameter_dump_packet.spare1_pusVersion_spare2 = SPARE1_PUSVERSION_SPARE2;
400 parameter_dump_packet.serviceType = TM_TYPE_PARAMETER_DUMP;
401 parameter_dump_packet.serviceSubType = TM_SUBTYPE_PARAMETER_DUMP;
402 parameter_dump_packet.destinationID = TM_DESTINATION_ID_GROUND;
403 parameter_dump_packet.time[0] = (unsigned char) (time_management_regs->coarse_time>>24);
404 parameter_dump_packet.time[1] = (unsigned char) (time_management_regs->coarse_time>>16);
405 parameter_dump_packet.time[2] = (unsigned char) (time_management_regs->coarse_time>>8);
406 parameter_dump_packet.time[3] = (unsigned char) (time_management_regs->coarse_time);
407 parameter_dump_packet.time[4] = (unsigned char) (time_management_regs->fine_time>>8);
408 parameter_dump_packet.time[5] = (unsigned char) (time_management_regs->fine_time);
409 parameter_dump_packet.sid = SID_PARAMETER_DUMP;
410
411 //******************
412 // COMMON PARAMETERS
413 parameter_dump_packet.unused0 = DEFAULT_SY_LFR_COMMON0;
414 parameter_dump_packet.bw_sp0_sp1_r0_r1 = DEFAULT_SY_LFR_COMMON1;
415
416 //******************
417 // NORMAL PARAMETERS
418 parameter_dump_packet.sy_lfr_n_swf_l[0] = (unsigned char) (SY_LFR_N_SWF_L >> 8);
419 parameter_dump_packet.sy_lfr_n_swf_l[1] = (unsigned char) (SY_LFR_N_SWF_L );
420 parameter_dump_packet.sy_lfr_n_swf_p[0] = (unsigned char) (SY_LFR_N_SWF_P >> 8);
421 parameter_dump_packet.sy_lfr_n_swf_p[1] = (unsigned char) (SY_LFR_N_SWF_P );
422 parameter_dump_packet.sy_lfr_n_asm_p[0] = (unsigned char) (SY_LFR_N_ASM_P >> 8);
423 parameter_dump_packet.sy_lfr_n_asm_p[1] = (unsigned char) (SY_LFR_N_ASM_P );
424 parameter_dump_packet.sy_lfr_n_bp_p0 = (unsigned char) SY_LFR_N_BP_P0;
425 parameter_dump_packet.sy_lfr_n_bp_p1 = (unsigned char) SY_LFR_N_BP_P1;
426
427 //*****************
428 // BURST PARAMETERS
429 parameter_dump_packet.sy_lfr_b_bp_p0 = (unsigned char) DEFAULT_SY_LFR_B_BP_P0;
430 parameter_dump_packet.sy_lfr_b_bp_p1 = (unsigned char) DEFAULT_SY_LFR_B_BP_P1;
431
432 //****************
433 // SBM1 PARAMETERS
434 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
435 parameter_dump_packet.sy_lfr_s1_bp_p1 = (unsigned char) DEFAULT_SY_LFR_S1_BP_P1;
436
437 //****************
438 // SBM2 PARAMETERS
439 parameter_dump_packet.sy_lfr_s2_bp_p0 = (unsigned char) DEFAULT_SY_LFR_S2_BP_P0;
440 parameter_dump_packet.sy_lfr_s2_bp_p1 = (unsigned char) DEFAULT_SY_LFR_S2_BP_P1;
441 }
372 442
373 443
374 444
375 445
376 446
377 447
378 448
379
380
@@ -1,419 +1,419
1 1 /** Functions to send TM packets related to TC parsing and execution.
2 2 *
3 3 * @file
4 4 * @author P. LEROY
5 5 *
6 6 * A group of functions to send appropriate TM packets after parsing and execution:
7 7 * - TM_LFR_TC_EXE_SUCCESS
8 8 * - TM_LFR_TC_EXE_INCONSISTENT
9 9 * - TM_LFR_TC_EXE_NOT_EXECUTABLE
10 10 * - TM_LFR_TC_EXE_NOT_IMPLEMENTED
11 11 * - TM_LFR_TC_EXE_ERROR
12 12 * - TM_LFR_TC_EXE_CORRUPTED
13 13 *
14 14 */
15 15
16 16 #include "tm_lfr_tc_exe.h"
17 17
18 18 int send_tm_lfr_tc_exe_success( ccsdsTelecommandPacket_t *TC, rtems_id queue_id )
19 19 {
20 20 /** This function sends a TM_LFR_TC_EXE_SUCCESS packet in the dedicated RTEMS message queue.
21 21 *
22 22 * @param TC points to the TeleCommand packet that is being processed
23 23 * @param queue_id is the id of the queue which handles TM
24 24 *
25 25 * @return RTEMS directive status code:
26 26 * - RTEMS_SUCCESSFUL - message sent successfully
27 27 * - RTEMS_INVALID_ID - invalid queue id
28 28 * - RTEMS_INVALID_SIZE - invalid message size
29 29 * - RTEMS_INVALID_ADDRESS - buffer is NULL
30 30 * - RTEMS_UNSATISFIED - out of message buffers
31 * - RTEMS_TOO_MANY - queue’s limit has been reached
31 * - RTEMS_TOO_MANY - queue s limit has been reached
32 32 *
33 33 */
34 34
35 35 rtems_status_code status;
36 36 Packet_TM_LFR_TC_EXE_SUCCESS_t TM;
37 37 unsigned char messageSize;
38 38
39 39 TM.targetLogicalAddress = CCSDS_DESTINATION_ID;
40 40 TM.protocolIdentifier = CCSDS_PROTOCOLE_ID;
41 41 TM.reserved = DEFAULT_RESERVED;
42 42 TM.userApplication = CCSDS_USER_APP;
43 43 // PACKET HEADER
44 44 TM.packetID[0] = (unsigned char) (TM_PACKET_ID_TC_EXE >> 8);
45 45 TM.packetID[1] = (unsigned char) (TM_PACKET_ID_TC_EXE );
46 TM.packetSequenceControl[0] = (TM_PACKET_SEQ_CTRL_STANDALONE >> 8);
47 TM.packetSequenceControl[1] = (TM_PACKET_SEQ_CTRL_STANDALONE );
46 TM.packetSequenceControl[0] = TM_PACKET_SEQ_CTRL_STANDALONE;
47 TM.packetSequenceControl[1] = TM_PACKET_SEQ_CNT_DEFAULT;
48 48 TM.packetLength[0] = (unsigned char) (PACKET_LENGTH_TC_EXE_SUCCESS >> 8);
49 49 TM.packetLength[1] = (unsigned char) (PACKET_LENGTH_TC_EXE_SUCCESS );
50 50 // DATA FIELD HEADER
51 51 TM.spare1_pusVersion_spare2 = DEFAULT_SPARE1_PUSVERSION_SPARE2;
52 52 TM.serviceType = TM_TYPE_TC_EXE;
53 53 TM.serviceSubType = TM_SUBTYPE_EXE_OK;
54 54 TM.destinationID = TM_DESTINATION_ID_GROUND; // default destination id
55 55 TM.time[0] = (unsigned char) (time_management_regs->coarse_time>>24);
56 56 TM.time[1] = (unsigned char) (time_management_regs->coarse_time>>16);
57 57 TM.time[2] = (unsigned char) (time_management_regs->coarse_time>>8);
58 58 TM.time[3] = (unsigned char) (time_management_regs->coarse_time);
59 59 TM.time[4] = (unsigned char) (time_management_regs->fine_time>>8);
60 60 TM.time[5] = (unsigned char) (time_management_regs->fine_time);
61 61 //
62 62 TM.telecommand_pkt_id[0] = TC->packetID[0];
63 63 TM.telecommand_pkt_id[1] = TC->packetID[1];
64 64 TM.pkt_seq_control[0] = TC->packetSequenceControl[0];
65 65 TM.pkt_seq_control[1] = TC->packetSequenceControl[1];
66 66
67 67 messageSize = PACKET_LENGTH_TC_EXE_SUCCESS + CCSDS_TC_TM_PACKET_OFFSET + CCSDS_PROTOCOLE_EXTRA_BYTES;
68 68
69 69 // SEND DATA
70 70 status = rtems_message_queue_urgent( queue_id, &TM, messageSize);
71 71 if (status != RTEMS_SUCCESSFUL) {
72 72 PRINTF("in send_tm_lfr_tc_exe_success *** ERR\n")
73 73 }
74 74
75 75 return status;
76 76 }
77 77
78 78 int send_tm_lfr_tc_exe_inconsistent( ccsdsTelecommandPacket_t *TC, rtems_id queue_id,
79 79 unsigned char byte_position, unsigned char rcv_value )
80 80 {
81 81 /** This function sends a TM_LFR_TC_EXE_INCONSISTENT packet in the dedicated RTEMS message queue.
82 82 *
83 83 * @param TC points to the TeleCommand packet that is being processed
84 84 * @param queue_id is the id of the queue which handles TM
85 85 * @param byte_position is the byte position of the MSB of the parameter that has been seen as inconsistent
86 86 * @param rcv_value is the value of the LSB of the parameter that has been deteced as inconsistent
87 87 *
88 88 * @return RTEMS directive status code:
89 89 * - RTEMS_SUCCESSFUL - message sent successfully
90 90 * - RTEMS_INVALID_ID - invalid queue id
91 91 * - RTEMS_INVALID_SIZE - invalid message size
92 92 * - RTEMS_INVALID_ADDRESS - buffer is NULL
93 93 * - RTEMS_UNSATISFIED - out of message buffers
94 * - RTEMS_TOO_MANY - queue’s limit has been reached
94 * - RTEMS_TOO_MANY - queue s limit has been reached
95 95 *
96 96 */
97 97
98 98 rtems_status_code status;
99 99 Packet_TM_LFR_TC_EXE_INCONSISTENT_t TM;
100 100 unsigned char messageSize;
101 101
102 102 TM.targetLogicalAddress = CCSDS_DESTINATION_ID;
103 103 TM.protocolIdentifier = CCSDS_PROTOCOLE_ID;
104 104 TM.reserved = DEFAULT_RESERVED;
105 105 TM.userApplication = CCSDS_USER_APP;
106 106 // PACKET HEADER
107 107 TM.packetID[0] = (unsigned char) (TM_PACKET_ID_TC_EXE >> 8);
108 108 TM.packetID[1] = (unsigned char) (TM_PACKET_ID_TC_EXE );
109 TM.packetSequenceControl[0] = (TM_PACKET_SEQ_CTRL_STANDALONE >> 8);
110 TM.packetSequenceControl[1] = (TM_PACKET_SEQ_CTRL_STANDALONE );
109 TM.packetSequenceControl[0] = TM_PACKET_SEQ_CTRL_STANDALONE;
110 TM.packetSequenceControl[1] = TM_PACKET_SEQ_CNT_DEFAULT;
111 111 TM.packetLength[0] = (unsigned char) (PACKET_LENGTH_TC_EXE_INCONSISTENT >> 8);
112 112 TM.packetLength[1] = (unsigned char) (PACKET_LENGTH_TC_EXE_INCONSISTENT );
113 113 // DATA FIELD HEADER
114 114 TM.spare1_pusVersion_spare2 = DEFAULT_SPARE1_PUSVERSION_SPARE2;
115 115 TM.serviceType = TM_TYPE_TC_EXE;
116 116 TM.serviceSubType = TM_SUBTYPE_EXE_NOK;
117 117 TM.destinationID = TM_DESTINATION_ID_GROUND; // default destination id
118 118 TM.time[0] = (unsigned char) (time_management_regs->coarse_time>>24);
119 119 TM.time[1] = (unsigned char) (time_management_regs->coarse_time>>16);
120 120 TM.time[2] = (unsigned char) (time_management_regs->coarse_time>>8);
121 121 TM.time[3] = (unsigned char) (time_management_regs->coarse_time);
122 122 TM.time[4] = (unsigned char) (time_management_regs->fine_time>>8);
123 123 TM.time[5] = (unsigned char) (time_management_regs->fine_time);
124 124 //
125 125 TM.tc_failure_code[0] = (char) (WRONG_APP_DATA >> 8);
126 126 TM.tc_failure_code[1] = (char) (WRONG_APP_DATA );
127 127 TM.telecommand_pkt_id[0] = TC->packetID[0];
128 128 TM.telecommand_pkt_id[1] = TC->packetID[1];
129 129 TM.pkt_seq_control[0] = TC->packetSequenceControl[0];
130 130 TM.pkt_seq_control[1] = TC->packetSequenceControl[1];
131 131 TM.tc_service = TC->serviceType; // type of the rejected TC
132 132 TM.tc_subtype = TC->serviceSubType; // subtype of the rejected TC
133 133 TM.byte_position = byte_position;
134 134 TM.rcv_value = rcv_value;
135 135
136 136 messageSize = PACKET_LENGTH_TC_EXE_INCONSISTENT + CCSDS_TC_TM_PACKET_OFFSET + CCSDS_PROTOCOLE_EXTRA_BYTES;
137 137
138 138 // SEND DATA
139 139 status = rtems_message_queue_urgent( queue_id, &TM, messageSize);
140 140 if (status != RTEMS_SUCCESSFUL) {
141 141 PRINTF("in send_tm_lfr_tc_exe_inconsistent *** ERR\n")
142 142 }
143 143
144 144 return status;
145 145 }
146 146
147 147 int send_tm_lfr_tc_exe_not_executable( ccsdsTelecommandPacket_t *TC, rtems_id queue_id )
148 148 {
149 149 /** This function sends a TM_LFR_TC_EXE_NOT_EXECUTABLE packet in the dedicated RTEMS message queue.
150 150 *
151 151 * @param TC points to the TeleCommand packet that is being processed
152 152 * @param queue_id is the id of the queue which handles TM
153 153 *
154 154 * @return RTEMS directive status code:
155 155 * - RTEMS_SUCCESSFUL - message sent successfully
156 156 * - RTEMS_INVALID_ID - invalid queue id
157 157 * - RTEMS_INVALID_SIZE - invalid message size
158 158 * - RTEMS_INVALID_ADDRESS - buffer is NULL
159 159 * - RTEMS_UNSATISFIED - out of message buffers
160 * - RTEMS_TOO_MANY - queue’s limit has been reached
160 * - RTEMS_TOO_MANY - queue s limit has been reached
161 161 *
162 162 */
163 163
164 164 rtems_status_code status;
165 165 Packet_TM_LFR_TC_EXE_NOT_EXECUTABLE_t TM;
166 166 unsigned char messageSize;
167 167
168 168 TM.targetLogicalAddress = CCSDS_DESTINATION_ID;
169 169 TM.protocolIdentifier = CCSDS_PROTOCOLE_ID;
170 170 TM.reserved = DEFAULT_RESERVED;
171 171 TM.userApplication = CCSDS_USER_APP;
172 172 // PACKET HEADER
173 173 TM.packetID[0] = (unsigned char) (TM_PACKET_ID_TC_EXE >> 8);
174 174 TM.packetID[1] = (unsigned char) (TM_PACKET_ID_TC_EXE );
175 TM.packetSequenceControl[0] = (TM_PACKET_SEQ_CTRL_STANDALONE >> 8);
176 TM.packetSequenceControl[1] = (TM_PACKET_SEQ_CTRL_STANDALONE );
175 TM.packetSequenceControl[0] = TM_PACKET_SEQ_CTRL_STANDALONE;
176 TM.packetSequenceControl[1] = TM_PACKET_SEQ_CNT_DEFAULT;
177 177 TM.packetLength[0] = (unsigned char) (PACKET_LENGTH_TC_EXE_NOT_EXECUTABLE >> 8);
178 178 TM.packetLength[1] = (unsigned char) (PACKET_LENGTH_TC_EXE_NOT_EXECUTABLE );
179 179 // DATA FIELD HEADER
180 180 TM.spare1_pusVersion_spare2 = DEFAULT_SPARE1_PUSVERSION_SPARE2;
181 181 TM.serviceType = TM_TYPE_TC_EXE;
182 182 TM.serviceSubType = TM_SUBTYPE_EXE_NOK;
183 183 TM.destinationID = TM_DESTINATION_ID_GROUND; // default destination id
184 184 TM.time[0] = (unsigned char) (time_management_regs->coarse_time>>24);
185 185 TM.time[1] = (unsigned char) (time_management_regs->coarse_time>>16);
186 186 TM.time[2] = (unsigned char) (time_management_regs->coarse_time>>8);
187 187 TM.time[3] = (unsigned char) (time_management_regs->coarse_time);
188 188 TM.time[4] = (unsigned char) (time_management_regs->fine_time>>8);
189 189 TM.time[5] = (unsigned char) (time_management_regs->fine_time);
190 190 //
191 191 TM.tc_failure_code[0] = (char) (TC_NOT_EXE >> 8);
192 192 TM.tc_failure_code[1] = (char) (TC_NOT_EXE );
193 193 TM.telecommand_pkt_id[0] = TC->packetID[0];
194 194 TM.telecommand_pkt_id[1] = TC->packetID[1];
195 195 TM.pkt_seq_control[0] = TC->packetSequenceControl[0];
196 196 TM.pkt_seq_control[1] = TC->packetSequenceControl[1];
197 197 TM.tc_service = TC->serviceType; // type of the rejected TC
198 198 TM.tc_subtype = TC->serviceSubType; // subtype of the rejected TC
199 199 TM.lfr_status_word[0] = housekeeping_packet.lfr_status_word[0];
200 200 TM.lfr_status_word[1] = housekeeping_packet.lfr_status_word[1];
201 201
202 202 messageSize = PACKET_LENGTH_TC_EXE_NOT_EXECUTABLE + CCSDS_TC_TM_PACKET_OFFSET + CCSDS_PROTOCOLE_EXTRA_BYTES;
203 203
204 204 // SEND DATA
205 205 status = rtems_message_queue_urgent( queue_id, &TM, messageSize);
206 206 if (status != RTEMS_SUCCESSFUL) {
207 207 PRINTF("in send_tm_lfr_tc_exe_not_executable *** ERR\n")
208 208 }
209 209
210 210 return status;
211 211 }
212 212
213 213 int send_tm_lfr_tc_exe_not_implemented( ccsdsTelecommandPacket_t *TC, rtems_id queue_id )
214 214 {
215 215 /** This function sends a TM_LFR_TC_EXE_NOT_IMPLEMENTED packet in the dedicated RTEMS message queue.
216 216 *
217 217 * @param TC points to the TeleCommand packet that is being processed
218 218 * @param queue_id is the id of the queue which handles TM
219 219 *
220 220 * @return RTEMS directive status code:
221 221 * - RTEMS_SUCCESSFUL - message sent successfully
222 222 * - RTEMS_INVALID_ID - invalid queue id
223 223 * - RTEMS_INVALID_SIZE - invalid message size
224 224 * - RTEMS_INVALID_ADDRESS - buffer is NULL
225 225 * - RTEMS_UNSATISFIED - out of message buffers
226 * - RTEMS_TOO_MANY - queue’s limit has been reached
226 * - RTEMS_TOO_MANY - queue s limit has been reached
227 227 *
228 228 */
229 229
230 230 rtems_status_code status;
231 231 Packet_TM_LFR_TC_EXE_NOT_IMPLEMENTED_t TM;
232 232 unsigned char messageSize;
233 233
234 234 TM.targetLogicalAddress = CCSDS_DESTINATION_ID;
235 235 TM.protocolIdentifier = CCSDS_PROTOCOLE_ID;
236 236 TM.reserved = DEFAULT_RESERVED;
237 237 TM.userApplication = CCSDS_USER_APP;
238 238 // PACKET HEADER
239 239 TM.packetID[0] = (unsigned char) (TM_PACKET_ID_TC_EXE >> 8);
240 240 TM.packetID[1] = (unsigned char) (TM_PACKET_ID_TC_EXE );
241 TM.packetSequenceControl[0] = (TM_PACKET_SEQ_CTRL_STANDALONE >> 8);
242 TM.packetSequenceControl[1] = (TM_PACKET_SEQ_CTRL_STANDALONE );
241 TM.packetSequenceControl[0] = TM_PACKET_SEQ_CTRL_STANDALONE;
242 TM.packetSequenceControl[1] = TM_PACKET_SEQ_CNT_DEFAULT;
243 243 TM.packetLength[0] = (unsigned char) (PACKET_LENGTH_TC_EXE_NOT_IMPLEMENTED >> 8);
244 244 TM.packetLength[1] = (unsigned char) (PACKET_LENGTH_TC_EXE_NOT_IMPLEMENTED );
245 245 // DATA FIELD HEADER
246 246 TM.spare1_pusVersion_spare2 = DEFAULT_SPARE1_PUSVERSION_SPARE2;
247 247 TM.serviceType = TM_TYPE_TC_EXE;
248 248 TM.serviceSubType = TM_SUBTYPE_EXE_NOK;
249 249 TM.destinationID = TM_DESTINATION_ID_GROUND; // default destination id
250 250 TM.time[0] = (unsigned char) (time_management_regs->coarse_time>>24);
251 251 TM.time[1] = (unsigned char) (time_management_regs->coarse_time>>16);
252 252 TM.time[2] = (unsigned char) (time_management_regs->coarse_time>>8);
253 253 TM.time[3] = (unsigned char) (time_management_regs->coarse_time);
254 254 TM.time[4] = (unsigned char) (time_management_regs->fine_time>>8);
255 255 TM.time[5] = (unsigned char) (time_management_regs->fine_time);
256 256 //
257 257 TM.tc_failure_code[0] = (char) (FUNCT_NOT_IMPL >> 8);
258 258 TM.tc_failure_code[1] = (char) (FUNCT_NOT_IMPL );
259 259 TM.telecommand_pkt_id[0] = TC->packetID[0];
260 260 TM.telecommand_pkt_id[1] = TC->packetID[1];
261 261 TM.pkt_seq_control[0] = TC->packetSequenceControl[0];
262 262 TM.pkt_seq_control[1] = TC->packetSequenceControl[1];
263 263 TM.tc_service = TC->serviceType; // type of the rejected TC
264 264 TM.tc_subtype = TC->serviceSubType; // subtype of the rejected TC
265 265
266 266 messageSize = PACKET_LENGTH_TC_EXE_NOT_IMPLEMENTED + CCSDS_TC_TM_PACKET_OFFSET + CCSDS_PROTOCOLE_EXTRA_BYTES;
267 267
268 268 // SEND DATA
269 269 status = rtems_message_queue_urgent( queue_id, &TM, messageSize);
270 270 if (status != RTEMS_SUCCESSFUL) {
271 271 PRINTF("in send_tm_lfr_tc_exe_not_implemented *** ERR\n")
272 272 }
273 273
274 274 return status;
275 275 }
276 276
277 277 int send_tm_lfr_tc_exe_error( ccsdsTelecommandPacket_t *TC, rtems_id queue_id )
278 278 {
279 279 /** This function sends a TM_LFR_TC_EXE_ERROR packet in the dedicated RTEMS message queue.
280 280 *
281 281 * @param TC points to the TeleCommand packet that is being processed
282 282 * @param queue_id is the id of the queue which handles TM
283 283 *
284 284 * @return RTEMS directive status code:
285 285 * - RTEMS_SUCCESSFUL - message sent successfully
286 286 * - RTEMS_INVALID_ID - invalid queue id
287 287 * - RTEMS_INVALID_SIZE - invalid message size
288 288 * - RTEMS_INVALID_ADDRESS - buffer is NULL
289 289 * - RTEMS_UNSATISFIED - out of message buffers
290 * - RTEMS_TOO_MANY - queue’s limit has been reached
290 * - RTEMS_TOO_MANY - queue s limit has been reached
291 291 *
292 292 */
293 293
294 294 rtems_status_code status;
295 295 Packet_TM_LFR_TC_EXE_ERROR_t TM;
296 296 unsigned char messageSize;
297 297
298 298 TM.targetLogicalAddress = CCSDS_DESTINATION_ID;
299 299 TM.protocolIdentifier = CCSDS_PROTOCOLE_ID;
300 300 TM.reserved = DEFAULT_RESERVED;
301 301 TM.userApplication = CCSDS_USER_APP;
302 302 // PACKET HEADER
303 303 TM.packetID[0] = (unsigned char) (TM_PACKET_ID_TC_EXE >> 8);
304 304 TM.packetID[1] = (unsigned char) (TM_PACKET_ID_TC_EXE );
305 TM.packetSequenceControl[0] = (TM_PACKET_SEQ_CTRL_STANDALONE >> 8);
306 TM.packetSequenceControl[1] = (TM_PACKET_SEQ_CTRL_STANDALONE );
305 TM.packetSequenceControl[0] = TM_PACKET_SEQ_CTRL_STANDALONE;
306 TM.packetSequenceControl[1] = TM_PACKET_SEQ_CNT_DEFAULT;
307 307 TM.packetLength[0] = (unsigned char) (PACKET_LENGTH_TC_EXE_ERROR >> 8);
308 308 TM.packetLength[1] = (unsigned char) (PACKET_LENGTH_TC_EXE_ERROR );
309 309 // DATA FIELD HEADER
310 310 TM.spare1_pusVersion_spare2 = DEFAULT_SPARE1_PUSVERSION_SPARE2;
311 311 TM.serviceType = TM_TYPE_TC_EXE;
312 312 TM.serviceSubType = TM_SUBTYPE_EXE_NOK;
313 313 TM.destinationID = TM_DESTINATION_ID_GROUND; // default destination id
314 314 TM.time[0] = (unsigned char) (time_management_regs->coarse_time>>24);
315 315 TM.time[1] = (unsigned char) (time_management_regs->coarse_time>>16);
316 316 TM.time[2] = (unsigned char) (time_management_regs->coarse_time>>8);
317 317 TM.time[3] = (unsigned char) (time_management_regs->coarse_time);
318 318 TM.time[4] = (unsigned char) (time_management_regs->fine_time>>8);
319 319 TM.time[5] = (unsigned char) (time_management_regs->fine_time);
320 320 //
321 321 TM.tc_failure_code[0] = (char) (FAIL_DETECTED >> 8);
322 322 TM.tc_failure_code[1] = (char) (FAIL_DETECTED );
323 323 TM.telecommand_pkt_id[0] = TC->packetID[0];
324 324 TM.telecommand_pkt_id[1] = TC->packetID[1];
325 325 TM.pkt_seq_control[0] = TC->packetSequenceControl[0];
326 326 TM.pkt_seq_control[1] = TC->packetSequenceControl[1];
327 327 TM.tc_service = TC->serviceType; // type of the rejected TC
328 328 TM.tc_subtype = TC->serviceSubType; // subtype of the rejected TC
329 329
330 330 messageSize = PACKET_LENGTH_TC_EXE_ERROR + CCSDS_TC_TM_PACKET_OFFSET + CCSDS_PROTOCOLE_EXTRA_BYTES;
331 331
332 332 // SEND DATA
333 333 status = rtems_message_queue_urgent( queue_id, &TM, messageSize);
334 334 if (status != RTEMS_SUCCESSFUL) {
335 335 PRINTF("in send_tm_lfr_tc_exe_error *** ERR\n")
336 336 }
337 337
338 338 return status;
339 339 }
340 340
341 341 int send_tm_lfr_tc_exe_corrupted(ccsdsTelecommandPacket_t *TC, rtems_id queue_id,
342 342 unsigned char *computed_CRC, unsigned char *currentTC_LEN_RCV )
343 343 {
344 344 /** This function sends a TM_LFR_TC_EXE_CORRUPTED packet in the dedicated RTEMS message queue.
345 345 *
346 346 * @param TC points to the TeleCommand packet that is being processed
347 347 * @param queue_id is the id of the queue which handles TM
348 348 * @param computed_CRC points to a buffer of two bytes containing the CRC computed during the parsing of the TeleCommand
349 349 * @param currentTC_LEN_RCV points to a buffer of two bytes containing a packet size field computed on the received data
350 350 *
351 351 * @return RTEMS directive status code:
352 352 * - RTEMS_SUCCESSFUL - message sent successfully
353 353 * - RTEMS_INVALID_ID - invalid queue id
354 354 * - RTEMS_INVALID_SIZE - invalid message size
355 355 * - RTEMS_INVALID_ADDRESS - buffer is NULL
356 356 * - RTEMS_UNSATISFIED - out of message buffers
357 * - RTEMS_TOO_MANY - queue’s limit has been reached
357 * - RTEMS_TOO_MANY - queue s limit has been reached
358 358 *
359 359 */
360 360
361 361 rtems_status_code status;
362 362 Packet_TM_LFR_TC_EXE_CORRUPTED_t TM;
363 363 unsigned char messageSize;
364 364 unsigned int packetLength;
365 365 unsigned char *packetDataField;
366 366
367 packetLength = (TC->packetLength[0] * 256) + TC->packetLength[1]; // compute the packet length
367 packetLength = (TC->packetLength[0] * 256) + TC->packetLength[1]; // compute the packet length parameter
368 368 packetDataField = (unsigned char *) &TC->headerFlag_pusVersion_Ack; // get the beginning of the data field
369 369
370 370 TM.targetLogicalAddress = CCSDS_DESTINATION_ID;
371 371 TM.protocolIdentifier = CCSDS_PROTOCOLE_ID;
372 372 TM.reserved = DEFAULT_RESERVED;
373 373 TM.userApplication = CCSDS_USER_APP;
374 374 // PACKET HEADER
375 375 TM.packetID[0] = (unsigned char) (TM_PACKET_ID_TC_EXE >> 8);
376 376 TM.packetID[1] = (unsigned char) (TM_PACKET_ID_TC_EXE );
377 TM.packetSequenceControl[0] = (TM_PACKET_SEQ_CTRL_STANDALONE >> 8);
378 TM.packetSequenceControl[1] = (TM_PACKET_SEQ_CTRL_STANDALONE );
377 TM.packetSequenceControl[0] = TM_PACKET_SEQ_CTRL_STANDALONE;
378 TM.packetSequenceControl[1] = TM_PACKET_SEQ_CNT_DEFAULT;
379 379 TM.packetLength[0] = (unsigned char) (PACKET_LENGTH_TC_EXE_CORRUPTED >> 8);
380 380 TM.packetLength[1] = (unsigned char) (PACKET_LENGTH_TC_EXE_CORRUPTED );
381 381 // DATA FIELD HEADER
382 382 TM.spare1_pusVersion_spare2 = DEFAULT_SPARE1_PUSVERSION_SPARE2;
383 383 TM.serviceType = TM_TYPE_TC_EXE;
384 384 TM.serviceSubType = TM_SUBTYPE_EXE_NOK;
385 385 TM.destinationID = TM_DESTINATION_ID_GROUND; // default destination id
386 386 TM.time[0] = (unsigned char) (time_management_regs->coarse_time>>24);
387 387 TM.time[1] = (unsigned char) (time_management_regs->coarse_time>>16);
388 388 TM.time[2] = (unsigned char) (time_management_regs->coarse_time>>8);
389 389 TM.time[3] = (unsigned char) (time_management_regs->coarse_time);
390 390 TM.time[4] = (unsigned char) (time_management_regs->fine_time>>8);
391 391 TM.time[5] = (unsigned char) (time_management_regs->fine_time);
392 392 //
393 393 TM.tc_failure_code[0] = (unsigned char) (CORRUPTED >> 8);
394 394 TM.tc_failure_code[1] = (unsigned char) (CORRUPTED );
395 395 TM.telecommand_pkt_id[0] = TC->packetID[0];
396 396 TM.telecommand_pkt_id[1] = TC->packetID[1];
397 397 TM.pkt_seq_control[0] = TC->packetSequenceControl[0];
398 398 TM.pkt_seq_control[1] = TC->packetSequenceControl[1];
399 399 TM.tc_service = TC->serviceType; // type of the rejected TC
400 400 TM.tc_subtype = TC->serviceSubType; // subtype of the rejected TC
401 401 TM.pkt_len_rcv_value[0] = TC->packetLength[0];
402 402 TM.pkt_len_rcv_value[1] = TC->packetLength[1];
403 403 TM.pkt_datafieldsize_cnt[0] = currentTC_LEN_RCV[0];
404 404 TM.pkt_datafieldsize_cnt[1] = currentTC_LEN_RCV[1];
405 405 TM.rcv_crc[0] = packetDataField[ packetLength - 1 ];
406 406 TM.rcv_crc[1] = packetDataField[ packetLength ];
407 407 TM.computed_crc[0] = computed_CRC[0];
408 408 TM.computed_crc[1] = computed_CRC[1];
409 409
410 410 messageSize = PACKET_LENGTH_TC_EXE_CORRUPTED + CCSDS_TC_TM_PACKET_OFFSET + CCSDS_PROTOCOLE_EXTRA_BYTES;
411 411
412 412 // SEND DATA
413 413 status = rtems_message_queue_urgent( queue_id, &TM, messageSize);
414 414 if (status != RTEMS_SUCCESSFUL) {
415 415 PRINTF("in send_tm_lfr_tc_exe_error *** ERR\n")
416 416 }
417 417
418 418 return status;
419 419 }
@@ -1,1171 +1,1166
1 1 /** Functions and tasks related to waveform packet generation.
2 2 *
3 3 * @file
4 4 * @author P. LEROY
5 5 *
6 6 * A group of functions to handle waveforms, in snapshot or continuous format.\n
7 7 *
8 8 */
9 9
10 10 #include "wf_handler.h"
11 11
12 12 // SWF
13 13 Header_TM_LFR_SCIENCE_SWF_t headerSWF_F0[7];
14 14 Header_TM_LFR_SCIENCE_SWF_t headerSWF_F1[7];
15 15 Header_TM_LFR_SCIENCE_SWF_t headerSWF_F2[7];
16 16 // CWF
17 17 Header_TM_LFR_SCIENCE_CWF_t headerCWF_F1[7];
18 18 Header_TM_LFR_SCIENCE_CWF_t headerCWF_F2_BURST[7];
19 19 Header_TM_LFR_SCIENCE_CWF_t headerCWF_F2_SBM2[7];
20 20 Header_TM_LFR_SCIENCE_CWF_t headerCWF_F3[7];
21 21 Header_TM_LFR_SCIENCE_CWF_t headerCWF_F3_light[7];
22 22
23 23 unsigned char doubleSendCWF1 = 0;
24 24 unsigned char doubleSendCWF2 = 0;
25 25
26 26 rtems_isr waveforms_isr( rtems_vector_number vector )
27 27 {
28 28 /** This is the interrupt sub routine called by the waveform picker core.
29 29 *
30 30 * This ISR launch different actions depending mainly on two pieces of information:
31 31 * 1. the values read in the registers of the waveform picker.
32 32 * 2. the current LFR mode.
33 33 *
34 34 */
35 35
36 36 #ifdef GSA
37 37 #else
38 38 if ( (lfrCurrentMode == LFR_MODE_NORMAL)
39 39 || (lfrCurrentMode == LFR_MODE_SBM1) || (lfrCurrentMode == LFR_MODE_SBM2) )
40 40 { // in modes other than STANDBY and BURST, send the CWF_F3 data
41 41 if ((waveform_picker_regs->status & 0x08) == 0x08){ // [1000] f3 is full
42 42 // (1) change the receiving buffer for the waveform picker
43 43 if (waveform_picker_regs->addr_data_f3 == (int) wf_cont_f3) {
44 44 waveform_picker_regs->addr_data_f3 = (int) (wf_cont_f3_bis);
45 45 }
46 46 else {
47 47 waveform_picker_regs->addr_data_f3 = (int) (wf_cont_f3);
48 48 }
49 49 // (2) send an event for the waveforms transmission
50 50 if (rtems_event_send( Task_id[TASKID_CWF3], RTEMS_EVENT_0 ) != RTEMS_SUCCESSFUL) {
51 51 rtems_event_send( Task_id[TASKID_DUMB], RTEMS_EVENT_2 );
52 52 }
53 53 waveform_picker_regs->status = waveform_picker_regs->status & 0xfffff777; // reset f3 bits to 0, [1111 0111 0111 0111]
54 54 }
55 55 }
56 56 #endif
57 57
58 58 switch(lfrCurrentMode)
59 59 {
60 60 //********
61 61 // STANDBY
62 62 case(LFR_MODE_STANDBY):
63 63 break;
64 64
65 65 //******
66 66 // NORMAL
67 67 case(LFR_MODE_NORMAL):
68 68 #ifdef GSA
69 69 PRINTF("in waveform_isr *** unexpected waveform picker interruption\n")
70 70 #else
71 71 if ( (waveform_picker_regs->burst_enable & 0x7) == 0x0 ){ // if no channel is enable
72 72 rtems_event_send( Task_id[TASKID_DUMB], RTEMS_EVENT_2 );
73 73 }
74 74 else {
75 75 if ( (waveform_picker_regs->status & 0x7) == 0x7 ){ // f2 f1 and f0 are full
76 76 waveform_picker_regs->burst_enable = waveform_picker_regs->burst_enable & 0x08;
77 77 if (rtems_event_send( Task_id[TASKID_WFRM], RTEMS_EVENT_MODE_NORMAL ) != RTEMS_SUCCESSFUL) {
78 78 rtems_event_send( Task_id[TASKID_DUMB], RTEMS_EVENT_2 );
79 79 }
80 80 waveform_picker_regs->status = waveform_picker_regs->status & 0x00;
81 81 waveform_picker_regs->burst_enable = waveform_picker_regs->burst_enable | 0x07; // [0111] enable f2 f1 f0
82 82 }
83 83 }
84 84 #endif
85 85 break;
86 86
87 87 //******
88 88 // BURST
89 89 case(LFR_MODE_BURST):
90 90 #ifdef GSA
91 91 PRINTF("in waveform_isr *** unexpected waveform picker interruption\n")
92 92 #else
93 93 if ((waveform_picker_regs->status & 0x04) == 0x04){ // [0100] check the f2 full bit
94 94 // (1) change the receiving buffer for the waveform picker
95 95 if (waveform_picker_regs->addr_data_f2 == (int) wf_snap_f2) {
96 96 waveform_picker_regs->addr_data_f2 = (int) (wf_snap_f2_bis);
97 97 }
98 98 else {
99 99 waveform_picker_regs->addr_data_f2 = (int) (wf_snap_f2);
100 100 }
101 101 // (2) send an event for the waveforms transmission
102 102 if (rtems_event_send( Task_id[TASKID_CWF2], RTEMS_EVENT_MODE_BURST ) != RTEMS_SUCCESSFUL) {
103 103 rtems_event_send( Task_id[TASKID_DUMB], RTEMS_EVENT_2 );
104 104 }
105 105 waveform_picker_regs->status = waveform_picker_regs->status & 0xfffffbbb; // [1111 1011 1011 1011] f2 bits = 0
106 106 }
107 107 #endif
108 108 break;
109 109
110 110 //*****
111 111 // SBM1
112 112 case(LFR_MODE_SBM1):
113 113 #ifdef GSA
114 114 PRINTF("in waveform_isr *** unexpected waveform picker interruption\n")
115 115 #else
116 116 if ((waveform_picker_regs->status & 0x02) == 0x02){ // [0010] check the f1 full bit
117 117 // (1) change the receiving buffer for the waveform picker
118 118 if ( param_local.local_sbm1_nb_cwf_sent == (param_local.local_sbm1_nb_cwf_max-1) )
119 119 {
120 120 waveform_picker_regs->addr_data_f1 = (int) (wf_snap_f1_norm);
121 121 }
122 122 else if ( waveform_picker_regs->addr_data_f1 == (int) wf_snap_f1_norm )
123 123 {
124 124 doubleSendCWF1 = 1;
125 125 waveform_picker_regs->addr_data_f1 = (int) (wf_snap_f1);
126 126 }
127 127 else if ( waveform_picker_regs->addr_data_f1 == (int) wf_snap_f1 ) {
128 128 waveform_picker_regs->addr_data_f1 = (int) (wf_snap_f1_bis);
129 129 }
130 130 else {
131 131 waveform_picker_regs->addr_data_f1 = (int) (wf_snap_f1);
132 132 }
133 133 // (2) send an event for the waveforms transmission
134 134 if (rtems_event_send( Task_id[TASKID_CWF1], RTEMS_EVENT_MODE_SBM1 ) != RTEMS_SUCCESSFUL) {
135 135 rtems_event_send( Task_id[TASKID_DUMB], RTEMS_EVENT_2 );
136 136 }
137 137 waveform_picker_regs->status = waveform_picker_regs->status & 0xfffffddd; // [1111 1101 1101 1101] f1 bit = 0
138 138 }
139 139 if ( ( (waveform_picker_regs->status & 0x05) == 0x05 ) ) { // [0101] check the f2 and f0 full bit
140 140 if (rtems_event_send( Task_id[TASKID_WFRM], RTEMS_EVENT_MODE_NORMAL ) != RTEMS_SUCCESSFUL) {
141 141 rtems_event_send( Task_id[TASKID_DUMB], RTEMS_EVENT_2 );
142 142 }
143 143 waveform_picker_regs->status = waveform_picker_regs->status & 0xfffffaaa; // [1111 1010 1010 1010] f2 and f0 bits = 0
144 144 reset_local_sbm1_nb_cwf_sent();
145 145 }
146 146
147 147 #endif
148 148 break;
149 149
150 150 //*****
151 151 // SBM2
152 152 case(LFR_MODE_SBM2):
153 153 #ifdef GSA
154 154 PRINTF("in waveform_isr *** unexpected waveform picker interruption\n")
155 155 #else
156 156 if ((waveform_picker_regs->status & 0x04) == 0x04){ // [0100] check the f2 full bit
157 157 // (1) change the receiving buffer for the waveform picker
158 158 if ( param_local.local_sbm2_nb_cwf_sent == (param_local.local_sbm2_nb_cwf_max-1) )
159 159 {
160 160 waveform_picker_regs->addr_data_f2 = (int) (wf_snap_f2_norm);
161 161 }
162 162 else if ( waveform_picker_regs->addr_data_f2 == (int) wf_snap_f2_norm ) {
163 163 waveform_picker_regs->addr_data_f2 = (int) (wf_snap_f2);
164 164 doubleSendCWF2 = 1;
165 165 if (rtems_event_send( Task_id[TASKID_WFRM], RTEMS_EVENT_MODE_SBM2_WFRM ) != RTEMS_SUCCESSFUL) {
166 166 rtems_event_send( Task_id[TASKID_DUMB], RTEMS_EVENT_2 );
167 167 }
168 168 reset_local_sbm2_nb_cwf_sent();
169 169 }
170 170 else if ( waveform_picker_regs->addr_data_f2 == (int) wf_snap_f2 ) {
171 171 waveform_picker_regs->addr_data_f2 = (int) (wf_snap_f2_bis);
172 172 }
173 173 else {
174 174 waveform_picker_regs->addr_data_f2 = (int) (wf_snap_f2);
175 175 }
176 176 // (2) send an event for the waveforms transmission
177 177 if (rtems_event_send( Task_id[TASKID_CWF2], RTEMS_EVENT_MODE_SBM2 ) != RTEMS_SUCCESSFUL) {
178 178 rtems_event_send( Task_id[TASKID_DUMB], RTEMS_EVENT_2 );
179 179 }
180 180 waveform_picker_regs->status = waveform_picker_regs->status & 0xfffffbbb; // [1111 1011 1011 1011] f2 bit = 0
181 181 }
182 182 if ( ( (waveform_picker_regs->status & 0x03) == 0x03 ) ) { // [0011] f3 f2 f1 f0, f1 and f0 are full
183 183 if (rtems_event_send( Task_id[TASKID_WFRM], RTEMS_EVENT_MODE_SBM2 ) != RTEMS_SUCCESSFUL) {
184 184 rtems_event_send( Task_id[TASKID_DUMB], RTEMS_EVENT_2 );
185 185 }
186 186 waveform_picker_regs->status = waveform_picker_regs->status & 0xfffffccc; // [1111 1100 1100 1100] f1, f0 bits = 0
187 187 }
188 188 #endif
189 189 break;
190 190
191 191 //********
192 192 // DEFAULT
193 193 default:
194 194 break;
195 195 }
196 196 }
197 197
198 198 rtems_isr waveforms_simulator_isr( rtems_vector_number vector )
199 199 {
200 200 /** This is the interrupt sub routine called by the waveform picker simulator.
201 201 *
202 202 * This ISR is for debug purpose only.
203 203 *
204 204 */
205 205
206 206 unsigned char lfrMode;
207 207 lfrMode = (housekeeping_packet.lfr_status_word[0] & 0xf0) >> 4;
208 208
209 209 switch(lfrMode) {
210 210 case (LFR_MODE_STANDBY):
211 211 break;
212 212 case (LFR_MODE_NORMAL):
213 213 if (rtems_event_send( Task_id[TASKID_WFRM], RTEMS_EVENT_MODE_NORMAL ) != RTEMS_SUCCESSFUL) {
214 214 rtems_event_send( Task_id[TASKID_DUMB], RTEMS_EVENT_5 );
215 215 }
216 216 break;
217 217 case (LFR_MODE_BURST):
218 218 break;
219 219 case (LFR_MODE_SBM1):
220 220 break;
221 221 case (LFR_MODE_SBM2):
222 222 break;
223 223 }
224 224 }
225 225
226 226 rtems_task wfrm_task(rtems_task_argument argument) //used with the waveform picker VHDL IP
227 227 {
228 228 /** This RTEMS task is dedicated to the transmission of snapshots of the NORMAL mode.
229 229 *
230 230 * @param unused is the starting argument of the RTEMS task
231 231 *
232 232 * The following data packets are sent by this task:
233 233 * - TM_LFR_SCIENCE_NORMAL_SWF_F0
234 234 * - TM_LFR_SCIENCE_NORMAL_SWF_F1
235 235 * - TM_LFR_SCIENCE_NORMAL_SWF_F2
236 236 *
237 237 */
238 238
239 239 rtems_event_set event_out;
240 240 rtems_id queue_id;
241 rtems_status_code status;
242 241
243 242 init_header_snapshot_wf_table( SID_NORM_SWF_F0, headerSWF_F0 );
244 243 init_header_snapshot_wf_table( SID_NORM_SWF_F1, headerSWF_F1 );
245 244 init_header_snapshot_wf_table( SID_NORM_SWF_F2, headerSWF_F2 );
246 245
247 246 init_waveforms();
248 247
249 status = rtems_message_queue_ident( misc_name[QUEUE_SEND], 0, &queue_id );
250 if (status != RTEMS_SUCCESSFUL)
251 {
252 PRINTF1("in WFRM *** ERR getting queue id, %d\n", status)
253 }
248 queue_id = get_pkts_queue_id();
254 249
255 250 BOOT_PRINTF("in WFRM ***\n")
256 251
257 252 while(1){
258 253 // wait for an RTEMS_EVENT
259 254 rtems_event_receive(RTEMS_EVENT_MODE_NORMAL | RTEMS_EVENT_MODE_SBM1
260 255 | RTEMS_EVENT_MODE_SBM2 | RTEMS_EVENT_MODE_SBM2_WFRM,
261 256 RTEMS_WAIT | RTEMS_EVENT_ANY, RTEMS_NO_TIMEOUT, &event_out);
262 257
263 258 if (event_out == RTEMS_EVENT_MODE_NORMAL)
264 259 {
265 260 send_waveform_SWF(wf_snap_f0, SID_NORM_SWF_F0, headerSWF_F0, queue_id);
266 261 send_waveform_SWF(wf_snap_f1, SID_NORM_SWF_F1, headerSWF_F1, queue_id);
267 262 send_waveform_SWF(wf_snap_f2, SID_NORM_SWF_F2, headerSWF_F2, queue_id);
268 263 #ifdef GSA
269 264 waveform_picker_regs->status = waveform_picker_regs->status & 0xf888; // [1111 1000 1000 1000] f2, f1, f0 bits =0
270 265 #endif
271 266 }
272 267 else if (event_out == RTEMS_EVENT_MODE_SBM1)
273 268 {
274 269 send_waveform_SWF(wf_snap_f0, SID_NORM_SWF_F0, headerSWF_F0, queue_id);
275 270 send_waveform_SWF(wf_snap_f1_norm, SID_NORM_SWF_F1, headerSWF_F1, queue_id);
276 271 send_waveform_SWF(wf_snap_f2, SID_NORM_SWF_F2, headerSWF_F2, queue_id);
277 272 #ifdef GSA
278 273 waveform_picker_regs->status = waveform_picker_regs->status & 0xfffffaaa; // [1111 1010 1010 1010] f2, f0 bits = 0
279 274 #endif
280 275 }
281 276 else if (event_out == RTEMS_EVENT_MODE_SBM2)
282 277 {
283 278 send_waveform_SWF(wf_snap_f0, SID_NORM_SWF_F0, headerSWF_F0, queue_id);
284 279 send_waveform_SWF(wf_snap_f1, SID_NORM_SWF_F1, headerSWF_F1, queue_id);
285 280 #ifdef GSA
286 281 waveform_picker_regs->status = waveform_picker_regs->status & 0xfffffccc; // [1111 1100 1100 1100] f1, f0 bits = 0
287 282 #endif
288 283 }
289 284 else if (event_out == RTEMS_EVENT_MODE_SBM2_WFRM)
290 285 {
291 286 send_waveform_SWF(wf_snap_f2_norm, SID_NORM_SWF_F2, headerSWF_F2, queue_id);
292 287 }
293 288 else
294 289 {
295 290 PRINTF("in WFRM *** unexpected event")
296 291 }
297 292
298 293
299 294 #ifdef GSA
300 295 // irq processed, reset the related register of the timer unit
301 296 gptimer_regs->timer[TIMER_WF_SIMULATOR].ctrl = gptimer_regs->timer[TIMER_WF_SIMULATOR].ctrl | 0x00000010;
302 297 // clear the interruption
303 298 LEON_Unmask_interrupt( IRQ_WF );
304 299 #endif
305 300 }
306 301 }
307 302
308 303 rtems_task cwf3_task(rtems_task_argument argument) //used with the waveform picker VHDL IP
309 304 {
310 305 /** This RTEMS task is dedicated to the transmission of continuous waveforms at f3.
311 306 *
312 307 * @param unused is the starting argument of the RTEMS task
313 308 *
314 309 * The following data packet is sent by this task:
315 310 * - TM_LFR_SCIENCE_NORMAL_CWF_F3
316 311 *
317 312 */
318 313
319 314 rtems_event_set event_out;
320 315 rtems_id queue_id;
321 316
322 317 init_header_continuous_wf_table( SID_NORM_CWF_F3, headerCWF_F3 );
323 318 init_header_continuous_wf3_light_table( headerCWF_F3_light );
324 319
325 320 queue_id = get_pkts_queue_id();
326 321
327 322 BOOT_PRINTF("in CWF3 ***\n")
328 323
329 324 while(1){
330 325 // wait for an RTEMS_EVENT
331 326 rtems_event_receive( RTEMS_EVENT_0,
332 327 RTEMS_WAIT | RTEMS_EVENT_ANY, RTEMS_NO_TIMEOUT, &event_out);
333 328 PRINTF("send CWF F3 \n")
334 329 #ifdef GSA
335 330 #else
336 331 if (waveform_picker_regs->addr_data_f3 == (int) wf_cont_f3) {
337 332 send_waveform_CWF3_light( wf_cont_f3_bis, headerCWF_F3_light, queue_id );
338 333 }
339 334 else {
340 335 send_waveform_CWF3_light( wf_cont_f3, headerCWF_F3_light, queue_id );
341 336 }
342 337 #endif
343 338 }
344 339 }
345 340
346 341 rtems_task cwf2_task(rtems_task_argument argument) // ONLY USED IN BURST AND SBM2
347 342 {
348 343 /** This RTEMS task is dedicated to the transmission of continuous waveforms at f2.
349 344 *
350 345 * @param unused is the starting argument of the RTEMS task
351 346 *
352 347 * The following data packet is sent by this function:
353 348 * - TM_LFR_SCIENCE_BURST_CWF_F2
354 349 * - TM_LFR_SCIENCE_SBM2_CWF_F2
355 350 *
356 351 */
357 352
358 353 rtems_event_set event_out;
359 354 rtems_id queue_id;
360 355
361 356 init_header_continuous_wf_table( SID_BURST_CWF_F2, headerCWF_F2_BURST );
362 357 init_header_continuous_wf_table( SID_SBM2_CWF_F2, headerCWF_F2_SBM2 );
363 358
364 359 queue_id = get_pkts_queue_id();
365 360
366 361 BOOT_PRINTF("in CWF2 ***\n")
367 362
368 363 while(1){
369 364 // wait for an RTEMS_EVENT
370 365 rtems_event_receive( RTEMS_EVENT_MODE_BURST | RTEMS_EVENT_MODE_SBM2,
371 366 RTEMS_WAIT | RTEMS_EVENT_ANY, RTEMS_NO_TIMEOUT, &event_out);
372 367
373 368 if (event_out == RTEMS_EVENT_MODE_BURST)
374 369 {
375 370 // F2
376 371 #ifdef GSA
377 372 #else
378 373 if (waveform_picker_regs->addr_data_f2 == (int) wf_snap_f2) {
379 374 send_waveform_CWF( wf_snap_f2_bis, SID_BURST_CWF_F2, headerCWF_F2_BURST, queue_id );
380 375 }
381 376 else {
382 377 send_waveform_CWF( wf_snap_f2, SID_BURST_CWF_F2, headerCWF_F2_BURST, queue_id );
383 378 }
384 379 #endif
385 380 }
386 381
387 382 else if (event_out == RTEMS_EVENT_MODE_SBM2)
388 383 {
389 384 #ifdef GSA
390 385 #else
391 386 if (doubleSendCWF2 == 1)
392 387 {
393 388 doubleSendCWF2 = 0;
394 389 send_waveform_CWF( wf_snap_f2_norm, SID_SBM2_CWF_F2, headerCWF_F2_SBM2, queue_id );
395 390 }
396 391 else if (waveform_picker_regs->addr_data_f2 == (int) wf_snap_f2) {
397 392 send_waveform_CWF( wf_snap_f2_bis, SID_SBM2_CWF_F2, headerCWF_F2_SBM2, queue_id );
398 393 }
399 394 else {
400 395 send_waveform_CWF( wf_snap_f2, SID_SBM2_CWF_F2, headerCWF_F2_SBM2, queue_id );
401 396 }
402 397 param_local.local_sbm2_nb_cwf_sent ++;
403 398 #endif
404 399 }
405 400 else
406 401 {
407 402 PRINTF1("in CWF2 *** ERR mode = %d\n", lfrCurrentMode)
408 403 }
409 404 }
410 405 }
411 406
412 407 rtems_task cwf1_task(rtems_task_argument argument) // ONLY USED IN SBM1
413 408 {
414 409 /** This RTEMS task is dedicated to the transmission of continuous waveforms at f1.
415 410 *
416 411 * @param unused is the starting argument of the RTEMS task
417 412 *
418 413 * The following data packet is sent by this function:
419 414 * - TM_LFR_SCIENCE_SBM1_CWF_F1
420 415 *
421 416 */
422 417
423 418 rtems_event_set event_out;
424 419 rtems_id queue_id;
425 420
426 421 init_header_continuous_wf_table( SID_SBM1_CWF_F1, headerCWF_F1 );
427 422
428 423 queue_id = get_pkts_queue_id();
429 424
430 425 BOOT_PRINTF("in CWF1 ***\n")
431 426
432 427 while(1){
433 428 // wait for an RTEMS_EVENT
434 429 rtems_event_receive( RTEMS_EVENT_MODE_SBM1,
435 430 RTEMS_WAIT | RTEMS_EVENT_ANY, RTEMS_NO_TIMEOUT, &event_out);
436 431 if (event_out == RTEMS_EVENT_MODE_SBM1)
437 432 {
438 433 #ifdef GSA
439 434 #else
440 435 if (doubleSendCWF1 == 1)
441 436 {
442 437 doubleSendCWF1 = 0;
443 438 send_waveform_CWF( wf_snap_f1_norm, SID_SBM1_CWF_F1, headerCWF_F1, queue_id );
444 439 }
445 440 else if (waveform_picker_regs->addr_data_f1 == (int) wf_snap_f1) {
446 441 send_waveform_CWF( wf_snap_f1_bis, SID_SBM1_CWF_F1, headerCWF_F1, queue_id );
447 442 }
448 443 else {
449 444 send_waveform_CWF( wf_snap_f1, SID_SBM1_CWF_F1, headerCWF_F1, queue_id );
450 445 }
451 446 param_local.local_sbm1_nb_cwf_sent ++;
452 447 #endif
453 448 }
454 449 else
455 450 {
456 451 PRINTF1("in CWF1 *** ERR mode = %d\n", lfrCurrentMode)
457 452 }
458 453 }
459 454 }
460 455
461 456 //******************
462 457 // general functions
463 458 void init_waveforms( void )
464 459 {
465 460 int i = 0;
466 461
467 462 for (i=0; i< NB_SAMPLES_PER_SNAPSHOT; i++)
468 463 {
469 464 //***
470 465 // F0
471 466 wf_snap_f0[ (i* NB_WORDS_SWF_BLK) + 0 + TIME_OFFSET ] = 0x88887777; //
472 467 wf_snap_f0[ (i* NB_WORDS_SWF_BLK) + 1 + TIME_OFFSET ] = 0x22221111; //
473 468 wf_snap_f0[ (i* NB_WORDS_SWF_BLK) + 2 + TIME_OFFSET ] = 0x44443333; //
474 469
475 470 //***
476 471 // F1
477 472 wf_snap_f1[ (i* NB_WORDS_SWF_BLK) + 0 + TIME_OFFSET ] = 0x22221111;
478 473 wf_snap_f1[ (i* NB_WORDS_SWF_BLK) + 1 + TIME_OFFSET ] = 0x44443333;
479 474 wf_snap_f1[ (i* NB_WORDS_SWF_BLK) + 2 + TIME_OFFSET ] = 0xaaaa0000;
480 475
481 476 //***
482 477 // F2
483 478 wf_snap_f2[ (i* NB_WORDS_SWF_BLK) + 0 + TIME_OFFSET ] = 0x44443333;
484 479 wf_snap_f2[ (i* NB_WORDS_SWF_BLK) + 1 + TIME_OFFSET ] = 0x22221111;
485 480 wf_snap_f2[ (i* NB_WORDS_SWF_BLK) + 2 + TIME_OFFSET ] = 0xaaaa0000;
486 481
487 482 //***
488 483 // F3
489 484 //wf_cont_f3[ (i* NB_WORDS_SWF_BLK) + 0 ] = val1;
490 485 //wf_cont_f3[ (i* NB_WORDS_SWF_BLK) + 1 ] = val2;
491 486 //wf_cont_f3[ (i* NB_WORDS_SWF_BLK) + 2 ] = 0xaaaa0000;
492 487 }
493 488 }
494 489
495 490 int init_header_snapshot_wf_table( unsigned int sid, Header_TM_LFR_SCIENCE_SWF_t *headerSWF)
496 491 {
497 492 unsigned char i;
498 493
499 494 for (i=0; i<7; i++)
500 495 {
501 496 headerSWF[ i ].targetLogicalAddress = CCSDS_DESTINATION_ID;
502 497 headerSWF[ i ].protocolIdentifier = CCSDS_PROTOCOLE_ID;
503 498 headerSWF[ i ].reserved = DEFAULT_RESERVED;
504 499 headerSWF[ i ].userApplication = CCSDS_USER_APP;
505 500 headerSWF[ i ].packetID[0] = (unsigned char) (TM_PACKET_ID_SCIENCE_NORMAL_BURST >> 8);
506 501 headerSWF[ i ].packetID[1] = (unsigned char) (TM_PACKET_ID_SCIENCE_NORMAL_BURST);
507 502 if (i == 0)
508 503 {
509 504 headerSWF[ i ].packetSequenceControl[0] = TM_PACKET_SEQ_CTRL_FIRST;
510 505 headerSWF[ i ].packetLength[0] = (unsigned char) (TM_LEN_SCI_SWF_340 >> 8);
511 506 headerSWF[ i ].packetLength[1] = (unsigned char) (TM_LEN_SCI_SWF_340 );
512 507 headerSWF[ i ].blkNr[0] = (unsigned char) (BLK_NR_340 >> 8);
513 508 headerSWF[ i ].blkNr[1] = (unsigned char) (BLK_NR_340 );
514 509 }
515 510 else if (i == 6)
516 511 {
517 512 headerSWF[ i ].packetSequenceControl[0] = TM_PACKET_SEQ_CTRL_LAST;
518 513 headerSWF[ i ].packetLength[0] = (unsigned char) (TM_LEN_SCI_SWF_8 >> 8);
519 514 headerSWF[ i ].packetLength[1] = (unsigned char) (TM_LEN_SCI_SWF_8 );
520 515 headerSWF[ i ].blkNr[0] = (unsigned char) (BLK_NR_8 >> 8);
521 516 headerSWF[ i ].blkNr[1] = (unsigned char) (BLK_NR_8 );
522 517 }
523 518 else
524 519 {
525 520 headerSWF[ i ].packetSequenceControl[0] = TM_PACKET_SEQ_CTRL_CONTINUATION;
526 521 headerSWF[ i ].packetLength[0] = (unsigned char) (TM_LEN_SCI_SWF_340 >> 8);
527 522 headerSWF[ i ].packetLength[1] = (unsigned char) (TM_LEN_SCI_SWF_340 );
528 523 headerSWF[ i ].blkNr[0] = (unsigned char) (BLK_NR_340 >> 8);
529 524 headerSWF[ i ].blkNr[1] = (unsigned char) (BLK_NR_340 );
530 525 }
531 526 headerSWF[ i ].packetSequenceControl[1] = TM_PACKET_SEQ_CNT_DEFAULT;
532 527 headerSWF[ i ].pktCnt = DEFAULT_PKTCNT; // PKT_CNT
533 528 headerSWF[ i ].pktNr = i+1; // PKT_NR
534 529 // DATA FIELD HEADER
535 530 headerSWF[ i ].spare1_pusVersion_spare2 = DEFAULT_SPARE1_PUSVERSION_SPARE2;
536 531 headerSWF[ i ].serviceType = TM_TYPE_LFR_SCIENCE; // service type
537 532 headerSWF[ i ].serviceSubType = TM_SUBTYPE_LFR_SCIENCE; // service subtype
538 533 headerSWF[ i ].destinationID = TM_DESTINATION_ID_GROUND;
539 534 // AUXILIARY DATA HEADER
540 535 headerSWF[ i ].sid = sid;
541 536 headerSWF[ i ].hkBIA = DEFAULT_HKBIA;
542 537 headerSWF[ i ].time[0] = 0x00;
543 538 headerSWF[ i ].time[0] = 0x00;
544 539 headerSWF[ i ].time[0] = 0x00;
545 540 headerSWF[ i ].time[0] = 0x00;
546 541 headerSWF[ i ].time[0] = 0x00;
547 542 headerSWF[ i ].time[0] = 0x00;
548 543 }
549 544 return LFR_SUCCESSFUL;
550 545 }
551 546
552 547 int init_header_continuous_wf_table( unsigned int sid, Header_TM_LFR_SCIENCE_CWF_t *headerCWF )
553 548 {
554 549 unsigned int i;
555 550
556 551 for (i=0; i<7; i++)
557 552 {
558 553 headerCWF[ i ].targetLogicalAddress = CCSDS_DESTINATION_ID;
559 554 headerCWF[ i ].protocolIdentifier = CCSDS_PROTOCOLE_ID;
560 555 headerCWF[ i ].reserved = DEFAULT_RESERVED;
561 556 headerCWF[ i ].userApplication = CCSDS_USER_APP;
562 557 if ( (sid == SID_SBM1_CWF_F1) || (sid == SID_SBM2_CWF_F2) )
563 558 {
564 559 headerCWF[ i ].packetID[0] = (unsigned char) (TM_PACKET_ID_SCIENCE_SBM1_SBM2 >> 8);
565 560 headerCWF[ i ].packetID[1] = (unsigned char) (TM_PACKET_ID_SCIENCE_SBM1_SBM2);
566 561 }
567 562 else
568 563 {
569 564 headerCWF[ i ].packetID[0] = (unsigned char) (TM_PACKET_ID_SCIENCE_NORMAL_BURST >> 8);
570 565 headerCWF[ i ].packetID[1] = (unsigned char) (TM_PACKET_ID_SCIENCE_NORMAL_BURST);
571 566 }
572 567 if (i == 0)
573 568 {
574 569 headerCWF[ i ].packetSequenceControl[0] = TM_PACKET_SEQ_CTRL_FIRST;
575 570 headerCWF[ i ].packetLength[0] = (unsigned char) (TM_LEN_SCI_CWF_340 >> 8);
576 571 headerCWF[ i ].packetLength[1] = (unsigned char) (TM_LEN_SCI_CWF_340 );
577 572 headerCWF[ i ].blkNr[0] = (unsigned char) (BLK_NR_340 >> 8);
578 573 headerCWF[ i ].blkNr[1] = (unsigned char) (BLK_NR_340 );
579 574 }
580 575 else if (i == 6)
581 576 {
582 577 headerCWF[ i ].packetSequenceControl[0] = TM_PACKET_SEQ_CTRL_LAST;
583 578 headerCWF[ i ].packetLength[0] = (unsigned char) (TM_LEN_SCI_CWF_8 >> 8);
584 579 headerCWF[ i ].packetLength[1] = (unsigned char) (TM_LEN_SCI_CWF_8 );
585 580 headerCWF[ i ].blkNr[0] = (unsigned char) (BLK_NR_8 >> 8);
586 581 headerCWF[ i ].blkNr[1] = (unsigned char) (BLK_NR_8 );
587 582 }
588 583 else
589 584 {
590 585 headerCWF[ i ].packetSequenceControl[0] = TM_PACKET_SEQ_CTRL_CONTINUATION;
591 586 headerCWF[ i ].packetLength[0] = (unsigned char) (TM_LEN_SCI_CWF_340 >> 8);
592 587 headerCWF[ i ].packetLength[1] = (unsigned char) (TM_LEN_SCI_CWF_340 );
593 588 headerCWF[ i ].blkNr[0] = (unsigned char) (BLK_NR_340 >> 8);
594 589 headerCWF[ i ].blkNr[1] = (unsigned char) (BLK_NR_340 );
595 590 }
596 591 headerCWF[ i ].packetSequenceControl[1] = TM_PACKET_SEQ_CNT_DEFAULT;
597 592 // PKT_CNT
598 593 // PKT_NR
599 594 // DATA FIELD HEADER
600 595 headerCWF[ i ].spare1_pusVersion_spare2 = DEFAULT_SPARE1_PUSVERSION_SPARE2;
601 596 headerCWF[ i ].serviceType = TM_TYPE_LFR_SCIENCE; // service type
602 597 headerCWF[ i ].serviceSubType = TM_SUBTYPE_LFR_SCIENCE; // service subtype
603 598 headerCWF[ i ].destinationID = TM_DESTINATION_ID_GROUND;
604 599 // AUXILIARY DATA HEADER
605 600 headerCWF[ i ].sid = sid;
606 601 headerCWF[ i ].hkBIA = DEFAULT_HKBIA;
607 602 headerCWF[ i ].time[0] = 0x00;
608 603 headerCWF[ i ].time[0] = 0x00;
609 604 headerCWF[ i ].time[0] = 0x00;
610 605 headerCWF[ i ].time[0] = 0x00;
611 606 headerCWF[ i ].time[0] = 0x00;
612 607 headerCWF[ i ].time[0] = 0x00;
613 608 }
614 609 return LFR_SUCCESSFUL;
615 610 }
616 611
617 612 int init_header_continuous_wf3_light_table( Header_TM_LFR_SCIENCE_CWF_t *headerCWF )
618 613 {
619 614 unsigned int i;
620 615
621 616 for (i=0; i<7; i++)
622 617 {
623 618 headerCWF[ i ].targetLogicalAddress = CCSDS_DESTINATION_ID;
624 619 headerCWF[ i ].protocolIdentifier = CCSDS_PROTOCOLE_ID;
625 620 headerCWF[ i ].reserved = DEFAULT_RESERVED;
626 621 headerCWF[ i ].userApplication = CCSDS_USER_APP;
627 622
628 623 headerCWF[ i ].packetID[0] = (unsigned char) (TM_PACKET_ID_SCIENCE_NORMAL_BURST >> 8);
629 624 headerCWF[ i ].packetID[1] = (unsigned char) (TM_PACKET_ID_SCIENCE_NORMAL_BURST);
630 625 if (i == 0)
631 626 {
632 627 headerCWF[ i ].packetSequenceControl[0] = TM_PACKET_SEQ_CTRL_FIRST;
633 628 headerCWF[ i ].packetLength[0] = (unsigned char) (TM_LEN_SCI_CWF3_LIGHT_340 >> 8);
634 629 headerCWF[ i ].packetLength[1] = (unsigned char) (TM_LEN_SCI_CWF3_LIGHT_340 );
635 630 headerCWF[ i ].blkNr[0] = (unsigned char) (BLK_NR_340 >> 8);
636 631 headerCWF[ i ].blkNr[1] = (unsigned char) (BLK_NR_340 );
637 632 }
638 633 else if (i == 6)
639 634 {
640 635 headerCWF[ i ].packetSequenceControl[0] = TM_PACKET_SEQ_CTRL_LAST;
641 636 headerCWF[ i ].packetLength[0] = (unsigned char) (TM_LEN_SCI_CWF3_LIGHT_8 >> 8);
642 637 headerCWF[ i ].packetLength[1] = (unsigned char) (TM_LEN_SCI_CWF3_LIGHT_8 );
643 638 headerCWF[ i ].blkNr[0] = (unsigned char) (BLK_NR_8 >> 8);
644 639 headerCWF[ i ].blkNr[1] = (unsigned char) (BLK_NR_8 );
645 640 }
646 641 else
647 642 {
648 643 headerCWF[ i ].packetSequenceControl[0] = TM_PACKET_SEQ_CTRL_CONTINUATION;
649 644 headerCWF[ i ].packetLength[0] = (unsigned char) (TM_LEN_SCI_CWF3_LIGHT_340 >> 8);
650 645 headerCWF[ i ].packetLength[1] = (unsigned char) (TM_LEN_SCI_CWF3_LIGHT_340 );
651 646 headerCWF[ i ].blkNr[0] = (unsigned char) (BLK_NR_340 >> 8);
652 647 headerCWF[ i ].blkNr[1] = (unsigned char) (BLK_NR_340 );
653 648 }
654 649 headerCWF[ i ].packetSequenceControl[1] = TM_PACKET_SEQ_CNT_DEFAULT;
655 650 // DATA FIELD HEADER
656 651 headerCWF[ i ].spare1_pusVersion_spare2 = DEFAULT_SPARE1_PUSVERSION_SPARE2;
657 652 headerCWF[ i ].serviceType = TM_TYPE_LFR_SCIENCE; // service type
658 653 headerCWF[ i ].serviceSubType = TM_SUBTYPE_LFR_SCIENCE; // service subtype
659 654 headerCWF[ i ].destinationID = TM_DESTINATION_ID_GROUND;
660 655 // AUXILIARY DATA HEADER
661 656 headerCWF[ i ].sid = SID_NORM_CWF_F3;
662 657 headerCWF[ i ].hkBIA = DEFAULT_HKBIA;
663 658 headerCWF[ i ].time[0] = 0x00;
664 659 headerCWF[ i ].time[0] = 0x00;
665 660 headerCWF[ i ].time[0] = 0x00;
666 661 headerCWF[ i ].time[0] = 0x00;
667 662 headerCWF[ i ].time[0] = 0x00;
668 663 headerCWF[ i ].time[0] = 0x00;
669 664 }
670 665 return LFR_SUCCESSFUL;
671 666 }
672 667
673 668 void reset_waveforms( void )
674 669 {
675 670 int i = 0;
676 671
677 672 for (i=0; i< NB_SAMPLES_PER_SNAPSHOT; i++)
678 673 {
679 674 wf_snap_f0[ (i* NB_WORDS_SWF_BLK) + 0 + TIME_OFFSET] = 0x10002000;
680 675 wf_snap_f0[ (i* NB_WORDS_SWF_BLK) + 1 + TIME_OFFSET] = 0x20001000;
681 676 wf_snap_f0[ (i* NB_WORDS_SWF_BLK) + 2 + TIME_OFFSET] = 0x40008000;
682 677
683 678 //***
684 679 // F1
685 680 wf_snap_f1[ (i* NB_WORDS_SWF_BLK) + 0 + TIME_OFFSET] = 0x1000f000;
686 681 wf_snap_f1[ (i* NB_WORDS_SWF_BLK) + 1 + TIME_OFFSET] = 0xf0001000;
687 682 wf_snap_f1[ (i* NB_WORDS_SWF_BLK) + 2 + TIME_OFFSET] = 0x40008000;
688 683
689 684 //***
690 685 // F2
691 686 wf_snap_f2[ (i* NB_WORDS_SWF_BLK) + 0 + TIME_OFFSET] = 0x40008000;
692 687 wf_snap_f2[ (i* NB_WORDS_SWF_BLK) + 1 + TIME_OFFSET] = 0x20001000;
693 688 wf_snap_f2[ (i* NB_WORDS_SWF_BLK) + 2 + TIME_OFFSET] = 0x10002000;
694 689
695 690 //***
696 691 // F3
697 692 /*wf_cont_f3[ i* NB_WORDS_SWF_BLK + 0 ] = build_value( i, i ); // v and 1
698 693 wf_cont_f3[ i* NB_WORDS_SWF_BLK + 1 ] = build_value( i, i ); // e2 and b1
699 694 wf_cont_f3[ i* NB_WORDS_SWF_BLK + 2 ] = build_value( i, i ); // b2 and b3*/
700 695 }
701 696 }
702 697
703 698 int send_waveform_SWF( volatile int *waveform, unsigned int sid,
704 699 Header_TM_LFR_SCIENCE_SWF_t *headerSWF, rtems_id queue_id )
705 700 {
706 701 /** This function sends SWF CCSDS packets (F2, F1 or F0).
707 702 *
708 703 * @param waveform points to the buffer containing the data that will be send.
709 704 * @param sid is the source identifier of the data that will be sent.
710 705 * @param headerSWF points to a table of headers that have been prepared for the data transmission.
711 706 * @param queue_id is the id of the rtems queue to which spw_ioctl_pkt_send structures will be send. The structures
712 707 * contain information to setup the transmission of the data packets.
713 708 *
714 709 * One group of 2048 samples is sent as 7 consecutive packets, 6 packets containing 340 blocks and 8 packets containing 8 blocks.
715 710 *
716 711 */
717 712
718 713 unsigned int i;
719 714 int ret;
720 715 rtems_status_code status;
721 716 spw_ioctl_pkt_send spw_ioctl_send_SWF;
722 717
723 718 spw_ioctl_send_SWF.hlen = TM_HEADER_LEN + 4 + 12; // + 4 is for the protocole extra header, + 12 is for the auxiliary header
724 719 spw_ioctl_send_SWF.options = 0;
725 720
726 721 ret = LFR_DEFAULT;
727 722
728 723 for (i=0; i<7; i++) // send waveform
729 724 {
730 725 spw_ioctl_send_SWF.data = (char*) &waveform[ (i * 340 * NB_WORDS_SWF_BLK) ];
731 726 spw_ioctl_send_SWF.hdr = (char*) &headerSWF[ i ];
732 727 // BUILD THE DATA
733 728 if (i==6) {
734 729 spw_ioctl_send_SWF.dlen = 8 * NB_BYTES_SWF_BLK;
735 730 }
736 731 else {
737 732 spw_ioctl_send_SWF.dlen = 340 * NB_BYTES_SWF_BLK;
738 733 }
739 734 // SET PACKET TIME
735 headerSWF[ i ].acquisitionTime[0] = (unsigned char) (time_management_regs->coarse_time>>24);
736 headerSWF[ i ].acquisitionTime[1] = (unsigned char) (time_management_regs->coarse_time>>16);
737 headerSWF[ i ].acquisitionTime[2] = (unsigned char) (time_management_regs->coarse_time>>8);
738 headerSWF[ i ].acquisitionTime[3] = (unsigned char) (time_management_regs->coarse_time);
739 headerSWF[ i ].acquisitionTime[4] = (unsigned char) (time_management_regs->fine_time>>8);
740 headerSWF[ i ].acquisitionTime[5] = (unsigned char) (time_management_regs->fine_time);
740 741 headerSWF[ i ].time[0] = (unsigned char) (time_management_regs->coarse_time>>24);
741 742 headerSWF[ i ].time[1] = (unsigned char) (time_management_regs->coarse_time>>16);
742 743 headerSWF[ i ].time[2] = (unsigned char) (time_management_regs->coarse_time>>8);
743 744 headerSWF[ i ].time[3] = (unsigned char) (time_management_regs->coarse_time);
744 745 headerSWF[ i ].time[4] = (unsigned char) (time_management_regs->fine_time>>8);
745 746 headerSWF[ i ].time[5] = (unsigned char) (time_management_regs->fine_time);
746 headerSWF[ i ].acquisitionTime[0] = (unsigned char) (time_management_regs->coarse_time>>24);
747 headerSWF[ i ].acquisitionTime[1] = (unsigned char) (time_management_regs->coarse_time>>16);
748 headerSWF[ i ].acquisitionTime[2] = (unsigned char) (time_management_regs->coarse_time>>8);
749 headerSWF[ i ].acquisitionTime[3] = (unsigned char) (time_management_regs->coarse_time);
750 headerSWF[ i ].acquisitionTime[4] = (unsigned char) (time_management_regs->fine_time>>8);
751 headerSWF[ i ].acquisitionTime[5] = (unsigned char) (time_management_regs->fine_time);
752 747 // SEND PACKET
753 748 status = rtems_message_queue_send( queue_id, &spw_ioctl_send_SWF, ACTION_MSG_SPW_IOCTL_SEND_SIZE);
754 749 if (status != RTEMS_SUCCESSFUL) {
755 750 printf("%d-%d, ERR %d\n", sid, i, (int) status);
756 751 ret = LFR_DEFAULT;
757 752 }
758 753 rtems_task_wake_after(TIME_BETWEEN_TWO_SWF_PACKETS); // 300 ms between each packet => 7 * 3 = 21 packets => 6.3 seconds
759 754 }
760 755
761 756 return ret;
762 757 }
763 758
764 759 int send_waveform_CWF(volatile int *waveform, unsigned int sid,
765 760 Header_TM_LFR_SCIENCE_CWF_t *headerCWF, rtems_id queue_id)
766 761 {
767 762 /** This function sends CWF CCSDS packets (F2, F1 or F0).
768 763 *
769 764 * @param waveform points to the buffer containing the data that will be send.
770 765 * @param sid is the source identifier of the data that will be sent.
771 766 * @param headerCWF points to a table of headers that have been prepared for the data transmission.
772 767 * @param queue_id is the id of the rtems queue to which spw_ioctl_pkt_send structures will be send. The structures
773 768 * contain information to setup the transmission of the data packets.
774 769 *
775 770 * One group of 2048 samples is sent as 7 consecutive packets, 6 packets containing 340 blocks and 8 packets containing 8 blocks.
776 771 *
777 772 */
778 773
779 774 unsigned int i;
780 775 int ret;
781 776 rtems_status_code status;
782 777 spw_ioctl_pkt_send spw_ioctl_send_CWF;
783 778
784 779 spw_ioctl_send_CWF.hlen = TM_HEADER_LEN + 4 + 10; // + 4 is for the protocole extra header, + 10 is for the auxiliary header
785 780 spw_ioctl_send_CWF.options = 0;
786 781
787 782 ret = LFR_DEFAULT;
788 783
789 784 for (i=0; i<7; i++) // send waveform
790 785 {
791 786 int coarseTime = 0x00;
792 787 int fineTime = 0x00;
793 788 spw_ioctl_send_CWF.data = (char*) &waveform[ (i * 340 * NB_WORDS_SWF_BLK) ];
794 789 spw_ioctl_send_CWF.hdr = (char*) &headerCWF[ i ];
795 790 // BUILD THE DATA
796 791 if (i==6) {
797 792 spw_ioctl_send_CWF.dlen = 8 * NB_BYTES_SWF_BLK;
798 793 }
799 794 else {
800 795 spw_ioctl_send_CWF.dlen = 340 * NB_BYTES_SWF_BLK;
801 796 }
802 797 // SET PACKET TIME
803 798 coarseTime = time_management_regs->coarse_time;
804 799 fineTime = time_management_regs->fine_time;
800 headerCWF[ i ].acquisitionTime[0] = (unsigned char) (coarseTime>>24);
801 headerCWF[ i ].acquisitionTime[1] = (unsigned char) (coarseTime>>16);
802 headerCWF[ i ].acquisitionTime[2] = (unsigned char) (coarseTime>>8);
803 headerCWF[ i ].acquisitionTime[3] = (unsigned char) (coarseTime);
804 headerCWF[ i ].acquisitionTime[4] = (unsigned char) (fineTime>>8);
805 headerCWF[ i ].acquisitionTime[5] = (unsigned char) (fineTime);
805 806 headerCWF[ i ].time[0] = (unsigned char) (coarseTime>>24);
806 807 headerCWF[ i ].time[1] = (unsigned char) (coarseTime>>16);
807 808 headerCWF[ i ].time[2] = (unsigned char) (coarseTime>>8);
808 809 headerCWF[ i ].time[3] = (unsigned char) (coarseTime);
809 810 headerCWF[ i ].time[4] = (unsigned char) (fineTime>>8);
810 811 headerCWF[ i ].time[5] = (unsigned char) (fineTime);
811 headerCWF[ i ].acquisitionTime[0] = (unsigned char) (coarseTime>>24);
812 headerCWF[ i ].acquisitionTime[1] = (unsigned char) (coarseTime>>16);
813 headerCWF[ i ].acquisitionTime[2] = (unsigned char) (coarseTime>>8);
814 headerCWF[ i ].acquisitionTime[3] = (unsigned char) (coarseTime);
815 headerCWF[ i ].acquisitionTime[4] = (unsigned char) (fineTime>>8);
816 headerCWF[ i ].acquisitionTime[5] = (unsigned char) (fineTime);
817 812 // SEND PACKET
818 813 if (sid == SID_NORM_CWF_F3)
819 814 {
820 815 status = rtems_message_queue_send( queue_id, &spw_ioctl_send_CWF, sizeof(spw_ioctl_send_CWF));
821 816 if (status != RTEMS_SUCCESSFUL) {
822 817 printf("%d-%d, ERR %d\n", sid, i, (int) status);
823 818 ret = LFR_DEFAULT;
824 819 }
825 820 rtems_task_wake_after(TIME_BETWEEN_TWO_CWF3_PACKETS);
826 821 }
827 822 else
828 823 {
829 824 status = rtems_message_queue_send( queue_id, &spw_ioctl_send_CWF, sizeof(spw_ioctl_send_CWF));
830 825 if (status != RTEMS_SUCCESSFUL) {
831 826 printf("%d-%d, ERR %d\n", sid, i, (int) status);
832 827 ret = LFR_DEFAULT;
833 828 }
834 829 }
835 830 }
836 831
837 832 return ret;
838 833 }
839 834
840 835 int send_waveform_CWF3_light(volatile int *waveform, Header_TM_LFR_SCIENCE_CWF_t *headerCWF, rtems_id queue_id)
841 836 {
842 837 /** This function sends CWF_F3 CCSDS packets without the b1, b2 and b3 data.
843 838 *
844 839 * @param waveform points to the buffer containing the data that will be send.
845 840 * @param headerCWF points to a table of headers that have been prepared for the data transmission.
846 841 * @param queue_id is the id of the rtems queue to which spw_ioctl_pkt_send structures will be send. The structures
847 842 * contain information to setup the transmission of the data packets.
848 843 *
849 844 * By default, CWF_F3 packet are send without the b1, b2 and b3 data. This function rebuilds a data buffer
850 845 * from the incoming data and sends it in 7 packets, 6 containing 340 blocks and 1 one containing 8 blocks.
851 846 *
852 847 */
853 848
854 849 unsigned int i;
855 850 int ret;
856 851 rtems_status_code status;
857 852 spw_ioctl_pkt_send spw_ioctl_send_CWF;
858 853 char *sample;
859 854
860 855 spw_ioctl_send_CWF.hlen = TM_HEADER_LEN + 4 + 10; // + 4 is for the protocole extra header, + 10 is for the auxiliary header
861 856 spw_ioctl_send_CWF.options = 0;
862 857
863 858 ret = LFR_DEFAULT;
864 859
865 860 //**********************
866 861 // BUILD CWF3_light DATA
867 862 for ( i=0; i< 2048; i++)
868 863 {
869 864 sample = (char*) &waveform[ i * NB_WORDS_SWF_BLK ];
870 865 wf_cont_f3_light[ (i * NB_BYTES_CWF3_LIGHT_BLK) ] = sample[ 0 ];
871 866 wf_cont_f3_light[ (i * NB_BYTES_CWF3_LIGHT_BLK) + 1 ] = sample[ 1 ];
872 867 wf_cont_f3_light[ (i * NB_BYTES_CWF3_LIGHT_BLK) + 2 ] = sample[ 2 ];
873 868 wf_cont_f3_light[ (i * NB_BYTES_CWF3_LIGHT_BLK) + 3 ] = sample[ 3 ];
874 869 wf_cont_f3_light[ (i * NB_BYTES_CWF3_LIGHT_BLK) + 4 ] = sample[ 4 ];
875 870 wf_cont_f3_light[ (i * NB_BYTES_CWF3_LIGHT_BLK) + 5 ] = sample[ 5 ];
876 871 }
877 872
878 873 //*********************
879 874 // SEND CWF3_light DATA
880 875
881 876 for (i=0; i<7; i++) // send waveform
882 877 {
883 878 int coarseTime = 0x00;
884 879 int fineTime = 0x00;
885 880 spw_ioctl_send_CWF.data = (char*) &wf_cont_f3_light[ (i * 340 * NB_BYTES_CWF3_LIGHT_BLK) ];
886 881 spw_ioctl_send_CWF.hdr = (char*) &headerCWF[ i ];
887 882 // BUILD THE DATA
888 883 if ( i == WFRM_INDEX_OF_LAST_PACKET ) {
889 884 spw_ioctl_send_CWF.dlen = 8 * NB_BYTES_CWF3_LIGHT_BLK;
890 885 }
891 886 else {
892 887 spw_ioctl_send_CWF.dlen = 340 * NB_BYTES_CWF3_LIGHT_BLK;
893 888 }
894 889 // SET PACKET TIME
895 890 coarseTime = time_management_regs->coarse_time;
896 891 fineTime = time_management_regs->fine_time;
892 headerCWF[ i ].acquisitionTime[0] = (unsigned char) (coarseTime>>24);
893 headerCWF[ i ].acquisitionTime[1] = (unsigned char) (coarseTime>>16);
894 headerCWF[ i ].acquisitionTime[2] = (unsigned char) (coarseTime>>8);
895 headerCWF[ i ].acquisitionTime[3] = (unsigned char) (coarseTime);
896 headerCWF[ i ].acquisitionTime[4] = (unsigned char) (fineTime>>8);
897 headerCWF[ i ].acquisitionTime[5] = (unsigned char) (fineTime);
897 898 headerCWF[ i ].time[0] = (unsigned char) (coarseTime>>24);
898 899 headerCWF[ i ].time[1] = (unsigned char) (coarseTime>>16);
899 900 headerCWF[ i ].time[2] = (unsigned char) (coarseTime>>8);
900 901 headerCWF[ i ].time[3] = (unsigned char) (coarseTime);
901 902 headerCWF[ i ].time[4] = (unsigned char) (fineTime>>8);
902 903 headerCWF[ i ].time[5] = (unsigned char) (fineTime);
903 headerCWF[ i ].acquisitionTime[0] = (unsigned char) (coarseTime>>24);
904 headerCWF[ i ].acquisitionTime[1] = (unsigned char) (coarseTime>>16);
905 headerCWF[ i ].acquisitionTime[2] = (unsigned char) (coarseTime>>8);
906 headerCWF[ i ].acquisitionTime[3] = (unsigned char) (coarseTime);
907 headerCWF[ i ].acquisitionTime[4] = (unsigned char) (fineTime>>8);
908 headerCWF[ i ].acquisitionTime[5] = (unsigned char) (fineTime);
909 904 // SEND PACKET
910 905 status = rtems_message_queue_send( queue_id, &spw_ioctl_send_CWF, sizeof(spw_ioctl_send_CWF));
911 906 if (status != RTEMS_SUCCESSFUL) {
912 907 printf("%d-%d, ERR %d\n", SID_NORM_CWF_F3, i, (int) status);
913 908 ret = LFR_DEFAULT;
914 909 }
915 910 rtems_task_wake_after(TIME_BETWEEN_TWO_CWF3_PACKETS);
916 911 }
917 912
918 913 return ret;
919 914 }
920 915
921 916
922 917 //**************
923 918 // wfp registers
924 919 void set_wfp_data_shaping()
925 920 {
926 921 /** This function sets the data_shaping register of the waveform picker module.
927 922 *
928 923 * The value is read from one field of the parameter_dump_packet structure:\n
929 924 * bw_sp0_sp1_r0_r1
930 925 *
931 926 */
932 927
933 928 unsigned char data_shaping;
934 929
935 930 // get the parameters for the data shaping [BW SP0 SP1 R0 R1] in sy_lfr_common1 and configure the register
936 931 // waveform picker : [R1 R0 SP1 SP0 BW]
937 932
938 933 data_shaping = parameter_dump_packet.bw_sp0_sp1_r0_r1;
939 934
940 935 #ifdef GSA
941 936 #else
942 937 waveform_picker_regs->data_shaping =
943 938 ( (data_shaping & 0x10) >> 4 ) // BW
944 939 + ( (data_shaping & 0x08) >> 2 ) // SP0
945 940 + ( (data_shaping & 0x04) ) // SP1
946 941 + ( (data_shaping & 0x02) << 2 ) // R0
947 942 + ( (data_shaping & 0x01) << 4 ); // R1
948 943 #endif
949 944 }
950 945
951 946 char set_wfp_delta_snapshot()
952 947 {
953 948 /** This function sets the delta_snapshot register of the waveform picker module.
954 949 *
955 950 * The value is read from two (unsigned char) of the parameter_dump_packet structure:
956 951 * - sy_lfr_n_swf_p[0]
957 952 * - sy_lfr_n_swf_p[1]
958 953 *
959 954 */
960 955
961 956 char ret;
962 957 unsigned int delta_snapshot;
963 958 unsigned int aux;
964 959
965 960 aux = 0;
966 961 ret = LFR_DEFAULT;
967 962
968 963 delta_snapshot = parameter_dump_packet.sy_lfr_n_swf_p[0]*256
969 964 + parameter_dump_packet.sy_lfr_n_swf_p[1];
970 965
971 966 #ifdef GSA
972 967 #else
973 968 if ( delta_snapshot < MIN_DELTA_SNAPSHOT )
974 969 {
975 970 aux = MIN_DELTA_SNAPSHOT;
976 971 ret = LFR_DEFAULT;
977 972 }
978 973 else
979 974 {
980 975 aux = delta_snapshot ;
981 976 ret = LFR_SUCCESSFUL;
982 977 }
983 978 waveform_picker_regs->delta_snapshot = aux - 1; // max 2 bytes
984 979 #endif
985 980
986 981 return ret;
987 982 }
988 983
989 984 void set_wfp_burst_enable_register( unsigned char mode)
990 985 {
991 986 /** This function sets the waveform picker burst_enable register depending on the mode.
992 987 *
993 988 * @param mode is the LFR mode to launch.
994 989 *
995 990 * The burst bits shall be before the enable bits.
996 991 *
997 992 */
998 993
999 994 #ifdef GSA
1000 995 #else
1001 996 // [0000 0000] burst f2, f1, f0 enable f3 f2 f1 f0
1002 997 // the burst bits shall be set first, before the enable bits
1003 998 switch(mode) {
1004 999 case(LFR_MODE_NORMAL):
1005 1000 waveform_picker_regs->burst_enable = 0x00; // [0000 0000] no burst enable
1006 1001 waveform_picker_regs->burst_enable = 0x0f; // [0000 1111] enable f3 f2 f1 f0
1007 1002 break;
1008 1003 case(LFR_MODE_BURST):
1009 1004 waveform_picker_regs->burst_enable = 0x40; // [0100 0000] f2 burst enabled
1010 1005 waveform_picker_regs->burst_enable = waveform_picker_regs->burst_enable | 0x04; // [0100] enable f2
1011 1006 break;
1012 1007 case(LFR_MODE_SBM1):
1013 1008 waveform_picker_regs->burst_enable = 0x20; // [0010 0000] f1 burst enabled
1014 1009 waveform_picker_regs->burst_enable = waveform_picker_regs->burst_enable | 0x0f; // [1111] enable f3 f2 f1 f0
1015 1010 break;
1016 1011 case(LFR_MODE_SBM2):
1017 1012 waveform_picker_regs->burst_enable = 0x40; // [0100 0000] f2 burst enabled
1018 1013 waveform_picker_regs->burst_enable = waveform_picker_regs->burst_enable | 0x0f; // [1111] enable f3 f2 f1 f0
1019 1014 break;
1020 1015 default:
1021 1016 waveform_picker_regs->burst_enable = 0x00; // [0000 0000] no burst enabled, no waveform enabled
1022 1017 break;
1023 1018 }
1024 1019 #endif
1025 1020 }
1026 1021
1027 1022 void reset_wfp_burst_enable()
1028 1023 {
1029 1024 /** This function resets the waveform picker burst_enable register.
1030 1025 *
1031 1026 * The burst bits [f2 f1 f0] and the enable bits [f3 f2 f1 f0] are set to 0.
1032 1027 *
1033 1028 */
1034 1029
1035 1030 #ifdef GSA
1036 1031 #else
1037 1032 waveform_picker_regs->burst_enable = 0x00; // burst f2, f1, f0 enable f3, f2, f1, f0
1038 1033 #endif
1039 1034 }
1040 1035
1041 1036 void reset_wfp_status()
1042 1037 {
1043 1038 /** This function resets the waveform picker status register.
1044 1039 *
1045 1040 * All status bits are set to 0 [new_err full_err full].
1046 1041 *
1047 1042 */
1048 1043
1049 1044 #ifdef GSA
1050 1045 #else
1051 1046 waveform_picker_regs->status = 0x00; // burst f2, f1, f0 enable f3, f2, f1, f0
1052 1047 #endif
1053 1048 }
1054 1049
1055 1050 void reset_waveform_picker_regs()
1056 1051 {
1057 1052 /** This function resets the waveform picker module registers.
1058 1053 *
1059 1054 * The registers affected by this function are located at the following offset addresses:
1060 1055 * - 0x00 data_shaping
1061 1056 * - 0x04 burst_enable
1062 1057 * - 0x08 addr_data_f0
1063 1058 * - 0x0C addr_data_f1
1064 1059 * - 0x10 addr_data_f2
1065 1060 * - 0x14 addr_data_f3
1066 1061 * - 0x18 status
1067 1062 * - 0x1C delta_snapshot
1068 1063 * - 0x20 delta_f2_f1
1069 1064 * - 0x24 delta_f2_f0
1070 1065 * - 0x28 nb_burst
1071 1066 * - 0x2C nb_snapshot
1072 1067 *
1073 1068 */
1074 1069
1075 1070 #ifdef GSA
1076 1071 #else
1077 1072 set_wfp_data_shaping();
1078 1073 reset_wfp_burst_enable();
1079 1074 waveform_picker_regs->addr_data_f0 = (int) (wf_snap_f0); //
1080 1075 waveform_picker_regs->addr_data_f1 = (int) (wf_snap_f1); //
1081 1076 waveform_picker_regs->addr_data_f2 = (int) (wf_snap_f2); //
1082 1077 waveform_picker_regs->addr_data_f3 = (int) (wf_cont_f3); //
1083 1078 set_wfp_delta_snapshot(); // time in seconds between two snapshots
1084 1079 waveform_picker_regs->delta_f2_f1 = 0xffff; // 0x16800 => 92160 (max 4 bytes)
1085 1080 waveform_picker_regs->delta_f2_f0 = 0x17c00; // 97 280 (max 5 bytes)
1086 1081 waveform_picker_regs->nb_burst_available = 0x180; // max 3 bytes, size of the buffer in burst (1 burst = 16 x 4 octets)
1087 1082 waveform_picker_regs->nb_snapshot_param = 0x7ff; // max 3 octets, 2048 - 1
1088 1083 waveform_picker_regs->status = 0x00; //
1089 1084 #endif
1090 1085 }
1091 1086
1092 1087 //*****************
1093 1088 // local parameters
1094 1089 void set_local_sbm1_nb_cwf_max()
1095 1090 {
1096 1091 /** This function sets the value of the sbm1_nb_cwf_max local parameter.
1097 1092 *
1098 1093 * The sbm1_nb_cwf_max parameter counts the number of CWF_F1 records that have been sent.\n
1099 1094 * This parameter is used to send CWF_F1 data as normal data when the SBM1 is active.\n\n
1100 1095 * (2 snapshots of 2048 points per seconds) * (period of the NORM snashots) - 8 s (duration of the f2 snapshot)
1101 1096 *
1102 1097 */
1103 1098 param_local.local_sbm1_nb_cwf_max = 2 *
1104 1099 (parameter_dump_packet.sy_lfr_n_swf_p[0] * 256
1105 1100 + parameter_dump_packet.sy_lfr_n_swf_p[1]) - 8; // 16 CWF1 parts during 1 SWF2
1106 1101 }
1107 1102
1108 1103 void set_local_sbm2_nb_cwf_max()
1109 1104 {
1110 1105 /** This function sets the value of the sbm1_nb_cwf_max local parameter.
1111 1106 *
1112 1107 * The sbm1_nb_cwf_max parameter counts the number of CWF_F1 records that have been sent.\n
1113 1108 * This parameter is used to send CWF_F2 data as normal data when the SBM2 is active.\n\n
1114 1109 * (period of the NORM snashots) / (8 seconds per snapshot at f2 = 256 Hz)
1115 1110 *
1116 1111 */
1117 1112
1118 1113 param_local.local_sbm2_nb_cwf_max = (parameter_dump_packet.sy_lfr_n_swf_p[0] * 256
1119 1114 + parameter_dump_packet.sy_lfr_n_swf_p[1]) / 8;
1120 1115 }
1121 1116
1122 1117 void set_local_nb_interrupt_f0_MAX()
1123 1118 {
1124 1119 /** This function sets the value of the nb_interrupt_f0_MAX local parameter.
1125 1120 *
1126 1121 * This parameter is used for the SM validation only.\n
1127 1122 * The software waits param_local.local_nb_interrupt_f0_MAX interruptions from the spectral matrices
1128 1123 * module before launching a basic processing.
1129 1124 *
1130 1125 */
1131 1126
1132 1127 param_local.local_nb_interrupt_f0_MAX = ( (parameter_dump_packet.sy_lfr_n_asm_p[0]) * 256
1133 1128 + parameter_dump_packet.sy_lfr_n_asm_p[1] ) * 100;
1134 1129 }
1135 1130
1136 1131 void reset_local_sbm1_nb_cwf_sent()
1137 1132 {
1138 1133 /** This function resets the value of the sbm1_nb_cwf_sent local parameter.
1139 1134 *
1140 1135 * The sbm1_nb_cwf_sent parameter counts the number of CWF_F1 records that have been sent.\n
1141 1136 * This parameter is used to send CWF_F1 data as normal data when the SBM1 is active.
1142 1137 *
1143 1138 */
1144 1139
1145 1140 param_local.local_sbm1_nb_cwf_sent = 0;
1146 1141 }
1147 1142
1148 1143 void reset_local_sbm2_nb_cwf_sent()
1149 1144 {
1150 1145 /** This function resets the value of the sbm2_nb_cwf_sent local parameter.
1151 1146 *
1152 1147 * The sbm2_nb_cwf_sent parameter counts the number of CWF_F2 records that have been sent.\n
1153 1148 * This parameter is used to send CWF_F2 data as normal data when the SBM2 mode is active.
1154 1149 *
1155 1150 */
1156 1151
1157 1152 param_local.local_sbm2_nb_cwf_sent = 0;
1158 1153 }
1159 1154
1160 1155 rtems_id get_pkts_queue_id( void )
1161 1156 {
1162 1157 rtems_id queue_id;
1163 1158 rtems_status_code status;
1164 1159
1165 1160 status = rtems_message_queue_ident( misc_name[QUEUE_SEND], 0, &queue_id );
1166 1161 if (status != RTEMS_SUCCESSFUL)
1167 1162 {
1168 1163 PRINTF1("in get_pkts_queue_id *** ERR %d\n", status)
1169 1164 }
1170 1165 return queue_id;
1171 1166 }
General Comments 0
You need to be logged in to leave comments. Login now