From 9b309fe0a035b72c3569c0595daab22cf5e077fe Mon Sep 17 00:00:00 2001 From: geeksville Date: Mon, 4 May 2020 08:09:08 -0700 Subject: [PATCH] Use int based lat/long from now on in the device code for https://github.com/meshtastic/Meshtastic-device/issues/124 --- docs/software/nrf52-TODO.md | 2 +- proto | 2 +- src/GPS.cpp | 8 ++++---- src/GPS.h | 3 +-- src/mesh/MeshService.cpp | 7 +++---- src/mesh/mesh.pb.c | 8 -------- src/mesh/mesh.pb.h | 28 ++++++++++++++-------------- src/screen.cpp | 11 +++++++---- 8 files changed, 31 insertions(+), 38 deletions(-) diff --git a/docs/software/nrf52-TODO.md b/docs/software/nrf52-TODO.md index 5d9c75775..6bc5fb0d2 100644 --- a/docs/software/nrf52-TODO.md +++ b/docs/software/nrf52-TODO.md @@ -9,7 +9,7 @@ Minimum items needed to make sure hardware is good. - plug in correct variants for the real board - Use the PMU driver on real hardware - add a NEMA based GPS driver to test GPS -- Use new radio driver on real hardware - possibly start with https://os.mbed.com/teams/Semtech/code/SX126xLib/ +- Use new radio driver on real hardware - Use UC1701 LCD driver on real hardware. Still need to create at startup and probe on SPI - test the LEDs - test the buttons diff --git a/proto b/proto index bd002e5a1..cabbdf51e 160000 --- a/proto +++ b/proto @@ -1 +1 @@ -Subproject commit bd002e5a144f209e42c97b64fea9a05a2e513b28 +Subproject commit cabbdf51ed365b72ab995ad24b075269627f58ad diff --git a/src/GPS.cpp b/src/GPS.cpp index a6a1e8eef..f78ad906c 100644 --- a/src/GPS.cpp +++ b/src/GPS.cpp @@ -48,7 +48,7 @@ void GPS::setup() isConnected = ublox.begin(_serial_gps); if (isConnected) { - DEBUG_MSG("Connected to GPS successfully\n"); + DEBUG_MSG("Connected to UBLOX GPS successfully\n"); bool factoryReset = false; bool ok; @@ -191,10 +191,10 @@ The Unix epoch (or Unix time or POSIX time or Unix timestamp) is the number of s if ((fixtype >= 3 && fixtype <= 4) && ublox.getP()) // rd fixes only { // we only notify if position has changed - latitude = ublox.getLatitude() * 1e-7; - longitude = ublox.getLongitude() * 1e-7; + latitude = ublox.getLatitude(); + longitude = ublox.getLongitude(); altitude = ublox.getAltitude() / 1000; // in mm convert to meters - DEBUG_MSG("new gps pos lat=%f, lon=%f, alt=%d\n", latitude, longitude, altitude); + DEBUG_MSG("new gps pos lat=%f, lon=%f, alt=%d\n", latitude * 1e-7, longitude * 1e-7, altitude); hasValidLocation = (latitude != 0) || (longitude != 0); // bogus lat lon is reported as 0,0 if (hasValidLocation) { diff --git a/src/GPS.h b/src/GPS.h index 912356c42..c3c403278 100644 --- a/src/GPS.h +++ b/src/GPS.h @@ -15,7 +15,7 @@ class GPS : public PeriodicTask, public Observable SFE_UBLOX_GPS ublox; public: - double latitude, longitude; + uint32_t latitude, longitude; // as an int mult by 1e-7 to get value as double uint32_t altitude; bool isConnected; // Do we have a GPS we are talking to @@ -29,7 +29,6 @@ class GPS : public PeriodicTask, public Observable void setup(); - virtual void doTask(); /// If we haven't yet set our RTC this boot, set it from a GPS derived time diff --git a/src/mesh/MeshService.cpp b/src/mesh/MeshService.cpp index 71eb5f37c..1b05e0c51 100644 --- a/src/mesh/MeshService.cpp +++ b/src/mesh/MeshService.cpp @@ -269,8 +269,7 @@ void MeshService::sendToMesh(MeshPacket *p) if (p->to == nodeDB.getNodeNum()) { DEBUG_MSG("Dropping locally processed message\n"); releaseToPool(p); - } - else { + } else { // Note: We might return !OK if our fifo was full, at that point the only option we have is to drop it if (router.send(p) != ERRNO_OK) { DEBUG_MSG("No radio was able to send packet, discarding...\n"); @@ -333,8 +332,8 @@ int MeshService::onGPSChanged(void *unused) if (gps.latitude != 0 || gps.longitude != 0) { if (gps.altitude != 0) pos.altitude = gps.altitude; - pos.latitude = gps.latitude; - pos.longitude = gps.longitude; + pos.latitude_i = gps.latitude; + pos.longitude_i = gps.longitude; pos.time = gps.getValidTime(); } diff --git a/src/mesh/mesh.pb.c b/src/mesh/mesh.pb.c index 096f28896..0b2c5b8ce 100644 --- a/src/mesh/mesh.pb.c +++ b/src/mesh/mesh.pb.c @@ -55,11 +55,3 @@ PB_BIND(ToRadio, ToRadio, 2) -#ifndef PB_CONVERT_DOUBLE_FLOAT -/* On some platforms (such as AVR), double is really float. - * To be able to encode/decode double on these platforms, you need. - * to define PB_CONVERT_DOUBLE_FLOAT in pb.h or compiler command line. - */ -PB_STATIC_ASSERT(sizeof(double) == 8, DOUBLE_MUST_BE_8_BYTES) -#endif - diff --git a/src/mesh/mesh.pb.h b/src/mesh/mesh.pb.h index bf79305b8..7f25f1c99 100644 --- a/src/mesh/mesh.pb.h +++ b/src/mesh/mesh.pb.h @@ -66,11 +66,11 @@ typedef struct _MyNodeInfo { } MyNodeInfo; typedef struct _Position { - double latitude; - double longitude; int32_t altitude; int32_t battery_level; uint32_t time; + int32_t latitude_i; + int32_t longitude_i; } Position; typedef struct _RadioConfig_UserPreferences { @@ -237,8 +237,8 @@ typedef struct _ToRadio { #define MyNodeInfo_error_code_tag 7 #define MyNodeInfo_error_address_tag 8 #define MyNodeInfo_error_count_tag 9 -#define Position_latitude_tag 1 -#define Position_longitude_tag 2 +#define Position_latitude_i_tag 7 +#define Position_longitude_i_tag 8 #define Position_altitude_tag 3 #define Position_battery_level_tag 4 #define Position_time_tag 6 @@ -297,11 +297,11 @@ typedef struct _ToRadio { /* Struct field encoding specification for nanopb */ #define Position_FIELDLIST(X, a) \ -X(a, STATIC, SINGULAR, DOUBLE, latitude, 1) \ -X(a, STATIC, SINGULAR, DOUBLE, longitude, 2) \ X(a, STATIC, SINGULAR, INT32, altitude, 3) \ X(a, STATIC, SINGULAR, INT32, battery_level, 4) \ -X(a, STATIC, SINGULAR, UINT32, time, 6) +X(a, STATIC, SINGULAR, UINT32, time, 6) \ +X(a, STATIC, SINGULAR, INT32, latitude_i, 7) \ +X(a, STATIC, SINGULAR, INT32, longitude_i, 8) #define Position_CALLBACK NULL #define Position_DEFAULT NULL @@ -486,21 +486,21 @@ extern const pb_msgdesc_t ToRadio_msg; #define ToRadio_fields &ToRadio_msg /* Maximum encoded size of messages (where known) */ -#define Position_size 46 +#define Position_size 50 #define Data_size 256 #define User_size 72 /* RouteDiscovery_size depends on runtime parameters */ -#define SubPacket_size 383 -#define MeshPacket_size 425 +#define SubPacket_size 387 +#define MeshPacket_size 429 #define ChannelSettings_size 44 #define RadioConfig_size 120 #define RadioConfig_UserPreferences_size 72 -#define NodeInfo_size 138 +#define NodeInfo_size 142 #define MyNodeInfo_size 85 -#define DeviceState_size 18925 +#define DeviceState_size 19185 #define DebugString_size 258 -#define FromRadio_size 434 -#define ToRadio_size 428 +#define FromRadio_size 438 +#define ToRadio_size 432 #ifdef __cplusplus } /* extern "C" */ diff --git a/src/screen.cpp b/src/screen.cpp index a390520c4..0b3f22fb2 100644 --- a/src/screen.cpp +++ b/src/screen.cpp @@ -280,7 +280,7 @@ static float estimatedHeading(double lat, double lon) /// valid lat/lon static bool hasPosition(NodeInfo *n) { - return n->has_position && (n->position.latitude != 0 || n->position.longitude != 0); + return n->has_position && (n->position.latitude_i != 0 || n->position.longitude_i != 0); } /// We will skip one node - the one for us, so we just blindly loop over all @@ -288,6 +288,9 @@ static bool hasPosition(NodeInfo *n) static size_t nodeIndex; static int8_t prevFrame = -1; +/// Convert an integer GPS coords to a floating point +#define DegD(i) (i * 1e-7) + static void drawNodeInfo(OLEDDisplay *display, OLEDDisplayUiState *state, int16_t x, int16_t y) { // We only advance our nodeIndex if the frame # has changed - because @@ -334,7 +337,7 @@ static void drawNodeInfo(OLEDDisplay *display, OLEDDisplayUiState *state, int16_ NodeInfo *ourNode = nodeDB.getNode(nodeDB.getNodeNum()); if (ourNode && hasPosition(ourNode) && hasPosition(node)) { Position &op = ourNode->position, &p = node->position; - float d = latLongToMeter(p.latitude, p.longitude, op.latitude, op.longitude); + float d = latLongToMeter(DegD(p.latitude_i), DegD(p.longitude_i), DegD(op.latitude_i), DegD(op.longitude_i)); if (d < 2000) snprintf(distStr, sizeof(distStr), "%.0f m", d); else @@ -342,8 +345,8 @@ static void drawNodeInfo(OLEDDisplay *display, OLEDDisplayUiState *state, int16_ // FIXME, also keep the guess at the operators heading and add/substract // it. currently we don't do this and instead draw north up only. - float bearingToOther = bearing(p.latitude, p.longitude, op.latitude, op.longitude); - float myHeading = estimatedHeading(p.latitude, p.longitude); + float bearingToOther = bearing(DegD(p.latitude_i), DegD(p.longitude_i), DegD(op.latitude_i), DegD(op.longitude_i)); + float myHeading = estimatedHeading(DegD(p.latitude_i), DegD(p.longitude_i)); headingRadian = bearingToOther - myHeading; } else { // Debug info for gps lock errors