# HG changeset patch
# User paul
# Date 2014-01-21 09:33:16
# Node ID aa2133db3e0a530553efd112ef53c1954626b879
# Parent 335d64d1e4bf3aa17f59c425144a2d9d470c1c4d
First version of the rings for the waveform picker.
diff --git a/FSW-qt/Makefile b/FSW-qt/Makefile
--- a/FSW-qt/Makefile
+++ b/FSW-qt/Makefile
@@ -1,21 +1,21 @@
#############################################################################
# Makefile for building: bin/fsw
-# Generated by qmake (2.01a) (Qt 4.8.5) on: Thu Nov 21 17:20:36 2013
+# Generated by qmake (2.01a) (Qt 4.8.5) on: Mon Jan 20 12:52:59 2014
# Project: fsw-qt.pro
# Template: app
-# Command: /usr/bin/qmake-qt4 -spec /usr/lib64/qt4/mkspecs/linux-g++ -o Makefile fsw-qt.pro
+# Command: /usr/bin/qmake-qt4 -spec /usr/lib64/qt4/mkspecs/linux-g++ CONFIG+=debug -o Makefile fsw-qt.pro
#############################################################################
####### Compiler, tools and options
CC = sparc-rtems-gcc
CXX = sparc-rtems-g++
-DEFINES = -DSW_VERSION_N1=1 -DSW_VERSION_N2=0 -DSW_VERSION_N3=0 -DSW_VERSION_N4=1 -DPRINT_MESSAGES_ON_CONSOLE
-CFLAGS = -pipe -O3 -Wall $(DEFINES)
+DEFINES = -DSW_VERSION_N1=1 -DSW_VERSION_N2=0 -DSW_VERSION_N3=0 -DSW_VERSION_N4=1 -DPRINT_MESSAGES_ON_CONSOLE -DDEBUG_MESSAGES
+CFLAGS = -pipe -g -O3 -Wall $(DEFINES)
CXXFLAGS = -pipe -O3 -Wall $(DEFINES)
INCPATH = -I/usr/lib64/qt4/mkspecs/linux-g++ -I. -I../src -I../header
LINK = sparc-rtems-g++
-LFLAGS =
+LFLAGS = -g
LIBS = $(SUBLIBS)
AR = sparc-rtems-ar rcs
RANLIB =
@@ -76,7 +76,7 @@ DIST = /usr/lib64/qt4/mkspecs/c
/usr/lib64/qt4/mkspecs/features/exclusive_builds.prf \
/usr/lib64/qt4/mkspecs/features/default_pre.prf \
sparc.pri \
- /usr/lib64/qt4/mkspecs/features/release.prf \
+ /usr/lib64/qt4/mkspecs/features/debug.prf \
/usr/lib64/qt4/mkspecs/features/default_post.prf \
/usr/lib64/qt4/mkspecs/features/shared.prf \
/usr/lib64/qt4/mkspecs/features/unix/gdb_dwarf_index.prf \
@@ -118,6 +118,7 @@ all: Makefile $(TARGET)
$(TARGET): $(OBJECTS)
@$(CHK_DIR_EXISTS) bin/ || $(MKDIR) bin/
$(LINK) $(LFLAGS) -o $(TARGET) $(OBJECTS) $(OBJCOMP) $(LIBS)
+ { test -n "$(DESTDIR)" && DESTDIR="$(DESTDIR)" || DESTDIR=.; } && test $$(gdb --version | sed -e 's,[^0-9]\+\([0-9]\)\.\([0-9]\).*,\1\2,;q') -gt 72 && gdb --nx --batch --quiet -ex 'set confirm off' -ex "save gdb-index $$DESTDIR" -ex quit '$(TARGET)' && test -f $(TARGET).gdb-index && sparc-rtems-objcopy --add-section '.gdb_index=$(TARGET).gdb-index' --set-section-flags '.gdb_index=readonly' '$(TARGET)' '$(TARGET)' && rm -f $(TARGET).gdb-index || true
Makefile: fsw-qt.pro /usr/lib64/qt4/mkspecs/linux-g++/qmake.conf /usr/lib64/qt4/mkspecs/common/unix.conf \
/usr/lib64/qt4/mkspecs/common/linux.conf \
@@ -132,7 +133,7 @@ Makefile: fsw-qt.pro /usr/lib64/qt4/mks
/usr/lib64/qt4/mkspecs/features/exclusive_builds.prf \
/usr/lib64/qt4/mkspecs/features/default_pre.prf \
sparc.pri \
- /usr/lib64/qt4/mkspecs/features/release.prf \
+ /usr/lib64/qt4/mkspecs/features/debug.prf \
/usr/lib64/qt4/mkspecs/features/default_post.prf \
/usr/lib64/qt4/mkspecs/features/shared.prf \
/usr/lib64/qt4/mkspecs/features/unix/gdb_dwarf_index.prf \
@@ -142,7 +143,7 @@ Makefile: fsw-qt.pro /usr/lib64/qt4/mks
/usr/lib64/qt4/mkspecs/features/yacc.prf \
/usr/lib64/qt4/mkspecs/features/lex.prf \
/usr/lib64/qt4/mkspecs/features/include_source_dir.prf
- $(QMAKE) -spec /usr/lib64/qt4/mkspecs/linux-g++ -o Makefile fsw-qt.pro
+ $(QMAKE) -spec /usr/lib64/qt4/mkspecs/linux-g++ CONFIG+=debug -o Makefile fsw-qt.pro
/usr/lib64/qt4/mkspecs/common/unix.conf:
/usr/lib64/qt4/mkspecs/common/linux.conf:
/usr/lib64/qt4/mkspecs/common/gcc-base.conf:
@@ -156,7 +157,7 @@ Makefile: fsw-qt.pro /usr/lib64/qt4/mks
/usr/lib64/qt4/mkspecs/features/exclusive_builds.prf:
/usr/lib64/qt4/mkspecs/features/default_pre.prf:
sparc.pri:
-/usr/lib64/qt4/mkspecs/features/release.prf:
+/usr/lib64/qt4/mkspecs/features/debug.prf:
/usr/lib64/qt4/mkspecs/features/default_post.prf:
/usr/lib64/qt4/mkspecs/features/shared.prf:
/usr/lib64/qt4/mkspecs/features/unix/gdb_dwarf_index.prf:
@@ -167,7 +168,7 @@ sparc.pri:
/usr/lib64/qt4/mkspecs/features/lex.prf:
/usr/lib64/qt4/mkspecs/features/include_source_dir.prf:
qmake: FORCE
- @$(QMAKE) -spec /usr/lib64/qt4/mkspecs/linux-g++ -o Makefile fsw-qt.pro
+ @$(QMAKE) -spec /usr/lib64/qt4/mkspecs/linux-g++ CONFIG+=debug -o Makefile fsw-qt.pro
dist:
@$(CHK_DIR_EXISTS) obj/fsw1.0.0 || $(MKDIR) obj/fsw1.0.0
diff --git a/FSW-qt/fsw-qt.pro b/FSW-qt/fsw-qt.pro
--- a/FSW-qt/fsw-qt.pro
+++ b/FSW-qt/fsw-qt.pro
@@ -1,7 +1,7 @@
TEMPLATE = app
# CONFIG += console v8 sim
# CONFIG options = verbose *** boot_messages *** debug_messages *** cpu_usage_report *** stack_report *** gsa
-CONFIG += console verbose
+CONFIG += console verbose debug_messages
CONFIG -= qt
include(./sparc.pri)
diff --git a/FSW-qt/fsw-qt.pro.user b/FSW-qt/fsw-qt.pro.user
--- a/FSW-qt/fsw-qt.pro.user
+++ b/FSW-qt/fsw-qt.pro.user
@@ -1,6 +1,6 @@
-
+
ProjectExplorer.Project.ActiveTarget
@@ -15,13 +15,13 @@
Cpp
- CppGlobal
+ CppGlobal
QmlJS
- QmlJSGlobal
+ QmlJSGlobal
2
@@ -58,6 +58,7 @@
0
0
+ /opt/DEV_PLE/FSW-qt
true
@@ -112,11 +113,11 @@
Release
Qt4ProjectManager.Qt4BuildConfiguration
- 0
- /opt/DEV_PLE/FSW-qt
+ 2
false
+ /opt/DEV_PLE/FSW-qt
true
@@ -172,7 +173,6 @@
Qt4ProjectManager.Qt4BuildConfiguration
0
- /opt/DEV_PLE/FSW-qt
false
2
@@ -191,7 +191,6 @@
1
- true
false
false
@@ -201,8 +200,12 @@
0.01
10
true
+ 1
25
+ 1
+ true
+ false
true
valgrind
@@ -239,141 +242,7 @@
false
true
- 1
-
-
-
- ProjectExplorer.Project.Target.1
-
- Desktop2
- Desktop2
- {e96c4de1-323d-4095-8746-d006ca3bd573}
- 0
- 0
- 0
-
-
-
- true
- qmake
-
- QtProjectManager.QMakeBuildStep
- false
- false
-
- false
-
-
- true
- Make
-
- Qt4ProjectManager.MakeStep
-
- false
-
-
-
- 2
- Build
-
- ProjectExplorer.BuildSteps.Build
-
-
-
- true
- Make
-
- Qt4ProjectManager.MakeStep
-
- true
- clean
-
-
- 1
- Clean
-
- ProjectExplorer.BuildSteps.Clean
-
- 2
- false
-
- Release
-
- Qt4ProjectManager.Qt4BuildConfiguration
- 0
- /opt/DEV_PLE/FSW-qt
- false
-
-
-
-
- true
- qmake
-
- QtProjectManager.QMakeBuildStep
- false
- false
-
- false
-
-
- true
- Make
-
- Qt4ProjectManager.MakeStep
-
- false
-
-
-
- 2
- Build
-
- ProjectExplorer.BuildSteps.Build
-
-
-
- true
- Make
-
- Qt4ProjectManager.MakeStep
-
- true
- clean
-
-
- 1
- Clean
-
- ProjectExplorer.BuildSteps.Clean
-
- 2
- false
-
- Release2
-
- Qt4ProjectManager.Qt4BuildConfiguration
- 0
- /opt/DEV_PLE/FSW-qt
- false
-
- 2
-
-
- 0
- Deploy
-
- ProjectExplorer.BuildSteps.Deploy
-
- 1
- Deploy locally
-
- ProjectExplorer.DefaultDeployConfiguration
-
- 1
-
-
- true
+
false
false
@@ -383,8 +252,12 @@
0.01
10
true
+ 1
25
+ 1
+ true
+ false
true
valgrind
@@ -404,16 +277,15 @@
13
14
- 2
+ -1
- fsw-qt
+
+ grmon
+ false
+ %{buildDir}
+ Run grmon
- Qt4ProjectManager.Qt4RunConfiguration:/opt/DEV_PLE/FSW-qt/fsw-qt.pro
-
- fsw-qt.pro
- false
- true
-
+ ProjectExplorer.CustomExecutableRunConfiguration
3768
false
true
@@ -421,12 +293,12 @@
false
true
- 1
+ 2
ProjectExplorer.Project.TargetCount
- 2
+ 1
ProjectExplorer.Project.Updater.EnvironmentId
@@ -434,6 +306,6 @@
ProjectExplorer.Project.Updater.FileVersion
- 14
+ 15
diff --git a/header/fsw_params.h b/header/fsw_params.h
--- a/header/fsw_params.h
+++ b/header/fsw_params.h
@@ -13,6 +13,16 @@
// flight software version
// this parameters is handled by the Qt project options
+#define NB_SAMPLES_PER_SNAPSHOT 2048
+#define TIME_OFFSET 2
+#define WAVEFORM_EXTENDED_HEADER_OFFSET 22
+#define NB_BYTES_SWF_BLK (2 * 6)
+#define NB_WORDS_SWF_BLK 3
+#define NB_BYTES_CWF3_LIGHT_BLK 6
+#define WFRM_INDEX_OF_LAST_PACKET 6 // waveforms are transmitted in groups of 2048 blocks, 6 packets of 340 and 1 of 8
+#define NB_RING_NODES_F1 5 // AT LEAST 3
+#define NB_RING_NODES_F2 5 // AT LEAST 3
+
//**********
// LFR MODES
#define LFR_MODE_STANDBY 0
@@ -36,7 +46,7 @@
#define DEFAULT_SY_LFR_COMMON1 0x10 // default value 0 0 0 1 0 0 0 0
// NORM
#define SY_LFR_N_SWF_L 2048 // nb sample
-#define SY_LFR_N_SWF_P 296 // sec
+#define SY_LFR_N_SWF_P 20 // sec
#define SY_LFR_N_ASM_P 3600 // sec
#define SY_LFR_N_BP_P0 4 // sec
#define SY_LFR_N_BP_P1 20 // sec
@@ -126,30 +136,21 @@
#define TASK_PRIORITY_SPIQ 5
#define TASK_PRIORITY_SMIQ 10
-//
#define TASK_PRIORITY_WTDG 20
-//
#define TASK_PRIORITY_HOUS 30
-//
#define TASK_PRIORITY_CWF1 35 // CWF1 and CWF2 are never running together
#define TASK_PRIORITY_CWF2 35 //
-//
#define TASK_PRIORITY_WFRM 40
#define TASK_PRIORITY_CWF3 40 // there is a printf in this function, be careful with its priority wrt CWF1
-//
#define TASK_PRIORITY_SEND 45
-//
#define TASK_PRIORITY_RECV 50
#define TASK_PRIORITY_ACTN 50
-//
#define TASK_PRIORITY_AVF0 60
#define TASK_PRIORITY_BPF0 60
#define TASK_PRIORITY_MATR 100
#define TASK_PRIORITY_STAT 200
#define TASK_PRIORITY_DUMB 200
-#define SEMQ_PRIORITY_CEILING 30
-
#define ACTION_MSG_QUEUE_COUNT 10
#define ACTION_MSG_PKTS_COUNT 50
#define ACTION_MSG_PKTS_MAX_SIZE (PACKET_LENGTH_HK + CCSDS_TC_TM_PACKET_OFFSET + CCSDS_PROTOCOLE_EXTRA_BYTES)
@@ -192,14 +193,6 @@
#define CPU_USAGE_REPORT_PERIOD 6 // * 10 s = period
-#define NB_SAMPLES_PER_SNAPSHOT 2048
-#define TIME_OFFSET 2
-#define WAVEFORM_EXTENDED_HEADER_OFFSET 22
-#define NB_BYTES_SWF_BLK (2 * 6)
-#define NB_WORDS_SWF_BLK 3
-#define NB_BYTES_CWF3_LIGHT_BLK 6
-#define WFRM_INDEX_OF_LAST_PACKET 6 // waveforms are transmitted in groups of 2048 blocks, 6 packets of 340 and 1 of 8
-
struct param_local_str{
unsigned int local_sbm1_nb_cwf_sent;
unsigned int local_sbm1_nb_cwf_max;
diff --git a/header/wf_handler.h b/header/wf_handler.h
--- a/header/wf_handler.h
+++ b/header/wf_handler.h
@@ -12,20 +12,29 @@
#define pi 3.1415
+typedef struct ring_node
+{
+ struct ring_node *previous;
+ int buffer_address;
+ struct ring_node *next;
+ unsigned int status;
+} ring_node;
+
extern int fdSPW;
+
+//*****************
+// waveform buffers
+// F0
extern volatile int wf_snap_f0[ ];
-//
-extern volatile int wf_snap_f1[ ];
-extern volatile int wf_snap_f1_bis[ ];
-extern volatile int wf_snap_f1_norm[ ];
-//
-extern volatile int wf_snap_f2[ ];
-extern volatile int wf_snap_f2_bis[ ];
-extern volatile int wf_snap_f2_norm[ ];
-//
+// F1
+extern volatile int wf_snap_f1[ ][ NB_SAMPLES_PER_SNAPSHOT * NB_WORDS_SWF_BLK + TIME_OFFSET ];
+// F2
+extern volatile int wf_snap_f2[ ][ NB_SAMPLES_PER_SNAPSHOT * NB_WORDS_SWF_BLK + TIME_OFFSET ];
+// F3
extern volatile int wf_cont_f3[ ];
extern volatile int wf_cont_f3_bis[ ];
extern char wf_cont_f3_light[ ];
+
extern waveform_picker_regs_t *waveform_picker_regs;
extern time_management_regs_t *time_management_regs;
extern Packet_TM_LFR_HK_t housekeeping_packet;
@@ -40,7 +49,6 @@ extern rtems_id Task_id[20];
extern unsigned char lfrCurrentMode;
rtems_isr waveforms_isr( rtems_vector_number vector );
-rtems_isr waveforms_simulator_isr( rtems_vector_number vector );
rtems_task wfrm_task( rtems_task_argument argument );
rtems_task cwf3_task( rtems_task_argument argument );
rtems_task cwf2_task( rtems_task_argument argument );
@@ -49,13 +57,13 @@ rtems_task cwf1_task( rtems_task_argumen
//******************
// general functions
void init_waveforms( void );
+void init_waveform_rings( void );
+void reset_current_ring_nodes( void );
//
int init_header_snapshot_wf_table( unsigned int sid, Header_TM_LFR_SCIENCE_SWF_t *headerSWF );
int init_header_continuous_wf_table( unsigned int sid, Header_TM_LFR_SCIENCE_CWF_t *headerCWF );
int init_header_continuous_wf3_light_table( Header_TM_LFR_SCIENCE_CWF_t *headerCWF );
//
-void reset_waveforms( void );
-//
int send_waveform_SWF( volatile int *waveform, unsigned int sid, Header_TM_LFR_SCIENCE_SWF_t *headerSWF, rtems_id queue_id );
int send_waveform_CWF( volatile int *waveform, unsigned int sid, Header_TM_LFR_SCIENCE_CWF_t *headerCWF, rtems_id queue_id );
int send_waveform_CWF3( volatile int *waveform, unsigned int sid, Header_TM_LFR_SCIENCE_CWF_t *headerCWF, rtems_id queue_id );
diff --git a/src/fsw_globals.c b/src/fsw_globals.c
--- a/src/fsw_globals.c
+++ b/src/fsw_globals.c
@@ -31,25 +31,12 @@ int fdSPW = 0;
int fdUART = 0;
unsigned char lfrCurrentMode;
-// APB CONFIGURATION REGISTERS
-time_management_regs_t *time_management_regs = (time_management_regs_t*) REGS_ADDR_TIME_MANAGEMENT;
-gptimer_regs_t *gptimer_regs = (gptimer_regs_t *) REGS_ADDR_GPTIMER;
-#ifdef GSA
-#else
- waveform_picker_regs_t *waveform_picker_regs = (waveform_picker_regs_t*) REGS_ADDR_WAVEFORM_PICKER;
-#endif
-spectral_matrix_regs_t *spectral_matrix_regs = (spectral_matrix_regs_t*) REGS_ADDR_SPECTRAL_MATRIX;
-
// WAVEFORMS GLOBAL VARIABLES // 2048 * 3 * 4 + 2 * 4 = 24576 + 8 bytes
volatile int wf_snap_f0[ NB_SAMPLES_PER_SNAPSHOT * NB_WORDS_SWF_BLK + TIME_OFFSET ];
//
-volatile int wf_snap_f1[ NB_SAMPLES_PER_SNAPSHOT * NB_WORDS_SWF_BLK + TIME_OFFSET ];
-volatile int wf_snap_f1_bis[ NB_SAMPLES_PER_SNAPSHOT * NB_WORDS_SWF_BLK + TIME_OFFSET ];
-volatile int wf_snap_f1_norm[ NB_SAMPLES_PER_SNAPSHOT * NB_WORDS_SWF_BLK + TIME_OFFSET ];
+volatile int wf_snap_f1[NB_RING_NODES_F1][ NB_SAMPLES_PER_SNAPSHOT * NB_WORDS_SWF_BLK + TIME_OFFSET ];
//
-volatile int wf_snap_f2[ NB_SAMPLES_PER_SNAPSHOT * NB_WORDS_SWF_BLK + TIME_OFFSET ];
-volatile int wf_snap_f2_bis[ NB_SAMPLES_PER_SNAPSHOT * NB_WORDS_SWF_BLK + TIME_OFFSET ];
-volatile int wf_snap_f2_norm[ NB_SAMPLES_PER_SNAPSHOT * NB_WORDS_SWF_BLK + TIME_OFFSET ];
+volatile int wf_snap_f2[NB_RING_NODES_F2][ NB_SAMPLES_PER_SNAPSHOT * NB_WORDS_SWF_BLK + TIME_OFFSET ];
//
volatile int wf_cont_f3[ NB_SAMPLES_PER_SNAPSHOT * NB_WORDS_SWF_BLK + TIME_OFFSET ];
volatile int wf_cont_f3_bis[ NB_SAMPLES_PER_SNAPSHOT * NB_WORDS_SWF_BLK + TIME_OFFSET ];
@@ -75,6 +62,15 @@ volatile int spec_mat_f1_bis[ SM_HEADER
volatile int spec_mat_f2[ SM_HEADER + TOTAL_SIZE_SM ];
volatile int spec_mat_f2_bis[ SM_HEADER + TOTAL_SIZE_SM ];
+// APB CONFIGURATION REGISTERS
+time_management_regs_t *time_management_regs = (time_management_regs_t*) REGS_ADDR_TIME_MANAGEMENT;
+gptimer_regs_t *gptimer_regs = (gptimer_regs_t *) REGS_ADDR_GPTIMER;
+#ifdef GSA
+#else
+ waveform_picker_regs_t *waveform_picker_regs = (waveform_picker_regs_t*) REGS_ADDR_WAVEFORM_PICKER;
+#endif
+spectral_matrix_regs_t *spectral_matrix_regs = (spectral_matrix_regs_t*) REGS_ADDR_SPECTRAL_MATRIX;
+
// MODE PARAMETERS
Packet_TM_LFR_PARAMETER_DUMP_t parameter_dump_packet;
struct param_local_str param_local;
diff --git a/src/fsw_init.c b/src/fsw_init.c
--- a/src/fsw_init.c
+++ b/src/fsw_init.c
@@ -85,6 +85,7 @@ rtems_task Init( rtems_task_argument ign
set_apbuart_scaler_reload_register(REGS_ADDR_APBUART, APBUART_SCALER_RELOAD_VALUE);
reset_wfp_burst_enable(); // stop the waveform picker if it was running
+ init_waveform_rings(); // initialize the waveform rings
init_parameter_dump();
init_local_mode_parameters();
diff --git a/src/tc_handler.c b/src/tc_handler.c
--- a/src/tc_handler.c
+++ b/src/tc_handler.c
@@ -573,6 +573,9 @@ int enter_sbm1_mode()
#ifdef GSA
LEON_Unmask_interrupt( IRQ_SM );
#else
+ //****************
+ // waveform picker
+ reset_current_ring_nodes();
reset_waveform_picker_regs();
set_wfp_burst_enable_register(LFR_MODE_SBM1);
LEON_Clear_interrupt( IRQ_WAVEFORM_PICKER );
@@ -605,6 +608,9 @@ int enter_sbm2_mode()
#ifdef GSA
LEON_Unmask_interrupt( IRQ_SM );
#else
+ //****************
+ // waveform picker
+ reset_current_ring_nodes();
reset_waveform_picker_regs();
set_wfp_burst_enable_register(LFR_MODE_SBM2);
LEON_Clear_interrupt( IRQ_WAVEFORM_PICKER );
diff --git a/src/wf_handler.c b/src/wf_handler.c
--- a/src/wf_handler.c
+++ b/src/wf_handler.c
@@ -9,6 +9,8 @@
#include "wf_handler.h"
+//*****************
+// waveform headers
// SWF
Header_TM_LFR_SCIENCE_SWF_t headerSWF_F0[7];
Header_TM_LFR_SCIENCE_SWF_t headerSWF_F1[7];
@@ -20,7 +22,17 @@ Header_TM_LFR_SCIENCE_CWF_t headerCWF_F2
Header_TM_LFR_SCIENCE_CWF_t headerCWF_F3[7];
Header_TM_LFR_SCIENCE_CWF_t headerCWF_F3_light[7];
-unsigned char doubleSendCWF1 = 0;
+//**************
+// waveform ring
+ring_node waveform_ring_f1[NB_RING_NODES_F1];
+ring_node waveform_ring_f2[NB_RING_NODES_F2];
+ring_node *current_ring_node_f1;
+ring_node *ring_node_to_send_swf_f1;
+ring_node *ring_node_to_send_cwf_f1;
+ring_node *current_ring_node_f2;
+ring_node *ring_node_to_send_swf_f2;
+ring_node *ring_node_to_send_cwf_f2;
+
unsigned char doubleSendCWF2 = 0;
rtems_isr waveforms_isr( rtems_vector_number vector )
@@ -74,11 +86,20 @@ rtems_isr waveforms_isr( rtems_vector_nu
else {
if ( (waveform_picker_regs->status & 0x7) == 0x7 ){ // f2 f1 and f0 are full
waveform_picker_regs->burst_enable = waveform_picker_regs->burst_enable & 0x08;
+
+ ring_node_to_send_swf_f1 = current_ring_node_f1;
+ current_ring_node_f1 = current_ring_node_f1->next;
+ waveform_picker_regs->addr_data_f1 = current_ring_node_f1->buffer_address;
+
+ ring_node_to_send_swf_f2 = current_ring_node_f2;
+ current_ring_node_f2 = current_ring_node_f2->next;
+ waveform_picker_regs->addr_data_f2 = current_ring_node_f2->buffer_address;
+
if (rtems_event_send( Task_id[TASKID_WFRM], RTEMS_EVENT_MODE_NORMAL ) != RTEMS_SUCCESSFUL) {
rtems_event_send( Task_id[TASKID_DUMB], RTEMS_EVENT_2 );
}
-// waveform_picker_regs->status = waveform_picker_regs->status & 0x00;
- waveform_picker_regs->status = waveform_picker_regs->status & 0xfffff888;
+
+ waveform_picker_regs->status = waveform_picker_regs->status & 0xfffff888; // [1000 1000 1000]
waveform_picker_regs->burst_enable = waveform_picker_regs->burst_enable | 0x07; // [0111] enable f2 f1 f0
}
}
@@ -91,19 +112,16 @@ rtems_isr waveforms_isr( rtems_vector_nu
#ifdef GSA
PRINTF("in waveform_isr *** unexpected waveform picker interruption\n")
#else
- if ((waveform_picker_regs->status & 0x04) == 0x04){ // [0100] check the f2 full bit
+ if ( (waveform_picker_regs->status & 0x04) == 0x04 ){ // [0100] check the f2 full bit
// (1) change the receiving buffer for the waveform picker
- if (waveform_picker_regs->addr_data_f2 == (int) wf_snap_f2) {
- waveform_picker_regs->addr_data_f2 = (int) (wf_snap_f2_bis);
- }
- else {
- waveform_picker_regs->addr_data_f2 = (int) (wf_snap_f2);
- }
+ ring_node_to_send_cwf_f2 = current_ring_node_f2;
+ current_ring_node_f2 = current_ring_node_f2->next;
+ waveform_picker_regs->addr_data_f2 = current_ring_node_f2->buffer_address;
// (2) send an event for the waveforms transmission
- if (rtems_event_send( Task_id[TASKID_CWF2], RTEMS_EVENT_MODE_BURST ) != RTEMS_SUCCESSFUL) {
+ if (rtems_event_send( Task_id[TASKID_CWF1], RTEMS_EVENT_MODE_SBM2 ) != RTEMS_SUCCESSFUL) {
rtems_event_send( Task_id[TASKID_DUMB], RTEMS_EVENT_2 );
}
- waveform_picker_regs->status = waveform_picker_regs->status & 0xfffffbbb; // [1111 1011 1011 1011] f2 bits = 0
+ waveform_picker_regs->status = waveform_picker_regs->status & 0xfffffbbb; // [1111 1011 1011 1011] f2 bit = 0
}
#endif
break;
@@ -114,35 +132,25 @@ rtems_isr waveforms_isr( rtems_vector_nu
#ifdef GSA
PRINTF("in waveform_isr *** unexpected waveform picker interruption\n")
#else
- if ((waveform_picker_regs->status & 0x02) == 0x02){ // [0010] check the f1 full bit
+ if ( (waveform_picker_regs->status & 0x02) == 0x02 ) { // [0010] check the f1 full bit
// (1) change the receiving buffer for the waveform picker
- if ( param_local.local_sbm1_nb_cwf_sent == (param_local.local_sbm1_nb_cwf_max-1) )
- {
- waveform_picker_regs->addr_data_f1 = (int) (wf_snap_f1_norm);
- }
- else if ( waveform_picker_regs->addr_data_f1 == (int) wf_snap_f1_norm )
- {
- doubleSendCWF1 = 1;
- waveform_picker_regs->addr_data_f1 = (int) (wf_snap_f1);
- }
- else if ( waveform_picker_regs->addr_data_f1 == (int) wf_snap_f1 ) {
- waveform_picker_regs->addr_data_f1 = (int) (wf_snap_f1_bis);
- }
- else {
- waveform_picker_regs->addr_data_f1 = (int) (wf_snap_f1);
- }
+ ring_node_to_send_cwf_f1 = current_ring_node_f1;
+ current_ring_node_f1 = current_ring_node_f1->next;
+ waveform_picker_regs->addr_data_f1 = current_ring_node_f1->buffer_address;
// (2) send an event for the waveforms transmission
if (rtems_event_send( Task_id[TASKID_CWF1], RTEMS_EVENT_MODE_SBM1 ) != RTEMS_SUCCESSFUL) {
rtems_event_send( Task_id[TASKID_DUMB], RTEMS_EVENT_2 );
}
waveform_picker_regs->status = waveform_picker_regs->status & 0xfffffddd; // [1111 1101 1101 1101] f1 bit = 0
}
- if ( ( (waveform_picker_regs->status & 0x05) == 0x05 ) ) { // [0101] check the f2 and f0 full bit
+ if ( (waveform_picker_regs->status & 0x01) == 0x01 ) { // [0001] check the f0 full bit
+ ring_node_to_send_swf_f1 = current_ring_node_f1->previous;
+ }
+ if ( (waveform_picker_regs->status & 0x04) == 0x04 ) { // [0100] check the f2 full bit
if (rtems_event_send( Task_id[TASKID_WFRM], RTEMS_EVENT_MODE_NORMAL ) != RTEMS_SUCCESSFUL) {
rtems_event_send( Task_id[TASKID_DUMB], RTEMS_EVENT_2 );
}
waveform_picker_regs->status = waveform_picker_regs->status & 0xfffffaaa; // [1111 1010 1010 1010] f2 and f0 bits = 0
- reset_local_sbm1_nb_cwf_sent();
}
#endif
@@ -154,38 +162,23 @@ rtems_isr waveforms_isr( rtems_vector_nu
#ifdef GSA
PRINTF("in waveform_isr *** unexpected waveform picker interruption\n")
#else
- if ((waveform_picker_regs->status & 0x04) == 0x04){ // [0100] check the f2 full bit
+ if ( (waveform_picker_regs->status & 0x04) == 0x04 ){ // [0100] check the f2 full bit
// (1) change the receiving buffer for the waveform picker
- if ( param_local.local_sbm2_nb_cwf_sent == (param_local.local_sbm2_nb_cwf_max-1) )
- {
- waveform_picker_regs->addr_data_f2 = (int) (wf_snap_f2_norm);
- }
- else if ( waveform_picker_regs->addr_data_f2 == (int) wf_snap_f2_norm ) {
- waveform_picker_regs->addr_data_f2 = (int) (wf_snap_f2);
- doubleSendCWF2 = 1;
- if (rtems_event_send( Task_id[TASKID_WFRM], RTEMS_EVENT_MODE_SBM2_WFRM ) != RTEMS_SUCCESSFUL) {
- rtems_event_send( Task_id[TASKID_DUMB], RTEMS_EVENT_2 );
- }
- reset_local_sbm2_nb_cwf_sent();
- }
- else if ( waveform_picker_regs->addr_data_f2 == (int) wf_snap_f2 ) {
- waveform_picker_regs->addr_data_f2 = (int) (wf_snap_f2_bis);
- }
- else {
- waveform_picker_regs->addr_data_f2 = (int) (wf_snap_f2);
- }
+ ring_node_to_send_cwf_f2 = current_ring_node_f2;
+ current_ring_node_f2 = current_ring_node_f2->next;
+ waveform_picker_regs->addr_data_f2 = current_ring_node_f2->buffer_address;
// (2) send an event for the waveforms transmission
if (rtems_event_send( Task_id[TASKID_CWF2], RTEMS_EVENT_MODE_SBM2 ) != RTEMS_SUCCESSFUL) {
rtems_event_send( Task_id[TASKID_DUMB], RTEMS_EVENT_2 );
}
waveform_picker_regs->status = waveform_picker_regs->status & 0xfffffbbb; // [1111 1011 1011 1011] f2 bit = 0
}
- if ( ( (waveform_picker_regs->status & 0x03) == 0x03 ) ) { // [0011] f3 f2 f1 f0, f1 and f0 are full
- if (rtems_event_send( Task_id[TASKID_WFRM], RTEMS_EVENT_MODE_SBM2 ) != RTEMS_SUCCESSFUL) {
- rtems_event_send( Task_id[TASKID_DUMB], RTEMS_EVENT_2 );
- }
- waveform_picker_regs->status = waveform_picker_regs->status & 0xfffffccc; // [1111 1100 1100 1100] f1, f0 bits = 0
- }
+// if ( (waveform_picker_regs->status & 0x03) == 0x03 ) { // [0011] f3 f2 f1 f0, f1 and f0 are full
+// if (rtems_event_send( Task_id[TASKID_WFRM], RTEMS_EVENT_MODE_SBM2 ) != RTEMS_SUCCESSFUL) {
+// rtems_event_send( Task_id[TASKID_DUMB], RTEMS_EVENT_2 );
+// }
+// waveform_picker_regs->status = waveform_picker_regs->status & 0xfffffccc; // [1111 1100 1100 1100] f1, f0 bits = 0
+// }
#endif
break;
@@ -196,34 +189,6 @@ rtems_isr waveforms_isr( rtems_vector_nu
}
}
-rtems_isr waveforms_simulator_isr( rtems_vector_number vector )
-{
- /** This is the interrupt sub routine called by the waveform picker simulator.
- *
- * This ISR is for debug purpose only.
- *
- */
-
- unsigned char lfrMode;
- lfrMode = (housekeeping_packet.lfr_status_word[0] & 0xf0) >> 4;
-
- switch(lfrMode) {
- case (LFR_MODE_STANDBY):
- break;
- case (LFR_MODE_NORMAL):
- if (rtems_event_send( Task_id[TASKID_WFRM], RTEMS_EVENT_MODE_NORMAL ) != RTEMS_SUCCESSFUL) {
- rtems_event_send( Task_id[TASKID_DUMB], RTEMS_EVENT_5 );
- }
- break;
- case (LFR_MODE_BURST):
- break;
- case (LFR_MODE_SBM1):
- break;
- case (LFR_MODE_SBM2):
- break;
- }
-}
-
rtems_task wfrm_task(rtems_task_argument argument) //used with the waveform picker VHDL IP
{
/** This RTEMS task is dedicated to the transmission of snapshots of the NORMAL mode.
@@ -260,49 +225,17 @@ rtems_task wfrm_task(rtems_task_argument
rtems_event_receive(RTEMS_EVENT_MODE_NORMAL | RTEMS_EVENT_MODE_SBM1
| RTEMS_EVENT_MODE_SBM2 | RTEMS_EVENT_MODE_SBM2_WFRM,
RTEMS_WAIT | RTEMS_EVENT_ANY, RTEMS_NO_TIMEOUT, &event_out);
-
+ DEBUG_PRINTF("in WFRM *** 2\n")
if (event_out == RTEMS_EVENT_MODE_NORMAL)
{
send_waveform_SWF(wf_snap_f0, SID_NORM_SWF_F0, headerSWF_F0, queue_id);
- send_waveform_SWF(wf_snap_f1, SID_NORM_SWF_F1, headerSWF_F1, queue_id);
- send_waveform_SWF(wf_snap_f2, SID_NORM_SWF_F2, headerSWF_F2, queue_id);
-#ifdef GSA
- waveform_picker_regs->status = waveform_picker_regs->status & 0xf888; // [1111 1000 1000 1000] f2, f1, f0 bits =0
-#endif
- }
- else if (event_out == RTEMS_EVENT_MODE_SBM1)
- {
- send_waveform_SWF(wf_snap_f0, SID_NORM_SWF_F0, headerSWF_F0, queue_id);
- send_waveform_SWF(wf_snap_f1_norm, SID_NORM_SWF_F1, headerSWF_F1, queue_id);
- send_waveform_SWF(wf_snap_f2, SID_NORM_SWF_F2, headerSWF_F2, queue_id);
-#ifdef GSA
- waveform_picker_regs->status = waveform_picker_regs->status & 0xfffffaaa; // [1111 1010 1010 1010] f2, f0 bits = 0
-#endif
- }
- else if (event_out == RTEMS_EVENT_MODE_SBM2)
- {
- send_waveform_SWF(wf_snap_f0, SID_NORM_SWF_F0, headerSWF_F0, queue_id);
- send_waveform_SWF(wf_snap_f1, SID_NORM_SWF_F1, headerSWF_F1, queue_id);
-#ifdef GSA
- waveform_picker_regs->status = waveform_picker_regs->status & 0xfffffccc; // [1111 1100 1100 1100] f1, f0 bits = 0
-#endif
- }
- else if (event_out == RTEMS_EVENT_MODE_SBM2_WFRM)
- {
- send_waveform_SWF(wf_snap_f2_norm, SID_NORM_SWF_F2, headerSWF_F2, queue_id);
+ send_waveform_SWF((volatile int*) ring_node_to_send_swf_f1->buffer_address, SID_NORM_SWF_F1, headerSWF_F1, queue_id);
+ send_waveform_SWF((volatile int*) ring_node_to_send_swf_f2->buffer_address, SID_NORM_SWF_F2, headerSWF_F2, queue_id);
}
else
{
PRINTF("in WFRM *** unexpected event")
}
-
-
-#ifdef GSA
- // irq processed, reset the related register of the timer unit
- gptimer_regs->timer[TIMER_WF_SIMULATOR].ctrl = gptimer_regs->timer[TIMER_WF_SIMULATOR].ctrl | 0x00000010;
- // clear the interruption
- LEON_Unmask_interrupt( IRQ_WF );
-#endif
}
}
@@ -383,39 +316,11 @@ rtems_task cwf2_task(rtems_task_argument
if (event_out == RTEMS_EVENT_MODE_BURST)
{
- // F2
-#ifdef GSA
-#else
- if (waveform_picker_regs->addr_data_f2 == (int) wf_snap_f2) {
- send_waveform_CWF( wf_snap_f2_bis, SID_BURST_CWF_F2, headerCWF_F2_BURST, queue_id );
- }
- else {
- send_waveform_CWF( wf_snap_f2, SID_BURST_CWF_F2, headerCWF_F2_BURST, queue_id );
- }
- #endif
+ send_waveform_CWF( (volatile int *) ring_node_to_send_cwf_f2, SID_BURST_CWF_F2, headerCWF_F2_BURST, queue_id );
}
-
- else if (event_out == RTEMS_EVENT_MODE_SBM2)
+ if (event_out == RTEMS_EVENT_MODE_SBM2)
{
-#ifdef GSA
-#else
- if (doubleSendCWF2 == 1)
- {
- doubleSendCWF2 = 0;
- send_waveform_CWF( wf_snap_f2_norm, SID_SBM2_CWF_F2, headerCWF_F2_SBM2, queue_id );
- }
- else if (waveform_picker_regs->addr_data_f2 == (int) wf_snap_f2) {
- send_waveform_CWF( wf_snap_f2_bis, SID_SBM2_CWF_F2, headerCWF_F2_SBM2, queue_id );
- }
- else {
- send_waveform_CWF( wf_snap_f2, SID_SBM2_CWF_F2, headerCWF_F2_SBM2, queue_id );
- }
- param_local.local_sbm2_nb_cwf_sent ++;
-#endif
- }
- else
- {
- PRINTF1("in CWF2 *** ERR mode = %d\n", lfrCurrentMode)
+ send_waveform_CWF( (volatile int *) ring_node_to_send_cwf_f2, SID_BURST_CWF_F2, headerCWF_F2_BURST, queue_id );
}
}
}
@@ -449,28 +354,7 @@ rtems_task cwf1_task(rtems_task_argument
// wait for an RTEMS_EVENT
rtems_event_receive( RTEMS_EVENT_MODE_SBM1,
RTEMS_WAIT | RTEMS_EVENT_ANY, RTEMS_NO_TIMEOUT, &event_out);
- if (event_out == RTEMS_EVENT_MODE_SBM1)
- {
-#ifdef GSA
-#else
- if (doubleSendCWF1 == 1)
- {
- doubleSendCWF1 = 0;
- send_waveform_CWF( wf_snap_f1_norm, SID_SBM1_CWF_F1, headerCWF_F1, queue_id );
- }
- else if (waveform_picker_regs->addr_data_f1 == (int) wf_snap_f1) {
- send_waveform_CWF( wf_snap_f1_bis, SID_SBM1_CWF_F1, headerCWF_F1, queue_id );
- }
- else {
- send_waveform_CWF( wf_snap_f1, SID_SBM1_CWF_F1, headerCWF_F1, queue_id );
- }
- param_local.local_sbm1_nb_cwf_sent ++;
-#endif
- }
- else
- {
- PRINTF1("in CWF1 *** ERR mode = %d\n", lfrCurrentMode)
- }
+ send_waveform_CWF((volatile int*) ring_node_to_send_cwf_f1->buffer_address, SID_SBM1_CWF_F1, headerCWF_F1, queue_id );
}
}
@@ -490,22 +374,74 @@ void init_waveforms( void )
//***
// F1
- wf_snap_f1[ (i* NB_WORDS_SWF_BLK) + 0 + TIME_OFFSET ] = 0x22221111;
- wf_snap_f1[ (i* NB_WORDS_SWF_BLK) + 1 + TIME_OFFSET ] = 0x44443333;
- wf_snap_f1[ (i* NB_WORDS_SWF_BLK) + 2 + TIME_OFFSET ] = 0xaaaa0000;
+// wf_snap_f1[ (i* NB_WORDS_SWF_BLK) + 0 + TIME_OFFSET ] = 0x22221111;
+// wf_snap_f1[ (i* NB_WORDS_SWF_BLK) + 1 + TIME_OFFSET ] = 0x44443333;
+// wf_snap_f1[ (i* NB_WORDS_SWF_BLK) + 2 + TIME_OFFSET ] = 0xaaaa0000;
//***
// F2
- wf_snap_f2[ (i* NB_WORDS_SWF_BLK) + 0 + TIME_OFFSET ] = 0x44443333;
- wf_snap_f2[ (i* NB_WORDS_SWF_BLK) + 1 + TIME_OFFSET ] = 0x22221111;
- wf_snap_f2[ (i* NB_WORDS_SWF_BLK) + 2 + TIME_OFFSET ] = 0xaaaa0000;
+// wf_snap_f2[ (i* NB_WORDS_SWF_BLK) + 0 + TIME_OFFSET ] = 0x44443333;
+// wf_snap_f2[ (i* NB_WORDS_SWF_BLK) + 1 + TIME_OFFSET ] = 0x22221111;
+// wf_snap_f2[ (i* NB_WORDS_SWF_BLK) + 2 + TIME_OFFSET ] = 0xaaaa0000;
//***
// F3
- //wf_cont_f3[ (i* NB_WORDS_SWF_BLK) + 0 ] = val1;
- //wf_cont_f3[ (i* NB_WORDS_SWF_BLK) + 1 ] = val2;
- //wf_cont_f3[ (i* NB_WORDS_SWF_BLK) + 2 ] = 0xaaaa0000;
+// wf_cont_f3[ (i* NB_WORDS_SWF_BLK) + 0 ] = val1;
+// wf_cont_f3[ (i* NB_WORDS_SWF_BLK) + 1 ] = val2;
+// wf_cont_f3[ (i* NB_WORDS_SWF_BLK) + 2 ] = 0xaaaa0000;
+ }
+}
+
+void init_waveform_rings( void )
+{
+ unsigned char i;
+
+ // F1 RING
+ waveform_ring_f1[0].next = (ring_node*) &waveform_ring_f1[1];
+ waveform_ring_f1[0].previous = (ring_node*) &waveform_ring_f1[NB_RING_NODES_F1-1];
+ waveform_ring_f1[0].buffer_address = (int) &wf_snap_f1[0][0];
+
+ waveform_ring_f1[NB_RING_NODES_F1-1].next = (ring_node*) &waveform_ring_f1[0];
+ waveform_ring_f1[NB_RING_NODES_F1-1].previous = (ring_node*) &waveform_ring_f1[NB_RING_NODES_F1-2];
+ waveform_ring_f1[NB_RING_NODES_F1-1].buffer_address = (int) &wf_snap_f1[NB_RING_NODES_F1-1][0];
+
+ for(i=1; iaddr_data_f0 = (int) (wf_snap_f0); //
- waveform_picker_regs->addr_data_f1 = (int) (wf_snap_f1); //
- waveform_picker_regs->addr_data_f2 = (int) (wf_snap_f2); //
- waveform_picker_regs->addr_data_f3 = (int) (wf_cont_f3); //
+ waveform_picker_regs->addr_data_f0 = (int) (wf_snap_f0);
+ waveform_picker_regs->addr_data_f1 = current_ring_node_f1->buffer_address;
+ waveform_picker_regs->addr_data_f2 = current_ring_node_f2->buffer_address;
+ waveform_picker_regs->addr_data_f3 = (int) (wf_cont_f3);
// set other parameters
set_wfp_data_shaping();
set_wfp_delta_snapshot(); // time in seconds between two snapshots