#include "MavlinkReciver.h" #include MavlinkReciver::MavlinkReciver() { mSerial=&Serial1; } MavlinkReciver::~MavlinkReciver() { } void MavlinkReciver::Init(uint32_t baud) { mBaudRate=baud; #ifdef ARDUINO_WT32_ETH01 mSerial=&Serial1; mSerial->begin(mBaudRate,SERIAL_8N1,HWSerial1Eth_rx_pin,HWSerial1Eth_tx_pin); mSerial->setPins(HWSerial1Eth_rx_pin,HWSerial1Eth_tx_pin);//eth board #elif defined ARDUINO_ESP32_DEV mSerial=&Serial1; mSerial->begin(mBaudRate,SERIAL_8N1,HWSerial1_rx_pin,HWSerial1_tx_pin); #endif mavlink_set_proto_version(MAVLINK_COMM_0,2); } void MavlinkReciver::TaskMavlinkRx(void *pvParameters) { log_i("Task started"); TaskCreator *mCreator = (TaskCreator *)pvParameters; MavlinkReciver *obj=&(mCreator->mReciver); MavlinkTransmitter *mTransmitter=&(mCreator->mTransmitter); DefaultParametrs *mParams=&(mCreator->mParams); EepromParams *mEeprom=&(mCreator->mEeprom); StateMachine *mStateMachine=&(mCreator->mStateMachine); TrackerRxTx *mTracker=&(mCreator->mTracker); vTaskDelay(100); TickType_t mLastTick=xTaskGetTickCount(); TickType_t mLastTick1=mLastTick; while (1) { int len=obj->mSerial->available(); if(len>2*MAVLINK_MAX_PACKET_LEN) { obj->mSerial->read(obj->mBufferIn,2*MAVLINK_MAX_PACKET_LEN); log_i("MavlinkReciver buf over"); continue; } if(len>0) { mavlink_status_t status; mavlink_message_t msg; len=obj->mSerial->read(obj->mBufferIn,len); for(int i=0;imBufferIn[i], &msg, &status)) { if(!obj->mStatus) { switch (msg.msgid) { case MAVLINK_MSG_ID_HEARTBEAT: { mavlink_heartbeat_t hearbit={0}; mavlink_msg_heartbeat_decode(&msg, &hearbit); if ((hearbit.system_status == MAV_STATE_BOOT) ||(hearbit.system_status == MAV_STATE_POWEROFF) ||(hearbit.system_status == MAV_STATE_CALIBRATING)) { obj->mStatus=0; log_i("Auttopilot status cahnged=%d", hearbit.system_status); log_i("Reboot"); obj->reboot(); } else { if (!obj->mSysId && msg.sysid != 255 && msg.sysid != 83 && msg.compid == MAV_COMP_ID_AUTOPILOT1) { obj->mSysId = msg.sysid; mTransmitter->SetSysId(msg.sysid); mStateMachine->SetSysID(msg.sysid); log_i("Mavlink set sysid=%d", msg.sysid); mTransmitter->SendText("Navigation computer start!",MAV_SEVERITY_NOTICE); mTransmitter->SendText(SOFT_VER,MAV_SEVERITY_NOTICE); mTransmitter->SendStreamRateAll(); obj->mStatus=1; } } } break; default: break; } } else { switch (msg.msgid) { case MAVLINK_MSG_ID_HEARTBEAT: { if ( msg.sysid != obj->mSysId) { break; } mavlink_heartbeat_t hearbit; mavlink_msg_heartbeat_decode(&msg, &hearbit); if(hearbit.custom_mode!=0) { bool currentlyArmed = hearbit.base_mode & MAV_MODE_FLAG_DECODE_POSITION_SAFETY; if(obj->mLockMode) { mStateMachine->SetBaseMode(hearbit.base_mode,PLANE_MODE_GUIDED); obj->mLockMode=false; } else { mStateMachine->SetBaseMode(hearbit.base_mode,hearbit.custom_mode); } obj->mBaseMode=hearbit.base_mode; //log_i("Mavlink arm=%d", currentlyArmed); } if ((hearbit.system_status == MAV_STATE_BOOT) ||(hearbit.system_status == MAV_STATE_POWEROFF) ||(hearbit.system_status == MAV_STATE_CALIBRATING)) { obj->mStatus=0; obj->mSysId=0; mTransmitter->SetSysId(0); log_i("Auttopilot status cahnged=%d", hearbit.system_status); log_i("Reboot"); obj->reboot(); } if (hearbit.custom_mode != 0) { if (obj->mAutopilotMode != hearbit.custom_mode) { obj->mAutopilotMode = hearbit.custom_mode; obj->mBaseMode=hearbit.base_mode; log_i("Autopilot mode changed=%d", hearbit.custom_mode); } } } break; case MAVLINK_MSG_ID_PARAM_REQUEST_LIST: { uint8_t comp=mavlink_msg_param_request_list_get_target_component(&msg); log_i("PARAM_REQUEST_LIST for %i",comp); if(comp!=MY_COMP_ID) { continue; } uint16_t nums=mParams->GetParamSize(); for(int i=0;iGetName(i); for(int j=0;jGetValue(i); mTransmitter->SendParameter(val); } } break; case MAVLINK_MSG_ID_PARAM_REQUEST_READ: { uint8_t comp=mavlink_msg_param_request_read_get_target_component(&msg); log_i("PARAM_REQUEST_READ for %i",comp); if(comp!=MY_COMP_ID) { continue; } mavlink_param_request_read_t param_to_read = {0}; mavlink_msg_param_request_read_decode(&msg,¶m_to_read); log_i("Param request:%s %d\n\r",param_to_read.param_id,param_to_read.param_index); mavlink_param_value_t val={0}; uint16_t nums=mParams->GetParamSize(); uint16_t i = param_to_read.param_index; if(i>nums-1) { log_i("BAD PARAM_REQUEST_READ NUM for %i",i); continue; } String name = mParams->GetName(i); for (int j = 0; j < name.length(); j++) if (j < 16) val.param_id[j] = name[j]; if(name.length()<15) val.param_id[name.length()]=0; val.param_count = nums; val.param_index = i; val.param_type = MAV_PARAM_TYPE_REAL32; val.param_value = mParams->GetValue(i); mTransmitter->SendParameter(val); } break; case MAVLINK_MSG_ID_ATTITUDE: { static uint16_t cnt1=0; cnt1++; mavlink_attitude_t attitude; mavlink_msg_attitude_decode(&msg, &attitude); mStateMachine->SetRPY(attitude.roll,attitude.pitch,attitude.yaw); if(cnt1==1200) { uint32_t dt=xTaskGetTickCount()-mLastTick1; dt/=1200; mLastTick1=xTaskGetTickCount(); cnt1=0; String tmp("attitude dt="); tmp+=dt; mTransmitter->SendText(tmp,MAV_SEVERITY_INFO); log_i("attitude dt=%d",dt); } } break; case MAVLINK_MSG_ID_GLOBAL_POSITION_INT: { static uint16_t cnt=0; cnt++; mavlink_global_position_int_t pos; mavlink_msg_global_position_int_decode(&msg, &pos); mStateMachine->SetPos(pos.lat*1e-7,pos.lon*1e-7,pos.relative_alt/1000.0); if(cnt==1000) { uint32_t dt=xTaskGetTickCount()-mLastTick; dt/=1000; mLastTick=xTaskGetTickCount(); cnt=0; String tmp("GLOBAL_POSITION_INT dt="); tmp+=dt; mTransmitter->SendText(tmp,MAV_SEVERITY_INFO); log_i("GLOBAL_POSITION_INT dt=%d",dt); } } break; case MAVLINK_MSG_ID_PARAM_SET: { mavlink_param_set_t param_set = {0}; mavlink_msg_param_set_decode(&msg, ¶m_set); log_v("Mavlink param set:%s %f\n\r",param_set.param_id,(float)param_set.param_value); String name(param_set.param_id); if(name.length()>16) { name.remove(16,name.length()-16); } uint16_t idx=mParams->SetParam(name,param_set.param_value); uint16_t nums=mParams->GetParamSize(); if(idxWriteParam(idx); mavlink_param_value_t val={0}; for (int j = 0; j < name.length(); j++) if (j < 16) val.param_id[j] = name[j]; val.param_id[name.length()]=0; val.param_count = nums; val.param_index = idx; val.param_type = MAV_PARAM_TYPE_REAL32; val.param_value = mParams->GetValue(idx); mTransmitter->SendParameter(val); if(name=="CTRL_REBOOT") { mTransmitter->SendText("Navigation computer reboot!",MAV_SEVERITY_CRITICAL); } if(name=="CTRL_TEST_ALT") { uint8_t m=mParams->GetValue("CTRL_TEST_MODE"); mStateMachine->SetTestMode(m,val.param_value); } if(name=="CTRL_K_YAW") { float kp=mParams->GetValue("CTRL_K_YAW"); mStateMachine->SetK(kp); } if(name=="CTRL_I_YAW") { float kp=mParams->GetValue("CTRL_I_YAW"); mStateMachine->SetI(kp); } if(name=="CTRL_D_YAW") { float kp=mParams->GetValue("CTRL_D_YAW"); mStateMachine->SetD(kp); } if(name=="CTRL_I_MAX") { float kp=mParams->GetValue("CTRL_I_MAX"); mStateMachine->SetImax(kp); } if(name=="CTRL_K_PITCH") { float kp=mParams->GetValue("CTRL_K_PITCH"); mStateMachine->SetKpitch(kp); } if(name=="CTRL_USE_KPITCH") { bool m=mParams->GetValue("CTRL_USE_KPITCH"); mStateMachine->SetUseKpitch(m); } if(name=="VIDEO_ENABLE") { bool m=mParams->GetValue("VIDEO_ENABLE"); mStateMachine->SetTrackerEnable(m); } if(name=="CTRL_ATTACK_SPD") { float m=mParams->GetValue("CTRL_ATTACK_SPD"); mStateMachine->SetAttackSpeed(m); } if(name=="CAM_SRV_CH") { float m=mParams->GetValue("CAM_SRV_CH"); mStateMachine->SetCamSrvCH(m); } if(name=="CTRL_SRV_CH") { float m=mParams->GetValue("CTRL_SRV_CH"); mStateMachine->SetCTRLSrvCH(m); } if(name=="CAM_SRV_MAX") { float m=mParams->GetValue("CAM_SRV_MAX"); mStateMachine->SetCamSrvMax(m); } if(name=="CAM_SRV_MIN") { float m=mParams->GetValue("CAM_SRV_MIN"); mStateMachine->SetCamSrvMin(m); } if(name=="CAM_ANG_CRUISE") { float m=mParams->GetValue("CAM_ANG_CRUISE"); mStateMachine->SetCamAngCruise(m); } if(name=="CAM_ANG_MAX") { float m=mParams->GetValue("CAM_ANG_MAX"); mStateMachine->SetCamAngMax(m); } if(name=="CAM_ANG_MIN") { float m=mParams->GetValue("CAM_ANG_MIN"); mStateMachine->SetCamAngMin(m); } if(name=="CTRL_FLAP_RC") { float m=mParams->GetValue("CTRL_FLAP_RC"); mStateMachine->SetFlapRC(m); } if(name=="CTRL_FLAP_VAL") { float m=mParams->GetValue("CTRL_FLAP_VAL"); mStateMachine->SetFlapVAL(m); } if(name=="TEST_SRV_CH") { float m=mParams->GetValue("TEST_SRV_CH"); mStateMachine->SetTestSrvCH(m); } if(name=="TEST_SRV_AMP") { float m=mParams->GetValue("TEST_SRV_AMP"); mStateMachine->SetTestSrvAmp(m); } if(name=="TEST_SRV_T") { float m=mParams->GetValue("TEST_SRV_T"); mStateMachine->SetTestSrvT(m); } if(name=="TEST_SRV_TRIM") { float m=mParams->GetValue("TEST_SRV_TRIM"); mStateMachine->SetTestSrvTrim(m); } if(name=="CTRL_LOITER_ALT") { float m=mParams->GetValue("CTRL_LOITER_ALT"); mStateMachine->SetLoiterAlt(m); } if(name=="CTRL_SAFE_SPD") { float m=mParams->GetValue("CTRL_SAFE_SPD"); if(m<20) m=20; mParams->SetParam("CTRL_SAFE_SPD",m); mStateMachine->SetSafeSpeed(m); } if(name=="CTRL_SAFE_PITCH") { float m=mParams->GetValue("CTRL_SAFE_PITCH"); if(m<0) m=0; mParams->SetParam("CTRL_SAFE_PITCH",m); mStateMachine->SetSafePitch(m); } if(name=="CTRL_SAFE_TIME") { float m=mParams->GetValue("CTRL_SAFE_TIME"); if(m<10) m=10; mParams->SetParam("CTRL_SAFE_TIME",m); mStateMachine->SetSafeTime(m); } if(name=="CAM_SRV_REVERSE") { float m=mParams->GetValue("CAM_SRV_REVERSE"); mStateMachine->SetCamReverse(m); } if(name=="CAM_SRV_KI") { float m=mParams->GetValue("CAM_SRV_KI"); if(m<0) { m=0.1; mParams->SetParam("CAM_SRV_KI",m); } mStateMachine->SetCamSrvKI(m); } if(name=="CAM_SRV_KP") { float m=mParams->GetValue("CAM_SRV_KP"); if(m<0) { m=0.0; mParams->SetParam("CAM_SRV_KP",m); } mStateMachine->SetCamSrvKP(m); } if(name=="CAM_PITCH_DELTA") { float m=mParams->GetValue("CAM_PITCH_DELTA"); if(m<2.0) { m=2.0; mParams->SetParam("CAM_PITCH_DELTA",m); } mStateMachine->SetCamPitchDelta(m); } if(name=="CAM_RATE_MAX") { float m=mParams->GetValue("CAM_RATE_MAX"); if(m<1.0) { m=1.0; mParams->SetParam("CAM_RATE_MAX",m); } mStateMachine->SetCamRateMax(m); } if(name=="CTRL_TECS_DALT") { float m=mParams->GetValue("CTRL_TECS_DALT"); mStateMachine->SetTecsDalt(m); } } else { log_v("Error set:%s %i ret idx=%i\n\r",name.c_str(),name.length(),idx); } } break; case MAVLINK_MSG_ID_PARAM_VALUE: { //mavlink_param_value_t val={0}; //mavlink_msg_param_value_decode(&msg,&val); //mTransmitter->SendParameter(val); } break; case MAVLINK_MSG_ID_MISSION_COUNT: { mavlink_mission_count_t req; mavlink_msg_mission_count_decode(&msg,&req); mStateMachine->SetWpCount(req.count-1); log_i("Mavlink readed wpnums=%d",req.count); } break; case MAVLINK_MSG_ID_MISSION_ITEM: { mavlink_mission_item_t item; mavlink_msg_mission_item_decode(&msg,&item); mStateMachine->SetWp(item); log_i("Mavlink readed wp num=%d",item.seq); } break; case MAVLINK_MSG_ID_MISSION_REQUEST: { mavlink_mission_request_t req; mavlink_msg_mission_request_decode(&msg,&req); mTransmitter->SendMissionItem(req.seq); log_i("Mavlink requesr wp num=%d",req.seq); } break; case MAVLINK_MSG_ID_MISSION_ACK: { mavlink_mission_ack_t ack; mavlink_msg_mission_ack_decode(&msg,&ack); if(ack.type==0) mStateMachine->SetWpsSended(true); log_i("Mavlink mission ack=%d",ack.type); } break; case MAVLINK_MSG_ID_MISSION_CURRENT: { mavlink_mission_current_t wpc; mavlink_msg_mission_current_decode(&msg, &wpc); mStateMachine->SetCurrWpNum(wpc.seq); } break; case MAVLINK_MSG_ID_COMMAND_ACK: { mavlink_command_ack_t ack; mavlink_msg_command_ack_decode(&msg,&ack); //qDebug()<<"MAVLINK_MSG_ID_COMMAND_ACK "<mBufferOut, &msg); mTracker->SetMavlikBuf(obj->mBufferOut,len); } } } } else vTaskDelay(1); } } void MavlinkReciver::reboot() { vTaskDelay(2000); ESP.restart(); }