ardupilot/libraries/AP_Beacon/AP_Beacon_Nooploop.h

59 lines
2.2 KiB
C
Raw Normal View History

#pragma once
#include "AP_Beacon_Backend.h"
#define NOOPLOOP_MSG_BUF_MAX 256
class AP_Beacon_Nooploop : public AP_Beacon_Backend
{
public:
AP_Beacon_Nooploop(AP_Beacon &frontend, AP_SerialManager &serial_manager);
// return true if sensor is basically healthy (we are receiving data)
bool healthy() override;
// update the state of the sensor
void update() override;
private:
enum class MsgType : uint8_t {
INVALID = 0,
NODE_FRAME2,
SETTING_FRAME0
};
// process one byte received on serial port
// message is stored in _msgbuf
MsgType parse_byte(uint8_t b);
// send setting_frame0 to tag. tag will ack setting_frame0 with anchor position filled
void request_setting();
// pase node_frame2 to get tag position and distance
void parse_node_frame2();
// parse setting_frame0 to get anchor position
void parse_setting_frame0();
enum class ParseState : uint8_t {
HEADER = 0, // waiting for header
H55_FUNCTION_MARK, // waiting for function mark
H54_FUNCTION_MARK, // waiting for function mark
LEN_L, // waiting for low byte of length
LEN_H, // waiting for high byte of length
NF2_PAYLOAD, // receiving payload bytes
SF0_PAYLOAD, // receiving payload bytes
} _state = ParseState::HEADER;
// members
AP_HAL::UARTDriver *_uart; // pointer to uart configured for use with nooploop
uint8_t _msgbuf[NOOPLOOP_MSG_BUF_MAX]; // buffer to hold most recent message from tag
uint16_t _msg_len; // number of bytes received from the current message (may be larger than size of _msgbuf)
uint16_t _frame_len; // message supplied frame length
uint8_t _crc_expected; // calculated crc which is compared against actual received crc
uint32_t _last_update_ms; // last time we receive data from tag
bool _anchor_pos_avail; // flag indicates if we got anchor position or not
uint32_t _last_request_setting_ms; // last time we sent request_setting0 packet to tag
};