GPS: using 16-bit integers for altitude and speed

pull/267/head
Marco 2024-03-31 12:46:42 +02:00 zatwierdzone przez Silvano Seva
rodzic e4a62f30ee
commit a17ad80f10
6 zmienionych plików z 27 dodań i 15 usunięć

Wyświetl plik

@ -258,6 +258,19 @@ static inline float minmea_tocoord(struct minmea_float *f)
*/ */
int minmea_tofixedpoint(struct minmea_float *f); int minmea_tofixedpoint(struct minmea_float *f);
/**
* Convert a fixed-point value to an integer value.
* Returns zero for "unknown" values.
*/
static inline int minmea_toint(struct minmea_float *f)
{
if(f->scale == 0)
return 0;
return f->value / f->scale;
}
#ifdef __cplusplus #ifdef __cplusplus
} }
#endif #endif

Wyświetl plik

@ -50,8 +50,8 @@ typedef struct
uint32_t active_sats; // Bitmap representing which sats are part of the fix uint32_t active_sats; // Bitmap representing which sats are part of the fix
int32_t latitude; // Latitude coordinates int32_t latitude; // Latitude coordinates
int32_t longitude; // Longitude coordinates int32_t longitude; // Longitude coordinates
float altitude; // Antenna altitude above mean sea level (geoid) in m int16_t altitude; // Antenna altitude above mean sea level (geoid) in m
float speed; // Ground speed in km/h uint16_t speed; // Ground speed in km/h
float tmg_mag; // Course over ground, degrees, magnetic float tmg_mag; // Course over ground, degrees, magnetic
float tmg_true; // Course over ground, degrees, true float tmg_true; // Course over ground, degrees, true
} }

Wyświetl plik

@ -26,7 +26,7 @@
#include <string.h> #include <string.h>
#include <stdbool.h> #include <stdbool.h>
#define KNOTS2KMH 1.852f #define KNOTS2KMH(x) ((((int) x) * 1852) / 1000)
static char sentence[2*MINMEA_MAX_LENGTH]; static char sentence[2*MINMEA_MAX_LENGTH];
static bool gpsEnabled = false; static bool gpsEnabled = false;
@ -102,7 +102,7 @@ void gps_task()
} }
gps_data.tmg_true = minmea_tofloat(&frame.course); gps_data.tmg_true = minmea_tofloat(&frame.course);
gps_data.speed = minmea_tofloat(&frame.speed) * KNOTS2KMH; gps_data.speed = KNOTS2KMH(minmea_toint(&frame.speed));
} }
break; break;
@ -113,7 +113,7 @@ void gps_task()
{ {
gps_data.fix_quality = frame.fix_quality; gps_data.fix_quality = frame.fix_quality;
gps_data.satellites_tracked = frame.satellites_tracked; gps_data.satellites_tracked = frame.satellites_tracked;
gps_data.altitude = minmea_tofloat(&frame.altitude); gps_data.altitude = minmea_toint(&frame.altitude);
} }
} }
break; break;
@ -166,7 +166,7 @@ void gps_task()
struct minmea_sentence_vtg frame; struct minmea_sentence_vtg frame;
if (minmea_parse_vtg(&frame, sentence)) if (minmea_parse_vtg(&frame, sentence))
{ {
gps_data.speed = minmea_tofloat(&frame.speed_kph); gps_data.speed = minmea_toint(&frame.speed_kph);
gps_data.tmg_mag = minmea_tofloat(&frame.magnetic_track_degrees); gps_data.tmg_mag = minmea_tofloat(&frame.magnetic_track_degrees);
gps_data.tmg_true = minmea_tofloat(&frame.true_track_degrees); gps_data.tmg_true = minmea_tofloat(&frame.true_track_degrees);
} }

Wyświetl plik

