commit 68a15f640a495b3ec6d16f3b8d0f398917003efe Author: cfif Date: Fri Jan 24 13:22:33 2025 +0300 Перенос на новую организацию GONEC diff --git a/Inc/GnssPro04Nmea.h b/Inc/GnssPro04Nmea.h new file mode 100644 index 0000000..a2467b2 --- /dev/null +++ b/Inc/GnssPro04Nmea.h @@ -0,0 +1,98 @@ +// +// Created by xemon on 01.09.22. +// + +#ifndef GNSSPRO04NMEA_GNSSPRO04NMEA_H +#define GNSSPRO04NMEA_GNSSPRO04NMEA_H + +#include "SerialPort.h" +#include "stddef.h" +#include "stdbool.h" + +typedef struct { + tSerialPortIO *io; + struct { + size_t len; + char buff[18]; + } cmd; +} tGnssPro04Nmea; + + +typedef enum { + GNNS_PRO04_MESAGE_DTM, + GNNS_PRO04_MESAGE_VTG, + GNNS_PRO04_MESAGE_RMC, + GNNS_PRO04_MESAGE_GSV, + GNNS_PRO04_MESAGE_GSA, + GNNS_PRO04_MESAGE_GGA, +} tGnssPro04NmeaMessageType; + +typedef enum { + GNNS_PRO04_NAV_SYSTEM_GPS, + GNNS_PRO04_NAV_SYSTEM_GLS, + GNNS_PRO04_NAV_SYSTEM_MIX, +} tGnssPro04NmeaNavSystemType; + +typedef enum { + GNNS_PRO04_COORD_P90, + GNNS_PRO04_COORD_W84, +} tGnssPro04NmeaCoordType; + +typedef enum { + GNNS_PRO04_RATE_01HZ, + GNNS_PRO04_RATE_02HZ, + GNNS_PRO04_RATE_05HZ, + GNNS_PRO04_RATE_10HZ, +} tGnssPro04NmeaRateType; + +typedef enum { + GNNS_PRO04_NMEA_STANDARD_2 = 2, + GNNS_PRO04_NMEA_STANDARD_4 = 4, +} tGnssPro04NmeaStandardType; + +typedef enum { + GNNS_PRO04_STARTUP_WARM = 'W', + GNNS_PRO04_STARTUP_COLD = 'C', + GNNS_PRO04_STARTUP_HOT = 'H', +} tGnssPro04StartupType; + + +void GnssPro04Nmea_init(tGnssPro04Nmea *env, tSerialPortIO *io); + +void GnssPro04Nmea_setStandard(tGnssPro04Nmea *env, tGnssPro04NmeaStandardType nmeaStandard); + +void GnssPro04Nmea_setStartType(tGnssPro04Nmea *env, tGnssPro04StartupType startupType); + +void GnssPro04Nmea_setRate(tGnssPro04Nmea *env, tGnssPro04NmeaRateType rate); + +void GnssPro04Nmea_setElevation(tGnssPro04Nmea *env, uint8_t uElevation); + +void GnssPro04Nmea_setSystemType(tGnssPro04Nmea *env, tGnssPro04NmeaNavSystemType system); + +void GnssPro04Nmea_setCoordType(tGnssPro04Nmea *env, tGnssPro04NmeaCoordType coordType); + +void GnssPro04Nmea_setMessageEnabled(tGnssPro04Nmea *env, tGnssPro04NmeaMessageType msg, bool value); + +// Переключение в бинарный протокол +void GnssPro04Nmea_switchProtocol(tGnssPro04Nmea *env); + + +// редефайн для обратной совместимости +#define vGnssPro04NmeaInit GnssPro04Nmea_init + +#define vGnssPro04NmeaSetStandard GnssPro04Nmea_setStandard + +#define vGnssPro04NmeaSetStartType GnssPro04Nmea_setStartType + +#define vGnssPro04NmeaSetRate GnssPro04Nmea_setRate + +#define vGnssPro04NmeaSetElevation GnssPro04Nmea_setElevation + +#define vGnssPro04NmeaSetSystemType GnssPro04Nmea_setSystemType + +#define vGnssPro04NmeaSetCoordType GnssPro04Nmea_setCoordType + +#define vGnssPro04NmeaSetMessageEnabled GnssPro04Nmea_setMessageEnabled + + +#endif //GNSSPRO04NMEA_GNSSPRO04NMEA_H diff --git a/Src/GnssPro04Nmea.c b/Src/GnssPro04Nmea.c new file mode 100644 index 0000000..8219f3a --- /dev/null +++ b/Src/GnssPro04Nmea.c @@ -0,0 +1,156 @@ +// +// Created by xemon on 01.09.22. +// + +#include "GnssPro04Nmea.h" +#include +#include "AsciiStringAssmeblingUtils.h" + +static char *GNNS_PRO04_MESAGE_NAME[] = { + [GNNS_PRO04_MESAGE_DTM] = "DMT", + [GNNS_PRO04_MESAGE_VTG] = "VTG", + [GNNS_PRO04_MESAGE_RMC] = "RMC", + [GNNS_PRO04_MESAGE_GSV] = "GSV", + [GNNS_PRO04_MESAGE_GSA] = "GSA", + [GNNS_PRO04_MESAGE_GGA] = "GGA", +}; + +static char *GNNS_PRO04_NAV_SYSTEM_NAME[] = { + [GNNS_PRO04_NAV_SYSTEM_GPS] = "GPS", + [GNNS_PRO04_NAV_SYSTEM_GLS] = "GLS", + [GNNS_PRO04_NAV_SYSTEM_MIX] = "MIX", +}; + +static char *GNNS_PRO04_COORD_NAME[] = { + [GNNS_PRO04_COORD_P90] = "P90", + [GNNS_PRO04_COORD_W84] = "W84", +}; + +static char *GNNS_PRO04_RATE_NAME[] = { + [GNNS_PRO04_RATE_01HZ] = "01", + [GNNS_PRO04_RATE_02HZ] = "02", + [GNNS_PRO04_RATE_05HZ] = "05", + [GNNS_PRO04_RATE_10HZ] = "10", +}; + +void GnssPro04Nmea_Send(tGnssPro04Nmea *env, uint8_t *str, uint16_t len) { + SerialPortTransmit(env->io, str, len, 1000); +} + + +#define GnssPro04Nmea_CmdReset(env)\ + vAsciiStringClean((env)->cmd.buff, &(env)->cmd.len) + +#define GnssPro04Nmea_CmdAddStatic(env, STR)\ + vAsciiStringAddStatic((char*)(env)->cmd.buff, &(env)->cmd.len, STR) + +#define GnssPro04Nmea_CmdAdd(env, STR, STR_LEN)\ + vAsciiStringAdd((char*)(env)->cmd.buff, &(env)->cmd.len, STR, STR_LEN); + +#define GnssPro04Nmea_CmdAddDecimalIntAsString(env, number, digits) \ + vAsciiStringAddDecimalInt((char*)(env)->cmd.buff, &(env)->cmd.len, number, digits) + +#define GnssPro04Nmea_CmdSign(env) \ + vNmea0183Sign((char*)(env)->cmd.buff, &(env)->cmd.len) + +void GnssPro04Nmea_init(tGnssPro04Nmea *env, tSerialPortIO *io) { + env->io = io; + vAsciiStringInit(env->cmd.buff, &env->cmd.len, sizeof(env->cmd.buff)); +} + +void GnssPro04Nmea_CmdSend(tGnssPro04Nmea *env) { + GnssPro04Nmea_CmdSign(env); + GnssPro04Nmea_CmdAddStatic(env, "\r\n"); + GnssPro04Nmea_Send(env, (uint8_t *) env->cmd.buff, env->cmd.len); +} + +void GnssPro04Nmea_setStandard(tGnssPro04Nmea *env, tGnssPro04NmeaStandardType nmeaStandard) { + + GnssPro04Nmea_CmdReset(env); + + GnssPro04Nmea_CmdAddStatic(env, "$GPSGG,NMEAV"); + GnssPro04Nmea_CmdAddDecimalIntAsString(env, nmeaStandard, 1); + + GnssPro04Nmea_CmdSend(env); + +} + + +void GnssPro04Nmea_setRate(tGnssPro04Nmea *env, tGnssPro04NmeaRateType rate) { + + GnssPro04Nmea_CmdReset(env); + + + GnssPro04Nmea_CmdAddStatic(env, "$GPSGG,RATE"); + GnssPro04Nmea_CmdAdd(env, GNNS_PRO04_RATE_NAME[rate], 2); + + GnssPro04Nmea_CmdSend(env); +} + + +void GnssPro04Nmea_setCoordType(tGnssPro04Nmea *env, tGnssPro04NmeaCoordType coordType) { + + GnssPro04Nmea_CmdReset(env); + + GnssPro04Nmea_CmdAddStatic(env, "$GPSGG,DAT"); + GnssPro04Nmea_CmdAdd(env, GNNS_PRO04_COORD_NAME[coordType], 3); + + GnssPro04Nmea_CmdSend(env); + +} + +void GnssPro04Nmea_setSystemType(tGnssPro04Nmea *env, tGnssPro04NmeaNavSystemType system) { + GnssPro04Nmea_CmdReset(env); + + GnssPro04Nmea_CmdAddStatic(env, "$GPSGG,NVS"); + GnssPro04Nmea_CmdAdd(env, GNNS_PRO04_NAV_SYSTEM_NAME[system], 3); + + GnssPro04Nmea_CmdSend(env); +} + + +void GnssPro04Nmea_setElevation(tGnssPro04Nmea *env, uint8_t uElevation) { + if (uElevation < 5 || uElevation > 15) { + return; // wrong value + } + + GnssPro04Nmea_CmdReset(env); + + GnssPro04Nmea_CmdAddStatic(env, "$GPSGG,ELEV"); + GnssPro04Nmea_CmdAddDecimalIntAsString(env, uElevation, 2); + + GnssPro04Nmea_CmdSend(env); +} + + +void GnssPro04Nmea_setMessageEnabled(tGnssPro04Nmea *env, tGnssPro04NmeaMessageType msg, bool value) { + GnssPro04Nmea_CmdReset(env); + + GnssPro04Nmea_CmdAddStatic(env, "$GPSGG,"); + GnssPro04Nmea_CmdAdd(env, GNNS_PRO04_MESAGE_NAME[msg], 3); + GnssPro04Nmea_CmdAdd(env, value ? " ON" : "OFF", 3); + + + GnssPro04Nmea_CmdSend(env); +} + +void GnssPro04Nmea_setStartType(tGnssPro04Nmea *env, tGnssPro04StartupType startupType) { + + GnssPro04Nmea_CmdReset(env); + + GnssPro04Nmea_CmdAddStatic(env, "$GPSGG,"); + GnssPro04Nmea_CmdAdd(env, (char *) &startupType, 1); + GnssPro04Nmea_CmdAddStatic(env, "START"); + + GnssPro04Nmea_CmdSend(env); + +} + +// Переключение в бинарный протокол +void GnssPro04Nmea_switchProtocol(tGnssPro04Nmea *env) { + GnssPro04Nmea_CmdReset(env); + + GnssPro04Nmea_CmdAddStatic(env, "$GPSGG,SWPROT"); + + GnssPro04Nmea_CmdSend(env); +} diff --git a/modular.json b/modular.json new file mode 100644 index 0000000..e75ec80 --- /dev/null +++ b/modular.json @@ -0,0 +1,27 @@ +{ + "dep": [ + { + "type": "git", + "provider": "GONEC", + "repo": "SerialPort" + }, + { + "type": "git", + "provider": "GONEC", + "repo": "Nmea0183Parser" + }, + { + "type": "git", + "provider": "GONEC", + "repo": "AsciiStringAssemblingUtils" + } + ], + "cmake": { + "inc_dirs": [ + "Inc" + ], + "srcs": [ + "Src/**.c" + ] + } +} \ No newline at end of file