##// END OF EJS Templates
waveform picker registers updated to be compliant with the new VHDL design
waveform picker registers updated to be compliant with the new VHDL design

File last commit:

r51:b0e1ec810ca1 default
r52:e2d761f8e287 nov2013
Show More
tc_handler.c
768 lines | 24.0 KiB | text/x-c | CLexer
/** Functions and tasks related to TeleCommand handling.
*
* @file
* @author P. LEROY
*
* A group of functions to handle TeleCommands:\n
* action launching\n
* TC parsing\n
* ...
*
*/
#include "tc_handler.h"
//***********
// RTEMS TASK
rtems_task actn_task( rtems_task_argument unused )
{
/** This RTEMS task is responsible for launching actions upton the reception of valid TeleCommands.
*
* @param unused is the starting argument of the RTEMS task
*
* The ACTN task waits for data coming from an RTEMS msesage queue. When data arrives, it launches specific actions depending
* on the incoming TeleCommand.
*
*/
int result;
rtems_status_code status; // RTEMS status code
ccsdsTelecommandPacket_t TC; // TC sent to the ACTN task
size_t size; // size of the incoming TC packet
unsigned char subtype; // subtype of the current TC packet
rtems_id queue_rcv_id;
rtems_id queue_snd_id;
status = rtems_message_queue_ident( misc_name[QUEUE_RECV], 0, &queue_rcv_id );
if (status != RTEMS_SUCCESSFUL)
{
PRINTF1("in ACTN *** ERR getting queue_rcv_id %d\n", status)
}
status = rtems_message_queue_ident( misc_name[QUEUE_SEND], 0, &queue_snd_id );
if (status != RTEMS_SUCCESSFUL)
{
PRINTF1("in ACTN *** ERR getting queue_snd_id %d\n", status)
}
result = LFR_SUCCESSFUL;
subtype = 0; // subtype of the current TC packet
BOOT_PRINTF("in ACTN *** \n")
while(1)
{
status = rtems_message_queue_receive( queue_rcv_id, (char*) &TC, &size,
RTEMS_WAIT, RTEMS_NO_TIMEOUT);
if (status!=RTEMS_SUCCESSFUL) PRINTF1("ERR *** in task ACTN *** error receiving a message, code %d \n", status)
else
{
subtype = TC.serviceSubType;
switch(subtype)
{
case TC_SUBTYPE_RESET:
result = action_reset( &TC, queue_snd_id );
close_action( &TC, result, queue_snd_id );
break;
//
case TC_SUBTYPE_LOAD_COMM:
result = action_load_common_par( &TC );
close_action( &TC, result, queue_snd_id );
break;
//
case TC_SUBTYPE_LOAD_NORM:
result = action_load_normal_par( &TC, queue_snd_id );
close_action( &TC, result, queue_snd_id );
break;
//
case TC_SUBTYPE_LOAD_BURST:
result = action_load_burst_par( &TC, queue_snd_id );
close_action( &TC, result, queue_snd_id );
break;
//
case TC_SUBTYPE_LOAD_SBM1:
result = action_load_sbm1_par( &TC, queue_snd_id );
close_action( &TC, result, queue_snd_id );
break;
//
case TC_SUBTYPE_LOAD_SBM2:
result = action_load_sbm2_par( &TC, queue_snd_id );
close_action( &TC, result, queue_snd_id );
break;
//
case TC_SUBTYPE_DUMP:
result = action_dump_par( queue_snd_id );
close_action( &TC, result, queue_snd_id );
break;
//
case TC_SUBTYPE_ENTER:
result = action_enter_mode( &TC, queue_snd_id );
close_action( &TC, result, queue_snd_id );
break;
//
case TC_SUBTYPE_UPDT_INFO:
result = action_update_info( &TC, queue_snd_id );
close_action( &TC, result, queue_snd_id );
break;
//
case TC_SUBTYPE_EN_CAL:
result = action_enable_calibration( &TC, queue_snd_id );
close_action( &TC, result, queue_snd_id );
break;
//
case TC_SUBTYPE_DIS_CAL:
result = action_disable_calibration( &TC, queue_snd_id );
close_action( &TC, result, queue_snd_id );
break;
//
case TC_SUBTYPE_UPDT_TIME:
result = action_update_time( &TC );
close_action( &TC, result, queue_snd_id );
break;
//
default:
break;
}
}
}
}
//***********
// TC ACTIONS
int action_reset(ccsdsTelecommandPacket_t *TC, rtems_id queue_id)
{
/** This function executes specific actions when a TC_LFR_RESET TeleCommand has been received.
*
* @param TC points to the TeleCommand packet that is being processed
* @param queue_id is the id of the queue which handles TM transmission by the SpaceWire driver
*
*/
send_tm_lfr_tc_exe_not_implemented( TC, queue_id );
return LFR_DEFAULT;
}
int action_enter_mode(ccsdsTelecommandPacket_t *TC, rtems_id queue_id)
{
/** This function executes specific actions when a TC_LFR_ENTER_MODE TeleCommand has been received.
*
* @param TC points to the TeleCommand packet that is being processed
* @param queue_id is the id of the queue which handles TM transmission by the SpaceWire driver
*
*/
rtems_status_code status;
unsigned char requestedMode;
requestedMode = TC->dataAndCRC[1];
if ( (requestedMode != LFR_MODE_STANDBY)
&& (requestedMode != LFR_MODE_NORMAL) && (requestedMode != LFR_MODE_BURST)
&& (requestedMode != LFR_MODE_SBM1) && (requestedMode != LFR_MODE_SBM2) )
{
status = RTEMS_UNSATISFIED;
send_tm_lfr_tc_exe_inconsistent( TC, queue_id, BYTE_POS_CP_LFR_MODE, requestedMode );
}
else
{
printf("try to enter mode %d\n", requestedMode);
#ifdef PRINT_TASK_STATISTICS
if (requestedMode != LFR_MODE_STANDBY)
{
rtems_cpu_usage_reset();
maxCount = 0;
}
#endif
status = transition_validation(requestedMode);
if ( status == LFR_SUCCESSFUL ) {
if ( lfrCurrentMode != LFR_MODE_STANDBY)
{
status = stop_current_mode();
}
if (status != RTEMS_SUCCESSFUL)
{
PRINTF("ERR *** in action_enter *** stop_current_mode\n")
}
status = enter_mode(requestedMode, TC);
}
else
{
PRINTF("ERR *** in action_enter *** transition rejected\n")
send_tm_lfr_tc_exe_not_executable( TC, queue_id );
}
}
return status;
}
int action_update_info(ccsdsTelecommandPacket_t *TC, rtems_id queue_id)
{
/** This function executes specific actions when a TC_LFR_UPDATE_INFO TeleCommand has been received.
*
* @param TC points to the TeleCommand packet that is being processed
* @param queue_id is the id of the queue which handles TM transmission by the SpaceWire driver
*
* @return LFR directive status code:
* - LFR_DEFAULT
* - LFR_SUCCESSFUL
*
*/
unsigned int val;
int result;
result = LFR_DEFAULT;
val = housekeeping_packet.hk_lfr_update_info_tc_cnt[0] * 256
+ housekeeping_packet.hk_lfr_update_info_tc_cnt[1];
val++;
housekeeping_packet.hk_lfr_update_info_tc_cnt[0] = (unsigned char) (val >> 8);
housekeeping_packet.hk_lfr_update_info_tc_cnt[1] = (unsigned char) (val);
return result;
}
int action_enable_calibration(ccsdsTelecommandPacket_t *TC, rtems_id queue_id)
{
/** This function executes specific actions when a TC_LFR_ENABLE_CALIBRATION TeleCommand has been received.
*
* @param TC points to the TeleCommand packet that is being processed
* @param queue_id is the id of the queue which handles TM transmission by the SpaceWire driver
*
*/
int result;
unsigned char lfrMode;
result = LFR_DEFAULT;
lfrMode = (housekeeping_packet.lfr_status_word[0] & 0xf0) >> 4;
if ( (lfrMode == LFR_MODE_STANDBY) || (lfrMode == LFR_MODE_BURST) || (lfrMode == LFR_MODE_SBM2) ) {
send_tm_lfr_tc_exe_not_executable( TC, queue_id );
result = LFR_DEFAULT;
}
else {
send_tm_lfr_tc_exe_not_implemented( TC, queue_id );
result = LFR_DEFAULT;
}
return result;
}
int action_disable_calibration(ccsdsTelecommandPacket_t *TC, rtems_id queue_id)
{
/** This function executes specific actions when a TC_LFR_DISABLE_CALIBRATION TeleCommand has been received.
*
* @param TC points to the TeleCommand packet that is being processed
* @param queue_id is the id of the queue which handles TM transmission by the SpaceWire driver
*
*/
int result;
unsigned char lfrMode;
result = LFR_DEFAULT;
lfrMode = (housekeeping_packet.lfr_status_word[0] & 0xf0) >> 4;
if ( (lfrMode == LFR_MODE_STANDBY) || (lfrMode == LFR_MODE_BURST) || (lfrMode == LFR_MODE_SBM2) ) {
send_tm_lfr_tc_exe_not_executable( TC, queue_id );
result = LFR_DEFAULT;
}
else {
send_tm_lfr_tc_exe_not_implemented( TC, queue_id );
result = LFR_DEFAULT;
}
return result;
}
int action_update_time(ccsdsTelecommandPacket_t *TC)
{
/** This function executes specific actions when a TC_LFR_UPDATE_TIME TeleCommand has been received.
*
* @param TC points to the TeleCommand packet that is being processed
* @param queue_id is the id of the queue which handles TM transmission by the SpaceWire driver
*
* @return LFR_SUCCESSFUL
*
*/
unsigned int val;
time_management_regs->coarse_time_load = (TC->dataAndCRC[0] << 24)
+ (TC->dataAndCRC[1] << 16)
+ (TC->dataAndCRC[2] << 8)
+ TC->dataAndCRC[3];
val = housekeeping_packet.hk_lfr_update_time_tc_cnt[0] * 256
+ housekeeping_packet.hk_lfr_update_time_tc_cnt[1];
val++;
housekeeping_packet.hk_lfr_update_time_tc_cnt[0] = (unsigned char) (val >> 8);
housekeeping_packet.hk_lfr_update_time_tc_cnt[1] = (unsigned char) (val);
time_management_regs->ctrl = time_management_regs->ctrl | 1;
return LFR_SUCCESSFUL;
}
//*******************
// ENTERING THE MODES
int transition_validation(unsigned char requestedMode)
{
int status;
switch (requestedMode)
{
case LFR_MODE_STANDBY:
if ( lfrCurrentMode == LFR_MODE_STANDBY ) {
status = LFR_DEFAULT;
}
else
{
status = LFR_SUCCESSFUL;
}
break;
case LFR_MODE_NORMAL:
if ( lfrCurrentMode == LFR_MODE_NORMAL ) {
status = LFR_DEFAULT;
}
else {
status = LFR_SUCCESSFUL;
}
break;
case LFR_MODE_BURST:
if ( lfrCurrentMode == LFR_MODE_BURST ) {
status = LFR_DEFAULT;
}
else {
status = LFR_SUCCESSFUL;
}
break;
case LFR_MODE_SBM1:
if ( lfrCurrentMode == LFR_MODE_SBM1 ) {
status = LFR_DEFAULT;
}
else {
status = LFR_SUCCESSFUL;
}
break;
case LFR_MODE_SBM2:
if ( lfrCurrentMode == LFR_MODE_SBM2 ) {
status = LFR_DEFAULT;
}
else {
status = LFR_SUCCESSFUL;
}
break;
default:
status = LFR_DEFAULT;
break;
}
return status;
}
int stop_current_mode()
{
/** This function stops the current mode by masking interrupt lines and suspending science tasks.
*
* @return RTEMS directive status codes:
* - RTEMS_SUCCESSFUL - task restarted successfully
* - RTEMS_INVALID_ID - task id invalid
* - RTEMS_ALREADY_SUSPENDED - task already suspended
*
*/
rtems_status_code status;
status = RTEMS_SUCCESSFUL;
#ifdef GSA
LEON_Mask_interrupt( IRQ_WF ); // mask waveform interrupt (coming from the timer VHDL IP)
LEON_Clear_interrupt( IRQ_WF ); // clear waveform interrupt (coming from the timer VHDL IP)
timer_stop( (gptimer_regs_t*) REGS_ADDR_GPTIMER, TIMER_WF_SIMULATOR );
#else
// mask interruptions
LEON_Mask_interrupt( IRQ_WAVEFORM_PICKER ); // mask waveform picker interrupt
LEON_Mask_interrupt( IRQ_SPECTRAL_MATRIX ); // mask spectral matrix interrupt
// reset registers
reset_wfp_burst_enable(); // reset burst and enable bits
reset_wfp_status(); // reset all the status bits
// creal interruptions
LEON_Clear_interrupt( IRQ_WAVEFORM_PICKER ); // clear waveform picker interrupt
LEON_Clear_interrupt( IRQ_SPECTRAL_MATRIX ); // clear spectarl matrix interrupt
#endif
//**********************
// suspend several tasks
if (lfrCurrentMode != LFR_MODE_STANDBY) {
status = suspend_science_tasks();
}
if (status != RTEMS_SUCCESSFUL)
{
PRINTF1("in stop_current_mode *** in suspend_science_tasks *** ERR code: %d\n", status)
}
return status;
}
int enter_mode(unsigned char mode, ccsdsTelecommandPacket_t *TC )
{
rtems_status_code status;
status = RTEMS_UNSATISFIED;
housekeeping_packet.lfr_status_word[0] = (unsigned char) ((mode << 4) + 0x0d);
updateLFRCurrentMode();
switch(mode){
case LFR_MODE_STANDBY:
status = enter_standby_mode( );
break;
case LFR_MODE_NORMAL:
status = enter_normal_mode( );
break;
case LFR_MODE_BURST:
status = enter_burst_mode( );
break;
case LFR_MODE_SBM1:
status = enter_sbm1_mode( );
break;
case LFR_MODE_SBM2:
status = enter_sbm2_mode( );
break;
default:
status = RTEMS_UNSATISFIED;
}
if (status != RTEMS_SUCCESSFUL)
{
PRINTF("in enter_mode *** ERR\n")
status = RTEMS_UNSATISFIED;
}
return status;
}
int enter_standby_mode()
{
PRINTF1("maxCount = %d\n", maxCount)
#ifdef PRINT_TASK_STATISTICS
rtems_cpu_usage_report();
#endif
#ifdef PRINT_STACK_REPORT
rtems_stack_checker_report_usage();
#endif
return LFR_SUCCESSFUL;
}
int enter_normal_mode()
{
rtems_status_code status;
status = restart_science_tasks();
#ifdef GSA
timer_start( (gptimer_regs_t*) REGS_ADDR_GPTIMER, TIMER_WF_SIMULATOR );
timer_start( (gptimer_regs_t*) REGS_ADDR_GPTIMER, TIMER_SM_SIMULATOR );
LEON_Clear_interrupt( IRQ_WF );
LEON_Unmask_interrupt( IRQ_WF );
//
set_local_nb_interrupt_f0_MAX();
LEON_Clear_interrupt( IRQ_SM ); // the IRQ_SM seems to be incompatible with the IRQ_WF on the xilinx board
LEON_Unmask_interrupt( IRQ_SM );
#else
//****************
// waveform picker
reset_waveform_picker_regs();
set_wfp_burst_enable_register(LFR_MODE_NORMAL);
LEON_Clear_interrupt( IRQ_WAVEFORM_PICKER );
LEON_Unmask_interrupt( IRQ_WAVEFORM_PICKER );
//****************
// spectral matrix
#endif
return status;
}
int enter_burst_mode()
{
rtems_status_code status;
status = restart_science_tasks();
#ifdef GSA
LEON_Unmask_interrupt( IRQ_SM );
#else
reset_waveform_picker_regs();
set_wfp_burst_enable_register(LFR_MODE_BURST);
LEON_Clear_interrupt( IRQ_WAVEFORM_PICKER );
LEON_Unmask_interrupt( IRQ_WAVEFORM_PICKER );
#endif
return status;
}
int enter_sbm1_mode()
{
rtems_status_code status;
status = restart_science_tasks();
set_local_sbm1_nb_cwf_max();
reset_local_sbm1_nb_cwf_sent();
#ifdef GSA
LEON_Unmask_interrupt( IRQ_SM );
#else
reset_waveform_picker_regs();
set_wfp_burst_enable_register(LFR_MODE_SBM1);
LEON_Clear_interrupt( IRQ_WAVEFORM_PICKER );
LEON_Unmask_interrupt( IRQ_WAVEFORM_PICKER );
// SM simulation
// timer_start( (gptimer_regs_t*) REGS_ADDR_GPTIMER, TIMER_SM_SIMULATOR );
// LEON_Clear_interrupt( IRQ_SM ); // the IRQ_SM seems to be incompatible with the IRQ_WF on the xilinx board
// LEON_Unmask_interrupt( IRQ_SM );
#endif
return status;
}
int enter_sbm2_mode()
{
rtems_status_code status;
status = restart_science_tasks();
set_local_sbm2_nb_cwf_max();
reset_local_sbm2_nb_cwf_sent();
#ifdef GSA
LEON_Unmask_interrupt( IRQ_SM );
#else
reset_waveform_picker_regs();
set_wfp_burst_enable_register(LFR_MODE_SBM2);
LEON_Clear_interrupt( IRQ_WAVEFORM_PICKER );
LEON_Unmask_interrupt( IRQ_WAVEFORM_PICKER );
#endif
return status;
}
int restart_science_tasks()
{
rtems_status_code status[6];
rtems_status_code ret;
ret = RTEMS_SUCCESSFUL;
status[0] = rtems_task_restart( Task_id[TASKID_AVF0], 1 );
if (status[0] != RTEMS_SUCCESSFUL)
{
PRINTF1("in restart_science_task *** 0 ERR %d\n", status[0])
}
status[1] = rtems_task_restart( Task_id[TASKID_BPF0],1 );
if (status[1] != RTEMS_SUCCESSFUL)
{
PRINTF1("in restart_science_task *** 1 ERR %d\n", status[1])
}
status[2] = rtems_task_restart( Task_id[TASKID_WFRM],1 );
if (status[2] != RTEMS_SUCCESSFUL)
{
PRINTF1("in restart_science_task *** 2 ERR %d\n", status[2])
}
status[3] = rtems_task_restart( Task_id[TASKID_CWF3],1 );
if (status[3] != RTEMS_SUCCESSFUL)
{
PRINTF1("in restart_science_task *** 3 ERR %d\n", status[3])
}
status[4] = rtems_task_restart( Task_id[TASKID_CWF2],1 );
if (status[4] != RTEMS_SUCCESSFUL)
{
PRINTF1("in restart_science_task *** 4 ERR %d\n", status[4])
}
status[5] = rtems_task_restart( Task_id[TASKID_CWF1],1 );
if (status[5] != RTEMS_SUCCESSFUL)
{
PRINTF1("in restart_science_task *** 5 ERR %d\n", status[5])
}
if ( (status[0] != RTEMS_SUCCESSFUL) || (status[1] != RTEMS_SUCCESSFUL) || (status[2] != RTEMS_SUCCESSFUL) ||
(status[3] != RTEMS_SUCCESSFUL) || (status[4] != RTEMS_SUCCESSFUL) || (status[5] != RTEMS_SUCCESSFUL) )
{
ret = RTEMS_UNSATISFIED;
}
return ret;
}
int suspend_science_tasks()
{
/** This function suspends the science tasks.
*
* @return RTEMS directive status codes:
* - RTEMS_SUCCESSFUL - task restarted successfully
* - RTEMS_INVALID_ID - task id invalid
* - RTEMS_ALREADY_SUSPENDED - task already suspended
*
*/
rtems_status_code status;
status = rtems_task_suspend( Task_id[TASKID_AVF0] );
if (status != RTEMS_SUCCESSFUL)
{
PRINTF1("in suspend_science_task *** AVF0 ERR %d\n", status)
}
if (status == RTEMS_SUCCESSFUL) // suspend BPF0
{
status = rtems_task_suspend( Task_id[TASKID_BPF0] );
if (status != RTEMS_SUCCESSFUL)
{
PRINTF1("in suspend_science_task *** BPF0 ERR %d\n", status)
}
}
if (status == RTEMS_SUCCESSFUL) // suspend WFRM
{
status = rtems_task_suspend( Task_id[TASKID_WFRM] );
if (status != RTEMS_SUCCESSFUL)
{
PRINTF1("in suspend_science_task *** WFRM ERR %d\n", status)
}
}
if (status == RTEMS_SUCCESSFUL) // suspend CWF3
{
status = rtems_task_suspend( Task_id[TASKID_CWF3] );
if (status != RTEMS_SUCCESSFUL)
{
PRINTF1("in suspend_science_task *** CWF3 ERR %d\n", status)
}
}
if (status == RTEMS_SUCCESSFUL) // suspend CWF2
{
status = rtems_task_suspend( Task_id[TASKID_CWF2] );
if (status != RTEMS_SUCCESSFUL)
{
PRINTF1("in suspend_science_task *** CWF2 ERR %d\n", status)
}
}
if (status == RTEMS_SUCCESSFUL) // suspend CWF1
{
status = rtems_task_suspend( Task_id[TASKID_CWF1] );
if (status != RTEMS_SUCCESSFUL)
{
PRINTF1("in suspend_science_task *** CWF1 ERR %d\n", status)
}
}
return status;
}
//****************
// CLOSING ACTIONS
void update_last_TC_exe(ccsdsTelecommandPacket_t *TC)
{
housekeeping_packet.hk_lfr_last_exe_tc_id[0] = TC->packetID[0];
housekeeping_packet.hk_lfr_last_exe_tc_id[1] = TC->packetID[1];
housekeeping_packet.hk_lfr_last_exe_tc_type[0] = 0x00;
housekeeping_packet.hk_lfr_last_exe_tc_type[1] = TC->serviceType;
housekeeping_packet.hk_lfr_last_exe_tc_subtype[0] = 0x00;
housekeeping_packet.hk_lfr_last_exe_tc_subtype[1] = TC->serviceSubType;
housekeeping_packet.hk_lfr_last_exe_tc_time[0] = (unsigned char) (time_management_regs->coarse_time>>24);
housekeeping_packet.hk_lfr_last_exe_tc_time[1] = (unsigned char) (time_management_regs->coarse_time>>16);
housekeeping_packet.hk_lfr_last_exe_tc_time[2] = (unsigned char) (time_management_regs->coarse_time>>8);
housekeeping_packet.hk_lfr_last_exe_tc_time[3] = (unsigned char) (time_management_regs->coarse_time);
housekeeping_packet.hk_lfr_last_exe_tc_time[4] = (unsigned char) (time_management_regs->fine_time>>8);
housekeeping_packet.hk_lfr_last_exe_tc_time[5] = (unsigned char) (time_management_regs->fine_time);
}
void update_last_TC_rej(ccsdsTelecommandPacket_t *TC)
{
housekeeping_packet.hk_lfr_last_rej_tc_id[0] = TC->packetID[0];
housekeeping_packet.hk_lfr_last_rej_tc_id[1] = TC->packetID[1];
housekeeping_packet.hk_lfr_last_rej_tc_type[0] = 0x00;
housekeeping_packet.hk_lfr_last_rej_tc_type[1] = TC->serviceType;
housekeeping_packet.hk_lfr_last_rej_tc_subtype[0] = 0x00;
housekeeping_packet.hk_lfr_last_rej_tc_subtype[1] = TC->serviceSubType;
housekeeping_packet.hk_lfr_last_rej_tc_time[0] = (unsigned char) (time_management_regs->coarse_time>>24);
housekeeping_packet.hk_lfr_last_rej_tc_time[1] = (unsigned char) (time_management_regs->coarse_time>>16);
housekeeping_packet.hk_lfr_last_rej_tc_time[2] = (unsigned char) (time_management_regs->coarse_time>>8);
housekeeping_packet.hk_lfr_last_rej_tc_time[3] = (unsigned char) (time_management_regs->coarse_time);
housekeeping_packet.hk_lfr_last_rej_tc_time[4] = (unsigned char) (time_management_regs->fine_time>>8);
housekeeping_packet.hk_lfr_last_rej_tc_time[5] = (unsigned char) (time_management_regs->fine_time);
}
void close_action(ccsdsTelecommandPacket_t *TC, int result, rtems_id queue_id)
{
unsigned int val = 0;
if (result == LFR_SUCCESSFUL)
{
if ( !( (TC->serviceType==TC_TYPE_TIME) && (TC->serviceSubType==TC_SUBTYPE_UPDT_TIME) )
&&
!( (TC->serviceType==TC_TYPE_GEN) && (TC->serviceSubType==TC_SUBTYPE_UPDT_INFO))
)
{
send_tm_lfr_tc_exe_success( TC, queue_id );
}
update_last_TC_exe( TC );
val = housekeeping_packet.hk_dpu_exe_tc_lfr_cnt[0] * 256 + housekeeping_packet.hk_dpu_exe_tc_lfr_cnt[1];
val++;
housekeeping_packet.hk_dpu_exe_tc_lfr_cnt[0] = (unsigned char) (val >> 8);
housekeeping_packet.hk_dpu_exe_tc_lfr_cnt[1] = (unsigned char) (val);
}
else
{
update_last_TC_rej( TC );
val = housekeeping_packet.hk_dpu_rej_tc_lfr_cnt[0] * 256 + housekeeping_packet.hk_dpu_rej_tc_lfr_cnt[1];
val++;
housekeeping_packet.hk_dpu_rej_tc_lfr_cnt[0] = (unsigned char) (val >> 8);
housekeeping_packet.hk_dpu_rej_tc_lfr_cnt[1] = (unsigned char) (val);
}
}
//***************************
// Interrupt Service Routines
rtems_isr commutation_isr1( rtems_vector_number vector )
{
if (rtems_event_send( Task_id[TASKID_DUMB], RTEMS_EVENT_0 ) != RTEMS_SUCCESSFUL) {
printf("In commutation_isr1 *** Error sending event to DUMB\n");
}
}
rtems_isr commutation_isr2( rtems_vector_number vector )
{
if (rtems_event_send( Task_id[TASKID_DUMB], RTEMS_EVENT_0 ) != RTEMS_SUCCESSFUL) {
printf("In commutation_isr2 *** Error sending event to DUMB\n");
}
}
//****************
// OTHER FUNCTIONS
void updateLFRCurrentMode()
{
/** This function updates the value of the global variable lfrCurrentMode.
*
* lfrCurrentMode is a parameter used by several functions to know in which mode LFR is running.
*
*/
// update the local value of lfrCurrentMode with the value contained in the housekeeping_packet structure
lfrCurrentMode = (housekeeping_packet.lfr_status_word[0] & 0xf0) >> 4;
}