Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
Ardupilot
GitHub Repository: Ardupilot/ardupilot
Path: blob/master/libraries/AP_DAL/AP_DAL_GPS.cpp
9432 views
1
#include "AP_DAL_GPS.h"
2
3
#include <AP_Logger/AP_Logger.h>
4
#include "AP_DAL.h"
5
6
#if HAL_MAVLINK_BINDINGS_ENABLED
7
// ensuring GPS_STATUS enumweration is 1:1 with mavlink when bindings are available
8
static_assert((uint32_t)AP_DAL_GPS::GPS_Status::NO_GPS == (uint32_t)GPS_FIX_TYPE_NO_GPS, "NO_GPS incorrect");
9
static_assert((uint32_t)AP_DAL_GPS::GPS_Status::NO_FIX == (uint32_t)GPS_FIX_TYPE_NO_FIX, "NO_FIX incorrect");
10
static_assert((uint32_t)AP_DAL_GPS::GPS_Status::GPS_OK_FIX_2D == (uint32_t)GPS_FIX_TYPE_2D_FIX, "FIX_2D incorrect");
11
static_assert((uint32_t)AP_DAL_GPS::GPS_Status::GPS_OK_FIX_3D == (uint32_t)GPS_FIX_TYPE_3D_FIX, "FIX_3D incorrect");
12
static_assert((uint32_t)AP_DAL_GPS::GPS_Status::GPS_OK_FIX_3D_DGPS == (uint32_t)GPS_FIX_TYPE_DGPS, "FIX_DGPS incorrect");
13
static_assert((uint32_t)AP_DAL_GPS::GPS_Status::GPS_OK_FIX_3D_RTK_FLOAT == (uint32_t)GPS_FIX_TYPE_RTK_FLOAT, "FIX_RTK_FLOAT incorrect");
14
static_assert((uint32_t)AP_DAL_GPS::GPS_Status::GPS_OK_FIX_3D_RTK_FIXED == (uint32_t)GPS_FIX_TYPE_RTK_FIXED, "FIX_RTK_FIXED incorrect");
15
#endif // HAL_MAVLINK_BINDINGS_ENABLED
16
17
AP_DAL_GPS::AP_DAL_GPS()
18
{
19
for (uint8_t i=0; i<ARRAY_SIZE(_RGPI); i++) {
20
_RGPI[i].instance = i;
21
_RGPJ[i].instance = i;
22
}
23
}
24
25
void AP_DAL_GPS::start_frame()
26
{
27
const auto &gps = AP::gps();
28
29
const log_RGPH old_RGPH = _RGPH;
30
_RGPH.primary_sensor = gps.primary_sensor();
31
_RGPH.num_sensors = gps.num_sensors();
32
33
WRITE_REPLAY_BLOCK_IFCHANGED(RGPH, _RGPH, old_RGPH);
34
35
for (uint8_t i=0; i<ARRAY_SIZE(_RGPI); i++) {
36
log_RGPI &RGPI = _RGPI[i];
37
log_RGPJ &RGPJ = _RGPJ[i];
38
const log_RGPI old_RGPI = RGPI;
39
const log_RGPJ old_RGPJ = RGPJ;
40
41
RGPI.status = (GPS_Status)gps.status(i);
42
RGPI.antenna_offset = gps.get_antenna_offset(i);
43
44
const Location &loc = gps.location(i);
45
RGPJ.last_message_time_ms = gps.last_message_time_ms(i);
46
RGPJ.lat = loc.lat;
47
RGPJ.lng = loc.lng;
48
RGPJ.alt = loc.alt;
49
RGPI.have_vertical_velocity = gps.have_vertical_velocity(i);
50
51
RGPI.horizontal_accuracy_returncode = gps.horizontal_accuracy(i, RGPJ.hacc);
52
RGPI.vertical_accuracy_returncode = gps.vertical_accuracy(i, RGPJ.vacc);
53
RGPJ.hdop = gps.get_hdop(i);
54
RGPI.num_sats = gps.num_sats(i);
55
RGPI.get_lag_returncode = gps.get_lag(i, RGPI.lag_sec);
56
57
RGPJ.velocity = gps.velocity(i);
58
RGPI.speed_accuracy_returncode = gps.speed_accuracy(i, RGPJ.sacc);
59
RGPI.gps_yaw_deg_returncode = gps.gps_yaw_deg(i, RGPJ.yaw_deg, RGPJ.yaw_accuracy_deg, RGPJ.yaw_deg_time_ms);
60
61
WRITE_REPLAY_BLOCK_IFCHANGED(RGPI, RGPI, old_RGPI);
62
WRITE_REPLAY_BLOCK_IFCHANGED(RGPJ, RGPJ, old_RGPJ);
63
64
tmp_location[i] = {
65
RGPJ.lat,
66
RGPJ.lng,
67
RGPJ.alt,
68
Location::AltFrame::ABSOLUTE
69
};
70
}
71
}
72
73