//2018.05.10 /******************************************************************************* * モジュール名称 :アプリケーション05 - Background Task - MEA * * モジュールラベル :app05_MEA * * タスク区分 :アプリケーションタスク * * 機能 : * * コーリングシーケンス:void app05_MEA * * 戻り値 :void * * 使用上の注意 :なし * * エラー処理 :なし * * 注意 :EDIT権限は、MPPE組 * * 作成日・作成者 :2018/05/18 Y.K. * ********************************************************************************/ #include "app_common.h" #include "app_MPPE-MIA.h" #include "app_MPPE-MEA.h" int app05_MEA_TlmDump( unsigned char, unsigned char, unsigned char, unsigned int, unsigned int, unsigned char); char app05_MEA_makeH(unsigned char, unsigned short*, unsigned short*); int app05_MEA1 ( unsigned int ui_TIstart, // [INPUT] TI - Dump Start (0x00000000:OLDEST 0xFFFFFFFF:LATEST) unsigned int ui_TIlen, // [INPUT] TI - Dump Length (0x0000: 1 Packet 0x0001: 1 Block 0xFFFF: All) unsigned char uc_drID ) // [INPUT] DR-ID (0:CAL etc 1-5:Sync Trigger) { int i_flag; unsigned char uc_nodeId = Gd_N_MEA1; // Node-ID: MEA1 unsigned char uc_dataId = 0; // Data-ID: MEA1 unsigned char uc_headId = Gd_N_MEA1; // Head-ID: MEA1 i_flag = app05_MEA_TlmDump( uc_nodeId, // [INPUT] Node-ID uc_dataId, // [INPUT] Data-ID uc_headId, // [INPUT] Head-ID ui_TIstart, // [INPUT] TI - Dump Start (0x00000000:OLDEST 0xFFFFFFFF:LATEST) ui_TIlen, // [INPUT] TI - Dump Length (0x0000: 1 Packet 0x0001: 1 Block 0xFFFF: All) uc_drID); // [INPUT] DR ID (0:CAL etc 1-5:Sync Trigger) return i_flag; //1: Ok; 0: No data } int app05_MEA2 ( unsigned int ui_TIstart, // [INPUT] TI - Dump Start (0x00000000:OLDEST 0xFFFFFFFF:LATEST) unsigned int ui_TIlen, // [INPUT] TI - Dump Length (0x0000: 1 Packet 0x0001: 1 Block 0xFFFF: All) unsigned char uc_drID ) // [INPUT] DR-ID (0:CAL etc 1-5:Sync Trigger) { int i_flag; unsigned char uc_nodeId = Gd_N_MEA2; // Node-ID: MEA2 unsigned char uc_dataId = 0; // Data-ID: MEA2 unsigned char uc_headId = Gd_N_MEA2; // Head-ID: MEA2 i_flag = app05_MEA_TlmDump( uc_nodeId, // [INPUT] Node-ID uc_dataId, // [INPUT] Data-ID uc_headId, // [INPUT] Head-ID ui_TIstart, // [INPUT] TI - Dump Start (0x00000000:OLDEST 0xFFFFFFFF:LATEST) ui_TIlen, // [INPUT] TI - Dump Length (0x0000: 1 Packet 0x0001: 1 Block 0xFFFF: All) uc_drID); // [INPUT] DR ID (0:CAL etc 1-5:Sync Trigger) return i_flag; //1: Ok; 0: No data } int app05_MEA_TlmDump( unsigned char uc_nodeId, // [INPUT] Node-ID unsigned char uc_dataId, // [INPUT] Data-ID unsigned char uc_headId, // [INPUT] Head-ID unsigned int ui_TIstart, // [INPUT] TI - Dump Start (0x00000000:OLDEST 0xFFFFFFFF:LATEST) unsigned int ui_TIlen, // [INPUT] TI - Dump Length (0x0000: 1 Packet 0x0001: 1 Block 0xFFFF: All) unsigned char uc_drID) // [INPUT] DR ID 0:CAL etc 1-5:Sync Trigger { // === BLOCK read === int i_numNewBlock; // Num of blocks with new data M_T_BLOCK_INFO t_blockInfo; // unsigned int ui_createTime Block 生成開始時衛星時刻(1LSB=31,25ms) // int i_replyNum Block 登録Read-Reply個数 // char c_invalidFlg Block 内データ異常 [0:異常なし 1:異常あり] // unsigned int ui_blockIndex LongBuffer/ShortBuffer 内Block特定番号 (先頭Block:0) //int i_sizeBlk, i_sizePac, i_numPac; int i, j, n; int i_flag, i_rmap_hdr; unsigned int ui_TIend; unsigned int ui_TI; //unsigned char uc_mode; //Mode番号 //unsigned char uc_64nm; //64Mode番号 unsigned char uc_pckt; //パケット番号 unsigned char uc_en_mode; //エネルギーモード: 2(32en x 16sc), 4(64en x 16sc)のみに対応 unsigned char uc_find_pac1; //パケット番号1の検出フラグ int i_ProNum; struct _s_MEA_CtrlParam *pCtrl; //制御用のフラグ及びパラメータ MEA1or2 if (uc_nodeId == Gd_N_MEA1) pCtrl = &Gst_MEA1_ctrl; else pCtrl = &Gst_MEA2_ctrl; uc_find_pac1 = FALSE; i_rmap_hdr = 12; //RMAPヘッダ:12B // ------------------------------------------------- // -- Set at the LONG buffer with the aimed block -- // ------------------------------------------------- i_numNewBlock = app_SetTlmHBlock( uc_nodeId, uc_dataId, // [INPUT] Node/Data ID ui_TIstart, // [INPUT] TI of Start Block [0x0000000: OLDEST 0xFFFFFFFF: NEWEST] &t_blockInfo); // [OUTPUT] Block Info *** // (return) >0:Num of blocks, <=0:No data (error) *** if ( i_numNewBlock < 1 ) return(0); // No data // TI-END if ( ui_TIlen == 0 || ui_TIlen == 1 ) ui_TIend = t_blockInfo.ui_createTime + 1; // 1 Packet or 1 Block else { if ( ui_TIstart == 0x00000000 || ui_TIstart == 0xFFFFFFFF ) ui_TIend = t_blockInfo.ui_createTime + ui_TIlen; // from OLDEST or LATEST else ui_TIend = ui_TIstart + ui_TIlen; // from OLDEST or LATEST } // TI-LEN special if ( ui_TIlen == 0 || ui_TIlen == 1 ) i_numNewBlock = 1; //if ( ui_TIlen == 0 ) i_numPac = 1; for (i=0; i 0 && // Data available t_blockInfo.c_invalidFlg == 0 ) { // Data correct for (j = 0; j < 18; j++) { //先にヘッダのみ読み込み、ダミーパケットの場合はスキップ i_flag = app_GetPacket( 5, // [INPUT] App-No:5 uc_nodeId, uc_dataId, // [INPUT] Node/Data ID 0, // [INPUT] Buffer ID = 0 (LONG) &t_blockInfo, // [INPUT] Block Info j, // [INPUT] Packet Num = 0(先頭) 0, // [INPUT] Offset(8の倍数) = 0(先頭) 32, // [INPUT] 読出サイズ = 1000B or Packetサイズ G5uc_packet ); // [OUTPUT] 1 Block Data - copied if ( i_flag ) continue; uc_pckt = G5uc_packet[i_rmap_hdr + 5]; if (uc_pckt == 0xff || uc_pckt == 0) continue; uc_pckt &= 0x3f; //パケット番号 // 1-16 M2 // 1-32 M4 //if (uc_pckt > 0x10) continue; uc_en_mode = G5uc_packet[i_rmap_hdr + 4]; //M0-4 (2) i_flag = app_GetPacket( 5, // [INPUT] App-No:5 uc_nodeId, uc_dataId, // [INPUT] Node/Data ID 0, // [INPUT] Buffer ID = 0 (LONG) &t_blockInfo, // [INPUT] Block Info j, // [INPUT] Packet Num = 0(先頭) 0, // [INPUT] Offset(8の倍数) = 0(先頭) d_Lcl_MEA_PACSZ, // [INPUT] 読出サイズ = 1000B or Packetサイズ G5uc_data + (uc_pckt-1)*d_Lcl_MEA_PACSZ); // [OUTPUT] 1 Block Data - copied if ( i_flag ) continue; //頭出し if (uc_pckt == 1) { memcpy( Gst_MEA_dat.uc_hdrH, G5uc_packet + i_rmap_hdr, 8); //SWEEP#1のヘッダを取得する memcpy(&ui_TI, G5uc_packet + i_rmap_hdr, 4); //TI uc_find_pac1 = TRUE; //パケット#1検出フラグ } //頭出し以後 //ScienceDataをuc_dataに再配置する if (uc_find_pac1 && uc_pckt >= 1 && uc_pckt <= 32) { //H0 if (uc_drID == 0) { app03_MIA_tlmout(uc_nodeId, //MEA1 OR MEA2 フラグ pCtrl->uc_vet_cmp_ena, //[INPUT] 圧縮フラグ (8 + 1024)/2, //[INPUT] data長さ 0xfe, //[INPUT] Comment2 4, //[INPUT] Comment3 (unsigned short*) (G5uc_data + (uc_pckt-1)*d_Lcl_MEA_PACSZ + i_rmap_hdr), //[INPUT] 圧縮前のプロダクト Gst_MEA_dat.us_3D_H, //[MID] 圧縮後バッファ ui_TI, //[INPUT] TI 4+uc_drID); //[INPUT] 0:L, 1: M, 4-9:H(DR-ID) } //H1-5 //else { // memcpy(&G5uc_data[(uc_pckt-1)*d_Lcl_MEA_SCISZ], // &G5uc_packet[i_rmap_hdr + 8], d_Lcl_MEA_SCISZ); //} } //お尻出し //M2 H1-5のみ if (uc_find_pac1 && uc_pckt == 16 && uc_drID != 0 && uc_en_mode == 2) { //memcpy(&ui_TI, G5uc_packet + i_rmap_hdr, 4); //SWEEP#1のTIのまま //2018.05.10改訂 memcpy( Gst_MEA_dat.uc_hdrH, G5uc_packet + i_rmap_hdr, 8); //SWEEP#16のヘッダで上書き //2018.05.10改訂 uc_find_pac1 = FALSE; //パケット#1検出フラグを戻す //SW CAL if (pCtrl->uc_swcal_prm[0]) { //SW cal ON時: テスト用パルスでカウントデータを上書きする app03_MEA_makeSWcal(uc_nodeId, //[INPUT] SensorID (unsigned short*)G5uc_data, //[OUTPUT] Buffer for Count data uc_en_mode); //[INPUT] モード番号 } //プロダクト作成とTLM作成 //H mode product作成 1(4s) or 2(2s) i_ProNum = (uc_nodeId == Gd_N_MEA1) ? 1 + d_Lcl_MEA1_2sM : 1 + d_Lcl_MEA2_2sM; for (n = 0; n < i_ProNum; ++n) { app05_MEA_makeH(n + 2, //[INPUT]Mode Flag (2 or 3) (unsigned short*)G5uc_data, //[INPUT]Count data Gst_MEA_dat.us_3D_H); //[OUTPUT]Product app03_MIA_tlmout(uc_nodeId, //MEA1 OR MEA2 フラグ pCtrl->uc_vet_cmp_ena, //[INPUT] 圧縮フラグ 32*88 + d_Lcl_MEA_HK2B, //[INPUT] data長さ 0xfe, //[INPUT] Comment2 n, //[INPUT] Comment3 Gst_MEA_dat.us_3D_H, //[INPUT] 圧縮前のプロダクト (unsigned short*)(G5uc_data +d_Lcl_MEA_PACSZ*16), //[MID] 圧縮後バッファ ui_TI, //[INPUT] TI 4+uc_drID); } } } Gui_TLMh_blockTime[uc_nodeId] = t_blockInfo.ui_createTime; } // To next block i_flag = app_NextBlock( uc_nodeId, uc_dataId, // [INPUT] Node/Data ID 0, // [INPUT] Buffer ID: 0 = LONG &t_blockInfo); // [OUTPUT] Block Info if ( i_flag ) break; // no data } return 1; } char app05_MEA_makeH(unsigned char uc_f, // [INPUT]FLG 3D-H 2: H 0-7ch // 3: H 8-15ch unsigned short us_pac[], // [INPUT] COUNT data unsigned short us_out[]) // [OUTPUT] Product { struct _s_MEA_Product *pDat; //プロダクト pDat = &Gst_MEA_dat; //pDat->us_Hlen = 32*88 + d_Lcl_MEA_HK2B; //データ長 memcpy(us_out, pDat->uc_hdrH, d_Lcl_MEA_HK2B*2); //SWEEP#1のヘッダを取得する //Hmodeは代入のみなので初期化は不要 app03_MEA_3D(us_pac, us_out + d_Lcl_MEA_HK2B, uc_f); //プロダクト作成 #ifdef _RUN_ON_WINDOWS_ int i, j; printf("3D-H(2,4s)\n"); for (j = 0; j < 88; ++j) { for (i = 0; i < 32; ++i) printf("%0004x ", *(us_out + d_Lcl_MEA_HK2B + i + j*32) ); printf("\n"); } #endif return TRUE; }