/**
* Gamesir joystick control handling
* - Receive command from the joystick
* - Control the drone by received command
*
* @param arg Parameter about task control
*/
void gamesir_task(void *arg)
{
uint8_t command_init = 0;
uint8_t mac_init = 0;
uint8_t stop_cnt = 5;
for (;;)
{
if (mac_init == 0)
{
CommonSerial.print("[TELLO] getmac?");
delay(100);
#ifdef __DEFAULT_LOG__
Serial.println("gamesir_task(): mac is ok?");
#endif
if (rmtt_joystick_mac_is_valid())
{
#ifdef __DEFAULT_LOG__
Serial.println("gamesir_task(): ble mac init");
#endif
p_tt_gamesir->Init(get_rmtt_joystick_mac());
mac_init = 1;
}
}
else if ((command_init == 0) && (p_tt_gamesir->GetConnectedStatus()))
{
tt_sdk.SDKOn();
delay(100);
if (rmtt_bool_is_valid())
{
command_init = 1;
}
}
else if (p_tt_gamesir->DataIsValid())
{
// Serial.println("data is update");
PlainData data = p_tt_gamesir->GetData();
int lx = ((float)data.left_x_3d - 512) / 512.0 * 100;
int ly = ((float)data.left_y_3d - 512) / 512.0 * 100;
int rx = ((float)data.right_x_3d - 512) / 512.0 * 100;
int ry = ((float)data.right_y_3d - 512) / 512.0 * 100;
if ((data.btn3 == 0x01) && (data.L2))
{
tt_sdk.Flip('f');
}
else if ((data.btn3 == 0x03) && (data.L2))
{
tt_sdk.Flip('r');
}
else if ((data.btn3 == 0x05) && (data.L2))
{
tt_sdk.Flip('b');
}
else if ((data.btn3 == 0x07) && (data.L2))
{
tt_sdk.Flip('l');
}
else if ((data.Y) && (data.R2))
{
if (takeoff_status == 0)
{
tt_sdk.TakeOff();
takeoff_status = 1;
}
else
{
tt_sdk.Land();
takeoff_status = 0;
}
}
else
{
#ifdef BLE_JAPAN_CTRL
tt_sdk.SetRC(lx, -ly, -ry, rx);
#else
tt_sdk.SetRC(rx, -ry, -ly, lx);
#endif
}
}
/* 避免rc指令粘包 */
delay(10);
/* Regularly send data packet to ensure the drone
floating steadily after the controller was offline*/
if ((now_time - last_clean_time > 300) && command_init)
{
if (p_tt_gamesir->GetDataOffline())
{
if (stop_cnt)
{
tt_sdk.SetRC(0, 0, 0, 0);
stop_cnt--;
}
}
else
{
/* keepactive */
CommonSerial.print("[TELLO] keepalive");
stop_cnt = 5;
}
last_clean_time = millis();
}
else
{
}
now_time = millis();
}
}
* Gamesir游戲桿控制處理
*-從操縱桿接收命令
*-通過收到的命令控制無人機(jī)
*
* @param arg有關(guān)任務(wù)控制的參數(shù)
*
unsigned char這個(gè)東西我上面解讀過
cnt變量多次出現(xiàn),我去查一下
可以看到計(jì)數(shù)變量
for(;;)死循環(huán)
開始一個(gè)判斷,如果mac的指令未初始化繼續(xù)往下運(yùn)行.
下面又是許多的判斷語句,符合各種情況去處理
這個(gè)現(xiàn)象叫做粘包,就是指兩次結(jié)果粘到一起了.看這個(gè)地方解決很簡單,就是延時(shí)了一下.
打印,得到mac的地址沒有?
延時(shí)一下,就開始繼續(xù)運(yùn)行,此時(shí)調(diào)試的打印開關(guān)打開.
手柄任務(wù):mac地址ok嘛~
如果地址有效為正~打印:手柄(藍(lán)牙地址初始化)
這個(gè)是初始化的函數(shù),參數(shù)是這個(gè)手柄的藍(lán)牙Mac.
接著
這是這個(gè)函數(shù)
函數(shù)聲明
第一個(gè)是參數(shù)的聲明
第一次判斷
任務(wù)的結(jié)尾,吧標(biāo)志位更改
如果這個(gè)指令初始的值為0和和鏈接的狀態(tài)信息與運(yùn)算為真就開始執(zhí)行.
我們看到這個(gè)函數(shù)的命名空間是Protocol里面定義
下文看
SDK控制開始
*獲取是否收到布爾類型數(shù)據(jù)的有效狀態(tài)
*來自無人機(jī)
普通數(shù)據(jù)有個(gè)類
接著這個(gè)地方判斷成立的條件是數(shù)據(jù)有效
后面結(jié)合SDK解讀
這段有的地方不懂,翻轉(zhuǎn)?
降落
我們打開這個(gè)看看下面
日本手用左手控制油門
下期我們來對飛行指令解包
聯(lián)系客服