// // 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); }