##// END OF EJS Templates
Merge
Merge

File last commit:

r302:94c9c25ace49 R3_plus
r374:3b2a59f186e3 merge tip R3++
Show More
tc_handler.c
250 lines | 6.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
unsigned int incomingTransitionCoarseTime;
void reset_transitionCoarseTime( void )
{
incomingTransitionCoarseTime = 0xffffffff;
}
void set_transitionCoarseTime( unsigned int value )
{
incomingTransitionCoarseTime = value;
}
unsigned int get_transitionCoarseTime( void )
{
return incomingTransitionCoarseTime;
}
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
unsigned char time[6];
rtems_id queue_rcv_id;
rtems_id queue_snd_id;
status = get_message_queue_id_recv( &queue_rcv_id );
if (status != RTEMS_SUCCESSFUL)
{
PRINTF1("in ACTN *** ERR get_message_queue_id_recv %d\n", status)
}
status = get_message_queue_id_send( &queue_snd_id );
if (status != RTEMS_SUCCESSFUL)
{
PRINTF1("in ACTN *** ERR get_message_queue_id_send %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);
getTime( time ); // set time to the current time
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_ENTER:
result = action_enter_mode( &TC, queue_snd_id );
break;
case TC_SUBTYPE_UPDATE_TIME:
result = action_update_time( &TC );
break;
default:
break;
}
}
}
}
//***********
// TC ACTIONS
int action_reset(ccsdsTelecommandPacket_t *TC, rtems_id queue_id, unsigned char *time)
{
return LFR_SUCCESSFUL;
}
int action_enter_mode(ccsdsTelecommandPacket_t *TC, rtems_id queue_id )
{
unsigned int *transitionCoarseTime_ptr;
unsigned int transitionCoarseTime;
unsigned char * bytePosPtr;
bytePosPtr = (unsigned char *) &TC->packetID;
transitionCoarseTime_ptr = (unsigned int *) ( &bytePosPtr[ BYTE_POS_CP_LFR_ENTER_MODE_TIME ] );
transitionCoarseTime = transitionCoarseTime_ptr[0] & 0x7fffffff;
printf("local coarse time (without sync bit) = %x, requested transitionCoarseTime = %x\n",
getLocalCoarseTime(),
transitionCoarseTime);
set_transitionCoarseTime( transitionCoarseTime );
return LFR_SUCCESSFUL;
}
int action_update_info(ccsdsTelecommandPacket_t *TC, rtems_id queue_id)
{
return LFR_SUCCESSFUL;
}
int action_enable_calibration(ccsdsTelecommandPacket_t *TC, rtems_id queue_id, unsigned char *time)
{
return LFR_SUCCESSFUL;
}
int action_disable_calibration(ccsdsTelecommandPacket_t *TC, rtems_id queue_id, unsigned char *time)
{
return LFR_SUCCESSFUL;
}
int action_update_time(ccsdsTelecommandPacket_t *TC)
{
unsigned int incomingCoarseTime;
unsigned int currentLocalCoarseTime;
incomingCoarseTime = (TC->dataAndCRC[0] << 24)
+ (TC->dataAndCRC[1] << 16)
+ (TC->dataAndCRC[2] << 8)
+ TC->dataAndCRC[3];
currentLocalCoarseTime = getLocalCoarseTime();
setLocalCoarseTime( incomingCoarseTime );
printf( "currentLocalCoarseTime = %x, localCoarseTime set to: %x\n", currentLocalCoarseTime, getLocalCoarseTime() );
return LFR_SUCCESSFUL;
}
//*******************
// ENTERING THE MODES
int check_mode_value( unsigned char requestedMode )
{
return LFR_SUCCESSFUL;
}
int check_mode_transition( unsigned char requestedMode )
{
return LFR_SUCCESSFUL;
}
int check_transition_date( unsigned int transitionCoarseTime )
{
return LFR_SUCCESSFUL;
}
int stop_current_mode( void )
{
return LFR_SUCCESSFUL;
}
int enter_mode( unsigned char mode, unsigned int transitionCoarseTime )
{
return LFR_SUCCESSFUL;
}
int restart_science_tasks(unsigned char lfrRequestedMode )
{
return LFR_SUCCESSFUL;
}
int suspend_science_tasks()
{
return LFR_SUCCESSFUL;
}
void launch_waveform_picker( unsigned char mode, unsigned int transitionCoarseTime )
{
}
void launch_spectral_matrix( void )
{
}
void launch_spectral_matrix_simu( void )
{
}
void set_irq_on_new_ready_matrix( unsigned char value )
{
}
void set_run_matrix_spectral( unsigned char value )
{
}
//****************
// CLOSING ACTIONS
void update_last_TC_exe( ccsdsTelecommandPacket_t *TC, unsigned char * time )
{
}
void update_last_TC_rej(ccsdsTelecommandPacket_t *TC, unsigned char * time )
{
}
void close_action(ccsdsTelecommandPacket_t *TC, int result, rtems_id queue_id )
{
}
//***************************
// 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()
{
}