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.
userTask.cpp
- Committer:
- MasashiNomura
- Date:
- 2018-12-10
- Revision:
- 24:c5945aaae777
- Parent:
- 23:79e20be4bc5b
- Child:
- 25:f3a6e7eec9c3
File content as of revision 24:c5945aaae777:
//RTOS関連------------------
#include "FreeRTOS.h"
#include "task.h"
//#include "queue.h"
//------------------RTOS関連
#include "globalFlags.h"
#include "HbManager.h"
#include "hbCommand.h"
#include "uart.h"
#include "fpga.h"
//タスクハンドル(停止とか再開に必要)
static xTaskHandle tskHandle[3]={NULL,};
//------------------
//タスク停止
//------------------
static void taskStop(int iId){
sp.printf("Task[%d] Stop\r\n" , iId);
vTaskSuspend(tskHandle[iId]);//タスクを止める
}
//------------------
//タスク再開
//------------------
static void taskStart(int iId){
sp.printf("Task[%d] Start!!\r\n" , iId);
vTaskResume(tskHandle[iId]);//タスク再開
}
//========================================================
//コマンド解析タスク
//========================================================
void taskCmdParser(void *pvParameters){
// int8_t *pcTaskName = (int8_t *) pvParameters;;
portTickType xLastWakeTime = xTaskGetTickCount();
// vTaskDelay(300);//制御タスクを先に走らせたいので待たす
while(1){
led2=!led2;
//コマンド解釈
commandParse();
//
// if(gf_Armed){
// setState(WAKEUP);
// gf_Armed = false;
// // taskStop(0);//制御タスクを止める
// // taskStart(2);//デバッグタスク再開
// }
// else{
// taskStop(2);//デバッグタスクを止める
// taskStart(0);//制御タスク再開
// }//switch
//次の周期まで待つ
vTaskDelayUntil(&xLastWakeTime, 50 / portTICK_RATE_MS );
}
}
//========================================================
//ホバーバイク制御タスク
//========================================================
void taskHbControl(void *pvParameters){
// int8_t *pcTaskName = (int8_t *) pvParameters;;
portTickType xLastWakeTime = xTaskGetTickCount();
HbManager hb;
bool bDoCtrlAtt;
bool bDoCtrlMot;
//
while(1){
led1=!led1;
bDoCtrlAtt = false;
bDoCtrlMot = false;
// PID係数アップデートチェック
if(gf_PidParaUpdate){
hb.setAttPara(g_PidPara);
sp.printf("Pp : [%f]\r\n",g_PidPara.PP);
sp.printf("P : [%f]\r\n",g_PidPara.P);
sp.printf("I : [%f]\r\n",g_PidPara.I);
sp.printf("D : [%f]\r\n",g_PidPara.D);
sp.printf("IMAX: [%f]\r\n",g_PidPara.IMax);
sp.printf("IMIN: [%f]\r\n",g_PidPara.IMin);
gf_PidParaUpdate = false;
}
//▼①状態読み出し系
hb.getAttitude(); //現在角度読み出し
hb.controlEngine(); //エンジン回転数読み出し
hb.getUserCommand(); //操作ボタン状態読み出し
//▼②ステート遷移
switch(gf_State){
case SLEEP:
if(gf_Dbg){
gf_Dbg = false;
taskStart(2);
}
else if(gf_Armed){
gf_Armed = false;
// hb.initChkMotor();
setState(WAKEUP);
}
break;
case WAKEUP:
//各種モーター
//機材のチェック
// if(hb.chkMotor() == true){
setState(STANDBY);
// }
break;
case STANDBY:
// モーター回転数のチェック
if(hb.chkInRangeIDLE()){
setState(IDLE);
}
else{
// デバッグのためここもスルー
setState(IDLE);
}
break;
case IDLE:
//SWのチェック
//離陸ボタン押下
//とりあえず、YawCtrlで代用
if(hb.chkSWUserOpe(HbUserOpe::YAW_CTRL))
{
// TODO IMU Cal
setState(TAKE_OFF);
}
//else if(hb.chkSWUserOpe(HbUserOpe::ENG_STOP))
//{
// setState(SLEEP);
//}
//if(hb.chkSWUserOpeAny()){
// sp.printf("SW :[%X]\r\n",hb.getUserSw());
//}
break;
case TAKE_OFF:
// エンジン回転数のチェック
// 着陸ボタンが優先度が高いので先に判定、たが、まだ作ってないのでコメントアウト
// if(hb.chkSWUserOpe(HbUserOpe::STOP)){
// setState(GROUND);
// }
//else
bDoCtrlMot = true;
bDoCtrlAtt = true;
//if(hb.chkSWUserOpe(HbUserOpe::STOP)){
// setState(HOVER);
//}
break;
case GROUND:
// そのままスルー
setState(IDLE);
break;
case HOVER:
//
break;
case DRIVE:
break;
case EMGGND:
break;
case CHK_ENT: //チェックエンター
sp.printf("Check enter\r\n");
break;
case CHK_MOT: //モーターチェック
sp.printf("Check Motor\r\n");
bDoCtrlMot = true;
break;
case CHK_AXL: //アクセルサーボチェック
sp.printf("Check Accel Servo\r\n");
break;
case CHK_ATT: //姿勢制御チェック
sp.printf("Check Attitude\r\n");
bDoCtrlAtt = true;
break;
case CHK_EXIT: //チェックステート脱出
sp.printf("Check Exit\r\n");
break;
}
//▼③各種設定
//hb.controlAttitude(); //姿勢制御
//hb.controlMotor();//モーター指令出し
if(bDoCtrlAtt)hb.controlAttitude(); //姿勢制御
if(bDoCtrlMot)hb.controlMotor();//モーター指令出し
if(gf_Print.bf.stat){
sp.printf("stat : [%X]\r\n",gf_State);
}
//表示フラグを落とす(けどモニタフラグが立ってる箇所は残る)
if(gf_Print.flg!=0){
gf_Print.flg=gf_Mon.flg;
sp.printf("\r\n");
}
//次の周期まで待つ
vTaskDelayUntil(&xLastWakeTime, 20 / portTICK_RATE_MS );
}
}
//========================================================
//タスク2:デバッグ用タスク
//========================================================
void taskDebug(void *pvParameters){
taskStop(2);//自ら止めてレジュームされるまで待つ
UCHAR Num;
INT16 iVal;
bool rvFlg;
//この関数をリターンしてしまうと他のタスクも止まるのでwhileで回すこと!
while(1){
for(Num = 0; Num < 8; ++Num){
for(iVal = 50; iVal < 300; ++iVal){
fpgaMotor(Num, iVal);
wait(0.01);
}
for(iVal = 300; iVal >= 50; --iVal){
fpgaMotor(Num, iVal);
wait(0.01);
}
}
//自タスク停止させて次の周期まで待つ
gf_Dbg = false;
sp.printf("Do DebugTask!");
taskStop(2);
}
}
//-------------------------------------------------------------
//初期化:タスク登録
//-------------------------------------------------------------
void taskInit(){
portBASE_TYPE TaskRtn;//タスククリエイトの結果を受け取る型
//タスク0:コマンド解析タスク
TaskRtn= xTaskCreate(taskCmdParser, (signed portCHAR *)"TaskCmd", 256, NULL, 1, &tskHandle[0]);
if(TaskRtn==pdTRUE){sp.printf("Task0 Set : Command parser\r\n");}
//タスク1:制御タスク
TaskRtn= xTaskCreate(taskHbControl, (signed portCHAR *)"TaskHbCont", 256, NULL, 2, &tskHandle[1]);
if(TaskRtn==pdTRUE){sp.printf("Task1 Set : Hoverbike Control\r\n");}
//タスク2:デバッグタスク
TaskRtn= xTaskCreate(taskDebug, (signed portCHAR *)"TaskDebug", 192, NULL, 0, &tskHandle[2]);
if(TaskRtn==pdTRUE){sp.printf("Task2 Set : Debug\r\n");}
//RTOSカーネル起動(タスクが走り出す)
vTaskStartScheduler();
}