##// END OF EJS Templates
packet emission task added...
paul -
r33:1280850c4074 default
parent child
Show More
@@ -1,225 +1,233
1 1 #############################################################################
2 2 # Makefile for building: bin/fsw
3 # Generated by qmake (2.01a) (Qt 4.8.4) on: Thu Aug 1 15:31:06 2013
3 # Generated by qmake (2.01a) (Qt 4.8.5) on: Mon Sep 30 15:28:56 2013
4 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=12 -DPRINT_MESSAGES_ON_CONSOLE
13 DEFINES = -DSW_VERSION_N1=0 -DSW_VERSION_N2=0 -DSW_VERSION_N3=0 -DSW_VERSION_N4=13 -DPRINT_MESSAGES_ON_CONSOLE
14 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 ../src/fsw_globals.c
51 ../src/fsw_globals.c \
52 ../src/fsw_spacewire.c
52 53 OBJECTS = obj/wf_handler.o \
53 54 obj/tc_handler.o \
54 55 obj/fsw_processing.o \
55 56 obj/fsw_misc.o \
56 57 obj/fsw_init.o \
57 obj/fsw_globals.o
58 obj/fsw_globals.o \
59 obj/fsw_spacewire.o
58 60 DIST = /usr/lib64/qt4/mkspecs/common/unix.conf \
59 61 /usr/lib64/qt4/mkspecs/common/linux.conf \
60 62 /usr/lib64/qt4/mkspecs/common/gcc-base.conf \
61 63 /usr/lib64/qt4/mkspecs/common/gcc-base-unix.conf \
62 64 /usr/lib64/qt4/mkspecs/common/g++-base.conf \
63 65 /usr/lib64/qt4/mkspecs/common/g++-unix.conf \
64 66 /usr/lib64/qt4/mkspecs/qconfig.pri \
65 67 /usr/lib64/qt4/mkspecs/modules/qt_webkit.pri \
66 68 /usr/lib64/qt4/mkspecs/features/qt_functions.prf \
67 69 /usr/lib64/qt4/mkspecs/features/qt_config.prf \
68 70 /usr/lib64/qt4/mkspecs/features/exclusive_builds.prf \
69 71 /usr/lib64/qt4/mkspecs/features/default_pre.prf \
70 72 sparc.pri \
71 73 /usr/lib64/qt4/mkspecs/features/release.prf \
72 74 /usr/lib64/qt4/mkspecs/features/default_post.prf \
75 /usr/lib64/qt4/mkspecs/features/shared.prf \
73 76 /usr/lib64/qt4/mkspecs/features/unix/gdb_dwarf_index.prf \
74 77 /usr/lib64/qt4/mkspecs/features/warn_on.prf \
75 78 /usr/lib64/qt4/mkspecs/features/resources.prf \
76 79 /usr/lib64/qt4/mkspecs/features/uic.prf \
77 80 /usr/lib64/qt4/mkspecs/features/yacc.prf \
78 81 /usr/lib64/qt4/mkspecs/features/lex.prf \
79 82 /usr/lib64/qt4/mkspecs/features/include_source_dir.prf \
80 83 fsw-qt.pro
81 84 QMAKE_TARGET = fsw
82 85 DESTDIR = bin/
83 86 TARGET = bin/fsw
84 87
85 88 first: all
86 89 ####### Implicit rules
87 90
88 91 .SUFFIXES: .o .c .cpp .cc .cxx .C
89 92
90 93 .cpp.o:
91 94 $(CXX) -c $(CXXFLAGS) $(INCPATH) -o "$@" "$<"
92 95
93 96 .cc.o:
94 97 $(CXX) -c $(CXXFLAGS) $(INCPATH) -o "$@" "$<"
95 98
96 99 .cxx.o:
97 100 $(CXX) -c $(CXXFLAGS) $(INCPATH) -o "$@" "$<"
98 101
99 102 .C.o:
100 103 $(CXX) -c $(CXXFLAGS) $(INCPATH) -o "$@" "$<"
101 104
102 105 .c.o:
103 106 $(CC) -c $(CFLAGS) $(INCPATH) -o "$@" "$<"
104 107
105 108 ####### Build rules
106 109
107 110 all: Makefile $(TARGET)
108 111
109 112 $(TARGET): $(OBJECTS)
110 113 @$(CHK_DIR_EXISTS) bin/ || $(MKDIR) bin/
111 114 $(LINK) $(LFLAGS) -o $(TARGET) $(OBJECTS) $(OBJCOMP) $(LIBS)
112 115
113 116 Makefile: fsw-qt.pro /usr/lib64/qt4/mkspecs/linux-g++/qmake.conf /usr/lib64/qt4/mkspecs/common/unix.conf \
114 117 /usr/lib64/qt4/mkspecs/common/linux.conf \
115 118 /usr/lib64/qt4/mkspecs/common/gcc-base.conf \
116 119 /usr/lib64/qt4/mkspecs/common/gcc-base-unix.conf \
117 120 /usr/lib64/qt4/mkspecs/common/g++-base.conf \
118 121 /usr/lib64/qt4/mkspecs/common/g++-unix.conf \
119 122 /usr/lib64/qt4/mkspecs/qconfig.pri \
120 123 /usr/lib64/qt4/mkspecs/modules/qt_webkit.pri \
121 124 /usr/lib64/qt4/mkspecs/features/qt_functions.prf \
122 125 /usr/lib64/qt4/mkspecs/features/qt_config.prf \
123 126 /usr/lib64/qt4/mkspecs/features/exclusive_builds.prf \
124 127 /usr/lib64/qt4/mkspecs/features/default_pre.prf \
125 128 sparc.pri \
126 129 /usr/lib64/qt4/mkspecs/features/release.prf \
127 130 /usr/lib64/qt4/mkspecs/features/default_post.prf \
131 /usr/lib64/qt4/mkspecs/features/shared.prf \
128 132 /usr/lib64/qt4/mkspecs/features/unix/gdb_dwarf_index.prf \
129 133 /usr/lib64/qt4/mkspecs/features/warn_on.prf \
130 134 /usr/lib64/qt4/mkspecs/features/resources.prf \
131 135 /usr/lib64/qt4/mkspecs/features/uic.prf \
132 136 /usr/lib64/qt4/mkspecs/features/yacc.prf \
133 137 /usr/lib64/qt4/mkspecs/features/lex.prf \
134 138 /usr/lib64/qt4/mkspecs/features/include_source_dir.prf
135 139 $(QMAKE) -spec /usr/lib64/qt4/mkspecs/linux-g++ -o Makefile fsw-qt.pro
136 140 /usr/lib64/qt4/mkspecs/common/unix.conf:
137 141 /usr/lib64/qt4/mkspecs/common/linux.conf:
138 142 /usr/lib64/qt4/mkspecs/common/gcc-base.conf:
139 143 /usr/lib64/qt4/mkspecs/common/gcc-base-unix.conf:
140 144 /usr/lib64/qt4/mkspecs/common/g++-base.conf:
141 145 /usr/lib64/qt4/mkspecs/common/g++-unix.conf:
142 146 /usr/lib64/qt4/mkspecs/qconfig.pri:
143 147 /usr/lib64/qt4/mkspecs/modules/qt_webkit.pri:
144 148 /usr/lib64/qt4/mkspecs/features/qt_functions.prf:
145 149 /usr/lib64/qt4/mkspecs/features/qt_config.prf:
146 150 /usr/lib64/qt4/mkspecs/features/exclusive_builds.prf:
147 151 /usr/lib64/qt4/mkspecs/features/default_pre.prf:
148 152 sparc.pri:
149 153 /usr/lib64/qt4/mkspecs/features/release.prf:
150 154 /usr/lib64/qt4/mkspecs/features/default_post.prf:
155 /usr/lib64/qt4/mkspecs/features/shared.prf:
151 156 /usr/lib64/qt4/mkspecs/features/unix/gdb_dwarf_index.prf:
152 157 /usr/lib64/qt4/mkspecs/features/warn_on.prf:
153 158 /usr/lib64/qt4/mkspecs/features/resources.prf:
154 159 /usr/lib64/qt4/mkspecs/features/uic.prf:
155 160 /usr/lib64/qt4/mkspecs/features/yacc.prf:
156 161 /usr/lib64/qt4/mkspecs/features/lex.prf:
157 162 /usr/lib64/qt4/mkspecs/features/include_source_dir.prf:
158 163 qmake: FORCE
159 164 @$(QMAKE) -spec /usr/lib64/qt4/mkspecs/linux-g++ -o Makefile fsw-qt.pro
160 165
161 166 dist:
162 167 @$(CHK_DIR_EXISTS) obj/fsw1.0.0 || $(MKDIR) obj/fsw1.0.0
163 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
164 169
165 170
166 171 clean:compiler_clean
167 172 -$(DEL_FILE) $(OBJECTS)
168 173 -$(DEL_FILE) *~ core *.core
169 174
170 175
171 176 ####### Sub-libraries
172 177
173 178 distclean: clean
174 179 -$(DEL_FILE) $(TARGET)
175 180 -$(DEL_FILE) Makefile
176 181
177 182
178 183 grmon:
179 184 cd bin && C:/opt/grmon-eval-2.0.29b/win32/bin/grmon.exe -uart COM4 -u
180 185
181 186 check: first
182 187
183 188 compiler_rcc_make_all:
184 189 compiler_rcc_clean:
185 190 compiler_uic_make_all:
186 191 compiler_uic_clean:
187 192 compiler_image_collection_make_all: qmake_image_collection.cpp
188 193 compiler_image_collection_clean:
189 194 -$(DEL_FILE) qmake_image_collection.cpp
190 195 compiler_yacc_decl_make_all:
191 196 compiler_yacc_decl_clean:
192 197 compiler_yacc_impl_make_all:
193 198 compiler_yacc_impl_clean:
194 199 compiler_lex_make_all:
195 200 compiler_lex_clean:
196 201 compiler_clean:
197 202
198 203 ####### Compile
199 204
200 205 obj/wf_handler.o: ../src/wf_handler.c
201 206 $(CC) -c $(CFLAGS) $(INCPATH) -o obj/wf_handler.o ../src/wf_handler.c
202 207
203 208 obj/tc_handler.o: ../src/tc_handler.c
204 209 $(CC) -c $(CFLAGS) $(INCPATH) -o obj/tc_handler.o ../src/tc_handler.c
205 210
206 211 obj/fsw_processing.o: ../src/fsw_processing.c
207 212 $(CC) -c $(CFLAGS) $(INCPATH) -o obj/fsw_processing.o ../src/fsw_processing.c
208 213
209 214 obj/fsw_misc.o: ../src/fsw_misc.c
210 215 $(CC) -c $(CFLAGS) $(INCPATH) -o obj/fsw_misc.o ../src/fsw_misc.c
211 216
212 217 obj/fsw_init.o: ../src/fsw_init.c
213 218 $(CC) -c $(CFLAGS) $(INCPATH) -o obj/fsw_init.o ../src/fsw_init.c
214 219
215 220 obj/fsw_globals.o: ../src/fsw_globals.c
216 221 $(CC) -c $(CFLAGS) $(INCPATH) -o obj/fsw_globals.o ../src/fsw_globals.c
217 222
223 obj/fsw_spacewire.o: ../src/fsw_spacewire.c
224 $(CC) -c $(CFLAGS) $(INCPATH) -o obj/fsw_spacewire.o ../src/fsw_spacewire.c
225
218 226 ####### Install
219 227
220 228 install: FORCE
221 229
222 230 uninstall: FORCE
223 231
224 232 FORCE:
225 233
1 NO CONTENT: modified file, binary diff hidden
@@ -1,52 +1,54
1 1 TEMPLATE = app
2 2 # CONFIG += console v8 sim
3 3 # CONFIG options = verbose *** cpu_usage_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-12
10 SWVERSION=-0-13
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=12
14 DEFINES += SW_VERSION_N4=13
15 15
16 16 contains( CONFIG, verbose ) {
17 17 DEFINES += PRINT_MESSAGES_ON_CONSOLE
18 18 }
19 19
20 20 contains( CONFIG, cpu_usage_report ) {
21 21 DEFINES += PRINT_TASK_STATISTICS
22 22 }
23 23
24 24 TARGET = fsw
25 25 contains( CONFIG, gsa ) {
26 26 DEFINES += GSA
27 27 TARGET = fsw-gsa
28 28 }
29 29
30 30 INCLUDEPATH += \
31 31 ../src \
32 32 ../header
33 33
34 34 SOURCES += \
35 35 ../src/wf_handler.c \
36 36 ../src/tc_handler.c \
37 37 ../src/fsw_processing.c \
38 38 ../src/fsw_misc.c \
39 39 ../src/fsw_init.c \
40 ../src/fsw_globals.c
40 ../src/fsw_globals.c \
41 ../src/fsw_spacewire.c
41 42
42 43 HEADERS += \
43 44 ../header/wf_handler.h \
44 45 ../header/tc_handler.h \
45 46 ../header/grlib_regs.h \
46 47 ../header/fsw_processing.h \
47 48 ../header/fsw_params.h \
48 49 ../header/fsw_misc.h \
49 50 ../header/fsw_init.h \
50 51 ../header/ccsds_types.h \
51 ../header/fsw_params_processing.h
52 ../header/fsw_params_processing.h \
53 ../header/fsw_spacewire.h
52 54
@@ -1,257 +1,257
1 1 <?xml version="1.0" encoding="UTF-8"?>
2 2 <!DOCTYPE QtCreatorProject>
3 <!-- Written by QtCreator 2.8.0, 2013-08-01T13:38:09. -->
3 <!-- Written by QtCreator 2.8.0, 2013-10-01T07:01:25. -->
4 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,119 +1,197
1 1 #ifndef TC_TYPES_H
2 2 #define TC_TYPES_H
3 3
4 4 #include <ccsds_types.h>
5 5
6 #define PROTOCOLE_IDENTIFIER 0x02
7
6 8 // PACKET ID
7 9 #define TC_LFR_PACKET_ID 0x1ccc // PID 76 CAT 12
8 10
11 #define PACKET_LENGTH_TC_LFR_RESET (12 - CCSDS_TC_TM_PACKET_OFFSET)
9 12 #define PACKET_LENGTH_TC_LFR_LOAD_COMMON_PAR (14 - CCSDS_TC_TM_PACKET_OFFSET)
10 13 #define PACKET_LENGTH_TC_LFR_LOAD_NORMAL_PAR (20 - CCSDS_TC_TM_PACKET_OFFSET)
11 14 #define PACKET_LENGTH_TC_LFR_LOAD_BURST_PAR (14 - CCSDS_TC_TM_PACKET_OFFSET)
12 15 #define PACKET_LENGTH_TC_LFR_LOAD_SBM1_PAR (14 - CCSDS_TC_TM_PACKET_OFFSET)
13 16 #define PACKET_LENGTH_TC_LFR_LOAD_SBM2_PAR (14 - CCSDS_TC_TM_PACKET_OFFSET)
14 17 #define PACKET_LENGTH_TC_LFR_DUMP_PAR (12 - CCSDS_TC_TM_PACKET_OFFSET)
15 18 #define PACKET_LENGTH_TC_LFR_ENTER_MODE (20 - CCSDS_TC_TM_PACKET_OFFSET)
19 #define PACKET_LENGTH_TC_LFR_UPDATE_INFO (48 - CCSDS_TC_TM_PACKET_OFFSET)
20 #define PACKET_LENGTH_TC_LFR_ENABLE_CALIBRATION (12 - CCSDS_TC_TM_PACKET_OFFSET)
21 #define PACKET_LENGTH_TC_LFR_DISABLE_CALIBRATION (12 - CCSDS_TC_TM_PACKET_OFFSET)
22 #define PACKET_LENGTH_TC_LFR_UPDATE_TIME (18 - CCSDS_TC_TM_PACKET_OFFSET)
16 23
17 24 // TC TYPES
18 25 #define TC_TYPE_DEFAULT 181
19 26 #define TC_TYPE_LFR_UPDATE_TIME 9
20 27
21 28 // TC SUBTYPES
29 #define TC_SUBTYPE_RESET 1
22 30 #define TC_SUBTYPE_LOAD_COMMON_PAR 11
23 31 #define TC_SUBTYPE_LOAD_NORMAL_PAR 13
24 32 #define TC_SUBTYPE_LOAD_BURST_PAR 19
25 33 #define TC_SUBTYPE_LOAD_SBM1_PAR 25
26 34 #define TC_SUBTYPE_LOAD_SBM2_PAR 27
27 35 #define TC_SUBTYPE_DUMP_PAR 31
28 36 #define TC_SUBTYPE_ENTER_MODE 41
37 #define TC_SUBTYPE_UPDATE_INFO 51
38 #define TC_SUBTYPE_ENABLE_CALIBRATION 61
39 #define TC_SUBTYPE_DISABLE_CALIBRATION 63
40 #define TC_SUBTYPE_UPDATE_TIME 129
29 41
30 42 // OTHER CONSTANTS
31 43 #define TC_LFR_PACKET_SEQUENCE_CONTROL 0xc000 // PID 76 CAT 12
32 44 #define TC_LFR_DATA_FIELD_HEADER0 0x19
33 45 #define TC_LFR_LOAD_COMMON_PAR_SPARE 0x00
34 46
47 struct Packet_TC_LFR_RESET_str
48 { // the CCSDS header is added by LPPMON
49 unsigned char packetID[2];
50 unsigned char packetSequenceControl[2];
51 unsigned char packetLength[2];
52 // DATA FIELD HEADER
53 unsigned char ccsdsSecHeaderFlag_pusVersion_ack;
54 unsigned char serviceType;
55 unsigned char serviceSubType;
56 unsigned char sourceID;
57 unsigned char crc[2];
58 };
59 typedef struct Packet_TC_LFR_RESET_str Packet_TC_LFR_RESET_t;
60
35 61 struct Packet_TC_LFR_ENTER_MODE_str
36 62 { // the CCSDS header is added by LPPMON
37 63 unsigned char packetID[2];
38 64 unsigned char packetSequenceControl[2];
39 65 unsigned char packetLength[2];
40 66 // DATA FIELD HEADER
41 67 unsigned char ccsdsSecHeaderFlag_pusVersion_ack;
42 68 unsigned char serviceType;
43 69 unsigned char serviceSubType;
44 70 unsigned char sourceID;
45 71 unsigned char spare;
46 72 unsigned char mode;
47 73 unsigned char enterModeTime[6];
48 74 unsigned char crc[2];
49 75 };
50 76 typedef struct Packet_TC_LFR_ENTER_MODE_str Packet_TC_LFR_ENTER_MODE_t;
51 77
78 struct Packet_TC_LFR_UPDATE_INFO_str
79 { // the CCSDS header is added by LPPMON
80 unsigned char packetID[2];
81 unsigned char packetSequenceControl[2];
82 unsigned char packetLength[2];
83 // DATA FIELD HEADER
84 unsigned char ccsdsSecHeaderFlag_pusVersion_ack;
85 unsigned char serviceType;
86 unsigned char serviceSubType;
87 unsigned char sourceID;
88 unsigned char set1;
89 unsigned char set2;
90 unsigned char set3_bias_setting_set1[6];
91 unsigned char set3_bias_setting_set2[6];
92 unsigned char set3_bias_voltage[4];
93 unsigned char set4[8];
94 unsigned char set5;
95 unsigned char set6;
96 unsigned char set7[8];
97 unsigned char crc[2];
98 };
99 typedef struct Packet_TC_LFR_UPDATE_INFO_str Packet_TC_LFR_UPDATE_INFO_t;
100
52 101 struct Packet_TC_LFR_DUMP_PAR_str
53 102 { // the CCSDS header is added by LPPMON
54 103 unsigned char packetID[2];
55 104 unsigned char packetSequenceControl[2];
56 105 unsigned char packetLength[2];
57 106 // DATA FIELD HEADER
58 107 unsigned char ccsdsSecHeaderFlag_pusVersion_ack;
59 108 unsigned char serviceType;
60 109 unsigned char serviceSubType;
61 110 unsigned char sourceID;
62 111 unsigned char crc[2];
63 112
64 113 };
65 114 typedef struct Packet_TC_LFR_DUMP_PAR_str Packet_TC_LFR_DUMP_PAR_t;
66 115
67 116 struct Packet_TC_LFR_LOAD_COMMON_PAR_str
68 117 { // the CCSDS header is added by LPPMON
69 118 unsigned char packetID[2];
70 119 unsigned char packetSequenceControl[2];
71 120 unsigned char packetLength[2];
72 121 // DATA FIELD HEADER
73 122 unsigned char ccsdsSecHeaderFlag_pusVersion_ack;
74 123 unsigned char serviceType;
75 124 unsigned char serviceSubType;
76 125 unsigned char sourceID;
77 126 unsigned char spare;
78 127 unsigned char bw_sp0_sp1_r0_r1;
79 128 unsigned char crc[2];
80 129
81 130 };
82 131 typedef struct Packet_TC_LFR_LOAD_COMMON_PAR_str Packet_TC_LFR_LOAD_COMMON_PAR_t;
83 132
84 133 struct Packet_TC_LFR_LOAD_NORMAL_PAR_str
85 134 { // the CCSDS header is added by LPPMON
86 135 unsigned char packetID[2];
87 136 unsigned char packetSequenceControl[2];
88 137 unsigned char packetLength[2];
89 138 // DATA FIELD HEADER
90 139 unsigned char ccsdsSecHeaderFlag_pusVersion_ack;
91 140 unsigned char serviceType;
92 141 unsigned char serviceSubType;
93 142 unsigned char sourceID;
94 143 unsigned char sy_lfr_n_swf_l[2];
95 144 unsigned char sy_lfr_n_swf_p[2];
96 145 unsigned char sy_lfr_n_asm_p[2];
97 146 unsigned char sy_lfr_n_bp_p0;
98 147 unsigned char sy_lfr_n_bp_p1;
99 148 unsigned char crc[2];
100 149 };
101 150 typedef struct Packet_TC_LFR_LOAD_NORMAL_PAR_str Packet_TC_LFR_LOAD_NORMAL_PAR_t;
102 151
103 152 struct Packet_TC_LFR_LOAD_BURST_SBM1_SBM2_PAR_str
104 153 { // the CCSDS header is added by LPPMON
105 154 unsigned char packetID[2];
106 155 unsigned char packetSequenceControl[2];
107 156 unsigned char packetLength[2];
108 157 // DATA FIELD HEADER
109 158 unsigned char ccsdsSecHeaderFlag_pusVersion_ack;
110 159 unsigned char serviceType;
111 160 unsigned char serviceSubType;
112 161 unsigned char sourceID;
113 162 unsigned char sy_lfr_bp_p0;
114 163 unsigned char sy_lfr_bp_p1;
115 164 unsigned char crc[2];
116 165 };
117 166 typedef struct Packet_TC_LFR_LOAD_BURST_SBM1_SBM2_PAR_str Packet_TC_LFR_LOAD_BURST_SBM1_SBM2_PAR_t;
118 167
168 struct Packet_TC_LFR_ENABLE_DISABLE_CALIBRATION_str
169 { // the CCSDS header is added by LPPMON
170 unsigned char packetID[2];
171 unsigned char packetSequenceControl[2];
172 unsigned char packetLength[2];
173 // DATA FIELD HEADER
174 unsigned char ccsdsSecHeaderFlag_pusVersion_ack;
175 unsigned char serviceType;
176 unsigned char serviceSubType;
177 unsigned char sourceID;
178 unsigned char crc[2];
179 };
180 typedef struct Packet_TC_LFR_ENABLE_DISABLE_CALIBRATION_str Packet_TC_LFR_ENABLE_DISABLE_CALIBRATION_t;
181
182 struct Packet_TC_LFR_UPDATE_TIME_str
183 { // the CCSDS header is added by LPPMON
184 unsigned char packetID[2];
185 unsigned char packetSequenceControl[2];
186 unsigned char packetLength[2];
187 // DATA FIELD HEADER
188 unsigned char ccsdsSecHeaderFlag_pusVersion_ack;
189 unsigned char serviceType;
190 unsigned char serviceSubType;
191 unsigned char sourceID;
192 unsigned char cp_rpw_time[6];
193 unsigned char crc[2];
194 };
195 typedef struct Packet_TC_LFR_UPDATE_TIME_str Packet_TC_LFR_UPDATE_TIME_t;
196
119 197 #endif // TC_TYPES_H
@@ -1,460 +1,508
1 1 #ifndef CCSDS_H_INCLUDED
2 2 #define CCSDS_H_INCLUDED
3 3
4 4 #define CCSDS_PROTOCOLE_EXTRA_BYTES 4
5 5 #define CCSDS_TELEMETRY_HEADER_LENGTH 16+4
6 6 #define CCSDS_TM_PKT_MAX_SIZE 4412
7 7 #define CCSDS_TELECOMMAND_HEADER_LENGTH 10+4
8 8 #define CCSDS_TC_PKT_MAX_SIZE 256
9 9 #define CCSDS_TC_PKT_MIN_SIZE 16
10 10 #define CCSDS_TC_TM_PACKET_OFFSET 7
11 11 #define CCSDS_PROCESS_ID 76
12 12 #define CCSDS_PACKET_CATEGORY 12
13 13 #define CCSDS_NODE_ADDRESS 0xfe
14 14 #define CCSDS_USER_APP 0x00
15 15
16 #define DEFAULT_SPARE1_PUSVERSION_SPARE2 0x10
17 #define DEFAULT_RESERVED 0x00
18 #define DEFAULT_HKBIA 0x1f
19
16 20 // PACKET ID
17 21 #define TM_PACKET_ID_TC_EXE 0x0cc1 // PID 76 CAT 1
18 22 #define TM_PACKET_ID_HK 0x0cc4 // PID 76 CAT 4
19 23 #define TM_PACKET_ID_PARAMETER_DUMP 0x0cc9 // PID 76 CAT 9
20 24 #define TM_PACKET_ID_SCIENCE_NORMAL 0x0ccc // PID 76 CAT 12
21 25 #define TM_PACKET_ID_SCIENCE_BURST_SBM1_SBM2 0x0cfc // PID 79 CAT 12
26 #define TM_PACKET_PID_DEFAULT 76
27 #define TM_PACKET_PID_BURST_SBM1_SBM2 79
28 #define TM_PACKET_CAT_TC_EXE 1
29 #define TM_PACKET_CAT_HK 4
30 #define TM_PACKET_CAT_PARAMETER_DUMP 9
31 #define TM_PACKET_CAT_SCIENCE 12
22 32
23 33 // PACKET SEQUENCE CONTROL
24 #define TM_PACKET_SEQ_CTRL_CONTINUATION 0
25 #define TM_PACKET_SEQ_CTRL_FIRST 1
26 #define TM_PACKET_SEQ_CTRL_LAST 2
27 #define TM_PACKET_SEQ_CTRL_STANDALONE 3
34 #define TM_PACKET_SEQ_CTRL_CONTINUATION 0x00 // [0000 0000]
35 #define TM_PACKET_SEQ_CTRL_FIRST 0x40 // [0100 0000]
36 #define TM_PACKET_SEQ_CTRL_LAST 0x80 // [1000 0000]
37 #define TM_PACKET_SEQ_CTRL_STANDALONE 0xc0 // [1100 0000]
38 #define TM_PACKET_SEQ_CNT_DEFAULT 0x00 // [0000 0000]
28 39
29 //
40 // DESTINATION ID
30 41 #define TM_DESTINATION_ID_GROUND 0
31 42 #define TM_DESTINATION_ID_MISSION_TIMELINE 110
32 43 #define TM_DESTINATION_ID_TC_SEQUENCES 111
33 44 #define TM_DESTINATION_ID_RECOVERY_ACTION_COMMAND 112
34 45 #define TM_DESTINATION_ID_BACKUP_MISSION_TIMELINE 113
35 46 #define TM_DESTINATION_ID_DIRECT_CMD 120
36 47 #define TM_DESTINATION_ID_SPARE_GRD_SRC1 121
37 48 #define TM_DESTINATION_ID_SPARE_GRD_SRC2 122
38 49 #define TM_DESTINATION_ID_OBCP 15
39 50 #define TM_DESTINATION_ID_SYSTEM_CONTROL 14
40 51 #define TM_DESTINATION_ID_AOCS 11
41 52
42 53 #define CCSDS_DESTINATION_ID 0x01
43 54 #define CCSDS_PROTOCOLE_ID 0x02
44 55 #define CCSDS_RESERVED 0x00
45 56 #define CCSDS_USER_APP 0x00
46 57
47 58 #define SIZE_TM_LFR_TC_EXE_NOT_IMPLEMENTED 24
48 59 #define SIZE_TM_LFR_TC_EXE_CORRUPTED 32
49 60 #define SIZE_HK_PARAMETERS 112
50 61
51 #define ILLEGAL_APID 0
52 #define WRONG_LEN_PACKET 1
53 #define INCOR_CHECKSUM 2
54 #define ILL_TYPE 3
55 #define ILL_SUBTYPE 4
56 #define WRONG_APP_DATA 5
57 #define WRONG_CMD_CODE 6
58 #define CCSDS_TM_VALID 7
59
60 62 // TC TYPES
61 63 #define TC_TYPE_GEN 181
62 64 #define TC_TYPE_TIME 9
63 65
64 66 // TC SUBTYPES
65 67 #define TC_SUBTYPE_RESET 1
66 68 #define TC_SUBTYPE_LOAD_COMM 11
67 69 #define TC_SUBTYPE_LOAD_NORM 13
68 70 #define TC_SUBTYPE_LOAD_BURST 19
69 71 #define TC_SUBTYPE_LOAD_SBM1 25
70 72 #define TC_SUBTYPE_LOAD_SBM2 27
71 73 #define TC_SUBTYPE_DUMP 31
72 74 #define TC_SUBTYPE_ENTER 41
73 75 #define TC_SUBTYPE_UPDT_INFO 51
74 76 #define TC_SUBTYPE_EN_CAL 61
75 77 #define TC_SUBTYPE_DIS_CAL 63
76 78 #define TC_SUBTYPE_UPDT_TIME 129
77 79
78 80 // TC LEN
79 81 #define TC_LEN_RESET 12
80 82 #define TC_LEN_LOAD_COMM 14
81 83 #define TC_LEN_LOAD_NORM 20
82 84 #define TC_LEN_LOAD_BURST 14
83 85 #define TC_LEN_LOAD_SBM1 14
84 86 #define TC_LEN_LOAD_SBM2 14
85 87 #define TC_LEN_DUMP 12
86 88 #define TC_LEN_ENTER 20
87 89 #define TC_LEN_UPDT_INFO 48
88 90 #define TC_LEN_EN_CAL 12
89 91 #define TC_LEN_DIS_CAL 12
90 92 #define TC_LEN_UPDT_TIME 18
91 93
92 94 // TM TYPES
93 95 #define TM_TYPE_TC_EXE 1
94 96 #define TM_TYPE_HK 3
95 97 #define TM_TYPE_PARAMETER_DUMP 3
96 98 #define TM_TYPE_LFR_SCIENCE 21
97 99
98 100 // TM SUBTYPES
99 101 #define TM_SUBTYPE_EXE_OK 7
100 102 #define TM_SUBTYPE_EXE_NOK 8
101 103 #define TM_SUBTYPE_HK 25
102 104 #define TM_SUBTYPE_PARAMETER_DUMP 25
103 105 #define TM_SUBTYPE_SCIENCE 3
104 106 #define TM_SUBTYPE_LFR_SCIENCE 3
105 107
106 108 // FAILURE CODES
109 #define ILLEGAL_APID 0
110 #define WRONG_LEN_PACKET 1
111 #define INCOR_CHECKSUM 2
112 #define ILL_TYPE 3
113 #define ILL_SUBTYPE 4
114 #define WRONG_APP_DATA 5
115 //
116 #define WRONG_CMD_CODE 6
117 #define CCSDS_TM_VALID 7
107 118 #define FAILURE_CODE_INCONSISTENT 5 // 0x00 0x05
108 119 #define FAILURE_CODE_NOT_EXECUTABLE 42000 // 0xa4 0x10
109 120 #define FAILURE_CODE_NOT_IMPLEMENTED 42002 // 0xa4 0x12
110 121 #define FAILURE_CODE_ERROR 42003 // 0xa4 0x13
111 122 #define FAILURE_CODE_CORRUPTED 42005 // 0xa4 0x15
123
112 124 // TM SID
113 125 #define SID_DEFAULT 0
114 126 #define SID_EXE_INC 5
115 127 #define SID_NOT_EXE 42000 // 0xa4 0x10
116 128 #define SID_NOT_IMP 42002 // 0xa4 0x12
117 129 #define SID_EXE_ERR 42003 // 0xa4 0x13
118 130 #define SID_EXE_CORR 42005 // 0xa4 0x15
119 131 #define SID_HK 1
120 132 #define SID_PARAMETER_DUMP 10
121 133
122 134 #define SID_NORM_SWF_F0 3
123 135 #define SID_NORM_SWF_F1 4
124 136 #define SID_NORM_SWF_F2 5
125 137 #define SID_NORM_CWF_F3 1
126 138 #define SID_BURST_CWF_F2 2
127 139 #define SID_SBM1_CWF_F1 24
128 140 #define SID_SBM2_CWF_F2 25
129 141 #define SID_NORM_ASM_F0 11
130 142 #define SID_NORM_ASM_F1 12
131 143 #define SID_NORM_ASM_F2 13
132 144 #define SID_NORM_BP1_F0 14
133 145 #define SID_NORM_BP1_F1 15
134 146 #define SID_NORM_BP1_F2 16
135 147 #define SID_NORM_BP2_F0 19
136 148 #define SID_NORM_BP2_F1 20
137 149 #define SID_NORM_BP2_F2 21
138 150 #define SID_BURST_BP1_F0 17
139 151 #define SID_BURST_BP2_F0 22
140 152 #define SID_BURST_BP1_F1 18
141 153 #define SID_BURST_BP2_F1 23
142 154 #define SID_SBM1_BP1_F0 28
143 155 #define SID_SBM1_BP2_F0 31
144 156 #define SID_SBM2_BP1_F0 29
145 157 #define SID_SBM2_BP2_F0 32
146 #define SID_SBM1_BP1_F1 30
147 #define SID_SBM1_BP2_F1 33
158 #define SID_SBM2_BP1_F1 30
159 #define SID_SBM2_BP2_F1 33
148 160
149 161 // LENGTH (BYTES)
150 162 #define LENGTH_TM_LFR_TC_EXE_MAX 32
151 163 #define LENGTH_TM_LFR_HK 126
152 164
153 165 // HEADER_LENGTH
154 166 #define TM_HEADER_LEN 16
155 167 #define HEADER_LENGTH_TM_LFR_SCIENCE_ASM 28
156 168 // PACKET_LENGTH
157 169 #define PACKET_LENGTH_TC_EXE_SUCCESS (20 - CCSDS_TC_TM_PACKET_OFFSET)
158 170 #define PACKET_LENGTH_TC_EXE_INCONSISTENT (26 - CCSDS_TC_TM_PACKET_OFFSET)
159 171 #define PACKET_LENGTH_TC_EXE_NOT_EXECUTABLE (26 - CCSDS_TC_TM_PACKET_OFFSET)
160 172 #define PACKET_LENGTH_TC_EXE_NOT_IMPLEMENTED (24 - CCSDS_TC_TM_PACKET_OFFSET)
161 173 #define PACKET_LENGTH_TC_EXE_ERROR (24 - CCSDS_TC_TM_PACKET_OFFSET)
162 174 #define PACKET_LENGTH_TC_EXE_CORRUPTED (32 - CCSDS_TC_TM_PACKET_OFFSET)
163 175 #define PACKET_LENGTH_HK (126 - CCSDS_TC_TM_PACKET_OFFSET)
164 176 #define PACKET_LENGTH_PARAMETER_DUMP (34 - CCSDS_TC_TM_PACKET_OFFSET)
165 177 #define PACKET_LENGTH_TM_LFR_SCIENCE_ASM (TOTAL_SIZE_SM + HEADER_LENGTH_TM_LFR_SCIENCE_ASM - CCSDS_TC_TM_PACKET_OFFSET)
166 178
167 179 #define SPARE1_PUSVERSION_SPARE2 0x10
168 180
169 181 #define LEN_TM_LFR_HK 126 + 4
170 182 #define LEN_TM_LFR_TC_EXE_NOT_IMP 24 +4
171 183
172 #define TM_LEN_SCI_SWF_340 340 * 12 + 10 + 12 - 1
173 #define TM_LEN_SCI_SWF_8 8 * 12 + 10 + 12 - 1
174 #define TM_LEN_SCI_CWF_340 340 * 12 + 10 + 10 - 1
175 #define TM_LEN_SCI_CWF_8 8 * 12 + 10 + 10 - 1
184 #define TM_LEN_SCI_SWF_340 (340 * 12 + 10 + 12 - 1)
185 #define TM_LEN_SCI_SWF_8 (8 * 12 + 10 + 12 - 1)
186 #define TM_LEN_SCI_CWF_340 (340 * 12 + 10 + 10 - 1)
187 #define TM_LEN_SCI_CWF_8 (8 * 12 + 10 + 10 - 1)
188 #define DEFAULT_PKTCNT 0x07
189 #define BLK_NR_340 0x0154
190 #define BLK_NR_8 0x0008
176 191
177 192 enum TM_TYPE{
178 193 TM_LFR_TC_EXE_OK,
179 194 TM_LFR_TC_EXE_ERR,
180 195 TM_LFR_HK,
181 196 TM_LFR_SCI,
182 197 TM_LFR_SCI_SBM,
183 198 TM_LFR_PAR_DUMP
184 199 };
185 200
186 201 struct TMHeader_str
187 202 {
188 203 volatile unsigned char targetLogicalAddress;
189 204 volatile unsigned char protocolIdentifier;
190 205 volatile unsigned char reserved;
191 206 volatile unsigned char userApplication;
192 207 volatile unsigned char packetID[2];
193 208 volatile unsigned char packetSequenceControl[2];
194 209 volatile unsigned char packetLength[2];
195 210 // DATA FIELD HEADER
196 211 volatile unsigned char spare1_pusVersion_spare2;
197 212 volatile unsigned char serviceType;
198 213 volatile unsigned char serviceSubType;
199 214 volatile unsigned char destinationID;
200 215 volatile unsigned char time[6];
201 216 };
202 217 typedef struct TMHeader_str TMHeader_t;
203 218
204 219 struct Packet_TM_LFR_TC_EXE_str
205 220 {
206 221 volatile unsigned char targetLogicalAddress;
207 222 volatile unsigned char protocolIdentifier;
208 223 volatile unsigned char reserved;
209 224 volatile unsigned char userApplication;
210 225 volatile unsigned char packetID[2];
211 226 volatile unsigned char packetSequenceControl[2];
212 227 volatile unsigned char packetLength[2];
213 228 // DATA FIELD HEADER
214 229 volatile unsigned char spare1_pusVersion_spare2;
215 230 volatile unsigned char serviceType;
216 231 volatile unsigned char serviceSubType;
217 232 volatile unsigned char destinationID;
218 233 volatile unsigned char time[6];
219 234 volatile unsigned char data[LENGTH_TM_LFR_TC_EXE_MAX - 10 + 1];
220 235 };
221 236 typedef struct Packet_TM_LFR_TC_EXE_str Packet_TM_LFR_TC_EXE_t;
222 237
238 struct Packet_TM_LFR_TC_EXE_CORRUPTED_str
239 {
240 volatile unsigned char targetLogicalAddress;
241 volatile unsigned char protocolIdentifier;
242 volatile unsigned char reserved;
243 volatile unsigned char userApplication;
244 // PACKET HEADER
245 volatile unsigned char packetID[2];
246 volatile unsigned char packetSequenceControl[2];
247 volatile unsigned char packetLength[2];
248 // DATA FIELD HEADER
249 volatile unsigned char spare1_pusVersion_spare2;
250 volatile unsigned char serviceType;
251 volatile unsigned char serviceSubType;
252 volatile unsigned char destinationID;
253 volatile unsigned char time[6];
254 //
255 volatile unsigned char tc_failure_code[2];
256 volatile unsigned char telecommand_pkt_id[2];
257 volatile unsigned char pkt_seq_control[2];
258 volatile unsigned char tc_service;
259 volatile unsigned char tc_subtype;
260 volatile unsigned char pkt_len_rcv_value[2];
261 volatile unsigned char pkt_datafieldsize_cnt[2];
262 volatile unsigned char rcv_crc[2];
263 volatile unsigned char computed_crc[2];
264 };
265 typedef struct Packet_TM_LFR_TC_EXE_CORRUPTED_str Packet_TM_LFR_TC_EXE_CORRUPTED_t;
266
223 267 struct Header_TM_LFR_SCIENCE_SWF_str
224 268 {
225 269 volatile unsigned char targetLogicalAddress;
226 270 volatile unsigned char protocolIdentifier;
227 271 volatile unsigned char reserved;
228 272 volatile unsigned char userApplication;
229 273 volatile unsigned char packetID[2];
230 274 volatile unsigned char packetSequenceControl[2];
231 275 volatile unsigned char packetLength[2];
232 276 // DATA FIELD HEADER
233 277 volatile unsigned char spare1_pusVersion_spare2;
234 278 volatile unsigned char serviceType;
235 279 volatile unsigned char serviceSubType;
236 280 volatile unsigned char destinationID;
237 281 volatile unsigned char time[6];
238 282 // AUXILIARY HEADER
239 283 volatile unsigned char sid;
240 284 volatile unsigned char hkBIA;
241 285 volatile unsigned char pktCnt;
242 286 volatile unsigned char pktNr;
243 287 volatile unsigned char acquisitionTime[6];
244 288 volatile unsigned char blkNr[2];
245 289 };
246 290 typedef struct Header_TM_LFR_SCIENCE_SWF_str Header_TM_LFR_SCIENCE_SWF_t;
247 291
248 292 struct Header_TM_LFR_SCIENCE_CWF_str
249 293 {
250 294 volatile unsigned char targetLogicalAddress;
251 295 volatile unsigned char protocolIdentifier;
252 296 volatile unsigned char reserved;
253 297 volatile unsigned char userApplication;
254 298 volatile unsigned char packetID[2];
255 299 volatile unsigned char packetSequenceControl[2];
256 300 volatile unsigned char packetLength[2];
257 301 // DATA FIELD HEADER
258 302 volatile unsigned char spare1_pusVersion_spare2;
259 303 volatile unsigned char serviceType;
260 304 volatile unsigned char serviceSubType;
261 305 volatile unsigned char destinationID;
262 306 volatile unsigned char time[6];
263 307 // AUXILIARY DATA HEADER
264 308 volatile unsigned char sid;
265 309 volatile unsigned char hkBIA;
266 310 volatile unsigned char acquisitionTime[6];
267 311 volatile unsigned char blkNr[2];
268 312 };
269 313 typedef struct Header_TM_LFR_SCIENCE_CWF_str Header_TM_LFR_SCIENCE_CWF_t;
270 314
271 315 struct Header_TM_LFR_SCIENCE_ASM_str
272 316 {
273 317 volatile unsigned char targetLogicalAddress;
274 318 volatile unsigned char protocolIdentifier;
275 319 volatile unsigned char reserved;
276 320 volatile unsigned char userApplication;
277 321 volatile unsigned char packetID[2];
278 322 volatile unsigned char packetSequenceControl[2];
279 323 volatile unsigned char packetLength[2];
280 324 // DATA FIELD HEADER
281 325 volatile unsigned char spare1_pusVersion_spare2;
282 326 volatile unsigned char serviceType;
283 327 volatile unsigned char serviceSubType;
284 328 volatile unsigned char destinationID;
285 329 volatile unsigned char time[6];
286 330 // AUXILIARY HEADER
287 331 volatile unsigned char sid;
288 332 volatile unsigned char biaStatusInfo;
289 333 volatile unsigned char cntASM;
290 334 volatile unsigned char nrASM;
291 335 volatile unsigned char acquisitionTime[6];
292 336 volatile unsigned char blkNr[2];
293 337 };
294 338 typedef struct Header_TM_LFR_SCIENCE_ASM_str Header_TM_LFR_SCIENCE_ASM_t;
295 339
296 340 struct ccsdsTelecommandPacket_str
297 341 {
298 342 //unsigned char targetLogicalAddress; // removed by the grspw module
299 343 volatile unsigned char protocolIdentifier;
300 344 volatile unsigned char reserved;
301 345 volatile unsigned char userApplication;
302 346 volatile unsigned char packetID[2];
303 347 volatile unsigned char packetSequenceControl[2];
304 348 volatile unsigned char packetLength[2];
305 349 // DATA FIELD HEADER
306 350 volatile unsigned char headerFlag_pusVersion_Ack;
307 351 volatile unsigned char serviceType;
308 352 volatile unsigned char serviceSubType;
309 353 volatile unsigned char sourceID;
310 354 volatile unsigned char dataAndCRC[CCSDS_TC_PKT_MAX_SIZE-10];
311 355 };
312 356 typedef struct ccsdsTelecommandPacket_str ccsdsTelecommandPacket_t;
313 357
314 358 struct Packet_TM_LFR_HK_str
315 359 {
316 360 volatile unsigned char targetLogicalAddress;
317 361 volatile unsigned char protocolIdentifier;
318 362 volatile unsigned char reserved;
319 363 volatile unsigned char userApplication;
320 364 volatile unsigned char packetID[2];
321 365 volatile unsigned char packetSequenceControl[2];
322 366 volatile unsigned char packetLength[2];
323 volatile unsigned char dataFieldHeader[10];
367 volatile unsigned char spare1_pusVersion_spare2;
368 volatile unsigned char serviceType;
369 volatile unsigned char serviceSubType;
370 volatile unsigned char destinationID;
371 volatile unsigned char time[6];
324 372 volatile unsigned char sid;
325 373
326 374 //**************
327 375 // HK PARAMETERS
328 376 unsigned char lfr_status_word[2];
329 377 unsigned char lfr_sw_version[4];
330 378 // tc statistics
331 379 unsigned char hk_lfr_update_info_tc_cnt[2];
332 380 unsigned char hk_lfr_update_time_tc_cnt[2];
333 381 unsigned char hk_dpu_exe_tc_lfr_cnt[2];
334 382 unsigned char hk_dpu_rej_tc_lfr_cnt[2];
335 383 unsigned char hk_lfr_last_exe_tc_id[2];
336 384 unsigned char hk_lfr_last_exe_tc_type[2];
337 385 unsigned char hk_lfr_last_exe_tc_subtype[2];
338 386 unsigned char hk_lfr_last_exe_tc_time[6];
339 387 unsigned char hk_lfr_last_rej_tc_id[2];
340 388 unsigned char hk_lfr_last_rej_tc_type[2];
341 389 unsigned char hk_lfr_last_rej_tc_subtype[2];
342 390 unsigned char hk_lfr_last_rej_tc_time[6];
343 391 // anomaly statistics
344 392 unsigned char hk_lfr_le_cnt[2];
345 393 unsigned char hk_lfr_me_cnt[2];
346 394 unsigned char hk_lfr_he_cnt[2];
347 395 unsigned char hk_lfr_last_er_rid[2];
348 396 unsigned char hk_lfr_last_er_code;
349 397 unsigned char hk_lfr_last_er_time[6];
350 398 // vhdl_blk_status
351 399 unsigned char hk_lfr_vhdl_aa_sm;
352 400 unsigned char hk_lfr_vhdl_fft_sr;
353 401 unsigned char hk_lfr_vhdl_cic_hk;
354 402 unsigned char hk_lfr_vhdl_iir_cal;
355 403 // spacewire_if_statistics
356 404 unsigned char hk_lfr_dpu_spw_pkt_rcv_cnt[2];
357 405 unsigned char hk_lfr_dpu_spw_pkt_sent_cnt[2];
358 406 unsigned char hk_lfr_dpu_spw_tick_out_cnt;
359 407 unsigned char hk_lfr_dpu_spw_last_timc;
360 408 // ahb error statistics
361 409 unsigned int hk_lfr_last_fail_addr;
362 410 // temperatures
363 411 unsigned char hk_lfr_temp_scm[2];
364 412 unsigned char hk_lfr_temp_pcb[2];
365 413 unsigned char hk_lfr_temp_fpga[2];
366 414 // error counters
367 415 unsigned char hk_lfr_dpu_spw_parity;
368 416 unsigned char hk_lfr_dpu_spw_disconnect;
369 417 unsigned char hk_lfr_dpu_spw_escape;
370 418 unsigned char hk_lfr_dpu_spw_credit;
371 419 unsigned char hk_lfr_dpu_spw_write_sync;
372 420 unsigned char hk_lfr_dpu_spw_rx_ahb;
373 421 unsigned char hk_lfr_dpu_spw_tx_ahb;
374 422 unsigned char hk_lfr_dpu_spw_header_crc;
375 423 unsigned char hk_lfr_dpu_spw_data_crc;
376 424 unsigned char hk_lfr_dpu_spw_early_eop;
377 425 unsigned char hk_lfr_dpu_spw_invalid_addr;
378 426 unsigned char hk_lfr_dpu_spw_eep;
379 427 unsigned char hk_lfr_dpu_spw_rx_too_big;
380 428 // timecode
381 429 unsigned char hk_lfr_timecode_erroneous;
382 430 unsigned char hk_lfr_timecode_missing;
383 431 unsigned char hk_lfr_timecode_invalid;
384 432 // time
385 433 unsigned char hk_lfr_time_timecode_it;
386 434 unsigned char hk_lfr_time_not_synchro;
387 435 unsigned char hk_lfr_time_timecode_ctr;
388 436 // hk_lfr_buffer_dpu_
389 437 unsigned char hk_lfr_buffer_dpu_tc_fifo;
390 438 unsigned char hk_lfr_buffer_dpu_tm_fifo;
391 439 // hk_lfr_ahb_
392 440 unsigned char hk_lfr_ahb_correctable;
393 441 unsigned char hk_lfr_ahb_uncorrectable;
394 442 unsigned char hk_lfr_ahb_fails_trans;
395 443 // hk_lfr_adc_
396 444 unsigned char hk_lfr_adc_failure;
397 445 unsigned char hk_lfr_adc_timeout;
398 446 unsigned char hk_lfr_toomany_err;
399 447 // hk_lfr_cpu_
400 448 unsigned char hk_lfr_cpu_write_err;
401 449 unsigned char hk_lfr_cpu_ins_access_err;
402 450 unsigned char hk_lfr_cpu_illegal_ins;
403 451 unsigned char hk_lfr_cpu_privilegied_ins;
404 452 unsigned char hk_lfr_cpu_register_hw;
405 453 unsigned char hk_lfr_cpu_not_aligned;
406 454 unsigned char hk_lfr_cpu_data_exception;
407 455 unsigned char hk_lfr_cpu_div_exception;
408 456 unsigned char hk_lfr_cpu_arith_overflow;
409 457 };
410 458 typedef struct Packet_TM_LFR_HK_str Packet_TM_LFR_HK_t;
411 459
412 460 struct Packet_TM_LFR_PARAMETER_DUMP_str
413 461 {
414 462 volatile unsigned char targetLogicalAddress;
415 463 volatile unsigned char protocolIdentifier;
416 464 volatile unsigned char reserved;
417 465 volatile unsigned char userApplication;
418 466 volatile unsigned char packetID[2];
419 467 volatile unsigned char packetSequenceControl[2];
420 468 volatile unsigned char packetLength[2];
421 469 // DATA FIELD HEADER
422 470 volatile unsigned char spare1_pusVersion_spare2;
423 471 volatile unsigned char serviceType;
424 472 volatile unsigned char serviceSubType;
425 473 volatile unsigned char destinationID;
426 474 volatile unsigned char time[6];
427 475 volatile unsigned char sid;
428 476
429 477 //******************
430 478 // COMMON PARAMETERS
431 479 volatile unsigned char unused0;
432 480 volatile unsigned char bw_sp0_sp1_r0_r1;
433 481
434 482 //******************
435 483 // NORMAL PARAMETERS
436 484 volatile unsigned char sy_lfr_n_swf_l[2];
437 485 volatile unsigned char sy_lfr_n_swf_p[2];
438 486 volatile unsigned char sy_lfr_n_asm_p[2];
439 487 volatile unsigned char sy_lfr_n_bp_p0;
440 488 volatile unsigned char sy_lfr_n_bp_p1;
441 489
442 490 //*****************
443 491 // BURST PARAMETERS
444 492 volatile unsigned char sy_lfr_b_bp_p0;
445 493 volatile unsigned char sy_lfr_b_bp_p1;
446 494
447 495 //****************
448 496 // SBM1 PARAMETERS
449 497 volatile unsigned char sy_lfr_s1_bp_p0;
450 498 volatile unsigned char sy_lfr_s1_bp_p1;
451 499
452 500 //****************
453 501 // SBM2 PARAMETERS
454 502 volatile unsigned char sy_lfr_s2_bp_p0;
455 503 volatile unsigned char sy_lfr_s2_bp_p1;
456 504 };
457 505 typedef struct Packet_TM_LFR_PARAMETER_DUMP_str Packet_TM_LFR_PARAMETER_DUMP_t;
458 506
459 507
460 508 #endif // CCSDS_H_INCLUDED
@@ -1,64 +1,55
1 1 #ifndef FSW_RTEMS_H_INCLUDED
2 2 #define FSW_RTEMS_H_INCLUDED
3 3
4 4 #include <errno.h>
5 5 #include <fcntl.h>
6 6 #include <stdio.h>
7 7 #include <stdlib.h>
8 8
9 9 #include <grspw.h>
10 10 #include <apbuart.h>
11 11
12 #include <fsw_params.h>
13 #include <fsw_misc.h>
14 #include <fsw_processing.h>
15 #include <tc_handler.h>
16 #include <wf_handler.h>
17 #include <grlib_regs.h>
18 #include <ccsds_types.h>
12 #include "fsw_params.h"
13 #include "fsw_misc.h"
14 #include "fsw_processing.h"
15 #include "tc_handler.h"
16 #include "wf_handler.h"
17 #include "grlib_regs.h"
18 #include "ccsds_types.h"
19
20 #include "fsw_spacewire.h"
19 21
20 22 extern int sched_yield( void );
21 23 extern int errno;
22 24 extern rtems_id Task_id[ ]; /* array of task ids */
23 25 extern rtems_name Task_name[ ]; /* array of task names */
24 26 extern rtems_name misc_name[ ]; /* arry of miscellaneous names for rtems objects */
25 27 extern int fdSPW; // grspw file descriptor
26 28 extern int fdUART; // uart file descriptor
27
28 void timecode_irq_handler(void *pDev, void *regs, int minor, unsigned int tc);
29 extern unsigned char lfrCurrentMode;
29 30
30 31 // MODE PARAMETERS
31 32 extern struct param_local_str param_local;
32 33 extern Packet_TM_LFR_PARAMETER_DUMP_t parameter_dump_packet;
33 extern Packet_TM_LFR_HK_t housekeeping_packet;
34 34 extern unsigned short sequenceCounters[SEQ_CNT_NB_PID][SEQ_CNT_NB_CAT][SEQ_CNT_NB_DEST_ID];
35 35
36 36 // RTEMS TASKS
37 37 rtems_task Init( rtems_task_argument argument); /* forward declaration needed */
38 38 rtems_task recv_task(rtems_task_argument argument);
39 rtems_task spiq_task(rtems_task_argument argument);
40 39 rtems_task stat_task(rtems_task_argument argument);
41 40 rtems_task wfrm_task(rtems_task_argument argument);
42 41 int create_names( void );
43 42 int create_all_tasks( void );
44 43 int start_all_tasks( void );
45 44 int create_message_queue( void );
45 int create_message_queues( void );
46 46
47 47 // OTHER functions
48 48 void init_parameter_dump( void );
49 49 void init_local_mode_parameters( void );
50 50 void init_housekeeping_parameters( void );
51 51
52 int spacewire_configure_link( void );
53 int spacewire_wait_for_link(void);
54 void spacewire_set_NP(unsigned char val, unsigned int regAddr); // No Port force
55 void spacewire_set_RE(unsigned char val, unsigned int regAddr); // RMAP Enable
56 void spacewire_compute_stats_offsets();
57
58 52 extern int rtems_cpu_usage_report( void );
59 53 extern int rtems_cpu_usage_reset( void );
60 54
61 rtems_status_code write_spw(spw_ioctl_pkt_send* spw_ioctl_send);
62 void (*grspw_timecode_callback) (void *pDev, void *regs, int minor, unsigned int tc);
63
64 55 #endif // FSW_RTEMS_CONFIG_H_INCLUDED
@@ -1,33 +1,34
1 1 #ifndef FSW_MISC_H_INCLUDED
2 2 #define FSW_MISC_H_INCLUDED
3 3
4 4 #include <rtems.h>
5 5 #include <stdio.h>
6 6
7 #include <fsw_init.h>
8 #include <fsw_params.h>
9 #include <grlib_regs.h>
10 7 #include <grspw.h>
11 #include <ccsds_types.h>
8
9 #include "fsw_init.h"
10 #include "fsw_params.h"
11 #include "grlib_regs.h"
12 #include "ccsds_types.h"
12 13
13 14 rtems_name HK_name; // name of the HK rate monotonic
14 15 rtems_id HK_id; // id of the HK rate monotonic period
15 extern spw_stats spacewire_stats;
16 extern spw_stats spacewire_stats_backup;
16 extern Packet_TM_LFR_HK_t housekeeping_packet;
17 17
18 18 int configure_timer(gptimer_regs_t *gptimer_regs, unsigned char timer, unsigned int clock_divider,
19 19 unsigned char interrupt_level, rtems_isr (*timer_isr)() );
20 20 int timer_start( gptimer_regs_t *gptimer_regs, unsigned char timer );
21 21 int timer_stop( gptimer_regs_t *gptimer_regs, unsigned char timer );
22 22 int timer_set_clock_divider(gptimer_regs_t *gptimer_regs, unsigned char timer, unsigned int clock_divider);
23 23 void update_spacewire_statistics();
24 24
25 25 // SERIAL LINK
26 26 int send_console_outputs_on_apbuart_port( void );
27 27 int set_apbuart_scaler_reload_register(unsigned int regs, unsigned int value);
28 28
29 29 // RTEMS TASKS
30 30 rtems_task stat_task(rtems_task_argument argument);
31 31 rtems_task hous_task(rtems_task_argument argument);
32 rtems_task send_task(rtems_task_argument argument);
32 33
33 34 #endif // FSW_MISC_H_INCLUDED
@@ -1,164 +1,194
1 1 #ifndef FSW_RTEMS_CONFIG_H_INCLUDED
2 2 #define FSW_RTEMS_CONFIG_H_INCLUDED
3 3
4 4 #include <fsw_params_processing.h>
5 5
6 6 #define GRSPW_DEVICE_NAME "/dev/grspw0"
7 7 #define UART_DEVICE_NAME "/dev/console"
8 8
9 9 //************************
10 10 // flight software version
11 11 // this parameters is handled by the Qt project options
12 12
13 13 //**********
14 14 // LFR MODES
15 15 #define LFR_MODE_STANDBY 0
16 16 #define LFR_MODE_NORMAL 1
17 17 #define LFR_MODE_BURST 2
18 18 #define LFR_MODE_SBM1 3
19 19 #define LFR_MODE_SBM2 4
20 20 #define LFR_MODE_NORMAL_CWF_F3 5
21 21
22 22 #define RTEMS_EVENT_MODE_STANDBY RTEMS_EVENT_0
23 23 #define RTEMS_EVENT_MODE_NORMAL RTEMS_EVENT_1
24 24 #define RTEMS_EVENT_MODE_BURST RTEMS_EVENT_2
25 25 #define RTEMS_EVENT_MODE_SBM1 RTEMS_EVENT_3
26 26 #define RTEMS_EVENT_MODE_SBM2 RTEMS_EVENT_4
27 #define RTEMS_EVENT_MODE_NORMAL_CWF_F3 RTEMS_EVENT_5
28 27
29 28 //****************************
30 29 // LFR DEFAULT MODE PARAMETERS
31 30 // COMMON
32 31 #define DEFAULT_SY_LFR_COMMON0 0x00
33 32 #define DEFAULT_SY_LFR_COMMON1 0x10 // default value 0 0 0 1 0 0 0 0
34 33 // NORM
35 34 #define DEFAULT_SY_LFR_N_SWF_L 2048 // nb sample
36 35 #define DEFAULT_SY_LFR_N_SWF_P 16 // sec
37 36 #define DEFAULT_SY_LFR_N_ASM_P 16 // sec
38 37 #define DEFAULT_SY_LFR_N_BP_P0 4 // sec
39 38 #define DEFAULT_SY_LFR_N_BP_P1 20 // sec
40 39 #define MIN_DELTA_SNAPSHOT 16 // sec
41 40 // BURST
42 41 #define DEFAULT_SY_LFR_B_BP_P0 1 // sec
43 42 #define DEFAULT_SY_LFR_B_BP_P1 5 // sec
44 43 // SBM1
45 44 #define DEFAULT_SY_LFR_S1_BP_P0 1 // sec
46 45 #define DEFAULT_SY_LFR_S1_BP_P1 1 // sec
47 46 // SBM2
48 47 #define DEFAULT_SY_LFR_S2_BP_P0 1 // sec
49 48 #define DEFAULT_SY_LFR_S2_BP_P1 5 // sec
49 // ADDITIONAL PARAMETERS
50 #define TIME_BETWEEN_TWO_SWF_PACKETS 30 // nb x 10 ms => 300 ms
51 #define TIME_BETWEEN_TWO_CWF3_PACKETS 1000 // nb x 10 ms => 10 s
52 //
53 //****************************
50 54
51 55 //*****************************
52 56 // APB REGISTERS BASE ADDRESSES
53 57 #define REGS_ADDR_APBUART 0x80000100
54 58 #define REGS_ADDR_GPTIMER 0x80000300
55 59 #define REGS_ADDR_GRSPW 0x80000500
56 60 #define REGS_ADDR_TIME_MANAGEMENT 0x80000600
57 61 #define REGS_ADDR_SPECTRAL_MATRIX 0x80000f00
58 62
59 63 #ifdef GSA
60 64 #else
61 65 #define REGS_ADDR_WAVEFORM_PICKER 0x80000f20
62 66 #endif
63 67
64 68 #define APBUART_CTRL_REG_MASK_DB 0xfffff7ff
65 69 #define APBUART_SCALER_RELOAD_VALUE 0x00000050 // 25 MHz => about 38400 (0x50)
66 70
67 71 //**********
68 72 // IRQ LINES
69 73 #define IRQ_SM 9
70 74 #define IRQ_SPARC_SM 0x19 // see sparcv8.pdf p.76 for interrupt levels
71 75 #define IRQ_WF 10
72 76 #define IRQ_SPARC_WF 0x1a // see sparcv8.pdf p.76 for interrupt levels
73 77 #define IRQ_TIME1 12
74 78 #define IRQ_SPARC_TIME1 0x1c // see sparcv8.pdf p.76 for interrupt levels
75 79 #define IRQ_TIME2 13
76 80 #define IRQ_SPARC_TIME2 0x1d // see sparcv8.pdf p.76 for interrupt levels
77 81 #define IRQ_WAVEFORM_PICKER 14
78 82 #define IRQ_SPARC_WAVEFORM_PICKER 0x1e // see sparcv8.pdf p.76 for interrupt levels
79 83 #define IRQ_SPECTRAL_MATRIX 6
80 84 #define IRQ_SPARC_SPECTRAL_MATRIX 0x16 // see sparcv8.pdf p.76 for interrupt levels
81 85
82 86 //*****
83 87 // TIME
84 88 #define CLKDIV_SM_SIMULATOR (10000 - 1) // 10 ms
85 89 #define CLKDIV_WF_SIMULATOR (10000000 - 1) // 10 000 000 * 1 us = 10 s
86 90 #define TIMER_SM_SIMULATOR 1
87 91 #define TIMER_WF_SIMULATOR 2
88 92 #define HK_PERIOD 100 // 100 * 10ms => 1sec
89 93
90 94 //**********
91 95 // LPP CODES
92 96 #define LFR_SUCCESSFUL 0
93 97 #define LFR_DEFAULT 1
94 98
95 99 //******
96 100 // RTEMS
97 101 #define TASKID_RECV 1
98 102 #define TASKID_ACTN 2
99 103 #define TASKID_SPIQ 3
100 104 #define TASKID_SMIQ 4
101 105 #define TASKID_STAT 5
102 106 #define TASKID_AVF0 6
103 107 #define TASKID_BPF0 7
104 108 #define TASKID_WFRM 8
105 109 #define TASKID_DUMB 9
106 110 #define TASKID_HOUS 10
107 111 #define TASKID_MATR 11
108 112 #define TASKID_CWF3 12
113 #define TASKID_CWF2 13
114 #define TASKID_CWF1 14
115 #define TASKID_SEND 15
116
117 //*********************************************************************
118 // ALL TASKS THAT USE THE SPACEWIRE DIRVER SHALL HAVE THE SAME PRIORITY
119 // OR CHANGE THE SEMAPHORE CREATION IN THE DRIVER...
120 #define TASK_PRIORITY_SPIQ 5
121 #define TASK_PRIORITY_SMIQ 10
122 #define TASK_PRIORITY_SEND 11
123 #define TASK_PRIORITY_RECV 12
124 #define TASK_PRIORITY_ACTN 12
125 #define TASK_PRIORITY_CWF1 14
126 #define TASK_PRIORITY_HOUS 15
127 #define TASK_PRIORITY_CWF2 15
128 #define TASK_PRIORITY_WFRM 15
129 #define TASK_PRIORITY_CWF3 15
130 #define TASK_PRIORITY_AVF0 50
131 #define TASK_PRIORITY_BPF0 50
132 #define TASK_PRIORITY_MATR 250
133 #define TASK_PRIORITY_STAT 251
134 #define TASK_PRIORITY_DUMB 251
109 135
110 136 #define ACTION_MSG_QUEUE_COUNT 10
137 #define ACTION_MSG_PKTS_COUNT 50
138 #define ACTION_MSG_PKTS_SIZE
111 139
112 140 //*******
113 141 // MACROS
114 142 #ifdef PRINT_MESSAGES_ON_CONSOLE
115 143 #define PRINTF(x) printf(x);
116 144 #define PRINTF1(x,y) printf(x,y);
117 145 #define PRINTF2(x,y,z) printf(x,y,z);
118 146 #else
119 147 #define PRINTF(x) ;
120 148 #define PRINTF1(x,y) ;
121 149 #define PRINTF2(x,y,z) ;
122 150 #endif
123 151
152 #define CPU_USAGE_REPORT_PERIOD 6 // * 10 s = period
153
124 154 #define NB_SAMPLES_PER_SNAPSHOT 2048
125 155 #define TIME_OFFSET 2
126 156 #define WAVEFORM_EXTENDED_HEADER_OFFSET 22
127 157 #define NB_BYTES_SWF_BLK 2 * 6
128 158 #define NB_WORDS_SWF_BLK 3
129 159
130 160 //******************
131 161 // SEQUENCE COUNTERS
132 162 #define SEQ_CNT_NB_PID 2
133 163 #define SEQ_CNT_NB_CAT 4
134 164 #define SEQ_CNT_NB_DEST_ID 11
135 165 // pid
136 166 #define SEQ_CNT_PID_76 0
137 167 #define SEQ_CNT_PID_79 1
138 168 //cat
139 169 #define SEQ_CNT_CAT_1 0
140 170 #define SEQ_CNT_CAT_4 1
141 171 #define SEQ_CNT_CAT_9 2
142 172 #define SEQ_CNT_CAT_12 3
143 173 // destination id
144 174 #define SEQ_CNT_DST_ID_GROUND 0
145 175 #define SEQ_CNT_DST_ID_MISSION_TIMELINE 1
146 176 #define SEQ_CNT_DST_ID_TC_SEQUENCES 2
147 177 #define SEQ_CNT_DST_ID_RECOVERY_ACTION_CMD 3
148 178 #define SEQ_CNT_DST_ID_BACKUP_MISSION_TIMELINE 4
149 179 #define SEQ_CNT_DST_ID_DIRECT_CMD 5
150 180 #define SEQ_CNT_DST_ID_SPARE_GRD_SRC1 6
151 181 #define SEQ_CNT_DST_ID_SPARE_GRD_SRC2 7
152 182 #define SEQ_CNT_DST_ID_OBCP 8
153 183 #define SEQ_CNT_DST_ID_SYSTEM_CONTROL 9
154 184 #define SEQ_CNT_DST_ID_AOCS 10
155 185
156 186 struct param_local_str{
157 187 unsigned int local_sbm1_nb_cwf_sent;
158 188 unsigned int local_sbm1_nb_cwf_max;
159 189 unsigned int local_sbm2_nb_cwf_sent;
160 190 unsigned int local_sbm2_nb_cwf_max;
161 191 unsigned int local_nb_interrupt_f0_MAX;
162 192 };
163 193
164 194 #endif // FSW_RTEMS_CONFIG_H_INCLUDED
@@ -1,90 +1,93
1 1 #ifndef TC_HANDLER_H_INCLUDED
2 2 #define TC_HANDLER_H_INCLUDED
3 3
4 4 #include <rtems.h>
5 5 #include <bsp.h> // for the LEON_Unmask_interrupt function
6 6 #include <stdio.h>
7 7 #include <unistd.h> // for the read call
8 8 #include <sys/ioctl.h> // for the ioctl call
9 9 #include <ccsds_types.h>
10 10 #include <grspw.h>
11 #include <fsw_init.h>
11
12 #include "fsw_init.h"
13 #include "fsw_misc.h"
12 14
13 15 extern int fdSPW;
16 extern unsigned char lfrCurrentMode;
14 17 extern rtems_name misc_name[ ];
15 18 extern rtems_name misc_id[ ];
16 19 extern rtems_id Task_id[ ]; // array of task ids
17 20 // MODE PARAMETERS
18 21 extern struct param_sbm1_str param_sbm1;
19 22 extern struct param_sbm2_str param_sbm2;
20 23 extern Packet_TM_LFR_PARAMETER_DUMP_t parameter_dump_packet;
21 extern Packet_TM_LFR_HK_t housekeeping_packet;
22 24 extern time_management_regs_t *time_management_regs;
23 25 extern waveform_picker_regs_t *waveform_picker_regs;
24 26 extern gptimer_regs_t *gptimer_regs;
25 27
26 28 //****
27 29 // ISR
28 30 rtems_isr commutation_isr1( rtems_vector_number vector );
29 31 rtems_isr commutation_isr2( rtems_vector_number vector );
30 32
31 33 //**********************
32 34 // GENERAL USE FUNCTIONS
35 unsigned int Crc_opt( unsigned char D, unsigned int Chk);
33 36 void initLookUpTableForCRC( void );
34 37 void GetCRCAsTwoBytes(unsigned char* data, unsigned char* crcAsTwoBytes, unsigned int sizeOfData);
38 void updateLFRCurrentMode();
35 39
36 40 //*********************
37 41 // ACCEPTANCE FUNCTIONS
38 42 int TC_acceptance(ccsdsTelecommandPacket_t *TC, unsigned int TC_LEN_RCV);
39 43 unsigned char TC_parser(ccsdsTelecommandPacket_t * TMPacket, unsigned int TC_LEN_RCV);
40 44
41 45 unsigned char TM_build_header( enum TM_TYPE tm_type, unsigned int packetLength,
42 46 TMHeader_t *TMHeader, unsigned char tc_sid);
43 unsigned char TM_build_data(ccsdsTelecommandPacket_t *TC, char* data, unsigned int SID, unsigned char *computed_CRC);
44 47
45 48 //***********
46 49 // RTEMS TASK
47 50 rtems_task recv_task( rtems_task_argument unused );
48 51 rtems_task actn_task( rtems_task_argument unused );
49 52 rtems_task dumb_task( rtems_task_argument unused );
50 int create_message_queue( void );
51 53
52 54 //***********
53 55 // TC ACTIONS
54 int action_default(ccsdsTelecommandPacket_t *TC);
55 int action_enter(ccsdsTelecommandPacket_t *TC);
56 int action_updt_info(ccsdsTelecommandPacket_t *TC);
56 int action_reset(ccsdsTelecommandPacket_t *TC);
57 int action_load_common_par(ccsdsTelecommandPacket_t *TC);
58 int action_load_normal_par(ccsdsTelecommandPacket_t *TC);
59 int action_load_burst_par(ccsdsTelecommandPacket_t *TC);
60 int action_load_sbm1_par(ccsdsTelecommandPacket_t *TC);
61 int action_load_sbm2_par(ccsdsTelecommandPacket_t *TC);
62 int action_dump_par(ccsdsTelecommandPacket_t *TC);
63 int action_enter_mode(ccsdsTelecommandPacket_t *TC);
64 int action_update_info(ccsdsTelecommandPacket_t *TC);
57 65 int action_enable_calibration(ccsdsTelecommandPacket_t *TC);
58 66 int action_disable_calibration(ccsdsTelecommandPacket_t *TC);
59 int action_updt_time(ccsdsTelecommandPacket_t *TC);
67 int action_update_time(ccsdsTelecommandPacket_t *TC);
68
60 69 // mode transition
61 70 int transition_validation(unsigned char requestedMode);
62 71 int stop_current_mode();
63 72 int enter_mode(unsigned char mode, ccsdsTelecommandPacket_t *TC);
64 int enter_standby_mode(ccsdsTelecommandPacket_t *TC);
65 int enter_normal_mode(ccsdsTelecommandPacket_t *TC);
66 int enter_burst_mode(ccsdsTelecommandPacket_t *TC);
67 int enter_sbm1_mode(ccsdsTelecommandPacket_t *TC);
68 int enter_sbm2_mode(ccsdsTelecommandPacket_t *TC);
73 int enter_standby_mode();
74 int enter_normal_mode();
75 int enter_burst_mode();
76 int enter_sbm1_mode();
77 int enter_sbm2_mode();
69 78 int restart_science_tasks();
70 79 int suspend_science_tasks();
71 // parameters loading
72 int action_load_comm(ccsdsTelecommandPacket_t *TC);
73 int action_load_norm(ccsdsTelecommandPacket_t *TC);
74 int action_load_burst(ccsdsTelecommandPacket_t *TC);
75 int action_load_sbm1(ccsdsTelecommandPacket_t *TC);
76 int action_load_sbm2(ccsdsTelecommandPacket_t *TC);
77 int action_dump(ccsdsTelecommandPacket_t *TC);
80
78 81 // other functions
79 82 void update_last_TC_exe(ccsdsTelecommandPacket_t *TC);
80 83 void update_last_TC_rej(ccsdsTelecommandPacket_t *TC);
81 84 void close_action(ccsdsTelecommandPacket_t *TC, int result);
82 85 int send_tm_lfr_tc_exe_success(ccsdsTelecommandPacket_t *TC);
83 86 int send_tm_lfr_tc_exe_not_executable(ccsdsTelecommandPacket_t *TC);
84 87 int send_tm_lfr_tc_exe_not_implemented(ccsdsTelecommandPacket_t *TC);
85 88 int send_tm_lfr_tc_exe_error(ccsdsTelecommandPacket_t *TC);
86 89
87 90 #endif // TC_HANDLER_H_INCLUDED
88 91
89 92
90 93
@@ -1,66 +1,72
1 1 #ifndef WF_HANDLER_H_INCLUDED
2 2 #define WF_HANDLER_H_INCLUDED
3 3
4 4 #include <rtems.h>
5 #include <fsw_params.h>
6 5 #include <grspw.h>
7 #include <grlib_regs.h>
8 #include <ccsds_types.h>
6
9 7 #include <stdio.h>
10 #include <fsw_init.h>
11 8 #include <math.h>
12 9
10 #include "fsw_params.h"
11 #include "grlib_regs.h"
12 #include "ccsds_types.h"
13 #include "fsw_init.h"
14
13 15 #define pi 3.1415
14 16
15 17 //#include <sys/ioctl.h>
16 18
17 19 extern rtems_id Task_id[]; /* array of task ids */
18 20 extern int fdSPW;
19 21 extern volatile int wf_snap_f0[ ];
22 //
20 23 extern volatile int wf_snap_f1[ ];
21 24 extern volatile int wf_snap_f1_bis[ ];
25 extern volatile int wf_snap_f1_norm[ ];
26 //
22 27 extern volatile int wf_snap_f2[ ];
23 28 extern volatile int wf_snap_f2_bis[ ];
29 extern volatile int wf_snap_f2_norm[ ];
30 //
24 31 extern volatile int wf_cont_f3[ ];
25 32 extern volatile int wf_cont_f3_bis[ ];
26 33 extern waveform_picker_regs_t *waveform_picker_regs;
34 extern unsigned char lfrCurrentMode;
27 35
28 36 rtems_isr waveforms_isr( rtems_vector_number vector );
29 37 rtems_isr waveforms_simulator_isr( rtems_vector_number vector );
30 38 rtems_task wfrm_task(rtems_task_argument argument);
31 39 rtems_task cwf3_task(rtems_task_argument argument);
40 rtems_task cwf2_task(rtems_task_argument argument);
41 rtems_task cwf1_task(rtems_task_argument argument);
32 42
33 43 //******************
34 44 // general functions
35 45 void init_waveforms( void );
36 void init_header_snapshot_wf( Header_TM_LFR_SCIENCE_SWF_t *header );
37 void init_header_continuous_wf( Header_TM_LFR_SCIENCE_CWF_t *header );
46 //
47 int init_header_snapshot_wf_table( unsigned int sid );
48 int init_header_continuous_wf_table(unsigned int sid , Header_TM_LFR_SCIENCE_CWF_t *headerCWF);
49 //
38 50 void reset_waveforms( void );
39 void send_waveform_norm( Header_TM_LFR_SCIENCE_SWF_t *header, spw_ioctl_pkt_send *spw_ioctl_send );
40 void send_waveform_burst( Header_TM_LFR_SCIENCE_CWF_t *header, spw_ioctl_pkt_send *spw_ioctl_send );
41 void send_waveform_sbm1( Header_TM_LFR_SCIENCE_CWF_t *header, spw_ioctl_pkt_send *spw_ioctl_send );
42 void send_waveform_sbm2( Header_TM_LFR_SCIENCE_CWF_t *header, spw_ioctl_pkt_send *spw_ioctl_send );
43 void send_waveform_norm_cwf_f3(Header_TM_LFR_SCIENCE_CWF_t *header, spw_ioctl_pkt_send *spw_ioctl_send );
44 51
45 void send_waveform_SWF( Header_TM_LFR_SCIENCE_SWF_t *header, volatile int *waveform,
46 unsigned int sid, spw_ioctl_pkt_send *spw_ioctl_send );
47 void send_waveform_CWF( Header_TM_LFR_SCIENCE_CWF_t *header, volatile int *waveform,
48 unsigned int sid, spw_ioctl_pkt_send *spw_ioctl_send );
52 int send_waveform_SWF(volatile int *waveform, unsigned int sid);
53 int send_waveform_CWF(volatile int *waveform, unsigned int sid, Header_TM_LFR_SCIENCE_CWF_t *headerCWF);
49 54
50 55 //**************
51 56 // wfp registers
52 57 void set_wfp_data_shaping();
53 58 char set_wfp_delta_snapshot();
54 59 void set_wfp_burst_enable_register( unsigned char mode);
55 60 void reset_wfp_burst_enable();
61 void reset_wfp_status();
56 62 void reset_waveform_picker_regs();
57 63
58 64 //*****************
59 65 // local parameters
60 66 void set_local_sbm1_nb_cwf_max();
61 67 void set_local_sbm2_nb_cwf_max();
62 68 void set_local_nb_interrupt_f0_MAX();
63 69 void reset_local_sbm1_nb_cwf_sent();
64 70 void reset_local_sbm2_nb_cwf_sent();
65 71
66 72 #endif // WF_HANDLER_H_INCLUDED
@@ -1,55 +1,55
1 1 #include <drvmgr/ambapp_bus.h>
2 2
3 3 // GRSPW0 resources
4 4 struct drvmgr_key grlib_grspw_0n1_res[] = {
5 {"txBdCnt", KEY_TYPE_INT, {(unsigned int)10}},
5 {"txBdCnt", KEY_TYPE_INT, {(unsigned int)50}}, // 7 SWF_F0, 7 SWF_F1, 7 SWF_F2, 7 CWF_F3, 7 CWF_F1 ou 7 CWF_F2
6 6 {"rxBdCnt", KEY_TYPE_INT, {(unsigned int)10}},
7 7 {"txDataSize", KEY_TYPE_INT, {(unsigned int)4096}},
8 8 {"txHdrSize", KEY_TYPE_INT, {(unsigned int)20+12}}, // 12 is for the auxiliary header, when needed
9 9 {"rxPktSize", KEY_TYPE_INT, {(unsigned int)248+4}},
10 10 KEY_EMPTY
11 11 };
12 12
13 13 #if 0
14 14 /* APBUART0 */
15 15 struct drvmgr_key grlib_drv_res_apbuart0[] =
16 16 {
17 17 {"mode", KEY_TYPE_INT, {(unsigned int)1}},
18 18 {"syscon", KEY_TYPE_INT, {(unsigned int)1}},
19 19 KEY_EMPTY
20 20 };
21 21 /* APBUART1 */
22 22 struct drvmgr_key grlib_drv_res_apbuart1[] =
23 23 {
24 24 {"mode", KEY_TYPE_INT, {(unsigned int)1}},
25 25 {"syscon", KEY_TYPE_INT, {(unsigned int)0}},
26 26 KEY_EMPTY
27 27 };
28 28 /* LEON3 System with driver configuration for 2 APBUARTs, the
29 29 * the rest of the AMBA device drivers use their defaults.
30 30 */
31 31
32 32 /* Override default debug UART assignment.
33 33 * 0 = Default APBUART. APBUART[0], but on MP system CPU0=APBUART0,
34 34 * CPU1=APBUART1...
35 35 * 1 = APBUART[0]
36 36 * 2 = APBUART[1]
37 37 * 3 = APBUART[2]
38 38 * ...
39 39 */
40 40 //int debug_uart_index = 2; /* second UART -- APBUART[1] */
41 41 #endif
42 42
43 43 // If RTEMS_DRVMGR_STARTUP is defined we override the "weak defaults" that is defined by the LEON3 BSP.
44 44
45 45 struct drvmgr_bus_res grlib_drv_resources = {
46 46 .next = NULL,
47 47 .resource = {
48 48 {DRIVER_AMBAPP_GAISLER_GRSPW_ID, 0, &grlib_grspw_0n1_res[0]},
49 49 // {DRIVER_AMBAPP_GAISLER_APBUART_ID, 0, &grlib_drv_res_apbuart0[0]},
50 50 // {DRIVER_AMBAPP_GAISLER_APBUART_ID, 1, &grlib_drv_res_apbuart1[0]},
51 51 RES_EMPTY /* Mark end of device resource array */
52 52 }
53 53 };
54 54
55 55
@@ -1,63 +1,69
1 1 //#include <fsw_processing.h>
2 2 #include <rtems.h>
3 3 #include <grspw.h>
4 4 #include <ccsds_types.h>
5 5 #include <grlib_regs.h>
6 6 #include <fsw_params.h>
7 7
8 8 // RTEMS GLOBAL VARIABLES
9 9 rtems_name misc_name[5];
10 10 rtems_name misc_id[5];
11 rtems_id Task_id[15]; /* array of task ids */
12 rtems_name Task_name[15]; /* array of task names */
11 rtems_id Task_id[20]; /* array of task ids */
12 rtems_name Task_name[20]; /* array of task names */
13 13 int fdSPW = 0;
14 14 int fdUART = 0;
15 unsigned char lfrCurrentMode;
15 16
16 17 // APB CONFIGURATION REGISTERS
17 18 time_management_regs_t *time_management_regs = (time_management_regs_t*) REGS_ADDR_TIME_MANAGEMENT;
18 19 gptimer_regs_t *gptimer_regs = (gptimer_regs_t *) REGS_ADDR_GPTIMER;
19 20 #ifdef GSA
20 21 #else
21 22 waveform_picker_regs_t *waveform_picker_regs = (waveform_picker_regs_t*) REGS_ADDR_WAVEFORM_PICKER;
22 23 #endif
23 24 spectral_matrix_regs_t *spectral_matrix_regs = (spectral_matrix_regs_t*) REGS_ADDR_SPECTRAL_MATRIX;
24 25
25 26 // WAVEFORMS GLOBAL VARIABLES // 2048 * 3 * 4 + 2 * 4 = 24576 + 8 bytes
26 27 volatile int wf_snap_f0[ NB_SAMPLES_PER_SNAPSHOT * NB_WORDS_SWF_BLK + TIME_OFFSET];
28 //
27 29 volatile int wf_snap_f1[ NB_SAMPLES_PER_SNAPSHOT * NB_WORDS_SWF_BLK + TIME_OFFSET];
28 30 volatile int wf_snap_f1_bis[ NB_SAMPLES_PER_SNAPSHOT * NB_WORDS_SWF_BLK + TIME_OFFSET];
31 volatile int wf_snap_f1_norm[ NB_SAMPLES_PER_SNAPSHOT * NB_WORDS_SWF_BLK + TIME_OFFSET];
32 //
29 33 volatile int wf_snap_f2[ NB_SAMPLES_PER_SNAPSHOT * NB_WORDS_SWF_BLK + TIME_OFFSET];
30 34 volatile int wf_snap_f2_bis[ NB_SAMPLES_PER_SNAPSHOT * NB_WORDS_SWF_BLK + TIME_OFFSET];
35 volatile int wf_snap_f2_norm[ NB_SAMPLES_PER_SNAPSHOT * NB_WORDS_SWF_BLK + TIME_OFFSET];
36 //
31 37 volatile int wf_cont_f3[ NB_SAMPLES_PER_SNAPSHOT * NB_WORDS_SWF_BLK + TIME_OFFSET];
32 38 volatile int wf_cont_f3_bis[ NB_SAMPLES_PER_SNAPSHOT * NB_WORDS_SWF_BLK + TIME_OFFSET];
33 39
34 40 // SPECTRAL MATRICES GLOBAL VARIABLES
35 41 volatile int spec_mat_f0_0[ SM_HEADER + TOTAL_SIZE_SM ];
36 42 volatile int spec_mat_f0_1[ SM_HEADER + TOTAL_SIZE_SM ];
37 43 volatile int spec_mat_f0_c[ SM_HEADER + TOTAL_SIZE_SM ];
38 44 volatile int spec_mat_f0_d[ SM_HEADER + TOTAL_SIZE_SM ];
39 45 volatile int spec_mat_f0_e[ SM_HEADER + TOTAL_SIZE_SM ];
40 46 volatile int spec_mat_f0_f[ SM_HEADER + TOTAL_SIZE_SM ];
41 47 volatile int spec_mat_f0_g[ SM_HEADER + TOTAL_SIZE_SM ];
42 48 volatile int spec_mat_f0_h[ SM_HEADER + TOTAL_SIZE_SM ];
43 49 volatile int spec_mat_f0_0_bis[ SM_HEADER + TOTAL_SIZE_SM ];
44 50 volatile int spec_mat_f0_1_bis[ SM_HEADER + TOTAL_SIZE_SM ];
45 51 //
46 52 volatile int spec_mat_f1[ SM_HEADER + TOTAL_SIZE_SM ];
47 53 volatile int spec_mat_f1_bis[ SM_HEADER + TOTAL_SIZE_SM ];
48 54 //
49 55 volatile int spec_mat_f2[ SM_HEADER + TOTAL_SIZE_SM ];
50 56 volatile int spec_mat_f2_bis[ SM_HEADER + TOTAL_SIZE_SM ];
51 57
52 58 // MODE PARAMETERS
53 59 Packet_TM_LFR_PARAMETER_DUMP_t parameter_dump_packet;
54 60 struct param_local_str param_local;
55 61
56 62 // HK PACKETS
57 63 Packet_TM_LFR_HK_t housekeeping_packet;
58 64 // sequence counters are incremented by APID (PID + CAT) and destination ID
59 65 unsigned short sequenceCounters[SEQ_CNT_NB_PID][SEQ_CNT_NB_CAT][SEQ_CNT_NB_DEST_ID];
60 66 spw_stats spacewire_stats;
61 67 spw_stats spacewire_stats_backup;
62 68
63 69
@@ -1,590 +1,437
1 1 //*************************
2 2 // GPL reminder to be added
3 3 //*************************
4 4
5 5 #include <rtems.h>
6 6
7 7 /* configuration information */
8 8
9 9 #define CONFIGURE_INIT
10 10
11 11 #include <bsp.h> /* for device driver prototypes */
12 12
13 13 /* configuration information */
14 14
15 15 #define CONFIGURE_APPLICATION_NEEDS_CONSOLE_DRIVER
16 16 #define CONFIGURE_APPLICATION_NEEDS_CLOCK_DRIVER
17 17
18 #define CONFIGURE_MAXIMUM_TASKS 15
18 #define CONFIGURE_MAXIMUM_TASKS 20
19 19 #define CONFIGURE_RTEMS_INIT_TASKS_TABLE
20 20 #define CONFIGURE_EXTRA_TASK_STACKS (3 * RTEMS_MINIMUM_STACK_SIZE)
21 21 #define CONFIGURE_LIBIO_MAXIMUM_FILE_DESCRIPTORS 32
22 #define CONFIGURE_INIT_TASK_PRIORITY 100
22 #define CONFIGURE_INIT_TASK_PRIORITY 5 // instead of 100
23 23 #define CONFIGURE_MAXIMUM_DRIVERS 16
24 24 #define CONFIGURE_MAXIMUM_PERIODS 5
25 #define CONFIGURE_MAXIMUM_MESSAGE_QUEUES 1
25 #define CONFIGURE_MAXIMUM_MESSAGE_QUEUES 2
26 26
27 27 #include <rtems/confdefs.h>
28 28
29 29 /* If --drvmgr was enabled during the configuration of the RTEMS kernel */
30 30 #ifdef RTEMS_DRVMGR_STARTUP
31 31 #ifdef LEON3
32 32 /* Add Timer and UART Driver */
33 33 #ifdef CONFIGURE_APPLICATION_NEEDS_CLOCK_DRIVER
34 34 #define CONFIGURE_DRIVER_AMBAPP_GAISLER_GPTIMER
35 35 #endif
36 36 #ifdef CONFIGURE_APPLICATION_NEEDS_CONSOLE_DRIVER
37 37 #define CONFIGURE_DRIVER_AMBAPP_GAISLER_APBUART
38 38 #endif
39 39 #endif
40 40 #define CONFIGURE_DRIVER_AMBAPP_GAISLER_GRSPW /* GRSPW Driver */
41 41 #include <drvmgr/drvmgr_confdefs.h>
42 42 #endif
43 43
44 44 #include <fsw_init.h>
45 45 #include <fsw_config.c>
46 46
47 char *lstates[6] = {"Error-reset",
48 "Error-wait",
49 "Ready",
50 "Started",
51 "Connecting",
52 "Run"
53 };
54
55 47 rtems_task Init( rtems_task_argument ignored )
56 48 {
57 49 rtems_status_code status;
58 50 rtems_isr_entry old_isr_handler;
59 51
60 52 PRINTF("\n\n\n\n\n")
61 53 PRINTF("***************************\n")
62 54 PRINTF("** START Flight Software **\n")
63 55 PRINTF("***************************\n")
64 56 PRINTF("\n\n")
65 57
66 58 //send_console_outputs_on_apbuart_port();
67 59 set_apbuart_scaler_reload_register(REGS_ADDR_APBUART, APBUART_SCALER_RELOAD_VALUE);
68 60
69 61 initLookUpTableForCRC(); // in tc_handler.h
70 62 init_parameter_dump();
71 63 init_local_mode_parameters();
72 64 init_housekeeping_parameters();
73 create_message_queue();
65 create_message_queues();
74 66
75 67 create_names(); // create all names
76 68 create_all_tasks(); // create all tasks
69
77 70 start_all_tasks(); // start all tasks
78 71 stop_current_mode(); // go in STANDBY mode
79 72
80 73 grspw_timecode_callback = &timecode_irq_handler;
81 74
82 75 spacewire_configure_link();
83 76
84 77 #ifdef GSA
85 78 // Spectral Matrices simulator
86 79 configure_timer((gptimer_regs_t*) REGS_ADDR_GPTIMER, TIMER_SM_SIMULATOR, CLKDIV_SM_SIMULATOR,
87 80 IRQ_SPARC_SM, spectral_matrices_isr );
88 //**********
89 // WAVEFORMS
81 // WaveForms
90 82 configure_timer((gptimer_regs_t*) REGS_ADDR_GPTIMER, TIMER_WF_SIMULATOR, CLKDIV_WF_SIMULATOR,
91 83 IRQ_SPARC_WF, waveforms_simulator_isr );
92 84 LEON_Mask_interrupt( IRQ_SM );
93 85 LEON_Mask_interrupt( IRQ_WF );
94 86 #else
95 87 // reset configuration registers
96 88 reset_waveform_picker_regs();
97 89 reset_spectral_matrix_regs();
98 90 // configure IRQ handling for the waveform picker unit
99 91 status = rtems_interrupt_catch( waveforms_isr,
100 92 IRQ_SPARC_WAVEFORM_PICKER,
101 93 &old_isr_handler) ;
102 94 // configure IRQ handling for the spectral matrix unit
103 95 status = rtems_interrupt_catch( spectral_matrices_isr,
104 96 IRQ_SPARC_SPECTRAL_MATRIX,
105 97 &old_isr_handler) ;
106 98 // mask IRQ lines
107 99 LEON_Mask_interrupt( IRQ_WAVEFORM_PICKER );
108 100 LEON_Mask_interrupt( IRQ_SPECTRAL_MATRIX );
109 101 #endif
110 102
111 //**********
112
113 103 status = rtems_task_delete(RTEMS_SELF);
114 104
115 105 }
116 106
117 107 void init_parameter_dump(void)
118 108 {
119 109 parameter_dump_packet.targetLogicalAddress = CCSDS_DESTINATION_ID;
120 110 parameter_dump_packet.protocolIdentifier = CCSDS_PROTOCOLE_ID;
121 111 parameter_dump_packet.reserved = CCSDS_RESERVED;
122 112 parameter_dump_packet.userApplication = CCSDS_USER_APP;
123 113 parameter_dump_packet.packetID[0] = (unsigned char) (TM_PACKET_ID_PARAMETER_DUMP >> 8);
124 114 parameter_dump_packet.packetID[1] = (unsigned char) TM_PACKET_ID_PARAMETER_DUMP;
125 parameter_dump_packet.packetSequenceControl[0] = (unsigned char) (TM_PACKET_SEQ_CTRL_STANDALONE << 6);
126 parameter_dump_packet.packetSequenceControl[1] = 0x00;
115 parameter_dump_packet.packetSequenceControl[0] = TM_PACKET_SEQ_CTRL_STANDALONE;
116 parameter_dump_packet.packetSequenceControl[1] = TM_PACKET_SEQ_CNT_DEFAULT;
127 117 parameter_dump_packet.packetLength[0] = (unsigned char) (PACKET_LENGTH_PARAMETER_DUMP >> 8);
128 118 parameter_dump_packet.packetLength[1] = (unsigned char) PACKET_LENGTH_PARAMETER_DUMP;
129 119 // DATA FIELD HEADER
130 120 parameter_dump_packet.spare1_pusVersion_spare2 = SPARE1_PUSVERSION_SPARE2;
131 121 parameter_dump_packet.serviceType = TM_TYPE_PARAMETER_DUMP;
132 122 parameter_dump_packet.serviceSubType = TM_SUBTYPE_PARAMETER_DUMP;
133 123 parameter_dump_packet.destinationID = TM_DESTINATION_ID_GROUND;
134 124 parameter_dump_packet.time[0] = (unsigned char) (time_management_regs->coarse_time>>24);
135 125 parameter_dump_packet.time[1] = (unsigned char) (time_management_regs->coarse_time>>16);
136 126 parameter_dump_packet.time[2] = (unsigned char) (time_management_regs->coarse_time>>8);
137 127 parameter_dump_packet.time[3] = (unsigned char) (time_management_regs->coarse_time);
138 128 parameter_dump_packet.time[4] = (unsigned char) (time_management_regs->fine_time>>8);
139 129 parameter_dump_packet.time[5] = (unsigned char) (time_management_regs->fine_time);
140 130 parameter_dump_packet.sid = SID_PARAMETER_DUMP;
141 131
142 132 //******************
143 133 // COMMON PARAMETERS
144 134 parameter_dump_packet.unused0 = DEFAULT_SY_LFR_COMMON0;
145 135 parameter_dump_packet.bw_sp0_sp1_r0_r1 = DEFAULT_SY_LFR_COMMON1;
146 136
147 137 //******************
148 138 // NORMAL PARAMETERS
149 139 parameter_dump_packet.sy_lfr_n_swf_l[0] = (unsigned char) (DEFAULT_SY_LFR_N_SWF_L >> 8);
150 parameter_dump_packet.sy_lfr_n_swf_l[1] = (unsigned char) DEFAULT_SY_LFR_N_SWF_L;
140 parameter_dump_packet.sy_lfr_n_swf_l[1] = (unsigned char) (DEFAULT_SY_LFR_N_SWF_L );
151 141 parameter_dump_packet.sy_lfr_n_swf_p[0] = (unsigned char) (DEFAULT_SY_LFR_N_SWF_P >> 8);
152 parameter_dump_packet.sy_lfr_n_swf_p[1] = (unsigned char) DEFAULT_SY_LFR_N_SWF_P;
142 parameter_dump_packet.sy_lfr_n_swf_p[1] = (unsigned char) (DEFAULT_SY_LFR_N_SWF_P );
153 143 parameter_dump_packet.sy_lfr_n_asm_p[0] = (unsigned char) (DEFAULT_SY_LFR_N_ASM_P >> 8);
154 parameter_dump_packet.sy_lfr_n_asm_p[1] = (unsigned char) DEFAULT_SY_LFR_N_ASM_P;
144 parameter_dump_packet.sy_lfr_n_asm_p[1] = (unsigned char) (DEFAULT_SY_LFR_N_ASM_P );
155 145 parameter_dump_packet.sy_lfr_n_bp_p0 = (unsigned char) DEFAULT_SY_LFR_N_BP_P0;
156 146 parameter_dump_packet.sy_lfr_n_bp_p1 = (unsigned char) DEFAULT_SY_LFR_N_BP_P1;
157 147
158 148 //*****************
159 149 // BURST PARAMETERS
160 150 parameter_dump_packet.sy_lfr_b_bp_p0 = (unsigned char) DEFAULT_SY_LFR_B_BP_P0;
161 151 parameter_dump_packet.sy_lfr_b_bp_p1 = (unsigned char) DEFAULT_SY_LFR_B_BP_P1;
162 152
163 153 //****************
164 154 // SBM1 PARAMETERS
165 155 parameter_dump_packet.sy_lfr_s1_bp_p0 = (unsigned char) DEFAULT_SY_LFR_S1_BP_P0; // min value is 0.25 s for the period
166 156 parameter_dump_packet.sy_lfr_s1_bp_p1 = (unsigned char) DEFAULT_SY_LFR_S1_BP_P1;
167 157
168 158 //****************
169 159 // SBM2 PARAMETERS
170 160 parameter_dump_packet.sy_lfr_s2_bp_p0 = (unsigned char) DEFAULT_SY_LFR_S2_BP_P0;
171 161 parameter_dump_packet.sy_lfr_s2_bp_p1 = (unsigned char) DEFAULT_SY_LFR_S2_BP_P1;
172 162 }
173 163
174 164 void init_local_mode_parameters(void)
175 165 {
176 166 // LOCAL PARAMETERS
177 167 set_local_sbm1_nb_cwf_max();
178 168 set_local_sbm2_nb_cwf_max();
179 169 set_local_nb_interrupt_f0_MAX();
180 170
181 171 PRINTF1("local_sbm1_nb_cwf_max %d \n", param_local.local_sbm1_nb_cwf_max)
182 172 PRINTF1("local_sbm2_nb_cwf_max %d \n", param_local.local_sbm2_nb_cwf_max)
183 173 PRINTF1("nb_interrupt_f0_MAX = %d\n", param_local.local_nb_interrupt_f0_MAX)
184 174
185 175 reset_local_sbm1_nb_cwf_sent();
186 176 reset_local_sbm2_nb_cwf_sent();
187 177 }
188 178
189 179 void init_housekeeping_parameters(void)
190 180 {
191 181 unsigned int i = 0;
192 182 unsigned int j = 0;
193 183 unsigned int k = 0;
194 184 char *parameters;
195 185
196 186 parameters = (char*) &housekeeping_packet.lfr_status_word;
197 187 for(i = 0; i< SIZE_HK_PARAMETERS; i++)
198 188 {
199 189 parameters[i] = 0x00;
200 190 }
201 191 // init status word
202 192 housekeeping_packet.lfr_status_word[0] = 0x00;
203 193 housekeeping_packet.lfr_status_word[1] = 0x00;
204 194 // init software version
205 195 housekeeping_packet.lfr_sw_version[0] = SW_VERSION_N1;
206 196 housekeeping_packet.lfr_sw_version[1] = SW_VERSION_N2;
207 197 housekeeping_packet.lfr_sw_version[2] = SW_VERSION_N3;
208 198 housekeeping_packet.lfr_sw_version[3] = SW_VERSION_N4;
209 199 // init sequence counters
210 200 for (i = 0; i<SEQ_CNT_NB_PID; i++)
211 201 {
212 202 for(j = 0; j<SEQ_CNT_NB_CAT; j++)
213 203 {
214 204 for(k = 0; k<SEQ_CNT_NB_DEST_ID; k++)
215 205 {
216 206 sequenceCounters[i][j][k] = 0x00;
217 207 }
218 208 }
219 209 }
210 updateLFRCurrentMode();
220 211 }
221 212
222 213 int create_names( void )
223 214 {
224 215 // task names
225 216 Task_name[TASKID_RECV] = rtems_build_name( 'R', 'E', 'C', 'V' );
226 217 Task_name[TASKID_ACTN] = rtems_build_name( 'A', 'C', 'T', 'N' );
227 218 Task_name[TASKID_SPIQ] = rtems_build_name( 'S', 'P', 'I', 'Q' );
228 219 Task_name[TASKID_SMIQ] = rtems_build_name( 'S', 'M', 'I', 'Q' );
229 220 Task_name[TASKID_STAT] = rtems_build_name( 'S', 'T', 'A', 'T' );
230 221 Task_name[TASKID_AVF0] = rtems_build_name( 'A', 'V', 'F', '0' );
231 222 Task_name[TASKID_BPF0] = rtems_build_name( 'B', 'P', 'F', '0' );
232 223 Task_name[TASKID_WFRM] = rtems_build_name( 'W', 'F', 'R', 'M' );
233 224 Task_name[TASKID_DUMB] = rtems_build_name( 'D', 'U', 'M', 'B' );
234 225 Task_name[TASKID_HOUS] = rtems_build_name( 'H', 'O', 'U', 'S' );
235 226 Task_name[TASKID_MATR] = rtems_build_name( 'M', 'A', 'T', 'R' );
236 227 Task_name[TASKID_CWF3] = rtems_build_name( 'C', 'W', 'F', '3' );
228 Task_name[TASKID_CWF2] = rtems_build_name( 'C', 'W', 'F', '2' );
229 Task_name[TASKID_CWF1] = rtems_build_name( 'C', 'W', 'F', '1' );
230 Task_name[TASKID_SEND] = rtems_build_name( 'S', 'E', 'N', 'D' );
237 231
238 232 // rate monotonic period name
239 233 HK_name = rtems_build_name( 'H', 'O', 'U', 'S' );
240 234
241 235 return 0;
242 236 }
243 237
244 238 int create_all_tasks( void )
245 239 {
246 240 rtems_status_code status;
247 241
248 242 // RECV
249 243 status = rtems_task_create(
250 Task_name[TASKID_RECV], 200, RTEMS_MINIMUM_STACK_SIZE * 2,
244 Task_name[TASKID_RECV], TASK_PRIORITY_RECV, RTEMS_MINIMUM_STACK_SIZE * 2,
251 245 RTEMS_DEFAULT_MODES,
252 246 RTEMS_DEFAULT_ATTRIBUTES, &Task_id[TASKID_RECV]
253 247 );
254 248 // ACTN
255 249 status = rtems_task_create(
256 Task_name[TASKID_ACTN], 100, RTEMS_MINIMUM_STACK_SIZE * 2,
250 Task_name[TASKID_ACTN], TASK_PRIORITY_ACTN, RTEMS_MINIMUM_STACK_SIZE * 2,
257 251 RTEMS_DEFAULT_MODES,
258 252 RTEMS_DEFAULT_ATTRIBUTES, &Task_id[TASKID_ACTN]
259 253 );
260 254 // SPIQ
261 255 status = rtems_task_create(
262 Task_name[TASKID_SPIQ], 5, RTEMS_MINIMUM_STACK_SIZE * 2,
256 Task_name[TASKID_SPIQ], TASK_PRIORITY_SPIQ, RTEMS_MINIMUM_STACK_SIZE * 2,
263 257 RTEMS_DEFAULT_MODES | RTEMS_NO_PREEMPT,
264 258 RTEMS_DEFAULT_ATTRIBUTES, &Task_id[TASKID_SPIQ]
265 259 );
266 260 // SMIQ
267 261 status = rtems_task_create(
268 Task_name[TASKID_SMIQ], 10, RTEMS_MINIMUM_STACK_SIZE * 2,
262 Task_name[TASKID_SMIQ], TASK_PRIORITY_SMIQ, RTEMS_MINIMUM_STACK_SIZE * 2,
269 263 RTEMS_DEFAULT_MODES | RTEMS_NO_PREEMPT,
270 264 RTEMS_DEFAULT_ATTRIBUTES, &Task_id[TASKID_SMIQ]
271 265 );
272 266 // STAT
273 267 status = rtems_task_create(
274 Task_name[TASKID_STAT], 251, RTEMS_MINIMUM_STACK_SIZE * 2,
268 Task_name[TASKID_STAT], TASK_PRIORITY_STAT, RTEMS_MINIMUM_STACK_SIZE * 2,
275 269 RTEMS_DEFAULT_MODES,
276 270 RTEMS_DEFAULT_ATTRIBUTES, &Task_id[TASKID_STAT]
277 271 );
278 272 // AVF0
279 273 status = rtems_task_create(
280 Task_name[TASKID_AVF0], 50, RTEMS_MINIMUM_STACK_SIZE * 2,
274 Task_name[TASKID_AVF0], TASK_PRIORITY_AVF0, RTEMS_MINIMUM_STACK_SIZE * 2,
281 275 RTEMS_DEFAULT_MODES | RTEMS_NO_PREEMPT,
282 276 RTEMS_DEFAULT_ATTRIBUTES | RTEMS_FLOATING_POINT, &Task_id[TASKID_AVF0]
283 277 );
284 278 // BPF0
285 279 status = rtems_task_create(
286 Task_name[TASKID_BPF0], 50, RTEMS_MINIMUM_STACK_SIZE * 2,
280 Task_name[TASKID_BPF0], TASK_PRIORITY_BPF0, RTEMS_MINIMUM_STACK_SIZE * 2,
287 281 RTEMS_DEFAULT_MODES,
288 282 RTEMS_DEFAULT_ATTRIBUTES | RTEMS_FLOATING_POINT, &Task_id[TASKID_BPF0]
289 283 );
290 284 // WFRM
291 285 status = rtems_task_create(
292 Task_name[TASKID_WFRM], 50, RTEMS_MINIMUM_STACK_SIZE * 2,
286 Task_name[TASKID_WFRM], TASK_PRIORITY_WFRM, RTEMS_MINIMUM_STACK_SIZE * 2,
293 287 RTEMS_DEFAULT_MODES,
294 288 RTEMS_DEFAULT_ATTRIBUTES | RTEMS_FLOATING_POINT, &Task_id[TASKID_WFRM]
295 289 );
296 290 // DUMB
297 291 status = rtems_task_create(
298 Task_name[TASKID_DUMB], 200, RTEMS_MINIMUM_STACK_SIZE * 2,
292 Task_name[TASKID_DUMB], TASK_PRIORITY_DUMB, RTEMS_MINIMUM_STACK_SIZE * 2,
299 293 RTEMS_DEFAULT_MODES,
300 294 RTEMS_DEFAULT_ATTRIBUTES, &Task_id[TASKID_DUMB]
301 295 );
302 296 // HOUS
303 297 status = rtems_task_create(
304 Task_name[TASKID_HOUS], 199, RTEMS_MINIMUM_STACK_SIZE * 2,
298 Task_name[TASKID_HOUS], TASK_PRIORITY_HOUS, RTEMS_MINIMUM_STACK_SIZE * 2,
305 299 RTEMS_DEFAULT_MODES,
306 300 RTEMS_DEFAULT_ATTRIBUTES, &Task_id[TASKID_HOUS]
307 301 );
308 302 // MATR
309 303 status = rtems_task_create(
310 Task_name[TASKID_MATR], 250, RTEMS_MINIMUM_STACK_SIZE * 2,
304 Task_name[TASKID_MATR], TASK_PRIORITY_MATR, RTEMS_MINIMUM_STACK_SIZE * 2,
311 305 RTEMS_DEFAULT_MODES,
312 306 RTEMS_DEFAULT_ATTRIBUTES | RTEMS_FLOATING_POINT, &Task_id[TASKID_MATR]
313 307 );
314 308 // CWF3
315 309 status = rtems_task_create(
316 Task_name[TASKID_CWF3], 250, RTEMS_MINIMUM_STACK_SIZE * 2,
310 Task_name[TASKID_CWF3], TASK_PRIORITY_CWF3, RTEMS_MINIMUM_STACK_SIZE * 2,
317 311 RTEMS_DEFAULT_MODES,
318 312 RTEMS_DEFAULT_ATTRIBUTES, &Task_id[TASKID_CWF3]
319 313 );
314 // CWF2
315 status = rtems_task_create(
316 Task_name[TASKID_CWF2], TASK_PRIORITY_CWF2, RTEMS_MINIMUM_STACK_SIZE * 2,
317 RTEMS_DEFAULT_MODES,
318 RTEMS_DEFAULT_ATTRIBUTES, &Task_id[TASKID_CWF2]
319 );
320 // CWF1
321 status = rtems_task_create(
322 Task_name[TASKID_CWF1], TASK_PRIORITY_CWF1, RTEMS_MINIMUM_STACK_SIZE * 2,
323 RTEMS_DEFAULT_MODES,
324 RTEMS_DEFAULT_ATTRIBUTES, &Task_id[TASKID_CWF1]
325 );
326 // SEND
327 status = rtems_task_create(
328 Task_name[TASKID_SEND], TASK_PRIORITY_SEND, RTEMS_MINIMUM_STACK_SIZE * 2,
329 RTEMS_DEFAULT_MODES,
330 RTEMS_DEFAULT_ATTRIBUTES, &Task_id[TASKID_SEND]
331 );
320 332
321 333 return 0;
322 334 }
323 335
324 336 int start_all_tasks( void )
325 337 {
326 338 rtems_status_code status;
327 339
328 340 status = rtems_task_start( Task_id[TASKID_SPIQ], spiq_task, 1 );
329 341 if (status!=RTEMS_SUCCESSFUL) {
330 342 PRINTF("in INIT *** Error starting TASK_SPIQ\n")
331 343 }
332 344
333 345 status = rtems_task_start( Task_id[TASKID_RECV], recv_task, 1 );
334 346 if (status!=RTEMS_SUCCESSFUL) {
335 347 PRINTF("in INIT *** Error starting TASK_RECV\n")
336 348 }
337 349
338 350 status = rtems_task_start( Task_id[TASKID_ACTN], actn_task, 1 );
339 351 if (status!=RTEMS_SUCCESSFUL) {
340 352 PRINTF("in INIT *** Error starting TASK_ACTN\n")
341 353 }
342 354
343 355 status = rtems_task_start( Task_id[TASKID_SMIQ], smiq_task, 1 );
344 356 if (status!=RTEMS_SUCCESSFUL) {
345 357 PRINTF("in INIT *** Error starting TASK_BPPR\n")
346 358 }
347 359
348 360 status = rtems_task_start( Task_id[TASKID_STAT], stat_task, 1 );
349 361 if (status!=RTEMS_SUCCESSFUL) {
350 362 PRINTF("in INIT *** Error starting TASK_STAT\n")
351 363 }
352 364
353 365 status = rtems_task_start( Task_id[TASKID_AVF0], avf0_task, 1 );
354 366 if (status!=RTEMS_SUCCESSFUL) {
355 367 PRINTF("in INIT *** Error starting TASK_AVF0\n")
356 368 }
357 369
358 370 status = rtems_task_start( Task_id[TASKID_BPF0], bpf0_task, 1 );
359 371 if (status!=RTEMS_SUCCESSFUL) {
360 372 PRINTF("in INIT *** Error starting TASK_BPF0\n")
361 373 }
362 374
363 375 status = rtems_task_start( Task_id[TASKID_WFRM], wfrm_task, 1 );
364 376 if (status!=RTEMS_SUCCESSFUL) {
365 377 PRINTF("in INIT *** Error starting TASK_WFRM\n")
366 378 }
367 379
368 380 status = rtems_task_start( Task_id[TASKID_DUMB], dumb_task, 1 );
369 381 if (status!=RTEMS_SUCCESSFUL) {
370 382 PRINTF("in INIT *** Error starting TASK_DUMB\n")
371 383 }
372 384
373 385 status = rtems_task_start( Task_id[TASKID_HOUS], hous_task, 1 );
374 386 if (status!=RTEMS_SUCCESSFUL) {
375 387 PRINTF("in INIT *** Error starting TASK_HOUS\n")
376 388 }
377 389
378 390 status = rtems_task_start( Task_id[TASKID_MATR], matr_task, 1 );
379 391 if (status!=RTEMS_SUCCESSFUL) {
380 392 PRINTF("in INIT *** Error starting TASK_MATR\n")
381 393 }
382 394
383 395 status = rtems_task_start( Task_id[TASKID_CWF3], cwf3_task, 1 );
384 396 if (status!=RTEMS_SUCCESSFUL) {
385 397 PRINTF("in INIT *** Error starting TASK_CWF3\n")
386 398 }
387 399
400 status = rtems_task_start( Task_id[TASKID_CWF2], cwf2_task, 1 );
401 if (status!=RTEMS_SUCCESSFUL) {
402 PRINTF("in INIT *** Error starting TASK_CWF2\n")
403 }
404
405 status = rtems_task_start( Task_id[TASKID_CWF1], cwf1_task, 1 );
406 if (status!=RTEMS_SUCCESSFUL) {
407 PRINTF("in INIT *** Error starting TASK_CWF1\n")
408 }
409 status = rtems_task_start( Task_id[TASKID_SEND], send_task, 1 );
410 if (status!=RTEMS_SUCCESSFUL) {
411 PRINTF("in INIT *** Error starting TASK_SEND\n")
412 }
413
388 414 return 0;
389 415 }
390 416
391 // SPACEWIRE
392
393 rtems_task spiq_task(rtems_task_argument unused)
394 {
395 rtems_event_set event_out;
396 rtems_status_code status;
397 unsigned char lfrMode;
398
399 while(true){
400 PRINTF("in SPIQ *** Waiting for SPW_LINKERR_EVENT\n")
401 rtems_event_receive(SPW_LINKERR_EVENT, RTEMS_WAIT, RTEMS_NO_TIMEOUT, &event_out); // wait for an SPW_LINKERR_EVENT
402
403 lfrMode = (housekeeping_packet.lfr_status_word[0] & 0xf0) >> 4; // get the current mode
404
405 status = spacewire_wait_for_link();
406
407 if (status != RTEMS_SUCCESSFUL)
408 {
409 //****************
410 // STOP THE SYSTEM
411 spacewire_compute_stats_offsets();
412 stop_current_mode();
413 if (rtems_task_suspend(Task_id[TASKID_RECV])!=RTEMS_SUCCESSFUL) { // suspend RECV task
414 PRINTF("in SPIQ *** Error suspending RECV Task\n")
415 }
416 if (rtems_task_suspend(Task_id[TASKID_HOUS])!=RTEMS_SUCCESSFUL) { // suspend HOUS task
417 PRINTF("in SPIQ *** Error suspending HOUS Task\n")
418 }
419
420 //***************************
421 // RESTART THE SPACEWIRE LINK
422 spacewire_configure_link();
423
424 //*******************
425 // RESTART THE SYSTEM
426 //ioctl(fdSPW, SPACEWIRE_IOCTRL_CLR_STATISTICS); // clear statistics
427 status = rtems_task_restart( Task_id[TASKID_HOUS], 1 );
428 if (status != RTEMS_SUCCESSFUL) {
429 PRINTF1("in SPIQ *** Error restarting HOUS Task *** code %d\n", status)
430 }
431 if (rtems_task_restart(Task_id[TASKID_RECV], 1) != RTEMS_SUCCESSFUL) { // restart RECV task
432 PRINTF("in SPIQ *** Error restarting RECV Task\n")
433 }
434 //enter_mode(lfrMode, NULL); // enter the mode that was running before the SpaceWire interruption
435 }
436 }
437 }
438
439 int spacewire_configure_link( void )
417 int create_message_queues( void )
440 418 {
441 419 rtems_status_code status;
442 420
443 close(fdSPW); // close the device if it is already open
444 PRINTF("OK *** in configure_spw_link *** try to open "GRSPW_DEVICE_NAME"\n")
445 fdSPW = open(GRSPW_DEVICE_NAME, O_RDWR); // open the device. the open call reset the hardware
446 if ( fdSPW<0 ) {
447 PRINTF("ERR *** in configure_spw_link *** Error opening"GRSPW_DEVICE_NAME"\n")
448 }
449
450 while(ioctl(fdSPW, SPACEWIRE_IOCTRL_START, -1) != RTEMS_SUCCESSFUL){
451 PRINTF(".")
452 fflush( stdout );
453 close( fdSPW ); // close the device
454 fdSPW = open( GRSPW_DEVICE_NAME, O_RDWR ); // open the device. the open call reset the hardware
455 if (fdSPW<0) {
456 PRINTF("ERR *** In configure_spw_link *** Error opening"GRSPW_DEVICE_NAME"\n")
457 }
458 rtems_task_wake_after(100);
459 }
460
461 PRINTF("OK *** In configure_spw_link *** "GRSPW_DEVICE_NAME" opened and started successfully\n")
462
463 spacewire_set_NP(1, REGS_ADDR_GRSPW); // No Port force
464 spacewire_set_RE(1, REGS_ADDR_GRSPW); // the dedicated call seems to break the no port force configuration
421 misc_name[0] = rtems_build_name( 'Q', 'U', 'E', 'U' );
422 misc_name[1] = rtems_build_name( 'P', 'K', 'T', 'S' );
465 423
466 status = ioctl(fdSPW, SPACEWIRE_IOCTRL_SET_RXBLOCK, 1); // sets the blocking mode for reception
467 if (status!=RTEMS_SUCCESSFUL) PRINTF("in SPIQ *** Error SPACEWIRE_IOCTRL_SET_RXBLOCK\n")
468 //
469 status = ioctl(fdSPW, SPACEWIRE_IOCTRL_SET_EVENT_ID, Task_id[TASKID_SPIQ]); // sets the task ID to which an event is sent when a
470 if (status!=RTEMS_SUCCESSFUL) PRINTF("in SPIQ *** Error SPACEWIRE_IOCTRL_SET_EVENT_ID\n") // link-error interrupt occurs
471 //
472 status = ioctl(fdSPW, SPACEWIRE_IOCTRL_SET_DISABLE_ERR, 0); // automatic link-disabling due to link-error interrupts
473 if (status!=RTEMS_SUCCESSFUL) PRINTF("in SPIQ *** Error SPACEWIRE_IOCTRL_SET_DISABLE_ERR\n")
474 //
475 status = ioctl(fdSPW, SPACEWIRE_IOCTRL_SET_LINK_ERR_IRQ, 1); // sets the link-error interrupt bit
476 if (status!=RTEMS_SUCCESSFUL) PRINTF("in SPIQ *** Error SPACEWIRE_IOCTRL_SET_LINK_ERR_IRQ\n")
477 //
478 status = ioctl(fdSPW, SPACEWIRE_IOCTRL_SET_TXBLOCK, 0); // transmission blocks
479 if (status!=RTEMS_SUCCESSFUL) PRINTF("in SPIQ *** Error SPACEWIRE_IOCTRL_SET_TXBLOCK\n")
480 //
481 status = ioctl(fdSPW, SPACEWIRE_IOCTRL_SET_TXBLOCK_ON_FULL, 0); // transmission blocks on full
482 if (status!=RTEMS_SUCCESSFUL) PRINTF("in SPIQ *** Error SPACEWIRE_IOCTRL_SET_TXBLOCK_ON_FULL\n")
483 //
484 status = ioctl(fdSPW, SPACEWIRE_IOCTRL_SET_TCODE_CTRL, 0x0909);
485 if (status!=RTEMS_SUCCESSFUL) PRINTF("in SPIQ *** Error SPACEWIRE_IOCTRL_SET_TCODE_CTRL,\n")
486
487 PRINTF("OK *** in configure_spw_link *** "GRSPW_DEVICE_NAME" configured successfully\n")
488
489 return RTEMS_SUCCESSFUL;
490 }
491
492 int spacewire_wait_for_link(void)
493 {
494 unsigned int i;
495 int linkStatus;
496 rtems_status_code status = RTEMS_UNSATISFIED;
497
498 for(i = 0; i< 10; i++){
499 PRINTF(".")
500 fflush( stdout );
501 ioctl(fdSPW, SPACEWIRE_IOCTRL_GET_LINK_STATUS, &linkStatus); // get the link status
502 PRINTF1("in spacewire_wait_for_link *** link status is: %s\n", lstates[linkStatus])
503 if ( linkStatus == 5) {
504 PRINTF("in spacewire_wait_for_link *** link is running\n")
505 status = RTEMS_SUCCESSFUL;
506 break;
507 }
508 rtems_task_wake_after(100);
509 }
510
511 return status;
424 status = rtems_message_queue_create( misc_name[0], ACTION_MSG_QUEUE_COUNT, CCSDS_TC_PKT_MAX_SIZE,
425 RTEMS_FIFO | RTEMS_LOCAL, &misc_id[0] );
426 if (status!=RTEMS_SUCCESSFUL) {
427 PRINTF("in create_message_queues *** error creating QUEU\n")
512 428 }
513 429
514 void spacewire_set_NP(unsigned char val, unsigned int regAddr) // [N]o [P]ort force
515 {
516 unsigned int *spwptr = (unsigned int*) regAddr;
517
518 if (val == 1) {
519 *spwptr = *spwptr | 0x00100000; // [NP] set the No port force bit
520 }
521 if (val== 0) {
522 *spwptr = *spwptr & 0xffdfffff;
523 }
524 }
525
526 void spacewire_set_RE(unsigned char val, unsigned int regAddr) // [R]MAP [E]nable
527 {
528 unsigned int *spwptr = (unsigned int*) regAddr;
529
530 if (val == 1)
531 {
532 *spwptr = *spwptr | 0x00010000; // [RE] set the RMAP Enable bit
533 }
534 if (val== 0)
535 {
536 *spwptr = *spwptr & 0xfffdffff;
537 }
430 status = rtems_message_queue_create( misc_name[1], ACTION_MSG_PKTS_COUNT, sizeof(spw_ioctl_pkt_send),
431 RTEMS_FIFO | RTEMS_LOCAL, &misc_id[1] );
432 if (status!=RTEMS_SUCCESSFUL) {
433 PRINTF("in create_message_queues *** error creating PKTS\n")
538 434 }
539 435
540 void spacewire_compute_stats_offsets()
541 {
542 spw_stats spacewire_stats_grspw;
543 rtems_status_code status;
544
545 status = ioctl( fdSPW, SPACEWIRE_IOCTRL_GET_STATISTICS, &spacewire_stats_grspw );
546
547 spacewire_stats_backup.packets_received = spacewire_stats_grspw.packets_received
548 + spacewire_stats.packets_received;
549 spacewire_stats_backup.packets_sent = spacewire_stats_grspw.packets_sent
550 + spacewire_stats.packets_sent;
551 spacewire_stats_backup.parity_err = spacewire_stats_grspw.parity_err
552 + spacewire_stats.parity_err;
553 spacewire_stats_backup.disconnect_err = spacewire_stats_grspw.disconnect_err
554 + spacewire_stats.disconnect_err;
555 spacewire_stats_backup.escape_err = spacewire_stats_grspw.escape_err
556 + spacewire_stats.escape_err;
557 spacewire_stats_backup.credit_err = spacewire_stats_grspw.credit_err
558 + spacewire_stats.credit_err;
559 spacewire_stats_backup.write_sync_err = spacewire_stats_grspw.write_sync_err
560 + spacewire_stats.write_sync_err;
561 spacewire_stats_backup.rx_rmap_header_crc_err = spacewire_stats_grspw.rx_rmap_header_crc_err
562 + spacewire_stats.rx_rmap_header_crc_err;
563 spacewire_stats_backup.rx_rmap_data_crc_err = spacewire_stats_grspw.rx_rmap_data_crc_err
564 + spacewire_stats.rx_rmap_data_crc_err;
565 spacewire_stats_backup.early_ep = spacewire_stats_grspw.early_ep
566 + spacewire_stats.early_ep;
567 spacewire_stats_backup.invalid_address = spacewire_stats_grspw.invalid_address
568 + spacewire_stats.invalid_address;
569 spacewire_stats_backup.rx_eep_err = spacewire_stats_grspw.rx_eep_err
570 + spacewire_stats.rx_eep_err;
571 spacewire_stats_backup.rx_truncated = spacewire_stats_grspw.rx_truncated
572 + spacewire_stats.rx_truncated;
436 return 0;
573 437 }
574
575 rtems_status_code write_spw(spw_ioctl_pkt_send* spw_ioctl_send)
576 {
577 rtems_status_code status;
578 status = ioctl( fdSPW, SPACEWIRE_IOCTRL_SEND, spw_ioctl_send );
579 if (status != RTEMS_SUCCESSFUL){
580 //PRINTF1("ERR *** in write_spw *** write operation failed with code: %d\n", status)
581 }
582 return status;
583 }
584
585 void timecode_irq_handler(void *pDev, void *regs, int minor, unsigned int tc)
586 {
587 if (rtems_event_send( Task_id[TASKID_DUMB], RTEMS_EVENT_1 ) != RTEMS_SUCCESSFUL) {
588 printf("In timecode_irq_handler *** Error sending event to DUMB\n");
589 }
590 }
@@ -1,241 +1,254
1 1 #include <fsw_misc.h>
2 2 #include <fsw_params.h>
3 3
4 extern rtems_id Task_id[]; /* array of task ids */
5 extern int fdSPW;
6 extern TMHeader_t housekeeping_header;
7 extern char housekeeping_data[];
8 extern Packet_TM_LFR_HK_t housekeeping_packet;
9
10 4 int configure_timer(gptimer_regs_t *gptimer_regs, unsigned char timer, unsigned int clock_divider,
11 5 unsigned char interrupt_level, rtems_isr (*timer_isr)() )
12 6 { // configure the timer for the waveforms simulation
13 7 rtems_status_code status;
14 8 rtems_isr_entry old_isr_handler;
15 9
16 10 status = rtems_interrupt_catch( timer_isr, interrupt_level, &old_isr_handler) ; // see sparcv8.pdf p.76 for interrupt levels
17 11 if (status==RTEMS_SUCCESSFUL)
18 12 {
19 13 PRINTF("In configure_timer *** rtems_interrupt_catch successfullly configured\n")
20 14 }
21 15
22 16 timer_set_clock_divider( gptimer_regs, timer, clock_divider);
23 17
24 18 return 1;
25 19 }
26 20
27 21 int timer_start(gptimer_regs_t *gptimer_regs, unsigned char timer)
28 22 {
29 23 gptimer_regs->timer[timer].ctrl = gptimer_regs->timer[timer].ctrl | 0x00000010; // clear pending IRQ if any
30 24 gptimer_regs->timer[timer].ctrl = gptimer_regs->timer[timer].ctrl | 0x00000004; // LD load value from the reload register
31 25 gptimer_regs->timer[timer].ctrl = gptimer_regs->timer[timer].ctrl | 0x00000001; // EN enable the timer
32 26 gptimer_regs->timer[timer].ctrl = gptimer_regs->timer[timer].ctrl | 0x00000002; // RS restart
33 27 gptimer_regs->timer[timer].ctrl = gptimer_regs->timer[timer].ctrl | 0x00000008; // IE interrupt enable
34 28
35 29 return 1;
36 30 }
37 31
38 32 int timer_stop(gptimer_regs_t *gptimer_regs, unsigned char timer)
39 33 {
40 34 gptimer_regs->timer[timer].ctrl = gptimer_regs->timer[timer].ctrl & 0xfffffffe; // EN enable the timer
41 35 gptimer_regs->timer[timer].ctrl = gptimer_regs->timer[timer].ctrl & 0xffffffef; // IE interrupt enable
42 36 gptimer_regs->timer[timer].ctrl = gptimer_regs->timer[timer].ctrl | 0x00000010; // clear pending IRQ if any
43 37
44 38 return 1;
45 39 }
46 40
47 41 int timer_set_clock_divider(gptimer_regs_t *gptimer_regs, unsigned char timer, unsigned int clock_divider)
48 42 {
49 43 gptimer_regs->timer[timer].reload = clock_divider; // base clock frequency is 1 MHz
50 44
51 45 return 1;
52 46 }
53 47
54 48 void update_spacewire_statistics()
55 49 {
56 50 rtems_status_code status;
57 51 spw_stats spacewire_stats_grspw;
58 52
59 53 status = ioctl( fdSPW, SPACEWIRE_IOCTRL_GET_STATISTICS, &spacewire_stats_grspw );
60 54
61 55 spacewire_stats.packets_received = spacewire_stats_backup.packets_received
62 56 + spacewire_stats_grspw.packets_received;
63 57 spacewire_stats.packets_sent = spacewire_stats_backup.packets_sent
64 58 + spacewire_stats_grspw.packets_sent;
65 59 spacewire_stats.parity_err = spacewire_stats_backup.parity_err
66 60 + spacewire_stats_grspw.parity_err;
67 61 spacewire_stats.disconnect_err = spacewire_stats_backup.disconnect_err
68 62 + spacewire_stats_grspw.disconnect_err;
69 63 spacewire_stats.escape_err = spacewire_stats_backup.escape_err
70 64 + spacewire_stats_grspw.escape_err;
71 65 spacewire_stats.credit_err = spacewire_stats_backup.credit_err
72 66 + spacewire_stats_grspw.credit_err;
73 67 spacewire_stats.write_sync_err = spacewire_stats_backup.write_sync_err
74 68 + spacewire_stats_grspw.write_sync_err;
75 69 spacewire_stats.rx_rmap_header_crc_err = spacewire_stats_backup.rx_rmap_header_crc_err
76 70 + spacewire_stats_grspw.rx_rmap_header_crc_err;
77 71 spacewire_stats.rx_rmap_data_crc_err = spacewire_stats_backup.rx_rmap_data_crc_err
78 72 + spacewire_stats_grspw.rx_rmap_data_crc_err;
79 73 spacewire_stats.early_ep = spacewire_stats_backup.early_ep
80 74 + spacewire_stats_grspw.early_ep;
81 75 spacewire_stats.invalid_address = spacewire_stats_backup.invalid_address
82 76 + spacewire_stats_grspw.invalid_address;
83 77 spacewire_stats.rx_eep_err = spacewire_stats_backup.rx_eep_err
84 78 + spacewire_stats_grspw.rx_eep_err;
85 79 spacewire_stats.rx_truncated = spacewire_stats_backup.rx_truncated
86 80 + spacewire_stats_grspw.rx_truncated;
87 81 //spacewire_stats.tx_link_err;
88 82
89 83 //****************************
90 84 // DPU_SPACEWIRE_IF_STATISTICS
91 85 housekeeping_packet.hk_lfr_dpu_spw_pkt_rcv_cnt[0] = (unsigned char) (spacewire_stats.packets_received >> 8);
92 86 housekeeping_packet.hk_lfr_dpu_spw_pkt_rcv_cnt[1] = (unsigned char) (spacewire_stats.packets_received);
93 87 housekeeping_packet.hk_lfr_dpu_spw_pkt_sent_cnt[0] = (unsigned char) (spacewire_stats.packets_sent >> 8);
94 88 housekeeping_packet.hk_lfr_dpu_spw_pkt_sent_cnt[1] = (unsigned char) (spacewire_stats.packets_sent);
95 89 //housekeeping_packet.hk_lfr_dpu_spw_tick_out_cnt;
96 90 //housekeeping_packet.hk_lfr_dpu_spw_last_timc;
97 91
98 92 //******************************************
99 93 // ERROR COUNTERS / SPACEWIRE / LOW SEVERITY
100 94 housekeeping_packet.hk_lfr_dpu_spw_parity = (unsigned char) spacewire_stats.parity_err;
101 95 housekeeping_packet.hk_lfr_dpu_spw_disconnect = (unsigned char) spacewire_stats.disconnect_err;
102 96 housekeeping_packet.hk_lfr_dpu_spw_escape = (unsigned char) spacewire_stats.escape_err;
103 97 housekeeping_packet.hk_lfr_dpu_spw_credit = (unsigned char) spacewire_stats.credit_err;
104 98 housekeeping_packet.hk_lfr_dpu_spw_write_sync = (unsigned char) spacewire_stats.write_sync_err;
105 99 // housekeeping_packet.hk_lfr_dpu_spw_rx_ahb;
106 100 // housekeeping_packet.hk_lfr_dpu_spw_tx_ahb;
107 101 housekeeping_packet.hk_lfr_dpu_spw_header_crc = (unsigned char) spacewire_stats.rx_rmap_header_crc_err;
108 102 housekeeping_packet.hk_lfr_dpu_spw_data_crc = (unsigned char) spacewire_stats.rx_rmap_data_crc_err;
109 103
110 104 //*********************************************
111 105 // ERROR COUNTERS / SPACEWIRE / MEDIUM SEVERITY
112 106 housekeeping_packet.hk_lfr_dpu_spw_early_eop = (unsigned char) spacewire_stats.early_ep;
113 107 housekeeping_packet.hk_lfr_dpu_spw_invalid_addr = (unsigned char) spacewire_stats.invalid_address;
114 108 housekeeping_packet.hk_lfr_dpu_spw_eep = (unsigned char) spacewire_stats.rx_eep_err;
115 109 housekeeping_packet.hk_lfr_dpu_spw_rx_too_big = (unsigned char) spacewire_stats.rx_truncated;
116 110
117 111 }
118 112
119 113 int send_console_outputs_on_apbuart_port( void ) // Send the console outputs on the apbuart port
120 114 {
121 115 struct apbuart_regs_str *apbuart_regs = (struct apbuart_regs_str *) REGS_ADDR_APBUART;
122 116
123 117 apbuart_regs->ctrl = apbuart_regs->ctrl & APBUART_CTRL_REG_MASK_DB;
124 118 PRINTF("\n\n\n\n\nIn INIT *** Now the console is on port COM1\n")
125 119
126 120 return 0;
127 121 }
128 122
129 123 int set_apbuart_scaler_reload_register(unsigned int regs, unsigned int value)
130 124 {
131 125 struct apbuart_regs_str *apbuart_regs = (struct apbuart_regs_str *) regs;
132 126
133 127 apbuart_regs->scaler = value;
134 128 PRINTF1("OK *** apbuart port scaler reload register set to 0x%x\n", value)
135 129
136 130 return 0;
137 131 }
138 132
139 133 //************
140 134 // RTEMS TASKS
141 135
142 136 rtems_task stat_task(rtems_task_argument argument)
143 137 {
144 138 int i;
145 139 int j;
146 140 i = 0;
147 141 j = 0;
148 142 PRINTF("in STAT *** \n")
149 143 while(1){
150 144 rtems_task_wake_after(1000);
151 145 PRINTF1("%d\n", j)
152 if (i == 2) {
153 #ifdef PRINT_TASK_STATISTICS
154 rtems_cpu_usage_report();
155 rtems_cpu_usage_reset();
156 #endif
146 if (i == CPU_USAGE_REPORT_PERIOD) {
147 // #ifdef PRINT_TASK_STATISTICS
148 // rtems_cpu_usage_report();
149 // rtems_cpu_usage_reset();
150 // #endif
157 151 i = 0;
158 152 }
159 153 else i++;
160 154 j++;
161 155 }
162 156 }
163 157
164 158 rtems_task hous_task(rtems_task_argument argument)
165 159 {
166 int result;
167 160 rtems_status_code status;
161 spw_ioctl_pkt_send spw_ioctl_send;
162
163 spw_ioctl_send.hlen = 0;
164 spw_ioctl_send.hdr = NULL;
165 spw_ioctl_send.dlen = sizeof(spw_ioctl_send);
166 spw_ioctl_send.data = (char*) &housekeeping_packet;
167 spw_ioctl_send.options = 0;
168 168
169 169 PRINTF("in HOUS ***\n")
170 170
171 171 if (rtems_rate_monotonic_ident( HK_name, &HK_id) != RTEMS_SUCCESSFUL) {
172 172 status = rtems_rate_monotonic_create( HK_name, &HK_id );
173 173 if( status != RTEMS_SUCCESSFUL ) {
174 174 PRINTF1( "rtems_rate_monotonic_create failed with status of %d\n", status )
175 175 }
176 176 }
177 177
178 178 housekeeping_packet.targetLogicalAddress = CCSDS_DESTINATION_ID;
179 179 housekeeping_packet.protocolIdentifier = CCSDS_PROTOCOLE_ID;
180 housekeeping_packet.reserved = 0x00;
181 housekeeping_packet.userApplication = 0x00;
180 housekeeping_packet.reserved = DEFAULT_RESERVED;
181 housekeeping_packet.userApplication = CCSDS_USER_APP;
182 182 housekeeping_packet.packetID[0] = (unsigned char) (TM_PACKET_ID_HK >> 8);
183 183 housekeeping_packet.packetID[1] = (unsigned char) (TM_PACKET_ID_HK);
184 housekeeping_packet.packetSequenceControl[0] = 0xc0;
185 housekeeping_packet.packetSequenceControl[1] = 0x00;
186 housekeeping_packet.packetLength[0] = 0x00;
187 housekeeping_packet.packetLength[1] = 0x77;
188 housekeeping_packet.dataFieldHeader[0] = 0x10;
189 housekeeping_packet.dataFieldHeader[1] = TM_TYPE_HK;
190 housekeeping_packet.dataFieldHeader[2] = TM_SUBTYPE_HK;
191 housekeeping_packet.dataFieldHeader[3] = TM_DESTINATION_ID_GROUND;
184 housekeeping_packet.packetSequenceControl[0] = TM_PACKET_SEQ_CTRL_STANDALONE;
185 housekeeping_packet.packetSequenceControl[1] = TM_PACKET_SEQ_CNT_DEFAULT;
186 housekeeping_packet.packetLength[0] = (unsigned char) (PACKET_LENGTH_HK >> 8);
187 housekeeping_packet.packetLength[1] = (unsigned char) (PACKET_LENGTH_HK );
188 housekeeping_packet.spare1_pusVersion_spare2 = DEFAULT_SPARE1_PUSVERSION_SPARE2;
189 housekeeping_packet.serviceType = TM_TYPE_HK;
190 housekeeping_packet.serviceSubType = TM_SUBTYPE_HK;
191 housekeeping_packet.destinationID = TM_DESTINATION_ID_GROUND;
192 192
193 193 status = rtems_rate_monotonic_cancel(HK_id);
194 194 if( status != RTEMS_SUCCESSFUL ) {
195 195 PRINTF1( "ERR *** in HOUS *** rtems_rate_monotonic_cancel(HK_id) ***code: %d\n", status )
196 196 }
197 197 else {
198 198 PRINTF("OK *** in HOUS *** rtems_rate_monotonic_cancel(HK_id)\n")
199 199 }
200 200
201 201 while(1){ // launch the rate monotonic task
202 202 status = rtems_rate_monotonic_period( HK_id, HK_PERIOD );
203 203 if ( status != RTEMS_SUCCESSFUL ) {
204 204 PRINTF1( "ERR *** in HOUS *** rtems_rate_monotonic_period *** code %d\n", status);
205 205 }
206 206 else {
207 housekeeping_packet.dataFieldHeader[4] = (unsigned char) (time_management_regs->coarse_time>>24);
208 housekeeping_packet.dataFieldHeader[5] = (unsigned char) (time_management_regs->coarse_time>>16);
209 housekeeping_packet.dataFieldHeader[6] = (unsigned char) (time_management_regs->coarse_time>>8);
210 housekeeping_packet.dataFieldHeader[7] = (unsigned char) (time_management_regs->coarse_time);
211 housekeeping_packet.dataFieldHeader[8] = (unsigned char) (time_management_regs->fine_time>>8);
212 housekeeping_packet.dataFieldHeader[9] = (unsigned char) (time_management_regs->fine_time);
207 housekeeping_packet.time[0] = (unsigned char) (time_management_regs->coarse_time>>24);
208 housekeeping_packet.time[1] = (unsigned char) (time_management_regs->coarse_time>>16);
209 housekeeping_packet.time[2] = (unsigned char) (time_management_regs->coarse_time>>8);
210 housekeeping_packet.time[3] = (unsigned char) (time_management_regs->coarse_time);
211 housekeeping_packet.time[4] = (unsigned char) (time_management_regs->fine_time>>8);
212 housekeeping_packet.time[5] = (unsigned char) (time_management_regs->fine_time);
213 213 housekeeping_packet.sid = SID_HK;
214 214
215 215 update_spacewire_statistics();
216 216
217 217 // SEND PACKET
218 result = write ( fdSPW, &housekeeping_packet, LEN_TM_LFR_HK);
219 if (status == -1) {
220 while (true) {
218 //result = write( fdSPW, &housekeeping_packet, LEN_TM_LFR_HK);
219 status = rtems_message_queue_send( misc_id[1], &spw_ioctl_send, sizeof(spw_ioctl_send));
221 220 if (status != RTEMS_SUCCESSFUL) {
222 result = write ( fdSPW, &housekeeping_packet, LEN_TM_LFR_HK);
223 PRINTF("x")
224 sched_yield();
225 }
226 else {
227 PRINTF("\n")
228 break;
229 }
230 }
221 PRINTF1("in HOUS *** ERR %d\n", (int) status)
231 222 }
232 223 }
233 224 }
234 225
235 226 PRINTF("in HOUS *** deleting task\n")
236 227
237 228 status = rtems_task_delete( RTEMS_SELF ); // should not return
238 229 printf( "rtems_task_delete returned with status of %d.\n", status );
239 230 exit( 1 );
240 231 }
241 232
233 rtems_task send_task( rtems_task_argument argument)
234 {
235 rtems_status_code status; // RTEMS status code
236 spw_ioctl_pkt_send spw_ioctl_send_CWF; // incoming spw_ioctl_pkt_send structure
237 size_t size; // size of the incoming TC packet
238
239 PRINTF("in SEND *** \n")
240
241 while(1)
242 {
243 status = rtems_message_queue_receive(misc_id[1], (char*) &spw_ioctl_send_CWF, &size,
244 RTEMS_WAIT, RTEMS_NO_TIMEOUT);
245 if (status!=RTEMS_SUCCESSFUL) PRINTF1("ERR *** in task ACTN *** error receiving a message, code %d \n", status)
246 else
247 {
248 status = write_spw(&spw_ioctl_send_CWF);
249 if (status != RTEMS_SUCCESSFUL) {
250 PRINTF("in SEND *** TRAFFIC JAM\n")
251 }
252 }
253 }
254 }
@@ -1,1306 +1,1288
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 void updateLFRCurrentMode()
76 {
77 lfrCurrentMode = (housekeeping_packet.lfr_status_word[0] & 0xf0) >> 4;
78 }
79
75 80 //*********************
76 81 // ACCEPTANCE FUNCTIONS
77 82 int TC_acceptance(ccsdsTelecommandPacket_t *TC, unsigned int tc_len_recv)
78 83 {
79 84 int ret = 0;
80 85 rtems_status_code status;
81 spw_ioctl_pkt_send spw_ioctl_send;
82 TMHeader_t TM_header;
83 unsigned int code = 0;
86 Packet_TM_LFR_TC_EXE_CORRUPTED_t packet;
87 unsigned int parserCode = 0;
84 88 unsigned char computed_CRC[2];
85 char data[ PACKET_LENGTH_TC_EXE_CORRUPTED + CCSDS_TC_TM_PACKET_OFFSET - TM_HEADER_LEN ];
89 unsigned int packetLength;
86 90
87 91 GetCRCAsTwoBytes( (unsigned char*) TC->packetID, computed_CRC, tc_len_recv + 5 );
88 code = TC_parser( TC, tc_len_recv ) ;
89 if ( (code == ILLEGAL_APID) | (code == WRONG_LEN_PACKET) | (code == INCOR_CHECKSUM)
90 | (code == ILL_TYPE) | (code == ILL_SUBTYPE) | (code == WRONG_APP_DATA) )
92 parserCode = TC_parser( TC, tc_len_recv ) ;
93 if ( (parserCode == ILLEGAL_APID) | (parserCode == WRONG_LEN_PACKET) | (parserCode == INCOR_CHECKSUM)
94 | (parserCode == ILL_TYPE) | (parserCode == ILL_SUBTYPE) | (parserCode == WRONG_APP_DATA) )
91 95 { // generate TM_LFR_TC_EXE_CORRUPTED
92 // BUILD HEADER
93 TM_build_header( TM_LFR_TC_EXE_ERR, PACKET_LENGTH_TC_EXE_CORRUPTED,
94 &TM_header, TC->sourceID); // TC source ID
95 // BUILD DATA
96 TM_build_data( TC, data, SID_EXE_CORR, computed_CRC);
97 // PREPARE TM SENDING
98 spw_ioctl_send.hlen = TM_HEADER_LEN + 4; // + 4 is for the protocole extra header
99 spw_ioctl_send.hdr = (char*) &TM_header;
100 spw_ioctl_send.dlen = 16;
101 spw_ioctl_send.data = data;
96 packetLength = (TC->packetLength[0] * 256) + TC->packetLength[1];
97 packet.targetLogicalAddress = CCSDS_DESTINATION_ID;
98 packet.protocolIdentifier = CCSDS_PROTOCOLE_ID;
99 packet.reserved = DEFAULT_RESERVED;
100 packet.userApplication = CCSDS_USER_APP;
101 // PACKET HEADER
102 packet.packetID[0] = (unsigned char) (TM_PACKET_ID_TC_EXE >> 8);
103 packet.packetID[1] = (unsigned char) (TM_PACKET_ID_TC_EXE );
104 packet.packetSequenceControl[0] = TM_PACKET_SEQ_CTRL_STANDALONE;
105 packet.packetSequenceControl[1] = TM_PACKET_SEQ_CNT_DEFAULT;
106 packet.packetLength[0] = (unsigned char) (PACKET_LENGTH_TC_EXE_CORRUPTED >> 8);
107 packet.packetLength[1] = (unsigned char) (PACKET_LENGTH_TC_EXE_CORRUPTED );
108 // DATA FIELD HEADER
109 packet.spare1_pusVersion_spare2 = DEFAULT_SPARE1_PUSVERSION_SPARE2;
110 packet.serviceType = TM_TYPE_TC_EXE;
111 packet.serviceSubType = TM_SUBTYPE_EXE_NOK;
112 packet.destinationID = TM_DESTINATION_ID_GROUND;
113 packet.time[0] = (time_management_regs->coarse_time>>24 );
114 packet.time[1] = (time_management_regs->coarse_time>>16 );
115 packet.time[2] = (time_management_regs->coarse_time>>8 );
116 packet.time[3] = (time_management_regs->coarse_time );
117 packet.time[4] = (time_management_regs->fine_time>>8 );
118 packet.time[5] = (time_management_regs->fine_time );
119 //
120 packet.tc_failure_code[0] = (unsigned char) (FAILURE_CODE_CORRUPTED >> 8);
121 packet.tc_failure_code[1] = (unsigned char) (FAILURE_CODE_CORRUPTED );
122 packet.telecommand_pkt_id[0] = TC->packetID[0];
123 packet.telecommand_pkt_id[1] = TC->packetID[1];
124 packet.pkt_seq_control[0] = TC->packetSequenceControl[0];
125 packet.pkt_seq_control[0] = TC->packetSequenceControl[1];
126 packet.tc_service = TC->serviceType;
127 packet.tc_subtype = TC->serviceSubType;
128 packet.pkt_len_rcv_value[0] = TC->packetLength[0];
129 packet.pkt_len_rcv_value[1] = TC->packetLength[1];
130 packet.pkt_datafieldsize_cnt[0] = currentTC_LEN_RCV[0];
131 packet.pkt_datafieldsize_cnt[1] = currentTC_LEN_RCV[1];
132 packet.rcv_crc[0] = TC->dataAndCRC[packetLength];
133 packet.rcv_crc[1] = TC->dataAndCRC[packetLength];
134 packet.computed_crc[0] = computed_CRC[0];
135 packet.computed_crc[1] = computed_CRC[1];
102 136 // SEND PACKET
103 status = ioctl( fdSPW, SPACEWIRE_IOCTRL_SEND, &spw_ioctl_send );
137 status = write( fdSPW, (char *) &packet, PACKET_LENGTH_TC_EXE_CORRUPTED + CCSDS_TC_TM_PACKET_OFFSET + 4);
104 138 }
105 139 else { // send valid TC to the action launcher
106 140 status = rtems_message_queue_send( misc_id[0], TC, tc_len_recv + CCSDS_TC_TM_PACKET_OFFSET + 3);
107 141 ret = -1;
108 142 }
109 143 return ret;
110 144 }
111 145
112 146 unsigned char TC_parser(ccsdsTelecommandPacket_t * TMPacket, unsigned int TC_LEN_RCV)
113 147 {
114 148 unsigned char ret = 0;
115 149 unsigned char pid = 0;
116 150 unsigned char category = 0;
117 151 unsigned int length = 0;
118 152 unsigned char packetType = 0;
119 153 unsigned char packetSubtype = 0;
120 154 unsigned char * CCSDSContent = NULL;
121 155
122 156 // APID check *** APID on 2 bytes
123 157 pid = ((TMPacket->packetID[0] & 0x07)<<4) + ( (TMPacket->packetID[1]>>4) & 0x0f ); // PID = 11 *** 7 bits xxxxx210 7654xxxx
124 158 category = (TMPacket->packetID[1] & 0x0f); // PACKET_CATEGORY = 12 *** 4 bits xxxxxxxx xxxx3210
125 159 length = (TMPacket->packetLength[0] * 256) + TMPacket->packetLength[1];
126 160 packetType = TMPacket->serviceType;
127 161 packetSubtype = TMPacket->serviceSubType;
128 162
129 163 if ( pid != CCSDS_PROCESS_ID ) {
130 164 ret = ILLEGAL_APID;
131 165 }
132 166 else if ( category != CCSDS_PACKET_CATEGORY ) {
133 167 ret = ILLEGAL_APID;
134 168 }
135 169 else if (length != TC_LEN_RCV ) { // packet length check
136 170 ret = WRONG_LEN_PACKET; // LEN RCV != SIZE FIELD
137 171 }
138 172 else if ( length >= CCSDS_TC_PKT_MAX_SIZE ) {
139 173 ret = WRONG_LEN_PACKET; // check that the packet does not exceed the MAX size
140 174 }
141 175 else if ( packetType == TC_TYPE_GEN ){ // service type, subtype and packet length check
142 176 switch(packetSubtype){ //subtype, autorized values are 3, 20, 21, 24, 27, 28, 30, 40, 50, 60, 61
143 177 case TC_SUBTYPE_RESET:
144 178 if (length!=(TC_LEN_RESET-CCSDS_TC_TM_PACKET_OFFSET)) {
145 179 ret = WRONG_LEN_PACKET;
146 180 }
147 181 else {
148 182 ret = CCSDS_TM_VALID;
149 183 }
150 184 break;
151 185 case TC_SUBTYPE_LOAD_COMM:
152 186 if (length!=(TC_LEN_LOAD_COMM-CCSDS_TC_TM_PACKET_OFFSET)) {
153 187 ret = WRONG_LEN_PACKET;
154 188 }
155 189 else {
156 190 ret = CCSDS_TM_VALID;
157 191 }
158 192 break;
159 193 case TC_SUBTYPE_LOAD_NORM:
160 194 if (length!=(TC_LEN_LOAD_NORM-CCSDS_TC_TM_PACKET_OFFSET)) {
161 195 ret = WRONG_LEN_PACKET;
162 196 }
163 197 else {
164 198 ret = CCSDS_TM_VALID;
165 199 }
166 200 break;
167 201 case TC_SUBTYPE_LOAD_BURST:
168 202 if (length!=(TC_LEN_LOAD_BURST-CCSDS_TC_TM_PACKET_OFFSET)) {
169 203 ret = WRONG_LEN_PACKET;
170 204 }
171 205 else {
172 206 ret = CCSDS_TM_VALID;
173 207 }
174 208 break;
175 209 case TC_SUBTYPE_LOAD_SBM1:
176 210 if (length!=(TC_LEN_LOAD_SBM1-CCSDS_TC_TM_PACKET_OFFSET)) {
177 211 ret = WRONG_LEN_PACKET;
178 212 }
179 213 else {
180 214 ret = CCSDS_TM_VALID;
181 215 }
182 216 break;
183 217 case TC_SUBTYPE_LOAD_SBM2:
184 218 if (length!=(TC_LEN_LOAD_SBM2-CCSDS_TC_TM_PACKET_OFFSET)) {
185 219 ret = WRONG_LEN_PACKET;
186 220 }
187 221 else {
188 222 ret = CCSDS_TM_VALID;
189 223 }
190 224 break;
191 225 case TC_SUBTYPE_DUMP:
192 226 if (length!=(TC_LEN_DUMP-CCSDS_TC_TM_PACKET_OFFSET)) {
193 227 ret = WRONG_LEN_PACKET;
194 228 }
195 229 else {
196 230 ret = CCSDS_TM_VALID;
197 231 }
198 232 break;
199 233 case TC_SUBTYPE_ENTER:
200 234 if (length!=(TC_LEN_ENTER-CCSDS_TC_TM_PACKET_OFFSET)) {
201 235 ret = WRONG_LEN_PACKET;
202 236 }
203 237 else {
204 238 ret = CCSDS_TM_VALID;
205 239 }
206 240 break;
207 241 case TC_SUBTYPE_UPDT_INFO:
208 242 if (length!=(TC_LEN_UPDT_INFO-CCSDS_TC_TM_PACKET_OFFSET)) {
209 243 ret = WRONG_LEN_PACKET;
210 244 }
211 245 else {
212 246 ret = CCSDS_TM_VALID;
213 247 }
214 248 break;
215 249 case TC_SUBTYPE_EN_CAL:
216 250 if (length!=(TC_LEN_EN_CAL-CCSDS_TC_TM_PACKET_OFFSET)) {
217 251 ret = WRONG_LEN_PACKET;
218 252 }
219 253 else {
220 254 ret = CCSDS_TM_VALID;
221 255 }
222 256 break;
223 257 case TC_SUBTYPE_DIS_CAL:
224 258 if (length!=(TC_LEN_DIS_CAL-CCSDS_TC_TM_PACKET_OFFSET)) {
225 259 ret = WRONG_LEN_PACKET;
226 260 }
227 261 else {
228 262 ret = CCSDS_TM_VALID;
229 263 }
230 264 break;
231 265 default:
232 266 ret = ILL_SUBTYPE;
233 267 break;
234 268 }
235 269 }
236 270 else if ( packetType == TC_TYPE_TIME ){
237 271 if (packetSubtype!=TC_SUBTYPE_UPDT_TIME) {
238 272 ret = ILL_SUBTYPE;
239 273 }
240 274 else if (length!=(TC_LEN_UPDT_TIME-CCSDS_TC_TM_PACKET_OFFSET)) {
241 275 ret = WRONG_LEN_PACKET;
242 276 }
243 277 else {
244 278 ret = CCSDS_TM_VALID;
245 279 }
246 280 }
247 281 else {
248 282 ret = ILL_TYPE;
249 283 }
250 284
251 285 // source ID check // Source ID not documented in the ICD
252 286
253 287 // packet error control, CRC check
254 288 if ( ret == CCSDS_TM_VALID ) {
255 289 CCSDSContent = (unsigned char*) TMPacket->packetID;
256 290 GetCRCAsTwoBytes(CCSDSContent, currentTC_COMPUTED_CRC, length + CCSDS_TC_TM_PACKET_OFFSET - 2); // 2 CRC bytes removed from the calculation of the CRC
257 291 if (currentTC_COMPUTED_CRC[0] != CCSDSContent[length + CCSDS_TC_TM_PACKET_OFFSET -2]) {
258 292 ret = INCOR_CHECKSUM;
259 293 }
260 294 else if (currentTC_COMPUTED_CRC[1] != CCSDSContent[length + CCSDS_TC_TM_PACKET_OFFSET -1]) {
261 295 ret = INCOR_CHECKSUM;
262 296 }
263 297 else {
264 298 ret = CCSDS_TM_VALID;
265 299 }
266 300 }
267 301
268 302 return ret;
269 303 }
270 304
271 305 unsigned char TM_build_header( enum TM_TYPE tm_type, unsigned int packetLength,
272 306 TMHeader_t *TMHeader, unsigned char tc_sid)
273 307 {
274 308 TMHeader->targetLogicalAddress = CCSDS_DESTINATION_ID;
275 309 TMHeader->protocolIdentifier = CCSDS_PROTOCOLE_ID;
276 310 TMHeader->reserved = 0x00;
277 311 TMHeader->userApplication = 0x00;
278 312 TMHeader->packetID[0] = 0x0c;
279 313 TMHeader->packetSequenceControl[0] = 0xc0;
280 314 TMHeader->packetSequenceControl[1] = 0x00;
281 315 TMHeader->packetLength[0] = (unsigned char) (packetLength>>8);
282 316 TMHeader->packetLength[1] = (unsigned char) packetLength;
283 317 TMHeader->spare1_pusVersion_spare2 = 0x10;
284 318 TMHeader->destinationID = TM_DESTINATION_ID_GROUND; // default destination id
285 319 switch (tm_type){
286 320 case(TM_LFR_TC_EXE_OK):
287 321 TMHeader->packetID[1] = (unsigned char) TM_PACKET_ID_TC_EXE;
288 322 TMHeader->serviceType = TM_TYPE_TC_EXE; // type
289 323 TMHeader->serviceSubType = TM_SUBTYPE_EXE_OK; // subtype
290 324 TMHeader->destinationID = tc_sid; // destination id
291 325 break;
292 326 case(TM_LFR_TC_EXE_ERR):
293 327 TMHeader->packetID[1] = (unsigned char) TM_PACKET_ID_TC_EXE;
294 328 TMHeader->serviceType = TM_TYPE_TC_EXE; // type
295 329 TMHeader->serviceSubType = TM_SUBTYPE_EXE_NOK; // subtype
296 330 TMHeader->destinationID = tc_sid;
297 331 break;
298 332 case(TM_LFR_HK):
299 333 TMHeader->packetID[1] = (unsigned char) TM_PACKET_ID_HK;
300 334 TMHeader->serviceType = TM_TYPE_HK; // type
301 335 TMHeader->serviceSubType = TM_SUBTYPE_HK; // subtype
302 336 break;
303 337 case(TM_LFR_SCI):
304 338 TMHeader->packetID[1] = (unsigned char) TM_PACKET_ID_SCIENCE_NORMAL;
305 339 TMHeader->serviceType = TM_TYPE_LFR_SCIENCE; // type
306 340 TMHeader->serviceSubType = TM_SUBTYPE_SCIENCE; // subtype
307 341 break;
308 342 case(TM_LFR_SCI_SBM):
309 343 TMHeader->packetID[1] = (unsigned char) TM_PACKET_ID_SCIENCE_BURST_SBM1_SBM2;
310 344 TMHeader->serviceType = TM_TYPE_LFR_SCIENCE; // type
311 345 TMHeader->serviceSubType = TM_SUBTYPE_SCIENCE; // subtype
312 346 break;
313 347 case(TM_LFR_PAR_DUMP):
314 348 TMHeader->packetID[1] = (unsigned char) TM_PACKET_ID_PARAMETER_DUMP;
315 349 TMHeader->serviceType = TM_TYPE_HK; // type
316 350 TMHeader->serviceSubType = TM_SUBTYPE_HK; // subtype
317 351 break;
318 352 default:
319 353 return 0;
320 354 }
321 355 TMHeader->time[0] = (unsigned char) (time_management_regs->coarse_time>>24);
322 356 TMHeader->time[1] = (unsigned char) (time_management_regs->coarse_time>>16);
323 357 TMHeader->time[2] = (unsigned char) (time_management_regs->coarse_time>>8);
324 358 TMHeader->time[3] = (unsigned char) (time_management_regs->coarse_time);
325 359 TMHeader->time[4] = (unsigned char) (time_management_regs->fine_time>>8);
326 360 TMHeader->time[5] = (unsigned char) (time_management_regs->fine_time);
327 361
328 362 return LFR_SUCCESSFUL;
329 363 }
330 364
331 unsigned char TM_build_data(ccsdsTelecommandPacket_t *TC, char* data, unsigned int SID, unsigned char *computed_CRC)
332 {
333 unsigned int packetLength;
334 packetLength = (TC->packetLength[0] * 256) + TC->packetLength[1];
335 switch (SID){
336 case (SID_NOT_EXE):
337 break;
338 case (SID_NOT_IMP):
339 data[0] = (unsigned char) (SID_NOT_IMP >> 8);
340 data[1] = (unsigned char) SID_NOT_IMP;
341 data[2] = TC->packetID[0];
342 data[3] = TC->packetID[1];
343 data[4] = TC->packetSequenceControl[0];
344 data[5] = TC->packetSequenceControl[1];
345 data[6] = TC->serviceType; // type
346 data[7] = TC->serviceSubType; // subtype
347 break;
348 case (SID_EXE_ERR):
349 break;
350 case (SID_EXE_CORR):
351 data[0] = (unsigned char) (SID_EXE_CORR >> 8);
352 data[1] = (unsigned char) SID_EXE_CORR;
353 data[2] = TC->packetID[0];
354 data[3] = TC->packetID[1];
355 data[4] = TC->packetSequenceControl[0];
356 data[5] = TC->packetSequenceControl[1];
357 data[6] = TC->serviceType; // type
358 data[7] = TC->serviceSubType; // subtype
359 data[8] = currentTC_LEN_RCV[0];
360 data[9] = currentTC_LEN_RCV[1];
361 data[10] = TC->packetLength[0];
362 data[11] = TC->packetLength[1];
363 data[12] = TC->dataAndCRC[packetLength];
364 data[13] = TC->dataAndCRC[packetLength+1];
365 data[14] = computed_CRC[0];
366 data[15] = computed_CRC[1];
367 break;
368 default:
369 return 0;
370 }
371 return 1;
372 }
373
374 int create_message_queue( void )
375 {
376 rtems_status_code status;
377 misc_name[0] = rtems_build_name( 'Q', 'U', 'E', 'U' );
378 status = rtems_message_queue_create( misc_name[0], ACTION_MSG_QUEUE_COUNT, CCSDS_TC_PKT_MAX_SIZE,
379 RTEMS_FIFO | RTEMS_LOCAL, &misc_id[0] );
380 if (status!=RTEMS_SUCCESSFUL) {
381 PRINTF("in create_message_queue *** error creating message queue\n")
382 }
383
384 return 0;
385 }
386
387 365 //***********
388 366 // RTEMS TASK
389 367 rtems_task recv_task( rtems_task_argument unused )
390 368 {
391 369 int len = 0;
392 370 unsigned int i = 0;
393 371 unsigned int data_length = 0;
394 372 ccsdsTelecommandPacket_t currentTC;
395 373 char data[100];
396 374
397 375 for(i=0; i<100; i++) data[i] = 0;
398 376
399 377 PRINTF("in RECV *** \n")
400 378
401 379 while(1)
402 380 {
403 381 len = read(fdSPW, (char*) &currentTC, CCSDS_TC_PKT_MAX_SIZE); // the call to read is blocking
404 382 if (len == -1){ // error during the read call
405 383 PRINTF("In RECV *** last read call returned -1\n")
406 384 //if (rtems_event_send( Task_id[TASKID_SPIQ], SPW_LINKERR_EVENT ) != RTEMS_SUCCESSFUL) {
407 385 // PRINTF("IN RECV *** Error: rtems_event_send SPW_LINKERR_EVENT\n")
408 386 //}
409 387 //if (rtems_task_suspend(RTEMS_SELF) != RTEMS_SUCCESSFUL) {
410 388 // PRINTF("In RECV *** Error: rtems_task_suspend(RTEMS_SELF)\n")
411 389 //}
412 390 }
413 391 else {
414 392 PRINTF1("Got pck of length %d\n", len+1)
415 393 if ( (len+1) < CCSDS_TC_PKT_MIN_SIZE ) {
416 394 PRINTF("In RECV *** packet lenght too short\n")
417 395 }
418 396 else {
419 397 currentTC_LEN_RCV[0] = 0x00;
420 398 currentTC_LEN_RCV[1] = (unsigned char) (len - CCSDS_TC_TM_PACKET_OFFSET - 3); // build the corresponding packet size field
421 399 currentTC_LEN_RCV_AsUnsignedInt = (unsigned int) (len - CCSDS_TC_TM_PACKET_OFFSET - 3); // => -3 is for Prot ID, Reserved and User App bytes
422 400 // CHECK THE TC AND BUILD THE APPROPRIATE TM
423 401 data_length = TC_acceptance(&currentTC, currentTC_LEN_RCV_AsUnsignedInt);
424 402 if (data_length!=-1)
425 403 {
426 404 }
427 405 }
428 406 }
429 407 }
430 408 }
431 409
432 410 rtems_task actn_task( rtems_task_argument unused )
433 411 {
434 412 int result;
435 413 rtems_status_code status; // RTEMS status code
436 414 ccsdsTelecommandPacket_t TC; // TC sent to the ACTN task
437 415 size_t size; // size of the incoming TC packet
438 416 unsigned char subtype; // subtype of the current TC packet
439 417
440 418 result = LFR_SUCCESSFUL;
441 419 subtype = 0; // subtype of the current TC packet
442 420
443 421 PRINTF("in ACTN *** \n")
444 422
445 423 while(1)
446 424 {
447 425 status = rtems_message_queue_receive(misc_id[0], (char*) &TC, &size,
448 426 RTEMS_WAIT, RTEMS_NO_TIMEOUT);
449 427 if (status!=RTEMS_SUCCESSFUL) PRINTF1("ERR *** in task ACTN *** error receiving a message, code %d \n", status)
450 428 else
451 429 {
452 430 subtype = TC.serviceSubType;
453 431 switch(subtype)
454 432 {
455 433 case TC_SUBTYPE_RESET:
456 result = action_default( &TC );
434 result = action_reset( &TC );
435 close_action( &TC, result );
457 436 break;
458 437 //
459 438 case TC_SUBTYPE_LOAD_COMM:
460 result = action_load_comm( &TC );
439 result = action_load_common_par( &TC );
461 440 close_action( &TC, result );
462 441 break;
463 442 //
464 443 case TC_SUBTYPE_LOAD_NORM:
465 result = action_load_norm( &TC );
444 result = action_load_normal_par( &TC );
466 445 close_action( &TC, result );
467 446 break;
468 447 //
469 448 case TC_SUBTYPE_LOAD_BURST:
470 result = action_load_burst( &TC );
449 result = action_load_burst_par( &TC );
471 450 close_action( &TC, result );
472 451 break;
473 452 //
474 453 case TC_SUBTYPE_LOAD_SBM1:
475 result = action_load_sbm1( &TC );
454 result = action_load_sbm1_par( &TC );
476 455 close_action( &TC, result );
477 456 break;
478 457 //
479 458 case TC_SUBTYPE_LOAD_SBM2:
480 result = action_load_sbm2( &TC );
459 result = action_load_sbm2_par( &TC );
481 460 close_action( &TC, result );
482 461 break;
483 462 //
484 463 case TC_SUBTYPE_DUMP:
485 result = action_dump( &TC );
464 result = action_dump_par( &TC );
486 465 close_action( &TC, result );
487 466 break;
488 467 //
489 468 case TC_SUBTYPE_ENTER:
490 result = action_enter( &TC );
469 result = action_enter_mode( &TC );
491 470 close_action( &TC, result );
492 471 break;
493 472 //
494 473 case TC_SUBTYPE_UPDT_INFO:
495 result = action_updt_info( &TC );
474 result = action_update_info( &TC );
496 475 close_action( &TC, result );
497 476 break;
498 477 //
499 478 case TC_SUBTYPE_EN_CAL:
500 479 result = action_enable_calibration( &TC );
501 480 close_action( &TC, result );
502 481 break;
503 482 //
504 483 case TC_SUBTYPE_DIS_CAL:
505 484 result = action_disable_calibration( &TC );
506 485 close_action( &TC, result );
507 486 break;
508 487 //
509 488 case TC_SUBTYPE_UPDT_TIME:
510 result = action_updt_time( &TC );
489 result = action_update_time( &TC );
490 close_action( &TC, result );
511 491 break;
512 492 //
513 493 default:
514 494 break;
515 495 }
516 496 }
517 497 }
518 498 }
519 499
520 500 rtems_task dumb_task( rtems_task_argument unused )
521 501 {
522 502 unsigned int i;
523 503 unsigned int intEventOut;
524 504 unsigned int coarse_time = 0;
525 505 unsigned int fine_time = 0;
526 506 rtems_event_set event_out;
527 507
528 508 PRINTF("in DUMB *** \n")
529 509
530 510 while(1){
531 511 rtems_event_receive(RTEMS_EVENT_0 | RTEMS_EVENT_1 | RTEMS_EVENT_2 | RTEMS_EVENT_3 | RTEMS_EVENT_4 | RTEMS_EVENT_5,
532 512 RTEMS_WAIT | RTEMS_EVENT_ANY, RTEMS_NO_TIMEOUT, &event_out); // wait for an RTEMS_EVENT
533 513 intEventOut = (unsigned int) event_out;
534 514 for ( i=0; i<32; i++)
535 515 {
536 516 if ( ((intEventOut >> i) & 0x0001) != 0)
537 517 {
538 518 coarse_time = time_management_regs->coarse_time;
539 519 fine_time = time_management_regs->fine_time;
540 520 printf("in DUMB *** time = coarse: %x, fine: %x, %s\n", coarse_time, fine_time, DumbMessages[i]);
541 521 }
542 522 }
543 523 }
544 524 }
545 525
546 526 //***********
547 527 // TC ACTIONS
548 528
549 int action_default(ccsdsTelecommandPacket_t *TC)
529 int action_reset(ccsdsTelecommandPacket_t *TC)
550 530 {
551 rtems_status_code status;
552 TMHeader_t header;
553 spw_ioctl_pkt_send spw_ioctl_send;
554 unsigned char data[10];
555
556 TM_build_header( TM_LFR_TC_EXE_ERR, PACKET_LENGTH_TC_EXE_NOT_IMPLEMENTED,
557 &header, TC->sourceID);
558
559 spw_ioctl_send.hlen = TM_HEADER_LEN + 4;
560 spw_ioctl_send.hdr = (char *) &header;
561 spw_ioctl_send.dlen = 8;
562 spw_ioctl_send.data = (char *) data;
563 spw_ioctl_send.options = 0;
564
565 data[0] = (char) (FAILURE_CODE_NOT_IMPLEMENTED >> 8);
566 data[1] = (char) FAILURE_CODE_NOT_IMPLEMENTED;
567 data[2] = TC->packetID[0];
568 data[3] = TC->packetID[1];
569 data[4] = TC->packetSequenceControl[0];
570 data[5] = TC->packetSequenceControl[1];
571 data[6] = TC->serviceType; // type
572 data[7] = TC->serviceSubType; // subtype
573
574 // SEND DATA
575 status = write_spw(&spw_ioctl_send);
576 if (status != RTEMS_SUCCESSFUL)
577 {
578 PRINTF("ERR *** in action_default *** send TM packet\n")
579 }
580
531 send_tm_lfr_tc_exe_not_implemented( TC );
581 532 return LFR_DEFAULT;
582 533 }
583 534
584 int action_enter(ccsdsTelecommandPacket_t *TC)
585 {
586 rtems_status_code status;
587 unsigned char requestedMode;
588
589 requestedMode = TC->dataAndCRC[1];
590
591 printf("try to enter mode %d\n", requestedMode);
592
593 status = transition_validation(requestedMode);
594
595 if ( status == LFR_SUCCESSFUL ) {
596 if ( (housekeeping_packet.lfr_status_word[0] & 0xf0) != LFR_MODE_STANDBY)
597 {
598 status = stop_current_mode();
599 }
600 if (status != RTEMS_SUCCESSFUL)
601 {
602 PRINTF("ERR *** in action_enter *** stop_current_mode\n")
603 }
604 status = enter_mode(requestedMode, TC);
605 }
606 else
607 {
608 PRINTF("ERR *** in action_enter *** transition rejected\n")
609 send_tm_lfr_tc_exe_not_executable( TC );
610 }
611
612 return status;
613 }
614
615 int action_load_comm(ccsdsTelecommandPacket_t *TC)
535 int action_load_common_par(ccsdsTelecommandPacket_t *TC)
616 536 {
617 537 parameter_dump_packet.unused0 = TC->dataAndCRC[0];
618 538 parameter_dump_packet.bw_sp0_sp1_r0_r1 = TC->dataAndCRC[1];
619 539
620 540 set_wfp_data_shaping(parameter_dump_packet.bw_sp0_sp1_r0_r1);
621 541
622 542 return LFR_SUCCESSFUL;
623 543 }
624 544
625 int action_load_norm(ccsdsTelecommandPacket_t *TC)
545 int action_load_normal_par(ccsdsTelecommandPacket_t *TC)
626 546 {
627 547 int result;
628 548 unsigned char lfrMode;
629 549
630 550 lfrMode = (housekeeping_packet.lfr_status_word[0] & 0xf0) >> 4;
631 551
632 552 if ( lfrMode == LFR_MODE_NORMAL ) {
633 553 send_tm_lfr_tc_exe_not_executable( TC );
634 554 result = LFR_DEFAULT;
635 555 }
636 556 else {
637 557 parameter_dump_packet.sy_lfr_n_swf_l[0] = TC->dataAndCRC[0];
638 558 parameter_dump_packet.sy_lfr_n_swf_l[1] = TC->dataAndCRC[1];
639 559
640 560 parameter_dump_packet.sy_lfr_n_swf_p[0] = TC->dataAndCRC[2];
641 561 parameter_dump_packet.sy_lfr_n_swf_p[1] = TC->dataAndCRC[3];
642 562
643 563 parameter_dump_packet.sy_lfr_n_asm_p[0] = TC->dataAndCRC[4];
644 564 parameter_dump_packet.sy_lfr_n_asm_p[1] = TC->dataAndCRC[5];
645 565
646 566 parameter_dump_packet.sy_lfr_n_bp_p0 = TC->dataAndCRC[6];
647 567 parameter_dump_packet.sy_lfr_n_bp_p1 = TC->dataAndCRC[7];
648 568
649 569 result = LFR_SUCCESSFUL;
650 570 }
651 571
652 572 return result;
653 573 }
654 574
655 int action_load_burst(ccsdsTelecommandPacket_t *TC)
575 int action_load_burst_par(ccsdsTelecommandPacket_t *TC)
656 576 {
657 577 int result;
658 578 unsigned char lfrMode;
659 579
660 580 result = LFR_DEFAULT;
661 581 lfrMode = (housekeeping_packet.lfr_status_word[0] & 0xf0) >> 4;
662 582
663 583 if ( lfrMode == LFR_MODE_BURST ) {
664 584 send_tm_lfr_tc_exe_not_executable( TC );
665 585 result = LFR_DEFAULT;
666 586 }
667 587 else {
668 588 parameter_dump_packet.sy_lfr_b_bp_p0 = TC->dataAndCRC[0];
669 589 parameter_dump_packet.sy_lfr_b_bp_p1 = TC->dataAndCRC[1];
670 590
671 591 result = LFR_SUCCESSFUL;
672 592 }
673 593
674 594 return result;
675 595 }
676 596
677 int action_load_sbm1(ccsdsTelecommandPacket_t *TC)
597 int action_load_sbm1_par(ccsdsTelecommandPacket_t *TC)
678 598 {
679 599 int result;
680 600 unsigned char lfrMode;
681 601
682 602 result = LFR_DEFAULT;
683 603 lfrMode = (housekeeping_packet.lfr_status_word[0] & 0xf0) >> 4;
684 604
685 605 if ( lfrMode == LFR_MODE_SBM1 ) {
686 606 send_tm_lfr_tc_exe_not_executable( TC );
687 607 result = LFR_DEFAULT;
688 608 }
689 609 else {
690 610 parameter_dump_packet.sy_lfr_s1_bp_p0 = TC->dataAndCRC[0];
691 611 parameter_dump_packet.sy_lfr_s1_bp_p1 = TC->dataAndCRC[1];
692 612
693 613 result = LFR_SUCCESSFUL;
694 614 }
695 615
696 616 return result;
697 617 }
698 618
699 int action_load_sbm2(ccsdsTelecommandPacket_t *TC)
619 int action_load_sbm2_par(ccsdsTelecommandPacket_t *TC)
700 620 {
701 621 int result;
702 622 unsigned char lfrMode;
703 623
704 624 result = LFR_DEFAULT;
705 625 lfrMode = (housekeeping_packet.lfr_status_word[0] & 0xf0) >> 4;
706 626
707 627 if ( lfrMode == LFR_MODE_SBM2 ) {
708 628 send_tm_lfr_tc_exe_not_executable( TC );
709 629 result = LFR_DEFAULT;
710 630 }
711 631 else {
712 632 parameter_dump_packet.sy_lfr_s2_bp_p0 = TC->dataAndCRC[0];
713 633 parameter_dump_packet.sy_lfr_s2_bp_p1 = TC->dataAndCRC[1];
714 634
715 635 result = LFR_SUCCESSFUL;
716 636 }
717 637
718 638 return result;
719 639 }
720 640
721 int action_dump(ccsdsTelecommandPacket_t *TC)
641 int action_dump_par(ccsdsTelecommandPacket_t *TC)
722 642 {
723 643 int status;
724 644 // send parameter dump packet
725 645 status = write(fdSPW, (char *) &parameter_dump_packet,
726 646 PACKET_LENGTH_PARAMETER_DUMP + CCSDS_TC_TM_PACKET_OFFSET + 4);
727 647 if (status == -1)
728 648 {
729 649 PRINTF1("in action_dump *** ERR sending packet, code %d", status)
730 650 status = RTEMS_UNSATISFIED;
731 651 }
732 652 else
733 653 {
734 654 status = RTEMS_SUCCESSFUL;
735 655 }
736 656
737 657 return status;
738 658 }
739 659
740 int action_updt_info(ccsdsTelecommandPacket_t *TC) {
660 int action_enter_mode(ccsdsTelecommandPacket_t *TC)
661 {
662 rtems_status_code status;
663 unsigned char requestedMode;
664
665 requestedMode = TC->dataAndCRC[1];
666
667 printf("try to enter mode %d\n", requestedMode);
668
669 #ifdef PRINT_TASK_STATISTICS
670 if (requestedMode != LFR_MODE_STANDBY)
671 {
672 rtems_cpu_usage_reset();
673 }
674 #endif
675
676 status = transition_validation(requestedMode);
677
678 if ( status == LFR_SUCCESSFUL ) {
679 if ( lfrCurrentMode != LFR_MODE_STANDBY)
680 {
681 status = stop_current_mode();
682 }
683 if (status != RTEMS_SUCCESSFUL)
684 {
685 PRINTF("ERR *** in action_enter *** stop_current_mode\n")
686 }
687 status = enter_mode(requestedMode, TC);
688 }
689 else
690 {
691 PRINTF("ERR *** in action_enter *** transition rejected\n")
692 send_tm_lfr_tc_exe_not_executable( TC );
693 }
694
695 return status;
696 }
697
698 int action_update_info(ccsdsTelecommandPacket_t *TC) {
741 699 unsigned int val;
742 700 int result;
743 701 unsigned char lfrMode;
744 702
745 703 result = LFR_DEFAULT;
746 704 lfrMode = (housekeeping_packet.lfr_status_word[0] & 0xf0) >> 4;
747 705
748 706 if ( (lfrMode == LFR_MODE_STANDBY) ) {
749 send_tm_lfr_tc_exe_not_executable( TC );
707 send_tm_lfr_tc_exe_not_implemented( TC );
750 708 result = LFR_DEFAULT;
751 709 }
752 710 else {
753 711 val = housekeeping_packet.hk_lfr_update_info_tc_cnt[0] * 256
754 712 + housekeeping_packet.hk_lfr_update_info_tc_cnt[1];
755 713 val++;
756 714 housekeeping_packet.hk_lfr_update_info_tc_cnt[0] = (unsigned char) (val >> 8);
757 715 housekeeping_packet.hk_lfr_update_info_tc_cnt[1] = (unsigned char) (val);
758 716 result = LFR_SUCCESSFUL;
759 717 }
760 718
761 719 return result;
762 720 }
763 721
764 722 int action_enable_calibration(ccsdsTelecommandPacket_t *TC)
765 723 {
766 724 int result;
767 725 unsigned char lfrMode;
768 726
769 727 result = LFR_DEFAULT;
770 728 lfrMode = (housekeeping_packet.lfr_status_word[0] & 0xf0) >> 4;
771 729
772 730 if ( (lfrMode == LFR_MODE_STANDBY) | (lfrMode == LFR_MODE_BURST) | (lfrMode == LFR_MODE_SBM2) ) {
773 731 send_tm_lfr_tc_exe_not_executable( TC );
774 732 result = LFR_DEFAULT;
775 733 }
776 734 else {
777 735 send_tm_lfr_tc_exe_not_implemented( TC );
778 736 result = LFR_DEFAULT;
779 737 }
780 738 return result;
781 739 }
782 740
783 741 int action_disable_calibration(ccsdsTelecommandPacket_t *TC)
784 742 {
785 743 int result;
786 744 unsigned char lfrMode;
787 745
788 746 result = LFR_DEFAULT;
789 747 lfrMode = (housekeeping_packet.lfr_status_word[0] & 0xf0) >> 4;
790 748
791 749 if ( (lfrMode == LFR_MODE_STANDBY) | (lfrMode == LFR_MODE_BURST) | (lfrMode == LFR_MODE_SBM2) ) {
792 750 send_tm_lfr_tc_exe_not_executable( TC );
793 751 result = LFR_DEFAULT;
794 752 }
795 753 else {
796 754 send_tm_lfr_tc_exe_not_implemented( TC );
797 755 result = LFR_DEFAULT;
798 756 }
799 757 return result;
800 758 }
801 759
802 int action_updt_time(ccsdsTelecommandPacket_t *TC)
760 int action_update_time(ccsdsTelecommandPacket_t *TC)
803 761 {
804 762 unsigned int val;
805 763
806 764 time_management_regs->coarse_time_load = (TC->dataAndCRC[0] << 24)
807 765 + (TC->dataAndCRC[1] << 16)
808 766 + (TC->dataAndCRC[2] << 8)
809 767 + TC->dataAndCRC[3];
810 768 val = housekeeping_packet.hk_lfr_update_time_tc_cnt[0] * 256
811 769 + housekeeping_packet.hk_lfr_update_time_tc_cnt[1];
812 770 val++;
813 771 housekeeping_packet.hk_lfr_update_time_tc_cnt[0] = (unsigned char) (val >> 8);
814 772 housekeeping_packet.hk_lfr_update_time_tc_cnt[1] = (unsigned char) (val);
815 //time_management_regs->ctrl = time_management_regs->ctrl | 1;
773 time_management_regs->ctrl = time_management_regs->ctrl | 1;
816 774
817 775 return LFR_SUCCESSFUL;
818 776 }
819 777
820 778 //*******************
821 779 // ENTERING THE MODES
822 780
823 781 int transition_validation(unsigned char requestedMode)
824 782 {
825 783 int status;
826 unsigned char lfrMode;
827
828 lfrMode = (housekeeping_packet.lfr_status_word[0] & 0xf0) >> 4;
829 784
830 785 switch (requestedMode)
831 786 {
832 787 case LFR_MODE_STANDBY:
833 if ( lfrMode == LFR_MODE_STANDBY ) {
788 if ( lfrCurrentMode == LFR_MODE_STANDBY ) {
834 789 status = LFR_DEFAULT;
835 790 }
836 791 else
837 792 {
838 793 status = LFR_SUCCESSFUL;
839 794 }
840 795 break;
841 796 case LFR_MODE_NORMAL:
842 if ( lfrMode == LFR_MODE_NORMAL ) {
797 if ( lfrCurrentMode == LFR_MODE_NORMAL ) {
843 798 status = LFR_DEFAULT;
844 799 }
845 800 else {
846 801 status = LFR_SUCCESSFUL;
847 802 }
848 803 break;
849 804 case LFR_MODE_BURST:
850 if ( lfrMode == LFR_MODE_BURST ) {
805 if ( lfrCurrentMode == LFR_MODE_BURST ) {
851 806 status = LFR_DEFAULT;
852 807 }
853 808 else {
854 809 status = LFR_SUCCESSFUL;
855 810 }
856 811 break;
857 812 case LFR_MODE_SBM1:
858 if ( lfrMode == LFR_MODE_SBM1 ) {
813 if ( lfrCurrentMode == LFR_MODE_SBM1 ) {
859 814 status = LFR_DEFAULT;
860 815 }
861 816 else {
862 817 status = LFR_SUCCESSFUL;
863 818 }
864 819 break;
865 820 case LFR_MODE_SBM2:
866 if ( lfrMode == LFR_MODE_SBM2 ) {
821 if ( lfrCurrentMode == LFR_MODE_SBM2 ) {
867 822 status = LFR_DEFAULT;
868 823 }
869 824 else {
870 825 status = LFR_SUCCESSFUL;
871 826 }
872 827 break;
873 828 default:
874 829 status = LFR_DEFAULT;
875 830 break;
876 831 }
877 832
878 833 return status;
879 834 }
880 835
881 836 int stop_current_mode()
882 837 {
883 838 rtems_status_code status;
884 839 unsigned char lfrMode;
885 840
886 841 status = RTEMS_SUCCESSFUL;
887 842 lfrMode = (housekeeping_packet.lfr_status_word[0] & 0xf0) >> 4; // get the current mode
888 843
889 844 // mask all IRQ lines related to signal processing
890 845 LEON_Mask_interrupt( IRQ_SM ); // mask spectral matrices interrupt (coming from the timer VHDL IP)
891 846 LEON_Clear_interrupt( IRQ_SM ); // clear spectral matrices interrupt (coming from the timer VHDL IP)
892 847
893 848 #ifdef GSA
894 849 LEON_Mask_interrupt( IRQ_WF ); // mask waveform interrupt (coming from the timer VHDL IP)
895 850 LEON_Clear_interrupt( IRQ_WF ); // clear waveform interrupt (coming from the timer VHDL IP)
896 851 timer_stop( (gptimer_regs_t*) REGS_ADDR_GPTIMER, TIMER_WF_SIMULATOR );
897 852 #else
898 853 LEON_Mask_interrupt( IRQ_WAVEFORM_PICKER ); // mask waveform picker interrupt
899 854 LEON_Clear_interrupt( IRQ_WAVEFORM_PICKER ); // clear waveform picker interrupt
855 LEON_Mask_interrupt( IRQ_SPECTRAL_MATRIX ); // mask spectral matrix interrupt
856 LEON_Clear_interrupt( IRQ_SPECTRAL_MATRIX ); // clear spectral matrix interrupt
900 857 #endif
858 //**********************
901 859 // suspend several tasks
902
903 860 if (lfrMode != LFR_MODE_STANDBY) {
904 861 suspend_science_tasks();
905 862 }
906 863
907 864 if (status != RTEMS_SUCCESSFUL)
908 865 {
909 866 PRINTF("ERR *** in stop_current_mode *** suspending tasks\n")
910 867 }
911 868
869 //*************************
912 870 // initialize the registers
913 871 #ifdef GSA
914 872 #else
915 waveform_picker_regs->burst_enable = 0x00; // initialize
873 reset_wfp_burst_enable(); // reset burst and enable bits
874 reset_wfp_status(); // reset all the status bits
916 875 #endif
917 876
918 877 return status;
919 878 }
920 879
921 880 int enter_mode(unsigned char mode, ccsdsTelecommandPacket_t *TC )
922 881 {
923 882 rtems_status_code status;
924 883
884 status = RTEMS_UNSATISFIED;
885
886 housekeeping_packet.lfr_status_word[0] = (unsigned char) ((mode << 4) + 0x0d);
887 lfrCurrentMode = mode;
888
925 889 switch(mode){
926 890 case LFR_MODE_STANDBY:
927 891 status = enter_standby_mode( TC );
928 892 break;
929 893 case LFR_MODE_NORMAL:
930 894 status = enter_normal_mode( TC );
931 895 break;
932 896 case LFR_MODE_BURST:
933 897 status = enter_burst_mode( TC );
934 898 break;
935 899 case LFR_MODE_SBM1:
936 900 status = enter_sbm1_mode( TC );
937 901 break;
938 902 case LFR_MODE_SBM2:
939 903 status = enter_sbm2_mode( TC );
940 904 break;
941 905 default:
942 906 status = RTEMS_UNSATISFIED;
943 907 }
944 908
945 if (status == RTEMS_SUCCESSFUL)
909 if (status != RTEMS_SUCCESSFUL)
946 910 {
947 housekeeping_packet.lfr_status_word[0] = (unsigned char) ((mode << 4) + 0x0d);
911 PRINTF("in enter_mode *** ERR\n")
912 status = RTEMS_UNSATISFIED;
948 913 }
949 914
950 915 return status;
951 916 }
952 917
953 int enter_standby_mode(ccsdsTelecommandPacket_t *TC)
918 int enter_standby_mode()
954 919 {
920 reset_waveform_picker_regs();
921 #ifdef PRINT_TASK_STATISTICS
922 rtems_cpu_usage_report();
923 #endif
955 924 return LFR_SUCCESSFUL;
956 925 }
957 926
958 int enter_normal_mode( ccsdsTelecommandPacket_t *TC )
927 int enter_normal_mode()
959 928 {
960 929 rtems_status_code status;
961 930
962 931 status = restart_science_tasks();
963 932
964 933 #ifdef GSA
965 934 timer_start( (gptimer_regs_t*) REGS_ADDR_GPTIMER, TIMER_WF_SIMULATOR );
966 935 timer_start( (gptimer_regs_t*) REGS_ADDR_GPTIMER, TIMER_SM_SIMULATOR );
967 936 LEON_Clear_interrupt( IRQ_WF );
968 937 LEON_Unmask_interrupt( IRQ_WF );
969 938 //
970 939 set_local_nb_interrupt_f0_MAX();
971 940 LEON_Clear_interrupt( IRQ_SM ); // the IRQ_SM seems to be incompatible with the IRQ_WF on the xilinx board
972 941 LEON_Unmask_interrupt( IRQ_SM );
973 942 #else
943 //****************
974 944 // waveform picker
975 945 LEON_Clear_interrupt( IRQ_WAVEFORM_PICKER );
976 946 LEON_Unmask_interrupt( IRQ_WAVEFORM_PICKER );
977 947 reset_waveform_picker_regs();
978 948 set_wfp_burst_enable_register(LFR_MODE_NORMAL);
949 //****************
979 950 // spectral matrix
980 //
981 951 set_local_nb_interrupt_f0_MAX();
982 952 LEON_Clear_interrupt( IRQ_SPECTRAL_MATRIX ); // the IRQ_SM seems to be incompatible with the IRQ_WF on the xilinx board
983 953 LEON_Unmask_interrupt( IRQ_SPECTRAL_MATRIX );
984 954 spectral_matrix_regs->config = 0x01;
985 955 spectral_matrix_regs->status = 0x00;
986 956 #endif
987 957
988 958 return status;
989 959 }
990 960
991 int enter_burst_mode(ccsdsTelecommandPacket_t *TC)
961 int enter_burst_mode()
992 962 {
993 963 rtems_status_code status;
994 964 unsigned char lfrMode;
995 965
996 966 lfrMode = (housekeeping_packet.lfr_status_word[0] & 0xf0) >> 4;
997 967
998 968 status = restart_science_tasks();
999 969
1000 970 #ifdef GSA
971 LEON_Unmask_interrupt( IRQ_SM );
1001 972 #else
1002 973 LEON_Clear_interrupt( IRQ_WAVEFORM_PICKER );
1003 974 LEON_Unmask_interrupt( IRQ_WAVEFORM_PICKER );
1004 975 reset_waveform_picker_regs();
1005 976 set_wfp_burst_enable_register(LFR_MODE_BURST);
1006 waveform_picker_regs->burst_enable = 0x40; // [0100 0000] burst f2, f1, f0 enable f3 f2 f1 f0
1007 waveform_picker_regs->burst_enable = waveform_picker_regs->burst_enable | 0x04;
1008 waveform_picker_regs->status = 0x00;
1009 977 #endif
1010 978
1011 LEON_Unmask_interrupt( IRQ_SM );
1012
1013 979 return status;
1014 980 }
1015 981
1016 int enter_sbm1_mode(ccsdsTelecommandPacket_t *TC)
982 int enter_sbm1_mode()
1017 983 {
1018 984 rtems_status_code status;
1019 985
1020 986 status = restart_science_tasks();
1021 987
1022 988 set_local_sbm1_nb_cwf_max();
1023 989
1024 990 reset_local_sbm1_nb_cwf_sent();
1025 991
1026 992 #ifdef GSA
993 LEON_Unmask_interrupt( IRQ_SM );
1027 994 #else
1028 995 LEON_Clear_interrupt( IRQ_WAVEFORM_PICKER );
1029 996 LEON_Unmask_interrupt( IRQ_WAVEFORM_PICKER );
1030 997 reset_waveform_picker_regs();
1031 998 set_wfp_burst_enable_register(LFR_MODE_SBM1);
1032 waveform_picker_regs->status = 0x00;
1033 999 #endif
1034 1000
1035 LEON_Unmask_interrupt( IRQ_SM );
1036
1037 1001 return status;
1038 1002 }
1039 1003
1040 int enter_sbm2_mode(ccsdsTelecommandPacket_t *TC)
1004 int enter_sbm2_mode()
1041 1005 {
1042 1006 rtems_status_code status;
1043 1007
1044 1008 status = restart_science_tasks();
1045 1009
1046 1010 set_local_sbm2_nb_cwf_max();
1047 1011
1048 1012 reset_local_sbm2_nb_cwf_sent();
1049 1013
1050 1014 #ifdef GSA
1015 LEON_Unmask_interrupt( IRQ_SM );
1051 1016 #else
1052 1017 LEON_Clear_interrupt( IRQ_WAVEFORM_PICKER );
1053 1018 LEON_Unmask_interrupt( IRQ_WAVEFORM_PICKER );
1054 1019 reset_waveform_picker_regs();
1055 1020 set_wfp_burst_enable_register(LFR_MODE_SBM2);
1056 waveform_picker_regs->status = 0x00;
1057 1021 #endif
1058 1022
1059 LEON_Unmask_interrupt( IRQ_SM );
1060
1061 1023 return status;
1062 1024 }
1063 1025
1064 1026 int restart_science_tasks()
1065 1027 {
1066 rtems_status_code status;
1028 rtems_status_code status[6];
1029 rtems_status_code ret;
1067 1030
1068 status = rtems_task_restart( Task_id[TASKID_AVF0], 0 );
1031 ret = RTEMS_SUCCESSFUL;
1069 1032
1070 if (status == RTEMS_SUCCESSFUL) {
1071 status = rtems_task_restart( Task_id[TASKID_BPF0], 0 );
1072 if (status == RTEMS_SUCCESSFUL) {
1073 status = rtems_task_restart( Task_id[TASKID_WFRM], 0 );
1074 if (status == RTEMS_SUCCESSFUL) {
1075 status = rtems_task_restart( Task_id[TASKID_CWF3], 0 );
1076 }
1077 }
1033 status[0] = rtems_task_restart( Task_id[TASKID_AVF0], 1 );
1034 status[1] = rtems_task_restart( Task_id[TASKID_BPF0],1 );
1035 status[2] = rtems_task_restart( Task_id[TASKID_WFRM],1 );
1036 status[3] = rtems_task_restart( Task_id[TASKID_CWF3],1 );
1037 status[4] = rtems_task_restart( Task_id[TASKID_CWF2],1 );
1038 status[5] = rtems_task_restart( Task_id[TASKID_CWF1],1 );
1039
1040 if ( (status[0] != RTEMS_SUCCESSFUL) || (status[1] != RTEMS_SUCCESSFUL) || (status[2] != RTEMS_SUCCESSFUL) ||
1041 (status[3] != RTEMS_SUCCESSFUL) || (status[4] != RTEMS_SUCCESSFUL) || (status[5] != RTEMS_SUCCESSFUL) )
1042 {
1043 ret = RTEMS_UNSATISFIED;
1044 PRINTF("in restart_science_tasks *** ERR\n")
1078 1045 }
1079 1046
1080 return status;
1047 return ret;
1081 1048 }
1082 1049
1083 1050 int suspend_science_tasks()
1084 1051 {
1085 rtems_status_code status;
1052 rtems_status_code status[6];
1053 rtems_status_code ret;
1054
1055 ret = RTEMS_SUCCESSFUL;
1086 1056
1087 status = rtems_task_suspend( Task_id[TASKID_AVF0] );
1088 if (status == RTEMS_SUCCESSFUL) {
1089 status = rtems_task_suspend( Task_id[TASKID_BPF0] );
1090 if (status == RTEMS_SUCCESSFUL) {
1091 status = rtems_task_suspend( Task_id[TASKID_WFRM] );
1092 if (status == RTEMS_SUCCESSFUL) {
1093 status = rtems_task_suspend( Task_id[TASKID_CWF3] );
1094 }
1095 }
1057 status[0] = rtems_task_suspend( Task_id[TASKID_AVF0] );
1058 status[1] = rtems_task_suspend( Task_id[TASKID_BPF0] );
1059 status[2] = rtems_task_suspend( Task_id[TASKID_WFRM] );
1060 status[3] = rtems_task_suspend( Task_id[TASKID_CWF3] );
1061 status[4] = rtems_task_suspend( Task_id[TASKID_CWF2] );
1062 status[5] = rtems_task_suspend( Task_id[TASKID_CWF1] );
1063
1064 if ( (status[0] != RTEMS_SUCCESSFUL) || (status[1] != RTEMS_SUCCESSFUL) || (status[2] != RTEMS_SUCCESSFUL) ||
1065 (status[3] != RTEMS_SUCCESSFUL) || (status[4] != RTEMS_SUCCESSFUL) || (status[5] != RTEMS_SUCCESSFUL) )
1066 {
1067 ret = RTEMS_UNSATISFIED;
1068 PRINTF("in suspend_science_tasks *** ERR\n")
1096 1069 }
1097 1070
1098 return status;
1071 return ret;
1099 1072 }
1100 1073
1101 1074 //****************
1102 1075 // CLOSING ACTIONS
1103 1076
1104 1077 int send_tm_lfr_tc_exe_success(ccsdsTelecommandPacket_t *TC)
1105 1078 {
1079 int ret;
1106 1080 rtems_status_code status;
1107 1081 TMHeader_t TM_header;
1108 1082 char data[4];
1109 1083 spw_ioctl_pkt_send spw_ioctl_send;
1110 1084
1111 1085 TM_build_header( TM_LFR_TC_EXE_OK, PACKET_LENGTH_TC_EXE_SUCCESS,
1112 1086 &TM_header,
1113 1087 TC->sourceID); // TC source ID
1114 1088
1115 1089 data[0] = TC->packetID[0];
1116 1090 data[1] = TC->packetID[1];
1117 1091 data[2] = TC->packetSequenceControl[0];
1118 1092 data[3] = TC->packetSequenceControl[1];
1119 1093
1120 1094 // filling the structure for the spacewire transmission
1121 1095 spw_ioctl_send.hlen = TM_HEADER_LEN + 4; // + 4 is for the protocole extra header
1122 1096 spw_ioctl_send.hdr = (char*) &TM_header;
1123 1097 spw_ioctl_send.dlen = 4;
1124 1098 spw_ioctl_send.data = data;
1125 1099 spw_ioctl_send.options = 0;
1126 1100
1127 1101 // SEND DATA
1128 status = ioctl( fdSPW, SPACEWIRE_IOCTRL_SEND, &spw_ioctl_send );
1102 //status = ioctl( fdSPW, SPACEWIRE_IOCTRL_SEND, &spw_ioctl_send );
1103 status = rtems_message_queue_send( misc_id[1], &spw_ioctl_send, sizeof(spw_ioctl_send));
1104 if (status != RTEMS_SUCCESSFUL) {
1105 PRINTF("in send_tm_lfr_tc_exe_success *** ERR\n")
1106 ret = LFR_DEFAULT;
1107 }
1129 1108
1130 return LFR_SUCCESSFUL;
1109 return ret;
1131 1110 }
1132 1111
1133 1112 int send_tm_lfr_tc_exe_not_executable(ccsdsTelecommandPacket_t *TC)
1134 1113 {
1135 1114 rtems_status_code status;
1136 1115 TMHeader_t TM_header;
1137 1116 char data[10];
1138 1117 spw_ioctl_pkt_send spw_ioctl_send;
1139 1118
1140 1119 TM_build_header( TM_LFR_TC_EXE_ERR, PACKET_LENGTH_TC_EXE_NOT_EXECUTABLE,
1141 1120 &TM_header,
1142 1121 TC->sourceID); // TC source ID
1143 1122
1144 1123 data[0] = (char) (FAILURE_CODE_NOT_EXECUTABLE >> 8);
1145 1124 data[1] = (char) FAILURE_CODE_NOT_EXECUTABLE;
1146 1125 data[2] = TC->packetID[0];
1147 1126 data[3] = TC->packetID[1];
1148 1127 data[4] = TC->packetSequenceControl[0];
1149 1128 data[5] = TC->packetSequenceControl[1];
1150 1129 data[6] = TC->serviceType; // type of the rejected TC
1151 1130 data[7] = TC->serviceSubType; // subtype of the rejected TC
1152 1131 data[8] = housekeeping_packet.lfr_status_word[0];
1153 1132 data[6] = housekeeping_packet.lfr_status_word[1];
1154 1133
1155 1134 // filling the structure for the spacewire transmission
1156 1135 spw_ioctl_send.hlen = TM_HEADER_LEN + 4; // + 4 is for the protocole extra header
1157 1136 spw_ioctl_send.hdr = (char*) &TM_header;
1158 1137 spw_ioctl_send.dlen = 10;
1159 1138 spw_ioctl_send.data = data;
1160 1139 spw_ioctl_send.options = 0;
1161 1140
1162 1141 // SEND DATA
1163 1142 status = ioctl( fdSPW, SPACEWIRE_IOCTRL_SEND, &spw_ioctl_send );
1164 1143
1165 1144 return LFR_SUCCESSFUL;
1166 1145 }
1167 1146
1168 1147 int send_tm_lfr_tc_exe_not_implemented(ccsdsTelecommandPacket_t *TC)
1169 1148 {
1170 1149 rtems_status_code status;
1171 1150 TMHeader_t TM_header;
1172 1151 char data[8];
1173 1152 spw_ioctl_pkt_send spw_ioctl_send;
1174 1153
1175 1154 TM_build_header( TM_LFR_TC_EXE_ERR, PACKET_LENGTH_TC_EXE_NOT_IMPLEMENTED,
1176 1155 &TM_header,
1177 1156 TC->sourceID); // TC source ID
1178 1157
1179 1158 data[0] = (char) (FAILURE_CODE_NOT_IMPLEMENTED >> 8);
1180 1159 data[1] = (char) FAILURE_CODE_NOT_IMPLEMENTED;
1181 1160 data[2] = TC->packetID[0];
1182 1161 data[3] = TC->packetID[1];
1183 1162 data[4] = TC->packetSequenceControl[0];
1184 1163 data[5] = TC->packetSequenceControl[1];
1185 1164 data[6] = TC->serviceType; // type of the rejected TC
1186 1165 data[7] = TC->serviceSubType; // subtype of the rejected TC
1187 1166
1188 1167 // filling the structure for the spacewire transmission
1189 1168 spw_ioctl_send.hlen = TM_HEADER_LEN + 4; // + 4 is for the protocole extra header
1190 1169 spw_ioctl_send.hdr = (char*) &TM_header;
1191 1170 spw_ioctl_send.dlen = 8;
1192 1171 spw_ioctl_send.data = data;
1193 1172 spw_ioctl_send.options = 0;
1194 1173
1195 1174 // SEND DATA
1196 1175 status = ioctl( fdSPW, SPACEWIRE_IOCTRL_SEND, &spw_ioctl_send );
1197 1176
1198 1177 return LFR_SUCCESSFUL;
1199 1178 }
1200 1179
1201 1180 int send_tm_lfr_tc_exe_error(ccsdsTelecommandPacket_t *TC)
1202 1181 {
1203 1182 rtems_status_code status;
1204 1183 TMHeader_t TM_header;
1205 1184 char data[8];
1206 1185 spw_ioctl_pkt_send spw_ioctl_send;
1207 1186
1208 1187 TM_build_header( TM_LFR_TC_EXE_ERR, PACKET_LENGTH_TC_EXE_ERROR,
1209 1188 &TM_header,
1210 1189 TC->sourceID); // TC source ID
1211 1190
1212 1191 data[0] = (char) (FAILURE_CODE_ERROR >> 8);
1213 1192 data[1] = (char) FAILURE_CODE_ERROR;
1214 1193 data[2] = TC->packetID[0];
1215 1194 data[3] = TC->packetID[1];
1216 1195 data[4] = TC->packetSequenceControl[0];
1217 1196 data[5] = TC->packetSequenceControl[1];
1218 1197 data[6] = TC->serviceType; // type of the rejected TC
1219 1198 data[7] = TC->serviceSubType; // subtype of the rejected TC
1220 1199
1221 1200 // filling the structure for the spacewire transmission
1222 1201 spw_ioctl_send.hlen = TM_HEADER_LEN + 4; // + 4 is for the protocole extra header
1223 1202 spw_ioctl_send.hdr = (char*) &TM_header;
1224 1203 spw_ioctl_send.dlen = 8;
1225 1204 spw_ioctl_send.data = data;
1226 1205 spw_ioctl_send.options = 0;
1227 1206
1228 1207 // SEND DATA
1229 1208 status = ioctl( fdSPW, SPACEWIRE_IOCTRL_SEND, &spw_ioctl_send );
1230 1209
1231 1210 return LFR_SUCCESSFUL;
1232 1211 }
1233 1212
1234 1213 void update_last_TC_exe(ccsdsTelecommandPacket_t *TC)
1235 1214 {
1236 1215 housekeeping_packet.hk_lfr_last_exe_tc_id[0] = TC->packetID[0];
1237 1216 housekeeping_packet.hk_lfr_last_exe_tc_id[1] = TC->packetID[1];
1238 1217 housekeeping_packet.hk_lfr_last_exe_tc_type[0] = 0x00;
1239 1218 housekeeping_packet.hk_lfr_last_exe_tc_type[1] = TC->serviceType;
1240 1219 housekeeping_packet.hk_lfr_last_exe_tc_subtype[0] = 0x00;
1241 1220 housekeeping_packet.hk_lfr_last_exe_tc_subtype[1] = TC->serviceSubType;
1242 1221 housekeeping_packet.hk_lfr_last_exe_tc_time[0] = (unsigned char) (time_management_regs->coarse_time>>24);
1243 1222 housekeeping_packet.hk_lfr_last_exe_tc_time[1] = (unsigned char) (time_management_regs->coarse_time>>16);
1244 1223 housekeeping_packet.hk_lfr_last_exe_tc_time[2] = (unsigned char) (time_management_regs->coarse_time>>8);
1245 1224 housekeeping_packet.hk_lfr_last_exe_tc_time[3] = (unsigned char) (time_management_regs->coarse_time);
1246 1225 housekeeping_packet.hk_lfr_last_exe_tc_time[4] = (unsigned char) (time_management_regs->fine_time>>8);
1247 1226 housekeeping_packet.hk_lfr_last_exe_tc_time[5] = (unsigned char) (time_management_regs->fine_time);
1248 1227 }
1249 1228
1250 1229 void update_last_TC_rej(ccsdsTelecommandPacket_t *TC)
1251 1230 {
1252 1231 housekeeping_packet.hk_lfr_last_rej_tc_id[0] = TC->packetID[0];
1253 1232 housekeeping_packet.hk_lfr_last_rej_tc_id[1] = TC->packetID[1];
1254 1233 housekeeping_packet.hk_lfr_last_rej_tc_type[0] = 0x00;
1255 1234 housekeeping_packet.hk_lfr_last_rej_tc_type[1] = TC->serviceType;
1256 1235 housekeeping_packet.hk_lfr_last_rej_tc_subtype[0] = 0x00;
1257 1236 housekeeping_packet.hk_lfr_last_rej_tc_subtype[1] = TC->serviceSubType;
1258 1237 housekeeping_packet.hk_lfr_last_rej_tc_time[0] = (unsigned char) (time_management_regs->coarse_time>>24);
1259 1238 housekeeping_packet.hk_lfr_last_rej_tc_time[1] = (unsigned char) (time_management_regs->coarse_time>>16);
1260 1239 housekeeping_packet.hk_lfr_last_rej_tc_time[2] = (unsigned char) (time_management_regs->coarse_time>>8);
1261 1240 housekeeping_packet.hk_lfr_last_rej_tc_time[3] = (unsigned char) (time_management_regs->coarse_time);
1262 1241 housekeeping_packet.hk_lfr_last_rej_tc_time[4] = (unsigned char) (time_management_regs->fine_time>>8);
1263 1242 housekeeping_packet.hk_lfr_last_rej_tc_time[5] = (unsigned char) (time_management_regs->fine_time);
1264 1243 }
1265 1244
1266 1245 void close_action(ccsdsTelecommandPacket_t *TC, int result)
1267 1246 {
1268 1247 unsigned int val = 0;
1269 1248 if (result == LFR_SUCCESSFUL)
1270 1249 {
1250 if ( !( (TC->serviceType==TC_TYPE_TIME) && (TC->serviceSubType==TC_SUBTYPE_UPDT_TIME) ) )
1251 {
1271 1252 send_tm_lfr_tc_exe_success( TC );
1253 }
1272 1254 update_last_TC_exe( TC );
1273 1255 val = housekeeping_packet.hk_dpu_exe_tc_lfr_cnt[0] * 256 + housekeeping_packet.hk_dpu_exe_tc_lfr_cnt[1];
1274 1256 val++;
1275 1257 housekeeping_packet.hk_dpu_exe_tc_lfr_cnt[0] = (unsigned char) (val >> 8);
1276 1258 housekeeping_packet.hk_dpu_exe_tc_lfr_cnt[1] = (unsigned char) (val);
1277 1259 }
1278 1260 else
1279 1261 {
1280 1262 update_last_TC_rej( TC );
1281 1263 val = housekeeping_packet.hk_dpu_rej_tc_lfr_cnt[0] * 256 + housekeeping_packet.hk_dpu_rej_tc_lfr_cnt[1];
1282 1264 val++;
1283 1265 housekeeping_packet.hk_dpu_rej_tc_lfr_cnt[0] = (unsigned char) (val >> 8);
1284 1266 housekeeping_packet.hk_dpu_rej_tc_lfr_cnt[1] = (unsigned char) (val);
1285 1267 }
1286 1268 }
1287 1269
1288 1270 //***************************
1289 1271 // Interrupt Service Routines
1290 1272 rtems_isr commutation_isr1( rtems_vector_number vector )
1291 1273 {
1292 1274 if (rtems_event_send( Task_id[TASKID_DUMB], RTEMS_EVENT_0 ) != RTEMS_SUCCESSFUL) {
1293 1275 printf("In commutation_isr1 *** Error sending event to DUMB\n");
1294 1276 }
1295 1277 }
1296 1278
1297 1279 rtems_isr commutation_isr2( rtems_vector_number vector )
1298 1280 {
1299 1281 if (rtems_event_send( Task_id[TASKID_DUMB], RTEMS_EVENT_0 ) != RTEMS_SUCCESSFUL) {
1300 1282 printf("In commutation_isr2 *** Error sending event to DUMB\n");
1301 1283 }
1302 1284 }
1303 1285
1304 1286
1305 1287
1306 1288
This diff has been collapsed as it changes many lines, (792 lines changed) Show them Hide them
@@ -1,826 +1,818
1 1 #include <wf_handler.h>
2 2
3 Header_TM_LFR_SCIENCE_SWF_t headerSWF_F0_F1_F2[3][7];
4 Header_TM_LFR_SCIENCE_CWF_t headerCWF_F1[7];
5 Header_TM_LFR_SCIENCE_CWF_t headerCWF_F2_BURST[7];
6 Header_TM_LFR_SCIENCE_CWF_t headerCWF_F2_SBM1[7];
7 Header_TM_LFR_SCIENCE_CWF_t headerCWF_F3[7];
8
9 unsigned char doubleSendCWF1 = 0;
10 unsigned char doubleSendCWF2 = 0;
11
3 12 rtems_isr waveforms_isr( rtems_vector_number vector )
4 13 {
5 unsigned char lfrMode;
6 lfrMode = (housekeeping_packet.lfr_status_word[0] & 0xf0) >> 4;
7 14
8 15 #ifdef GSA
9 16 #else
10 if ( (lfrMode != LFR_MODE_STANDBY) & (lfrMode != LFR_MODE_BURST) )
17 if ( (lfrCurrentMode == LFR_MODE_NORMAL)
18 || (lfrCurrentMode == LFR_MODE_SBM1) || (lfrCurrentMode == LFR_MODE_SBM2) )
11 19 { // in modes other than STANDBY and BURST, send the CWF_F3 data
12 if ((waveform_picker_regs->status & 0x08) == 0x08){ // f3 is full
20 if ((waveform_picker_regs->status & 0x08) == 0x08){ // [1000] f3 is full
13 21 // (1) change the receiving buffer for the waveform picker
14 22 if (waveform_picker_regs->addr_data_f3 == (int) wf_cont_f3) {
15 23 waveform_picker_regs->addr_data_f3 = (int) (wf_cont_f3_bis);
16 24 }
17 25 else {
18 26 waveform_picker_regs->addr_data_f3 = (int) (wf_cont_f3);
19 27 }
20 28 // (2) send an event for the waveforms transmission
21 if (rtems_event_send( Task_id[TASKID_CWF3], RTEMS_EVENT_MODE_NORMAL_CWF_F3 ) != RTEMS_SUCCESSFUL) {
29 if (rtems_event_send( Task_id[TASKID_CWF3], RTEMS_EVENT_0 ) != RTEMS_SUCCESSFUL) {
22 30 rtems_event_send( Task_id[TASKID_DUMB], RTEMS_EVENT_2 );
23 31 }
24 waveform_picker_regs->status = waveform_picker_regs->status & 0x0007; // reset the f3 full bit to 0
32 waveform_picker_regs->status = waveform_picker_regs->status & 0xfffff777; // reset f3 bits to 0, [1111 0111 0111 0111]
25 33 }
26 34 }
27 35 #endif
28 36
29 switch(lfrMode)
37 switch(lfrCurrentMode)
30 38 {
31 39 //********
32 40 // STANDBY
33 41 case(LFR_MODE_STANDBY):
34 42 break;
35 43
36 44 //******
37 45 // NORMAL
38 46 case(LFR_MODE_NORMAL):
39 47 #ifdef GSA
40 48 PRINTF("in waveform_isr *** unexpected waveform picker interruption\n")
41 49 #else
42 if ( (waveform_picker_regs->burst_enable & 0x7) == 0x0 ){ // if no channel is enable
43 rtems_event_send( Task_id[TASKID_DUMB], RTEMS_EVENT_2 );
44 }
45 else {
46 if ( (waveform_picker_regs->status & 0x7) == 0x7 ){ // f2 f1 and f0 are full
47 waveform_picker_regs->burst_enable = waveform_picker_regs->burst_enable & 0x08;
50 if ( (waveform_picker_regs->status & 0x7) == 0x7 ){ // [0111] f2 f1 and f0 are full
48 51 if (rtems_event_send( Task_id[TASKID_WFRM], RTEMS_EVENT_MODE_NORMAL ) != RTEMS_SUCCESSFUL) {
49 52 rtems_event_send( Task_id[TASKID_DUMB], RTEMS_EVENT_2 );
50 53 }
51 54 }
52 }
55 waveform_picker_regs->status = waveform_picker_regs->status & 0xf888; // [1111 1000 1000 1000] f2, f1, f0 bits =0
53 56 #endif
54 57 break;
55 58
56 59 //******
57 60 // BURST
58 61 case(LFR_MODE_BURST):
59 62 #ifdef GSA
60 63 PRINTF("in waveform_isr *** unexpected waveform picker interruption\n")
61 64 #else
62 if (waveform_picker_regs->burst_enable == 0x44) {
65 if ((waveform_picker_regs->status & 0x04) == 0x04){ // [0100] check the f2 full bit
66 // (1) change the receiving buffer for the waveform picker
63 67 if (waveform_picker_regs->addr_data_f2 == (int) wf_snap_f2) {
64 68 waveform_picker_regs->addr_data_f2 = (int) (wf_snap_f2_bis);
65 69 }
66 70 else {
67 71 waveform_picker_regs->addr_data_f2 = (int) (wf_snap_f2);
68 72 }
69 if (rtems_event_send( Task_id[TASKID_WFRM], RTEMS_EVENT_MODE_BURST ) != RTEMS_SUCCESSFUL) {
70 PRINTF("in waveforms_isr *** Error sending event to WFRM\n")
73 // (2) send an event for the waveforms transmission
74 if (rtems_event_send( Task_id[TASKID_CWF2], RTEMS_EVENT_MODE_BURST ) != RTEMS_SUCCESSFUL) {
71 75 rtems_event_send( Task_id[TASKID_DUMB], RTEMS_EVENT_2 );
72 76 }
77 waveform_picker_regs->status = waveform_picker_regs->status & 0xfffffbbb; // [1111 1011 1011 1011] f2 bits = 0
73 78 }
74 waveform_picker_regs->status = 0x00;
75 79 #endif
76 80 break;
77 81
78 82 //*****
79 83 // SBM1
80 84 case(LFR_MODE_SBM1):
81 85 #ifdef GSA
82 86 PRINTF("in waveform_isr *** unexpected waveform picker interruption\n")
83 87 #else
84 88 if ((waveform_picker_regs->status & 0x02) == 0x02){ // [0010] check the f1 full bit
85 89 // (1) change the receiving buffer for the waveform picker
86 if (waveform_picker_regs->addr_data_f1 == (int) wf_snap_f1) {
90 if ( param_local.local_sbm1_nb_cwf_sent == (param_local.local_sbm1_nb_cwf_max-1) )
91 {
92 waveform_picker_regs->addr_data_f1 = (int) (wf_snap_f1_norm);
93 }
94 else if ( waveform_picker_regs->addr_data_f1 == (int) wf_snap_f1_norm )
95 {
96 doubleSendCWF1 = 1;
97 waveform_picker_regs->addr_data_f1 = (int) (wf_snap_f1);
98 }
99 else if ( waveform_picker_regs->addr_data_f1 == (int) wf_snap_f1 ) {
87 100 waveform_picker_regs->addr_data_f1 = (int) (wf_snap_f1_bis);
88 101 }
89 102 else {
90 103 waveform_picker_regs->addr_data_f1 = (int) (wf_snap_f1);
91 104 }
92 105 // (2) send an event for the waveforms transmission
93 if (rtems_event_send( Task_id[TASKID_WFRM], RTEMS_EVENT_MODE_SBM1 ) != RTEMS_SUCCESSFUL) {
94 PRINTF("in waveforms_isr *** Error sending event to WFRM\n")
106 if (rtems_event_send( Task_id[TASKID_CWF1], RTEMS_EVENT_MODE_SBM1 ) != RTEMS_SUCCESSFUL) {
95 107 rtems_event_send( Task_id[TASKID_DUMB], RTEMS_EVENT_2 );
96 108 }
97 waveform_picker_regs->status = waveform_picker_regs->status & 0x000d; // reset the f1 full bit to 0
109 waveform_picker_regs->status = waveform_picker_regs->status & 0xfffffddd; // [1111 1101 1101 1101] f1 bit = 0
98 110 }
99 111 if ( ( (waveform_picker_regs->status & 0x05) == 0x05 ) ) { // [0101] check the f2 and f0 full bit
100 112 if (rtems_event_send( Task_id[TASKID_WFRM], RTEMS_EVENT_MODE_NORMAL ) != RTEMS_SUCCESSFUL) {
101 PRINTF("in waveforms_isr *** Error sending event to WFRM\n")
102 113 rtems_event_send( Task_id[TASKID_DUMB], RTEMS_EVENT_2 );
103 114 }
104 waveform_picker_regs->burst_enable = waveform_picker_regs->burst_enable | 0x05; // [0101] // enable f2 and f0
105 waveform_picker_regs->status = waveform_picker_regs->status & 0xfffffaaa; // set to 0 the bits related to f2 and f0
115 waveform_picker_regs->status = waveform_picker_regs->status & 0xfffffaaa; // [1111 1010 1010 1010] f2 and f0 bits = 0
116 reset_local_sbm1_nb_cwf_sent();
106 117 }
107 118
108 119 #endif
109 120 break;
110 121
111 122 //*****
112 123 // SBM2
113 124 case(LFR_MODE_SBM2):
114 125 #ifdef GSA
115 126 PRINTF("in waveform_isr *** unexpected waveform picker interruption\n")
116 127 #else
117 if ((waveform_picker_regs->status & 0x04) == 0x04){ // check the f2 full bit
128 if ((waveform_picker_regs->status & 0x04) == 0x04){ // [0100] check the f2 full bit
118 129 // (1) change the receiving buffer for the waveform picker
119 130 if (waveform_picker_regs->addr_data_f2 == (int) wf_snap_f2) {
120 131 waveform_picker_regs->addr_data_f2 = (int) (wf_snap_f2_bis);
121 132 }
122 133 else {
123 134 waveform_picker_regs->addr_data_f2 = (int) (wf_snap_f2);
124 135 }
125 136 // (2) send an event for the waveforms transmission
126 if (rtems_event_send( Task_id[TASKID_WFRM], RTEMS_EVENT_MODE_SBM2 ) != RTEMS_SUCCESSFUL) {
127 PRINTF("in waveforms_isr *** Error sending event to WFRM\n")
137 if (rtems_event_send( Task_id[TASKID_CWF2], RTEMS_EVENT_MODE_SBM2 ) != RTEMS_SUCCESSFUL) {
128 138 rtems_event_send( Task_id[TASKID_DUMB], RTEMS_EVENT_2 );
129 139 }
130 waveform_picker_regs->status = waveform_picker_regs->status & 0xfffffbbb; // [1011]
140 waveform_picker_regs->status = waveform_picker_regs->status & 0xfffffbbb; // [1111 1011 1011 1011] f2 bit = 0
131 141 }
132 if ( ( (waveform_picker_regs->status & 0x03) == 0x03 ) ) { // [0011] f3 f2 f1 f0, check the f2 and f0 full bit
133 if (rtems_event_send( Task_id[TASKID_WFRM], RTEMS_EVENT_MODE_NORMAL ) != RTEMS_SUCCESSFUL) {
134 PRINTF("in waveforms_isr *** Error sending event to WFRM\n")
142 if ( ( (waveform_picker_regs->status & 0x03) == 0x03 ) ) { // [0011] f3 f2 f1 f0, f1 and f0 are full
143 if (rtems_event_send( Task_id[TASKID_WFRM], RTEMS_EVENT_MODE_SBM2 ) != RTEMS_SUCCESSFUL) {
135 144 rtems_event_send( Task_id[TASKID_DUMB], RTEMS_EVENT_2 );
136 145 }
137 waveform_picker_regs->burst_enable = waveform_picker_regs->burst_enable | 0x03; // [0011] // enable f2 and f0
138 waveform_picker_regs->status = waveform_picker_regs->status & 0xfffffccc; // set to 0 the bits related to f1 and f0
146 waveform_picker_regs->status = waveform_picker_regs->status & 0xfffffccc; // [1111 1100 1100 1100] f1, f0 bits = 0
147 doubleSendCWF2 = 1;
148 reset_local_sbm2_nb_cwf_sent();
139 149 }
140 150 #endif
141 151 break;
142 152
143 153 //********
144 154 // DEFAULT
145 155 default:
146 156 break;
147 157 }
148 158 }
149 159
150 160 rtems_isr waveforms_simulator_isr( rtems_vector_number vector )
151 161 {
152 162 unsigned char lfrMode;
153 163 lfrMode = (housekeeping_packet.lfr_status_word[0] & 0xf0) >> 4;
154 164
155 165 switch(lfrMode) {
156 166 case (LFR_MODE_STANDBY):
157 167 break;
158 168 case (LFR_MODE_NORMAL):
159 169 if (rtems_event_send( Task_id[TASKID_WFRM], RTEMS_EVENT_MODE_NORMAL ) != RTEMS_SUCCESSFUL) {
160 170 rtems_event_send( Task_id[TASKID_DUMB], RTEMS_EVENT_5 );
161 171 }
162 172 break;
163 173 case (LFR_MODE_BURST):
164 174 break;
165 175 case (LFR_MODE_SBM1):
166 176 break;
167 177 case (LFR_MODE_SBM2):
168 178 break;
169 179 }
170 180 }
171 181
172 182 rtems_task wfrm_task(rtems_task_argument argument) //used with the waveform picker VHDL IP
173 183 {
174 unsigned int i;
175 unsigned int intEventOut;
176 spw_ioctl_pkt_send spw_ioctl_send_SWF;
177 spw_ioctl_pkt_send spw_ioctl_send_CWF;
178 184 rtems_event_set event_out;
179 Header_TM_LFR_SCIENCE_SWF_t headerSWF;
180 Header_TM_LFR_SCIENCE_CWF_t headerCWF;
181 185
182 init_header_snapshot_wf( &headerSWF );
183 init_header_continuous_wf( &headerCWF );
184
185 // BUILD THE PACKET HEADERS
186 spw_ioctl_send_SWF.hlen = TM_HEADER_LEN + 4 + 12; // + 4 is for the protocole extra header, + 12 is for the auxiliary header
187 spw_ioctl_send_SWF.hdr = (char*) &headerSWF;
188 spw_ioctl_send_SWF.options = 0;
189
190 spw_ioctl_send_CWF.hlen = TM_HEADER_LEN + 4 + 10; // + 4 is for the protocole extra header, + 10 is for the auxiliary header
191 spw_ioctl_send_CWF.hdr = (char*) &headerCWF;
192 spw_ioctl_send_CWF.options = 0;
186 init_header_snapshot_wf_table( SID_NORM_SWF_F0 );
187 init_header_snapshot_wf_table( SID_NORM_SWF_F1 );
188 init_header_snapshot_wf_table( SID_NORM_SWF_F2 );
193 189
194 190 init_waveforms();
195 191
196 192 PRINTF("in WFRM ***\n")
197 193
198 194 while(1){
199 195 // wait for an RTEMS_EVENT
200 rtems_event_receive(RTEMS_EVENT_0 | RTEMS_EVENT_1 | RTEMS_EVENT_2 | RTEMS_EVENT_3 | RTEMS_EVENT_4,
196 rtems_event_receive(RTEMS_EVENT_MODE_NORMAL | RTEMS_EVENT_MODE_SBM1 | RTEMS_EVENT_MODE_SBM2,
201 197 RTEMS_WAIT | RTEMS_EVENT_ANY, RTEMS_NO_TIMEOUT, &event_out);
202 intEventOut = (unsigned int) event_out;
203 for (i = 0; i< 5; i++) {
204 if ( ( (intEventOut >> i) & 0x0001) != 0 ) {
205
206 switch(i) {
207 198
208 case(LFR_MODE_NORMAL):
209 send_waveform_norm( &headerSWF, &spw_ioctl_send_SWF );
210 break;
211
212 case(LFR_MODE_BURST):
213 send_waveform_burst( &headerCWF, &spw_ioctl_send_CWF );
214 break;
199 switch( event_out) {
215 200
216 case(LFR_MODE_SBM1):
217 send_waveform_sbm1( &headerCWF, &spw_ioctl_send_CWF );
201 case RTEMS_EVENT_MODE_NORMAL:
202 send_waveform_SWF(wf_snap_f0, SID_NORM_SWF_F0);
203 send_waveform_SWF(wf_snap_f1, SID_NORM_SWF_F1);
204 send_waveform_SWF(wf_snap_f2, SID_NORM_SWF_F2);
218 205 #ifdef GSA
219 #else
220 if ( param_local.local_sbm1_nb_cwf_sent == (param_local.local_sbm1_nb_cwf_max-1) ) {
221 // send the f1 buffer as a NORM snapshot
222 if (waveform_picker_regs->addr_data_f1 == (int) wf_snap_f1) {
223 send_waveform_SWF( &headerSWF, wf_snap_f1_bis, SID_NORM_SWF_F1, &spw_ioctl_send_SWF );
224 }
225 else {
226 send_waveform_SWF( &headerSWF, wf_snap_f1, SID_NORM_SWF_F1, &spw_ioctl_send_SWF );
227 }
228 reset_local_sbm1_nb_cwf_sent();
229 }
230 else {
231 param_local.local_sbm1_nb_cwf_sent ++;
232 }
206 waveform_picker_regs->status = waveform_picker_regs->status & 0xf888; // [1111 1000 1000 1000] f2, f1, f0 bits =0
233 207 #endif
234 208 break;
235 209
236 case(LFR_MODE_SBM2):
237 send_waveform_sbm2( &headerCWF, &spw_ioctl_send_CWF );
210 case RTEMS_EVENT_MODE_SBM1:
211 send_waveform_SWF(wf_snap_f0, SID_NORM_SWF_F0);
212 send_waveform_SWF(wf_snap_f1_norm, SID_NORM_SWF_F1);
213 send_waveform_SWF(wf_snap_f2, SID_NORM_SWF_F2);
238 214 #ifdef GSA
239 #else
240 if ( param_local.local_sbm2_nb_cwf_sent == (param_local.local_sbm2_nb_cwf_max-1) ) {
241 // send the f2 buffer as a NORM snapshot
242 if (waveform_picker_regs->addr_data_f2 == (int) wf_snap_f2) {
243 send_waveform_SWF( &headerSWF, wf_snap_f2_bis, SID_NORM_SWF_F2, &spw_ioctl_send_SWF );
244 }
245 else {
246 send_waveform_SWF( &headerSWF, wf_snap_f2, SID_NORM_SWF_F2, &spw_ioctl_send_SWF );
247 }
248 reset_local_sbm2_nb_cwf_sent();
249 }
250 else {
251 param_local.local_sbm2_nb_cwf_sent ++;
252 }
215 waveform_picker_regs->status = waveform_picker_regs->status & 0xfffffaaa; // [1111 1010 1010 1010] f2, f0 bits = 0
216 #endif
217 break;
218
219 case RTEMS_EVENT_MODE_SBM2:
220 send_waveform_SWF(wf_snap_f0, SID_NORM_SWF_F0);
221 send_waveform_SWF(wf_snap_f1, SID_NORM_SWF_F1);
222 #ifdef GSA
223 waveform_picker_regs->status = waveform_picker_regs->status & 0xfffffccc; // [1111 1100 1100 1100] f1, f0 bits = 0
253 224 #endif
254 225 break;
255 226
256 227 default:
257 228 break;
258 229 }
259 }
260 }
230
231 #ifdef GSA
232 // irq processed, reset the related register of the timer unit
233 gptimer_regs->timer[TIMER_WF_SIMULATOR].ctrl = gptimer_regs->timer[TIMER_WF_SIMULATOR].ctrl | 0x00000010;
234 // clear the interruption
235 LEON_Unmask_interrupt( IRQ_WF );
236 #endif
261 237 }
262 238 }
263 239
264 240 rtems_task cwf3_task(rtems_task_argument argument) //used with the waveform picker VHDL IP
265 241 {
266 spw_ioctl_pkt_send spw_ioctl_send_CWF;
267 242 rtems_event_set event_out;
268 Header_TM_LFR_SCIENCE_CWF_t headerCWF;
269 243
270 init_header_continuous_wf( &headerCWF );
271
272 // BUILD THE PACKET HEADER
273 spw_ioctl_send_CWF.hlen = TM_HEADER_LEN + 4 + 10; // + 4 is for the protocole extra header, + 10 is for the auxiliary header
274 spw_ioctl_send_CWF.hdr = (char*) &headerCWF;
275 spw_ioctl_send_CWF.options = 0;
244 init_header_continuous_wf_table( SID_NORM_CWF_F3, headerCWF_F3 );
276 245
277 246 PRINTF("in CWF3 ***\n")
278 247
279 248 while(1){
280 249 // wait for an RTEMS_EVENT
281 rtems_event_receive( RTEMS_EVENT_5,
250 rtems_event_receive( RTEMS_EVENT_0,
282 251 RTEMS_WAIT | RTEMS_EVENT_ANY, RTEMS_NO_TIMEOUT, &event_out);
283 252 PRINTF("send CWF F3 \n")
284 send_waveform_norm_cwf_f3( &headerCWF, &spw_ioctl_send_CWF );
253 #ifdef GSA
254 #else
255 if (waveform_picker_regs->addr_data_f3 == (int) wf_cont_f3) {
256 send_waveform_CWF( wf_cont_f3_bis, SID_NORM_CWF_F3, headerCWF_F3 );
257 }
258 else {
259 send_waveform_CWF( wf_cont_f3, SID_NORM_CWF_F3, headerCWF_F3 );
260 }
261 #endif
262 }
263 }
264
265 rtems_task cwf2_task(rtems_task_argument argument) // ONLY USED IN BURST AND SBM2
266 {
267 rtems_event_set event_out;
268
269 init_header_continuous_wf_table( SID_BURST_CWF_F2, headerCWF_F2_BURST );
270 init_header_continuous_wf_table( SID_SBM2_CWF_F2, headerCWF_F2_SBM1 );
271
272 PRINTF("in CWF2 ***\n")
273
274 while(1){
275 // wait for an RTEMS_EVENT
276 rtems_event_receive( RTEMS_EVENT_MODE_BURST | RTEMS_EVENT_MODE_SBM2,
277 RTEMS_WAIT | RTEMS_EVENT_ANY, RTEMS_NO_TIMEOUT, &event_out);
278 if (event_out == RTEMS_EVENT_MODE_BURST)
279 {
280 // F2
281 #ifdef GSA
282 #else
283 if (waveform_picker_regs->addr_data_f2 == (int) wf_snap_f2) {
284 send_waveform_CWF( wf_snap_f2_bis, SID_BURST_CWF_F2, headerCWF_F2_BURST );
285 }
286 else {
287 send_waveform_CWF( wf_snap_f2, SID_BURST_CWF_F2, headerCWF_F2_BURST );
288 }
289 #endif
290 }
291 else if (event_out == RTEMS_EVENT_MODE_SBM2)
292 {
293 #ifdef GSA
294 #else
295 if (waveform_picker_regs->addr_data_f2 == (int) wf_snap_f2) {
296 send_waveform_CWF( wf_snap_f2_bis, SID_SBM2_CWF_F2, headerCWF_F2_SBM1 );
297 }
298 else {
299 send_waveform_CWF( wf_snap_f2, SID_SBM2_CWF_F2, headerCWF_F2_SBM1 );
300 }
301 #endif
302 }
303 else
304 {
305 PRINTF1("in CWF2 *** ERR mode = %d\n", lfrCurrentMode)
306 }
307 }
308 }
309
310 rtems_task cwf1_task(rtems_task_argument argument) // ONLY USED IN SBM1
311 {
312 rtems_event_set event_out;
313
314 init_header_continuous_wf_table( SID_SBM1_CWF_F1, headerCWF_F1 );
315
316 PRINTF("in CWF1 ***\n")
317
318 while(1){
319 // wait for an RTEMS_EVENT
320 rtems_event_receive( RTEMS_EVENT_MODE_SBM1,
321 RTEMS_WAIT | RTEMS_EVENT_ANY, RTEMS_NO_TIMEOUT, &event_out);
322 if (event_out == RTEMS_EVENT_MODE_SBM1)
323 {
324 #ifdef GSA
325 #else
326 if (doubleSendCWF1 == 1)
327 {
328 doubleSendCWF1 = 0;
329 send_waveform_CWF( wf_snap_f1_norm, SID_SBM1_CWF_F1, headerCWF_F1 );
330 }
331 else if (waveform_picker_regs->addr_data_f1 == (int) wf_snap_f1) {
332 send_waveform_CWF( wf_snap_f1_bis, SID_SBM1_CWF_F1, headerCWF_F1 );
333 }
334 else {
335 send_waveform_CWF( wf_snap_f1, SID_SBM1_CWF_F1, headerCWF_F1);
336 }
337 param_local.local_sbm1_nb_cwf_sent ++;
338 #endif
339 }
340 else
341 {
342 PRINTF1("in CWF1 *** ERR mode = %d\n", lfrCurrentMode)
343 }
285 344 }
286 345 }
287 346
288 347 //******************
289 348 // general functions
290 349 void init_waveforms( void )
291 350 {
292 351 int i = 0;
293 352
294 353 for (i=0; i< NB_SAMPLES_PER_SNAPSHOT; i++)
295 354 {
296 355 //***
297 356 // F0
298 357 wf_snap_f0[ (i* NB_WORDS_SWF_BLK) + 0 + TIME_OFFSET ] = 0x88887777; //
299 358 wf_snap_f0[ (i* NB_WORDS_SWF_BLK) + 1 + TIME_OFFSET ] = 0x22221111; //
300 359 wf_snap_f0[ (i* NB_WORDS_SWF_BLK) + 2 + TIME_OFFSET ] = 0x44443333; //
301 360
302 361 //***
303 362 // F1
304 363 wf_snap_f1[ (i* NB_WORDS_SWF_BLK) + 0 + TIME_OFFSET ] = 0x22221111;
305 364 wf_snap_f1[ (i* NB_WORDS_SWF_BLK) + 1 + TIME_OFFSET ] = 0x44443333;
306 365 wf_snap_f1[ (i* NB_WORDS_SWF_BLK) + 2 + TIME_OFFSET ] = 0xaaaa0000;
307 366
308 367 //***
309 368 // F2
310 369 wf_snap_f2[ (i* NB_WORDS_SWF_BLK) + 0 + TIME_OFFSET ] = 0x44443333;
311 370 wf_snap_f2[ (i* NB_WORDS_SWF_BLK) + 1 + TIME_OFFSET ] = 0x22221111;
312 371 wf_snap_f2[ (i* NB_WORDS_SWF_BLK) + 2 + TIME_OFFSET ] = 0xaaaa0000;
313 372
314 373 //***
315 374 // F3
316 375 //wf_cont_f3[ (i* NB_WORDS_SWF_BLK) + 0 ] = val1;
317 376 //wf_cont_f3[ (i* NB_WORDS_SWF_BLK) + 1 ] = val2;
318 377 //wf_cont_f3[ (i* NB_WORDS_SWF_BLK) + 2 ] = 0xaaaa0000;
319 378 }
320 379 }
321 380
322 void init_header_snapshot_wf( Header_TM_LFR_SCIENCE_SWF_t *header)
381 int init_header_snapshot_wf_table( unsigned int sid)
382 {
383 unsigned char i;
384 unsigned char j;
385
386 j = 0;
387
388 switch(sid)
323 389 {
324 header->targetLogicalAddress = CCSDS_DESTINATION_ID;
325 header->protocolIdentifier = CCSDS_PROTOCOLE_ID;
326 header->reserved = 0x00;
327 header->userApplication = CCSDS_USER_APP;
328 header->packetID[0] = (unsigned char) (TM_PACKET_ID_SCIENCE_NORMAL >> 8);
329 header->packetID[1] = (unsigned char) (TM_PACKET_ID_SCIENCE_NORMAL);
330 header->packetSequenceControl[0] = 0xc0;
331 header->packetSequenceControl[1] = 0x00;
332 header->packetLength[0] = 0x00;
333 header->packetLength[1] = 0x00;
334 // DATA FIELD HEADER
335 header->spare1_pusVersion_spare2 = 0x10;
336 header->serviceType = TM_TYPE_LFR_SCIENCE; // service type
337 header->serviceSubType = TM_SUBTYPE_LFR_SCIENCE; // service subtype
338 header->destinationID = TM_DESTINATION_ID_GROUND;
339 // AUXILIARY DATA HEADER
340 header->sid = 0x00;
341 header->hkBIA = 0x1f;
342 header->pktCnt = 0x07; // PKT_CNT
343 header->pktNr = 0x00; // PKT_NR
344 header->time[0] = 0x00;
345 header->time[0] = 0x00;
346 header->time[0] = 0x00;
347 header->time[0] = 0x00;
348 header->time[0] = 0x00;
349 header->time[0] = 0x00;
350 header->blkNr[0] = 0x00; // BLK_NR MSB
351 header->blkNr[1] = 0x00; // BLK_NR LSB
390 case SID_NORM_SWF_F0:
391 j = 0;
392 break;
393 case SID_NORM_SWF_F1:
394 j = 1;
395 break;
396 case SID_NORM_SWF_F2:
397 j = 2;
398 break;
399 default:
400 return LFR_DEFAULT;
352 401 }
353 402
354 void init_header_continuous_wf( Header_TM_LFR_SCIENCE_CWF_t *header)
403 for (i=0; i<7; i++)
404 {
405 headerSWF_F0_F1_F2[j][i].targetLogicalAddress = CCSDS_DESTINATION_ID;
406 headerSWF_F0_F1_F2[j][i].protocolIdentifier = CCSDS_PROTOCOLE_ID;
407 headerSWF_F0_F1_F2[j][i].reserved = DEFAULT_RESERVED;
408 headerSWF_F0_F1_F2[j][i].userApplication = CCSDS_USER_APP;
409 headerSWF_F0_F1_F2[j][i].packetID[0] = (unsigned char) (TM_PACKET_ID_SCIENCE_NORMAL >> 8);
410 headerSWF_F0_F1_F2[j][i].packetID[1] = (unsigned char) (TM_PACKET_ID_SCIENCE_NORMAL);
411 if (i == 0)
412 {
413 headerSWF_F0_F1_F2[j][i].packetSequenceControl[0] = TM_PACKET_SEQ_CTRL_FIRST;
414 headerSWF_F0_F1_F2[j][i].packetLength[0] = (unsigned char) (TM_LEN_SCI_SWF_340 >> 8);
415 headerSWF_F0_F1_F2[j][i].packetLength[1] = (unsigned char) (TM_LEN_SCI_SWF_340 );
416 headerSWF_F0_F1_F2[j][i].blkNr[0] = (unsigned char) (BLK_NR_340 >> 8);
417 headerSWF_F0_F1_F2[j][i].blkNr[1] = (unsigned char) (BLK_NR_340 );
418 }
419 else if (i == 6)
355 420 {
356 header->targetLogicalAddress = CCSDS_DESTINATION_ID;
357 header->protocolIdentifier = CCSDS_PROTOCOLE_ID;
358 header->reserved = 0x00;
359 header->userApplication = CCSDS_USER_APP;
360 header->packetID[0] = 0x00;
361 header->packetID[1] = 0x00;
362 header->packetSequenceControl[0] = 0xc0;
363 header->packetSequenceControl[1] = 0x00;
364 header->packetLength[0] = 0x00;
365 header->packetLength[1] = 0x00;
421 headerSWF_F0_F1_F2[j][i].packetSequenceControl[0] = TM_PACKET_SEQ_CTRL_LAST;
422 headerSWF_F0_F1_F2[j][i].packetLength[0] = (unsigned char) (TM_LEN_SCI_SWF_8 >> 8);
423 headerSWF_F0_F1_F2[j][i].packetLength[1] = (unsigned char) (TM_LEN_SCI_SWF_8 );
424 headerSWF_F0_F1_F2[j][i].blkNr[0] = (unsigned char) (BLK_NR_8 >> 8);
425 headerSWF_F0_F1_F2[j][i].blkNr[1] = (unsigned char) (BLK_NR_8 );
426 }
427 else
428 {
429 headerSWF_F0_F1_F2[j][i].packetSequenceControl[0] = TM_PACKET_SEQ_CTRL_CONTINUATION;
430 headerSWF_F0_F1_F2[j][i].packetLength[0] = (unsigned char) (TM_LEN_SCI_SWF_340 >> 8);
431 headerSWF_F0_F1_F2[j][i].packetLength[1] = (unsigned char) (TM_LEN_SCI_SWF_340 );
432 headerSWF_F0_F1_F2[j][i].blkNr[0] = (unsigned char) (BLK_NR_340 >> 8);
433 headerSWF_F0_F1_F2[j][i].blkNr[1] = (unsigned char) (BLK_NR_340 );
434 }
435 headerSWF_F0_F1_F2[j][i].packetSequenceControl[1] = TM_PACKET_SEQ_CNT_DEFAULT;
436 headerSWF_F0_F1_F2[j][i].pktCnt = DEFAULT_PKTCNT; // PKT_CNT
437 headerSWF_F0_F1_F2[j][i].pktNr = i+1; // PKT_NR
366 438 // DATA FIELD HEADER
367 header->spare1_pusVersion_spare2 = 0x10;
368 header->serviceType = TM_TYPE_LFR_SCIENCE; // service type
369 header->serviceSubType = TM_SUBTYPE_LFR_SCIENCE; // service subtype
370 header->destinationID = TM_DESTINATION_ID_GROUND;
439 headerSWF_F0_F1_F2[j][i].spare1_pusVersion_spare2 = DEFAULT_SPARE1_PUSVERSION_SPARE2;
440 headerSWF_F0_F1_F2[j][i].serviceType = TM_TYPE_LFR_SCIENCE; // service type
441 headerSWF_F0_F1_F2[j][i].serviceSubType = TM_SUBTYPE_LFR_SCIENCE; // service subtype
442 headerSWF_F0_F1_F2[j][i].destinationID = TM_DESTINATION_ID_GROUND;
371 443 // AUXILIARY DATA HEADER
372 header->sid = 0x00;
373 header->hkBIA = 0x1f;
374 header->time[0] = 0x00;
375 header->time[0] = 0x00;
376 header->time[0] = 0x00;
377 header->time[0] = 0x00;
378 header->time[0] = 0x00;
379 header->time[0] = 0x00;
380 header->blkNr[0] = 0x00; // BLK_NR MSB
381 header->blkNr[1] = 0x00; // BLK_NR LSB
444 headerSWF_F0_F1_F2[j][i].sid = sid;
445 headerSWF_F0_F1_F2[j][i].hkBIA = DEFAULT_HKBIA;
446 headerSWF_F0_F1_F2[j][i].time[0] = 0x00;
447 headerSWF_F0_F1_F2[j][i].time[0] = 0x00;
448 headerSWF_F0_F1_F2[j][i].time[0] = 0x00;
449 headerSWF_F0_F1_F2[j][i].time[0] = 0x00;
450 headerSWF_F0_F1_F2[j][i].time[0] = 0x00;
451 headerSWF_F0_F1_F2[j][i].time[0] = 0x00;
452 }
453 return LFR_SUCCESSFUL;
454 }
455
456 int init_header_continuous_wf_table( unsigned int sid, Header_TM_LFR_SCIENCE_CWF_t *headerCWF )
457 {
458 unsigned int i;
459
460 for (i=0; i<7; i++)
461 {
462 headerCWF[ i ].targetLogicalAddress = CCSDS_DESTINATION_ID;
463 headerCWF[ i ].protocolIdentifier = CCSDS_PROTOCOLE_ID;
464 headerCWF[ i ].reserved = DEFAULT_RESERVED;
465 headerCWF[ i ].userApplication = CCSDS_USER_APP;
466 headerCWF[ i ].packetID[0] = (unsigned char) (TM_PACKET_ID_SCIENCE_BURST_SBM1_SBM2 >> 8);
467 headerCWF[ i ].packetID[1] = (unsigned char) (TM_PACKET_ID_SCIENCE_BURST_SBM1_SBM2);
468 if (i == 0)
469 {
470 headerCWF[ i ].packetSequenceControl[0] = TM_PACKET_SEQ_CTRL_FIRST;
471 headerCWF[ i ].packetLength[0] = (unsigned char) (TM_LEN_SCI_CWF_340 >> 8);
472 headerCWF[ i ].packetLength[1] = (unsigned char) (TM_LEN_SCI_CWF_340 );
473 headerCWF[ i ].blkNr[0] = (unsigned char) (BLK_NR_340 >> 8);
474 headerCWF[ i ].blkNr[1] = (unsigned char) (BLK_NR_340 );
475 }
476 else if (i == 6)
477 {
478 headerCWF[ i ].packetSequenceControl[0] = TM_PACKET_SEQ_CTRL_LAST;
479 headerCWF[ i ].packetLength[0] = (unsigned char) (TM_LEN_SCI_CWF_8 >> 8);
480 headerCWF[ i ].packetLength[1] = (unsigned char) (TM_LEN_SCI_CWF_8 );
481 headerCWF[ i ].blkNr[0] = (unsigned char) (BLK_NR_8 >> 8);
482 headerCWF[ i ].blkNr[1] = (unsigned char) (BLK_NR_8 );
483 }
484 else
485 {
486 headerCWF[ i ].packetSequenceControl[0] = TM_PACKET_SEQ_CTRL_CONTINUATION;
487 headerCWF[ i ].packetLength[0] = (unsigned char) (TM_LEN_SCI_CWF_340 >> 8);
488 headerCWF[ i ].packetLength[1] = (unsigned char) (TM_LEN_SCI_CWF_340 );
489 headerCWF[ i ].blkNr[0] = (unsigned char) (BLK_NR_340 >> 8);
490 headerCWF[ i ].blkNr[1] = (unsigned char) (BLK_NR_340 );
491 }
492 headerCWF[ i ].packetSequenceControl[1] = TM_PACKET_SEQ_CNT_DEFAULT;
493 // PKT_CNT
494 // PKT_NR
495 // DATA FIELD HEADER
496 headerCWF[ i ].spare1_pusVersion_spare2 = DEFAULT_SPARE1_PUSVERSION_SPARE2;
497 headerCWF[ i ].serviceType = TM_TYPE_LFR_SCIENCE; // service type
498 headerCWF[ i ].serviceSubType = TM_SUBTYPE_LFR_SCIENCE; // service subtype
499 headerCWF[ i ].destinationID = TM_DESTINATION_ID_GROUND;
500 // AUXILIARY DATA HEADER
501 headerCWF[ i ].sid = sid;
502 headerCWF[ i ].hkBIA = DEFAULT_HKBIA;
503 headerCWF[ i ].time[0] = 0x00;
504 headerCWF[ i ].time[0] = 0x00;
505 headerCWF[ i ].time[0] = 0x00;
506 headerCWF[ i ].time[0] = 0x00;
507 headerCWF[ i ].time[0] = 0x00;
508 headerCWF[ i ].time[0] = 0x00;
509 }
510 return LFR_SUCCESSFUL;
382 511 }
383 512
384 513 void reset_waveforms( void )
385 514 {
386 515 int i = 0;
387 516
388 517 for (i=0; i< NB_SAMPLES_PER_SNAPSHOT; i++)
389 518 {
390 519 wf_snap_f0[ (i* NB_WORDS_SWF_BLK) + 0 + TIME_OFFSET] = 0x10002000;
391 520 wf_snap_f0[ (i* NB_WORDS_SWF_BLK) + 1 + TIME_OFFSET] = 0x20001000;
392 521 wf_snap_f0[ (i* NB_WORDS_SWF_BLK) + 2 + TIME_OFFSET] = 0x40008000;
393 522
394 523 //***
395 524 // F1
396 525 wf_snap_f1[ (i* NB_WORDS_SWF_BLK) + 0 + TIME_OFFSET] = 0x1000f000;
397 526 wf_snap_f1[ (i* NB_WORDS_SWF_BLK) + 1 + TIME_OFFSET] = 0xf0001000;
398 527 wf_snap_f1[ (i* NB_WORDS_SWF_BLK) + 2 + TIME_OFFSET] = 0x40008000;
399 528
400 529 //***
401 530 // F2
402 531 wf_snap_f2[ (i* NB_WORDS_SWF_BLK) + 0 + TIME_OFFSET] = 0x40008000;
403 532 wf_snap_f2[ (i* NB_WORDS_SWF_BLK) + 1 + TIME_OFFSET] = 0x20001000;
404 533 wf_snap_f2[ (i* NB_WORDS_SWF_BLK) + 2 + TIME_OFFSET] = 0x10002000;
405 534
406 535 //***
407 536 // F3
408 537 /*wf_cont_f3[ i* NB_WORDS_SWF_BLK + 0 ] = build_value( i, i ); // v and 1
409 538 wf_cont_f3[ i* NB_WORDS_SWF_BLK + 1 ] = build_value( i, i ); // e2 and b1
410 539 wf_cont_f3[ i* NB_WORDS_SWF_BLK + 2 ] = build_value( i, i ); // b2 and b3*/
411 540 }
412 541 }
413 542
414 void send_waveform_SWF( Header_TM_LFR_SCIENCE_SWF_t *header, volatile int *waveform,
415 unsigned int sid, spw_ioctl_pkt_send *spw_ioctl_send)
543 int send_waveform_SWF( volatile int *waveform, unsigned int sid )
416 544 {
417 unsigned int i = 0;
418 unsigned int length = 0;
545 unsigned int i;
546 unsigned int j;
547 int ret;
419 548 rtems_status_code status;
549 spw_ioctl_pkt_send spw_ioctl_send_SWF;
420 550
421 header->sid = (unsigned char) sid;
551 spw_ioctl_send_SWF.hlen = TM_HEADER_LEN + 4 + 12; // + 4 is for the protocole extra header, + 12 is for the auxiliary header
552 spw_ioctl_send_SWF.options = 0;
553
554 j = 0;
555 ret = LFR_DEFAULT;
556
557 switch(sid)
558 {
559 case SID_NORM_SWF_F0:
560 j = 0;
561 break;
562 case SID_NORM_SWF_F1:
563 j = 1;
564 break;
565 case SID_NORM_SWF_F2:
566 j = 2;
567 break;
568 default:
569 ret = LFR_DEFAULT;
570 break;
571 }
422 572
423 573 for (i=0; i<7; i++) // send waveform
424 574 {
425 header->pktNr = (unsigned char) i+1; // PKT_NR
575 spw_ioctl_send_SWF.data = (char*) &waveform[ (i * 340 * NB_WORDS_SWF_BLK) ];
576 spw_ioctl_send_SWF.hdr = (char*) &headerSWF_F0_F1_F2[j][i];
426 577 // BUILD THE DATA
427 578 if (i==6) {
428 spw_ioctl_send->dlen = 8 * NB_BYTES_SWF_BLK;
429 length = TM_LEN_SCI_SWF_8;
430 header->blkNr[0] = 0x00; // BLK_NR MSB
431 header->blkNr[1] = 0x08; // BLK_NR LSB
579 spw_ioctl_send_SWF.dlen = 8 * NB_BYTES_SWF_BLK;
432 580 }
433 581 else {
434 spw_ioctl_send->dlen = 340 * NB_BYTES_SWF_BLK;
435 length = TM_LEN_SCI_SWF_340;
436 header->blkNr[0] = 0x01; // BLK_NR MSB
437 header->blkNr[1] = 0x54; // BLK_NR LSB
582 spw_ioctl_send_SWF.dlen = 340 * NB_BYTES_SWF_BLK;
438 583 }
439 spw_ioctl_send->data = (char*) &waveform[ (i * 340 * NB_WORDS_SWF_BLK) ];
440 // BUILD THE HEADER
441 header->packetLength[0] = (unsigned char) (length>>8);
442 header->packetLength[1] = (unsigned char) (length);
443 header->sid = (unsigned char) sid; // SID
444 584 // SET PACKET TIME
445 header->time[0] = (unsigned char) (time_management_regs->coarse_time>>24);
446 header->time[1] = (unsigned char) (time_management_regs->coarse_time>>16);
447 header->time[2] = (unsigned char) (time_management_regs->coarse_time>>8);
448 header->time[3] = (unsigned char) (time_management_regs->coarse_time);
449 header->time[4] = (unsigned char) (time_management_regs->fine_time>>8);
450 header->time[5] = (unsigned char) (time_management_regs->fine_time);
451 header->acquisitionTime[0] = (unsigned char) (time_management_regs->coarse_time>>24);
452 header->acquisitionTime[1] = (unsigned char) (time_management_regs->coarse_time>>16);
453 header->acquisitionTime[2] = (unsigned char) (time_management_regs->coarse_time>>8);
454 header->acquisitionTime[3] = (unsigned char) (time_management_regs->coarse_time);
455 header->acquisitionTime[4] = (unsigned char) (time_management_regs->fine_time>>8);
456 header->acquisitionTime[5] = (unsigned char) (time_management_regs->fine_time);
585 headerSWF_F0_F1_F2[j][i].time[0] = (unsigned char) (time_management_regs->coarse_time>>24);
586 headerSWF_F0_F1_F2[j][i].time[1] = (unsigned char) (time_management_regs->coarse_time>>16);
587 headerSWF_F0_F1_F2[j][i].time[2] = (unsigned char) (time_management_regs->coarse_time>>8);
588 headerSWF_F0_F1_F2[j][i].time[3] = (unsigned char) (time_management_regs->coarse_time);
589 headerSWF_F0_F1_F2[j][i].time[4] = (unsigned char) (time_management_regs->fine_time>>8);
590 headerSWF_F0_F1_F2[j][i].time[5] = (unsigned char) (time_management_regs->fine_time);
591 headerSWF_F0_F1_F2[j][i].acquisitionTime[0] = (unsigned char) (time_management_regs->coarse_time>>24);
592 headerSWF_F0_F1_F2[j][i].acquisitionTime[1] = (unsigned char) (time_management_regs->coarse_time>>16);
593 headerSWF_F0_F1_F2[j][i].acquisitionTime[2] = (unsigned char) (time_management_regs->coarse_time>>8);
594 headerSWF_F0_F1_F2[j][i].acquisitionTime[3] = (unsigned char) (time_management_regs->coarse_time);
595 headerSWF_F0_F1_F2[j][i].acquisitionTime[4] = (unsigned char) (time_management_regs->fine_time>>8);
596 headerSWF_F0_F1_F2[j][i].acquisitionTime[5] = (unsigned char) (time_management_regs->fine_time);
457 597 // SEND PACKET
458 status = write_spw(spw_ioctl_send);
459 if (status != RTEMS_SUCCESSFUL) {
460 while (true) {
598 //status = write_spw(&spw_ioctl_send_SWF);
599 status = rtems_message_queue_send( misc_id[1], &spw_ioctl_send_SWF, sizeof(spw_ioctl_send_SWF));
461 600 if (status != RTEMS_SUCCESSFUL) {
462 status = write_spw(spw_ioctl_send);
463 //PRINTF1("%d", i)
464 sched_yield();
601 PRINTF2("sid %d, i = %d\n", sid, i)
602 ret = LFR_DEFAULT;
465 603 }
466 else {
467 //PRINTF("\n")
468 break;
469 }
470 }
471 }
472 }
604 rtems_task_wake_after(TIME_BETWEEN_TWO_SWF_PACKETS); // 300 ms between each packet => 7 * 3 = 21 packets => 6.3 seconds
473 605 }
474 606
475 void send_waveform_CWF( Header_TM_LFR_SCIENCE_CWF_t *header, volatile int *waveform,
476 unsigned int sid, spw_ioctl_pkt_send *spw_ioctl_send)
607 return ret;
608 }
609
610 int send_waveform_CWF( volatile int *waveform, unsigned int sid, Header_TM_LFR_SCIENCE_CWF_t *headerCWF)
477 611 {
478 unsigned int i = 0;
479 unsigned int length = 0;
612 unsigned int i;
613 int ret;
480 614 rtems_status_code status;
615 spw_ioctl_pkt_send spw_ioctl_send_CWF;
481 616
482 header->sid = (unsigned char) sid;
617 spw_ioctl_send_CWF.hlen = TM_HEADER_LEN + 4 + 10; // + 4 is for the protocole extra header, + 10 is for the auxiliary header
618 spw_ioctl_send_CWF.options = 0;
619
620 ret = LFR_DEFAULT;
483 621
484 622 for (i=0; i<7; i++) // send waveform
485 623 {
624 int coarseTime = 0x00;
625 int fineTime = 0x00;
626 spw_ioctl_send_CWF.data = (char*) &waveform[ (i * 340 * NB_WORDS_SWF_BLK) ];
627 spw_ioctl_send_CWF.hdr = (char*) &headerCWF[ i ];
486 628 // BUILD THE DATA
487 629 if (i==6) {
488 spw_ioctl_send->dlen = 8 * NB_BYTES_SWF_BLK;
489 length = TM_LEN_SCI_CWF_8;
490 header->blkNr[0] = 0x00; // BLK_NR MSB
491 header->blkNr[1] = 0x08; // BLK_NR LSB
630 spw_ioctl_send_CWF.dlen = 8 * NB_BYTES_SWF_BLK;
492 631 }
493 632 else {
494 spw_ioctl_send->dlen = 340 * NB_BYTES_SWF_BLK;
495 length = TM_LEN_SCI_CWF_340;
496 header->blkNr[0] = 0x01; // BLK_NR MSB
497 header->blkNr[1] = 0x54; // BLK_NR LSB
633 spw_ioctl_send_CWF.dlen = 340 * NB_BYTES_SWF_BLK;
498 634 }
499 spw_ioctl_send->data = (char*) &waveform[ (i * 340 * NB_WORDS_SWF_BLK) ];
500 // BUILD THE HEADER
501 header->packetLength[0] = (unsigned char) (length>>8);
502 header->packetLength[1] = (unsigned char) (length);
503 635 // SET PACKET TIME
504 header->time[0] = (unsigned char) (time_management_regs->coarse_time>>24);
505 header->time[1] = (unsigned char) (time_management_regs->coarse_time>>16);
506 header->time[2] = (unsigned char) (time_management_regs->coarse_time>>8);
507 header->time[3] = (unsigned char) (time_management_regs->coarse_time);
508 header->time[4] = (unsigned char) (time_management_regs->fine_time>>8);
509 header->time[5] = (unsigned char) (time_management_regs->fine_time);
510 header->acquisitionTime[0] = (unsigned char) (time_management_regs->coarse_time>>24);
511 header->acquisitionTime[1] = (unsigned char) (time_management_regs->coarse_time>>16);
512 header->acquisitionTime[2] = (unsigned char) (time_management_regs->coarse_time>>8);
513 header->acquisitionTime[3] = (unsigned char) (time_management_regs->coarse_time);
514 header->acquisitionTime[4] = (unsigned char) (time_management_regs->fine_time>>8);
515 header->acquisitionTime[5] = (unsigned char) (time_management_regs->fine_time);
636 coarseTime = time_management_regs->coarse_time;
637 fineTime = time_management_regs->fine_time;
638 headerCWF[ i ].time[0] = (unsigned char) (coarseTime>>24);
639 headerCWF[ i ].time[1] = (unsigned char) (coarseTime>>16);
640 headerCWF[ i ].time[2] = (unsigned char) (coarseTime>>8);
641 headerCWF[ i ].time[3] = (unsigned char) (coarseTime);
642 headerCWF[ i ].time[4] = (unsigned char) (fineTime>>8);
643 headerCWF[ i ].time[5] = (unsigned char) (fineTime);
644 headerCWF[ i ].acquisitionTime[0] = (unsigned char) (coarseTime>>24);
645 headerCWF[ i ].acquisitionTime[1] = (unsigned char) (coarseTime>>16);
646 headerCWF[ i ].acquisitionTime[2] = (unsigned char) (coarseTime>>8);
647 headerCWF[ i ].acquisitionTime[3] = (unsigned char) (coarseTime);
648 headerCWF[ i ].acquisitionTime[4] = (unsigned char) (fineTime>>8);
649 headerCWF[ i ].acquisitionTime[5] = (unsigned char) (fineTime);
516 650 // SEND PACKET
517 status = write_spw(spw_ioctl_send);
651 //status = write_spw(&spw_ioctl_send_CWF);
652 status = rtems_message_queue_urgent( misc_id[1], &spw_ioctl_send_CWF, sizeof(spw_ioctl_send_CWF));
518 653 if (status != RTEMS_SUCCESSFUL) {
519 while (true) {
520 if (status != RTEMS_SUCCESSFUL) {
521 status = write_spw(spw_ioctl_send);
522 //PRINTF1("%d", i)
654 PRINTF2("sid %d, i = %d\n", sid, i)
655 ret = LFR_DEFAULT;
656 }
657 else
658 {
523 659 sched_yield();
524 660 }
525 else {
526 //PRINTF("\n")
527 break;
528 }
529 }
530 }
661 if (sid == SID_NORM_CWF_F3)
662 {
663 rtems_task_wake_after(TIME_BETWEEN_TWO_CWF3_PACKETS);
531 664 }
532 665 }
533 666
534 void send_waveform_norm(Header_TM_LFR_SCIENCE_SWF_t *header, spw_ioctl_pkt_send *spw_ioctl_send)
535 {
536 unsigned char lfrMode;
537 lfrMode = (housekeeping_packet.lfr_status_word[0] & 0xf0) >> 4;
538
539 header->packetID[0] = (unsigned char) (TM_PACKET_ID_SCIENCE_NORMAL >> 8);
540 header->packetID[1] = (unsigned char) (TM_PACKET_ID_SCIENCE_NORMAL);
541 // TIME
542 header->time[0] = (unsigned char) (time_management_regs->coarse_time>>24);
543 header->time[1] = (unsigned char) (time_management_regs->coarse_time>>16);
544 header->time[2] = (unsigned char) (time_management_regs->coarse_time>>8);
545 header->time[3] = (unsigned char) (time_management_regs->coarse_time);
546 header->time[4] = (unsigned char) (time_management_regs->fine_time>>8);
547 header->time[5] = (unsigned char) (time_management_regs->fine_time);
548
549 switch(lfrMode) {
550
551 case LFR_MODE_NORMAL:
552 send_waveform_SWF( header, wf_snap_f0, SID_NORM_SWF_F0, spw_ioctl_send);
553 send_waveform_SWF( header, wf_snap_f1, SID_NORM_SWF_F1, spw_ioctl_send);
554 send_waveform_SWF( header, wf_snap_f2, SID_NORM_SWF_F2, spw_ioctl_send);
555 #ifdef GSA
556 #else
557 waveform_picker_regs->status = waveform_picker_regs->status & 0x00;
558 waveform_picker_regs->burst_enable = waveform_picker_regs->burst_enable | 0x07; // [0111] enable f2 f1 f0
559 #endif
560 break;
561
562 case LFR_MODE_SBM1:
563 send_waveform_SWF( header, wf_snap_f0, SID_NORM_SWF_F0, spw_ioctl_send);
564 // F1 data are sent by the send_waveform_sbm1 function
565 send_waveform_SWF( header, wf_snap_f2, SID_NORM_SWF_F2, spw_ioctl_send);
566 break;
567
568 case LFR_MODE_SBM2:
569 send_waveform_SWF( header, wf_snap_f0, SID_NORM_SWF_F0, spw_ioctl_send);
570 send_waveform_SWF( header, wf_snap_f1, SID_NORM_SWF_F1, spw_ioctl_send);
571 // F2 data are sent by the send_waveform_sbm2 function
572 break;
573
574 default:
575 break;
576 }
577
578 #ifdef GSA
579 // irq processed, reset the related register of the timer unit
580 gptimer_regs->timer[TIMER_WF_SIMULATOR].ctrl = gptimer_regs->timer[TIMER_WF_SIMULATOR].ctrl | 0x00000010;
581 // clear the interruption
582 LEON_Unmask_interrupt( IRQ_WF );
583 #endif
584
585 }
586
587 void send_waveform_norm_cwf_f3(Header_TM_LFR_SCIENCE_CWF_t *header, spw_ioctl_pkt_send *spw_ioctl_send)
588 {
589 header->packetID[0] = (unsigned char) (TM_PACKET_ID_SCIENCE_NORMAL >> 8);
590 header->packetID[1] = (unsigned char) (TM_PACKET_ID_SCIENCE_NORMAL);
591 // TIME
592 header->time[0] = (unsigned char) (time_management_regs->coarse_time>>24);
593 header->time[1] = (unsigned char) (time_management_regs->coarse_time>>16);
594 header->time[2] = (unsigned char) (time_management_regs->coarse_time>>8);
595 header->time[3] = (unsigned char) (time_management_regs->coarse_time);
596 header->time[4] = (unsigned char) (time_management_regs->fine_time>>8);
597 header->time[5] = (unsigned char) (time_management_regs->fine_time);
598
599 //*******************************
600 // send continuous waveform at f3
601 // F3
602 #ifdef GSA
603 #else
604 if (waveform_picker_regs->addr_data_f3 == (int) wf_cont_f3) {
605 send_waveform_CWF( header, wf_cont_f3_bis, SID_NORM_CWF_F3, spw_ioctl_send);
606 }
607 else {
608 send_waveform_CWF( header, wf_cont_f3, SID_NORM_CWF_F3, spw_ioctl_send);
609 }
610 #endif
611 }
612
613 void send_waveform_burst(Header_TM_LFR_SCIENCE_CWF_t *header, spw_ioctl_pkt_send *spw_ioctl_send)
614 {
615 header->packetID[0] = (unsigned char) (TM_PACKET_ID_SCIENCE_BURST_SBM1_SBM2 >> 8);
616 header->packetID[1] = (unsigned char) (TM_PACKET_ID_SCIENCE_BURST_SBM1_SBM2);
617 // TIME
618 header->time[0] = (unsigned char) (time_management_regs->coarse_time>>24);
619 header->time[1] = (unsigned char) (time_management_regs->coarse_time>>16);
620 header->time[2] = (unsigned char) (time_management_regs->coarse_time>>8);
621 header->time[3] = (unsigned char) (time_management_regs->coarse_time);
622 header->time[4] = (unsigned char) (time_management_regs->fine_time>>8);
623 header->time[5] = (unsigned char) (time_management_regs->fine_time);
624 // ACQUISITION TIME
625
626 // F2
627 #ifdef GSA
628 #else
629 if (waveform_picker_regs->addr_data_f2 == (int) wf_snap_f2) {
630 send_waveform_CWF( header, wf_snap_f2_bis, SID_BURST_CWF_F2, spw_ioctl_send);
631 }
632 else {
633 send_waveform_CWF( header, wf_snap_f2, SID_BURST_CWF_F2, spw_ioctl_send);
634 }
635 #endif
636 }
637
638 void send_waveform_sbm1(Header_TM_LFR_SCIENCE_CWF_t *header, spw_ioctl_pkt_send *spw_ioctl_send)
639 {
640 header->packetID[0] = (unsigned char) (TM_PACKET_ID_SCIENCE_BURST_SBM1_SBM2 >> 8);
641 header->packetID[1] = (unsigned char) (TM_PACKET_ID_SCIENCE_BURST_SBM1_SBM2);
642 // TIME
643 header->time[0] = (unsigned char) (time_management_regs->coarse_time>>24);
644 header->time[1] = (unsigned char) (time_management_regs->coarse_time>>16);
645 header->time[2] = (unsigned char) (time_management_regs->coarse_time>>8);
646 header->time[3] = (unsigned char) (time_management_regs->coarse_time);
647 header->time[4] = (unsigned char) (time_management_regs->fine_time>>8);
648 header->time[5] = (unsigned char) (time_management_regs->fine_time);
649
650 // F1
651 #ifdef GSA
652 #else
653 if (waveform_picker_regs->addr_data_f1 == (int) wf_snap_f1) {
654 send_waveform_CWF( header, wf_snap_f1_bis, SID_SBM1_CWF_F1, spw_ioctl_send );
655 }
656 else {
657 send_waveform_CWF( header, wf_snap_f1, SID_SBM1_CWF_F1, spw_ioctl_send );
658 }
659 #endif
660 }
661
662 void send_waveform_sbm2(Header_TM_LFR_SCIENCE_CWF_t *header, spw_ioctl_pkt_send *spw_ioctl_send)
663 {
664 header->packetID[0] = (unsigned char) (TM_PACKET_ID_SCIENCE_BURST_SBM1_SBM2 >> 8);
665 header->packetID[1] = (unsigned char) (TM_PACKET_ID_SCIENCE_BURST_SBM1_SBM2);
666 // TIME
667 header->time[0] = (unsigned char) (time_management_regs->coarse_time>>24);
668 header->time[1] = (unsigned char) (time_management_regs->coarse_time>>16);
669 header->time[2] = (unsigned char) (time_management_regs->coarse_time>>8);
670 header->time[3] = (unsigned char) (time_management_regs->coarse_time);
671 header->time[4] = (unsigned char) (time_management_regs->fine_time>>8);
672 header->time[5] = (unsigned char) (time_management_regs->fine_time);
673
674 // F2
675 #ifdef GSA
676 #else
677 if (waveform_picker_regs->addr_data_f2 == (int) wf_snap_f2) {
678 send_waveform_CWF( header, wf_snap_f2_bis, SID_SBM2_CWF_F2, spw_ioctl_send);
679 }
680 else {
681 send_waveform_CWF( header, wf_snap_f2, SID_SBM2_CWF_F2, spw_ioctl_send);
682 }
683 #endif
667 return ret;
684 668 }
685 669
686 670 //**************
687 671 // wfp registers
688 672 void set_wfp_data_shaping()
689 673 {
690 674 unsigned char data_shaping;
691 675
692 676 // get the parameters for the data shaping [BW SP0 SP1 R0 R1] in sy_lfr_common1 and configure the register
693 677 // waveform picker : [R1 R0 SP1 SP0 BW]
694 678
695 679 data_shaping = parameter_dump_packet.bw_sp0_sp1_r0_r1;
696 680
697 681 #ifdef GSA
698 682 #else
699 683 waveform_picker_regs->data_shaping =
700 684 ( (data_shaping & 0x10) >> 4 ) // BW
701 685 + ( (data_shaping & 0x08) >> 2 ) // SP0
702 686 + ( (data_shaping & 0x04) ) // SP1
703 687 + ( (data_shaping & 0x02) << 2 ) // R0
704 688 + ( (data_shaping & 0x01) << 4 ); // R1
705 689 #endif
706 690 }
707 691
708 692 char set_wfp_delta_snapshot()
709 693 {
710 694 char ret;
711 695 unsigned int delta_snapshot;
712 696 ret = LFR_DEFAULT;
713 697
714 698 delta_snapshot = parameter_dump_packet.sy_lfr_n_swf_p[0]*256
715 699 + parameter_dump_packet.sy_lfr_n_swf_p[1];
716 700
717 701 #ifdef GSA
718 702 #else
719 703 unsigned char aux = 0;
720 704 if ( delta_snapshot < MIN_DELTA_SNAPSHOT )
721 705 {
722 706 aux = MIN_DELTA_SNAPSHOT;
723 707 ret = LFR_DEFAULT;
724 708 }
725 709 else
726 710 {
727 711 aux = delta_snapshot ;
728 712 ret = LFR_SUCCESSFUL;
729 713 }
730 714 waveform_picker_regs->delta_snapshot = aux; // max 2 bytes
731 715 #endif
732 716
733 717 return ret;
734 718 }
735 719
736 720 void set_wfp_burst_enable_register( unsigned char mode)
737 721 {
738 722 #ifdef GSA
739 723 #else
740 724 // [0000 0000] burst f2, f1, f0 enable f3 f2 f1 f0
741 725 // the burst bits shall be set first, before the enable bits
742 726 switch(mode) {
743 727 case(LFR_MODE_NORMAL):
744 728 waveform_picker_regs->burst_enable = 0x0f; // [0000 1111] enable f3 f2 f1 f0
745 729 break;
746 730 case(LFR_MODE_BURST):
747 731 waveform_picker_regs->burst_enable = 0x40; // [0100 0000] f2 burst enabled
748 732 waveform_picker_regs->burst_enable = waveform_picker_regs->burst_enable | 0x04; // [0100] enable f2
749 733 break;
750 734 case(LFR_MODE_SBM1):
751 735 waveform_picker_regs->burst_enable = 0x20; // [0010 0000] f1 burst enabled
752 736 waveform_picker_regs->burst_enable = waveform_picker_regs->burst_enable | 0x0f; // [1111] enable f3 f2 f1 f0
753 737 break;
754 738 case(LFR_MODE_SBM2):
755 739 waveform_picker_regs->burst_enable = 0x40; // [0100 0000] f2 burst enabled
756 740 waveform_picker_regs->burst_enable = waveform_picker_regs->burst_enable | 0x0f; // [1111] enable f3 f2 f1 f0
757 741 break;
758 742 default:
759 743 waveform_picker_regs->burst_enable = 0x00; // [0000 0000] no burst enabled, no waveform enabled
760 744 break;
761 745 }
762 746 #endif
763 747 }
764 748
765 749 void reset_wfp_burst_enable()
766 750 {
767 751 #ifdef GSA
768 752 #else
769 753 waveform_picker_regs->burst_enable = 0x00; // burst f2, f1, f0 enable f3, f2, f1, f0
770 754 #endif
771 755 }
772 756
757 void reset_wfp_status()
758 {
759 #ifdef GSA
760 #else
761 waveform_picker_regs->status = 0x00; // burst f2, f1, f0 enable f3, f2, f1, f0
762 #endif
763 }
764
773 765 void reset_waveform_picker_regs()
774 766 {
775 767 #ifdef GSA
776 768 #else
777 769 set_wfp_data_shaping();
778 770 reset_wfp_burst_enable();
779 771 waveform_picker_regs->addr_data_f0 = (int) (wf_snap_f0); //
780 772 waveform_picker_regs->addr_data_f1 = (int) (wf_snap_f1); //
781 773 waveform_picker_regs->addr_data_f2 = (int) (wf_snap_f2); //
782 774 waveform_picker_regs->addr_data_f3 = (int) (wf_cont_f3); //
783 775 set_wfp_delta_snapshot(); // time in seconds between two snapshots
784 waveform_picker_regs->delta_f2_f1 = 0xffff; // max 4 bytes
785 waveform_picker_regs->delta_f2_f0 = 0x17c00; // max 5 bytes
776 waveform_picker_regs->delta_f2_f1 = 0xffff; // 0x16800 => 92160 (max 4 bytes)
777 waveform_picker_regs->delta_f2_f0 = 0x17c00; // 97 280 (max 5 bytes)
786 778 waveform_picker_regs->nb_burst_available = 0x180; // max 3 bytes, size of the buffer in burst (1 burst = 16 x 4 octets)
787 779 waveform_picker_regs->nb_snapshot_param = 0x7ff; // max 3 octets, 2048 - 1
788 780 waveform_picker_regs->status = 0x00; //
789 781 #endif
790 782 }
791 783
792 784 //*****************
793 785 // local parameters
794 786 void set_local_sbm1_nb_cwf_max()
795 787 {
796 // (2 snapshots of 2048 points per seconds) * (period of the NORM snashots)
788 // (2 snapshots of 2048 points per seconds) * (period of the NORM snashots) - 8 s (duration of the f2 snapshot)
797 789 param_local.local_sbm1_nb_cwf_max = 2 * (
798 790 parameter_dump_packet.sy_lfr_n_swf_p[0] * 256
799 791 + parameter_dump_packet.sy_lfr_n_swf_p[1]
800 );
792 ) - 8; // 16 CWF1 parts during 1 SWF2
801 793 }
802 794
803 795 void set_local_sbm2_nb_cwf_max()
804 796 {
805 797 // (period of the NORM snashots) / (8 seconds per snapshot at f2 = 256 Hz)
806 798 param_local.local_sbm2_nb_cwf_max = (
807 799 parameter_dump_packet.sy_lfr_n_swf_p[0] * 256
808 800 + parameter_dump_packet.sy_lfr_n_swf_p[1]
809 801 )/ 8;
810 802 }
811 803
812 804 void set_local_nb_interrupt_f0_MAX()
813 805 {
814 806 param_local.local_nb_interrupt_f0_MAX = ( (parameter_dump_packet.sy_lfr_n_asm_p[0]) * 256
815 807 + parameter_dump_packet.sy_lfr_n_asm_p[1] ) * 100;
816 808 }
817 809
818 810 void reset_local_sbm1_nb_cwf_sent()
819 811 {
820 812 param_local.local_sbm1_nb_cwf_sent = 0;
821 813 }
822 814
823 815 void reset_local_sbm2_nb_cwf_sent()
824 816 {
825 817 param_local.local_sbm2_nb_cwf_sent = 0;
826 818 }
General Comments 0
You need to be logged in to leave comments. Login now