@ -673,7 +673,7 @@ void vp_announceGPSInfo(vpGPSInfoFlags_t gpsInfoFlags)
if ((gpsInfoFlags & vpGPSSpeed) != 0) if ((gpsInfoFlags & vpGPSSpeed) != 0)
{ {
// speed/altitude: // speed/altitude:
sniprintf(buffer, 16, "%4.1fkm/h", state.gps_data.speed); sniprintf(buffer, 16, "%dkm/h", state.gps_data.speed);
vp_queuePrompt(PROMPT_SPEED); vp_queuePrompt(PROMPT_SPEED);
vp_queueString(buffer, vpAnnounceCommonSymbols | vp_queueString(buffer, vpAnnounceCommonSymbols |
vpAnnounceLessCommonSymbols); vpAnnounceLessCommonSymbols);
@ -683,7 +683,7 @@ void vp_announceGPSInfo(vpGPSInfoFlags_t gpsInfoFlags)
{ {
vp_queuePrompt(PROMPT_ALTITUDE); vp_queuePrompt(PROMPT_ALTITUDE);
sniprintf(buffer, 16, "%4.1fm", state.gps_data.altitude); sniprintf(buffer, 16, "%dm", state.gps_data.altitude);
vp_queueString(buffer, vpAnnounceCommonSymbols); vp_queueString(buffer, vpAnnounceCommonSymbols);
addSilenceIfNeeded(flags); addSilenceIfNeeded(flags);
} }

Wyświetl plik

@ -63,6 +63,7 @@
#include <stdio.h> #include <stdio.h>
#include <stdint.h> #include <stdint.h>
#include <stdlib.h>
#include <math.h> #include <math.h>
#include <ui/ui_default.h> #include <ui/ui_default.h>
#include <rtx.h> #include <rtx.h>
@ -1269,8 +1270,8 @@ void ui_saveState()
} }
#ifdef CONFIG_GPS #ifdef CONFIG_GPS
static float priorGPSSpeed = 0; static uint16_t priorGPSSpeed = 0;
static float priorGPSAltitude = 0; static int16_t priorGPSAltitude = 0;
static float priorGPSDirection = 500; // impossible value init. static float priorGPSDirection = 500; // impossible value init.
static uint8_t priorGPSFixQuality= 0; static uint8_t priorGPSFixQuality= 0;
static uint8_t priorGPSFixType = 0; static uint8_t priorGPSFixType = 0;
@ -1300,15 +1301,13 @@ static vpGPSInfoFlags_t GetGPSDirectionOrSpeedChanged()
priorGPSFixType = state.gps_data.fix_type; priorGPSFixType = state.gps_data.fix_type;
} }
float speedDiff=fabs(state.gps_data.speed - priorGPSSpeed); if (state.gps_data.speed != priorGPSSpeed)
if (speedDiff >= 1)
{ {
whatChanged |= vpGPSSpeed; whatChanged |= vpGPSSpeed;
priorGPSSpeed = state.gps_data.speed; priorGPSSpeed = state.gps_data.speed;
} }
float altitudeDiff = fabs(state.gps_data.altitude - priorGPSAltitude); if (state.gps_data.altitude != priorGPSAltitude)
if (altitudeDiff >= 5)
{ {
whatChanged |= vpGPSAltitude; whatChanged |= vpGPSAltitude;
priorGPSAltitude = state.gps_data.altitude; priorGPSAltitude = state.gps_data.altitude;

Wyświetl plik

@ -707,7 +707,7 @@ void _ui_drawMenuGPS()
gfx_print(layout.line2_pos, layout.top_font, TEXT_ALIGN_RIGHT, gfx_print(layout.line2_pos, layout.top_font, TEXT_ALIGN_RIGHT,
color_white, "%d.%.6d", longitude_int, longitude_dec); color_white, "%d.%.6d", longitude_int, longitude_dec);
gfx_print(layout.bottom_pos, layout.bottom_font, TEXT_ALIGN_CENTER, gfx_print(layout.bottom_pos, layout.bottom_font, TEXT_ALIGN_CENTER,
color_white, "S %4.1fkm/h A %4.1fm", color_white, "S %dkm/h A %dm",
last_state.gps_data.speed, last_state.gps_data.speed,
last_state.gps_data.altitude); last_state.gps_data.altitude);
} }