/******************************************************************************* * モジュール名称 :マクロコマンドをデコードし実行する。ただし、 * MDP アプリケーションへのコマンドは呼び出し側での対応 * が必要 * 参考 : * 注意 : EDIT権限は、 * 作成日・作成者 :2010/09/28 ka // // マクロコマンドテーブルフォーマット // nmacro (2byte) | s1 (2byte) | adr_m0 (2byte) | adr_m1 (2byte) | ..... // ncmd0 (2byte) | adr_m0_c0 (2byte) | adr_m0_c1 (2byte) ..... // type_m0_c0 (4bit) | wait_m0_c0 (12bit) | size_m0_c0 (1byte) | cmd_m0_c0 ..... // type_m0_c1 (4bit) | wait_m0_c1 (12bit) | size_m0_c1 (1byte) | cmd_m0_c1 ..... // ......... // ncmd1 (2byte) | adr_m1_c0 (2byte) | adr_m1_c1 (2byte) ..... // type_m1_c0 (4bit) | wait_m1_c0 (12bit) | size_m1_c0 (1byte) | cmd_m1_c0 ..... // type_m1_c1 (4bit) | wait_m1_c1 (12bit) | size_m1_c1 (1byte) | cmd_m1_c1 ..... // ......... // ......... // // nmacro: マクロの数 // s1: マクロテーブルのサイズ // adr_m0: マクロコマンド 0 の相対アドレス (テーブル先頭が 0) // adr_m1: マクロコマンド 1 の相対アドレス (テーブル先頭が 0) // ... // ncmd0: マクロコマンド 0 に含まれるコマンド数 // adr_m0_c0: マクロコマンド 0 コマンド 0 の相対アドレス (マクロコマンド 0 の先頭が 0) // adr_m0_c1: マクロコマンド 0 コマンド 1 の相対アドレス (マクロコマンド 0 の先頭が 0) // ... // type_m0_c0: マクロコマンド 0 コマンド 0 のコマンドタイプ (app_macrocmd.h 参照) // wait_m0_c0: マクロコマンド 0 コマンド 0 を実行するまでのウエイトサイクル数。 // size_m0_c0: マクロコマンド 0 コマンド 0 のサイズ // cmd_m0_c0: コマンド内容 // ... // ... // *******************************************************************************/ //#define _APP_MACROCMD_DEBUG_ #ifdef _APP_MACROCMD_DEBUG_ #include "app_macrocmd_test.h" #else #include "app_common.h" #endif #include "app_common_macrocmd.h" int app_macrocmd_cont(unsigned char uc_nodeId, struct _s_MacroCmd_param *psmcp, unsigned char uc_cont) // // uc_nodeID: node ID // psmcp: 変数実体は呼び出し側で定義する。この変数に状態が記録され、本関数側では保持されない // ため、同一マクロコマンド実行時には呼び出し側で保持し、毎回同じ変数を渡すこと。 // 下記変数は呼び出し前に定義しておく必要がある。 // psmcp->puc_macrotbl: マクロコマンドテーブルの先頭を示すポインタ // psmcp->us_macroID: マクロコマンド ID // 他の変数は書き変えないこと。 // uc_cont: 動作指示用変数 // // 関数呼び出し後の psmcp->c_status: // d_MacroCmd_IDLE: // マクロコマンド処理は行われていない。 // d_MacroCmd_SEQEND: // マクロコマンドの実行シーケンスが終了した。 // d_MacroCmd_WAIT: // 次のコマンドを実行するまでの wait 中。 // d_MacroCmd_EXEC: // コマンド実行が本関数によって実行された。実行関数の呼び出しは 1回であり、返り値は // ケアされない。 // d_MacroCmd_EXECREQ: // 呼び出し側でのコマンド実行が必要となる。本関数の次回の呼び出し時にはコマンドが正常に // 実行されたものとして次のステップに移行する。コマンドの内容とサイズは、 // psmcp->uc_cmd // psmcp->selectmacro.cmdcur.uc_size (コマンドサイズは 32バイト以下であること) // に格納される。 // // マクロコマンド実行前には毎回 // uc_cont = d_MacroCmd_CONT_INIT // として本関数を呼び出し、初期化する必要がある。 // // コマンドの実行間隔は本関数が呼び出される回数が単位となる (本関数を呼び出さないとウエイトサイクル // が進まない)。 // // { unsigned char uc; unsigned char *puc; switch(uc_cont){ case d_MacroCmd_CONT_INIT: case d_MacroCmd_CONT_RESET: // psmcp->us_macroID = 0; psmcp->c_status = d_MacroCmd_IDLE; // psmcp->puc_macrotbl = NULL; break; case d_MacroCmd_CONT_EXEC: if(psmcp->c_status == d_MacroCmd_SEQEND){ return d_MacroCmd_RtnVal_SEQEND; } if(psmcp->c_status == d_MacroCmd_IDLE){ // 実行の開始 puc = psmcp->puc_macrotbl; psmcp->us_totalnum_macro = 0x100 * *puc + *(puc + 1); // マクロコマンド定義数 (total) if(psmcp->us_totalnum_macro <= psmcp->us_macroID){ // 要求されたマクロコマンド ID が // マクロコマンド定義数を超えていないことをチェック return d_MacroCmd_RtnVal_ILLEGAL_MACROID; } puc = psmcp->puc_macrotbl + 0x2; psmcp->us_size_macrotbl = 0x100 * *puc + *(puc + 1); puc = psmcp->puc_macrotbl + 0x4 + 2 * psmcp->us_macroID; psmcp->selectmacro.puc_topadr = psmcp->puc_macrotbl + 0x100 * *puc + *(puc + 1); puc = psmcp->selectmacro.puc_topadr; psmcp->selectmacro.us_totalnum_cmd = 0x100 * *puc + *(puc + 1); psmcp->selectmacro.cmdcur.i_num = -1; psmcp->selectmacro.cmdcur.us_waitctr = 1; psmcp->selectmacro.cmdcur.us_waitctr_target = 0; psmcp->c_status = d_MacroCmd_WAIT; } if(psmcp->selectmacro.cmdcur.us_waitctr > psmcp->selectmacro.cmdcur.us_waitctr_target){ psmcp->selectmacro.cmdcur.i_num++; if(psmcp->selectmacro.cmdcur.i_num >= (int)psmcp->selectmacro.us_totalnum_cmd){ psmcp->c_status = d_MacroCmd_SEQEND; return d_MacroCmd_RtnVal_NORMAL; } puc = psmcp->selectmacro.puc_topadr + 0x2 + 2 * psmcp->selectmacro.cmdcur.i_num; psmcp->selectmacro.cmdcur.puc_adr = psmcp->selectmacro.puc_topadr + 0x100 * *puc + *(puc + 1); puc = psmcp->selectmacro.cmdcur.puc_adr; psmcp->selectmacro.cmdcur.uc_type = ( (*puc) >> 4 ); psmcp->selectmacro.cmdcur.us_waitctr_target = ( (0x100 * *puc + *(puc + 1)) & 0x0fff ); psmcp->selectmacro.cmdcur.uc_size = *(puc + 2); if(psmcp->selectmacro.cmdcur.uc_size > d_MacroCmd_MAXCMDLEN){ psmcp->c_status = d_MacroCmd_IDLE; return d_MacroCmd_RtnVal_CMD_TOOLONG; } psmcp->selectmacro.cmdcur.us_waitctr = 0; } if(psmcp->selectmacro.cmdcur.us_waitctr == psmcp->selectmacro.cmdcur.us_waitctr_target){ for(uc = 0; uc < psmcp->selectmacro.cmdcur.uc_size; uc++){ psmcp->uc_cmd[uc] = *(psmcp->selectmacro.cmdcur.puc_adr + 0x3 + uc); } if(psmcp->selectmacro.cmdcur.uc_type == d_MacroCmd_CmdType_SENSOR){ psmcp->selectmacro.cmdcur.uc_rtnval = app_PiCmd(uc_nodeId, psmcp->uc_cmd, psmcp->selectmacro.cmdcur.uc_size); psmcp->c_status = d_MacroCmd_EXEC; } else { psmcp->c_status = d_MacroCmd_EXECREQ; } } else { psmcp->c_status = d_MacroCmd_WAIT; } psmcp->selectmacro.cmdcur.us_waitctr++; break; default: return d_MacroCmd_RtnVal_UNDEFACT; break; } return d_MacroCmd_RtnVal_NORMAL; }