BaseFlight CLI - FabLabSeoul/WingProject GitHub Wiki
Multiwii BaseFlight CLI (Command Line Interface)
CLI๋ ์งง์ ๋ช ๋ น์ด๋ก ์ฟผ๋์ฝฅํฐ์ ์ํ๋ฅผ ์์์ค๊ณ , ๊ฐ์ ์ค์ ํ๋ ์ฉ๋๋ก ์ฐ์ธ๋ค. ์ฝ๊ฒ ๋งํ๋ฉด, ์์ DOS์ฐฝ ํฐ๋ฏธ๋์์ ๋ช ๋ น์ด๋ฅผ ์ ๋ ฅํ๋ ๊ฒ๊ณผ ๋๊ฐ๋ค.
Naze32 ๋ณด๋๋ฅผ ๊ทธ๋๋ก ์ฌ์ฉํ๋ค๋ฉด, CleanFlight๋ BaseFlight ํ๋ก๊ทธ๋จ์ ์ฌ์ฉํด์ ๋ณด๋์ ์ํ๋ฅผ ์๋ฉด๋๋, ๊ตณ์ด CLI๋ฅผ ๊ฑด๋ค ์ผ์ด ์๋ค. ๊ทธ๋ฌ๋ BaseFlight ์ฝ๋๋ฅผ ์์ ํ๊ฑฐ๋, ์ถ๊ฐ ๊ธฐ๋ฅ์ ๋ฃ๊ณ ์ ํ๋ค๋ฉด, ๊ธฐ์กด BaseFlight๋ชจ๋ํฐ๋ง ํ๋ก๊ทธ๋จ์ผ๋ก๋ ํ๊ณ๊ฐ ์๋ค.
๋ ๊ฐ ํ๋ก์ ํธ์์๋ Naze32 ๋ณด๋์ ์ํ(์์ธ์ ๋ณด, ๋ชจํฐ์ถ๋ ฅ์ ๋ณด)๋ฅผ ์์์ค๊ณ , ์ถ๊ฐํ ์์ค์ฝ๋์ ๋ณ์๋ฅผ ์ฒดํฌํ๊ธฐ์ํด CLI ํ๋กํ ์ฝ์ ์์ ํด์ผ ํ๋ค.
์ฐ์ BaseFlight์ CLI ๋ถ์ํด๋ณด์.
Naze32์์ CLI๋ ์๋ฆฌ์ผํต์ ์ผ๋ก ์ ๋ณด๋ฅผ ์ฃผ๊ณ ๋ฐ๋๋ค. ๋ณด๋์ USB๊ฐ ๊ผฝํ์๋ค๋ฉด, USB๋ฅผ ํตํด ์๋ฆฌ์ผ ํต์ ์ผ๋ก CLI๋ฅผ ์ด์ฉํ ์ ์๋ค. Baseflight์์๋ serial.h, serial.c, cli.h, cli.c ์์ ์ด ๊ธฐ๋ฅ์ ๊ตฌํํ๊ณ ์๋ค. ๋ณด๋์ CLIํต์ ์ ํ๋ ๊ฐ๋จํ ์์ ๋ WingProject\VisualStudio\Naze32SerialCom ์์ ํ์ธํ ์ ์๋ค.
๋ณด๋์ USB๋ฅผ ๊ผฝ์ง ์๊ณ , CLI ํต์ ํ๊ณ ์ถ์ ๋๋ BaseFlight External Serial ๋ฌธ์๋ฅผ ์ฐธ์กฐํ์.
๋ช ๋ น์ด๋ฅผ ์ ์กํ๋ฉด, ๊ทธ์ ๋ํ ๊ฒฐ๊ณผ๊ฐ์ ๋ณด๋์์ ๋ณด๋ด์ค๋ค.
๋ช ๋ น์ด ์ ์ก
- Protocol
- $
- M
- <
- ์ ์กํ ๋ฐ์ดํ ํฌ๊ธฐ (๋ฐ์ดํธ๋จ์)
- ๋ช ๋ น์ด BaseFlight CLI Command
- ์ ์กํ ๋ฐ์ดํ1
- ์ ์กํ ๋ฐ์ดํ2
- ...
- ์ ์กํ ๋ฐ์ดํn (์ ์กํ ๋ฐ์ดํ ๊ฐ์๋งํผ)
- ์ฒดํฌ์ฌ
- ์ ์กํ ๋ฐ์ดํ ํฌ๊ธฐ ๊ฐ ๋ถํฐ ์ดํ ๋ชจ๋ ์ ๋ณด๋ฅผ xor ํ ๊ฐ.
void SendCommand(CBufferedSerial &serial, const unsigned char cmd)
{
unsigned char packet[64];
int checksum = 0;
int idx = 0;
packet[idx++] = '$';
packet[idx++] = 'M';
packet[idx++] = '<';
packet[idx++] = 0;
checksum ^= 0;
packet[idx++] = cmd;
checksum ^= cmd;
packet[idx++] = checksum;
serial.SendData((char*)packet, idx);
}
๋ช ๋ น์ด ์์
- Protocol
- $
- M
-
- ์์ ํ ๋ฐ์ดํ ํฌ๊ธฐ (๋ฐ์ดํธ๋จ์)
- ๋ช ๋ น์ด BaseFlight CLI Command
- ์์ ๋ฐ์ดํ1
- ์์ ๋ฐ์ดํ2
- ...
- ์์ ๋ฐ์ดํn (์์ ๋ฐ์ดํ ๊ฐ์๋งํผ)
- ์ฒดํฌ์ฌ
- ์์ ํ ๋ฐ์ดํ ํฌ๊ธฐ ๊ฐ ๋ถํฐ ์ดํ ๋ชจ๋ ์ ๋ณด๋ฅผ xor ํ ๊ฐ.
// ๊ฐ๋จํ ์คํ
์ดํธ ๋จธ์ ์ผ๋ก ๊ตฌํ๋์๋ค.
void RecvCommand(CBufferedSerial &serial)
{
int state = 0;
int len = 0;
int readLen = 0;
int msp = 0;
int noDataCnt = 0;
int checkSum = 0;
while (1)
{
unsigned char c;
if (serial.ReadData(&c, 1) <= 0)
{
Sleep(1);
++noDataCnt;
if (noDataCnt > 500)
break; // exception
continue;
}
switch (state)
{
case 0:
{
state = (c == '$') ? 1 : 0;
cout << c;
}
break;
case 1:
{
state = (c == 'M') ? 2 : 0;
cout << c;
}
break;
case 2:
{
state = (c == '>') ? 3 : 0;
cout << c;
}
break;
case 3:
{
len = c;
cout << (int)c;
checkSum ^= c;
state = 4;
}
break;
case 4:
{
msp = c;
cout << (int)c << " ";
checkSum ^= c;
state = 5;
}
break;
case 5:
{
if (len > readLen)
{
checkSum ^= c;
cout << (int)c << " ";
}
else
{
if (checkSum == c)
{
cout << "ok" << endl;
return; // end;
}
else
{
cout << "error!!" << endl;
return; // end;
}
}
++readLen;
}
break;
default:
break;
}
}
}