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;

編譯,下載,然後可以看到上位機中的模式已經更改。





發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章