Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
Ardupilot
GitHub Repository: Ardupilot/ardupilot
Path: blob/master/libraries/AP_AccelCal/AP_AccelCal.h
9559 views
1
#pragma once
2
3
#include <AP_HAL/AP_HAL_Boards.h>
4
#include <GCS_MAVLink/GCS_config.h>
5
6
#ifndef HAL_INS_ACCELCAL_ENABLED
7
#if HAL_GCS_ENABLED
8
#include <AP_InertialSensor/AP_InertialSensor_config.h>
9
#define HAL_INS_ACCELCAL_ENABLED AP_INERTIALSENSOR_ENABLED
10
#else
11
#define HAL_INS_ACCELCAL_ENABLED 0
12
#endif
13
#endif
14
15
#include <GCS_MAVLink/GCS_MAVLink.h>
16
#include "AccelCalibrator.h"
17
18
#define AP_ACCELCAL_MAX_NUM_CLIENTS 4
19
class GCS_MAVLINK;
20
class AP_AccelCal_Client;
21
22
class AP_AccelCal {
23
public:
24
AP_AccelCal():
25
_use_gcs_snoop(true),
26
_started(false),
27
_saving(false)
28
{ update_status(); }
29
30
// start all the registered calibrations
31
void start(GCS_MAVLINK *gcs, uint8_t sysid, uint8_t compid);
32
33
// called on calibration cancellation
34
void cancel();
35
36
// Run an iteration of all registered calibrations
37
void update();
38
39
// get the status of the calibrator server as a whole
40
accel_cal_status_t get_status() { return _status; }
41
42
// Set vehicle position sent by the GCS
43
bool gcs_vehicle_position(float position);
44
45
// interface to the clients for registration
46
static void register_client(AP_AccelCal_Client* client);
47
48
#if HAL_GCS_ENABLED
49
void handle_command_ack(const mavlink_command_ack_t &packet, uint8_t src_sysid, uint8_t src_compid);
50
#endif
51
52
// true if we are in a calibration process
53
bool running(void) const;
54
55
private:
56
class GCS_MAVLINK *_gcs;
57
uint8_t _sysid;
58
uint8_t _compid;
59
bool _use_gcs_snoop;
60
bool _waiting_for_mavlink_ack = false;
61
uint32_t _last_position_request_ms;
62
uint8_t _step;
63
accel_cal_status_t _status;
64
accel_cal_status_t _last_result;
65
66
static uint8_t _num_clients;
67
static AP_AccelCal_Client* _clients[AP_ACCELCAL_MAX_NUM_CLIENTS];
68
69
// called on calibration success
70
void success();
71
72
// called on calibration failure
73
void fail();
74
75
// reset all the calibrators to there pre calibration stage so as to make them ready for next calibration request
76
void clear();
77
78
// proceed through the collection step for each of the registered calibrators
79
void collect_sample();
80
81
// update the state of the Accel calibrator server
82
void update_status();
83
84
// checks if no new sample has been received for considerable amount of time
85
bool check_for_timeout();
86
87
// check if client's calibrator is active
88
bool client_active(uint8_t client_num);
89
90
bool _started;
91
bool _saving;
92
93
uint8_t _num_active_calibrators;
94
95
AccelCalibrator* get_calibrator(uint8_t i);
96
};
97
98
class AP_AccelCal_Client {
99
friend class AP_AccelCal;
100
private:
101
// getters
102
virtual bool _acal_get_saving() { return false; }
103
virtual bool _acal_get_ready_to_sample() { return true; }
104
virtual bool _acal_get_fail() { return false; }
105
virtual AccelCalibrator* _acal_get_calibrator(uint8_t instance) = 0;
106
107
// events
108
virtual void _acal_save_calibrations() = 0;
109
virtual void _acal_event_success() {};
110
virtual void _acal_event_cancellation() {};
111
virtual void _acal_event_failure() {};
112
};
113
114