##// END OF EJS Templates
Ignore doc files...
Ignore doc files All redmine issues taken into account SpaceWire management rewritten Init task changed to work when SpaceWire is not available at boot time

File last commit:

r46:72fea9e87fcb default
r46:72fea9e87fcb default
Show More
wf_handler.c
1166 lines | 44.7 KiB | text/x-c | CLexer
paul
Header files inclusion reworked...
r40 /** Functions and tasks related to waveform packet generation.
*
* @file
* @author P. LEROY
*
* A group of functions to handle waveforms, in snapshot or continuous format.\n
*
*/
#include "wf_handler.h"
paul@pc-solar1.lab-lpp.local
Naming convention changed...
r5
paul
Commit before working on the ERR 4 due to message queue...
r34 // SWF
Header_TM_LFR_SCIENCE_SWF_t headerSWF_F0[7];
Header_TM_LFR_SCIENCE_SWF_t headerSWF_F1[7];
Header_TM_LFR_SCIENCE_SWF_t headerSWF_F2[7];
// CWF
paul
packet emission task added...
r33 Header_TM_LFR_SCIENCE_CWF_t headerCWF_F1[7];
Header_TM_LFR_SCIENCE_CWF_t headerCWF_F2_BURST[7];
paul
Commit before working on the ERR 4 due to message queue...
r34 Header_TM_LFR_SCIENCE_CWF_t headerCWF_F2_SBM2[7];
paul
packet emission task added...
r33 Header_TM_LFR_SCIENCE_CWF_t headerCWF_F3[7];
paul
CWF_F3 packets are now compliant with the ICD...
r38 Header_TM_LFR_SCIENCE_CWF_t headerCWF_F3_light[7];
paul
packet emission task added...
r33
unsigned char doubleSendCWF1 = 0;
unsigned char doubleSendCWF2 = 0;
paul@pc-solar1.lab-lpp.local
Current version with modes NORMAL and SBM1 operational
r21 rtems_isr waveforms_isr( rtems_vector_number vector )
{
paul
Minor changes in .h inclusion
r45 /** This is the interrupt sub routine called by the waveform picker core.
*
* This ISR launch different actions depending mainly on two pieces of information:
* 1. the values read in the registers of the waveform picker.
* 2. the current LFR mode.
*
*/
paul@pc-solar1.lab-lpp.local
Current version with modes NORMAL and SBM1 operational
r21
paul
sy_lfr_n_swf_p implemented...
r32 #ifdef GSA
#else
paul
packet emission task added...
r33 if ( (lfrCurrentMode == LFR_MODE_NORMAL)
|| (lfrCurrentMode == LFR_MODE_SBM1) || (lfrCurrentMode == LFR_MODE_SBM2) )
paul
sy_lfr_n_swf_p implemented...
r32 { // in modes other than STANDBY and BURST, send the CWF_F3 data
paul
packet emission task added...
r33 if ((waveform_picker_regs->status & 0x08) == 0x08){ // [1000] f3 is full
paul
sy_lfr_n_swf_p implemented...
r32 // (1) change the receiving buffer for the waveform picker
if (waveform_picker_regs->addr_data_f3 == (int) wf_cont_f3) {
waveform_picker_regs->addr_data_f3 = (int) (wf_cont_f3_bis);
}
else {
waveform_picker_regs->addr_data_f3 = (int) (wf_cont_f3);
}
// (2) send an event for the waveforms transmission
paul
packet emission task added...
r33 if (rtems_event_send( Task_id[TASKID_CWF3], RTEMS_EVENT_0 ) != RTEMS_SUCCESSFUL) {
paul
sy_lfr_n_swf_p implemented...
r32 rtems_event_send( Task_id[TASKID_DUMB], RTEMS_EVENT_2 );
}
paul
packet emission task added...
r33 waveform_picker_regs->status = waveform_picker_regs->status & 0xfffff777; // reset f3 bits to 0, [1111 0111 0111 0111]
paul
sy_lfr_n_swf_p implemented...
r32 }
}
#endif
paul
packet emission task added...
r33 switch(lfrCurrentMode)
paul@pc-solar1.lab-lpp.local
Current version with modes NORMAL and SBM1 operational
r21 {
//********
// STANDBY
case(LFR_MODE_STANDBY):
paul
packet emission task added...
r33 break;
paul@pc-solar1.lab-lpp.local
Current version with modes NORMAL and SBM1 operational
r21
//******
// NORMAL
case(LFR_MODE_NORMAL):
#ifdef GSA
paul
packet emission task added...
r33 PRINTF("in waveform_isr *** unexpected waveform picker interruption\n")
paul@pc-solar1.lab-lpp.local
Current version with modes NORMAL and SBM1 operational
r21 #else
paul
Last commit before release 0-13...
r35 if ( (waveform_picker_regs->burst_enable & 0x7) == 0x0 ){ // if no channel is enable
rtems_event_send( Task_id[TASKID_DUMB], RTEMS_EVENT_2 );
}
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;
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->burst_enable = waveform_picker_regs->burst_enable | 0x07; // [0111] enable f2 f1 f0
paul@pc-solar1.lab-lpp.local
Current version with modes NORMAL and SBM1 operational
r21 }
paul
Last commit before release 0-13...
r35 }
paul@pc-solar1.lab-lpp.local
Current version with modes NORMAL and SBM1 operational
r21 #endif
paul
packet emission task added...
r33 break;
paul@pc-solar1.lab-lpp.local
Current version with modes NORMAL and SBM1 operational
r21
//******
// BURST
case(LFR_MODE_BURST):
paul@pc-solar1.lab-lpp.local
All modes partially implemented...
r22 #ifdef GSA
paul
packet emission task added...
r33 PRINTF("in waveform_isr *** unexpected waveform picker interruption\n")
paul@pc-solar1.lab-lpp.local
All modes partially implemented...
r22 #else
paul
packet emission task added...
r33 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);
paul@pc-solar1.lab-lpp.local
All modes partially implemented...
r22 }
paul
packet emission task added...
r33 // (2) send an event for the waveforms transmission
if (rtems_event_send( Task_id[TASKID_CWF2], RTEMS_EVENT_MODE_BURST ) != 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
}
paul@pc-solar1.lab-lpp.local
All modes partially implemented...
r22 #endif
paul
packet emission task added...
r33 break;
paul@pc-solar1.lab-lpp.local
Current version with modes NORMAL and SBM1 operational
r21
paul@pc-solar1.lab-lpp.local
All modes implemented for the waveforms...
r23 //*****
// SBM1
case(LFR_MODE_SBM1):
#ifdef GSA
paul
packet emission task added...
r33 PRINTF("in waveform_isr *** unexpected waveform picker interruption\n")
paul@pc-solar1.lab-lpp.local
All modes implemented for the waveforms...
r23 #else
paul
packet emission task added...
r33 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);
paul@pc-solar1.lab-lpp.local
All modes implemented for the waveforms...
r23 }
paul
packet emission task added...
r33 else {
waveform_picker_regs->addr_data_f1 = (int) (wf_snap_f1);
}
// (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 );
paul@pc-solar1.lab-lpp.local
All modes implemented for the waveforms...
r23 }
paul
packet emission task added...
r33 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 (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();
}
paul
sy_lfr_n_swf_p implemented...
r32
paul@pc-solar1.lab-lpp.local
All modes implemented for the waveforms...
r23 #endif
paul
packet emission task added...
r33 break;
paul@pc-solar1.lab-lpp.local
All modes implemented for the waveforms...
r23
//*****
// SBM2
case(LFR_MODE_SBM2):
#ifdef GSA
paul
packet emission task added...
r33 PRINTF("in waveform_isr *** unexpected waveform picker interruption\n")
paul@pc-solar1.lab-lpp.local
All modes implemented for the waveforms...
r23 #else
paul
packet emission task added...
r33 if ((waveform_picker_regs->status & 0x04) == 0x04){ // [0100] check the f2 full bit
// (1) change the receiving buffer for the waveform picker
paul
Commit before working on the ERR 4 due to message queue...
r34 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 ) {
paul
packet emission task added...
r33 waveform_picker_regs->addr_data_f2 = (int) (wf_snap_f2_bis);
}
else {
waveform_picker_regs->addr_data_f2 = (int) (wf_snap_f2);
}
// (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 );
paul@pc-solar1.lab-lpp.local
All modes implemented for the waveforms...
r23 }
paul
packet emission task added...
r33 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 );
paul@pc-solar1.lab-lpp.local
All modes implemented for the waveforms...
r23 }
paul
packet emission task added...
r33 waveform_picker_regs->status = waveform_picker_regs->status & 0xfffffccc; // [1111 1100 1100 1100] f1, f0 bits = 0
}
paul@pc-solar1.lab-lpp.local
All modes implemented for the waveforms...
r23 #endif
paul
packet emission task added...
r33 break;
paul@pc-solar1.lab-lpp.local
All modes implemented for the waveforms...
r23
paul@pc-solar1.lab-lpp.local
Current version with modes NORMAL and SBM1 operational
r21 //********
// DEFAULT
default:
paul
packet emission task added...
r33 break;
paul@pc-solar1.lab-lpp.local
Current version with modes NORMAL and SBM1 operational
r21 }
}
paul@pc-solar1.lab-lpp.local
Updates of the ICD taken into account...
r18 rtems_isr waveforms_simulator_isr( rtems_vector_number vector )
paul@pc-solar1.lab-lpp.local
Naming convention changed...
r5 {
paul
Minor changes in .h inclusion
r45 /** This is the interrupt sub routine called by the waveform picker simulator.
*
* This ISR is for debug purpose only.
*
*/
paul@pc-solar1.lab-lpp.local
All modes partially implemented...
r22 unsigned char lfrMode;
lfrMode = (housekeeping_packet.lfr_status_word[0] & 0xf0) >> 4;
paul
SID corrected in TM_LFR_TC_EXE packets...
r31 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) {
paul
SOLVED: compatibility of fsw-gsa with the WF simulator interruption
r30 rtems_event_send( Task_id[TASKID_DUMB], RTEMS_EVENT_5 );
paul
SID corrected in TM_LFR_TC_EXE packets...
r31 }
break;
case (LFR_MODE_BURST):
break;
case (LFR_MODE_SBM1):
break;
case (LFR_MODE_SBM2):
break;
paul@pc-solar1.lab-lpp.local
Updates of the ICD taken into account...
r18 }
}
rtems_task wfrm_task(rtems_task_argument argument) //used with the waveform picker VHDL IP
{
paul
Minor changes in .h inclusion
r45 /** This RTEMS task is dedicated to the transmission of snapshots of the NORMAL mode.
*
* @param unused is the starting argument of the RTEMS task
*
* The following data packets are sent by this task:
* - TM_LFR_SCIENCE_NORMAL_SWF_F0
* - TM_LFR_SCIENCE_NORMAL_SWF_F1
* - TM_LFR_SCIENCE_NORMAL_SWF_F2
*
*/
paul@pc-solar1.lab-lpp.local
Naming convention changed...
r5 rtems_event_set event_out;
paul
Last commit before release 0-13...
r35 rtems_id queue_id;
paul@pc-solar1.lab-lpp.local
Naming convention changed...
r5
paul
Commit before working on the ERR 4 due to message queue...
r34 init_header_snapshot_wf_table( SID_NORM_SWF_F0, headerSWF_F0 );
init_header_snapshot_wf_table( SID_NORM_SWF_F1, headerSWF_F1 );
init_header_snapshot_wf_table( SID_NORM_SWF_F2, headerSWF_F2 );
paul@pc-solar1.lab-lpp.local
Several TC actions added...
r11
paul@pc-solar1.lab-lpp.local
Updates of the ICD taken into account...
r18 init_waveforms();
paul
Ignore doc files...
r46 queue_id = get_pkts_queue_id();
paul
Last commit before release 0-13...
r35
BOOT_PRINTF("in WFRM ***\n")
paul@pc-solar1.lab-lpp.local
Updates of the ICD taken into account...
r18
while(1){
paul@pc-solar1.lab-lpp.local
Current version with modes NORMAL and SBM1 operational
r21 // wait for an RTEMS_EVENT
paul
Commit before working on the ERR 4 due to message queue...
r34 rtems_event_receive(RTEMS_EVENT_MODE_NORMAL | RTEMS_EVENT_MODE_SBM1
| RTEMS_EVENT_MODE_SBM2 | RTEMS_EVENT_MODE_SBM2_WFRM,
paul@pc-solar1.lab-lpp.local
Current version with modes NORMAL and SBM1 operational
r21 RTEMS_WAIT | RTEMS_EVENT_ANY, RTEMS_NO_TIMEOUT, &event_out);
paul
sy_lfr_n_swf_p implemented...
r32
paul
Last commit before release 0-13...
r35 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);
paul
packet emission task added...
r33 #ifdef GSA
paul
Commit before working on the ERR 4 due to message queue...
r34 waveform_picker_regs->status = waveform_picker_regs->status & 0xf888; // [1111 1000 1000 1000] f2, f1, f0 bits =0
paul
SID corrected in TM_LFR_TC_EXE packets...
r31 #endif
paul
Last commit before release 0-13...
r35 }
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);
paul
SID corrected in TM_LFR_TC_EXE packets...
r31 #ifdef GSA
paul
Commit before working on the ERR 4 due to message queue...
r34 waveform_picker_regs->status = waveform_picker_regs->status & 0xfffffaaa; // [1111 1010 1010 1010] f2, f0 bits = 0
paul
SID corrected in TM_LFR_TC_EXE packets...
r31 #endif
paul
Last commit before release 0-13...
r35 }
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);
paul
Commit before working on the ERR 4 due to message queue...
r34 #ifdef GSA
waveform_picker_regs->status = waveform_picker_regs->status & 0xfffffccc; // [1111 1100 1100 1100] f1, f0 bits = 0
#endif
paul
Last commit before release 0-13...
r35 }
else if (event_out == RTEMS_EVENT_MODE_SBM2_WFRM)
{
send_waveform_SWF(wf_snap_f2_norm, SID_NORM_SWF_F2, headerSWF_F2, queue_id);
}
else
{
PRINTF("in WFRM *** unexpected event")
}
paul
Commit before working on the ERR 4 due to message queue...
r34
paul
sy_lfr_n_swf_p implemented...
r32
paul
packet emission task added...
r33 #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
paul@pc-solar1.lab-lpp.local
Naming convention changed...
r5 }
}
paul@pc-solar1.lab-lpp.local
automatic reconnexion of the spacewire link...
r17
paul
sy_lfr_n_swf_p implemented...
r32 rtems_task cwf3_task(rtems_task_argument argument) //used with the waveform picker VHDL IP
{
paul
Minor changes in .h inclusion
r45 /** This RTEMS task is dedicated to the transmission of continuous waveforms at f3.
*
* @param unused is the starting argument of the RTEMS task
*
* The following data packet is sent by this task:
* - TM_LFR_SCIENCE_NORMAL_CWF_F3
*
*/
paul
sy_lfr_n_swf_p implemented...
r32 rtems_event_set event_out;
paul
Last commit before release 0-13...
r35 rtems_id queue_id;
paul
sy_lfr_n_swf_p implemented...
r32
paul
packet emission task added...
r33 init_header_continuous_wf_table( SID_NORM_CWF_F3, headerCWF_F3 );
paul
CWF_F3 packets are now compliant with the ICD...
r38 init_header_continuous_wf3_light_table( headerCWF_F3_light );
paul
sy_lfr_n_swf_p implemented...
r32
paul
Last commit before release 0-13...
r35 queue_id = get_pkts_queue_id();
BOOT_PRINTF("in CWF3 ***\n")
paul
sy_lfr_n_swf_p implemented...
r32
while(1){
// wait for an RTEMS_EVENT
paul
packet emission task added...
r33 rtems_event_receive( RTEMS_EVENT_0,
paul
sy_lfr_n_swf_p implemented...
r32 RTEMS_WAIT | RTEMS_EVENT_ANY, RTEMS_NO_TIMEOUT, &event_out);
PRINTF("send CWF F3 \n")
paul
packet emission task added...
r33 #ifdef GSA
#else
if (waveform_picker_regs->addr_data_f3 == (int) wf_cont_f3) {
paul
CWF_F3 packets are now compliant with the ICD...
r38 send_waveform_CWF3_light( wf_cont_f3_bis, headerCWF_F3_light, queue_id );
paul
packet emission task added...
r33 }
else {
paul
CWF_F3 packets are now compliant with the ICD...
r38 send_waveform_CWF3_light( wf_cont_f3, headerCWF_F3_light, queue_id );
paul
packet emission task added...
r33 }
#endif
}
}
rtems_task cwf2_task(rtems_task_argument argument) // ONLY USED IN BURST AND SBM2
{
paul
Minor changes in .h inclusion
r45 /** This RTEMS task is dedicated to the transmission of continuous waveforms at f2.
*
* @param unused is the starting argument of the RTEMS task
*
* The following data packet is sent by this function:
* - TM_LFR_SCIENCE_BURST_CWF_F2
* - TM_LFR_SCIENCE_SBM2_CWF_F2
*
*/
paul
packet emission task added...
r33 rtems_event_set event_out;
paul
Last commit before release 0-13...
r35 rtems_id queue_id;
paul
packet emission task added...
r33
init_header_continuous_wf_table( SID_BURST_CWF_F2, headerCWF_F2_BURST );
paul
Commit before working on the ERR 4 due to message queue...
r34 init_header_continuous_wf_table( SID_SBM2_CWF_F2, headerCWF_F2_SBM2 );
paul
packet emission task added...
r33
paul
Last commit before release 0-13...
r35 queue_id = get_pkts_queue_id();
BOOT_PRINTF("in CWF2 ***\n")
paul
packet emission task added...
r33
while(1){
// wait for an RTEMS_EVENT
rtems_event_receive( RTEMS_EVENT_MODE_BURST | RTEMS_EVENT_MODE_SBM2,
RTEMS_WAIT | RTEMS_EVENT_ANY, RTEMS_NO_TIMEOUT, &event_out);
paul
TM_LFR_TC_EXE packet sending reworked...
r37
paul
packet emission task added...
r33 if (event_out == RTEMS_EVENT_MODE_BURST)
{
// F2
#ifdef GSA
#else
if (waveform_picker_regs->addr_data_f2 == (int) wf_snap_f2) {
paul
TM_LFR_TC_EXE packet sending reworked...
r37 send_waveform_CWF( wf_snap_f2_bis, SID_BURST_CWF_F2, headerCWF_F2_BURST, queue_id );
paul
packet emission task added...
r33 }
else {
paul
Last commit before release 0-13...
r35 send_waveform_CWF( wf_snap_f2, SID_BURST_CWF_F2, headerCWF_F2_BURST, queue_id );
paul
packet emission task added...
r33 }
#endif
}
paul
TM_LFR_TC_EXE packet sending reworked...
r37
paul
packet emission task added...
r33 else if (event_out == RTEMS_EVENT_MODE_SBM2)
{
#ifdef GSA
#else
paul
Commit before working on the ERR 4 due to message queue...
r34 if (doubleSendCWF2 == 1)
{
doubleSendCWF2 = 0;
paul
Last commit before release 0-13...
r35 send_waveform_CWF( wf_snap_f2_norm, SID_SBM2_CWF_F2, headerCWF_F2_SBM2, queue_id );
paul
Commit before working on the ERR 4 due to message queue...
r34 }
else if (waveform_picker_regs->addr_data_f2 == (int) wf_snap_f2) {
paul
Last commit before release 0-13...
r35 send_waveform_CWF( wf_snap_f2_bis, SID_SBM2_CWF_F2, headerCWF_F2_SBM2, queue_id );
paul
packet emission task added...
r33 }
else {
paul
Last commit before release 0-13...
r35 send_waveform_CWF( wf_snap_f2, SID_SBM2_CWF_F2, headerCWF_F2_SBM2, queue_id );
paul
packet emission task added...
r33 }
paul
Commit before working on the ERR 4 due to message queue...
r34 param_local.local_sbm2_nb_cwf_sent ++;
paul
packet emission task added...
r33 #endif
}
else
{
PRINTF1("in CWF2 *** ERR mode = %d\n", lfrCurrentMode)
}
}
}
rtems_task cwf1_task(rtems_task_argument argument) // ONLY USED IN SBM1
{
paul
Minor changes in .h inclusion
r45 /** This RTEMS task is dedicated to the transmission of continuous waveforms at f1.
*
* @param unused is the starting argument of the RTEMS task
*
* The following data packet is sent by this function:
* - TM_LFR_SCIENCE_SBM1_CWF_F1
*
*/
paul
packet emission task added...
r33 rtems_event_set event_out;
paul
Last commit before release 0-13...
r35 rtems_id queue_id;
paul
packet emission task added...
r33
init_header_continuous_wf_table( SID_SBM1_CWF_F1, headerCWF_F1 );
paul
Last commit before release 0-13...
r35 queue_id = get_pkts_queue_id();
BOOT_PRINTF("in CWF1 ***\n")
paul
packet emission task added...
r33
while(1){
// 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;
paul
Last commit before release 0-13...
r35 send_waveform_CWF( wf_snap_f1_norm, SID_SBM1_CWF_F1, headerCWF_F1, queue_id );
paul
packet emission task added...
r33 }
else if (waveform_picker_regs->addr_data_f1 == (int) wf_snap_f1) {
paul
Last commit before release 0-13...
r35 send_waveform_CWF( wf_snap_f1_bis, SID_SBM1_CWF_F1, headerCWF_F1, queue_id );
paul
packet emission task added...
r33 }
else {
paul
Last commit before release 0-13...
r35 send_waveform_CWF( wf_snap_f1, SID_SBM1_CWF_F1, headerCWF_F1, queue_id );
paul
packet emission task added...
r33 }
param_local.local_sbm1_nb_cwf_sent ++;
#endif
}
else
{
PRINTF1("in CWF1 *** ERR mode = %d\n", lfrCurrentMode)
}
paul
sy_lfr_n_swf_p implemented...
r32 }
}
paul@pc-solar1.lab-lpp.local
automatic reconnexion of the spacewire link...
r17 //******************
// general functions
paul@pc-solar1.lab-lpp.local
Updates of the ICD taken into account...
r18 void init_waveforms( void )
{
int i = 0;
for (i=0; i< NB_SAMPLES_PER_SNAPSHOT; i++)
{
//***
// F0
wf_snap_f0[ (i* NB_WORDS_SWF_BLK) + 0 + TIME_OFFSET ] = 0x88887777; //
wf_snap_f0[ (i* NB_WORDS_SWF_BLK) + 1 + TIME_OFFSET ] = 0x22221111; //
wf_snap_f0[ (i* NB_WORDS_SWF_BLK) + 2 + TIME_OFFSET ] = 0x44443333; //
//***
// F1
paul@pc-solar1.lab-lpp.local
waveform initialization modified due to a problem of compatibility...
r19 wf_snap_f1[ (i* NB_WORDS_SWF_BLK) + 0 + TIME_OFFSET ] = 0x22221111;
wf_snap_f1[ (i* NB_WORDS_SWF_BLK) + 1 + TIME_OFFSET ] = 0x44443333;
paul@pc-solar1.lab-lpp.local
Updates of the ICD taken into account...
r18 wf_snap_f1[ (i* NB_WORDS_SWF_BLK) + 2 + TIME_OFFSET ] = 0xaaaa0000;
//***
// F2
paul@pc-solar1.lab-lpp.local
waveform initialization modified due to a problem of compatibility...
r19 wf_snap_f2[ (i* NB_WORDS_SWF_BLK) + 0 + TIME_OFFSET ] = 0x44443333;
wf_snap_f2[ (i* NB_WORDS_SWF_BLK) + 1 + TIME_OFFSET ] = 0x22221111;
paul@pc-solar1.lab-lpp.local
Updates of the ICD taken into account...
r18 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;
}
}
paul
Commit before working on the ERR 4 due to message queue...
r34 int init_header_snapshot_wf_table( unsigned int sid, Header_TM_LFR_SCIENCE_SWF_t *headerSWF)
paul@pc-solar1.lab-lpp.local
Updates of the ICD taken into account...
r18 {
paul
packet emission task added...
r33 unsigned char i;
for (i=0; i<7; i++)
{
paul
Commit before working on the ERR 4 due to message queue...
r34 headerSWF[ i ].targetLogicalAddress = CCSDS_DESTINATION_ID;
headerSWF[ i ].protocolIdentifier = CCSDS_PROTOCOLE_ID;
headerSWF[ i ].reserved = DEFAULT_RESERVED;
headerSWF[ i ].userApplication = CCSDS_USER_APP;
headerSWF[ i ].packetID[0] = (unsigned char) (TM_PACKET_ID_SCIENCE_NORMAL_BURST >> 8);
headerSWF[ i ].packetID[1] = (unsigned char) (TM_PACKET_ID_SCIENCE_NORMAL_BURST);
paul
packet emission task added...
r33 if (i == 0)
{
paul
Commit before working on the ERR 4 due to message queue...
r34 headerSWF[ i ].packetSequenceControl[0] = TM_PACKET_SEQ_CTRL_FIRST;
headerSWF[ i ].packetLength[0] = (unsigned char) (TM_LEN_SCI_SWF_340 >> 8);
headerSWF[ i ].packetLength[1] = (unsigned char) (TM_LEN_SCI_SWF_340 );
headerSWF[ i ].blkNr[0] = (unsigned char) (BLK_NR_340 >> 8);
headerSWF[ i ].blkNr[1] = (unsigned char) (BLK_NR_340 );
paul
packet emission task added...
r33 }
else if (i == 6)
{
paul
Commit before working on the ERR 4 due to message queue...
r34 headerSWF[ i ].packetSequenceControl[0] = TM_PACKET_SEQ_CTRL_LAST;
headerSWF[ i ].packetLength[0] = (unsigned char) (TM_LEN_SCI_SWF_8 >> 8);
headerSWF[ i ].packetLength[1] = (unsigned char) (TM_LEN_SCI_SWF_8 );
headerSWF[ i ].blkNr[0] = (unsigned char) (BLK_NR_8 >> 8);
headerSWF[ i ].blkNr[1] = (unsigned char) (BLK_NR_8 );
paul
packet emission task added...
r33 }
else
{
paul
Commit before working on the ERR 4 due to message queue...
r34 headerSWF[ i ].packetSequenceControl[0] = TM_PACKET_SEQ_CTRL_CONTINUATION;
headerSWF[ i ].packetLength[0] = (unsigned char) (TM_LEN_SCI_SWF_340 >> 8);
headerSWF[ i ].packetLength[1] = (unsigned char) (TM_LEN_SCI_SWF_340 );
headerSWF[ i ].blkNr[0] = (unsigned char) (BLK_NR_340 >> 8);
headerSWF[ i ].blkNr[1] = (unsigned char) (BLK_NR_340 );
paul
packet emission task added...
r33 }
paul
Commit before working on the ERR 4 due to message queue...
r34 headerSWF[ i ].packetSequenceControl[1] = TM_PACKET_SEQ_CNT_DEFAULT;
headerSWF[ i ].pktCnt = DEFAULT_PKTCNT; // PKT_CNT
headerSWF[ i ].pktNr = i+1; // PKT_NR
paul
packet emission task added...
r33 // DATA FIELD HEADER
paul
Commit before working on the ERR 4 due to message queue...
r34 headerSWF[ i ].spare1_pusVersion_spare2 = DEFAULT_SPARE1_PUSVERSION_SPARE2;
headerSWF[ i ].serviceType = TM_TYPE_LFR_SCIENCE; // service type
headerSWF[ i ].serviceSubType = TM_SUBTYPE_LFR_SCIENCE; // service subtype
headerSWF[ i ].destinationID = TM_DESTINATION_ID_GROUND;
paul
packet emission task added...
r33 // AUXILIARY DATA HEADER
paul
Commit before working on the ERR 4 due to message queue...
r34 headerSWF[ i ].sid = sid;
headerSWF[ i ].hkBIA = DEFAULT_HKBIA;
headerSWF[ i ].time[0] = 0x00;
headerSWF[ i ].time[0] = 0x00;
headerSWF[ i ].time[0] = 0x00;
headerSWF[ i ].time[0] = 0x00;
headerSWF[ i ].time[0] = 0x00;
headerSWF[ i ].time[0] = 0x00;
paul
packet emission task added...
r33 }
return LFR_SUCCESSFUL;
paul@pc-solar1.lab-lpp.local
All modes implemented for the waveforms...
r23 }
paul@pc-solar1.lab-lpp.local
Updates of the ICD taken into account...
r18
paul
packet emission task added...
r33 int init_header_continuous_wf_table( unsigned int sid, Header_TM_LFR_SCIENCE_CWF_t *headerCWF )
paul@pc-solar1.lab-lpp.local
All modes implemented for the waveforms...
r23 {
paul
packet emission task added...
r33 unsigned int i;
for (i=0; i<7; i++)
{
headerCWF[ i ].targetLogicalAddress = CCSDS_DESTINATION_ID;
headerCWF[ i ].protocolIdentifier = CCSDS_PROTOCOLE_ID;
headerCWF[ i ].reserved = DEFAULT_RESERVED;
headerCWF[ i ].userApplication = CCSDS_USER_APP;
paul
TM_LFR_TC_EXE packet sending reworked...
r37 if ( (sid == SID_SBM1_CWF_F1) || (sid == SID_SBM2_CWF_F2) )
paul
Commit before working on the ERR 4 due to message queue...
r34 {
headerCWF[ i ].packetID[0] = (unsigned char) (TM_PACKET_ID_SCIENCE_SBM1_SBM2 >> 8);
headerCWF[ i ].packetID[1] = (unsigned char) (TM_PACKET_ID_SCIENCE_SBM1_SBM2);
}
else
{
headerCWF[ i ].packetID[0] = (unsigned char) (TM_PACKET_ID_SCIENCE_NORMAL_BURST >> 8);
headerCWF[ i ].packetID[1] = (unsigned char) (TM_PACKET_ID_SCIENCE_NORMAL_BURST);
}
paul
packet emission task added...
r33 if (i == 0)
{
headerCWF[ i ].packetSequenceControl[0] = TM_PACKET_SEQ_CTRL_FIRST;
headerCWF[ i ].packetLength[0] = (unsigned char) (TM_LEN_SCI_CWF_340 >> 8);
headerCWF[ i ].packetLength[1] = (unsigned char) (TM_LEN_SCI_CWF_340 );
headerCWF[ i ].blkNr[0] = (unsigned char) (BLK_NR_340 >> 8);
headerCWF[ i ].blkNr[1] = (unsigned char) (BLK_NR_340 );
}
else if (i == 6)
{
headerCWF[ i ].packetSequenceControl[0] = TM_PACKET_SEQ_CTRL_LAST;
headerCWF[ i ].packetLength[0] = (unsigned char) (TM_LEN_SCI_CWF_8 >> 8);
headerCWF[ i ].packetLength[1] = (unsigned char) (TM_LEN_SCI_CWF_8 );
headerCWF[ i ].blkNr[0] = (unsigned char) (BLK_NR_8 >> 8);
headerCWF[ i ].blkNr[1] = (unsigned char) (BLK_NR_8 );
}
else
{
headerCWF[ i ].packetSequenceControl[0] = TM_PACKET_SEQ_CTRL_CONTINUATION;
headerCWF[ i ].packetLength[0] = (unsigned char) (TM_LEN_SCI_CWF_340 >> 8);
headerCWF[ i ].packetLength[1] = (unsigned char) (TM_LEN_SCI_CWF_340 );
headerCWF[ i ].blkNr[0] = (unsigned char) (BLK_NR_340 >> 8);
headerCWF[ i ].blkNr[1] = (unsigned char) (BLK_NR_340 );
}
headerCWF[ i ].packetSequenceControl[1] = TM_PACKET_SEQ_CNT_DEFAULT;
// PKT_CNT
// PKT_NR
// DATA FIELD HEADER
headerCWF[ i ].spare1_pusVersion_spare2 = DEFAULT_SPARE1_PUSVERSION_SPARE2;
headerCWF[ i ].serviceType = TM_TYPE_LFR_SCIENCE; // service type
headerCWF[ i ].serviceSubType = TM_SUBTYPE_LFR_SCIENCE; // service subtype
headerCWF[ i ].destinationID = TM_DESTINATION_ID_GROUND;
// AUXILIARY DATA HEADER
headerCWF[ i ].sid = sid;
headerCWF[ i ].hkBIA = DEFAULT_HKBIA;
headerCWF[ i ].time[0] = 0x00;
headerCWF[ i ].time[0] = 0x00;
headerCWF[ i ].time[0] = 0x00;
headerCWF[ i ].time[0] = 0x00;
headerCWF[ i ].time[0] = 0x00;
headerCWF[ i ].time[0] = 0x00;
}
return LFR_SUCCESSFUL;
paul@pc-solar1.lab-lpp.local
Updates of the ICD taken into account...
r18 }
paul
CWF_F3 packets are now compliant with the ICD...
r38 int init_header_continuous_wf3_light_table( Header_TM_LFR_SCIENCE_CWF_t *headerCWF )
{
unsigned int i;
for (i=0; i<7; i++)
{
headerCWF[ i ].targetLogicalAddress = CCSDS_DESTINATION_ID;
headerCWF[ i ].protocolIdentifier = CCSDS_PROTOCOLE_ID;
headerCWF[ i ].reserved = DEFAULT_RESERVED;
headerCWF[ i ].userApplication = CCSDS_USER_APP;
headerCWF[ i ].packetID[0] = (unsigned char) (TM_PACKET_ID_SCIENCE_NORMAL_BURST >> 8);
headerCWF[ i ].packetID[1] = (unsigned char) (TM_PACKET_ID_SCIENCE_NORMAL_BURST);
if (i == 0)
{
headerCWF[ i ].packetSequenceControl[0] = TM_PACKET_SEQ_CTRL_FIRST;
headerCWF[ i ].packetLength[0] = (unsigned char) (TM_LEN_SCI_CWF3_LIGHT_340 >> 8);
headerCWF[ i ].packetLength[1] = (unsigned char) (TM_LEN_SCI_CWF3_LIGHT_340 );
headerCWF[ i ].blkNr[0] = (unsigned char) (BLK_NR_340 >> 8);
headerCWF[ i ].blkNr[1] = (unsigned char) (BLK_NR_340 );
}
else if (i == 6)
{
headerCWF[ i ].packetSequenceControl[0] = TM_PACKET_SEQ_CTRL_LAST;
headerCWF[ i ].packetLength[0] = (unsigned char) (TM_LEN_SCI_CWF3_LIGHT_8 >> 8);
headerCWF[ i ].packetLength[1] = (unsigned char) (TM_LEN_SCI_CWF3_LIGHT_8 );
headerCWF[ i ].blkNr[0] = (unsigned char) (BLK_NR_8 >> 8);
headerCWF[ i ].blkNr[1] = (unsigned char) (BLK_NR_8 );
}
else
{
headerCWF[ i ].packetSequenceControl[0] = TM_PACKET_SEQ_CTRL_CONTINUATION;
headerCWF[ i ].packetLength[0] = (unsigned char) (TM_LEN_SCI_CWF3_LIGHT_340 >> 8);
headerCWF[ i ].packetLength[1] = (unsigned char) (TM_LEN_SCI_CWF3_LIGHT_340 );
headerCWF[ i ].blkNr[0] = (unsigned char) (BLK_NR_340 >> 8);
headerCWF[ i ].blkNr[1] = (unsigned char) (BLK_NR_340 );
}
headerCWF[ i ].packetSequenceControl[1] = TM_PACKET_SEQ_CNT_DEFAULT;
// DATA FIELD HEADER
headerCWF[ i ].spare1_pusVersion_spare2 = DEFAULT_SPARE1_PUSVERSION_SPARE2;
headerCWF[ i ].serviceType = TM_TYPE_LFR_SCIENCE; // service type
headerCWF[ i ].serviceSubType = TM_SUBTYPE_LFR_SCIENCE; // service subtype
headerCWF[ i ].destinationID = TM_DESTINATION_ID_GROUND;
// AUXILIARY DATA HEADER
headerCWF[ i ].sid = SID_NORM_CWF_F3;
headerCWF[ i ].hkBIA = DEFAULT_HKBIA;
headerCWF[ i ].time[0] = 0x00;
headerCWF[ i ].time[0] = 0x00;
headerCWF[ i ].time[0] = 0x00;
headerCWF[ i ].time[0] = 0x00;
headerCWF[ i ].time[0] = 0x00;
headerCWF[ i ].time[0] = 0x00;
}
return LFR_SUCCESSFUL;
}
paul@pc-solar1.lab-lpp.local
Updates of the ICD taken into account...
r18 void reset_waveforms( void )
paul@pc-solar1.lab-lpp.local
automatic reconnexion of the spacewire link...
r17 {
int i = 0;
for (i=0; i< NB_SAMPLES_PER_SNAPSHOT; i++)
{
paul@pc-solar1.lab-lpp.local
Updates of the ICD taken into account...
r18 wf_snap_f0[ (i* NB_WORDS_SWF_BLK) + 0 + TIME_OFFSET] = 0x10002000;
wf_snap_f0[ (i* NB_WORDS_SWF_BLK) + 1 + TIME_OFFSET] = 0x20001000;
wf_snap_f0[ (i* NB_WORDS_SWF_BLK) + 2 + TIME_OFFSET] = 0x40008000;
//***
// F1
wf_snap_f1[ (i* NB_WORDS_SWF_BLK) + 0 + TIME_OFFSET] = 0x1000f000;
wf_snap_f1[ (i* NB_WORDS_SWF_BLK) + 1 + TIME_OFFSET] = 0xf0001000;
wf_snap_f1[ (i* NB_WORDS_SWF_BLK) + 2 + TIME_OFFSET] = 0x40008000;
//***
// F2
wf_snap_f2[ (i* NB_WORDS_SWF_BLK) + 0 + TIME_OFFSET] = 0x40008000;
wf_snap_f2[ (i* NB_WORDS_SWF_BLK) + 1 + TIME_OFFSET] = 0x20001000;
wf_snap_f2[ (i* NB_WORDS_SWF_BLK) + 2 + TIME_OFFSET] = 0x10002000;
//***
// F3
/*wf_cont_f3[ i* NB_WORDS_SWF_BLK + 0 ] = build_value( i, i ); // v and 1
wf_cont_f3[ i* NB_WORDS_SWF_BLK + 1 ] = build_value( i, i ); // e2 and b1
wf_cont_f3[ i* NB_WORDS_SWF_BLK + 2 ] = build_value( i, i ); // b2 and b3*/
paul@pc-solar1.lab-lpp.local
automatic reconnexion of the spacewire link...
r17 }
}
paul
Last commit before release 0-13...
r35 int send_waveform_SWF( volatile int *waveform, unsigned int sid,
Header_TM_LFR_SCIENCE_SWF_t *headerSWF, rtems_id queue_id )
paul@pc-solar1.lab-lpp.local
Updates of the ICD taken into account...
r18 {
paul
Header files inclusion reworked...
r40 /** This function sends SWF CCSDS packets (F2, F1 or F0).
*
* @param waveform points to the buffer containing the data that will be send.
* @param sid is the source identifier of the data that will be sent.
* @param headerSWF points to a table of headers that have been prepared for the data transmission.
* @param queue_id is the id of the rtems queue to which spw_ioctl_pkt_send structures will be send. The structures
* contain information to setup the transmission of the data packets.
*
* One group of 2048 samples is sent as 7 consecutive packets, 6 packets containing 340 blocks and 8 packets containing 8 blocks.
*
*/
paul
packet emission task added...
r33 unsigned int i;
int ret;
paul@pc-solar1.lab-lpp.local
Updates of the ICD taken into account...
r18 rtems_status_code status;
paul
packet emission task added...
r33 spw_ioctl_pkt_send spw_ioctl_send_SWF;
paul@pc-solar1.lab-lpp.local
Updates of the ICD taken into account...
r18
paul
packet emission task added...
r33 spw_ioctl_send_SWF.hlen = TM_HEADER_LEN + 4 + 12; // + 4 is for the protocole extra header, + 12 is for the auxiliary header
spw_ioctl_send_SWF.options = 0;
paul@pc-solar1.lab-lpp.local
All modes implemented for the waveforms...
r23
paul
packet emission task added...
r33 ret = LFR_DEFAULT;
paul@pc-solar1.lab-lpp.local
All modes implemented for the waveforms...
r23 for (i=0; i<7; i++) // send waveform
{
paul
packet emission task added...
r33 spw_ioctl_send_SWF.data = (char*) &waveform[ (i * 340 * NB_WORDS_SWF_BLK) ];
paul
Commit before working on the ERR 4 due to message queue...
r34 spw_ioctl_send_SWF.hdr = (char*) &headerSWF[ i ];
paul@pc-solar1.lab-lpp.local
All modes implemented for the waveforms...
r23 // BUILD THE DATA
if (i==6) {
paul
packet emission task added...
r33 spw_ioctl_send_SWF.dlen = 8 * NB_BYTES_SWF_BLK;
paul@pc-solar1.lab-lpp.local
All modes implemented for the waveforms...
r23 }
else {
paul
packet emission task added...
r33 spw_ioctl_send_SWF.dlen = 340 * NB_BYTES_SWF_BLK;
paul@pc-solar1.lab-lpp.local
Updates of the ICD taken into account...
r18 }
paul
packet emission task added...
r33 // SET PACKET TIME
paul
Ignore doc files...
r46 headerSWF[ i ].acquisitionTime[0] = (unsigned char) (time_management_regs->coarse_time>>24);
headerSWF[ i ].acquisitionTime[1] = (unsigned char) (time_management_regs->coarse_time>>16);
headerSWF[ i ].acquisitionTime[2] = (unsigned char) (time_management_regs->coarse_time>>8);
headerSWF[ i ].acquisitionTime[3] = (unsigned char) (time_management_regs->coarse_time);
headerSWF[ i ].acquisitionTime[4] = (unsigned char) (time_management_regs->fine_time>>8);
headerSWF[ i ].acquisitionTime[5] = (unsigned char) (time_management_regs->fine_time);
paul
Commit before working on the ERR 4 due to message queue...
r34 headerSWF[ i ].time[0] = (unsigned char) (time_management_regs->coarse_time>>24);
headerSWF[ i ].time[1] = (unsigned char) (time_management_regs->coarse_time>>16);
headerSWF[ i ].time[2] = (unsigned char) (time_management_regs->coarse_time>>8);
headerSWF[ i ].time[3] = (unsigned char) (time_management_regs->coarse_time);
headerSWF[ i ].time[4] = (unsigned char) (time_management_regs->fine_time>>8);
headerSWF[ i ].time[5] = (unsigned char) (time_management_regs->fine_time);
paul
packet emission task added...
r33 // SEND PACKET
paul
TM_LFR_TC_EXE packet sending reworked...
r37 status = rtems_message_queue_send( queue_id, &spw_ioctl_send_SWF, ACTION_MSG_SPW_IOCTL_SEND_SIZE);
paul
packet emission task added...
r33 if (status != RTEMS_SUCCESSFUL) {
paul
Commit before working on the ERR 4 due to message queue...
r34 printf("%d-%d, ERR %d\n", sid, i, (int) status);
paul
packet emission task added...
r33 ret = LFR_DEFAULT;
}
rtems_task_wake_after(TIME_BETWEEN_TWO_SWF_PACKETS); // 300 ms between each packet => 7 * 3 = 21 packets => 6.3 seconds
paul@pc-solar1.lab-lpp.local
All modes implemented for the waveforms...
r23 }
paul
sy_lfr_n_swf_p implemented...
r32
paul
packet emission task added...
r33 return ret;
paul@pc-solar1.lab-lpp.local
All modes implemented for the waveforms...
r23 }
paul
Last commit before release 0-13...
r35 int send_waveform_CWF(volatile int *waveform, unsigned int sid,
Header_TM_LFR_SCIENCE_CWF_t *headerCWF, rtems_id queue_id)
paul@pc-solar1.lab-lpp.local
All modes implemented for the waveforms...
r23 {
paul
Header files inclusion reworked...
r40 /** This function sends CWF CCSDS packets (F2, F1 or F0).
*
* @param waveform points to the buffer containing the data that will be send.
* @param sid is the source identifier of the data that will be sent.
* @param headerCWF points to a table of headers that have been prepared for the data transmission.
* @param queue_id is the id of the rtems queue to which spw_ioctl_pkt_send structures will be send. The structures
* contain information to setup the transmission of the data packets.
*
* One group of 2048 samples is sent as 7 consecutive packets, 6 packets containing 340 blocks and 8 packets containing 8 blocks.
*
*/
paul
packet emission task added...
r33 unsigned int i;
int ret;
rtems_status_code status;
spw_ioctl_pkt_send spw_ioctl_send_CWF;
paul@pc-solar1.lab-lpp.local
All modes implemented for the waveforms...
r23
paul
packet emission task added...
r33 spw_ioctl_send_CWF.hlen = TM_HEADER_LEN + 4 + 10; // + 4 is for the protocole extra header, + 10 is for the auxiliary header
spw_ioctl_send_CWF.options = 0;
ret = LFR_DEFAULT;
paul@pc-solar1.lab-lpp.local
All modes implemented for the waveforms...
r23
paul
packet emission task added...
r33 for (i=0; i<7; i++) // send waveform
{
int coarseTime = 0x00;
int fineTime = 0x00;
spw_ioctl_send_CWF.data = (char*) &waveform[ (i * 340 * NB_WORDS_SWF_BLK) ];
spw_ioctl_send_CWF.hdr = (char*) &headerCWF[ i ];
// BUILD THE DATA
if (i==6) {
spw_ioctl_send_CWF.dlen = 8 * NB_BYTES_SWF_BLK;
}
else {
spw_ioctl_send_CWF.dlen = 340 * NB_BYTES_SWF_BLK;
}
// SET PACKET TIME
coarseTime = time_management_regs->coarse_time;
fineTime = time_management_regs->fine_time;
paul
Ignore doc files...
r46 headerCWF[ i ].acquisitionTime[0] = (unsigned char) (coarseTime>>24);
headerCWF[ i ].acquisitionTime[1] = (unsigned char) (coarseTime>>16);
headerCWF[ i ].acquisitionTime[2] = (unsigned char) (coarseTime>>8);
headerCWF[ i ].acquisitionTime[3] = (unsigned char) (coarseTime);
headerCWF[ i ].acquisitionTime[4] = (unsigned char) (fineTime>>8);
headerCWF[ i ].acquisitionTime[5] = (unsigned char) (fineTime);
paul
packet emission task added...
r33 headerCWF[ i ].time[0] = (unsigned char) (coarseTime>>24);
headerCWF[ i ].time[1] = (unsigned char) (coarseTime>>16);
headerCWF[ i ].time[2] = (unsigned char) (coarseTime>>8);
headerCWF[ i ].time[3] = (unsigned char) (coarseTime);
headerCWF[ i ].time[4] = (unsigned char) (fineTime>>8);
headerCWF[ i ].time[5] = (unsigned char) (fineTime);
// SEND PACKET
paul
Commit before working on the ERR 4 due to message queue...
r34 if (sid == SID_NORM_CWF_F3)
{
paul
Last commit before release 0-13...
r35 status = rtems_message_queue_send( queue_id, &spw_ioctl_send_CWF, sizeof(spw_ioctl_send_CWF));
paul
Commit before working on the ERR 4 due to message queue...
r34 if (status != RTEMS_SUCCESSFUL) {
printf("%d-%d, ERR %d\n", sid, i, (int) status);
ret = LFR_DEFAULT;
}
rtems_task_wake_after(TIME_BETWEEN_TWO_CWF3_PACKETS);
paul
packet emission task added...
r33 }
else
{
paul
rtems_message_queue_urgent is replaced by rtems_message_queue_send...
r36 status = rtems_message_queue_send( queue_id, &spw_ioctl_send_CWF, sizeof(spw_ioctl_send_CWF));
paul
Commit before working on the ERR 4 due to message queue...
r34 if (status != RTEMS_SUCCESSFUL) {
printf("%d-%d, ERR %d\n", sid, i, (int) status);
ret = LFR_DEFAULT;
}
paul
packet emission task added...
r33 }
}
paul@pc-solar1.lab-lpp.local
All modes implemented for the waveforms...
r23
paul
packet emission task added...
r33 return ret;
paul@pc-solar1.lab-lpp.local
All modes implemented for the waveforms...
r23 }
paul
CWF_F3 packets are now compliant with the ICD...
r38 int send_waveform_CWF3_light(volatile int *waveform, Header_TM_LFR_SCIENCE_CWF_t *headerCWF, rtems_id queue_id)
{
paul
Header files inclusion reworked...
r40 /** This function sends CWF_F3 CCSDS packets without the b1, b2 and b3 data.
*
* @param waveform points to the buffer containing the data that will be send.
* @param headerCWF points to a table of headers that have been prepared for the data transmission.
* @param queue_id is the id of the rtems queue to which spw_ioctl_pkt_send structures will be send. The structures
* contain information to setup the transmission of the data packets.
*
* By default, CWF_F3 packet are send without the b1, b2 and b3 data. This function rebuilds a data buffer
* from the incoming data and sends it in 7 packets, 6 containing 340 blocks and 1 one containing 8 blocks.
*
*/
paul
CWF_F3 packets are now compliant with the ICD...
r38 unsigned int i;
int ret;
rtems_status_code status;
spw_ioctl_pkt_send spw_ioctl_send_CWF;
char *sample;
spw_ioctl_send_CWF.hlen = TM_HEADER_LEN + 4 + 10; // + 4 is for the protocole extra header, + 10 is for the auxiliary header
spw_ioctl_send_CWF.options = 0;
ret = LFR_DEFAULT;
//**********************
// BUILD CWF3_light DATA
for ( i=0; i< 2048; i++)
{
sample = (char*) &waveform[ i * NB_WORDS_SWF_BLK ];
wf_cont_f3_light[ (i * NB_BYTES_CWF3_LIGHT_BLK) ] = sample[ 0 ];
wf_cont_f3_light[ (i * NB_BYTES_CWF3_LIGHT_BLK) + 1 ] = sample[ 1 ];
wf_cont_f3_light[ (i * NB_BYTES_CWF3_LIGHT_BLK) + 2 ] = sample[ 2 ];
wf_cont_f3_light[ (i * NB_BYTES_CWF3_LIGHT_BLK) + 3 ] = sample[ 3 ];
wf_cont_f3_light[ (i * NB_BYTES_CWF3_LIGHT_BLK) + 4 ] = sample[ 4 ];
wf_cont_f3_light[ (i * NB_BYTES_CWF3_LIGHT_BLK) + 5 ] = sample[ 5 ];
}
//*********************
// SEND CWF3_light DATA
for (i=0; i<7; i++) // send waveform
{
int coarseTime = 0x00;
int fineTime = 0x00;
spw_ioctl_send_CWF.data = (char*) &wf_cont_f3_light[ (i * 340 * NB_BYTES_CWF3_LIGHT_BLK) ];
spw_ioctl_send_CWF.hdr = (char*) &headerCWF[ i ];
// BUILD THE DATA
if ( i == WFRM_INDEX_OF_LAST_PACKET ) {
spw_ioctl_send_CWF.dlen = 8 * NB_BYTES_CWF3_LIGHT_BLK;
}
else {
spw_ioctl_send_CWF.dlen = 340 * NB_BYTES_CWF3_LIGHT_BLK;
}
// SET PACKET TIME
coarseTime = time_management_regs->coarse_time;
fineTime = time_management_regs->fine_time;
paul
Ignore doc files...
r46 headerCWF[ i ].acquisitionTime[0] = (unsigned char) (coarseTime>>24);
headerCWF[ i ].acquisitionTime[1] = (unsigned char) (coarseTime>>16);
headerCWF[ i ].acquisitionTime[2] = (unsigned char) (coarseTime>>8);
headerCWF[ i ].acquisitionTime[3] = (unsigned char) (coarseTime);
headerCWF[ i ].acquisitionTime[4] = (unsigned char) (fineTime>>8);
headerCWF[ i ].acquisitionTime[5] = (unsigned char) (fineTime);
paul
CWF_F3 packets are now compliant with the ICD...
r38 headerCWF[ i ].time[0] = (unsigned char) (coarseTime>>24);
headerCWF[ i ].time[1] = (unsigned char) (coarseTime>>16);
headerCWF[ i ].time[2] = (unsigned char) (coarseTime>>8);
headerCWF[ i ].time[3] = (unsigned char) (coarseTime);
headerCWF[ i ].time[4] = (unsigned char) (fineTime>>8);
headerCWF[ i ].time[5] = (unsigned char) (fineTime);
// SEND PACKET
status = rtems_message_queue_send( queue_id, &spw_ioctl_send_CWF, sizeof(spw_ioctl_send_CWF));
if (status != RTEMS_SUCCESSFUL) {
printf("%d-%d, ERR %d\n", SID_NORM_CWF_F3, i, (int) status);
ret = LFR_DEFAULT;
}
rtems_task_wake_after(TIME_BETWEEN_TWO_CWF3_PACKETS);
}
return ret;
}
paul@pc-solar1.lab-lpp.local
All modes implemented for the waveforms...
r23 //**************
// wfp registers
paul
sy_lfr_n_swf_p implemented...
r32 void set_wfp_data_shaping()
paul@pc-solar1.lab-lpp.local
All modes implemented for the waveforms...
r23 {
paul
Header files inclusion reworked...
r40 /** This function sets the data_shaping register of the waveform picker module.
*
* The value is read from one field of the parameter_dump_packet structure:\n
* bw_sp0_sp1_r0_r1
*
*/
paul
sy_lfr_n_swf_p implemented...
r32 unsigned char data_shaping;
paul@pc-solar1.lab-lpp.local
All modes implemented for the waveforms...
r23 // get the parameters for the data shaping [BW SP0 SP1 R0 R1] in sy_lfr_common1 and configure the register
// waveform picker : [R1 R0 SP1 SP0 BW]
paul
sy_lfr_n_swf_p implemented...
r32
data_shaping = parameter_dump_packet.bw_sp0_sp1_r0_r1;
paul
SID corrected in TM_LFR_TC_EXE packets...
r31 #ifdef GSA
#else
paul@pc-solar1.lab-lpp.local
All modes implemented for the waveforms...
r23 waveform_picker_regs->data_shaping =
( (data_shaping & 0x10) >> 4 ) // BW
+ ( (data_shaping & 0x08) >> 2 ) // SP0
+ ( (data_shaping & 0x04) ) // SP1
+ ( (data_shaping & 0x02) << 2 ) // R0
+ ( (data_shaping & 0x01) << 4 ); // R1
paul
SID corrected in TM_LFR_TC_EXE packets...
r31 #endif
paul@pc-solar1.lab-lpp.local
All modes implemented for the waveforms...
r23 }
paul
sy_lfr_n_swf_p implemented...
r32 char set_wfp_delta_snapshot()
{
paul
Header files inclusion reworked...
r40 /** This function sets the delta_snapshot register of the waveform picker module.
*
paul
Minor changes in .h inclusion
r45 * The value is read from two (unsigned char) of the parameter_dump_packet structure:
* - sy_lfr_n_swf_p[0]
* - sy_lfr_n_swf_p[1]
paul
Header files inclusion reworked...
r40 *
*/
paul
sy_lfr_n_swf_p implemented...
r32 char ret;
unsigned int delta_snapshot;
paul
CWF_F3 packets are now compliant with the ICD...
r38 unsigned int aux;
aux = 0;
paul
sy_lfr_n_swf_p implemented...
r32 ret = LFR_DEFAULT;
delta_snapshot = parameter_dump_packet.sy_lfr_n_swf_p[0]*256
+ parameter_dump_packet.sy_lfr_n_swf_p[1];
#ifdef GSA
#else
if ( delta_snapshot < MIN_DELTA_SNAPSHOT )
{
aux = MIN_DELTA_SNAPSHOT;
ret = LFR_DEFAULT;
}
else
{
aux = delta_snapshot ;
ret = LFR_SUCCESSFUL;
}
paul
Minor changes in .h inclusion
r45 waveform_picker_regs->delta_snapshot = aux - 1; // max 2 bytes
paul
sy_lfr_n_swf_p implemented...
r32 #endif
return ret;
}
void set_wfp_burst_enable_register( unsigned char mode)
paul@pc-solar1.lab-lpp.local
All modes implemented for the waveforms...
r23 {
paul
Header files inclusion reworked...
r40 /** This function sets the waveform picker burst_enable register depending on the mode.
*
* @param mode is the LFR mode to launch.
*
* The burst bits shall be before the enable bits.
*
*/
paul
SID corrected in TM_LFR_TC_EXE packets...
r31 #ifdef GSA
#else
paul
sy_lfr_n_swf_p implemented...
r32 // [0000 0000] burst f2, f1, f0 enable f3 f2 f1 f0
// the burst bits shall be set first, before the enable bits
switch(mode) {
case(LFR_MODE_NORMAL):
paul
Last commit before release 0-13...
r35 waveform_picker_regs->burst_enable = 0x00; // [0000 0000] no burst enable
paul
sy_lfr_n_swf_p implemented...
r32 waveform_picker_regs->burst_enable = 0x0f; // [0000 1111] enable f3 f2 f1 f0
break;
case(LFR_MODE_BURST):
waveform_picker_regs->burst_enable = 0x40; // [0100 0000] f2 burst enabled
waveform_picker_regs->burst_enable = waveform_picker_regs->burst_enable | 0x04; // [0100] enable f2
break;
case(LFR_MODE_SBM1):
waveform_picker_regs->burst_enable = 0x20; // [0010 0000] f1 burst enabled
waveform_picker_regs->burst_enable = waveform_picker_regs->burst_enable | 0x0f; // [1111] enable f3 f2 f1 f0
break;
case(LFR_MODE_SBM2):
waveform_picker_regs->burst_enable = 0x40; // [0100 0000] f2 burst enabled
waveform_picker_regs->burst_enable = waveform_picker_regs->burst_enable | 0x0f; // [1111] enable f3 f2 f1 f0
break;
default:
waveform_picker_regs->burst_enable = 0x00; // [0000 0000] no burst enabled, no waveform enabled
break;
}
paul
SID corrected in TM_LFR_TC_EXE packets...
r31 #endif
paul@pc-solar1.lab-lpp.local
All modes implemented for the waveforms...
r23 }
void reset_wfp_burst_enable()
{
paul
Header files inclusion reworked...
r40 /** This function resets the waveform picker burst_enable register.
*
* The burst bits [f2 f1 f0] and the enable bits [f3 f2 f1 f0] are set to 0.
*
*/
paul
SID corrected in TM_LFR_TC_EXE packets...
r31 #ifdef GSA
#else
paul@pc-solar1.lab-lpp.local
Updates of the ICD taken into account...
r18 waveform_picker_regs->burst_enable = 0x00; // burst f2, f1, f0 enable f3, f2, f1, f0
paul
SID corrected in TM_LFR_TC_EXE packets...
r31 #endif
paul@pc-solar1.lab-lpp.local
All modes implemented for the waveforms...
r23 }
paul
packet emission task added...
r33 void reset_wfp_status()
{
paul
Header files inclusion reworked...
r40 /** This function resets the waveform picker status register.
*
* All status bits are set to 0 [new_err full_err full].
*
*/
paul
packet emission task added...
r33 #ifdef GSA
#else
waveform_picker_regs->status = 0x00; // burst f2, f1, f0 enable f3, f2, f1, f0
#endif
}
paul
SID corrected in TM_LFR_TC_EXE packets...
r31 void reset_waveform_picker_regs()
paul@pc-solar1.lab-lpp.local
All modes implemented for the waveforms...
r23 {
paul
Header files inclusion reworked...
r40 /** This function resets the waveform picker module registers.
*
* The registers affected by this function are located at the following offset addresses:
* - 0x00 data_shaping
* - 0x04 burst_enable
* - 0x08 addr_data_f0
* - 0x0C addr_data_f1
* - 0x10 addr_data_f2
* - 0x14 addr_data_f3
* - 0x18 status
* - 0x1C delta_snapshot
* - 0x20 delta_f2_f1
* - 0x24 delta_f2_f0
* - 0x28 nb_burst
* - 0x2C nb_snapshot
*
*/
paul
SID corrected in TM_LFR_TC_EXE packets...
r31 #ifdef GSA
#else
paul
sy_lfr_n_swf_p implemented...
r32 set_wfp_data_shaping();
paul@pc-solar1.lab-lpp.local
All modes implemented for the waveforms...
r23 reset_wfp_burst_enable();
waveform_picker_regs->addr_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); //
paul
sy_lfr_n_swf_p implemented...
r32 set_wfp_delta_snapshot(); // time in seconds between two snapshots
paul
packet emission task added...
r33 waveform_picker_regs->delta_f2_f1 = 0xffff; // 0x16800 => 92160 (max 4 bytes)
waveform_picker_regs->delta_f2_f0 = 0x17c00; // 97 280 (max 5 bytes)
paul
sy_lfr_n_swf_p implemented...
r32 waveform_picker_regs->nb_burst_available = 0x180; // max 3 bytes, size of the buffer in burst (1 burst = 16 x 4 octets)
waveform_picker_regs->nb_snapshot_param = 0x7ff; // max 3 octets, 2048 - 1
waveform_picker_regs->status = 0x00; //
paul
SID corrected in TM_LFR_TC_EXE packets...
r31 #endif
paul@pc-solar1.lab-lpp.local
Updates of the ICD taken into account...
r18 }
paul
sy_lfr_n_swf_p implemented...
r32
//*****************
// local parameters
void set_local_sbm1_nb_cwf_max()
{
paul
Header files inclusion reworked...
r40 /** This function sets the value of the sbm1_nb_cwf_max local parameter.
*
* The sbm1_nb_cwf_max parameter counts the number of CWF_F1 records that have been sent.\n
* This parameter is used to send CWF_F1 data as normal data when the SBM1 is active.\n\n
* (2 snapshots of 2048 points per seconds) * (period of the NORM snashots) - 8 s (duration of the f2 snapshot)
*
*/
paul
Commit before working on the ERR 4 due to message queue...
r34 param_local.local_sbm1_nb_cwf_max = 2 *
(parameter_dump_packet.sy_lfr_n_swf_p[0] * 256
+ parameter_dump_packet.sy_lfr_n_swf_p[1]) - 8; // 16 CWF1 parts during 1 SWF2
paul
sy_lfr_n_swf_p implemented...
r32 }
void set_local_sbm2_nb_cwf_max()
{
paul
Header files inclusion reworked...
r40 /** This function sets the value of the sbm1_nb_cwf_max local parameter.
*
* The sbm1_nb_cwf_max parameter counts the number of CWF_F1 records that have been sent.\n
* This parameter is used to send CWF_F2 data as normal data when the SBM2 is active.\n\n
* (period of the NORM snashots) / (8 seconds per snapshot at f2 = 256 Hz)
*
*/
paul
Commit before working on the ERR 4 due to message queue...
r34 param_local.local_sbm2_nb_cwf_max = (parameter_dump_packet.sy_lfr_n_swf_p[0] * 256
+ parameter_dump_packet.sy_lfr_n_swf_p[1]) / 8;
paul
sy_lfr_n_swf_p implemented...
r32 }
void set_local_nb_interrupt_f0_MAX()
{
paul
Header files inclusion reworked...
r40 /** This function sets the value of the nb_interrupt_f0_MAX local parameter.
*
* This parameter is used for the SM validation only.\n
* The software waits param_local.local_nb_interrupt_f0_MAX interruptions from the spectral matrices
* module before launching a basic processing.
*
*/
paul
sy_lfr_n_swf_p implemented...
r32 param_local.local_nb_interrupt_f0_MAX = ( (parameter_dump_packet.sy_lfr_n_asm_p[0]) * 256
+ parameter_dump_packet.sy_lfr_n_asm_p[1] ) * 100;
}
void reset_local_sbm1_nb_cwf_sent()
{
paul
Header files inclusion reworked...
r40 /** This function resets the value of the sbm1_nb_cwf_sent local parameter.
*
* The sbm1_nb_cwf_sent parameter counts the number of CWF_F1 records that have been sent.\n
* This parameter is used to send CWF_F1 data as normal data when the SBM1 is active.
*
*/
paul
sy_lfr_n_swf_p implemented...
r32 param_local.local_sbm1_nb_cwf_sent = 0;
}
void reset_local_sbm2_nb_cwf_sent()
{
paul
Header files inclusion reworked...
r40 /** This function resets the value of the sbm2_nb_cwf_sent local parameter.
*
* The sbm2_nb_cwf_sent parameter counts the number of CWF_F2 records that have been sent.\n
* This parameter is used to send CWF_F2 data as normal data when the SBM2 mode is active.
*
*/
paul
sy_lfr_n_swf_p implemented...
r32 param_local.local_sbm2_nb_cwf_sent = 0;
}
paul
Minor changes in .h inclusion
r45
rtems_id get_pkts_queue_id( void )
{
rtems_id queue_id;
rtems_status_code status;
status = rtems_message_queue_ident( misc_name[QUEUE_SEND], 0, &queue_id );
if (status != RTEMS_SUCCESSFUL)
{
PRINTF1("in get_pkts_queue_id *** ERR %d\n", status)
}
return queue_id;
}