对于我们飞控开发者来说,如果每次下完代码后飞行模式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;
编译,下载,然后可以看到上位机中的模式已经更改。