/*
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 .
*/
#pragma once
#include
#include
#include
#include
#include
#include
class AP_Beacon_Backend;
#define AP_BEACON_MAX_BEACONS 4
#define AP_BEACON_TIMEOUT_MS 300
#define AP_BEACON_MINIMUM_FENCE_BEACONS 3
class AP_Beacon
{
public:
friend class AP_Beacon_Backend;
AP_Beacon(AP_SerialManager &_serial_manager);
// get singleton instance
static AP_Beacon *get_singleton() { return _singleton; }
// external position backend types (used by _TYPE parameter)
enum AP_BeaconType {
AP_BeaconType_None = 0,
AP_BeaconType_Pozyx = 1,
AP_BeaconType_Marvelmind = 2,
AP_BeaconType_SITL = 10
};
// The AP_BeaconState structure is filled in by the backend driver
struct BeaconState {
uint16_t id; // unique id of beacon
bool healthy; // true if beacon is healthy
float distance; // distance from vehicle to beacon (in meters)
uint32_t distance_update_ms; // system time of last update from this beacon
Vector3f position; // location of beacon as an offset from origin in NED in meters
};
// initialise any available position estimators
void init(void);
// return true if beacon feature is enabled
bool enabled(void);
// return true if sensor is basically healthy (we are receiving data)
bool healthy(void);
// update state of all beacons
void update(void);
// return origin of position estimate system in lat/lon
bool get_origin(Location &origin_loc) const;
// return vehicle position in NED from position estimate system's origin in meters
bool get_vehicle_position_ned(Vector3f& pos, float& accuracy_estimate) const;
// return the number of beacons
uint8_t count() const;
// methods to return beacon specific information
// return all beacon data
bool get_beacon_data(uint8_t beacon_instance, struct BeaconState& state) const;
// return individual beacon's id
uint8_t beacon_id(uint8_t beacon_instance) const;
// return beacon health
bool beacon_healthy(uint8_t beacon_instance) const;
// return distance to beacon in meters
float beacon_distance(uint8_t beacon_instance) const;
// return NED position of beacon in meters relative to the beacon systems origin
Vector3f beacon_position(uint8_t beacon_instance) const;
// return last update time from beacon in milliseconds
uint32_t beacon_last_update_ms(uint8_t beacon_instance) const;
// update fence boundary array
void update_boundary_points();
// return fence boundary array
const Vector2f* get_boundary_points(uint16_t& num_points) const;
static const struct AP_Param::GroupInfo var_info[];
private:
static AP_Beacon *_singleton;
// check if device is ready
bool device_ready(void) const;
// find next boundary point from an array of boundary points given the current index into that array
// returns true if a next point can be found
// current_index should be an index into the boundary_pts array
// start_angle is an angle (in radians), the search will sweep clockwise from this angle
// the index of the next point is returned in the next_index argument
// the angle to the next point is returned in the next_angle argument
static bool get_next_boundary_point(const Vector2f* boundary, uint8_t num_points, uint8_t current_index, float start_angle, uint8_t& next_index, float& next_angle);
// parameters
AP_Int8 _type;
AP_Float origin_lat;
AP_Float origin_lon;
AP_Float origin_alt;
AP_Int16 orient_yaw;
// external references
AP_Beacon_Backend *_driver;
AP_SerialManager &serial_manager;
// last known position
Vector3f veh_pos_ned;
float veh_pos_accuracy;
uint32_t veh_pos_update_ms;
// individual beacon data
uint8_t num_beacons = 0;
BeaconState beacon_state[AP_BEACON_MAX_BEACONS];
// fence boundary
Vector2f boundary[AP_BEACON_MAX_BEACONS+1]; // array of boundary points (used for fence)
uint8_t boundary_num_points; // number of points in boundary
uint8_t boundary_num_beacons; // total number of beacon points consumed while building boundary
};
namespace AP {
AP_Beacon *beacon();
};