GnssPro04Nmea/Src/GnssPro04Nmea.c

157 lines
4.3 KiB
C

//
// Created by xemon on 01.09.22.
//
#include "GnssPro04Nmea.h"
#include <Nmea0183Parser.h>
#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);
}