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-vhdl-dev -# Generated by qmake (2.01a) (Qt 4.8.5) on: Thu Jan 23 13:51:15 2014 +# Generated by qmake (2.01a) (Qt 4.8.5) on: Mon Jan 27 07:11:41 2014 # Project: fsw-qt.pro # Template: app # Command: /usr/bin/qmake-qt4 -spec /usr/lib64/qt4/mkspecs/linux-g++ -o Makefile fsw-qt.pro 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/TC_types.h b/header/TC_types.h --- a/header/TC_types.h +++ b/header/TC_types.h @@ -10,13 +10,13 @@ #define PACKET_LENGTH_TC_LFR_RESET (12 - CCSDS_TC_TM_PACKET_OFFSET) #define PACKET_LENGTH_TC_LFR_LOAD_COMMON_PAR (14 - CCSDS_TC_TM_PACKET_OFFSET) -#define PACKET_LENGTH_TC_LFR_LOAD_NORMAL_PAR (20 - CCSDS_TC_TM_PACKET_OFFSET) +#define PACKET_LENGTH_TC_LFR_LOAD_NORMAL_PAR (22 - CCSDS_TC_TM_PACKET_OFFSET) #define PACKET_LENGTH_TC_LFR_LOAD_BURST_PAR (14 - CCSDS_TC_TM_PACKET_OFFSET) #define PACKET_LENGTH_TC_LFR_LOAD_SBM1_PAR (14 - CCSDS_TC_TM_PACKET_OFFSET) #define PACKET_LENGTH_TC_LFR_LOAD_SBM2_PAR (14 - CCSDS_TC_TM_PACKET_OFFSET) #define PACKET_LENGTH_TC_LFR_DUMP_PAR (12 - CCSDS_TC_TM_PACKET_OFFSET) #define PACKET_LENGTH_TC_LFR_ENTER_MODE (20 - CCSDS_TC_TM_PACKET_OFFSET) -#define PACKET_LENGTH_TC_LFR_UPDATE_INFO (48 - CCSDS_TC_TM_PACKET_OFFSET) +#define PACKET_LENGTH_TC_LFR_UPDATE_INFO (46 - CCSDS_TC_TM_PACKET_OFFSET) #define PACKET_LENGTH_TC_LFR_ENABLE_CALIBRATION (12 - CCSDS_TC_TM_PACKET_OFFSET) #define PACKET_LENGTH_TC_LFR_DISABLE_CALIBRATION (12 - CCSDS_TC_TM_PACKET_OFFSET) #define PACKET_LENGTH_TC_LFR_UPDATE_TIME (18 - CCSDS_TC_TM_PACKET_OFFSET) @@ -145,6 +145,8 @@ struct Packet_TC_LFR_LOAD_NORMAL_PAR_str unsigned char sy_lfr_n_asm_p[2]; unsigned char sy_lfr_n_bp_p0; unsigned char sy_lfr_n_bp_p1; + unsigned char sy_lfr_n_cwf_long_f3; + unsigned char lfr_normal_parameters_spare; unsigned char crc[2]; }; typedef struct Packet_TC_LFR_LOAD_NORMAL_PAR_str Packet_TC_LFR_LOAD_NORMAL_PAR_t; diff --git a/header/ccsds_types.h b/header/ccsds_types.h --- a/header/ccsds_types.h +++ b/header/ccsds_types.h @@ -80,13 +80,13 @@ // TC LEN #define TC_LEN_RESET 12 #define TC_LEN_LOAD_COMM 14 -#define TC_LEN_LOAD_NORM 20 +#define TC_LEN_LOAD_NORM 22 #define TC_LEN_LOAD_BURST 14 #define TC_LEN_LOAD_SBM1 14 #define TC_LEN_LOAD_SBM2 14 #define TC_LEN_DUMP 12 #define TC_LEN_ENTER 20 -#define TC_LEN_UPDT_INFO 48 +#define TC_LEN_UPDT_INFO 46 #define TC_LEN_EN_CAL 12 #define TC_LEN_DIS_CAL 12 #define TC_LEN_UPDT_TIME 18 @@ -182,6 +182,7 @@ enum apid_destid{ #define SID_SBM2_BP2_F0 32 #define SID_SBM2_BP1_F1 30 #define SID_SBM2_BP2_F1 33 +#define SID_NORM_CWF_LONG_F3 34 // LENGTH (BYTES) #define LENGTH_TM_LFR_TC_EXE_MAX 32 @@ -206,8 +207,13 @@ enum apid_destid{ #define LEN_TM_LFR_HK 130 // 126 + 4 #define LEN_TM_LFR_TC_EXE_NOT_IMP 28 // 24 + 4 +// R1 #define TM_LEN_SCI_SWF_340 4101 // 340 * 12 + 10 + 12 - 1 #define TM_LEN_SCI_SWF_8 117 // 8 * 12 + 10 + 12 - 1 +// R2 +#define TM_LEN_SCI_SWF_304 3669 // 304 * 12 + 10 + 12 - 1 +#define TM_LEN_SCI_SWF_224 2709 // 224 * 12 + 10 + 12 - 1 +// #define TM_LEN_SCI_CWF_340 4099 // 340 * 12 + 10 + 10 - 1 #define TM_LEN_SCI_CWF_8 115 // 8 * 12 + 10 + 10 - 1 #define TM_LEN_SCI_CWF3_LIGHT_340 2059 // 340 * 6 + 10 + 10 - 1 @@ -215,6 +221,8 @@ enum apid_destid{ #define DEFAULT_PKTCNT 0x07 #define BLK_NR_340 0x0154 #define BLK_NR_8 0x0008 +#define BLK_NR_304 0x0130 +#define BLK_NR_224 0x00e0 enum TM_TYPE{ TM_LFR_TC_EXE_OK, @@ -469,11 +477,16 @@ typedef struct { // HK PARAMETERS unsigned char lfr_status_word[2]; unsigned char lfr_sw_version[4]; + unsigned char lfr_fpga_version[3]; + // ressource statistics + unsigned char hk_lfr_cpu_load; + unsigned char hk_lfr_load_max; + unsigned char hk_lfr_load_aver; // tc statistics unsigned char hk_lfr_update_info_tc_cnt[2]; unsigned char hk_lfr_update_time_tc_cnt[2]; - unsigned char hk_dpu_exe_tc_lfr_cnt[2]; - unsigned char hk_dpu_rej_tc_lfr_cnt[2]; + unsigned char hk_lfr_exe_tc_cnt[2]; + unsigned char hk_lfr_rej_tc_cnt[2]; unsigned char hk_lfr_last_exe_tc_id[2]; unsigned char hk_lfr_last_exe_tc_type[2]; unsigned char hk_lfr_last_exe_tc_subtype[2]; @@ -498,13 +511,17 @@ typedef struct { unsigned char hk_lfr_dpu_spw_pkt_rcv_cnt[2]; unsigned char hk_lfr_dpu_spw_pkt_sent_cnt[2]; unsigned char hk_lfr_dpu_spw_tick_out_cnt; - unsigned char hk_lfr_dpu_spw_last_time; + unsigned char hk_lfr_dpu_spw_last_timc; // ahb error statistics unsigned int hk_lfr_last_fail_addr; // temperatures unsigned char hk_lfr_temp_scm[2]; unsigned char hk_lfr_temp_pcb[2]; unsigned char hk_lfr_temp_fpga[2]; + // spacecraft potential + unsigned char hk_lfr_sc_v_f3[2]; + unsigned char hk_lfr_sc_e1_f3[2]; + unsigned char hk_lfr_sc_e2_f3[2]; // error counters unsigned char hk_lfr_dpu_spw_parity; unsigned char hk_lfr_dpu_spw_disconnect; @@ -513,8 +530,6 @@ typedef struct { unsigned char hk_lfr_dpu_spw_write_sync; unsigned char hk_lfr_dpu_spw_rx_ahb; unsigned char hk_lfr_dpu_spw_tx_ahb; - unsigned char hk_lfr_dpu_spw_header_crc; - unsigned char hk_lfr_dpu_spw_data_crc; unsigned char hk_lfr_dpu_spw_early_eop; unsigned char hk_lfr_dpu_spw_invalid_addr; unsigned char hk_lfr_dpu_spw_eep; @@ -533,21 +548,8 @@ typedef struct { // hk_lfr_ahb_ unsigned char hk_lfr_ahb_correctable; unsigned char hk_lfr_ahb_uncorrectable; - unsigned char hk_lfr_ahb_fails_trans; - // hk_lfr_adc_ - unsigned char hk_lfr_adc_failure; - unsigned char hk_lfr_adc_timeout; - unsigned char hk_lfr_toomany_err; - // hk_lfr_cpu_ - unsigned char hk_lfr_cpu_write_err; - unsigned char hk_lfr_cpu_ins_access_err; - unsigned char hk_lfr_cpu_illegal_ins; - unsigned char hk_lfr_cpu_privilegied_ins; - unsigned char hk_lfr_cpu_register_hw; - unsigned char hk_lfr_cpu_not_aligned; - unsigned char hk_lfr_cpu_data_exception; - unsigned char hk_lfr_cpu_div_exception; - unsigned char hk_lfr_cpu_arith_overflow; + // spare + unsigned char parameters_spare; } Packet_TM_LFR_HK_t; typedef struct { @@ -578,6 +580,8 @@ typedef struct { unsigned char sy_lfr_n_asm_p[2]; unsigned char sy_lfr_n_bp_p0; unsigned char sy_lfr_n_bp_p1; + unsigned char sy_lfr_n_cwf_long_f3; + unsigned char lfr_normal_parameters_spare; //***************** // BURST PARAMETERS diff --git a/header/fsw_params.h b/header/fsw_params.h --- a/header/fsw_params.h +++ b/header/fsw_params.h @@ -21,6 +21,7 @@ #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_F0 3 // AT LEAST 3 #define NB_RING_NODES_F1 5 // AT LEAST 3 #define NB_RING_NODES_F2 5 // AT LEAST 3 diff --git a/header/tc_load_dump_parameters.h b/header/tc_load_dump_parameters.h --- a/header/tc_load_dump_parameters.h +++ b/header/tc_load_dump_parameters.h @@ -21,6 +21,7 @@ int set_sy_lfr_n_swf_p( ccsdsTelecommand int set_sy_lfr_n_asm_p( ccsdsTelecommandPacket_t *TC, rtems_id queue_id ); int set_sy_lfr_n_bp_p0( ccsdsTelecommandPacket_t *TC, rtems_id queue_id ); int set_sy_lfr_n_bp_p1( ccsdsTelecommandPacket_t *TC, rtems_id queue_id ); +int set_sy_lfr_n_cwf_long_f3(ccsdsTelecommandPacket_t *TC, rtems_id queue_id); void init_parameter_dump( void ); diff --git a/header/tm_byte_positions.h b/header/tm_byte_positions.h --- a/header/tm_byte_positions.h +++ b/header/tm_byte_positions.h @@ -11,6 +11,7 @@ #define BYTE_POS_SY_LFR_N_ASM_P 4 #define BYTE_POS_SY_LFR_N_BP_P0 6 #define BYTE_POS_SY_LFR_N_BP_P1 7 +#define BYTE_POS_SY_LFR_N_CWF_LONG_F3 8 // TC_LFR_LOAD_BURST_PAR diff --git a/header/wf_handler.h b/header/wf_handler.h --- a/header/wf_handler.h +++ b/header/wf_handler.h @@ -25,8 +25,9 @@ extern int fdSPW; //***************** // waveform buffers // F0 -extern volatile int wf_snap_f0[ ]; +//extern volatile int wf_snap_f0[ ]; // F1 F2 +extern volatile int wf_snap_f0[ ][ (NB_SAMPLES_PER_SNAPSHOT * NB_WORDS_SWF_BLK) + TIME_OFFSET + 46 ]; extern volatile int wf_snap_f1[ ][ (NB_SAMPLES_PER_SNAPSHOT * NB_WORDS_SWF_BLK) + TIME_OFFSET + 46 ]; extern volatile int wf_snap_f2[ ][ (NB_SAMPLES_PER_SNAPSHOT * NB_WORDS_SWF_BLK) + TIME_OFFSET + 46 ]; // F3 @@ -65,7 +66,7 @@ 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 ); +int init_header_continuous_cwf3_light_table( Header_TM_LFR_SCIENCE_CWF_t *headerCWF ); // 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 ); diff --git a/src/fsw_globals.c b/src/fsw_globals.c --- a/src/fsw_globals.c +++ b/src/fsw_globals.c @@ -33,7 +33,8 @@ unsigned char lfrCurrentMode; // WAVEFORMS GLOBAL VARIABLES // 2048 * 3 * 4 + 2 * 4 = 24576 + 8 bytes // F0 -volatile int wf_snap_f0[ NB_SAMPLES_PER_SNAPSHOT * NB_WORDS_SWF_BLK + TIME_OFFSET ] __attribute__((aligned(0x100))); +//volatile int wf_snap_f0 [ (NB_SAMPLES_PER_SNAPSHOT * NB_WORDS_SWF_BLK) + TIME_OFFSET + 46 ] __attribute__((aligned(0x100))); +volatile int wf_snap_f0[ NB_RING_NODES_F0 ][ (NB_SAMPLES_PER_SNAPSHOT * NB_WORDS_SWF_BLK) + TIME_OFFSET + 46 ] __attribute__((aligned(0x100))); // F1 F2 volatile int wf_snap_f1[ NB_RING_NODES_F1 ][ (NB_SAMPLES_PER_SNAPSHOT * NB_WORDS_SWF_BLK) + TIME_OFFSET + 46 ] __attribute__((aligned(0x100))); volatile int wf_snap_f2[ NB_RING_NODES_F2 ][ (NB_SAMPLES_PER_SNAPSHOT * NB_WORDS_SWF_BLK) + TIME_OFFSET + 46 ] __attribute__((aligned(0x100))); diff --git a/src/fsw_init.c b/src/fsw_init.c --- a/src/fsw_init.c +++ b/src/fsw_init.c @@ -75,18 +75,19 @@ rtems_task Init( rtems_task_argument ign rtems_status_code status_spw; rtems_isr_entry old_isr_handler; + // UART settings + send_console_outputs_on_apbuart_port(); + set_apbuart_scaler_reload_register(REGS_ADDR_APBUART, APBUART_SCALER_RELOAD_VALUE); + BOOT_PRINTF("\n\n\n\n\n") BOOT_PRINTF("***************************\n") BOOT_PRINTF("** START Flight Software **\n") - #ifdef VHDL_DEV - PRINTF("/!\\ this is the VHDL_DEV flight software /!\\ \n") - #endif +#ifdef VHDL_DEV + PRINTF("/!\\ this is the VHDL_DEV flight software /!\\ \n") +#endif BOOT_PRINTF("***************************\n") BOOT_PRINTF("\n\n") - //send_console_outputs_on_apbuart_port(); - 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 @@ -162,22 +163,19 @@ rtems_task Init( rtems_task_argument ign PRINTF1("in INIT *** in suspend_science_tasks *** ERR code: %d\n", status) } -#ifdef GSA - // mask IRQ lines + + //****************************** + // LEON_Mask_interrupt( IRQ_SM ); - LEON_Mask_interrupt( IRQ_WF ); - // Spectral Matrices simulator configure_timer((gptimer_regs_t*) REGS_ADDR_GPTIMER, TIMER_SM_SIMULATOR, CLKDIV_SM_SIMULATOR, - IRQ_SPARC_SM, spectral_matrices_isr ); - // WaveForms - configure_timer((gptimer_regs_t*) REGS_ADDR_GPTIMER, TIMER_WF_SIMULATOR, CLKDIV_WF_SIMULATOR, - IRQ_SPARC_WF, waveforms_simulator_isr ); -#else + IRQ_SPARC_SM, spectral_matrices_isr_simu ); + // + //******************************* + // configure IRQ handling for the waveform picker unit status = rtems_interrupt_catch( waveforms_isr, IRQ_SPARC_WAVEFORM_PICKER, &old_isr_handler) ; -#endif // if the spacewire link is not up then send an event to the SPIQ task for link recovery if ( status_spw != RTEMS_SUCCESSFUL ) diff --git a/src/fsw_misc.c b/src/fsw_misc.c --- a/src/fsw_misc.c +++ b/src/fsw_misc.c @@ -231,20 +231,21 @@ rtems_task dumb_task( rtems_task_argumen unsigned int fine_time = 0; rtems_event_set event_out; - char *DumbMessages[7] = {"in DUMB *** default", // RTEMS_EVENT_0 + char *DumbMessages[8] = {"in DUMB *** default", // RTEMS_EVENT_0 "in DUMB *** timecode_irq_handler", // RTEMS_EVENT_1 "in DUMB *** waveforms_isr", // RTEMS_EVENT_2 "in DUMB *** in SMIQ *** Error sending event to AVF0", // RTEMS_EVENT_3 "in DUMB *** spectral_matrices_isr *** Error sending event to SMIQ", // RTEMS_EVENT_4 "in DUMB *** waveforms_simulator_isr", // RTEMS_EVENT_5 - "ERR HK" // RTEMS_EVENT_6 + "ERR HK", // RTEMS_EVENT_6 + "ready for dump" // RTEMS_EVENT_7 }; BOOT_PRINTF("in DUMB *** \n") while(1){ rtems_event_receive(RTEMS_EVENT_0 | RTEMS_EVENT_1 | RTEMS_EVENT_2 | RTEMS_EVENT_3 - | RTEMS_EVENT_4 | RTEMS_EVENT_5 | RTEMS_EVENT_6, + | RTEMS_EVENT_4 | RTEMS_EVENT_5 | RTEMS_EVENT_6 | RTEMS_EVENT_7, RTEMS_WAIT | RTEMS_EVENT_ANY, RTEMS_NO_TIMEOUT, &event_out); // wait for an RTEMS_EVENT intEventOut = (unsigned int) event_out; for ( i=0; i<32; i++) @@ -269,9 +270,9 @@ void init_housekeeping_parameters( void */ unsigned int i = 0; - char *parameters; + unsigned char *parameters; - parameters = (char*) &housekeeping_packet.lfr_status_word; + parameters = (unsigned char*) &housekeeping_packet.lfr_status_word; for(i = 0; i< SIZE_HK_PARAMETERS; i++) { parameters[i] = 0x00; @@ -284,7 +285,11 @@ void init_housekeeping_parameters( void housekeeping_packet.lfr_sw_version[1] = SW_VERSION_N2; 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); + 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 } void increment_seq_counter( unsigned char *packet_sequence_control) diff --git a/src/fsw_processing.c b/src/fsw_processing.c --- a/src/fsw_processing.c +++ b/src/fsw_processing.c @@ -200,13 +200,9 @@ rtems_task matr_task(rtems_task_argument while(1){ rtems_event_receive(RTEMS_EVENT_0, RTEMS_WAIT, RTEMS_NO_TIMEOUT, &event_out); // wait for an RTEMS_EVENT0 - -#ifdef GSA -#else - fill_averaged_spectral_matrix( ); -#endif + // 1) convert the float array in a char array convert_averaged_spectral_matrix( averaged_spec_mat_f0, averaged_spec_mat_f0_char); - + // 2) send the spectral matrix packets send_spectral_matrix( &headerASM, averaged_spec_mat_f0_char, SID_NORM_ASM_F0, &spw_ioctl_send_ASM, queue_id); } } @@ -528,10 +524,10 @@ void convert_averaged_spectral_matrix( v { for ( j=0; jmatrixF0_Address0 == (int) spec_mat_f0_0) - averaged_spec_mat_f0[i] = (float) spec_mat_f0_0_bis[ SM_HEADER + i ]; - else - averaged_spec_mat_f0[i] = (float) spec_mat_f0_0[ SM_HEADER + i ]; - } -#endif } void reset_spectral_matrix_regs() diff --git a/src/fsw_spacewire.c b/src/fsw_spacewire.c --- a/src/fsw_spacewire.c +++ b/src/fsw_spacewire.c @@ -571,10 +571,6 @@ void spacewire_update_statistics( void ) housekeeping_packet.hk_lfr_dpu_spw_escape = (unsigned char) spacewire_stats.escape_err; housekeeping_packet.hk_lfr_dpu_spw_credit = (unsigned char) spacewire_stats.credit_err; housekeeping_packet.hk_lfr_dpu_spw_write_sync = (unsigned char) spacewire_stats.write_sync_err; - // housekeeping_packet.hk_lfr_dpu_spw_rx_ahb; - // housekeeping_packet.hk_lfr_dpu_spw_tx_ahb; - housekeeping_packet.hk_lfr_dpu_spw_header_crc = (unsigned char) spacewire_stats.rx_rmap_header_crc_err; - housekeeping_packet.hk_lfr_dpu_spw_data_crc = (unsigned char) spacewire_stats.rx_rmap_data_crc_err; //********************************************* // ERROR COUNTERS / SPACEWIRE / MEDIUM SEVERITY @@ -582,7 +578,6 @@ void spacewire_update_statistics( void ) housekeeping_packet.hk_lfr_dpu_spw_invalid_addr = (unsigned char) spacewire_stats.invalid_address; housekeeping_packet.hk_lfr_dpu_spw_eep = (unsigned char) spacewire_stats.rx_eep_err; housekeeping_packet.hk_lfr_dpu_spw_rx_too_big = (unsigned char) spacewire_stats.rx_truncated; - } void timecode_irq_handler( void *pDev, void *regs, int minor, unsigned int tc ) diff --git a/src/tc_handler.c b/src/tc_handler.c --- a/src/tc_handler.c +++ b/src/tc_handler.c @@ -396,13 +396,15 @@ int stop_current_mode() // mask interruptions LEON_Mask_interrupt( IRQ_WAVEFORM_PICKER ); // mask waveform picker interrupt - LEON_Mask_interrupt( IRQ_SPECTRAL_MATRIX ); // mask spectral matrix interrupt + //LEON_Mask_interrupt( IRQ_SPECTRAL_MATRIX ); // clear spectral matrix interrupt + LEON_Mask_interrupt( IRQ_SM ); // mask spectral matrix interrupt simulator // reset registers reset_wfp_burst_enable(); // reset burst and enable bits reset_wfp_status(); // reset all the status bits // clear interruptions LEON_Clear_interrupt( IRQ_WAVEFORM_PICKER ); // clear waveform picker interrupt - LEON_Clear_interrupt( IRQ_SPECTRAL_MATRIX ); // clear spectarl matrix interrupt + //LEON_Clear_interrupt( IRQ_SPECTRAL_MATRIX ); // clear spectral matrix interrupt + LEON_Clear_interrupt( IRQ_SM ); // clear spectral matrix interrupt simulator //********************** // suspend several tasks if (lfrCurrentMode != LFR_MODE_STANDBY) { @@ -493,15 +495,13 @@ int enter_normal_mode() status = restart_science_tasks(); -#ifdef GSA - timer_start( (gptimer_regs_t*) REGS_ADDR_GPTIMER, TIMER_SM_SIMULATOR ); - // - 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 - launch_waveform_picker( LFR_MODE_SBM1 ); -#endif + // Spectral Matrices simulator +// timer_start( (gptimer_regs_t*) REGS_ADDR_GPTIMER, TIMER_SM_SIMULATOR ); +// set_local_nb_interrupt_f0_MAX(); +// LEON_Clear_interrupt( IRQ_SM ); +// LEON_Unmask_interrupt( IRQ_SM ); + + launch_waveform_picker( LFR_MODE_NORMAL ); return status; } @@ -787,18 +787,18 @@ void close_action(ccsdsTelecommandPacket send_tm_lfr_tc_exe_success( TC, queue_id, time ); } update_last_TC_exe( TC, time ); - val = housekeeping_packet.hk_dpu_exe_tc_lfr_cnt[0] * 256 + housekeeping_packet.hk_dpu_exe_tc_lfr_cnt[1]; + val = housekeeping_packet.hk_lfr_exe_tc_cnt[0] * 256 + housekeeping_packet.hk_lfr_exe_tc_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); + housekeeping_packet.hk_lfr_exe_tc_cnt[0] = (unsigned char) (val >> 8); + housekeeping_packet.hk_lfr_exe_tc_cnt[1] = (unsigned char) (val); } else { update_last_TC_rej( TC, time ); - val = housekeeping_packet.hk_dpu_rej_tc_lfr_cnt[0] * 256 + housekeeping_packet.hk_dpu_rej_tc_lfr_cnt[1]; + val = housekeeping_packet.hk_lfr_rej_tc_cnt[0] * 256 + housekeeping_packet.hk_lfr_rej_tc_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); + housekeeping_packet.hk_lfr_rej_tc_cnt[0] = (unsigned char) (val >> 8); + housekeeping_packet.hk_lfr_rej_tc_cnt[1] = (unsigned char) (val); } } diff --git a/src/tc_load_dump_parameters.c b/src/tc_load_dump_parameters.c --- a/src/tc_load_dump_parameters.c +++ b/src/tc_load_dump_parameters.c @@ -105,6 +105,17 @@ int action_load_normal_par(ccsdsTelecomm } } + //********************* + // sy_lfr_n_cwf_long_f3 + if (flag == LFR_SUCCESSFUL) + { + result = set_sy_lfr_n_cwf_long_f3( TC, queue_id ); + if (result != LFR_SUCCESSFUL) + { + flag = LFR_DEFAULT; + } + } + return flag; } @@ -374,6 +385,24 @@ int set_sy_lfr_n_bp_p1(ccsdsTelecommandP return status; } +int set_sy_lfr_n_cwf_long_f3(ccsdsTelecommandPacket_t *TC, rtems_id queue_id) +{ + /** This function allows to switch from CWF_F3 packets to CWF_LONG_F3 packets. + * + * @param TC points to the TeleCommand packet that is being processed + * @param queue_id is the id of the queue which handles TM related to this execution step + * + */ + + int status; + + status = LFR_SUCCESSFUL; + + parameter_dump_packet.sy_lfr_n_cwf_long_f3 = TC->dataAndCRC[ BYTE_POS_SY_LFR_N_CWF_LONG_F3 ]; + + return status; +} + //********************** // BURST MODE PARAMETERS diff --git a/src/wf_handler.c b/src/wf_handler.c --- a/src/wf_handler.c +++ b/src/wf_handler.c @@ -24,8 +24,11 @@ Header_TM_LFR_SCIENCE_CWF_t headerCWF_F3 //************** // waveform ring +ring_node waveform_ring_f0[NB_RING_NODES_F0]; ring_node waveform_ring_f1[NB_RING_NODES_F1]; ring_node waveform_ring_f2[NB_RING_NODES_F2]; +ring_node *current_ring_node_f0; +ring_node *ring_node_to_send_swf_f0; ring_node *current_ring_node_f1; ring_node *ring_node_to_send_swf_f1; ring_node *ring_node_to_send_cwf_f1; @@ -75,6 +78,10 @@ rtems_isr waveforms_isr( rtems_vector_nu // NORMAL case(LFR_MODE_NORMAL): if ( (waveform_picker_regs->status & 0x7) == 0x7 ){ // f2 f1 and f0 are full + // change F0 ring node + ring_node_to_send_swf_f0 = current_ring_node_f0; + current_ring_node_f0 = current_ring_node_f0->next; + waveform_picker_regs->addr_data_f0 = current_ring_node_f0->buffer_address; // change F1 ring node ring_node_to_send_swf_f1 = current_ring_node_f1; current_ring_node_f1 = current_ring_node_f1->next; @@ -88,6 +95,8 @@ rtems_isr waveforms_isr( rtems_vector_nu rtems_event_send( Task_id[TASKID_DUMB], RTEMS_EVENT_2 ); } waveform_picker_regs->status = waveform_picker_regs->status & 0xfffff888; // [1000 1000 1000] +// rtems_event_send( Task_id[TASKID_DUMB], RTEMS_EVENT_7 ); +// reset_wfp_burst_enable(); } break; @@ -202,7 +211,7 @@ rtems_task wfrm_task(rtems_task_argument RTEMS_WAIT | RTEMS_EVENT_ANY, RTEMS_NO_TIMEOUT, &event_out); if (event_out == RTEMS_EVENT_MODE_NORMAL) { - send_waveform_SWF(wf_snap_f0, SID_NORM_SWF_F0, headerSWF_F0, queue_id); + send_waveform_SWF((volatile int*) ring_node_to_send_swf_f0->buffer_address, SID_NORM_SWF_F0, headerSWF_F0, 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); } @@ -228,8 +237,8 @@ rtems_task cwf3_task(rtems_task_argument rtems_id queue_id; rtems_status_code status; - init_header_continuous_wf_table( SID_NORM_CWF_F3, headerCWF_F3 ); - init_header_continuous_wf3_light_table( headerCWF_F3_light ); + init_header_continuous_wf_table( SID_NORM_CWF_LONG_F3, headerCWF_F3 ); + init_header_continuous_cwf3_light_table( headerCWF_F3_light ); status = get_message_queue_id_send( &queue_id ); if (status != RTEMS_SUCCESSFUL) @@ -244,15 +253,28 @@ rtems_task cwf3_task(rtems_task_argument rtems_event_receive( RTEMS_EVENT_0, RTEMS_WAIT | RTEMS_EVENT_ANY, RTEMS_NO_TIMEOUT, &event_out); PRINTF("send CWF F3 \n") -#ifdef GSA -#else if (waveform_picker_regs->addr_data_f3 == (int) wf_cont_f3_a) { - send_waveform_CWF3_light( wf_cont_f3_b, headerCWF_F3_light, queue_id ); + if ( (parameter_dump_packet.sy_lfr_n_cwf_long_f3 & 0x01) == 0x01) + { + send_waveform_CWF( wf_cont_f3_b, SID_NORM_CWF_LONG_F3, headerCWF_F3, queue_id ); + } + else + { + send_waveform_CWF3_light( wf_cont_f3_b, headerCWF_F3_light, queue_id ); + } } - else { - send_waveform_CWF3_light( wf_cont_f3_a, headerCWF_F3_light, queue_id ); + else + { + if ( (parameter_dump_packet.sy_lfr_n_cwf_long_f3 & 0x01) == 0x00) + { + send_waveform_CWF( wf_cont_f3_a, SID_NORM_CWF_LONG_F3, headerCWF_F3, queue_id ); + } + else + { + send_waveform_CWF3_light( wf_cont_f3_a, headerCWF_F3_light, queue_id ); + } + } -#endif } } @@ -341,9 +363,9 @@ void init_waveforms( void ) { //*** // 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; // +// 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 @@ -369,6 +391,22 @@ void init_waveform_rings( void ) { unsigned char i; + // F0 RING + waveform_ring_f0[0].next = (ring_node*) &waveform_ring_f0[1]; + waveform_ring_f0[0].previous = (ring_node*) &waveform_ring_f0[NB_RING_NODES_F0-1]; + waveform_ring_f0[0].buffer_address = (int) &wf_snap_f0[0][0]; + + waveform_ring_f0[NB_RING_NODES_F0-1].next = (ring_node*) &waveform_ring_f0[0]; + waveform_ring_f0[NB_RING_NODES_F0-1].previous = (ring_node*) &waveform_ring_f0[NB_RING_NODES_F0-2]; + waveform_ring_f0[NB_RING_NODES_F0-1].buffer_address = (int) &wf_snap_f0[NB_RING_NODES_F0-1][0]; + + for(i=1; i> 8); headerSWF[ i ].packetID[1] = (unsigned char) (TM_PACKET_ID_SCIENCE_NORMAL_BURST); - if (i == 0) + headerSWF[ i ].packetSequenceControl[0] = TM_PACKET_SEQ_CTRL_STANDALONE; + if (i == 6) { - 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 ); - } - else if (i == 6) - { - 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 ); + headerSWF[ i ].packetLength[0] = (unsigned char) (TM_LEN_SCI_SWF_224 >> 8); + headerSWF[ i ].packetLength[1] = (unsigned char) (TM_LEN_SCI_SWF_224 ); + headerSWF[ i ].blkNr[0] = (unsigned char) (BLK_NR_224 >> 8); + headerSWF[ i ].blkNr[1] = (unsigned char) (BLK_NR_224 ); } else { - 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 ); + headerSWF[ i ].packetLength[0] = (unsigned char) (TM_LEN_SCI_SWF_304 >> 8); + headerSWF[ i ].packetLength[1] = (unsigned char) (TM_LEN_SCI_SWF_304 ); + headerSWF[ i ].blkNr[0] = (unsigned char) (BLK_NR_304 >> 8); + headerSWF[ i ].blkNr[1] = (unsigned char) (BLK_NR_304 ); } headerSWF[ i ].packetSequenceControl[1] = TM_PACKET_SEQ_CNT_DEFAULT; headerSWF[ i ].pktCnt = DEFAULT_PKTCNT; // PKT_CNT @@ -539,7 +572,7 @@ int init_header_continuous_wf_table( uns return LFR_SUCCESSFUL; } -int init_header_continuous_wf3_light_table( Header_TM_LFR_SCIENCE_CWF_t *headerCWF ) +int init_header_continuous_cwf3_light_table( Header_TM_LFR_SCIENCE_CWF_t *headerCWF ) { unsigned int i; @@ -623,17 +656,17 @@ int send_waveform_SWF( volatile int *wav for (i=0; i<7; i++) // send waveform { #ifdef VHDL_DEV - spw_ioctl_send_SWF.data = (char*) &waveform[ (i * 340 * NB_WORDS_SWF_BLK) + TIME_OFFSET]; + spw_ioctl_send_SWF.data = (char*) &waveform[ (i * 304 * NB_WORDS_SWF_BLK) + TIME_OFFSET]; #else - spw_ioctl_send_SWF.data = (char*) &waveform[ (i * 340 * NB_WORDS_SWF_BLK) ]; + spw_ioctl_send_SWF.data = (char*) &waveform[ (i * 304 * NB_WORDS_SWF_BLK) ]; #endif spw_ioctl_send_SWF.hdr = (char*) &headerSWF[ i ]; // BUILD THE DATA if (i==6) { - spw_ioctl_send_SWF.dlen = 8 * NB_BYTES_SWF_BLK; + spw_ioctl_send_SWF.dlen = 224 * NB_BYTES_SWF_BLK; } else { - spw_ioctl_send_SWF.dlen = 340 * NB_BYTES_SWF_BLK; + spw_ioctl_send_SWF.dlen = 304 * NB_BYTES_SWF_BLK; } // SET PACKET SEQUENCE COUNTER increment_seq_counter_source_id( headerSWF[ i ].packetSequenceControl, sid ); @@ -722,7 +755,7 @@ int send_waveform_CWF(volatile int *wave headerCWF[ i ].time[4] = (unsigned char) (fineTime>>8); headerCWF[ i ].time[5] = (unsigned char) (fineTime); // SEND PACKET - if (sid == SID_NORM_CWF_F3) + if (sid == SID_NORM_CWF_LONG_F3) { status = rtems_message_queue_send( queue_id, &spw_ioctl_send_CWF, sizeof(spw_ioctl_send_CWF)); if (status != RTEMS_SUCCESSFUL) { @@ -773,7 +806,11 @@ int send_waveform_CWF3_light(volatile in // BUILD CWF3_light DATA for ( i=0; i< 2048; i++) { +#ifdef VHDL_DEV + sample = (char*) &waveform[ (i * NB_WORDS_SWF_BLK) + TIME_OFFSET ]; +#else sample = (char*) &waveform[ i * NB_WORDS_SWF_BLK ]; +#endif 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 ]; @@ -789,11 +826,8 @@ int send_waveform_CWF3_light(volatile in { int coarseTime = 0x00; int fineTime = 0x00; -#ifdef VHDL_DEV - spw_ioctl_send_CWF.data = (char*) &wf_cont_f3_light[ (i * 340 * NB_BYTES_CWF3_LIGHT_BLK) + TIME_OFFSET]; -#else + spw_ioctl_send_CWF.data = (char*) &wf_cont_f3_light[ (i * 340 * NB_BYTES_CWF3_LIGHT_BLK) ]; -#endif spw_ioctl_send_CWF.hdr = (char*) &headerCWF[ i ]; // BUILD THE DATA if ( i == WFRM_INDEX_OF_LAST_PACKET ) { @@ -1026,14 +1060,15 @@ void reset_waveform_picker_regs() */ waveform_picker_regs->data_shaping = 0x01; // 0x00 *** R1 R0 SP1 SP0 BW waveform_picker_regs->run_burst_enable = 0x00; // 0x04 *** [run *** burst f2, f1, f0 *** enable f3, f2, f1, f0 ] - waveform_picker_regs->addr_data_f0 = (int) (wf_snap_f0); // 0x08 + //waveform_picker_regs->addr_data_f0 = (int) (wf_snap_f0); // 0x08 + waveform_picker_regs->addr_data_f0 = current_ring_node_f0->buffer_address; // 0x08 waveform_picker_regs->addr_data_f1 = current_ring_node_f1->buffer_address; // 0x0c waveform_picker_regs->addr_data_f2 = current_ring_node_f2->buffer_address; // 0x10 waveform_picker_regs->addr_data_f3 = (int) (wf_cont_f3_a); // 0x14 waveform_picker_regs->status = 0x00; // 0x18 // waveform_picker_regs->delta_snapshot = 0x12800; // 0x1c 296 * 256 = 75776 - // waveform_picker_regs->delta_snapshot = 0x1000; // 0x1c 16 * 256 = 4096 - waveform_picker_regs->delta_snapshot = 0x2000; // 0x1c 32 * 256 = 8192 + waveform_picker_regs->delta_snapshot = 0x1000; // 0x1c 16 * 256 = 4096 + //waveform_picker_regs->delta_snapshot = 0x2000; // 0x1c 32 * 256 = 8192 waveform_picker_regs->delta_f0 = 0xbf5; // 0x20 *** 1013 waveform_picker_regs->delta_f0_2 = 0x7; // 0x24 *** 7 [7 bits] waveform_picker_regs->delta_f1 = 0xbc0; // 0x28 *** 960 @@ -1109,7 +1144,7 @@ void increment_seq_counter_source_id( un unsigned short new_packet_sequence_control; if ( (sid ==SID_NORM_SWF_F0) || (sid ==SID_NORM_SWF_F1) || (sid ==SID_NORM_SWF_F2) - || (sid ==SID_NORM_CWF_F3) || (sid ==SID_BURST_CWF_F2) ) + || (sid ==SID_NORM_CWF_F3) || (sid==SID_NORM_CWF_LONG_F3) || (sid ==SID_BURST_CWF_F2) ) { sequence_cnt = &sequenceCounters_SCIENCE_NORMAL_BURST; }