mavlink
===
###### tags: `code documentation`
[TOC]
# main.c
```c=
mavlink_tx_register_task("mavlink publisher", 1024, tskIDLE_PRIORITY + 3);
mavlink_rx_register_task("mavlink receiver", 2048, tskIDLE_PRIORITY + 3);
```
## mavlink_task.c
- mavlink_queue:
- mavlink_status_t (mavlink自定義)
```c=
typedef struct __mavlink_status {
uint8_t msg_received; ///< Number of received messages
uint8_t buffer_overrun; ///< Number of buffer overruns
uint8_t parse_error; ///< Number of parse errors
mavlink_parse_state_t parse_state; ///< Parsing state machine
uint8_t packet_idx; ///< Index in current packet
uint8_t current_rx_seq; ///< Sequence number of last packet received
uint8_t current_tx_seq; ///< Sequence number of last packet sent
uint16_t packet_rx_success_count; ///< Received packets
uint16_t packet_rx_drop_count; ///< Number of packet drops
uint8_t flags; ///< MAVLINK_STATUS_FLAG_*
uint8_t signature_wait; ///< number of signature bytes left to receive
struct __mavlink_signing *signing; ///< optional signing state
struct __mavlink_signing_streams *signing_streams; ///< global record of stream timestamps
} mavlink_status_t;
```
- mavlink_queue_item_t(mavlink_task.h定義)
```c=
typedef struct {
mavlink_message_t mav_msg;
} mavlink_queue_item_t;
```
- mavlink_message_t (mavlink自定義)
```c=
MAVPACKED(
typedef struct __mavlink_message {
uint16_t checksum; ///< sent at end of packet
uint8_t magic; ///< protocol magic marker
uint8_t len; ///< Length of payload
uint8_t incompat_flags; ///< flags that must be understood
uint8_t compat_flags; ///< flags that can be ignored if not understood
uint8_t seq; ///< Sequence of packet
uint8_t sysid; ///< ID of message sender system/aircraft
uint8_t compid; ///< ID of the message sender component
uint32_t msgid:24; ///< ID of message in payload
uint64_t payload64[(MAVLINK_MAX_PAYLOAD_LEN+MAVLINK_NUM_CHECKSUM_BYTES+7)/8];
uint8_t ck[2]; ///< incoming checksum bytes
uint8_t signature[MAVLINK_SIGNATURE_BLOCK_LEN];
}) mavlink_message_t;
```
- mavlink_recept_record_queue(mavlink_task.h定義)
- msg 形式 還有 收到時間
- mavlink_recept_record_item_t
```c=
typedef struct {
int recvd_msg_id;
float recvd_time;
} mavlink_recpt_record_item_t;
```
- Register task
```c=
void mavlink_tx_register_task(const char *task_name, configSTACK_DEPTH_TYPE stack_size,
UBaseType_t priority)
{
mavlink_calib_status_text_queue = xQueueCreate(5, sizeof(mavlink_calib_status_text_item_t));
xTaskCreate(mavlink_tx_task, task_name, stack_size, NULL, priority, NULL);
}
void mavlink_rx_register_task(const char *task_name, configSTACK_DEPTH_TYPE stack_size,
UBaseType_t priority)
{
mavlink_queue = xQueueCreate(MAVLINK_QUEUE_SIZE, sizeof(mavlink_queue_item_t));
mavlink_recpt_record_queue = xQueueCreate(50, sizeof(mavlink_recpt_record_item_t));
xTaskCreate(mavlink_rx_task, task_name, stack_size, NULL, priority, NULL);
}
```
## 全域變數
```c=
QueueHandle_t mavlink_queue;
QueueHandle_t mavlink_calib_status_text_queue;
QueueHandle_t mavlink_recpt_record_queue;
mavlink_message_t mavlink_recpt_msg;
```
## TX task
1. 如果有收到 mavlink_msg 則 received_mavlink_msg = 1, 如果資料有問題則為 0,實際操作為uart3拿到的raw message 會解碼後放到 mavlink_recpt_msg(mavlink_message_t 結構),並且檢查
2. 如果資料確定沒問題,就放入 mavlink_queue
3. 如果需要debug,創造一個mavlink_recept_record_item 結構再去放入mavlink_recpt_record_queue中
## RX task (uart3_puts -> xbee)
### 1. 發送資料
- 1hz
- heart beat(**確認無人機還活著**)
- MAV TYPE
- MAV_MODE_FLAG
- MAV_AUTOPILOT_MODE
- MAV_STATE
- system status
- battery
- sys_id
- 10hz
- for gps(not use right now)
- 50hz
- send_mavlink_attitude_quaternion()
- send current quaternion, RPY
- send_mavlink_rc_channels()
- send 遙控器資訊
- sned_mavlink_local_position_ned()
- send position and velocity
- Everytime
- 如果在 AUTOPILOT_TRAJECTORY_FOLLOWING_MODE,回傳當前 PVA 以及 desire PVA
### 2. Handler
- 我們有一個parse_mavlink_received_msg, 可以跑一個for loop 去檢查來的資料是哪一個id,接著啟動相對應的handler。
- 調整參數的部分,其中 handler 有一句
```c=
save_param_list_to_flash()
```
可以將參數燒到 flash 裡面,這樣我們用mavlink調整完參數就不用每次再重新燒錄一遍了!
- 一堆handler
```c=
/* register mavlink msg id to the handler function */
struct mavlink_parser_item cmd_list[] = {
/* common mavlink messages */
MAV_CMD_DEF(mav_set_mode, 11),
MAV_CMD_DEF(mav_mission_request_list, 43),
MAV_CMD_DEF(mav_mission_count, 44),
MAV_CMD_DEF(mav_mission_item_int, 73),
MAV_CMD_DEF(mav_mission_request_int, 40),
MAV_CMD_DEF(mav_mission_ack, 47),
MAV_CMD_DEF(mav_mission_clear_all, 45),
//MAV_CMD_DEF(mav_mission_set_current, 41),
MAV_CMD_DEF(mav_command_long, 76),
MAV_CMD_DEF(mav_param_request_list, 21),
MAV_CMD_DEF(mav_param_request_read, 20),
// 參數
MAV_CMD_DEF(mav_param_set, 23),
/* extended mavlink messages */
// 路徑規劃
MAV_CMD_DEF(mav_polynomial_trajectory_write, 11000),
MAV_CMD_DEF(mav_polynomial_trajectory_cmd, 11001),
MAV_CMD_DEF(mav_polynomial_trajectory_item, 11003)
};
```