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函数末尾加上:

扫描二维码关注公众号,回复: 2222178 查看本文章

    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;

编译,下载,然后可以看到上位机中的模式已经更改。





猜你喜欢

转载自blog.csdn.net/qingqingdepiaoguo/article/details/53431299