##// END OF EJS Templates
Current version with modes NORMAL and SBM1 operational
paul@pc-solar1.lab-lpp.local -
r21:a92d7ea3b165 default
parent child
Show More
@@ -1,225 +1,225
1 1 #############################################################################
2 # Makefile for building: bin/fsw
3 # Generated by qmake (2.01a) (Qt 4.8.4) on: Thu May 23 15:08:17 2013
2 # Makefile for building: bin/fsw$(SW_VERSION)
3 # Generated by qmake (2.01a) (Qt 4.8.4) on: Fri Jun 14 07:50:58 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 = -DPRINT_MESSAGES_ON_CONSOLE
13 DEFINES = -DSW_VERSION_N1=0 -DSW_VERSION_N2=0 -DSW_VERSION_N3=0 -DSW_VERSION_N4=4 -DPRINT_MESSAGES_ON_CONSOLE
14 14 CFLAGS = -pipe -O3 -Wall $(DEFINES)
15 15 CXXFLAGS = -pipe -O3 -Wall $(DEFINES)
16 16 INCPATH = -I/usr/lib64/qt4/mkspecs/linux-g++ -I. -I../src -I../header
17 17 LINK = sparc-rtems-g++
18 18 LFLAGS =
19 19 LIBS = $(SUBLIBS)
20 20 AR = sparc-rtems-ar rcs
21 21 RANLIB =
22 22 QMAKE = /usr/bin/qmake-qt4
23 23 TAR = tar -cf
24 24 COMPRESS = gzip -9f
25 25 COPY = cp -f
26 26 SED = sed
27 27 COPY_FILE = $(COPY)
28 28 COPY_DIR = $(COPY) -r
29 29 STRIP = sparc-rtems-strip
30 30 INSTALL_FILE = install -m 644 -p
31 31 INSTALL_DIR = $(COPY_DIR)
32 32 INSTALL_PROGRAM = install -m 755 -p
33 33 DEL_FILE = rm -f
34 34 SYMLINK = ln -f -s
35 35 DEL_DIR = rmdir
36 36 MOVE = mv -f
37 37 CHK_DIR_EXISTS= test -d
38 38 MKDIR = mkdir -p
39 39
40 40 ####### Output directory
41 41
42 42 OBJECTS_DIR = obj/
43 43
44 44 ####### Files
45 45
46 46 SOURCES = ../src/wf_handler.c \
47 47 ../src/tc_handler.c \
48 48 ../src/fsw_processing.c \
49 49 ../src/fsw_misc.c \
50 50 ../src/fsw_init.c \
51 51 ../src/fsw_globals.c
52 52 OBJECTS = obj/wf_handler.o \
53 53 obj/tc_handler.o \
54 54 obj/fsw_processing.o \
55 55 obj/fsw_misc.o \
56 56 obj/fsw_init.o \
57 57 obj/fsw_globals.o
58 58 DIST = /usr/lib64/qt4/mkspecs/common/unix.conf \
59 59 /usr/lib64/qt4/mkspecs/common/linux.conf \
60 60 /usr/lib64/qt4/mkspecs/common/gcc-base.conf \
61 61 /usr/lib64/qt4/mkspecs/common/gcc-base-unix.conf \
62 62 /usr/lib64/qt4/mkspecs/common/g++-base.conf \
63 63 /usr/lib64/qt4/mkspecs/common/g++-unix.conf \
64 64 /usr/lib64/qt4/mkspecs/qconfig.pri \
65 /usr/lib64/qt4/mkspecs/modules/qt_webkit_version.pri \
65 /usr/lib64/qt4/mkspecs/modules/qt_webkit.pri \
66 66 /usr/lib64/qt4/mkspecs/features/qt_functions.prf \
67 67 /usr/lib64/qt4/mkspecs/features/qt_config.prf \
68 68 /usr/lib64/qt4/mkspecs/features/exclusive_builds.prf \
69 69 /usr/lib64/qt4/mkspecs/features/default_pre.prf \
70 70 sparc.pri \
71 71 /usr/lib64/qt4/mkspecs/features/release.prf \
72 72 /usr/lib64/qt4/mkspecs/features/default_post.prf \
73 73 /usr/lib64/qt4/mkspecs/features/unix/gdb_dwarf_index.prf \
74 74 /usr/lib64/qt4/mkspecs/features/warn_on.prf \
75 75 /usr/lib64/qt4/mkspecs/features/resources.prf \
76 76 /usr/lib64/qt4/mkspecs/features/uic.prf \
77 77 /usr/lib64/qt4/mkspecs/features/yacc.prf \
78 78 /usr/lib64/qt4/mkspecs/features/lex.prf \
79 79 /usr/lib64/qt4/mkspecs/features/include_source_dir.prf \
80 80 fsw-qt.pro
81 QMAKE_TARGET = fsw
81 QMAKE_TARGET = fsw$(SW_VERSION)
82 82 DESTDIR = bin/
83 TARGET = bin/fsw
83 TARGET = bin/fsw$(SW_VERSION)
84 84
85 85 first: all
86 86 ####### Implicit rules
87 87
88 88 .SUFFIXES: .o .c .cpp .cc .cxx .C
89 89
90 90 .cpp.o:
91 91 $(CXX) -c $(CXXFLAGS) $(INCPATH) -o "$@" "$<"
92 92
93 93 .cc.o:
94 94 $(CXX) -c $(CXXFLAGS) $(INCPATH) -o "$@" "$<"
95 95
96 96 .cxx.o:
97 97 $(CXX) -c $(CXXFLAGS) $(INCPATH) -o "$@" "$<"
98 98
99 99 .C.o:
100 100 $(CXX) -c $(CXXFLAGS) $(INCPATH) -o "$@" "$<"
101 101
102 102 .c.o:
103 103 $(CC) -c $(CFLAGS) $(INCPATH) -o "$@" "$<"
104 104
105 105 ####### Build rules
106 106
107 107 all: Makefile $(TARGET)
108 108
109 109 $(TARGET): $(OBJECTS)
110 110 @$(CHK_DIR_EXISTS) bin/ || $(MKDIR) bin/
111 111 $(LINK) $(LFLAGS) -o $(TARGET) $(OBJECTS) $(OBJCOMP) $(LIBS)
112 112
113 113 Makefile: fsw-qt.pro /usr/lib64/qt4/mkspecs/linux-g++/qmake.conf /usr/lib64/qt4/mkspecs/common/unix.conf \
114 114 /usr/lib64/qt4/mkspecs/common/linux.conf \
115 115 /usr/lib64/qt4/mkspecs/common/gcc-base.conf \
116 116 /usr/lib64/qt4/mkspecs/common/gcc-base-unix.conf \
117 117 /usr/lib64/qt4/mkspecs/common/g++-base.conf \
118 118 /usr/lib64/qt4/mkspecs/common/g++-unix.conf \
119 119 /usr/lib64/qt4/mkspecs/qconfig.pri \
120 /usr/lib64/qt4/mkspecs/modules/qt_webkit_version.pri \
120 /usr/lib64/qt4/mkspecs/modules/qt_webkit.pri \
121 121 /usr/lib64/qt4/mkspecs/features/qt_functions.prf \
122 122 /usr/lib64/qt4/mkspecs/features/qt_config.prf \
123 123 /usr/lib64/qt4/mkspecs/features/exclusive_builds.prf \
124 124 /usr/lib64/qt4/mkspecs/features/default_pre.prf \
125 125 sparc.pri \
126 126 /usr/lib64/qt4/mkspecs/features/release.prf \
127 127 /usr/lib64/qt4/mkspecs/features/default_post.prf \
128 128 /usr/lib64/qt4/mkspecs/features/unix/gdb_dwarf_index.prf \
129 129 /usr/lib64/qt4/mkspecs/features/warn_on.prf \
130 130 /usr/lib64/qt4/mkspecs/features/resources.prf \
131 131 /usr/lib64/qt4/mkspecs/features/uic.prf \
132 132 /usr/lib64/qt4/mkspecs/features/yacc.prf \
133 133 /usr/lib64/qt4/mkspecs/features/lex.prf \
134 134 /usr/lib64/qt4/mkspecs/features/include_source_dir.prf
135 135 $(QMAKE) -spec /usr/lib64/qt4/mkspecs/linux-g++ -o Makefile fsw-qt.pro
136 136 /usr/lib64/qt4/mkspecs/common/unix.conf:
137 137 /usr/lib64/qt4/mkspecs/common/linux.conf:
138 138 /usr/lib64/qt4/mkspecs/common/gcc-base.conf:
139 139 /usr/lib64/qt4/mkspecs/common/gcc-base-unix.conf:
140 140 /usr/lib64/qt4/mkspecs/common/g++-base.conf:
141 141 /usr/lib64/qt4/mkspecs/common/g++-unix.conf:
142 142 /usr/lib64/qt4/mkspecs/qconfig.pri:
143 /usr/lib64/qt4/mkspecs/modules/qt_webkit_version.pri:
143 /usr/lib64/qt4/mkspecs/modules/qt_webkit.pri:
144 144 /usr/lib64/qt4/mkspecs/features/qt_functions.prf:
145 145 /usr/lib64/qt4/mkspecs/features/qt_config.prf:
146 146 /usr/lib64/qt4/mkspecs/features/exclusive_builds.prf:
147 147 /usr/lib64/qt4/mkspecs/features/default_pre.prf:
148 148 sparc.pri:
149 149 /usr/lib64/qt4/mkspecs/features/release.prf:
150 150 /usr/lib64/qt4/mkspecs/features/default_post.prf:
151 151 /usr/lib64/qt4/mkspecs/features/unix/gdb_dwarf_index.prf:
152 152 /usr/lib64/qt4/mkspecs/features/warn_on.prf:
153 153 /usr/lib64/qt4/mkspecs/features/resources.prf:
154 154 /usr/lib64/qt4/mkspecs/features/uic.prf:
155 155 /usr/lib64/qt4/mkspecs/features/yacc.prf:
156 156 /usr/lib64/qt4/mkspecs/features/lex.prf:
157 157 /usr/lib64/qt4/mkspecs/features/include_source_dir.prf:
158 158 qmake: FORCE
159 159 @$(QMAKE) -spec /usr/lib64/qt4/mkspecs/linux-g++ -o Makefile fsw-qt.pro
160 160
161 161 dist:
162 @$(CHK_DIR_EXISTS) obj/fsw1.0.0 || $(MKDIR) obj/fsw1.0.0
163 $(COPY_FILE) --parents $(SOURCES) $(DIST) obj/fsw1.0.0/ && (cd `dirname obj/fsw1.0.0` && $(TAR) fsw1.0.0.tar fsw1.0.0 && $(COMPRESS) fsw1.0.0.tar) && $(MOVE) `dirname obj/fsw1.0.0`/fsw1.0.0.tar.gz . && $(DEL_FILE) -r obj/fsw1.0.0
162 @$(CHK_DIR_EXISTS) obj/fsw$(SW_VERSION)1.0.0 || $(MKDIR) obj/fsw$(SW_VERSION)1.0.0
163 $(COPY_FILE) --parents $(SOURCES) $(DIST) obj/fsw$(SW_VERSION)1.0.0/ && (cd `dirname obj/fsw$(SW_VERSION)1.0.0` && $(TAR) fsw$(SW_VERSION)1.0.0.tar fsw$(SW_VERSION)1.0.0 && $(COMPRESS) fsw$(SW_VERSION)1.0.0.tar) && $(MOVE) `dirname obj/fsw$(SW_VERSION)1.0.0`/fsw$(SW_VERSION)1.0.0.tar.gz . && $(DEL_FILE) -r obj/fsw$(SW_VERSION)1.0.0
164 164
165 165
166 166 clean:compiler_clean
167 167 -$(DEL_FILE) $(OBJECTS)
168 168 -$(DEL_FILE) *~ core *.core
169 169
170 170
171 171 ####### Sub-libraries
172 172
173 173 distclean: clean
174 174 -$(DEL_FILE) $(TARGET)
175 175 -$(DEL_FILE) Makefile
176 176
177 177
178 178 grmon:
179 179 cd bin && C:/opt/grmon-eval-2.0.29b/win32/bin/grmon.exe -uart COM4 -u
180 180
181 181 check: first
182 182
183 183 compiler_rcc_make_all:
184 184 compiler_rcc_clean:
185 185 compiler_uic_make_all:
186 186 compiler_uic_clean:
187 187 compiler_image_collection_make_all: qmake_image_collection.cpp
188 188 compiler_image_collection_clean:
189 189 -$(DEL_FILE) qmake_image_collection.cpp
190 190 compiler_yacc_decl_make_all:
191 191 compiler_yacc_decl_clean:
192 192 compiler_yacc_impl_make_all:
193 193 compiler_yacc_impl_clean:
194 194 compiler_lex_make_all:
195 195 compiler_lex_clean:
196 196 compiler_clean:
197 197
198 198 ####### Compile
199 199
200 200 obj/wf_handler.o: ../src/wf_handler.c
201 201 $(CC) -c $(CFLAGS) $(INCPATH) -o obj/wf_handler.o ../src/wf_handler.c
202 202
203 203 obj/tc_handler.o: ../src/tc_handler.c
204 204 $(CC) -c $(CFLAGS) $(INCPATH) -o obj/tc_handler.o ../src/tc_handler.c
205 205
206 206 obj/fsw_processing.o: ../src/fsw_processing.c
207 207 $(CC) -c $(CFLAGS) $(INCPATH) -o obj/fsw_processing.o ../src/fsw_processing.c
208 208
209 209 obj/fsw_misc.o: ../src/fsw_misc.c
210 210 $(CC) -c $(CFLAGS) $(INCPATH) -o obj/fsw_misc.o ../src/fsw_misc.c
211 211
212 212 obj/fsw_init.o: ../src/fsw_init.c
213 213 $(CC) -c $(CFLAGS) $(INCPATH) -o obj/fsw_init.o ../src/fsw_init.c
214 214
215 215 obj/fsw_globals.o: ../src/fsw_globals.c
216 216 $(CC) -c $(CFLAGS) $(INCPATH) -o obj/fsw_globals.o ../src/fsw_globals.c
217 217
218 218 ####### Install
219 219
220 220 install: FORCE
221 221
222 222 uninstall: FORCE
223 223
224 224 FORCE:
225 225
1 NO CONTENT: modified file, binary diff hidden
@@ -1,44 +1,51
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 # flight software version
10 SW_VERSION=-0-5
11 DEFINES += SW_VERSION_N1=0
12 DEFINES += SW_VERSION_N2=0
13 DEFINES += SW_VERSION_N3=0
14 DEFINES += SW_VERSION_N4=5
15
9 16 contains( CONFIG, verbose ) {
10 17 DEFINES += PRINT_MESSAGES_ON_CONSOLE
11 18 }
12 19
13 20 contains( CONFIG, cpu_usage_report ) {
14 21 DEFINES += PRINT_TASK_STATISTICS
15 22 }
16 23
17 TARGET = fsw
24 TARGET = fsw$(SW_VERSION)
18 25 contains( CONFIG, gsa ) {
19 26 DEFINES += GSA
20 TARGET = fsw-gsa
27 TARGET = fsw-gsa$(SW_VERSION)
21 28 }
22 29
23 30 INCLUDEPATH += \
24 31 ../src \
25 32 ../header
26 33
27 34 SOURCES += \
28 35 ../src/wf_handler.c \
29 36 ../src/tc_handler.c \
30 37 ../src/fsw_processing.c \
31 38 ../src/fsw_misc.c \
32 39 ../src/fsw_init.c \
33 40 ../src/fsw_globals.c
34 41
35 42 HEADERS += \
36 43 ../header/wf_handler.h \
37 44 ../header/tc_handler.h \
38 45 ../header/grlib_regs.h \
39 46 ../header/fsw_processing.h \
40 47 ../header/fsw_params.h \
41 48 ../header/fsw_misc.h \
42 49 ../header/fsw_init.h \
43 50 ../header/ccsds_types.h
44 51
@@ -1,265 +1,265
1 1 <?xml version="1.0" encoding="UTF-8"?>
2 2 <!DOCTYPE QtCreatorProject>
3 <!-- Written by Qt Creator 2.4.1, 2013-06-04T15:59:14. -->
3 <!-- Written by Qt Creator 2.4.1, 2013-06-17T15:56:28. -->
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 <valuemap type="QVariantMap" key="EditorConfiguration.CodeStyle.0">
15 15 <value type="QString" key="language">Cpp</value>
16 16 <valuemap type="QVariantMap" key="value">
17 17 <value type="QString" key="CurrentPreferences">CppGlobal</value>
18 18 </valuemap>
19 19 </valuemap>
20 20 <valuemap type="QVariantMap" key="EditorConfiguration.CodeStyle.1">
21 21 <value type="QString" key="language">QmlJS</value>
22 22 <valuemap type="QVariantMap" key="value">
23 23 <value type="QString" key="CurrentPreferences">QmlJSGlobal</value>
24 24 </valuemap>
25 25 </valuemap>
26 26 <value type="int" key="EditorConfiguration.CodeStyle.Count">2</value>
27 27 <value type="QByteArray" key="EditorConfiguration.Codec">System</value>
28 28 <value type="bool" key="EditorConfiguration.ConstrainTooltips">false</value>
29 29 <value type="int" key="EditorConfiguration.IndentSize">4</value>
30 30 <value type="bool" key="EditorConfiguration.MouseNavigation">true</value>
31 31 <value type="int" key="EditorConfiguration.PaddingMode">1</value>
32 32 <value type="bool" key="EditorConfiguration.ScrollWheelZooming">true</value>
33 33 <value type="int" key="EditorConfiguration.SmartBackspaceBehavior">0</value>
34 34 <value type="bool" key="EditorConfiguration.SpacesForTabs">true</value>
35 35 <value type="int" key="EditorConfiguration.TabKeyBehavior">0</value>
36 36 <value type="int" key="EditorConfiguration.TabSize">8</value>
37 37 <value type="bool" key="EditorConfiguration.UseGlobal">true</value>
38 38 <value type="int" key="EditorConfiguration.Utf8BomBehavior">1</value>
39 39 <value type="bool" key="EditorConfiguration.addFinalNewLine">true</value>
40 40 <value type="bool" key="EditorConfiguration.cleanIndentation">true</value>
41 41 <value type="bool" key="EditorConfiguration.cleanWhitespace">true</value>
42 42 <value type="bool" key="EditorConfiguration.inEntireDocument">false</value>
43 43 </valuemap>
44 44 </data>
45 45 <data>
46 46 <variable>ProjectExplorer.Project.PluginSettings</variable>
47 47 <valuemap type="QVariantMap"/>
48 48 </data>
49 49 <data>
50 50 <variable>ProjectExplorer.Project.Target.0</variable>
51 51 <valuemap type="QVariantMap">
52 52 <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Desktop</value>
53 53 <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Desktop</value>
54 54 <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.Target.DesktopTarget</value>
55 55 <value type="int" key="ProjectExplorer.Target.ActiveBuildConfiguration">0</value>
56 56 <value type="int" key="ProjectExplorer.Target.ActiveDeployConfiguration">0</value>
57 57 <value type="int" key="ProjectExplorer.Target.ActiveRunConfiguration">0</value>
58 58 <valuemap type="QVariantMap" key="ProjectExplorer.Target.BuildConfiguration.0">
59 59 <value type="QString" key="ProjectExplorer.BuildCOnfiguration.ToolChain">ProjectExplorer.ToolChain.Gcc:/usr/bin/g++.x86-linux-generic-elf-64bit./usr/bin/gdb</value>
60 60 <valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.0">
61 61 <valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
62 62 <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">qmake</value>
63 63 <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
64 64 <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">QtProjectManager.QMakeBuildStep</value>
65 65 <value type="bool" key="QtProjectManager.QMakeBuildStep.LinkQmlDebuggingLibrary">false</value>
66 66 <value type="bool" key="QtProjectManager.QMakeBuildStep.LinkQmlDebuggingLibraryAuto">true</value>
67 67 <value type="QString" key="QtProjectManager.QMakeBuildStep.QMakeArguments"></value>
68 68 <value type="bool" key="QtProjectManager.QMakeBuildStep.QMakeForced">false</value>
69 69 </valuemap>
70 70 <valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.1">
71 71 <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Make</value>
72 72 <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
73 73 <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.MakeStep</value>
74 74 <value type="bool" key="Qt4ProjectManager.MakeStep.Clean">false</value>
75 75 <value type="QString" key="Qt4ProjectManager.MakeStep.MakeArguments"></value>
76 76 <value type="QString" key="Qt4ProjectManager.MakeStep.MakeCommand"></value>
77 77 </valuemap>
78 78 <value type="int" key="ProjectExplorer.BuildStepList.StepsCount">2</value>
79 79 <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Build</value>
80 80 <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
81 81 <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Build</value>
82 82 </valuemap>
83 83 <valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.1">
84 84 <valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
85 85 <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Make</value>
86 86 <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
87 87 <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.MakeStep</value>
88 88 <value type="bool" key="Qt4ProjectManager.MakeStep.Clean">true</value>
89 89 <value type="QString" key="Qt4ProjectManager.MakeStep.MakeArguments">clean</value>
90 90 <value type="QString" key="Qt4ProjectManager.MakeStep.MakeCommand"></value>
91 91 </valuemap>
92 92 <value type="int" key="ProjectExplorer.BuildStepList.StepsCount">1</value>
93 93 <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Clean</value>
94 94 <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
95 95 <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Clean</value>
96 96 </valuemap>
97 97 <value type="int" key="ProjectExplorer.BuildConfiguration.BuildStepListCount">2</value>
98 98 <value type="bool" key="ProjectExplorer.BuildConfiguration.ClearSystemEnvironment">false</value>
99 99 <valuelist type="QVariantList" key="ProjectExplorer.BuildConfiguration.UserEnvironmentChanges"/>
100 100 <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Qt 4.8.2 in PATH (System) Release</value>
101 101 <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
102 102 <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.Qt4BuildConfiguration</value>
103 103 <value type="int" key="Qt4ProjectManager.Qt4BuildConfiguration.BuildConfiguration">0</value>
104 104 <value type="QString" key="Qt4ProjectManager.Qt4BuildConfiguration.BuildDirectory">/opt/DEV_PLE/FSW-qt</value>
105 105 <value type="int" key="Qt4ProjectManager.Qt4BuildConfiguration.QtVersionId">1</value>
106 106 <value type="bool" key="Qt4ProjectManager.Qt4BuildConfiguration.UseShadowBuild">false</value>
107 107 </valuemap>
108 108 <valuemap type="QVariantMap" key="ProjectExplorer.Target.BuildConfiguration.1">
109 109 <value type="QString" key="ProjectExplorer.BuildCOnfiguration.ToolChain">ProjectExplorer.ToolChain.Gcc:/usr/bin/g++.x86-linux-generic-elf-64bit./usr/bin/gdb</value>
110 110 <valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.0">
111 111 <valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
112 112 <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">qmake</value>
113 113 <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
114 114 <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">QtProjectManager.QMakeBuildStep</value>
115 115 <value type="bool" key="QtProjectManager.QMakeBuildStep.LinkQmlDebuggingLibrary">false</value>
116 116 <value type="bool" key="QtProjectManager.QMakeBuildStep.LinkQmlDebuggingLibraryAuto">true</value>
117 117 <value type="QString" key="QtProjectManager.QMakeBuildStep.QMakeArguments"></value>
118 118 <value type="bool" key="QtProjectManager.QMakeBuildStep.QMakeForced">false</value>
119 119 </valuemap>
120 120 <valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.1">
121 121 <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Make</value>
122 122 <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
123 123 <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.MakeStep</value>
124 124 <value type="bool" key="Qt4ProjectManager.MakeStep.Clean">false</value>
125 125 <value type="QString" key="Qt4ProjectManager.MakeStep.MakeArguments"></value>
126 126 <value type="QString" key="Qt4ProjectManager.MakeStep.MakeCommand"></value>
127 127 </valuemap>
128 128 <value type="int" key="ProjectExplorer.BuildStepList.StepsCount">2</value>
129 129 <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Build</value>
130 130 <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
131 131 <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Build</value>
132 132 </valuemap>
133 133 <valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.1">
134 134 <valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
135 135 <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Make</value>
136 136 <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
137 137 <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.MakeStep</value>
138 138 <value type="bool" key="Qt4ProjectManager.MakeStep.Clean">true</value>
139 139 <value type="QString" key="Qt4ProjectManager.MakeStep.MakeArguments">clean</value>
140 140 <value type="QString" key="Qt4ProjectManager.MakeStep.MakeCommand"></value>
141 141 </valuemap>
142 142 <value type="int" key="ProjectExplorer.BuildStepList.StepsCount">1</value>
143 143 <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Clean</value>
144 144 <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
145 145 <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Clean</value>
146 146 </valuemap>
147 147 <value type="int" key="ProjectExplorer.BuildConfiguration.BuildStepListCount">2</value>
148 148 <value type="bool" key="ProjectExplorer.BuildConfiguration.ClearSystemEnvironment">false</value>
149 149 <valuelist type="QVariantList" key="ProjectExplorer.BuildConfiguration.UserEnvironmentChanges"/>
150 150 <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Qt 4.8.2 in PATH (System) Debug</value>
151 151 <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
152 152 <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.Qt4BuildConfiguration</value>
153 153 <value type="int" key="Qt4ProjectManager.Qt4BuildConfiguration.BuildConfiguration">2</value>
154 154 <value type="QString" key="Qt4ProjectManager.Qt4BuildConfiguration.BuildDirectory">/opt/DEV_PLE/FSW-qt</value>
155 155 <value type="int" key="Qt4ProjectManager.Qt4BuildConfiguration.QtVersionId">1</value>
156 156 <value type="bool" key="Qt4ProjectManager.Qt4BuildConfiguration.UseShadowBuild">false</value>
157 157 </valuemap>
158 158 <value type="int" key="ProjectExplorer.Target.BuildConfigurationCount">2</value>
159 159 <valuemap type="QVariantMap" key="ProjectExplorer.Target.DeployConfiguration.0">
160 160 <valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.0">
161 161 <value type="int" key="ProjectExplorer.BuildStepList.StepsCount">0</value>
162 162 <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Deploy</value>
163 163 <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
164 164 <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Deploy</value>
165 165 </valuemap>
166 166 <value type="int" key="ProjectExplorer.BuildConfiguration.BuildStepListCount">1</value>
167 167 <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">No deployment</value>
168 168 <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
169 169 <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.DefaultDeployConfiguration</value>
170 170 </valuemap>
171 171 <value type="int" key="ProjectExplorer.Target.DeployConfigurationCount">1</value>
172 172 <valuemap type="QVariantMap" key="ProjectExplorer.Target.RunConfiguration.0">
173 173 <value type="bool" key="Analyzer.Project.UseGlobal">true</value>
174 174 <value type="bool" key="Analyzer.Project.UseGlobal">true</value>
175 175 <valuelist type="QVariantList" key="Analyzer.Valgrind.AddedSuppressionFiles"/>
176 176 <valuelist type="QVariantList" key="Analyzer.Valgrind.AddedSuppressionFiles"/>
177 177 <value type="bool" key="Analyzer.Valgrind.Callgrind.CollectBusEvents">false</value>
178 178 <value type="bool" key="Analyzer.Valgrind.Callgrind.CollectBusEvents">false</value>
179 179 <value type="bool" key="Analyzer.Valgrind.Callgrind.CollectSystime">false</value>
180 180 <value type="bool" key="Analyzer.Valgrind.Callgrind.CollectSystime">false</value>
181 181 <value type="bool" key="Analyzer.Valgrind.Callgrind.EnableBranchSim">false</value>
182 182 <value type="bool" key="Analyzer.Valgrind.Callgrind.EnableBranchSim">false</value>
183 183 <value type="bool" key="Analyzer.Valgrind.Callgrind.EnableCacheSim">false</value>
184 184 <value type="bool" key="Analyzer.Valgrind.Callgrind.EnableCacheSim">false</value>
185 185 <value type="bool" key="Analyzer.Valgrind.Callgrind.EnableEventToolTips">true</value>
186 186 <value type="bool" key="Analyzer.Valgrind.Callgrind.EnableEventToolTips">true</value>
187 187 <value type="double" key="Analyzer.Valgrind.Callgrind.MinimumCostRatio">0.01</value>
188 188 <value type="double" key="Analyzer.Valgrind.Callgrind.MinimumCostRatio">0.01</value>
189 189 <value type="double" key="Analyzer.Valgrind.Callgrind.VisualisationMinimumCostRatio">10</value>
190 190 <value type="double" key="Analyzer.Valgrind.Callgrind.VisualisationMinimumCostRatio">10</value>
191 191 <value type="bool" key="Analyzer.Valgrind.FilterExternalIssues">true</value>
192 192 <value type="bool" key="Analyzer.Valgrind.FilterExternalIssues">true</value>
193 193 <value type="int" key="Analyzer.Valgrind.NumCallers">25</value>
194 194 <value type="int" key="Analyzer.Valgrind.NumCallers">25</value>
195 195 <valuelist type="QVariantList" key="Analyzer.Valgrind.RemovedSuppressionFiles"/>
196 196 <valuelist type="QVariantList" key="Analyzer.Valgrind.RemovedSuppressionFiles"/>
197 197 <value type="bool" key="Analyzer.Valgrind.TrackOrigins">true</value>
198 198 <value type="bool" key="Analyzer.Valgrind.TrackOrigins">true</value>
199 199 <value type="QString" key="Analyzer.Valgrind.ValgrindExecutable">valgrind</value>
200 200 <value type="QString" key="Analyzer.Valgrind.ValgrindExecutable">valgrind</value>
201 201 <valuelist type="QVariantList" key="Analyzer.Valgrind.VisibleErrorKinds">
202 202 <value type="int">0</value>
203 203 <value type="int">1</value>
204 204 <value type="int">2</value>
205 205 <value type="int">3</value>
206 206 <value type="int">4</value>
207 207 <value type="int">5</value>
208 208 <value type="int">6</value>
209 209 <value type="int">7</value>
210 210 <value type="int">8</value>
211 211 <value type="int">9</value>
212 212 <value type="int">10</value>
213 213 <value type="int">11</value>
214 214 <value type="int">12</value>
215 215 <value type="int">13</value>
216 216 <value type="int">14</value>
217 217 </valuelist>
218 218 <valuelist type="QVariantList" key="Analyzer.Valgrind.VisibleErrorKinds">
219 219 <value type="int">0</value>
220 220 <value type="int">1</value>
221 221 <value type="int">2</value>
222 222 <value type="int">3</value>
223 223 <value type="int">4</value>
224 224 <value type="int">5</value>
225 225 <value type="int">6</value>
226 226 <value type="int">7</value>
227 227 <value type="int">8</value>
228 228 <value type="int">9</value>
229 229 <value type="int">10</value>
230 230 <value type="int">11</value>
231 231 <value type="int">12</value>
232 232 <value type="int">13</value>
233 233 <value type="int">14</value>
234 234 </valuelist>
235 235 <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">fsw-qt</value>
236 236 <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
237 237 <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.Qt4RunConfiguration</value>
238 238 <value type="int" key="Qt4ProjectManager.Qt4RunConfiguration.BaseEnvironmentBase">2</value>
239 239 <value type="QString" key="Qt4ProjectManager.Qt4RunConfiguration.CommandLineArguments"></value>
240 240 <value type="QString" key="Qt4ProjectManager.Qt4RunConfiguration.ProFile">fsw-qt.pro</value>
241 241 <value type="bool" key="Qt4ProjectManager.Qt4RunConfiguration.UseDyldImageSuffix">false</value>
242 242 <value type="bool" key="Qt4ProjectManager.Qt4RunConfiguration.UseTerminal">true</value>
243 243 <valuelist type="QVariantList" key="Qt4ProjectManager.Qt4RunConfiguration.UserEnvironmentChanges"/>
244 244 <value type="QString" key="Qt4ProjectManager.Qt4RunConfiguration.UserWorkingDirectory"></value>
245 245 <value type="uint" key="RunConfiguration.QmlDebugServerPort">3768</value>
246 246 <value type="bool" key="RunConfiguration.UseCppDebugger">true</value>
247 247 <value type="bool" key="RunConfiguration.UseQmlDebugger">false</value>
248 248 <value type="bool" key="RunConfiguration.UseQmlDebuggerAuto">false</value>
249 249 </valuemap>
250 250 <value type="int" key="ProjectExplorer.Target.RunConfigurationCount">1</value>
251 251 </valuemap>
252 252 </data>
253 253 <data>
254 254 <variable>ProjectExplorer.Project.TargetCount</variable>
255 255 <value type="int">1</value>
256 256 </data>
257 257 <data>
258 258 <variable>ProjectExplorer.Project.Updater.EnvironmentId</variable>
259 259 <value type="QString">{2e58a81f-9962-4bba-ae6b-760177f0656c}</value>
260 260 </data>
261 261 <data>
262 262 <variable>ProjectExplorer.Project.Updater.FileVersion</variable>
263 263 <value type="int">10</value>
264 264 </data>
265 265 </qtcreator>
@@ -1,307 +1,308
1 1 #ifndef CCSDS_H_INCLUDED
2 2 #define CCSDS_H_INCLUDED
3 3
4 4 #define CCSDS_TELEMETRY_HEADER_LENGTH 16+4
5 5 #define CCSDS_TM_PKT_MAX_SIZE 4412
6 6 #define CCSDS_TELECOMMAND_HEADER_LENGTH 10+4
7 7 #define CCSDS_TC_PKT_MAX_SIZE 256
8 8 #define CCSDS_TC_PKT_MIN_SIZE 16
9 9 #define CCSDS_TC_TM_PACKET_OFFSET 7
10 10 #define CCSDS_PROCESS_ID 76
11 11 #define CCSDS_PACKET_CATEGORY 12
12 12 #define CCSDS_NODE_ADDRESS 0xfe
13 13 //
14 14 #define CCSDS_DESTINATION_ID_GROUND 0x00
15 15 #define CCSDS_DESTINATION_ID 0x01
16 16 #define CCSDS_DESTINATION_ID_DPU 0x01
17 17 //
18 18 #define CCSDS_PROTOCOLE_ID 0x02
19 19 #define CCSDS_USER_APP 0x00
20 20
21 21 #define SIZE_TM_LFR_TC_EXE_NOT_IMPLEMENTED 24
22 22 #define SIZE_TM_LFR_TC_EXE_CORRUPTED 32
23 #define SIZE_HK_PARAMETERS 112
23 24
24 25 #define ILLEGAL_APID 0
25 26 #define WRONG_LEN_PACKET 1
26 27 #define INCOR_CHECKSUM 2
27 28 #define ILL_TYPE 3
28 29 #define ILL_SUBTYPE 4
29 30 #define WRONG_APP_DATA 5
30 31 #define WRONG_CMD_CODE 6
31 32 #define CCSDS_TM_VALID 7
32 33
33 34 // TC TYPES
34 35 #define TC_TYPE_GEN 181
35 36 #define TC_TYPE_TIME 9
36 37
37 38 // TC SUBTYPES
38 39 #define TC_SUBTYPE_RESET 1
39 40 #define TC_SUBTYPE_LOAD_COMM 11
40 41 #define TC_SUBTYPE_LOAD_NORM 13
41 42 #define TC_SUBTYPE_LOAD_BURST 19
42 43 #define TC_SUBTYPE_LOAD_SBM1 25
43 44 #define TC_SUBTYPE_LOAD_SBM2 27
44 45 #define TC_SUBTYPE_DUMP 31
45 46 #define TC_SUBTYPE_ENTER 41
46 47 #define TC_SUBTYPE_UPDT_INFO 51
47 48 #define TC_SUBTYPE_EN_CAL 61
48 49 #define TC_SUBTYPE_DIS_CAL 63
49 50 #define TC_SUBTYPE_UPDT_TIME 129
50 51
51 52 // TC LEN
52 53 #define TC_LEN_RESET 12
53 54 #define TC_LEN_LOAD_COMM 14
54 55 #define TC_LEN_LOAD_NORM 20
55 56 #define TC_LEN_LOAD_BURST 14
56 57 #define TC_LEN_LOAD_SBM1 14
57 58 #define TC_LEN_LOAD_SBM2 14
58 59 #define TC_LEN_DUMP 12
59 60 #define TC_LEN_ENTER 20
60 61 #define TC_LEN_UPDT_INFO 48
61 62 #define TC_LEN_EN_CAL 12
62 63 #define TC_LEN_DIS_CAL 12
63 64 #define TC_LEN_UPDT_TIME 18
64 65
65 66 // TM TYPES
66 67 #define TM_TYPE_LFR_SCIENCE 21
68 #define TM_TYPE_HK 3
67 69
68 70 // TM SUBTYPES
69 71 #define TM_SUBTYPE_EXE_OK 7
70 72 #define TM_SUBTYPE_EXE_NOK 8
71 73 #define TM_SUBTYPE_HK 25
72 74 #define TM_SUBTYPE_SCIENCE 3
73 75 #define TM_SUBTYPE_LFR_SCIENCE 3
74 76
77 // TM SID
75 78 #define SID_DEFAULT 0
76 79 #define SID_HK 1
77 80 #define SID_EXE_INC 5
78 81 #define SID_NOT_EXE 40000
79 82 #define SID_NOT_IMP 40002
80 83 #define SID_EXE_ERR 40003
81 84 #define SID_EXE_CORR 40005
82 85
83 86 #define SID_NORM_SWF_F0 3
84 87 #define SID_NORM_SWF_F1 4
85 88 #define SID_NORM_SWF_F2 5
86 89 #define SID_NORM_CWF_F3 1
87 90 #define SID_BURST_CWF_F2 2
88 91 #define SID_SBM1_CWF_F1 24
89 92 #define SID_SBM2_CWF_F2 25
90 93 #define SID_NORM_ASM_F0 11
91 94 #define SID_NORM_ASM_F1 12
92 95 #define SID_NORM_ASM_F2 13
93 96 #define SID_NORM_BP1_F0 14
94 97 #define SID_NORM_BP1_F1 15
95 98 #define SID_NORM_BP1_F2 16
96 99 #define SID_NORM_BP2_F0 19
97 100 #define SID_NORM_BP2_F1 20
98 101 #define SID_NORM_BP2_F2 21
99 102 #define SID_BURST_BP1_F0 17
100 103 #define SID_BURST_BP2_F0 22
101 104 #define SID_BURST_BP1_F1 18
102 105 #define SID_BURST_BP2_F1 23
103 106 #define SID_SBM1_BP1_F0 28
104 107 #define SID_SBM1_BP2_F0 31
105 108 #define SID_SBM2_BP1_F0 29
106 109 #define SID_SBM2_BP2_F0 32
107 110 #define SID_SBM1_BP1_F1 30
108 111 #define SID_SBM1_BP2_F1 33
109 112
110 113 // LENGTH (BYTES)
111 114 #define LENGTH_TM_LFR_HK 126
112 115 #define LENGTH_TM_LFR_TC_EXE_MAX 32
113 116 #define LENGTH_TM_LFR_SCIENCE_NORMAL_WF_MAX 4102
114 117 //
115 118 #define TM_LEN_EXE 20 - CCSDS_TC_TM_PACKET_OFFSET
116 119 #define TM_LEN_NOT_EXE 26 - CCSDS_TC_TM_PACKET_OFFSET
117 120 #define TM_LEN_NOT_IMP 24 - CCSDS_TC_TM_PACKET_OFFSET
118 121 #define TM_LEN_EXE_ERR 24 - CCSDS_TC_TM_PACKET_OFFSET
119 122 #define TM_LEN_EXE_CORR 32 - CCSDS_TC_TM_PACKET_OFFSET
120 123 #define TM_HEADER_LEN 16
121 124
122 125 #define LEN_TM_LFR_HK 126 + 4
123 126 #define LEN_TM_LFR_TC_EXE_NOT_IMP 24 +4
124 127
125 128 #define TM_LEN_SCI_NORM_SWF_340 340 * 12 + 6 + 10 - 1
126 129 #define TM_LEN_SCI_NORM_SWF_8 8 * 12 + 6 + 10 - 1
127 130
128 131 enum TM_TYPE{
129 132 TM_LFR_TC_EXE_OK,
130 133 TM_LFR_TC_EXE_ERR,
131 134 TM_LFR_HK,
132 135 TM_LFR_SCI,
133 136 TM_LFR_SCI_SBM,
134 137 TM_LFR_PAR_DUMP
135 138 };
136 139
137 140 struct TMHeader_str
138 141 {
139 142 volatile unsigned char targetLogicalAddress;
140 143 volatile unsigned char protocolIdentifier;
141 144 volatile unsigned char reserved;
142 145 volatile unsigned char userApplication;
143 146 volatile unsigned char packetID[2];
144 147 volatile unsigned char packetSequenceControl[2];
145 148 volatile unsigned char packetLength[2];
146 149 volatile unsigned char dataFieldHeader[10];
147 150 };
148 151 typedef struct TMHeader_str TMHeader_t;
149 152
150 struct Packet_TM_LFR_HK_str
151 {
152 volatile unsigned char targetLogicalAddress;
153 volatile unsigned char protocolIdentifier;
154 volatile unsigned char reserved;
155 volatile unsigned char userApplication;
156 volatile unsigned char packetID[2];
157 volatile unsigned char packetSequenceControl[2];
158 volatile unsigned char packetLength[2];
159 volatile unsigned char dataFieldHeader[10];
160 volatile unsigned char data[LENGTH_TM_LFR_HK - 10 + 1];
161 };
162 typedef struct Packet_TM_LFR_HK_str Packet_TM_LFR_HK_t;
163
164 153 struct Packet_TM_LFR_TC_EXE_str
165 154 {
166 155 volatile unsigned char targetLogicalAddress;
167 156 volatile unsigned char protocolIdentifier;
168 157 volatile unsigned char reserved;
169 158 volatile unsigned char userApplication;
170 159 volatile unsigned char packetID[2];
171 160 volatile unsigned char packetSequenceControl[2];
172 161 volatile unsigned char packetLength[2];
173 162 volatile unsigned char dataFieldHeader[10];
174 163 volatile unsigned char data[LENGTH_TM_LFR_TC_EXE_MAX - 10 + 1];
175 164 };
176 165 typedef struct Packet_TM_LFR_TC_EXE_str Packet_TM_LFR_TC_EXE_t;
177 166
178 167 struct Packet_TM_LFR_SCIENCE_NORMAL_WF_str
179 168 {
180 169 volatile unsigned char targetLogicalAddress;
181 170 volatile unsigned char protocolIdentifier;
182 171 volatile unsigned char reserved;
183 172 volatile unsigned char userApplication;
184 173 volatile unsigned char packetID[2];
185 174 volatile unsigned char packetSequenceControl[2];
186 175 volatile unsigned char packetLength[2];
187 176 volatile unsigned char dataFieldHeader[10];
188 177 volatile unsigned char auxiliaryHeader[6];
189 178 volatile unsigned char data[LENGTH_TM_LFR_SCIENCE_NORMAL_WF_MAX - 10 + 1];
190 179 };
191 180 typedef struct Packet_TM_LFR_SCIENCE_NORMAL_WF_str Packet_TM_LFR_SCIENCE_NORMAL_WF_t;
192 181
193 182 struct ExtendedTMHeader_str
194 183 {
195 184 volatile unsigned char targetLogicalAddress;
196 185 volatile unsigned char protocolIdentifier;
197 186 volatile unsigned char reserved;
198 187 volatile unsigned char userApplication;
199 188 volatile unsigned char packetID[2];
200 189 volatile unsigned char packetSequenceControl[2];
201 190 volatile unsigned char packetLength[2];
202 191 volatile unsigned char dataFieldHeader[10];
203 192 volatile unsigned char auxiliaryHeader[6];
204 193 };
205 194 typedef struct ExtendedTMHeader_str ExtendedTMHeader_t;
206 195
207 196 struct ccsdsTelecommandPacket_str
208 197 {
209 198 //unsigned char targetLogicalAddress; // removed by the grspw module
210 199 volatile unsigned char protocolIdentifier;
211 200 volatile unsigned char reserved;
212 201 volatile unsigned char userApplication;
213 202 volatile unsigned char packetID[2];
214 203 volatile unsigned char packetSequenceControl[2];
215 204 volatile unsigned char packetLength[2];
216 205 volatile unsigned char dataFieldHeader[4];
217 206 volatile unsigned char dataAndCRC[CCSDS_TC_PKT_MAX_SIZE-10];
218 207 };
219 208 typedef struct ccsdsTelecommandPacket_str ccsdsTelecommandPacket_t;
220 209
221 struct hk_packet_str{
210 struct Packet_TM_LFR_HK_str
211 {
212 volatile unsigned char targetLogicalAddress;
213 volatile unsigned char protocolIdentifier;
214 volatile unsigned char reserved;
215 volatile unsigned char userApplication;
216 volatile unsigned char packetID[2];
217 volatile unsigned char packetSequenceControl[2];
218 volatile unsigned char packetLength[2];
219 volatile unsigned char dataFieldHeader[10];
220 volatile unsigned char sid;
221
222 //**************
223 // HK PARAMETERS
222 224 unsigned char lfr_status_word[2];
223 225 unsigned char lfr_sw_version[4];
224 226 // tc statistics
225 227 unsigned char hk_lfr_update_info_tc_cnt[2];
226 228 unsigned char hk_lfr_update_time_tc_cnt[2];
227 229 unsigned char hk_dpu_exe_tc_lfr_cnt[2];
228 230 unsigned char hk_dpu_rej_tc_lfr_cnt[2];
229 231 unsigned char hk_lfr_last_exe_tc_id[2];
230 232 unsigned char hk_lfr_last_exe_tc_type[2];
231 233 unsigned char hk_lfr_last_exe_tc_subtype[2];
232 234 unsigned char hk_lfr_last_exe_tc_time[6];
233 235 unsigned char hk_lfr_last_rej_tc_id[2];
234 236 unsigned char hk_lfr_last_rej_tc_type[2];
235 237 unsigned char hk_lfr_last_rej_tc_subtype[2];
236 238 unsigned char hk_lfr_last_rej_tc_time[6];
237 239 // anomaly statistics
238 240 unsigned char hk_lfr_le_cnt[2];
239 241 unsigned char hk_lfr_me_cnt[2];
240 242 unsigned char hk_lfr_he_cnt[2];
241 243 unsigned char hk_lfr_last_er_rid[2];
242 244 unsigned char hk_lfr_last_er_code;
243 245 unsigned char hk_lfr_last_er_time[6];
244 246 // vhdl_blk_status
245 247 unsigned char hk_lfr_vhdl_aa_sm;
246 248 unsigned char hk_lfr_vhdl_fft_sr;
247 249 unsigned char hk_lfr_vhdl_cic_hk;
248 250 unsigned char hk_lfr_vhdl_iir_cal;
249 251 // spacewire_if_statistics
250 252 unsigned char hk_lfr_dpu_spw_pkt_rcv_cnt[2];
251 253 unsigned char hk_lfr_dpu_spw_pkt_sent_cnt[2];
252 254 unsigned char hk_lfr_dpu_spw_tick_out_cnt;
253 255 unsigned char hk_lfr_dpu_spw_last_timc;
254 256 // ahb error statistics
255 257 unsigned int hk_lfr_last_fail_addr;
256 258 // temperatures
257 259 unsigned char hk_lfr_temp_scm[2];
258 260 unsigned char hk_lfr_temp_pcb[2];
259 261 unsigned char hk_lfr_temp_fpga[2];
260 262 // error counters
261 263 unsigned char hk_lfr_dpu_spw_parity;
262 264 unsigned char hk_lfr_dpu_spw_disconnect;
263 265 unsigned char hk_lfr_dpu_spw_escape;
264 266 unsigned char hk_lfr_dpu_spw_credit;
265 267 unsigned char hk_lfr_dpu_spw_write_sync;
266 268 unsigned char hk_lfr_dpu_spw_rx_ahb;
267 269 unsigned char hk_lfr_dpu_spw_tx_ahb;
268 270 unsigned char hk_lfr_dpu_spw_header_crc;
269 271 unsigned char hk_lfr_dpu_spw_data_crc;
270 272 unsigned char hk_lfr_dpu_spw_early_eop;
271 273 unsigned char hk_lfr_dpu_spw_invalid_addr;
272 274 unsigned char hk_lfr_dpu_spw_eep;
273 275 unsigned char hk_lfr_dpu_spw_rx_too_big;
274 276 // timecode
275 277 unsigned char hk_lfr_timecode_erroneous;
276 278 unsigned char hk_lfr_timecode_missing;
277 279 unsigned char hk_lfr_timecode_invalid;
278 280 // time
279 281 unsigned char hk_lfr_time_timecode_it;
280 282 unsigned char hk_lfr_time_not_synchro;
281 283 unsigned char hk_lfr_time_timecode_ctr;
282 284 // hk_lfr_buffer_dpu_
283 285 unsigned char hk_lfr_buffer_dpu_tc_fifo;
284 286 unsigned char hk_lfr_buffer_dpu_tm_fifo;
285 287 // hk_lfr_ahb_
286 288 unsigned char hk_lfr_ahb_correctable;
287 289 unsigned char hk_lfr_ahb_uncorrectable;
288 290 unsigned char hk_lfr_ahb_fails_trans;
289 291 // hk_lfr_adc_
290 292 unsigned char hk_lfr_adc_failure;
291 293 unsigned char hk_lfr_adc_timeout;
292 294 unsigned char hk_lfr_toomany_err;
293 295 // hk_lfr_cpu_
294 296 unsigned char hk_lfr_cpu_write_err;
295 297 unsigned char hk_lfr_cpu_ins_access_err;
296 298 unsigned char hk_lfr_cpu_illegal_ins;
297 299 unsigned char hk_lfr_cpu_privilegied_ins;
298 300 unsigned char hk_lfr_cpu_register_hw;
299 301 unsigned char hk_lfr_cpu_not_aligned;
300 302 unsigned char hk_lfr_cpu_data_exception;
301 303 unsigned char hk_lfr_cpu_div_exception;
302 304 unsigned char hk_lfr_cpu_arith_overflow;
303
304 305 };
305 typedef struct hk_packet_str hk_packet_t;
306 typedef struct Packet_TM_LFR_HK_str Packet_TM_LFR_HK_t;
306 307
307 308 #endif // CCSDS_H_INCLUDED
@@ -1,60 +1,64
1 1 #ifndef FSW_RTEMS_H_INCLUDED
2 #define FSW_RTEMS_H_INCLUDED
3
2 #define FSW_RTEMS_H_INCLUDED
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 #include <apbuart.h>
11
12 #include <fsw_params.h>
10 #include <apbuart.h>
11
12 #include <fsw_params.h>
13 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
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
19 20 extern int sched_yield( void );
20 extern int errno;
21 extern int errno;
21 22 extern rtems_id Task_id[ ]; /* array of task ids */
22 extern rtems_name Task_name[ ]; /* array of task names */
23 extern rtems_name misc_name[ ]; /* arry of miscellaneous names for rtems objects */
23 extern rtems_name Task_name[ ]; /* array of task names */
24 extern rtems_name misc_name[ ]; /* arry of miscellaneous names for rtems objects */
24 25 extern int fdSPW; // grspw file descriptor
25 extern int fdUART; // uart file descriptor
26
27 void timecode_irq_handler(void *pDev, void *regs, int minor, unsigned int tc);
28
29 // MODE PARAMETERS
30 extern struct param_norm_str param_norm;
31 extern struct param_burst_str param_burst;
32 extern struct param_sbm1_str param_sbm1;
33 extern struct param_sbm2_str param_sbm2;
34 extern unsigned char param_common[];
35
26 extern int fdUART; // uart file descriptor
27
28 void timecode_irq_handler(void *pDev, void *regs, int minor, unsigned int tc);
29
30 // MODE PARAMETERS
31 extern struct param_common_str param_common;
32 extern struct param_norm_str param_norm;
33 extern struct param_burst_str param_burst;
34 extern struct param_sbm1_str param_sbm1;
35 extern struct param_sbm2_str param_sbm2;
36 extern Packet_TM_LFR_HK_t housekeeping_packet;
37 extern unsigned short sequenceCounters[SEQ_CNT_NB_PID][SEQ_CNT_NB_CAT][SEQ_CNT_NB_DEST_ID];
38
36 39 // RTEMS TASKS
37 40 rtems_task Init( rtems_task_argument argument); /* forward declaration needed */
38 41 rtems_task recv_task(rtems_task_argument argument);
39 42 rtems_task spiq_task(rtems_task_argument argument);
40 rtems_task stat_task(rtems_task_argument argument);
41 rtems_task wfrm_task(rtems_task_argument argument);
42 int create_names( void );
43 int create_all_tasks( void );
44 int start_all_tasks( void );
45 int create_message_queue( void );
46
47 // OTHER functions
48 void init_default_mode_parameters( void );
49
50 int configure_spw_link( void );
51 void configure_spacewire_set_NP(unsigned char val, unsigned int regAddr); // No Port force
52 void configure_spacewire_set_RE(unsigned char val, unsigned int regAddr); // RMAP Enable
43 rtems_task stat_task(rtems_task_argument argument);
44 rtems_task wfrm_task(rtems_task_argument argument);
45 int create_names( void );
46 int create_all_tasks( void );
47 int start_all_tasks( void );
48 int create_message_queue( void );
49
50 // OTHER functions
51 void init_default_mode_parameters( void );
52 void init_housekeeping_parameters( void );
53
54 int configure_spw_link( void );
55 void configure_spacewire_set_NP(unsigned char val, unsigned int regAddr); // No Port force
56 void configure_spacewire_set_RE(unsigned char val, unsigned int regAddr); // RMAP Enable
53 57
54 58 extern int rtems_cpu_usage_report( void );
55 extern int rtems_cpu_usage_reset( void );
56
57 rtems_status_code write_spw(spw_ioctl_pkt_send* spw_ioctl_send);
58 void (*grspw_timecode_callback) (void *pDev, void *regs, int minor, unsigned int tc);
59
60 #endif // FSW_RTEMS_CONFIG_H_INCLUDED
59 extern int rtems_cpu_usage_reset( void );
60
61 rtems_status_code write_spw(spw_ioctl_pkt_send* spw_ioctl_send);
62 void (*grspw_timecode_callback) (void *pDev, void *regs, int minor, unsigned int tc);
63
64 #endif // FSW_RTEMS_CONFIG_H_INCLUDED
@@ -1,104 +1,150
1 1 #ifndef FSW_RTEMS_CONFIG_H_INCLUDED
2 2 #define FSW_RTEMS_CONFIG_H_INCLUDED
3 3
4 4 #define GRSPW_DEVICE_NAME "/dev/grspw0"
5 5 #define UART_DEVICE_NAME "/dev/console"
6 6
7 //************************
8 // flight software version
9 // this parameters is handled by the Qt project options
10
7 11 //**********
8 12 // LFR MODES
9 13 #define LFR_MODE_STANDBY 0
10 14 #define LFR_MODE_NORMAL 1
11 15 #define LFR_MODE_BURST 2
12 16 #define LFR_MODE_SBM1 3
13 17 #define LFR_MODE_SBM2 4
14 18
19 #define RTEMS_EVENT_MODE_STANDBY RTEMS_EVENT_0
20 #define RTEMS_EVENT_MODE_NORMAL RTEMS_EVENT_1
21 #define RTEMS_EVENT_MODE_BURST RTEMS_EVENT_2
22 #define RTEMS_EVENT_MODE_SBM1 RTEMS_EVENT_3
23 #define RTEMS_EVENT_MODE_SBM2 RTEMS_EVENT_4
24
15 25 //*****************************
16 26 // APB REGISTERS BASE ADDRESSES
17 27 #define REGS_ADDR_APBUART 0x80000100
18 28 #define REGS_ADDR_GPTIMER 0x80000300
19 29 #define REGS_ADDR_GRSPW 0x80000500
20 30 #define REGS_ADDR_TIME_MANAGEMENT 0x80000600
21 31 #define REGS_ADDR_SPECTRAL_MATRICES 0x80000700
22 32 #define REGS_ADDR_WAVEFORM_PICKER 0x80000f20
23 33
24 34 #define APBUART_CTRL_REG_MASK_DB 0xfffff7ff
25 35 #define APBUART_SCALER_RELOAD_VALUE 0x00000050 // 25 MHz => about 38400
26 36
27 37 //**********
28 38 // IRQ LINES
29 39 #define IRQ_SM 9
30 40 #define IRQ_SPARC_SM 0x19 // see sparcv8.pdf p.76 for interrupt levels
31 41 #define IRQ_WF 10
32 42 #define IRQ_SPARC_WF 0x1a // see sparcv8.pdf p.76 for interrupt levels
33 43 #define IRQ_TIME1 12
34 44 #define IRQ_SPARC_TIME1 0x1c // see sparcv8.pdf p.76 for interrupt levels
35 45 #define IRQ_TIME2 13
36 46 #define IRQ_SPARC_TIME2 0x1d // see sparcv8.pdf p.76 for interrupt levels
37 47 #define IRQ_WAVEFORM_PICKER 14
38 48 #define IRQ_SPARC_WAVEFORM_PICKER 0x1e // see sparcv8.pdf p.76 for interrupt levels
39 49
40 50 //*****
41 51 // TIME
42 52 #define CLKDIV_SM_SIMULATOR 9999
43 53 #define CLKDIV_WF_SIMULATOR 9999999
44 54 #define TIMER_SM_SIMULATOR 1
45 55 #define TIMER_WF_SIMULATOR 2
46 56 #define HK_PERIOD 100 // 100 * 10ms => 1sec
47 57
58 //**********
59 // LPP CODES
60 #define LFR_SUCCESSFUL 0
61 #define LFR_DEFAULT 1
62
48 63 //******
49 64 // RTEMS
50 65 #define TASKID_RECV 1
51 66 #define TASKID_ACTN 2
52 67 #define TASKID_SPIQ 3
53 68 #define TASKID_SMIQ 4
54 69 #define TASKID_STAT 5
55 70 #define TASKID_AVF0 6
56 71 #define TASKID_BPF0 7
57 72 #define TASKID_WFRM 8
58 73 #define TASKID_DUMB 9
59 74 #define TASKID_HOUS 10
60 75
61 76 #define ACTION_MSG_QUEUE_COUNT 10
62 77
63 78 //*******
64 79 // MACROS
65 80 #ifdef PRINT_MESSAGES_ON_CONSOLE
66 81 #define PRINTF(x) printf(x);
67 82 #define PRINTF1(x,y) printf(x,y);
68 83 #define PRINTF2(x,y,z) printf(x,y,z);
69 84 #else
70 85 #define PRINTF(x) ;
71 86 #define PRINTF1(x,y) ;
72 87 #define PRINTF2(x,y,z) ;
73 88 #endif
74 89
75 90 #define NB_SAMPLES_PER_SNAPSHOT 2048
76 91 #define TIME_OFFSET 2
77 92 #define WAVEFORM_EXTENDED_HEADER_OFFSET 22
78 93 #define NB_BYTES_SWF_BLK 2 * 6
79 94 #define NB_WORDS_SWF_BLK 3
80 95
96 //******************
97 // SEQUENCE COUNTERS
98 #define SEQ_CNT_NB_PID 2
99 #define SEQ_CNT_NB_CAT 4
100 #define SEQ_CNT_NB_DEST_ID 11
101 // pid
102 #define SEQ_CNT_PID_76 0
103 #define SEQ_CNT_PID_79 1
104 //cat
105 #define SEQ_CNT_CAT_1 0
106 #define SEQ_CNT_CAT_4 1
107 #define SEQ_CNT_CAT_9 2
108 #define SEQ_CNT_CAT_12 3
109 // destination id
110 #define SEQ_CNT_DST_ID_GROUND 0
111 #define SEQ_CNT_DST_ID_MISSION_TIMELINE 1
112 #define SEQ_CNT_DST_ID_TC_SEQUENCES 2
113 #define SEQ_CNT_DST_ID_RECOVERY_ACTION_CMD 3
114 #define SEQ_CNT_DST_ID_BACKUP_MISSION_TIMELINE 4
115 #define SEQ_CNT_DST_ID_DIRECT_CMD 5
116 #define SEQ_CNT_DST_ID_SPARE_GRD_SRC1 6
117 #define SEQ_CNT_DST_ID_SPARE_GRD_SRC2 7
118 #define SEQ_CNT_DST_ID_OBCP 8
119 #define SEQ_CNT_DST_ID_SYSTEM_CONTROL 9
120 #define SEQ_CNT_DST_ID_AOCS 10
121
122 struct param_common_str{
123 unsigned char sy_lfr_common0;
124 unsigned char sy_lfr_common1;
125 };
126
81 127 struct param_norm_str{
82 128 unsigned int sy_lfr_n_swf_l; // length of the snapshots
83 129 unsigned int sy_lfr_n_swf_p; // time between two snapshots
84 130 unsigned int sy_lfr_n_asm_p; // time between two asm
85 131 unsigned char sy_lfr_n_bp_p0; // timebetween two products BP1 set
86 132 unsigned char sy_lfr_n_bp_p1; // time between two products BP2 set
87 133 };
88 134
89 135 struct param_burst_str{
90 136 unsigned char sy_lfr_b_bp_p0; // timebetween two products BP1 set
91 137 unsigned char sy_lfr_b_bp_p1; // time between two products BP2 set
92 138 };
93 139
94 140 struct param_sbm1_str{
95 141 unsigned char sy_lfr_s1_bp_p0; // timebetween two products BP1 set
96 142 unsigned char sy_lfr_s1_bp_p1; // time between two products BP2 set
97 143 };
98 144
99 145 struct param_sbm2_str{
100 146 unsigned char sy_lfr_s2_bp_p0; // timebetween two products BP1 set
101 147 unsigned char sy_lfr_s2_bp_p1; // time between two products BP2 set
102 148 };
103 149
104 150 #endif // FSW_RTEMS_CONFIG_H_INCLUDED
@@ -1,71 +1,77
1 1 #ifndef TC_HANDLER_H_INCLUDED
2 2 #define TC_HANDLER_H_INCLUDED
3 3
4 4 #include <rtems.h>
5 5 #include <bsp.h> // for the LEON_Unmask_interrupt function
6 6 #include <stdio.h>
7 7 #include <unistd.h> // for the read call
8 8 #include <sys/ioctl.h> // for the ioctl call
9 9 #include <ccsds_types.h>
10 10 #include <grspw.h>
11 11 #include <fsw_init.h>
12 12
13 13 extern int fdSPW;
14 14 extern rtems_name misc_name[ ];
15 15 extern rtems_name misc_id[ ];
16 16 extern rtems_id Task_id[ ]; // array of task ids
17 17 // MODE PARAMETERS
18 extern struct param_common_str param_common;
18 19 extern struct param_norm_str param_norm;
19 20 extern struct param_sbm1_str param_sbm1;
20 21 extern struct param_sbm2_str param_sbm2;
22 extern Packet_TM_LFR_HK_t housekeeping_packet;
21 23 extern time_management_regs_t *time_management_regs;
22 24 extern waveform_picker_regs_t *waveform_picker_regs;
23 25 extern gptimer_regs_t *gptimer_regs;
24 extern unsigned char param_common[];
25 26
26 27 //****
27 28 // ISR
28 29 rtems_isr commutation_isr1( rtems_vector_number vector );
29 30 rtems_isr commutation_isr2( rtems_vector_number vector );
30 31
31 32 //**********************
32 33 // GENERAL USE FUNCTIONS
33 34 void initLookUpTableForCRC( void );
34 35 void GetCRCAsTwoBytes(unsigned char* data, unsigned char* crcAsTwoBytes, unsigned int sizeOfData);
35 36
36 37 //*********************
37 38 // ACCEPTANCE FUNCTIONS
38 39 unsigned char acceptTM(ccsdsTelecommandPacket_t * TMPacket, unsigned int tc_len_recv);
39 40
40 41 unsigned char TM_build_header( enum TM_TYPE tm_type, unsigned int packetLength,
41 42 unsigned int coarseTime, unsigned int fineTime, TMHeader_t *TMHeader);
42 43 unsigned char TM_build_data(ccsdsTelecommandPacket_t *TC, char* data, unsigned int SID, unsigned char *computed_CRC);
43 44 int TC_checker(ccsdsTelecommandPacket_t *TC, unsigned int TC_LEN_RCV);
44 45
45 46 //***********
46 47 // RTEMS TASK
47 48 rtems_task recv_task( rtems_task_argument unused );
48 49 rtems_task actn_task( rtems_task_argument unused );
49 50 rtems_task dumb_task( rtems_task_argument unused );
50 51 int create_message_queue( void );
51 52
52 53 //***********
53 54 // TC ACTIONS
54 55 int action_default(ccsdsTelecommandPacket_t *TC);
55 56 int action_default_alt(ccsdsTelecommandPacket_t *TC);
56 57 int send_tm_lfr_tc_exe_success(ccsdsTelecommandPacket_t *TC);
57 58 //
58 59 int stop_current_mode();
59 60 int enter_normal_mode();
60 61 int enter_sbm1_mode();
62 int action_load_comm(ccsdsTelecommandPacket_t *TC);
61 63 int action_load_norm(ccsdsTelecommandPacket_t *TC);
62 64 int action_enter(ccsdsTelecommandPacket_t *TC);
63 65 int action_updt_time(ccsdsTelecommandPacket_t *TC);
64 66 //
67 void update_last_TC_exe(ccsdsTelecommandPacket_t *TC);
68 void update_last_TC_rej(ccsdsTelecommandPacket_t *TC);
69 void close_action(ccsdsTelecommandPacket_t *TC, int result);
70 //
65 71 rtems_status_code restart_if_needed(rtems_id id);
66 72 rtems_status_code suspend_if_needed(rtems_id id);
67 73
68 74 #endif // TC_HANDLER_H_INCLUDED
69 75
70 76
71 77
@@ -1,38 +1,40
1 1 #ifndef WF_HANDLER_H_INCLUDED
2 2 #define WF_HANDLER_H_INCLUDED
3 3
4 4 #include <rtems.h>
5 5 #include <fsw_params.h>
6 6 #include <grspw.h>
7 7 #include <grlib_regs.h>
8 8 #include <ccsds_types.h>
9 9 #include <stdio.h>
10 10 #include <fsw_init.h>
11 11 #include <math.h>
12 12
13 13 #define pi 3.1415
14 14
15 15 //#include <sys/ioctl.h>
16 16
17 17 extern rtems_id Task_id[]; /* array of task ids */
18 18 extern int fdSPW;
19 19 extern volatile int wf_snap_f0[ ];
20 20 extern volatile int wf_snap_f1[ ];
21 21 extern volatile int wf_snap_f1_bis[ ];
22 22 extern volatile int wf_snap_f2[ ];
23 23 extern volatile int wf_cont_f3[ ];
24 24 extern waveform_picker_regs_t *waveform_picker_regs;
25 25
26 26 rtems_isr waveforms_isr( rtems_vector_number vector );
27 rtems_isr waveforms_isr_alternative( rtems_vector_number vector );
27 28 rtems_isr waveforms_simulator_isr( rtems_vector_number vector );
28 29 rtems_task wfrm_task(rtems_task_argument argument);
29 30
30 31 //******************
31 32 // general functions
32 33 void init_waveforms( void );
33 34 void reset_waveforms( void );
34 35 void send_waveform( ExtendedTMHeader_t *header, volatile int *waveform, unsigned int sid, spw_ioctl_pkt_send *spw_ioctl_send);
35 36 void init_waveform_picker_regs();
37 void set_data_shaping_parameters(unsigned char parameters);
36 38 int build_value(int value1, int value0);
37 39
38 40 #endif // WF_HANDLER_H_INCLUDED
@@ -1,54 +1,54
1 1 #include <fsw_processing.h>
2 2 #include <rtems.h>
3 3 #include <ccsds_types.h>
4 4
5 5 // RTEMS GLOBAL VARIABLES
6 6 rtems_name misc_name[5];
7 7 rtems_name misc_id[5];
8 8 rtems_id Task_id[15]; /* array of task ids */
9 9 rtems_name Task_name[15]; /* array of task names */
10 10 int fdSPW = 0;
11 11 int fdUART = 0;
12 12
13 13 spectral_matrices_regs_t *spectral_matrices_regs = NULL;
14 14
15 15 // APB CONFIGURATION REGISTERS
16 16 time_management_regs_t *time_management_regs = (time_management_regs_t*) REGS_ADDR_TIME_MANAGEMENT;
17 17 waveform_picker_regs_t *waveform_picker_regs = (waveform_picker_regs_t*) REGS_ADDR_WAVEFORM_PICKER;
18 18 gptimer_regs_t *gptimer_regs = (gptimer_regs_t *) REGS_ADDR_GPTIMER;
19 19
20 20 // WAVEFORMS GLOBAL VARIABLES // 2048 * 3 * 4 + 2 * 4 = 24576 + 8 bytes
21 21 volatile int wf_snap_f0[ NB_SAMPLES_PER_SNAPSHOT * NB_WORDS_SWF_BLK + TIME_OFFSET];
22 22 volatile int wf_snap_f1[ NB_SAMPLES_PER_SNAPSHOT * NB_WORDS_SWF_BLK + TIME_OFFSET];
23 23 volatile int wf_snap_f1_bis[ NB_SAMPLES_PER_SNAPSHOT * NB_WORDS_SWF_BLK + TIME_OFFSET];
24 24 volatile int wf_snap_f2[ NB_SAMPLES_PER_SNAPSHOT * NB_WORDS_SWF_BLK + TIME_OFFSET];
25 25 volatile int wf_cont_f3[ NB_SAMPLES_PER_SNAPSHOT * NB_WORDS_SWF_BLK + TIME_OFFSET];
26 26
27 27 // SPECTRAL MATRICES GLOBAL VARIABLES
28 28 volatile int spec_mat_f0_a[ TOTAL_SIZE_SPEC_MAT ];
29 29 volatile int spec_mat_f0_b[ TOTAL_SIZE_SPEC_MAT ];
30 30 volatile int spec_mat_f0_c[ TOTAL_SIZE_SPEC_MAT ];
31 31 volatile int spec_mat_f0_d[ TOTAL_SIZE_SPEC_MAT ];
32 32 volatile int spec_mat_f0_e[ TOTAL_SIZE_SPEC_MAT ];
33 33 volatile int spec_mat_f0_f[ TOTAL_SIZE_SPEC_MAT ];
34 34 volatile int spec_mat_f0_g[ TOTAL_SIZE_SPEC_MAT ];
35 35 volatile int spec_mat_f0_h[ TOTAL_SIZE_SPEC_MAT ];
36 36 //
37 37 float averaged_spec_mat_f0[ TOTAL_SIZE_SPEC_MAT ];
38 38 float compressed_spec_mat_f0[ TOTAL_SIZE_COMPRESSED_MATRIX_f0 ];
39 39
40 40 // MODE PARAMETERS
41 struct param_common_str param_common;
41 42 struct param_norm_str param_norm;
42 43 struct param_burst_str param_burst;
43 44 struct param_sbm1_str param_sbm1;
44 45 struct param_sbm2_str param_sbm2;
45 unsigned char param_common[2];
46 46
47 47 // HK PACKETS
48 48 Packet_TM_LFR_HK_t housekeeping_packet;
49 hk_packet_t housekeeping_parameters;
49 unsigned short sequenceCounters[SEQ_CNT_NB_PID][SEQ_CNT_NB_CAT][SEQ_CNT_NB_DEST_ID];
50 50
51 51 // BASIC PARAMETERS GLOBAL VARIABLES
52 52 unsigned char LFR_BP1_F0[ NB_BINS_COMPRESSED_MATRIX_f0 * 9 ];
53 53 BP1_t data_BP1[ NB_BINS_COMPRESSED_MATRIX_f0 ];
54 54
@@ -1,414 +1,448
1 1 //*************************
2 2 // GPL reminder to be added
3 3 //*************************
4 4
5 5 #include <rtems.h>
6 6
7 7 /* configuration information */
8 8
9 9 #define CONFIGURE_INIT
10 10
11 11 #include <bsp.h> /* for device driver prototypes */
12 12
13 13 /* configuration information */
14 14
15 15 #define CONFIGURE_APPLICATION_NEEDS_CONSOLE_DRIVER
16 16 #define CONFIGURE_APPLICATION_NEEDS_CLOCK_DRIVER
17 17
18 18 #define CONFIGURE_MAXIMUM_TASKS 15
19 19 #define CONFIGURE_RTEMS_INIT_TASKS_TABLE
20 20 #define CONFIGURE_EXTRA_TASK_STACKS (3 * RTEMS_MINIMUM_STACK_SIZE)
21 21 #define CONFIGURE_LIBIO_MAXIMUM_FILE_DESCRIPTORS 32
22 22 #define CONFIGURE_INIT_TASK_PRIORITY 100
23 23 #define CONFIGURE_MAXIMUM_DRIVERS 16
24 24 #define CONFIGURE_MAXIMUM_PERIODS 5
25 25 #define CONFIGURE_MAXIMUM_MESSAGE_QUEUES 1
26 26
27 27 #include <rtems/confdefs.h>
28 28
29 29 /* If --drvmgr was enabled during the configuration of the RTEMS kernel */
30 30 #ifdef RTEMS_DRVMGR_STARTUP
31 31 #ifdef LEON3
32 32 /* Add Timer and UART Driver */
33 33 #ifdef CONFIGURE_APPLICATION_NEEDS_CLOCK_DRIVER
34 34 #define CONFIGURE_DRIVER_AMBAPP_GAISLER_GPTIMER
35 35 #endif
36 36 #ifdef CONFIGURE_APPLICATION_NEEDS_CONSOLE_DRIVER
37 37 #define CONFIGURE_DRIVER_AMBAPP_GAISLER_APBUART
38 38 #endif
39 39 #endif
40 40 #define CONFIGURE_DRIVER_AMBAPP_GAISLER_GRSPW /* GRSPW Driver */
41 41 #include <drvmgr/drvmgr_confdefs.h>
42 42 #endif
43 43
44 44 #include <fsw_init.h>
45 45 #include <fsw_config.c>
46 46
47 47 char *lstates[6] = {"Error-reset",
48 48 "Error-wait",
49 49 "Ready",
50 50 "Started",
51 51 "Connecting",
52 52 "Run"
53 53 };
54 54
55 55 rtems_task Init( rtems_task_argument ignored )
56 56 {
57 57 rtems_status_code status;
58 58 rtems_isr_entry old_isr_handler;
59 59
60 60 PRINTF("\n\n\n\n\n")
61 61 PRINTF("***************************\n")
62 62 PRINTF("** START Flight Software **\n")
63 63 PRINTF("***************************\n")
64 64 PRINTF("\n\n")
65 65
66 66 //send_console_outputs_on_serial_port();
67 67 set_apbuart_scaler_reload_register(REGS_ADDR_APBUART, APBUART_SCALER_RELOAD_VALUE);
68 68
69 69 initLookUpTableForCRC(); // in tc_handler.h
70 70 init_default_mode_parameters();
71 init_housekeeping_parameters();
71 72 create_message_queue();
72 73
73 74 create_names();
74 75 create_all_tasks();
75 76 start_all_tasks();
76 77
77 78 grspw_timecode_callback = &timecode_irq_handler;
78 79
79 80 configure_spw_link();
80 81
81 82 //****************************
82 83 // Spectral Matrices simulator
83 84 configure_timer((gptimer_regs_t*) REGS_ADDR_GPTIMER, TIMER_SM_SIMULATOR, CLKDIV_SM_SIMULATOR,
84 85 IRQ_SPARC_SM, spectral_matrices_isr );
85 86
86 87 //**********
87 88 // WAVEFORMS
88 89 // simulator
89 90
90 91 #ifdef GSA
91 92 configure_timer((gptimer_regs_t*) REGS_ADDR_GPTIMER, TIMER_WF_SIMULATOR, CLKDIV_WF_SIMULATOR,
92 93 IRQ_SPARC_WF, waveforms_simulator_isr );
93 94 #else
94 95 // configure the registers of the waveform picker
95 96 init_waveform_picker_regs();
96 97 // configure the waveform picker interrupt service routine
97 98 status = rtems_interrupt_catch( waveforms_isr,
98 99 IRQ_SPARC_WAVEFORM_PICKER,
99 100 &old_isr_handler) ;
100 101 LEON_Mask_interrupt( IRQ_WAVEFORM_PICKER );
101 102 #endif
102 103
103 104 //**********
104 105
105 106 //*****************************************
106 107 // irq handling of the time management unit
107 108 status = rtems_interrupt_catch( commutation_isr1,
108 109 IRQ_SPARC_TIME1,
109 110 &old_isr_handler) ; // see sparcv8.pdf p.76 for interrupt levels
110 111 if (status==RTEMS_SUCCESSFUL) {
111 112 PRINTF("OK *** commutation_isr1 *** rtems_interrupt_catch successfullly configured\n")
112 113 }
113 114
114 115 status = rtems_interrupt_catch( commutation_isr2,
115 116 IRQ_SPARC_TIME2,
116 117 &old_isr_handler) ; // see sparcv8.pdf p.76 for interrupt levels
117 118 if (status==RTEMS_SUCCESSFUL) {
118 119 PRINTF("OK *** commutation_isr2 *** rtems_interrupt_catch successfullly configured\n")
119 120 }
120 121
121 122 LEON_Unmask_interrupt( IRQ_TIME1 );
122 123 LEON_Unmask_interrupt( IRQ_TIME2 );
123 124
124 125 #ifdef GSA
125 126 //if (rtems_event_send( Task_id[TASKID_WFRM], RTEMS_EVENT_0 ) != RTEMS_SUCCESSFUL) {
126 127 // printf("in INIT *** Error sending event to WFRM\n");
127 128 //}
128 129 #endif
129 130
130 131 status = rtems_task_delete(RTEMS_SELF);
131 132
132 133 }
133 134
134 135 rtems_task spiq_task(rtems_task_argument unused)
135 136 {
136 137 rtems_event_set event_out;
137 138 rtems_status_code status;
138 139
139 140 while(true){
140 141 PRINTF("in SPIQ *** Waiting for SPW_LINKERR_EVENT\n")
141 142 rtems_event_receive(SPW_LINKERR_EVENT, RTEMS_WAIT, RTEMS_NO_TIMEOUT, &event_out); // wait for an SPW_LINKERR_EVENT
142 143
143 144 if (rtems_task_suspend(Task_id[TASKID_RECV])!=RTEMS_SUCCESSFUL) { // suspend RECV task
144 145 PRINTF("in SPIQ *** Error suspending RECV Task\n")
145 146 }
146 147 if (rtems_task_suspend(Task_id[TASKID_HOUS])!=RTEMS_SUCCESSFUL) { // suspend HOUS task
147 148 PRINTF("in SPIQ *** Error suspending HOUS Task\n")
148 149 }
149 150
150 151 configure_spw_link();
151 152
152 153 status = rtems_task_restart( Task_id[TASKID_HOUS], 1 );
153 154 if (status!=RTEMS_SUCCESSFUL) {
154 155 PRINTF1("in SPIQ *** Error restarting HOUS Task *** code %d\n", status)
155 156 }
156 157
157 158 if (rtems_task_restart(Task_id[TASKID_RECV], 1)!=RTEMS_SUCCESSFUL) { // restart RECV task
158 159 PRINTF("in SPIQ *** Error restarting RECV Task\n")
159 160 }
160 161 }
161 162 }
162 163
163 void init_default_mode_parameters()
164 void init_default_mode_parameters(void)
164 165 {
165 166 // COMMON PARAMETERS
166 param_common[0] = 0x00;
167 param_common[1] = 0x10; // default value 0 0 0 1 0 0 0 0
167 param_common.sy_lfr_common0 = 0x00;
168 param_common.sy_lfr_common1 = 0x10; // default value 0 0 0 1 0 0 0 0
168 169 // NORMAL MODE
169 170 param_norm.sy_lfr_n_swf_l = 2048; // nb sample
170 171 param_norm.sy_lfr_n_swf_p = 300; // sec
171 172 param_norm.sy_lfr_n_asm_p = 3600; // sec
172 173 param_norm.sy_lfr_n_bp_p0 = 4; // sec
173 174 param_norm.sy_lfr_n_bp_p1 = 20; // sec
174 175 // BURST MODE
175 176 param_burst.sy_lfr_b_bp_p0 = 1; // sec
176 177 param_burst.sy_lfr_b_bp_p1 = 5; // sec
177 178 // SBM1 MODE
178 179 param_sbm1.sy_lfr_s1_bp_p0 = 1; // sec
179 180 param_sbm1.sy_lfr_s1_bp_p1 = 1; // sec
180 181 // SBM2 MODE
181 182 param_sbm2.sy_lfr_s2_bp_p0 = 1; // sec
182 183 param_sbm2.sy_lfr_s2_bp_p0 = 5; // sec
183 184 }
184 185
186 void init_housekeeping_parameters(void)
187 {
188 unsigned int i = 0;
189 unsigned int j = 0;
190 unsigned int k = 0;
191 char *parameters;
192
193 parameters = (char*) &housekeeping_packet.lfr_status_word;
194 for(i = 0; i< SIZE_HK_PARAMETERS; i++)
195 {
196 parameters[i] = 0x00;
197 }
198 // init status word
199 housekeeping_packet.lfr_status_word[0] = 0x00;
200 housekeeping_packet.lfr_status_word[1] = 0x00;
201 // init software version
202 housekeeping_packet.lfr_sw_version[0] = SW_VERSION_N1;
203 housekeeping_packet.lfr_sw_version[1] = SW_VERSION_N2;
204 housekeeping_packet.lfr_sw_version[2] = SW_VERSION_N3;
205 housekeeping_packet.lfr_sw_version[3] = SW_VERSION_N4;
206 // init sequence counters
207 for (i = 0; i<SEQ_CNT_NB_PID; i++)
208 {
209 for(j = 0; j<SEQ_CNT_NB_CAT; j++)
210 {
211 for(k = 0; k<SEQ_CNT_NB_DEST_ID; k++)
212 {
213 sequenceCounters[i][j][k] = 0x00;
214 }
215 }
216 }
217 }
218
185 219 int create_names( void )
186 220 {
187 221 // task names
188 222 Task_name[TASKID_RECV] = rtems_build_name( 'R', 'E', 'C', 'V' );
189 223 Task_name[TASKID_ACTN] = rtems_build_name( 'A', 'C', 'T', 'N' );
190 224 Task_name[TASKID_SPIQ] = rtems_build_name( 'S', 'P', 'I', 'Q' );
191 225 Task_name[TASKID_SMIQ] = rtems_build_name( 'S', 'M', 'I', 'Q' );
192 226 Task_name[TASKID_STAT] = rtems_build_name( 'S', 'T', 'A', 'T' );
193 227 Task_name[TASKID_AVF0] = rtems_build_name( 'A', 'V', 'F', '0' );
194 228 Task_name[TASKID_BPF0] = rtems_build_name( 'B', 'P', 'F', '0' );
195 229 Task_name[TASKID_WFRM] = rtems_build_name( 'W', 'F', 'R', 'M' );
196 230 Task_name[TASKID_DUMB] = rtems_build_name( 'D', 'U', 'M', 'B' );
197 231 Task_name[TASKID_HOUS] = rtems_build_name( 'H', 'O', 'U', 'S' );
198 232
199 233 // rate monotonic period name
200 234 HK_name = rtems_build_name( 'H', 'O', 'U', 'S' );
201 235
202 236 return 0;
203 237 }
204 238
205 239 int create_all_tasks( void )
206 240 {
207 241 rtems_status_code status;
208 242
209 243 // RECV
210 244 status = rtems_task_create(
211 245 Task_name[TASKID_RECV], 200, RTEMS_MINIMUM_STACK_SIZE * 2,
212 246 RTEMS_DEFAULT_MODES,
213 247 RTEMS_DEFAULT_ATTRIBUTES, &Task_id[TASKID_RECV]
214 248 );
215 249 // ACTN
216 250 status = rtems_task_create(
217 251 Task_name[TASKID_ACTN], 50, RTEMS_MINIMUM_STACK_SIZE * 2,
218 252 RTEMS_DEFAULT_MODES,
219 253 RTEMS_DEFAULT_ATTRIBUTES, &Task_id[TASKID_ACTN]
220 254 );
221 255 // SPIQ
222 256 status = rtems_task_create(
223 257 Task_name[TASKID_SPIQ], 5, RTEMS_MINIMUM_STACK_SIZE * 2,
224 258 RTEMS_DEFAULT_MODES | RTEMS_NO_PREEMPT,
225 259 RTEMS_DEFAULT_ATTRIBUTES, &Task_id[TASKID_SPIQ]
226 260 );
227 261 // SMIQ
228 262 status = rtems_task_create(
229 263 Task_name[TASKID_SMIQ], 10, RTEMS_MINIMUM_STACK_SIZE * 2,
230 264 RTEMS_DEFAULT_MODES | RTEMS_NO_PREEMPT,
231 265 RTEMS_DEFAULT_ATTRIBUTES, &Task_id[TASKID_SMIQ]
232 266 );
233 267 // STAT
234 268 status = rtems_task_create(
235 269 Task_name[TASKID_STAT], 150, RTEMS_MINIMUM_STACK_SIZE * 2,
236 270 RTEMS_DEFAULT_MODES,
237 271 RTEMS_DEFAULT_ATTRIBUTES, &Task_id[TASKID_STAT]
238 272 );
239 273 // AVF0
240 274 status = rtems_task_create(
241 275 Task_name[TASKID_AVF0], 50, RTEMS_MINIMUM_STACK_SIZE * 2,
242 276 RTEMS_DEFAULT_MODES | RTEMS_NO_PREEMPT,
243 277 RTEMS_DEFAULT_ATTRIBUTES | RTEMS_FLOATING_POINT, &Task_id[TASKID_AVF0]
244 278 );
245 279 // BPF0
246 280 status = rtems_task_create(
247 281 Task_name[TASKID_BPF0], 50, RTEMS_MINIMUM_STACK_SIZE * 2,
248 282 RTEMS_DEFAULT_MODES,
249 283 RTEMS_DEFAULT_ATTRIBUTES | RTEMS_FLOATING_POINT, &Task_id[TASKID_BPF0]
250 284 );
251 285 // WFRM
252 286 status = rtems_task_create(
253 287 Task_name[TASKID_WFRM], 100, RTEMS_MINIMUM_STACK_SIZE * 2,
254 288 RTEMS_DEFAULT_MODES,
255 289 RTEMS_DEFAULT_ATTRIBUTES | RTEMS_FLOATING_POINT, &Task_id[TASKID_WFRM]
256 290 );
257 291 // DUMB
258 292 status = rtems_task_create(
259 293 Task_name[TASKID_DUMB], 200, RTEMS_MINIMUM_STACK_SIZE * 2,
260 294 RTEMS_DEFAULT_MODES,
261 295 RTEMS_DEFAULT_ATTRIBUTES, &Task_id[TASKID_DUMB]
262 296 );
263 297 // HOUS
264 298 status = rtems_task_create(
265 299 Task_name[TASKID_HOUS], 199, RTEMS_MINIMUM_STACK_SIZE * 2,
266 300 RTEMS_DEFAULT_MODES,
267 301 RTEMS_DEFAULT_ATTRIBUTES, &Task_id[TASKID_HOUS]
268 302 );
269 303
270 304 return 0;
271 305 }
272 306
273 307 int start_all_tasks( void )
274 308 {
275 309 rtems_status_code status;
276 310
277 311 status = rtems_task_start( Task_id[TASKID_SPIQ], spiq_task, 1 );
278 312 if (status!=RTEMS_SUCCESSFUL) {
279 313 PRINTF("In INIT *** Error starting TASK_SPIQ\n")
280 314 }
281 315
282 316 status = rtems_task_start( Task_id[TASKID_RECV], recv_task, 1 );
283 317 if (status!=RTEMS_SUCCESSFUL) {
284 318 PRINTF("In INIT *** Error starting TASK_RECV\n")
285 319 }
286 320
287 321 status = rtems_task_start( Task_id[TASKID_ACTN], actn_task, 1 );
288 322 if (status!=RTEMS_SUCCESSFUL) {
289 323 PRINTF("In INIT *** Error starting TASK_ACTN\n")
290 324 }
291 325
292 326 status = rtems_task_start( Task_id[TASKID_SMIQ], smiq_task, 1 );
293 327 if (status!=RTEMS_SUCCESSFUL) {
294 328 PRINTF("In INIT *** Error starting TASK_BPPR\n")
295 329 }
296 330
297 331 status = rtems_task_start( Task_id[TASKID_STAT], stat_task, 1 );
298 332 if (status!=RTEMS_SUCCESSFUL) {
299 333 PRINTF("In INIT *** Error starting TASK_STAT\n")
300 334 }
301 335
302 336 status = rtems_task_start( Task_id[TASKID_AVF0], avf0_task, 1 );
303 337 if (status!=RTEMS_SUCCESSFUL) {
304 338 PRINTF("In INIT *** Error starting TASK_AVF0\n")
305 339 }
306 340
307 341 status = rtems_task_start( Task_id[TASKID_BPF0], bpf0_task, 1 );
308 342 if (status!=RTEMS_SUCCESSFUL) {
309 343 PRINTF("In INIT *** Error starting TASK_BPF0\n")
310 344 }
311 345
312 346 status = rtems_task_start( Task_id[TASKID_WFRM], wfrm_task, 1 );
313 347 if (status!=RTEMS_SUCCESSFUL) {
314 348 PRINTF("In INIT *** Error starting TASK_WFRM\n")
315 349 }
316 350
317 351 status = rtems_task_start( Task_id[TASKID_DUMB], dumb_task, 1 );
318 352 if (status!=RTEMS_SUCCESSFUL) {
319 353 PRINTF("In INIT *** Error starting TASK_DUMB\n")
320 354 }
321 355
322 356 status = rtems_task_start( Task_id[TASKID_HOUS], hous_task, 1 );
323 357 if (status!=RTEMS_SUCCESSFUL) {
324 358 PRINTF("In INIT *** Error starting TASK_HOUS\n")
325 359 }
326 360
327 361 return 0;
328 362 }
329 363
330 364 int configure_spw_link( void )
331 365 {
332 366 rtems_status_code status;
333 367
334 368 close(fdSPW); // close the device if it is already open
335 369 PRINTF("OK *** in configure_spw_link *** try to open "GRSPW_DEVICE_NAME"\n")
336 370 fdSPW = open(GRSPW_DEVICE_NAME, O_RDWR); // open the device. the open call reset the hardware
337 371 if (fdSPW<0) PRINTF("ERR *** in configure_spw_link *** Error opening"GRSPW_DEVICE_NAME"\n")
338 372 while(ioctl(fdSPW, SPACEWIRE_IOCTRL_START, 0) != RTEMS_SUCCESSFUL){
339 373 PRINTF(".")
340 374 fflush(stdout);
341 375 close(fdSPW); // close the device
342 376 fdSPW = open(GRSPW_DEVICE_NAME, O_RDWR); // open the device. the open call reset the hardware
343 377 if (fdSPW<0) PRINTF("ERR *** In configure_spw_link *** Error opening"GRSPW_DEVICE_NAME"\n")
344 378 rtems_task_wake_after(100);
345 379 }
346 380
347 381 PRINTF("OK *** In configure_spw_link *** "GRSPW_DEVICE_NAME" opened and started successfully\n")
348 382
349 383 configure_spacewire_set_NP(1, REGS_ADDR_GRSPW); // No Port force
350 384 configure_spacewire_set_RE(1, REGS_ADDR_GRSPW); // the dedicated call seems to break the no port force configuration
351 385
352 386 status = ioctl(fdSPW, SPACEWIRE_IOCTRL_SET_RXBLOCK, 1); // sets the blocking mode for reception
353 387 if (status!=RTEMS_SUCCESSFUL) PRINTF("in SPIQ *** Error SPACEWIRE_IOCTRL_SET_RXBLOCK\n")
354 388 //
355 389 status = ioctl(fdSPW, SPACEWIRE_IOCTRL_SET_EVENT_ID, Task_id[TASKID_SPIQ]); // sets the task ID to which an event is sent when a
356 390 if (status!=RTEMS_SUCCESSFUL) PRINTF("in SPIQ *** Error SPACEWIRE_IOCTRL_SET_EVENT_ID\n") // link-error interrupt occurs
357 391 //
358 392 status = ioctl(fdSPW, SPACEWIRE_IOCTRL_SET_DISABLE_ERR, 1); // automatic link-disabling due to link-error interrupts
359 393 if (status!=RTEMS_SUCCESSFUL) PRINTF("in SPIQ *** Error SPACEWIRE_IOCTRL_SET_DISABLE_ERR\n")
360 394 //
361 395 status = ioctl(fdSPW, SPACEWIRE_IOCTRL_SET_LINK_ERR_IRQ, 1); // sets the link-error interrupt bit
362 396 if (status!=RTEMS_SUCCESSFUL) PRINTF("in SPIQ *** Error SPACEWIRE_IOCTRL_SET_LINK_ERR_IRQ\n")
363 397 //
364 398 status = ioctl(fdSPW, SPACEWIRE_IOCTRL_SET_TXBLOCK_ON_FULL, 0); // transmission blocks on full
365 399 if (status!=RTEMS_SUCCESSFUL) PRINTF("in SPIQ *** Error SPACEWIRE_IOCTRL_SET_TXBLOCK_ON_FULL\n")
366 400 //
367 401 status = ioctl(fdSPW, SPACEWIRE_IOCTRL_SET_TCODE_CTRL, 0x0909);
368 402 if (status!=RTEMS_SUCCESSFUL) PRINTF("in SPIQ *** Error SPACEWIRE_IOCTRL_SET_TCODE_CTRL,\n")
369 403
370 404 PRINTF("OK *** in configure_spw_link *** "GRSPW_DEVICE_NAME" configured successfully\n")
371 405
372 406 return RTEMS_SUCCESSFUL;
373 407 }
374 408
375 409 void configure_spacewire_set_NP(unsigned char val, unsigned int regAddr) // [N]o [P]ort force
376 410 {
377 411 unsigned int *spwptr = (unsigned int*) regAddr;
378 412
379 413 if (val == 1) {
380 414 *spwptr = *spwptr | 0x00100000; // [NP] set the No port force bit
381 415 }
382 416 if (val== 0) {
383 417 *spwptr = *spwptr & 0xffdfffff;
384 418 }
385 419 }
386 420
387 421 void configure_spacewire_set_RE(unsigned char val, unsigned int regAddr) // [R]MAP [E]nable
388 422 {
389 423 unsigned int *spwptr = (unsigned int*) regAddr;
390 424
391 425 if (val == 1)
392 426 {
393 427 *spwptr = *spwptr | 0x00010000; // [RE] set the RMAP Enable bit
394 428 }
395 429 if (val== 0)
396 430 {
397 431 *spwptr = *spwptr & 0xfffdffff;
398 432 }
399 433 }
400 434
401 435 rtems_status_code write_spw(spw_ioctl_pkt_send* spw_ioctl_send)
402 436 {
403 437 rtems_status_code status;
404 438 status = ioctl( fdSPW, SPACEWIRE_IOCTRL_SEND, spw_ioctl_send );
405 439 return status;
406 440 }
407 441
408 442 void timecode_irq_handler(void *pDev, void *regs, int minor, unsigned int tc)
409 443 {
410 444 if (rtems_event_send( Task_id[TASKID_DUMB], RTEMS_EVENT_1 ) != RTEMS_SUCCESSFUL) {
411 445 printf("In timecode_irq_handler *** Error sending event to DUMB\n");
412 446 }
413 447 }
414 448
@@ -1,156 +1,156
1 1 #include <fsw_misc.h>
2 2 #include <fsw_params.h>
3 3
4 4 extern rtems_id Task_id[]; /* array of task ids */
5 5 extern int fdSPW;
6 6 extern TMHeader_t housekeeping_header;
7 7 extern char housekeeping_data[];
8 8 extern Packet_TM_LFR_HK_t housekeeping_packet;
9 9
10 10 int configure_timer(gptimer_regs_t *gptimer_regs, unsigned char timer, unsigned int clock_divider,
11 11 unsigned char interrupt_level, rtems_isr (*timer_isr)() )
12 12 { // configure the timer for the waveforms simulation
13 rtems_status_code status;
13 rtems_status_code status;
14 14 rtems_isr_entry old_isr_handler;
15 15
16 status = rtems_interrupt_catch( timer_isr, interrupt_level, &old_isr_handler) ; // see sparcv8.pdf p.76 for interrupt levels
16 status = rtems_interrupt_catch( timer_isr, interrupt_level, &old_isr_handler) ; // see sparcv8.pdf p.76 for interrupt levels
17 17 //if (status==RTEMS_SUCCESSFUL) PRINTF("In configure_timer_for_wf_simulation *** rtems_interrupt_catch successfullly configured\n")
18 18
19 19 gptimer_regs->timer[timer].reload = clock_divider; // base clock frequency is 1 MHz
20 20 gptimer_regs->timer[timer].ctrl = gptimer_regs->timer[timer].ctrl | 0x00000010; // clear pending IRQ if any
21 21 gptimer_regs->timer[timer].ctrl = gptimer_regs->timer[timer].ctrl | 0x00000004; // LD load value from the reload register
22 22 gptimer_regs->timer[timer].ctrl = gptimer_regs->timer[timer].ctrl | 0x00000001; // EN enable the timer
23 23 gptimer_regs->timer[timer].ctrl = gptimer_regs->timer[timer].ctrl | 0x00000002; // RS restart
24 24 gptimer_regs->timer[timer].ctrl = gptimer_regs->timer[timer].ctrl | 0x00000008; // IE interrupt enable
25 25
26 26 return 1;
27 27 }
28 28
29 void print_statistics(spw_stats *stats)
30 {
31 //printf(" ******** STATISTICS ******** \n");
32 printf("Transmit link errors: %i\n", stats->tx_link_err);
33 printf("Receiver RMAP header CRC errors: %i\n", stats->rx_rmap_header_crc_err);
34 printf("Receiver RMAP data CRC errors: %i\n", stats->rx_rmap_data_crc_err);
35 printf("Receiver EEP errors: %i\n", stats->rx_eep_err);
36 printf("Receiver truncation errors: %i\n", stats->rx_truncated);
37 printf("Parity errors: %i\n", stats->parity_err);
38 printf("Escape errors: %i\n", stats->escape_err);
39 printf("Credit errors: %i\n", stats->credit_err);
40 printf("Disconnect errors: %i\n", stats->disconnect_err);
41 printf("Write synchronization errors: %i\n", stats->write_sync_err);
42 printf("Early EOP/EEP: %i\n", stats->early_ep);
43 printf("Invalid Node Address: %i\n", stats->invalid_address);
44 printf("Packets transmitted: %i\n", stats->packets_sent);
45 printf("Packets received: %i\n", stats->packets_received);
29 void print_statistics(spw_stats *stats)
30 {
31 //printf(" ******** STATISTICS ******** \n");
32 printf("Transmit link errors: %i\n", stats->tx_link_err);
33 printf("Receiver RMAP header CRC errors: %i\n", stats->rx_rmap_header_crc_err);
34 printf("Receiver RMAP data CRC errors: %i\n", stats->rx_rmap_data_crc_err);
35 printf("Receiver EEP errors: %i\n", stats->rx_eep_err);
36 printf("Receiver truncation errors: %i\n", stats->rx_truncated);
37 printf("Parity errors: %i\n", stats->parity_err);
38 printf("Escape errors: %i\n", stats->escape_err);
39 printf("Credit errors: %i\n", stats->credit_err);
40 printf("Disconnect errors: %i\n", stats->disconnect_err);
41 printf("Write synchronization errors: %i\n", stats->write_sync_err);
42 printf("Early EOP/EEP: %i\n", stats->early_ep);
43 printf("Invalid Node Address: %i\n", stats->invalid_address);
44 printf("Packets transmitted: %i\n", stats->packets_sent);
45 printf("Packets received: %i\n", stats->packets_received);
46 46 }
47 47
48 48 int send_console_outputs_on_serial_port( void ) // Send the console outputs on the serial port
49 49 {
50 50 struct apbuart_regs_str *apbuart_regs = (struct apbuart_regs_str *) REGS_ADDR_APBUART;
51
52 apbuart_regs->ctrl = apbuart_regs->ctrl & APBUART_CTRL_REG_MASK_DB;
53 PRINTF("\n\n\n\n\nIn INIT *** Now the console is on port COM1\n")
51
52 apbuart_regs->ctrl = apbuart_regs->ctrl & APBUART_CTRL_REG_MASK_DB;
53 PRINTF("\n\n\n\n\nIn INIT *** Now the console is on port COM1\n")
54 54
55 55 return 0;
56 56 }
57 57
58 58 int set_apbuart_scaler_reload_register(unsigned int regs, unsigned int value)
59 59 {
60 60 struct apbuart_regs_str *apbuart_regs = (struct apbuart_regs_str *) regs;
61
62 apbuart_regs->scaler = value;
63 PRINTF1("OK *** COM port scaler reload register set to %x\n", value)
61
62 apbuart_regs->scaler = value;
63 PRINTF1("OK *** COM port scaler reload register set to %x\n", value)
64 64
65 65 return 0;
66 66 }
67 67
68 68 //************
69 69 // RTEMS TASKS
70 70
71 71 rtems_task stat_task(rtems_task_argument argument)
72 {
72 {
73 73 int i;
74 int j;
74 int j;
75 75 i = 0;
76 j = 0;
77 PRINTF("in STAT *** \n")
78 while(1){
79 rtems_task_wake_after(1000);
80 PRINTF1("%d\n", j)
76 j = 0;
77 PRINTF("in STAT *** \n")
78 while(1){
79 rtems_task_wake_after(1000);
80 PRINTF1("%d\n", j)
81 81 if (i == 2) {
82 #ifdef PRINT_TASK_STATISTICS
83 rtems_cpu_usage_report();
82 #ifdef PRINT_TASK_STATISTICS
83 rtems_cpu_usage_report();
84 84 rtems_cpu_usage_reset();
85 85 #endif
86 i = 0;
87 }
86 i = 0;
87 }
88 88 else i++;
89 j++;
90 }
89 j++;
90 }
91 91 }
92
93 rtems_task hous_task(rtems_task_argument argument)
92
93 rtems_task hous_task(rtems_task_argument argument)
94 94 {
95 95 int result;
96 96 rtems_status_code status;
97
97
98 98 PRINTF("in HOUS ***\n")
99 99
100 if (rtems_rate_monotonic_ident( HK_name, &HK_id)!=RTEMS_SUCCESSFUL) {
101 status = rtems_rate_monotonic_create( HK_name, &HK_id );
100 if (rtems_rate_monotonic_ident( HK_name, &HK_id) != RTEMS_SUCCESSFUL) {
101 status = rtems_rate_monotonic_create( HK_name, &HK_id );
102 102 if( status != RTEMS_SUCCESSFUL ) {
103 103 PRINTF1( "rtems_rate_monotonic_create failed with status of %d\n", status )
104 104 }
105 105 }
106 106
107 housekeeping_packet.targetLogicalAddress = CCSDS_DESTINATION_ID;
108 housekeeping_packet.protocolIdentifier = 0x02;
109 housekeeping_packet.reserved = 0x00;
110 housekeeping_packet.userApplication = 0x00;
107 housekeeping_packet.targetLogicalAddress = CCSDS_DESTINATION_ID;
108 housekeeping_packet.protocolIdentifier = 0x02;
109 housekeeping_packet.reserved = 0x00;
110 housekeeping_packet.userApplication = 0x00;
111 111 housekeeping_packet.packetID[0] = 0x0c;
112 housekeeping_packet.packetID[1] = 0xc4;
112 housekeeping_packet.packetID[1] = 0xc4;
113 113 housekeeping_packet.packetSequenceControl[0] = 0xc0;
114 housekeeping_packet.packetSequenceControl[1] = 0x00;
114 housekeeping_packet.packetSequenceControl[1] = 0x00;
115 115 housekeeping_packet.packetLength[0] = 0x00;
116 housekeeping_packet.packetLength[1] = 0x77;
116 housekeeping_packet.packetLength[1] = 0x77;
117 117 housekeeping_packet.dataFieldHeader[0] = 0x10;
118 housekeeping_packet.dataFieldHeader[1] = 0x03;
119 housekeeping_packet.dataFieldHeader[2] = 0x19;
120 housekeeping_packet.dataFieldHeader[3] = 0x00;
118 housekeeping_packet.dataFieldHeader[1] = TM_TYPE_HK;
119 housekeeping_packet.dataFieldHeader[2] = TM_SUBTYPE_HK;
120 housekeeping_packet.dataFieldHeader[3] = CCSDS_DESTINATION_ID_GROUND;
121 121
122 122 status = rtems_rate_monotonic_cancel(HK_id);
123 123 if( status != RTEMS_SUCCESSFUL )
124 124 PRINTF1( "ERR *** in HOUS *** rtems_rate_monotonic_cancel(HK_id) ***code: %d\n", status )
125 125 else
126 126 PRINTF("OK *** in HOUS *** rtems_rate_monotonic_cancel(HK_id)\n")
127
127
128 128 while(1){ // launch the rate monotonic task
129 status = rtems_rate_monotonic_period( HK_id, HK_PERIOD );
129 status = rtems_rate_monotonic_period( HK_id, HK_PERIOD );
130 130 if ( status != RTEMS_SUCCESSFUL ){
131 PRINTF1( "ERR *** in HOUS *** rtems_rate_monotonic_period *** code %d\n", status);
131 PRINTF1( "ERR *** in HOUS *** rtems_rate_monotonic_period *** code %d\n", status);
132 132 }
133 133 else
134 134 {
135 135 housekeeping_packet.dataFieldHeader[4] = (unsigned char) (time_management_regs->coarse_time>>24);
136 136 housekeeping_packet.dataFieldHeader[5] = (unsigned char) (time_management_regs->coarse_time>>16);
137 137 housekeeping_packet.dataFieldHeader[6] = (unsigned char) (time_management_regs->coarse_time>>8);
138 138 housekeeping_packet.dataFieldHeader[7] = (unsigned char) (time_management_regs->coarse_time);
139 139 housekeeping_packet.dataFieldHeader[8] = (unsigned char) (time_management_regs->fine_time>>8);
140 140 housekeeping_packet.dataFieldHeader[9] = (unsigned char) (time_management_regs->fine_time);
141 housekeeping_packet.data[0] = CCSDS_DESTINATION_ID_DPU;
141 housekeeping_packet.sid = CCSDS_DESTINATION_ID_DPU;
142 142 result = write ( fdSPW, &housekeeping_packet, LEN_TM_LFR_HK);
143 143 if (result==-1)
144 144 {
145 145 PRINTF("ERR *** in HOUS *** HK send\n");
146 146 }
147 }
148 }
147 }
148 }
149 149
150 150 PRINTF("in HOUS *** deleting task\n")
151
152 status = rtems_task_delete( RTEMS_SELF ); // should not return
153 printf( "rtems_task_delete returned with status of %d.\n", status );
154 exit( 1 );
151
152 status = rtems_task_delete( RTEMS_SELF ); // should not return
153 printf( "rtems_task_delete returned with status of %d.\n", status );
154 exit( 1 );
155 155 }
156 156
@@ -1,821 +1,942
1 1 #include <tc_handler.h>
2 2 #include <fsw_params.h>
3 3
4 char *DumbMessages[5] = {"default",
5 "timecode_irq_handler",
6 "waveforms_isr",
4 char *DumbMessages[5] = {"in DUMB *** default",
5 "in DUMB *** timecode_irq_handler",
6 "in DUMB *** waveforms_isr",
7 7 "",
8 8 ""
9 9 };
10 10
11 11 unsigned char currentTC_LEN_RCV[2]; // SHALL be equal to the current TC packet estimated packet length field
12 12 unsigned char currentTC_COMPUTED_CRC[2];
13 13 unsigned int currentTC_LEN_RCV_AsUnsignedInt;
14 14 unsigned int currentTM_length;
15 15 unsigned char currentTC_processedFlag;
16 16
17 17 unsigned int lookUpTableForCRC[256];
18 18
19 19 //**********************
20 20 // GENERAL USE FUNCTIONS
21 21 unsigned int Crc_opt( unsigned char D, unsigned int Chk)
22 22 {
23 23 return(((Chk << 8) & 0xff00)^lookUpTableForCRC [(((Chk >> 8)^D) & 0x00ff)]);
24 24 }
25 25
26 26 void initLookUpTableForCRC( void )
27 27 {
28 28 unsigned int i;
29 29 unsigned int tmp;
30 30
31 31 for (i=0; i<256; i++)
32 32 {
33 33 tmp = 0;
34 34 if((i & 1) != 0) {
35 35 tmp = tmp ^ 0x1021;
36 36 }
37 37 if((i & 2) != 0) {
38 38 tmp = tmp ^ 0x2042;
39 39 }
40 40 if((i & 4) != 0) {
41 41 tmp = tmp ^ 0x4084;
42 42 }
43 43 if((i & 8) != 0) {
44 44 tmp = tmp ^ 0x8108;
45 45 }
46 46 if((i & 16) != 0) {
47 47 tmp = tmp ^ 0x1231;
48 48 }
49 49 if((i & 32) != 0) {
50 50 tmp = tmp ^ 0x2462;
51 51 }
52 52 if((i & 64) != 0) {
53 53 tmp = tmp ^ 0x48c4;
54 54 }
55 55 if((i & 128) != 0) {
56 56 tmp = tmp ^ 0x9188;
57 57 }
58 58 lookUpTableForCRC[i] = tmp;
59 59 }
60 60 }
61 61
62 62 void GetCRCAsTwoBytes(unsigned char* data, unsigned char* crcAsTwoBytes, unsigned int sizeOfData)
63 63 {
64 64 unsigned int Chk;
65 65 int j;
66 66 Chk = 0xffff; // reset the syndrom to all ones
67 67 for (j=0; j<sizeOfData; j++) {
68 68 Chk = Crc_opt(data[j], Chk);
69 69 }
70 70 crcAsTwoBytes[0] = (unsigned char) (Chk >> 8);
71 71 crcAsTwoBytes[1] = (unsigned char) (Chk & 0x00ff);
72 72 }
73 73
74 74 //*********************
75 75 // ACCEPTANCE FUNCTIONS
76 76 int TC_checker(ccsdsTelecommandPacket_t *TC, unsigned int tc_len_recv)
77 77 {
78 78 int ret = 0;
79 79 rtems_status_code status;
80 80 spw_ioctl_pkt_send spw_ioctl_send;
81 81 TMHeader_t TM_header;
82 82 unsigned int code = 0;
83 83 unsigned char computed_CRC[2];
84 84 char data[ TM_LEN_EXE_CORR + CCSDS_TC_TM_PACKET_OFFSET - TM_HEADER_LEN ];
85 85
86 86 GetCRCAsTwoBytes( (unsigned char*) TC->packetID, computed_CRC, tc_len_recv + 5 );
87 87 code = acceptTM( TC, tc_len_recv ) ;
88 88 if ( (code == ILLEGAL_APID) | (code == WRONG_LEN_PACKET) | (code == INCOR_CHECKSUM)
89 89 | (code == ILL_TYPE) | (code == ILL_SUBTYPE) | (code == WRONG_APP_DATA) )
90 90 { // generate TM_LFR_TC_EXE_CORRUPTED
91 91 // BUILD HEADER
92 92 TM_build_header( TM_LFR_TC_EXE_ERR, TM_LEN_EXE_CORR, 0, 0, &TM_header);
93 93 // BUILD DATA
94 94 TM_build_data( TC, data, SID_EXE_CORR, computed_CRC);
95 95 // PREPARE TM SENDING
96 96 spw_ioctl_send.hlen = TM_HEADER_LEN + 4; // + 4 is for the protocole extra header
97 97 spw_ioctl_send.hdr = (char*) &TM_header;
98 98 spw_ioctl_send.dlen = 16;
99 99 spw_ioctl_send.data = data;
100 100 // SEND PACKET
101 101 write_spw(&spw_ioctl_send);
102 102 }
103 103 else { // send valid TC to the action launcher
104 104 status = rtems_message_queue_send( misc_id[0], TC, tc_len_recv + CCSDS_TC_TM_PACKET_OFFSET + 3);
105 105 ret = -1;
106 106 }
107 107 return ret;
108 108 }
109 109
110 110 unsigned char acceptTM(ccsdsTelecommandPacket_t * TMPacket, unsigned int TC_LEN_RCV)
111 111 {
112 112 unsigned char ret = 0;
113 113 unsigned char pid = 0;
114 114 unsigned char category = 0;
115 115 unsigned int length = 0;
116 116 unsigned char packetType = 0;
117 117 unsigned char packetSubtype = 0;
118 118 unsigned char * CCSDSContent = NULL;
119 119
120 120 // APID check *** APID on 2 bytes
121 121 pid = ((TMPacket->packetID[0] & 0x07)<<4) + ( (TMPacket->packetID[1]>>4) & 0x0f ); // PID = 11 *** 7 bits xxxxx210 7654xxxx
122 122 category = (TMPacket->packetID[1] & 0x0f); // PACKET_CATEGORY = 12 *** 4 bits xxxxxxxx xxxx3210
123 123 length = (TMPacket->packetLength[0] * 256) + TMPacket->packetLength[1];
124 124 packetType = TMPacket->dataFieldHeader[1];
125 125 packetSubtype = TMPacket->dataFieldHeader[2];
126 126
127 127 if (pid!=CCSDS_PROCESS_ID) {
128 128 ret = ILLEGAL_APID;
129 129 }
130 130 else if (category!=CCSDS_PACKET_CATEGORY) {
131 131 ret = ILLEGAL_APID;
132 132 }
133 133 else if (length != TC_LEN_RCV ) { // packet length check
134 134 ret = WRONG_LEN_PACKET; // LEN RCV != SIZE FIELD
135 135 }
136 136 else if (length >= CCSDS_TC_PKT_MAX_SIZE) {
137 137 ret = WRONG_LEN_PACKET; // check that the packet does not exceed the MAX size
138 138 }
139 139 else if (packetType == TC_TYPE_GEN){ // service type, subtype and packet length check
140 140 switch(packetSubtype){ //subtype, autorized values are 3, 20, 21, 24, 27, 28, 30, 40, 50, 60, 61
141 141 case TC_SUBTYPE_RESET:
142 142 if (length!=(TC_LEN_RESET-CCSDS_TC_TM_PACKET_OFFSET)) {
143 143 ret = WRONG_LEN_PACKET;
144 144 }
145 145 else {
146 146 ret = CCSDS_TM_VALID;
147 147 }
148 148 break;
149 149 case TC_SUBTYPE_LOAD_COMM:
150 150 if (length!=(TC_LEN_LOAD_COMM-CCSDS_TC_TM_PACKET_OFFSET)) {
151 151 ret = WRONG_LEN_PACKET;
152 152 }
153 153 else {
154 154 ret = CCSDS_TM_VALID;
155 155 }
156 156 break;
157 157 case TC_SUBTYPE_LOAD_NORM:
158 158 if (length!=(TC_LEN_LOAD_NORM-CCSDS_TC_TM_PACKET_OFFSET)) {
159 159 ret = WRONG_LEN_PACKET;
160 160 }
161 161 else {
162 162 ret = CCSDS_TM_VALID;
163 163 }
164 164 break;
165 165 case TC_SUBTYPE_LOAD_BURST:
166 166 if (length!=(TC_LEN_LOAD_BURST-CCSDS_TC_TM_PACKET_OFFSET)) {
167 167 ret = WRONG_LEN_PACKET;
168 168 }
169 169 else {
170 170 ret = CCSDS_TM_VALID;
171 171 }
172 172 break;
173 173 case TC_SUBTYPE_LOAD_SBM1:
174 174 if (length!=(TC_LEN_LOAD_SBM1-CCSDS_TC_TM_PACKET_OFFSET)) {
175 175 ret = WRONG_LEN_PACKET;
176 176 }
177 177 else {
178 178 ret = CCSDS_TM_VALID;
179 179 }
180 180 break;
181 181 case TC_SUBTYPE_LOAD_SBM2:
182 182 if (length!=(TC_LEN_LOAD_SBM2-CCSDS_TC_TM_PACKET_OFFSET)) {
183 183 ret = WRONG_LEN_PACKET;
184 184 }
185 185 else {
186 186 ret = CCSDS_TM_VALID;
187 187 }
188 188 break;
189 189 case TC_SUBTYPE_DUMP:
190 190 if (length!=(TC_LEN_DUMP-CCSDS_TC_TM_PACKET_OFFSET)) {
191 191 ret = WRONG_LEN_PACKET;
192 192 }
193 193 else {
194 194 ret = CCSDS_TM_VALID;
195 195 }
196 196 break;
197 197 case TC_SUBTYPE_ENTER:
198 198 if (length!=(TC_LEN_ENTER-CCSDS_TC_TM_PACKET_OFFSET)) {
199 199 ret = WRONG_LEN_PACKET;
200 200 }
201 201 else {
202 202 ret = CCSDS_TM_VALID;
203 203 }
204 204 break;
205 205 case TC_SUBTYPE_UPDT_INFO:
206 206 if (length!=(TC_LEN_UPDT_INFO-CCSDS_TC_TM_PACKET_OFFSET)) {
207 207 ret = WRONG_LEN_PACKET;
208 208 }
209 209 else {
210 210 ret = CCSDS_TM_VALID;
211 211 }
212 212 break;
213 213 case TC_SUBTYPE_EN_CAL:
214 214 if (length!=(TC_LEN_EN_CAL-CCSDS_TC_TM_PACKET_OFFSET)) {
215 215 ret = WRONG_LEN_PACKET;
216 216 }
217 217 else {
218 218 ret = CCSDS_TM_VALID;
219 219 }
220 220 break;
221 221 case TC_SUBTYPE_DIS_CAL:
222 222 if (length!=(TC_LEN_DIS_CAL-CCSDS_TC_TM_PACKET_OFFSET)) {
223 223 ret = WRONG_LEN_PACKET;
224 224 }
225 225 else {
226 226 ret = CCSDS_TM_VALID;
227 227 }
228 228 break;
229 229 default:
230 230 ret = ILL_SUBTYPE;
231 231 break;
232 232 }
233 233 }
234 234 else if (packetType == TC_TYPE_TIME){
235 235 if (packetSubtype!=TC_SUBTYPE_UPDT_TIME) {
236 236 ret = ILL_SUBTYPE;
237 237 }
238 238 else if (length!=(TC_LEN_UPDT_TIME-CCSDS_TC_TM_PACKET_OFFSET)) {
239 239 ret = WRONG_LEN_PACKET;
240 240 }
241 241 else {
242 242 ret = CCSDS_TM_VALID;
243 243 }
244 244 }
245 245 else {
246 246 ret = ILL_TYPE;
247 247 }
248 248
249 249 // source ID check // Source ID not documented in the ICD
250 250
251 251 // packet error control, CRC check
252 252 if ( ret == CCSDS_TM_VALID ) {
253 253 CCSDSContent = (unsigned char*) TMPacket->packetID;
254 254 GetCRCAsTwoBytes(CCSDSContent, currentTC_COMPUTED_CRC, length + CCSDS_TC_TM_PACKET_OFFSET - 2); // 2 CRC bytes removed from the calculation of the CRC
255 255 if (currentTC_COMPUTED_CRC[0] != CCSDSContent[length + CCSDS_TC_TM_PACKET_OFFSET -2]) {
256 256 ret = INCOR_CHECKSUM;
257 257 }
258 258 else if (currentTC_COMPUTED_CRC[1] != CCSDSContent[length + CCSDS_TC_TM_PACKET_OFFSET -1]) {
259 259 ret = INCOR_CHECKSUM;
260 260 }
261 261 else {
262 262 ret = CCSDS_TM_VALID;
263 263 }
264 264 }
265 265
266 266 return ret;
267 267 }
268 268
269 269 unsigned char TM_build_header( enum TM_TYPE tm_type, unsigned int packetLength,
270 270 unsigned int coarseTime, unsigned int fineTime, TMHeader_t *TMHeader)
271 271 {
272 272 TMHeader->targetLogicalAddress = CCSDS_DESTINATION_ID;
273 273 TMHeader->protocolIdentifier = 0x02;
274 274 TMHeader->reserved = 0x00;
275 275 TMHeader->userApplication = 0x00;
276 276 TMHeader->packetID[0] = 0x0c;
277 277 TMHeader->packetSequenceControl[0] = 0xc0;
278 278 TMHeader->packetSequenceControl[1] = 0x00;
279 279 TMHeader->packetLength[0] = (unsigned char) (packetLength>>8);
280 280 TMHeader->packetLength[1] = (unsigned char) packetLength;
281 281 TMHeader->dataFieldHeader[0] = 0x10;
282 282 TMHeader->dataFieldHeader[3] = CCSDS_DESTINATION_ID;
283 283 switch (tm_type){
284 284 case(TM_LFR_TC_EXE_OK):
285 285 TMHeader->packetID[1] = 0xc1;
286 286 TMHeader->dataFieldHeader[1] = 1; // type
287 287 TMHeader->dataFieldHeader[2] = 7; // subtype
288 288 break;
289 289 case(TM_LFR_TC_EXE_ERR):
290 290 TMHeader->packetID[1] = 0xc1;
291 291 TMHeader->dataFieldHeader[1] = 1; // type
292 292 TMHeader->dataFieldHeader[2] = 8; // subtype
293 293 break;
294 294 case(TM_LFR_HK):
295 295 TMHeader->packetID[1] = 0xc4;
296 296 TMHeader->dataFieldHeader[1] = 3; // type
297 297 TMHeader->dataFieldHeader[2] = 25; // subtype
298 298 break;
299 299 case(TM_LFR_SCI):
300 300 TMHeader->packetID[1] = 0xcc;
301 301 TMHeader->dataFieldHeader[1] = 21; // type
302 302 TMHeader->dataFieldHeader[2] = 3; // subtype
303 303 break;
304 304 case(TM_LFR_SCI_SBM):
305 305 TMHeader->packetID[1] = 0xfc;
306 306 TMHeader->dataFieldHeader[1] = 21; // type
307 307 TMHeader->dataFieldHeader[2] = 3; // subtype
308 308 break;
309 309 case(TM_LFR_PAR_DUMP):
310 310 TMHeader->packetID[1] = 0xc9;
311 311 TMHeader->dataFieldHeader[1] = 181; // type
312 312 TMHeader->dataFieldHeader[2] = 31; // subtype
313 313 break;
314 314 default:
315 315 return 0;
316 316 }
317 317 TMHeader->dataFieldHeader[4] = (unsigned char) (time_management_regs->coarse_time>>24);
318 318 TMHeader->dataFieldHeader[5] = (unsigned char) (time_management_regs->coarse_time>>16);
319 319 TMHeader->dataFieldHeader[6] = (unsigned char) (time_management_regs->coarse_time>>8);
320 320 TMHeader->dataFieldHeader[7] = (unsigned char) (time_management_regs->coarse_time);
321 321 TMHeader->dataFieldHeader[8] = (unsigned char) (time_management_regs->fine_time>>8);
322 322 TMHeader->dataFieldHeader[9] = (unsigned char) (time_management_regs->fine_time);
323 323 return 1;
324 324 }
325 325
326 326 unsigned char TM_build_header_bis( enum TM_TYPE tm_type, unsigned int packetLength,
327 327 unsigned int coarseTime, unsigned int fineTime, Packet_TM_LFR_TC_EXE_t *packet)
328 328 {
329 329
330 330 packet->targetLogicalAddress = CCSDS_DESTINATION_ID;
331 331 packet->protocolIdentifier = 0x02;
332 332 packet->reserved = 0x00;
333 333 packet->userApplication = 0x00;
334 334 packet->packetID[0] = 0x0c;
335 335 packet->packetSequenceControl[0] = 0xc0;
336 336 packet->packetSequenceControl[1] = 0x00;
337 337 packet->packetLength[0] = (unsigned char) (packetLength>>8);
338 338 packet->packetLength[1] = (unsigned char) packetLength;
339 339 packet->dataFieldHeader[0] = 0x10;
340 340 packet->dataFieldHeader[3] = CCSDS_DESTINATION_ID;
341 341 switch (tm_type){
342 342 case(TM_LFR_TC_EXE_OK):
343 343 packet->packetID[1] = 0xc1;
344 344 packet->dataFieldHeader[1] = 1; // type
345 345 packet->dataFieldHeader[2] = 7; // subtype
346 346 break;
347 347 case(TM_LFR_TC_EXE_ERR):
348 348 packet->packetID[1] = 0xc1;
349 349 packet->dataFieldHeader[1] = 1; // type
350 350 packet->dataFieldHeader[2] = 8; // subtype
351 351 break;
352 352 case(TM_LFR_HK):
353 353 packet->packetID[1] = 0xc4;
354 354 packet->dataFieldHeader[1] = 3; // type
355 355 packet->dataFieldHeader[2] = 25; // subtype
356 356 break;
357 357 case(TM_LFR_SCI):
358 358 packet->packetID[1] = 0xcc;
359 359 packet->dataFieldHeader[1] = 21; // type
360 360 packet->dataFieldHeader[2] = 3; // subtype
361 361 break;
362 362 case(TM_LFR_SCI_SBM):
363 363 packet->packetID[1] = 0xfc;
364 364 packet->dataFieldHeader[1] = 21; // type
365 365 packet->dataFieldHeader[2] = 3; // subtype
366 366 break;
367 367 case(TM_LFR_PAR_DUMP):
368 368 packet->packetID[1] = 0xc9;
369 369 packet->dataFieldHeader[1] = 181; // type
370 370 packet->dataFieldHeader[2] = 31; // subtype
371 371 break;
372 372 default:
373 373 return 0;
374 374 }
375 375 packet->dataFieldHeader[4] = (unsigned char) (time_management_regs->coarse_time>>24);
376 376 packet->dataFieldHeader[5] = (unsigned char) (time_management_regs->coarse_time>>16);
377 377 packet->dataFieldHeader[6] = (unsigned char) (time_management_regs->coarse_time>>8);
378 378 packet->dataFieldHeader[7] = (unsigned char) (time_management_regs->coarse_time);
379 379 packet->dataFieldHeader[8] = (unsigned char) (time_management_regs->fine_time>>8);
380 380 packet->dataFieldHeader[9] = (unsigned char) (time_management_regs->fine_time);
381 381 return 1;
382 382 }
383 383
384 384 unsigned char TM_build_data(ccsdsTelecommandPacket_t *TC, char* data, unsigned int SID, unsigned char *computed_CRC)
385 385 {
386 386 unsigned int packetLength;
387 387 packetLength = (TC->packetLength[0] * 256) + TC->packetLength[1];
388 388 switch (SID){
389 389 case (SID_NOT_EXE):
390 390 break;
391 391 case (SID_NOT_IMP):
392 392 data[0] = 0x9c;
393 393 data[1] = 0x42;
394 394 data[2] = TC->packetID[0];
395 395 data[3] = TC->packetID[1];
396 396 data[4] = TC->packetSequenceControl[0];
397 397 data[5] = TC->packetSequenceControl[1];
398 398 data[6] = TC->dataFieldHeader[1]; // type
399 399 data[7] = TC->dataFieldHeader[2]; // subtype
400 400 break;
401 401 case (SID_EXE_ERR):
402 402 break;
403 403 case (SID_EXE_CORR):
404 404 data[0] = 0x9c;
405 405 data[1] = 0x45;
406 406 data[2] = TC->packetID[0];
407 407 data[3] = TC->packetID[1];
408 408 data[4] = TC->packetSequenceControl[0];
409 409 data[5] = TC->packetSequenceControl[1];
410 410 data[6] = TC->dataFieldHeader[1]; // type
411 411 data[7] = TC->dataFieldHeader[2]; // subtype
412 412 data[8] = currentTC_LEN_RCV[0];
413 413 data[9] = currentTC_LEN_RCV[1];
414 414 data[10] = TC->packetLength[0];
415 415 data[11] = TC->packetLength[1];
416 416 data[12] = TC->dataAndCRC[packetLength];
417 417 data[13] = TC->dataAndCRC[packetLength+1];
418 418 data[14] = computed_CRC[0];
419 419 data[15] = computed_CRC[1];
420 420 break;
421 421 default:
422 422 return 0;
423 423 }
424 424 return 1;
425 425 }
426 426
427 427 int create_message_queue( void )
428 428 {
429 429 rtems_status_code status;
430 430 misc_name[0] = rtems_build_name( 'Q', 'U', 'E', 'U' );
431 431 status = rtems_message_queue_create( misc_name[0], ACTION_MSG_QUEUE_COUNT, CCSDS_TC_PKT_MAX_SIZE,
432 432 RTEMS_FIFO | RTEMS_LOCAL, &misc_id[0] );
433 433 if (status!=RTEMS_SUCCESSFUL) {
434 434 PRINTF("in create_message_queue *** error creating message queue\n")
435 435 }
436 436
437 437 return 0;
438 438 }
439 439
440 440 //***********
441 441 // RTEMS TASK
442 442 rtems_task recv_task( rtems_task_argument unused )
443 443 {
444 444 int len = 0;
445 445 unsigned int i = 0;
446 446 unsigned int data_length = 0;
447 447 ccsdsTelecommandPacket_t currentTC;
448 448 char data[100];
449 449
450 450 for(i=0; i<100; i++) data[i] = 0;
451 451
452 452 PRINTF("in RECV *** \n")
453 453
454 454 while(1)
455 455 {
456 456 len = read(fdSPW, (char*) &currentTC, CCSDS_TC_PKT_MAX_SIZE); // the call to read is blocking
457 457 if (len == -1){ // error during the read call
458 458 PRINTF("In RECV *** last read call returned -1\n")
459 459 if (rtems_event_send( Task_id[TASKID_SPIQ], SPW_LINKERR_EVENT ) != RTEMS_SUCCESSFUL) {
460 460 PRINTF("IN RECV *** Error: rtems_event_send SPW_LINKERR_EVENT\n")
461 461 }
462 462 if (rtems_task_suspend(RTEMS_SELF) != RTEMS_SUCCESSFUL) {
463 463 PRINTF("In RECV *** Error: rtems_task_suspend(RTEMS_SELF)\n")
464 464 }
465 465 }
466 466 else {
467 467 PRINTF1("Got pck of length %d\n", len+1)
468 468 if ( (len+1) < CCSDS_TC_PKT_MIN_SIZE ) {
469 469 PRINTF("In RECV *** packet lenght too short\n")
470 470 }
471 471 else {
472 472 currentTC_LEN_RCV[0] = 0x00;
473 473 currentTC_LEN_RCV[1] = (unsigned char) (len - CCSDS_TC_TM_PACKET_OFFSET - 3); // build the corresponding packet size field
474 474 currentTC_LEN_RCV_AsUnsignedInt = (unsigned int) (len - CCSDS_TC_TM_PACKET_OFFSET - 3); // => -3 is for Prot ID, Reserved and User App bytes
475 475 // CHECK THE TC AND BUILD THE APPROPRIATE TM
476 476 data_length = TC_checker(&currentTC, currentTC_LEN_RCV_AsUnsignedInt);
477 477 if (data_length!=-1)
478 478 {
479 479 }
480 480 }
481 481 }
482 482 }
483 483 }
484 484
485 485 rtems_task actn_task( rtems_task_argument unused )
486 486 {
487 487 int result = 0;
488 unsigned int val;
488 489 rtems_status_code status; // RTEMS status code
489 490 ccsdsTelecommandPacket_t TC; // TC sent to the ACTN task
490 491 size_t size; // size of the incoming TC packet
491 492 unsigned char subtype = 0; // subtype of the current TC packet
492 493
493 494 PRINTF("in ACTN *** \n")
494 495
495 496 while(1)
496 497 {
497 498 status = rtems_message_queue_receive(misc_id[0], (char*) &TC, &size,
498 499 RTEMS_WAIT, RTEMS_NO_TIMEOUT);
499 500 if (status!=RTEMS_SUCCESSFUL) PRINTF1("in task ACTN *** error receiving a message, code %d \n", status)
500 501 else
501 502 {
502 503 subtype = TC.dataFieldHeader[2];
503 504 switch(subtype)
504 505 {
505 506 case TC_SUBTYPE_RESET:
506 507 result = action_default( &TC );
507 508 break;
508 509 //
509 510 case TC_SUBTYPE_LOAD_COMM:
510 result = action_default( &TC );
511 result = action_load_comm( &TC );
512 close_action( &TC, result );
511 513 break;
512 514 //
513 515 case TC_SUBTYPE_LOAD_NORM:
514 516 result = action_load_norm( &TC );
515 send_tm_lfr_tc_exe_success( &TC );
517 close_action( &TC, result );
516 518 break;
517 519 //
518 520 case TC_SUBTYPE_LOAD_BURST:
519 521 result = action_default( &TC );
522 close_action( &TC, result );
520 523 break;
521 524 //
522 525 case TC_SUBTYPE_LOAD_SBM1:
523 526 result = action_default( &TC );
527 close_action( &TC, result );
524 528 break;
525 529 //
526 530 case TC_SUBTYPE_LOAD_SBM2:
527 531 result = action_default( &TC );
532 close_action( &TC, result );
528 533 break;
529 534 //
530 535 case TC_SUBTYPE_DUMP:
531 536 result = action_default( &TC );
537 close_action( &TC, result );
532 538 break;
533 539 //
534 540 case TC_SUBTYPE_ENTER:
535 541 result = action_enter( &TC );
536 send_tm_lfr_tc_exe_success( &TC );
542 close_action( &TC, result );
537 543 break;
538 544 //
539 545 case TC_SUBTYPE_UPDT_INFO:
540 546 result = action_default( &TC );
547 val = housekeeping_packet.hk_lfr_update_info_tc_cnt[0] * 256
548 + housekeeping_packet.hk_lfr_update_info_tc_cnt[1];
549 val++;
550 housekeeping_packet.hk_lfr_update_info_tc_cnt[0] = (unsigned char) (val >> 8);
551 housekeeping_packet.hk_lfr_update_info_tc_cnt[1] = (unsigned char) (val);
541 552 break;
542 553 //
543 554 case TC_SUBTYPE_EN_CAL:
544 555 result = action_default( &TC );
545 556 break;
546 557 //
547 558 case TC_SUBTYPE_DIS_CAL:
548 559 result = action_default( &TC );
549 560 break;
550 561 //
551 562 case TC_SUBTYPE_UPDT_TIME:
552 563 result = action_updt_time( &TC );
553 send_tm_lfr_tc_exe_success( &TC );
564 val = housekeeping_packet.hk_lfr_update_time_tc_cnt[0] * 256
565 + housekeeping_packet.hk_lfr_update_time_tc_cnt[1];
566 val++;
567 housekeeping_packet.hk_lfr_update_time_tc_cnt[0] = (unsigned char) (val >> 8);
568 housekeeping_packet.hk_lfr_update_time_tc_cnt[1] = (unsigned char) (val);
554 569 break;
555 570 //
556 571 default:
557 572 break;
558 573 }
559 574 }
560 575 }
561 576 }
562 577
563 578 rtems_task dumb_task( rtems_task_argument unused )
564 579 {
565 580 unsigned int coarse_time = 0;
566 581 unsigned int fine_time = 0;
567 582 unsigned int indice = 0;
568 583 unsigned int shiftedIndice = 0;
569 584 rtems_event_set event_out;
570 585
571 586 PRINTF("in DUMB *** \n")
572 587
573 588 while(1){
574 rtems_event_receive(RTEMS_EVENT_1, RTEMS_WAIT, RTEMS_NO_TIMEOUT, &event_out); // wait for an RTEMS_EVENT0
589 rtems_event_receive(RTEMS_EVENT_0 | RTEMS_EVENT_1 | RTEMS_EVENT_2 | RTEMS_EVENT_3 | RTEMS_EVENT_4,
590 RTEMS_WAIT | RTEMS_EVENT_ANY, RTEMS_NO_TIMEOUT, &event_out); // wait for an RTEMS_EVENT
575 591 indice = 0;
576 592 shiftedIndice = (unsigned int) event_out;
577 593 while(!(shiftedIndice & 0x0001))
578 594 {
579 595 shiftedIndice = shiftedIndice >> 1;
580 596 indice++;
581 597 }
582 598 coarse_time = time_management_regs->coarse_time;
583 599 fine_time = time_management_regs->fine_time;
584 600 printf("in DUMB *** time = coarse: %x, fine: %x, %s\n", coarse_time, fine_time, DumbMessages[indice]);
585 601 }
586 602 }
587 603
588 604 //***********
589 605 // TC ACTIONS
590 606
591 607 int action_default(ccsdsTelecommandPacket_t *TC)
592 608 {
593 609 Packet_TM_LFR_TC_EXE_t packet;
594 610
595 611 TM_build_header_bis( TM_LFR_TC_EXE_ERR, TM_LEN_NOT_IMP,
596 612 time_management_regs->coarse_time, time_management_regs->fine_time, &packet);
597 613
598 614 packet.data[0] = 0x9c;
599 615 packet.data[1] = 0x42;
600 616 packet.data[2] = TC->packetID[0];
601 617 packet.data[3] = TC->packetID[1];
602 618 packet.data[4] = TC->packetSequenceControl[0];
603 619 packet.data[5] = TC->packetSequenceControl[1];
604 620 packet.data[6] = TC->dataFieldHeader[1]; // type
605 621 packet.data[7] = TC->dataFieldHeader[2]; // subtype
606 622
607 623 // SEND DATA
608 624 if (write ( fdSPW, &packet, LEN_TM_LFR_TC_EXE_NOT_IMP)==-1) {
609 625 PRINTF("ERR *** in action_default *** send TM packet\n");
610 626 }
611 627
612 return 0;
628 return LFR_DEFAULT;
613 629 }
614 630
615 631 int action_enter(ccsdsTelecommandPacket_t *TC)
616 632 {
633 rtems_status_code status;
617 634 unsigned char lfr_mode = TC->dataAndCRC[1];
618 635 printf("enter mode %d\n", lfr_mode);
619 636 switch(lfr_mode)
620 637 {
621 638 //********
622 639 // STANDBY
623 640 case(LFR_MODE_STANDBY):
624 stop_current_mode();
641 status = stop_current_mode();
642 if (status != RTEMS_SUCCESSFUL)
643 {
644 PRINTF("in action_enter *** error going back to STANDBY mode\n")
645 }
646 housekeeping_packet.lfr_status_word[0] = (unsigned char) ((LFR_MODE_STANDBY << 4) + 0x0d);
625 647 break;
626 648
627 649 //******
628 650 // NORMAL
629 651 case(LFR_MODE_NORMAL):
630 stop_current_mode();
631 enter_normal_mode();
652 status = stop_current_mode();
653 status = enter_normal_mode();
654 if (status == RTEMS_SUCCESSFUL)
655 {
656 housekeeping_packet.lfr_status_word[0] = (unsigned char) ((LFR_MODE_NORMAL << 4) + 0x0d);
657 }
632 658 break;
633 659
634 660 //******
635 661 // BURST
636 662 case(LFR_MODE_BURST):
637 stop_current_mode();
663 status = stop_current_mode();
664 if (status == RTEMS_SUCCESSFUL)
665 {
666 housekeeping_packet.lfr_status_word[0] = (unsigned char) ((LFR_MODE_BURST << 4) + 0x0d);
667 }
638 668 break;
639 669
640 670 //*****
641 671 // SBM1
642 672 case(LFR_MODE_SBM1):
643 stop_current_mode();
644 enter_sbm1_mode();
673 status = stop_current_mode();
674 status = enter_sbm1_mode();
675 if (status == RTEMS_SUCCESSFUL)
676 {
677 housekeeping_packet.lfr_status_word[0] = (unsigned char) ((LFR_MODE_SBM1 << 4) + 0x0d);
678 }
645 679 break;
646 680
647 681 //*****
648 682 // SBM2
649 683 case(LFR_MODE_SBM2):
650 stop_current_mode();
684 status = stop_current_mode();
685 if (status == RTEMS_SUCCESSFUL)
686 {
687 housekeeping_packet.lfr_status_word[0] = (unsigned char) ((LFR_MODE_SBM2 << 4) + 0x0d);
688 }
651 689 break;
652 690
653 691 //********
654 692 // DEFAULT
655 693 default:
656 stop_current_mode();
694 status = stop_current_mode();
695 if (status == RTEMS_SUCCESSFUL)
696 {
697 housekeeping_packet.lfr_status_word[0] = (unsigned char) ((LFR_MODE_STANDBY << 4) + 0x0d);
698 }
657 699 break;
658 700 }
659 return 0;
701 return status;
660 702 }
661 703
662 704 int stop_current_mode()
663 705 {
706 rtems_status_code status;
664 707 // mask all IRQ lines related to signal processing
665 708 LEON_Mask_interrupt( IRQ_WF ); // mask waveform interrupt (coming from the timer VHDL IP)
666 709 LEON_Mask_interrupt( IRQ_SM ); // mask spectral matrices interrupt (coming from the timer VHDL IP)
667 710 LEON_Mask_interrupt( IRQ_WAVEFORM_PICKER ); // mask waveform picker interrupt
668 711
669 712 // clear all pending interruptions related to signal processing
670 713 LEON_Clear_interrupt( IRQ_WF ); // clear waveform interrupt (coming from the timer VHDL IP)
671 714 LEON_Clear_interrupt( IRQ_SM ); // clear spectral matrices interrupt (coming from the timer VHDL IP)
672 715 LEON_Clear_interrupt( IRQ_WAVEFORM_PICKER ); // clear waveform picker interrupt
673 716
674 717 // suspend several tasks
675 suspend_if_needed( Task_id[TASKID_AVF0] );
676 suspend_if_needed( Task_id[TASKID_BPF0] );
677 suspend_if_needed( Task_id[TASKID_WFRM] );
718 status = suspend_if_needed( Task_id[TASKID_AVF0] );
719 if (status == RTEMS_SUCCESSFUL) {
720 status = suspend_if_needed( Task_id[TASKID_BPF0] );
721 if (status == RTEMS_SUCCESSFUL) {
722 status = suspend_if_needed( Task_id[TASKID_WFRM] );
723 }
724 }
678 725
679 726 // initialize the registers
680 727 waveform_picker_regs->burst_enable = 0x00; // initialize
681 728
682 return 0;
729 return status;
683 730 }
684 731
685 732 int enter_normal_mode()
686 733 {
734 rtems_status_code status;
687 735
688 restart_if_needed( Task_id[TASKID_AVF0] );
689 restart_if_needed( Task_id[TASKID_BPF0] );
690 restart_if_needed( Task_id[TASKID_WFRM] );
736 status = restart_if_needed( Task_id[TASKID_AVF0] );
737 if (status == RTEMS_SUCCESSFUL) {
738 status = restart_if_needed( Task_id[TASKID_BPF0] );
739 if (status == RTEMS_SUCCESSFUL) {
740 status = restart_if_needed( Task_id[TASKID_WFRM] );
741 }
742 }
691 743
692 744 #ifdef GSA
693 745 LEON_Unmask_interrupt( IRQ_WF );
694 746 #else
695 747 LEON_Clear_interrupt( IRQ_WAVEFORM_PICKER );
696 748 LEON_Unmask_interrupt( IRQ_WAVEFORM_PICKER );
697 749 waveform_picker_regs->burst_enable = 0x07;
750 waveform_picker_regs->addr_data_f1 = (int) wf_snap_f1;
698 751 waveform_picker_regs->status = 0x00;
699 752 #endif
700 753 LEON_Unmask_interrupt( IRQ_SM );
701 return 0;
754
755 return status;
702 756 }
703 757
704 758 int enter_sbm1_mode()
705 759 {
706 restart_if_needed( Task_id[TASKID_AVF0] );
707 restart_if_needed( Task_id[TASKID_BPF0] );
708 restart_if_needed( Task_id[TASKID_WFRM] );
760 rtems_status_code status;
761 status = restart_if_needed( Task_id[TASKID_AVF0] );
762 if (status == RTEMS_SUCCESSFUL) {
763 status = restart_if_needed( Task_id[TASKID_BPF0] );
764 if (status == RTEMS_SUCCESSFUL) {
765 status = restart_if_needed( Task_id[TASKID_WFRM] );
766 }
767 }
709 768
710 769 #ifdef GSA
711 770 #else
712 771 LEON_Clear_interrupt( IRQ_WAVEFORM_PICKER );
713 772 LEON_Unmask_interrupt( IRQ_WAVEFORM_PICKER );
714 773 waveform_picker_regs->burst_enable = 0x20; // [0010 0000] burst f2, f1, f0 enable f3 f2 f1 f0
715 774 waveform_picker_regs->burst_enable = waveform_picker_regs->burst_enable | 0x02;
716 775 waveform_picker_regs->status = 0x00;
717 776 #endif
718 777 //LEON_Unmask_interrupt( IRQ_SM );
719 return 0;
778 return status;
720 779 }
721 780
722 781 int action_load_norm(ccsdsTelecommandPacket_t *TC)
723 782 {
724 783 param_norm.sy_lfr_n_swf_l = (TC->dataAndCRC[0] * 256) + TC->dataAndCRC[1];
725 784 param_norm.sy_lfr_n_swf_p = (TC->dataAndCRC[2] * 256) + TC->dataAndCRC[3];
726 785 param_norm.sy_lfr_n_asm_p = (TC->dataAndCRC[4] * 256) + TC->dataAndCRC[5];
727 786 param_norm.sy_lfr_n_bp_p0 = TC->dataAndCRC[6];
728 787 param_norm.sy_lfr_n_bp_p1 = TC->dataAndCRC[7];
729 /*printf("sy_lfr_n_ => swf_l %d, swf_p %d, asm_p %d, bsp_p0 %d, bsp_p1 %d\n",
730 param_norm.sy_lfr_n_swf_l, param_norm.sy_lfr_n_swf_p,
731 param_norm.sy_lfr_n_asm_p, param_norm.sy_lfr_n_bp_p0, param_norm.sy_lfr_n_bp_p1);*/
732 return 0;
788
789 return LFR_SUCCESSFUL;
790 }
791
792 int action_load_comm(ccsdsTelecommandPacket_t *TC)
793 {
794 param_common.sy_lfr_common0 = TC->dataAndCRC[0];
795 param_common.sy_lfr_common1 = TC->dataAndCRC[1];
796
797 set_data_shaping_parameters(param_common.sy_lfr_common1);
798
799 return LFR_SUCCESSFUL;
733 800 }
734 801
735 802 int action_updt_time(ccsdsTelecommandPacket_t *TC)
736 803 {
737 804 time_management_regs->coarse_time_load = (TC->dataAndCRC[0] << 24)
738 805 + (TC->dataAndCRC[1] << 16)
739 806 + (TC->dataAndCRC[2] << 8)
740 807 + TC->dataAndCRC[3];
741 808 //time_management_regs->ctrl = time_management_regs->ctrl | 1;
742 809 return 0;
743 810 }
744 811
745 812 int send_tm_lfr_tc_exe_success(ccsdsTelecommandPacket_t *TC)
746 813 {
747 814 TMHeader_t TM_header;
748 815 char data[4];
749 816 spw_ioctl_pkt_send spw_ioctl_send;
750 817
751 818 TM_build_header( TM_LFR_TC_EXE_OK, TM_LEN_EXE,
752 819 time_management_regs->coarse_time, time_management_regs->fine_time, &TM_header);
753 820
754 821 data[0] = TC->packetID[0];
755 822 data[1] = TC->packetID[1];
756 823 data[2] = TC->packetSequenceControl[0];
757 824 data[3] = TC->packetSequenceControl[1];
758 825
759 826 // filling the structure for the spacewire transmission
760 827 spw_ioctl_send.hlen = TM_HEADER_LEN + 3; // + 4 is for the protocole extra header
761 828 spw_ioctl_send.hdr = (char*) &TM_header;
762 829 spw_ioctl_send.dlen = 3;
763 830 spw_ioctl_send.data = data;
764 831
765 832 // SEND DATA
766 833 write_spw(&spw_ioctl_send);
767 834
768 835 return 0;
769 836 }
770 837
771 838 rtems_status_code restart_if_needed(rtems_id id)
772 839 {
773 840 rtems_status_code status;
774 841
775 842 status = rtems_task_is_suspended( id );
776 843
777 844 if (status==RTEMS_SUCCESSFUL) {
778 845 status = rtems_task_restart( id, 0 );
779 846 if (status!=RTEMS_SUCCESSFUL) {
780 847 PRINTF1("in restart_if_needed *** Error restarting with id %d\n", (int) id)
781 848 }
782 849 }
783 850
784 851 return status;
785 852 }
786 853
787 854 rtems_status_code suspend_if_needed(rtems_id id)
788 855 {
789 856 rtems_status_code status;
790 857
791 858 status = rtems_task_is_suspended( id );
792 859
793 860 if (status!=RTEMS_SUCCESSFUL) {
794 861 status = rtems_task_suspend( id );
795 862 if (status!=RTEMS_SUCCESSFUL) {
796 863 PRINTF1("in suspend_if_needed *** Error suspending task with id %d\n", (int) id)
797 864 }
798 865 }
799 866
800 867 return status;
801 868 }
802 869
870 void update_last_TC_exe(ccsdsTelecommandPacket_t *TC)
871 {
872 housekeeping_packet.hk_lfr_last_exe_tc_id[0] = TC->packetID[0];
873 housekeeping_packet.hk_lfr_last_exe_tc_id[1] = TC->packetID[1];
874 housekeeping_packet.hk_lfr_last_exe_tc_type[0] = 0x00;
875 housekeeping_packet.hk_lfr_last_exe_tc_type[1] = TC->dataFieldHeader[1];
876 housekeeping_packet.hk_lfr_last_exe_tc_subtype[0] = 0x00;
877 housekeeping_packet.hk_lfr_last_exe_tc_subtype[1] = TC->dataFieldHeader[2];
878 housekeeping_packet.hk_lfr_last_exe_tc_time[0] = (unsigned char) (time_management_regs->coarse_time>>24);
879 housekeeping_packet.hk_lfr_last_exe_tc_time[1] = (unsigned char) (time_management_regs->coarse_time>>16);
880 housekeeping_packet.hk_lfr_last_exe_tc_time[2] = (unsigned char) (time_management_regs->coarse_time>>8);
881 housekeeping_packet.hk_lfr_last_exe_tc_time[3] = (unsigned char) (time_management_regs->coarse_time);
882 housekeeping_packet.hk_lfr_last_exe_tc_time[4] = (unsigned char) (time_management_regs->fine_time>>8);
883 housekeeping_packet.hk_lfr_last_exe_tc_time[5] = (unsigned char) (time_management_regs->fine_time);
884 }
885
886 void update_last_TC_rej(ccsdsTelecommandPacket_t *TC)
887 {
888 housekeeping_packet.hk_lfr_last_rej_tc_id[0] = TC->packetID[0];
889 housekeeping_packet.hk_lfr_last_rej_tc_id[1] = TC->packetID[1];
890 housekeeping_packet.hk_lfr_last_rej_tc_type[0] = 0x00;
891 housekeeping_packet.hk_lfr_last_rej_tc_type[1] = TC->dataFieldHeader[1];
892 housekeeping_packet.hk_lfr_last_rej_tc_subtype[0] = 0x00;
893 housekeeping_packet.hk_lfr_last_rej_tc_subtype[1] = TC->dataFieldHeader[2];
894 housekeeping_packet.hk_lfr_last_rej_tc_time[0] = (unsigned char) (time_management_regs->coarse_time>>24);
895 housekeeping_packet.hk_lfr_last_rej_tc_time[1] = (unsigned char) (time_management_regs->coarse_time>>16);
896 housekeeping_packet.hk_lfr_last_rej_tc_time[2] = (unsigned char) (time_management_regs->coarse_time>>8);
897 housekeeping_packet.hk_lfr_last_rej_tc_time[3] = (unsigned char) (time_management_regs->coarse_time);
898 housekeeping_packet.hk_lfr_last_rej_tc_time[4] = (unsigned char) (time_management_regs->fine_time>>8);
899 housekeeping_packet.hk_lfr_last_rej_tc_time[5] = (unsigned char) (time_management_regs->fine_time);
900 }
901
902 void close_action(ccsdsTelecommandPacket_t *TC, int result)
903 {
904 unsigned int val = 0;
905 if (result == LFR_SUCCESSFUL)
906 {
907 send_tm_lfr_tc_exe_success( TC );
908 update_last_TC_exe( TC );
909 val = housekeeping_packet.hk_dpu_exe_tc_lfr_cnt[0] * 256 + housekeeping_packet.hk_dpu_exe_tc_lfr_cnt[1];
910 val++;
911 housekeeping_packet.hk_dpu_exe_tc_lfr_cnt[0] = (unsigned char) (val >> 8);
912 housekeeping_packet.hk_dpu_exe_tc_lfr_cnt[1] = (unsigned char) (val);
913 }
914 else
915 {
916 update_last_TC_rej( TC );
917 val = housekeeping_packet.hk_dpu_rej_tc_lfr_cnt[0] * 256 + housekeeping_packet.hk_dpu_rej_tc_lfr_cnt[1];
918 val++;
919 housekeeping_packet.hk_dpu_rej_tc_lfr_cnt[0] = (unsigned char) (val >> 8);
920 housekeeping_packet.hk_dpu_rej_tc_lfr_cnt[1] = (unsigned char) (val);
921 }
922 }
923
803 924 //***************************
804 925 // Interrupt Service Routines
805 926 rtems_isr commutation_isr1( rtems_vector_number vector )
806 927 {
807 928 if (rtems_event_send( Task_id[TASKID_DUMB], RTEMS_EVENT_0 ) != RTEMS_SUCCESSFUL) {
808 929 printf("In commutation_isr1 *** Error sending event to DUMB\n");
809 930 }
810 931 }
811 932
812 933 rtems_isr commutation_isr2( rtems_vector_number vector )
813 934 {
814 935 if (rtems_event_send( Task_id[TASKID_DUMB], RTEMS_EVENT_0 ) != RTEMS_SUCCESSFUL) {
815 936 printf("In commutation_isr2 *** Error sending event to DUMB\n");
816 937 }
817 938 }
818 939
819 940
820 941
821 942
@@ -1,312 +1,414
1 1 #include <wf_handler.h>
2 2
3 rtems_isr waveforms_isr( rtems_vector_number vector )
3 rtems_isr waveforms_isr_alternative( rtems_vector_number vector )
4 4 {
5 if (rtems_event_send( Task_id[TASKID_DUMB], RTEMS_EVENT_2 ) != RTEMS_SUCCESSFUL) {
6 printf("In waveforms_isr *** Error sending event to WFRM\n");
7 }
8 5 if (waveform_picker_regs->burst_enable == 0x22) {
9 6 if (waveform_picker_regs->addr_data_f1 == (int) wf_snap_f1) {
10 7 waveform_picker_regs->addr_data_f1 = (int) (wf_snap_f1_bis);
11 8 }
12 9 else {
13 10 waveform_picker_regs->addr_data_f1 = (int) (wf_snap_f1);
14 11 }
15 if (rtems_event_send( Task_id[TASKID_WFRM], RTEMS_EVENT_0 ) != RTEMS_SUCCESSFUL) {
16 printf("In waveforms_isr *** Error sending event to WFRM\n");
12 if (rtems_event_send( Task_id[TASKID_WFRM], RTEMS_EVENT_2 ) != RTEMS_SUCCESSFUL) {
13 //rtems_event_send( Task_id[TASKID_DUMB], RTEMS_EVENT_2 );
17 14 }
18 15 }
19 16 waveform_picker_regs->status = 0x00;
20 17 /*else if ( (waveform_picker_regs->burst_enable & 0x7) == 0x0 ){// if no channel is enable
21 18 if (rtems_event_send( Task_id[TASKID_DUMB], RTEMS_EVENT_2 ) != RTEMS_SUCCESSFUL) {
22 19 printf("In timecode_irq_handler *** Error sending event to DUMB\n");
23 20 }
24 21 }
25 22 else {
26 23 if ( (waveform_picker_regs->status & 0x7) == 0x7 ){ // f2 f1 and f0 are full
27 24 waveform_picker_regs->burst_enable = 0x00;
28 25 if (rtems_event_send( Task_id[TASKID_WFRM], RTEMS_EVENT_0 ) != RTEMS_SUCCESSFUL) {
29 26 printf("In waveforms_isr *** Error sending event to WFRM\n");
30 27 }
31 28 }
32 29 }*/
33 30 }
34 31
32 rtems_isr waveforms_isr( rtems_vector_number vector )
33 {
34 unsigned char lfrMode;
35 lfrMode = (housekeeping_packet.lfr_status_word[0] & 0xf0) >> 4;
36
37 switch(lfrMode)
38 {
39 //********
40 // STANDBY
41 case(LFR_MODE_STANDBY):
42 break;
43
44 //******
45 // NORMAL
46 case(LFR_MODE_NORMAL):
47 #ifdef GSA
48 PRINTF("in waveform_isr *** unexpected waveform picker interruption\n")
49 #else
50 if ( (waveform_picker_regs->burst_enable & 0x7) == 0x0 ){// if no channel is enable
51 if (rtems_event_send( Task_id[TASKID_DUMB], RTEMS_EVENT_2 ) != RTEMS_SUCCESSFUL) {
52 PRINTF("in waveform_isr *** Error sending event to DUMB\n");
53 }
54 }
55 else {
56 if ( (waveform_picker_regs->status & 0x7) == 0x7 ){ // f2 f1 and f0 are full
57 waveform_picker_regs->burst_enable = 0x00;
58 if (rtems_event_send( Task_id[TASKID_WFRM], RTEMS_EVENT_MODE_NORMAL ) != RTEMS_SUCCESSFUL) {
59 if (rtems_event_send( Task_id[TASKID_DUMB], RTEMS_EVENT_2 ) != RTEMS_SUCCESSFUL) {
60 PRINTF("in waveform_isr *** Error sending event to DUMB\n");
61 }
62 }
63 }
64 }
65 #endif
66 break;
67
68 //******
69 // BURST
70 case(LFR_MODE_BURST):
71 break;
72
73 //*****
74 // SBM1
75 case(LFR_MODE_SBM1):
76 #ifdef GSA
77 PRINTF("in waveform_isr *** unexpected waveform picker interruption\n")
78 #else
79 if (waveform_picker_regs->burst_enable == 0x22) {
80 if (waveform_picker_regs->addr_data_f1 == (int) wf_snap_f1) {
81 waveform_picker_regs->addr_data_f1 = (int) (wf_snap_f1_bis);
82 }
83 else {
84 waveform_picker_regs->addr_data_f1 = (int) (wf_snap_f1);
85 }
86 if (rtems_event_send( Task_id[TASKID_WFRM], RTEMS_EVENT_MODE_SBM1 ) != RTEMS_SUCCESSFUL) {
87 PRINTF("in waveforms_isr *** Error sending event to WFRM\n")
88 rtems_event_send( Task_id[TASKID_DUMB], RTEMS_EVENT_2 );
89 }
90 }
91 waveform_picker_regs->status = 0x00;
92 #endif
93 break;
94
95 //*****
96 // SBM2
97 case(LFR_MODE_SBM2):
98 break;
99
100 //********
101 // DEFAULT
102 default:
103 break;
104 }
105 }
106
35 107 rtems_isr waveforms_simulator_isr( rtems_vector_number vector )
36 108 {
37 109 if (rtems_event_send( Task_id[TASKID_WFRM], RTEMS_EVENT_0 ) != RTEMS_SUCCESSFUL) {
38 110 printf("In waveforms_isr *** Error sending event to WFRM\n");
39 111 }
40 112 }
41 113
42 114 rtems_task wfrm_task(rtems_task_argument argument) //used with the waveform picker VHDL IP
43 115 {
44 116 spw_ioctl_pkt_send spw_ioctl_send;
45 117 rtems_event_set event_out;
46 118 ExtendedTMHeader_t header;
47 119
48 120 header.targetLogicalAddress = CCSDS_DESTINATION_ID;
49 121 header.protocolIdentifier = CCSDS_PROTOCOLE_ID;
50 122 header.reserved = 0x00;
51 123 header.userApplication = CCSDS_USER_APP;
52 124 header.packetID[0] = 0x0c;
53 125 header.packetID[1] = 0xcc;
54 126 header.packetSequenceControl[0] = 0x00;
55 127 header.packetSequenceControl[1] = 0x00;
56 128 header.packetLength[0] = 0x00;
57 129 header.packetLength[1] = 0x00;
58 130 header.dataFieldHeader[0] = 0x10;
59 131 header.dataFieldHeader[1] = TM_TYPE_LFR_SCIENCE; // service type
60 132 header.dataFieldHeader[2] = TM_SUBTYPE_LFR_SCIENCE; // service subtype
61 133 header.dataFieldHeader[3] = CCSDS_DESTINATION_ID_GROUND;
62 134
63 135 header.auxiliaryHeader[0] = 0x00;
64 136 header.auxiliaryHeader[1] = 0x1f;
65 137 header.auxiliaryHeader[2] = 0x07; // PKT_CNT
66 138 header.auxiliaryHeader[3] = 0x00; // PKT_NR
67 139 header.auxiliaryHeader[4] = 0x00; // BLK_NR MSB
68 140 header.auxiliaryHeader[5] = 0x00; // BLK_NR LSB
69 141
70 142 // BUILD THE PACKET HEADER
71 143 spw_ioctl_send.hlen = TM_HEADER_LEN + 4 + 6; // + 4 is for the protocole extra header, + 6 is for the auxiliary header
72 144 spw_ioctl_send.hdr = (char*) &header;
73 145
74 146 init_waveforms();
75 147
76 148 PRINTF("in WFRM ***\n")
77 149
78 150 while(1){
79
80 rtems_event_receive(RTEMS_EVENT_0, RTEMS_WAIT, RTEMS_NO_TIMEOUT, &event_out); // wait for an RTEMS_EVENT0
81 PRINTF("in WFRM *** send wfrm\n")
151 // wait for an RTEMS_EVENT
152 rtems_event_receive(RTEMS_EVENT_0 | RTEMS_EVENT_1 | RTEMS_EVENT_2 | RTEMS_EVENT_3 | RTEMS_EVENT_4,
153 RTEMS_WAIT | RTEMS_EVENT_ANY, RTEMS_NO_TIMEOUT, &event_out);
82 154 header.dataFieldHeader[4] = (unsigned char) (time_management_regs->coarse_time>>24);
83 155 header.dataFieldHeader[5] = (unsigned char) (time_management_regs->coarse_time>>16);
84 156 header.dataFieldHeader[6] = (unsigned char) (time_management_regs->coarse_time>>8);
85 157 header.dataFieldHeader[7] = (unsigned char) (time_management_regs->coarse_time);
86 158 header.dataFieldHeader[8] = (unsigned char) (time_management_regs->fine_time>>8);
87 159 header.dataFieldHeader[9] = (unsigned char) (time_management_regs->fine_time);
88 160
89 //***************
90 // send snapshots
91 // F0
92 //send_waveform( &header, wf_snap_f0, SID_NORM_SWF_F0, &spw_ioctl_send);
93 // F1
94 if (waveform_picker_regs->addr_data_f1 == (int) wf_snap_f1) {
95 send_waveform( &header, wf_snap_f1_bis, SID_NORM_SWF_F1, &spw_ioctl_send);
96 }
97 else {
98 send_waveform( &header, wf_snap_f1, SID_NORM_SWF_F1, &spw_ioctl_send);
161 switch(event_out)
162 {
163 //********
164 // STANDBY
165 case(RTEMS_EVENT_MODE_STANDBY):
166 break;
167
168 //*******
169 // NORMAL
170 case(RTEMS_EVENT_MODE_NORMAL):
171 //***************
172 // send snapshots
173 // F0
174 send_waveform( &header, wf_snap_f0, SID_NORM_SWF_F0, &spw_ioctl_send);
175 // F1
176 send_waveform( &header, wf_snap_f1, SID_NORM_SWF_F1, &spw_ioctl_send);
177 // F2
178 send_waveform( &header, wf_snap_f2, SID_NORM_SWF_F2, &spw_ioctl_send);
179 #ifdef GSA
180 // irq processed, reset the related register of the timer unit
181 gptimer_regs->timer[2].ctrl = gptimer_regs->timer[2].ctrl | 0x00000010;
182 #else
183 // irq processed, reset the related register of the waveform picker
184 waveform_picker_regs->status = 0x00;
185 waveform_picker_regs->burst_enable = 0x07;
186 #endif
187 break;
188
189 //*****
190 // SBM1
191 case(RTEMS_EVENT_MODE_SBM1):
192 // F1
193 if (waveform_picker_regs->addr_data_f1 == (int) wf_snap_f1) {
194 send_waveform( &header, wf_snap_f1_bis, SID_NORM_SWF_F1, &spw_ioctl_send);
195 }
196 else {
197 send_waveform( &header, wf_snap_f1, SID_NORM_SWF_F1, &spw_ioctl_send);
198 }
199 break;
200 default:
201 break;
99 202 }
100 // F2
101 //send_waveform( &header, wf_snap_f2, SID_NORM_SWF_F2, &spw_ioctl_send);
102
103 #ifdef GSA
104 // irq processed, reset the related register of the timer unit
105 gptimer_regs->timer[2].ctrl = gptimer_regs->timer[2].ctrl | 0x00000010;
106 #else
107 // irq processed, reset the related register of the waveform picker
108 //waveform_picker_regs->status = 0x00;
109 //waveform_picker_regs->burst_enable = 0x07;
110 #endif
111
112 203 }
113 204 }
114 205
115 206 //******************
116 207 // general functions
117 208 void init_waveforms( void )
118 209 {
119 210 int i = 0;
120 211
121 212 for (i=0; i< NB_SAMPLES_PER_SNAPSHOT; i++)
122 213 {
123 214 //***
124 215 // F0
125 216 wf_snap_f0[ (i* NB_WORDS_SWF_BLK) + 0 + TIME_OFFSET ] = 0x88887777; //
126 217 wf_snap_f0[ (i* NB_WORDS_SWF_BLK) + 1 + TIME_OFFSET ] = 0x22221111; //
127 218 wf_snap_f0[ (i* NB_WORDS_SWF_BLK) + 2 + TIME_OFFSET ] = 0x44443333; //
128 219
129 220 //***
130 221 // F1
131 222 wf_snap_f1[ (i* NB_WORDS_SWF_BLK) + 0 + TIME_OFFSET ] = 0x22221111;
132 223 wf_snap_f1[ (i* NB_WORDS_SWF_BLK) + 1 + TIME_OFFSET ] = 0x44443333;
133 224 wf_snap_f1[ (i* NB_WORDS_SWF_BLK) + 2 + TIME_OFFSET ] = 0xaaaa0000;
134 225
135 226 //***
136 227 // F2
137 228 wf_snap_f2[ (i* NB_WORDS_SWF_BLK) + 0 + TIME_OFFSET ] = 0x44443333;
138 229 wf_snap_f2[ (i* NB_WORDS_SWF_BLK) + 1 + TIME_OFFSET ] = 0x22221111;
139 230 wf_snap_f2[ (i* NB_WORDS_SWF_BLK) + 2 + TIME_OFFSET ] = 0xaaaa0000;
140 231
141 232 //***
142 233 // F3
143 234 //wf_cont_f3[ (i* NB_WORDS_SWF_BLK) + 0 ] = val1;
144 235 //wf_cont_f3[ (i* NB_WORDS_SWF_BLK) + 1 ] = val2;
145 236 //wf_cont_f3[ (i* NB_WORDS_SWF_BLK) + 2 ] = 0xaaaa0000;
146 237 }
147 238 }
148 239
149 240 void init_waveform_header( ExtendedTMHeader_t * header, unsigned int sid )
150 241 {
151 242
152 243 header->targetLogicalAddress = CCSDS_DESTINATION_ID;
153 244 header->protocolIdentifier = CCSDS_PROTOCOLE_ID;
154 245 header->reserved = 0x00;
155 246 header->userApplication = CCSDS_USER_APP;
156 247 header->packetID[0] = 0x0c;
157 248 header->packetID[1] = 0xcc;
158 249 header->packetSequenceControl[0] = 0x00;
159 250 header->packetSequenceControl[1] = 0x00;
160 251 header->packetLength[0] = 0x00;
161 252 header->packetLength[1] = 0x00;
162 253 header->dataFieldHeader[0] = 0x10;
163 254 header->dataFieldHeader[1] = TM_TYPE_LFR_SCIENCE; // service type
164 255 header->dataFieldHeader[2] = TM_SUBTYPE_LFR_SCIENCE; // service subtype
165 256 header->dataFieldHeader[3] = CCSDS_DESTINATION_ID_GROUND;
166 257
167 258 header->auxiliaryHeader[0] = sid;
168 259 header->auxiliaryHeader[1] = 0x1f;
169 260 header->auxiliaryHeader[2] = 0x07; // PKT_CNT
170 261 header->auxiliaryHeader[3] = 0x00; // PKT_NR
171 262 header->auxiliaryHeader[4] = 0x00; // BLK_NR MSB
172 263 header->auxiliaryHeader[5] = 0x00; // BLK_NR LSB
173 264 }
174 265
175 266 void reset_waveforms( void )
176 267 {
177 268 int i = 0;
178 269
179 270 for (i=0; i< NB_SAMPLES_PER_SNAPSHOT; i++)
180 271 {
181 272 wf_snap_f0[ (i* NB_WORDS_SWF_BLK) + 0 + TIME_OFFSET] = 0x10002000;
182 273 wf_snap_f0[ (i* NB_WORDS_SWF_BLK) + 1 + TIME_OFFSET] = 0x20001000;
183 274 wf_snap_f0[ (i* NB_WORDS_SWF_BLK) + 2 + TIME_OFFSET] = 0x40008000;
184 275
185 276 //***
186 277 // F1
187 278 wf_snap_f1[ (i* NB_WORDS_SWF_BLK) + 0 + TIME_OFFSET] = 0x1000f000;
188 279 wf_snap_f1[ (i* NB_WORDS_SWF_BLK) + 1 + TIME_OFFSET] = 0xf0001000;
189 280 wf_snap_f1[ (i* NB_WORDS_SWF_BLK) + 2 + TIME_OFFSET] = 0x40008000;
190 281
191 282 //***
192 283 // F2
193 284 wf_snap_f2[ (i* NB_WORDS_SWF_BLK) + 0 + TIME_OFFSET] = 0x40008000;
194 285 wf_snap_f2[ (i* NB_WORDS_SWF_BLK) + 1 + TIME_OFFSET] = 0x20001000;
195 286 wf_snap_f2[ (i* NB_WORDS_SWF_BLK) + 2 + TIME_OFFSET] = 0x10002000;
196 287
197 288 //***
198 289 // F3
199 290 /*wf_cont_f3[ i* NB_WORDS_SWF_BLK + 0 ] = build_value( i, i ); // v and 1
200 291 wf_cont_f3[ i* NB_WORDS_SWF_BLK + 1 ] = build_value( i, i ); // e2 and b1
201 292 wf_cont_f3[ i* NB_WORDS_SWF_BLK + 2 ] = build_value( i, i ); // b2 and b3*/
202 293 }
203 294 }
204 295
205 296 void send_waveform( ExtendedTMHeader_t *header, volatile int *waveform,
206 297 unsigned int sid, spw_ioctl_pkt_send *spw_ioctl_send)
207 298 {
208 299 unsigned int i = 0;
209 300 unsigned int length = 0;
210 301 rtems_status_code status;
211 302
212 303 for (i=0; i<7; i++) // send waveform
213 304 {
214 305 header->auxiliaryHeader[3] = (unsigned char) i+1; // PKT_NR
215 306 // BUILD THE DATA
216 307 if (i==6) {
217 308 spw_ioctl_send->dlen = 8 * NB_BYTES_SWF_BLK;
218 309 length = TM_LEN_SCI_NORM_SWF_8;
219 310 header->auxiliaryHeader[4] = 0x00; // BLK_NR MSB
220 311 header->auxiliaryHeader[5] = 0x08; // BLK_NR LSB
221 312 }
222 313 else {
223 314 spw_ioctl_send->dlen = 340 * NB_BYTES_SWF_BLK;
224 315 length = TM_LEN_SCI_NORM_SWF_340;
225 316 header->auxiliaryHeader[4] = 0x01; // BLK_NR MSB
226 317 header->auxiliaryHeader[5] = 0x54; // BLK_NR LSB
227 318 }
228 319 if (sid == SID_NORM_SWF_F0) {
229 320 spw_ioctl_send->data = (char*) &waveform[ (i * 340 * NB_WORDS_SWF_BLK) + (1 * TIME_OFFSET) ];
230 321 }
231 322 else if (sid == SID_NORM_SWF_F1) {
232 323 spw_ioctl_send->data = (char*) &waveform[ (i * 340 * NB_WORDS_SWF_BLK) + (1 * TIME_OFFSET) ];
233 324 }
234 325 else if (sid == SID_NORM_SWF_F2) {
235 326 spw_ioctl_send->data = (char*) &waveform[ (i * 340 * NB_WORDS_SWF_BLK) + (1 * TIME_OFFSET) ];
236 327 }
237 328 else {
238 329 spw_ioctl_send->data = (char*) &waveform[ (i * 340 * NB_WORDS_SWF_BLK) ];
239 330 }
240 331 // BUILD THE HEADER
241 332 header->packetLength[0] = (unsigned char) (length>>8);
242 333 header->packetLength[1] = (unsigned char) (length);
243 334 header->auxiliaryHeader[0] = sid; // SID
244 335 // SEND PACKET
245 336 status = write_spw(spw_ioctl_send);
246 337 if (status != RTEMS_SUCCESSFUL) {
247 338 while (true) {
248 339 if (status != RTEMS_SUCCESSFUL) {
249 340 status = write_spw(spw_ioctl_send);
250 341 //PRINTF1("%d", i)
251 342 sched_yield();
252 343 }
253 344 else {
254 345 //PRINTF("\n")
255 346 break;
256 347 }
257 348 }
258 349 }
259 350 }
260 351 }
261 352
262 353 int build_value(int value1, int value0)
263 354 {
264 355 int aux = 0;
265 356 int aux1 = 0;
266 357 int aux0 = 0;
267 358 int value1_aux = 0;
268 359 int value0_aux = 0;
269 360
270 361 value1_aux = value1;
271 362 value0_aux = value0;
272 363
273 364 //******
274 365 // B3 B2
275 366 if (value1_aux > 8191) value1_aux = 8191;
276 367 if (value1_aux < -8192) value1_aux = -8192;
277 368 aux1 = ( (int) ( ( (unsigned char) (value1_aux / 256 ) ) << 8 ) )
278 369 + ( (int) ( (unsigned char) (value1_aux ) ) );
279 370
280 371 //******
281 372 // B1 B0
282 373 if (value0_aux > 8191) value0_aux = 8191;
283 374 if (value0_aux < -8192) value0_aux = -8192;
284 375 aux0 = ( (int) ( ( (unsigned char) (value0_aux / 256) ) << 8 ) )
285 376 + ( (int) ( (unsigned char) (value0_aux ) ) );
286 377
287 378 aux = (aux1 << 16) + aux0;
288 379
289 380 return aux;
290 381 }
291 382
292 383 void init_waveform_picker_regs()
293 { // 1 1 0 0 0 BW = 0 => BIAS_WORKS
294 waveform_picker_regs->data_shaping = 0x18; // R1 R0 SP1 SP0 BW
384 {
385 set_data_shaping_parameters(param_common.sy_lfr_common1);
295 386 waveform_picker_regs->burst_enable = 0x00; // burst f2, f1, f0 enable f3, f2, f1, f0
296 387 waveform_picker_regs->addr_data_f0 = (int) (wf_snap_f0); //
297 388 waveform_picker_regs->addr_data_f1 = (int) (wf_snap_f1); //
298 389 waveform_picker_regs->addr_data_f2 = (int) (wf_snap_f2); //
299 390 waveform_picker_regs->addr_data_f3 = (int) (wf_cont_f3); //
300 391 waveform_picker_regs->status = 0x00; //
301 392 waveform_picker_regs->delta_snapshot = 0x5; // max 2 bytes
302 393 waveform_picker_regs->delta_f2_f1 = 0xffff; // max 4 bytes
303 394 waveform_picker_regs->delta_f2_f0 = 0x17c00; // max 5 bytes
304 395 waveform_picker_regs->nb_burst_available = 0x180; // max 3 bytes, size of the buffer in burst (1 burst = 16 x 4 octets)
305 396 waveform_picker_regs->nb_snapshot_param = 0x7ff; // max 3 octets, 2048 - 1
306 397 //waveform_picker_regs->delta_snapshot = 0x2; // max 2 bytes, = period / 2
307 398 //waveform_picker_regs->delta_f2_f1 = 0x2d00; // max 4 bytes
308 399 //waveform_picker_regs->delta_f2_f0 = 0x2f80; // max 5 bytes
309 400 //waveform_picker_regs->nb_burst_available = 0x30; // max 3 bytes, size of the buffer in burst (1 burst = 16 x 4 octets)
310 401 //waveform_picker_regs->nb_snapshot_param = 0xff; // max 3 octets, 256 - 1
311 402 }
312 403
404 void set_data_shaping_parameters(unsigned char parameters)
405 {
406 // get the parameters for the data shaping [BW SP0 SP1 R0 R1] in sy_lfr_common1 and configure the register
407 // waveform picker : [R1 R0 SP1 SP0 BW]
408 waveform_picker_regs->data_shaping =
409 ( (parameters & 0x10) >> 4 ) // BW
410 + ( (parameters & 0x08) >> 2 ) // SP0
411 + ( (parameters & 0x04) ) // SP1
412 + ( (parameters & 0x02) << 2 ) // R0
413 + ( (parameters & 0x01) << 4 ); // R1
414 }
General Comments 0
You need to be logged in to leave comments. Login now