src.dualinventive.com/dinet/libdi/tests/drv_hl854x_gps_pvt.cpp

190 lines
5.9 KiB
C++

/** @todo check if gps structure is not modified with multiple decodes */
#include <stdio.h>
#include <stdint.h>
#include <string.h>
#include <gtest/gtest.h>
#include <di/drv/hl854x.h>
extern "C" {
#include "drv/hl854x/gps_pvt.c"
static struct di_drv_hl854x_ctx ctx;
}
TEST(time, init) {
di_time_init();
}
/**
* - Translates latitude N 051 35'07.80" -> 051.5855
* - Translates longitude E 005 11'42.40 -> 005.1951
* - Translates latitude S 023 01'20.90" -> -23.022461
* - Translates longitude W 043 10'58.90 -> -43.183024
*/
TEST(drv_hl854x_gps_pvt, extract_coord) {
const char *coord1 = "N 051 35'07.80\"";
const char *coord2 = "E 005 11'42.40";
const char *coord3 = "S 023 01'20.90\"";
const char *coord4 = "W 043 10'58.90";
const char *coord1_corrupt = "Q 043 10'58.90";
const char *coord2_corrupt = "W_043 10'58.90";
const char *coord3_corrupt = "W 043-10'58.90";
const char *coord4_corrupt = "W 043 10=58.90";
const char *coord5_corrupt = "W 043 10'58-90";
const char *coord6_tooshort = "W 043 10'58.0";
EXPECT_NEAR((double)51.5855, di_drv_hl854x_gps_pvt_extract_coord(coord1), 0.0001);
EXPECT_NEAR((double)5.1951, di_drv_hl854x_gps_pvt_extract_coord(coord2), 0.0001);
EXPECT_NEAR((double)-23.022461, di_drv_hl854x_gps_pvt_extract_coord(coord3), 0.0001);
EXPECT_NEAR((double)-43.183024, di_drv_hl854x_gps_pvt_extract_coord(coord4), 0.0001);
EXPECT_DOUBLE_EQ(0.0, di_drv_hl854x_gps_pvt_extract_coord(coord1_corrupt));
EXPECT_DOUBLE_EQ(0.0, di_drv_hl854x_gps_pvt_extract_coord(coord2_corrupt));
EXPECT_DOUBLE_EQ(0.0, di_drv_hl854x_gps_pvt_extract_coord(coord3_corrupt));
EXPECT_DOUBLE_EQ(0.0, di_drv_hl854x_gps_pvt_extract_coord(coord4_corrupt));
EXPECT_DOUBLE_EQ(0.0, di_drv_hl854x_gps_pvt_extract_coord(coord5_corrupt));
EXPECT_DOUBLE_EQ(0.0, di_drv_hl854x_gps_pvt_extract_coord(coord6_tooshort));
}
TEST(drv_hl854x_gps_pvt, hdr_id_0_time) {
const char *time1 = "01:02:03";
const char *time2 = "23:59:59";
const char *time_to_small = "23:59:";
const char *time_inval = "01:02 03";
di_drv_hl854x_gps_pvt_hdr_id_0_time(&ctx, time1);
EXPECT_EQ(ctx.gps.time.tm_hour, 1);
EXPECT_EQ(ctx.gps.time.tm_min, 2);
EXPECT_EQ(ctx.gps.time.tm_sec, 3);
di_drv_hl854x_gps_pvt_hdr_id_0_time(&ctx, time2);
EXPECT_EQ(ctx.gps.time.tm_hour, 23);
EXPECT_EQ(ctx.gps.time.tm_min, 59);
EXPECT_EQ(ctx.gps.time.tm_sec, 59);
memset(&ctx.gps.time, 0, sizeof(ctx.gps.time));
di_drv_hl854x_gps_pvt_hdr_id_0_time(&ctx, time_to_small);
EXPECT_EQ(ctx.gps.time.tm_hour, 0);
EXPECT_EQ(ctx.gps.time.tm_min, 0);
EXPECT_EQ(ctx.gps.time.tm_sec, 0);
memset(&ctx.gps.time, 0, sizeof(ctx.gps.time));
di_drv_hl854x_gps_pvt_hdr_id_0_time(&ctx, time_inval);
EXPECT_EQ(ctx.gps.time.tm_hour, 0);
EXPECT_EQ(ctx.gps.time.tm_min, 0);
EXPECT_EQ(ctx.gps.time.tm_sec, 0);
}
TEST(drv_hl854x_gps_pvt, hdr_id_0_date) {
const char *date1 = "01/01/1970";
const char *date_to_short = "01/01/19";
const char *date_inval = "01-01-19";
memset(&ctx.gps.time, 0, sizeof(ctx.gps.time));
di_drv_hl854x_gps_pvt_hdr_id_0_date(&ctx, date1);
EXPECT_EQ(ctx.gps.time.tm_year, 1970);
EXPECT_EQ(ctx.gps.time.tm_mon, 1);
EXPECT_EQ(ctx.gps.time.tm_mday, 1);
memset(&ctx.gps.time, 0, sizeof(ctx.gps.time));
di_drv_hl854x_gps_pvt_hdr_id_0_date(&ctx, date_to_short);
EXPECT_EQ(ctx.gps.time.tm_year, 0);
EXPECT_EQ(ctx.gps.time.tm_mon, 0);
EXPECT_EQ(ctx.gps.time.tm_mday, 0);
memset(&ctx.gps.time, 0, sizeof(ctx.gps.time));
di_drv_hl854x_gps_pvt_hdr_id_0_date(&ctx, date_inval);
EXPECT_EQ(ctx.gps.time.tm_year, 0);
EXPECT_EQ(ctx.gps.time.tm_mon, 0);
EXPECT_EQ(ctx.gps.time.tm_mday, 0);
}
TEST(drv_hl854x_gps_pvt, fix_state) {
struct {
const char *str;
enum di_rpc_sensor_data_gps_fix_state s;
} t[] = {
{ "", DI_RPC_GPS_FIX_STATE_UNKNOWN },
{ "3A FIX", DI_RPC_GPS_FIX_STATE_UNKNOWN },
{ "NO FIX", DI_RPC_GPS_FIX_STATE_NO_FIX },
{ "ES FIX", DI_RPC_GPS_FIX_STATE_ES_FIX },
{ "2D FIX", DI_RPC_GPS_FIX_STATE_2D_FIX },
{ "3D FIX", DI_RPC_GPS_FIX_STATE_3D_FIX }
};
for (unsigned int i = 0; i < sizeof(t)/sizeof(t[0]); i++) {
di_drv_hl854x_gps_pvt_hdr_id_0_gps_fix_state(&ctx, t[i].str);
EXPECT_EQ(ctx.gps.fix_state, t[i].s);
}
}
TEST(drv_hl854x_gps_pvt, cb_hdr_id_0) {
char pvt_frame_id_0[] = "0,06:59:28,15/09/2015,3D FIX,N 051 35'07.80\",E 005 11'42.40,+0012m";
char pvt_frame_id_0_no_fix[] = "0,06:59:28,15/09/2015,NO FIX,N 051 35'07.80\",E 005 11'42.40,+0012m";
di_drv_hl854x_init(&ctx);
/* 3D fix */
ctx.me.match.str = pvt_frame_id_0;
di_drv_hl854x_cb_gps_pvt(&ctx.me);
EXPECT_EQ(ctx.gps.time.tm_hour, 6U);
EXPECT_EQ(ctx.gps.time.tm_min, 59U);
EXPECT_EQ(ctx.gps.time.tm_sec, 28U);
EXPECT_EQ(ctx.gps.time.tm_mday, 15U);
EXPECT_EQ(ctx.gps.time.tm_mon, 9U);
EXPECT_EQ(ctx.gps.time.tm_year, 2015U);
EXPECT_NEAR((double)51.5855, ctx.gps.data.latitude, 0.0001);
EXPECT_NEAR((double)5.1951, ctx.gps.data.longitude, 0.0001);
EXPECT_EQ(ctx.gps.fix_state, DI_RPC_GPS_FIX_STATE_3D_FIX);
/* No fix */
ctx.me.match.str = pvt_frame_id_0_no_fix;
di_drv_hl854x_cb_gps_pvt(&ctx.me);
EXPECT_EQ(ctx.gps.time.tm_hour, 6U);
EXPECT_EQ(ctx.gps.time.tm_min, 59U);
EXPECT_EQ(ctx.gps.time.tm_sec, 28U);
EXPECT_EQ(ctx.gps.time.tm_mday, 15U);
EXPECT_EQ(ctx.gps.time.tm_mon, 9U);
EXPECT_EQ(ctx.gps.time.tm_year, 2015U);
/* Old coordinates are kept */
EXPECT_NEAR((double)51.5855, ctx.gps.data.latitude, 0.0001);
EXPECT_NEAR((double)5.1951, ctx.gps.data.longitude, 0.0001);
EXPECT_EQ(ctx.gps.fix_state, DI_RPC_GPS_FIX_STATE_NO_FIX);
}
TEST(drv_hl854x_gps_pvt, cb_hdr_id_1) {
char pvt_frame_id_1[] = "1,087.5deg,021m/s";
di_drv_hl854x_init(&ctx);
ctx.me.cfg.private_data = &ctx;
ctx.me.match.str = pvt_frame_id_1;
/* pvt frame id 1 is not used */
di_drv_hl854x_cb_gps_pvt(&ctx.me);
}
TEST(drv_hl854x_gps_pvt, cb_hdr_id_2) {
char pvt_frame_id_2[] = "2,08SV,1.0HDOP,29,18.2";
di_drv_hl854x_init(&ctx);
ctx.me.cfg.private_data = &ctx;
ctx.me.match.str = pvt_frame_id_2;
di_drv_hl854x_cb_gps_pvt(&ctx.me);
EXPECT_DOUBLE_EQ(ctx.gps.data.hdop, 1.0);
}