157 lines
4.3 KiB
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);
|
|
}
|