##// END OF EJS Templates
SOLVED: compatibility of fsw-gsa with the WF simulator interruption
paul -
r30:f599a59313eb default
parent child
Show More
@@ -1,225 +1,225
1 1 #############################################################################
2 2 # Makefile for building: bin/fsw
3 # Generated by qmake (2.01a) (Qt 4.8.4) on: Tue Jul 16 13:03:12 2013
3 # Generated by qmake (2.01a) (Qt 4.8.4) on: Fri Jul 19 08:56:46 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=8 -DPRINT_MESSAGES_ON_CONSOLE
13 DEFINES = -DSW_VERSION_N1=0 -DSW_VERSION_N2=0 -DSW_VERSION_N3=0 -DSW_VERSION_N4=9 -DPRINT_MESSAGES_ON_CONSOLE
14 14 CFLAGS = -pipe -O3 -Wall $(DEFINES)
15 15 CXXFLAGS = -pipe -O3 -Wall $(DEFINES)
16 16 INCPATH = -I/usr/lib64/qt4/mkspecs/linux-g++ -I. -I../src -I../header
17 17 LINK = sparc-rtems-g++
18 18 LFLAGS =
19 19 LIBS = $(SUBLIBS)
20 20 AR = sparc-rtems-ar rcs
21 21 RANLIB =
22 22 QMAKE = /usr/bin/qmake-qt4
23 23 TAR = tar -cf
24 24 COMPRESS = gzip -9f
25 25 COPY = cp -f
26 26 SED = sed
27 27 COPY_FILE = $(COPY)
28 28 COPY_DIR = $(COPY) -r
29 29 STRIP = sparc-rtems-strip
30 30 INSTALL_FILE = install -m 644 -p
31 31 INSTALL_DIR = $(COPY_DIR)
32 32 INSTALL_PROGRAM = install -m 755 -p
33 33 DEL_FILE = rm -f
34 34 SYMLINK = ln -f -s
35 35 DEL_DIR = rmdir
36 36 MOVE = mv -f
37 37 CHK_DIR_EXISTS= test -d
38 38 MKDIR = mkdir -p
39 39
40 40 ####### Output directory
41 41
42 42 OBJECTS_DIR = obj/
43 43
44 44 ####### Files
45 45
46 46 SOURCES = ../src/wf_handler.c \
47 47 ../src/tc_handler.c \
48 48 ../src/fsw_processing.c \
49 49 ../src/fsw_misc.c \
50 50 ../src/fsw_init.c \
51 51 ../src/fsw_globals.c
52 52 OBJECTS = obj/wf_handler.o \
53 53 obj/tc_handler.o \
54 54 obj/fsw_processing.o \
55 55 obj/fsw_misc.o \
56 56 obj/fsw_init.o \
57 57 obj/fsw_globals.o
58 58 DIST = /usr/lib64/qt4/mkspecs/common/unix.conf \
59 59 /usr/lib64/qt4/mkspecs/common/linux.conf \
60 60 /usr/lib64/qt4/mkspecs/common/gcc-base.conf \
61 61 /usr/lib64/qt4/mkspecs/common/gcc-base-unix.conf \
62 62 /usr/lib64/qt4/mkspecs/common/g++-base.conf \
63 63 /usr/lib64/qt4/mkspecs/common/g++-unix.conf \
64 64 /usr/lib64/qt4/mkspecs/qconfig.pri \
65 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 81 QMAKE_TARGET = fsw
82 82 DESTDIR = bin/
83 83 TARGET = bin/fsw
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 162 @$(CHK_DIR_EXISTS) obj/fsw1.0.0 || $(MKDIR) obj/fsw1.0.0
163 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
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
5 5 CONFIG -= qt
6 6
7 7 include(./sparc.pri)
8 8
9 9 # flight software version
10 SWVERSION=-0-8
10 SWVERSION=-0-9
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=8
14 DEFINES += SW_VERSION_N4=9
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,255 +1,255
1 1 <?xml version="1.0" encoding="UTF-8"?>
2 2 <!DOCTYPE QtCreatorProject>
3 <!-- Written by QtCreator 2.7.0, 2013-07-16T11:27:54. -->
3 <!-- Written by QtCreator 2.7.0, 2013-07-19T08:53:16. -->
4 4 <qtcreator>
5 5 <data>
6 6 <variable>ProjectExplorer.Project.ActiveTarget</variable>
7 7 <value type="int">0</value>
8 8 </data>
9 9 <data>
10 10 <variable>ProjectExplorer.Project.EditorSettings</variable>
11 11 <valuemap type="QVariantMap">
12 12 <value type="bool" key="EditorConfiguration.AutoIndent">true</value>
13 13 <value type="bool" key="EditorConfiguration.AutoSpacesForTabs">false</value>
14 14 <value type="bool" key="EditorConfiguration.CamelCaseNavigation">true</value>
15 15 <valuemap type="QVariantMap" key="EditorConfiguration.CodeStyle.0">
16 16 <value type="QByteArray" key="language">Cpp</value>
17 17 <valuemap type="QVariantMap" key="value">
18 18 <value type="QString" key="CurrentPreferences">CppGlobal</value>
19 19 </valuemap>
20 20 </valuemap>
21 21 <valuemap type="QVariantMap" key="EditorConfiguration.CodeStyle.1">
22 22 <value type="QByteArray" key="language">QmlJS</value>
23 23 <valuemap type="QVariantMap" key="value">
24 24 <value type="QString" key="CurrentPreferences">QmlJSGlobal</value>
25 25 </valuemap>
26 26 </valuemap>
27 27 <value type="int" key="EditorConfiguration.CodeStyle.Count">2</value>
28 28 <value type="QByteArray" key="EditorConfiguration.Codec">System</value>
29 29 <value type="bool" key="EditorConfiguration.ConstrainTooltips">false</value>
30 30 <value type="int" key="EditorConfiguration.IndentSize">4</value>
31 31 <value type="bool" key="EditorConfiguration.KeyboardTooltips">false</value>
32 32 <value type="bool" key="EditorConfiguration.MouseNavigation">true</value>
33 33 <value type="int" key="EditorConfiguration.PaddingMode">1</value>
34 34 <value type="bool" key="EditorConfiguration.ScrollWheelZooming">true</value>
35 35 <value type="int" key="EditorConfiguration.SmartBackspaceBehavior">0</value>
36 36 <value type="bool" key="EditorConfiguration.SpacesForTabs">true</value>
37 37 <value type="int" key="EditorConfiguration.TabKeyBehavior">0</value>
38 38 <value type="int" key="EditorConfiguration.TabSize">8</value>
39 39 <value type="bool" key="EditorConfiguration.UseGlobal">true</value>
40 40 <value type="int" key="EditorConfiguration.Utf8BomBehavior">1</value>
41 41 <value type="bool" key="EditorConfiguration.addFinalNewLine">true</value>
42 42 <value type="bool" key="EditorConfiguration.cleanIndentation">true</value>
43 43 <value type="bool" key="EditorConfiguration.cleanWhitespace">true</value>
44 44 <value type="bool" key="EditorConfiguration.inEntireDocument">false</value>
45 45 </valuemap>
46 46 </data>
47 47 <data>
48 48 <variable>ProjectExplorer.Project.PluginSettings</variable>
49 49 <valuemap type="QVariantMap"/>
50 50 </data>
51 51 <data>
52 52 <variable>ProjectExplorer.Project.Target.0</variable>
53 53 <valuemap type="QVariantMap">
54 54 <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Desktop-Qt 4.8.2 in PATH (System)</value>
55 55 <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Desktop-Qt 4.8.2 in PATH (System)</value>
56 56 <value type="QByteArray" key="ProjectExplorer.ProjectConfiguration.Id">{5289e843-9ef2-45ce-88c6-ad27d8e08def}</value>
57 57 <value type="int" key="ProjectExplorer.Target.ActiveBuildConfiguration">0</value>
58 58 <value type="int" key="ProjectExplorer.Target.ActiveDeployConfiguration">0</value>
59 59 <value type="int" key="ProjectExplorer.Target.ActiveRunConfiguration">0</value>
60 60 <valuemap type="QVariantMap" key="ProjectExplorer.Target.BuildConfiguration.0">
61 61 <valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.0">
62 62 <valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
63 63 <value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
64 64 <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">qmake</value>
65 65 <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
66 66 <value type="QByteArray" key="ProjectExplorer.ProjectConfiguration.Id">QtProjectManager.QMakeBuildStep</value>
67 67 <value type="bool" key="QtProjectManager.QMakeBuildStep.LinkQmlDebuggingLibrary">false</value>
68 68 <value type="bool" key="QtProjectManager.QMakeBuildStep.LinkQmlDebuggingLibraryAuto">true</value>
69 69 <value type="QString" key="QtProjectManager.QMakeBuildStep.QMakeArguments"></value>
70 70 <value type="bool" key="QtProjectManager.QMakeBuildStep.QMakeForced">false</value>
71 71 </valuemap>
72 72 <valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.1">
73 73 <value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
74 74 <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Make</value>
75 75 <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
76 76 <value type="QByteArray" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.MakeStep</value>
77 77 <valuelist type="QVariantList" key="Qt4ProjectManager.MakeStep.AutomaticallyAddedMakeArguments">
78 78 <value type="QString">-w</value>
79 79 <value type="QString">-r</value>
80 80 </valuelist>
81 81 <value type="bool" key="Qt4ProjectManager.MakeStep.Clean">false</value>
82 82 <value type="QString" key="Qt4ProjectManager.MakeStep.MakeArguments">-r -w </value>
83 83 <value type="QString" key="Qt4ProjectManager.MakeStep.MakeCommand"></value>
84 84 </valuemap>
85 85 <value type="int" key="ProjectExplorer.BuildStepList.StepsCount">2</value>
86 86 <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Build</value>
87 87 <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
88 88 <value type="QByteArray" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Build</value>
89 89 </valuemap>
90 90 <valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.1">
91 91 <valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
92 92 <value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
93 93 <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Make</value>
94 94 <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
95 95 <value type="QByteArray" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.MakeStep</value>
96 96 <valuelist type="QVariantList" key="Qt4ProjectManager.MakeStep.AutomaticallyAddedMakeArguments">
97 97 <value type="QString">-w</value>
98 98 <value type="QString">-r</value>
99 99 </valuelist>
100 100 <value type="bool" key="Qt4ProjectManager.MakeStep.Clean">true</value>
101 101 <value type="QString" key="Qt4ProjectManager.MakeStep.MakeArguments">-r -w clean</value>
102 102 <value type="QString" key="Qt4ProjectManager.MakeStep.MakeCommand"></value>
103 103 </valuemap>
104 104 <value type="int" key="ProjectExplorer.BuildStepList.StepsCount">1</value>
105 105 <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Clean</value>
106 106 <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
107 107 <value type="QByteArray" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Clean</value>
108 108 </valuemap>
109 109 <value type="int" key="ProjectExplorer.BuildConfiguration.BuildStepListCount">2</value>
110 110 <value type="bool" key="ProjectExplorer.BuildConfiguration.ClearSystemEnvironment">false</value>
111 111 <valuelist type="QVariantList" key="ProjectExplorer.BuildConfiguration.UserEnvironmentChanges"/>
112 112 <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Qt 4.8.2 in PATH (System) Release</value>
113 113 <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
114 114 <value type="QByteArray" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.Qt4BuildConfiguration</value>
115 115 <value type="int" key="Qt4ProjectManager.Qt4BuildConfiguration.BuildConfiguration">0</value>
116 116 <value type="QString" key="Qt4ProjectManager.Qt4BuildConfiguration.BuildDirectory">/opt/DEV_PLE/FSW-qt</value>
117 117 <value type="bool" key="Qt4ProjectManager.Qt4BuildConfiguration.UseShadowBuild">false</value>
118 118 </valuemap>
119 119 <valuemap type="QVariantMap" key="ProjectExplorer.Target.BuildConfiguration.1">
120 120 <valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.0">
121 121 <valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
122 122 <value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
123 123 <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">qmake</value>
124 124 <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
125 125 <value type="QByteArray" key="ProjectExplorer.ProjectConfiguration.Id">QtProjectManager.QMakeBuildStep</value>
126 126 <value type="bool" key="QtProjectManager.QMakeBuildStep.LinkQmlDebuggingLibrary">false</value>
127 127 <value type="bool" key="QtProjectManager.QMakeBuildStep.LinkQmlDebuggingLibraryAuto">true</value>
128 128 <value type="QString" key="QtProjectManager.QMakeBuildStep.QMakeArguments"></value>
129 129 <value type="bool" key="QtProjectManager.QMakeBuildStep.QMakeForced">false</value>
130 130 </valuemap>
131 131 <valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.1">
132 132 <value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
133 133 <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Make</value>
134 134 <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
135 135 <value type="QByteArray" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.MakeStep</value>
136 136 <valuelist type="QVariantList" key="Qt4ProjectManager.MakeStep.AutomaticallyAddedMakeArguments">
137 137 <value type="QString">-w</value>
138 138 <value type="QString">-r</value>
139 139 </valuelist>
140 140 <value type="bool" key="Qt4ProjectManager.MakeStep.Clean">false</value>
141 141 <value type="QString" key="Qt4ProjectManager.MakeStep.MakeArguments">-r -w </value>
142 142 <value type="QString" key="Qt4ProjectManager.MakeStep.MakeCommand"></value>
143 143 </valuemap>
144 144 <value type="int" key="ProjectExplorer.BuildStepList.StepsCount">2</value>
145 145 <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Build</value>
146 146 <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
147 147 <value type="QByteArray" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Build</value>
148 148 </valuemap>
149 149 <valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.1">
150 150 <valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
151 151 <value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
152 152 <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Make</value>
153 153 <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
154 154 <value type="QByteArray" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.MakeStep</value>
155 155 <valuelist type="QVariantList" key="Qt4ProjectManager.MakeStep.AutomaticallyAddedMakeArguments">
156 156 <value type="QString">-w</value>
157 157 <value type="QString">-r</value>
158 158 </valuelist>
159 159 <value type="bool" key="Qt4ProjectManager.MakeStep.Clean">true</value>
160 160 <value type="QString" key="Qt4ProjectManager.MakeStep.MakeArguments">-r -w clean</value>
161 161 <value type="QString" key="Qt4ProjectManager.MakeStep.MakeCommand"></value>
162 162 </valuemap>
163 163 <value type="int" key="ProjectExplorer.BuildStepList.StepsCount">1</value>
164 164 <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Clean</value>
165 165 <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
166 166 <value type="QByteArray" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Clean</value>
167 167 </valuemap>
168 168 <value type="int" key="ProjectExplorer.BuildConfiguration.BuildStepListCount">2</value>
169 169 <value type="bool" key="ProjectExplorer.BuildConfiguration.ClearSystemEnvironment">false</value>
170 170 <valuelist type="QVariantList" key="ProjectExplorer.BuildConfiguration.UserEnvironmentChanges"/>
171 171 <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Qt 4.8.2 in PATH (System) Debug</value>
172 172 <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
173 173 <value type="QByteArray" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.Qt4BuildConfiguration</value>
174 174 <value type="int" key="Qt4ProjectManager.Qt4BuildConfiguration.BuildConfiguration">2</value>
175 175 <value type="QString" key="Qt4ProjectManager.Qt4BuildConfiguration.BuildDirectory">/opt/DEV_PLE/FSW-qt</value>
176 176 <value type="bool" key="Qt4ProjectManager.Qt4BuildConfiguration.UseShadowBuild">false</value>
177 177 </valuemap>
178 178 <value type="int" key="ProjectExplorer.Target.BuildConfigurationCount">2</value>
179 179 <valuemap type="QVariantMap" key="ProjectExplorer.Target.DeployConfiguration.0">
180 180 <valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.0">
181 181 <value type="int" key="ProjectExplorer.BuildStepList.StepsCount">0</value>
182 182 <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Deploy</value>
183 183 <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
184 184 <value type="QByteArray" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Deploy</value>
185 185 </valuemap>
186 186 <value type="int" key="ProjectExplorer.BuildConfiguration.BuildStepListCount">1</value>
187 187 <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">No deployment</value>
188 188 <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
189 189 <value type="QByteArray" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.DefaultDeployConfiguration</value>
190 190 </valuemap>
191 191 <value type="int" key="ProjectExplorer.Target.DeployConfigurationCount">1</value>
192 192 <valuemap type="QVariantMap" key="ProjectExplorer.Target.RunConfiguration.0">
193 193 <value type="bool" key="Analyzer.Project.UseGlobal">true</value>
194 194 <valuelist type="QVariantList" key="Analyzer.Valgrind.AddedSuppressionFiles"/>
195 195 <value type="bool" key="Analyzer.Valgrind.Callgrind.CollectBusEvents">false</value>
196 196 <value type="bool" key="Analyzer.Valgrind.Callgrind.CollectSystime">false</value>
197 197 <value type="bool" key="Analyzer.Valgrind.Callgrind.EnableBranchSim">false</value>
198 198 <value type="bool" key="Analyzer.Valgrind.Callgrind.EnableCacheSim">false</value>
199 199 <value type="bool" key="Analyzer.Valgrind.Callgrind.EnableEventToolTips">true</value>
200 200 <value type="double" key="Analyzer.Valgrind.Callgrind.MinimumCostRatio">0.01</value>
201 201 <value type="double" key="Analyzer.Valgrind.Callgrind.VisualisationMinimumCostRatio">10</value>
202 202 <value type="bool" key="Analyzer.Valgrind.FilterExternalIssues">true</value>
203 203 <value type="int" key="Analyzer.Valgrind.NumCallers">25</value>
204 204 <valuelist type="QVariantList" key="Analyzer.Valgrind.RemovedSuppressionFiles"/>
205 205 <value type="bool" key="Analyzer.Valgrind.TrackOrigins">true</value>
206 206 <value type="QString" key="Analyzer.Valgrind.ValgrindExecutable">valgrind</value>
207 207 <valuelist type="QVariantList" key="Analyzer.Valgrind.VisibleErrorKinds">
208 208 <value type="int">0</value>
209 209 <value type="int">1</value>
210 210 <value type="int">2</value>
211 211 <value type="int">3</value>
212 212 <value type="int">4</value>
213 213 <value type="int">5</value>
214 214 <value type="int">6</value>
215 215 <value type="int">7</value>
216 216 <value type="int">8</value>
217 217 <value type="int">9</value>
218 218 <value type="int">10</value>
219 219 <value type="int">11</value>
220 220 <value type="int">12</value>
221 221 <value type="int">13</value>
222 222 <value type="int">14</value>
223 223 </valuelist>
224 224 <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">fsw-qt</value>
225 225 <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
226 226 <value type="QByteArray" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.Qt4RunConfiguration:/opt/DEV_PLE/FSW-qt/fsw-qt.pro</value>
227 227 <value type="int" key="Qt4ProjectManager.Qt4RunConfiguration.BaseEnvironmentBase">2</value>
228 228 <value type="QString" key="Qt4ProjectManager.Qt4RunConfiguration.CommandLineArguments"></value>
229 229 <value type="QString" key="Qt4ProjectManager.Qt4RunConfiguration.ProFile">fsw-qt.pro</value>
230 230 <value type="bool" key="Qt4ProjectManager.Qt4RunConfiguration.UseDyldImageSuffix">false</value>
231 231 <value type="bool" key="Qt4ProjectManager.Qt4RunConfiguration.UseTerminal">true</value>
232 232 <valuelist type="QVariantList" key="Qt4ProjectManager.Qt4RunConfiguration.UserEnvironmentChanges"/>
233 233 <value type="QString" key="Qt4ProjectManager.Qt4RunConfiguration.UserWorkingDirectory"></value>
234 234 <value type="uint" key="RunConfiguration.QmlDebugServerPort">3768</value>
235 235 <value type="bool" key="RunConfiguration.UseCppDebugger">true</value>
236 236 <value type="bool" key="RunConfiguration.UseMultiProcess">false</value>
237 237 <value type="bool" key="RunConfiguration.UseQmlDebugger">false</value>
238 238 <value type="bool" key="RunConfiguration.UseQmlDebuggerAuto">false</value>
239 239 </valuemap>
240 240 <value type="int" key="ProjectExplorer.Target.RunConfigurationCount">1</value>
241 241 </valuemap>
242 242 </data>
243 243 <data>
244 244 <variable>ProjectExplorer.Project.TargetCount</variable>
245 245 <value type="int">1</value>
246 246 </data>
247 247 <data>
248 248 <variable>ProjectExplorer.Project.Updater.EnvironmentId</variable>
249 249 <value type="QString">{2e58a81f-9962-4bba-ae6b-760177f0656c}</value>
250 250 </data>
251 251 <data>
252 252 <variable>ProjectExplorer.Project.Updater.FileVersion</variable>
253 253 <value type="int">12</value>
254 254 </data>
255 255 </qtcreator>
@@ -1,590 +1,595
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 70 init_parameter_dump();
71 71 init_local_mode_parameters();
72 72 init_housekeeping_parameters();
73 73 create_message_queue();
74 74
75 75 create_names(); // create all names
76 76 create_all_tasks(); // create all tasks
77 77 start_all_tasks(); // start all tasks
78 78 stop_current_mode(); // go in STANDBY mode
79 79
80 80 grspw_timecode_callback = &timecode_irq_handler;
81 81
82 82 spacewire_configure_link();
83 83
84 84 //****************************
85 85 // Spectral Matrices simulator
86 86 configure_timer((gptimer_regs_t*) REGS_ADDR_GPTIMER, TIMER_SM_SIMULATOR, CLKDIV_SM_SIMULATOR,
87 87 IRQ_SPARC_SM, spectral_matrices_isr );
88 88
89 89 //**********
90 90 // WAVEFORMS
91 // simulator
92 91
93 92 #ifdef GSA
93 // simulator
94 PRINTF("GSA is defined *** fsw-gsa is running \n")
94 95 configure_timer((gptimer_regs_t*) REGS_ADDR_GPTIMER, TIMER_WF_SIMULATOR, CLKDIV_WF_SIMULATOR,
95 96 IRQ_SPARC_WF, waveforms_simulator_isr );
96 97 #else
97 98 // configure the registers of the waveform picker
98 99 reset_wfp_regs();
99 100 // configure the waveform picker interrupt service routine
100 101 status = rtems_interrupt_catch( waveforms_isr,
101 102 IRQ_SPARC_WAVEFORM_PICKER,
102 103 &old_isr_handler) ;
103 104 LEON_Mask_interrupt( IRQ_WAVEFORM_PICKER );
104 105 #endif
105 106
106 107 //**********
107 108
108 109 //*****************************************
109 110 // irq handling of the time management unit
110 111 status = rtems_interrupt_catch( commutation_isr1,
111 112 IRQ_SPARC_TIME1,
112 113 &old_isr_handler) ; // see sparcv8.pdf p.76 for interrupt levels
113 114 if (status==RTEMS_SUCCESSFUL) {
114 115 PRINTF("OK *** commutation_isr1 *** rtems_interrupt_catch successfullly configured\n")
115 116 }
116 117
117 118 status = rtems_interrupt_catch( commutation_isr2,
118 119 IRQ_SPARC_TIME2,
119 120 &old_isr_handler) ; // see sparcv8.pdf p.76 for interrupt levels
120 121 if (status==RTEMS_SUCCESSFUL) {
121 122 PRINTF("OK *** commutation_isr2 *** rtems_interrupt_catch successfullly configured\n")
122 123 }
123 124
124 125 LEON_Unmask_interrupt( IRQ_TIME1 );
125 126 LEON_Unmask_interrupt( IRQ_TIME2 );
126 127
127 128 #ifdef GSA
128 //if (rtems_event_send( Task_id[TASKID_WFRM], RTEMS_EVENT_0 ) != RTEMS_SUCCESSFUL) {
129 // printf("in INIT *** Error sending event to WFRM\n");
130 //}
129 if (rtems_event_send( Task_id[TASKID_WFRM], RTEMS_EVENT_MODE_NORMAL ) != RTEMS_SUCCESSFUL) {
130 PRINTF("in INIT *** Error sending event to WFRM\n")
131 }
131 132 #endif
132 133
134 LEON_Force_interrupt(IRQ_WF);
135
133 136 status = rtems_task_delete(RTEMS_SELF);
134 137
135 138 }
136 139
137 rtems_task spiq_task(rtems_task_argument unused)
138 {
139 rtems_event_set event_out;
140 rtems_status_code status;
141 unsigned char lfrMode;
142
143 while(true){
144 PRINTF("in SPIQ *** Waiting for SPW_LINKERR_EVENT\n")
145 rtems_event_receive(SPW_LINKERR_EVENT, RTEMS_WAIT, RTEMS_NO_TIMEOUT, &event_out); // wait for an SPW_LINKERR_EVENT
146
147 lfrMode = (housekeeping_packet.lfr_status_word[0] & 0xf0) >> 4; // get the current mode
148
149 status = spacewire_wait_for_link();
150
151 if (status != RTEMS_SUCCESSFUL)
152 {
153 //****************
154 // STOP THE SYSTEM
155 spacewire_compute_stats_offsets();
156 stop_current_mode();
157 if (rtems_task_suspend(Task_id[TASKID_RECV])!=RTEMS_SUCCESSFUL) { // suspend RECV task
158 PRINTF("in SPIQ *** Error suspending RECV Task\n")
159 }
160 if (rtems_task_suspend(Task_id[TASKID_HOUS])!=RTEMS_SUCCESSFUL) { // suspend HOUS task
161 PRINTF("in SPIQ *** Error suspending HOUS Task\n")
162 }
163
164 //***************************
165 // RESTART THE SPACEWIRE LINK
166 spacewire_configure_link();
167
168 //*******************
169 // RESTART THE SYSTEM
170 //ioctl(fdSPW, SPACEWIRE_IOCTRL_CLR_STATISTICS); // clear statistics
171 status = rtems_task_restart( Task_id[TASKID_HOUS], 1 );
172 if (status != RTEMS_SUCCESSFUL) {
173 PRINTF1("in SPIQ *** Error restarting HOUS Task *** code %d\n", status)
174 }
175 if (rtems_task_restart(Task_id[TASKID_RECV], 1) != RTEMS_SUCCESSFUL) { // restart RECV task
176 PRINTF("in SPIQ *** Error restarting RECV Task\n")
177 }
178 //enter_mode(lfrMode, NULL); // enter the mode that was running before the SpaceWire interruption
179 }
180 }
181 }
182
183 140 void init_parameter_dump(void)
184 141 {
185 142 parameter_dump_packet.targetLogicalAddress = CCSDS_DESTINATION_ID;
186 143 parameter_dump_packet.protocolIdentifier = CCSDS_PROTOCOLE_ID;
187 144 parameter_dump_packet.reserved = CCSDS_RESERVED;
188 145 parameter_dump_packet.userApplication = CCSDS_USER_APP;
189 146 parameter_dump_packet.packetID[0] = (unsigned char) (TM_PACKET_ID_PARAMETER_DUMP >> 8);
190 147 parameter_dump_packet.packetID[1] = (unsigned char) TM_PACKET_ID_PARAMETER_DUMP;
191 148 parameter_dump_packet.packetSequenceControl[0] = (unsigned char) (TM_PACKET_SEQ_CTRL_STANDALONE << 6);
192 149 parameter_dump_packet.packetSequenceControl[1] = 0x00;
193 150 parameter_dump_packet.packetLength[0] = (unsigned char) (PACKET_LENGTH_PARAMETER_DUMP >> 8);
194 151 parameter_dump_packet.packetLength[1] = (unsigned char) PACKET_LENGTH_PARAMETER_DUMP;
195 152 // DATA FIELD HEADER
196 153 parameter_dump_packet.spare1_pusVersion_spare2 = SPARE1_PUSVERSION_SPARE2;
197 154 parameter_dump_packet.serviceType = TM_TYPE_PARAMETER_DUMP;
198 155 parameter_dump_packet.serviceSubType = TM_SUBTYPE_PARAMETER_DUMP;
199 156 parameter_dump_packet.destinationID = TM_DESTINATION_ID_GROUND;
200 157 parameter_dump_packet.time[0] = (unsigned char) (time_management_regs->coarse_time>>24);
201 158 parameter_dump_packet.time[1] = (unsigned char) (time_management_regs->coarse_time>>16);
202 159 parameter_dump_packet.time[2] = (unsigned char) (time_management_regs->coarse_time>>8);
203 160 parameter_dump_packet.time[3] = (unsigned char) (time_management_regs->coarse_time);
204 161 parameter_dump_packet.time[4] = (unsigned char) (time_management_regs->fine_time>>8);
205 162 parameter_dump_packet.time[5] = (unsigned char) (time_management_regs->fine_time);
206 163 parameter_dump_packet.sid = SID_PARAMETER_DUMP;
207 164
208 165 //******************
209 166 // COMMON PARAMETERS
210 167 parameter_dump_packet.unused0 = DEFAULT_SY_LFR_COMMON0;
211 168 parameter_dump_packet.bw_sp0_sp1_r0_r1 = DEFAULT_SY_LFR_COMMON1;
212 169
213 170 //******************
214 171 // NORMAL PARAMETERS
215 172 parameter_dump_packet.sy_lfr_n_swf_l[0] = (unsigned char) (DEFAULT_SY_LFR_N_SWF_L >> 8);
216 173 parameter_dump_packet.sy_lfr_n_swf_l[1] = (unsigned char) DEFAULT_SY_LFR_N_SWF_L;
217 174 parameter_dump_packet.sy_lfr_n_swf_p[0] = (unsigned char) (DEFAULT_SY_LFR_N_SWF_P >> 8);
218 175 parameter_dump_packet.sy_lfr_n_swf_p[1] = (unsigned char) DEFAULT_SY_LFR_N_SWF_P;
219 176 parameter_dump_packet.sy_lfr_n_asm_p[0] = (unsigned char) (DEFAULT_SY_LFR_N_ASM_P >> 8);
220 177 parameter_dump_packet.sy_lfr_n_asm_p[1] = (unsigned char) DEFAULT_SY_LFR_N_ASM_P;
221 178 parameter_dump_packet.sy_lfr_n_bp_p0 = (unsigned char) DEFAULT_SY_LFR_N_BP_P0;
222 179 parameter_dump_packet.sy_lfr_n_bp_p1 = (unsigned char) DEFAULT_SY_LFR_N_BP_P1;
223 180
224 181 //*****************
225 182 // BURST PARAMETERS
226 183 parameter_dump_packet.sy_lfr_b_bp_p0 = (unsigned char) DEFAULT_SY_LFR_B_BP_P0;
227 184 parameter_dump_packet.sy_lfr_b_bp_p1 = (unsigned char) DEFAULT_SY_LFR_B_BP_P1;
228 185
229 186 //****************
230 187 // SBM1 PARAMETERS
231 188 parameter_dump_packet.sy_lfr_s1_bp_p0 = (unsigned char) DEFAULT_SY_LFR_S1_BP_P0;
232 189 parameter_dump_packet.sy_lfr_s1_bp_p1 = (unsigned char) DEFAULT_SY_LFR_S1_BP_P0;
233 190
234 191 //****************
235 192 // SBM2 PARAMETERS
236 193 parameter_dump_packet.sy_lfr_s2_bp_p0 = (unsigned char) DEFAULT_SY_LFR_S2_BP_P0;
237 194 parameter_dump_packet.sy_lfr_s2_bp_p1 = (unsigned char) DEFAULT_SY_LFR_S2_BP_P0;
238 195 }
239 196
240 197 void init_local_mode_parameters(void)
241 198 {
242 199 // LOCAL PARAMETERS
243 200 // (2 snapshots of 2048 points per seconds) * (period of the NORM snashots)
244 201 param_local.local_sbm1_nb_cwf_max = 2 * (
245 202 parameter_dump_packet.sy_lfr_n_swf_p[0] * 256
246 203 + parameter_dump_packet.sy_lfr_n_swf_p[1]
247 204 );
248 205 // (period of the NORM snashots) / (8 seconds per snapshot at f2 = 256 Hz)
249 206 param_local.local_sbm2_nb_cwf_max = (
250 207 parameter_dump_packet.sy_lfr_n_swf_p[0] * 256
251 208 + parameter_dump_packet.sy_lfr_n_swf_p[1]
252 209 )/ 8;
253 210
254 211 PRINTF1("local_sbm1_nb_cwf_max %d \n", param_local.local_sbm1_nb_cwf_max)
255 212 PRINTF1("local_sbm2_nb_cwf_max %d \n", param_local.local_sbm2_nb_cwf_max)
256 213
257 214 param_local.local_sbm1_nb_cwf_sent = 0;
258 215 param_local.local_sbm2_nb_cwf_sent = 0;
259 216 }
260 217
261 218 void init_housekeeping_parameters(void)
262 219 {
263 220 unsigned int i = 0;
264 221 unsigned int j = 0;
265 222 unsigned int k = 0;
266 223 char *parameters;
267 224
268 225 parameters = (char*) &housekeeping_packet.lfr_status_word;
269 226 for(i = 0; i< SIZE_HK_PARAMETERS; i++)
270 227 {
271 228 parameters[i] = 0x00;
272 229 }
273 230 // init status word
274 231 housekeeping_packet.lfr_status_word[0] = 0x00;
275 232 housekeeping_packet.lfr_status_word[1] = 0x00;
276 233 // init software version
277 234 housekeeping_packet.lfr_sw_version[0] = SW_VERSION_N1;
278 235 housekeeping_packet.lfr_sw_version[1] = SW_VERSION_N2;
279 236 housekeeping_packet.lfr_sw_version[2] = SW_VERSION_N3;
280 237 housekeeping_packet.lfr_sw_version[3] = SW_VERSION_N4;
281 238 // init sequence counters
282 239 for (i = 0; i<SEQ_CNT_NB_PID; i++)
283 240 {
284 241 for(j = 0; j<SEQ_CNT_NB_CAT; j++)
285 242 {
286 243 for(k = 0; k<SEQ_CNT_NB_DEST_ID; k++)
287 244 {
288 245 sequenceCounters[i][j][k] = 0x00;
289 246 }
290 247 }
291 248 }
292 249 }
293 250
294 251 int create_names( void )
295 252 {
296 253 // task names
297 254 Task_name[TASKID_RECV] = rtems_build_name( 'R', 'E', 'C', 'V' );
298 255 Task_name[TASKID_ACTN] = rtems_build_name( 'A', 'C', 'T', 'N' );
299 256 Task_name[TASKID_SPIQ] = rtems_build_name( 'S', 'P', 'I', 'Q' );
300 257 Task_name[TASKID_SMIQ] = rtems_build_name( 'S', 'M', 'I', 'Q' );
301 258 Task_name[TASKID_STAT] = rtems_build_name( 'S', 'T', 'A', 'T' );
302 259 Task_name[TASKID_AVF0] = rtems_build_name( 'A', 'V', 'F', '0' );
303 260 Task_name[TASKID_BPF0] = rtems_build_name( 'B', 'P', 'F', '0' );
304 261 Task_name[TASKID_WFRM] = rtems_build_name( 'W', 'F', 'R', 'M' );
305 262 Task_name[TASKID_DUMB] = rtems_build_name( 'D', 'U', 'M', 'B' );
306 263 Task_name[TASKID_HOUS] = rtems_build_name( 'H', 'O', 'U', 'S' );
307 264
308 265 // rate monotonic period name
309 266 HK_name = rtems_build_name( 'H', 'O', 'U', 'S' );
310 267
311 268 return 0;
312 269 }
313 270
314 271 int create_all_tasks( void )
315 272 {
316 273 rtems_status_code status;
317 274
318 275 // RECV
319 276 status = rtems_task_create(
320 277 Task_name[TASKID_RECV], 200, RTEMS_MINIMUM_STACK_SIZE * 2,
321 278 RTEMS_DEFAULT_MODES,
322 279 RTEMS_DEFAULT_ATTRIBUTES, &Task_id[TASKID_RECV]
323 280 );
324 281 // ACTN
325 282 status = rtems_task_create(
326 283 Task_name[TASKID_ACTN], 100, RTEMS_MINIMUM_STACK_SIZE * 2,
327 284 RTEMS_DEFAULT_MODES,
328 285 RTEMS_DEFAULT_ATTRIBUTES, &Task_id[TASKID_ACTN]
329 286 );
330 287 // SPIQ
331 288 status = rtems_task_create(
332 289 Task_name[TASKID_SPIQ], 5, RTEMS_MINIMUM_STACK_SIZE * 2,
333 290 RTEMS_DEFAULT_MODES | RTEMS_NO_PREEMPT,
334 291 RTEMS_DEFAULT_ATTRIBUTES, &Task_id[TASKID_SPIQ]
335 292 );
336 293 // SMIQ
337 294 status = rtems_task_create(
338 295 Task_name[TASKID_SMIQ], 10, RTEMS_MINIMUM_STACK_SIZE * 2,
339 296 RTEMS_DEFAULT_MODES | RTEMS_NO_PREEMPT,
340 297 RTEMS_DEFAULT_ATTRIBUTES, &Task_id[TASKID_SMIQ]
341 298 );
342 299 // STAT
343 300 status = rtems_task_create(
344 301 Task_name[TASKID_STAT], 150, RTEMS_MINIMUM_STACK_SIZE * 2,
345 302 RTEMS_DEFAULT_MODES,
346 303 RTEMS_DEFAULT_ATTRIBUTES, &Task_id[TASKID_STAT]
347 304 );
348 305 // AVF0
349 306 status = rtems_task_create(
350 307 Task_name[TASKID_AVF0], 50, RTEMS_MINIMUM_STACK_SIZE * 2,
351 308 RTEMS_DEFAULT_MODES | RTEMS_NO_PREEMPT,
352 309 RTEMS_DEFAULT_ATTRIBUTES | RTEMS_FLOATING_POINT, &Task_id[TASKID_AVF0]
353 310 );
354 311 // BPF0
355 312 status = rtems_task_create(
356 313 Task_name[TASKID_BPF0], 50, RTEMS_MINIMUM_STACK_SIZE * 2,
357 314 RTEMS_DEFAULT_MODES,
358 315 RTEMS_DEFAULT_ATTRIBUTES | RTEMS_FLOATING_POINT, &Task_id[TASKID_BPF0]
359 316 );
360 317 // WFRM
361 318 status = rtems_task_create(
362 319 Task_name[TASKID_WFRM], 50, RTEMS_MINIMUM_STACK_SIZE * 2,
363 320 RTEMS_DEFAULT_MODES,
364 321 RTEMS_DEFAULT_ATTRIBUTES | RTEMS_FLOATING_POINT, &Task_id[TASKID_WFRM]
365 322 );
366 323 // DUMB
367 324 status = rtems_task_create(
368 325 Task_name[TASKID_DUMB], 200, RTEMS_MINIMUM_STACK_SIZE * 2,
369 326 RTEMS_DEFAULT_MODES,
370 327 RTEMS_DEFAULT_ATTRIBUTES, &Task_id[TASKID_DUMB]
371 328 );
372 329 // HOUS
373 330 status = rtems_task_create(
374 331 Task_name[TASKID_HOUS], 199, RTEMS_MINIMUM_STACK_SIZE * 2,
375 332 RTEMS_DEFAULT_MODES,
376 333 RTEMS_DEFAULT_ATTRIBUTES, &Task_id[TASKID_HOUS]
377 334 );
378 335
379 336 return 0;
380 337 }
381 338
382 339 int start_all_tasks( void )
383 340 {
384 341 rtems_status_code status;
385 342
386 343 status = rtems_task_start( Task_id[TASKID_SPIQ], spiq_task, 1 );
387 344 if (status!=RTEMS_SUCCESSFUL) {
388 345 PRINTF("In INIT *** Error starting TASK_SPIQ\n")
389 346 }
390 347
391 348 status = rtems_task_start( Task_id[TASKID_RECV], recv_task, 1 );
392 349 if (status!=RTEMS_SUCCESSFUL) {
393 350 PRINTF("In INIT *** Error starting TASK_RECV\n")
394 351 }
395 352
396 353 status = rtems_task_start( Task_id[TASKID_ACTN], actn_task, 1 );
397 354 if (status!=RTEMS_SUCCESSFUL) {
398 355 PRINTF("In INIT *** Error starting TASK_ACTN\n")
399 356 }
400 357
401 358 status = rtems_task_start( Task_id[TASKID_SMIQ], smiq_task, 1 );
402 359 if (status!=RTEMS_SUCCESSFUL) {
403 360 PRINTF("In INIT *** Error starting TASK_BPPR\n")
404 361 }
405 362
406 363 status = rtems_task_start( Task_id[TASKID_STAT], stat_task, 1 );
407 364 if (status!=RTEMS_SUCCESSFUL) {
408 365 PRINTF("In INIT *** Error starting TASK_STAT\n")
409 366 }
410 367
411 368 status = rtems_task_start( Task_id[TASKID_AVF0], avf0_task, 1 );
412 369 if (status!=RTEMS_SUCCESSFUL) {
413 370 PRINTF("In INIT *** Error starting TASK_AVF0\n")
414 371 }
415 372
416 373 status = rtems_task_start( Task_id[TASKID_BPF0], bpf0_task, 1 );
417 374 if (status!=RTEMS_SUCCESSFUL) {
418 375 PRINTF("In INIT *** Error starting TASK_BPF0\n")
419 376 }
420 377
421 378 status = rtems_task_start( Task_id[TASKID_WFRM], wfrm_task, 1 );
422 379 if (status!=RTEMS_SUCCESSFUL) {
423 380 PRINTF("In INIT *** Error starting TASK_WFRM\n")
424 381 }
425 382
426 383 status = rtems_task_start( Task_id[TASKID_DUMB], dumb_task, 1 );
427 384 if (status!=RTEMS_SUCCESSFUL) {
428 385 PRINTF("In INIT *** Error starting TASK_DUMB\n")
429 386 }
430 387
431 388 status = rtems_task_start( Task_id[TASKID_HOUS], hous_task, 1 );
432 389 if (status!=RTEMS_SUCCESSFUL) {
433 390 PRINTF("In INIT *** Error starting TASK_HOUS\n")
434 391 }
435 392
436 393 return 0;
437 394 }
438 395
396 // SPACEWIRE
397
398 rtems_task spiq_task(rtems_task_argument unused)
399 {
400 rtems_event_set event_out;
401 rtems_status_code status;
402 unsigned char lfrMode;
403
404 while(true){
405 PRINTF("in SPIQ *** Waiting for SPW_LINKERR_EVENT\n")
406 rtems_event_receive(SPW_LINKERR_EVENT, RTEMS_WAIT, RTEMS_NO_TIMEOUT, &event_out); // wait for an SPW_LINKERR_EVENT
407
408 lfrMode = (housekeeping_packet.lfr_status_word[0] & 0xf0) >> 4; // get the current mode
409
410 status = spacewire_wait_for_link();
411
412 if (status != RTEMS_SUCCESSFUL)
413 {
414 //****************
415 // STOP THE SYSTEM
416 spacewire_compute_stats_offsets();
417 stop_current_mode();
418 if (rtems_task_suspend(Task_id[TASKID_RECV])!=RTEMS_SUCCESSFUL) { // suspend RECV task
419 PRINTF("in SPIQ *** Error suspending RECV Task\n")
420 }
421 if (rtems_task_suspend(Task_id[TASKID_HOUS])!=RTEMS_SUCCESSFUL) { // suspend HOUS task
422 PRINTF("in SPIQ *** Error suspending HOUS Task\n")
423 }
424
425 //***************************
426 // RESTART THE SPACEWIRE LINK
427 spacewire_configure_link();
428
429 //*******************
430 // RESTART THE SYSTEM
431 //ioctl(fdSPW, SPACEWIRE_IOCTRL_CLR_STATISTICS); // clear statistics
432 status = rtems_task_restart( Task_id[TASKID_HOUS], 1 );
433 if (status != RTEMS_SUCCESSFUL) {
434 PRINTF1("in SPIQ *** Error restarting HOUS Task *** code %d\n", status)
435 }
436 if (rtems_task_restart(Task_id[TASKID_RECV], 1) != RTEMS_SUCCESSFUL) { // restart RECV task
437 PRINTF("in SPIQ *** Error restarting RECV Task\n")
438 }
439 //enter_mode(lfrMode, NULL); // enter the mode that was running before the SpaceWire interruption
440 }
441 }
442 }
443
439 444 int spacewire_configure_link( void )
440 445 {
441 446 rtems_status_code status;
442 447
443 448 close(fdSPW); // close the device if it is already open
444 449 PRINTF("OK *** in configure_spw_link *** try to open "GRSPW_DEVICE_NAME"\n")
445 450 fdSPW = open(GRSPW_DEVICE_NAME, O_RDWR); // open the device. the open call reset the hardware
446 451 if ( fdSPW<0 ) {
447 452 PRINTF("ERR *** in configure_spw_link *** Error opening"GRSPW_DEVICE_NAME"\n")
448 453 }
449 454
450 455 while(ioctl(fdSPW, SPACEWIRE_IOCTRL_START, -1) != RTEMS_SUCCESSFUL){
451 456 PRINTF(".")
452 457 fflush( stdout );
453 458 close( fdSPW ); // close the device
454 459 fdSPW = open( GRSPW_DEVICE_NAME, O_RDWR ); // open the device. the open call reset the hardware
455 460 if (fdSPW<0) {
456 461 PRINTF("ERR *** In configure_spw_link *** Error opening"GRSPW_DEVICE_NAME"\n")
457 462 }
458 463 rtems_task_wake_after(100);
459 464 }
460 465
461 466 PRINTF("OK *** In configure_spw_link *** "GRSPW_DEVICE_NAME" opened and started successfully\n")
462 467
463 468 spacewire_set_NP(1, REGS_ADDR_GRSPW); // No Port force
464 469 spacewire_set_RE(1, REGS_ADDR_GRSPW); // the dedicated call seems to break the no port force configuration
465 470
466 471 status = ioctl(fdSPW, SPACEWIRE_IOCTRL_SET_RXBLOCK, 1); // sets the blocking mode for reception
467 472 if (status!=RTEMS_SUCCESSFUL) PRINTF("in SPIQ *** Error SPACEWIRE_IOCTRL_SET_RXBLOCK\n")
468 473 //
469 //status = ioctl(fdSPW, SPACEWIRE_IOCTRL_SET_EVENT_ID, Task_id[TASKID_SPIQ]); // sets the task ID to which an event is sent when a
470 //if (status!=RTEMS_SUCCESSFUL) PRINTF("in SPIQ *** Error SPACEWIRE_IOCTRL_SET_EVENT_ID\n") // link-error interrupt occurs
474 status = ioctl(fdSPW, SPACEWIRE_IOCTRL_SET_EVENT_ID, Task_id[TASKID_SPIQ]); // sets the task ID to which an event is sent when a
475 if (status!=RTEMS_SUCCESSFUL) PRINTF("in SPIQ *** Error SPACEWIRE_IOCTRL_SET_EVENT_ID\n") // link-error interrupt occurs
471 476 //
472 477 status = ioctl(fdSPW, SPACEWIRE_IOCTRL_SET_DISABLE_ERR, 0); // automatic link-disabling due to link-error interrupts
473 478 if (status!=RTEMS_SUCCESSFUL) PRINTF("in SPIQ *** Error SPACEWIRE_IOCTRL_SET_DISABLE_ERR\n")
474 479 //
475 status = ioctl(fdSPW, SPACEWIRE_IOCTRL_SET_LINK_ERR_IRQ, 0); // sets the link-error interrupt bit
480 status = ioctl(fdSPW, SPACEWIRE_IOCTRL_SET_LINK_ERR_IRQ, 1); // sets the link-error interrupt bit
476 481 if (status!=RTEMS_SUCCESSFUL) PRINTF("in SPIQ *** Error SPACEWIRE_IOCTRL_SET_LINK_ERR_IRQ\n")
477 482 //
478 483 status = ioctl(fdSPW, SPACEWIRE_IOCTRL_SET_TXBLOCK, 0); // transmission blocks
479 484 if (status!=RTEMS_SUCCESSFUL) PRINTF("in SPIQ *** Error SPACEWIRE_IOCTRL_SET_TXBLOCK\n")
480 485 //
481 486 status = ioctl(fdSPW, SPACEWIRE_IOCTRL_SET_TXBLOCK_ON_FULL, 0); // transmission blocks on full
482 487 if (status!=RTEMS_SUCCESSFUL) PRINTF("in SPIQ *** Error SPACEWIRE_IOCTRL_SET_TXBLOCK_ON_FULL\n")
483 488 //
484 489 status = ioctl(fdSPW, SPACEWIRE_IOCTRL_SET_TCODE_CTRL, 0x0909);
485 490 if (status!=RTEMS_SUCCESSFUL) PRINTF("in SPIQ *** Error SPACEWIRE_IOCTRL_SET_TCODE_CTRL,\n")
486 491
487 492 PRINTF("OK *** in configure_spw_link *** "GRSPW_DEVICE_NAME" configured successfully\n")
488 493
489 494 return RTEMS_SUCCESSFUL;
490 495 }
491 496
492 497 int spacewire_wait_for_link(void)
493 498 {
494 499 unsigned int i;
495 500 int linkStatus;
496 501 rtems_status_code status = RTEMS_UNSATISFIED;
497 502
498 503 for(i = 0; i< 10; i++){
499 504 PRINTF(".")
500 505 fflush( stdout );
501 506 ioctl(fdSPW, SPACEWIRE_IOCTRL_GET_LINK_STATUS, &linkStatus); // get the link status
502 507 PRINTF1("in spacewire_wait_for_link *** link status is: %s\n", lstates[linkStatus])
503 508 if ( linkStatus == 5) {
504 509 PRINTF("in spacewire_wait_for_link *** link is running\n")
505 510 status = RTEMS_SUCCESSFUL;
506 511 break;
507 512 }
508 513 rtems_task_wake_after(100);
509 514 }
510 515
511 516 return status;
512 517 }
513 518
514 519 void spacewire_set_NP(unsigned char val, unsigned int regAddr) // [N]o [P]ort force
515 520 {
516 521 unsigned int *spwptr = (unsigned int*) regAddr;
517 522
518 523 if (val == 1) {
519 524 *spwptr = *spwptr | 0x00100000; // [NP] set the No port force bit
520 525 }
521 526 if (val== 0) {
522 527 *spwptr = *spwptr & 0xffdfffff;
523 528 }
524 529 }
525 530
526 531 void spacewire_set_RE(unsigned char val, unsigned int regAddr) // [R]MAP [E]nable
527 532 {
528 533 unsigned int *spwptr = (unsigned int*) regAddr;
529 534
530 535 if (val == 1)
531 536 {
532 537 *spwptr = *spwptr | 0x00010000; // [RE] set the RMAP Enable bit
533 538 }
534 539 if (val== 0)
535 540 {
536 541 *spwptr = *spwptr & 0xfffdffff;
537 542 }
538 543 }
539 544
540 545 void spacewire_compute_stats_offsets()
541 546 {
542 547 spw_stats spacewire_stats_grspw;
543 548 rtems_status_code status;
544 549
545 550 status = ioctl( fdSPW, SPACEWIRE_IOCTRL_GET_STATISTICS, &spacewire_stats_grspw );
546 551
547 552 spacewire_stats_backup.packets_received = spacewire_stats_grspw.packets_received
548 553 + spacewire_stats.packets_received;
549 554 spacewire_stats_backup.packets_sent = spacewire_stats_grspw.packets_sent
550 555 + spacewire_stats.packets_sent;
551 556 spacewire_stats_backup.parity_err = spacewire_stats_grspw.parity_err
552 557 + spacewire_stats.parity_err;
553 558 spacewire_stats_backup.disconnect_err = spacewire_stats_grspw.disconnect_err
554 559 + spacewire_stats.disconnect_err;
555 560 spacewire_stats_backup.escape_err = spacewire_stats_grspw.escape_err
556 561 + spacewire_stats.escape_err;
557 562 spacewire_stats_backup.credit_err = spacewire_stats_grspw.credit_err
558 563 + spacewire_stats.credit_err;
559 564 spacewire_stats_backup.write_sync_err = spacewire_stats_grspw.write_sync_err
560 565 + spacewire_stats.write_sync_err;
561 566 spacewire_stats_backup.rx_rmap_header_crc_err = spacewire_stats_grspw.rx_rmap_header_crc_err
562 567 + spacewire_stats.rx_rmap_header_crc_err;
563 568 spacewire_stats_backup.rx_rmap_data_crc_err = spacewire_stats_grspw.rx_rmap_data_crc_err
564 569 + spacewire_stats.rx_rmap_data_crc_err;
565 570 spacewire_stats_backup.early_ep = spacewire_stats_grspw.early_ep
566 571 + spacewire_stats.early_ep;
567 572 spacewire_stats_backup.invalid_address = spacewire_stats_grspw.invalid_address
568 573 + spacewire_stats.invalid_address;
569 574 spacewire_stats_backup.rx_eep_err = spacewire_stats_grspw.rx_eep_err
570 575 + spacewire_stats.rx_eep_err;
571 576 spacewire_stats_backup.rx_truncated = spacewire_stats_grspw.rx_truncated
572 577 + spacewire_stats.rx_truncated;
573 578 }
574 579
575 580 rtems_status_code write_spw(spw_ioctl_pkt_send* spw_ioctl_send)
576 581 {
577 582 rtems_status_code status;
578 583 status = ioctl( fdSPW, SPACEWIRE_IOCTRL_SEND, spw_ioctl_send );
579 584 if (status != RTEMS_SUCCESSFUL){
580 585 //PRINTF1("ERR *** in write_spw *** write operation failed with code: %d\n", status)
581 586 }
582 587 return status;
583 588 }
584 589
585 590 void timecode_irq_handler(void *pDev, void *regs, int minor, unsigned int tc)
586 591 {
587 592 if (rtems_event_send( Task_id[TASKID_DUMB], RTEMS_EVENT_1 ) != RTEMS_SUCCESSFUL) {
588 593 printf("In timecode_irq_handler *** Error sending event to DUMB\n");
589 594 }
590 595 }
@@ -1,1281 +1,1280
1 1 #include <tc_handler.h>
2 2 #include <fsw_params.h>
3 3
4 char *DumbMessages[5] = {"in DUMB *** default", // RTEMS_EVENT_0
4 char *DumbMessages[6] = {"in DUMB *** default", // RTEMS_EVENT_0
5 5 "in DUMB *** timecode_irq_handler", // RTEMS_EVENT_1
6 6 "in DUMB *** waveforms_isr", // RTEMS_EVENT_2
7 7 "in DUMB *** in SMIQ *** Error sending event to AVF0", // RTEMS_EVENT_3
8 "in DUMB *** spectral_matrices_isr *** Error sending event to SMIQ" // RTEMS_EVENT_4
8 "in DUMB *** spectral_matrices_isr *** Error sending event to SMIQ", // RTEMS_EVENT_4
9 "in DUMB *** waveforms_simulator_isr" // RTEMS_EVENT_5
9 10 };
10 11
11 12 unsigned char currentTC_LEN_RCV[2]; // SHALL be equal to the current TC packet estimated packet length field
12 13 unsigned char currentTC_COMPUTED_CRC[2];
13 14 unsigned int currentTC_LEN_RCV_AsUnsignedInt;
14 15 unsigned int currentTM_length;
15 16 unsigned char currentTC_processedFlag;
16 17
17 18 unsigned int lookUpTableForCRC[256];
18 19
19 20 //**********************
20 21 // GENERAL USE FUNCTIONS
21 22 unsigned int Crc_opt( unsigned char D, unsigned int Chk)
22 23 {
23 24 return(((Chk << 8) & 0xff00)^lookUpTableForCRC [(((Chk >> 8)^D) & 0x00ff)]);
24 25 }
25 26
26 27 void initLookUpTableForCRC( void )
27 28 {
28 29 unsigned int i;
29 30 unsigned int tmp;
30 31
31 32 for (i=0; i<256; i++)
32 33 {
33 34 tmp = 0;
34 35 if((i & 1) != 0) {
35 36 tmp = tmp ^ 0x1021;
36 37 }
37 38 if((i & 2) != 0) {
38 39 tmp = tmp ^ 0x2042;
39 40 }
40 41 if((i & 4) != 0) {
41 42 tmp = tmp ^ 0x4084;
42 43 }
43 44 if((i & 8) != 0) {
44 45 tmp = tmp ^ 0x8108;
45 46 }
46 47 if((i & 16) != 0) {
47 48 tmp = tmp ^ 0x1231;
48 49 }
49 50 if((i & 32) != 0) {
50 51 tmp = tmp ^ 0x2462;
51 52 }
52 53 if((i & 64) != 0) {
53 54 tmp = tmp ^ 0x48c4;
54 55 }
55 56 if((i & 128) != 0) {
56 57 tmp = tmp ^ 0x9188;
57 58 }
58 59 lookUpTableForCRC[i] = tmp;
59 60 }
60 61 }
61 62
62 63 void GetCRCAsTwoBytes(unsigned char* data, unsigned char* crcAsTwoBytes, unsigned int sizeOfData)
63 64 {
64 65 unsigned int Chk;
65 66 int j;
66 67 Chk = 0xffff; // reset the syndrom to all ones
67 68 for (j=0; j<sizeOfData; j++) {
68 69 Chk = Crc_opt(data[j], Chk);
69 70 }
70 71 crcAsTwoBytes[0] = (unsigned char) (Chk >> 8);
71 72 crcAsTwoBytes[1] = (unsigned char) (Chk & 0x00ff);
72 73 }
73 74
74 75 //*********************
75 76 // ACCEPTANCE FUNCTIONS
76 77 int TC_acceptance(ccsdsTelecommandPacket_t *TC, unsigned int tc_len_recv)
77 78 {
78 79 int ret = 0;
79 80 rtems_status_code status;
80 81 spw_ioctl_pkt_send spw_ioctl_send;
81 82 TMHeader_t TM_header;
82 83 unsigned int code = 0;
83 84 unsigned char computed_CRC[2];
84 85 char data[ PACKET_LENGTH_TC_EXE_CORRUPTED + CCSDS_TC_TM_PACKET_OFFSET - TM_HEADER_LEN ];
85 86
86 87 GetCRCAsTwoBytes( (unsigned char*) TC->packetID, computed_CRC, tc_len_recv + 5 );
87 88 code = TC_parser( TC, tc_len_recv ) ;
88 89 if ( (code == ILLEGAL_APID) | (code == WRONG_LEN_PACKET) | (code == INCOR_CHECKSUM)
89 90 | (code == ILL_TYPE) | (code == ILL_SUBTYPE) | (code == WRONG_APP_DATA) )
90 91 { // generate TM_LFR_TC_EXE_CORRUPTED
91 92 // BUILD HEADER
92 93 TM_build_header( TM_LFR_TC_EXE_ERR, PACKET_LENGTH_TC_EXE_CORRUPTED,
93 94 &TM_header, TC->sourceID); // TC source ID
94 95 // BUILD DATA
95 96 TM_build_data( TC, data, SID_EXE_CORR, computed_CRC);
96 97 // PREPARE TM SENDING
97 98 spw_ioctl_send.hlen = TM_HEADER_LEN + 4; // + 4 is for the protocole extra header
98 99 spw_ioctl_send.hdr = (char*) &TM_header;
99 100 spw_ioctl_send.dlen = 16;
100 101 spw_ioctl_send.data = data;
101 102 // SEND PACKET
102 103 status = ioctl( fdSPW, SPACEWIRE_IOCTRL_SEND, &spw_ioctl_send );
103 104 }
104 105 else { // send valid TC to the action launcher
105 106 status = rtems_message_queue_send( misc_id[0], TC, tc_len_recv + CCSDS_TC_TM_PACKET_OFFSET + 3);
106 107 ret = -1;
107 108 }
108 109 return ret;
109 110 }
110 111
111 112 unsigned char TC_parser(ccsdsTelecommandPacket_t * TMPacket, unsigned int TC_LEN_RCV)
112 113 {
113 114 unsigned char ret = 0;
114 115 unsigned char pid = 0;
115 116 unsigned char category = 0;
116 117 unsigned int length = 0;
117 118 unsigned char packetType = 0;
118 119 unsigned char packetSubtype = 0;
119 120 unsigned char * CCSDSContent = NULL;
120 121
121 122 // APID check *** APID on 2 bytes
122 123 pid = ((TMPacket->packetID[0] & 0x07)<<4) + ( (TMPacket->packetID[1]>>4) & 0x0f ); // PID = 11 *** 7 bits xxxxx210 7654xxxx
123 124 category = (TMPacket->packetID[1] & 0x0f); // PACKET_CATEGORY = 12 *** 4 bits xxxxxxxx xxxx3210
124 125 length = (TMPacket->packetLength[0] * 256) + TMPacket->packetLength[1];
125 126 packetType = TMPacket->serviceType;
126 127 packetSubtype = TMPacket->serviceSubType;
127 128
128 129 if ( pid != CCSDS_PROCESS_ID ) {
129 130 ret = ILLEGAL_APID;
130 131 }
131 132 else if ( category != CCSDS_PACKET_CATEGORY ) {
132 133 ret = ILLEGAL_APID;
133 134 }
134 135 else if (length != TC_LEN_RCV ) { // packet length check
135 136 ret = WRONG_LEN_PACKET; // LEN RCV != SIZE FIELD
136 137 }
137 138 else if ( length >= CCSDS_TC_PKT_MAX_SIZE ) {
138 139 ret = WRONG_LEN_PACKET; // check that the packet does not exceed the MAX size
139 140 }
140 141 else if ( packetType == TC_TYPE_GEN ){ // service type, subtype and packet length check
141 142 switch(packetSubtype){ //subtype, autorized values are 3, 20, 21, 24, 27, 28, 30, 40, 50, 60, 61
142 143 case TC_SUBTYPE_RESET:
143 144 if (length!=(TC_LEN_RESET-CCSDS_TC_TM_PACKET_OFFSET)) {
144 145 ret = WRONG_LEN_PACKET;
145 146 }
146 147 else {
147 148 ret = CCSDS_TM_VALID;
148 149 }
149 150 break;
150 151 case TC_SUBTYPE_LOAD_COMM:
151 152 if (length!=(TC_LEN_LOAD_COMM-CCSDS_TC_TM_PACKET_OFFSET)) {
152 153 ret = WRONG_LEN_PACKET;
153 154 }
154 155 else {
155 156 ret = CCSDS_TM_VALID;
156 157 }
157 158 break;
158 159 case TC_SUBTYPE_LOAD_NORM:
159 160 if (length!=(TC_LEN_LOAD_NORM-CCSDS_TC_TM_PACKET_OFFSET)) {
160 161 ret = WRONG_LEN_PACKET;
161 162 }
162 163 else {
163 164 ret = CCSDS_TM_VALID;
164 165 }
165 166 break;
166 167 case TC_SUBTYPE_LOAD_BURST:
167 168 if (length!=(TC_LEN_LOAD_BURST-CCSDS_TC_TM_PACKET_OFFSET)) {
168 169 ret = WRONG_LEN_PACKET;
169 170 }
170 171 else {
171 172 ret = CCSDS_TM_VALID;
172 173 }
173 174 break;
174 175 case TC_SUBTYPE_LOAD_SBM1:
175 176 if (length!=(TC_LEN_LOAD_SBM1-CCSDS_TC_TM_PACKET_OFFSET)) {
176 177 ret = WRONG_LEN_PACKET;
177 178 }
178 179 else {
179 180 ret = CCSDS_TM_VALID;
180 181 }
181 182 break;
182 183 case TC_SUBTYPE_LOAD_SBM2:
183 184 if (length!=(TC_LEN_LOAD_SBM2-CCSDS_TC_TM_PACKET_OFFSET)) {
184 185 ret = WRONG_LEN_PACKET;
185 186 }
186 187 else {
187 188 ret = CCSDS_TM_VALID;
188 189 }
189 190 break;
190 191 case TC_SUBTYPE_DUMP:
191 192 if (length!=(TC_LEN_DUMP-CCSDS_TC_TM_PACKET_OFFSET)) {
192 193 ret = WRONG_LEN_PACKET;
193 194 }
194 195 else {
195 196 ret = CCSDS_TM_VALID;
196 197 }
197 198 break;
198 199 case TC_SUBTYPE_ENTER:
199 200 if (length!=(TC_LEN_ENTER-CCSDS_TC_TM_PACKET_OFFSET)) {
200 201 ret = WRONG_LEN_PACKET;
201 202 }
202 203 else {
203 204 ret = CCSDS_TM_VALID;
204 205 }
205 206 break;
206 207 case TC_SUBTYPE_UPDT_INFO:
207 208 if (length!=(TC_LEN_UPDT_INFO-CCSDS_TC_TM_PACKET_OFFSET)) {
208 209 ret = WRONG_LEN_PACKET;
209 210 }
210 211 else {
211 212 ret = CCSDS_TM_VALID;
212 213 }
213 214 break;
214 215 case TC_SUBTYPE_EN_CAL:
215 216 if (length!=(TC_LEN_EN_CAL-CCSDS_TC_TM_PACKET_OFFSET)) {
216 217 ret = WRONG_LEN_PACKET;
217 218 }
218 219 else {
219 220 ret = CCSDS_TM_VALID;
220 221 }
221 222 break;
222 223 case TC_SUBTYPE_DIS_CAL:
223 224 if (length!=(TC_LEN_DIS_CAL-CCSDS_TC_TM_PACKET_OFFSET)) {
224 225 ret = WRONG_LEN_PACKET;
225 226 }
226 227 else {
227 228 ret = CCSDS_TM_VALID;
228 229 }
229 230 break;
230 231 default:
231 232 ret = ILL_SUBTYPE;
232 233 break;
233 234 }
234 235 }
235 236 else if ( packetType == TC_TYPE_TIME ){
236 237 if (packetSubtype!=TC_SUBTYPE_UPDT_TIME) {
237 238 ret = ILL_SUBTYPE;
238 239 }
239 240 else if (length!=(TC_LEN_UPDT_TIME-CCSDS_TC_TM_PACKET_OFFSET)) {
240 241 ret = WRONG_LEN_PACKET;
241 242 }
242 243 else {
243 244 ret = CCSDS_TM_VALID;
244 245 }
245 246 }
246 247 else {
247 248 ret = ILL_TYPE;
248 249 }
249 250
250 251 // source ID check // Source ID not documented in the ICD
251 252
252 253 // packet error control, CRC check
253 254 if ( ret == CCSDS_TM_VALID ) {
254 255 CCSDSContent = (unsigned char*) TMPacket->packetID;
255 256 GetCRCAsTwoBytes(CCSDSContent, currentTC_COMPUTED_CRC, length + CCSDS_TC_TM_PACKET_OFFSET - 2); // 2 CRC bytes removed from the calculation of the CRC
256 257 if (currentTC_COMPUTED_CRC[0] != CCSDSContent[length + CCSDS_TC_TM_PACKET_OFFSET -2]) {
257 258 ret = INCOR_CHECKSUM;
258 259 }
259 260 else if (currentTC_COMPUTED_CRC[1] != CCSDSContent[length + CCSDS_TC_TM_PACKET_OFFSET -1]) {
260 261 ret = INCOR_CHECKSUM;
261 262 }
262 263 else {
263 264 ret = CCSDS_TM_VALID;
264 265 }
265 266 }
266 267
267 268 return ret;
268 269 }
269 270
270 271 unsigned char TM_build_header( enum TM_TYPE tm_type, unsigned int packetLength,
271 272 TMHeader_t *TMHeader, unsigned char tc_sid)
272 273 {
273 274 TMHeader->targetLogicalAddress = CCSDS_DESTINATION_ID;
274 275 TMHeader->protocolIdentifier = CCSDS_PROTOCOLE_ID;
275 276 TMHeader->reserved = 0x00;
276 277 TMHeader->userApplication = 0x00;
277 278 TMHeader->packetID[0] = 0x0c;
278 279 TMHeader->packetSequenceControl[0] = 0xc0;
279 280 TMHeader->packetSequenceControl[1] = 0x00;
280 281 TMHeader->packetLength[0] = (unsigned char) (packetLength>>8);
281 282 TMHeader->packetLength[1] = (unsigned char) packetLength;
282 283 TMHeader->spare1_pusVersion_spare2 = 0x10;
283 284 TMHeader->destinationID = CCSDS_DESTINATION_ID; // default destination id
284 285 switch (tm_type){
285 286 case(TM_LFR_TC_EXE_OK):
286 287 TMHeader->packetID[1] = (unsigned char) TM_PACKET_ID_TC_EXE;
287 288 TMHeader->serviceType = TM_TYPE_TC_EXE; // type
288 289 TMHeader->serviceSubType = TM_SUBTYPE_EXE_OK; // subtype
289 290 TMHeader->destinationID = tc_sid; // destination id
290 291 break;
291 292 case(TM_LFR_TC_EXE_ERR):
292 293 TMHeader->packetID[1] = (unsigned char) TM_PACKET_ID_TC_EXE;
293 294 TMHeader->serviceType = TM_TYPE_TC_EXE; // type
294 295 TMHeader->serviceSubType = TM_SUBTYPE_EXE_NOK; // subtype
295 296 break;
296 297 case(TM_LFR_HK):
297 298 TMHeader->packetID[1] = (unsigned char) TM_PACKET_ID_HK;
298 299 TMHeader->serviceType = TM_TYPE_HK; // type
299 300 TMHeader->serviceSubType = TM_SUBTYPE_HK; // subtype
300 301 break;
301 302 case(TM_LFR_SCI):
302 303 TMHeader->packetID[1] = (unsigned char) TM_PACKET_ID_SCIENCE_NORMAL;
303 304 TMHeader->serviceType = TM_TYPE_LFR_SCIENCE; // type
304 305 TMHeader->serviceSubType = TM_SUBTYPE_SCIENCE; // subtype
305 306 break;
306 307 case(TM_LFR_SCI_SBM):
307 308 TMHeader->packetID[1] = (unsigned char) TM_PACKET_ID_SCIENCE_BURST_SBM1_SBM2;
308 309 TMHeader->serviceType = TM_TYPE_LFR_SCIENCE; // type
309 310 TMHeader->serviceSubType = TM_SUBTYPE_SCIENCE; // subtype
310 311 break;
311 312 case(TM_LFR_PAR_DUMP):
312 313 TMHeader->packetID[1] = (unsigned char) TM_PACKET_ID_PARAMETER_DUMP;
313 314 TMHeader->serviceType = TM_TYPE_HK; // type
314 315 TMHeader->serviceSubType = TM_SUBTYPE_HK; // subtype
315 316 break;
316 317 default:
317 318 return 0;
318 319 }
319 320 TMHeader->time[0] = (unsigned char) (time_management_regs->coarse_time>>24);
320 321 TMHeader->time[1] = (unsigned char) (time_management_regs->coarse_time>>16);
321 322 TMHeader->time[2] = (unsigned char) (time_management_regs->coarse_time>>8);
322 323 TMHeader->time[3] = (unsigned char) (time_management_regs->coarse_time);
323 324 TMHeader->time[4] = (unsigned char) (time_management_regs->fine_time>>8);
324 325 TMHeader->time[5] = (unsigned char) (time_management_regs->fine_time);
325 326
326 327 return LFR_SUCCESSFUL;
327 328 }
328 329
329 330 unsigned char TM_build_data(ccsdsTelecommandPacket_t *TC, char* data, unsigned int SID, unsigned char *computed_CRC)
330 331 {
331 332 unsigned int packetLength;
332 333 packetLength = (TC->packetLength[0] * 256) + TC->packetLength[1];
333 334 switch (SID){
334 335 case (SID_NOT_EXE):
335 336 break;
336 337 case (SID_NOT_IMP):
337 338 data[0] = (unsigned char) (SID_NOT_IMP >> 8);
338 339 data[1] = (unsigned char) SID_NOT_IMP;
339 340 data[2] = TC->packetID[0];
340 341 data[3] = TC->packetID[1];
341 342 data[4] = TC->packetSequenceControl[0];
342 343 data[5] = TC->packetSequenceControl[1];
343 344 data[6] = TC->serviceType; // type
344 345 data[7] = TC->serviceSubType; // subtype
345 346 break;
346 347 case (SID_EXE_ERR):
347 348 break;
348 349 case (SID_EXE_CORR):
349 350 data[0] = (unsigned char) (SID_EXE_CORR >> 8);
350 351 data[1] = (unsigned char) SID_EXE_CORR;
351 352 data[2] = TC->packetID[0];
352 353 data[3] = TC->packetID[1];
353 354 data[4] = TC->packetSequenceControl[0];
354 355 data[5] = TC->packetSequenceControl[1];
355 356 data[6] = TC->serviceType; // type
356 357 data[7] = TC->serviceSubType; // subtype
357 358 data[8] = currentTC_LEN_RCV[0];
358 359 data[9] = currentTC_LEN_RCV[1];
359 360 data[10] = TC->packetLength[0];
360 361 data[11] = TC->packetLength[1];
361 362 data[12] = TC->dataAndCRC[packetLength];
362 363 data[13] = TC->dataAndCRC[packetLength+1];
363 364 data[14] = computed_CRC[0];
364 365 data[15] = computed_CRC[1];
365 366 break;
366 367 default:
367 368 return 0;
368 369 }
369 370 return 1;
370 371 }
371 372
372 373 int create_message_queue( void )
373 374 {
374 375 rtems_status_code status;
375 376 misc_name[0] = rtems_build_name( 'Q', 'U', 'E', 'U' );
376 377 status = rtems_message_queue_create( misc_name[0], ACTION_MSG_QUEUE_COUNT, CCSDS_TC_PKT_MAX_SIZE,
377 378 RTEMS_FIFO | RTEMS_LOCAL, &misc_id[0] );
378 379 if (status!=RTEMS_SUCCESSFUL) {
379 380 PRINTF("in create_message_queue *** error creating message queue\n")
380 381 }
381 382
382 383 return 0;
383 384 }
384 385
385 386 //***********
386 387 // RTEMS TASK
387 388 rtems_task recv_task( rtems_task_argument unused )
388 389 {
389 390 int len = 0;
390 391 unsigned int i = 0;
391 392 unsigned int data_length = 0;
392 393 ccsdsTelecommandPacket_t currentTC;
393 394 char data[100];
394 395
395 396 for(i=0; i<100; i++) data[i] = 0;
396 397
397 398 PRINTF("in RECV *** \n")
398 399
399 400 while(1)
400 401 {
401 402 len = read(fdSPW, (char*) &currentTC, CCSDS_TC_PKT_MAX_SIZE); // the call to read is blocking
402 403 if (len == -1){ // error during the read call
403 404 PRINTF("In RECV *** last read call returned -1\n")
404 405 //if (rtems_event_send( Task_id[TASKID_SPIQ], SPW_LINKERR_EVENT ) != RTEMS_SUCCESSFUL) {
405 406 // PRINTF("IN RECV *** Error: rtems_event_send SPW_LINKERR_EVENT\n")
406 407 //}
407 408 //if (rtems_task_suspend(RTEMS_SELF) != RTEMS_SUCCESSFUL) {
408 409 // PRINTF("In RECV *** Error: rtems_task_suspend(RTEMS_SELF)\n")
409 410 //}
410 411 }
411 412 else {
412 413 PRINTF1("Got pck of length %d\n", len+1)
413 414 if ( (len+1) < CCSDS_TC_PKT_MIN_SIZE ) {
414 415 PRINTF("In RECV *** packet lenght too short\n")
415 416 }
416 417 else {
417 418 currentTC_LEN_RCV[0] = 0x00;
418 419 currentTC_LEN_RCV[1] = (unsigned char) (len - CCSDS_TC_TM_PACKET_OFFSET - 3); // build the corresponding packet size field
419 420 currentTC_LEN_RCV_AsUnsignedInt = (unsigned int) (len - CCSDS_TC_TM_PACKET_OFFSET - 3); // => -3 is for Prot ID, Reserved and User App bytes
420 421 // CHECK THE TC AND BUILD THE APPROPRIATE TM
421 422 data_length = TC_acceptance(&currentTC, currentTC_LEN_RCV_AsUnsignedInt);
422 423 if (data_length!=-1)
423 424 {
424 425 }
425 426 }
426 427 }
427 428 }
428 429 }
429 430
430 431 rtems_task actn_task( rtems_task_argument unused )
431 432 {
432 433 int result;
433 434 rtems_status_code status; // RTEMS status code
434 435 ccsdsTelecommandPacket_t TC; // TC sent to the ACTN task
435 436 size_t size; // size of the incoming TC packet
436 437 unsigned char subtype; // subtype of the current TC packet
437 438
438 439 result = LFR_SUCCESSFUL;
439 440 subtype = 0; // subtype of the current TC packet
440 441
441 442 PRINTF("in ACTN *** \n")
442 443
443 444 while(1)
444 445 {
445 446 status = rtems_message_queue_receive(misc_id[0], (char*) &TC, &size,
446 447 RTEMS_WAIT, RTEMS_NO_TIMEOUT);
447 448 if (status!=RTEMS_SUCCESSFUL) PRINTF1("ERR *** in task ACTN *** error receiving a message, code %d \n", status)
448 449 else
449 450 {
450 451 subtype = TC.serviceSubType;
451 452 switch(subtype)
452 453 {
453 454 case TC_SUBTYPE_RESET:
454 455 result = action_default( &TC );
455 456 break;
456 457 //
457 458 case TC_SUBTYPE_LOAD_COMM:
458 459 result = action_load_comm( &TC );
459 460 close_action( &TC, result );
460 461 break;
461 462 //
462 463 case TC_SUBTYPE_LOAD_NORM:
463 464 result = action_load_norm( &TC );
464 465 close_action( &TC, result );
465 466 break;
466 467 //
467 468 case TC_SUBTYPE_LOAD_BURST:
468 469 result = action_default( &TC );
469 470 close_action( &TC, result );
470 471 break;
471 472 //
472 473 case TC_SUBTYPE_LOAD_SBM1:
473 474 result = action_default( &TC );
474 475 close_action( &TC, result );
475 476 break;
476 477 //
477 478 case TC_SUBTYPE_LOAD_SBM2:
478 479 result = action_default( &TC );
479 480 close_action( &TC, result );
480 481 break;
481 482 //
482 483 case TC_SUBTYPE_DUMP:
483 484 result = action_dump( &TC );
484 485 close_action( &TC, result );
485 486 break;
486 487 //
487 488 case TC_SUBTYPE_ENTER:
488 489 result = action_enter( &TC );
489 490 close_action( &TC, result );
490 491 break;
491 492 //
492 493 case TC_SUBTYPE_UPDT_INFO:
493 494 result = action_updt_info( &TC );
494 495 close_action( &TC, result );
495 496 break;
496 497 //
497 498 case TC_SUBTYPE_EN_CAL:
498 499 result = action_enable_calibration( &TC );
499 500 close_action( &TC, result );
500 501 break;
501 502 //
502 503 case TC_SUBTYPE_DIS_CAL:
503 504 result = action_disable_calibration( &TC );
504 505 close_action( &TC, result );
505 506 break;
506 507 //
507 508 case TC_SUBTYPE_UPDT_TIME:
508 509 result = action_updt_time( &TC );
509 510 break;
510 511 //
511 512 default:
512 513 break;
513 514 }
514 515 }
515 516 }
516 517 }
517 518
518 519 rtems_task dumb_task( rtems_task_argument unused )
519 520 {
520 521 unsigned int i;
521 522 unsigned int intEventOut;
522 523 unsigned int coarse_time = 0;
523 524 unsigned int fine_time = 0;
524 525 rtems_event_set event_out;
525 526
526 527 PRINTF("in DUMB *** \n")
527 528
528 529 while(1){
529 rtems_event_receive(RTEMS_EVENT_0 | RTEMS_EVENT_1 | RTEMS_EVENT_2 | RTEMS_EVENT_3 | RTEMS_EVENT_4,
530 rtems_event_receive(RTEMS_EVENT_0 | RTEMS_EVENT_1 | RTEMS_EVENT_2 | RTEMS_EVENT_3 | RTEMS_EVENT_4 | RTEMS_EVENT_5,
530 531 RTEMS_WAIT | RTEMS_EVENT_ANY, RTEMS_NO_TIMEOUT, &event_out); // wait for an RTEMS_EVENT
531 532 intEventOut = (unsigned int) event_out;
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 616 parameter_dump_packet.unused0 = TC->dataAndCRC[0];
617 617 parameter_dump_packet.bw_sp0_sp1_r0_r1 = TC->dataAndCRC[1];
618 618
619 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 636 parameter_dump_packet.sy_lfr_n_swf_l[0] = TC->dataAndCRC[0];
637 637 parameter_dump_packet.sy_lfr_n_swf_l[1] = TC->dataAndCRC[1];
638 638
639 639 parameter_dump_packet.sy_lfr_n_swf_p[0] = TC->dataAndCRC[2];
640 640 parameter_dump_packet.sy_lfr_n_swf_p[1] = TC->dataAndCRC[3];
641 641
642 642 parameter_dump_packet.sy_lfr_n_asm_p[0] = TC->dataAndCRC[4];
643 643 parameter_dump_packet.sy_lfr_n_asm_p[1] = TC->dataAndCRC[5];
644 644
645 645 parameter_dump_packet.sy_lfr_n_bp_p0 = TC->dataAndCRC[6];
646 646 parameter_dump_packet.sy_lfr_n_bp_p1 = TC->dataAndCRC[7];
647 647
648 648 result = LFR_SUCCESSFUL;
649 649 }
650 650
651 651 return result;
652 652 }
653 653
654 654 int action_load_burst(ccsdsTelecommandPacket_t *TC)
655 655 {
656 656 int result;
657 657 unsigned char lfrMode;
658 658
659 659 result = LFR_DEFAULT;
660 660 lfrMode = (housekeeping_packet.lfr_status_word[0] & 0xf0) >> 4;
661 661
662 662 if ( lfrMode == LFR_MODE_BURST ) {
663 663 send_tm_lfr_tc_exe_not_executable( TC );
664 664 result = LFR_DEFAULT;
665 665 }
666 666 else {
667 667 send_tm_lfr_tc_exe_not_implemented( TC );
668 668 result = LFR_DEFAULT;
669 669 }
670 670
671 671 return result;
672 672 }
673 673
674 674 int action_load_sbm1(ccsdsTelecommandPacket_t *TC)
675 675 {
676 676 int result;
677 677 unsigned char lfrMode;
678 678
679 679 result = LFR_DEFAULT;
680 680 lfrMode = (housekeeping_packet.lfr_status_word[0] & 0xf0) >> 4;
681 681
682 682 if ( (lfrMode == LFR_MODE_SBM1) | (lfrMode == LFR_MODE_SBM2) ) {
683 683 send_tm_lfr_tc_exe_not_executable( TC );
684 684 result = LFR_DEFAULT;
685 685 }
686 686 else {
687 687 send_tm_lfr_tc_exe_not_implemented( TC );
688 688 result = LFR_DEFAULT;
689 689 }
690 690
691 691 return result;
692 692 }
693 693
694 694 int action_load_sbm2(ccsdsTelecommandPacket_t *TC)
695 695 {
696 696 int result;
697 697 unsigned char lfrMode;
698 698
699 699 result = LFR_DEFAULT;
700 700 lfrMode = (housekeeping_packet.lfr_status_word[0] & 0xf0) >> 4;
701 701
702 702 if ( (lfrMode == LFR_MODE_SBM1) | (lfrMode == LFR_MODE_SBM2) ) {
703 703 send_tm_lfr_tc_exe_not_executable( TC );
704 704 result = LFR_DEFAULT;
705 705 }
706 706 else {
707 707 send_tm_lfr_tc_exe_not_implemented( TC );
708 708 result = LFR_DEFAULT;
709 709 }
710 710
711 711 return result;
712 712 }
713 713
714 714 int action_dump(ccsdsTelecommandPacket_t *TC)
715 715 {
716 716 int status;
717 717 // send parameter dump packet
718 718 status = write(fdSPW, (char *) &parameter_dump_packet,
719 719 PACKET_LENGTH_PARAMETER_DUMP + CCSDS_TC_TM_PACKET_OFFSET + 4);
720 720 if (status == -1)
721 721 {
722 722 PRINTF1("in action_dump *** ERR sending packet, code %d", status)
723 723 status = RTEMS_UNSATISFIED;
724 724 }
725 725 else
726 726 {
727 727 status = RTEMS_SUCCESSFUL;
728 728 }
729 729
730 730 return status;
731 731 }
732 732
733 733 int action_updt_info(ccsdsTelecommandPacket_t *TC) {
734 734 unsigned int val;
735 735 int result;
736 736 unsigned char lfrMode;
737 737
738 738 result = LFR_DEFAULT;
739 739 lfrMode = (housekeeping_packet.lfr_status_word[0] & 0xf0) >> 4;
740 740
741 741 if ( (lfrMode == LFR_MODE_STANDBY) ) {
742 742 send_tm_lfr_tc_exe_not_executable( TC );
743 743 result = LFR_DEFAULT;
744 744 }
745 745 else {
746 746 val = housekeeping_packet.hk_lfr_update_info_tc_cnt[0] * 256
747 747 + housekeeping_packet.hk_lfr_update_info_tc_cnt[1];
748 748 val++;
749 749 housekeeping_packet.hk_lfr_update_info_tc_cnt[0] = (unsigned char) (val >> 8);
750 750 housekeeping_packet.hk_lfr_update_info_tc_cnt[1] = (unsigned char) (val);
751 751 result = LFR_SUCCESSFUL;
752 752 }
753 753
754 754 return result;
755 755 }
756 756
757 757 int action_enable_calibration(ccsdsTelecommandPacket_t *TC)
758 758 {
759 759 int result;
760 760 unsigned char lfrMode;
761 761
762 762 result = LFR_DEFAULT;
763 763 lfrMode = (housekeeping_packet.lfr_status_word[0] & 0xf0) >> 4;
764 764
765 765 if ( (lfrMode == LFR_MODE_STANDBY) | (lfrMode == LFR_MODE_BURST) | (lfrMode == LFR_MODE_SBM2) ) {
766 766 send_tm_lfr_tc_exe_not_executable( TC );
767 767 result = LFR_DEFAULT;
768 768 }
769 769 else {
770 770 send_tm_lfr_tc_exe_not_implemented( TC );
771 771 result = LFR_DEFAULT;
772 772 }
773 773 return result;
774 774 }
775 775
776 776 int action_disable_calibration(ccsdsTelecommandPacket_t *TC)
777 777 {
778 778 int result;
779 779 unsigned char lfrMode;
780 780
781 781 result = LFR_DEFAULT;
782 782 lfrMode = (housekeeping_packet.lfr_status_word[0] & 0xf0) >> 4;
783 783
784 784 if ( (lfrMode == LFR_MODE_STANDBY) | (lfrMode == LFR_MODE_BURST) | (lfrMode == LFR_MODE_SBM2) ) {
785 785 send_tm_lfr_tc_exe_not_executable( TC );
786 786 result = LFR_DEFAULT;
787 787 }
788 788 else {
789 789 send_tm_lfr_tc_exe_not_implemented( TC );
790 790 result = LFR_DEFAULT;
791 791 }
792 792 return result;
793 793 }
794 794
795 795 int action_updt_time(ccsdsTelecommandPacket_t *TC)
796 796 {
797 797 unsigned int val;
798 798
799 799 time_management_regs->coarse_time_load = (TC->dataAndCRC[0] << 24)
800 800 + (TC->dataAndCRC[1] << 16)
801 801 + (TC->dataAndCRC[2] << 8)
802 802 + TC->dataAndCRC[3];
803 803 val = housekeeping_packet.hk_lfr_update_time_tc_cnt[0] * 256
804 804 + housekeeping_packet.hk_lfr_update_time_tc_cnt[1];
805 805 val++;
806 806 housekeeping_packet.hk_lfr_update_time_tc_cnt[0] = (unsigned char) (val >> 8);
807 807 housekeeping_packet.hk_lfr_update_time_tc_cnt[1] = (unsigned char) (val);
808 808 //time_management_regs->ctrl = time_management_regs->ctrl | 1;
809 809
810 810 return LFR_SUCCESSFUL;
811 811 }
812 812
813 813 //*******************
814 814 // ENTERING THE MODES
815 815
816 816 int transition_validation(unsigned char requestedMode)
817 817 {
818 818 int status;
819 819 unsigned char lfrMode;
820 820
821 821 lfrMode = (housekeeping_packet.lfr_status_word[0] & 0xf0) >> 4;
822 822
823 823 switch (requestedMode)
824 824 {
825 825 case LFR_MODE_STANDBY:
826 if ( (lfrMode == LFR_MODE_STANDBY) ) {
826 if ( lfrMode == LFR_MODE_STANDBY ) {
827 827 status = LFR_DEFAULT;
828 828 }
829 829 else
830 830 {
831 831 status = LFR_SUCCESSFUL;
832 832 }
833 833 break;
834 834 case LFR_MODE_NORMAL:
835 if ( (lfrMode == LFR_MODE_NORMAL) ) {
835 if ( lfrMode == LFR_MODE_NORMAL ) {
836 836 status = LFR_DEFAULT;
837 837 }
838 838 else {
839 839 status = LFR_SUCCESSFUL;
840 840 }
841 841 break;
842 842 case LFR_MODE_BURST:
843 if ( (lfrMode == LFR_MODE_STANDBY) | (lfrMode == LFR_MODE_BURST)
844 | (lfrMode == LFR_MODE_SBM2) ) {
843 if ( lfrMode == LFR_MODE_STANDBY ) {
845 844 status = LFR_DEFAULT;
846 845 }
847 846 else {
848 847 status = LFR_SUCCESSFUL;
849 848 }
850 849 break;
851 850 case LFR_MODE_SBM1:
852 if ( (lfrMode == LFR_MODE_STANDBY) | (lfrMode == LFR_MODE_SBM1) ) {
851 if ( lfrMode == LFR_MODE_SBM1 ) {
853 852 status = LFR_DEFAULT;
854 853 }
855 854 else {
856 855 status = LFR_SUCCESSFUL;
857 856 }
858 857 break;
859 858 case LFR_MODE_SBM2:
860 if ( (lfrMode == LFR_MODE_STANDBY) | (lfrMode == LFR_MODE_NORMAL)
861 | (lfrMode == LFR_MODE_BURST) | (lfrMode == LFR_MODE_SBM2) ) {
859 if ( lfrMode == LFR_MODE_SBM2 ) {
862 860 status = LFR_DEFAULT;
863 861 }
864 862 else {
865 863 status = LFR_SUCCESSFUL;
866 864 }
867 865 break;
868 866 default:
869 867 status = LFR_DEFAULT;
870 868 break;
871 869 }
872 870
873 871 return status;
874 872 }
875 873
876 874 int stop_current_mode()
877 875 {
878 876 rtems_status_code status;
879 877 unsigned char lfrMode;
880 878
881 879 status = RTEMS_SUCCESSFUL;
882 880 lfrMode = (housekeeping_packet.lfr_status_word[0] & 0xf0) >> 4; // get the current mode
883 881
884 882 // mask all IRQ lines related to signal processing
885 883 LEON_Mask_interrupt( IRQ_WF ); // mask waveform interrupt (coming from the timer VHDL IP)
886 884 LEON_Mask_interrupt( IRQ_SM ); // mask spectral matrices interrupt (coming from the timer VHDL IP)
887 885 LEON_Mask_interrupt( IRQ_WAVEFORM_PICKER ); // mask waveform picker interrupt
888 886
889 887 // clear all pending interruptions related to signal processing
890 888 LEON_Clear_interrupt( IRQ_WF ); // clear waveform interrupt (coming from the timer VHDL IP)
891 889 LEON_Clear_interrupt( IRQ_SM ); // clear spectral matrices interrupt (coming from the timer VHDL IP)
892 890 LEON_Clear_interrupt( IRQ_WAVEFORM_PICKER ); // clear waveform picker interrupt
893 891
894 892 // suspend several tasks
895 893
896 894 if (lfrMode != LFR_MODE_STANDBY) {
897 895 status = rtems_task_suspend( Task_id[TASKID_AVF0] );
898 896 if (status == RTEMS_SUCCESSFUL) {
899 897 status = rtems_task_suspend( Task_id[TASKID_BPF0] );
900 898 if (status == RTEMS_SUCCESSFUL) {
901 899 status = rtems_task_suspend( Task_id[TASKID_WFRM] );
902 900 }
903 901 }
904 902 }
905 903
906 904 if (status != RTEMS_SUCCESSFUL)
907 905 {
908 906 PRINTF("ERR *** in stop_current_mode *** suspending tasks\n")
909 907 }
910 908
911 909 // initialize the registers
912 910 waveform_picker_regs->burst_enable = 0x00; // initialize
913 911
914 912 return status;
915 913 }
916 914
917 915 int enter_mode(unsigned char mode, ccsdsTelecommandPacket_t *TC )
918 916 {
919 917 rtems_status_code status;
920 918
921 919 switch(mode){
922 920 case LFR_MODE_STANDBY:
923 921 status = enter_standby_mode( TC );
924 922 break;
925 923 case LFR_MODE_NORMAL:
926 924 status = enter_normal_mode( TC );
927 925 break;
928 926 case LFR_MODE_BURST:
929 927 status = enter_burst_mode( TC );
930 928 break;
931 929 case LFR_MODE_SBM1:
932 930 status = enter_sbm1_mode( TC );
933 931 break;
934 932 case LFR_MODE_SBM2:
935 933 status = enter_sbm2_mode( TC );
936 934 break;
937 935 default:
938 936 status = RTEMS_UNSATISFIED;
939 937 }
940 938
941 939 if (status == RTEMS_SUCCESSFUL)
942 940 {
943 941 housekeeping_packet.lfr_status_word[0] = (unsigned char) ((mode << 4) + 0x0d);
944 942 }
945 943
946 944 return status;
947 945 }
948 946
949 947 int enter_standby_mode(ccsdsTelecommandPacket_t *TC)
950 948 {
951 949 return LFR_SUCCESSFUL;
952 950 }
953 951
954 952 int enter_normal_mode( ccsdsTelecommandPacket_t *TC )
955 953 {
956 954 rtems_status_code status;
957 955
958 956 status = rtems_task_restart( Task_id[TASKID_AVF0], 0 );
959 957 if (status == RTEMS_SUCCESSFUL) {
960 958 status = rtems_task_restart( Task_id[TASKID_BPF0], 0 );
961 959 if (status == RTEMS_SUCCESSFUL) {
962 960 status = rtems_task_restart( Task_id[TASKID_WFRM], 0 );
963 961 }
964 962 }
965 963
966 964 #ifdef GSA
967 LEON_Unmask_interrupt( IRQ_WF );
965 LEON_Clear_interrupt( IRQ_WF );
966 LEON_Unmask_interrupt( IRQ_WF );
968 967 #else
969 LEON_Clear_interrupt( IRQ_WAVEFORM_PICKER );
970 LEON_Unmask_interrupt( IRQ_WAVEFORM_PICKER );
971 waveform_picker_regs->burst_enable = 0x07;
972 waveform_picker_regs->addr_data_f1 = (int) wf_snap_f1;
973 waveform_picker_regs->status = 0x00;
968 LEON_Clear_interrupt( IRQ_WAVEFORM_PICKER );
969 LEON_Unmask_interrupt( IRQ_WAVEFORM_PICKER );
970 waveform_picker_regs->burst_enable = 0x07;
971 waveform_picker_regs->addr_data_f1 = (int) wf_snap_f1;
972 waveform_picker_regs->status = 0x00;
974 973 #endif
975 LEON_Unmask_interrupt( IRQ_SM );
974 LEON_Unmask_interrupt( IRQ_SM );
976 975
977 976 return status;
978 977 }
979 978
980 979 int enter_burst_mode(ccsdsTelecommandPacket_t *TC)
981 980 {
982 981 rtems_status_code status;
983 982 unsigned char lfrMode;
984 983
985 984 lfrMode = (housekeeping_packet.lfr_status_word[0] & 0xf0) >> 4;
986 985
987 986 status = rtems_task_restart( Task_id[TASKID_AVF0], 0 );
988 987 if (status == RTEMS_SUCCESSFUL) {
989 988 status = rtems_task_restart( Task_id[TASKID_BPF0], 0 );
990 989 if (status == RTEMS_SUCCESSFUL) {
991 990 status = rtems_task_restart( Task_id[TASKID_WFRM], 0 );
992 991 }
993 992 }
994 993
995 994 #ifdef GSA
996 995 #else
997 996 LEON_Clear_interrupt( IRQ_WAVEFORM_PICKER );
998 997 LEON_Unmask_interrupt( IRQ_WAVEFORM_PICKER );
999 998 waveform_picker_regs->addr_data_f2 = (int) wf_snap_f2;
1000 999 waveform_picker_regs->burst_enable = 0x40; // [0100 0000] burst f2, f1, f0 enable f3 f2 f1 f0
1001 1000 waveform_picker_regs->burst_enable = waveform_picker_regs->burst_enable | 0x04;
1002 1001 waveform_picker_regs->status = 0x00;
1003 1002 #endif
1004 1003
1005 1004 LEON_Unmask_interrupt( IRQ_SM );
1006 1005
1007 1006 return status;
1008 1007 }
1009 1008
1010 1009 int enter_sbm1_mode(ccsdsTelecommandPacket_t *TC)
1011 1010 {
1012 1011 rtems_status_code status;
1013 1012
1014 1013 status = rtems_task_restart( Task_id[TASKID_AVF0], 0 );
1015 1014 if (status == RTEMS_SUCCESSFUL) {
1016 1015 status = rtems_task_restart( Task_id[TASKID_BPF0], 0 );
1017 1016 if (status == RTEMS_SUCCESSFUL) {
1018 1017 status = rtems_task_restart( Task_id[TASKID_WFRM], 0 );
1019 1018 }
1020 1019 }
1021 1020
1022 1021 // at the beginning of the mode, the parameter local_sbm1_nb_cwf_max has a specific value
1023 1022 param_local.local_sbm1_nb_cwf_max = 2 * (
1024 1023 (parameter_dump_packet.sy_lfr_n_swf_p[0] * 256)
1025 1024 + parameter_dump_packet.sy_lfr_n_swf_p[1]
1026 1025 )/ 4;
1027 1026
1028 1027 #ifdef GSA
1029 1028 #else
1030 1029 LEON_Clear_interrupt( IRQ_WAVEFORM_PICKER );
1031 1030 LEON_Unmask_interrupt( IRQ_WAVEFORM_PICKER );
1032 1031 waveform_picker_regs->addr_data_f1 = (int) wf_snap_f1;
1033 1032 waveform_picker_regs->burst_enable = 0x20; // [0010 0000] burst f2, f1, f0 enable f3 f2 f1 f0
1034 1033 waveform_picker_regs->burst_enable = waveform_picker_regs->burst_enable | 0x07; // [0111] enable f3 f2 f1 f0
1035 1034 waveform_picker_regs->status = 0x00;
1036 1035 #endif
1037 1036
1038 1037 LEON_Unmask_interrupt( IRQ_SM );
1039 1038
1040 1039 return status;
1041 1040 }
1042 1041
1043 1042 int enter_sbm2_mode(ccsdsTelecommandPacket_t *TC)
1044 1043 {
1045 1044 rtems_status_code status;
1046 1045
1047 1046 status = rtems_task_restart( Task_id[TASKID_AVF0], 0 );
1048 1047 if (status == RTEMS_SUCCESSFUL) {
1049 1048 status = rtems_task_restart( Task_id[TASKID_BPF0], 0 );
1050 1049 if (status == RTEMS_SUCCESSFUL) {
1051 1050 status = rtems_task_restart( Task_id[TASKID_WFRM], 0 );
1052 1051 }
1053 1052 }
1054 1053
1055 1054 // at the beginning of the mode, the parameter local_sbm2_nb_cwf_max has a specific value
1056 1055 param_local.local_sbm1_nb_cwf_max = (
1057 1056 (parameter_dump_packet.sy_lfr_n_swf_p[0] * 256)
1058 1057 + parameter_dump_packet.sy_lfr_n_swf_p[1]
1059 1058 ) / 16;
1060 1059
1061 1060 #ifdef GSA
1062 1061 #else
1063 1062 LEON_Clear_interrupt( IRQ_WAVEFORM_PICKER );
1064 1063 LEON_Unmask_interrupt( IRQ_WAVEFORM_PICKER );
1065 1064 waveform_picker_regs->addr_data_f2 = (int) wf_snap_f2;
1066 1065 waveform_picker_regs->burst_enable = 0x40; // [0100 0000] burst f2, f1, f0 enable f3 f2 f1 f0
1067 1066 waveform_picker_regs->burst_enable = waveform_picker_regs->burst_enable | 0x04;
1068 1067 waveform_picker_regs->status = 0x00;
1069 1068 #endif
1070 1069
1071 1070 LEON_Unmask_interrupt( IRQ_SM );
1072 1071
1073 1072 return status;
1074 1073 }
1075 1074
1076 1075 //****************
1077 1076 // CLOSING ACTIONS
1078 1077
1079 1078 int send_tm_lfr_tc_exe_success(ccsdsTelecommandPacket_t *TC)
1080 1079 {
1081 1080 rtems_status_code status;
1082 1081 TMHeader_t TM_header;
1083 1082 char data[4];
1084 1083 spw_ioctl_pkt_send spw_ioctl_send;
1085 1084
1086 1085 TM_build_header( TM_LFR_TC_EXE_OK, PACKET_LENGTH_TC_EXE_SUCCESS,
1087 1086 &TM_header,
1088 1087 TC->sourceID); // TC source ID
1089 1088
1090 1089 data[0] = TC->packetID[0];
1091 1090 data[1] = TC->packetID[1];
1092 1091 data[2] = TC->packetSequenceControl[0];
1093 1092 data[3] = TC->packetSequenceControl[1];
1094 1093
1095 1094 // filling the structure for the spacewire transmission
1096 1095 spw_ioctl_send.hlen = TM_HEADER_LEN + 4; // + 4 is for the protocole extra header
1097 1096 spw_ioctl_send.hdr = (char*) &TM_header;
1098 1097 spw_ioctl_send.dlen = 4;
1099 1098 spw_ioctl_send.data = data;
1100 1099 spw_ioctl_send.options = 0;
1101 1100
1102 1101 // SEND DATA
1103 1102 status = ioctl( fdSPW, SPACEWIRE_IOCTRL_SEND, &spw_ioctl_send );
1104 1103
1105 1104 return LFR_SUCCESSFUL;
1106 1105 }
1107 1106
1108 1107 int send_tm_lfr_tc_exe_not_executable(ccsdsTelecommandPacket_t *TC)
1109 1108 {
1110 1109 rtems_status_code status;
1111 1110 TMHeader_t TM_header;
1112 1111 char data[10];
1113 1112 spw_ioctl_pkt_send spw_ioctl_send;
1114 1113
1115 1114 TM_build_header( TM_LFR_TC_EXE_ERR, PACKET_LENGTH_TC_EXE_NOT_EXECUTABLE,
1116 1115 &TM_header,
1117 1116 TC->sourceID); // TC source ID
1118 1117
1119 1118 data[0] = (char) (FAILURE_CODE_NOT_EXECUTABLE >> 8);
1120 1119 data[1] = (char) FAILURE_CODE_NOT_EXECUTABLE;
1121 1120 data[2] = TC->packetID[0];
1122 1121 data[3] = TC->packetID[1];
1123 1122 data[4] = TC->packetSequenceControl[0];
1124 1123 data[5] = TC->packetSequenceControl[1];
1125 1124 data[6] = TC->serviceType; // type of the rejected TC
1126 1125 data[7] = TC->serviceSubType; // subtype of the rejected TC
1127 1126 data[8] = housekeeping_packet.lfr_status_word[0];
1128 1127 data[6] = housekeeping_packet.lfr_status_word[1];
1129 1128
1130 1129 // filling the structure for the spacewire transmission
1131 1130 spw_ioctl_send.hlen = TM_HEADER_LEN + 4; // + 4 is for the protocole extra header
1132 1131 spw_ioctl_send.hdr = (char*) &TM_header;
1133 1132 spw_ioctl_send.dlen = 10;
1134 1133 spw_ioctl_send.data = data;
1135 1134 spw_ioctl_send.options = 0;
1136 1135
1137 1136 // SEND DATA
1138 1137 status = ioctl( fdSPW, SPACEWIRE_IOCTRL_SEND, &spw_ioctl_send );
1139 1138
1140 1139 return LFR_SUCCESSFUL;
1141 1140 }
1142 1141
1143 1142 int send_tm_lfr_tc_exe_not_implemented(ccsdsTelecommandPacket_t *TC)
1144 1143 {
1145 1144 rtems_status_code status;
1146 1145 TMHeader_t TM_header;
1147 1146 char data[8];
1148 1147 spw_ioctl_pkt_send spw_ioctl_send;
1149 1148
1150 1149 TM_build_header( TM_LFR_TC_EXE_ERR, PACKET_LENGTH_TC_EXE_NOT_IMPLEMENTED,
1151 1150 &TM_header,
1152 1151 TC->sourceID); // TC source ID
1153 1152
1154 1153 data[0] = (char) (FAILURE_CODE_NOT_IMPLEMENTED >> 8);
1155 1154 data[1] = (char) FAILURE_CODE_NOT_IMPLEMENTED;
1156 1155 data[2] = TC->packetID[0];
1157 1156 data[3] = TC->packetID[1];
1158 1157 data[4] = TC->packetSequenceControl[0];
1159 1158 data[5] = TC->packetSequenceControl[1];
1160 1159 data[6] = TC->serviceType; // type of the rejected TC
1161 1160 data[7] = TC->serviceSubType; // subtype of the rejected TC
1162 1161
1163 1162 // filling the structure for the spacewire transmission
1164 1163 spw_ioctl_send.hlen = TM_HEADER_LEN + 4; // + 4 is for the protocole extra header
1165 1164 spw_ioctl_send.hdr = (char*) &TM_header;
1166 1165 spw_ioctl_send.dlen = 8;
1167 1166 spw_ioctl_send.data = data;
1168 1167 spw_ioctl_send.options = 0;
1169 1168
1170 1169 // SEND DATA
1171 1170 status = ioctl( fdSPW, SPACEWIRE_IOCTRL_SEND, &spw_ioctl_send );
1172 1171
1173 1172 return LFR_SUCCESSFUL;
1174 1173 }
1175 1174
1176 1175 int send_tm_lfr_tc_exe_error(ccsdsTelecommandPacket_t *TC)
1177 1176 {
1178 1177 rtems_status_code status;
1179 1178 TMHeader_t TM_header;
1180 1179 char data[8];
1181 1180 spw_ioctl_pkt_send spw_ioctl_send;
1182 1181
1183 1182 TM_build_header( TM_LFR_TC_EXE_ERR, PACKET_LENGTH_TC_EXE_ERROR,
1184 1183 &TM_header,
1185 1184 TC->sourceID); // TC source ID
1186 1185
1187 1186 data[0] = (char) (FAILURE_CODE_ERROR >> 8);
1188 1187 data[1] = (char) FAILURE_CODE_ERROR;
1189 1188 data[2] = TC->packetID[0];
1190 1189 data[3] = TC->packetID[1];
1191 1190 data[4] = TC->packetSequenceControl[0];
1192 1191 data[5] = TC->packetSequenceControl[1];
1193 1192 data[6] = TC->serviceType; // type of the rejected TC
1194 1193 data[7] = TC->serviceSubType; // subtype of the rejected TC
1195 1194
1196 1195 // filling the structure for the spacewire transmission
1197 1196 spw_ioctl_send.hlen = TM_HEADER_LEN + 4; // + 4 is for the protocole extra header
1198 1197 spw_ioctl_send.hdr = (char*) &TM_header;
1199 1198 spw_ioctl_send.dlen = 8;
1200 1199 spw_ioctl_send.data = data;
1201 1200 spw_ioctl_send.options = 0;
1202 1201
1203 1202 // SEND DATA
1204 1203 status = ioctl( fdSPW, SPACEWIRE_IOCTRL_SEND, &spw_ioctl_send );
1205 1204
1206 1205 return LFR_SUCCESSFUL;
1207 1206 }
1208 1207
1209 1208 void update_last_TC_exe(ccsdsTelecommandPacket_t *TC)
1210 1209 {
1211 1210 housekeeping_packet.hk_lfr_last_exe_tc_id[0] = TC->packetID[0];
1212 1211 housekeeping_packet.hk_lfr_last_exe_tc_id[1] = TC->packetID[1];
1213 1212 housekeeping_packet.hk_lfr_last_exe_tc_type[0] = 0x00;
1214 1213 housekeeping_packet.hk_lfr_last_exe_tc_type[1] = TC->serviceType;
1215 1214 housekeeping_packet.hk_lfr_last_exe_tc_subtype[0] = 0x00;
1216 1215 housekeeping_packet.hk_lfr_last_exe_tc_subtype[1] = TC->serviceSubType;
1217 1216 housekeeping_packet.hk_lfr_last_exe_tc_time[0] = (unsigned char) (time_management_regs->coarse_time>>24);
1218 1217 housekeeping_packet.hk_lfr_last_exe_tc_time[1] = (unsigned char) (time_management_regs->coarse_time>>16);
1219 1218 housekeeping_packet.hk_lfr_last_exe_tc_time[2] = (unsigned char) (time_management_regs->coarse_time>>8);
1220 1219 housekeeping_packet.hk_lfr_last_exe_tc_time[3] = (unsigned char) (time_management_regs->coarse_time);
1221 1220 housekeeping_packet.hk_lfr_last_exe_tc_time[4] = (unsigned char) (time_management_regs->fine_time>>8);
1222 1221 housekeeping_packet.hk_lfr_last_exe_tc_time[5] = (unsigned char) (time_management_regs->fine_time);
1223 1222 }
1224 1223
1225 1224 void update_last_TC_rej(ccsdsTelecommandPacket_t *TC)
1226 1225 {
1227 1226 housekeeping_packet.hk_lfr_last_rej_tc_id[0] = TC->packetID[0];
1228 1227 housekeeping_packet.hk_lfr_last_rej_tc_id[1] = TC->packetID[1];
1229 1228 housekeeping_packet.hk_lfr_last_rej_tc_type[0] = 0x00;
1230 1229 housekeeping_packet.hk_lfr_last_rej_tc_type[1] = TC->serviceType;
1231 1230 housekeeping_packet.hk_lfr_last_rej_tc_subtype[0] = 0x00;
1232 1231 housekeeping_packet.hk_lfr_last_rej_tc_subtype[1] = TC->serviceSubType;
1233 1232 housekeeping_packet.hk_lfr_last_rej_tc_time[0] = (unsigned char) (time_management_regs->coarse_time>>24);
1234 1233 housekeeping_packet.hk_lfr_last_rej_tc_time[1] = (unsigned char) (time_management_regs->coarse_time>>16);
1235 1234 housekeeping_packet.hk_lfr_last_rej_tc_time[2] = (unsigned char) (time_management_regs->coarse_time>>8);
1236 1235 housekeeping_packet.hk_lfr_last_rej_tc_time[3] = (unsigned char) (time_management_regs->coarse_time);
1237 1236 housekeeping_packet.hk_lfr_last_rej_tc_time[4] = (unsigned char) (time_management_regs->fine_time>>8);
1238 1237 housekeeping_packet.hk_lfr_last_rej_tc_time[5] = (unsigned char) (time_management_regs->fine_time);
1239 1238 }
1240 1239
1241 1240 void close_action(ccsdsTelecommandPacket_t *TC, int result)
1242 1241 {
1243 1242 unsigned int val = 0;
1244 1243 if (result == LFR_SUCCESSFUL)
1245 1244 {
1246 1245 send_tm_lfr_tc_exe_success( TC );
1247 1246 update_last_TC_exe( TC );
1248 1247 val = housekeeping_packet.hk_dpu_exe_tc_lfr_cnt[0] * 256 + housekeeping_packet.hk_dpu_exe_tc_lfr_cnt[1];
1249 1248 val++;
1250 1249 housekeeping_packet.hk_dpu_exe_tc_lfr_cnt[0] = (unsigned char) (val >> 8);
1251 1250 housekeeping_packet.hk_dpu_exe_tc_lfr_cnt[1] = (unsigned char) (val);
1252 1251 }
1253 1252 else
1254 1253 {
1255 1254 update_last_TC_rej( TC );
1256 1255 val = housekeeping_packet.hk_dpu_rej_tc_lfr_cnt[0] * 256 + housekeeping_packet.hk_dpu_rej_tc_lfr_cnt[1];
1257 1256 val++;
1258 1257 housekeeping_packet.hk_dpu_rej_tc_lfr_cnt[0] = (unsigned char) (val >> 8);
1259 1258 housekeeping_packet.hk_dpu_rej_tc_lfr_cnt[1] = (unsigned char) (val);
1260 1259 }
1261 1260 }
1262 1261
1263 1262 //***************************
1264 1263 // Interrupt Service Routines
1265 1264 rtems_isr commutation_isr1( rtems_vector_number vector )
1266 1265 {
1267 1266 if (rtems_event_send( Task_id[TASKID_DUMB], RTEMS_EVENT_0 ) != RTEMS_SUCCESSFUL) {
1268 1267 printf("In commutation_isr1 *** Error sending event to DUMB\n");
1269 1268 }
1270 1269 }
1271 1270
1272 1271 rtems_isr commutation_isr2( rtems_vector_number vector )
1273 1272 {
1274 1273 if (rtems_event_send( Task_id[TASKID_DUMB], RTEMS_EVENT_0 ) != RTEMS_SUCCESSFUL) {
1275 1274 printf("In commutation_isr2 *** Error sending event to DUMB\n");
1276 1275 }
1277 1276 }
1278 1277
1279 1278
1280 1279
1281 1280
@@ -1,691 +1,695
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 rtems_event_send( Task_id[TASKID_DUMB], RTEMS_EVENT_5 );
142 143 break;
143 144
144 145 //******
145 146 // NORMAL
146 147 case(LFR_MODE_NORMAL):
148 rtems_event_send( Task_id[TASKID_DUMB], RTEMS_EVENT_5 );
147 149 if (rtems_event_send( Task_id[TASKID_WFRM], RTEMS_EVENT_MODE_NORMAL ) != RTEMS_SUCCESSFUL) {
148 PRINTF("ERR *** in waveforms_isr *** error sending event to WFRM\n")
150 rtems_event_send( Task_id[TASKID_DUMB], RTEMS_EVENT_5 );
149 151 }
150 152 break;
151 153
152 154 //******
153 155 // BURST
154 156 case(LFR_MODE_BURST):
155 157 break;
156 158
157 159 //*****
158 160 // SBM1
159 161 case(LFR_MODE_SBM1):
160 162 break;
161 163
162 164 //*****
163 165 // SBM2
164 166 case(LFR_MODE_SBM2):
165 167 break;
166 168
167 169 //********
168 170 // DEFAULT
169 171 default:
170 172 break;
171 173 }
172 174 }
173 175
174 176 rtems_task wfrm_task(rtems_task_argument argument) //used with the waveform picker VHDL IP
175 177 {
176 178 unsigned int i;
177 179 unsigned int intEventOut;
178 180 spw_ioctl_pkt_send spw_ioctl_send_SWF;
179 181 spw_ioctl_pkt_send spw_ioctl_send_CWF;
180 182 rtems_event_set event_out;
181 183 Header_TM_LFR_SCIENCE_SWF_t headerSWF;
182 184 Header_TM_LFR_SCIENCE_CWF_t headerCWF;
183 185
184 186 init_header_snapshot_wf( &headerSWF );
185 187 init_header_continuous_wf( &headerCWF );
186 188
187 189 // BUILD THE PACKET HEADERS
188 190 spw_ioctl_send_SWF.hlen = TM_HEADER_LEN + 4 + 12; // + 4 is for the protocole extra header, + 12 is for the auxiliary header
189 191 spw_ioctl_send_SWF.hdr = (char*) &headerSWF;
190 192 spw_ioctl_send_SWF.options = 0;
191 193
192 194 spw_ioctl_send_CWF.hlen = TM_HEADER_LEN + 4 + 10; // + 4 is for the protocole extra header, + 10 is for the auxiliary header
193 195 spw_ioctl_send_CWF.hdr = (char*) &headerCWF;
194 196 spw_ioctl_send_CWF.options = 0;
195 197
196 198 init_waveforms();
197 199
198 200 PRINTF("in WFRM ***\n")
199 201
200 202 while(1){
201 203 // wait for an RTEMS_EVENT
202 204 rtems_event_receive(RTEMS_EVENT_0 | RTEMS_EVENT_1 | RTEMS_EVENT_2 | RTEMS_EVENT_3 | RTEMS_EVENT_4,
203 205 RTEMS_WAIT | RTEMS_EVENT_ANY, RTEMS_NO_TIMEOUT, &event_out);
204 206 intEventOut = (unsigned int) event_out;
205 207 for (i = 0; i< 5; i++) {
206 208 if ( ( (intEventOut >> i) & 0x0001) != 0 ) {
207 209 switch(i) {
208 210 case(LFR_MODE_NORMAL):
209 211 send_waveform_norm( &headerSWF, &spw_ioctl_send_SWF);
210 212 break;
211 213 case(LFR_MODE_BURST):
212 214 send_waveform_burst( &headerCWF, &spw_ioctl_send_CWF);
213 215 break;
214 216 case(LFR_MODE_SBM1):
215 217 send_waveform_sbm1( &headerCWF, &spw_ioctl_send_CWF);
216 218 param_local.local_sbm1_nb_cwf_sent ++;
217 219 if ( param_local.local_sbm1_nb_cwf_sent == (param_local.local_sbm1_nb_cwf_max-1) ) {
218 220 // send the f1 buffer as a NORM snapshot
219 221 if (waveform_picker_regs->addr_data_f1 == (int) wf_snap_f1) {
220 222 send_waveform_SWF( &headerSWF, wf_snap_f1_bis, SID_NORM_SWF_F1, &spw_ioctl_send_SWF );
221 223 }
222 224 else {
223 225 send_waveform_SWF( &headerSWF, wf_snap_f1, SID_NORM_SWF_F1, &spw_ioctl_send_SWF );
224 226 }
225 227 }
226 228 break;
227 229 case(LFR_MODE_SBM2):
228 230 send_waveform_sbm2( &headerCWF, &spw_ioctl_send_CWF);
229 231 param_local.local_sbm2_nb_cwf_sent ++;
230 232 if ( param_local.local_sbm2_nb_cwf_sent == (param_local.local_sbm2_nb_cwf_max-1) ) {
231 233 // send the f2 buffer as a NORM snapshot
232 234 if (waveform_picker_regs->addr_data_f2 == (int) wf_snap_f2) {
233 235 send_waveform_SWF( &headerSWF, wf_snap_f2_bis, SID_NORM_SWF_F2, &spw_ioctl_send_SWF );
234 236 }
235 237 else {
236 238 send_waveform_SWF( &headerSWF, wf_snap_f2, SID_NORM_SWF_F2, &spw_ioctl_send_SWF );
237 239 }
238 240 }
239 241 break;
240 242 default:
241 243 break;
242 244 }
243 245 }
244 246 }
245 247 }
246 248 }
247 249
248 250 //******************
249 251 // general functions
250 252 void init_waveforms( void )
251 253 {
252 254 int i = 0;
253 255
254 256 for (i=0; i< NB_SAMPLES_PER_SNAPSHOT; i++)
255 257 {
256 258 //***
257 259 // F0
258 260 wf_snap_f0[ (i* NB_WORDS_SWF_BLK) + 0 + TIME_OFFSET ] = 0x88887777; //
259 261 wf_snap_f0[ (i* NB_WORDS_SWF_BLK) + 1 + TIME_OFFSET ] = 0x22221111; //
260 262 wf_snap_f0[ (i* NB_WORDS_SWF_BLK) + 2 + TIME_OFFSET ] = 0x44443333; //
261 263
262 264 //***
263 265 // F1
264 266 wf_snap_f1[ (i* NB_WORDS_SWF_BLK) + 0 + TIME_OFFSET ] = 0x22221111;
265 267 wf_snap_f1[ (i* NB_WORDS_SWF_BLK) + 1 + TIME_OFFSET ] = 0x44443333;
266 268 wf_snap_f1[ (i* NB_WORDS_SWF_BLK) + 2 + TIME_OFFSET ] = 0xaaaa0000;
267 269
268 270 //***
269 271 // F2
270 272 wf_snap_f2[ (i* NB_WORDS_SWF_BLK) + 0 + TIME_OFFSET ] = 0x44443333;
271 273 wf_snap_f2[ (i* NB_WORDS_SWF_BLK) + 1 + TIME_OFFSET ] = 0x22221111;
272 274 wf_snap_f2[ (i* NB_WORDS_SWF_BLK) + 2 + TIME_OFFSET ] = 0xaaaa0000;
273 275
274 276 //***
275 277 // F3
276 278 //wf_cont_f3[ (i* NB_WORDS_SWF_BLK) + 0 ] = val1;
277 279 //wf_cont_f3[ (i* NB_WORDS_SWF_BLK) + 1 ] = val2;
278 280 //wf_cont_f3[ (i* NB_WORDS_SWF_BLK) + 2 ] = 0xaaaa0000;
279 281 }
280 282 }
281 283
282 284 void init_header_snapshot_wf( Header_TM_LFR_SCIENCE_SWF_t *header)
283 285 {
284 286 header->targetLogicalAddress = CCSDS_DESTINATION_ID;
285 287 header->protocolIdentifier = CCSDS_PROTOCOLE_ID;
286 288 header->reserved = 0x00;
287 289 header->userApplication = CCSDS_USER_APP;
288 290 header->packetID[0] = (unsigned char) (TM_PACKET_ID_SCIENCE_NORMAL >> 8);
289 291 header->packetID[1] = (unsigned char) (TM_PACKET_ID_SCIENCE_NORMAL);
290 292 header->packetSequenceControl[0] = 0xc0;
291 293 header->packetSequenceControl[1] = 0x00;
292 294 header->packetLength[0] = 0x00;
293 295 header->packetLength[1] = 0x00;
294 296 // DATA FIELD HEADER
295 297 header->spare1_pusVersion_spare2 = 0x10;
296 298 header->serviceType = TM_TYPE_LFR_SCIENCE; // service type
297 299 header->serviceSubType = TM_SUBTYPE_LFR_SCIENCE; // service subtype
298 300 header->destinationID = TM_DESTINATION_ID_GROUND;
299 301 // AUXILIARY DATA HEADER
300 302 header->sid = 0x00;
301 303 header->hkBIA = 0x1f;
302 304 header->pktCnt = 0x07; // PKT_CNT
303 305 header->pktNr = 0x00; // PKT_NR
304 306 header->time[0] = 0x00;
305 307 header->time[0] = 0x00;
306 308 header->time[0] = 0x00;
307 309 header->time[0] = 0x00;
308 310 header->time[0] = 0x00;
309 311 header->time[0] = 0x00;
310 312 header->blkNr[0] = 0x00; // BLK_NR MSB
311 313 header->blkNr[1] = 0x00; // BLK_NR LSB
312 314 }
313 315
314 316 void init_header_continuous_wf( Header_TM_LFR_SCIENCE_CWF_t *header)
315 317 {
316 318 header->targetLogicalAddress = CCSDS_DESTINATION_ID;
317 319 header->protocolIdentifier = CCSDS_PROTOCOLE_ID;
318 320 header->reserved = 0x00;
319 321 header->userApplication = CCSDS_USER_APP;
320 322 header->packetID[0] = 0x00;
321 323 header->packetID[1] = 0x00;
322 324 header->packetSequenceControl[0] = 0xc0;
323 325 header->packetSequenceControl[1] = 0x00;
324 326 header->packetLength[0] = 0x00;
325 327 header->packetLength[1] = 0x00;
326 328 // DATA FIELD HEADER
327 329 header->spare1_pusVersion_spare2 = 0x10;
328 330 header->serviceType = TM_TYPE_LFR_SCIENCE; // service type
329 331 header->serviceSubType = TM_SUBTYPE_LFR_SCIENCE; // service subtype
330 332 header->destinationID = TM_DESTINATION_ID_GROUND;
331 333 // AUXILIARY DATA HEADER
332 334 header->sid = 0x00;
333 335 header->hkBIA = 0x1f;
334 336 header->time[0] = 0x00;
335 337 header->time[0] = 0x00;
336 338 header->time[0] = 0x00;
337 339 header->time[0] = 0x00;
338 340 header->time[0] = 0x00;
339 341 header->time[0] = 0x00;
340 342 header->blkNr[0] = 0x00; // BLK_NR MSB
341 343 header->blkNr[1] = 0x00; // BLK_NR LSB
342 344 }
343 345
344 346 void reset_waveforms( void )
345 347 {
346 348 int i = 0;
347 349
348 350 for (i=0; i< NB_SAMPLES_PER_SNAPSHOT; i++)
349 351 {
350 352 wf_snap_f0[ (i* NB_WORDS_SWF_BLK) + 0 + TIME_OFFSET] = 0x10002000;
351 353 wf_snap_f0[ (i* NB_WORDS_SWF_BLK) + 1 + TIME_OFFSET] = 0x20001000;
352 354 wf_snap_f0[ (i* NB_WORDS_SWF_BLK) + 2 + TIME_OFFSET] = 0x40008000;
353 355
354 356 //***
355 357 // F1
356 358 wf_snap_f1[ (i* NB_WORDS_SWF_BLK) + 0 + TIME_OFFSET] = 0x1000f000;
357 359 wf_snap_f1[ (i* NB_WORDS_SWF_BLK) + 1 + TIME_OFFSET] = 0xf0001000;
358 360 wf_snap_f1[ (i* NB_WORDS_SWF_BLK) + 2 + TIME_OFFSET] = 0x40008000;
359 361
360 362 //***
361 363 // F2
362 364 wf_snap_f2[ (i* NB_WORDS_SWF_BLK) + 0 + TIME_OFFSET] = 0x40008000;
363 365 wf_snap_f2[ (i* NB_WORDS_SWF_BLK) + 1 + TIME_OFFSET] = 0x20001000;
364 366 wf_snap_f2[ (i* NB_WORDS_SWF_BLK) + 2 + TIME_OFFSET] = 0x10002000;
365 367
366 368 //***
367 369 // F3
368 370 /*wf_cont_f3[ i* NB_WORDS_SWF_BLK + 0 ] = build_value( i, i ); // v and 1
369 371 wf_cont_f3[ i* NB_WORDS_SWF_BLK + 1 ] = build_value( i, i ); // e2 and b1
370 372 wf_cont_f3[ i* NB_WORDS_SWF_BLK + 2 ] = build_value( i, i ); // b2 and b3*/
371 373 }
372 374 }
373 375
374 376 void send_waveform_SWF( Header_TM_LFR_SCIENCE_SWF_t *header, volatile int *waveform,
375 377 unsigned int sid, spw_ioctl_pkt_send *spw_ioctl_send)
376 378 {
377 379 unsigned int i = 0;
378 380 unsigned int length = 0;
379 381 rtems_status_code status;
380 382
381 383 header->sid = (unsigned char) sid;
382 384
383 385 for (i=0; i<7; i++) // send waveform
384 386 {
385 387 header->pktNr = (unsigned char) i+1; // PKT_NR
386 388 // BUILD THE DATA
387 389 if (i==6) {
388 390 spw_ioctl_send->dlen = 8 * NB_BYTES_SWF_BLK;
389 391 length = TM_LEN_SCI_SWF_8;
390 392 header->blkNr[0] = 0x00; // BLK_NR MSB
391 393 header->blkNr[1] = 0x08; // BLK_NR LSB
392 394 }
393 395 else {
394 396 spw_ioctl_send->dlen = 340 * NB_BYTES_SWF_BLK;
395 397 length = TM_LEN_SCI_SWF_340;
396 398 header->blkNr[0] = 0x01; // BLK_NR MSB
397 399 header->blkNr[1] = 0x54; // BLK_NR LSB
398 400 }
399 401 spw_ioctl_send->data = (char*) &waveform[ (i * 340 * NB_WORDS_SWF_BLK) ];
400 402 // BUILD THE HEADER
401 403 header->packetLength[0] = (unsigned char) (length>>8);
402 404 header->packetLength[1] = (unsigned char) (length);
403 405 header->sid = (unsigned char) sid; // SID
404 406 // SET PACKET TIME
405 407 header->time[0] = (unsigned char) (time_management_regs->coarse_time>>24);
406 408 header->time[1] = (unsigned char) (time_management_regs->coarse_time>>16);
407 409 header->time[2] = (unsigned char) (time_management_regs->coarse_time>>8);
408 410 header->time[3] = (unsigned char) (time_management_regs->coarse_time);
409 411 header->time[4] = (unsigned char) (time_management_regs->fine_time>>8);
410 412 header->time[5] = (unsigned char) (time_management_regs->fine_time);
411 413 header->acquisitionTime[0] = (unsigned char) (time_management_regs->coarse_time>>24);
412 414 header->acquisitionTime[1] = (unsigned char) (time_management_regs->coarse_time>>16);
413 415 header->acquisitionTime[2] = (unsigned char) (time_management_regs->coarse_time>>8);
414 416 header->acquisitionTime[3] = (unsigned char) (time_management_regs->coarse_time);
415 417 header->acquisitionTime[4] = (unsigned char) (time_management_regs->fine_time>>8);
416 418 header->acquisitionTime[5] = (unsigned char) (time_management_regs->fine_time);
417 419 // SEND PACKET
418 420 status = write_spw(spw_ioctl_send);
419 421 if (status != RTEMS_SUCCESSFUL) {
420 422 while (true) {
421 423 if (status != RTEMS_SUCCESSFUL) {
422 424 status = write_spw(spw_ioctl_send);
423 425 //PRINTF1("%d", i)
424 426 sched_yield();
425 427 }
426 428 else {
427 429 //PRINTF("\n")
428 430 break;
429 431 }
430 432 }
431 433 }
432 434 }
433 435 }
434 436
435 437 void send_waveform_CWF( Header_TM_LFR_SCIENCE_CWF_t *header, volatile int *waveform,
436 438 unsigned int sid, spw_ioctl_pkt_send *spw_ioctl_send)
437 439 {
438 440 unsigned int i = 0;
439 441 unsigned int length = 0;
440 442 rtems_status_code status;
441 443
442 444 header->sid = (unsigned char) sid;
443 445
444 446 for (i=0; i<7; i++) // send waveform
445 447 {
446 448 // BUILD THE DATA
447 449 if (i==6) {
448 450 spw_ioctl_send->dlen = 8 * NB_BYTES_SWF_BLK;
449 451 length = TM_LEN_SCI_CWF_8;
450 452 header->blkNr[0] = 0x00; // BLK_NR MSB
451 453 header->blkNr[1] = 0x08; // BLK_NR LSB
452 454 }
453 455 else {
454 456 spw_ioctl_send->dlen = 340 * NB_BYTES_SWF_BLK;
455 457 length = TM_LEN_SCI_CWF_340;
456 458 header->blkNr[0] = 0x01; // BLK_NR MSB
457 459 header->blkNr[1] = 0x54; // BLK_NR LSB
458 460 }
459 461 spw_ioctl_send->data = (char*) &waveform[ (i * 340 * NB_WORDS_SWF_BLK) ];
460 462 // BUILD THE HEADER
461 463 header->packetLength[0] = (unsigned char) (length>>8);
462 464 header->packetLength[1] = (unsigned char) (length);
463 465 // SET PACKET TIME
464 466 header->time[0] = (unsigned char) (time_management_regs->coarse_time>>24);
465 467 header->time[1] = (unsigned char) (time_management_regs->coarse_time>>16);
466 468 header->time[2] = (unsigned char) (time_management_regs->coarse_time>>8);
467 469 header->time[3] = (unsigned char) (time_management_regs->coarse_time);
468 470 header->time[4] = (unsigned char) (time_management_regs->fine_time>>8);
469 471 header->time[5] = (unsigned char) (time_management_regs->fine_time);
470 472 header->acquisitionTime[0] = (unsigned char) (time_management_regs->coarse_time>>24);
471 473 header->acquisitionTime[1] = (unsigned char) (time_management_regs->coarse_time>>16);
472 474 header->acquisitionTime[2] = (unsigned char) (time_management_regs->coarse_time>>8);
473 475 header->acquisitionTime[3] = (unsigned char) (time_management_regs->coarse_time);
474 476 header->acquisitionTime[4] = (unsigned char) (time_management_regs->fine_time>>8);
475 477 header->acquisitionTime[5] = (unsigned char) (time_management_regs->fine_time);
476 478 // SEND PACKET
477 479 status = write_spw(spw_ioctl_send);
478 480 if (status != RTEMS_SUCCESSFUL) {
479 481 while (true) {
480 482 if (status != RTEMS_SUCCESSFUL) {
481 483 status = write_spw(spw_ioctl_send);
482 484 //PRINTF1("%d", i)
483 485 sched_yield();
484 486 }
485 487 else {
486 488 //PRINTF("\n")
487 489 break;
488 490 }
489 491 }
490 492 }
491 493 }
492 494 }
493 495
494 496 int build_value(int value1, int value0)
495 497 {
496 498 int aux = 0;
497 499 int aux1 = 0;
498 500 int aux0 = 0;
499 501 int value1_aux = 0;
500 502 int value0_aux = 0;
501 503
502 504 value1_aux = value1;
503 505 value0_aux = value0;
504 506
505 507 //******
506 508 // B3 B2
507 509 if (value1_aux > 8191) value1_aux = 8191;
508 510 if (value1_aux < -8192) value1_aux = -8192;
509 511 aux1 = ( (int) ( ( (unsigned char) (value1_aux / 256 ) ) << 8 ) )
510 512 + ( (int) ( (unsigned char) (value1_aux ) ) );
511 513
512 514 //******
513 515 // B1 B0
514 516 if (value0_aux > 8191) value0_aux = 8191;
515 517 if (value0_aux < -8192) value0_aux = -8192;
516 518 aux0 = ( (int) ( ( (unsigned char) (value0_aux / 256) ) << 8 ) )
517 519 + ( (int) ( (unsigned char) (value0_aux ) ) );
518 520
519 521 aux = (aux1 << 16) + aux0;
520 522
521 523 return aux;
522 524 }
523 525
524 526 void send_waveform_norm(Header_TM_LFR_SCIENCE_SWF_t *header, spw_ioctl_pkt_send *spw_ioctl_send)
525 527 {
526 528 unsigned char lfrMode;
527 529 lfrMode = (housekeeping_packet.lfr_status_word[0] & 0xf0) >> 4;
528 530
529 531 header->packetID[0] = (unsigned char) (TM_PACKET_ID_SCIENCE_NORMAL >> 8);
530 532 header->packetID[1] = (unsigned char) (TM_PACKET_ID_SCIENCE_NORMAL);
531 533 // TIME
532 534 header->time[0] = (unsigned char) (time_management_regs->coarse_time>>24);
533 535 header->time[1] = (unsigned char) (time_management_regs->coarse_time>>16);
534 536 header->time[2] = (unsigned char) (time_management_regs->coarse_time>>8);
535 537 header->time[3] = (unsigned char) (time_management_regs->coarse_time);
536 538 header->time[4] = (unsigned char) (time_management_regs->fine_time>>8);
537 539 header->time[5] = (unsigned char) (time_management_regs->fine_time);
538 540
539 541 //***************
540 542 // send snapshots
541 543 // F0
542 544 send_waveform_SWF( header, wf_snap_f0, SID_NORM_SWF_F0, spw_ioctl_send);
543 545 // F1
544 546 if (lfrMode == LFR_MODE_NORMAL) // in SBM1 mode, the snapshot is sent by the send_waveform_sbm1 function
545 547 {
546 548 send_waveform_SWF( header, wf_snap_f1, SID_NORM_SWF_F1, spw_ioctl_send);
547 549 }
548 550 // F2
549 551 send_waveform_SWF( header, wf_snap_f2, SID_NORM_SWF_F2, spw_ioctl_send);
550 552 #ifdef GSA
551 553 // irq processed, reset the related register of the timer unit
552 gptimer_regs->timer[2].ctrl = gptimer_regs->timer[2].ctrl | 0x00000010;
554 gptimer_regs->timer[TIMER_WF_SIMULATOR].ctrl = gptimer_regs->timer[TIMER_WF_SIMULATOR].ctrl | 0x00000010;
555 // clear the interruption
556 LEON_Clear_interrupt(IRQ_WF);
553 557 #else
554 558 // irq processed, reset the related register of the waveform picker
555 559 if (lfrMode == LFR_MODE_SBM1) {
556 560 param_local.local_sbm1_nb_cwf_sent = 0;
557 561 // after the first transmission of the swf at F1, the period is set to local_sbm1_nb_cwf_max
558 562 param_local.local_sbm1_nb_cwf_max = 2 * (
559 563 ( parameter_dump_packet.sy_lfr_n_swf_p[0] * 256 )
560 564 + parameter_dump_packet.sy_lfr_n_swf_p[1]
561 565 );
562 566 }
563 567 else if (lfrMode == LFR_MODE_SBM2) {
564 568 param_local.local_sbm2_nb_cwf_sent = 0;
565 569 // after the first transmission of the swf at F2, the period is set to local_sbm2_nb_cwf_max
566 570 param_local.local_sbm2_nb_cwf_max = (
567 571 ( parameter_dump_packet.sy_lfr_n_swf_p[0] * 256 )
568 572 + parameter_dump_packet.sy_lfr_n_swf_p[1]
569 573 )/ 8;
570 574 }
571 575 else {
572 576 waveform_picker_regs->status = waveform_picker_regs->status & 0x00;
573 577 waveform_picker_regs->burst_enable = 0x07; // [0111] enable f2 f1 f0
574 578 }
575 579
576 580 #endif
577 581 }
578 582
579 583 void send_waveform_burst(Header_TM_LFR_SCIENCE_CWF_t *header, spw_ioctl_pkt_send *spw_ioctl_send)
580 584 {
581 585 header->packetID[0] = (unsigned char) (TM_PACKET_ID_SCIENCE_BURST_SBM1_SBM2 >> 8);
582 586 header->packetID[1] = (unsigned char) (TM_PACKET_ID_SCIENCE_BURST_SBM1_SBM2);
583 587 // TIME
584 588 header->time[0] = (unsigned char) (time_management_regs->coarse_time>>24);
585 589 header->time[1] = (unsigned char) (time_management_regs->coarse_time>>16);
586 590 header->time[2] = (unsigned char) (time_management_regs->coarse_time>>8);
587 591 header->time[3] = (unsigned char) (time_management_regs->coarse_time);
588 592 header->time[4] = (unsigned char) (time_management_regs->fine_time>>8);
589 593 header->time[5] = (unsigned char) (time_management_regs->fine_time);
590 594 // ACQUISITION TIME
591 595
592 596 // F2
593 597 if (waveform_picker_regs->addr_data_f2 == (int) wf_snap_f2) {
594 598 send_waveform_CWF( header, wf_snap_f2_bis, SID_BURST_CWF_F2, spw_ioctl_send);
595 599 }
596 600 else {
597 601 send_waveform_CWF( header, wf_snap_f2, SID_BURST_CWF_F2, spw_ioctl_send);
598 602 }
599 603 }
600 604
601 605 void send_waveform_sbm1(Header_TM_LFR_SCIENCE_CWF_t *header, spw_ioctl_pkt_send *spw_ioctl_send)
602 606 {
603 607 header->packetID[0] = (unsigned char) (TM_PACKET_ID_SCIENCE_BURST_SBM1_SBM2 >> 8);
604 608 header->packetID[1] = (unsigned char) (TM_PACKET_ID_SCIENCE_BURST_SBM1_SBM2);
605 609 // TIME
606 610 header->time[0] = (unsigned char) (time_management_regs->coarse_time>>24);
607 611 header->time[1] = (unsigned char) (time_management_regs->coarse_time>>16);
608 612 header->time[2] = (unsigned char) (time_management_regs->coarse_time>>8);
609 613 header->time[3] = (unsigned char) (time_management_regs->coarse_time);
610 614 header->time[4] = (unsigned char) (time_management_regs->fine_time>>8);
611 615 header->time[5] = (unsigned char) (time_management_regs->fine_time);
612 616
613 617 // F1
614 618 if (waveform_picker_regs->addr_data_f1 == (int) wf_snap_f1) {
615 619 send_waveform_CWF( header, wf_snap_f1_bis, SID_SBM1_CWF_F1, spw_ioctl_send );
616 620 }
617 621 else {
618 622 send_waveform_CWF( header, wf_snap_f1, SID_SBM1_CWF_F1, spw_ioctl_send );
619 623 }
620 624 }
621 625
622 626 void send_waveform_sbm2(Header_TM_LFR_SCIENCE_CWF_t *header, spw_ioctl_pkt_send *spw_ioctl_send)
623 627 {
624 628 header->packetID[0] = (unsigned char) (TM_PACKET_ID_SCIENCE_BURST_SBM1_SBM2 >> 8);
625 629 header->packetID[1] = (unsigned char) (TM_PACKET_ID_SCIENCE_BURST_SBM1_SBM2);
626 630 // TIME
627 631 header->time[0] = (unsigned char) (time_management_regs->coarse_time>>24);
628 632 header->time[1] = (unsigned char) (time_management_regs->coarse_time>>16);
629 633 header->time[2] = (unsigned char) (time_management_regs->coarse_time>>8);
630 634 header->time[3] = (unsigned char) (time_management_regs->coarse_time);
631 635 header->time[4] = (unsigned char) (time_management_regs->fine_time>>8);
632 636 header->time[5] = (unsigned char) (time_management_regs->fine_time);
633 637
634 638 // F2
635 639 if (waveform_picker_regs->addr_data_f2 == (int) wf_snap_f2) {
636 640 send_waveform_CWF( header, wf_snap_f2_bis, SID_SBM2_CWF_F2, spw_ioctl_send);
637 641 }
638 642 else {
639 643 send_waveform_CWF( header, wf_snap_f2, SID_SBM2_CWF_F2, spw_ioctl_send);
640 644 }
641 645 }
642 646
643 647 //**************
644 648 // wfp registers
645 649 void set_wfp_data_shaping(unsigned char data_shaping)
646 650 {
647 651 // get the parameters for the data shaping [BW SP0 SP1 R0 R1] in sy_lfr_common1 and configure the register
648 652 // waveform picker : [R1 R0 SP1 SP0 BW]
649 653 waveform_picker_regs->data_shaping =
650 654 ( (data_shaping & 0x10) >> 4 ) // BW
651 655 + ( (data_shaping & 0x08) >> 2 ) // SP0
652 656 + ( (data_shaping & 0x04) ) // SP1
653 657 + ( (data_shaping & 0x02) << 2 ) // R0
654 658 + ( (data_shaping & 0x01) << 4 ); // R1
655 659 }
656 660
657 661 void set_wfp_delta_snapshot(unsigned int delta_snapshot)
658 662 {
659 663 unsigned char aux = 0;
660 664 aux = delta_snapshot / 2 ;
661 665 waveform_picker_regs->delta_snapshot = aux; // max 2 bytes
662 666 //waveform_picker_regs->delta_snapshot = 0x5; // max 2 bytes
663 667 }
664 668
665 669 void reset_wfp_burst_enable()
666 670 {
667 671 waveform_picker_regs->burst_enable = 0x00; // burst f2, f1, f0 enable f3, f2, f1, f0
668 672 }
669 673
670 674 void reset_wfp_regs()
671 675 {
672 676 set_wfp_data_shaping(parameter_dump_packet.bw_sp0_sp1_r0_r1);
673 677 reset_wfp_burst_enable();
674 678 waveform_picker_regs->addr_data_f0 = (int) (wf_snap_f0); //
675 679 waveform_picker_regs->addr_data_f1 = (int) (wf_snap_f1); //
676 680 waveform_picker_regs->addr_data_f2 = (int) (wf_snap_f2); //
677 681 waveform_picker_regs->addr_data_f3 = (int) (wf_cont_f3); //
678 682 waveform_picker_regs->status = 0x00; //
679 683 set_wfp_delta_snapshot(
680 684 ( parameter_dump_packet.sy_lfr_n_swf_p[0]*256)
681 685 + parameter_dump_packet.sy_lfr_n_swf_p[1] ); // time in seconds between two snapshots
682 686 waveform_picker_regs->delta_f2_f1 = 0xffff; // max 4 bytes
683 687 waveform_picker_regs->delta_f2_f0 = 0x17c00; // max 5 bytes
684 688 waveform_picker_regs->nb_burst_available = 0x180; // max 3 bytes, size of the buffer in burst (1 burst = 16 x 4 octets)
685 689 waveform_picker_regs->nb_snapshot_param = 0x7ff; // max 3 octets, 2048 - 1
686 690 //waveform_picker_regs->delta_snapshot = 0x2; // max 2 bytes, = period / 2
687 691 //waveform_picker_regs->delta_f2_f1 = 0x2d00; // max 4 bytes
688 692 //waveform_picker_regs->delta_f2_f0 = 0x2f80; // max 5 bytes
689 693 //waveform_picker_regs->nb_burst_available = 0x30; // max 3 bytes, size of the buffer in burst (1 burst = 16 x 4 octets)
690 694 //waveform_picker_regs->nb_snapshot_param = 0xff; // max 3 octets, 256 - 1
691 695 }
General Comments 0
You need to be logged in to leave comments. Login now