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