PageRenderTime 58ms CodeModel.GetById 27ms RepoModel.GetById 0ms app.codeStats 1ms

/software/onboard/aqv5/aq_mavlink.c

http://autoquad.googlecode.com/
C | 586 lines | 460 code | 83 blank | 43 comment | 74 complexity | 2ff90888f7c250489142187d87f0fe91 MD5 | raw file
Possible License(s): GPL-3.0
  1. /*
  2. This file is part of AutoQuad.
  3. AutoQuad is free software: you can redistribute it and/or modify
  4. it under the terms of the GNU General Public License as published by
  5. the Free Software Foundation, either version 3 of the License, or
  6. (at your option) any later version.
  7. AutoQuad is distributed in the hope that it will be useful,
  8. but WITHOUT ANY WARRANTY; without even the implied warranty of
  9. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  10. GNU General Public License for more details.
  11. You should have received a copy of the GNU General Public License
  12. along with AutoQuad. If not, see <http://www.gnu.org/licenses/>.
  13. Copyright Š 2011 Bill Nesbitt
  14. */
  15. #include "aq_mavlink.h"
  16. #include "mavlink.h"
  17. #include "config.h"
  18. #include "timer.h"
  19. #include "adc.h"
  20. #include "spektrum.h"
  21. #include "quat.h"
  22. #include "gps.h"
  23. #include "flash.h"
  24. #include "motors.h"
  25. #include "control.h"
  26. #include "nav.h"
  27. #include "math.h"
  28. #include <string.h>
  29. mavlinkStruct_t mavlinkData;
  30. mavlink_system_t mavlink_system;
  31. unsigned mavlinkSendTaskStack[1+STACKSIZE+1];
  32. unsigned mavlinkRecvTaskStack[1+STACKSIZE+1];
  33. void comm_send_ch(mavlink_channel_t chan, uint8_t ch) {
  34. serialWrite(mavlinkData.serialPort, ch);
  35. }
  36. void mavlinkNotice(const char *s) {
  37. // queue message, notify and leave
  38. ctl_message_queue_post_nb(&mavlinkData.notices, (void *)s);
  39. ctl_events_pulse(&publicEvents, AQ_TELEM_RDY);
  40. }
  41. void mavlinkSendTaskCode(void *unused) {
  42. serialPort_t *s = mavlinkData.serialPort;
  43. void *msg;
  44. long radioHits, radioMisses;
  45. unsigned long mavCounter;
  46. unsigned long micros;
  47. unsigned long lastMicros = 0;
  48. AQ_NOTICE("Mavlink send task started...\n");
  49. while (1) {
  50. ctl_events_wait(CTL_EVENT_WAIT_ANY_EVENTS, &publicEvents, AQ_TELEM_RDY, CTL_TIMEOUT_DELAY, 100); // 10Hz minimum
  51. micros = timerMicros();
  52. mavCounter = counter;
  53. // handle rollover
  54. if (micros < lastMicros) {
  55. mavlinkData.nextHeartbeat = 0;
  56. mavlinkData.nextParam = 0;
  57. memset(mavlinkData.streamNext, 0, sizeof(mavlinkData.streamInterval));
  58. }
  59. lastMicros = micros;
  60. // calculate radio reception quality
  61. if (spektrumData.frameCount > radioHits)
  62. mavlinkData.radioQuality = (spektrumData.frameCount - radioHits) * 255 /
  63. ((spektrumData.frameCount - radioHits) + (spektrumData.errorCount - radioMisses));
  64. else
  65. if (mavlinkData.radioQuality)
  66. mavlinkData.radioQuality--;
  67. radioHits = spektrumData.frameCount;
  68. radioMisses = spektrumData.errorCount;
  69. // calculate idle time
  70. mavlinkData.idlePercent = (mavCounter - mavlinkData.lastCounter) * 1000 * (1e6 / 2 / adcData.sampleTime) / (72e6 / minCycles);
  71. mavlinkData.lastCounter = mavCounter;
  72. ctl_mutex_lock(&mavlinkData.serialPortMutex, CTL_TIMEOUT_NONE, 0);
  73. // heartbeat & status
  74. if (mavlinkData.nextHeartbeat < micros) {
  75. mavlink_msg_heartbeat_send(MAVLINK_COMM_0, mavlink_system.type, MAV_AUTOPILOT_GENERIC);
  76. mavlink_msg_sys_status_send(MAVLINK_COMM_0, mavlinkData.mode, mavlinkData.nav_mode, mavlinkData.status, 1000-mavlinkData.idlePercent, AQ_VIN * 1000, (AQ_VIN - 9.8f) / 12.6f * 1000, mavlinkData.packetDrops);
  77. mavlinkData.nextHeartbeat = micros + MAVLINK_HEARTBEAT_INTERVAL;
  78. }
  79. // raw sensors
  80. else if ((mavlinkData.streamInterval[MAV_DATA_STREAM_ALL] || mavlinkData.streamInterval[MAV_DATA_STREAM_RAW_SENSORS]) && mavlinkData.streamNext[MAV_DATA_STREAM_RAW_SENSORS] < micros) {
  81. mavlink_msg_scaled_imu_send(MAVLINK_COMM_0, micros, AQ_ACCX*1000.0, AQ_ACCY*1000.0, AQ_ACCZ*1000.0, AQ_RATEX*1000.0, AQ_RATEY*1000.0, AQ_RATEZ*1000.0, AQ_MAGX*1000.0, AQ_MAGY*1000.0, AQ_MAGZ*1000.0);
  82. mavlink_msg_scaled_pressure_send(MAVLINK_COMM_0, micros, AQ_PRESSURE*0.01f, 0.0f, AQ_TEMP*100);
  83. mavlinkData.streamNext[MAV_DATA_STREAM_RAW_SENSORS] = micros + mavlinkData.streamInterval[MAV_DATA_STREAM_RAW_SENSORS];
  84. }
  85. // position
  86. else if ((mavlinkData.streamInterval[MAV_DATA_STREAM_ALL] || mavlinkData.streamInterval[MAV_DATA_STREAM_POSITION]) && mavlinkData.streamNext[MAV_DATA_STREAM_POSITION] < micros) {
  87. mavlink_msg_gps_raw_int_send(MAVLINK_COMM_0, micros, 3, gpsData.lat*1e7, gpsData.lon*1e7, gpsData.height*1e3, gpsData.hDOP, gpsData.vDOP, gpsData.speed, gpsData.heading);
  88. // mavlink_msg_gps_raw_send(MAVLINK_COMM_0, micros, 3, gpsData.lat, gpsData.lon, gpsData.height, gpsData.hDOP, gpsData.vDOP, gpsData.speed, gpsData.heading);
  89. mavlinkData.streamNext[MAV_DATA_STREAM_POSITION] = micros + mavlinkData.streamInterval[MAV_DATA_STREAM_POSITION];
  90. }
  91. // extended status
  92. // else if ((mavlinkData.streamInterval[MAV_DATA_STREAM_ALL] || mavlinkData.streamInterval[MAV_DATA_STREAM_EXTENDED_STATUS]) && mavlinkData.streamNext[MAV_DATA_STREAM_EXTENDED_STATUS] < micros) {
  93. // mavlinkData.streamNext[MAV_DATA_STREAM_EXTENDED_STATUS] = micros + mavlinkData.streamInterval[MAV_DATA_STREAM_EXTENDED_STATUS];
  94. // }
  95. // rc channels
  96. else if ((mavlinkData.streamInterval[MAV_DATA_STREAM_ALL] || mavlinkData.streamInterval[MAV_DATA_STREAM_RC_CHANNELS]) && mavlinkData.streamNext[MAV_DATA_STREAM_RC_CHANNELS] < micros) {
  97. mavlink_msg_rc_channels_raw_send(MAVLINK_COMM_0, SPEKTRUM_THROT+1024, SPEKTRUM_ROLL+1024, SPEKTRUM_PITCH+1024, SPEKTRUM_RUDD+1024, SPEKTRUM_GEAR+1024, SPEKTRUM_FLAPS+1024, SPEKTRUM_AUX2+1024, SPEKTRUM_AUX3+1024, mavlinkData.radioQuality);
  98. mavlink_msg_rc_channels_scaled_send(MAVLINK_COMM_0, (SPEKTRUM_THROT-750)*13, SPEKTRUM_ROLL*13, SPEKTRUM_PITCH*13, SPEKTRUM_RUDD*13, SPEKTRUM_GEAR*13, SPEKTRUM_FLAPS*13, SPEKTRUM_AUX2*13, SPEKTRUM_AUX3*13, mavlinkData.radioQuality);
  99. mavlinkData.streamNext[MAV_DATA_STREAM_RC_CHANNELS] = micros + mavlinkData.streamInterval[MAV_DATA_STREAM_RC_CHANNELS];
  100. }
  101. // raw controller
  102. else if ((mavlinkData.streamInterval[MAV_DATA_STREAM_ALL] || mavlinkData.streamInterval[MAV_DATA_STREAM_RAW_CONTROLLER]) && mavlinkData.streamNext[MAV_DATA_STREAM_RAW_CONTROLLER] < micros) {
  103. mavlink_msg_attitude_send(MAVLINK_COMM_0, micros, -AQ_ROLL*DEG_TO_RAD, AQ_PITCH*DEG_TO_RAD, AQ_YAW*DEG_TO_RAD, -(AQ_RATEX - quatData.rateBias[0])*DEG_TO_RAD, (AQ_RATEY - quatData.rateBias[0])*DEG_TO_RAD, (AQ_RATEZ - quatData.rateBias[0])*DEG_TO_RAD);
  104. mavlink_msg_servo_output_raw_send(MAVLINK_COMM_0, motorsData.m1, motorsData.m2, motorsData.m3, motorsData.m4, motorsData.m5, motorsData.m6, motorsData.m7, motorsData.m8);
  105. mavlinkData.streamNext[MAV_DATA_STREAM_RAW_CONTROLLER] = micros + mavlinkData.streamInterval[MAV_DATA_STREAM_RAW_CONTROLLER];
  106. }
  107. // send pending notices
  108. if (ctl_message_queue_receive_nb(&mavlinkData.notices, &msg) != 0)
  109. mavlink_msg_statustext_send(MAVLINK_COMM_0, 0, (const int8_t*)msg);
  110. // list all parameters
  111. if (mavlinkData.currentParam < mavlinkData.numParams && mavlinkData.nextParam < micros) {
  112. mavlink_msg_param_value_send(MAVLINK_COMM_0, mavlinkData.paramIds[mavlinkData.currentParam], *mavlinkData.paramValues[mavlinkData.currentParam], mavlinkData.numParams, mavlinkData.currentParam++);
  113. mavlinkData.nextParam = micros + MABLINK_PARAM_INTERVAL;
  114. }
  115. ctl_mutex_unlock(&mavlinkData.serialPortMutex);
  116. }
  117. }
  118. void mavlinkTakeAction(mavlink_message_t *msg) {
  119. uint8_t action;
  120. uint8_t ack = 0;
  121. action = mavlink_msg_action_get_action(msg);
  122. switch (action) {
  123. case MAV_ACTION_STORAGE_READ:
  124. if (!controlData.flying) {
  125. configFlashRead();
  126. ack = 1;
  127. }
  128. break;
  129. case MAV_ACTION_STORAGE_WRITE:
  130. if (!controlData.flying && configFlashWrite())
  131. ack = 1;
  132. break;
  133. default:
  134. break;
  135. }
  136. mavlink_msg_action_ack_send(MAVLINK_COMM_0, action, ack);
  137. }
  138. void mavlinkRecvTaskCode(void *unused) {
  139. serialPort_t *s = mavlinkData.serialPort;
  140. mavlink_message_t msg;
  141. mavlink_status_t status;
  142. int8_t paramId[16];
  143. uint8_t c;
  144. AQ_NOTICE("Mavlink receive task started...\n");
  145. while (1) {
  146. ctl_events_wait(CTL_EVENT_WAIT_ANY_EVENTS, &serialAvailableEvent, (1<<s->waitFlag), CTL_TIMEOUT_NONE, 0);
  147. // process incoming data
  148. while (serialAvailable(s)) {
  149. c = serialRead(s);
  150. // Try to get a new message
  151. if (mavlink_parse_char(MAVLINK_COMM_0, c, &msg, &status)) {
  152. ctl_mutex_lock(&mavlinkData.serialPortMutex, CTL_TIMEOUT_NONE, 0);
  153. digitalHi(mavlinkData.debugLed);
  154. // Handle message
  155. switch(msg.msgid) {
  156. // TODO: finish this block
  157. case MAVLINK_MSG_ID_CHANGE_OPERATOR_CONTROL:
  158. if (mavlink_msg_set_mode_get_target(&msg) == mavlink_system.sysid) {
  159. mavlink_msg_change_operator_control_ack_send(MAVLINK_COMM_0, msg.sysid, mavlink_msg_change_operator_control_get_control_request(&msg), 0);
  160. }
  161. break;
  162. case MAVLINK_MSG_ID_SET_MODE:
  163. if (mavlink_msg_set_mode_get_target(&msg) == mavlink_system.sysid) {
  164. mavlinkData.mode = mavlink_msg_set_mode_get_mode(&msg);
  165. mavlink_msg_sys_status_send(MAVLINK_COMM_0, mavlinkData.mode, mavlinkData.nav_mode, mavlinkData.status, mavlinkData.idlePercent, AQ_VIN * 1000, 500, mavlinkData.packetDrops);
  166. }
  167. break;
  168. case MAVLINK_MSG_ID_ACTION:
  169. if (mavlink_msg_action_get_target(&msg) == mavlink_system.sysid) {
  170. mavlinkTakeAction(&msg);
  171. }
  172. break;
  173. case MAVLINK_MSG_ID_WAYPOINT_REQUEST_LIST:
  174. if (mavlink_msg_waypoint_request_list_get_target_system(&msg) == mavlink_system.sysid) {
  175. mavlink_msg_waypoint_count_send(MAVLINK_COMM_0, msg.sysid, msg.compid, navGetWaypointCount());
  176. }
  177. break;
  178. case MAVLINK_MSG_ID_WAYPOINT_CLEAR_ALL:
  179. if (mavlink_msg_waypoint_clear_all_get_target_system(&msg) == mavlink_system.sysid) {
  180. mavlink_msg_waypoint_ack_send(MAVLINK_COMM_0, mavlink_system.sysid, mavlink_system.compid, navClearWaypoints());
  181. }
  182. break;
  183. case MAVLINK_MSG_ID_WAYPOINT_REQUEST:
  184. if (mavlink_msg_waypoint_request_get_target_system(&msg) == mavlink_system.sysid) {
  185. uint16_t seqId;
  186. navMission_t *wp;
  187. seqId = mavlink_msg_waypoint_request_get_seq(&msg);
  188. wp = navGetWaypoint(seqId);
  189. mavlink_msg_waypoint_send(MAVLINK_COMM_0, msg.sysid, msg.compid,
  190. seqId, MAV_FRAME_GLOBAL, MAV_CMD_NAV_WAYPOINT, 0, 1,
  191. wp->targetRadius, wp->loiterTime, 0.0, wp->poiHeading, wp->targetLat, wp->targetLon, wp->targetAlt);
  192. }
  193. break;
  194. case MAVLINK_MSG_ID_WAYPOINT_COUNT:
  195. if (mavlink_msg_waypoint_count_get_target_system(&msg) == mavlink_system.sysid) {
  196. mavlink_msg_waypoint_ack_send(MAVLINK_COMM_0, mavlink_system.sysid, mavlink_system.compid, 0);
  197. }
  198. break;
  199. case MAVLINK_MSG_ID_PARAM_REQUEST_READ:
  200. if (mavlink_msg_param_request_read_get_target_system(&msg) == mavlink_system.sysid) {
  201. uint16_t paramIndex;
  202. paramIndex = mavlink_msg_param_request_read_get_param_index(&msg);
  203. if (paramIndex < mavlinkData.numParams)
  204. mavlink_msg_param_value_send(MAVLINK_COMM_0, mavlinkData.paramIds[paramIndex], *mavlinkData.paramValues[paramIndex], mavlinkData.numParams, paramIndex);
  205. }
  206. break;
  207. case MAVLINK_MSG_ID_PARAM_REQUEST_LIST:
  208. if (mavlink_msg_param_request_list_get_target_system(&msg) == mavlink_system.sysid) {
  209. mavlinkData.currentParam = 0;
  210. mavlinkData.nextParam = 0;
  211. }
  212. break;
  213. case MAVLINK_MSG_ID_PARAM_SET:
  214. if (mavlink_msg_param_set_get_target_system(&msg) == mavlink_system.sysid) {
  215. int paramIndex = -1;
  216. float paramValue;
  217. int i, j;
  218. mavlink_msg_param_set_get_param_id(&msg, paramId);
  219. for (i = 0; i < mavlinkData.numParams; i++) {
  220. for (j = 0; j < MAVLINK_PARAMID_LEN; j++)
  221. if (paramId[j] != mavlinkData.paramIds[i][j] || paramId[j] == 0)
  222. break;
  223. if (paramId[j] == 0) {
  224. paramIndex = i;
  225. break;
  226. }
  227. }
  228. if (paramIndex >= 0 && paramIndex < mavlinkData.numParams) {
  229. paramValue = mavlink_msg_param_set_get_param_value(&msg);
  230. if (!isnan(paramValue) && !isinf(paramValue) && !controlData.flying)
  231. *mavlinkData.paramValues[i] = paramValue;
  232. // send back what we have no matter what
  233. mavlink_msg_param_value_send(MAVLINK_COMM_0, paramId, *mavlinkData.paramValues[i], mavlinkData.numParams, i);
  234. }
  235. }
  236. break;
  237. case MAVLINK_MSG_ID_REQUEST_DATA_STREAM:
  238. if (mavlink_msg_request_data_stream_get_target_system(&msg) == mavlink_system.sysid) {
  239. uint16_t rate;
  240. uint8_t stream_id;
  241. stream_id = mavlink_msg_request_data_stream_get_req_stream_id(&msg);
  242. rate = mavlink_msg_request_data_stream_get_req_message_rate(&msg);
  243. if (rate > 0 && rate < 200 && stream_id < MAV_DATA_STREAM_ENUM_END && mavlink_msg_request_data_stream_get_start_stop(&msg)) {
  244. mavlinkData.streamInterval[stream_id] = 1e6 / rate;
  245. }
  246. else {
  247. mavlinkData.streamInterval[stream_id] = 0;
  248. }
  249. }
  250. break;
  251. default:
  252. //Do nothing
  253. break;
  254. }
  255. digitalLo(mavlinkData.debugLed);
  256. ctl_mutex_unlock(&mavlinkData.serialPortMutex);
  257. }
  258. // Update global packet drops counter
  259. mavlinkData.packetDrops += status.packet_rx_drop_count;
  260. }
  261. }
  262. }
  263. int mavlinkInitParams(void) {
  264. int i = 0;
  265. mavlinkData.paramIds[i] = "CTRL_FACT_THRO"; mavlinkData.paramValues[i] = &configData.controlThroFactor; i++;
  266. mavlinkData.paramIds[i] = "CTRL_FACT_PITC"; mavlinkData.paramValues[i] = &configData.controlPitchFactor; i++;
  267. mavlinkData.paramIds[i] = "CTRL_FACT_ROLL"; mavlinkData.paramValues[i] = &configData.controlRollFactor; i++;
  268. mavlinkData.paramIds[i] = "CTRL_FACT_RUDD"; mavlinkData.paramValues[i] = &configData.controlRuddFactor; i++;
  269. mavlinkData.paramIds[i] = "CTRL_DEAD_BAND"; mavlinkData.paramValues[i] = &configData.controlDeadBand; i++;
  270. mavlinkData.paramIds[i] = "CTRL_MIN_THROT"; mavlinkData.paramValues[i] = &configData.controlMinThro; i++;
  271. mavlinkData.paramIds[i] = "CTRL_MAX"; mavlinkData.paramValues[i] = &configData.controlMax; i++;
  272. mavlinkData.paramIds[i] = "CTRL_TLT_RTE_P"; mavlinkData.paramValues[i] = &configData.controlTiltRateP; i++;
  273. mavlinkData.paramIds[i] = "CTRL_TLT_RTE_I"; mavlinkData.paramValues[i] = &configData.controlTiltRateI; i++;
  274. mavlinkData.paramIds[i] = "CTRL_TLT_RTE_D"; mavlinkData.paramValues[i] = &configData.controlTiltRateD; i++;
  275. mavlinkData.paramIds[i] = "CTRL_TLT_RTE_F"; mavlinkData.paramValues[i] = &configData.controlTiltRateF; i++;
  276. mavlinkData.paramIds[i] = "CTRL_TLT_RTE_PM"; mavlinkData.paramValues[i] = &configData.controlTiltRateMaxP; i++;
  277. mavlinkData.paramIds[i] = "CTRL_TLT_RTE_IM"; mavlinkData.paramValues[i] = &configData.controlTiltRateMaxI; i++;
  278. mavlinkData.paramIds[i] = "CTRL_TLT_RTE_DM"; mavlinkData.paramValues[i] = &configData.controlTiltRateMaxD; i++;
  279. mavlinkData.paramIds[i] = "CTRL_TLT_RTE_OM"; mavlinkData.paramValues[i] = &configData.controlTiltRateMaxO; i++;
  280. mavlinkData.paramIds[i] = "CTRL_YAW_RTE_P"; mavlinkData.paramValues[i] = &configData.controlYawRateP; i++;
  281. mavlinkData.paramIds[i] = "CTRL_YAW_RTE_I"; mavlinkData.paramValues[i] = &configData.controlYawRateI; i++;
  282. mavlinkData.paramIds[i] = "CTRL_YAW_RTE_D"; mavlinkData.paramValues[i] = &configData.controlYawRateD; i++;
  283. mavlinkData.paramIds[i] = "CTRL_YAW_RTE_F"; mavlinkData.paramValues[i] = &configData.controlYawRateF; i++;
  284. mavlinkData.paramIds[i] = "CTRL_YAW_RTE_PM"; mavlinkData.paramValues[i] = &configData.controlYawRateMaxP; i++;
  285. mavlinkData.paramIds[i] = "CTRL_YAW_RTE_IM"; mavlinkData.paramValues[i] = &configData.controlYawRateMaxI; i++;
  286. mavlinkData.paramIds[i] = "CTRL_YAW_RTE_DM"; mavlinkData.paramValues[i] = &configData.controlYawRateMaxD; i++;
  287. mavlinkData.paramIds[i] = "CTRL_YAW_RTE_OM"; mavlinkData.paramValues[i] = &configData.controlYawRateMaxO; i++;
  288. mavlinkData.paramIds[i] = "CTRL_TLT_ANG_P"; mavlinkData.paramValues[i] = &configData.controlTiltAngleP; i++;
  289. mavlinkData.paramIds[i] = "CTRL_TLT_ANG_I"; mavlinkData.paramValues[i] = &configData.controlTiltAngleI; i++;
  290. mavlinkData.paramIds[i] = "CTRL_TLT_ANG_D"; mavlinkData.paramValues[i] = &configData.controlTiltAngleD; i++;
  291. mavlinkData.paramIds[i] = "CTRL_TLT_ANG_F"; mavlinkData.paramValues[i] = &configData.controlTiltAngleF; i++;
  292. mavlinkData.paramIds[i] = "CTRL_TLT_ANG_PM"; mavlinkData.paramValues[i] = &configData.controlTiltAngleMaxP; i++;
  293. mavlinkData.paramIds[i] = "CTRL_TLT_ANG_IM"; mavlinkData.paramValues[i] = &configData.controlTiltAngleMaxI; i++;
  294. mavlinkData.paramIds[i] = "CTRL_TLT_ANG_DM"; mavlinkData.paramValues[i] = &configData.controlTiltAngleMaxD; i++;
  295. mavlinkData.paramIds[i] = "CTRL_TLT_ANG_OM"; mavlinkData.paramValues[i] = &configData.controlTiltAngleMaxO; i++;
  296. mavlinkData.paramIds[i] = "CTRL_YAW_ANG_P"; mavlinkData.paramValues[i] = &configData.controlYawAngleP; i++;
  297. mavlinkData.paramIds[i] = "CTRL_YAW_ANG_I"; mavlinkData.paramValues[i] = &configData.controlYawAngleI; i++;
  298. mavlinkData.paramIds[i] = "CTRL_YAW_ANG_D"; mavlinkData.paramValues[i] = &configData.controlYawAngleD; i++;
  299. mavlinkData.paramIds[i] = "CTRL_YAW_ANG_F"; mavlinkData.paramValues[i] = &configData.controlYawAngleF; i++;
  300. mavlinkData.paramIds[i] = "CTRL_YAW_ANG_PM"; mavlinkData.paramValues[i] = &configData.controlYawAngleMaxP; i++;
  301. mavlinkData.paramIds[i] = "CTRL_YAW_ANG_IM"; mavlinkData.paramValues[i] = &configData.controlYawAngleMaxI; i++;
  302. mavlinkData.paramIds[i] = "CTRL_YAW_ANG_DM"; mavlinkData.paramValues[i] = &configData.controlYawAngleMaxD; i++;
  303. mavlinkData.paramIds[i] = "CTRL_YAW_ANG_OM"; mavlinkData.paramValues[i] = &configData.controlYawAngleMaxO; i++;
  304. mavlinkData.paramIds[i] = "GPS_BAUD_RATE"; mavlinkData.paramValues[i] = &configData.gpsBaud; i++;
  305. mavlinkData.paramIds[i] = "GPS_POS_DEV"; mavlinkData.paramValues[i] = &configData.gpsPosDev; i++;
  306. mavlinkData.paramIds[i] = "GPS_VEL_DEV"; mavlinkData.paramValues[i] = &configData.gpsVelDev; i++;
  307. mavlinkData.paramIds[i] = "GPS_RATE"; mavlinkData.paramValues[i] = &configData.gpsRate; i++;
  308. mavlinkData.paramIds[i] = "MOT_START"; mavlinkData.paramValues[i] = &configData.motorsStart; i++;
  309. mavlinkData.paramIds[i] = "MOT_MIN"; mavlinkData.paramValues[i] = &configData.motorsMin; i++;
  310. mavlinkData.paramIds[i] = "MOT_MAX"; mavlinkData.paramValues[i] = &configData.motorsMax; i++;
  311. mavlinkData.paramIds[i] = "MOT_HOV_THROT"; mavlinkData.paramValues[i] = &configData.motorsHoverThrot; i++;
  312. mavlinkData.paramIds[i] = "MOT_EXP_FACT"; mavlinkData.paramValues[i] = &configData.motorsExpFactor; i++;
  313. mavlinkData.paramIds[i] = "MOT_EXP_MIN"; mavlinkData.paramValues[i] = &configData.motorsExpMin; i++;
  314. mavlinkData.paramIds[i] = "MOT_EXP_MAX"; mavlinkData.paramValues[i] = &configData.motorsExpMax; i++;
  315. mavlinkData.paramIds[i] = "MOT_ROLL_ASYM"; mavlinkData.paramValues[i] = &configData.motorsRollAsym; i++;
  316. mavlinkData.paramIds[i] = "MOT_PITCH_ASYM"; mavlinkData.paramValues[i] = &configData.motorsPitchAsym; i++;
  317. mavlinkData.paramIds[i] = "MOT_MAG_BIAS_X"; mavlinkData.paramValues[i] = &configData.motorsMagBiasX; i++;
  318. mavlinkData.paramIds[i] = "MOT_MAG_BIAS_Y"; mavlinkData.paramValues[i] = &configData.motorsMagBiasY; i++;
  319. mavlinkData.paramIds[i] = "MOT_MAG_BIAS_Z"; mavlinkData.paramValues[i] = &configData.motorsMagBiasZ; i++;
  320. mavlinkData.paramIds[i] = "MOT_MAG_SCAL_X"; mavlinkData.paramValues[i] = &configData.motorsMagScaleX; i++;
  321. mavlinkData.paramIds[i] = "MOT_MAG_SCAL_Y"; mavlinkData.paramValues[i] = &configData.motorsMagScaleY; i++;
  322. mavlinkData.paramIds[i] = "MOT_MAG_SCAL_Z"; mavlinkData.paramValues[i] = &configData.motorsMagScaleZ; i++;
  323. mavlinkData.paramIds[i] = "MOT_MAG_ALGN_XY"; mavlinkData.paramValues[i] = &configData.motorsMagAlgnXY; i++;
  324. mavlinkData.paramIds[i] = "MOT_MAG_ALGN_XZ"; mavlinkData.paramValues[i] = &configData.motorsMagAlgnXZ; i++;
  325. mavlinkData.paramIds[i] = "MOT_MAG_ALGN_YX"; mavlinkData.paramValues[i] = &configData.motorsMagAlgnYX; i++;
  326. mavlinkData.paramIds[i] = "MOT_MAG_ALGN_YZ"; mavlinkData.paramValues[i] = &configData.motorsMagAlgnYZ; i++;
  327. mavlinkData.paramIds[i] = "MOT_MAG_ALGN_ZX"; mavlinkData.paramValues[i] = &configData.motorsMagAlgnZX; i++;
  328. mavlinkData.paramIds[i] = "MOT_MAG_ALGN_ZY"; mavlinkData.paramValues[i] = &configData.motorsMagAlgnZY; i++;
  329. mavlinkData.paramIds[i] = "DOWNLINK_BAUD"; mavlinkData.paramValues[i] = &configData.downlinkBaud; i++;
  330. mavlinkData.paramIds[i] = "TELEMETRY_RATE"; mavlinkData.paramValues[i] = &configData.telemetryRate; i++;
  331. mavlinkData.paramIds[i] = "NAV_MIN_PDOP"; mavlinkData.paramValues[i] = &configData.navMinPDOP; i++;
  332. mavlinkData.paramIds[i] = "NAV_MAX_FIXAGE"; mavlinkData.paramValues[i] = &configData.navMaxFixAge; i++;
  333. mavlinkData.paramIds[i] = "NAV_MAX_TILT"; mavlinkData.paramValues[i] = &configData.navMaxTilt; i++;
  334. mavlinkData.paramIds[i] = "NAV_MAX_SPEED"; mavlinkData.paramValues[i] = &configData.navMaxSpeed; i++;
  335. mavlinkData.paramIds[i] = "NAV_SPEED_P"; mavlinkData.paramValues[i] = &configData.navSpeedP; i++;
  336. mavlinkData.paramIds[i] = "NAV_SPEED_I"; mavlinkData.paramValues[i] = &configData.navSpeedI; i++;
  337. mavlinkData.paramIds[i] = "NAV_SPEED_PM"; mavlinkData.paramValues[i] = &configData.navSpeedMaxP; i++;
  338. mavlinkData.paramIds[i] = "NAV_SPEED_IM"; mavlinkData.paramValues[i] = &configData.navSpeedMaxI; i++;
  339. mavlinkData.paramIds[i] = "NAV_SPEED_OM"; mavlinkData.paramValues[i] = &configData.navSpeedMaxO; i++;
  340. mavlinkData.paramIds[i] = "NAV_DIST_P"; mavlinkData.paramValues[i] = &configData.navDistP; i++;
  341. mavlinkData.paramIds[i] = "NAV_DIST_I"; mavlinkData.paramValues[i] = &configData.navDistI; i++;
  342. mavlinkData.paramIds[i] = "NAV_DIST_PM"; mavlinkData.paramValues[i] = &configData.navDistMaxP; i++;
  343. mavlinkData.paramIds[i] = "NAV_DIST_IM"; mavlinkData.paramValues[i] = &configData.navDistMaxI; i++;
  344. mavlinkData.paramIds[i] = "NAV_DIST_OM"; mavlinkData.paramValues[i] = &configData.navDistMaxO; i++;
  345. mavlinkData.paramIds[i] = "NAV_ATL_SPED_P"; mavlinkData.paramValues[i] = &configData.navAltSpeedP; i++;
  346. mavlinkData.paramIds[i] = "NAV_ATL_SPED_I"; mavlinkData.paramValues[i] = &configData.navAltSpeedI; i++;
  347. mavlinkData.paramIds[i] = "NAV_ATL_SPED_PM"; mavlinkData.paramValues[i] = &configData.navAltSpeedMaxP; i++;
  348. mavlinkData.paramIds[i] = "NAV_ATL_SPED_IM"; mavlinkData.paramValues[i] = &configData.navAltSpeedMaxI; i++;
  349. mavlinkData.paramIds[i] = "NAV_ATL_SPED_OM"; mavlinkData.paramValues[i] = &configData.navAltSpeedMaxO; i++;
  350. mavlinkData.paramIds[i] = "NAV_ALT_POS_P"; mavlinkData.paramValues[i] = &configData.navAltPosP; i++;
  351. mavlinkData.paramIds[i] = "NAV_ALT_POS_I"; mavlinkData.paramValues[i] = &configData.navAltPosI; i++;
  352. mavlinkData.paramIds[i] = "NAV_ALT_POS_PM"; mavlinkData.paramValues[i] = &configData.navAltPosMaxP; i++;
  353. mavlinkData.paramIds[i] = "NAV_ALT_POS_IM"; mavlinkData.paramValues[i] = &configData.navAltPosMaxI; i++;
  354. mavlinkData.paramIds[i] = "NAV_ALT_POS_OM"; mavlinkData.paramValues[i] = &configData.navAltPosMaxO; i++;
  355. mavlinkData.paramIds[i] = "NAV_FILTER_PX"; mavlinkData.paramValues[i] = &configData.navFiltPx; i++;
  356. mavlinkData.paramIds[i] = "NAV_FILTER_VX"; mavlinkData.paramValues[i] = &configData.navFiltVx; i++;
  357. mavlinkData.paramIds[i] = "NAV_FILTER_BX"; mavlinkData.paramValues[i] = &configData.navFiltBx; i++;
  358. mavlinkData.paramIds[i] = "NAV_FILTER_PZ"; mavlinkData.paramValues[i] = &configData.navFiltPz; i++;
  359. mavlinkData.paramIds[i] = "NAV_FILTER_VZ"; mavlinkData.paramValues[i] = &configData.navFiltVz; i++;
  360. mavlinkData.paramIds[i] = "NAV_FILTER_BZ"; mavlinkData.paramValues[i] = &configData.navFiltBz; i++;
  361. mavlinkData.paramIds[i] = "IMU_ROT"; mavlinkData.paramValues[i] = &configData.adcIMURot; i++;
  362. mavlinkData.paramIds[i] = "IMU_ACC_BIAS_X"; mavlinkData.paramValues[i] = &configData.adcAccBiasX; i++;
  363. mavlinkData.paramIds[i] = "IMU_ACC_BIAS_Y"; mavlinkData.paramValues[i] = &configData.adcAccBiasY; i++;
  364. mavlinkData.paramIds[i] = "IMU_ACC_BIAS_Z"; mavlinkData.paramValues[i] = &configData.adcAccBiasZ; i++;
  365. mavlinkData.paramIds[i] = "IMU_ACC_BIAS1_X"; mavlinkData.paramValues[i] = &configData.adcAccBias1X; i++;
  366. mavlinkData.paramIds[i] = "IMU_ACC_BIAS1_Y"; mavlinkData.paramValues[i] = &configData.adcAccBias1Y; i++;
  367. mavlinkData.paramIds[i] = "IMU_ACC_BIAS1_Z"; mavlinkData.paramValues[i] = &configData.adcAccBias1Z; i++;
  368. mavlinkData.paramIds[i] = "IMU_ACC_BIAS2_X"; mavlinkData.paramValues[i] = &configData.adcAccBias2X; i++;
  369. mavlinkData.paramIds[i] = "IMU_ACC_BIAS2_Y"; mavlinkData.paramValues[i] = &configData.adcAccBias2Y; i++;
  370. mavlinkData.paramIds[i] = "IMU_ACC_BIAS2_Z"; mavlinkData.paramValues[i] = &configData.adcAccBias2Z; i++;
  371. mavlinkData.paramIds[i] = "IMU_ACC_BIAS3_X"; mavlinkData.paramValues[i] = &configData.adcAccBias3X; i++;
  372. mavlinkData.paramIds[i] = "IMU_ACC_BIAS3_Y"; mavlinkData.paramValues[i] = &configData.adcAccBias3Y; i++;
  373. mavlinkData.paramIds[i] = "IMU_ACC_BIAS3_Z"; mavlinkData.paramValues[i] = &configData.adcAccBias3Z; i++;
  374. mavlinkData.paramIds[i] = "IMU_ACC_SCAL_X"; mavlinkData.paramValues[i] = &configData.adcAccScaleX; i++;
  375. mavlinkData.paramIds[i] = "IMU_ACC_SCAL_Y"; mavlinkData.paramValues[i] = &configData.adcAccScaleY; i++;
  376. mavlinkData.paramIds[i] = "IMU_ACC_SCAL_Z"; mavlinkData.paramValues[i] = &configData.adcAccScaleZ; i++;
  377. mavlinkData.paramIds[i] = "IMU_ACC_SCAL1_X"; mavlinkData.paramValues[i] = &configData.adcAccScale1X; i++;
  378. mavlinkData.paramIds[i] = "IMU_ACC_SCAL1_Y"; mavlinkData.paramValues[i] = &configData.adcAccScale1Y; i++;
  379. mavlinkData.paramIds[i] = "IMU_ACC_SCAL1_Z"; mavlinkData.paramValues[i] = &configData.adcAccScale1Z; i++;
  380. mavlinkData.paramIds[i] = "IMU_ACC_SCAL2_X"; mavlinkData.paramValues[i] = &configData.adcAccScale2X; i++;
  381. mavlinkData.paramIds[i] = "IMU_ACC_SCAL2_Y"; mavlinkData.paramValues[i] = &configData.adcAccScale2Y; i++;
  382. mavlinkData.paramIds[i] = "IMU_ACC_SCAL2_Z"; mavlinkData.paramValues[i] = &configData.adcAccScale2Z; i++;
  383. mavlinkData.paramIds[i] = "IMU_ACC_SCAL3_X"; mavlinkData.paramValues[i] = &configData.adcAccScale3X; i++;
  384. mavlinkData.paramIds[i] = "IMU_ACC_SCAL3_Y"; mavlinkData.paramValues[i] = &configData.adcAccScale3Y; i++;
  385. mavlinkData.paramIds[i] = "IMU_ACC_SCAL3_Z"; mavlinkData.paramValues[i] = &configData.adcAccScale3Z; i++;
  386. mavlinkData.paramIds[i] = "IMU_ACC_ALGN_XY"; mavlinkData.paramValues[i] = &configData.adcAccAlgnXY; i++;
  387. mavlinkData.paramIds[i] = "IMU_ACC_ALGN_XZ"; mavlinkData.paramValues[i] = &configData.adcAccAlgnXZ; i++;
  388. mavlinkData.paramIds[i] = "IMU_ACC_ALGN_YX"; mavlinkData.paramValues[i] = &configData.adcAccAlgnYX; i++;
  389. mavlinkData.paramIds[i] = "IMU_ACC_ALGN_YZ"; mavlinkData.paramValues[i] = &configData.adcAccAlgnYZ; i++;
  390. mavlinkData.paramIds[i] = "IMU_ACC_ALGN_ZX"; mavlinkData.paramValues[i] = &configData.adcAccAlgnZX; i++;
  391. mavlinkData.paramIds[i] = "IMU_ACC_ALGN_ZY"; mavlinkData.paramValues[i] = &configData.adcAccAlgnZY; i++;
  392. mavlinkData.paramIds[i] = "IMU_ACC_ALN1_XY"; mavlinkData.paramValues[i] = &configData.adcAccAlgn1XY; i++;
  393. mavlinkData.paramIds[i] = "IMU_ACC_ALN1_XZ"; mavlinkData.paramValues[i] = &configData.adcAccAlgn1XZ; i++;
  394. mavlinkData.paramIds[i] = "IMU_ACC_ALN1_YX"; mavlinkData.paramValues[i] = &configData.adcAccAlgn1YX; i++;
  395. mavlinkData.paramIds[i] = "IMU_ACC_ALN1_YZ"; mavlinkData.paramValues[i] = &configData.adcAccAlgn1YZ; i++;
  396. mavlinkData.paramIds[i] = "IMU_ACC_ALN1_ZX"; mavlinkData.paramValues[i] = &configData.adcAccAlgn1ZX; i++;
  397. mavlinkData.paramIds[i] = "IMU_ACC_ALN1_ZY"; mavlinkData.paramValues[i] = &configData.adcAccAlgn1ZY; i++;
  398. mavlinkData.paramIds[i] = "IMU_ACC_ALN2_XY"; mavlinkData.paramValues[i] = &configData.adcAccAlgn2XY; i++;
  399. mavlinkData.paramIds[i] = "IMU_ACC_ALN2_XZ"; mavlinkData.paramValues[i] = &configData.adcAccAlgn2XZ; i++;
  400. mavlinkData.paramIds[i] = "IMU_ACC_ALN2_YX"; mavlinkData.paramValues[i] = &configData.adcAccAlgn2YX; i++;
  401. mavlinkData.paramIds[i] = "IMU_ACC_ALN2_YZ"; mavlinkData.paramValues[i] = &configData.adcAccAlgn2YZ; i++;
  402. mavlinkData.paramIds[i] = "IMU_ACC_ALN2_ZX"; mavlinkData.paramValues[i] = &configData.adcAccAlgn2ZX; i++;
  403. mavlinkData.paramIds[i] = "IMU_ACC_ALN2_ZY"; mavlinkData.paramValues[i] = &configData.adcAccAlgn2ZY; i++;
  404. mavlinkData.paramIds[i] = "IMU_ACC_ALN3_XY"; mavlinkData.paramValues[i] = &configData.adcAccAlgn3XY; i++;
  405. mavlinkData.paramIds[i] = "IMU_ACC_ALN3_XZ"; mavlinkData.paramValues[i] = &configData.adcAccAlgn3XZ; i++;
  406. mavlinkData.paramIds[i] = "IMU_ACC_ALN3_YX"; mavlinkData.paramValues[i] = &configData.adcAccAlgn3YX; i++;
  407. mavlinkData.paramIds[i] = "IMU_ACC_ALN3_YZ"; mavlinkData.paramValues[i] = &configData.adcAccAlgn3YZ; i++;
  408. mavlinkData.paramIds[i] = "IMU_ACC_ALN3_ZX"; mavlinkData.paramValues[i] = &configData.adcAccAlgn3ZX; i++;
  409. mavlinkData.paramIds[i] = "IMU_ACC_ALN3_ZY"; mavlinkData.paramValues[i] = &configData.adcAccAlgn3ZY; i++;
  410. mavlinkData.paramIds[i] = "IMU_MAG_BIAS_X"; mavlinkData.paramValues[i] = &configData.adcMagBiasX; i++;
  411. mavlinkData.paramIds[i] = "IMU_MAG_BIAS_Y"; mavlinkData.paramValues[i] = &configData.adcMagBiasY; i++;
  412. mavlinkData.paramIds[i] = "IMU_MAG_BIAS_Z"; mavlinkData.paramValues[i] = &configData.adcMagBiasZ; i++;
  413. mavlinkData.paramIds[i] = "IMU_MAG_BIAS1_X"; mavlinkData.paramValues[i] = &configData.adcMagBias1X; i++;
  414. mavlinkData.paramIds[i] = "IMU_MAG_BIAS1_Y"; mavlinkData.paramValues[i] = &configData.adcMagBias1Y; i++;
  415. mavlinkData.paramIds[i] = "IMU_MAG_BIAS1_Z"; mavlinkData.paramValues[i] = &configData.adcMagBias1Z; i++;
  416. mavlinkData.paramIds[i] = "IMU_MAG_BIAS2_X"; mavlinkData.paramValues[i] = &configData.adcMagBias2X; i++;
  417. mavlinkData.paramIds[i] = "IMU_MAG_BIAS2_Y"; mavlinkData.paramValues[i] = &configData.adcMagBias2Y; i++;
  418. mavlinkData.paramIds[i] = "IMU_MAG_BIAS2_Z"; mavlinkData.paramValues[i] = &configData.adcMagBias2Z; i++;
  419. mavlinkData.paramIds[i] = "IMU_MAG_BIAS3_X"; mavlinkData.paramValues[i] = &configData.adcMagBias3X; i++;
  420. mavlinkData.paramIds[i] = "IMU_MAG_BIAS3_Y"; mavlinkData.paramValues[i] = &configData.adcMagBias3Y; i++;
  421. mavlinkData.paramIds[i] = "IMU_MAG_BIAS3_Z"; mavlinkData.paramValues[i] = &configData.adcMagBias3Z; i++;
  422. mavlinkData.paramIds[i] = "IMU_MAG_SCAL_X"; mavlinkData.paramValues[i] = &configData.adcMagScaleX; i++;
  423. mavlinkData.paramIds[i] = "IMU_MAG_SCAL_Y"; mavlinkData.paramValues[i] = &configData.adcMagScaleY; i++;
  424. mavlinkData.paramIds[i] = "IMU_MAG_SCAL_Z"; mavlinkData.paramValues[i] = &configData.adcMagScaleZ; i++;
  425. mavlinkData.paramIds[i] = "IMU_MAG_SCAL1_X"; mavlinkData.paramValues[i] = &configData.adcMagScale1X; i++;
  426. mavlinkData.paramIds[i] = "IMU_MAG_SCAL1_Y"; mavlinkData.paramValues[i] = &configData.adcMagScale1Y; i++;
  427. mavlinkData.paramIds[i] = "IMU_MAG_SCAL1_Z"; mavlinkData.paramValues[i] = &configData.adcMagScale1Z; i++;
  428. mavlinkData.paramIds[i] = "IMU_MAG_SCAL2_X"; mavlinkData.paramValues[i] = &configData.adcMagScale2X; i++;
  429. mavlinkData.paramIds[i] = "IMU_MAG_SCAL2_Y"; mavlinkData.paramValues[i] = &configData.adcMagScale2Y; i++;
  430. mavlinkData.paramIds[i] = "IMU_MAG_SCAL2_Z"; mavlinkData.paramValues[i] = &configData.adcMagScale2Z; i++;
  431. mavlinkData.paramIds[i] = "IMU_MAG_SCAL3_X"; mavlinkData.paramValues[i] = &configData.adcMagScale3X; i++;
  432. mavlinkData.paramIds[i] = "IMU_MAG_SCAL3_Y"; mavlinkData.paramValues[i] = &configData.adcMagScale3Y; i++;
  433. mavlinkData.paramIds[i] = "IMU_MAG_SCAL3_Z"; mavlinkData.paramValues[i] = &configData.adcMagScale3Z; i++;
  434. mavlinkData.paramIds[i] = "IMU_MAG_ALGN_XY"; mavlinkData.paramValues[i] = &configData.adcMagAlgnXY; i++;
  435. mavlinkData.paramIds[i] = "IMU_MAG_ALGN_XZ"; mavlinkData.paramValues[i] = &configData.adcMagAlgnXZ; i++;
  436. mavlinkData.paramIds[i] = "IMU_MAG_ALGN_YX"; mavlinkData.paramValues[i] = &configData.adcMagAlgnYX; i++;
  437. mavlinkData.paramIds[i] = "IMU_MAG_ALGN_YZ"; mavlinkData.paramValues[i] = &configData.adcMagAlgnYZ; i++;
  438. mavlinkData.paramIds[i] = "IMU_MAG_ALGN_ZX"; mavlinkData.paramValues[i] = &configData.adcMagAlgnZX; i++;
  439. mavlinkData.paramIds[i] = "IMU_MAG_ALGN_ZY"; mavlinkData.paramValues[i] = &configData.adcMagAlgnZY; i++;
  440. mavlinkData.paramIds[i] = "IMU_GYO_BIAS_X"; mavlinkData.paramValues[i] = &configData.adcGyoBiasX; i++;
  441. mavlinkData.paramIds[i] = "IMU_GYO_BIAS_Y"; mavlinkData.paramValues[i] = &configData.adcGyoBiasY; i++;
  442. mavlinkData.paramIds[i] = "IMU_GYO_BIAS_Z"; mavlinkData.paramValues[i] = &configData.adcGyoBiasZ; i++;
  443. mavlinkData.paramIds[i] = "IMU_GYO_BIAS1_X"; mavlinkData.paramValues[i] = &configData.adcGyoBias1X; i++;
  444. mavlinkData.paramIds[i] = "IMU_GYO_BIAS1_Y"; mavlinkData.paramValues[i] = &configData.adcGyoBias1Y; i++;
  445. mavlinkData.paramIds[i] = "IMU_GYO_BIAS1_Z"; mavlinkData.paramValues[i] = &configData.adcGyoBias1Z; i++;
  446. mavlinkData.paramIds[i] = "IMU_GYO_BIAS2_X"; mavlinkData.paramValues[i] = &configData.adcGyoBias2X; i++;
  447. mavlinkData.paramIds[i] = "IMU_GYO_BIAS2_Y"; mavlinkData.paramValues[i] = &configData.adcGyoBias2Y; i++;
  448. mavlinkData.paramIds[i] = "IMU_GYO_BIAS2_Z"; mavlinkData.paramValues[i] = &configData.adcGyoBias2Z; i++;
  449. mavlinkData.paramIds[i] = "IMU_GYO_BIAS3_X"; mavlinkData.paramValues[i] = &configData.adcGyoBias3X; i++;
  450. mavlinkData.paramIds[i] = "IMU_GYO_BIAS3_Y"; mavlinkData.paramValues[i] = &configData.adcGyoBias3Y; i++;
  451. mavlinkData.paramIds[i] = "IMU_GYO_BIAS3_Z"; mavlinkData.paramValues[i] = &configData.adcGyoBias3Z; i++;
  452. mavlinkData.paramIds[i] = "IMU_GYO_SCAL_X"; mavlinkData.paramValues[i] = &configData.adcGyoScaleX; i++;
  453. mavlinkData.paramIds[i] = "IMU_GYO_SCAL_Y"; mavlinkData.paramValues[i] = &configData.adcGyoScaleY; i++;
  454. mavlinkData.paramIds[i] = "IMU_GYO_SCAL_Z"; mavlinkData.paramValues[i] = &configData.adcGyoScaleZ; i++;
  455. mavlinkData.paramIds[i] = "IMU_GYO_ALGN_XY"; mavlinkData.paramValues[i] = &configData.adcGyoAlgnXY; i++;
  456. mavlinkData.paramIds[i] = "IMU_GYO_ALGN_XZ"; mavlinkData.paramValues[i] = &configData.adcGyoAlgnXZ; i++;
  457. mavlinkData.paramIds[i] = "IMU_GYO_ALGN_YX"; mavlinkData.paramValues[i] = &configData.adcGyoAlgnYX; i++;
  458. mavlinkData.paramIds[i] = "IMU_GYO_ALGN_YZ"; mavlinkData.paramValues[i] = &configData.adcGyoAlgnYZ; i++;
  459. mavlinkData.paramIds[i] = "IMU_GYO_ALGN_ZX"; mavlinkData.paramValues[i] = &configData.adcGyoAlgnZX; i++;
  460. mavlinkData.paramIds[i] = "IMU_GYO_ALGN_ZY"; mavlinkData.paramValues[i] = &configData.adcGyoAlgnZY; i++;
  461. mavlinkData.paramIds[i] = "QUAT_MAG_INCL"; mavlinkData.paramValues[i] = &configData.quatMagIncl; i++;
  462. mavlinkData.paramIds[i] = "QUAT_ACC_DIST"; mavlinkData.paramValues[i] = &configData.quatAccDist; i++;
  463. mavlinkData.paramIds[i] = "QUAT_KP"; mavlinkData.paramValues[i] = &configData.quatKp; i++;
  464. mavlinkData.paramIds[i] = "QUAT_KI"; mavlinkData.paramValues[i] = &configData.quatKi; i++;
  465. mavlinkData.paramIds[i] = "QUAT_KA"; mavlinkData.paramValues[i] = &configData.quatKa; i++;
  466. mavlinkData.paramIds[i] = "QUAT_KM1"; mavlinkData.paramValues[i] = &configData.quatKm1; i++;
  467. mavlinkData.paramIds[i] = "QUAT_KM2"; mavlinkData.paramValues[i] = &configData.quatKm2; i++;
  468. return i;
  469. }
  470. void mavlinkInit(void) {
  471. unsigned long micros;
  472. int i;
  473. mavlinkData.serialPort = serialOpen(MAVLINK_USART, configData.downlinkBaud, USART_HardwareFlowControl_RTS_CTS);
  474. mavlinkData.debugLed = digitalInit(MAVLINK_LED_PORT, MAVLINK_LED_PIN);
  475. // setup mutex for serial port access
  476. ctl_mutex_init(&mavlinkData.serialPortMutex);
  477. ctl_message_queue_init(&mavlinkData.notices, mavlinkData.noticeQueue, MAVLINK_NOTICE_DEPTH);
  478. AQ_NOTICE("Mavlink init... ");
  479. mavlinkData.numParams = mavlinkInitParams();
  480. mavlinkData.currentParam = mavlinkData.numParams;
  481. // start send thread with high priority so that it can process startup notices - will drop priority later
  482. memset(mavlinkSendTaskStack, 0xcd, sizeof(mavlinkSendTaskStack)); // write known values into the stack
  483. mavlinkSendTaskStack[0] = mavlinkSendTaskStack[1+STACKSIZE] = 0xfacefeed; // put marker values at the words before/after the stack
  484. ctl_task_run(&mavlinkData.sendTask, 175, mavlinkSendTaskCode, 0, "mavlinkSendTask", STACKSIZE, mavlinkSendTaskStack+1, 0);
  485. memset(mavlinkRecvTaskStack, 0xcd, sizeof(mavlinkRecvTaskStack)); // write known values into the stack
  486. mavlinkRecvTaskStack[0] = mavlinkRecvTaskStack[1+STACKSIZE] = 0xfacefeed; // put marker values at the words before/after the stack
  487. ctl_task_run(&mavlinkData.recvTask, 20, mavlinkRecvTaskCode, 0, "mavlinkRecvTask", STACKSIZE, mavlinkRecvTaskStack+1, 0);
  488. mavlink_system.sysid = flashSerno() % 250;
  489. mavlink_system.compid = MAV_COMP_ID_WAYPOINTPLANNER;
  490. mavlink_system.type = MAV_QUADROTOR;
  491. mavlinkData.mode = MAV_MODE_MANUAL;
  492. mavlinkData.nav_mode = MAV_NAV_GROUNDED;
  493. mavlinkData.status = MAV_STATE_ACTIVE;
  494. // turn on all streams at 1Hz & spread them out
  495. micros = timerMicros();
  496. for (i = 1; i < 13; i++) { // TODO: remove hardcoded value
  497. mavlinkData.streamInterval[i] = 1e6;
  498. mavlinkData.streamNext[i] = micros + 5e6 + i * 5e3;
  499. }
  500. }