##// END OF EJS Templates
rtems_message_queue_urgent is replaced by rtems_message_queue_send...
paul -
r36:303e7beebcc8 default
parent child
Show More
@@ -1,233 +1,233
1 1 #############################################################################
2 2 # Makefile for building: bin/fsw
3 # Generated by qmake (2.01a) (Qt 4.8.5) on: Tue Oct 8 10:15:40 2013
3 # Generated by qmake (2.01a) (Qt 4.8.5) on: Thu Oct 10 08:47:12 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=13 -DPRINT_MESSAGES_ON_CONSOLE
13 DEFINES = -DSW_VERSION_N1=0 -DSW_VERSION_N2=0 -DSW_VERSION_N3=0 -DSW_VERSION_N4=14 -DPRINT_MESSAGES_ON_CONSOLE
14 14 CFLAGS = -pipe -O3 -Wall $(DEFINES)
15 15 CXXFLAGS = -pipe -O3 -Wall $(DEFINES)
16 16 INCPATH = -I/usr/lib64/qt4/mkspecs/linux-g++ -I. -I../src -I../header
17 17 LINK = sparc-rtems-g++
18 18 LFLAGS =
19 19 LIBS = $(SUBLIBS)
20 20 AR = sparc-rtems-ar rcs
21 21 RANLIB =
22 22 QMAKE = /usr/bin/qmake-qt4
23 23 TAR = tar -cf
24 24 COMPRESS = gzip -9f
25 25 COPY = cp -f
26 26 SED = sed
27 27 COPY_FILE = $(COPY)
28 28 COPY_DIR = $(COPY) -r
29 29 STRIP = sparc-rtems-strip
30 30 INSTALL_FILE = install -m 644 -p
31 31 INSTALL_DIR = $(COPY_DIR)
32 32 INSTALL_PROGRAM = install -m 755 -p
33 33 DEL_FILE = rm -f
34 34 SYMLINK = ln -f -s
35 35 DEL_DIR = rmdir
36 36 MOVE = mv -f
37 37 CHK_DIR_EXISTS= test -d
38 38 MKDIR = mkdir -p
39 39
40 40 ####### Output directory
41 41
42 42 OBJECTS_DIR = obj/
43 43
44 44 ####### Files
45 45
46 46 SOURCES = ../src/wf_handler.c \
47 47 ../src/tc_handler.c \
48 48 ../src/fsw_processing.c \
49 49 ../src/fsw_misc.c \
50 50 ../src/fsw_init.c \
51 51 ../src/fsw_globals.c \
52 52 ../src/fsw_spacewire.c
53 53 OBJECTS = obj/wf_handler.o \
54 54 obj/tc_handler.o \
55 55 obj/fsw_processing.o \
56 56 obj/fsw_misc.o \
57 57 obj/fsw_init.o \
58 58 obj/fsw_globals.o \
59 59 obj/fsw_spacewire.o
60 60 DIST = /usr/lib64/qt4/mkspecs/common/unix.conf \
61 61 /usr/lib64/qt4/mkspecs/common/linux.conf \
62 62 /usr/lib64/qt4/mkspecs/common/gcc-base.conf \
63 63 /usr/lib64/qt4/mkspecs/common/gcc-base-unix.conf \
64 64 /usr/lib64/qt4/mkspecs/common/g++-base.conf \
65 65 /usr/lib64/qt4/mkspecs/common/g++-unix.conf \
66 66 /usr/lib64/qt4/mkspecs/qconfig.pri \
67 67 /usr/lib64/qt4/mkspecs/modules/qt_webkit.pri \
68 68 /usr/lib64/qt4/mkspecs/features/qt_functions.prf \
69 69 /usr/lib64/qt4/mkspecs/features/qt_config.prf \
70 70 /usr/lib64/qt4/mkspecs/features/exclusive_builds.prf \
71 71 /usr/lib64/qt4/mkspecs/features/default_pre.prf \
72 72 sparc.pri \
73 73 /usr/lib64/qt4/mkspecs/features/release.prf \
74 74 /usr/lib64/qt4/mkspecs/features/default_post.prf \
75 75 /usr/lib64/qt4/mkspecs/features/shared.prf \
76 76 /usr/lib64/qt4/mkspecs/features/unix/gdb_dwarf_index.prf \
77 77 /usr/lib64/qt4/mkspecs/features/warn_on.prf \
78 78 /usr/lib64/qt4/mkspecs/features/resources.prf \
79 79 /usr/lib64/qt4/mkspecs/features/uic.prf \
80 80 /usr/lib64/qt4/mkspecs/features/yacc.prf \
81 81 /usr/lib64/qt4/mkspecs/features/lex.prf \
82 82 /usr/lib64/qt4/mkspecs/features/include_source_dir.prf \
83 83 fsw-qt.pro
84 84 QMAKE_TARGET = fsw
85 85 DESTDIR = bin/
86 86 TARGET = bin/fsw
87 87
88 88 first: all
89 89 ####### Implicit rules
90 90
91 91 .SUFFIXES: .o .c .cpp .cc .cxx .C
92 92
93 93 .cpp.o:
94 94 $(CXX) -c $(CXXFLAGS) $(INCPATH) -o "$@" "$<"
95 95
96 96 .cc.o:
97 97 $(CXX) -c $(CXXFLAGS) $(INCPATH) -o "$@" "$<"
98 98
99 99 .cxx.o:
100 100 $(CXX) -c $(CXXFLAGS) $(INCPATH) -o "$@" "$<"
101 101
102 102 .C.o:
103 103 $(CXX) -c $(CXXFLAGS) $(INCPATH) -o "$@" "$<"
104 104
105 105 .c.o:
106 106 $(CC) -c $(CFLAGS) $(INCPATH) -o "$@" "$<"
107 107
108 108 ####### Build rules
109 109
110 110 all: Makefile $(TARGET)
111 111
112 112 $(TARGET): $(OBJECTS)
113 113 @$(CHK_DIR_EXISTS) bin/ || $(MKDIR) bin/
114 114 $(LINK) $(LFLAGS) -o $(TARGET) $(OBJECTS) $(OBJCOMP) $(LIBS)
115 115
116 116 Makefile: fsw-qt.pro /usr/lib64/qt4/mkspecs/linux-g++/qmake.conf /usr/lib64/qt4/mkspecs/common/unix.conf \
117 117 /usr/lib64/qt4/mkspecs/common/linux.conf \
118 118 /usr/lib64/qt4/mkspecs/common/gcc-base.conf \
119 119 /usr/lib64/qt4/mkspecs/common/gcc-base-unix.conf \
120 120 /usr/lib64/qt4/mkspecs/common/g++-base.conf \
121 121 /usr/lib64/qt4/mkspecs/common/g++-unix.conf \
122 122 /usr/lib64/qt4/mkspecs/qconfig.pri \
123 123 /usr/lib64/qt4/mkspecs/modules/qt_webkit.pri \
124 124 /usr/lib64/qt4/mkspecs/features/qt_functions.prf \
125 125 /usr/lib64/qt4/mkspecs/features/qt_config.prf \
126 126 /usr/lib64/qt4/mkspecs/features/exclusive_builds.prf \
127 127 /usr/lib64/qt4/mkspecs/features/default_pre.prf \
128 128 sparc.pri \
129 129 /usr/lib64/qt4/mkspecs/features/release.prf \
130 130 /usr/lib64/qt4/mkspecs/features/default_post.prf \
131 131 /usr/lib64/qt4/mkspecs/features/shared.prf \
132 132 /usr/lib64/qt4/mkspecs/features/unix/gdb_dwarf_index.prf \
133 133 /usr/lib64/qt4/mkspecs/features/warn_on.prf \
134 134 /usr/lib64/qt4/mkspecs/features/resources.prf \
135 135 /usr/lib64/qt4/mkspecs/features/uic.prf \
136 136 /usr/lib64/qt4/mkspecs/features/yacc.prf \
137 137 /usr/lib64/qt4/mkspecs/features/lex.prf \
138 138 /usr/lib64/qt4/mkspecs/features/include_source_dir.prf
139 139 $(QMAKE) -spec /usr/lib64/qt4/mkspecs/linux-g++ -o Makefile fsw-qt.pro
140 140 /usr/lib64/qt4/mkspecs/common/unix.conf:
141 141 /usr/lib64/qt4/mkspecs/common/linux.conf:
142 142 /usr/lib64/qt4/mkspecs/common/gcc-base.conf:
143 143 /usr/lib64/qt4/mkspecs/common/gcc-base-unix.conf:
144 144 /usr/lib64/qt4/mkspecs/common/g++-base.conf:
145 145 /usr/lib64/qt4/mkspecs/common/g++-unix.conf:
146 146 /usr/lib64/qt4/mkspecs/qconfig.pri:
147 147 /usr/lib64/qt4/mkspecs/modules/qt_webkit.pri:
148 148 /usr/lib64/qt4/mkspecs/features/qt_functions.prf:
149 149 /usr/lib64/qt4/mkspecs/features/qt_config.prf:
150 150 /usr/lib64/qt4/mkspecs/features/exclusive_builds.prf:
151 151 /usr/lib64/qt4/mkspecs/features/default_pre.prf:
152 152 sparc.pri:
153 153 /usr/lib64/qt4/mkspecs/features/release.prf:
154 154 /usr/lib64/qt4/mkspecs/features/default_post.prf:
155 155 /usr/lib64/qt4/mkspecs/features/shared.prf:
156 156 /usr/lib64/qt4/mkspecs/features/unix/gdb_dwarf_index.prf:
157 157 /usr/lib64/qt4/mkspecs/features/warn_on.prf:
158 158 /usr/lib64/qt4/mkspecs/features/resources.prf:
159 159 /usr/lib64/qt4/mkspecs/features/uic.prf:
160 160 /usr/lib64/qt4/mkspecs/features/yacc.prf:
161 161 /usr/lib64/qt4/mkspecs/features/lex.prf:
162 162 /usr/lib64/qt4/mkspecs/features/include_source_dir.prf:
163 163 qmake: FORCE
164 164 @$(QMAKE) -spec /usr/lib64/qt4/mkspecs/linux-g++ -o Makefile fsw-qt.pro
165 165
166 166 dist:
167 167 @$(CHK_DIR_EXISTS) obj/fsw1.0.0 || $(MKDIR) obj/fsw1.0.0
168 168 $(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
169 169
170 170
171 171 clean:compiler_clean
172 172 -$(DEL_FILE) $(OBJECTS)
173 173 -$(DEL_FILE) *~ core *.core
174 174
175 175
176 176 ####### Sub-libraries
177 177
178 178 distclean: clean
179 179 -$(DEL_FILE) $(TARGET)
180 180 -$(DEL_FILE) Makefile
181 181
182 182
183 183 grmon:
184 184 cd bin && C:/opt/grmon-eval-2.0.29b/win32/bin/grmon.exe -uart COM4 -u
185 185
186 186 check: first
187 187
188 188 compiler_rcc_make_all:
189 189 compiler_rcc_clean:
190 190 compiler_uic_make_all:
191 191 compiler_uic_clean:
192 192 compiler_image_collection_make_all: qmake_image_collection.cpp
193 193 compiler_image_collection_clean:
194 194 -$(DEL_FILE) qmake_image_collection.cpp
195 195 compiler_yacc_decl_make_all:
196 196 compiler_yacc_decl_clean:
197 197 compiler_yacc_impl_make_all:
198 198 compiler_yacc_impl_clean:
199 199 compiler_lex_make_all:
200 200 compiler_lex_clean:
201 201 compiler_clean:
202 202
203 203 ####### Compile
204 204
205 205 obj/wf_handler.o: ../src/wf_handler.c
206 206 $(CC) -c $(CFLAGS) $(INCPATH) -o obj/wf_handler.o ../src/wf_handler.c
207 207
208 208 obj/tc_handler.o: ../src/tc_handler.c
209 209 $(CC) -c $(CFLAGS) $(INCPATH) -o obj/tc_handler.o ../src/tc_handler.c
210 210
211 211 obj/fsw_processing.o: ../src/fsw_processing.c
212 212 $(CC) -c $(CFLAGS) $(INCPATH) -o obj/fsw_processing.o ../src/fsw_processing.c
213 213
214 214 obj/fsw_misc.o: ../src/fsw_misc.c
215 215 $(CC) -c $(CFLAGS) $(INCPATH) -o obj/fsw_misc.o ../src/fsw_misc.c
216 216
217 217 obj/fsw_init.o: ../src/fsw_init.c
218 218 $(CC) -c $(CFLAGS) $(INCPATH) -o obj/fsw_init.o ../src/fsw_init.c
219 219
220 220 obj/fsw_globals.o: ../src/fsw_globals.c
221 221 $(CC) -c $(CFLAGS) $(INCPATH) -o obj/fsw_globals.o ../src/fsw_globals.c
222 222
223 223 obj/fsw_spacewire.o: ../src/fsw_spacewire.c
224 224 $(CC) -c $(CFLAGS) $(INCPATH) -o obj/fsw_spacewire.o ../src/fsw_spacewire.c
225 225
226 226 ####### Install
227 227
228 228 install: FORCE
229 229
230 230 uninstall: FORCE
231 231
232 232 FORCE:
233 233
1 NO CONTENT: modified file, binary diff hidden
@@ -1,62 +1,62
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 4 CONFIG += console verbose
5 5 CONFIG -= qt
6 6
7 7 include(./sparc.pri)
8 8
9 9 # flight software version
10 SWVERSION=-0-13
10 SWVERSION=-0-14
11 11 DEFINES += SW_VERSION_N1=0
12 12 DEFINES += SW_VERSION_N2=0
13 13 DEFINES += SW_VERSION_N3=0
14 DEFINES += SW_VERSION_N4=13
14 DEFINES += SW_VERSION_N4=14
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 TARGET = fsw
33 33 contains( CONFIG, gsa ) {
34 34 DEFINES += GSA
35 35 TARGET = fsw-gsa
36 36 }
37 37
38 38 INCLUDEPATH += \
39 39 ../src \
40 40 ../header
41 41
42 42 SOURCES += \
43 43 ../src/wf_handler.c \
44 44 ../src/tc_handler.c \
45 45 ../src/fsw_processing.c \
46 46 ../src/fsw_misc.c \
47 47 ../src/fsw_init.c \
48 48 ../src/fsw_globals.c \
49 49 ../src/fsw_spacewire.c
50 50
51 51 HEADERS += \
52 52 ../header/wf_handler.h \
53 53 ../header/tc_handler.h \
54 54 ../header/grlib_regs.h \
55 55 ../header/fsw_processing.h \
56 56 ../header/fsw_params.h \
57 57 ../header/fsw_misc.h \
58 58 ../header/fsw_init.h \
59 59 ../header/ccsds_types.h \
60 60 ../header/fsw_params_processing.h \
61 61 ../header/fsw_spacewire.h
62 62
@@ -1,257 +1,257
1 1 <?xml version="1.0" encoding="UTF-8"?>
2 2 <!DOCTYPE QtCreatorProject>
3 <!-- Written by QtCreator 2.8.0, 2013-10-08T06:59:51. -->
3 <!-- Written by QtCreator 2.8.0, 2013-10-10T08:42:40. -->
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">0</value>
60 60 <valuemap type="QVariantMap" key="ProjectExplorer.Target.BuildConfiguration.0">
61 61 <valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.0">
62 62 <valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
63 63 <value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
64 64 <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">qmake</value>
65 65 <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
66 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 </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 <value type="int" key="ProjectExplorer.Target.RunConfigurationCount">1</value>
243 243 </valuemap>
244 244 </data>
245 245 <data>
246 246 <variable>ProjectExplorer.Project.TargetCount</variable>
247 247 <value type="int">1</value>
248 248 </data>
249 249 <data>
250 250 <variable>ProjectExplorer.Project.Updater.EnvironmentId</variable>
251 251 <value type="QByteArray">{2e58a81f-9962-4bba-ae6b-760177f0656c}</value>
252 252 </data>
253 253 <data>
254 254 <variable>ProjectExplorer.Project.Updater.FileVersion</variable>
255 255 <value type="int">14</value>
256 256 </data>
257 257 </qtcreator>
@@ -1,1414 +1,1410
1 1 #include <tc_handler.h>
2 2 #include <fsw_params.h>
3 3
4 4 char *DumbMessages[6] = {"in DUMB *** default", // RTEMS_EVENT_0
5 5 "in DUMB *** timecode_irq_handler", // RTEMS_EVENT_1
6 6 "in DUMB *** waveforms_isr", // RTEMS_EVENT_2
7 7 "in DUMB *** in SMIQ *** Error sending event to AVF0", // RTEMS_EVENT_3
8 8 "in DUMB *** spectral_matrices_isr *** Error sending event to SMIQ", // RTEMS_EVENT_4
9 9 "in DUMB *** waveforms_simulator_isr" // RTEMS_EVENT_5
10 10 };
11 11
12 12 unsigned char currentTC_LEN_RCV[2]; // SHALL be equal to the current TC packet estimated packet length field
13 13 unsigned char currentTC_COMPUTED_CRC[2];
14 14 unsigned int currentTC_LEN_RCV_AsUnsignedInt;
15 15 unsigned int currentTM_length;
16 16 unsigned char currentTC_processedFlag;
17 17
18 18 unsigned int lookUpTableForCRC[256];
19 19
20 20 //**********************
21 21 // GENERAL USE FUNCTIONS
22 22 unsigned int Crc_opt( unsigned char D, unsigned int Chk)
23 23 {
24 24 return(((Chk << 8) & 0xff00)^lookUpTableForCRC [(((Chk >> 8)^D) & 0x00ff)]);
25 25 }
26 26
27 27 void initLookUpTableForCRC( void )
28 28 {
29 29 unsigned int i;
30 30 unsigned int tmp;
31 31
32 32 for (i=0; i<256; i++)
33 33 {
34 34 tmp = 0;
35 35 if((i & 1) != 0) {
36 36 tmp = tmp ^ 0x1021;
37 37 }
38 38 if((i & 2) != 0) {
39 39 tmp = tmp ^ 0x2042;
40 40 }
41 41 if((i & 4) != 0) {
42 42 tmp = tmp ^ 0x4084;
43 43 }
44 44 if((i & 8) != 0) {
45 45 tmp = tmp ^ 0x8108;
46 46 }
47 47 if((i & 16) != 0) {
48 48 tmp = tmp ^ 0x1231;
49 49 }
50 50 if((i & 32) != 0) {
51 51 tmp = tmp ^ 0x2462;
52 52 }
53 53 if((i & 64) != 0) {
54 54 tmp = tmp ^ 0x48c4;
55 55 }
56 56 if((i & 128) != 0) {
57 57 tmp = tmp ^ 0x9188;
58 58 }
59 59 lookUpTableForCRC[i] = tmp;
60 60 }
61 61 }
62 62
63 63 void GetCRCAsTwoBytes(unsigned char* data, unsigned char* crcAsTwoBytes, unsigned int sizeOfData)
64 64 {
65 65 unsigned int Chk;
66 66 int j;
67 67 Chk = 0xffff; // reset the syndrom to all ones
68 68 for (j=0; j<sizeOfData; j++) {
69 69 Chk = Crc_opt(data[j], Chk);
70 70 }
71 71 crcAsTwoBytes[0] = (unsigned char) (Chk >> 8);
72 72 crcAsTwoBytes[1] = (unsigned char) (Chk & 0x00ff);
73 73 }
74 74
75 75 void updateLFRCurrentMode()
76 76 {
77 77 lfrCurrentMode = (housekeeping_packet.lfr_status_word[0] & 0xf0) >> 4;
78 78 }
79 79
80 80 //*********************
81 81 // ACCEPTANCE FUNCTIONS
82 82 int TC_acceptance(ccsdsTelecommandPacket_t *TC, unsigned int tc_len_recv, rtems_id queue_id)
83 83 {
84 84 int ret = 0;
85 85 rtems_status_code status;
86 86 Packet_TM_LFR_TC_EXE_CORRUPTED_t packet;
87 87 unsigned int parserCode = 0;
88 88 unsigned char computed_CRC[2];
89 89 unsigned int packetLength;
90 90
91 91 GetCRCAsTwoBytes( (unsigned char*) TC->packetID, computed_CRC, tc_len_recv + 5 );
92 92 parserCode = TC_parser( TC, tc_len_recv ) ;
93 93 if ( (parserCode == ILLEGAL_APID) | (parserCode == WRONG_LEN_PACKET) | (parserCode == INCOR_CHECKSUM)
94 94 | (parserCode == ILL_TYPE) | (parserCode == ILL_SUBTYPE) | (parserCode == WRONG_APP_DATA) )
95 95 { // generate TM_LFR_TC_EXE_CORRUPTED
96 96 packetLength = (TC->packetLength[0] * 256) + TC->packetLength[1];
97 97 packet.targetLogicalAddress = CCSDS_DESTINATION_ID;
98 98 packet.protocolIdentifier = CCSDS_PROTOCOLE_ID;
99 99 packet.reserved = DEFAULT_RESERVED;
100 100 packet.userApplication = CCSDS_USER_APP;
101 101 // PACKET HEADER
102 102 packet.packetID[0] = (unsigned char) (TM_PACKET_ID_TC_EXE >> 8);
103 103 packet.packetID[1] = (unsigned char) (TM_PACKET_ID_TC_EXE );
104 104 packet.packetSequenceControl[0] = TM_PACKET_SEQ_CTRL_STANDALONE;
105 105 packet.packetSequenceControl[1] = TM_PACKET_SEQ_CNT_DEFAULT;
106 106 packet.packetLength[0] = (unsigned char) (PACKET_LENGTH_TC_EXE_CORRUPTED >> 8);
107 107 packet.packetLength[1] = (unsigned char) (PACKET_LENGTH_TC_EXE_CORRUPTED );
108 108 // DATA FIELD HEADER
109 109 packet.spare1_pusVersion_spare2 = DEFAULT_SPARE1_PUSVERSION_SPARE2;
110 110 packet.serviceType = TM_TYPE_TC_EXE;
111 111 packet.serviceSubType = TM_SUBTYPE_EXE_NOK;
112 112 packet.destinationID = TM_DESTINATION_ID_GROUND;
113 113 packet.time[0] = (time_management_regs->coarse_time>>24 );
114 114 packet.time[1] = (time_management_regs->coarse_time>>16 );
115 115 packet.time[2] = (time_management_regs->coarse_time>>8 );
116 116 packet.time[3] = (time_management_regs->coarse_time );
117 117 packet.time[4] = (time_management_regs->fine_time>>8 );
118 118 packet.time[5] = (time_management_regs->fine_time );
119 119 //
120 120 packet.tc_failure_code[0] = (unsigned char) (FAILURE_CODE_CORRUPTED >> 8);
121 121 packet.tc_failure_code[1] = (unsigned char) (FAILURE_CODE_CORRUPTED );
122 122 packet.telecommand_pkt_id[0] = TC->packetID[0];
123 123 packet.telecommand_pkt_id[1] = TC->packetID[1];
124 124 packet.pkt_seq_control[0] = TC->packetSequenceControl[0];
125 125 packet.pkt_seq_control[0] = TC->packetSequenceControl[1];
126 126 packet.tc_service = TC->serviceType;
127 127 packet.tc_subtype = TC->serviceSubType;
128 128 packet.pkt_len_rcv_value[0] = TC->packetLength[0];
129 129 packet.pkt_len_rcv_value[1] = TC->packetLength[1];
130 130 packet.pkt_datafieldsize_cnt[0] = currentTC_LEN_RCV[0];
131 131 packet.pkt_datafieldsize_cnt[1] = currentTC_LEN_RCV[1];
132 132 packet.rcv_crc[0] = TC->dataAndCRC[packetLength];
133 133 packet.rcv_crc[1] = TC->dataAndCRC[packetLength];
134 134 packet.computed_crc[0] = computed_CRC[0];
135 135 packet.computed_crc[1] = computed_CRC[1];
136 136 // SEND PACKET
137 137 status = write( fdSPW, (char *) &packet, PACKET_LENGTH_TC_EXE_CORRUPTED + CCSDS_TC_TM_PACKET_OFFSET + 4);
138 138 }
139 139 else { // send valid TC to the action launcher
140 140 status = rtems_message_queue_send( queue_id, TC, tc_len_recv + CCSDS_TC_TM_PACKET_OFFSET + 3);
141 141 ret = -1;
142 142 }
143 143 return ret;
144 144 }
145 145
146 146 unsigned char TC_parser(ccsdsTelecommandPacket_t * TMPacket, unsigned int TC_LEN_RCV)
147 147 {
148 148 unsigned char ret = 0;
149 149 unsigned char pid = 0;
150 150 unsigned char category = 0;
151 151 unsigned int length = 0;
152 152 unsigned char packetType = 0;
153 153 unsigned char packetSubtype = 0;
154 154 unsigned char * CCSDSContent = NULL;
155 155
156 156 // APID check *** APID on 2 bytes
157 157 pid = ((TMPacket->packetID[0] & 0x07)<<4) + ( (TMPacket->packetID[1]>>4) & 0x0f ); // PID = 11 *** 7 bits xxxxx210 7654xxxx
158 158 category = (TMPacket->packetID[1] & 0x0f); // PACKET_CATEGORY = 12 *** 4 bits xxxxxxxx xxxx3210
159 159 length = (TMPacket->packetLength[0] * 256) + TMPacket->packetLength[1];
160 160 packetType = TMPacket->serviceType;
161 161 packetSubtype = TMPacket->serviceSubType;
162 162
163 163 if ( pid != CCSDS_PROCESS_ID ) {
164 164 ret = ILLEGAL_APID;
165 165 }
166 166 else if ( category != CCSDS_PACKET_CATEGORY ) {
167 167 ret = ILLEGAL_APID;
168 168 }
169 169 else if (length != TC_LEN_RCV ) { // packet length check
170 170 ret = WRONG_LEN_PACKET; // LEN RCV != SIZE FIELD
171 171 }
172 172 else if ( length >= CCSDS_TC_PKT_MAX_SIZE ) {
173 173 ret = WRONG_LEN_PACKET; // check that the packet does not exceed the MAX size
174 174 }
175 175 else if ( packetType == TC_TYPE_GEN ){ // service type, subtype and packet length check
176 176 switch(packetSubtype){ //subtype, autorized values are 3, 20, 21, 24, 27, 28, 30, 40, 50, 60, 61
177 177 case TC_SUBTYPE_RESET:
178 178 if (length!=(TC_LEN_RESET-CCSDS_TC_TM_PACKET_OFFSET)) {
179 179 ret = WRONG_LEN_PACKET;
180 180 }
181 181 else {
182 182 ret = CCSDS_TM_VALID;
183 183 }
184 184 break;
185 185 case TC_SUBTYPE_LOAD_COMM:
186 186 if (length!=(TC_LEN_LOAD_COMM-CCSDS_TC_TM_PACKET_OFFSET)) {
187 187 ret = WRONG_LEN_PACKET;
188 188 }
189 189 else {
190 190 ret = CCSDS_TM_VALID;
191 191 }
192 192 break;
193 193 case TC_SUBTYPE_LOAD_NORM:
194 194 if (length!=(TC_LEN_LOAD_NORM-CCSDS_TC_TM_PACKET_OFFSET)) {
195 195 ret = WRONG_LEN_PACKET;
196 196 }
197 197 else {
198 198 ret = CCSDS_TM_VALID;
199 199 }
200 200 break;
201 201 case TC_SUBTYPE_LOAD_BURST:
202 202 if (length!=(TC_LEN_LOAD_BURST-CCSDS_TC_TM_PACKET_OFFSET)) {
203 203 ret = WRONG_LEN_PACKET;
204 204 }
205 205 else {
206 206 ret = CCSDS_TM_VALID;
207 207 }
208 208 break;
209 209 case TC_SUBTYPE_LOAD_SBM1:
210 210 if (length!=(TC_LEN_LOAD_SBM1-CCSDS_TC_TM_PACKET_OFFSET)) {
211 211 ret = WRONG_LEN_PACKET;
212 212 }
213 213 else {
214 214 ret = CCSDS_TM_VALID;
215 215 }
216 216 break;
217 217 case TC_SUBTYPE_LOAD_SBM2:
218 218 if (length!=(TC_LEN_LOAD_SBM2-CCSDS_TC_TM_PACKET_OFFSET)) {
219 219 ret = WRONG_LEN_PACKET;
220 220 }
221 221 else {
222 222 ret = CCSDS_TM_VALID;
223 223 }
224 224 break;
225 225 case TC_SUBTYPE_DUMP:
226 226 if (length!=(TC_LEN_DUMP-CCSDS_TC_TM_PACKET_OFFSET)) {
227 227 ret = WRONG_LEN_PACKET;
228 228 }
229 229 else {
230 230 ret = CCSDS_TM_VALID;
231 231 }
232 232 break;
233 233 case TC_SUBTYPE_ENTER:
234 234 if (length!=(TC_LEN_ENTER-CCSDS_TC_TM_PACKET_OFFSET)) {
235 235 ret = WRONG_LEN_PACKET;
236 236 }
237 237 else {
238 238 ret = CCSDS_TM_VALID;
239 239 }
240 240 break;
241 241 case TC_SUBTYPE_UPDT_INFO:
242 242 if (length!=(TC_LEN_UPDT_INFO-CCSDS_TC_TM_PACKET_OFFSET)) {
243 243 ret = WRONG_LEN_PACKET;
244 244 }
245 245 else {
246 246 ret = CCSDS_TM_VALID;
247 247 }
248 248 break;
249 249 case TC_SUBTYPE_EN_CAL:
250 250 if (length!=(TC_LEN_EN_CAL-CCSDS_TC_TM_PACKET_OFFSET)) {
251 251 ret = WRONG_LEN_PACKET;
252 252 }
253 253 else {
254 254 ret = CCSDS_TM_VALID;
255 255 }
256 256 break;
257 257 case TC_SUBTYPE_DIS_CAL:
258 258 if (length!=(TC_LEN_DIS_CAL-CCSDS_TC_TM_PACKET_OFFSET)) {
259 259 ret = WRONG_LEN_PACKET;
260 260 }
261 261 else {
262 262 ret = CCSDS_TM_VALID;
263 263 }
264 264 break;
265 265 default:
266 266 ret = ILL_SUBTYPE;
267 267 break;
268 268 }
269 269 }
270 270 else if ( packetType == TC_TYPE_TIME ){
271 271 if (packetSubtype!=TC_SUBTYPE_UPDT_TIME) {
272 272 ret = ILL_SUBTYPE;
273 273 }
274 274 else if (length!=(TC_LEN_UPDT_TIME-CCSDS_TC_TM_PACKET_OFFSET)) {
275 275 ret = WRONG_LEN_PACKET;
276 276 }
277 277 else {
278 278 ret = CCSDS_TM_VALID;
279 279 }
280 280 }
281 281 else {
282 282 ret = ILL_TYPE;
283 283 }
284 284
285 285 // source ID check // Source ID not documented in the ICD
286 286
287 287 // packet error control, CRC check
288 288 if ( ret == CCSDS_TM_VALID ) {
289 289 CCSDSContent = (unsigned char*) TMPacket->packetID;
290 290 GetCRCAsTwoBytes(CCSDSContent, currentTC_COMPUTED_CRC, length + CCSDS_TC_TM_PACKET_OFFSET - 2); // 2 CRC bytes removed from the calculation of the CRC
291 291 if (currentTC_COMPUTED_CRC[0] != CCSDSContent[length + CCSDS_TC_TM_PACKET_OFFSET -2]) {
292 292 ret = INCOR_CHECKSUM;
293 293 }
294 294 else if (currentTC_COMPUTED_CRC[1] != CCSDSContent[length + CCSDS_TC_TM_PACKET_OFFSET -1]) {
295 295 ret = INCOR_CHECKSUM;
296 296 }
297 297 else {
298 298 ret = CCSDS_TM_VALID;
299 299 }
300 300 }
301 301
302 302 return ret;
303 303 }
304 304
305 305 unsigned char TM_build_header( enum TM_TYPE tm_type, unsigned int packetLength,
306 306 TMHeader_t *TMHeader, unsigned char tc_sid)
307 307 {
308 308 TMHeader->targetLogicalAddress = CCSDS_DESTINATION_ID;
309 309 TMHeader->protocolIdentifier = CCSDS_PROTOCOLE_ID;
310 310 TMHeader->reserved = 0x00;
311 311 TMHeader->userApplication = 0x00;
312 312 TMHeader->packetID[0] = 0x0c;
313 313 TMHeader->packetSequenceControl[0] = 0xc0;
314 314 TMHeader->packetSequenceControl[1] = 0x00;
315 315 TMHeader->packetLength[0] = (unsigned char) (packetLength>>8);
316 316 TMHeader->packetLength[1] = (unsigned char) packetLength;
317 317 TMHeader->spare1_pusVersion_spare2 = 0x10;
318 318 TMHeader->destinationID = TM_DESTINATION_ID_GROUND; // default destination id
319 319 switch (tm_type){
320 320 case(TM_LFR_TC_EXE_OK):
321 321 TMHeader->packetID[1] = (unsigned char) TM_PACKET_ID_TC_EXE;
322 322 TMHeader->serviceType = TM_TYPE_TC_EXE; // type
323 323 TMHeader->serviceSubType = TM_SUBTYPE_EXE_OK; // subtype
324 324 TMHeader->destinationID = tc_sid; // destination id
325 325 break;
326 326 case(TM_LFR_TC_EXE_ERR):
327 327 TMHeader->packetID[1] = (unsigned char) TM_PACKET_ID_TC_EXE;
328 328 TMHeader->serviceType = TM_TYPE_TC_EXE; // type
329 329 TMHeader->serviceSubType = TM_SUBTYPE_EXE_NOK; // subtype
330 330 TMHeader->destinationID = tc_sid;
331 331 break;
332 332 case(TM_LFR_HK):
333 333 TMHeader->packetID[1] = (unsigned char) TM_PACKET_ID_HK;
334 334 TMHeader->serviceType = TM_TYPE_HK; // type
335 335 TMHeader->serviceSubType = TM_SUBTYPE_HK; // subtype
336 336 break;
337 337 case(TM_LFR_SCI):
338 338 TMHeader->packetID[1] = (unsigned char) TM_PACKET_ID_SCIENCE_NORMAL_BURST;
339 339 TMHeader->serviceType = TM_TYPE_LFR_SCIENCE; // type
340 340 TMHeader->serviceSubType = TM_SUBTYPE_SCIENCE; // subtype
341 341 break;
342 342 case(TM_LFR_SCI_SBM):
343 343 TMHeader->packetID[1] = (unsigned char) TM_PACKET_ID_SCIENCE_SBM1_SBM2;
344 344 TMHeader->serviceType = TM_TYPE_LFR_SCIENCE; // type
345 345 TMHeader->serviceSubType = TM_SUBTYPE_SCIENCE; // subtype
346 346 break;
347 347 case(TM_LFR_PAR_DUMP):
348 348 TMHeader->packetID[1] = (unsigned char) TM_PACKET_ID_PARAMETER_DUMP;
349 349 TMHeader->serviceType = TM_TYPE_HK; // type
350 350 TMHeader->serviceSubType = TM_SUBTYPE_HK; // subtype
351 351 break;
352 352 default:
353 353 return 0;
354 354 }
355 355 TMHeader->time[0] = (unsigned char) (time_management_regs->coarse_time>>24);
356 356 TMHeader->time[1] = (unsigned char) (time_management_regs->coarse_time>>16);
357 357 TMHeader->time[2] = (unsigned char) (time_management_regs->coarse_time>>8);
358 358 TMHeader->time[3] = (unsigned char) (time_management_regs->coarse_time);
359 359 TMHeader->time[4] = (unsigned char) (time_management_regs->fine_time>>8);
360 360 TMHeader->time[5] = (unsigned char) (time_management_regs->fine_time);
361 361
362 362 return LFR_SUCCESSFUL;
363 363 }
364 364
365 365 //***********
366 366 // RTEMS TASK
367 367 rtems_task recv_task( rtems_task_argument unused )
368 368 {
369 369 int len = 0;
370 370 unsigned int i = 0;
371 371 unsigned int data_length = 0;
372 372 ccsdsTelecommandPacket_t currentTC;
373 373 char data[100];
374 374 rtems_status_code status;
375 375 rtems_id queue_id;
376 376
377 377 for(i=0; i<100; i++) data[i] = 0;
378 378
379 379 status = rtems_message_queue_ident( misc_name[QUEUE_QUEU], 0, &queue_id );
380 380 if (status != RTEMS_SUCCESSFUL)
381 381 {
382 382 PRINTF1("in RECV *** ERR getting queue id, %d\n", status)
383 383 }
384 384
385 385 BOOT_PRINTF("in RECV *** \n")
386 386
387 387 while(1)
388 388 {
389 389 len = read(fdSPW, (char*) &currentTC, CCSDS_TC_PKT_MAX_SIZE); // the call to read is blocking
390 390 if (len == -1){ // error during the read call
391 391 PRINTF("In RECV *** last read call returned -1\n")
392 392 //if (rtems_event_send( Task_id[TASKID_SPIQ], SPW_LINKERR_EVENT ) != RTEMS_SUCCESSFUL) {
393 393 // PRINTF("IN RECV *** Error: rtems_event_send SPW_LINKERR_EVENT\n")
394 394 //}
395 395 //if (rtems_task_suspend(RTEMS_SELF) != RTEMS_SUCCESSFUL) {
396 396 // PRINTF("In RECV *** Error: rtems_task_suspend(RTEMS_SELF)\n")
397 397 //}
398 398 }
399 399 else {
400 400 if ( (len+1) < CCSDS_TC_PKT_MIN_SIZE ) {
401 401 PRINTF("In RECV *** packet lenght too short\n")
402 402 }
403 403 else {
404 404 currentTC_LEN_RCV[0] = 0x00;
405 405 currentTC_LEN_RCV[1] = (unsigned char) (len - CCSDS_TC_TM_PACKET_OFFSET - 3); // build the corresponding packet size field
406 406 currentTC_LEN_RCV_AsUnsignedInt = (unsigned int) (len - CCSDS_TC_TM_PACKET_OFFSET - 3); // => -3 is for Prot ID, Reserved and User App bytes
407 407 // CHECK THE TC AND BUILD THE APPROPRIATE TM
408 408 data_length = TC_acceptance(&currentTC, currentTC_LEN_RCV_AsUnsignedInt, queue_id);
409 409 if (data_length!=-1)
410 410 {
411 411 }
412 412 }
413 413 }
414 414 }
415 415 }
416 416
417 417 rtems_task actn_task( rtems_task_argument unused )
418 418 {
419 419 int result;
420 420 rtems_status_code status; // RTEMS status code
421 421 ccsdsTelecommandPacket_t TC; // TC sent to the ACTN task
422 422 size_t size; // size of the incoming TC packet
423 423 unsigned char subtype; // subtype of the current TC packet
424 424 rtems_id queue_rcv_id;
425 425 rtems_id queue_snd_id;
426 426
427 427 status = rtems_message_queue_ident( misc_name[QUEUE_QUEU], 0, &queue_rcv_id );
428 428 if (status != RTEMS_SUCCESSFUL)
429 429 {
430 430 PRINTF1("in ACTN *** ERR getting queue_rcv_id %d\n", status)
431 431 }
432 432
433 433 status = rtems_message_queue_ident( misc_name[QUEUE_PKTS], 0, &queue_snd_id );
434 434 if (status != RTEMS_SUCCESSFUL)
435 435 {
436 436 PRINTF1("in ACTN *** ERR getting queue_snd_id %d\n", status)
437 437 }
438 438
439 439 result = LFR_SUCCESSFUL;
440 440 subtype = 0; // subtype of the current TC packet
441 441
442 442 BOOT_PRINTF("in ACTN *** \n")
443 443
444 444 while(1)
445 445 {
446 446 status = rtems_message_queue_receive( queue_rcv_id, (char*) &TC, &size,
447 447 RTEMS_WAIT, RTEMS_NO_TIMEOUT);
448 448 if (status!=RTEMS_SUCCESSFUL) PRINTF1("ERR *** in task ACTN *** error receiving a message, code %d \n", status)
449 449 else
450 450 {
451 451 subtype = TC.serviceSubType;
452 452 switch(subtype)
453 453 {
454 454 case TC_SUBTYPE_RESET:
455 455 result = action_reset( &TC, queue_snd_id );
456 456 close_action( &TC, result, queue_snd_id );
457 457 break;
458 458 //
459 459 case TC_SUBTYPE_LOAD_COMM:
460 460 result = action_load_common_par( &TC );
461 461 close_action( &TC, result, queue_snd_id );
462 462 break;
463 463 //
464 464 case TC_SUBTYPE_LOAD_NORM:
465 465 result = action_load_normal_par( &TC, queue_snd_id );
466 466 close_action( &TC, result, queue_snd_id );
467 467 break;
468 468 //
469 469 case TC_SUBTYPE_LOAD_BURST:
470 470 result = action_load_burst_par( &TC, queue_snd_id );
471 471 close_action( &TC, result, queue_snd_id );
472 472 break;
473 473 //
474 474 case TC_SUBTYPE_LOAD_SBM1:
475 475 result = action_load_sbm1_par( &TC, queue_snd_id );
476 476 close_action( &TC, result, queue_snd_id );
477 477 break;
478 478 //
479 479 case TC_SUBTYPE_LOAD_SBM2:
480 480 result = action_load_sbm2_par( &TC, queue_snd_id );
481 481 close_action( &TC, result, queue_snd_id );
482 482 break;
483 483 //
484 484 case TC_SUBTYPE_DUMP:
485 485 result = action_dump_par( &TC );
486 486 close_action( &TC, result, queue_snd_id );
487 487 break;
488 488 //
489 489 case TC_SUBTYPE_ENTER:
490 490 result = action_enter_mode( &TC, queue_snd_id );
491 491 close_action( &TC, result, queue_snd_id );
492 492 break;
493 493 //
494 494 case TC_SUBTYPE_UPDT_INFO:
495 495 result = action_update_info( &TC, queue_snd_id );
496 496 close_action( &TC, result, queue_snd_id );
497 497 break;
498 498 //
499 499 case TC_SUBTYPE_EN_CAL:
500 500 result = action_enable_calibration( &TC, queue_snd_id );
501 501 close_action( &TC, result, queue_snd_id );
502 502 break;
503 503 //
504 504 case TC_SUBTYPE_DIS_CAL:
505 505 result = action_disable_calibration( &TC, queue_snd_id );
506 506 close_action( &TC, result, queue_snd_id );
507 507 break;
508 508 //
509 509 case TC_SUBTYPE_UPDT_TIME:
510 510 result = action_update_time( &TC );
511 511 close_action( &TC, result, queue_snd_id );
512 512 break;
513 513 //
514 514 default:
515 515 break;
516 516 }
517 517 }
518 518 }
519 519 }
520 520
521 521 rtems_task dumb_task( rtems_task_argument unused )
522 522 {
523 523 unsigned int i;
524 524 unsigned int intEventOut;
525 525 unsigned int coarse_time = 0;
526 526 unsigned int fine_time = 0;
527 527 rtems_event_set event_out;
528 528
529 529 BOOT_PRINTF("in DUMB *** \n")
530 530
531 531 while(1){
532 532 rtems_event_receive(RTEMS_EVENT_0 | RTEMS_EVENT_1 | RTEMS_EVENT_2 | RTEMS_EVENT_3 | RTEMS_EVENT_4 | RTEMS_EVENT_5,
533 533 RTEMS_WAIT | RTEMS_EVENT_ANY, RTEMS_NO_TIMEOUT, &event_out); // wait for an RTEMS_EVENT
534 534 intEventOut = (unsigned int) event_out;
535 535 for ( i=0; i<32; i++)
536 536 {
537 537 if ( ((intEventOut >> i) & 0x0001) != 0)
538 538 {
539 539 coarse_time = time_management_regs->coarse_time;
540 540 fine_time = time_management_regs->fine_time;
541 541 printf("in DUMB *** time = coarse: %x, fine: %x, %s\n", coarse_time, fine_time, DumbMessages[i]);
542 542 }
543 543 }
544 544 }
545 545 }
546 546
547 547 //***********
548 548 // TC ACTIONS
549 549
550 550 int action_reset(ccsdsTelecommandPacket_t *TC, rtems_id queue_id)
551 551 {
552 552 send_tm_lfr_tc_exe_not_implemented( TC, queue_id );
553 553 return LFR_DEFAULT;
554 554 }
555 555
556 556 int action_load_common_par(ccsdsTelecommandPacket_t *TC)
557 557 {
558 558 parameter_dump_packet.unused0 = TC->dataAndCRC[0];
559 559 parameter_dump_packet.bw_sp0_sp1_r0_r1 = TC->dataAndCRC[1];
560 560
561 561 set_wfp_data_shaping(parameter_dump_packet.bw_sp0_sp1_r0_r1);
562 562
563 563 return LFR_SUCCESSFUL;
564 564 }
565 565
566 566 int action_load_normal_par(ccsdsTelecommandPacket_t *TC, rtems_id queue_id)
567 567 {
568 568 int result;
569 569 unsigned int tmp;
570 570
571 571 result = LFR_SUCCESSFUL;
572 572
573 573 if ( lfrCurrentMode == LFR_MODE_NORMAL ) {
574 574 send_tm_lfr_tc_exe_not_executable( TC, queue_id );
575 575 result = LFR_DEFAULT;
576 576 }
577 577 else {
578 578 // sy_lfr_n_swf_l
579 579 parameter_dump_packet.sy_lfr_n_swf_l[0] = TC->dataAndCRC[0];
580 580 parameter_dump_packet.sy_lfr_n_swf_l[1] = TC->dataAndCRC[1];
581 581
582 582 // sy_lfr_n_swf_p
583 583 tmp = (unsigned int ) floor(
584 584 (TC->dataAndCRC[2] * 256
585 585 + TC->dataAndCRC[3])/8
586 586 ) * 8;
587 587 if ( (tmp < 16) || (tmp>65528) )
588 588 {
589 589 result = LFR_DEFAULT;
590 590 }
591 591 else
592 592 {
593 593 parameter_dump_packet.sy_lfr_n_swf_p[0] = (unsigned char) (tmp >> 8);
594 594 parameter_dump_packet.sy_lfr_n_swf_p[1] = (unsigned char) (tmp );
595 595 }
596 596
597 597 // sy_lfr_n_asm_p
598 598 parameter_dump_packet.sy_lfr_n_asm_p[0] = TC->dataAndCRC[4];
599 599 parameter_dump_packet.sy_lfr_n_asm_p[1] = TC->dataAndCRC[5];
600 600
601 601 // sy_lfr_n_bp_p0
602 602 parameter_dump_packet.sy_lfr_n_bp_p0 = TC->dataAndCRC[6];
603 603
604 604 // sy_lfr_n_bp_p1
605 605 parameter_dump_packet.sy_lfr_n_bp_p1 = TC->dataAndCRC[7];
606 606 }
607 607
608 608 return result;
609 609 }
610 610
611 611 int action_load_burst_par(ccsdsTelecommandPacket_t *TC, rtems_id queue_id)
612 612 {
613 613 int result;
614 614 unsigned char lfrMode;
615 615
616 616 result = LFR_DEFAULT;
617 617 lfrMode = (housekeeping_packet.lfr_status_word[0] & 0xf0) >> 4;
618 618
619 619 if ( lfrMode == LFR_MODE_BURST ) {
620 620 send_tm_lfr_tc_exe_not_executable( TC, queue_id );
621 621 result = LFR_DEFAULT;
622 622 }
623 623 else {
624 624 parameter_dump_packet.sy_lfr_b_bp_p0 = TC->dataAndCRC[0];
625 625 parameter_dump_packet.sy_lfr_b_bp_p1 = TC->dataAndCRC[1];
626 626
627 627 result = LFR_SUCCESSFUL;
628 628 }
629 629
630 630 return result;
631 631 }
632 632
633 633 int action_load_sbm1_par(ccsdsTelecommandPacket_t *TC, rtems_id queue_id)
634 634 {
635 635 int result;
636 636 unsigned char lfrMode;
637 637
638 638 result = LFR_DEFAULT;
639 639 lfrMode = (housekeeping_packet.lfr_status_word[0] & 0xf0) >> 4;
640 640
641 641 if ( lfrMode == LFR_MODE_SBM1 ) {
642 642 send_tm_lfr_tc_exe_not_executable( TC, queue_id );
643 643 result = LFR_DEFAULT;
644 644 }
645 645 else {
646 646 parameter_dump_packet.sy_lfr_s1_bp_p0 = TC->dataAndCRC[0];
647 647 parameter_dump_packet.sy_lfr_s1_bp_p1 = TC->dataAndCRC[1];
648 648
649 649 result = LFR_SUCCESSFUL;
650 650 }
651 651
652 652 return result;
653 653 }
654 654
655 655 int action_load_sbm2_par(ccsdsTelecommandPacket_t *TC, rtems_id queue_id)
656 656 {
657 657 int result;
658 658 unsigned char lfrMode;
659 659
660 660 result = LFR_DEFAULT;
661 661 lfrMode = (housekeeping_packet.lfr_status_word[0] & 0xf0) >> 4;
662 662
663 663 if ( lfrMode == LFR_MODE_SBM2 ) {
664 664 send_tm_lfr_tc_exe_not_executable( TC, queue_id );
665 665 result = LFR_DEFAULT;
666 666 }
667 667 else {
668 668 parameter_dump_packet.sy_lfr_s2_bp_p0 = TC->dataAndCRC[0];
669 669 parameter_dump_packet.sy_lfr_s2_bp_p1 = TC->dataAndCRC[1];
670 670
671 671 result = LFR_SUCCESSFUL;
672 672 }
673 673
674 674 return result;
675 675 }
676 676
677 677 int action_dump_par(ccsdsTelecommandPacket_t *TC)
678 678 {
679 679 int status;
680 680 // send parameter dump packet
681 681 status = write(fdSPW, (char *) &parameter_dump_packet,
682 682 PACKET_LENGTH_PARAMETER_DUMP + CCSDS_TC_TM_PACKET_OFFSET + 4);
683 683 if (status == -1)
684 684 {
685 685 PRINTF1("in action_dump *** ERR sending packet, code %d", status)
686 686 status = RTEMS_UNSATISFIED;
687 687 }
688 688 else
689 689 {
690 690 status = RTEMS_SUCCESSFUL;
691 691 }
692 692
693 693 return status;
694 694 }
695 695
696 696 int action_enter_mode(ccsdsTelecommandPacket_t *TC, rtems_id queue_id)
697 697 {
698 698 rtems_status_code status;
699 699 unsigned char requestedMode;
700 700
701 701 requestedMode = TC->dataAndCRC[1];
702 702
703 703 printf("try to enter mode %d\n", requestedMode);
704 704
705 705 #ifdef PRINT_TASK_STATISTICS
706 706 if (requestedMode != LFR_MODE_STANDBY)
707 707 {
708 708 rtems_cpu_usage_reset();
709 709 maxCount = 0;
710 710 }
711 711 #endif
712 712
713 713 status = transition_validation(requestedMode);
714 714
715 715 if ( status == LFR_SUCCESSFUL ) {
716 716 if ( lfrCurrentMode != LFR_MODE_STANDBY)
717 717 {
718 718 status = stop_current_mode();
719 719 }
720 720 if (status != RTEMS_SUCCESSFUL)
721 721 {
722 722 PRINTF("ERR *** in action_enter *** stop_current_mode\n")
723 723 }
724 724 status = enter_mode(requestedMode, TC);
725 725 }
726 726 else
727 727 {
728 728 PRINTF("ERR *** in action_enter *** transition rejected\n")
729 729 send_tm_lfr_tc_exe_not_executable( TC, queue_id );
730 730 }
731 731
732 732 return status;
733 733 }
734 734
735 735 int action_update_info(ccsdsTelecommandPacket_t *TC, rtems_id queue_id) {
736 736 unsigned int val;
737 737 int result;
738 738 unsigned char lfrMode;
739 739
740 740 result = LFR_DEFAULT;
741 741 lfrMode = (housekeeping_packet.lfr_status_word[0] & 0xf0) >> 4;
742 742
743 743 if ( (lfrMode == LFR_MODE_STANDBY) ) {
744 744 send_tm_lfr_tc_exe_not_implemented( TC, queue_id );
745 745 result = LFR_DEFAULT;
746 746 }
747 747 else {
748 748 val = housekeeping_packet.hk_lfr_update_info_tc_cnt[0] * 256
749 749 + housekeeping_packet.hk_lfr_update_info_tc_cnt[1];
750 750 val++;
751 751 housekeeping_packet.hk_lfr_update_info_tc_cnt[0] = (unsigned char) (val >> 8);
752 752 housekeeping_packet.hk_lfr_update_info_tc_cnt[1] = (unsigned char) (val);
753 753 result = LFR_SUCCESSFUL;
754 754 }
755 755
756 756 return result;
757 757 }
758 758
759 759 int action_enable_calibration(ccsdsTelecommandPacket_t *TC, rtems_id queue_id)
760 760 {
761 761 int result;
762 762 unsigned char lfrMode;
763 763
764 764 result = LFR_DEFAULT;
765 765 lfrMode = (housekeeping_packet.lfr_status_word[0] & 0xf0) >> 4;
766 766
767 767 if ( (lfrMode == LFR_MODE_STANDBY) | (lfrMode == LFR_MODE_BURST) | (lfrMode == LFR_MODE_SBM2) ) {
768 768 send_tm_lfr_tc_exe_not_executable( TC, queue_id );
769 769 result = LFR_DEFAULT;
770 770 }
771 771 else {
772 772 send_tm_lfr_tc_exe_not_implemented( TC, queue_id );
773 773 result = LFR_DEFAULT;
774 774 }
775 775 return result;
776 776 }
777 777
778 778 int action_disable_calibration(ccsdsTelecommandPacket_t *TC, rtems_id queue_id)
779 779 {
780 780 int result;
781 781 unsigned char lfrMode;
782 782
783 783 result = LFR_DEFAULT;
784 784 lfrMode = (housekeeping_packet.lfr_status_word[0] & 0xf0) >> 4;
785 785
786 786 if ( (lfrMode == LFR_MODE_STANDBY) | (lfrMode == LFR_MODE_BURST) | (lfrMode == LFR_MODE_SBM2) ) {
787 787 send_tm_lfr_tc_exe_not_executable( TC, queue_id );
788 788 result = LFR_DEFAULT;
789 789 }
790 790 else {
791 791 send_tm_lfr_tc_exe_not_implemented( TC, queue_id );
792 792 result = LFR_DEFAULT;
793 793 }
794 794 return result;
795 795 }
796 796
797 797 int action_update_time(ccsdsTelecommandPacket_t *TC)
798 798 {
799 799 unsigned int val;
800 800
801 801 time_management_regs->coarse_time_load = (TC->dataAndCRC[0] << 24)
802 802 + (TC->dataAndCRC[1] << 16)
803 803 + (TC->dataAndCRC[2] << 8)
804 804 + TC->dataAndCRC[3];
805 805 val = housekeeping_packet.hk_lfr_update_time_tc_cnt[0] * 256
806 806 + housekeeping_packet.hk_lfr_update_time_tc_cnt[1];
807 807 val++;
808 808 housekeeping_packet.hk_lfr_update_time_tc_cnt[0] = (unsigned char) (val >> 8);
809 809 housekeeping_packet.hk_lfr_update_time_tc_cnt[1] = (unsigned char) (val);
810 810 time_management_regs->ctrl = time_management_regs->ctrl | 1;
811 811
812 812 return LFR_SUCCESSFUL;
813 813 }
814 814
815 815 //*******************
816 816 // ENTERING THE MODES
817 817
818 818 int transition_validation(unsigned char requestedMode)
819 819 {
820 820 int status;
821 821
822 822 switch (requestedMode)
823 823 {
824 824 case LFR_MODE_STANDBY:
825 825 if ( lfrCurrentMode == LFR_MODE_STANDBY ) {
826 826 status = LFR_DEFAULT;
827 827 }
828 828 else
829 829 {
830 830 status = LFR_SUCCESSFUL;
831 831 }
832 832 break;
833 833 case LFR_MODE_NORMAL:
834 834 if ( lfrCurrentMode == LFR_MODE_NORMAL ) {
835 835 status = LFR_DEFAULT;
836 836 }
837 837 else {
838 838 status = LFR_SUCCESSFUL;
839 839 }
840 840 break;
841 841 case LFR_MODE_BURST:
842 842 if ( lfrCurrentMode == LFR_MODE_BURST ) {
843 843 status = LFR_DEFAULT;
844 844 }
845 845 else {
846 846 status = LFR_SUCCESSFUL;
847 847 }
848 848 break;
849 849 case LFR_MODE_SBM1:
850 850 if ( lfrCurrentMode == LFR_MODE_SBM1 ) {
851 851 status = LFR_DEFAULT;
852 852 }
853 853 else {
854 854 status = LFR_SUCCESSFUL;
855 855 }
856 856 break;
857 857 case LFR_MODE_SBM2:
858 858 if ( lfrCurrentMode == LFR_MODE_SBM2 ) {
859 859 status = LFR_DEFAULT;
860 860 }
861 861 else {
862 862 status = LFR_SUCCESSFUL;
863 863 }
864 864 break;
865 865 default:
866 866 status = LFR_DEFAULT;
867 867 break;
868 868 }
869 869
870 870 return status;
871 871 }
872 872
873 873 int stop_current_mode()
874 874 {
875 875 rtems_status_code status;
876 876
877 877 status = RTEMS_SUCCESSFUL;
878 878
879 879 // mask all IRQ lines related to signal processing
880 880 LEON_Mask_interrupt( IRQ_SM ); // mask spectral matrices interrupt (coming from the timer VHDL IP)
881 881 LEON_Clear_interrupt( IRQ_SM ); // clear spectral matrices interrupt (coming from the timer VHDL IP)
882 882
883 883 #ifdef GSA
884 884 LEON_Mask_interrupt( IRQ_WF ); // mask waveform interrupt (coming from the timer VHDL IP)
885 885 LEON_Clear_interrupt( IRQ_WF ); // clear waveform interrupt (coming from the timer VHDL IP)
886 886 timer_stop( (gptimer_regs_t*) REGS_ADDR_GPTIMER, TIMER_WF_SIMULATOR );
887 887 #else
888 888 LEON_Mask_interrupt( IRQ_WAVEFORM_PICKER ); // mask waveform picker interrupt
889 889 LEON_Clear_interrupt( IRQ_WAVEFORM_PICKER ); // clear waveform picker interrupt
890 890 LEON_Mask_interrupt( IRQ_SPECTRAL_MATRIX ); // mask spectral matrix interrupt
891 891 LEON_Clear_interrupt( IRQ_SPECTRAL_MATRIX ); // clear spectral matrix interrupt
892 892 LEON_Mask_interrupt( IRQ_SM ); // for SM simulation
893 893 LEON_Clear_interrupt( IRQ_SM ); // for SM simulation
894 894 #endif
895 895 //**********************
896 896 // suspend several tasks
897 897 if (lfrCurrentMode != LFR_MODE_STANDBY) {
898 898 suspend_science_tasks();
899 899 }
900 900
901 901 if (status != RTEMS_SUCCESSFUL)
902 902 {
903 903 PRINTF("ERR *** in stop_current_mode *** suspending tasks\n")
904 904 }
905 905
906 906 //*************************
907 907 // initialize the registers
908 908 #ifdef GSA
909 909 #else
910 910 reset_wfp_burst_enable(); // reset burst and enable bits
911 911 reset_wfp_status(); // reset all the status bits
912 912 #endif
913 913
914 914 return status;
915 915 }
916 916
917 917 int enter_mode(unsigned char mode, ccsdsTelecommandPacket_t *TC )
918 918 {
919 919 rtems_status_code status;
920 920
921 921 status = RTEMS_UNSATISFIED;
922 922
923 923 housekeeping_packet.lfr_status_word[0] = (unsigned char) ((mode << 4) + 0x0d);
924 924 lfrCurrentMode = mode;
925 925
926 926 switch(mode){
927 927 case LFR_MODE_STANDBY:
928 928 status = enter_standby_mode( TC );
929 929 break;
930 930 case LFR_MODE_NORMAL:
931 931 status = enter_normal_mode( TC );
932 932 break;
933 933 case LFR_MODE_BURST:
934 934 status = enter_burst_mode( TC );
935 935 break;
936 936 case LFR_MODE_SBM1:
937 937 status = enter_sbm1_mode( TC );
938 938 break;
939 939 case LFR_MODE_SBM2:
940 940 status = enter_sbm2_mode( TC );
941 941 break;
942 942 default:
943 943 status = RTEMS_UNSATISFIED;
944 944 }
945 945
946 946 if (status != RTEMS_SUCCESSFUL)
947 947 {
948 948 PRINTF("in enter_mode *** ERR\n")
949 949 status = RTEMS_UNSATISFIED;
950 950 }
951 951
952 952 return status;
953 953 }
954 954
955 955 int enter_standby_mode()
956 956 {
957 957 reset_waveform_picker_regs();
958 958
959 959 PRINTF1("maxCount = %d\n", maxCount)
960 960
961 961 #ifdef PRINT_TASK_STATISTICS
962 962 rtems_cpu_usage_report();
963 963 #endif
964 964
965 965 #ifdef PRINT_STACK_REPORT
966 966 rtems_stack_checker_report_usage();
967 967 #endif
968 968
969 969 return LFR_SUCCESSFUL;
970 970 }
971 971
972 972 int enter_normal_mode()
973 973 {
974 974 rtems_status_code status;
975 975
976 976 status = restart_science_tasks();
977 977
978 978 #ifdef GSA
979 979 timer_start( (gptimer_regs_t*) REGS_ADDR_GPTIMER, TIMER_WF_SIMULATOR );
980 980 timer_start( (gptimer_regs_t*) REGS_ADDR_GPTIMER, TIMER_SM_SIMULATOR );
981 981 LEON_Clear_interrupt( IRQ_WF );
982 982 LEON_Unmask_interrupt( IRQ_WF );
983 983 //
984 984 set_local_nb_interrupt_f0_MAX();
985 985 LEON_Clear_interrupt( IRQ_SM ); // the IRQ_SM seems to be incompatible with the IRQ_WF on the xilinx board
986 986 LEON_Unmask_interrupt( IRQ_SM );
987 987 #else
988 988 //****************
989 989 // waveform picker
990 990 LEON_Clear_interrupt( IRQ_WAVEFORM_PICKER );
991 991 LEON_Unmask_interrupt( IRQ_WAVEFORM_PICKER );
992 992 reset_waveform_picker_regs();
993 993 set_wfp_burst_enable_register(LFR_MODE_NORMAL);
994 994 //****************
995 995 // spectral matrix
996 996 // set_local_nb_interrupt_f0_MAX();
997 997 // LEON_Clear_interrupt( IRQ_SPECTRAL_MATRIX ); // the IRQ_SM seems to be incompatible with the IRQ_WF on the xilinx board
998 998 // LEON_Unmask_interrupt( IRQ_SPECTRAL_MATRIX );
999 999 // spectral_matrix_regs->config = 0x01;
1000 1000 // spectral_matrix_regs->status = 0x00;
1001 1001 #endif
1002 1002
1003 1003 return status;
1004 1004 }
1005 1005
1006 1006 int enter_burst_mode()
1007 1007 {
1008 1008 rtems_status_code status;
1009 1009
1010 1010 status = restart_science_tasks();
1011 1011
1012 1012 #ifdef GSA
1013 1013 LEON_Unmask_interrupt( IRQ_SM );
1014 1014 #else
1015 1015 LEON_Clear_interrupt( IRQ_WAVEFORM_PICKER );
1016 1016 LEON_Unmask_interrupt( IRQ_WAVEFORM_PICKER );
1017 1017 reset_waveform_picker_regs();
1018 1018 set_wfp_burst_enable_register(LFR_MODE_BURST);
1019 1019 #endif
1020 1020
1021 1021 return status;
1022 1022 }
1023 1023
1024 1024 int enter_sbm1_mode()
1025 1025 {
1026 1026 rtems_status_code status;
1027 1027
1028 1028 status = restart_science_tasks();
1029 1029
1030 1030 set_local_sbm1_nb_cwf_max();
1031 1031
1032 1032 reset_local_sbm1_nb_cwf_sent();
1033 1033
1034 1034 #ifdef GSA
1035 1035 LEON_Unmask_interrupt( IRQ_SM );
1036 1036 #else
1037 1037 LEON_Clear_interrupt( IRQ_WAVEFORM_PICKER );
1038 1038 LEON_Unmask_interrupt( IRQ_WAVEFORM_PICKER );
1039 1039 reset_waveform_picker_regs();
1040 1040 set_wfp_burst_enable_register(LFR_MODE_SBM1);
1041 1041 // SM simulation
1042 1042 // timer_start( (gptimer_regs_t*) REGS_ADDR_GPTIMER, TIMER_SM_SIMULATOR );
1043 1043 // LEON_Clear_interrupt( IRQ_SM ); // the IRQ_SM seems to be incompatible with the IRQ_WF on the xilinx board
1044 1044 // LEON_Unmask_interrupt( IRQ_SM );
1045 1045 #endif
1046 1046
1047 1047 return status;
1048 1048 }
1049 1049
1050 1050 int enter_sbm2_mode()
1051 1051 {
1052 1052 rtems_status_code status;
1053 1053
1054 1054 status = restart_science_tasks();
1055 1055
1056 1056 set_local_sbm2_nb_cwf_max();
1057 1057
1058 1058 reset_local_sbm2_nb_cwf_sent();
1059 1059
1060 1060 #ifdef GSA
1061 1061 LEON_Unmask_interrupt( IRQ_SM );
1062 1062 #else
1063 1063 LEON_Clear_interrupt( IRQ_WAVEFORM_PICKER );
1064 1064 LEON_Unmask_interrupt( IRQ_WAVEFORM_PICKER );
1065 1065 reset_waveform_picker_regs();
1066 1066 set_wfp_burst_enable_register(LFR_MODE_SBM2);
1067 1067 #endif
1068 1068
1069 1069 return status;
1070 1070 }
1071 1071
1072 1072 int restart_science_tasks()
1073 1073 {
1074 1074 rtems_status_code status[6];
1075 1075 rtems_status_code ret;
1076 1076
1077 1077 ret = RTEMS_SUCCESSFUL;
1078 1078
1079 1079 status[0] = rtems_task_restart( Task_id[TASKID_AVF0], 1 );
1080 1080 if (status[0] != RTEMS_SUCCESSFUL)
1081 1081 {
1082 1082 PRINTF1("in restart_science_task *** 0 ERR %d\n", status[0])
1083 1083 }
1084 1084
1085 1085 status[1] = rtems_task_restart( Task_id[TASKID_BPF0],1 );
1086 1086 if (status[1] != RTEMS_SUCCESSFUL)
1087 1087 {
1088 1088 PRINTF1("in restart_science_task *** 1 ERR %d\n", status[1])
1089 1089 }
1090 1090
1091 1091 status[2] = rtems_task_restart( Task_id[TASKID_WFRM],1 );
1092 1092 if (status[2] != RTEMS_SUCCESSFUL)
1093 1093 {
1094 1094 PRINTF1("in restart_science_task *** 2 ERR %d\n", status[2])
1095 1095 }
1096 1096
1097 1097 status[3] = rtems_task_restart( Task_id[TASKID_CWF3],1 );
1098 1098 if (status[3] != RTEMS_SUCCESSFUL)
1099 1099 {
1100 1100 PRINTF1("in restart_science_task *** 3 ERR %d\n", status[3])
1101 1101 }
1102 1102
1103 1103 status[4] = rtems_task_restart( Task_id[TASKID_CWF2],1 );
1104 1104 if (status[4] != RTEMS_SUCCESSFUL)
1105 1105 {
1106 1106 PRINTF1("in restart_science_task *** 4 ERR %d\n", status[4])
1107 1107 }
1108 1108
1109 1109 status[5] = rtems_task_restart( Task_id[TASKID_CWF1],1 );
1110 1110 if (status[5] != RTEMS_SUCCESSFUL)
1111 1111 {
1112 1112 PRINTF1("in restart_science_task *** 5 ERR %d\n", status[5])
1113 1113 }
1114 1114
1115 1115 if ( (status[0] != RTEMS_SUCCESSFUL) || (status[1] != RTEMS_SUCCESSFUL) || (status[2] != RTEMS_SUCCESSFUL) ||
1116 1116 (status[3] != RTEMS_SUCCESSFUL) || (status[4] != RTEMS_SUCCESSFUL) || (status[5] != RTEMS_SUCCESSFUL) )
1117 1117 {
1118 1118 ret = RTEMS_UNSATISFIED;
1119 1119 }
1120 1120
1121 1121 return ret;
1122 1122 }
1123 1123
1124 1124 int suspend_science_tasks()
1125 1125 {
1126 1126 rtems_status_code status[6];
1127 1127 rtems_status_code ret;
1128 1128
1129 1129 ret = RTEMS_SUCCESSFUL;
1130 1130
1131 1131 status[0] = rtems_task_suspend( Task_id[TASKID_AVF0] );
1132 1132 if (status[0] != RTEMS_SUCCESSFUL)
1133 1133 {
1134 1134 PRINTF1("in suspend_science_task *** 0 ERR %d\n", status[0])
1135 1135 }
1136 1136
1137 1137 status[1] = rtems_task_suspend( Task_id[TASKID_BPF0] );
1138 1138 if (status[1] != RTEMS_SUCCESSFUL)
1139 1139 {
1140 1140 PRINTF1("in suspend_science_task *** 1 ERR %d\n", status[1])
1141 1141 }
1142 1142
1143 1143 status[2] = rtems_task_suspend( Task_id[TASKID_WFRM] );
1144 1144 if (status[2] != RTEMS_SUCCESSFUL)
1145 1145 {
1146 1146 PRINTF1("in suspend_science_task *** 2 ERR %d\n", status[2])
1147 1147 }
1148 1148
1149 1149 status[3] = rtems_task_suspend( Task_id[TASKID_CWF3] );
1150 1150 if (status[3] != RTEMS_SUCCESSFUL)
1151 1151 {
1152 1152 PRINTF1("in suspend_science_task *** 3 ERR %d\n", status[3])
1153 1153 }
1154 1154
1155 1155 status[4] = rtems_task_suspend( Task_id[TASKID_CWF2] );
1156 1156 if (status[4] != RTEMS_SUCCESSFUL)
1157 1157 {
1158 1158 PRINTF1("in suspend_science_task *** 4 ERR %d\n", status[4])
1159 1159 }
1160 1160
1161 1161 status[5] = rtems_task_suspend( Task_id[TASKID_CWF1] );
1162 1162 if (status[5] != RTEMS_SUCCESSFUL)
1163 1163 {
1164 1164 PRINTF1("in suspend_science_task *** 5 ERR %d\n", status[5])
1165 1165 }
1166 1166
1167 1167 if ( (status[0] != RTEMS_SUCCESSFUL) || (status[1] != RTEMS_SUCCESSFUL) || (status[2] != RTEMS_SUCCESSFUL) ||
1168 1168 (status[3] != RTEMS_SUCCESSFUL) || (status[4] != RTEMS_SUCCESSFUL) || (status[5] != RTEMS_SUCCESSFUL) )
1169 1169 {
1170 1170 ret = RTEMS_UNSATISFIED;
1171 1171 }
1172 1172
1173 1173 return ret;
1174 1174 }
1175 1175
1176 1176 //****************
1177 1177 // CLOSING ACTIONS
1178 1178
1179 1179 int send_tm_lfr_tc_exe_success(ccsdsTelecommandPacket_t *TC, rtems_id queue_id)
1180 1180 {
1181 1181 int ret;
1182 1182 rtems_status_code status;
1183 1183 TMHeader_t TM_header;
1184 1184 char data[4];
1185 1185 spw_ioctl_pkt_send spw_ioctl_send;
1186 1186
1187 1187 ret = LFR_SUCCESSFUL;
1188 1188
1189 1189 TM_build_header( TM_LFR_TC_EXE_OK, PACKET_LENGTH_TC_EXE_SUCCESS,
1190 1190 &TM_header,
1191 1191 TC->sourceID); // TC source ID
1192 1192
1193 1193 data[0] = TC->packetID[0];
1194 1194 data[1] = TC->packetID[1];
1195 1195 data[2] = TC->packetSequenceControl[0];
1196 1196 data[3] = TC->packetSequenceControl[1];
1197 1197
1198 1198 // filling the structure for the spacewire transmission
1199 1199 spw_ioctl_send.hlen = TM_HEADER_LEN + 4; // + 4 is for the protocole extra header
1200 1200 spw_ioctl_send.hdr = (char*) &TM_header;
1201 1201 spw_ioctl_send.dlen = 4;
1202 1202 spw_ioctl_send.data = data;
1203 1203 spw_ioctl_send.options = 0;
1204 1204
1205 1205 // SEND DATA
1206 //status = ioctl( fdSPW, SPACEWIRE_IOCTRL_SEND, &spw_ioctl_send );
1207 1206 status = rtems_message_queue_urgent( queue_id, &spw_ioctl_send, sizeof(spw_ioctl_send));
1208 1207 if (status != RTEMS_SUCCESSFUL) {
1209 1208 PRINTF("in send_tm_lfr_tc_exe_success *** ERR\n")
1210 1209 ret = LFR_DEFAULT;
1211 1210 }
1212 1211
1213 1212 return ret;
1214 1213 }
1215 1214
1216 1215 int send_tm_lfr_tc_exe_not_executable(ccsdsTelecommandPacket_t *TC, rtems_id queue_id)
1217 1216 {
1218 1217 int ret;
1219 1218 rtems_status_code status;
1220 1219 TMHeader_t TM_header;
1221 1220 char data[10];
1222 1221 spw_ioctl_pkt_send spw_ioctl_send;
1223 1222
1224 1223 ret = LFR_SUCCESSFUL;
1225 1224
1226 1225 TM_build_header( TM_LFR_TC_EXE_ERR, PACKET_LENGTH_TC_EXE_NOT_EXECUTABLE,
1227 1226 &TM_header,
1228 1227 TC->sourceID); // TC source ID
1229 1228
1230 1229 data[0] = (char) (FAILURE_CODE_NOT_EXECUTABLE >> 8);
1231 1230 data[1] = (char) FAILURE_CODE_NOT_EXECUTABLE;
1232 1231 data[2] = TC->packetID[0];
1233 1232 data[3] = TC->packetID[1];
1234 1233 data[4] = TC->packetSequenceControl[0];
1235 1234 data[5] = TC->packetSequenceControl[1];
1236 1235 data[6] = TC->serviceType; // type of the rejected TC
1237 1236 data[7] = TC->serviceSubType; // subtype of the rejected TC
1238 1237 data[8] = housekeeping_packet.lfr_status_word[0];
1239 1238 data[6] = housekeeping_packet.lfr_status_word[1];
1240 1239
1241 1240 // filling the structure for the spacewire transmission
1242 1241 spw_ioctl_send.hlen = TM_HEADER_LEN + 4; // + 4 is for the protocole extra header
1243 1242 spw_ioctl_send.hdr = (char*) &TM_header;
1244 1243 spw_ioctl_send.dlen = 10;
1245 1244 spw_ioctl_send.data = data;
1246 1245 spw_ioctl_send.options = 0;
1247 1246
1248 1247 // SEND DATA
1249 //status = ioctl( fdSPW, SPACEWIRE_IOCTRL_SEND, &spw_ioctl_send );
1250 1248 status = rtems_message_queue_urgent( queue_id, &spw_ioctl_send, sizeof(spw_ioctl_send));
1251 1249 if (status != RTEMS_SUCCESSFUL) {
1252 1250 PRINTF("in send_tm_lfr_tc_exe_success *** ERR\n")
1253 1251 ret = LFR_DEFAULT;
1254 1252 }
1255 1253
1256 1254 return LFR_SUCCESSFUL;
1257 1255 }
1258 1256
1259 1257 int send_tm_lfr_tc_exe_not_implemented(ccsdsTelecommandPacket_t *TC, rtems_id queue_id)
1260 1258 {
1261 1259 int ret;
1262 1260 rtems_status_code status;
1263 1261 TMHeader_t TM_header;
1264 1262 char data[8];
1265 1263 spw_ioctl_pkt_send spw_ioctl_send;
1266 1264
1267 1265 ret = LFR_SUCCESSFUL;
1268 1266
1269 1267 TM_build_header( TM_LFR_TC_EXE_ERR, PACKET_LENGTH_TC_EXE_NOT_IMPLEMENTED,
1270 1268 &TM_header,
1271 1269 TC->sourceID); // TC source ID
1272 1270
1273 1271 data[0] = (char) (FAILURE_CODE_NOT_IMPLEMENTED >> 8);
1274 1272 data[1] = (char) FAILURE_CODE_NOT_IMPLEMENTED;
1275 1273 data[2] = TC->packetID[0];
1276 1274 data[3] = TC->packetID[1];
1277 1275 data[4] = TC->packetSequenceControl[0];
1278 1276 data[5] = TC->packetSequenceControl[1];
1279 1277 data[6] = TC->serviceType; // type of the rejected TC
1280 1278 data[7] = TC->serviceSubType; // subtype of the rejected TC
1281 1279
1282 1280 // filling the structure for the spacewire transmission
1283 1281 spw_ioctl_send.hlen = TM_HEADER_LEN + 4; // + 4 is for the protocole extra header
1284 1282 spw_ioctl_send.hdr = (char*) &TM_header;
1285 1283 spw_ioctl_send.dlen = 8;
1286 1284 spw_ioctl_send.data = data;
1287 1285 spw_ioctl_send.options = 0;
1288 1286
1289 1287 // SEND DATA
1290 //status = ioctl( fdSPW, SPACEWIRE_IOCTRL_SEND, &spw_ioctl_send );
1291 1288 status = rtems_message_queue_urgent( queue_id, &spw_ioctl_send, sizeof(spw_ioctl_send));
1292 1289 if (status != RTEMS_SUCCESSFUL) {
1293 1290 PRINTF("in send_tm_lfr_tc_exe_not_implemented *** ERR\n")
1294 1291 ret = LFR_DEFAULT;
1295 1292 }
1296 1293
1297 1294 return LFR_SUCCESSFUL;
1298 1295 }
1299 1296
1300 1297 int send_tm_lfr_tc_exe_error(ccsdsTelecommandPacket_t *TC, rtems_id queue_id)
1301 1298 {
1302 1299 int ret;
1303 1300 rtems_status_code status;
1304 1301 TMHeader_t TM_header;
1305 1302 char data[8];
1306 1303 spw_ioctl_pkt_send spw_ioctl_send;
1307 1304
1308 1305 TM_build_header( TM_LFR_TC_EXE_ERR, PACKET_LENGTH_TC_EXE_ERROR,
1309 1306 &TM_header,
1310 1307 TC->sourceID); // TC source ID
1311 1308
1312 1309 data[0] = (char) (FAILURE_CODE_ERROR >> 8);
1313 1310 data[1] = (char) FAILURE_CODE_ERROR;
1314 1311 data[2] = TC->packetID[0];
1315 1312 data[3] = TC->packetID[1];
1316 1313 data[4] = TC->packetSequenceControl[0];
1317 1314 data[5] = TC->packetSequenceControl[1];
1318 1315 data[6] = TC->serviceType; // type of the rejected TC
1319 1316 data[7] = TC->serviceSubType; // subtype of the rejected TC
1320 1317
1321 1318 // filling the structure for the spacewire transmission
1322 1319 spw_ioctl_send.hlen = TM_HEADER_LEN + 4; // + 4 is for the protocole extra header
1323 1320 spw_ioctl_send.hdr = (char*) &TM_header;
1324 1321 spw_ioctl_send.dlen = 8;
1325 1322 spw_ioctl_send.data = data;
1326 1323 spw_ioctl_send.options = 0;
1327 1324
1328 1325 // SEND DATA
1329 //status = ioctl( fdSPW, SPACEWIRE_IOCTRL_SEND, &spw_ioctl_send );
1330 1326 status = rtems_message_queue_urgent( queue_id, &spw_ioctl_send, sizeof(spw_ioctl_send));
1331 1327 if (status != RTEMS_SUCCESSFUL) {
1332 1328 PRINTF("in send_tm_lfr_tc_exe_error *** ERR\n")
1333 1329 ret = LFR_DEFAULT;
1334 1330 }
1335 1331
1336 1332 return LFR_SUCCESSFUL;
1337 1333 }
1338 1334
1339 1335 void update_last_TC_exe(ccsdsTelecommandPacket_t *TC)
1340 1336 {
1341 1337 housekeeping_packet.hk_lfr_last_exe_tc_id[0] = TC->packetID[0];
1342 1338 housekeeping_packet.hk_lfr_last_exe_tc_id[1] = TC->packetID[1];
1343 1339 housekeeping_packet.hk_lfr_last_exe_tc_type[0] = 0x00;
1344 1340 housekeeping_packet.hk_lfr_last_exe_tc_type[1] = TC->serviceType;
1345 1341 housekeeping_packet.hk_lfr_last_exe_tc_subtype[0] = 0x00;
1346 1342 housekeeping_packet.hk_lfr_last_exe_tc_subtype[1] = TC->serviceSubType;
1347 1343 housekeeping_packet.hk_lfr_last_exe_tc_time[0] = (unsigned char) (time_management_regs->coarse_time>>24);
1348 1344 housekeeping_packet.hk_lfr_last_exe_tc_time[1] = (unsigned char) (time_management_regs->coarse_time>>16);
1349 1345 housekeeping_packet.hk_lfr_last_exe_tc_time[2] = (unsigned char) (time_management_regs->coarse_time>>8);
1350 1346 housekeeping_packet.hk_lfr_last_exe_tc_time[3] = (unsigned char) (time_management_regs->coarse_time);
1351 1347 housekeeping_packet.hk_lfr_last_exe_tc_time[4] = (unsigned char) (time_management_regs->fine_time>>8);
1352 1348 housekeeping_packet.hk_lfr_last_exe_tc_time[5] = (unsigned char) (time_management_regs->fine_time);
1353 1349 }
1354 1350
1355 1351 void update_last_TC_rej(ccsdsTelecommandPacket_t *TC)
1356 1352 {
1357 1353 housekeeping_packet.hk_lfr_last_rej_tc_id[0] = TC->packetID[0];
1358 1354 housekeeping_packet.hk_lfr_last_rej_tc_id[1] = TC->packetID[1];
1359 1355 housekeeping_packet.hk_lfr_last_rej_tc_type[0] = 0x00;
1360 1356 housekeeping_packet.hk_lfr_last_rej_tc_type[1] = TC->serviceType;
1361 1357 housekeeping_packet.hk_lfr_last_rej_tc_subtype[0] = 0x00;
1362 1358 housekeeping_packet.hk_lfr_last_rej_tc_subtype[1] = TC->serviceSubType;
1363 1359 housekeeping_packet.hk_lfr_last_rej_tc_time[0] = (unsigned char) (time_management_regs->coarse_time>>24);
1364 1360 housekeeping_packet.hk_lfr_last_rej_tc_time[1] = (unsigned char) (time_management_regs->coarse_time>>16);
1365 1361 housekeeping_packet.hk_lfr_last_rej_tc_time[2] = (unsigned char) (time_management_regs->coarse_time>>8);
1366 1362 housekeeping_packet.hk_lfr_last_rej_tc_time[3] = (unsigned char) (time_management_regs->coarse_time);
1367 1363 housekeeping_packet.hk_lfr_last_rej_tc_time[4] = (unsigned char) (time_management_regs->fine_time>>8);
1368 1364 housekeeping_packet.hk_lfr_last_rej_tc_time[5] = (unsigned char) (time_management_regs->fine_time);
1369 1365 }
1370 1366
1371 1367 void close_action(ccsdsTelecommandPacket_t *TC, int result, rtems_id queue_id)
1372 1368 {
1373 1369 unsigned int val = 0;
1374 1370 if (result == LFR_SUCCESSFUL)
1375 1371 {
1376 1372 if ( !( (TC->serviceType==TC_TYPE_TIME) && (TC->serviceSubType==TC_SUBTYPE_UPDT_TIME) ) )
1377 1373 {
1378 1374 send_tm_lfr_tc_exe_success( TC, queue_id );
1379 1375 }
1380 1376 update_last_TC_exe( TC );
1381 1377 val = housekeeping_packet.hk_dpu_exe_tc_lfr_cnt[0] * 256 + housekeeping_packet.hk_dpu_exe_tc_lfr_cnt[1];
1382 1378 val++;
1383 1379 housekeeping_packet.hk_dpu_exe_tc_lfr_cnt[0] = (unsigned char) (val >> 8);
1384 1380 housekeeping_packet.hk_dpu_exe_tc_lfr_cnt[1] = (unsigned char) (val);
1385 1381 }
1386 1382 else
1387 1383 {
1388 1384 update_last_TC_rej( TC );
1389 1385 val = housekeeping_packet.hk_dpu_rej_tc_lfr_cnt[0] * 256 + housekeeping_packet.hk_dpu_rej_tc_lfr_cnt[1];
1390 1386 val++;
1391 1387 housekeeping_packet.hk_dpu_rej_tc_lfr_cnt[0] = (unsigned char) (val >> 8);
1392 1388 housekeeping_packet.hk_dpu_rej_tc_lfr_cnt[1] = (unsigned char) (val);
1393 1389 }
1394 1390 }
1395 1391
1396 1392 //***************************
1397 1393 // Interrupt Service Routines
1398 1394 rtems_isr commutation_isr1( rtems_vector_number vector )
1399 1395 {
1400 1396 if (rtems_event_send( Task_id[TASKID_DUMB], RTEMS_EVENT_0 ) != RTEMS_SUCCESSFUL) {
1401 1397 printf("In commutation_isr1 *** Error sending event to DUMB\n");
1402 1398 }
1403 1399 }
1404 1400
1405 1401 rtems_isr commutation_isr2( rtems_vector_number vector )
1406 1402 {
1407 1403 if (rtems_event_send( Task_id[TASKID_DUMB], RTEMS_EVENT_0 ) != RTEMS_SUCCESSFUL) {
1408 1404 printf("In commutation_isr2 *** Error sending event to DUMB\n");
1409 1405 }
1410 1406 }
1411 1407
1412 1408
1413 1409
1414 1410
@@ -1,841 +1,841
1 1 #include <wf_handler.h>
2 2
3 3 // SWF
4 4 Header_TM_LFR_SCIENCE_SWF_t headerSWF_F0[7];
5 5 Header_TM_LFR_SCIENCE_SWF_t headerSWF_F1[7];
6 6 Header_TM_LFR_SCIENCE_SWF_t headerSWF_F2[7];
7 7 // CWF
8 8 Header_TM_LFR_SCIENCE_CWF_t headerCWF_F1[7];
9 9 Header_TM_LFR_SCIENCE_CWF_t headerCWF_F2_BURST[7];
10 10 Header_TM_LFR_SCIENCE_CWF_t headerCWF_F2_SBM2[7];
11 11 Header_TM_LFR_SCIENCE_CWF_t headerCWF_F3[7];
12 12
13 13 unsigned char doubleSendCWF1 = 0;
14 14 unsigned char doubleSendCWF2 = 0;
15 15
16 16 rtems_isr waveforms_isr( rtems_vector_number vector )
17 17 {
18 18
19 19 #ifdef GSA
20 20 #else
21 21 if ( (lfrCurrentMode == LFR_MODE_NORMAL)
22 22 || (lfrCurrentMode == LFR_MODE_SBM1) || (lfrCurrentMode == LFR_MODE_SBM2) )
23 23 { // in modes other than STANDBY and BURST, send the CWF_F3 data
24 24 if ((waveform_picker_regs->status & 0x08) == 0x08){ // [1000] f3 is full
25 25 // (1) change the receiving buffer for the waveform picker
26 26 if (waveform_picker_regs->addr_data_f3 == (int) wf_cont_f3) {
27 27 waveform_picker_regs->addr_data_f3 = (int) (wf_cont_f3_bis);
28 28 }
29 29 else {
30 30 waveform_picker_regs->addr_data_f3 = (int) (wf_cont_f3);
31 31 }
32 32 // (2) send an event for the waveforms transmission
33 33 if (rtems_event_send( Task_id[TASKID_CWF3], RTEMS_EVENT_0 ) != RTEMS_SUCCESSFUL) {
34 34 rtems_event_send( Task_id[TASKID_DUMB], RTEMS_EVENT_2 );
35 35 }
36 36 waveform_picker_regs->status = waveform_picker_regs->status & 0xfffff777; // reset f3 bits to 0, [1111 0111 0111 0111]
37 37 }
38 38 }
39 39 #endif
40 40
41 41 switch(lfrCurrentMode)
42 42 {
43 43 //********
44 44 // STANDBY
45 45 case(LFR_MODE_STANDBY):
46 46 break;
47 47
48 48 //******
49 49 // NORMAL
50 50 case(LFR_MODE_NORMAL):
51 51 #ifdef GSA
52 52 PRINTF("in waveform_isr *** unexpected waveform picker interruption\n")
53 53 #else
54 54 if ( (waveform_picker_regs->burst_enable & 0x7) == 0x0 ){ // if no channel is enable
55 55 rtems_event_send( Task_id[TASKID_DUMB], RTEMS_EVENT_2 );
56 56 }
57 57 else {
58 58 if ( (waveform_picker_regs->status & 0x7) == 0x7 ){ // f2 f1 and f0 are full
59 59 waveform_picker_regs->burst_enable = waveform_picker_regs->burst_enable & 0x08;
60 60 if (rtems_event_send( Task_id[TASKID_WFRM], RTEMS_EVENT_MODE_NORMAL ) != RTEMS_SUCCESSFUL) {
61 61 rtems_event_send( Task_id[TASKID_DUMB], RTEMS_EVENT_2 );
62 62 }
63 63 waveform_picker_regs->status = waveform_picker_regs->status & 0x00;
64 64 waveform_picker_regs->burst_enable = waveform_picker_regs->burst_enable | 0x07; // [0111] enable f2 f1 f0
65 65 }
66 66 }
67 67 #endif
68 68 break;
69 69
70 70 //******
71 71 // BURST
72 72 case(LFR_MODE_BURST):
73 73 #ifdef GSA
74 74 PRINTF("in waveform_isr *** unexpected waveform picker interruption\n")
75 75 #else
76 76 if ((waveform_picker_regs->status & 0x04) == 0x04){ // [0100] check the f2 full bit
77 77 // (1) change the receiving buffer for the waveform picker
78 78 if (waveform_picker_regs->addr_data_f2 == (int) wf_snap_f2) {
79 79 waveform_picker_regs->addr_data_f2 = (int) (wf_snap_f2_bis);
80 80 }
81 81 else {
82 82 waveform_picker_regs->addr_data_f2 = (int) (wf_snap_f2);
83 83 }
84 84 // (2) send an event for the waveforms transmission
85 85 if (rtems_event_send( Task_id[TASKID_CWF2], RTEMS_EVENT_MODE_BURST ) != RTEMS_SUCCESSFUL) {
86 86 rtems_event_send( Task_id[TASKID_DUMB], RTEMS_EVENT_2 );
87 87 }
88 88 waveform_picker_regs->status = waveform_picker_regs->status & 0xfffffbbb; // [1111 1011 1011 1011] f2 bits = 0
89 89 }
90 90 #endif
91 91 break;
92 92
93 93 //*****
94 94 // SBM1
95 95 case(LFR_MODE_SBM1):
96 96 #ifdef GSA
97 97 PRINTF("in waveform_isr *** unexpected waveform picker interruption\n")
98 98 #else
99 99 if ((waveform_picker_regs->status & 0x02) == 0x02){ // [0010] check the f1 full bit
100 100 // (1) change the receiving buffer for the waveform picker
101 101 if ( param_local.local_sbm1_nb_cwf_sent == (param_local.local_sbm1_nb_cwf_max-1) )
102 102 {
103 103 waveform_picker_regs->addr_data_f1 = (int) (wf_snap_f1_norm);
104 104 }
105 105 else if ( waveform_picker_regs->addr_data_f1 == (int) wf_snap_f1_norm )
106 106 {
107 107 doubleSendCWF1 = 1;
108 108 waveform_picker_regs->addr_data_f1 = (int) (wf_snap_f1);
109 109 }
110 110 else if ( waveform_picker_regs->addr_data_f1 == (int) wf_snap_f1 ) {
111 111 waveform_picker_regs->addr_data_f1 = (int) (wf_snap_f1_bis);
112 112 }
113 113 else {
114 114 waveform_picker_regs->addr_data_f1 = (int) (wf_snap_f1);
115 115 }
116 116 // (2) send an event for the waveforms transmission
117 117 if (rtems_event_send( Task_id[TASKID_CWF1], RTEMS_EVENT_MODE_SBM1 ) != RTEMS_SUCCESSFUL) {
118 118 rtems_event_send( Task_id[TASKID_DUMB], RTEMS_EVENT_2 );
119 119 }
120 120 waveform_picker_regs->status = waveform_picker_regs->status & 0xfffffddd; // [1111 1101 1101 1101] f1 bit = 0
121 121 }
122 122 if ( ( (waveform_picker_regs->status & 0x05) == 0x05 ) ) { // [0101] check the f2 and f0 full bit
123 123 if (rtems_event_send( Task_id[TASKID_WFRM], RTEMS_EVENT_MODE_NORMAL ) != RTEMS_SUCCESSFUL) {
124 124 rtems_event_send( Task_id[TASKID_DUMB], RTEMS_EVENT_2 );
125 125 }
126 126 waveform_picker_regs->status = waveform_picker_regs->status & 0xfffffaaa; // [1111 1010 1010 1010] f2 and f0 bits = 0
127 127 reset_local_sbm1_nb_cwf_sent();
128 128 }
129 129
130 130 #endif
131 131 break;
132 132
133 133 //*****
134 134 // SBM2
135 135 case(LFR_MODE_SBM2):
136 136 #ifdef GSA
137 137 PRINTF("in waveform_isr *** unexpected waveform picker interruption\n")
138 138 #else
139 139 if ((waveform_picker_regs->status & 0x04) == 0x04){ // [0100] check the f2 full bit
140 140 // (1) change the receiving buffer for the waveform picker
141 141 if ( param_local.local_sbm2_nb_cwf_sent == (param_local.local_sbm2_nb_cwf_max-1) )
142 142 {
143 143 waveform_picker_regs->addr_data_f2 = (int) (wf_snap_f2_norm);
144 144 }
145 145 else if ( waveform_picker_regs->addr_data_f2 == (int) wf_snap_f2_norm ) {
146 146 waveform_picker_regs->addr_data_f2 = (int) (wf_snap_f2);
147 147 doubleSendCWF2 = 1;
148 148 if (rtems_event_send( Task_id[TASKID_WFRM], RTEMS_EVENT_MODE_SBM2_WFRM ) != RTEMS_SUCCESSFUL) {
149 149 rtems_event_send( Task_id[TASKID_DUMB], RTEMS_EVENT_2 );
150 150 }
151 151 reset_local_sbm2_nb_cwf_sent();
152 152 }
153 153 else if ( waveform_picker_regs->addr_data_f2 == (int) wf_snap_f2 ) {
154 154 waveform_picker_regs->addr_data_f2 = (int) (wf_snap_f2_bis);
155 155 }
156 156 else {
157 157 waveform_picker_regs->addr_data_f2 = (int) (wf_snap_f2);
158 158 }
159 159 // (2) send an event for the waveforms transmission
160 160 if (rtems_event_send( Task_id[TASKID_CWF2], RTEMS_EVENT_MODE_SBM2 ) != RTEMS_SUCCESSFUL) {
161 161 rtems_event_send( Task_id[TASKID_DUMB], RTEMS_EVENT_2 );
162 162 }
163 163 waveform_picker_regs->status = waveform_picker_regs->status & 0xfffffbbb; // [1111 1011 1011 1011] f2 bit = 0
164 164 }
165 165 if ( ( (waveform_picker_regs->status & 0x03) == 0x03 ) ) { // [0011] f3 f2 f1 f0, f1 and f0 are full
166 166 if (rtems_event_send( Task_id[TASKID_WFRM], RTEMS_EVENT_MODE_SBM2 ) != RTEMS_SUCCESSFUL) {
167 167 rtems_event_send( Task_id[TASKID_DUMB], RTEMS_EVENT_2 );
168 168 }
169 169 waveform_picker_regs->status = waveform_picker_regs->status & 0xfffffccc; // [1111 1100 1100 1100] f1, f0 bits = 0
170 170 }
171 171 #endif
172 172 break;
173 173
174 174 //********
175 175 // DEFAULT
176 176 default:
177 177 break;
178 178 }
179 179 }
180 180
181 181 rtems_isr waveforms_simulator_isr( rtems_vector_number vector )
182 182 {
183 183 unsigned char lfrMode;
184 184 lfrMode = (housekeeping_packet.lfr_status_word[0] & 0xf0) >> 4;
185 185
186 186 switch(lfrMode) {
187 187 case (LFR_MODE_STANDBY):
188 188 break;
189 189 case (LFR_MODE_NORMAL):
190 190 if (rtems_event_send( Task_id[TASKID_WFRM], RTEMS_EVENT_MODE_NORMAL ) != RTEMS_SUCCESSFUL) {
191 191 rtems_event_send( Task_id[TASKID_DUMB], RTEMS_EVENT_5 );
192 192 }
193 193 break;
194 194 case (LFR_MODE_BURST):
195 195 break;
196 196 case (LFR_MODE_SBM1):
197 197 break;
198 198 case (LFR_MODE_SBM2):
199 199 break;
200 200 }
201 201 }
202 202
203 203 rtems_task wfrm_task(rtems_task_argument argument) //used with the waveform picker VHDL IP
204 204 {
205 205 rtems_event_set event_out;
206 206 rtems_id queue_id;
207 207 rtems_status_code status;
208 208
209 209 init_header_snapshot_wf_table( SID_NORM_SWF_F0, headerSWF_F0 );
210 210 init_header_snapshot_wf_table( SID_NORM_SWF_F1, headerSWF_F1 );
211 211 init_header_snapshot_wf_table( SID_NORM_SWF_F2, headerSWF_F2 );
212 212
213 213 init_waveforms();
214 214
215 215 status = rtems_message_queue_ident( misc_name[QUEUE_PKTS], 0, &queue_id );
216 216 if (status != RTEMS_SUCCESSFUL)
217 217 {
218 218 PRINTF1("in WFRM *** ERR getting queue id, %d\n", status)
219 219 }
220 220
221 221 BOOT_PRINTF("in WFRM ***\n")
222 222
223 223 while(1){
224 224 // wait for an RTEMS_EVENT
225 225 rtems_event_receive(RTEMS_EVENT_MODE_NORMAL | RTEMS_EVENT_MODE_SBM1
226 226 | RTEMS_EVENT_MODE_SBM2 | RTEMS_EVENT_MODE_SBM2_WFRM,
227 227 RTEMS_WAIT | RTEMS_EVENT_ANY, RTEMS_NO_TIMEOUT, &event_out);
228 228
229 229 if (event_out == RTEMS_EVENT_MODE_NORMAL)
230 230 {
231 231 send_waveform_SWF(wf_snap_f0, SID_NORM_SWF_F0, headerSWF_F0, queue_id);
232 232 send_waveform_SWF(wf_snap_f1, SID_NORM_SWF_F1, headerSWF_F1, queue_id);
233 233 send_waveform_SWF(wf_snap_f2, SID_NORM_SWF_F2, headerSWF_F2, queue_id);
234 234 #ifdef GSA
235 235 waveform_picker_regs->status = waveform_picker_regs->status & 0xf888; // [1111 1000 1000 1000] f2, f1, f0 bits =0
236 236 #endif
237 237 }
238 238 else if (event_out == RTEMS_EVENT_MODE_SBM1)
239 239 {
240 240 send_waveform_SWF(wf_snap_f0, SID_NORM_SWF_F0, headerSWF_F0, queue_id);
241 241 send_waveform_SWF(wf_snap_f1_norm, SID_NORM_SWF_F1, headerSWF_F1, queue_id);
242 242 send_waveform_SWF(wf_snap_f2, SID_NORM_SWF_F2, headerSWF_F2, queue_id);
243 243 #ifdef GSA
244 244 waveform_picker_regs->status = waveform_picker_regs->status & 0xfffffaaa; // [1111 1010 1010 1010] f2, f0 bits = 0
245 245 #endif
246 246 }
247 247 else if (event_out == RTEMS_EVENT_MODE_SBM2)
248 248 {
249 249 send_waveform_SWF(wf_snap_f0, SID_NORM_SWF_F0, headerSWF_F0, queue_id);
250 250 send_waveform_SWF(wf_snap_f1, SID_NORM_SWF_F1, headerSWF_F1, queue_id);
251 251 #ifdef GSA
252 252 waveform_picker_regs->status = waveform_picker_regs->status & 0xfffffccc; // [1111 1100 1100 1100] f1, f0 bits = 0
253 253 #endif
254 254 }
255 255 else if (event_out == RTEMS_EVENT_MODE_SBM2_WFRM)
256 256 {
257 257 send_waveform_SWF(wf_snap_f2_norm, SID_NORM_SWF_F2, headerSWF_F2, queue_id);
258 258 }
259 259 else
260 260 {
261 261 PRINTF("in WFRM *** unexpected event")
262 262 }
263 263
264 264
265 265 #ifdef GSA
266 266 // irq processed, reset the related register of the timer unit
267 267 gptimer_regs->timer[TIMER_WF_SIMULATOR].ctrl = gptimer_regs->timer[TIMER_WF_SIMULATOR].ctrl | 0x00000010;
268 268 // clear the interruption
269 269 LEON_Unmask_interrupt( IRQ_WF );
270 270 #endif
271 271 }
272 272 }
273 273
274 274 rtems_task cwf3_task(rtems_task_argument argument) //used with the waveform picker VHDL IP
275 275 {
276 276 rtems_event_set event_out;
277 277 rtems_id queue_id;
278 278
279 279 init_header_continuous_wf_table( SID_NORM_CWF_F3, headerCWF_F3 );
280 280
281 281 queue_id = get_pkts_queue_id();
282 282
283 283 BOOT_PRINTF("in CWF3 ***\n")
284 284
285 285 while(1){
286 286 // wait for an RTEMS_EVENT
287 287 rtems_event_receive( RTEMS_EVENT_0,
288 288 RTEMS_WAIT | RTEMS_EVENT_ANY, RTEMS_NO_TIMEOUT, &event_out);
289 289 PRINTF("send CWF F3 \n")
290 290 #ifdef GSA
291 291 #else
292 292 if (waveform_picker_regs->addr_data_f3 == (int) wf_cont_f3) {
293 293 send_waveform_CWF( wf_cont_f3_bis, SID_NORM_CWF_F3, headerCWF_F3, queue_id );
294 294 }
295 295 else {
296 296 send_waveform_CWF( wf_cont_f3, SID_NORM_CWF_F3, headerCWF_F3, queue_id );
297 297 }
298 298 #endif
299 299 }
300 300 }
301 301
302 302 rtems_task cwf2_task(rtems_task_argument argument) // ONLY USED IN BURST AND SBM2
303 303 {
304 304 rtems_event_set event_out;
305 305 rtems_id queue_id;
306 306
307 307 init_header_continuous_wf_table( SID_BURST_CWF_F2, headerCWF_F2_BURST );
308 308 init_header_continuous_wf_table( SID_SBM2_CWF_F2, headerCWF_F2_SBM2 );
309 309
310 310 queue_id = get_pkts_queue_id();
311 311
312 312 BOOT_PRINTF("in CWF2 ***\n")
313 313
314 314 while(1){
315 315 // wait for an RTEMS_EVENT
316 316 rtems_event_receive( RTEMS_EVENT_MODE_BURST | RTEMS_EVENT_MODE_SBM2,
317 317 RTEMS_WAIT | RTEMS_EVENT_ANY, RTEMS_NO_TIMEOUT, &event_out);
318 318 if (event_out == RTEMS_EVENT_MODE_BURST)
319 319 {
320 320 // F2
321 321 #ifdef GSA
322 322 #else
323 323 if (waveform_picker_regs->addr_data_f2 == (int) wf_snap_f2) {
324 324 send_waveform_CWF( wf_snap_f2_bis, SID_BURST_CWF_F2, headerCWF_F2_BURST, queue_id );
325 325 }
326 326 else {
327 327 send_waveform_CWF( wf_snap_f2, SID_BURST_CWF_F2, headerCWF_F2_BURST, queue_id );
328 328 }
329 329 #endif
330 330 }
331 331 else if (event_out == RTEMS_EVENT_MODE_SBM2)
332 332 {
333 333 #ifdef GSA
334 334 #else
335 335 if (doubleSendCWF2 == 1)
336 336 {
337 337 doubleSendCWF2 = 0;
338 338 send_waveform_CWF( wf_snap_f2_norm, SID_SBM2_CWF_F2, headerCWF_F2_SBM2, queue_id );
339 339 }
340 340 else if (waveform_picker_regs->addr_data_f2 == (int) wf_snap_f2) {
341 341 send_waveform_CWF( wf_snap_f2_bis, SID_SBM2_CWF_F2, headerCWF_F2_SBM2, queue_id );
342 342 }
343 343 else {
344 344 send_waveform_CWF( wf_snap_f2, SID_SBM2_CWF_F2, headerCWF_F2_SBM2, queue_id );
345 345 }
346 346 param_local.local_sbm2_nb_cwf_sent ++;
347 347 #endif
348 348 }
349 349 else
350 350 {
351 351 PRINTF1("in CWF2 *** ERR mode = %d\n", lfrCurrentMode)
352 352 }
353 353 }
354 354 }
355 355
356 356 rtems_task cwf1_task(rtems_task_argument argument) // ONLY USED IN SBM1
357 357 {
358 358 rtems_event_set event_out;
359 359 rtems_id queue_id;
360 360
361 361 init_header_continuous_wf_table( SID_SBM1_CWF_F1, headerCWF_F1 );
362 362
363 363 queue_id = get_pkts_queue_id();
364 364
365 365 BOOT_PRINTF("in CWF1 ***\n")
366 366
367 367 while(1){
368 368 // wait for an RTEMS_EVENT
369 369 rtems_event_receive( RTEMS_EVENT_MODE_SBM1,
370 370 RTEMS_WAIT | RTEMS_EVENT_ANY, RTEMS_NO_TIMEOUT, &event_out);
371 371 if (event_out == RTEMS_EVENT_MODE_SBM1)
372 372 {
373 373 #ifdef GSA
374 374 #else
375 375 if (doubleSendCWF1 == 1)
376 376 {
377 377 doubleSendCWF1 = 0;
378 378 send_waveform_CWF( wf_snap_f1_norm, SID_SBM1_CWF_F1, headerCWF_F1, queue_id );
379 379 }
380 380 else if (waveform_picker_regs->addr_data_f1 == (int) wf_snap_f1) {
381 381 send_waveform_CWF( wf_snap_f1_bis, SID_SBM1_CWF_F1, headerCWF_F1, queue_id );
382 382 }
383 383 else {
384 384 send_waveform_CWF( wf_snap_f1, SID_SBM1_CWF_F1, headerCWF_F1, queue_id );
385 385 }
386 386 param_local.local_sbm1_nb_cwf_sent ++;
387 387 #endif
388 388 }
389 389 else
390 390 {
391 391 PRINTF1("in CWF1 *** ERR mode = %d\n", lfrCurrentMode)
392 392 }
393 393 }
394 394 }
395 395
396 396 //******************
397 397 // general functions
398 398 void init_waveforms( void )
399 399 {
400 400 int i = 0;
401 401
402 402 for (i=0; i< NB_SAMPLES_PER_SNAPSHOT; i++)
403 403 {
404 404 //***
405 405 // F0
406 406 wf_snap_f0[ (i* NB_WORDS_SWF_BLK) + 0 + TIME_OFFSET ] = 0x88887777; //
407 407 wf_snap_f0[ (i* NB_WORDS_SWF_BLK) + 1 + TIME_OFFSET ] = 0x22221111; //
408 408 wf_snap_f0[ (i* NB_WORDS_SWF_BLK) + 2 + TIME_OFFSET ] = 0x44443333; //
409 409
410 410 //***
411 411 // F1
412 412 wf_snap_f1[ (i* NB_WORDS_SWF_BLK) + 0 + TIME_OFFSET ] = 0x22221111;
413 413 wf_snap_f1[ (i* NB_WORDS_SWF_BLK) + 1 + TIME_OFFSET ] = 0x44443333;
414 414 wf_snap_f1[ (i* NB_WORDS_SWF_BLK) + 2 + TIME_OFFSET ] = 0xaaaa0000;
415 415
416 416 //***
417 417 // F2
418 418 wf_snap_f2[ (i* NB_WORDS_SWF_BLK) + 0 + TIME_OFFSET ] = 0x44443333;
419 419 wf_snap_f2[ (i* NB_WORDS_SWF_BLK) + 1 + TIME_OFFSET ] = 0x22221111;
420 420 wf_snap_f2[ (i* NB_WORDS_SWF_BLK) + 2 + TIME_OFFSET ] = 0xaaaa0000;
421 421
422 422 //***
423 423 // F3
424 424 //wf_cont_f3[ (i* NB_WORDS_SWF_BLK) + 0 ] = val1;
425 425 //wf_cont_f3[ (i* NB_WORDS_SWF_BLK) + 1 ] = val2;
426 426 //wf_cont_f3[ (i* NB_WORDS_SWF_BLK) + 2 ] = 0xaaaa0000;
427 427 }
428 428 }
429 429
430 430 int init_header_snapshot_wf_table( unsigned int sid, Header_TM_LFR_SCIENCE_SWF_t *headerSWF)
431 431 {
432 432 unsigned char i;
433 433
434 434 for (i=0; i<7; i++)
435 435 {
436 436 headerSWF[ i ].targetLogicalAddress = CCSDS_DESTINATION_ID;
437 437 headerSWF[ i ].protocolIdentifier = CCSDS_PROTOCOLE_ID;
438 438 headerSWF[ i ].reserved = DEFAULT_RESERVED;
439 439 headerSWF[ i ].userApplication = CCSDS_USER_APP;
440 440 headerSWF[ i ].packetID[0] = (unsigned char) (TM_PACKET_ID_SCIENCE_NORMAL_BURST >> 8);
441 441 headerSWF[ i ].packetID[1] = (unsigned char) (TM_PACKET_ID_SCIENCE_NORMAL_BURST);
442 442 if (i == 0)
443 443 {
444 444 headerSWF[ i ].packetSequenceControl[0] = TM_PACKET_SEQ_CTRL_FIRST;
445 445 headerSWF[ i ].packetLength[0] = (unsigned char) (TM_LEN_SCI_SWF_340 >> 8);
446 446 headerSWF[ i ].packetLength[1] = (unsigned char) (TM_LEN_SCI_SWF_340 );
447 447 headerSWF[ i ].blkNr[0] = (unsigned char) (BLK_NR_340 >> 8);
448 448 headerSWF[ i ].blkNr[1] = (unsigned char) (BLK_NR_340 );
449 449 }
450 450 else if (i == 6)
451 451 {
452 452 headerSWF[ i ].packetSequenceControl[0] = TM_PACKET_SEQ_CTRL_LAST;
453 453 headerSWF[ i ].packetLength[0] = (unsigned char) (TM_LEN_SCI_SWF_8 >> 8);
454 454 headerSWF[ i ].packetLength[1] = (unsigned char) (TM_LEN_SCI_SWF_8 );
455 455 headerSWF[ i ].blkNr[0] = (unsigned char) (BLK_NR_8 >> 8);
456 456 headerSWF[ i ].blkNr[1] = (unsigned char) (BLK_NR_8 );
457 457 }
458 458 else
459 459 {
460 460 headerSWF[ i ].packetSequenceControl[0] = TM_PACKET_SEQ_CTRL_CONTINUATION;
461 461 headerSWF[ i ].packetLength[0] = (unsigned char) (TM_LEN_SCI_SWF_340 >> 8);
462 462 headerSWF[ i ].packetLength[1] = (unsigned char) (TM_LEN_SCI_SWF_340 );
463 463 headerSWF[ i ].blkNr[0] = (unsigned char) (BLK_NR_340 >> 8);
464 464 headerSWF[ i ].blkNr[1] = (unsigned char) (BLK_NR_340 );
465 465 }
466 466 headerSWF[ i ].packetSequenceControl[1] = TM_PACKET_SEQ_CNT_DEFAULT;
467 467 headerSWF[ i ].pktCnt = DEFAULT_PKTCNT; // PKT_CNT
468 468 headerSWF[ i ].pktNr = i+1; // PKT_NR
469 469 // DATA FIELD HEADER
470 470 headerSWF[ i ].spare1_pusVersion_spare2 = DEFAULT_SPARE1_PUSVERSION_SPARE2;
471 471 headerSWF[ i ].serviceType = TM_TYPE_LFR_SCIENCE; // service type
472 472 headerSWF[ i ].serviceSubType = TM_SUBTYPE_LFR_SCIENCE; // service subtype
473 473 headerSWF[ i ].destinationID = TM_DESTINATION_ID_GROUND;
474 474 // AUXILIARY DATA HEADER
475 475 headerSWF[ i ].sid = sid;
476 476 headerSWF[ i ].hkBIA = DEFAULT_HKBIA;
477 477 headerSWF[ i ].time[0] = 0x00;
478 478 headerSWF[ i ].time[0] = 0x00;
479 479 headerSWF[ i ].time[0] = 0x00;
480 480 headerSWF[ i ].time[0] = 0x00;
481 481 headerSWF[ i ].time[0] = 0x00;
482 482 headerSWF[ i ].time[0] = 0x00;
483 483 }
484 484 return LFR_SUCCESSFUL;
485 485 }
486 486
487 487 int init_header_continuous_wf_table( unsigned int sid, Header_TM_LFR_SCIENCE_CWF_t *headerCWF )
488 488 {
489 489 unsigned int i;
490 490
491 491 for (i=0; i<7; i++)
492 492 {
493 493 headerCWF[ i ].targetLogicalAddress = CCSDS_DESTINATION_ID;
494 494 headerCWF[ i ].protocolIdentifier = CCSDS_PROTOCOLE_ID;
495 495 headerCWF[ i ].reserved = DEFAULT_RESERVED;
496 496 headerCWF[ i ].userApplication = CCSDS_USER_APP;
497 497 if (SID_SBM1_CWF_F1 || SID_SBM2_CWF_F2)
498 498 {
499 499 headerCWF[ i ].packetID[0] = (unsigned char) (TM_PACKET_ID_SCIENCE_SBM1_SBM2 >> 8);
500 500 headerCWF[ i ].packetID[1] = (unsigned char) (TM_PACKET_ID_SCIENCE_SBM1_SBM2);
501 501 }
502 502 else
503 503 {
504 504 headerCWF[ i ].packetID[0] = (unsigned char) (TM_PACKET_ID_SCIENCE_NORMAL_BURST >> 8);
505 505 headerCWF[ i ].packetID[1] = (unsigned char) (TM_PACKET_ID_SCIENCE_NORMAL_BURST);
506 506 }
507 507 if (i == 0)
508 508 {
509 509 headerCWF[ i ].packetSequenceControl[0] = TM_PACKET_SEQ_CTRL_FIRST;
510 510 headerCWF[ i ].packetLength[0] = (unsigned char) (TM_LEN_SCI_CWF_340 >> 8);
511 511 headerCWF[ i ].packetLength[1] = (unsigned char) (TM_LEN_SCI_CWF_340 );
512 512 headerCWF[ i ].blkNr[0] = (unsigned char) (BLK_NR_340 >> 8);
513 513 headerCWF[ i ].blkNr[1] = (unsigned char) (BLK_NR_340 );
514 514 }
515 515 else if (i == 6)
516 516 {
517 517 headerCWF[ i ].packetSequenceControl[0] = TM_PACKET_SEQ_CTRL_LAST;
518 518 headerCWF[ i ].packetLength[0] = (unsigned char) (TM_LEN_SCI_CWF_8 >> 8);
519 519 headerCWF[ i ].packetLength[1] = (unsigned char) (TM_LEN_SCI_CWF_8 );
520 520 headerCWF[ i ].blkNr[0] = (unsigned char) (BLK_NR_8 >> 8);
521 521 headerCWF[ i ].blkNr[1] = (unsigned char) (BLK_NR_8 );
522 522 }
523 523 else
524 524 {
525 525 headerCWF[ i ].packetSequenceControl[0] = TM_PACKET_SEQ_CTRL_CONTINUATION;
526 526 headerCWF[ i ].packetLength[0] = (unsigned char) (TM_LEN_SCI_CWF_340 >> 8);
527 527 headerCWF[ i ].packetLength[1] = (unsigned char) (TM_LEN_SCI_CWF_340 );
528 528 headerCWF[ i ].blkNr[0] = (unsigned char) (BLK_NR_340 >> 8);
529 529 headerCWF[ i ].blkNr[1] = (unsigned char) (BLK_NR_340 );
530 530 }
531 531 headerCWF[ i ].packetSequenceControl[1] = TM_PACKET_SEQ_CNT_DEFAULT;
532 532 // PKT_CNT
533 533 // PKT_NR
534 534 // DATA FIELD HEADER
535 535 headerCWF[ i ].spare1_pusVersion_spare2 = DEFAULT_SPARE1_PUSVERSION_SPARE2;
536 536 headerCWF[ i ].serviceType = TM_TYPE_LFR_SCIENCE; // service type
537 537 headerCWF[ i ].serviceSubType = TM_SUBTYPE_LFR_SCIENCE; // service subtype
538 538 headerCWF[ i ].destinationID = TM_DESTINATION_ID_GROUND;
539 539 // AUXILIARY DATA HEADER
540 540 headerCWF[ i ].sid = sid;
541 541 headerCWF[ i ].hkBIA = DEFAULT_HKBIA;
542 542 headerCWF[ i ].time[0] = 0x00;
543 543 headerCWF[ i ].time[0] = 0x00;
544 544 headerCWF[ i ].time[0] = 0x00;
545 545 headerCWF[ i ].time[0] = 0x00;
546 546 headerCWF[ i ].time[0] = 0x00;
547 547 headerCWF[ i ].time[0] = 0x00;
548 548 }
549 549 return LFR_SUCCESSFUL;
550 550 }
551 551
552 552 void reset_waveforms( void )
553 553 {
554 554 int i = 0;
555 555
556 556 for (i=0; i< NB_SAMPLES_PER_SNAPSHOT; i++)
557 557 {
558 558 wf_snap_f0[ (i* NB_WORDS_SWF_BLK) + 0 + TIME_OFFSET] = 0x10002000;
559 559 wf_snap_f0[ (i* NB_WORDS_SWF_BLK) + 1 + TIME_OFFSET] = 0x20001000;
560 560 wf_snap_f0[ (i* NB_WORDS_SWF_BLK) + 2 + TIME_OFFSET] = 0x40008000;
561 561
562 562 //***
563 563 // F1
564 564 wf_snap_f1[ (i* NB_WORDS_SWF_BLK) + 0 + TIME_OFFSET] = 0x1000f000;
565 565 wf_snap_f1[ (i* NB_WORDS_SWF_BLK) + 1 + TIME_OFFSET] = 0xf0001000;
566 566 wf_snap_f1[ (i* NB_WORDS_SWF_BLK) + 2 + TIME_OFFSET] = 0x40008000;
567 567
568 568 //***
569 569 // F2
570 570 wf_snap_f2[ (i* NB_WORDS_SWF_BLK) + 0 + TIME_OFFSET] = 0x40008000;
571 571 wf_snap_f2[ (i* NB_WORDS_SWF_BLK) + 1 + TIME_OFFSET] = 0x20001000;
572 572 wf_snap_f2[ (i* NB_WORDS_SWF_BLK) + 2 + TIME_OFFSET] = 0x10002000;
573 573
574 574 //***
575 575 // F3
576 576 /*wf_cont_f3[ i* NB_WORDS_SWF_BLK + 0 ] = build_value( i, i ); // v and 1
577 577 wf_cont_f3[ i* NB_WORDS_SWF_BLK + 1 ] = build_value( i, i ); // e2 and b1
578 578 wf_cont_f3[ i* NB_WORDS_SWF_BLK + 2 ] = build_value( i, i ); // b2 and b3*/
579 579 }
580 580 }
581 581
582 582 int send_waveform_SWF( volatile int *waveform, unsigned int sid,
583 583 Header_TM_LFR_SCIENCE_SWF_t *headerSWF, rtems_id queue_id )
584 584 {
585 585 unsigned int i;
586 586 int ret;
587 587 rtems_status_code status;
588 588 spw_ioctl_pkt_send spw_ioctl_send_SWF;
589 589
590 590 spw_ioctl_send_SWF.hlen = TM_HEADER_LEN + 4 + 12; // + 4 is for the protocole extra header, + 12 is for the auxiliary header
591 591 spw_ioctl_send_SWF.options = 0;
592 592
593 593 ret = LFR_DEFAULT;
594 594
595 595 for (i=0; i<7; i++) // send waveform
596 596 {
597 597 spw_ioctl_send_SWF.data = (char*) &waveform[ (i * 340 * NB_WORDS_SWF_BLK) ];
598 598 spw_ioctl_send_SWF.hdr = (char*) &headerSWF[ i ];
599 599 // BUILD THE DATA
600 600 if (i==6) {
601 601 spw_ioctl_send_SWF.dlen = 8 * NB_BYTES_SWF_BLK;
602 602 }
603 603 else {
604 604 spw_ioctl_send_SWF.dlen = 340 * NB_BYTES_SWF_BLK;
605 605 }
606 606 // SET PACKET TIME
607 607 headerSWF[ i ].time[0] = (unsigned char) (time_management_regs->coarse_time>>24);
608 608 headerSWF[ i ].time[1] = (unsigned char) (time_management_regs->coarse_time>>16);
609 609 headerSWF[ i ].time[2] = (unsigned char) (time_management_regs->coarse_time>>8);
610 610 headerSWF[ i ].time[3] = (unsigned char) (time_management_regs->coarse_time);
611 611 headerSWF[ i ].time[4] = (unsigned char) (time_management_regs->fine_time>>8);
612 612 headerSWF[ i ].time[5] = (unsigned char) (time_management_regs->fine_time);
613 613 headerSWF[ i ].acquisitionTime[0] = (unsigned char) (time_management_regs->coarse_time>>24);
614 614 headerSWF[ i ].acquisitionTime[1] = (unsigned char) (time_management_regs->coarse_time>>16);
615 615 headerSWF[ i ].acquisitionTime[2] = (unsigned char) (time_management_regs->coarse_time>>8);
616 616 headerSWF[ i ].acquisitionTime[3] = (unsigned char) (time_management_regs->coarse_time);
617 617 headerSWF[ i ].acquisitionTime[4] = (unsigned char) (time_management_regs->fine_time>>8);
618 618 headerSWF[ i ].acquisitionTime[5] = (unsigned char) (time_management_regs->fine_time);
619 619 // SEND PACKET
620 620 status = rtems_message_queue_send( queue_id, &spw_ioctl_send_SWF, ACTION_MSG_PKTS_SIZE);
621 621 if (status != RTEMS_SUCCESSFUL) {
622 622 printf("%d-%d, ERR %d\n", sid, i, (int) status);
623 623 ret = LFR_DEFAULT;
624 624 }
625 625 rtems_task_wake_after(TIME_BETWEEN_TWO_SWF_PACKETS); // 300 ms between each packet => 7 * 3 = 21 packets => 6.3 seconds
626 626 }
627 627
628 628 return ret;
629 629 }
630 630
631 631 int send_waveform_CWF(volatile int *waveform, unsigned int sid,
632 632 Header_TM_LFR_SCIENCE_CWF_t *headerCWF, rtems_id queue_id)
633 633 {
634 634 unsigned int i;
635 635 int ret;
636 636 rtems_status_code status;
637 637 spw_ioctl_pkt_send spw_ioctl_send_CWF;
638 638
639 639 spw_ioctl_send_CWF.hlen = TM_HEADER_LEN + 4 + 10; // + 4 is for the protocole extra header, + 10 is for the auxiliary header
640 640 spw_ioctl_send_CWF.options = 0;
641 641
642 642 ret = LFR_DEFAULT;
643 643
644 644 for (i=0; i<7; i++) // send waveform
645 645 {
646 646 int coarseTime = 0x00;
647 647 int fineTime = 0x00;
648 648 spw_ioctl_send_CWF.data = (char*) &waveform[ (i * 340 * NB_WORDS_SWF_BLK) ];
649 649 spw_ioctl_send_CWF.hdr = (char*) &headerCWF[ i ];
650 650 // BUILD THE DATA
651 651 if (i==6) {
652 652 spw_ioctl_send_CWF.dlen = 8 * NB_BYTES_SWF_BLK;
653 653 }
654 654 else {
655 655 spw_ioctl_send_CWF.dlen = 340 * NB_BYTES_SWF_BLK;
656 656 }
657 657 // SET PACKET TIME
658 658 coarseTime = time_management_regs->coarse_time;
659 659 fineTime = time_management_regs->fine_time;
660 660 headerCWF[ i ].time[0] = (unsigned char) (coarseTime>>24);
661 661 headerCWF[ i ].time[1] = (unsigned char) (coarseTime>>16);
662 662 headerCWF[ i ].time[2] = (unsigned char) (coarseTime>>8);
663 663 headerCWF[ i ].time[3] = (unsigned char) (coarseTime);
664 664 headerCWF[ i ].time[4] = (unsigned char) (fineTime>>8);
665 665 headerCWF[ i ].time[5] = (unsigned char) (fineTime);
666 666 headerCWF[ i ].acquisitionTime[0] = (unsigned char) (coarseTime>>24);
667 667 headerCWF[ i ].acquisitionTime[1] = (unsigned char) (coarseTime>>16);
668 668 headerCWF[ i ].acquisitionTime[2] = (unsigned char) (coarseTime>>8);
669 669 headerCWF[ i ].acquisitionTime[3] = (unsigned char) (coarseTime);
670 670 headerCWF[ i ].acquisitionTime[4] = (unsigned char) (fineTime>>8);
671 671 headerCWF[ i ].acquisitionTime[5] = (unsigned char) (fineTime);
672 672 // SEND PACKET
673 673 if (sid == SID_NORM_CWF_F3)
674 674 {
675 675 status = rtems_message_queue_send( queue_id, &spw_ioctl_send_CWF, sizeof(spw_ioctl_send_CWF));
676 676 if (status != RTEMS_SUCCESSFUL) {
677 677 printf("%d-%d, ERR %d\n", sid, i, (int) status);
678 678 ret = LFR_DEFAULT;
679 679 }
680 680 rtems_task_wake_after(TIME_BETWEEN_TWO_CWF3_PACKETS);
681 681 }
682 682 else
683 683 {
684 status = rtems_message_queue_urgent( queue_id, &spw_ioctl_send_CWF, sizeof(spw_ioctl_send_CWF));
684 status = rtems_message_queue_send( queue_id, &spw_ioctl_send_CWF, sizeof(spw_ioctl_send_CWF));
685 685 if (status != RTEMS_SUCCESSFUL) {
686 686 printf("%d-%d, ERR %d\n", sid, i, (int) status);
687 687 ret = LFR_DEFAULT;
688 688 }
689 689 }
690 690 }
691 691
692 692 return ret;
693 693 }
694 694
695 695 //**************
696 696 // wfp registers
697 697 void set_wfp_data_shaping()
698 698 {
699 699 unsigned char data_shaping;
700 700
701 701 // get the parameters for the data shaping [BW SP0 SP1 R0 R1] in sy_lfr_common1 and configure the register
702 702 // waveform picker : [R1 R0 SP1 SP0 BW]
703 703
704 704 data_shaping = parameter_dump_packet.bw_sp0_sp1_r0_r1;
705 705
706 706 #ifdef GSA
707 707 #else
708 708 waveform_picker_regs->data_shaping =
709 709 ( (data_shaping & 0x10) >> 4 ) // BW
710 710 + ( (data_shaping & 0x08) >> 2 ) // SP0
711 711 + ( (data_shaping & 0x04) ) // SP1
712 712 + ( (data_shaping & 0x02) << 2 ) // R0
713 713 + ( (data_shaping & 0x01) << 4 ); // R1
714 714 #endif
715 715 }
716 716
717 717 char set_wfp_delta_snapshot()
718 718 {
719 719 char ret;
720 720 unsigned int delta_snapshot;
721 721 ret = LFR_DEFAULT;
722 722
723 723 delta_snapshot = parameter_dump_packet.sy_lfr_n_swf_p[0]*256
724 724 + parameter_dump_packet.sy_lfr_n_swf_p[1];
725 725
726 726 #ifdef GSA
727 727 #else
728 728 unsigned char aux = 0;
729 729 if ( delta_snapshot < MIN_DELTA_SNAPSHOT )
730 730 {
731 731 aux = MIN_DELTA_SNAPSHOT;
732 732 ret = LFR_DEFAULT;
733 733 }
734 734 else
735 735 {
736 736 aux = delta_snapshot ;
737 737 ret = LFR_SUCCESSFUL;
738 738 }
739 739 waveform_picker_regs->delta_snapshot = aux; // max 2 bytes
740 740 #endif
741 741
742 742 return ret;
743 743 }
744 744
745 745 void set_wfp_burst_enable_register( unsigned char mode)
746 746 {
747 747 #ifdef GSA
748 748 #else
749 749 // [0000 0000] burst f2, f1, f0 enable f3 f2 f1 f0
750 750 // the burst bits shall be set first, before the enable bits
751 751 switch(mode) {
752 752 case(LFR_MODE_NORMAL):
753 753 waveform_picker_regs->burst_enable = 0x00; // [0000 0000] no burst enable
754 754 waveform_picker_regs->burst_enable = 0x0f; // [0000 1111] enable f3 f2 f1 f0
755 755 break;
756 756 case(LFR_MODE_BURST):
757 757 waveform_picker_regs->burst_enable = 0x40; // [0100 0000] f2 burst enabled
758 758 waveform_picker_regs->burst_enable = waveform_picker_regs->burst_enable | 0x04; // [0100] enable f2
759 759 break;
760 760 case(LFR_MODE_SBM1):
761 761 waveform_picker_regs->burst_enable = 0x20; // [0010 0000] f1 burst enabled
762 762 waveform_picker_regs->burst_enable = waveform_picker_regs->burst_enable | 0x0f; // [1111] enable f3 f2 f1 f0
763 763 break;
764 764 case(LFR_MODE_SBM2):
765 765 waveform_picker_regs->burst_enable = 0x40; // [0100 0000] f2 burst enabled
766 766 waveform_picker_regs->burst_enable = waveform_picker_regs->burst_enable | 0x0f; // [1111] enable f3 f2 f1 f0
767 767 break;
768 768 default:
769 769 waveform_picker_regs->burst_enable = 0x00; // [0000 0000] no burst enabled, no waveform enabled
770 770 break;
771 771 }
772 772 #endif
773 773 }
774 774
775 775 void reset_wfp_burst_enable()
776 776 {
777 777 #ifdef GSA
778 778 #else
779 779 waveform_picker_regs->burst_enable = 0x00; // burst f2, f1, f0 enable f3, f2, f1, f0
780 780 #endif
781 781 }
782 782
783 783 void reset_wfp_status()
784 784 {
785 785 #ifdef GSA
786 786 #else
787 787 waveform_picker_regs->status = 0x00; // burst f2, f1, f0 enable f3, f2, f1, f0
788 788 #endif
789 789 }
790 790
791 791 void reset_waveform_picker_regs()
792 792 {
793 793 #ifdef GSA
794 794 #else
795 795 set_wfp_data_shaping();
796 796 reset_wfp_burst_enable();
797 797 waveform_picker_regs->addr_data_f0 = (int) (wf_snap_f0); //
798 798 waveform_picker_regs->addr_data_f1 = (int) (wf_snap_f1); //
799 799 waveform_picker_regs->addr_data_f2 = (int) (wf_snap_f2); //
800 800 waveform_picker_regs->addr_data_f3 = (int) (wf_cont_f3); //
801 801 set_wfp_delta_snapshot(); // time in seconds between two snapshots
802 802 waveform_picker_regs->delta_f2_f1 = 0xffff; // 0x16800 => 92160 (max 4 bytes)
803 803 waveform_picker_regs->delta_f2_f0 = 0x17c00; // 97 280 (max 5 bytes)
804 804 waveform_picker_regs->nb_burst_available = 0x180; // max 3 bytes, size of the buffer in burst (1 burst = 16 x 4 octets)
805 805 waveform_picker_regs->nb_snapshot_param = 0x7ff; // max 3 octets, 2048 - 1
806 806 waveform_picker_regs->status = 0x00; //
807 807 #endif
808 808 }
809 809
810 810 //*****************
811 811 // local parameters
812 812 void set_local_sbm1_nb_cwf_max()
813 813 {
814 814 // (2 snapshots of 2048 points per seconds) * (period of the NORM snashots) - 8 s (duration of the f2 snapshot)
815 815 param_local.local_sbm1_nb_cwf_max = 2 *
816 816 (parameter_dump_packet.sy_lfr_n_swf_p[0] * 256
817 817 + parameter_dump_packet.sy_lfr_n_swf_p[1]) - 8; // 16 CWF1 parts during 1 SWF2
818 818 }
819 819
820 820 void set_local_sbm2_nb_cwf_max()
821 821 {
822 822 // (period of the NORM snashots) / (8 seconds per snapshot at f2 = 256 Hz)
823 823 param_local.local_sbm2_nb_cwf_max = (parameter_dump_packet.sy_lfr_n_swf_p[0] * 256
824 824 + parameter_dump_packet.sy_lfr_n_swf_p[1]) / 8;
825 825 }
826 826
827 827 void set_local_nb_interrupt_f0_MAX()
828 828 {
829 829 param_local.local_nb_interrupt_f0_MAX = ( (parameter_dump_packet.sy_lfr_n_asm_p[0]) * 256
830 830 + parameter_dump_packet.sy_lfr_n_asm_p[1] ) * 100;
831 831 }
832 832
833 833 void reset_local_sbm1_nb_cwf_sent()
834 834 {
835 835 param_local.local_sbm1_nb_cwf_sent = 0;
836 836 }
837 837
838 838 void reset_local_sbm2_nb_cwf_sent()
839 839 {
840 840 param_local.local_sbm2_nb_cwf_sent = 0;
841 841 }
General Comments 0
You need to be logged in to leave comments. Login now