ardupilot/libraries/AP_ADSB/AP_ADSB_Sagetech.h

162 lines
5.1 KiB
C
Raw Normal View History

2020-12-07 21:43:44 -04:00
#pragma once
/*
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include "AP_ADSB_Backend.h"
#ifndef HAL_ADSB_SAGETECH_ENABLED
#define HAL_ADSB_SAGETECH_ENABLED HAL_ADSB_ENABLED
#endif
#if HAL_ADSB_SAGETECH_ENABLED
class AP_ADSB_Sagetech : public AP_ADSB_Backend {
public:
using AP_ADSB_Backend::AP_ADSB_Backend;
// init - performs any required initialisation for this instance
bool init() override;
// update - should be called periodically
void update() override;
// static detection function
static bool detect();
private:
static const uint32_t PAYLOAD_XP_MAX_SIZE = 52;
enum class SystemStateBits {
Error_Transponder = (1U<<0),
Altitidue_Source = (1U<<1),
Error_GPS = (1U<<2),
Error_ICAO = (1U<<3),
Error_Over_Temperature = (1U<<4),
Error_Extended_Squitter = (1U<<5),
Mode_Transponder = (3U<<6), // 2 bit status:
};
enum class Transponder_Type {
Mode_C = 0x00,
Mode_S_ADSB_OUT = 0x01,
Mode_S_ADSB_OUT_and_IN = 0x02,
Unknown = 0xFF,
};
enum class MsgType_XP {
INVALID = 0,
Installation_Set = 0x01,
Preflight_Set = 0x02,
Operating_Set = 0x03,
GPS_Set = 0x04,
Request = 0x05,
ACK = 0x80,
Installation_Response = 0x81,
Preflight_Response = 0x82,
Status_Response = 0x83,
ADSB_StateVector_Report = 0x91,
ADSB_ModeStatus_Report = 0x92,
TISB_StateVector_Report = 0x93,
TISB_ModeStatus_Report = 0x94,
TISB_CorasePos_Report = 0x95,
TISB_ADSB_Mgr_Report = 0x96,
};
enum class ParseState {
WaitingFor_Start,
WaitingFor_AssmAddr,
WaitingFor_MsgType,
WaitingFor_MsgId,
WaitingFor_PayloadLen,
WaitingFor_PayloadContents,
WaitingFor_ChecksumFletcher,
WaitingFor_Checksum,
WaitingFor_End,
};
struct Packet_XP {
const uint8_t start = 0xA5;
const uint8_t assemAddr = 0x01;
MsgType_XP type;
uint8_t id;
uint8_t payload_length;
uint8_t payload[PAYLOAD_XP_MAX_SIZE];
uint8_t checksumFletcher;
uint8_t checksum;
const uint8_t end = 0x5A;
};
struct {
ParseState state;
uint8_t index;
Packet_XP packet;
} message_in;
// compute Sum and FletcherSum values
uint16_t checksum_generate_XP(Packet_XP &msg) const;
bool checksum_verify_XP(Packet_XP &msg) const;
void checksum_assign_XP(Packet_XP &msg);
// handling inbound byte and process it in the state machine
bool parse_byte_XP(const uint8_t data);
// handle inbound packet
void handle_packet_XP(const Packet_XP &msg);
// send message to serial port
void send_msg(Packet_XP &msg);
// handle inbound msgs
void handle_adsb_in_msg(const Packet_XP &msg);
void handle_ack(const Packet_XP &msg);
// send messages to to transceiver
void send_msg_Installation();
void send_msg_PreFlight();
void send_msg_Operating();
void send_msg_GPS();
// send packet by type
void send_packet(const MsgType_XP type);
// send msg to request a packet by type
void request_packet(const MsgType_XP type);
// Convert base 8 or 16 to decimal. Used to convert an octal/hexadecimal value
// stored on a GCS as a string field in different format, but then transmitted
// over mavlink as a float which is always a decimal.
uint32_t convert_base_to_decimal(const uint8_t baseIn, uint32_t inputNumber);
// timers for each out-bound packet
uint32_t last_packet_initialize_ms;
uint32_t last_packet_PreFlight_ms;
uint32_t last_packet_GPS_ms;
uint32_t last_packet_Operating_ms;
// cached variables to compare against params so we can send msg on param change.
uint16_t last_operating_squawk;
int32_t last_operating_alt;
uint8_t last_operating_rf_select;
// track status changes in acks
uint8_t last_ack_transponder_mode;
Transponder_Type transponder_type = Transponder_Type::Unknown;
};
#endif // HAL_ADSB_SAGETECH_ENABLED