Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
globalFlags.cpp
- Committer:
- MasashiNomura
- Date:
- 2019-01-21
- Revision:
- 41:45c982b1c5b6
- Parent:
- 40:debe99e228d3
- Child:
- 42:cc8501b824ba
File content as of revision 41:45c982b1c5b6:
#include "globalFlags.h" //モニタ用LED DigitalOut led1(LED1); DigitalOut led2(LED2); DigitalOut led3(LED3); DigitalOut led4(LED4); //状態表示用 DigitalOut DO_01(p21);//R DigitalOut DO_02(p22);//G DigitalOut DO_03(p23);//B //モーターアクセル用アナログ入力 AnalogIn AinAxl(p20); // //エンジンスロットル用アナログ入力 // AnalogIn AinThrottle(p19); char g_CmdBuf[G_CMD_BUF_SIZ] ;// コマンド受け渡しバッファ bool gf_CmdPrs; bool gf_Armed ;//アーミングフラグ bool gf_Dbg ;//デバッグタスク起動フラグ //bool gf_fs_stat ;//強制遷移フラグ bool gf_StopMot ;//モーターの強制停止 サーボ全閉 bool gf_FromActiveStat ;//モーターの強制停止 サーボ全閉が動作時に発生したかどうか typPrintFlg gf_Print ;// typPrintFlg gf_Mon ;// typCalFlag gf_Cal ;// //typDbgPrintFlg gf_DbgPrint ;//デバッグ用 typAccel gf_AxReq[2] ;//アクセル更新フラグ typAxlRpm gf_MtReq[4] ;//モーター姿勢制御更新フラグ typAxlRpm gf_MtReqOfs[4] ;//モーターオフセット更新フラグ typAxlRpm gf_MtReqDct[8] ;//ダイレクト(FPGA関数直接呼び出し)モーター更新フラグ typAxlRpm gf_MtReqU[4] ;//モーターユーザー更新フラグ enmHbState gf_State = SLEEP; bool gf_StateEnt ;//状態遷移後、最初であることを示す bool gf_PidParaUpdate ;//PID Pp,P,I,Dの係数アップデートフラグ typPidPara g_PidPara ;//PID Pp,P,I,Dの係数の外部設定用 // bool gf_MotParaUpdate[4] ;//モーターのパラメータ値更新フラグ // typMotPara g_MotPara[4]; void initFlags(){ memset(g_CmdBuf,0x0,sizeof(g_CmdBuf)); gf_CmdPrs = false; gf_Armed = false; gf_Dbg = false; gf_StopMot = false; // gf_Print.flg = 0; // gf_Mon.flg = 0; gf_Print.d1.flg = 0; gf_Print.d2.flg = 0; gf_Cal.flg = 0; //gf_DbgPrint.flg = 0; gf_AxReq[0].dt = 0; gf_AxReq[1].dt = 0; for(int i=0; i<4;++i){ gf_MtReq[i].req = false; gf_MtReq[i].val = 0; gf_MtReqOfs[i].req = false; gf_MtReqOfs[i].val = 0; gf_MtReqU[i].req = false; gf_MtReqU[i].val = 0; } for(int i = 0; i < 8; ++i){ gf_MtReqDct[i].req = false; gf_MtReqDct[i].val = 0; } gf_State = SLEEP; gf_StateEnt = false; g_PidPara.PP = 2; g_PidPara.P = 0; g_PidPara.I = 0; g_PidPara.D = 0; g_PidPara.IMax = 2000; g_PidPara.IMin = -2000; // for(int i = 0; i < 4; ++i){ // gf_MotParaUpdate[i] = false; // g_MotPara[i].limit_hi = LIM_MOT_INP_MAX; // g_MotPara[i].limit_low = LIM_MOT_INP_MIN; // } } void setDOCol(eLedCol col) { switch(col){ case WHITE: DO_01 = !DO_01; DO_02 = !DO_02; DO_03 = !DO_03; break; case RED: DO_01 = !DO_01; DO_02 = 0; DO_03 = 0; break; case GREEN: DO_01 = 0; DO_02 = !DO_02; DO_03 = 0; break; case BLUE: DO_01 = 0; DO_02 = 0; DO_03 = !DO_03; break; case YELLOW: DO_01 = !DO_01; DO_02 = !DO_02; DO_03 = 0; break; case PURPLE: DO_01 = !DO_01; DO_02 = 0; DO_03 = !DO_03; break; case LIGHT_BLUE: DO_01 = 0; DO_02 = !DO_02; DO_03 = !DO_03; break; case OFF: default: DO_01 = 0;//R DO_02 = 0;//G DO_03 = 0;//B break; } } void setDO4LED(enmHbState stat) { if(stat == NONE) {// 消灯 setDOCol(OFF); } else if(stat == SLEEP) {//YELLOW setDOCol(YELLOW); } else if(stat == WAKEUP || stat == STANDBY) {//BLUE setDOCol(BLUE); } else if(stat == IDLE) {//GREEN setDOCol(GREEN); } else if(stat == TAKE_OFF || stat == HOVER || stat == DRIVE || stat == GROUND || stat == EMGGND) {//PURPLE setDOCol(PURPLE); } else if(stat == CHK_EG_ENT || stat == CHK_EG_F || stat == CHK_EG_MID || stat == CHK_EG_R || stat == CHK_EG_EXIT) {//LIGHT BLUE setDOCol(LIGHT_BLUE); } else if(stat == CHK_ENT || stat == CHK_MOT || stat == CHK_AXL || stat == CHK_ATT || stat == CHK_EXIT) {//WHITE setDOCol(WHITE); } else/* if(stat == MOT_STOP)*/ { setDOCol(RED); } } void setState(enmHbState stat){ // ありえない遷移を排除 if(gf_State == SLEEP){if(stat != WAKEUP) return;} if(gf_State == WAKEUP){if(stat != STANDBY) return;} if(gf_State == STANDBY){if(stat !=IDLE) return;} if(gf_State == IDLE){if(stat != TAKE_OFF && stat != SLEEP) return;} if(gf_State == TAKE_OFF){if(stat != HOVER && stat != GROUND) return;} if(gf_State == GROUND){if(stat != IDLE) return;} if(gf_State == HOVER){if(stat != DRIVE && stat != GROUND) return;} if(gf_State == DRIVE){if(stat != HOVER && stat != EMGGND) return;} if(gf_State == EMGGND){if(stat != IDLE) return;} sp.printf("state: %d\r\n",stat); gf_State = stat; gf_StateEnt = true; } void setStateF(enmHbState stat){ sp.printf("state: %d\r\n",stat); enmHbState tmp; if((UINT16)stat > MOT_STOP){ tmp = SLEEP; } else { tmp = stat; } gf_State = tmp; gf_StateEnt = true; } bool isActiveState(){ if(gf_State >= IDLE && gf_State <= EMGGND){ return true; } else { return false; } } /* //=========================================== //コンストラクタ //=========================================== GlobalFlags::GlobalFlags(){ //初期ステート state = SLEEP; //ステートキュー初期化 for(int i=0; i<STATE_QUE_SIZ; i++){ stateQueue[i] = NONE; } rp = wp = 0;//先頭を指す full = false;//最初はエンプティ empty = true; } //----------------------------------- //ステートのFIFOにプッシュする //----------------------------------- bool GlobalFlags::push(enmHbState iState){ if(full){ return false;//FFULLフラグが立ってら入力を受け付けない }else{ stateQueue[wp] = iState;//キューに突っ込んで wp = (wp==STATE_QUE_SIZ) ? 0 : wp+1;//ライトポインタを進める full = (wp == rp)? true : false; //次ライト予定の場所がリードポインタに追いついたらFULLを立てる empty = false; return true; } } //----------------------------------- //ステートFIFOから次の予約ステートを引き抜く //----------------------------------- bool GlobalFlags::pull(){ if(empty){ return false;//EMPTYだったら引き抜けない }else{ state = stateQueue[rp];//リードポインタの指すデータをステートに移す stateQueue[rp] = NONE;//バッファを消す rp = (rp==STATE_QUE_SIZ) ? 0 : rp+1;//リードポインタを進める full = false; //フルではなくなる empty = (stateQueue[rp] == NONE) ? true : false;//次にリードする場所がNONEだったらEMPTYを立てる return true; } } */