# HG changeset patch # User paul # Date 2014-03-28 15:52:00 # Node ID 169204beff11a93c5155bba7c7120ca5d741b452 # Parent 321cef60967cae03ffd79bfb946829cdb20ce562 the TC_ENTER_MODE time parameter is taken into account time < localTime time > locaTime + 3 the behaviour in case of a default has to be refined diff --git a/FSW-qt/Makefile b/FSW-qt/Makefile --- a/FSW-qt/Makefile +++ b/FSW-qt/Makefile @@ -1,6 +1,6 @@ ############################################################################# # Makefile for building: bin/fsw -# Generated by qmake (2.01a) (Qt 4.8.5) on: Thu Mar 27 14:01:46 2014 +# Generated by qmake (2.01a) (Qt 4.8.5) on: Fri Mar 28 13:24:20 2014 # Project: fsw-qt.pro # Template: app # Command: /usr/bin/qmake-qt4 -spec /usr/lib64/qt4/mkspecs/linux-g++ -o Makefile fsw-qt.pro @@ -10,7 +10,7 @@ CC = sparc-rtems-gcc CXX = sparc-rtems-g++ -DEFINES = -DSW_VERSION_N1=1 -DSW_VERSION_N2=0 -DSW_VERSION_N3=0 -DSW_VERSION_N4=4 -DVHDL_DEV -DPRINT_MESSAGES_ON_CONSOLE +DEFINES = -DSW_VERSION_N1=1 -DSW_VERSION_N2=0 -DSW_VERSION_N3=0 -DSW_VERSION_N4=5 -DVHDL_DEV -DPRINT_MESSAGES_ON_CONSOLE CFLAGS = -pipe -O3 -Wall $(DEFINES) CXXFLAGS = -pipe -O3 -Wall $(DEFINES) INCPATH = -I/usr/lib64/qt4/mkspecs/linux-g++ -I. -I../src -I../header -I../../LFR_basic-parameters 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 @@ -11,7 +11,7 @@ SWVERSION=-1-0 DEFINES += SW_VERSION_N1=1 # major DEFINES += SW_VERSION_N2=0 # minor DEFINES += SW_VERSION_N3=0 # patch -DEFINES += SW_VERSION_N4=4 # internal +DEFINES += SW_VERSION_N4=5 # internal contains( CONFIG, debug_tch ) { DEFINES += DEBUG_TCH 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 diff --git a/header/fsw_params_nb_bytes.h b/header/fsw_params_nb_bytes.h --- a/header/fsw_params_nb_bytes.h +++ b/header/fsw_params_nb_bytes.h @@ -23,4 +23,7 @@ #define BYTE_POS_HK_UPDATE_INFO_PAR_SET5 24 // 34 - 10 #define BYTE_POS_HK_UPDATE_INFO_PAR_SET6 25 // 35 - 10 +// TC_LFR_ENTER_MODE +#define BYTE_POS_CP_LFR_ENTER_MODE_TIME 2 // 12 - 10 + #endif // TM_BYTE_POSITIONS_H diff --git a/header/tc_handler.h b/header/tc_handler.h --- a/header/tc_handler.h +++ b/header/tc_handler.h @@ -25,7 +25,7 @@ rtems_task actn_task( rtems_task_argumen //*********** // TC ACTIONS int action_reset( ccsdsTelecommandPacket_t *TC, rtems_id queue_id, unsigned char *time ); -int action_enter_mode( ccsdsTelecommandPacket_t *TC, rtems_id queue_id, unsigned char *time ); +int action_enter_mode(ccsdsTelecommandPacket_t *TC, rtems_id queue_id); int action_update_info( ccsdsTelecommandPacket_t *TC, rtems_id queue_id ); int action_enable_calibration( ccsdsTelecommandPacket_t *TC, rtems_id queue_id, unsigned char *time ); int action_disable_calibration( ccsdsTelecommandPacket_t *TC, rtems_id queue_id, unsigned char *time ); @@ -34,11 +34,12 @@ int action_update_time( ccsdsTelecommand // mode transition int check_mode_value( unsigned char requestedMode ); int check_mode_transition( unsigned char requestedMode ); +int check_transition_date( unsigned int transitionCoarseTime ); int stop_current_mode( void ); -int enter_mode( unsigned char mode ); +int enter_mode( unsigned char mode , unsigned int transitionCoarseTime ); int restart_science_tasks(); int suspend_science_tasks(); -void launch_waveform_picker( unsigned char mode ); +void launch_waveform_picker(unsigned char mode , unsigned int transitionCoarseTime); void launch_spectral_matrix( unsigned char mode ); void set_irq_on_new_ready_matrix(unsigned char value ); void set_run_matrix_spectral( unsigned char value ); diff --git a/src/fsw_misc.c b/src/fsw_misc.c --- a/src/fsw_misc.c +++ b/src/fsw_misc.c @@ -310,7 +310,7 @@ void init_housekeeping_parameters( void housekeeping_packet.lfr_sw_version[2] = SW_VERSION_N3; housekeeping_packet.lfr_sw_version[3] = SW_VERSION_N4; // init fpga version - parameters = (unsigned char *) (REGS_ADDR_WAVEFORM_PICKER + 0xd0); + parameters = (unsigned char *) (REGS_ADDR_WAVEFORM_PICKER + 0xb0); housekeeping_packet.lfr_fpga_version[0] = parameters[1]; // n1 housekeeping_packet.lfr_fpga_version[1] = parameters[2]; // n2 housekeeping_packet.lfr_fpga_version[2] = parameters[3]; // n3 @@ -395,7 +395,7 @@ void send_dumb_hk( void ) dummy_hk_packet.lfr_sw_version[2] = SW_VERSION_N3; dummy_hk_packet.lfr_sw_version[3] = SW_VERSION_N4; // init fpga version - parameters = (unsigned char *) (REGS_ADDR_WAVEFORM_PICKER + 0xd0); + parameters = (unsigned char *) (REGS_ADDR_WAVEFORM_PICKER + 0xb0); dummy_hk_packet.lfr_fpga_version[0] = parameters[1]; // n1 dummy_hk_packet.lfr_fpga_version[1] = parameters[2]; // n2 dummy_hk_packet.lfr_fpga_version[2] = parameters[3]; // n3 diff --git a/src/fsw_spacewire.c b/src/fsw_spacewire.c --- a/src/fsw_spacewire.c +++ b/src/fsw_spacewire.c @@ -87,7 +87,7 @@ rtems_task spiq_task(rtems_task_argument if ( status != RTEMS_SUCCESSFUL ) { PRINTF1("in SPIQ *** ERR stop_current_mode *** code %d\n", status) } - status = enter_mode( LFR_MODE_STANDBY ); + status = enter_mode( LFR_MODE_STANDBY, 0 ); if ( status != RTEMS_SUCCESSFUL ) { PRINTF1("in SPIQ *** ERR enter_standby_mode *** code %d\n", status) } diff --git a/src/tc_handler.c b/src/tc_handler.c --- a/src/tc_handler.c +++ b/src/tc_handler.c @@ -102,7 +102,7 @@ rtems_task actn_task( rtems_task_argumen break; // case TC_SUBTYPE_ENTER: - result = action_enter_mode( &TC, queue_snd_id, time ); + result = action_enter_mode( &TC, queue_snd_id ); close_action( &TC, result, queue_snd_id ); break; // @@ -149,7 +149,7 @@ int action_reset(ccsdsTelecommandPacket_ return LFR_DEFAULT; } -int action_enter_mode(ccsdsTelecommandPacket_t *TC, rtems_id queue_id, unsigned char *time) +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. * @@ -160,8 +160,12 @@ int action_enter_mode(ccsdsTelecommandPa rtems_status_code status; unsigned char requestedMode; + unsigned int *transitionCoarseTime_ptr; + unsigned int transitionCoarseTime; requestedMode = TC->dataAndCRC[1]; + transitionCoarseTime_ptr = (unsigned int *) (&TC->dataAndCRC[BYTE_POS_CP_LFR_ENTER_MODE_TIME]); + transitionCoarseTime = (*transitionCoarseTime_ptr) & 0x7fffffff; status = check_mode_value( requestedMode ); @@ -169,22 +173,32 @@ int action_enter_mode(ccsdsTelecommandPa { send_tm_lfr_tc_exe_inconsistent( TC, queue_id, BYTE_POS_CP_LFR_MODE, requestedMode ); } - else + else // the mode value is consistent, check the transition { status = check_mode_transition(requestedMode); - - if ( status == LFR_SUCCESSFUL ) + if (status != LFR_SUCCESSFUL) { - PRINTF1("OK *** in action_enter_mode *** enter mode %d\n", requestedMode); - status = enter_mode( requestedMode ); - } - else - { - PRINTF("ERR *** in action_enter_mode *** transition rejected\n") + PRINTF("ERR *** in action_enter_mode *** check_mode_transition\n") send_tm_lfr_tc_exe_not_executable( TC, queue_id ); } } + if ( status == LFR_SUCCESSFUL ) // the transition is valid, enter the mode + { + status = check_transition_date( transitionCoarseTime ); + if (status != LFR_SUCCESSFUL) + { + PRINTF("ERR *** in action_enter_mode *** check_transition_date\n") + send_tm_lfr_tc_exe_not_executable( TC, queue_id ); + } + } + + if ( status == LFR_SUCCESSFUL ) // the date is valid, enter the mode + { + PRINTF1("OK *** in action_enter_mode *** enter mode %d\n", requestedMode); + status = enter_mode( requestedMode, transitionCoarseTime ); + } + return status; } @@ -390,6 +404,42 @@ int check_mode_transition( unsigned char return status; } +int check_transition_date( unsigned int transitionCoarseTime ) +{ + int status; + unsigned int localCoarseTime; + unsigned int deltaCoarseTime; + + status = LFR_SUCCESSFUL; + + if (transitionCoarseTime == 0) // transition time = 0 means an instant transition + { + status = LFR_SUCCESSFUL; + } + else + { + localCoarseTime = time_management_regs->coarse_time & 0x7fffffff; + + if ( transitionCoarseTime < localCoarseTime ) // SSS-CP-EQS-322 + { + status = LFR_DEFAULT; + PRINTF2("ERR *** in check_transition_date *** transition = %x, local = %x\n", transitionCoarseTime, localCoarseTime) + } + + if (status == LFR_SUCCESSFUL) + { + deltaCoarseTime = transitionCoarseTime - localCoarseTime; + if ( deltaCoarseTime > 3 ) // SSS-CP-EQS-323 + { + status = LFR_DEFAULT; + PRINTF1("ERR *** in check_transition_date *** deltaCoarseTime = %x\n", deltaCoarseTime) + } + } + } + + return status; +} + int stop_current_mode( void ) { /** This function stops the current mode by masking interrupt lines and suspending science tasks. @@ -441,7 +491,7 @@ int stop_current_mode( void ) return status; } -int enter_mode( unsigned char mode ) +int enter_mode( unsigned char mode, unsigned int transitionCoarseTime ) { /** This function is launched after a mode transition validation. * @@ -473,7 +523,7 @@ int enter_mode( unsigned char mode ) maxCount = 0; #endif status = restart_science_tasks(); - launch_waveform_picker( mode ); + launch_waveform_picker( mode, transitionCoarseTime ); // launch_spectral_matrix( mode ); } else if ( mode == LFR_MODE_STANDBY ) @@ -617,10 +667,8 @@ int suspend_science_tasks() return status; } -void launch_waveform_picker( unsigned char mode ) +void launch_waveform_picker( unsigned char mode, unsigned int transitionCoarseTime ) { - int startDate; - reset_current_ring_nodes(); reset_waveform_picker_regs(); set_wfp_burst_enable_register( mode ); @@ -628,9 +676,15 @@ void launch_waveform_picker( unsigned ch LEON_Clear_interrupt( IRQ_WAVEFORM_PICKER ); LEON_Unmask_interrupt( IRQ_WAVEFORM_PICKER ); - startDate = time_management_regs->coarse_time + 2; waveform_picker_regs->run_burst_enable = waveform_picker_regs->run_burst_enable | 0x80; // [1000 0000] - waveform_picker_regs->start_date = startDate; + if (transitionCoarseTime == 0) + { + waveform_picker_regs->start_date = time_management_regs->coarse_time; + } + else + { + waveform_picker_regs->start_date = transitionCoarseTime; + } } void launch_spectral_matrix( unsigned char mode )