void controller_check_event(void)
{
switch(state)
{
case WAIT_FOR_MISSION:
if(NRF24L01P_receive() == 0)
{
if(rx_packet[0] == 0xFF)
{
tx_packet[0] = 0xFF;
tx_packet[1] = 0x02;
printf("MISSION_START:%u\n",NRF24L01P_send());
state = WAIT_FOR_LAUNCH;
}
}
break;
case WAIT_FOR_LAUNCH:
if(modulus(ins.acc)>1.2*g)
{
//发射事件
ind.t0 = HAL_GetTick();
tx_packet[0] = 0xFF;
tx_packet[1] = 0x03;
printf("LAUNCH:%u\n",NRF24L01P_send());
state = RISE;
}
break;
case RISE:
//设定硬性时间标准,防止发射后因为震动立刻开伞
if(ind.velocity[2] < 0 && ind.Delta_t > 500)
{
//到轨迹顶端,开伞
parachute_open();
tx_packet[0] = 0xFF;
tx_packet[1] = 0x04;
printf("PARACHUTE_DEPLOY:%u\n",NRF24L01P_send());
state = FALL;
}
break;
case FALL:
if(fabs(modulus(ins.acc) - g) < DELTA_a && modulus(ins.gyro) < DELTA_g)
{
//落地
tx_packet[0] = 0xFF;
tx_packet[1] = 0x05;
printf("LANDING:%u\n",NRF24L01P_send());
state = BACK_TO_GROUND;
}
break;
default:
break;
}
}这部分是判断火箭状态以及开伞的代码,来自Flight_Controler0的controller.c,用了状态机,可以看状态转移的条件。