cleanflight修改--韌體預設飛航模式
對於我們飛控開發者來說,如果每次下完程式碼後飛航模式modes都要在上位機重新改一次,我們肯定會瘋掉的。這時候就需要修改韌體中預設的飛航模式了。
如何下手呢,我先從cleanflight飛控的上位機和下位機通訊開始看起,因為上位機是可以通過MSP協議修改飛控的模式的,那就定位到原始碼,在msp_server_fc.c檔案中,找到函式int mspServerCommandHandler(mspPacket_t *cmd, mspPacket_t *reply),其中的一個case語句是MSP_SET_MODE_RANGE:
case MSP_SET_MODE_RANGE: {
int i = sbufReadU8(src);
if (i >= MAX_MODE_ACTIVATION_CONDITION_COUNT)
return -1;
modeActivationCondition_t *mac = &modeActivationProfile()->modeActivationConditions[i];
int permId = sbufReadU8(src);
const box_t *box = findBoxByPermenantId(permId);
if (box == NULL)
return -1;
mac->modeId = box->boxId;
mac->auxChannelIndex = sbufReadU8(src);
mac->range.startStep = sbufReadU8(src);
mac->range.endStep = sbufReadU8(src);
useRcControlsConfig(modeActivationProfile()->modeActivationConditions);
break;
}
找到這個就很清晰了,modeActivationProfile()->modeActivationConditions[i]中記錄的就是飛航模式的相關設定:飛航模式、通道、通道上下限。
這裡還需要注意的是startStep 和endStep 的範圍,在rc_controls.c可以找到
// steps are 25 apart
// a value of 0 corresponds to a channel value of 900 or less
// a value of 48 corresponds to a channel value of 2100 or more
// 48 steps between 900 and 1200
typedef struct channelRange_s {
uint8_t startStep;
uint8_t endStep;
} channelRange_t;
如果這個還沒看懂的話,在這個定義往上一點可以看到幾個定義
#define CHANNEL_RANGE_MIN 900
#define CHANNEL_RANGE_MAX 2100
#define MODE_STEP_TO_CHANNEL_VALUE(step) (CHANNEL_RANGE_MIN + 25 * (step))
這就可以知道startStep 和endStep 的範圍了:0~48,然後會對映到900~1200。
知道這些就可以開始修改了,但是預設設定的實現程式碼在哪裡呢?很顯然,在config.c檔案中的void resetConf(void)函式中。如果要設定成
ANGLE模式在通道AUX1 1000~1300,HORIZON模式在通道AUX1 1700~2000,MAG模式在通道AUX2 1000~2000 ,程式碼可以在resetConf函式末尾加上:
modeActivationCondition_t *ANGLEmac = &modeActivationProfile()->modeActivationConditions[0];
modeActivationCondition_t *HORIZONmac = &modeActivationProfile()->modeActivationConditions[1];
modeActivationCondition_t *MAGmac = &modeActivationProfile()->modeActivationConditions[2];
ANGLEmac->modeId = BOXANGLE;
ANGLEmac->auxChannelIndex = 0;
ANGLEmac->range.startStep = 4;
ANGLEmac->range.endStep = 16;
HORIZONmac->modeId = BOXHORIZON;
HORIZONmac->auxChannelIndex = 0;
HORIZONmac->range.startStep = 32;
HORIZONmac->range.endStep = 44;
MAGmac->modeId = BOXMAG;
MAGmac->auxChannelIndex = 1;
MAGmac->range.startStep = 4;
MAGmac->range.endStep = 44;
編譯,下載,然後可以看到上位機中的模式已經更改。