Перенос на новую организацию GONEC

This commit is contained in:
cfif 2025-01-24 13:22:33 +03:00
commit 68a15f640a
3 changed files with 281 additions and 0 deletions

98
Inc/GnssPro04Nmea.h Normal file
View File

@ -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

156
Src/GnssPro04Nmea.c Normal file
View File

@ -0,0 +1,156 @@
//
// 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);
}

27
modular.json Normal file
View File

@ -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"
]
}
}