|
|
@@ -6,181 +6,151 @@
|
|
|
@date 2020.07.03
|
|
|
@demo libgnss
|
|
|
@tag LUAT_USE_LIBGNSS
|
|
|
+@usage
|
|
|
+-- 方案1, 经lua层进行数据中转
|
|
|
+uart.setup(2, 115200)
|
|
|
+uart.on(2, "recv", function(id, len)
|
|
|
+ while 1 do
|
|
|
+ local data = uart.read(id, 1024)
|
|
|
+ if data and #data > 1 then
|
|
|
+ libgnss.parse(data)
|
|
|
+ else
|
|
|
+ break
|
|
|
+ end
|
|
|
+ end
|
|
|
+end)
|
|
|
+-- 方案2, 适合2022.12.26之后编译固件,效率更高一些
|
|
|
+uart.setup(2, 115200)
|
|
|
+libgnss.bind(2)
|
|
|
+
|
|
|
+-- 可选调试模式
|
|
|
+-- libgnss.debug(true)
|
|
|
+
|
|
|
+sys.subscribe("GNSS_STATE", function(event, ticks)
|
|
|
+ -- event取值有
|
|
|
+ -- FIXED 定位成功
|
|
|
+ -- LOSE 定位丢失
|
|
|
+ -- ticks是事件发生的时间,一般可以忽略
|
|
|
+ log.info("gnss", "state", event, ticks)
|
|
|
+end)
|
|
|
*/
|
|
|
#include "luat_base.h"
|
|
|
#include "luat_msgbus.h"
|
|
|
#include "luat_malloc.h"
|
|
|
#include "luat_uart.h"
|
|
|
+#include "luat_mcu.h"
|
|
|
+#include "luat_rtc.h"
|
|
|
|
|
|
-#define LUAT_LOG_TAG "luat.gnss"
|
|
|
+#define LUAT_LOG_TAG "gnss"
|
|
|
#include "luat_log.h"
|
|
|
|
|
|
#include "minmea.h"
|
|
|
|
|
|
-typedef struct luat_libgnss
|
|
|
-{
|
|
|
- uint8_t debug;
|
|
|
- uint8_t prev_fixed;
|
|
|
- // int lua_ref;
|
|
|
- struct minmea_sentence_rmc frame_rmc;
|
|
|
- struct minmea_sentence_gga frame_gga;
|
|
|
- struct minmea_sentence_gll frame_gll;
|
|
|
- struct minmea_sentence_gst frame_gst;
|
|
|
- struct minmea_sentence_gsv frame_gsv[3];
|
|
|
- struct minmea_sentence_vtg frame_vtg;
|
|
|
- struct minmea_sentence_gsa frame_gsa;
|
|
|
- struct minmea_sentence_zda frame_zda;
|
|
|
-} luat_libgnss_t;
|
|
|
-
|
|
|
-static luat_libgnss_t *gnss = NULL;
|
|
|
-static luat_libgnss_t *gnsstmp = NULL;
|
|
|
-
|
|
|
-static int luat_libgnss_init(void) {
|
|
|
- if (gnss == NULL) {
|
|
|
- gnss = luat_heap_malloc(sizeof(luat_libgnss_t));
|
|
|
- if (gnss == NULL) {
|
|
|
- LLOGW("out of memory for libgnss data parse");
|
|
|
- return 0;
|
|
|
- }
|
|
|
- gnsstmp = luat_heap_malloc(sizeof(luat_libgnss_t));
|
|
|
- if (gnsstmp == NULL) {
|
|
|
- luat_heap_free(gnss);
|
|
|
- LLOGW("out of memory for libgnss data parse");
|
|
|
- return 0;
|
|
|
- }
|
|
|
- // gnss->lua_ref = luaL_ref(L, LUA_REGISTRYINDEX);
|
|
|
- memset(gnss, 0, sizeof(luat_libgnss_t));
|
|
|
- memset(gnsstmp, 0, sizeof(luat_libgnss_t));
|
|
|
+extern luat_libgnss_t *libgnss_gnss;
|
|
|
+// extern luat_libgnss_t *libgnss_gnsstmp;
|
|
|
+extern char* libgnss_recvbuff;
|
|
|
+
|
|
|
+void luat_uart_set_app_recv(int id, luat_uart_recv_callback_t cb);
|
|
|
+
|
|
|
+static inline void push_gnss_value(lua_State *L, struct minmea_float *f, int mode) {
|
|
|
+ if (f->value == 0) {
|
|
|
+ lua_pushinteger(L, 0);
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ switch (mode)
|
|
|
+ {
|
|
|
+ case 0:
|
|
|
+ lua_pushinteger(L, minmea_tofloat(f));
|
|
|
+ break;
|
|
|
+ case 1:
|
|
|
+ lua_pushinteger(L, f->value);
|
|
|
+ break;
|
|
|
+ case 2:
|
|
|
+ lua_pushnumber(L, minmea_tocoord(f));
|
|
|
+ break;
|
|
|
+ default:
|
|
|
+ break;
|
|
|
}
|
|
|
- //lua_pushboolean(L, 1);
|
|
|
- return 1;
|
|
|
}
|
|
|
|
|
|
-static int parse_nmea(const char* line) {
|
|
|
- // $GNRMC,080313.00,A,2324.40756,N,11313.86184,E,0.284,,010720,,,A*68
|
|
|
- //if (gnss != NULL && gnss->debug)
|
|
|
- // LLOGD("GNSS [%s]", line);
|
|
|
- if (gnss == NULL && !luat_libgnss_init()) {
|
|
|
+static int luat_libgnss_state_handler(lua_State *L, void* ptr) {
|
|
|
+ (void)ptr;
|
|
|
+ rtos_msg_t* msg = (rtos_msg_t*)lua_topointer(L, -1);
|
|
|
+ lua_getglobal(L, "sys_pub");
|
|
|
+ if (!lua_isfunction(L, -1)) {
|
|
|
return 0;
|
|
|
}
|
|
|
- struct minmea_sentence_gsv frame_gsv = {0};
|
|
|
+/*
|
|
|
+@sys_pub libgnss
|
|
|
+GNSS状态变化
|
|
|
+GNSS_STATE
|
|
|
+@usage
|
|
|
+sys.subscribe("GNSS_STATE", function(event, ticks)
|
|
|
+ -- event取值有
|
|
|
+ -- FIXED 定位成功
|
|
|
+ -- LOSE 定位丢失
|
|
|
+ -- ticks是事件发生的时间,一般可以忽略
|
|
|
+ log.info("gnss", "state", event, ticks)
|
|
|
+end)
|
|
|
+*/
|
|
|
+ lua_pushliteral(L, "GNSS_STATE");
|
|
|
+ switch (msg->arg1)
|
|
|
+ {
|
|
|
+ case GNSS_STATE_FIXED:
|
|
|
+ lua_pushliteral(L, "FIXED");
|
|
|
+ break;
|
|
|
+ case GNSS_STATE_LOSE:
|
|
|
+ lua_pushliteral(L, "LOSE");
|
|
|
+ break;
|
|
|
+ case GNSS_STATE_OPEN:
|
|
|
+ lua_pushliteral(L, "OPEN");
|
|
|
+ break;
|
|
|
+ case GNSS_STATE_CLOSE:
|
|
|
+ lua_pushliteral(L, "CLOSE");
|
|
|
+ break;
|
|
|
+ default:
|
|
|
+ return 0;
|
|
|
+ }
|
|
|
+ lua_pushinteger(L, msg->arg2);
|
|
|
+ lua_call(L, 3, 0);
|
|
|
+ return 0;
|
|
|
+}
|
|
|
|
|
|
- switch (minmea_sentence_id(line, false)) {
|
|
|
- case MINMEA_INVALID : {
|
|
|
- LLOGD("bad line %s", line);
|
|
|
- break;
|
|
|
- }
|
|
|
- case MINMEA_SENTENCE_RMC: {
|
|
|
- if (minmea_parse_rmc(&(gnsstmp->frame_rmc), line)) {
|
|
|
- if (gnsstmp->frame_rmc.valid) {
|
|
|
- memcpy(&(gnss->frame_rmc), &gnsstmp->frame_rmc, sizeof(struct minmea_sentence_rmc));
|
|
|
- }
|
|
|
- else {
|
|
|
- gnss->frame_rmc.valid = 0;
|
|
|
- if (gnsstmp->frame_rmc.date.year > 0) {
|
|
|
- memcpy(&(gnss->frame_rmc.date), &(gnsstmp->frame_rmc.date), sizeof(struct minmea_date));
|
|
|
- }
|
|
|
- if (gnsstmp->frame_rmc.time.hours > 0) {
|
|
|
- memcpy(&(gnss->frame_rmc.time), &(gnsstmp->frame_rmc.time), sizeof(struct minmea_time));
|
|
|
- }
|
|
|
- }
|
|
|
- //memcpy(&(gnss->frame_rmc), &frame_rmc, sizeof(struct minmea_sentence_rmc));
|
|
|
- //LLOGD("RMC %s", line);
|
|
|
- //LLOGD("RMC isFix(%d) Lat(%ld) Lng(%ld)", gnss->frame_rmc.valid, gnss->frame_rmc.latitude.value, gnss->frame_rmc.longitude.value);
|
|
|
- // if (prev_gnss_fixed != gnss->frame_rmc.valid) {
|
|
|
- // lua_getglobal(L, "sys_pub");
|
|
|
- // if (lua_isfunction(L, -1)) {
|
|
|
- // lua_pushliteral(L, "GPS_STATE");
|
|
|
- // lua_pushstring(L, gnss->frame_rmc.valid ? "LOCATION_SUCCESS" : "LOCATION_FAIL");
|
|
|
- // lua_call(L, 2, 0);
|
|
|
- // }
|
|
|
- // else {
|
|
|
- // lua_pop(L, 1);
|
|
|
- // }
|
|
|
- // prev_gnss_fixed = gnss->frame_rmc.valid;
|
|
|
- // }
|
|
|
- }
|
|
|
- } break;
|
|
|
+int luat_libgnss_state_onchanged(int state) {
|
|
|
+ rtos_msg_t msg = {0};
|
|
|
+ msg.handler = luat_libgnss_state_handler;
|
|
|
+ msg.arg1 = state;
|
|
|
+ #ifdef LUAT_USE_MCU
|
|
|
+ msg.arg2 = luat_mcu_ticks();
|
|
|
+ #endif
|
|
|
+ luat_msgbus_put(&msg, 0);
|
|
|
+ return 0;
|
|
|
+}
|
|
|
|
|
|
- case MINMEA_SENTENCE_GGA: {
|
|
|
- //struct minmea_sentence_gga frame_gga;
|
|
|
- if (minmea_parse_gga(&gnsstmp->frame_gga, line)) {
|
|
|
- memcpy(&(gnss->frame_gga), &gnsstmp->frame_gga, sizeof(struct minmea_sentence_gga));
|
|
|
- //LLOGD("$GGA: fix quality: %d", frame_gga.fix_quality);
|
|
|
- }
|
|
|
- } break;
|
|
|
+static void put_datetime(lua_State*L, struct tm* rtime) {
|
|
|
+ lua_pushliteral(L, "year");
|
|
|
+ lua_pushinteger(L, rtime->tm_year);
|
|
|
+ lua_settable(L, -3);
|
|
|
|
|
|
- case MINMEA_SENTENCE_GSA: {
|
|
|
- if (minmea_parse_gsa(&(gnss->frame_gsa), line)) {
|
|
|
+ lua_pushliteral(L, "month");
|
|
|
+ lua_pushinteger(L, rtime->tm_mon + 1); // 比较纠结, 要不要兼容老的呢?
|
|
|
+ lua_settable(L, -3);
|
|
|
|
|
|
- }
|
|
|
- } break;
|
|
|
+ lua_pushliteral(L, "day");
|
|
|
+ lua_pushinteger(L, rtime->tm_mday);
|
|
|
+ lua_settable(L, -3);
|
|
|
|
|
|
- case MINMEA_SENTENCE_GLL: {
|
|
|
- if (minmea_parse_gll(&(gnss->frame_gll), line)) {
|
|
|
- // memcpy(&(gnss->frame_gll), &frame_gll, sizeof(struct minmea_sentence_gsa));
|
|
|
- }
|
|
|
- } break;
|
|
|
-
|
|
|
- // case MINMEA_SENTENCE_GST: {
|
|
|
- // if (minmea_parse_gst(&gnsstmp->frame_gst, line)) {
|
|
|
- // memcpy(&(gnss->frame_gst), &gnsstmp->frame_gst, sizeof(struct minmea_sentence_gst));
|
|
|
- // }
|
|
|
- // } break;
|
|
|
-
|
|
|
- case MINMEA_SENTENCE_GSV: {
|
|
|
- //LLOGD("Got GSV : %s", line);
|
|
|
- if (minmea_parse_gsv(&frame_gsv, line)) {
|
|
|
- //LLOGD("$GSV: message %d of %d", frame_gsv.msg_nr, frame_gsv.total_msgs);
|
|
|
- if (frame_gsv.msg_nr == 1) {
|
|
|
- //LLOGD("Clean GSV");
|
|
|
- memset(&(gnss->frame_gsv), 0, sizeof(struct minmea_sentence_gsv) * 3);
|
|
|
- }
|
|
|
- if (frame_gsv.msg_nr >= 1 && frame_gsv.msg_nr <= 3) {
|
|
|
- //LLOGD("memcpy GSV %d", frame_gsv.msg_nr);
|
|
|
- memcpy(&(gnss->frame_gsv[frame_gsv.msg_nr - 1]), &frame_gsv, sizeof(struct minmea_sentence_gsv));
|
|
|
- }
|
|
|
- // LLOGD("$GSV: message %d of %d", frame_gsv.msg_nr, frame_gsv.total_msgs);
|
|
|
- // LLOGD("$GSV: sattelites in view: %d", frame_gsv.total_sats);
|
|
|
- // for (int i = 0; i < 4; i++)
|
|
|
- // LLOGD("$GSV: sat nr %d, elevation: %d, azimuth: %d, snr: %d dbm",
|
|
|
- // frame_gsv.sats[i].nr,
|
|
|
- // frame_gsv.sats[i].elevation,
|
|
|
- // frame_gsv.sats[i].azimuth,
|
|
|
- // frame_gsv.sats[i].snr);
|
|
|
- }
|
|
|
- else {
|
|
|
- //LLOGD("bad GSV %s", line);
|
|
|
- }
|
|
|
- } break;
|
|
|
-
|
|
|
- case MINMEA_SENTENCE_VTG: {
|
|
|
- //struct minmea_sentence_vtg frame_vtg;
|
|
|
- if (minmea_parse_vtg(&(gnsstmp->frame_vtg), line)) {
|
|
|
- memcpy(&(gnss->frame_vtg), &gnsstmp->frame_vtg, sizeof(struct minmea_sentence_vtg));
|
|
|
- //--------------------------------------
|
|
|
- // 暂时不发GPS_MSG_REPORT
|
|
|
- // lua_getglobal(L, "sys_pub");
|
|
|
- // if (lua_isfunction(L, -1)) {
|
|
|
- // lua_pushstring(L, "GPS_MSG_REPORT");
|
|
|
- // lua_call(L, 1, 0);
|
|
|
- // }
|
|
|
- // else {
|
|
|
- // lua_pop(L, 1);
|
|
|
- // }
|
|
|
- //--------------------------------------
|
|
|
- }
|
|
|
- } break;
|
|
|
- case MINMEA_SENTENCE_ZDA: {
|
|
|
- if (minmea_parse_zda(&(gnsstmp->frame_zda), line)) {
|
|
|
- memcpy(&(gnss->frame_zda), &gnsstmp->frame_zda, sizeof(struct minmea_sentence_zda));
|
|
|
- }
|
|
|
- } break;
|
|
|
- default:
|
|
|
- //LLOGD("why happen");
|
|
|
- break;
|
|
|
- }
|
|
|
- return 0;
|
|
|
+ lua_pushliteral(L, "hour");
|
|
|
+ lua_pushinteger(L, rtime->tm_hour);
|
|
|
+ lua_settable(L, -3);
|
|
|
+
|
|
|
+ lua_pushliteral(L, "min");
|
|
|
+ lua_pushinteger(L, rtime->tm_min);
|
|
|
+ lua_settable(L, -3);
|
|
|
+
|
|
|
+ lua_pushliteral(L, "sec");
|
|
|
+ lua_pushinteger(L, rtime->tm_sec);
|
|
|
+ lua_settable(L, -3);
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
@@ -188,35 +158,16 @@ static int parse_nmea(const char* line) {
|
|
|
@api libgnss.parse(str)
|
|
|
@string 原始nmea数据
|
|
|
@usage
|
|
|
--- 解析nmea
|
|
|
+-- 解析nmea数据
|
|
|
libgnss.parse(indata)
|
|
|
log.info("nmea", json.encode(libgnss.getRmc()))
|
|
|
*/
|
|
|
static int l_libgnss_parse(lua_State *L) {
|
|
|
size_t len = 0;
|
|
|
const char* str = luaL_checklstring(L, 1, &len);
|
|
|
- if (len == 0) {
|
|
|
- return 0;
|
|
|
- }
|
|
|
- // TODO 处理粘包,分包的情况
|
|
|
- char buff[85] = {0}; // nmea 最大长度82,含换行符
|
|
|
- char *ptr = (char*)str;
|
|
|
- size_t prev = 0;
|
|
|
- for (size_t i = 1; i < len; i++)
|
|
|
- {
|
|
|
- if (*(ptr + i) == 0x0A) {
|
|
|
- if (i - prev > 10 && i - prev < 82) {
|
|
|
- memcpy(buff, ptr + prev, i - prev - 1);
|
|
|
- if (buff[0] == '$') {
|
|
|
- buff[i - prev - 1] = 0; // 确保结束符存在
|
|
|
- parse_nmea((const char*)buff);
|
|
|
- }
|
|
|
- }
|
|
|
- i ++;
|
|
|
- prev = i;
|
|
|
- }
|
|
|
+ if (len > 0) {
|
|
|
+ luat_libgnss_parse_data(str, len);
|
|
|
}
|
|
|
-
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
@@ -230,19 +181,19 @@ libgnss.parse(indata)
|
|
|
log.info("nmea", "isFix", libgnss.isFix())
|
|
|
*/
|
|
|
static int l_libgnss_is_fix(lua_State *L) {
|
|
|
- if (gnss == NULL) {
|
|
|
+ if (libgnss_gnss == NULL) {
|
|
|
lua_pushboolean(L, 0);
|
|
|
}
|
|
|
else
|
|
|
- lua_pushboolean(L, gnss->frame_rmc.valid != 0 ? 1 : 0);
|
|
|
+ lua_pushboolean(L, libgnss_gnss->frame_rmc.valid != 0 ? 1 : 0);
|
|
|
return 1;
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
获取位置信息
|
|
|
@api libgnss.getIntLocation()
|
|
|
-@return int lat数据, 格式为 ddmmmmmmm
|
|
|
-@return int lng数据, 格式为 ddmmmmmmm
|
|
|
+@return int lat数据, 格式为 ddddddddd
|
|
|
+@return int lng数据, 格式为 ddddddddd
|
|
|
@return int speed数据
|
|
|
@usage
|
|
|
-- 解析nmea
|
|
|
@@ -250,10 +201,10 @@ libgnss.parse(indata)
|
|
|
log.info("nmea", "loc", libgnss.getIntLocation())
|
|
|
*/
|
|
|
static int l_libgnss_get_int_location(lua_State *L) {
|
|
|
- if (gnss != NULL && gnss->frame_rmc.valid) {
|
|
|
- lua_pushinteger(L, minmea_tofloat(&(gnss->frame_rmc.latitude)));
|
|
|
- lua_pushinteger(L, minmea_tofloat(&(gnss->frame_rmc.longitude)));
|
|
|
- lua_pushinteger(L, gnss->frame_rmc.speed.value);
|
|
|
+ if (libgnss_gnss != NULL && libgnss_gnss->frame_rmc.valid) {
|
|
|
+ lua_pushinteger(L, libgnss_gnss->frame_rmc.latitude.value);
|
|
|
+ lua_pushinteger(L, libgnss_gnss->frame_rmc.longitude.value);
|
|
|
+ lua_pushinteger(L, libgnss_gnss->frame_rmc.speed.value);
|
|
|
} else {
|
|
|
lua_pushinteger(L, 0);
|
|
|
lua_pushinteger(L, 0);
|
|
|
@@ -264,7 +215,8 @@ static int l_libgnss_get_int_location(lua_State *L) {
|
|
|
|
|
|
/**
|
|
|
获取原始RMC位置信息
|
|
|
-@api libgnss.getRmc()
|
|
|
+@api libgnss.getRmc(data_mode)
|
|
|
+@int 坐标类数据的格式, 0-DDMM.MMM格式, 1-DDDDDDD格式, 2-DD.DDDDD格式
|
|
|
@return table 原始rmc数据
|
|
|
@usage
|
|
|
-- 解析nmea
|
|
|
@@ -272,61 +224,91 @@ libgnss.parse(indata)
|
|
|
log.info("nmea", "rmc", json.encode(libgnss.getRmc()))
|
|
|
*/
|
|
|
static int l_libgnss_get_rmc(lua_State *L) {
|
|
|
+ int mode = luaL_optinteger(L, 1, 0);
|
|
|
+ lua_settop(L, 0);
|
|
|
lua_createtable(L, 0, 12);
|
|
|
|
|
|
- if (gnss != NULL) {
|
|
|
+ struct tm rtime = {0};
|
|
|
|
|
|
- lua_pushliteral(L, "valid");
|
|
|
- lua_pushboolean(L, gnss->frame_rmc.valid);
|
|
|
- lua_settable(L, -3);
|
|
|
+ if (libgnss_gnss != NULL) {
|
|
|
+ lua_pushboolean(L, libgnss_gnss->frame_rmc.valid);
|
|
|
+ lua_setfield(L, -2, "valid");
|
|
|
|
|
|
- lua_pushliteral(L, "lat");
|
|
|
- lua_pushnumber(L, minmea_tofloat(&(gnss->frame_rmc.latitude)));
|
|
|
- lua_settable(L, -3);
|
|
|
+ if (libgnss_gnss->frame_rmc.valid) {
|
|
|
+ push_gnss_value(L, &(libgnss_gnss->frame_rmc.latitude), mode);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ lua_pushinteger(L, 0);
|
|
|
+ lua_setfield(L, -2, "lat");
|
|
|
|
|
|
- lua_pushliteral(L, "lng");
|
|
|
- lua_pushnumber(L, minmea_tofloat(&(gnss->frame_rmc.longitude)));
|
|
|
- lua_settable(L, -3);
|
|
|
+ if (libgnss_gnss->frame_rmc.valid) {
|
|
|
+ push_gnss_value(L, &(libgnss_gnss->frame_rmc.longitude), mode);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ lua_pushinteger(L, 0);
|
|
|
+ lua_setfield(L, -2, "lng");
|
|
|
|
|
|
- lua_pushliteral(L, "speed");
|
|
|
- lua_pushinteger(L, gnss->frame_rmc.speed.value);
|
|
|
- lua_settable(L, -3);
|
|
|
+ if (libgnss_gnss->frame_rmc.valid) {
|
|
|
+ push_gnss_value(L, &(libgnss_gnss->frame_rmc.speed), mode);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ lua_pushinteger(L, 0);
|
|
|
+ lua_setfield(L, -2, "speed");
|
|
|
|
|
|
- lua_pushliteral(L, "course");
|
|
|
- lua_pushinteger(L, gnss->frame_rmc.course.value);
|
|
|
- lua_settable(L, -3);
|
|
|
+ if (libgnss_gnss->frame_rmc.valid) {
|
|
|
+ push_gnss_value(L, &(libgnss_gnss->frame_rmc.course), mode);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ lua_pushinteger(L, 0);
|
|
|
+ lua_setfield(L, -2, "course");
|
|
|
|
|
|
+ if (libgnss_gnss->frame_rmc.valid) {
|
|
|
+ push_gnss_value(L, &(libgnss_gnss->frame_rmc.variation), mode);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ lua_pushinteger(L, 0);
|
|
|
+ lua_setfield(L, -2, "variation");
|
|
|
|
|
|
- lua_pushliteral(L, "variation");
|
|
|
- lua_pushinteger(L, gnss->frame_rmc.variation.value);
|
|
|
- lua_settable(L, -3);
|
|
|
+ // 时间类
|
|
|
+ minmea_getdatetime(&rtime, &libgnss_gnss->frame_rmc.date, &libgnss_gnss->frame_rmc.time);
|
|
|
+ put_datetime(L, &rtime);
|
|
|
+ }
|
|
|
|
|
|
- lua_pushliteral(L, "year");
|
|
|
- lua_pushinteger(L, gnss->frame_rmc.date.year + 2000);
|
|
|
- lua_settable(L, -3);
|
|
|
+ return 1;
|
|
|
+}
|
|
|
|
|
|
- lua_pushliteral(L, "month");
|
|
|
- lua_pushinteger(L, gnss->frame_rmc.date.month);
|
|
|
- lua_settable(L, -3);
|
|
|
+static void add_gsv(lua_State*L, struct minmea_sentence_gsv* gsvs, size_t *count) {
|
|
|
|
|
|
- lua_pushliteral(L, "day");
|
|
|
- lua_pushinteger(L, gnss->frame_rmc.date.day);
|
|
|
- lua_settable(L, -3);
|
|
|
+ for (size_t i = 0; i < 3; i++)
|
|
|
+ {
|
|
|
+ for (size_t j = 0; j < 4; j++)
|
|
|
+ {
|
|
|
+ //LLOGD("nr %d snr %d", gnss->frame_gsv[i].sats[j].nr, gnss->frame_gsv[i].sats[j].snr);
|
|
|
+ if (gsvs[i].sats[j].nr) {
|
|
|
+ lua_pushinteger(L, *count);
|
|
|
+ lua_createtable(L, 0, 4);
|
|
|
|
|
|
- lua_pushliteral(L, "hour");
|
|
|
- lua_pushinteger(L, gnss->frame_rmc.time.hours);
|
|
|
- lua_settable(L, -3);
|
|
|
+ lua_pushliteral(L, "nr");
|
|
|
+ lua_pushinteger(L, gsvs[i].sats[j].nr);
|
|
|
+ lua_settable(L, -3);
|
|
|
|
|
|
- lua_pushliteral(L, "min");
|
|
|
- lua_pushinteger(L, gnss->frame_rmc.time.minutes);
|
|
|
- lua_settable(L, -3);
|
|
|
+ lua_pushliteral(L, "snr");
|
|
|
+ lua_pushinteger(L, gsvs[i].sats[j].snr);
|
|
|
+ lua_settable(L, -3);
|
|
|
|
|
|
- lua_pushliteral(L, "sec");
|
|
|
- lua_pushinteger(L, gnss->frame_rmc.time.seconds);
|
|
|
- lua_settable(L, -3);
|
|
|
- }
|
|
|
+ lua_pushliteral(L, "elevation");
|
|
|
+ lua_pushinteger(L, gsvs[i].sats[j].elevation);
|
|
|
+ lua_settable(L, -3);
|
|
|
|
|
|
- return 1;
|
|
|
+ lua_pushliteral(L, "azimuth");
|
|
|
+ lua_pushinteger(L, gsvs[i].sats[j].azimuth);
|
|
|
+ lua_settable(L, -3);
|
|
|
+
|
|
|
+ lua_settable(L, -3);
|
|
|
+ *count = *count + 1;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
@@ -340,46 +322,29 @@ log.info("nmea", "gsv", json.encode(libgnss.getGsv()))
|
|
|
*/
|
|
|
static int l_libgnss_get_gsv(lua_State *L) {
|
|
|
lua_createtable(L, 0, 2);
|
|
|
+ if (libgnss_gnss == NULL)
|
|
|
+ return 1;
|
|
|
|
|
|
- if (gnss != NULL) {
|
|
|
- int count = 1;
|
|
|
- lua_pushliteral(L, "total_sats");
|
|
|
- lua_pushinteger(L, gnss->frame_gsv[0].total_sats);
|
|
|
- lua_settable(L, -3);
|
|
|
+ size_t count = 1;
|
|
|
|
|
|
- lua_pushliteral(L, "sats");
|
|
|
- lua_createtable(L, 12, 0);
|
|
|
- for (size_t i = 0; i < 3; i++)
|
|
|
- {
|
|
|
- for (size_t j = 0; j < 4; j++)
|
|
|
- {
|
|
|
- //LLOGD("nr %d snr %d", gnss->frame_gsv[i].sats[j].nr, gnss->frame_gsv[i].sats[j].snr);
|
|
|
- if (gnss->frame_gsv[i].sats[j].nr) {
|
|
|
- lua_pushinteger(L, count++);
|
|
|
- lua_createtable(L, 0, 4);
|
|
|
-
|
|
|
- lua_pushliteral(L, "nr");
|
|
|
- lua_pushinteger(L, gnss->frame_gsv[i].sats[j].nr);
|
|
|
- lua_settable(L, -3);
|
|
|
-
|
|
|
- lua_pushliteral(L, "snr");
|
|
|
- lua_pushinteger(L, gnss->frame_gsv[i].sats[j].snr);
|
|
|
- lua_settable(L, -3);
|
|
|
-
|
|
|
- lua_pushliteral(L, "elevation");
|
|
|
- lua_pushinteger(L, gnss->frame_gsv[i].sats[j].elevation);
|
|
|
- lua_settable(L, -3);
|
|
|
-
|
|
|
- lua_pushliteral(L, "azimuth");
|
|
|
- lua_pushinteger(L, gnss->frame_gsv[i].sats[j].azimuth);
|
|
|
- lua_settable(L, -3);
|
|
|
-
|
|
|
- lua_settable(L, -3);
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
- lua_settable(L, -3);
|
|
|
+ lua_createtable(L, 12, 0);
|
|
|
+ if (libgnss_gnss->frame_gsv_gp->total_sats > 0) {
|
|
|
+ add_gsv(L, libgnss_gnss->frame_gsv_gp, &count);
|
|
|
+ }
|
|
|
+ if (libgnss_gnss->frame_gsv_gb->total_sats > 0) {
|
|
|
+ add_gsv(L, libgnss_gnss->frame_gsv_gb, &count);
|
|
|
}
|
|
|
+ if (libgnss_gnss->frame_gsv_gl->total_sats > 0) {
|
|
|
+ add_gsv(L, libgnss_gnss->frame_gsv_gl, &count);
|
|
|
+ }
|
|
|
+ if (libgnss_gnss->frame_gsv_ga->total_sats > 0) {
|
|
|
+ add_gsv(L, libgnss_gnss->frame_gsv_ga, &count);
|
|
|
+ }
|
|
|
+ lua_setfield(L, -2, "sats");
|
|
|
+
|
|
|
+ lua_pushliteral(L, "total_sats");
|
|
|
+ lua_pushinteger(L, count - 1);
|
|
|
+ lua_settable(L, -3);
|
|
|
|
|
|
return 1;
|
|
|
}
|
|
|
@@ -387,7 +352,8 @@ static int l_libgnss_get_gsv(lua_State *L) {
|
|
|
|
|
|
/**
|
|
|
获取原始GSA信息
|
|
|
-@api libgnss.getGsa()
|
|
|
+@api libgnss.getGsa(data_mode)
|
|
|
+@int 坐标类数据的格式, 0-DDMM.MMM格式, 1-DDDDDDD格式, 2-DD.DDDDD格式
|
|
|
@return table 原始GSA数据
|
|
|
@usage
|
|
|
-- 解析nmea
|
|
|
@@ -395,6 +361,10 @@ libgnss.parse(indata)
|
|
|
log.info("nmea", "gsa", json.encode(libgnss.getGsa()))
|
|
|
*/
|
|
|
static int l_libgnss_get_gsa(lua_State *L) {
|
|
|
+ int mode = luaL_optinteger(L, 1, 0);
|
|
|
+ lua_settop(L, 0);
|
|
|
+ if (libgnss_gnss == NULL)
|
|
|
+ return 0;
|
|
|
lua_createtable(L, 0, 10);
|
|
|
|
|
|
//lua_pushliteral(L, "mode");
|
|
|
@@ -402,29 +372,32 @@ static int l_libgnss_get_gsa(lua_State *L) {
|
|
|
//lua_settable(L, -3);
|
|
|
|
|
|
lua_pushliteral(L, "fix_type");
|
|
|
- lua_pushinteger(L, gnss ? gnss->frame_gsa.fix_type : 0);
|
|
|
+ lua_pushinteger(L, libgnss_gnss->frame_gsa[0].fix_type);
|
|
|
lua_settable(L, -3);
|
|
|
|
|
|
lua_pushliteral(L, "pdop");
|
|
|
- lua_pushinteger(L, gnss ? gnss->frame_gsa.pdop.value : 0);
|
|
|
+ push_gnss_value(L, &(libgnss_gnss->frame_gsa[0].pdop), mode);
|
|
|
lua_settable(L, -3);
|
|
|
|
|
|
lua_pushliteral(L, "hdop");
|
|
|
- lua_pushinteger(L, gnss ? gnss->frame_gsa.hdop.value : 0);
|
|
|
+ push_gnss_value(L, &(libgnss_gnss->frame_gsa[0].hdop), mode);
|
|
|
lua_settable(L, -3);
|
|
|
|
|
|
lua_pushliteral(L, "vdop");
|
|
|
- lua_pushinteger(L, gnss ? gnss->frame_gsa.vdop.value : 0);
|
|
|
+ push_gnss_value(L, &(libgnss_gnss->frame_gsa[0].vdop), mode);
|
|
|
lua_settable(L, -3);
|
|
|
|
|
|
lua_pushliteral(L, "sats");
|
|
|
lua_createtable(L, 12, 0);
|
|
|
- if (gnss != NULL) {
|
|
|
- for (size_t i = 0; i < 12; i++) {
|
|
|
- if (gnss->frame_gsa.sats[i] == 0) break;
|
|
|
- lua_pushinteger(L, i + 1);
|
|
|
- lua_pushinteger(L, gnss->frame_gsa.sats[i]);
|
|
|
- lua_settable(L, -3);
|
|
|
+ size_t pos = 1;
|
|
|
+ for (size_t i = 0; i < 12; i++) {
|
|
|
+ for (size_t j = 0; j < 3; j++)
|
|
|
+ {
|
|
|
+ if (libgnss_gnss->frame_gsa[j].sats[i] == 0)
|
|
|
+ continue;
|
|
|
+ lua_pushinteger(L, libgnss_gnss->frame_gsa[j].sats[i]);
|
|
|
+ lua_seti(L, -2, pos);
|
|
|
+ pos ++;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
@@ -436,7 +409,8 @@ static int l_libgnss_get_gsa(lua_State *L) {
|
|
|
|
|
|
/**
|
|
|
获取原始VTA位置信息
|
|
|
-@api libgnss.getVtg()
|
|
|
+@api libgnss.getVtg(data_mode)
|
|
|
+@int 坐标类数据的格式, 0-DDMM.MMM格式, 1-DDDDDDD格式, 2-DD.DDDDD格式
|
|
|
@return table 原始VTA数据
|
|
|
@usage
|
|
|
-- 解析nmea
|
|
|
@@ -444,26 +418,30 @@ libgnss.parse(indata)
|
|
|
log.info("nmea", "vtg", json.encode(libgnss.getVtg()))
|
|
|
*/
|
|
|
static int l_libgnss_get_vtg(lua_State *L) {
|
|
|
+ int mode = luaL_optinteger(L, 1, 0);
|
|
|
+ lua_settop(L, 0);
|
|
|
+ if (libgnss_gnss == NULL)
|
|
|
+ return 0;
|
|
|
lua_createtable(L, 0, 10);
|
|
|
|
|
|
- //lua_pushliteral(L, "faa_mode");
|
|
|
- //lua_pushlstring(L, gnss ? &(gnss->frame_vtg.faa_mode) : 'N', 1);
|
|
|
- //lua_settable(L, -3);
|
|
|
+ // lua_pushliteral(L, "faa_mode");
|
|
|
+ // lua_pushlstring(L, libgnss_gnss->frame_vtg.faa_mode, 1);
|
|
|
+ // lua_settable(L, -3);
|
|
|
|
|
|
lua_pushliteral(L, "true_track_degrees");
|
|
|
- lua_pushinteger(L, gnss ? gnss->frame_vtg.true_track_degrees.value : 0);
|
|
|
+ push_gnss_value(L, &(libgnss_gnss->frame_vtg.true_track_degrees), mode);
|
|
|
lua_settable(L, -3);
|
|
|
|
|
|
lua_pushliteral(L, "magnetic_track_degrees");
|
|
|
- lua_pushinteger(L, gnss ? gnss->frame_vtg.magnetic_track_degrees.value : 0);
|
|
|
+ push_gnss_value(L, &(libgnss_gnss->frame_vtg.magnetic_track_degrees), mode);
|
|
|
lua_settable(L, -3);
|
|
|
|
|
|
lua_pushliteral(L, "speed_knots");
|
|
|
- lua_pushinteger(L, gnss ? gnss->frame_vtg.speed_knots.value : 0);
|
|
|
+ push_gnss_value(L, &(libgnss_gnss->frame_vtg.speed_knots), mode);
|
|
|
lua_settable(L, -3);
|
|
|
|
|
|
lua_pushliteral(L, "speed_kph");
|
|
|
- lua_pushinteger(L, gnss ? gnss->frame_vtg.speed_kph.value : 0);
|
|
|
+ push_gnss_value(L, &(libgnss_gnss->frame_vtg.speed_kph), mode);
|
|
|
lua_settable(L, -3);
|
|
|
|
|
|
return 1;
|
|
|
@@ -480,100 +458,148 @@ log.info("nmea", "zda", json.encode(libgnss.getZda()))
|
|
|
*/
|
|
|
static int l_libgnss_get_zda(lua_State *L) {
|
|
|
lua_createtable(L, 0, 9);
|
|
|
-
|
|
|
- if (gnss != NULL) {
|
|
|
+ struct tm rtime = {0};
|
|
|
+ if (libgnss_gnss != NULL) {
|
|
|
|
|
|
lua_pushliteral(L, "hour_offset");
|
|
|
- lua_pushinteger(L, gnss->frame_zda.hour_offset);
|
|
|
+ lua_pushinteger(L, libgnss_gnss->frame_zda.hour_offset);
|
|
|
lua_settable(L, -3);
|
|
|
|
|
|
lua_pushliteral(L, "minute_offset");
|
|
|
- lua_pushinteger(L, gnss->frame_zda.minute_offset);
|
|
|
- lua_settable(L, -3);
|
|
|
-
|
|
|
- lua_pushliteral(L, "year");
|
|
|
- lua_pushinteger(L, gnss->frame_zda.date.year);
|
|
|
- lua_settable(L, -3);
|
|
|
-
|
|
|
- lua_pushliteral(L, "month");
|
|
|
- lua_pushinteger(L, gnss->frame_zda.date.month);
|
|
|
- lua_settable(L, -3);
|
|
|
-
|
|
|
- lua_pushliteral(L, "day");
|
|
|
- lua_pushinteger(L, gnss->frame_zda.date.day);
|
|
|
- lua_settable(L, -3);
|
|
|
-
|
|
|
- lua_pushliteral(L, "hour");
|
|
|
- lua_pushinteger(L, gnss->frame_zda.time.hours);
|
|
|
- lua_settable(L, -3);
|
|
|
-
|
|
|
- lua_pushliteral(L, "min");
|
|
|
- lua_pushinteger(L, gnss->frame_zda.time.minutes);
|
|
|
+ lua_pushinteger(L, libgnss_gnss->frame_zda.minute_offset);
|
|
|
lua_settable(L, -3);
|
|
|
|
|
|
- lua_pushliteral(L, "sec");
|
|
|
- lua_pushinteger(L, gnss->frame_zda.time.seconds);
|
|
|
- lua_settable(L, -3);
|
|
|
-
|
|
|
- lua_pushliteral(L, "mic");
|
|
|
- lua_pushinteger(L, gnss->frame_zda.time.microseconds);
|
|
|
- lua_settable(L, -3);
|
|
|
+ // 时间相关
|
|
|
+ minmea_getdatetime(&rtime, &libgnss_gnss->frame_zda.date, &libgnss_gnss->frame_zda.time);
|
|
|
+ put_datetime(L, &rtime);
|
|
|
}
|
|
|
|
|
|
return 1;
|
|
|
}
|
|
|
|
|
|
+/**
|
|
|
+设置调试模式
|
|
|
+@api libgnss.debug(mode)
|
|
|
+@bool true开启调试,false关闭调试,默认为false
|
|
|
+@usage
|
|
|
+-- 开启调试
|
|
|
+libgnss.debug(true)
|
|
|
+-- 关闭调试
|
|
|
+libgnss.debug(false)
|
|
|
+ */
|
|
|
static int l_libgnss_debug(lua_State *L) {
|
|
|
- if (gnss == NULL && luat_libgnss_init()) {
|
|
|
+ if (libgnss_gnss == NULL && luat_libgnss_init()) {
|
|
|
return 0;
|
|
|
}
|
|
|
if (lua_isboolean(L, 1) && lua_toboolean(L, 1)) {
|
|
|
- gnss->debug = 1;
|
|
|
+ LLOGD("Debug ON");
|
|
|
+ libgnss_gnss->debug = 1;
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
- gnss->debug = 0;
|
|
|
+ LLOGD("Debug OFF");
|
|
|
+ libgnss_gnss->debug = 0;
|
|
|
}
|
|
|
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
-
|
|
|
+/*
|
|
|
+获取GGA数据
|
|
|
+@api libgnss.getGga(data_mode)
|
|
|
+@int 坐标类数据的格式, 0-DDMM.MMM格式, 1-DDDDDDD格式, 2-DD.DDDDD格式
|
|
|
+@return table GGA数据, 若如不存在会返回nil
|
|
|
+local gga = libgnss.getGga()
|
|
|
+if gga then
|
|
|
+ log.info("GGA", json.encode(gga))
|
|
|
+end
|
|
|
+*/
|
|
|
static int l_libgnss_get_gga(lua_State* L) {
|
|
|
- if (gnss == NULL)
|
|
|
+ int mode = luaL_optinteger(L, 1, 0);
|
|
|
+ lua_settop(L, 0);
|
|
|
+ if (libgnss_gnss == NULL)
|
|
|
return 0;
|
|
|
lua_newtable(L);
|
|
|
|
|
|
lua_pushstring(L, "altitude");
|
|
|
- lua_pushinteger(L, gnss->frame_gga.altitude.value);
|
|
|
+ push_gnss_value(L, &(libgnss_gnss->frame_gga.altitude), mode);
|
|
|
lua_settable(L, -3);
|
|
|
|
|
|
lua_pushstring(L, "latitude");
|
|
|
- lua_pushinteger(L, gnss->frame_gga.latitude.value);
|
|
|
+ push_gnss_value(L, &(libgnss_gnss->frame_gga.latitude), mode);
|
|
|
lua_settable(L, -3);
|
|
|
|
|
|
lua_pushstring(L, "longitude");
|
|
|
- lua_pushinteger(L, gnss->frame_gga.longitude.value);
|
|
|
+ push_gnss_value(L, &(libgnss_gnss->frame_gga.longitude), mode);
|
|
|
lua_settable(L, -3);
|
|
|
|
|
|
lua_pushstring(L, "fix_quality");
|
|
|
- lua_pushinteger(L, gnss->frame_gga.fix_quality);
|
|
|
+ lua_pushinteger(L, libgnss_gnss->frame_gga.fix_quality);
|
|
|
lua_settable(L, -3);
|
|
|
|
|
|
lua_pushstring(L, "satellites_tracked");
|
|
|
- lua_pushinteger(L, gnss->frame_gga.satellites_tracked);
|
|
|
+ lua_pushinteger(L, libgnss_gnss->frame_gga.satellites_tracked);
|
|
|
lua_settable(L, -3);
|
|
|
|
|
|
lua_pushstring(L, "hdop");
|
|
|
- lua_pushinteger(L, gnss->frame_gga.hdop.value);
|
|
|
+ push_gnss_value(L, &(libgnss_gnss->frame_gga.hdop), mode);
|
|
|
lua_settable(L, -3);
|
|
|
|
|
|
lua_pushstring(L, "height");
|
|
|
- lua_pushinteger(L, gnss->frame_gga.height.value);
|
|
|
+ push_gnss_value(L, &(libgnss_gnss->frame_gga.height), mode);
|
|
|
lua_settable(L, -3);
|
|
|
|
|
|
lua_pushstring(L, "dgps_age");
|
|
|
- lua_pushinteger(L, gnss->frame_gga.dgps_age.value);
|
|
|
+ push_gnss_value(L, &(libgnss_gnss->frame_gga.dgps_age), mode);
|
|
|
+ lua_settable(L, -3);
|
|
|
+
|
|
|
+ return 1;
|
|
|
+}
|
|
|
+
|
|
|
+/*
|
|
|
+获取GLL数据
|
|
|
+@api libgnss.getGll(data_mode)
|
|
|
+@int 坐标类数据的格式, 0-DDMM.MMM格式, 1-DDDDDDD格式, 2-DD.DDDDD格式
|
|
|
+@return table GLL数据, 若如不存在会返回nil
|
|
|
+local gll = libgnss.getGll()
|
|
|
+if gll then
|
|
|
+ log.info("GLL", json.encode(gll))
|
|
|
+end
|
|
|
+*/
|
|
|
+static int l_libgnss_get_gll(lua_State* L) {
|
|
|
+ int mode = luaL_optinteger(L, 1, 0);
|
|
|
+ lua_settop(L, 0);
|
|
|
+ if (libgnss_gnss == NULL)
|
|
|
+ return 0;
|
|
|
+ lua_newtable(L);
|
|
|
+
|
|
|
+ lua_pushstring(L, "latitude");
|
|
|
+ push_gnss_value(L, &(libgnss_gnss->frame_gll.latitude), mode);
|
|
|
+ lua_settable(L, -3);
|
|
|
+
|
|
|
+ lua_pushstring(L, "longitude");
|
|
|
+ push_gnss_value(L, &(libgnss_gnss->frame_gll.longitude), mode);
|
|
|
+ lua_settable(L, -3);
|
|
|
+
|
|
|
+ lua_pushstring(L, "mode");
|
|
|
+ lua_pushfstring(L, "%c", libgnss_gnss->frame_gll.mode);
|
|
|
+ lua_settable(L, -3);
|
|
|
+
|
|
|
+ lua_pushstring(L, "status");
|
|
|
+ lua_pushfstring(L, "%c", libgnss_gnss->frame_gll.status);
|
|
|
+ lua_settable(L, -3);
|
|
|
+
|
|
|
+ lua_pushstring(L, "hour");
|
|
|
+ lua_pushinteger(L, libgnss_gnss->frame_gll.time.hours);
|
|
|
+ lua_settable(L, -3);
|
|
|
+ lua_pushstring(L, "us");
|
|
|
+ lua_pushinteger(L, libgnss_gnss->frame_gll.time.microseconds);
|
|
|
+ lua_settable(L, -3);
|
|
|
+ lua_pushstring(L, "min");
|
|
|
+ lua_pushinteger(L, libgnss_gnss->frame_gll.time.minutes);
|
|
|
+ lua_settable(L, -3);
|
|
|
+ lua_pushstring(L, "sec");
|
|
|
+ lua_pushinteger(L, libgnss_gnss->frame_gll.time.seconds);
|
|
|
lua_settable(L, -3);
|
|
|
|
|
|
return 1;
|
|
|
@@ -585,9 +611,73 @@ static int l_libgnss_get_gga(lua_State* L) {
|
|
|
@return nil 无返回值
|
|
|
*/
|
|
|
static int l_libgnss_clear(lua_State*L) {
|
|
|
- if (gnss == NULL && !luat_libgnss_init())
|
|
|
+ (void)L;
|
|
|
+ if (libgnss_gnss == NULL && !luat_libgnss_init())
|
|
|
+ return 0;
|
|
|
+ memset(libgnss_gnss, 0, sizeof(luat_libgnss_t));
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|
|
|
+/*
|
|
|
+绑定uart端口进行GNSS数据读取
|
|
|
+@api libgnss.bind(id)
|
|
|
+@int uart端口号
|
|
|
+@usage
|
|
|
+-- 配置串口信息, 通常为 115200 8N1
|
|
|
+uart.setup(2, 115200)
|
|
|
+-- 绑定uart, 马上开始解析GNSS数据
|
|
|
+libgnss.bind(2)
|
|
|
+-- 无需再调用uart.on然后调用libgnss.parse
|
|
|
+-- 开发期可打开调试日志
|
|
|
+libgnss.debug(true)
|
|
|
+*/
|
|
|
+static int l_libgnss_bind(lua_State* L) {
|
|
|
+ int uart_id = luaL_checkinteger(L, 1);
|
|
|
+ l_libgnss_clear(L);
|
|
|
+ if (libgnss_recvbuff == NULL) {
|
|
|
+ libgnss_recvbuff = luat_heap_malloc(RECV_BUFF_SIZE);
|
|
|
+ }
|
|
|
+ if (luat_uart_exist(uart_id)) {
|
|
|
+ //uart_app_recvs[uart_id] = nmea_uart_recv_cb;
|
|
|
+ luat_uart_set_app_recv(uart_id, luat_libgnss_uart_recv_cb);
|
|
|
+ }
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|
|
|
+static int l_libgnss_locStr(lua_State *L) {
|
|
|
+ int mode = luaL_optinteger(L, 1, 0);
|
|
|
+ char buff[64] = {0};
|
|
|
+ float lat_f = minmea_tofloat(&libgnss_gnss->frame_rmc.latitude);
|
|
|
+ float lng_f = minmea_tofloat(&libgnss_gnss->frame_rmc.longitude);
|
|
|
+ switch (mode)
|
|
|
+ {
|
|
|
+ case 0:
|
|
|
+ snprintf_(buff, 63, "%.7g,%c,%.7g,%c,%.7g",
|
|
|
+ fabs(lat_f), lat_f > 0 ? 'N' : 'S',
|
|
|
+ fabs(lng_f), lng_f > 0 ? 'E' : 'W',
|
|
|
+ libgnss_gnss->frame_gga.height.value == 0 ? 1.0 : minmea_tofloat(&libgnss_gnss->frame_gga.height));
|
|
|
+ break;
|
|
|
+ case 1:
|
|
|
+ snprintf_(buff, 63, "%d,%d", libgnss_gnss->frame_rmc.latitude.value, libgnss_gnss->frame_rmc.longitude.value);
|
|
|
+ break;
|
|
|
+ default:
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ lua_pushstring(L, buff);
|
|
|
+ return 1;
|
|
|
+}
|
|
|
+
|
|
|
+static int l_libgnss_rtc_auto(lua_State *L) {
|
|
|
+ if (libgnss_gnss == NULL)
|
|
|
return 0;
|
|
|
- memset(gnss, 0, sizeof(luat_libgnss_t));
|
|
|
+ if (lua_isboolean(L, 1) && lua_toboolean(L, 1)) {
|
|
|
+ libgnss_gnss->rtc_auto = 1;
|
|
|
+ LLOGD("GNSS->RTC Auto-Set now is ON");
|
|
|
+ }
|
|
|
+ else {
|
|
|
+ libgnss_gnss->rtc_auto = 0;
|
|
|
+ LLOGD("GNSS->RTC Auto-Set now is OFF");
|
|
|
+ }
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
@@ -602,9 +692,14 @@ static const rotable_Reg_t reg_libgnss[] =
|
|
|
{ "getGsa", ROREG_FUNC(l_libgnss_get_gsa)},
|
|
|
{ "getVtg", ROREG_FUNC(l_libgnss_get_vtg)},
|
|
|
{ "getGga", ROREG_FUNC(l_libgnss_get_gga)},
|
|
|
+ { "getGll", ROREG_FUNC(l_libgnss_get_gll)},
|
|
|
{ "getZda", ROREG_FUNC(l_libgnss_get_zda)},
|
|
|
+ { "locStr", ROREG_FUNC(l_libgnss_locStr)},
|
|
|
+ { "rtcAuto",ROREG_FUNC(l_libgnss_rtc_auto)},
|
|
|
+
|
|
|
{ "debug", ROREG_FUNC(l_libgnss_debug)},
|
|
|
{ "clear", ROREG_FUNC(l_libgnss_clear)},
|
|
|
+ { "bind", ROREG_FUNC(l_libgnss_bind)},
|
|
|
|
|
|
{ NULL, ROREG_INT(0)}
|
|
|
};
|