##// END OF EJS Templates
packet emission task added...
paul -
r33:1280850c4074 default
parent child
Show More
@@ -1,6 +1,6
1 1 #############################################################################
2 2 # Makefile for building: bin/fsw
3 # Generated by qmake (2.01a) (Qt 4.8.4) on: Thu Aug 1 15:31:06 2013
3 # Generated by qmake (2.01a) (Qt 4.8.5) on: Mon Sep 30 15:28:56 2013
4 4 # Project: fsw-qt.pro
5 5 # Template: app
6 6 # Command: /usr/bin/qmake-qt4 -spec /usr/lib64/qt4/mkspecs/linux-g++ -o Makefile fsw-qt.pro
@@ -10,7 +10,7
10 10
11 11 CC = sparc-rtems-gcc
12 12 CXX = sparc-rtems-g++
13 DEFINES = -DSW_VERSION_N1=0 -DSW_VERSION_N2=0 -DSW_VERSION_N3=0 -DSW_VERSION_N4=12 -DPRINT_MESSAGES_ON_CONSOLE
13 DEFINES = -DSW_VERSION_N1=0 -DSW_VERSION_N2=0 -DSW_VERSION_N3=0 -DSW_VERSION_N4=13 -DPRINT_MESSAGES_ON_CONSOLE
14 14 CFLAGS = -pipe -O3 -Wall $(DEFINES)
15 15 CXXFLAGS = -pipe -O3 -Wall $(DEFINES)
16 16 INCPATH = -I/usr/lib64/qt4/mkspecs/linux-g++ -I. -I../src -I../header
@@ -48,13 +48,15 SOURCES = ../src/wf_handler.c \
48 48 ../src/fsw_processing.c \
49 49 ../src/fsw_misc.c \
50 50 ../src/fsw_init.c \
51 ../src/fsw_globals.c
51 ../src/fsw_globals.c \
52 ../src/fsw_spacewire.c
52 53 OBJECTS = obj/wf_handler.o \
53 54 obj/tc_handler.o \
54 55 obj/fsw_processing.o \
55 56 obj/fsw_misc.o \
56 57 obj/fsw_init.o \
57 obj/fsw_globals.o
58 obj/fsw_globals.o \
59 obj/fsw_spacewire.o
58 60 DIST = /usr/lib64/qt4/mkspecs/common/unix.conf \
59 61 /usr/lib64/qt4/mkspecs/common/linux.conf \
60 62 /usr/lib64/qt4/mkspecs/common/gcc-base.conf \
@@ -70,6 +72,7 DIST = /usr/lib64/qt4/mkspecs/c
70 72 sparc.pri \
71 73 /usr/lib64/qt4/mkspecs/features/release.prf \
72 74 /usr/lib64/qt4/mkspecs/features/default_post.prf \
75 /usr/lib64/qt4/mkspecs/features/shared.prf \
73 76 /usr/lib64/qt4/mkspecs/features/unix/gdb_dwarf_index.prf \
74 77 /usr/lib64/qt4/mkspecs/features/warn_on.prf \
75 78 /usr/lib64/qt4/mkspecs/features/resources.prf \
@@ -125,6 +128,7 Makefile: fsw-qt.pro /usr/lib64/qt4/mks
125 128 sparc.pri \
126 129 /usr/lib64/qt4/mkspecs/features/release.prf \
127 130 /usr/lib64/qt4/mkspecs/features/default_post.prf \
131 /usr/lib64/qt4/mkspecs/features/shared.prf \
128 132 /usr/lib64/qt4/mkspecs/features/unix/gdb_dwarf_index.prf \
129 133 /usr/lib64/qt4/mkspecs/features/warn_on.prf \
130 134 /usr/lib64/qt4/mkspecs/features/resources.prf \
@@ -148,6 +152,7 Makefile: fsw-qt.pro /usr/lib64/qt4/mks
148 152 sparc.pri:
149 153 /usr/lib64/qt4/mkspecs/features/release.prf:
150 154 /usr/lib64/qt4/mkspecs/features/default_post.prf:
155 /usr/lib64/qt4/mkspecs/features/shared.prf:
151 156 /usr/lib64/qt4/mkspecs/features/unix/gdb_dwarf_index.prf:
152 157 /usr/lib64/qt4/mkspecs/features/warn_on.prf:
153 158 /usr/lib64/qt4/mkspecs/features/resources.prf:
@@ -215,6 +220,9 obj/fsw_init.o: ../src/fsw_init.c
215 220 obj/fsw_globals.o: ../src/fsw_globals.c
216 221 $(CC) -c $(CFLAGS) $(INCPATH) -o obj/fsw_globals.o ../src/fsw_globals.c
217 222
223 obj/fsw_spacewire.o: ../src/fsw_spacewire.c
224 $(CC) -c $(CFLAGS) $(INCPATH) -o obj/fsw_spacewire.o ../src/fsw_spacewire.c
225
218 226 ####### Install
219 227
220 228 install: FORCE
1 NO CONTENT: modified file, binary diff hidden
@@ -7,11 +7,11 CONFIG -= qt
7 7 include(./sparc.pri)
8 8
9 9 # flight software version
10 SWVERSION=-0-12
10 SWVERSION=-0-13
11 11 DEFINES += SW_VERSION_N1=0
12 12 DEFINES += SW_VERSION_N2=0
13 13 DEFINES += SW_VERSION_N3=0
14 DEFINES += SW_VERSION_N4=12
14 DEFINES += SW_VERSION_N4=13
15 15
16 16 contains( CONFIG, verbose ) {
17 17 DEFINES += PRINT_MESSAGES_ON_CONSOLE
@@ -37,7 +37,8 SOURCES += \
37 37 ../src/fsw_processing.c \
38 38 ../src/fsw_misc.c \
39 39 ../src/fsw_init.c \
40 ../src/fsw_globals.c
40 ../src/fsw_globals.c \
41 ../src/fsw_spacewire.c
41 42
42 43 HEADERS += \
43 44 ../header/wf_handler.h \
@@ -48,5 +49,6 HEADERS += \
48 49 ../header/fsw_misc.h \
49 50 ../header/fsw_init.h \
50 51 ../header/ccsds_types.h \
51 ../header/fsw_params_processing.h
52 ../header/fsw_params_processing.h \
53 ../header/fsw_spacewire.h
52 54
@@ -1,6 +1,6
1 1 <?xml version="1.0" encoding="UTF-8"?>
2 2 <!DOCTYPE QtCreatorProject>
3 <!-- Written by QtCreator 2.8.0, 2013-08-01T13:38:09. -->
3 <!-- Written by QtCreator 2.8.0, 2013-10-01T07:01:25. -->
4 4 <qtcreator>
5 5 <data>
6 6 <variable>ProjectExplorer.Project.ActiveTarget</variable>
@@ -3,35 +3,61
3 3
4 4 #include <ccsds_types.h>
5 5
6 #define PROTOCOLE_IDENTIFIER 0x02
7
6 8 // PACKET ID
7 9 #define TC_LFR_PACKET_ID 0x1ccc // PID 76 CAT 12
8 10
9 #define PACKET_LENGTH_TC_LFR_LOAD_COMMON_PAR (14 - CCSDS_TC_TM_PACKET_OFFSET)
10 #define PACKET_LENGTH_TC_LFR_LOAD_NORMAL_PAR (20 - CCSDS_TC_TM_PACKET_OFFSET)
11 #define PACKET_LENGTH_TC_LFR_LOAD_BURST_PAR (14 - CCSDS_TC_TM_PACKET_OFFSET)
12 #define PACKET_LENGTH_TC_LFR_LOAD_SBM1_PAR (14 - CCSDS_TC_TM_PACKET_OFFSET)
13 #define PACKET_LENGTH_TC_LFR_LOAD_SBM2_PAR (14 - CCSDS_TC_TM_PACKET_OFFSET)
14 #define PACKET_LENGTH_TC_LFR_DUMP_PAR (12 - CCSDS_TC_TM_PACKET_OFFSET)
15 #define PACKET_LENGTH_TC_LFR_ENTER_MODE (20 - CCSDS_TC_TM_PACKET_OFFSET)
11 #define PACKET_LENGTH_TC_LFR_RESET (12 - CCSDS_TC_TM_PACKET_OFFSET)
12 #define PACKET_LENGTH_TC_LFR_LOAD_COMMON_PAR (14 - CCSDS_TC_TM_PACKET_OFFSET)
13 #define PACKET_LENGTH_TC_LFR_LOAD_NORMAL_PAR (20 - CCSDS_TC_TM_PACKET_OFFSET)
14 #define PACKET_LENGTH_TC_LFR_LOAD_BURST_PAR (14 - CCSDS_TC_TM_PACKET_OFFSET)
15 #define PACKET_LENGTH_TC_LFR_LOAD_SBM1_PAR (14 - CCSDS_TC_TM_PACKET_OFFSET)
16 #define PACKET_LENGTH_TC_LFR_LOAD_SBM2_PAR (14 - CCSDS_TC_TM_PACKET_OFFSET)
17 #define PACKET_LENGTH_TC_LFR_DUMP_PAR (12 - CCSDS_TC_TM_PACKET_OFFSET)
18 #define PACKET_LENGTH_TC_LFR_ENTER_MODE (20 - CCSDS_TC_TM_PACKET_OFFSET)
19 #define PACKET_LENGTH_TC_LFR_UPDATE_INFO (48 - CCSDS_TC_TM_PACKET_OFFSET)
20 #define PACKET_LENGTH_TC_LFR_ENABLE_CALIBRATION (12 - CCSDS_TC_TM_PACKET_OFFSET)
21 #define PACKET_LENGTH_TC_LFR_DISABLE_CALIBRATION (12 - CCSDS_TC_TM_PACKET_OFFSET)
22 #define PACKET_LENGTH_TC_LFR_UPDATE_TIME (18 - CCSDS_TC_TM_PACKET_OFFSET)
16 23
17 24 // TC TYPES
18 25 #define TC_TYPE_DEFAULT 181
19 26 #define TC_TYPE_LFR_UPDATE_TIME 9
20 27
21 28 // TC SUBTYPES
22 #define TC_SUBTYPE_LOAD_COMMON_PAR 11
23 #define TC_SUBTYPE_LOAD_NORMAL_PAR 13
24 #define TC_SUBTYPE_LOAD_BURST_PAR 19
25 #define TC_SUBTYPE_LOAD_SBM1_PAR 25
26 #define TC_SUBTYPE_LOAD_SBM2_PAR 27
27 #define TC_SUBTYPE_DUMP_PAR 31
28 #define TC_SUBTYPE_ENTER_MODE 41
29 #define TC_SUBTYPE_RESET 1
30 #define TC_SUBTYPE_LOAD_COMMON_PAR 11
31 #define TC_SUBTYPE_LOAD_NORMAL_PAR 13
32 #define TC_SUBTYPE_LOAD_BURST_PAR 19
33 #define TC_SUBTYPE_LOAD_SBM1_PAR 25
34 #define TC_SUBTYPE_LOAD_SBM2_PAR 27
35 #define TC_SUBTYPE_DUMP_PAR 31
36 #define TC_SUBTYPE_ENTER_MODE 41
37 #define TC_SUBTYPE_UPDATE_INFO 51
38 #define TC_SUBTYPE_ENABLE_CALIBRATION 61
39 #define TC_SUBTYPE_DISABLE_CALIBRATION 63
40 #define TC_SUBTYPE_UPDATE_TIME 129
29 41
30 42 // OTHER CONSTANTS
31 43 #define TC_LFR_PACKET_SEQUENCE_CONTROL 0xc000 // PID 76 CAT 12
32 44 #define TC_LFR_DATA_FIELD_HEADER0 0x19
33 45 #define TC_LFR_LOAD_COMMON_PAR_SPARE 0x00
34 46
47 struct Packet_TC_LFR_RESET_str
48 { // the CCSDS header is added by LPPMON
49 unsigned char packetID[2];
50 unsigned char packetSequenceControl[2];
51 unsigned char packetLength[2];
52 // DATA FIELD HEADER
53 unsigned char ccsdsSecHeaderFlag_pusVersion_ack;
54 unsigned char serviceType;
55 unsigned char serviceSubType;
56 unsigned char sourceID;
57 unsigned char crc[2];
58 };
59 typedef struct Packet_TC_LFR_RESET_str Packet_TC_LFR_RESET_t;
60
35 61 struct Packet_TC_LFR_ENTER_MODE_str
36 62 { // the CCSDS header is added by LPPMON
37 63 unsigned char packetID[2];
@@ -49,6 +75,29 struct Packet_TC_LFR_ENTER_MODE_str
49 75 };
50 76 typedef struct Packet_TC_LFR_ENTER_MODE_str Packet_TC_LFR_ENTER_MODE_t;
51 77
78 struct Packet_TC_LFR_UPDATE_INFO_str
79 { // the CCSDS header is added by LPPMON
80 unsigned char packetID[2];
81 unsigned char packetSequenceControl[2];
82 unsigned char packetLength[2];
83 // DATA FIELD HEADER
84 unsigned char ccsdsSecHeaderFlag_pusVersion_ack;
85 unsigned char serviceType;
86 unsigned char serviceSubType;
87 unsigned char sourceID;
88 unsigned char set1;
89 unsigned char set2;
90 unsigned char set3_bias_setting_set1[6];
91 unsigned char set3_bias_setting_set2[6];
92 unsigned char set3_bias_voltage[4];
93 unsigned char set4[8];
94 unsigned char set5;
95 unsigned char set6;
96 unsigned char set7[8];
97 unsigned char crc[2];
98 };
99 typedef struct Packet_TC_LFR_UPDATE_INFO_str Packet_TC_LFR_UPDATE_INFO_t;
100
52 101 struct Packet_TC_LFR_DUMP_PAR_str
53 102 { // the CCSDS header is added by LPPMON
54 103 unsigned char packetID[2];
@@ -116,4 +165,33 struct Packet_TC_LFR_LOAD_BURST_SBM1_SBM
116 165 };
117 166 typedef struct Packet_TC_LFR_LOAD_BURST_SBM1_SBM2_PAR_str Packet_TC_LFR_LOAD_BURST_SBM1_SBM2_PAR_t;
118 167
168 struct Packet_TC_LFR_ENABLE_DISABLE_CALIBRATION_str
169 { // the CCSDS header is added by LPPMON
170 unsigned char packetID[2];
171 unsigned char packetSequenceControl[2];
172 unsigned char packetLength[2];
173 // DATA FIELD HEADER
174 unsigned char ccsdsSecHeaderFlag_pusVersion_ack;
175 unsigned char serviceType;
176 unsigned char serviceSubType;
177 unsigned char sourceID;
178 unsigned char crc[2];
179 };
180 typedef struct Packet_TC_LFR_ENABLE_DISABLE_CALIBRATION_str Packet_TC_LFR_ENABLE_DISABLE_CALIBRATION_t;
181
182 struct Packet_TC_LFR_UPDATE_TIME_str
183 { // the CCSDS header is added by LPPMON
184 unsigned char packetID[2];
185 unsigned char packetSequenceControl[2];
186 unsigned char packetLength[2];
187 // DATA FIELD HEADER
188 unsigned char ccsdsSecHeaderFlag_pusVersion_ack;
189 unsigned char serviceType;
190 unsigned char serviceSubType;
191 unsigned char sourceID;
192 unsigned char cp_rpw_time[6];
193 unsigned char crc[2];
194 };
195 typedef struct Packet_TC_LFR_UPDATE_TIME_str Packet_TC_LFR_UPDATE_TIME_t;
196
119 197 #endif // TC_TYPES_H
@@ -13,20 +13,31
13 13 #define CCSDS_NODE_ADDRESS 0xfe
14 14 #define CCSDS_USER_APP 0x00
15 15
16 #define DEFAULT_SPARE1_PUSVERSION_SPARE2 0x10
17 #define DEFAULT_RESERVED 0x00
18 #define DEFAULT_HKBIA 0x1f
19
16 20 // PACKET ID
17 #define TM_PACKET_ID_TC_EXE 0x0cc1 // PID 76 CAT 1
18 #define TM_PACKET_ID_HK 0x0cc4 // PID 76 CAT 4
19 #define TM_PACKET_ID_PARAMETER_DUMP 0x0cc9 // PID 76 CAT 9
20 #define TM_PACKET_ID_SCIENCE_NORMAL 0x0ccc // PID 76 CAT 12
21 #define TM_PACKET_ID_SCIENCE_BURST_SBM1_SBM2 0x0cfc // PID 79 CAT 12
21 #define TM_PACKET_ID_TC_EXE 0x0cc1 // PID 76 CAT 1
22 #define TM_PACKET_ID_HK 0x0cc4 // PID 76 CAT 4
23 #define TM_PACKET_ID_PARAMETER_DUMP 0x0cc9 // PID 76 CAT 9
24 #define TM_PACKET_ID_SCIENCE_NORMAL 0x0ccc // PID 76 CAT 12
25 #define TM_PACKET_ID_SCIENCE_BURST_SBM1_SBM2 0x0cfc // PID 79 CAT 12
26 #define TM_PACKET_PID_DEFAULT 76
27 #define TM_PACKET_PID_BURST_SBM1_SBM2 79
28 #define TM_PACKET_CAT_TC_EXE 1
29 #define TM_PACKET_CAT_HK 4
30 #define TM_PACKET_CAT_PARAMETER_DUMP 9
31 #define TM_PACKET_CAT_SCIENCE 12
22 32
23 33 // PACKET SEQUENCE CONTROL
24 #define TM_PACKET_SEQ_CTRL_CONTINUATION 0
25 #define TM_PACKET_SEQ_CTRL_FIRST 1
26 #define TM_PACKET_SEQ_CTRL_LAST 2
27 #define TM_PACKET_SEQ_CTRL_STANDALONE 3
34 #define TM_PACKET_SEQ_CTRL_CONTINUATION 0x00 // [0000 0000]
35 #define TM_PACKET_SEQ_CTRL_FIRST 0x40 // [0100 0000]
36 #define TM_PACKET_SEQ_CTRL_LAST 0x80 // [1000 0000]
37 #define TM_PACKET_SEQ_CTRL_STANDALONE 0xc0 // [1100 0000]
38 #define TM_PACKET_SEQ_CNT_DEFAULT 0x00 // [0000 0000]
28 39
29 //
40 // DESTINATION ID
30 41 #define TM_DESTINATION_ID_GROUND 0
31 42 #define TM_DESTINATION_ID_MISSION_TIMELINE 110
32 43 #define TM_DESTINATION_ID_TC_SEQUENCES 111
@@ -48,15 +59,6
48 59 #define SIZE_TM_LFR_TC_EXE_CORRUPTED 32
49 60 #define SIZE_HK_PARAMETERS 112
50 61
51 #define ILLEGAL_APID 0
52 #define WRONG_LEN_PACKET 1
53 #define INCOR_CHECKSUM 2
54 #define ILL_TYPE 3
55 #define ILL_SUBTYPE 4
56 #define WRONG_APP_DATA 5
57 #define WRONG_CMD_CODE 6
58 #define CCSDS_TM_VALID 7
59
60 62 // TC TYPES
61 63 #define TC_TYPE_GEN 181
62 64 #define TC_TYPE_TIME 9
@@ -104,11 +106,21
104 106 #define TM_SUBTYPE_LFR_SCIENCE 3
105 107
106 108 // FAILURE CODES
109 #define ILLEGAL_APID 0
110 #define WRONG_LEN_PACKET 1
111 #define INCOR_CHECKSUM 2
112 #define ILL_TYPE 3
113 #define ILL_SUBTYPE 4
114 #define WRONG_APP_DATA 5
115 //
116 #define WRONG_CMD_CODE 6
117 #define CCSDS_TM_VALID 7
107 118 #define FAILURE_CODE_INCONSISTENT 5 // 0x00 0x05
108 119 #define FAILURE_CODE_NOT_EXECUTABLE 42000 // 0xa4 0x10
109 120 #define FAILURE_CODE_NOT_IMPLEMENTED 42002 // 0xa4 0x12
110 121 #define FAILURE_CODE_ERROR 42003 // 0xa4 0x13
111 122 #define FAILURE_CODE_CORRUPTED 42005 // 0xa4 0x15
123
112 124 // TM SID
113 125 #define SID_DEFAULT 0
114 126 #define SID_EXE_INC 5
@@ -143,8 +155,8
143 155 #define SID_SBM1_BP2_F0 31
144 156 #define SID_SBM2_BP1_F0 29
145 157 #define SID_SBM2_BP2_F0 32
146 #define SID_SBM1_BP1_F1 30
147 #define SID_SBM1_BP2_F1 33
158 #define SID_SBM2_BP1_F1 30
159 #define SID_SBM2_BP2_F1 33
148 160
149 161 // LENGTH (BYTES)
150 162 #define LENGTH_TM_LFR_TC_EXE_MAX 32
@@ -166,13 +178,16
166 178
167 179 #define SPARE1_PUSVERSION_SPARE2 0x10
168 180
169 #define LEN_TM_LFR_HK 126 + 4
170 #define LEN_TM_LFR_TC_EXE_NOT_IMP 24 +4
181 #define LEN_TM_LFR_HK 126 + 4
182 #define LEN_TM_LFR_TC_EXE_NOT_IMP 24 +4
171 183
172 #define TM_LEN_SCI_SWF_340 340 * 12 + 10 + 12 - 1
173 #define TM_LEN_SCI_SWF_8 8 * 12 + 10 + 12 - 1
174 #define TM_LEN_SCI_CWF_340 340 * 12 + 10 + 10 - 1
175 #define TM_LEN_SCI_CWF_8 8 * 12 + 10 + 10 - 1
184 #define TM_LEN_SCI_SWF_340 (340 * 12 + 10 + 12 - 1)
185 #define TM_LEN_SCI_SWF_8 (8 * 12 + 10 + 12 - 1)
186 #define TM_LEN_SCI_CWF_340 (340 * 12 + 10 + 10 - 1)
187 #define TM_LEN_SCI_CWF_8 (8 * 12 + 10 + 10 - 1)
188 #define DEFAULT_PKTCNT 0x07
189 #define BLK_NR_340 0x0154
190 #define BLK_NR_8 0x0008
176 191
177 192 enum TM_TYPE{
178 193 TM_LFR_TC_EXE_OK,
@@ -220,6 +235,35 struct Packet_TM_LFR_TC_EXE_str
220 235 };
221 236 typedef struct Packet_TM_LFR_TC_EXE_str Packet_TM_LFR_TC_EXE_t;
222 237
238 struct Packet_TM_LFR_TC_EXE_CORRUPTED_str
239 {
240 volatile unsigned char targetLogicalAddress;
241 volatile unsigned char protocolIdentifier;
242 volatile unsigned char reserved;
243 volatile unsigned char userApplication;
244 // PACKET HEADER
245 volatile unsigned char packetID[2];
246 volatile unsigned char packetSequenceControl[2];
247 volatile unsigned char packetLength[2];
248 // DATA FIELD HEADER
249 volatile unsigned char spare1_pusVersion_spare2;
250 volatile unsigned char serviceType;
251 volatile unsigned char serviceSubType;
252 volatile unsigned char destinationID;
253 volatile unsigned char time[6];
254 //
255 volatile unsigned char tc_failure_code[2];
256 volatile unsigned char telecommand_pkt_id[2];
257 volatile unsigned char pkt_seq_control[2];
258 volatile unsigned char tc_service;
259 volatile unsigned char tc_subtype;
260 volatile unsigned char pkt_len_rcv_value[2];
261 volatile unsigned char pkt_datafieldsize_cnt[2];
262 volatile unsigned char rcv_crc[2];
263 volatile unsigned char computed_crc[2];
264 };
265 typedef struct Packet_TM_LFR_TC_EXE_CORRUPTED_str Packet_TM_LFR_TC_EXE_CORRUPTED_t;
266
223 267 struct Header_TM_LFR_SCIENCE_SWF_str
224 268 {
225 269 volatile unsigned char targetLogicalAddress;
@@ -320,7 +364,11 struct Packet_TM_LFR_HK_str
320 364 volatile unsigned char packetID[2];
321 365 volatile unsigned char packetSequenceControl[2];
322 366 volatile unsigned char packetLength[2];
323 volatile unsigned char dataFieldHeader[10];
367 volatile unsigned char spare1_pusVersion_spare2;
368 volatile unsigned char serviceType;
369 volatile unsigned char serviceSubType;
370 volatile unsigned char destinationID;
371 volatile unsigned char time[6];
324 372 volatile unsigned char sid;
325 373
326 374 //**************
@@ -9,13 +9,15
9 9 #include <grspw.h>
10 10 #include <apbuart.h>
11 11
12 #include <fsw_params.h>
13 #include <fsw_misc.h>
14 #include <fsw_processing.h>
15 #include <tc_handler.h>
16 #include <wf_handler.h>
17 #include <grlib_regs.h>
18 #include <ccsds_types.h>
12 #include "fsw_params.h"
13 #include "fsw_misc.h"
14 #include "fsw_processing.h"
15 #include "tc_handler.h"
16 #include "wf_handler.h"
17 #include "grlib_regs.h"
18 #include "ccsds_types.h"
19
20 #include "fsw_spacewire.h"
19 21
20 22 extern int sched_yield( void );
21 23 extern int errno;
@@ -24,41 +26,30 extern rtems_name Task_name[ ]; /* a
24 26 extern rtems_name misc_name[ ]; /* arry of miscellaneous names for rtems objects */
25 27 extern int fdSPW; // grspw file descriptor
26 28 extern int fdUART; // uart file descriptor
27
28 void timecode_irq_handler(void *pDev, void *regs, int minor, unsigned int tc);
29 extern unsigned char lfrCurrentMode;
29 30
30 31 // MODE PARAMETERS
31 32 extern struct param_local_str param_local;
32 33 extern Packet_TM_LFR_PARAMETER_DUMP_t parameter_dump_packet;
33 extern Packet_TM_LFR_HK_t housekeeping_packet;
34 34 extern unsigned short sequenceCounters[SEQ_CNT_NB_PID][SEQ_CNT_NB_CAT][SEQ_CNT_NB_DEST_ID];
35 35
36 36 // RTEMS TASKS
37 37 rtems_task Init( rtems_task_argument argument); /* forward declaration needed */
38 38 rtems_task recv_task(rtems_task_argument argument);
39 rtems_task spiq_task(rtems_task_argument argument);
40 39 rtems_task stat_task(rtems_task_argument argument);
41 40 rtems_task wfrm_task(rtems_task_argument argument);
42 41 int create_names( void );
43 42 int create_all_tasks( void );
44 43 int start_all_tasks( void );
45 44 int create_message_queue( void );
45 int create_message_queues( void );
46 46
47 47 // OTHER functions
48 48 void init_parameter_dump( void );
49 49 void init_local_mode_parameters( void );
50 50 void init_housekeeping_parameters( void );
51 51
52 int spacewire_configure_link( void );
53 int spacewire_wait_for_link(void);
54 void spacewire_set_NP(unsigned char val, unsigned int regAddr); // No Port force
55 void spacewire_set_RE(unsigned char val, unsigned int regAddr); // RMAP Enable
56 void spacewire_compute_stats_offsets();
57
58 52 extern int rtems_cpu_usage_report( void );
59 53 extern int rtems_cpu_usage_reset( void );
60 54
61 rtems_status_code write_spw(spw_ioctl_pkt_send* spw_ioctl_send);
62 void (*grspw_timecode_callback) (void *pDev, void *regs, int minor, unsigned int tc);
63
64 55 #endif // FSW_RTEMS_CONFIG_H_INCLUDED
@@ -4,16 +4,16
4 4 #include <rtems.h>
5 5 #include <stdio.h>
6 6
7 #include <fsw_init.h>
8 #include <fsw_params.h>
9 #include <grlib_regs.h>
10 7 #include <grspw.h>
11 #include <ccsds_types.h>
8
9 #include "fsw_init.h"
10 #include "fsw_params.h"
11 #include "grlib_regs.h"
12 #include "ccsds_types.h"
12 13
13 14 rtems_name HK_name; // name of the HK rate monotonic
14 15 rtems_id HK_id; // id of the HK rate monotonic period
15 extern spw_stats spacewire_stats;
16 extern spw_stats spacewire_stats_backup;
16 extern Packet_TM_LFR_HK_t housekeeping_packet;
17 17
18 18 int configure_timer(gptimer_regs_t *gptimer_regs, unsigned char timer, unsigned int clock_divider,
19 19 unsigned char interrupt_level, rtems_isr (*timer_isr)() );
@@ -29,5 +29,6 int set_apbuart_scaler_reload_register(u
29 29 // RTEMS TASKS
30 30 rtems_task stat_task(rtems_task_argument argument);
31 31 rtems_task hous_task(rtems_task_argument argument);
32 rtems_task send_task(rtems_task_argument argument);
32 33
33 34 #endif // FSW_MISC_H_INCLUDED
@@ -24,7 +24,6
24 24 #define RTEMS_EVENT_MODE_BURST RTEMS_EVENT_2
25 25 #define RTEMS_EVENT_MODE_SBM1 RTEMS_EVENT_3
26 26 #define RTEMS_EVENT_MODE_SBM2 RTEMS_EVENT_4
27 #define RTEMS_EVENT_MODE_NORMAL_CWF_F3 RTEMS_EVENT_5
28 27
29 28 //****************************
30 29 // LFR DEFAULT MODE PARAMETERS
@@ -47,6 +46,11
47 46 // SBM2
48 47 #define DEFAULT_SY_LFR_S2_BP_P0 1 // sec
49 48 #define DEFAULT_SY_LFR_S2_BP_P1 5 // sec
49 // ADDITIONAL PARAMETERS
50 #define TIME_BETWEEN_TWO_SWF_PACKETS 30 // nb x 10 ms => 300 ms
51 #define TIME_BETWEEN_TWO_CWF3_PACKETS 1000 // nb x 10 ms => 10 s
52 //
53 //****************************
50 54
51 55 //*****************************
52 56 // APB REGISTERS BASE ADDRESSES
@@ -106,8 +110,32
106 110 #define TASKID_HOUS 10
107 111 #define TASKID_MATR 11
108 112 #define TASKID_CWF3 12
113 #define TASKID_CWF2 13
114 #define TASKID_CWF1 14
115 #define TASKID_SEND 15
116
117 //*********************************************************************
118 // ALL TASKS THAT USE THE SPACEWIRE DIRVER SHALL HAVE THE SAME PRIORITY
119 // OR CHANGE THE SEMAPHORE CREATION IN THE DRIVER...
120 #define TASK_PRIORITY_SPIQ 5
121 #define TASK_PRIORITY_SMIQ 10
122 #define TASK_PRIORITY_SEND 11
123 #define TASK_PRIORITY_RECV 12
124 #define TASK_PRIORITY_ACTN 12
125 #define TASK_PRIORITY_CWF1 14
126 #define TASK_PRIORITY_HOUS 15
127 #define TASK_PRIORITY_CWF2 15
128 #define TASK_PRIORITY_WFRM 15
129 #define TASK_PRIORITY_CWF3 15
130 #define TASK_PRIORITY_AVF0 50
131 #define TASK_PRIORITY_BPF0 50
132 #define TASK_PRIORITY_MATR 250
133 #define TASK_PRIORITY_STAT 251
134 #define TASK_PRIORITY_DUMB 251
109 135
110 136 #define ACTION_MSG_QUEUE_COUNT 10
137 #define ACTION_MSG_PKTS_COUNT 50
138 #define ACTION_MSG_PKTS_SIZE
111 139
112 140 //*******
113 141 // MACROS
@@ -121,6 +149,8
121 149 #define PRINTF2(x,y,z) ;
122 150 #endif
123 151
152 #define CPU_USAGE_REPORT_PERIOD 6 // * 10 s = period
153
124 154 #define NB_SAMPLES_PER_SNAPSHOT 2048
125 155 #define TIME_OFFSET 2
126 156 #define WAVEFORM_EXTENDED_HEADER_OFFSET 22
@@ -8,9 +8,12
8 8 #include <sys/ioctl.h> // for the ioctl call
9 9 #include <ccsds_types.h>
10 10 #include <grspw.h>
11 #include <fsw_init.h>
11
12 #include "fsw_init.h"
13 #include "fsw_misc.h"
12 14
13 15 extern int fdSPW;
16 extern unsigned char lfrCurrentMode;
14 17 extern rtems_name misc_name[ ];
15 18 extern rtems_name misc_id[ ];
16 19 extern rtems_id Task_id[ ]; // array of task ids
@@ -18,7 +21,6 extern rtems_id Task_id[ ]; // a
18 21 extern struct param_sbm1_str param_sbm1;
19 22 extern struct param_sbm2_str param_sbm2;
20 23 extern Packet_TM_LFR_PARAMETER_DUMP_t parameter_dump_packet;
21 extern Packet_TM_LFR_HK_t housekeeping_packet;
22 24 extern time_management_regs_t *time_management_regs;
23 25 extern waveform_picker_regs_t *waveform_picker_regs;
24 26 extern gptimer_regs_t *gptimer_regs;
@@ -30,8 +32,10 rtems_isr commutation_isr2( rtems_vector
30 32
31 33 //**********************
32 34 // GENERAL USE FUNCTIONS
35 unsigned int Crc_opt( unsigned char D, unsigned int Chk);
33 36 void initLookUpTableForCRC( void );
34 37 void GetCRCAsTwoBytes(unsigned char* data, unsigned char* crcAsTwoBytes, unsigned int sizeOfData);
38 void updateLFRCurrentMode();
35 39
36 40 //*********************
37 41 // ACCEPTANCE FUNCTIONS
@@ -40,41 +44,40 unsigned char TC_parser(ccsdsTelecommand
40 44
41 45 unsigned char TM_build_header( enum TM_TYPE tm_type, unsigned int packetLength,
42 46 TMHeader_t *TMHeader, unsigned char tc_sid);
43 unsigned char TM_build_data(ccsdsTelecommandPacket_t *TC, char* data, unsigned int SID, unsigned char *computed_CRC);
44 47
45 48 //***********
46 49 // RTEMS TASK
47 50 rtems_task recv_task( rtems_task_argument unused );
48 51 rtems_task actn_task( rtems_task_argument unused );
49 52 rtems_task dumb_task( rtems_task_argument unused );
50 int create_message_queue( void );
51 53
52 54 //***********
53 55 // TC ACTIONS
54 int action_default(ccsdsTelecommandPacket_t *TC);
55 int action_enter(ccsdsTelecommandPacket_t *TC);
56 int action_updt_info(ccsdsTelecommandPacket_t *TC);
56 int action_reset(ccsdsTelecommandPacket_t *TC);
57 int action_load_common_par(ccsdsTelecommandPacket_t *TC);
58 int action_load_normal_par(ccsdsTelecommandPacket_t *TC);
59 int action_load_burst_par(ccsdsTelecommandPacket_t *TC);
60 int action_load_sbm1_par(ccsdsTelecommandPacket_t *TC);
61 int action_load_sbm2_par(ccsdsTelecommandPacket_t *TC);
62 int action_dump_par(ccsdsTelecommandPacket_t *TC);
63 int action_enter_mode(ccsdsTelecommandPacket_t *TC);
64 int action_update_info(ccsdsTelecommandPacket_t *TC);
57 65 int action_enable_calibration(ccsdsTelecommandPacket_t *TC);
58 66 int action_disable_calibration(ccsdsTelecommandPacket_t *TC);
59 int action_updt_time(ccsdsTelecommandPacket_t *TC);
67 int action_update_time(ccsdsTelecommandPacket_t *TC);
68
60 69 // mode transition
61 70 int transition_validation(unsigned char requestedMode);
62 71 int stop_current_mode();
63 72 int enter_mode(unsigned char mode, ccsdsTelecommandPacket_t *TC);
64 int enter_standby_mode(ccsdsTelecommandPacket_t *TC);
65 int enter_normal_mode(ccsdsTelecommandPacket_t *TC);
66 int enter_burst_mode(ccsdsTelecommandPacket_t *TC);
67 int enter_sbm1_mode(ccsdsTelecommandPacket_t *TC);
68 int enter_sbm2_mode(ccsdsTelecommandPacket_t *TC);
73 int enter_standby_mode();
74 int enter_normal_mode();
75 int enter_burst_mode();
76 int enter_sbm1_mode();
77 int enter_sbm2_mode();
69 78 int restart_science_tasks();
70 79 int suspend_science_tasks();
71 // parameters loading
72 int action_load_comm(ccsdsTelecommandPacket_t *TC);
73 int action_load_norm(ccsdsTelecommandPacket_t *TC);
74 int action_load_burst(ccsdsTelecommandPacket_t *TC);
75 int action_load_sbm1(ccsdsTelecommandPacket_t *TC);
76 int action_load_sbm2(ccsdsTelecommandPacket_t *TC);
77 int action_dump(ccsdsTelecommandPacket_t *TC);
80
78 81 // other functions
79 82 void update_last_TC_exe(ccsdsTelecommandPacket_t *TC);
80 83 void update_last_TC_rej(ccsdsTelecommandPacket_t *TC);
@@ -2,14 +2,16
2 2 #define WF_HANDLER_H_INCLUDED
3 3
4 4 #include <rtems.h>
5 #include <fsw_params.h>
6 5 #include <grspw.h>
7 #include <grlib_regs.h>
8 #include <ccsds_types.h>
6
9 7 #include <stdio.h>
10 #include <fsw_init.h>
11 8 #include <math.h>
12 9
10 #include "fsw_params.h"
11 #include "grlib_regs.h"
12 #include "ccsds_types.h"
13 #include "fsw_init.h"
14
13 15 #define pi 3.1415
14 16
15 17 //#include <sys/ioctl.h>
@@ -17,35 +19,38
17 19 extern rtems_id Task_id[]; /* array of task ids */
18 20 extern int fdSPW;
19 21 extern volatile int wf_snap_f0[ ];
22 //
20 23 extern volatile int wf_snap_f1[ ];
21 24 extern volatile int wf_snap_f1_bis[ ];
25 extern volatile int wf_snap_f1_norm[ ];
26 //
22 27 extern volatile int wf_snap_f2[ ];
23 28 extern volatile int wf_snap_f2_bis[ ];
29 extern volatile int wf_snap_f2_norm[ ];
30 //
24 31 extern volatile int wf_cont_f3[ ];
25 32 extern volatile int wf_cont_f3_bis[ ];
26 33 extern waveform_picker_regs_t *waveform_picker_regs;
34 extern unsigned char lfrCurrentMode;
27 35
28 36 rtems_isr waveforms_isr( rtems_vector_number vector );
29 37 rtems_isr waveforms_simulator_isr( rtems_vector_number vector );
30 38 rtems_task wfrm_task(rtems_task_argument argument);
31 39 rtems_task cwf3_task(rtems_task_argument argument);
40 rtems_task cwf2_task(rtems_task_argument argument);
41 rtems_task cwf1_task(rtems_task_argument argument);
32 42
33 43 //******************
34 44 // general functions
35 45 void init_waveforms( void );
36 void init_header_snapshot_wf( Header_TM_LFR_SCIENCE_SWF_t *header );
37 void init_header_continuous_wf( Header_TM_LFR_SCIENCE_CWF_t *header );
46 //
47 int init_header_snapshot_wf_table( unsigned int sid );
48 int init_header_continuous_wf_table(unsigned int sid , Header_TM_LFR_SCIENCE_CWF_t *headerCWF);
49 //
38 50 void reset_waveforms( void );
39 void send_waveform_norm( Header_TM_LFR_SCIENCE_SWF_t *header, spw_ioctl_pkt_send *spw_ioctl_send );
40 void send_waveform_burst( Header_TM_LFR_SCIENCE_CWF_t *header, spw_ioctl_pkt_send *spw_ioctl_send );
41 void send_waveform_sbm1( Header_TM_LFR_SCIENCE_CWF_t *header, spw_ioctl_pkt_send *spw_ioctl_send );
42 void send_waveform_sbm2( Header_TM_LFR_SCIENCE_CWF_t *header, spw_ioctl_pkt_send *spw_ioctl_send );
43 void send_waveform_norm_cwf_f3(Header_TM_LFR_SCIENCE_CWF_t *header, spw_ioctl_pkt_send *spw_ioctl_send );
44 51
45 void send_waveform_SWF( Header_TM_LFR_SCIENCE_SWF_t *header, volatile int *waveform,
46 unsigned int sid, spw_ioctl_pkt_send *spw_ioctl_send );
47 void send_waveform_CWF( Header_TM_LFR_SCIENCE_CWF_t *header, volatile int *waveform,
48 unsigned int sid, spw_ioctl_pkt_send *spw_ioctl_send );
52 int send_waveform_SWF(volatile int *waveform, unsigned int sid);
53 int send_waveform_CWF(volatile int *waveform, unsigned int sid, Header_TM_LFR_SCIENCE_CWF_t *headerCWF);
49 54
50 55 //**************
51 56 // wfp registers
@@ -53,6 +58,7 void set_wfp_data_shaping();
53 58 char set_wfp_delta_snapshot();
54 59 void set_wfp_burst_enable_register( unsigned char mode);
55 60 void reset_wfp_burst_enable();
61 void reset_wfp_status();
56 62 void reset_waveform_picker_regs();
57 63
58 64 //*****************
@@ -2,7 +2,7
2 2
3 3 // GRSPW0 resources
4 4 struct drvmgr_key grlib_grspw_0n1_res[] = {
5 {"txBdCnt", KEY_TYPE_INT, {(unsigned int)10}},
5 {"txBdCnt", KEY_TYPE_INT, {(unsigned int)50}}, // 7 SWF_F0, 7 SWF_F1, 7 SWF_F2, 7 CWF_F3, 7 CWF_F1 ou 7 CWF_F2
6 6 {"rxBdCnt", KEY_TYPE_INT, {(unsigned int)10}},
7 7 {"txDataSize", KEY_TYPE_INT, {(unsigned int)4096}},
8 8 {"txHdrSize", KEY_TYPE_INT, {(unsigned int)20+12}}, // 12 is for the auxiliary header, when needed
@@ -8,10 +8,11
8 8 // RTEMS GLOBAL VARIABLES
9 9 rtems_name misc_name[5];
10 10 rtems_name misc_id[5];
11 rtems_id Task_id[15]; /* array of task ids */
12 rtems_name Task_name[15]; /* array of task names */
11 rtems_id Task_id[20]; /* array of task ids */
12 rtems_name Task_name[20]; /* array of task names */
13 13 int fdSPW = 0;
14 14 int fdUART = 0;
15 unsigned char lfrCurrentMode;
15 16
16 17 // APB CONFIGURATION REGISTERS
17 18 time_management_regs_t *time_management_regs = (time_management_regs_t*) REGS_ADDR_TIME_MANAGEMENT;
@@ -24,10 +25,15 spectral_matrix_regs_t *spectral_matrix_
24 25
25 26 // WAVEFORMS GLOBAL VARIABLES // 2048 * 3 * 4 + 2 * 4 = 24576 + 8 bytes
26 27 volatile int wf_snap_f0[ NB_SAMPLES_PER_SNAPSHOT * NB_WORDS_SWF_BLK + TIME_OFFSET];
28 //
27 29 volatile int wf_snap_f1[ NB_SAMPLES_PER_SNAPSHOT * NB_WORDS_SWF_BLK + TIME_OFFSET];
28 30 volatile int wf_snap_f1_bis[ NB_SAMPLES_PER_SNAPSHOT * NB_WORDS_SWF_BLK + TIME_OFFSET];
31 volatile int wf_snap_f1_norm[ NB_SAMPLES_PER_SNAPSHOT * NB_WORDS_SWF_BLK + TIME_OFFSET];
32 //
29 33 volatile int wf_snap_f2[ NB_SAMPLES_PER_SNAPSHOT * NB_WORDS_SWF_BLK + TIME_OFFSET];
30 34 volatile int wf_snap_f2_bis[ NB_SAMPLES_PER_SNAPSHOT * NB_WORDS_SWF_BLK + TIME_OFFSET];
35 volatile int wf_snap_f2_norm[ NB_SAMPLES_PER_SNAPSHOT * NB_WORDS_SWF_BLK + TIME_OFFSET];
36 //
31 37 volatile int wf_cont_f3[ NB_SAMPLES_PER_SNAPSHOT * NB_WORDS_SWF_BLK + TIME_OFFSET];
32 38 volatile int wf_cont_f3_bis[ NB_SAMPLES_PER_SNAPSHOT * NB_WORDS_SWF_BLK + TIME_OFFSET];
33 39
@@ -15,14 +15,14
15 15 #define CONFIGURE_APPLICATION_NEEDS_CONSOLE_DRIVER
16 16 #define CONFIGURE_APPLICATION_NEEDS_CLOCK_DRIVER
17 17
18 #define CONFIGURE_MAXIMUM_TASKS 15
18 #define CONFIGURE_MAXIMUM_TASKS 20
19 19 #define CONFIGURE_RTEMS_INIT_TASKS_TABLE
20 20 #define CONFIGURE_EXTRA_TASK_STACKS (3 * RTEMS_MINIMUM_STACK_SIZE)
21 21 #define CONFIGURE_LIBIO_MAXIMUM_FILE_DESCRIPTORS 32
22 #define CONFIGURE_INIT_TASK_PRIORITY 100
22 #define CONFIGURE_INIT_TASK_PRIORITY 5 // instead of 100
23 23 #define CONFIGURE_MAXIMUM_DRIVERS 16
24 24 #define CONFIGURE_MAXIMUM_PERIODS 5
25 #define CONFIGURE_MAXIMUM_MESSAGE_QUEUES 1
25 #define CONFIGURE_MAXIMUM_MESSAGE_QUEUES 2
26 26
27 27 #include <rtems/confdefs.h>
28 28
@@ -44,14 +44,6
44 44 #include <fsw_init.h>
45 45 #include <fsw_config.c>
46 46
47 char *lstates[6] = {"Error-reset",
48 "Error-wait",
49 "Ready",
50 "Started",
51 "Connecting",
52 "Run"
53 };
54
55 47 rtems_task Init( rtems_task_argument ignored )
56 48 {
57 49 rtems_status_code status;
@@ -70,10 +62,11 rtems_task Init( rtems_task_argument ign
70 62 init_parameter_dump();
71 63 init_local_mode_parameters();
72 64 init_housekeeping_parameters();
73 create_message_queue();
65 create_message_queues();
74 66
75 67 create_names(); // create all names
76 68 create_all_tasks(); // create all tasks
69
77 70 start_all_tasks(); // start all tasks
78 71 stop_current_mode(); // go in STANDBY mode
79 72
@@ -85,8 +78,7 rtems_task Init( rtems_task_argument ign
85 78 // Spectral Matrices simulator
86 79 configure_timer((gptimer_regs_t*) REGS_ADDR_GPTIMER, TIMER_SM_SIMULATOR, CLKDIV_SM_SIMULATOR,
87 80 IRQ_SPARC_SM, spectral_matrices_isr );
88 //**********
89 // WAVEFORMS
81 // WaveForms
90 82 configure_timer((gptimer_regs_t*) REGS_ADDR_GPTIMER, TIMER_WF_SIMULATOR, CLKDIV_WF_SIMULATOR,
91 83 IRQ_SPARC_WF, waveforms_simulator_isr );
92 84 LEON_Mask_interrupt( IRQ_SM );
@@ -108,8 +100,6 rtems_task Init( rtems_task_argument ign
108 100 LEON_Mask_interrupt( IRQ_SPECTRAL_MATRIX );
109 101 #endif
110 102
111 //**********
112
113 103 status = rtems_task_delete(RTEMS_SELF);
114 104
115 105 }
@@ -122,8 +112,8 void init_parameter_dump(void)
122 112 parameter_dump_packet.userApplication = CCSDS_USER_APP;
123 113 parameter_dump_packet.packetID[0] = (unsigned char) (TM_PACKET_ID_PARAMETER_DUMP >> 8);
124 114 parameter_dump_packet.packetID[1] = (unsigned char) TM_PACKET_ID_PARAMETER_DUMP;
125 parameter_dump_packet.packetSequenceControl[0] = (unsigned char) (TM_PACKET_SEQ_CTRL_STANDALONE << 6);
126 parameter_dump_packet.packetSequenceControl[1] = 0x00;
115 parameter_dump_packet.packetSequenceControl[0] = TM_PACKET_SEQ_CTRL_STANDALONE;
116 parameter_dump_packet.packetSequenceControl[1] = TM_PACKET_SEQ_CNT_DEFAULT;
127 117 parameter_dump_packet.packetLength[0] = (unsigned char) (PACKET_LENGTH_PARAMETER_DUMP >> 8);
128 118 parameter_dump_packet.packetLength[1] = (unsigned char) PACKET_LENGTH_PARAMETER_DUMP;
129 119 // DATA FIELD HEADER
@@ -147,11 +137,11 void init_parameter_dump(void)
147 137 //******************
148 138 // NORMAL PARAMETERS
149 139 parameter_dump_packet.sy_lfr_n_swf_l[0] = (unsigned char) (DEFAULT_SY_LFR_N_SWF_L >> 8);
150 parameter_dump_packet.sy_lfr_n_swf_l[1] = (unsigned char) DEFAULT_SY_LFR_N_SWF_L;
140 parameter_dump_packet.sy_lfr_n_swf_l[1] = (unsigned char) (DEFAULT_SY_LFR_N_SWF_L );
151 141 parameter_dump_packet.sy_lfr_n_swf_p[0] = (unsigned char) (DEFAULT_SY_LFR_N_SWF_P >> 8);
152 parameter_dump_packet.sy_lfr_n_swf_p[1] = (unsigned char) DEFAULT_SY_LFR_N_SWF_P;
142 parameter_dump_packet.sy_lfr_n_swf_p[1] = (unsigned char) (DEFAULT_SY_LFR_N_SWF_P );
153 143 parameter_dump_packet.sy_lfr_n_asm_p[0] = (unsigned char) (DEFAULT_SY_LFR_N_ASM_P >> 8);
154 parameter_dump_packet.sy_lfr_n_asm_p[1] = (unsigned char) DEFAULT_SY_LFR_N_ASM_P;
144 parameter_dump_packet.sy_lfr_n_asm_p[1] = (unsigned char) (DEFAULT_SY_LFR_N_ASM_P );
155 145 parameter_dump_packet.sy_lfr_n_bp_p0 = (unsigned char) DEFAULT_SY_LFR_N_BP_P0;
156 146 parameter_dump_packet.sy_lfr_n_bp_p1 = (unsigned char) DEFAULT_SY_LFR_N_BP_P1;
157 147
@@ -217,6 +207,7 void init_housekeeping_parameters(void)
217 207 }
218 208 }
219 209 }
210 updateLFRCurrentMode();
220 211 }
221 212
222 213 int create_names( void )
@@ -234,6 +225,9 int create_names( void )
234 225 Task_name[TASKID_HOUS] = rtems_build_name( 'H', 'O', 'U', 'S' );
235 226 Task_name[TASKID_MATR] = rtems_build_name( 'M', 'A', 'T', 'R' );
236 227 Task_name[TASKID_CWF3] = rtems_build_name( 'C', 'W', 'F', '3' );
228 Task_name[TASKID_CWF2] = rtems_build_name( 'C', 'W', 'F', '2' );
229 Task_name[TASKID_CWF1] = rtems_build_name( 'C', 'W', 'F', '1' );
230 Task_name[TASKID_SEND] = rtems_build_name( 'S', 'E', 'N', 'D' );
237 231
238 232 // rate monotonic period name
239 233 HK_name = rtems_build_name( 'H', 'O', 'U', 'S' );
@@ -247,76 +241,94 int create_all_tasks( void )
247 241
248 242 // RECV
249 243 status = rtems_task_create(
250 Task_name[TASKID_RECV], 200, RTEMS_MINIMUM_STACK_SIZE * 2,
244 Task_name[TASKID_RECV], TASK_PRIORITY_RECV, RTEMS_MINIMUM_STACK_SIZE * 2,
251 245 RTEMS_DEFAULT_MODES,
252 246 RTEMS_DEFAULT_ATTRIBUTES, &Task_id[TASKID_RECV]
253 247 );
254 248 // ACTN
255 249 status = rtems_task_create(
256 Task_name[TASKID_ACTN], 100, RTEMS_MINIMUM_STACK_SIZE * 2,
250 Task_name[TASKID_ACTN], TASK_PRIORITY_ACTN, RTEMS_MINIMUM_STACK_SIZE * 2,
257 251 RTEMS_DEFAULT_MODES,
258 252 RTEMS_DEFAULT_ATTRIBUTES, &Task_id[TASKID_ACTN]
259 253 );
260 254 // SPIQ
261 255 status = rtems_task_create(
262 Task_name[TASKID_SPIQ], 5, RTEMS_MINIMUM_STACK_SIZE * 2,
256 Task_name[TASKID_SPIQ], TASK_PRIORITY_SPIQ, RTEMS_MINIMUM_STACK_SIZE * 2,
263 257 RTEMS_DEFAULT_MODES | RTEMS_NO_PREEMPT,
264 258 RTEMS_DEFAULT_ATTRIBUTES, &Task_id[TASKID_SPIQ]
265 259 );
266 260 // SMIQ
267 261 status = rtems_task_create(
268 Task_name[TASKID_SMIQ], 10, RTEMS_MINIMUM_STACK_SIZE * 2,
262 Task_name[TASKID_SMIQ], TASK_PRIORITY_SMIQ, RTEMS_MINIMUM_STACK_SIZE * 2,
269 263 RTEMS_DEFAULT_MODES | RTEMS_NO_PREEMPT,
270 264 RTEMS_DEFAULT_ATTRIBUTES, &Task_id[TASKID_SMIQ]
271 265 );
272 266 // STAT
273 267 status = rtems_task_create(
274 Task_name[TASKID_STAT], 251, RTEMS_MINIMUM_STACK_SIZE * 2,
268 Task_name[TASKID_STAT], TASK_PRIORITY_STAT, RTEMS_MINIMUM_STACK_SIZE * 2,
275 269 RTEMS_DEFAULT_MODES,
276 270 RTEMS_DEFAULT_ATTRIBUTES, &Task_id[TASKID_STAT]
277 271 );
278 272 // AVF0
279 273 status = rtems_task_create(
280 Task_name[TASKID_AVF0], 50, RTEMS_MINIMUM_STACK_SIZE * 2,
274 Task_name[TASKID_AVF0], TASK_PRIORITY_AVF0, RTEMS_MINIMUM_STACK_SIZE * 2,
281 275 RTEMS_DEFAULT_MODES | RTEMS_NO_PREEMPT,
282 276 RTEMS_DEFAULT_ATTRIBUTES | RTEMS_FLOATING_POINT, &Task_id[TASKID_AVF0]
283 277 );
284 278 // BPF0
285 279 status = rtems_task_create(
286 Task_name[TASKID_BPF0], 50, RTEMS_MINIMUM_STACK_SIZE * 2,
280 Task_name[TASKID_BPF0], TASK_PRIORITY_BPF0, RTEMS_MINIMUM_STACK_SIZE * 2,
287 281 RTEMS_DEFAULT_MODES,
288 282 RTEMS_DEFAULT_ATTRIBUTES | RTEMS_FLOATING_POINT, &Task_id[TASKID_BPF0]
289 283 );
290 284 // WFRM
291 285 status = rtems_task_create(
292 Task_name[TASKID_WFRM], 50, RTEMS_MINIMUM_STACK_SIZE * 2,
286 Task_name[TASKID_WFRM], TASK_PRIORITY_WFRM, RTEMS_MINIMUM_STACK_SIZE * 2,
293 287 RTEMS_DEFAULT_MODES,
294 288 RTEMS_DEFAULT_ATTRIBUTES | RTEMS_FLOATING_POINT, &Task_id[TASKID_WFRM]
295 289 );
296 290 // DUMB
297 291 status = rtems_task_create(
298 Task_name[TASKID_DUMB], 200, RTEMS_MINIMUM_STACK_SIZE * 2,
292 Task_name[TASKID_DUMB], TASK_PRIORITY_DUMB, RTEMS_MINIMUM_STACK_SIZE * 2,
299 293 RTEMS_DEFAULT_MODES,
300 294 RTEMS_DEFAULT_ATTRIBUTES, &Task_id[TASKID_DUMB]
301 295 );
302 296 // HOUS
303 297 status = rtems_task_create(
304 Task_name[TASKID_HOUS], 199, RTEMS_MINIMUM_STACK_SIZE * 2,
298 Task_name[TASKID_HOUS], TASK_PRIORITY_HOUS, RTEMS_MINIMUM_STACK_SIZE * 2,
305 299 RTEMS_DEFAULT_MODES,
306 300 RTEMS_DEFAULT_ATTRIBUTES, &Task_id[TASKID_HOUS]
307 301 );
308 302 // MATR
309 303 status = rtems_task_create(
310 Task_name[TASKID_MATR], 250, RTEMS_MINIMUM_STACK_SIZE * 2,
304 Task_name[TASKID_MATR], TASK_PRIORITY_MATR, RTEMS_MINIMUM_STACK_SIZE * 2,
311 305 RTEMS_DEFAULT_MODES,
312 306 RTEMS_DEFAULT_ATTRIBUTES | RTEMS_FLOATING_POINT, &Task_id[TASKID_MATR]
313 307 );
314 308 // CWF3
315 309 status = rtems_task_create(
316 Task_name[TASKID_CWF3], 250, RTEMS_MINIMUM_STACK_SIZE * 2,
310 Task_name[TASKID_CWF3], TASK_PRIORITY_CWF3, RTEMS_MINIMUM_STACK_SIZE * 2,
317 311 RTEMS_DEFAULT_MODES,
318 312 RTEMS_DEFAULT_ATTRIBUTES, &Task_id[TASKID_CWF3]
319 313 );
314 // CWF2
315 status = rtems_task_create(
316 Task_name[TASKID_CWF2], TASK_PRIORITY_CWF2, RTEMS_MINIMUM_STACK_SIZE * 2,
317 RTEMS_DEFAULT_MODES,
318 RTEMS_DEFAULT_ATTRIBUTES, &Task_id[TASKID_CWF2]
319 );
320 // CWF1
321 status = rtems_task_create(
322 Task_name[TASKID_CWF1], TASK_PRIORITY_CWF1, RTEMS_MINIMUM_STACK_SIZE * 2,
323 RTEMS_DEFAULT_MODES,
324 RTEMS_DEFAULT_ATTRIBUTES, &Task_id[TASKID_CWF1]
325 );
326 // SEND
327 status = rtems_task_create(
328 Task_name[TASKID_SEND], TASK_PRIORITY_SEND, RTEMS_MINIMUM_STACK_SIZE * 2,
329 RTEMS_DEFAULT_MODES,
330 RTEMS_DEFAULT_ATTRIBUTES, &Task_id[TASKID_SEND]
331 );
320 332
321 333 return 0;
322 334 }
@@ -385,206 +397,41 int start_all_tasks( void )
385 397 PRINTF("in INIT *** Error starting TASK_CWF3\n")
386 398 }
387 399
400 status = rtems_task_start( Task_id[TASKID_CWF2], cwf2_task, 1 );
401 if (status!=RTEMS_SUCCESSFUL) {
402 PRINTF("in INIT *** Error starting TASK_CWF2\n")
403 }
404
405 status = rtems_task_start( Task_id[TASKID_CWF1], cwf1_task, 1 );
406 if (status!=RTEMS_SUCCESSFUL) {
407 PRINTF("in INIT *** Error starting TASK_CWF1\n")
408 }
409 status = rtems_task_start( Task_id[TASKID_SEND], send_task, 1 );
410 if (status!=RTEMS_SUCCESSFUL) {
411 PRINTF("in INIT *** Error starting TASK_SEND\n")
412 }
413
388 414 return 0;
389 415 }
390 416
391 // SPACEWIRE
392
393 rtems_task spiq_task(rtems_task_argument unused)
394 {
395 rtems_event_set event_out;
396 rtems_status_code status;
397 unsigned char lfrMode;
398
399 while(true){
400 PRINTF("in SPIQ *** Waiting for SPW_LINKERR_EVENT\n")
401 rtems_event_receive(SPW_LINKERR_EVENT, RTEMS_WAIT, RTEMS_NO_TIMEOUT, &event_out); // wait for an SPW_LINKERR_EVENT
402
403 lfrMode = (housekeeping_packet.lfr_status_word[0] & 0xf0) >> 4; // get the current mode
404
405 status = spacewire_wait_for_link();
406
407 if (status != RTEMS_SUCCESSFUL)
408 {
409 //****************
410 // STOP THE SYSTEM
411 spacewire_compute_stats_offsets();
412 stop_current_mode();
413 if (rtems_task_suspend(Task_id[TASKID_RECV])!=RTEMS_SUCCESSFUL) { // suspend RECV task
414 PRINTF("in SPIQ *** Error suspending RECV Task\n")
415 }
416 if (rtems_task_suspend(Task_id[TASKID_HOUS])!=RTEMS_SUCCESSFUL) { // suspend HOUS task
417 PRINTF("in SPIQ *** Error suspending HOUS Task\n")
418 }
419
420 //***************************
421 // RESTART THE SPACEWIRE LINK
422 spacewire_configure_link();
423
424 //*******************
425 // RESTART THE SYSTEM
426 //ioctl(fdSPW, SPACEWIRE_IOCTRL_CLR_STATISTICS); // clear statistics
427 status = rtems_task_restart( Task_id[TASKID_HOUS], 1 );
428 if (status != RTEMS_SUCCESSFUL) {
429 PRINTF1("in SPIQ *** Error restarting HOUS Task *** code %d\n", status)
430 }
431 if (rtems_task_restart(Task_id[TASKID_RECV], 1) != RTEMS_SUCCESSFUL) { // restart RECV task
432 PRINTF("in SPIQ *** Error restarting RECV Task\n")
433 }
434 //enter_mode(lfrMode, NULL); // enter the mode that was running before the SpaceWire interruption
435 }
436 }
437 }
438
439 int spacewire_configure_link( void )
417 int create_message_queues( void )
440 418 {
441 419 rtems_status_code status;
442 420
443 close(fdSPW); // close the device if it is already open
444 PRINTF("OK *** in configure_spw_link *** try to open "GRSPW_DEVICE_NAME"\n")
445 fdSPW = open(GRSPW_DEVICE_NAME, O_RDWR); // open the device. the open call reset the hardware
446 if ( fdSPW<0 ) {
447 PRINTF("ERR *** in configure_spw_link *** Error opening"GRSPW_DEVICE_NAME"\n")
448 }
449
450 while(ioctl(fdSPW, SPACEWIRE_IOCTRL_START, -1) != RTEMS_SUCCESSFUL){
451 PRINTF(".")
452 fflush( stdout );
453 close( fdSPW ); // close the device
454 fdSPW = open( GRSPW_DEVICE_NAME, O_RDWR ); // open the device. the open call reset the hardware
455 if (fdSPW<0) {
456 PRINTF("ERR *** In configure_spw_link *** Error opening"GRSPW_DEVICE_NAME"\n")
457 }
458 rtems_task_wake_after(100);
459 }
460
461 PRINTF("OK *** In configure_spw_link *** "GRSPW_DEVICE_NAME" opened and started successfully\n")
462
463 spacewire_set_NP(1, REGS_ADDR_GRSPW); // No Port force
464 spacewire_set_RE(1, REGS_ADDR_GRSPW); // the dedicated call seems to break the no port force configuration
421 misc_name[0] = rtems_build_name( 'Q', 'U', 'E', 'U' );
422 misc_name[1] = rtems_build_name( 'P', 'K', 'T', 'S' );
465 423
466 status = ioctl(fdSPW, SPACEWIRE_IOCTRL_SET_RXBLOCK, 1); // sets the blocking mode for reception
467 if (status!=RTEMS_SUCCESSFUL) PRINTF("in SPIQ *** Error SPACEWIRE_IOCTRL_SET_RXBLOCK\n")
468 //
469 status = ioctl(fdSPW, SPACEWIRE_IOCTRL_SET_EVENT_ID, Task_id[TASKID_SPIQ]); // sets the task ID to which an event is sent when a
470 if (status!=RTEMS_SUCCESSFUL) PRINTF("in SPIQ *** Error SPACEWIRE_IOCTRL_SET_EVENT_ID\n") // link-error interrupt occurs
471 //
472 status = ioctl(fdSPW, SPACEWIRE_IOCTRL_SET_DISABLE_ERR, 0); // automatic link-disabling due to link-error interrupts
473 if (status!=RTEMS_SUCCESSFUL) PRINTF("in SPIQ *** Error SPACEWIRE_IOCTRL_SET_DISABLE_ERR\n")
474 //
475 status = ioctl(fdSPW, SPACEWIRE_IOCTRL_SET_LINK_ERR_IRQ, 1); // sets the link-error interrupt bit
476 if (status!=RTEMS_SUCCESSFUL) PRINTF("in SPIQ *** Error SPACEWIRE_IOCTRL_SET_LINK_ERR_IRQ\n")
477 //
478 status = ioctl(fdSPW, SPACEWIRE_IOCTRL_SET_TXBLOCK, 0); // transmission blocks
479 if (status!=RTEMS_SUCCESSFUL) PRINTF("in SPIQ *** Error SPACEWIRE_IOCTRL_SET_TXBLOCK\n")
480 //
481 status = ioctl(fdSPW, SPACEWIRE_IOCTRL_SET_TXBLOCK_ON_FULL, 0); // transmission blocks on full
482 if (status!=RTEMS_SUCCESSFUL) PRINTF("in SPIQ *** Error SPACEWIRE_IOCTRL_SET_TXBLOCK_ON_FULL\n")
483 //
484 status = ioctl(fdSPW, SPACEWIRE_IOCTRL_SET_TCODE_CTRL, 0x0909);
485 if (status!=RTEMS_SUCCESSFUL) PRINTF("in SPIQ *** Error SPACEWIRE_IOCTRL_SET_TCODE_CTRL,\n")
486
487 PRINTF("OK *** in configure_spw_link *** "GRSPW_DEVICE_NAME" configured successfully\n")
488
489 return RTEMS_SUCCESSFUL;
490 }
491
492 int spacewire_wait_for_link(void)
493 {
494 unsigned int i;
495 int linkStatus;
496 rtems_status_code status = RTEMS_UNSATISFIED;
497
498 for(i = 0; i< 10; i++){
499 PRINTF(".")
500 fflush( stdout );
501 ioctl(fdSPW, SPACEWIRE_IOCTRL_GET_LINK_STATUS, &linkStatus); // get the link status
502 PRINTF1("in spacewire_wait_for_link *** link status is: %s\n", lstates[linkStatus])
503 if ( linkStatus == 5) {
504 PRINTF("in spacewire_wait_for_link *** link is running\n")
505 status = RTEMS_SUCCESSFUL;
506 break;
507 }
508 rtems_task_wake_after(100);
424 status = rtems_message_queue_create( misc_name[0], ACTION_MSG_QUEUE_COUNT, CCSDS_TC_PKT_MAX_SIZE,
425 RTEMS_FIFO | RTEMS_LOCAL, &misc_id[0] );
426 if (status!=RTEMS_SUCCESSFUL) {
427 PRINTF("in create_message_queues *** error creating QUEU\n")
509 428 }
510 429
511 return status;
512 }
513
514 void spacewire_set_NP(unsigned char val, unsigned int regAddr) // [N]o [P]ort force
515 {
516 unsigned int *spwptr = (unsigned int*) regAddr;
517
518 if (val == 1) {
519 *spwptr = *spwptr | 0x00100000; // [NP] set the No port force bit
520 }
521 if (val== 0) {
522 *spwptr = *spwptr & 0xffdfffff;
430 status = rtems_message_queue_create( misc_name[1], ACTION_MSG_PKTS_COUNT, sizeof(spw_ioctl_pkt_send),
431 RTEMS_FIFO | RTEMS_LOCAL, &misc_id[1] );
432 if (status!=RTEMS_SUCCESSFUL) {
433 PRINTF("in create_message_queues *** error creating PKTS\n")
523 434 }
524 }
525
526 void spacewire_set_RE(unsigned char val, unsigned int regAddr) // [R]MAP [E]nable
527 {
528 unsigned int *spwptr = (unsigned int*) regAddr;
529
530 if (val == 1)
531 {
532 *spwptr = *spwptr | 0x00010000; // [RE] set the RMAP Enable bit
533 }
534 if (val== 0)
535 {
536 *spwptr = *spwptr & 0xfffdffff;
537 }
538 }
539
540 void spacewire_compute_stats_offsets()
541 {
542 spw_stats spacewire_stats_grspw;
543 rtems_status_code status;
544
545 status = ioctl( fdSPW, SPACEWIRE_IOCTRL_GET_STATISTICS, &spacewire_stats_grspw );
546 435
547 spacewire_stats_backup.packets_received = spacewire_stats_grspw.packets_received
548 + spacewire_stats.packets_received;
549 spacewire_stats_backup.packets_sent = spacewire_stats_grspw.packets_sent
550 + spacewire_stats.packets_sent;
551 spacewire_stats_backup.parity_err = spacewire_stats_grspw.parity_err
552 + spacewire_stats.parity_err;
553 spacewire_stats_backup.disconnect_err = spacewire_stats_grspw.disconnect_err
554 + spacewire_stats.disconnect_err;
555 spacewire_stats_backup.escape_err = spacewire_stats_grspw.escape_err
556 + spacewire_stats.escape_err;
557 spacewire_stats_backup.credit_err = spacewire_stats_grspw.credit_err
558 + spacewire_stats.credit_err;
559 spacewire_stats_backup.write_sync_err = spacewire_stats_grspw.write_sync_err
560 + spacewire_stats.write_sync_err;
561 spacewire_stats_backup.rx_rmap_header_crc_err = spacewire_stats_grspw.rx_rmap_header_crc_err
562 + spacewire_stats.rx_rmap_header_crc_err;
563 spacewire_stats_backup.rx_rmap_data_crc_err = spacewire_stats_grspw.rx_rmap_data_crc_err
564 + spacewire_stats.rx_rmap_data_crc_err;
565 spacewire_stats_backup.early_ep = spacewire_stats_grspw.early_ep
566 + spacewire_stats.early_ep;
567 spacewire_stats_backup.invalid_address = spacewire_stats_grspw.invalid_address
568 + spacewire_stats.invalid_address;
569 spacewire_stats_backup.rx_eep_err = spacewire_stats_grspw.rx_eep_err
570 + spacewire_stats.rx_eep_err;
571 spacewire_stats_backup.rx_truncated = spacewire_stats_grspw.rx_truncated
572 + spacewire_stats.rx_truncated;
436 return 0;
573 437 }
574
575 rtems_status_code write_spw(spw_ioctl_pkt_send* spw_ioctl_send)
576 {
577 rtems_status_code status;
578 status = ioctl( fdSPW, SPACEWIRE_IOCTRL_SEND, spw_ioctl_send );
579 if (status != RTEMS_SUCCESSFUL){
580 //PRINTF1("ERR *** in write_spw *** write operation failed with code: %d\n", status)
581 }
582 return status;
583 }
584
585 void timecode_irq_handler(void *pDev, void *regs, int minor, unsigned int tc)
586 {
587 if (rtems_event_send( Task_id[TASKID_DUMB], RTEMS_EVENT_1 ) != RTEMS_SUCCESSFUL) {
588 printf("In timecode_irq_handler *** Error sending event to DUMB\n");
589 }
590 }
@@ -1,12 +1,6
1 1 #include <fsw_misc.h>
2 2 #include <fsw_params.h>
3 3
4 extern rtems_id Task_id[]; /* array of task ids */
5 extern int fdSPW;
6 extern TMHeader_t housekeeping_header;
7 extern char housekeeping_data[];
8 extern Packet_TM_LFR_HK_t housekeeping_packet;
9
10 4 int configure_timer(gptimer_regs_t *gptimer_regs, unsigned char timer, unsigned int clock_divider,
11 5 unsigned char interrupt_level, rtems_isr (*timer_isr)() )
12 6 { // configure the timer for the waveforms simulation
@@ -149,11 +143,11 rtems_task stat_task(rtems_task_argument
149 143 while(1){
150 144 rtems_task_wake_after(1000);
151 145 PRINTF1("%d\n", j)
152 if (i == 2) {
153 #ifdef PRINT_TASK_STATISTICS
154 rtems_cpu_usage_report();
155 rtems_cpu_usage_reset();
156 #endif
146 if (i == CPU_USAGE_REPORT_PERIOD) {
147 // #ifdef PRINT_TASK_STATISTICS
148 // rtems_cpu_usage_report();
149 // rtems_cpu_usage_reset();
150 // #endif
157 151 i = 0;
158 152 }
159 153 else i++;
@@ -163,8 +157,14 rtems_task stat_task(rtems_task_argument
163 157
164 158 rtems_task hous_task(rtems_task_argument argument)
165 159 {
166 int result;
167 160 rtems_status_code status;
161 spw_ioctl_pkt_send spw_ioctl_send;
162
163 spw_ioctl_send.hlen = 0;
164 spw_ioctl_send.hdr = NULL;
165 spw_ioctl_send.dlen = sizeof(spw_ioctl_send);
166 spw_ioctl_send.data = (char*) &housekeeping_packet;
167 spw_ioctl_send.options = 0;
168 168
169 169 PRINTF("in HOUS ***\n")
170 170
@@ -177,18 +177,18 rtems_task hous_task(rtems_task_argument
177 177
178 178 housekeeping_packet.targetLogicalAddress = CCSDS_DESTINATION_ID;
179 179 housekeeping_packet.protocolIdentifier = CCSDS_PROTOCOLE_ID;
180 housekeeping_packet.reserved = 0x00;
181 housekeeping_packet.userApplication = 0x00;
180 housekeeping_packet.reserved = DEFAULT_RESERVED;
181 housekeeping_packet.userApplication = CCSDS_USER_APP;
182 182 housekeeping_packet.packetID[0] = (unsigned char) (TM_PACKET_ID_HK >> 8);
183 183 housekeeping_packet.packetID[1] = (unsigned char) (TM_PACKET_ID_HK);
184 housekeeping_packet.packetSequenceControl[0] = 0xc0;
185 housekeeping_packet.packetSequenceControl[1] = 0x00;
186 housekeeping_packet.packetLength[0] = 0x00;
187 housekeeping_packet.packetLength[1] = 0x77;
188 housekeeping_packet.dataFieldHeader[0] = 0x10;
189 housekeeping_packet.dataFieldHeader[1] = TM_TYPE_HK;
190 housekeeping_packet.dataFieldHeader[2] = TM_SUBTYPE_HK;
191 housekeeping_packet.dataFieldHeader[3] = TM_DESTINATION_ID_GROUND;
184 housekeeping_packet.packetSequenceControl[0] = TM_PACKET_SEQ_CTRL_STANDALONE;
185 housekeeping_packet.packetSequenceControl[1] = TM_PACKET_SEQ_CNT_DEFAULT;
186 housekeeping_packet.packetLength[0] = (unsigned char) (PACKET_LENGTH_HK >> 8);
187 housekeeping_packet.packetLength[1] = (unsigned char) (PACKET_LENGTH_HK );
188 housekeeping_packet.spare1_pusVersion_spare2 = DEFAULT_SPARE1_PUSVERSION_SPARE2;
189 housekeeping_packet.serviceType = TM_TYPE_HK;
190 housekeeping_packet.serviceSubType = TM_SUBTYPE_HK;
191 housekeeping_packet.destinationID = TM_DESTINATION_ID_GROUND;
192 192
193 193 status = rtems_rate_monotonic_cancel(HK_id);
194 194 if( status != RTEMS_SUCCESSFUL ) {
@@ -204,30 +204,21 rtems_task hous_task(rtems_task_argument
204 204 PRINTF1( "ERR *** in HOUS *** rtems_rate_monotonic_period *** code %d\n", status);
205 205 }
206 206 else {
207 housekeeping_packet.dataFieldHeader[4] = (unsigned char) (time_management_regs->coarse_time>>24);
208 housekeeping_packet.dataFieldHeader[5] = (unsigned char) (time_management_regs->coarse_time>>16);
209 housekeeping_packet.dataFieldHeader[6] = (unsigned char) (time_management_regs->coarse_time>>8);
210 housekeeping_packet.dataFieldHeader[7] = (unsigned char) (time_management_regs->coarse_time);
211 housekeeping_packet.dataFieldHeader[8] = (unsigned char) (time_management_regs->fine_time>>8);
212 housekeeping_packet.dataFieldHeader[9] = (unsigned char) (time_management_regs->fine_time);
207 housekeeping_packet.time[0] = (unsigned char) (time_management_regs->coarse_time>>24);
208 housekeeping_packet.time[1] = (unsigned char) (time_management_regs->coarse_time>>16);
209 housekeeping_packet.time[2] = (unsigned char) (time_management_regs->coarse_time>>8);
210 housekeeping_packet.time[3] = (unsigned char) (time_management_regs->coarse_time);
211 housekeeping_packet.time[4] = (unsigned char) (time_management_regs->fine_time>>8);
212 housekeeping_packet.time[5] = (unsigned char) (time_management_regs->fine_time);
213 213 housekeeping_packet.sid = SID_HK;
214 214
215 215 update_spacewire_statistics();
216 216
217 217 // SEND PACKET
218 result = write ( fdSPW, &housekeeping_packet, LEN_TM_LFR_HK);
219 if (status == -1) {
220 while (true) {
221 if (status != RTEMS_SUCCESSFUL) {
222 result = write ( fdSPW, &housekeeping_packet, LEN_TM_LFR_HK);
223 PRINTF("x")
224 sched_yield();
225 }
226 else {
227 PRINTF("\n")
228 break;
229 }
230 }
218 //result = write( fdSPW, &housekeeping_packet, LEN_TM_LFR_HK);
219 status = rtems_message_queue_send( misc_id[1], &spw_ioctl_send, sizeof(spw_ioctl_send));
220 if (status != RTEMS_SUCCESSFUL) {
221 PRINTF1("in HOUS *** ERR %d\n", (int) status)
231 222 }
232 223 }
233 224 }
@@ -239,3 +230,25 rtems_task hous_task(rtems_task_argument
239 230 exit( 1 );
240 231 }
241 232
233 rtems_task send_task( rtems_task_argument argument)
234 {
235 rtems_status_code status; // RTEMS status code
236 spw_ioctl_pkt_send spw_ioctl_send_CWF; // incoming spw_ioctl_pkt_send structure
237 size_t size; // size of the incoming TC packet
238
239 PRINTF("in SEND *** \n")
240
241 while(1)
242 {
243 status = rtems_message_queue_receive(misc_id[1], (char*) &spw_ioctl_send_CWF, &size,
244 RTEMS_WAIT, RTEMS_NO_TIMEOUT);
245 if (status!=RTEMS_SUCCESSFUL) PRINTF1("ERR *** in task ACTN *** error receiving a message, code %d \n", status)
246 else
247 {
248 status = write_spw(&spw_ioctl_send_CWF);
249 if (status != RTEMS_SUCCESSFUL) {
250 PRINTF("in SEND *** TRAFFIC JAM\n")
251 }
252 }
253 }
254 }
@@ -72,35 +72,69 void GetCRCAsTwoBytes(unsigned char* dat
72 72 crcAsTwoBytes[1] = (unsigned char) (Chk & 0x00ff);
73 73 }
74 74
75 void updateLFRCurrentMode()
76 {
77 lfrCurrentMode = (housekeeping_packet.lfr_status_word[0] & 0xf0) >> 4;
78 }
79
75 80 //*********************
76 81 // ACCEPTANCE FUNCTIONS
77 82 int TC_acceptance(ccsdsTelecommandPacket_t *TC, unsigned int tc_len_recv)
78 83 {
79 84 int ret = 0;
80 85 rtems_status_code status;
81 spw_ioctl_pkt_send spw_ioctl_send;
82 TMHeader_t TM_header;
83 unsigned int code = 0;
86 Packet_TM_LFR_TC_EXE_CORRUPTED_t packet;
87 unsigned int parserCode = 0;
84 88 unsigned char computed_CRC[2];
85 char data[ PACKET_LENGTH_TC_EXE_CORRUPTED + CCSDS_TC_TM_PACKET_OFFSET - TM_HEADER_LEN ];
89 unsigned int packetLength;
86 90
87 91 GetCRCAsTwoBytes( (unsigned char*) TC->packetID, computed_CRC, tc_len_recv + 5 );
88 code = TC_parser( TC, tc_len_recv ) ;
89 if ( (code == ILLEGAL_APID) | (code == WRONG_LEN_PACKET) | (code == INCOR_CHECKSUM)
90 | (code == ILL_TYPE) | (code == ILL_SUBTYPE) | (code == WRONG_APP_DATA) )
92 parserCode = TC_parser( TC, tc_len_recv ) ;
93 if ( (parserCode == ILLEGAL_APID) | (parserCode == WRONG_LEN_PACKET) | (parserCode == INCOR_CHECKSUM)
94 | (parserCode == ILL_TYPE) | (parserCode == ILL_SUBTYPE) | (parserCode == WRONG_APP_DATA) )
91 95 { // generate TM_LFR_TC_EXE_CORRUPTED
92 // BUILD HEADER
93 TM_build_header( TM_LFR_TC_EXE_ERR, PACKET_LENGTH_TC_EXE_CORRUPTED,
94 &TM_header, TC->sourceID); // TC source ID
95 // BUILD DATA
96 TM_build_data( TC, data, SID_EXE_CORR, computed_CRC);
97 // PREPARE TM SENDING
98 spw_ioctl_send.hlen = TM_HEADER_LEN + 4; // + 4 is for the protocole extra header
99 spw_ioctl_send.hdr = (char*) &TM_header;
100 spw_ioctl_send.dlen = 16;
101 spw_ioctl_send.data = data;
96 packetLength = (TC->packetLength[0] * 256) + TC->packetLength[1];
97 packet.targetLogicalAddress = CCSDS_DESTINATION_ID;
98 packet.protocolIdentifier = CCSDS_PROTOCOLE_ID;
99 packet.reserved = DEFAULT_RESERVED;
100 packet.userApplication = CCSDS_USER_APP;
101 // PACKET HEADER
102 packet.packetID[0] = (unsigned char) (TM_PACKET_ID_TC_EXE >> 8);
103 packet.packetID[1] = (unsigned char) (TM_PACKET_ID_TC_EXE );
104 packet.packetSequenceControl[0] = TM_PACKET_SEQ_CTRL_STANDALONE;
105 packet.packetSequenceControl[1] = TM_PACKET_SEQ_CNT_DEFAULT;
106 packet.packetLength[0] = (unsigned char) (PACKET_LENGTH_TC_EXE_CORRUPTED >> 8);
107 packet.packetLength[1] = (unsigned char) (PACKET_LENGTH_TC_EXE_CORRUPTED );
108 // DATA FIELD HEADER
109 packet.spare1_pusVersion_spare2 = DEFAULT_SPARE1_PUSVERSION_SPARE2;
110 packet.serviceType = TM_TYPE_TC_EXE;
111 packet.serviceSubType = TM_SUBTYPE_EXE_NOK;
112 packet.destinationID = TM_DESTINATION_ID_GROUND;
113 packet.time[0] = (time_management_regs->coarse_time>>24 );
114 packet.time[1] = (time_management_regs->coarse_time>>16 );
115 packet.time[2] = (time_management_regs->coarse_time>>8 );
116 packet.time[3] = (time_management_regs->coarse_time );
117 packet.time[4] = (time_management_regs->fine_time>>8 );
118 packet.time[5] = (time_management_regs->fine_time );
119 //
120 packet.tc_failure_code[0] = (unsigned char) (FAILURE_CODE_CORRUPTED >> 8);
121 packet.tc_failure_code[1] = (unsigned char) (FAILURE_CODE_CORRUPTED );
122 packet.telecommand_pkt_id[0] = TC->packetID[0];
123 packet.telecommand_pkt_id[1] = TC->packetID[1];
124 packet.pkt_seq_control[0] = TC->packetSequenceControl[0];
125 packet.pkt_seq_control[0] = TC->packetSequenceControl[1];
126 packet.tc_service = TC->serviceType;
127 packet.tc_subtype = TC->serviceSubType;
128 packet.pkt_len_rcv_value[0] = TC->packetLength[0];
129 packet.pkt_len_rcv_value[1] = TC->packetLength[1];
130 packet.pkt_datafieldsize_cnt[0] = currentTC_LEN_RCV[0];
131 packet.pkt_datafieldsize_cnt[1] = currentTC_LEN_RCV[1];
132 packet.rcv_crc[0] = TC->dataAndCRC[packetLength];
133 packet.rcv_crc[1] = TC->dataAndCRC[packetLength];
134 packet.computed_crc[0] = computed_CRC[0];
135 packet.computed_crc[1] = computed_CRC[1];
102 136 // SEND PACKET
103 status = ioctl( fdSPW, SPACEWIRE_IOCTRL_SEND, &spw_ioctl_send );
137 status = write( fdSPW, (char *) &packet, PACKET_LENGTH_TC_EXE_CORRUPTED + CCSDS_TC_TM_PACKET_OFFSET + 4);
104 138 }
105 139 else { // send valid TC to the action launcher
106 140 status = rtems_message_queue_send( misc_id[0], TC, tc_len_recv + CCSDS_TC_TM_PACKET_OFFSET + 3);
@@ -328,62 +362,6 unsigned char TM_build_header( enum TM_T
328 362 return LFR_SUCCESSFUL;
329 363 }
330 364
331 unsigned char TM_build_data(ccsdsTelecommandPacket_t *TC, char* data, unsigned int SID, unsigned char *computed_CRC)
332 {
333 unsigned int packetLength;
334 packetLength = (TC->packetLength[0] * 256) + TC->packetLength[1];
335 switch (SID){
336 case (SID_NOT_EXE):
337 break;
338 case (SID_NOT_IMP):
339 data[0] = (unsigned char) (SID_NOT_IMP >> 8);
340 data[1] = (unsigned char) SID_NOT_IMP;
341 data[2] = TC->packetID[0];
342 data[3] = TC->packetID[1];
343 data[4] = TC->packetSequenceControl[0];
344 data[5] = TC->packetSequenceControl[1];
345 data[6] = TC->serviceType; // type
346 data[7] = TC->serviceSubType; // subtype
347 break;
348 case (SID_EXE_ERR):
349 break;
350 case (SID_EXE_CORR):
351 data[0] = (unsigned char) (SID_EXE_CORR >> 8);
352 data[1] = (unsigned char) SID_EXE_CORR;
353 data[2] = TC->packetID[0];
354 data[3] = TC->packetID[1];
355 data[4] = TC->packetSequenceControl[0];
356 data[5] = TC->packetSequenceControl[1];
357 data[6] = TC->serviceType; // type
358 data[7] = TC->serviceSubType; // subtype
359 data[8] = currentTC_LEN_RCV[0];
360 data[9] = currentTC_LEN_RCV[1];
361 data[10] = TC->packetLength[0];
362 data[11] = TC->packetLength[1];
363 data[12] = TC->dataAndCRC[packetLength];
364 data[13] = TC->dataAndCRC[packetLength+1];
365 data[14] = computed_CRC[0];
366 data[15] = computed_CRC[1];
367 break;
368 default:
369 return 0;
370 }
371 return 1;
372 }
373
374 int create_message_queue( void )
375 {
376 rtems_status_code status;
377 misc_name[0] = rtems_build_name( 'Q', 'U', 'E', 'U' );
378 status = rtems_message_queue_create( misc_name[0], ACTION_MSG_QUEUE_COUNT, CCSDS_TC_PKT_MAX_SIZE,
379 RTEMS_FIFO | RTEMS_LOCAL, &misc_id[0] );
380 if (status!=RTEMS_SUCCESSFUL) {
381 PRINTF("in create_message_queue *** error creating message queue\n")
382 }
383
384 return 0;
385 }
386
387 365 //***********
388 366 // RTEMS TASK
389 367 rtems_task recv_task( rtems_task_argument unused )
@@ -453,46 +431,47 rtems_task actn_task( rtems_task_argumen
453 431 switch(subtype)
454 432 {
455 433 case TC_SUBTYPE_RESET:
456 result = action_default( &TC );
434 result = action_reset( &TC );
435 close_action( &TC, result );
457 436 break;
458 437 //
459 438 case TC_SUBTYPE_LOAD_COMM:
460 result = action_load_comm( &TC );
439 result = action_load_common_par( &TC );
461 440 close_action( &TC, result );
462 441 break;
463 442 //
464 443 case TC_SUBTYPE_LOAD_NORM:
465 result = action_load_norm( &TC );
444 result = action_load_normal_par( &TC );
466 445 close_action( &TC, result );
467 446 break;
468 447 //
469 448 case TC_SUBTYPE_LOAD_BURST:
470 result = action_load_burst( &TC );
449 result = action_load_burst_par( &TC );
471 450 close_action( &TC, result );
472 451 break;
473 452 //
474 453 case TC_SUBTYPE_LOAD_SBM1:
475 result = action_load_sbm1( &TC );
454 result = action_load_sbm1_par( &TC );
476 455 close_action( &TC, result );
477 456 break;
478 457 //
479 458 case TC_SUBTYPE_LOAD_SBM2:
480 result = action_load_sbm2( &TC );
459 result = action_load_sbm2_par( &TC );
481 460 close_action( &TC, result );
482 461 break;
483 462 //
484 463 case TC_SUBTYPE_DUMP:
485 result = action_dump( &TC );
464 result = action_dump_par( &TC );
486 465 close_action( &TC, result );
487 466 break;
488 467 //
489 468 case TC_SUBTYPE_ENTER:
490 result = action_enter( &TC );
469 result = action_enter_mode( &TC );
491 470 close_action( &TC, result );
492 471 break;
493 472 //
494 473 case TC_SUBTYPE_UPDT_INFO:
495 result = action_updt_info( &TC );
474 result = action_update_info( &TC );
496 475 close_action( &TC, result );
497 476 break;
498 477 //
@@ -507,7 +486,8 rtems_task actn_task( rtems_task_argumen
507 486 break;
508 487 //
509 488 case TC_SUBTYPE_UPDT_TIME:
510 result = action_updt_time( &TC );
489 result = action_update_time( &TC );
490 close_action( &TC, result );
511 491 break;
512 492 //
513 493 default:
@@ -546,73 +526,13 rtems_task dumb_task( rtems_task_argumen
546 526 //***********
547 527 // TC ACTIONS
548 528
549 int action_default(ccsdsTelecommandPacket_t *TC)
529 int action_reset(ccsdsTelecommandPacket_t *TC)
550 530 {
551 rtems_status_code status;
552 TMHeader_t header;
553 spw_ioctl_pkt_send spw_ioctl_send;
554 unsigned char data[10];
555
556 TM_build_header( TM_LFR_TC_EXE_ERR, PACKET_LENGTH_TC_EXE_NOT_IMPLEMENTED,
557 &header, TC->sourceID);
558
559 spw_ioctl_send.hlen = TM_HEADER_LEN + 4;
560 spw_ioctl_send.hdr = (char *) &header;
561 spw_ioctl_send.dlen = 8;
562 spw_ioctl_send.data = (char *) data;
563 spw_ioctl_send.options = 0;
564
565 data[0] = (char) (FAILURE_CODE_NOT_IMPLEMENTED >> 8);
566 data[1] = (char) FAILURE_CODE_NOT_IMPLEMENTED;
567 data[2] = TC->packetID[0];
568 data[3] = TC->packetID[1];
569 data[4] = TC->packetSequenceControl[0];
570 data[5] = TC->packetSequenceControl[1];
571 data[6] = TC->serviceType; // type
572 data[7] = TC->serviceSubType; // subtype
573
574 // SEND DATA
575 status = write_spw(&spw_ioctl_send);
576 if (status != RTEMS_SUCCESSFUL)
577 {
578 PRINTF("ERR *** in action_default *** send TM packet\n")
579 }
580
531 send_tm_lfr_tc_exe_not_implemented( TC );
581 532 return LFR_DEFAULT;
582 533 }
583 534
584 int action_enter(ccsdsTelecommandPacket_t *TC)
585 {
586 rtems_status_code status;
587 unsigned char requestedMode;
588
589 requestedMode = TC->dataAndCRC[1];
590
591 printf("try to enter mode %d\n", requestedMode);
592
593 status = transition_validation(requestedMode);
594
595 if ( status == LFR_SUCCESSFUL ) {
596 if ( (housekeeping_packet.lfr_status_word[0] & 0xf0) != LFR_MODE_STANDBY)
597 {
598 status = stop_current_mode();
599 }
600 if (status != RTEMS_SUCCESSFUL)
601 {
602 PRINTF("ERR *** in action_enter *** stop_current_mode\n")
603 }
604 status = enter_mode(requestedMode, TC);
605 }
606 else
607 {
608 PRINTF("ERR *** in action_enter *** transition rejected\n")
609 send_tm_lfr_tc_exe_not_executable( TC );
610 }
611
612 return status;
613 }
614
615 int action_load_comm(ccsdsTelecommandPacket_t *TC)
535 int action_load_common_par(ccsdsTelecommandPacket_t *TC)
616 536 {
617 537 parameter_dump_packet.unused0 = TC->dataAndCRC[0];
618 538 parameter_dump_packet.bw_sp0_sp1_r0_r1 = TC->dataAndCRC[1];
@@ -622,7 +542,7 int action_load_comm(ccsdsTelecommandPac
622 542 return LFR_SUCCESSFUL;
623 543 }
624 544
625 int action_load_norm(ccsdsTelecommandPacket_t *TC)
545 int action_load_normal_par(ccsdsTelecommandPacket_t *TC)
626 546 {
627 547 int result;
628 548 unsigned char lfrMode;
@@ -652,7 +572,7 int action_load_norm(ccsdsTelecommandPac
652 572 return result;
653 573 }
654 574
655 int action_load_burst(ccsdsTelecommandPacket_t *TC)
575 int action_load_burst_par(ccsdsTelecommandPacket_t *TC)
656 576 {
657 577 int result;
658 578 unsigned char lfrMode;
@@ -674,7 +594,7 int action_load_burst(ccsdsTelecommandPa
674 594 return result;
675 595 }
676 596
677 int action_load_sbm1(ccsdsTelecommandPacket_t *TC)
597 int action_load_sbm1_par(ccsdsTelecommandPacket_t *TC)
678 598 {
679 599 int result;
680 600 unsigned char lfrMode;
@@ -696,7 +616,7 int action_load_sbm1(ccsdsTelecommandPac
696 616 return result;
697 617 }
698 618
699 int action_load_sbm2(ccsdsTelecommandPacket_t *TC)
619 int action_load_sbm2_par(ccsdsTelecommandPacket_t *TC)
700 620 {
701 621 int result;
702 622 unsigned char lfrMode;
@@ -718,7 +638,7 int action_load_sbm2(ccsdsTelecommandPac
718 638 return result;
719 639 }
720 640
721 int action_dump(ccsdsTelecommandPacket_t *TC)
641 int action_dump_par(ccsdsTelecommandPacket_t *TC)
722 642 {
723 643 int status;
724 644 // send parameter dump packet
@@ -737,7 +657,45 int action_dump(ccsdsTelecommandPacket_t
737 657 return status;
738 658 }
739 659
740 int action_updt_info(ccsdsTelecommandPacket_t *TC) {
660 int action_enter_mode(ccsdsTelecommandPacket_t *TC)
661 {
662 rtems_status_code status;
663 unsigned char requestedMode;
664
665 requestedMode = TC->dataAndCRC[1];
666
667 printf("try to enter mode %d\n", requestedMode);
668
669 #ifdef PRINT_TASK_STATISTICS
670 if (requestedMode != LFR_MODE_STANDBY)
671 {
672 rtems_cpu_usage_reset();
673 }
674 #endif
675
676 status = transition_validation(requestedMode);
677
678 if ( status == LFR_SUCCESSFUL ) {
679 if ( lfrCurrentMode != LFR_MODE_STANDBY)
680 {
681 status = stop_current_mode();
682 }
683 if (status != RTEMS_SUCCESSFUL)
684 {
685 PRINTF("ERR *** in action_enter *** stop_current_mode\n")
686 }
687 status = enter_mode(requestedMode, TC);
688 }
689 else
690 {
691 PRINTF("ERR *** in action_enter *** transition rejected\n")
692 send_tm_lfr_tc_exe_not_executable( TC );
693 }
694
695 return status;
696 }
697
698 int action_update_info(ccsdsTelecommandPacket_t *TC) {
741 699 unsigned int val;
742 700 int result;
743 701 unsigned char lfrMode;
@@ -746,7 +704,7 int action_updt_info(ccsdsTelecommandPac
746 704 lfrMode = (housekeeping_packet.lfr_status_word[0] & 0xf0) >> 4;
747 705
748 706 if ( (lfrMode == LFR_MODE_STANDBY) ) {
749 send_tm_lfr_tc_exe_not_executable( TC );
707 send_tm_lfr_tc_exe_not_implemented( TC );
750 708 result = LFR_DEFAULT;
751 709 }
752 710 else {
@@ -799,7 +757,7 int action_disable_calibration(ccsdsTele
799 757 return result;
800 758 }
801 759
802 int action_updt_time(ccsdsTelecommandPacket_t *TC)
760 int action_update_time(ccsdsTelecommandPacket_t *TC)
803 761 {
804 762 unsigned int val;
805 763
@@ -812,7 +770,7 int action_updt_time(ccsdsTelecommandPac
812 770 val++;
813 771 housekeeping_packet.hk_lfr_update_time_tc_cnt[0] = (unsigned char) (val >> 8);
814 772 housekeeping_packet.hk_lfr_update_time_tc_cnt[1] = (unsigned char) (val);
815 //time_management_regs->ctrl = time_management_regs->ctrl | 1;
773 time_management_regs->ctrl = time_management_regs->ctrl | 1;
816 774
817 775 return LFR_SUCCESSFUL;
818 776 }
@@ -823,14 +781,11 int action_updt_time(ccsdsTelecommandPac
823 781 int transition_validation(unsigned char requestedMode)
824 782 {
825 783 int status;
826 unsigned char lfrMode;
827
828 lfrMode = (housekeeping_packet.lfr_status_word[0] & 0xf0) >> 4;
829 784
830 785 switch (requestedMode)
831 786 {
832 787 case LFR_MODE_STANDBY:
833 if ( lfrMode == LFR_MODE_STANDBY ) {
788 if ( lfrCurrentMode == LFR_MODE_STANDBY ) {
834 789 status = LFR_DEFAULT;
835 790 }
836 791 else
@@ -839,7 +794,7 int transition_validation(unsigned char
839 794 }
840 795 break;
841 796 case LFR_MODE_NORMAL:
842 if ( lfrMode == LFR_MODE_NORMAL ) {
797 if ( lfrCurrentMode == LFR_MODE_NORMAL ) {
843 798 status = LFR_DEFAULT;
844 799 }
845 800 else {
@@ -847,7 +802,7 int transition_validation(unsigned char
847 802 }
848 803 break;
849 804 case LFR_MODE_BURST:
850 if ( lfrMode == LFR_MODE_BURST ) {
805 if ( lfrCurrentMode == LFR_MODE_BURST ) {
851 806 status = LFR_DEFAULT;
852 807 }
853 808 else {
@@ -855,7 +810,7 int transition_validation(unsigned char
855 810 }
856 811 break;
857 812 case LFR_MODE_SBM1:
858 if ( lfrMode == LFR_MODE_SBM1 ) {
813 if ( lfrCurrentMode == LFR_MODE_SBM1 ) {
859 814 status = LFR_DEFAULT;
860 815 }
861 816 else {
@@ -863,7 +818,7 int transition_validation(unsigned char
863 818 }
864 819 break;
865 820 case LFR_MODE_SBM2:
866 if ( lfrMode == LFR_MODE_SBM2 ) {
821 if ( lfrCurrentMode == LFR_MODE_SBM2 ) {
867 822 status = LFR_DEFAULT;
868 823 }
869 824 else {
@@ -897,9 +852,11 int stop_current_mode()
897 852 #else
898 853 LEON_Mask_interrupt( IRQ_WAVEFORM_PICKER ); // mask waveform picker interrupt
899 854 LEON_Clear_interrupt( IRQ_WAVEFORM_PICKER ); // clear waveform picker interrupt
855 LEON_Mask_interrupt( IRQ_SPECTRAL_MATRIX ); // mask spectral matrix interrupt
856 LEON_Clear_interrupt( IRQ_SPECTRAL_MATRIX ); // clear spectral matrix interrupt
900 857 #endif
858 //**********************
901 859 // suspend several tasks
902
903 860 if (lfrMode != LFR_MODE_STANDBY) {
904 861 suspend_science_tasks();
905 862 }
@@ -909,10 +866,12 int stop_current_mode()
909 866 PRINTF("ERR *** in stop_current_mode *** suspending tasks\n")
910 867 }
911 868
869 //*************************
912 870 // initialize the registers
913 871 #ifdef GSA
914 872 #else
915 waveform_picker_regs->burst_enable = 0x00; // initialize
873 reset_wfp_burst_enable(); // reset burst and enable bits
874 reset_wfp_status(); // reset all the status bits
916 875 #endif
917 876
918 877 return status;
@@ -922,6 +881,11 int enter_mode(unsigned char mode, ccsds
922 881 {
923 882 rtems_status_code status;
924 883
884 status = RTEMS_UNSATISFIED;
885
886 housekeeping_packet.lfr_status_word[0] = (unsigned char) ((mode << 4) + 0x0d);
887 lfrCurrentMode = mode;
888
925 889 switch(mode){
926 890 case LFR_MODE_STANDBY:
927 891 status = enter_standby_mode( TC );
@@ -942,20 +906,25 int enter_mode(unsigned char mode, ccsds
942 906 status = RTEMS_UNSATISFIED;
943 907 }
944 908
945 if (status == RTEMS_SUCCESSFUL)
909 if (status != RTEMS_SUCCESSFUL)
946 910 {
947 housekeeping_packet.lfr_status_word[0] = (unsigned char) ((mode << 4) + 0x0d);
911 PRINTF("in enter_mode *** ERR\n")
912 status = RTEMS_UNSATISFIED;
948 913 }
949 914
950 915 return status;
951 916 }
952 917
953 int enter_standby_mode(ccsdsTelecommandPacket_t *TC)
918 int enter_standby_mode()
954 919 {
920 reset_waveform_picker_regs();
921 #ifdef PRINT_TASK_STATISTICS
922 rtems_cpu_usage_report();
923 #endif
955 924 return LFR_SUCCESSFUL;
956 925 }
957 926
958 int enter_normal_mode( ccsdsTelecommandPacket_t *TC )
927 int enter_normal_mode()
959 928 {
960 929 rtems_status_code status;
961 930
@@ -971,13 +940,14 int enter_normal_mode( ccsdsTelecommandP
971 940 LEON_Clear_interrupt( IRQ_SM ); // the IRQ_SM seems to be incompatible with the IRQ_WF on the xilinx board
972 941 LEON_Unmask_interrupt( IRQ_SM );
973 942 #else
943 //****************
974 944 // waveform picker
975 945 LEON_Clear_interrupt( IRQ_WAVEFORM_PICKER );
976 946 LEON_Unmask_interrupt( IRQ_WAVEFORM_PICKER );
977 947 reset_waveform_picker_regs();
978 948 set_wfp_burst_enable_register(LFR_MODE_NORMAL);
949 //****************
979 950 // spectral matrix
980 //
981 951 set_local_nb_interrupt_f0_MAX();
982 952 LEON_Clear_interrupt( IRQ_SPECTRAL_MATRIX ); // the IRQ_SM seems to be incompatible with the IRQ_WF on the xilinx board
983 953 LEON_Unmask_interrupt( IRQ_SPECTRAL_MATRIX );
@@ -988,7 +958,7 int enter_normal_mode( ccsdsTelecommandP
988 958 return status;
989 959 }
990 960
991 int enter_burst_mode(ccsdsTelecommandPacket_t *TC)
961 int enter_burst_mode()
992 962 {
993 963 rtems_status_code status;
994 964 unsigned char lfrMode;
@@ -998,22 +968,18 int enter_burst_mode(ccsdsTelecommandPac
998 968 status = restart_science_tasks();
999 969
1000 970 #ifdef GSA
971 LEON_Unmask_interrupt( IRQ_SM );
1001 972 #else
1002 LEON_Clear_interrupt( IRQ_WAVEFORM_PICKER );
1003 LEON_Unmask_interrupt( IRQ_WAVEFORM_PICKER );
1004 reset_waveform_picker_regs();
1005 set_wfp_burst_enable_register(LFR_MODE_BURST);
1006 waveform_picker_regs->burst_enable = 0x40; // [0100 0000] burst f2, f1, f0 enable f3 f2 f1 f0
1007 waveform_picker_regs->burst_enable = waveform_picker_regs->burst_enable | 0x04;
1008 waveform_picker_regs->status = 0x00;
973 LEON_Clear_interrupt( IRQ_WAVEFORM_PICKER );
974 LEON_Unmask_interrupt( IRQ_WAVEFORM_PICKER );
975 reset_waveform_picker_regs();
976 set_wfp_burst_enable_register(LFR_MODE_BURST);
1009 977 #endif
1010 978
1011 LEON_Unmask_interrupt( IRQ_SM );
1012
1013 979 return status;
1014 980 }
1015 981
1016 int enter_sbm1_mode(ccsdsTelecommandPacket_t *TC)
982 int enter_sbm1_mode()
1017 983 {
1018 984 rtems_status_code status;
1019 985
@@ -1024,20 +990,18 int enter_sbm1_mode(ccsdsTelecommandPack
1024 990 reset_local_sbm1_nb_cwf_sent();
1025 991
1026 992 #ifdef GSA
993 LEON_Unmask_interrupt( IRQ_SM );
1027 994 #else
1028 995 LEON_Clear_interrupt( IRQ_WAVEFORM_PICKER );
1029 996 LEON_Unmask_interrupt( IRQ_WAVEFORM_PICKER );
1030 997 reset_waveform_picker_regs();
1031 998 set_wfp_burst_enable_register(LFR_MODE_SBM1);
1032 waveform_picker_regs->status = 0x00;
1033 999 #endif
1034 1000
1035 LEON_Unmask_interrupt( IRQ_SM );
1036
1037 1001 return status;
1038 1002 }
1039 1003
1040 int enter_sbm2_mode(ccsdsTelecommandPacket_t *TC)
1004 int enter_sbm2_mode()
1041 1005 {
1042 1006 rtems_status_code status;
1043 1007
@@ -1048,54 +1012,63 int enter_sbm2_mode(ccsdsTelecommandPack
1048 1012 reset_local_sbm2_nb_cwf_sent();
1049 1013
1050 1014 #ifdef GSA
1015 LEON_Unmask_interrupt( IRQ_SM );
1051 1016 #else
1052 1017 LEON_Clear_interrupt( IRQ_WAVEFORM_PICKER );
1053 1018 LEON_Unmask_interrupt( IRQ_WAVEFORM_PICKER );
1054 1019 reset_waveform_picker_regs();
1055 1020 set_wfp_burst_enable_register(LFR_MODE_SBM2);
1056 waveform_picker_regs->status = 0x00;
1057 1021 #endif
1058 1022
1059 LEON_Unmask_interrupt( IRQ_SM );
1060
1061 1023 return status;
1062 1024 }
1063 1025
1064 1026 int restart_science_tasks()
1065 1027 {
1066 rtems_status_code status;
1028 rtems_status_code status[6];
1029 rtems_status_code ret;
1067 1030
1068 status = rtems_task_restart( Task_id[TASKID_AVF0], 0 );
1031 ret = RTEMS_SUCCESSFUL;
1069 1032
1070 if (status == RTEMS_SUCCESSFUL) {
1071 status = rtems_task_restart( Task_id[TASKID_BPF0], 0 );
1072 if (status == RTEMS_SUCCESSFUL) {
1073 status = rtems_task_restart( Task_id[TASKID_WFRM], 0 );
1074 if (status == RTEMS_SUCCESSFUL) {
1075 status = rtems_task_restart( Task_id[TASKID_CWF3], 0 );
1076 }
1077 }
1033 status[0] = rtems_task_restart( Task_id[TASKID_AVF0], 1 );
1034 status[1] = rtems_task_restart( Task_id[TASKID_BPF0],1 );
1035 status[2] = rtems_task_restart( Task_id[TASKID_WFRM],1 );
1036 status[3] = rtems_task_restart( Task_id[TASKID_CWF3],1 );
1037 status[4] = rtems_task_restart( Task_id[TASKID_CWF2],1 );
1038 status[5] = rtems_task_restart( Task_id[TASKID_CWF1],1 );
1039
1040 if ( (status[0] != RTEMS_SUCCESSFUL) || (status[1] != RTEMS_SUCCESSFUL) || (status[2] != RTEMS_SUCCESSFUL) ||
1041 (status[3] != RTEMS_SUCCESSFUL) || (status[4] != RTEMS_SUCCESSFUL) || (status[5] != RTEMS_SUCCESSFUL) )
1042 {
1043 ret = RTEMS_UNSATISFIED;
1044 PRINTF("in restart_science_tasks *** ERR\n")
1078 1045 }
1079 1046
1080 return status;
1047 return ret;
1081 1048 }
1082 1049
1083 1050 int suspend_science_tasks()
1084 1051 {
1085 rtems_status_code status;
1052 rtems_status_code status[6];
1053 rtems_status_code ret;
1054
1055 ret = RTEMS_SUCCESSFUL;
1086 1056
1087 status = rtems_task_suspend( Task_id[TASKID_AVF0] );
1088 if (status == RTEMS_SUCCESSFUL) {
1089 status = rtems_task_suspend( Task_id[TASKID_BPF0] );
1090 if (status == RTEMS_SUCCESSFUL) {
1091 status = rtems_task_suspend( Task_id[TASKID_WFRM] );
1092 if (status == RTEMS_SUCCESSFUL) {
1093 status = rtems_task_suspend( Task_id[TASKID_CWF3] );
1094 }
1095 }
1057 status[0] = rtems_task_suspend( Task_id[TASKID_AVF0] );
1058 status[1] = rtems_task_suspend( Task_id[TASKID_BPF0] );
1059 status[2] = rtems_task_suspend( Task_id[TASKID_WFRM] );
1060 status[3] = rtems_task_suspend( Task_id[TASKID_CWF3] );
1061 status[4] = rtems_task_suspend( Task_id[TASKID_CWF2] );
1062 status[5] = rtems_task_suspend( Task_id[TASKID_CWF1] );
1063
1064 if ( (status[0] != RTEMS_SUCCESSFUL) || (status[1] != RTEMS_SUCCESSFUL) || (status[2] != RTEMS_SUCCESSFUL) ||
1065 (status[3] != RTEMS_SUCCESSFUL) || (status[4] != RTEMS_SUCCESSFUL) || (status[5] != RTEMS_SUCCESSFUL) )
1066 {
1067 ret = RTEMS_UNSATISFIED;
1068 PRINTF("in suspend_science_tasks *** ERR\n")
1096 1069 }
1097 1070
1098 return status;
1071 return ret;
1099 1072 }
1100 1073
1101 1074 //****************
@@ -1103,6 +1076,7 int suspend_science_tasks()
1103 1076
1104 1077 int send_tm_lfr_tc_exe_success(ccsdsTelecommandPacket_t *TC)
1105 1078 {
1079 int ret;
1106 1080 rtems_status_code status;
1107 1081 TMHeader_t TM_header;
1108 1082 char data[4];
@@ -1125,9 +1099,14 int send_tm_lfr_tc_exe_success(ccsdsTele
1125 1099 spw_ioctl_send.options = 0;
1126 1100
1127 1101 // SEND DATA
1128 status = ioctl( fdSPW, SPACEWIRE_IOCTRL_SEND, &spw_ioctl_send );
1102 //status = ioctl( fdSPW, SPACEWIRE_IOCTRL_SEND, &spw_ioctl_send );
1103 status = rtems_message_queue_send( misc_id[1], &spw_ioctl_send, sizeof(spw_ioctl_send));
1104 if (status != RTEMS_SUCCESSFUL) {
1105 PRINTF("in send_tm_lfr_tc_exe_success *** ERR\n")
1106 ret = LFR_DEFAULT;
1107 }
1129 1108
1130 return LFR_SUCCESSFUL;
1109 return ret;
1131 1110 }
1132 1111
1133 1112 int send_tm_lfr_tc_exe_not_executable(ccsdsTelecommandPacket_t *TC)
@@ -1268,7 +1247,10 void close_action(ccsdsTelecommandPacket
1268 1247 unsigned int val = 0;
1269 1248 if (result == LFR_SUCCESSFUL)
1270 1249 {
1271 send_tm_lfr_tc_exe_success( TC );
1250 if ( !( (TC->serviceType==TC_TYPE_TIME) && (TC->serviceSubType==TC_SUBTYPE_UPDT_TIME) ) )
1251 {
1252 send_tm_lfr_tc_exe_success( TC );
1253 }
1272 1254 update_last_TC_exe( TC );
1273 1255 val = housekeeping_packet.hk_dpu_exe_tc_lfr_cnt[0] * 256 + housekeeping_packet.hk_dpu_exe_tc_lfr_cnt[1];
1274 1256 val++;
This diff has been collapsed as it changes many lines, (924 lines changed) Show them Hide them
@@ -1,15 +1,23
1 1 #include <wf_handler.h>
2 2
3 Header_TM_LFR_SCIENCE_SWF_t headerSWF_F0_F1_F2[3][7];
4 Header_TM_LFR_SCIENCE_CWF_t headerCWF_F1[7];
5 Header_TM_LFR_SCIENCE_CWF_t headerCWF_F2_BURST[7];
6 Header_TM_LFR_SCIENCE_CWF_t headerCWF_F2_SBM1[7];
7 Header_TM_LFR_SCIENCE_CWF_t headerCWF_F3[7];
8
9 unsigned char doubleSendCWF1 = 0;
10 unsigned char doubleSendCWF2 = 0;
11
3 12 rtems_isr waveforms_isr( rtems_vector_number vector )
4 13 {
5 unsigned char lfrMode;
6 lfrMode = (housekeeping_packet.lfr_status_word[0] & 0xf0) >> 4;
7 14
8 15 #ifdef GSA
9 16 #else
10 if ( (lfrMode != LFR_MODE_STANDBY) & (lfrMode != LFR_MODE_BURST) )
17 if ( (lfrCurrentMode == LFR_MODE_NORMAL)
18 || (lfrCurrentMode == LFR_MODE_SBM1) || (lfrCurrentMode == LFR_MODE_SBM2) )
11 19 { // in modes other than STANDBY and BURST, send the CWF_F3 data
12 if ((waveform_picker_regs->status & 0x08) == 0x08){ // f3 is full
20 if ((waveform_picker_regs->status & 0x08) == 0x08){ // [1000] f3 is full
13 21 // (1) change the receiving buffer for the waveform picker
14 22 if (waveform_picker_regs->addr_data_f3 == (int) wf_cont_f3) {
15 23 waveform_picker_regs->addr_data_f3 = (int) (wf_cont_f3_bis);
@@ -18,132 +26,134 rtems_isr waveforms_isr( rtems_vector_nu
18 26 waveform_picker_regs->addr_data_f3 = (int) (wf_cont_f3);
19 27 }
20 28 // (2) send an event for the waveforms transmission
21 if (rtems_event_send( Task_id[TASKID_CWF3], RTEMS_EVENT_MODE_NORMAL_CWF_F3 ) != RTEMS_SUCCESSFUL) {
29 if (rtems_event_send( Task_id[TASKID_CWF3], RTEMS_EVENT_0 ) != RTEMS_SUCCESSFUL) {
22 30 rtems_event_send( Task_id[TASKID_DUMB], RTEMS_EVENT_2 );
23 31 }
24 waveform_picker_regs->status = waveform_picker_regs->status & 0x0007; // reset the f3 full bit to 0
32 waveform_picker_regs->status = waveform_picker_regs->status & 0xfffff777; // reset f3 bits to 0, [1111 0111 0111 0111]
25 33 }
26 34 }
27 35 #endif
28 36
29 switch(lfrMode)
37 switch(lfrCurrentMode)
30 38 {
31 39 //********
32 40 // STANDBY
33 41 case(LFR_MODE_STANDBY):
34 break;
42 break;
35 43
36 44 //******
37 45 // NORMAL
38 46 case(LFR_MODE_NORMAL):
39 47 #ifdef GSA
40 PRINTF("in waveform_isr *** unexpected waveform picker interruption\n")
48 PRINTF("in waveform_isr *** unexpected waveform picker interruption\n")
41 49 #else
42 if ( (waveform_picker_regs->burst_enable & 0x7) == 0x0 ){ // if no channel is enable
50 if ( (waveform_picker_regs->status & 0x7) == 0x7 ){ // [0111] f2 f1 and f0 are full
51 if (rtems_event_send( Task_id[TASKID_WFRM], RTEMS_EVENT_MODE_NORMAL ) != RTEMS_SUCCESSFUL) {
43 52 rtems_event_send( Task_id[TASKID_DUMB], RTEMS_EVENT_2 );
44 53 }
45 else {
46 if ( (waveform_picker_regs->status & 0x7) == 0x7 ){ // f2 f1 and f0 are full
47 waveform_picker_regs->burst_enable = waveform_picker_regs->burst_enable & 0x08;
48 if (rtems_event_send( Task_id[TASKID_WFRM], RTEMS_EVENT_MODE_NORMAL ) != RTEMS_SUCCESSFUL) {
49 rtems_event_send( Task_id[TASKID_DUMB], RTEMS_EVENT_2 );
50 }
51 }
52 }
54 }
55 waveform_picker_regs->status = waveform_picker_regs->status & 0xf888; // [1111 1000 1000 1000] f2, f1, f0 bits =0
53 56 #endif
54 break;
57 break;
55 58
56 59 //******
57 60 // BURST
58 61 case(LFR_MODE_BURST):
59 62 #ifdef GSA
60 PRINTF("in waveform_isr *** unexpected waveform picker interruption\n")
63 PRINTF("in waveform_isr *** unexpected waveform picker interruption\n")
61 64 #else
62 if (waveform_picker_regs->burst_enable == 0x44) {
63 if (waveform_picker_regs->addr_data_f2 == (int) wf_snap_f2) {
64 waveform_picker_regs->addr_data_f2 = (int) (wf_snap_f2_bis);
65 }
66 else {
67 waveform_picker_regs->addr_data_f2 = (int) (wf_snap_f2);
68 }
69 if (rtems_event_send( Task_id[TASKID_WFRM], RTEMS_EVENT_MODE_BURST ) != RTEMS_SUCCESSFUL) {
70 PRINTF("in waveforms_isr *** Error sending event to WFRM\n")
71 rtems_event_send( Task_id[TASKID_DUMB], RTEMS_EVENT_2 );
72 }
65 if ((waveform_picker_regs->status & 0x04) == 0x04){ // [0100] check the f2 full bit
66 // (1) change the receiving buffer for the waveform picker
67 if (waveform_picker_regs->addr_data_f2 == (int) wf_snap_f2) {
68 waveform_picker_regs->addr_data_f2 = (int) (wf_snap_f2_bis);
69 }
70 else {
71 waveform_picker_regs->addr_data_f2 = (int) (wf_snap_f2);
73 72 }
74 waveform_picker_regs->status = 0x00;
73 // (2) send an event for the waveforms transmission
74 if (rtems_event_send( Task_id[TASKID_CWF2], RTEMS_EVENT_MODE_BURST ) != RTEMS_SUCCESSFUL) {
75 rtems_event_send( Task_id[TASKID_DUMB], RTEMS_EVENT_2 );
76 }
77 waveform_picker_regs->status = waveform_picker_regs->status & 0xfffffbbb; // [1111 1011 1011 1011] f2 bits = 0
78 }
75 79 #endif
76 break;
80 break;
77 81
78 82 //*****
79 83 // SBM1
80 84 case(LFR_MODE_SBM1):
81 85 #ifdef GSA
82 PRINTF("in waveform_isr *** unexpected waveform picker interruption\n")
86 PRINTF("in waveform_isr *** unexpected waveform picker interruption\n")
83 87 #else
84 if ((waveform_picker_regs->status & 0x02) == 0x02){ // [0010] check the f1 full bit
85 // (1) change the receiving buffer for the waveform picker
86 if (waveform_picker_regs->addr_data_f1 == (int) wf_snap_f1) {
87 waveform_picker_regs->addr_data_f1 = (int) (wf_snap_f1_bis);
88 }
89 else {
90 waveform_picker_regs->addr_data_f1 = (int) (wf_snap_f1);
91 }
92 // (2) send an event for the waveforms transmission
93 if (rtems_event_send( Task_id[TASKID_WFRM], RTEMS_EVENT_MODE_SBM1 ) != RTEMS_SUCCESSFUL) {
94 PRINTF("in waveforms_isr *** Error sending event to WFRM\n")
95 rtems_event_send( Task_id[TASKID_DUMB], RTEMS_EVENT_2 );
96 }
97 waveform_picker_regs->status = waveform_picker_regs->status & 0x000d; // reset the f1 full bit to 0
88 if ((waveform_picker_regs->status & 0x02) == 0x02){ // [0010] check the f1 full bit
89 // (1) change the receiving buffer for the waveform picker
90 if ( param_local.local_sbm1_nb_cwf_sent == (param_local.local_sbm1_nb_cwf_max-1) )
91 {
92 waveform_picker_regs->addr_data_f1 = (int) (wf_snap_f1_norm);
93 }
94 else if ( waveform_picker_regs->addr_data_f1 == (int) wf_snap_f1_norm )
95 {
96 doubleSendCWF1 = 1;
97 waveform_picker_regs->addr_data_f1 = (int) (wf_snap_f1);
98 }
99 else if ( waveform_picker_regs->addr_data_f1 == (int) wf_snap_f1 ) {
100 waveform_picker_regs->addr_data_f1 = (int) (wf_snap_f1_bis);
98 101 }
99 if ( ( (waveform_picker_regs->status & 0x05) == 0x05 ) ) { // [0101] check the f2 and f0 full bit
100 if (rtems_event_send( Task_id[TASKID_WFRM], RTEMS_EVENT_MODE_NORMAL ) != RTEMS_SUCCESSFUL) {
101 PRINTF("in waveforms_isr *** Error sending event to WFRM\n")
102 rtems_event_send( Task_id[TASKID_DUMB], RTEMS_EVENT_2 );
103 }
104 waveform_picker_regs->burst_enable = waveform_picker_regs->burst_enable | 0x05; // [0101] // enable f2 and f0
105 waveform_picker_regs->status = waveform_picker_regs->status & 0xfffffaaa; // set to 0 the bits related to f2 and f0
102 else {
103 waveform_picker_regs->addr_data_f1 = (int) (wf_snap_f1);
104 }
105 // (2) send an event for the waveforms transmission
106 if (rtems_event_send( Task_id[TASKID_CWF1], RTEMS_EVENT_MODE_SBM1 ) != RTEMS_SUCCESSFUL) {
107 rtems_event_send( Task_id[TASKID_DUMB], RTEMS_EVENT_2 );
106 108 }
109 waveform_picker_regs->status = waveform_picker_regs->status & 0xfffffddd; // [1111 1101 1101 1101] f1 bit = 0
110 }
111 if ( ( (waveform_picker_regs->status & 0x05) == 0x05 ) ) { // [0101] check the f2 and f0 full bit
112 if (rtems_event_send( Task_id[TASKID_WFRM], RTEMS_EVENT_MODE_NORMAL ) != RTEMS_SUCCESSFUL) {
113 rtems_event_send( Task_id[TASKID_DUMB], RTEMS_EVENT_2 );
114 }
115 waveform_picker_regs->status = waveform_picker_regs->status & 0xfffffaaa; // [1111 1010 1010 1010] f2 and f0 bits = 0
116 reset_local_sbm1_nb_cwf_sent();
117 }
107 118
108 119 #endif
109 break;
120 break;
110 121
111 122 //*****
112 123 // SBM2
113 124 case(LFR_MODE_SBM2):
114 125 #ifdef GSA
115 PRINTF("in waveform_isr *** unexpected waveform picker interruption\n")
126 PRINTF("in waveform_isr *** unexpected waveform picker interruption\n")
116 127 #else
117 if ((waveform_picker_regs->status & 0x04) == 0x04){ // check the f2 full bit
118 // (1) change the receiving buffer for the waveform picker
119 if (waveform_picker_regs->addr_data_f2 == (int) wf_snap_f2) {
120 waveform_picker_regs->addr_data_f2 = (int) (wf_snap_f2_bis);
121 }
122 else {
123 waveform_picker_regs->addr_data_f2 = (int) (wf_snap_f2);
124 }
125 // (2) send an event for the waveforms transmission
126 if (rtems_event_send( Task_id[TASKID_WFRM], RTEMS_EVENT_MODE_SBM2 ) != RTEMS_SUCCESSFUL) {
127 PRINTF("in waveforms_isr *** Error sending event to WFRM\n")
128 rtems_event_send( Task_id[TASKID_DUMB], RTEMS_EVENT_2 );
129 }
130 waveform_picker_regs->status = waveform_picker_regs->status & 0xfffffbbb; // [1011]
128 if ((waveform_picker_regs->status & 0x04) == 0x04){ // [0100] check the f2 full bit
129 // (1) change the receiving buffer for the waveform picker
130 if ( waveform_picker_regs->addr_data_f2 == (int) wf_snap_f2 ) {
131 waveform_picker_regs->addr_data_f2 = (int) (wf_snap_f2_bis);
132 }
133 else {
134 waveform_picker_regs->addr_data_f2 = (int) (wf_snap_f2);
135 }
136 // (2) send an event for the waveforms transmission
137 if (rtems_event_send( Task_id[TASKID_CWF2], RTEMS_EVENT_MODE_SBM2 ) != RTEMS_SUCCESSFUL) {
138 rtems_event_send( Task_id[TASKID_DUMB], RTEMS_EVENT_2 );
131 139 }
132 if ( ( (waveform_picker_regs->status & 0x03) == 0x03 ) ) { // [0011] f3 f2 f1 f0, check the f2 and f0 full bit
133 if (rtems_event_send( Task_id[TASKID_WFRM], RTEMS_EVENT_MODE_NORMAL ) != RTEMS_SUCCESSFUL) {
134 PRINTF("in waveforms_isr *** Error sending event to WFRM\n")
135 rtems_event_send( Task_id[TASKID_DUMB], RTEMS_EVENT_2 );
136 }
137 waveform_picker_regs->burst_enable = waveform_picker_regs->burst_enable | 0x03; // [0011] // enable f2 and f0
138 waveform_picker_regs->status = waveform_picker_regs->status & 0xfffffccc; // set to 0 the bits related to f1 and f0
140 waveform_picker_regs->status = waveform_picker_regs->status & 0xfffffbbb; // [1111 1011 1011 1011] f2 bit = 0
141 }
142 if ( ( (waveform_picker_regs->status & 0x03) == 0x03 ) ) { // [0011] f3 f2 f1 f0, f1 and f0 are full
143 if (rtems_event_send( Task_id[TASKID_WFRM], RTEMS_EVENT_MODE_SBM2 ) != RTEMS_SUCCESSFUL) {
144 rtems_event_send( Task_id[TASKID_DUMB], RTEMS_EVENT_2 );
139 145 }
146 waveform_picker_regs->status = waveform_picker_regs->status & 0xfffffccc; // [1111 1100 1100 1100] f1, f0 bits = 0
147 doubleSendCWF2 = 1;
148 reset_local_sbm2_nb_cwf_sent();
149 }
140 150 #endif
141 break;
151 break;
142 152
143 153 //********
144 154 // DEFAULT
145 155 default:
146 break;
156 break;
147 157 }
148 158 }
149 159
@@ -171,25 +181,11 rtems_isr waveforms_simulator_isr( rtems
171 181
172 182 rtems_task wfrm_task(rtems_task_argument argument) //used with the waveform picker VHDL IP
173 183 {
174 unsigned int i;
175 unsigned int intEventOut;
176 spw_ioctl_pkt_send spw_ioctl_send_SWF;
177 spw_ioctl_pkt_send spw_ioctl_send_CWF;
178 184 rtems_event_set event_out;
179 Header_TM_LFR_SCIENCE_SWF_t headerSWF;
180 Header_TM_LFR_SCIENCE_CWF_t headerCWF;
181 185
182 init_header_snapshot_wf( &headerSWF );
183 init_header_continuous_wf( &headerCWF );
184
185 // BUILD THE PACKET HEADERS
186 spw_ioctl_send_SWF.hlen = TM_HEADER_LEN + 4 + 12; // + 4 is for the protocole extra header, + 12 is for the auxiliary header
187 spw_ioctl_send_SWF.hdr = (char*) &headerSWF;
188 spw_ioctl_send_SWF.options = 0;
189
190 spw_ioctl_send_CWF.hlen = TM_HEADER_LEN + 4 + 10; // + 4 is for the protocole extra header, + 10 is for the auxiliary header
191 spw_ioctl_send_CWF.hdr = (char*) &headerCWF;
192 spw_ioctl_send_CWF.options = 0;
186 init_header_snapshot_wf_table( SID_NORM_SWF_F0 );
187 init_header_snapshot_wf_table( SID_NORM_SWF_F1 );
188 init_header_snapshot_wf_table( SID_NORM_SWF_F2 );
193 189
194 190 init_waveforms();
195 191
@@ -197,91 +193,154 rtems_task wfrm_task(rtems_task_argument
197 193
198 194 while(1){
199 195 // wait for an RTEMS_EVENT
200 rtems_event_receive(RTEMS_EVENT_0 | RTEMS_EVENT_1 | RTEMS_EVENT_2 | RTEMS_EVENT_3 | RTEMS_EVENT_4,
196 rtems_event_receive(RTEMS_EVENT_MODE_NORMAL | RTEMS_EVENT_MODE_SBM1 | RTEMS_EVENT_MODE_SBM2,
201 197 RTEMS_WAIT | RTEMS_EVENT_ANY, RTEMS_NO_TIMEOUT, &event_out);
202 intEventOut = (unsigned int) event_out;
203 for (i = 0; i< 5; i++) {
204 if ( ( (intEventOut >> i) & 0x0001) != 0 ) {
205 198
206 switch(i) {
199 switch( event_out) {
207 200
208 case(LFR_MODE_NORMAL):
209 send_waveform_norm( &headerSWF, &spw_ioctl_send_SWF );
210 break;
201 case RTEMS_EVENT_MODE_NORMAL:
202 send_waveform_SWF(wf_snap_f0, SID_NORM_SWF_F0);
203 send_waveform_SWF(wf_snap_f1, SID_NORM_SWF_F1);
204 send_waveform_SWF(wf_snap_f2, SID_NORM_SWF_F2);
205 #ifdef GSA
206 waveform_picker_regs->status = waveform_picker_regs->status & 0xf888; // [1111 1000 1000 1000] f2, f1, f0 bits =0
207 #endif
208 break;
211 209
212 case(LFR_MODE_BURST):
213 send_waveform_burst( &headerCWF, &spw_ioctl_send_CWF );
214 break;
215
216 case(LFR_MODE_SBM1):
217 send_waveform_sbm1( &headerCWF, &spw_ioctl_send_CWF );
210 case RTEMS_EVENT_MODE_SBM1:
211 send_waveform_SWF(wf_snap_f0, SID_NORM_SWF_F0);
212 send_waveform_SWF(wf_snap_f1_norm, SID_NORM_SWF_F1);
213 send_waveform_SWF(wf_snap_f2, SID_NORM_SWF_F2);
218 214 #ifdef GSA
219 #else
220 if ( param_local.local_sbm1_nb_cwf_sent == (param_local.local_sbm1_nb_cwf_max-1) ) {
221 // send the f1 buffer as a NORM snapshot
222 if (waveform_picker_regs->addr_data_f1 == (int) wf_snap_f1) {
223 send_waveform_SWF( &headerSWF, wf_snap_f1_bis, SID_NORM_SWF_F1, &spw_ioctl_send_SWF );
224 }
225 else {
226 send_waveform_SWF( &headerSWF, wf_snap_f1, SID_NORM_SWF_F1, &spw_ioctl_send_SWF );
227 }
228 reset_local_sbm1_nb_cwf_sent();
229 }
230 else {
231 param_local.local_sbm1_nb_cwf_sent ++;
232 }
215 waveform_picker_regs->status = waveform_picker_regs->status & 0xfffffaaa; // [1111 1010 1010 1010] f2, f0 bits = 0
233 216 #endif
234 break;
217 break;
235 218
236 case(LFR_MODE_SBM2):
237 send_waveform_sbm2( &headerCWF, &spw_ioctl_send_CWF );
219 case RTEMS_EVENT_MODE_SBM2:
220 send_waveform_SWF(wf_snap_f0, SID_NORM_SWF_F0);
221 send_waveform_SWF(wf_snap_f1, SID_NORM_SWF_F1);
238 222 #ifdef GSA
239 #else
240 if ( param_local.local_sbm2_nb_cwf_sent == (param_local.local_sbm2_nb_cwf_max-1) ) {
241 // send the f2 buffer as a NORM snapshot
242 if (waveform_picker_regs->addr_data_f2 == (int) wf_snap_f2) {
243 send_waveform_SWF( &headerSWF, wf_snap_f2_bis, SID_NORM_SWF_F2, &spw_ioctl_send_SWF );
244 }
245 else {
246 send_waveform_SWF( &headerSWF, wf_snap_f2, SID_NORM_SWF_F2, &spw_ioctl_send_SWF );
247 }
248 reset_local_sbm2_nb_cwf_sent();
249 }
250 else {
251 param_local.local_sbm2_nb_cwf_sent ++;
252 }
223 waveform_picker_regs->status = waveform_picker_regs->status & 0xfffffccc; // [1111 1100 1100 1100] f1, f0 bits = 0
253 224 #endif
254 break;
225 break;
226
227 default:
228 break;
229 }
255 230
256 default:
257 break;
258 }
259 }
260 }
231 #ifdef GSA
232 // irq processed, reset the related register of the timer unit
233 gptimer_regs->timer[TIMER_WF_SIMULATOR].ctrl = gptimer_regs->timer[TIMER_WF_SIMULATOR].ctrl | 0x00000010;
234 // clear the interruption
235 LEON_Unmask_interrupt( IRQ_WF );
236 #endif
261 237 }
262 238 }
263 239
264 240 rtems_task cwf3_task(rtems_task_argument argument) //used with the waveform picker VHDL IP
265 241 {
266 spw_ioctl_pkt_send spw_ioctl_send_CWF;
267 242 rtems_event_set event_out;
268 Header_TM_LFR_SCIENCE_CWF_t headerCWF;
269 243
270 init_header_continuous_wf( &headerCWF );
271
272 // BUILD THE PACKET HEADER
273 spw_ioctl_send_CWF.hlen = TM_HEADER_LEN + 4 + 10; // + 4 is for the protocole extra header, + 10 is for the auxiliary header
274 spw_ioctl_send_CWF.hdr = (char*) &headerCWF;
275 spw_ioctl_send_CWF.options = 0;
244 init_header_continuous_wf_table( SID_NORM_CWF_F3, headerCWF_F3 );
276 245
277 246 PRINTF("in CWF3 ***\n")
278 247
279 248 while(1){
280 249 // wait for an RTEMS_EVENT
281 rtems_event_receive( RTEMS_EVENT_5,
250 rtems_event_receive( RTEMS_EVENT_0,
282 251 RTEMS_WAIT | RTEMS_EVENT_ANY, RTEMS_NO_TIMEOUT, &event_out);
283 252 PRINTF("send CWF F3 \n")
284 send_waveform_norm_cwf_f3( &headerCWF, &spw_ioctl_send_CWF );
253 #ifdef GSA
254 #else
255 if (waveform_picker_regs->addr_data_f3 == (int) wf_cont_f3) {
256 send_waveform_CWF( wf_cont_f3_bis, SID_NORM_CWF_F3, headerCWF_F3 );
257 }
258 else {
259 send_waveform_CWF( wf_cont_f3, SID_NORM_CWF_F3, headerCWF_F3 );
260 }
261 #endif
262 }
263 }
264
265 rtems_task cwf2_task(rtems_task_argument argument) // ONLY USED IN BURST AND SBM2
266 {
267 rtems_event_set event_out;
268
269 init_header_continuous_wf_table( SID_BURST_CWF_F2, headerCWF_F2_BURST );
270 init_header_continuous_wf_table( SID_SBM2_CWF_F2, headerCWF_F2_SBM1 );
271
272 PRINTF("in CWF2 ***\n")
273
274 while(1){
275 // wait for an RTEMS_EVENT
276 rtems_event_receive( RTEMS_EVENT_MODE_BURST | RTEMS_EVENT_MODE_SBM2,
277 RTEMS_WAIT | RTEMS_EVENT_ANY, RTEMS_NO_TIMEOUT, &event_out);
278 if (event_out == RTEMS_EVENT_MODE_BURST)
279 {
280 // F2
281 #ifdef GSA
282 #else
283 if (waveform_picker_regs->addr_data_f2 == (int) wf_snap_f2) {
284 send_waveform_CWF( wf_snap_f2_bis, SID_BURST_CWF_F2, headerCWF_F2_BURST );
285 }
286 else {
287 send_waveform_CWF( wf_snap_f2, SID_BURST_CWF_F2, headerCWF_F2_BURST );
288 }
289 #endif
290 }
291 else if (event_out == RTEMS_EVENT_MODE_SBM2)
292 {
293 #ifdef GSA
294 #else
295 if (waveform_picker_regs->addr_data_f2 == (int) wf_snap_f2) {
296 send_waveform_CWF( wf_snap_f2_bis, SID_SBM2_CWF_F2, headerCWF_F2_SBM1 );
297 }
298 else {
299 send_waveform_CWF( wf_snap_f2, SID_SBM2_CWF_F2, headerCWF_F2_SBM1 );
300 }
301 #endif
302 }
303 else
304 {
305 PRINTF1("in CWF2 *** ERR mode = %d\n", lfrCurrentMode)
306 }
307 }
308 }
309
310 rtems_task cwf1_task(rtems_task_argument argument) // ONLY USED IN SBM1
311 {
312 rtems_event_set event_out;
313
314 init_header_continuous_wf_table( SID_SBM1_CWF_F1, headerCWF_F1 );
315
316 PRINTF("in CWF1 ***\n")
317
318 while(1){
319 // wait for an RTEMS_EVENT
320 rtems_event_receive( RTEMS_EVENT_MODE_SBM1,
321 RTEMS_WAIT | RTEMS_EVENT_ANY, RTEMS_NO_TIMEOUT, &event_out);
322 if (event_out == RTEMS_EVENT_MODE_SBM1)
323 {
324 #ifdef GSA
325 #else
326 if (doubleSendCWF1 == 1)
327 {
328 doubleSendCWF1 = 0;
329 send_waveform_CWF( wf_snap_f1_norm, SID_SBM1_CWF_F1, headerCWF_F1 );
330 }
331 else if (waveform_picker_regs->addr_data_f1 == (int) wf_snap_f1) {
332 send_waveform_CWF( wf_snap_f1_bis, SID_SBM1_CWF_F1, headerCWF_F1 );
333 }
334 else {
335 send_waveform_CWF( wf_snap_f1, SID_SBM1_CWF_F1, headerCWF_F1);
336 }
337 param_local.local_sbm1_nb_cwf_sent ++;
338 #endif
339 }
340 else
341 {
342 PRINTF1("in CWF1 *** ERR mode = %d\n", lfrCurrentMode)
343 }
285 344 }
286 345 }
287 346
@@ -319,66 +378,136 void init_waveforms( void )
319 378 }
320 379 }
321 380
322 void init_header_snapshot_wf( Header_TM_LFR_SCIENCE_SWF_t *header)
381 int init_header_snapshot_wf_table( unsigned int sid)
323 382 {
324 header->targetLogicalAddress = CCSDS_DESTINATION_ID;
325 header->protocolIdentifier = CCSDS_PROTOCOLE_ID;
326 header->reserved = 0x00;
327 header->userApplication = CCSDS_USER_APP;
328 header->packetID[0] = (unsigned char) (TM_PACKET_ID_SCIENCE_NORMAL >> 8);
329 header->packetID[1] = (unsigned char) (TM_PACKET_ID_SCIENCE_NORMAL);
330 header->packetSequenceControl[0] = 0xc0;
331 header->packetSequenceControl[1] = 0x00;
332 header->packetLength[0] = 0x00;
333 header->packetLength[1] = 0x00;
334 // DATA FIELD HEADER
335 header->spare1_pusVersion_spare2 = 0x10;
336 header->serviceType = TM_TYPE_LFR_SCIENCE; // service type
337 header->serviceSubType = TM_SUBTYPE_LFR_SCIENCE; // service subtype
338 header->destinationID = TM_DESTINATION_ID_GROUND;
339 // AUXILIARY DATA HEADER
340 header->sid = 0x00;
341 header->hkBIA = 0x1f;
342 header->pktCnt = 0x07; // PKT_CNT
343 header->pktNr = 0x00; // PKT_NR
344 header->time[0] = 0x00;
345 header->time[0] = 0x00;
346 header->time[0] = 0x00;
347 header->time[0] = 0x00;
348 header->time[0] = 0x00;
349 header->time[0] = 0x00;
350 header->blkNr[0] = 0x00; // BLK_NR MSB
351 header->blkNr[1] = 0x00; // BLK_NR LSB
383 unsigned char i;
384 unsigned char j;
385
386 j = 0;
387
388 switch(sid)
389 {
390 case SID_NORM_SWF_F0:
391 j = 0;
392 break;
393 case SID_NORM_SWF_F1:
394 j = 1;
395 break;
396 case SID_NORM_SWF_F2:
397 j = 2;
398 break;
399 default:
400 return LFR_DEFAULT;
401 }
402
403 for (i=0; i<7; i++)
404 {
405 headerSWF_F0_F1_F2[j][i].targetLogicalAddress = CCSDS_DESTINATION_ID;
406 headerSWF_F0_F1_F2[j][i].protocolIdentifier = CCSDS_PROTOCOLE_ID;
407 headerSWF_F0_F1_F2[j][i].reserved = DEFAULT_RESERVED;
408 headerSWF_F0_F1_F2[j][i].userApplication = CCSDS_USER_APP;
409 headerSWF_F0_F1_F2[j][i].packetID[0] = (unsigned char) (TM_PACKET_ID_SCIENCE_NORMAL >> 8);
410 headerSWF_F0_F1_F2[j][i].packetID[1] = (unsigned char) (TM_PACKET_ID_SCIENCE_NORMAL);
411 if (i == 0)
412 {
413 headerSWF_F0_F1_F2[j][i].packetSequenceControl[0] = TM_PACKET_SEQ_CTRL_FIRST;
414 headerSWF_F0_F1_F2[j][i].packetLength[0] = (unsigned char) (TM_LEN_SCI_SWF_340 >> 8);
415 headerSWF_F0_F1_F2[j][i].packetLength[1] = (unsigned char) (TM_LEN_SCI_SWF_340 );
416 headerSWF_F0_F1_F2[j][i].blkNr[0] = (unsigned char) (BLK_NR_340 >> 8);
417 headerSWF_F0_F1_F2[j][i].blkNr[1] = (unsigned char) (BLK_NR_340 );
418 }
419 else if (i == 6)
420 {
421 headerSWF_F0_F1_F2[j][i].packetSequenceControl[0] = TM_PACKET_SEQ_CTRL_LAST;
422 headerSWF_F0_F1_F2[j][i].packetLength[0] = (unsigned char) (TM_LEN_SCI_SWF_8 >> 8);
423 headerSWF_F0_F1_F2[j][i].packetLength[1] = (unsigned char) (TM_LEN_SCI_SWF_8 );
424 headerSWF_F0_F1_F2[j][i].blkNr[0] = (unsigned char) (BLK_NR_8 >> 8);
425 headerSWF_F0_F1_F2[j][i].blkNr[1] = (unsigned char) (BLK_NR_8 );
426 }
427 else
428 {
429 headerSWF_F0_F1_F2[j][i].packetSequenceControl[0] = TM_PACKET_SEQ_CTRL_CONTINUATION;
430 headerSWF_F0_F1_F2[j][i].packetLength[0] = (unsigned char) (TM_LEN_SCI_SWF_340 >> 8);
431 headerSWF_F0_F1_F2[j][i].packetLength[1] = (unsigned char) (TM_LEN_SCI_SWF_340 );
432 headerSWF_F0_F1_F2[j][i].blkNr[0] = (unsigned char) (BLK_NR_340 >> 8);
433 headerSWF_F0_F1_F2[j][i].blkNr[1] = (unsigned char) (BLK_NR_340 );
434 }
435 headerSWF_F0_F1_F2[j][i].packetSequenceControl[1] = TM_PACKET_SEQ_CNT_DEFAULT;
436 headerSWF_F0_F1_F2[j][i].pktCnt = DEFAULT_PKTCNT; // PKT_CNT
437 headerSWF_F0_F1_F2[j][i].pktNr = i+1; // PKT_NR
438 // DATA FIELD HEADER
439 headerSWF_F0_F1_F2[j][i].spare1_pusVersion_spare2 = DEFAULT_SPARE1_PUSVERSION_SPARE2;
440 headerSWF_F0_F1_F2[j][i].serviceType = TM_TYPE_LFR_SCIENCE; // service type
441 headerSWF_F0_F1_F2[j][i].serviceSubType = TM_SUBTYPE_LFR_SCIENCE; // service subtype
442 headerSWF_F0_F1_F2[j][i].destinationID = TM_DESTINATION_ID_GROUND;
443 // AUXILIARY DATA HEADER
444 headerSWF_F0_F1_F2[j][i].sid = sid;
445 headerSWF_F0_F1_F2[j][i].hkBIA = DEFAULT_HKBIA;
446 headerSWF_F0_F1_F2[j][i].time[0] = 0x00;
447 headerSWF_F0_F1_F2[j][i].time[0] = 0x00;
448 headerSWF_F0_F1_F2[j][i].time[0] = 0x00;
449 headerSWF_F0_F1_F2[j][i].time[0] = 0x00;
450 headerSWF_F0_F1_F2[j][i].time[0] = 0x00;
451 headerSWF_F0_F1_F2[j][i].time[0] = 0x00;
452 }
453 return LFR_SUCCESSFUL;
352 454 }
353 455
354 void init_header_continuous_wf( Header_TM_LFR_SCIENCE_CWF_t *header)
456 int init_header_continuous_wf_table( unsigned int sid, Header_TM_LFR_SCIENCE_CWF_t *headerCWF )
355 457 {
356 header->targetLogicalAddress = CCSDS_DESTINATION_ID;
357 header->protocolIdentifier = CCSDS_PROTOCOLE_ID;
358 header->reserved = 0x00;
359 header->userApplication = CCSDS_USER_APP;
360 header->packetID[0] = 0x00;
361 header->packetID[1] = 0x00;
362 header->packetSequenceControl[0] = 0xc0;
363 header->packetSequenceControl[1] = 0x00;
364 header->packetLength[0] = 0x00;
365 header->packetLength[1] = 0x00;
366 // DATA FIELD HEADER
367 header->spare1_pusVersion_spare2 = 0x10;
368 header->serviceType = TM_TYPE_LFR_SCIENCE; // service type
369 header->serviceSubType = TM_SUBTYPE_LFR_SCIENCE; // service subtype
370 header->destinationID = TM_DESTINATION_ID_GROUND;
371 // AUXILIARY DATA HEADER
372 header->sid = 0x00;
373 header->hkBIA = 0x1f;
374 header->time[0] = 0x00;
375 header->time[0] = 0x00;
376 header->time[0] = 0x00;
377 header->time[0] = 0x00;
378 header->time[0] = 0x00;
379 header->time[0] = 0x00;
380 header->blkNr[0] = 0x00; // BLK_NR MSB
381 header->blkNr[1] = 0x00; // BLK_NR LSB
458 unsigned int i;
459
460 for (i=0; i<7; i++)
461 {
462 headerCWF[ i ].targetLogicalAddress = CCSDS_DESTINATION_ID;
463 headerCWF[ i ].protocolIdentifier = CCSDS_PROTOCOLE_ID;
464 headerCWF[ i ].reserved = DEFAULT_RESERVED;
465 headerCWF[ i ].userApplication = CCSDS_USER_APP;
466 headerCWF[ i ].packetID[0] = (unsigned char) (TM_PACKET_ID_SCIENCE_BURST_SBM1_SBM2 >> 8);
467 headerCWF[ i ].packetID[1] = (unsigned char) (TM_PACKET_ID_SCIENCE_BURST_SBM1_SBM2);
468 if (i == 0)
469 {
470 headerCWF[ i ].packetSequenceControl[0] = TM_PACKET_SEQ_CTRL_FIRST;
471 headerCWF[ i ].packetLength[0] = (unsigned char) (TM_LEN_SCI_CWF_340 >> 8);
472 headerCWF[ i ].packetLength[1] = (unsigned char) (TM_LEN_SCI_CWF_340 );
473 headerCWF[ i ].blkNr[0] = (unsigned char) (BLK_NR_340 >> 8);
474 headerCWF[ i ].blkNr[1] = (unsigned char) (BLK_NR_340 );
475 }
476 else if (i == 6)
477 {
478 headerCWF[ i ].packetSequenceControl[0] = TM_PACKET_SEQ_CTRL_LAST;
479 headerCWF[ i ].packetLength[0] = (unsigned char) (TM_LEN_SCI_CWF_8 >> 8);
480 headerCWF[ i ].packetLength[1] = (unsigned char) (TM_LEN_SCI_CWF_8 );
481 headerCWF[ i ].blkNr[0] = (unsigned char) (BLK_NR_8 >> 8);
482 headerCWF[ i ].blkNr[1] = (unsigned char) (BLK_NR_8 );
483 }
484 else
485 {
486 headerCWF[ i ].packetSequenceControl[0] = TM_PACKET_SEQ_CTRL_CONTINUATION;
487 headerCWF[ i ].packetLength[0] = (unsigned char) (TM_LEN_SCI_CWF_340 >> 8);
488 headerCWF[ i ].packetLength[1] = (unsigned char) (TM_LEN_SCI_CWF_340 );
489 headerCWF[ i ].blkNr[0] = (unsigned char) (BLK_NR_340 >> 8);
490 headerCWF[ i ].blkNr[1] = (unsigned char) (BLK_NR_340 );
491 }
492 headerCWF[ i ].packetSequenceControl[1] = TM_PACKET_SEQ_CNT_DEFAULT;
493 // PKT_CNT
494 // PKT_NR
495 // DATA FIELD HEADER
496 headerCWF[ i ].spare1_pusVersion_spare2 = DEFAULT_SPARE1_PUSVERSION_SPARE2;
497 headerCWF[ i ].serviceType = TM_TYPE_LFR_SCIENCE; // service type
498 headerCWF[ i ].serviceSubType = TM_SUBTYPE_LFR_SCIENCE; // service subtype
499 headerCWF[ i ].destinationID = TM_DESTINATION_ID_GROUND;
500 // AUXILIARY DATA HEADER
501 headerCWF[ i ].sid = sid;
502 headerCWF[ i ].hkBIA = DEFAULT_HKBIA;
503 headerCWF[ i ].time[0] = 0x00;
504 headerCWF[ i ].time[0] = 0x00;
505 headerCWF[ i ].time[0] = 0x00;
506 headerCWF[ i ].time[0] = 0x00;
507 headerCWF[ i ].time[0] = 0x00;
508 headerCWF[ i ].time[0] = 0x00;
509 }
510 return LFR_SUCCESSFUL;
382 511 }
383 512
384 513 void reset_waveforms( void )
@@ -411,276 +540,131 void reset_waveforms( void )
411 540 }
412 541 }
413 542
414 void send_waveform_SWF( Header_TM_LFR_SCIENCE_SWF_t *header, volatile int *waveform,
415 unsigned int sid, spw_ioctl_pkt_send *spw_ioctl_send)
543 int send_waveform_SWF( volatile int *waveform, unsigned int sid )
416 544 {
417 unsigned int i = 0;
418 unsigned int length = 0;
545 unsigned int i;
546 unsigned int j;
547 int ret;
419 548 rtems_status_code status;
549 spw_ioctl_pkt_send spw_ioctl_send_SWF;
420 550
421 header->sid = (unsigned char) sid;
551 spw_ioctl_send_SWF.hlen = TM_HEADER_LEN + 4 + 12; // + 4 is for the protocole extra header, + 12 is for the auxiliary header
552 spw_ioctl_send_SWF.options = 0;
422 553
423 for (i=0; i<7; i++) // send waveform
554 j = 0;
555 ret = LFR_DEFAULT;
556
557 switch(sid)
424 558 {
425 header->pktNr = (unsigned char) i+1; // PKT_NR
426 // BUILD THE DATA
427 if (i==6) {
428 spw_ioctl_send->dlen = 8 * NB_BYTES_SWF_BLK;
429 length = TM_LEN_SCI_SWF_8;
430 header->blkNr[0] = 0x00; // BLK_NR MSB
431 header->blkNr[1] = 0x08; // BLK_NR LSB
432 }
433 else {
434 spw_ioctl_send->dlen = 340 * NB_BYTES_SWF_BLK;
435 length = TM_LEN_SCI_SWF_340;
436 header->blkNr[0] = 0x01; // BLK_NR MSB
437 header->blkNr[1] = 0x54; // BLK_NR LSB
438 }
439 spw_ioctl_send->data = (char*) &waveform[ (i * 340 * NB_WORDS_SWF_BLK) ];
440 // BUILD THE HEADER
441 header->packetLength[0] = (unsigned char) (length>>8);
442 header->packetLength[1] = (unsigned char) (length);
443 header->sid = (unsigned char) sid; // SID
444 // SET PACKET TIME
445 header->time[0] = (unsigned char) (time_management_regs->coarse_time>>24);
446 header->time[1] = (unsigned char) (time_management_regs->coarse_time>>16);
447 header->time[2] = (unsigned char) (time_management_regs->coarse_time>>8);
448 header->time[3] = (unsigned char) (time_management_regs->coarse_time);
449 header->time[4] = (unsigned char) (time_management_regs->fine_time>>8);
450 header->time[5] = (unsigned char) (time_management_regs->fine_time);
451 header->acquisitionTime[0] = (unsigned char) (time_management_regs->coarse_time>>24);
452 header->acquisitionTime[1] = (unsigned char) (time_management_regs->coarse_time>>16);
453 header->acquisitionTime[2] = (unsigned char) (time_management_regs->coarse_time>>8);
454 header->acquisitionTime[3] = (unsigned char) (time_management_regs->coarse_time);
455 header->acquisitionTime[4] = (unsigned char) (time_management_regs->fine_time>>8);
456 header->acquisitionTime[5] = (unsigned char) (time_management_regs->fine_time);
457 // SEND PACKET
458 status = write_spw(spw_ioctl_send);
459 if (status != RTEMS_SUCCESSFUL) {
460 while (true) {
461 if (status != RTEMS_SUCCESSFUL) {
462 status = write_spw(spw_ioctl_send);
463 //PRINTF1("%d", i)
464 sched_yield();
465 }
466 else {
467 //PRINTF("\n")
468 break;
469 }
470 }
471 }
559 case SID_NORM_SWF_F0:
560 j = 0;
561 break;
562 case SID_NORM_SWF_F1:
563 j = 1;
564 break;
565 case SID_NORM_SWF_F2:
566 j = 2;
567 break;
568 default:
569 ret = LFR_DEFAULT;
570 break;
472 571 }
473 }
474
475 void send_waveform_CWF( Header_TM_LFR_SCIENCE_CWF_t *header, volatile int *waveform,
476 unsigned int sid, spw_ioctl_pkt_send *spw_ioctl_send)
477 {
478 unsigned int i = 0;
479 unsigned int length = 0;
480 rtems_status_code status;
481
482 header->sid = (unsigned char) sid;
483 572
484 573 for (i=0; i<7; i++) // send waveform
485 574 {
575 spw_ioctl_send_SWF.data = (char*) &waveform[ (i * 340 * NB_WORDS_SWF_BLK) ];
576 spw_ioctl_send_SWF.hdr = (char*) &headerSWF_F0_F1_F2[j][i];
486 577 // BUILD THE DATA
487 578 if (i==6) {
488 spw_ioctl_send->dlen = 8 * NB_BYTES_SWF_BLK;
489 length = TM_LEN_SCI_CWF_8;
490 header->blkNr[0] = 0x00; // BLK_NR MSB
491 header->blkNr[1] = 0x08; // BLK_NR LSB
579 spw_ioctl_send_SWF.dlen = 8 * NB_BYTES_SWF_BLK;
492 580 }
493 581 else {
494 spw_ioctl_send->dlen = 340 * NB_BYTES_SWF_BLK;
495 length = TM_LEN_SCI_CWF_340;
496 header->blkNr[0] = 0x01; // BLK_NR MSB
497 header->blkNr[1] = 0x54; // BLK_NR LSB
498 }
499 spw_ioctl_send->data = (char*) &waveform[ (i * 340 * NB_WORDS_SWF_BLK) ];
500 // BUILD THE HEADER
501 header->packetLength[0] = (unsigned char) (length>>8);
502 header->packetLength[1] = (unsigned char) (length);
503 // SET PACKET TIME
504 header->time[0] = (unsigned char) (time_management_regs->coarse_time>>24);
505 header->time[1] = (unsigned char) (time_management_regs->coarse_time>>16);
506 header->time[2] = (unsigned char) (time_management_regs->coarse_time>>8);
507 header->time[3] = (unsigned char) (time_management_regs->coarse_time);
508 header->time[4] = (unsigned char) (time_management_regs->fine_time>>8);
509 header->time[5] = (unsigned char) (time_management_regs->fine_time);
510 header->acquisitionTime[0] = (unsigned char) (time_management_regs->coarse_time>>24);
511 header->acquisitionTime[1] = (unsigned char) (time_management_regs->coarse_time>>16);
512 header->acquisitionTime[2] = (unsigned char) (time_management_regs->coarse_time>>8);
513 header->acquisitionTime[3] = (unsigned char) (time_management_regs->coarse_time);
514 header->acquisitionTime[4] = (unsigned char) (time_management_regs->fine_time>>8);
515 header->acquisitionTime[5] = (unsigned char) (time_management_regs->fine_time);
516 // SEND PACKET
517 status = write_spw(spw_ioctl_send);
518 if (status != RTEMS_SUCCESSFUL) {
519 while (true) {
520 if (status != RTEMS_SUCCESSFUL) {
521 status = write_spw(spw_ioctl_send);
522 //PRINTF1("%d", i)
523 sched_yield();
524 }
525 else {
526 //PRINTF("\n")
527 break;
528 }
529 }
582 spw_ioctl_send_SWF.dlen = 340 * NB_BYTES_SWF_BLK;
530 583 }
531 }
532 }
533
534 void send_waveform_norm(Header_TM_LFR_SCIENCE_SWF_t *header, spw_ioctl_pkt_send *spw_ioctl_send)
535 {
536 unsigned char lfrMode;
537 lfrMode = (housekeeping_packet.lfr_status_word[0] & 0xf0) >> 4;
538
539 header->packetID[0] = (unsigned char) (TM_PACKET_ID_SCIENCE_NORMAL >> 8);
540 header->packetID[1] = (unsigned char) (TM_PACKET_ID_SCIENCE_NORMAL);
541 // TIME
542 header->time[0] = (unsigned char) (time_management_regs->coarse_time>>24);
543 header->time[1] = (unsigned char) (time_management_regs->coarse_time>>16);
544 header->time[2] = (unsigned char) (time_management_regs->coarse_time>>8);
545 header->time[3] = (unsigned char) (time_management_regs->coarse_time);
546 header->time[4] = (unsigned char) (time_management_regs->fine_time>>8);
547 header->time[5] = (unsigned char) (time_management_regs->fine_time);
548
549 switch(lfrMode) {
550
551 case LFR_MODE_NORMAL:
552 send_waveform_SWF( header, wf_snap_f0, SID_NORM_SWF_F0, spw_ioctl_send);
553 send_waveform_SWF( header, wf_snap_f1, SID_NORM_SWF_F1, spw_ioctl_send);
554 send_waveform_SWF( header, wf_snap_f2, SID_NORM_SWF_F2, spw_ioctl_send);
555 #ifdef GSA
556 #else
557 waveform_picker_regs->status = waveform_picker_regs->status & 0x00;
558 waveform_picker_regs->burst_enable = waveform_picker_regs->burst_enable | 0x07; // [0111] enable f2 f1 f0
559 #endif
560 break;
561
562 case LFR_MODE_SBM1:
563 send_waveform_SWF( header, wf_snap_f0, SID_NORM_SWF_F0, spw_ioctl_send);
564 // F1 data are sent by the send_waveform_sbm1 function
565 send_waveform_SWF( header, wf_snap_f2, SID_NORM_SWF_F2, spw_ioctl_send);
566 break;
567
568 case LFR_MODE_SBM2:
569 send_waveform_SWF( header, wf_snap_f0, SID_NORM_SWF_F0, spw_ioctl_send);
570 send_waveform_SWF( header, wf_snap_f1, SID_NORM_SWF_F1, spw_ioctl_send);
571 // F2 data are sent by the send_waveform_sbm2 function
572 break;
573
574 default:
575 break;
584 // SET PACKET TIME
585 headerSWF_F0_F1_F2[j][i].time[0] = (unsigned char) (time_management_regs->coarse_time>>24);
586 headerSWF_F0_F1_F2[j][i].time[1] = (unsigned char) (time_management_regs->coarse_time>>16);
587 headerSWF_F0_F1_F2[j][i].time[2] = (unsigned char) (time_management_regs->coarse_time>>8);
588 headerSWF_F0_F1_F2[j][i].time[3] = (unsigned char) (time_management_regs->coarse_time);
589 headerSWF_F0_F1_F2[j][i].time[4] = (unsigned char) (time_management_regs->fine_time>>8);
590 headerSWF_F0_F1_F2[j][i].time[5] = (unsigned char) (time_management_regs->fine_time);
591 headerSWF_F0_F1_F2[j][i].acquisitionTime[0] = (unsigned char) (time_management_regs->coarse_time>>24);
592 headerSWF_F0_F1_F2[j][i].acquisitionTime[1] = (unsigned char) (time_management_regs->coarse_time>>16);
593 headerSWF_F0_F1_F2[j][i].acquisitionTime[2] = (unsigned char) (time_management_regs->coarse_time>>8);
594 headerSWF_F0_F1_F2[j][i].acquisitionTime[3] = (unsigned char) (time_management_regs->coarse_time);
595 headerSWF_F0_F1_F2[j][i].acquisitionTime[4] = (unsigned char) (time_management_regs->fine_time>>8);
596 headerSWF_F0_F1_F2[j][i].acquisitionTime[5] = (unsigned char) (time_management_regs->fine_time);
597 // SEND PACKET
598 //status = write_spw(&spw_ioctl_send_SWF);
599 status = rtems_message_queue_send( misc_id[1], &spw_ioctl_send_SWF, sizeof(spw_ioctl_send_SWF));
600 if (status != RTEMS_SUCCESSFUL) {
601 PRINTF2("sid %d, i = %d\n", sid, i)
602 ret = LFR_DEFAULT;
603 }
604 rtems_task_wake_after(TIME_BETWEEN_TWO_SWF_PACKETS); // 300 ms between each packet => 7 * 3 = 21 packets => 6.3 seconds
576 605 }
577 606
578 #ifdef GSA
579 // irq processed, reset the related register of the timer unit
580 gptimer_regs->timer[TIMER_WF_SIMULATOR].ctrl = gptimer_regs->timer[TIMER_WF_SIMULATOR].ctrl | 0x00000010;
581 // clear the interruption
582 LEON_Unmask_interrupt( IRQ_WF );
583 #endif
584
585 }
586
587 void send_waveform_norm_cwf_f3(Header_TM_LFR_SCIENCE_CWF_t *header, spw_ioctl_pkt_send *spw_ioctl_send)
588 {
589 header->packetID[0] = (unsigned char) (TM_PACKET_ID_SCIENCE_NORMAL >> 8);
590 header->packetID[1] = (unsigned char) (TM_PACKET_ID_SCIENCE_NORMAL);
591 // TIME
592 header->time[0] = (unsigned char) (time_management_regs->coarse_time>>24);
593 header->time[1] = (unsigned char) (time_management_regs->coarse_time>>16);
594 header->time[2] = (unsigned char) (time_management_regs->coarse_time>>8);
595 header->time[3] = (unsigned char) (time_management_regs->coarse_time);
596 header->time[4] = (unsigned char) (time_management_regs->fine_time>>8);
597 header->time[5] = (unsigned char) (time_management_regs->fine_time);
598
599 //*******************************
600 // send continuous waveform at f3
601 // F3
602 #ifdef GSA
603 #else
604 if (waveform_picker_regs->addr_data_f3 == (int) wf_cont_f3) {
605 send_waveform_CWF( header, wf_cont_f3_bis, SID_NORM_CWF_F3, spw_ioctl_send);
606 }
607 else {
608 send_waveform_CWF( header, wf_cont_f3, SID_NORM_CWF_F3, spw_ioctl_send);
609 }
610 #endif
607 return ret;
611 608 }
612 609
613 void send_waveform_burst(Header_TM_LFR_SCIENCE_CWF_t *header, spw_ioctl_pkt_send *spw_ioctl_send)
614 {
615 header->packetID[0] = (unsigned char) (TM_PACKET_ID_SCIENCE_BURST_SBM1_SBM2 >> 8);
616 header->packetID[1] = (unsigned char) (TM_PACKET_ID_SCIENCE_BURST_SBM1_SBM2);
617 // TIME
618 header->time[0] = (unsigned char) (time_management_regs->coarse_time>>24);
619 header->time[1] = (unsigned char) (time_management_regs->coarse_time>>16);
620 header->time[2] = (unsigned char) (time_management_regs->coarse_time>>8);
621 header->time[3] = (unsigned char) (time_management_regs->coarse_time);
622 header->time[4] = (unsigned char) (time_management_regs->fine_time>>8);
623 header->time[5] = (unsigned char) (time_management_regs->fine_time);
624 // ACQUISITION TIME
625
626 // F2
627 #ifdef GSA
628 #else
629 if (waveform_picker_regs->addr_data_f2 == (int) wf_snap_f2) {
630 send_waveform_CWF( header, wf_snap_f2_bis, SID_BURST_CWF_F2, spw_ioctl_send);
631 }
632 else {
633 send_waveform_CWF( header, wf_snap_f2, SID_BURST_CWF_F2, spw_ioctl_send);
634 }
635 #endif
636 }
637
638 void send_waveform_sbm1(Header_TM_LFR_SCIENCE_CWF_t *header, spw_ioctl_pkt_send *spw_ioctl_send)
610 int send_waveform_CWF( volatile int *waveform, unsigned int sid, Header_TM_LFR_SCIENCE_CWF_t *headerCWF)
639 611 {
640 header->packetID[0] = (unsigned char) (TM_PACKET_ID_SCIENCE_BURST_SBM1_SBM2 >> 8);
641 header->packetID[1] = (unsigned char) (TM_PACKET_ID_SCIENCE_BURST_SBM1_SBM2);
642 // TIME
643 header->time[0] = (unsigned char) (time_management_regs->coarse_time>>24);
644 header->time[1] = (unsigned char) (time_management_regs->coarse_time>>16);
645 header->time[2] = (unsigned char) (time_management_regs->coarse_time>>8);
646 header->time[3] = (unsigned char) (time_management_regs->coarse_time);
647 header->time[4] = (unsigned char) (time_management_regs->fine_time>>8);
648 header->time[5] = (unsigned char) (time_management_regs->fine_time);
612 unsigned int i;
613 int ret;
614 rtems_status_code status;
615 spw_ioctl_pkt_send spw_ioctl_send_CWF;
649 616
650 // F1
651 #ifdef GSA
652 #else
653 if (waveform_picker_regs->addr_data_f1 == (int) wf_snap_f1) {
654 send_waveform_CWF( header, wf_snap_f1_bis, SID_SBM1_CWF_F1, spw_ioctl_send );
655 }
656 else {
657 send_waveform_CWF( header, wf_snap_f1, SID_SBM1_CWF_F1, spw_ioctl_send );
658 }
659 #endif
660 }
617 spw_ioctl_send_CWF.hlen = TM_HEADER_LEN + 4 + 10; // + 4 is for the protocole extra header, + 10 is for the auxiliary header
618 spw_ioctl_send_CWF.options = 0;
619
620 ret = LFR_DEFAULT;
661 621
662 void send_waveform_sbm2(Header_TM_LFR_SCIENCE_CWF_t *header, spw_ioctl_pkt_send *spw_ioctl_send)
663 {
664 header->packetID[0] = (unsigned char) (TM_PACKET_ID_SCIENCE_BURST_SBM1_SBM2 >> 8);
665 header->packetID[1] = (unsigned char) (TM_PACKET_ID_SCIENCE_BURST_SBM1_SBM2);
666 // TIME
667 header->time[0] = (unsigned char) (time_management_regs->coarse_time>>24);
668 header->time[1] = (unsigned char) (time_management_regs->coarse_time>>16);
669 header->time[2] = (unsigned char) (time_management_regs->coarse_time>>8);
670 header->time[3] = (unsigned char) (time_management_regs->coarse_time);
671 header->time[4] = (unsigned char) (time_management_regs->fine_time>>8);
672 header->time[5] = (unsigned char) (time_management_regs->fine_time);
622 for (i=0; i<7; i++) // send waveform
623 {
624 int coarseTime = 0x00;
625 int fineTime = 0x00;
626 spw_ioctl_send_CWF.data = (char*) &waveform[ (i * 340 * NB_WORDS_SWF_BLK) ];
627 spw_ioctl_send_CWF.hdr = (char*) &headerCWF[ i ];
628 // BUILD THE DATA
629 if (i==6) {
630 spw_ioctl_send_CWF.dlen = 8 * NB_BYTES_SWF_BLK;
631 }
632 else {
633 spw_ioctl_send_CWF.dlen = 340 * NB_BYTES_SWF_BLK;
634 }
635 // SET PACKET TIME
636 coarseTime = time_management_regs->coarse_time;
637 fineTime = time_management_regs->fine_time;
638 headerCWF[ i ].time[0] = (unsigned char) (coarseTime>>24);
639 headerCWF[ i ].time[1] = (unsigned char) (coarseTime>>16);
640 headerCWF[ i ].time[2] = (unsigned char) (coarseTime>>8);
641 headerCWF[ i ].time[3] = (unsigned char) (coarseTime);
642 headerCWF[ i ].time[4] = (unsigned char) (fineTime>>8);
643 headerCWF[ i ].time[5] = (unsigned char) (fineTime);
644 headerCWF[ i ].acquisitionTime[0] = (unsigned char) (coarseTime>>24);
645 headerCWF[ i ].acquisitionTime[1] = (unsigned char) (coarseTime>>16);
646 headerCWF[ i ].acquisitionTime[2] = (unsigned char) (coarseTime>>8);
647 headerCWF[ i ].acquisitionTime[3] = (unsigned char) (coarseTime);
648 headerCWF[ i ].acquisitionTime[4] = (unsigned char) (fineTime>>8);
649 headerCWF[ i ].acquisitionTime[5] = (unsigned char) (fineTime);
650 // SEND PACKET
651 //status = write_spw(&spw_ioctl_send_CWF);
652 status = rtems_message_queue_urgent( misc_id[1], &spw_ioctl_send_CWF, sizeof(spw_ioctl_send_CWF));
653 if (status != RTEMS_SUCCESSFUL) {
654 PRINTF2("sid %d, i = %d\n", sid, i)
655 ret = LFR_DEFAULT;
656 }
657 else
658 {
659 sched_yield();
660 }
661 if (sid == SID_NORM_CWF_F3)
662 {
663 rtems_task_wake_after(TIME_BETWEEN_TWO_CWF3_PACKETS);
664 }
665 }
673 666
674 // F2
675 #ifdef GSA
676 #else
677 if (waveform_picker_regs->addr_data_f2 == (int) wf_snap_f2) {
678 send_waveform_CWF( header, wf_snap_f2_bis, SID_SBM2_CWF_F2, spw_ioctl_send);
679 }
680 else {
681 send_waveform_CWF( header, wf_snap_f2, SID_SBM2_CWF_F2, spw_ioctl_send);
682 }
683 #endif
667 return ret;
684 668 }
685 669
686 670 //**************
@@ -770,6 +754,14 void reset_wfp_burst_enable()
770 754 #endif
771 755 }
772 756
757 void reset_wfp_status()
758 {
759 #ifdef GSA
760 #else
761 waveform_picker_regs->status = 0x00; // burst f2, f1, f0 enable f3, f2, f1, f0
762 #endif
763 }
764
773 765 void reset_waveform_picker_regs()
774 766 {
775 767 #ifdef GSA
@@ -781,8 +773,8 void reset_waveform_picker_regs()
781 773 waveform_picker_regs->addr_data_f2 = (int) (wf_snap_f2); //
782 774 waveform_picker_regs->addr_data_f3 = (int) (wf_cont_f3); //
783 775 set_wfp_delta_snapshot(); // time in seconds between two snapshots
784 waveform_picker_regs->delta_f2_f1 = 0xffff; // max 4 bytes
785 waveform_picker_regs->delta_f2_f0 = 0x17c00; // max 5 bytes
776 waveform_picker_regs->delta_f2_f1 = 0xffff; // 0x16800 => 92160 (max 4 bytes)
777 waveform_picker_regs->delta_f2_f0 = 0x17c00; // 97 280 (max 5 bytes)
786 778 waveform_picker_regs->nb_burst_available = 0x180; // max 3 bytes, size of the buffer in burst (1 burst = 16 x 4 octets)
787 779 waveform_picker_regs->nb_snapshot_param = 0x7ff; // max 3 octets, 2048 - 1
788 780 waveform_picker_regs->status = 0x00; //
@@ -793,11 +785,11 void reset_waveform_picker_regs()
793 785 // local parameters
794 786 void set_local_sbm1_nb_cwf_max()
795 787 {
796 // (2 snapshots of 2048 points per seconds) * (period of the NORM snashots)
788 // (2 snapshots of 2048 points per seconds) * (period of the NORM snashots) - 8 s (duration of the f2 snapshot)
797 789 param_local.local_sbm1_nb_cwf_max = 2 * (
798 790 parameter_dump_packet.sy_lfr_n_swf_p[0] * 256
799 791 + parameter_dump_packet.sy_lfr_n_swf_p[1]
800 );
792 ) - 8; // 16 CWF1 parts during 1 SWF2
801 793 }
802 794
803 795 void set_local_sbm2_nb_cwf_max()
General Comments 0
You need to be logged in to leave comments. Login now