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;

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





  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 7
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值