此函数名称为void RCDataProcess(void),作用是接收来自手柄的数据。将接收的数据进行一系列的处理。具体解释如下:
//函数名:RCDataProcess(void)
//输入:无
//描述:处理接收到的遥控数据。
//遥控数据可能来自2.4G遥控器,如函数ReceiveDataFormNRF()
//也可能来自手机APP遥控,如函数CommAppCmdProcess()
//所以该函数防止在CommApp.c文件中有失妥当
//该函数以50Hz频率在main函数中执行
//Porcess the RC data from 2.4G RC or smartphone APP
void RCDataProcess(void)
{
//飞机电池过放,处于自动降落状态
//对遥控数据不再响应,使用归中值
if(LANDING == altCtrlMode) { //当处于着陆模式时候,自动用中值处理
rcData[THROTTLE] = 1500; //油门中值为1500
rcData[YAW] = 1500; //方位中值为1500
rcData[PITCH] = 1500; //俯仰中值为1500
rcData[ROLL] = 1500; //横滚中值为1500
}
CONSTRAIN(rcData[THROTTLE],1000,2000); //限制函数将其限制在最大最小值之间
CONSTRAIN(rcData[YAW],1000,2000); //同上
CONSTRAIN(rcData[PITCH],1000,2000); //同上
CONSTRAIN(rcData[ROLL],1000,2000); //同上
RC_DATA.THROTTLE=rcData[THROTTLE]-1000;//减去最小值,有效值为1000~2000之间
RC_DATA.YAW= YAW_RATE_MAX * dbScaleLinear((rcData[YAW] - 1500),500,APP_YAW_DB);//对死区进行处理,在手柄移动一个小范围情况下无人机不进行处理,并将其按照比例映射成角度值
RC_DATA.PITCH= Angle_Max * dbScaleLinear((rcData[PITCH] - 1500),500,APP_PR_DB);//同上
RC_DATA.ROOL= Angle_Max * dbScaleLinear((rcData[ROLL] - 1500),500,APP_PR_DB);//同上
switch(armState)
{
case REQ_ARM: //解锁
if(IMUCheck() && !Battery.alarm) {//检测惯导是不是准备好并且电池无告警
armState=ARMED; //arm使能
FLY_ENABLE=0xA5; //无人机使能
} else {
FLY_ENABLE=0; //无人机不使能
armState=DISARMED; //arm不使能
}
break;
case REQ_DISARM: //上锁
FLY_ENABLE=0; //无人机不使能
altCtrlMode=MANUAL; //上锁后加的处理
zIntReset=1; //复位
thrustZSp=0; //z轴方向油门的期望值
thrustZInt=estimateHoverThru(); //获得z轴方向油门的悬停值
offLandFlag=0; //着陆标记为零
armState=DISARMED; //arm不使能
break;
default:
break;
}
}