// $RCSfile: cmd_seq.c,v $Revision: 1.49 $Date: 2005/03/11 15:08:57 #include "cmd_seq.dox" #include "allnodes.h" #include "node1.h" #include #include "configura.h" #include "hs0.h" #include "pubfuncs.h" #include "hk_ask.h" #include "ls_hdl.h" #include "tables.h" #include "main.h" #include "err_hdl.h" #include "MM_crc.h" #include "cmd_exec.h" #include "hs_lib.h" #include "hs_hdl.h" #include "mem_serv.h" #include "ls.h" #include "cmd_seq.h" //---- Global variables -------------------------------------------------------- // Subsystems status flag structure: // HRS_H_MASK | HRS_V_MASK | WBS_H_MASK | WBS_V_MASK | LCU_MASK | FCU_MASK; unsigned int SubsysStatus; //!< contains information about subsystems status (on/off) unsigned int HK_SubsysStatus; //!< contains information about subsystems to poll in the HK requestes (on/off) unsigned int Active_spectr; //!< on/off status of the four spectrometers coded as required by the IRQ mask register unsigned int LCU_non_interaction; //!< prevents acces to LCU in case of problems //----- local functions -------------------------------------------------------- int TC_acceptance (TC_packet * packet); int check_TC_length(TC_packet * packet); //------------- cmd_seq -------------------------------------------------------- //! task cmd_seq: waits to get a TC packet from the TC_QUEUE, passes it to TC_acceptance(), frees the block void cmd_seq (void) { TC_packet * packet; TC_MSG cmd_message; while (1) { if (KS_FIFOGetW(TC_QUEUE, &cmd_message) != RC_OK) continue; packet = (TC_packet *) cmd_message.block.pointer_to_data; if (TC_acceptance(packet) == RC_FAIL) // acceptance ack { generate_event(EVENT_EVENT_REPORT, RUNTIME_ERROR_EVID, ERR_CMDSEQ_TC_ACCEP, 0, NULL); } release_block((K_BLOCK *) &cmd_message.block); } } //------------- check_TC_length ------------------------------------------------ //! Checks the length of a TC. Returns RC_OK if the length is correct or variable and RC_FAIL otherwise int check_TC_length (TC_packet * packet) { int i; int actual_len; int type, subtype, aid, fid; // extract len from the packet actual_len = packet->chk_len; // number of 16 bit words read by 1553 actual_len = actual_len << 1; // # of bytes read by 1553 (= total TC length expressed in bytes) // TYPE-SUBTYPE EXTRACTION // Subtype is left-aligned (MSB side), rigth half is spare. type = packet->data_field_header[0] & TC_MSK_TYPE; subtype = (packet->data_field_header[1] & TC_MSK_SUBTY)>>8; // check if fid and aid are relevant and extract them in case if ( type == 8 ) // only for type 8 packets aid and fid are relevant { // for type 8 packets aid and fid are relevant fid = (packet->data[TC_FUNACT_IDX])>>8; // MS 8 bits of 16 bit emiword aid = (packet->data[TC_FUNACT_IDX])& 0xFF; // LS 8 bits of 16 bit emiword } else { // for other types packets aid and fid are not applicable fid = 0; aid = 0; } // scan the len matrix searching for the packet for (i = 0; i < DIM_TC_LEN_TAB; i++) { // check pkt type, subt, etc. if ((type == TC_len_tab[i].type) && (subtype == TC_len_tab[i].subtype) && (aid == TC_len_tab[i].aid) && (fid == TC_len_tab[i].fid)) { // packet was found: check the length: if ( actual_len == TC_len_tab[i].len ) return RC_OK; // check passed else { // check not passed int params[2]; params[0] = actual_len; params[1] = TC_len_tab[i].len; enqueue_nok(packet, TC_ACCREP_FAILURE, NOK_CMDSEQ_ILLEGAL_APPLICATION_DATA, 0, NULL); generate_event(EVENT_EVENT_REPORT, RUNTIME_ERROR_EVID, NOK_CMDSEQ_LENGTH_SECOND_CK, 2, params); return RC_FAIL; } } } // packet was not found: accept it return RC_OK; } //------- TC_acceptance -------------------------------------------------------- //! Called by task cmd_seq: checks, interprets and starts execution of TC packets int TC_acceptance (TC_packet * packet) { unsigned int type, subtype, i, crc, packt_len; unsigned int * p_inpackt; // to point to the incoming packet as a sequence of words unsigned int function_ID, activity_ID; unsigned int parameter; p_inpackt = (unsigned int *) packet; packt_len = packet->chk_len; // # of 16 bit words read from 1553 // CRC CHECK: compute crc on the whole packet crc = 0xFFFFFFFF; // Initialize the checksum for(i = 0; i < packt_len - 1; i++) crc = crc16(p_inpackt[i], crc); // Exclude the crc itself if (crc != packet->error_ctrl) { parameter = crc; // pushes a negative TC verification report return (enqueue_nok(packet, TC_ACCREP_FAILURE, NOK_CMDSEQ_INVALID_CRC, 1, ¶meter)); } // PACKET LENGTH CHECK // check the length field against (packet->chk_len << 1), which is the total number of octets received by 1553 if (( packet->packet_length + 1 + 6) != (packet->chk_len << 1)) { parameter = packet->chk_len; // pushes a negative TC verification report return (enqueue_nok(packet, TC_ACCREP_FAILURE, NOK_CMDSEQ_INVALID_LENGTH, 1, (unsigned int *) ¶meter)); } // APID CHECK (a TC packet must always have APID equal to 1024) if ((packet->id & TC_MSK_APID) != TC_APID_OK) { parameter = (packet->id & TC_MSK_APID); // pushes a negative TC verification report return enqueue_nok(packet, TC_ACCREP_FAILURE, NOK_CMDSEQ_ILLEGAL_APID, 1, (unsigned int *) ¶meter); } // TYPE-SUBTYPE EXTRACTION // Subtype is left-aligned (MSB side), rigth half is spare. type = packet->data_field_header[0] & TC_MSK_TYPE; subtype = (packet->data_field_header[1] & TC_MSK_SUBTY)>>8; function_ID = 0; activity_ID = 0; // Second control on TC len: it has to match the len stored by the OBS if ( check_TC_length( packet ) == RC_FAIL ) return RC_FAIL; // execution switch (type) { //==================================================================================================== case TY_MEM_MAN: // Service Type 6, Memory management switch (subtype) { //====================================================================================== case ST_MM_LOAD_MEM: // Subtype 2 (type 6): Load Mem if (enqueue_ok(packet, TC_ACCREP_SUCCESS) == RC_FAIL) return RC_FAIL; // acceptance ack completion_update(packet); // completion management exec_memory_load(packet); break; case ST_MM_DUMP_MEM: // Subtype 5 (type 6): dump Mem if (enqueue_ok(packet, TC_ACCREP_SUCCESS) == RC_FAIL) return RC_FAIL; // acceptance ack forward_TCpacket_to_hs_hdl(packet, START_MEM_DUMP); break; case ST_MM_CHCK_MEM: // Subtype 9 (type 6): check Mem if (enqueue_ok(packet, TC_ACCREP_SUCCESS) == RC_FAIL) return RC_FAIL; // acceptance ack forward_TCpacket_to_hs_hdl(packet, START_MEM_CHECK); break; case ST_MM_ABORT_DUMP_MEM: // Subtype 11 (type 6): abort dump Mem if (enqueue_ok(packet, TC_ACCREP_SUCCESS) == RC_FAIL) return RC_FAIL; // acceptance ack abort_measurement(); break; default: return enqueue_nok(packet, TC_ACCREP_FAILURE, NOK_CMDSEQ_ILLEGAL_PACKET_SUBTYPE, 0, NULL); break; } break; //==================================================================================================== case TY_FUN_MAN: // Service Type 8, Function Management function_ID = (packet->data[TC_FUNACT_IDX])>>8; // MS 8 bits of 16 bit emiword activity_ID = (packet->data[TC_FUNACT_IDX])& 0xFF; // LS 8 bits of 16 bit emiword switch (subtype) { //====================================================================================== case ST_FUN_MAN_STOP_FN: // Subtype 2 (type 8): Stop a Function switch (function_ID) { case TC_FUNMAN_LIMCK_FID: // FID 4: Stop autonomous functioning switch (activity_ID) { case TC_FUNMAN_FCU_CHECK_AID: // AID 5: Stop checking for FCU errors (non responses) if (enqueue_ok(packet, TC_ACCREP_SUCCESS) == RC_FAIL) return RC_FAIL; // acceptance ack hk_switch_FCU_err_count_off(0); // error count off if (enqueue_ok(packet, TC_EXEC_COMPLETED) == RC_FAIL) return RC_FAIL; // completion ack break; case TC_FUNMAN_WBSH_LIMCK_AID: // AID 1 case TC_FUNMAN_WBSV_LIMCK_AID: // AID 2 case TC_FUNMAN_HTRH_LIMCK_AID: // AID 3 case TC_FUNMAN_HTRV_LIMCK_AID: // AID 4 case TC_FUNMAN_LCU_T_LIMCK_AID: // AID 6 case TC_FUNMAN_LCU_NONRESP_AID: // AID 7 case TC_FUNMAN_LCU_MODE_AID: // AID 8 case TC_FUNMAN_LCU_MEMCHK_AID: // AID 9 if (enqueue_ok(packet, TC_ACCREP_SUCCESS) == RC_FAIL) return RC_FAIL; // acceptance ack hk_switch_limit_check_off(activity_ID); // limit check off if (enqueue_ok(packet, TC_EXEC_COMPLETED) == RC_FAIL) return RC_FAIL; // completion ack break; default: // error: invalid AID parameter = packet->data[TC_FUNACT_IDX]; return enqueue_nok(packet, TC_ACCREP_FAILURE, NOK_CMDSEQ_ILLEGAL_APPLICATION_DATA, 1, ¶meter); break; } break; //--------------------------------------------------------- case TC_FUNMAN_HK_FID: // FID 3 switch (activity_ID) { case TC_FUNMAN_PER_HK_AID: // AID 1: Housekeeping Off if (enqueue_ok(packet, TC_ACCREP_SUCCESS) == RC_FAIL) return RC_FAIL; // acceptance ack abort_measurement(); // stops all activities on board, VM included Hk_enable = FALSE; if (enqueue_ok(packet, TC_EXEC_COMPLETED) == RC_FAIL) return RC_FAIL; // completion ack break; default: // error: invalid AID parameter = packet->data[TC_FUNACT_IDX]; return enqueue_nok(packet, TC_ACCREP_FAILURE, NOK_CMDSEQ_ILLEGAL_APPLICATION_DATA, 1, ¶meter); break; } break; //--------------------------------------------------------- case TC_FUNMAN_ABRT_SP_FID: // FID 11: abort spectroscopy switch (activity_ID) { case TC_FUNMAN_SBRT_SP_AID: // AID 0 if (enqueue_ok(packet, TC_ACCREP_SUCCESS) == RC_FAIL) return RC_FAIL; // acceptance ack abort_measurement(); if (enqueue_ok(packet, TC_EXEC_COMPLETED) == RC_FAIL) return RC_FAIL; // completion ack break; default: // error: invalid AID parameter = packet->data[TC_FUNACT_IDX]; return enqueue_nok(packet, TC_ACCREP_FAILURE, NOK_CMDSEQ_ILLEGAL_APPLICATION_DATA, 1, ¶meter); break; } break; //--------------------------------------------------------- default: // error: invalid FID parameter = packet->data[TC_FUNACT_IDX]; return enqueue_nok(packet, TC_ACCREP_FAILURE, NOK_CMDSEQ_ILLEGAL_APPLICATION_DATA, 1, ¶meter); break; } // end of FID switch in type 8 (funct man), subtype 2 (stopping funct) break; //====================================================================================== case ST_FUN_MAN_PERF_AC: // Subtype 4 (type 8): Performing an activity of a function switch (function_ID) { //--------------------------------------------------------- case TC_FUNMAN_GOTOSAFE_FID: // FID 17, type (8,4): Goto safe if (enqueue_ok(packet, TC_ACCREP_SUCCESS) == RC_FAIL) return RC_FAIL; // acceptance ack forward_TCpacket_to_hs_hdl(packet, START_GOTO_SAFE); break; //--------------------------------------------------------- case TC_FUNMAN_NOOP_FID: // FID 18, type (8,4): Noop if (enqueue_ok(packet, TC_ACCREP_SUCCESS) == RC_FAIL) return RC_FAIL; // acceptance ack if (enqueue_ok(packet, TC_EXEC_COMPLETED) == RC_FAIL) return RC_FAIL; // completion ack break; //--------------------------------------------------------- case TC_FUNMAN_CLEAR_LCU_COMM_LOCK_FID: // FID 25, type (8,4): reset LCU_non_interaction if (enqueue_ok(packet, TC_ACCREP_SUCCESS) == RC_FAIL) return RC_FAIL; // acceptance ack LCU_non_interaction = 0; if (enqueue_ok(packet, TC_EXEC_COMPLETED) == RC_FAIL) return RC_FAIL; // completion ack break; //--------------------------------------------------------- case TC_FUNMAN_LIMCK_FID: // FID 4, type (8,4): Activate limit check autonomous functioning switch (activity_ID) { case TC_FUNMAN_FCU_CHECK_AID: // AID 5: activate checking for FCU errors (non responses) { if (enqueue_ok(packet, TC_ACCREP_SUCCESS) == RC_FAIL) return RC_FAIL; // acceptance ack hk_switch_FCU_err_count_on(packet); // switch error count on if (enqueue_ok(packet, TC_EXEC_COMPLETED) == RC_FAIL) return RC_FAIL; // completion ack break; } case TC_FUNMAN_WBSH_LIMCK_AID: // AID 1 case TC_FUNMAN_WBSV_LIMCK_AID: // AID 2 case TC_FUNMAN_HTRH_LIMCK_AID: // AID 3 case TC_FUNMAN_HTRV_LIMCK_AID: // AID 4 case TC_FUNMAN_LCU_T_LIMCK_AID: // AID 6 case TC_FUNMAN_LCU_NONRESP_AID: // AID 7 case TC_FUNMAN_LCU_MODE_AID: // AID 8 case TC_FUNMAN_LCU_MEMCHK_AID: // AID 9 { if (enqueue_ok(packet, TC_ACCREP_SUCCESS) == RC_FAIL) return RC_FAIL; // acceptance ack hk_switch_limit_check_on(packet); // switch limit checking on if (enqueue_ok(packet, TC_EXEC_COMPLETED) == RC_FAIL) return RC_FAIL; // completion ack break; } default: // error: invalid AID parameter = packet->data[TC_FUNACT_IDX]; return enqueue_nok(packet, TC_ACCREP_FAILURE, NOK_CMDSEQ_ILLEGAL_APPLICATION_DATA, 1, ¶meter); break; } break; //--------------------------------------------------------- case TC_FUNMAN_OBSID_FID: // FID 1, type (8,4) : set observation ID switch (activity_ID) { case TC_FUNMAN_OBSID_AID: // AID 0 if (enqueue_ok(packet, TC_ACCREP_SUCCESS) == RC_FAIL) return RC_FAIL; // acceptance ack obs_ident(packet); if (enqueue_ok(packet, TC_EXEC_COMPLETED) == RC_FAIL) return RC_FAIL; // completion ack break; default: // error: invalid AID parameter = packet->data[TC_FUNACT_IDX]; return enqueue_nok(packet, TC_ACCREP_FAILURE, NOK_CMDSEQ_ILLEGAL_APPLICATION_DATA, 1, ¶meter); break; } break; //--------------------------------------------------------- case TC_FUNMAN_INSTA_FID: // FID 2, type (8,4) : Instrument Status (Notify PDU status) switch (activity_ID) { case TC_FUNMAN_INSTA_AID: // AID 0 if (enqueue_ok(packet, TC_ACCREP_SUCCESS) == RC_FAIL) return RC_FAIL; // acceptance ack instrument_status(packet); if (enqueue_ok(packet, TC_EXEC_COMPLETED) == RC_FAIL) return RC_FAIL; // completion ack break; default: // error: invalid AID parameter = packet->data[TC_FUNACT_IDX]; return enqueue_nok(packet, TC_ACCREP_FAILURE, NOK_CMDSEQ_ILLEGAL_APPLICATION_DATA, 1, ¶meter); break; } break; //----------------------------------------------------------------- case TC_FUNMAN_HK_FID: // FID 3, type (8,4): HK stuff switch (activity_ID) { case TC_FUNMAN_PER_HK_AID: // AID 1 : set hk rate if (enqueue_ok(packet, TC_ACCREP_SUCCESS) == RC_FAIL) return RC_FAIL; // acceptance ack set_hk_rate(packet); break; case TC_FCU_NONPER_HK_AID: // AID 2 : FCU non periodic hk if (enqueue_ok(packet, TC_ACCREP_SUCCESS) == RC_FAIL) return RC_FAIL; // acceptance ack forward_TCpacket_to_ls_hdl(packet, START_SINGLE_HK); break; case TC_LCU_NONPER_HK_AID: // AID 3 : LCU non periodic hk if (enqueue_ok(packet, TC_ACCREP_SUCCESS) == RC_FAIL) return RC_FAIL; // acceptance ack forward_TCpacket_to_ls_hdl(packet, START_SINGLE_HK_LCU); break; case TC_LCU_NONPER_MEM_HK_AID: // AID 4 : LCU non periodic hk for memory dump if (enqueue_ok(packet, TC_ACCREP_SUCCESS) == RC_FAIL) return RC_FAIL; // acceptance ack forward_TCpacket_to_ls_hdl(packet, START_MEM_HK_LCU); break; case TC_LCU_VERIFY_CRC_AID: // AID 5 : LCU verify crc if (enqueue_ok(packet, TC_ACCREP_SUCCESS) == RC_FAIL) return RC_FAIL; // acceptance ack forward_TCpacket_to_ls_hdl(packet, START_VERIFY_LCU); break; case TC_LCU_VERIFY_CRC_MEMPART_AID: // AID 6 : LCU verify crc if (enqueue_ok(packet, TC_ACCREP_SUCCESS) == RC_FAIL) return RC_FAIL; // acceptance ack forward_TCpacket_to_ls_hdl(packet, START_VERIFY_LCU_CHUNK); break; default: // error: invalid AID parameter = packet->data[TC_FUNACT_IDX]; return enqueue_nok(packet, TC_ACCREP_FAILURE, NOK_CMDSEQ_ILLEGAL_APPLICATION_DATA, 1, ¶meter); break; } break; //------------------------------------------------------------------------- case TC_FUNMAN_TUNE_FID: // FID 9, type (8,4) switch (activity_ID) { case TC_FUNMAN_TUNHRS_AID: // AID 1 : tune HRS if (enqueue_ok(packet, TC_ACCREP_SUCCESS) == RC_FAIL) return RC_FAIL; // acceptance ack forward_TCpacket_to_hs_hdl(packet, START_HRS_TUNING); break; case TC_FUNMAN_TUNWBS_AID: // AID 2 : tune WBS if (enqueue_ok(packet, TC_ACCREP_SUCCESS) == RC_FAIL) return RC_FAIL; // acceptance ack forward_TCpacket_to_hs_hdl(packet, START_WBS_TUNING); break; case TC_FUNMAN_MXMAGHRS_AID: // AID 3 : tune mixer magnet hrs if (enqueue_ok(packet, TC_ACCREP_SUCCESS) == RC_FAIL) return RC_FAIL; // acceptance ack forward_TCpacket_to_hs_hdl(packet, START_HRS_MIXMAG); break; case TC_FUNMAN_MXMAGWBS_AID: // AID 4 : tune mixer magnet wbs if (enqueue_ok(packet, TC_ACCREP_SUCCESS) == RC_FAIL) return RC_FAIL; // acceptance ack forward_TCpacket_to_hs_hdl(packet, START_WBS_MIXMAG); break; default: // error: invalid AID parameter = packet->data[TC_FUNACT_IDX]; return enqueue_nok(packet, TC_ACCREP_FAILURE, NOK_CMDSEQ_ILLEGAL_APPLICATION_DATA, 1, ¶meter); break; } break; //------------------------------------------------------------------------- case TC_FUNMAN_CALIB_FID: // FID 10, type (8,4) switch (activity_ID) { case TC_FUNMAN_WBSCOMB_AID: // AID 2 : WBS calibration if (enqueue_ok(packet, TC_ACCREP_SUCCESS) == RC_FAIL) return RC_FAIL; // acceptance ack forward_TCpacket_to_hs_hdl(packet, START_SPECTR_WBS_COMB_ID); break; case TC_FUNMAN_WBSZERO_AID: // AID 3 : WBS zero measurement if (enqueue_ok(packet, TC_ACCREP_SUCCESS) == RC_FAIL) return RC_FAIL; // acceptance ack forward_TCpacket_to_hs_hdl(packet, START_SPECTR_WBS_ZERO_ID); break; case TC_FUNMAN_HRS_FUNCTEST_AID: // AID 4 : HRS functional test if (enqueue_ok(packet, TC_ACCREP_SUCCESS) == RC_FAIL) return RC_FAIL; // acceptance ack forward_TCpacket_to_hs_hdl(packet, START_HRS_FUNCTEST); break; case TC_FUNMAN_NEW_WBSCOMB_AID: // AID 5 : new WBS calibration if (enqueue_ok(packet, TC_ACCREP_SUCCESS) == RC_FAIL) return RC_FAIL; // acceptance ack forward_TCpacket_to_hs_hdl(packet, START_NEW_CALIB_INIT); break; default: // error: invalid AID parameter = packet->data[TC_FUNACT_IDX]; return enqueue_nok(packet, TC_ACCREP_FAILURE, NOK_CMDSEQ_ILLEGAL_APPLICATION_DATA, 1, ¶meter); break; } break; //------------------------------------------------------------------------- case TC_FUNMAN_PARSCAN_FID: // FID 7, type (8,4): parameter scan switch (activity_ID) { case TC_FUNMAN_PARSCAN_AID: // AID 1: FCU parameter scan if (enqueue_ok(packet, TC_ACCREP_SUCCESS) == RC_FAIL) return RC_FAIL; // acceptance ack forward_TCpacket_to_ls_hdl(packet, START_FCU_PARAM_SCAN); break; case TC_FUNMAN_DIPSCAN_NOIF_AID: // AID 2: diplexer scan without if power if (enqueue_ok(packet, TC_ACCREP_SUCCESS) == RC_FAIL) return RC_FAIL; // acceptance ack forward_TCpacket_to_ls_hdl(packet, START_DIP_SCAN_NOIF); break; case TC_FUNMAN_DIPSCAN_IF_AID: // AID 3: diplexer scan with if power if (enqueue_ok(packet, TC_ACCREP_SUCCESS) == RC_FAIL) return RC_FAIL; // acceptance ack forward_TCpacket_to_hs_hdl(packet, START_DIPSCAN_IFP); break; case TC_FUNMAN_ENGSCAN_IF_AID: // AID 4: engineering scan if (enqueue_ok(packet, TC_ACCREP_SUCCESS) == RC_FAIL) return RC_FAIL; // acceptance ack forward_TCpacket_to_hs_hdl(packet, START_ENGSCAN_ROUTINE); break; default: // error: invalid AID parameter = packet->data[TC_FUNACT_IDX]; return enqueue_nok(packet, TC_ACCREP_FAILURE, NOK_CMDSEQ_ILLEGAL_APPLICATION_DATA, 1, ¶meter); break; } break; //------------------------------------------------------------------------- case TC_FUNMAN_CFSSYS_NEW_FID: // FID 12, type (8,4): Configure SS and Single commands switch (activity_ID) { case TC_FUNMAN_CFFCU_AID: // AID 1, Configure FCU case TC_FUNMAN_CFFCU_POWER_AID: // AID 11, Configure FCU Power case TC_FUNMAN_CFHRS_H_AID: // AID 7, Configure HRS-H att lo case TC_FUNMAN_CFHRS_H_BL_AID: // AID 8, Configure HRS-H blocks case TC_FUNMAN_CFHRS_V_AID: // AID 9, Configure HRS-V att lo case TC_FUNMAN_CFHRS_V_BL_AID: // AID 10, Configure HRS-V blocks case TC_FUNMAN_CFWBS_H_AID: // AID 4, Configure WBS-H case TC_FUNMAN_CFWBS_V_AID: // AID 5, Configure WBS-V case TC_FUNMAN_CFLCU_1A_AID: // AID 12, Configure LCU1a case TC_FUNMAN_CFLCU_1B_AID: // AID 13, Configure LCU1b case TC_FUNMAN_CFLCU_2A_AID: // AID 14, Configure LCU2a case TC_FUNMAN_CFLCU_2B_AID: // AID 15, Configure LCU2b case TC_FUNMAN_CFLCU_3A_AID: // AID 16, Configure LCU3a case TC_FUNMAN_CFLCU_3B_AID: // AID 17, Configure LCU3b case TC_FUNMAN_CFLCU_4A_AID: // AID 18, Configure LCU4a case TC_FUNMAN_CFLCU_4B_AID: // AID 19, Configure LCU4b case TC_FUNMAN_CFLCU_5A_AID: // AID 20, Configure LCU5a case TC_FUNMAN_CFLCU_5B_AID: // AID 21, Configure LCU5b case TC_FUNMAN_CFLCU_6A_AID: // AID 22, Configure LCU6a case TC_FUNMAN_CFLCU_6B_AID: // AID 23, Configure LCU6b case TC_FUNMAN_CFLCU_7A_AID: // AID 24, Configure LCU7a case TC_FUNMAN_CFLCU_7B_AID: // AID 25, Configure LCU7b case TC_FUNMAN_CFLCU_NOMIN_AID: // AID 30, Configure LCU nominal case TC_FUNMAN_CFLCU_DIAGN_AID: // AID 31, Configure LCU diagnostic case TC_FUNMAN_CFLCU_TABLES_AID: // AID 32, Configure LCU tables case TC_FUNMAN_CFFCU_RESTR_AID: // AID 33, Restricted Configure FCU if (enqueue_ok(packet, TC_ACCREP_SUCCESS) == RC_FAIL) return RC_FAIL; // acceptance ack if (configure_ss(packet) == RC_OK) if (enqueue_ok(packet, TC_EXEC_COMPLETED) == RC_FAIL) return RC_FAIL; // completion ack break; case TC_FUNMAN_SINGLEC_AID: // AID 26: various single command case TC_FUNMAN_SET_CH1_DHTR_AID: // AID 27 case TC_FUNMAN_SET_CV1_DHTR_AID: // AID 28 case TC_FUNMAN_HL_SWITCH_ON_AID: // AID 29 if (enqueue_ok(packet, TC_ACCREP_SUCCESS) == RC_FAIL) return RC_FAIL; // acceptance ack return send_single_command(packet); break; default: // error: invalid AID parameter = packet->data[TC_FUNACT_IDX]; return enqueue_nok(packet, TC_ACCREP_FAILURE, NOK_CMDSEQ_ILLEGAL_APPLICATION_DATA, 1, ¶meter); break; } break; //------------------------------------------------------------------------- case TC_FUNMAN_PEAKUP_FID: // FID 13, type (8,4): Peakup Procedure switch (activity_ID) { case TC_FUNMAN_CONFIGURE_PEAKUP_AID: // AID 1: Configure Peakup if (enqueue_ok(packet, TC_ACCREP_SUCCESS) == RC_FAIL) return RC_FAIL; // acceptance ack configure_peakup_function(packet); // Note: execution succes or failure is handled within configure_peakup_function() break; case TC_FUNMAN_ACQUIRE_PEAKUP_HRS_AID: // AID 2: Acquire Peakup HRS if (enqueue_ok(packet, TC_ACCREP_SUCCESS) == RC_FAIL) return RC_FAIL; // acceptance ack forward_TCpacket_to_hs_hdl(packet, ACQUIRE_PEAKUP_HRS); break; case TC_FUNMAN_ACQUIRE_PEAKUP_WBS_AID: // AID 3: Acquire Peakup WBS if (enqueue_ok(packet, TC_ACCREP_SUCCESS) == RC_FAIL) return RC_FAIL; // acceptance ack forward_TCpacket_to_hs_hdl(packet, ACQUIRE_PEAKUP_WBS); break; case TC_FUNMAN_CORRECTION_AOCS_AID: // AID 5: Peakup Correction AOCS if (enqueue_ok(packet, TC_ACCREP_SUCCESS) == RC_FAIL) { generate_peak_up_event(0, 0); // peakup event must always be generated return RC_FAIL; // acceptance ack } peakup_aocs_correction(packet); // generate peakup correction break; default: // error: invalid AID parameter = packet->data[TC_FUNACT_IDX]; return enqueue_nok(packet, TC_ACCREP_FAILURE, NOK_CMDSEQ_ILLEGAL_APPLICATION_DATA, 1, ¶meter); break; } break; //------------------------------------------------------------------------- case TC_FUNMAN_LCU_FID: // FID 8, type (8,4): Local oscillator switch (activity_ID) { case TC_FUNMAN_LOAD_VEC_SCAN_AID: // AID 1: Load vector scan return enqueue_nok(packet, TC_ACCREP_FAILURE, NOK_CMDSEQ_OBSOLETE_AID, 0, NULL); break; case TC_FUNMAN_LOAD_VEC_SCAN_NOM_AID: // AID 5: Load vector scan nominal case TC_FUNMAN_LOAD_VEC_SCAN_DIAG_AID: // AID 6: Load vector scan diagnostic if (enqueue_ok(packet, TC_ACCREP_SUCCESS) == RC_FAIL) return RC_FAIL; // acceptance ack forward_TCpacket_to_ls_hdl(packet, LOAD_VEC_SCAN_CMD); break; case TC_FUNMAN_VEC_SCAN_AID: // AID 2: Vector scan if (enqueue_ok(packet, TC_ACCREP_SUCCESS) == RC_FAIL) return RC_FAIL; // acceptance ack forward_TCpacket_to_ls_hdl(packet, VEC_SCAN_CMD); break; case TC_FUNMAN_TUNE_LO_MXCH_AID: // AID 3: Lo tuning use H if (enqueue_ok(packet, TC_ACCREP_SUCCESS) == RC_FAIL) return RC_FAIL; // acceptance ack forward_TCpacket_to_ls_hdl(packet, LO_TUNE_H_CMD); break; case TC_FUNMAN_TUNE_LO_MXCV_AID: // AID 4: Lo tuning use V if (enqueue_ok(packet, TC_ACCREP_SUCCESS) == RC_FAIL) return RC_FAIL; // acceptance ack forward_TCpacket_to_ls_hdl(packet, LO_TUNE_V_CMD); break; case TC_FUNMAN_RETUNE_LO_AID: // AID 7: Lo tuning using saved results { int ret_code; if (enqueue_ok(packet, TC_ACCREP_SUCCESS) == RC_FAIL) return RC_FAIL; // acceptance ack ret_code = exec_LO_retune(packet); switch(ret_code) { case RC_OK: if (enqueue_ok(packet, TC_EXEC_COMPLETED) == RC_FAIL) return RC_FAIL; // completion ack break; case EXF_LS_HDL_VSCAN_SYSOFF: case EXF_LS_HDL_LAST_INVALID: case EXF_LS_HDL_ERROR_LS_HP_QUEUE: if (enqueue_nok(packet, TC_EXEC_FAILURE, ret_code, 0, NULL) == RC_FAIL) return RC_FAIL; // completion n-ack break; default: if (enqueue_nok(packet, TC_EXEC_FAILURE, EXF_CMDSEQ_UNKNOWN_ERROR, 0, NULL) == RC_FAIL) return RC_FAIL; // completion n-ack break; } break; } default: // error: invalid AID parameter = packet->data[TC_FUNACT_IDX]; return enqueue_nok(packet, TC_ACCREP_FAILURE, NOK_CMDSEQ_ILLEGAL_APPLICATION_DATA, 1, ¶meter); break; } break; //------------------------------------------------------------------------- case TC_FUNMAN_LCUIV_FID: // FID 15, type (8,4): Measure LCU IV curve switch (activity_ID) { case TC_FUNMAN_LCUIV_AID: // AID 1: LCU IV curve if (enqueue_ok(packet, TC_ACCREP_SUCCESS) == RC_FAIL) return RC_FAIL; // acceptance ack forward_TCpacket_to_ls_hdl(packet, LCU_IVCURVE_ID); break; default: // error: invalid AID parameter = packet->data[TC_FUNACT_IDX]; return enqueue_nok(packet, TC_ACCREP_FAILURE, NOK_CMDSEQ_ILLEGAL_APPLICATION_DATA, 1, ¶meter); break; } break; //------------------------------------------------------------------------- case TC_FUNMAN_SPECTSPY_FID: // FID 11, type (8,4): spectroscopy switch (activity_ID) { case TC_FUNMAN_CFSPCTR_NEW_AID: // AID 17 : configure spectroscopy if (configure_spectroscopy(packet) == RC_OK) if (enqueue_ok(packet, TC_EXEC_COMPLETED) == RC_FAIL) return RC_FAIL; // completion ack; break; case TC_FUNMAN_SPCTRTP_AID: // AID 1 : spect total power if (enqueue_ok(packet, TC_ACCREP_SUCCESS) == RC_FAIL) return RC_FAIL; // acceptance ack forward_TCpacket_to_hs_hdl(packet, START_TOTAL_POWER); break; case TC_FUNMAN_SPCTRSC_AID: // AID 3 : slow chop if (enqueue_ok(packet, TC_ACCREP_SUCCESS) == RC_FAIL) return RC_FAIL; // acceptance ack forward_TCpacket_to_hs_hdl(packet, START_SLOW_CHOP); break; case TC_FUNMAN_SPCTRFS_AID: // AID 4 : freq switch if (enqueue_ok(packet, TC_ACCREP_SUCCESS) == RC_FAIL) return RC_FAIL; // acceptance ack forward_TCpacket_to_hs_hdl(packet, START_FREQ_SWITCH); break; case TC_FUNMAN_SPCTRFC_AID: // AID 2 : fast chop if (enqueue_ok(packet, TC_ACCREP_SUCCESS) == RC_FAIL) return RC_FAIL; // acceptance ack forward_TCpacket_to_hs_hdl(packet, START_FAST_CHOP); break; default: // error: invalid AID parameter = packet->data[TC_FUNACT_IDX]; return enqueue_nok(packet, TC_ACCREP_FAILURE, NOK_CMDSEQ_ILLEGAL_APPLICATION_DATA, 1, ¶meter); break; } break; //------------------------------------------------------------------------- case TC_FUNMAN_IFUNCT_FID: // FID 16, type (8,4): "Internal activity" switch (activity_ID) { case TC_FUNMAN_IFUNVM_AID: // AID 1: start VM if (enqueue_ok(packet, TC_ACCREP_SUCCESS) == RC_FAIL) return RC_FAIL; // acceptance ack forward_TCpacket_to_hs_hdl(packet, START_VM_PROGRAM); break; case TC_FUNMAN_SIM_PEAKUP_REQ_AID: // AID 126: Simulate Peakup Request if (enqueue_ok(packet, TC_ACCREP_SUCCESS) == RC_FAIL) { generate_peak_up_event(0, 0); // peakup event must always be generated return RC_FAIL; // acceptance ack } peakup_simulate_aocs_corr(packet); // generate a dummy peakup event break; case TC_FUNMAN_SPCTRSM_AID: // AID 127: Simulated Spectroscopy (on or off) if (enqueue_ok(packet, TC_ACCREP_SUCCESS) == RC_FAIL) return RC_FAIL; // acceptance ack forward_TCpacket_to_hs_hdl(packet, START_SIM_SCI); break; case TC_FUNMAN_EEPROM_AID: // AID 2: EEPROM WRITE if (enqueue_ok(packet, TC_ACCREP_SUCCESS) == RC_FAIL) return RC_FAIL; // acceptance ack forward_TCpacket_to_hs_hdl(packet, START_EEPROM_WRITE); break; case TC_FUNMAN_ICURESET_AID: // AID 3: warm reset of the DPU case TC_FUNMAN_CALL_BOOT_AID: // AID 4: reset and jump to boot SW to load new image if (enqueue_ok(packet, TC_ACCREP_SUCCESS) == RC_FAIL) return RC_FAIL; // acceptance ack reset_function(activity_ID); break; case TC_FUNMAN_CHCK_PM_AID: // AID 5: check program memory if (enqueue_ok(packet, TC_ACCREP_SUCCESS) == RC_FAIL) return RC_FAIL; // acceptance ack forward_TCpacket_to_hs_hdl(packet, START_CHECK_PM); break; case TC_FUNMAN_COPY_OBS_AID: // AID 6: copy obs image if (enqueue_ok(packet, TC_ACCREP_SUCCESS) == RC_FAIL) return RC_FAIL; // acceptance ack forward_TCpacket_to_hs_hdl(packet, START_COPY_OBS); break; case TC_FUNMAN_VM_UPLOAD_AID: // AID 7: Upload VM code if (enqueue_ok(packet, TC_ACCREP_SUCCESS) == RC_FAIL) return RC_FAIL; // acceptance ack forward_TCpacket_to_hs_hdl(packet, VM_CODE_UPLOAD); break; default: // error: invalid AID parameter = packet->data[TC_FUNACT_IDX]; return enqueue_nok(packet, TC_ACCREP_FAILURE, NOK_CMDSEQ_ILLEGAL_APPLICATION_DATA, 1, ¶meter); break; } // end of AID switch in FID 16, type (8,4) break; //------------------------------------------------------------------------- default: // error: invalid FID parameter = packet->data[TC_FUNACT_IDX]; return enqueue_nok(packet, TC_ACCREP_FAILURE, NOK_CMDSEQ_ILLEGAL_APPLICATION_DATA, 1, ¶meter); break; } // End of FID switch in (type 8, subtype 4) break; //====================================================================================== default: // error: invalid subtype parameter = PACK8(type, subtype); return enqueue_nok(packet, TC_ACCREP_FAILURE, NOK_CMDSEQ_ILLEGAL_PACKET_SUBTYPE, 1, ¶meter); break; } // End of subtype switch in Type 8 (function management) break; //==================================================================================================== case TY_TIM_MAN: // Type 9: Time Management switch (subtype) { case ST_TIM_MAN_TIME_VERI: // subtype 7: enable time verification if (enqueue_ok(packet, TC_ACCREP_SUCCESS) == RC_FAIL) return RC_FAIL; // acceptance ack if (enable_time_verification(packet) == RC_OK) enqueue_ok(packet, TC_EXEC_COMPLETED); // completion ack break; default: // error: invalid subtype parameter = PACK8(type, subtype); return enqueue_nok(packet, TC_ACCREP_FAILURE, NOK_CMDSEQ_ILLEGAL_PACKET_SUBTYPE, 1, ¶meter); break; } break; //==================================================================================================== case TY_PKT_TRA: // Type 14, Packet Transmission Control switch (subtype) { case ST_PKT_TRA_ENA: // subtype 1, Enable TM transmission if (enqueue_ok(packet, TC_ACCREP_SUCCESS) == RC_FAIL) return RC_FAIL; // acceptance ack pkt_enable(packet, 1); break; case ST_PKT_TRA_DIS: // subtype 2, Disable TM transmission if (enqueue_ok(packet, TC_ACCREP_SUCCESS) == RC_FAIL) return RC_FAIL; // acceptance ack pkt_enable(packet, 0); break; case ST_PKT_TRA_REP: // subtype 3, Report enabled transmission if (enqueue_ok(packet, TC_ACCREP_SUCCESS) == RC_FAIL) return RC_FAIL; // acceptance ack if (pkt_enable_report(packet) == RC_OK) enqueue_ok(packet, TC_EXEC_COMPLETED); // completion ack break; default: // error : invalid subtype parameter = PACK8(type, subtype); return enqueue_nok(packet, TC_ACCREP_FAILURE, NOK_CMDSEQ_ILLEGAL_PACKET_SUBTYPE, 1, ¶meter); // accept failure break; } // End of subtype switch in type 14 (packet transmission control) break; //============================================================================== case TY_TST_CMD: // Type 17, Test Service switch (subtype) { case ST_TST_CMD_PCT: // subtype 1: connection test if (enqueue_ok(packet, TC_ACCREP_SUCCESS) == RC_FAIL) return RC_FAIL; // acceptance ack if (perform_connection_test(packet) == RC_OK) enqueue_ok(packet, TC_EXEC_COMPLETED); // completion ack break; default: // error : invalid subtype parameter = PACK8(type, subtype); return enqueue_nok(packet, TC_ACCREP_FAILURE, NOK_CMDSEQ_ILLEGAL_PACKET_SUBTYPE, 1, ¶meter); // accept failure break; } break; //============================================================================= default: // error : invalid type parameter = PACK8(type, subtype); return enqueue_nok(packet, TC_ACCREP_FAILURE, NOK_CMDSEQ_ILLEGAL_PACKET_TYPE, 1, ¶meter); // accept failure break; } // end of switch on type return RC_OK; }