diff --git a/src/main/common/maths.h b/src/main/common/maths.h index 3e24481d44..957f85d81d 100644 --- a/src/main/common/maths.h +++ b/src/main/common/maths.h @@ -35,13 +35,13 @@ #define M_PIf 3.14159265358979323846f #define RAD (M_PIf / 180.0f) -#define DEGREES_TO_DECIDEGREES(angle) (angle * 10) -#define DECIDEGREES_TO_DEGREES(angle) (angle / 10) -#define DECIDEGREES_TO_RADIANS(angle) ((angle / 10.0f) * 0.0174532925f) +#define DEGREES_TO_DECIDEGREES(angle) ((angle) * 10) +#define DECIDEGREES_TO_DEGREES(angle) ((angle) / 10) +#define DECIDEGREES_TO_RADIANS(angle) ((angle) / 10.0f * 0.0174532925f) #define DEGREES_TO_RADIANS(angle) ((angle) * 0.0174532925f) -#define CM_S_TO_KM_H(centimetersPerSecond) (centimetersPerSecond * 36 / 1000) -#define CM_S_TO_MPH(centimetersPerSecond) (((centimetersPerSecond * 10000) / 5080) / 88) +#define CM_S_TO_KM_H(centimetersPerSecond) ((centimetersPerSecond) * 36 / 1000) +#define CM_S_TO_MPH(centimetersPerSecond) ((centimetersPerSecond) * 10000 / 5080 / 88) #define MIN(a,b) \ __extension__ ({ __typeof__ (a) _a = (a); \ diff --git a/src/main/interface/msp.c b/src/main/interface/msp.c index 559ef6b762..438ecccc37 100644 --- a/src/main/interface/msp.c +++ b/src/main/interface/msp.c @@ -1033,7 +1033,7 @@ static bool mspProcessOutCommand(uint8_t cmdMSP, sbuf_t *dst) sbufWriteU8(dst, gpsSol.numSat); sbufWriteU32(dst, gpsSol.llh.lat); sbufWriteU32(dst, gpsSol.llh.lon); - sbufWriteU16(dst, gpsSol.llh.alt); + sbufWriteU16(dst, (uint16_t)constrain(gpsSol.llh.alt / 100, 0, UINT16_MAX)); // alt changed from 1m to 0.01m per lsb since MSP API 1.39 by RTH. To maintain backwards compatibility compensate to 1m per lsb in MSP again. sbufWriteU16(dst, gpsSol.groundSpeed); sbufWriteU16(dst, gpsSol.groundCourse); break; @@ -1899,7 +1899,7 @@ static mspResult_e mspProcessInCommand(uint8_t cmdMSP, sbuf_t *src) gpsSol.numSat = sbufReadU8(src); gpsSol.llh.lat = sbufReadU32(src); gpsSol.llh.lon = sbufReadU32(src); - gpsSol.llh.alt = sbufReadU16(src); + gpsSol.llh.alt = sbufReadU16(src) * 100; // alt changed from 1m to 0.01m per lsb since MSP API 1.39 by RTH. Received MSP altitudes in 1m per lsb have to upscaled. gpsSol.groundSpeed = sbufReadU16(src); GPS_update |= 2; // New data signalisation to GPS functions // FIXME Magic Numbers break; diff --git a/src/main/io/gps.c b/src/main/io/gps.c index b70bcdaf07..61d4d73e88 100644 --- a/src/main/io/gps.c +++ b/src/main/io/gps.c @@ -644,28 +644,36 @@ static uint32_t grab_fields(char *src, uint8_t mult) { // convert string to uint32 uint32_t i; uint32_t tmp = 0; + int isneg = 0; for (i = 0; src[i] != 0; i++) { + if ((i == 0) && (src[0] == '-')) { // detect negative sign + isneg = 1; + continue; // jump to next character if the first one was a negative sign + } if (src[i] == '.') { i++; - if (mult == 0) + if (mult == 0) { break; - else + } else { src[i + mult] = 0; + } } tmp *= 10; - if (src[i] >= '0' && src[i] <= '9') + if (src[i] >= '0' && src[i] <= '9') { tmp += src[i] - '0'; - if (i >= 15) + } + if (i >= 15) { return 0; // out of bounds + } } - return tmp; + return isneg ? -tmp : tmp; // handle negative altitudes } typedef struct gpsDataNmea_s { int32_t latitude; int32_t longitude; uint8_t numSat; - uint16_t altitude; + int32_t altitude; uint16_t speed; uint16_t hdop; uint16_t ground_course; @@ -736,7 +744,7 @@ static bool gpsNewFrameNMEA(char c) gps_Msg.hdop = grab_fields(string, 1) * 100; // hdop break; case 9: - gps_Msg.altitude = grab_fields(string, 0); // altitude in meters added by Mis + gps_Msg.altitude = grab_fields(string, 1) * 10; // altitude in centimeters. Note: NMEA delivers altitude with 1 or 3 decimals. It's safer to cut at 0.1m and multiply by 10 break; } break; diff --git a/src/main/io/gps.h b/src/main/io/gps.h index ed54cb99ab..d9bbf9a655 100644 --- a/src/main/io/gps.h +++ b/src/main/io/gps.h @@ -86,12 +86,11 @@ typedef struct gpsCoordinateDDDMMmmmm_s { typedef struct gpsLocation_s { int32_t lat; // latitude * 1e+7 int32_t lon; // longitude * 1e+7 - int32_t alt; // altitude in 0.1m + int32_t alt; // altitude in 0.01m } gpsLocation_t; typedef struct gpsSolutionData_s { gpsLocation_t llh; - uint16_t GPS_altitude; // altitude in 0.1m uint16_t groundSpeed; // speed in 0.1m/s uint16_t groundCourse; // degrees * 10 uint16_t hdop; // generic HDOP value (*100)