hurricane/gps/main.c

/*******************************************************************************
* # License
* Copyright 2019 Silicon Laboratories Inc. www.silabs.com
*******************************************************************************
*
* The licensor of this software is Silicon Laboratories Inc. Your use of this
* software is governed by the terms of Silicon Labs Master Software License
* Agreement (MSLA) available at
* www.silabs.com/about-us/legal/master-software-license-agreement. This
* software is distributed to you in Source Code format and is governed by the
* sections of the MSLA applicable to Source Code.
*
******************************************************************************/
#include "gos.h"
#include "ublox.h"
#include "hurricane.h"
#include "nvm_settings.h"
#define DEMO_NAME "GPS"
static gps_settings_t *gps_settings;
static hurricane_demo_t demo_info =
{
.demo_name = DEMO_NAME,
.start_demo_callback = start_demo_handler,
.stop_demo_callback = stop_demo_handler,
.draw_splash_screen_callback = HURRICANE_SPLASH_DEFAULT_FUNCTION,
.demo_splash_screen_arg = NULL,
.splash_font_color = HURRICANE_SPLASH_DEFAULT_FONT_COLOR,
};
GOS_CMD_CREATE_GETTER_SETTER(hurricane_gps, antenna, "hurricane.gps.antenna", SC3('h','u','g','a'), 0, 1);
/*************************************************************************************************/
void gos_app_init(void)
{
gos_result_t result;
// Obtain a reference to the GPS settings
if (GOS_FAILED(result, GOS_NVM_GET(HURRICANE, GPS, gps_settings)))
{
GOS_LOG("Failed to retrieve HURRICANE.GPS from NVM, err:%d", result);
return;
}
hurricane_init(&demo_info);
}
/*************************************************************************************************/
static void start_demo_handler(void *arg)
{
gos_result_t result;
uint16_t version;
ubx_config_t gps_config = UBX_DEFAULT_CONFIG;
GOS_LOG("Starting GPS demo");
hurricane_display_set_font_color(GUI_RED);
hurricane_display_set_background_color(GUI_BLACK);
if(GOS_FAILED(result, hurricane_discover_daughter_card(HURRICANE_CARD_CAMERA_GPS)))
{
GOS_LOG("Failed to discover the GPS daughter card");
hurricane_display_write_msg(&GUI_Font16B_1, "Failed to discover the GPS card");
return;
}
GOS_LOG("Using %s GPS antenna", (gps_settings->antenna == HURRICANE_GPS_ANT_INTERNAL) ? "internal" : "external");
hurricane_gps_set_antenna(gps_settings->antenna);
gps_config.lock_acquired_callback = gos_lock_acquired_callback;
GOS_LOG("Initializing the GPS module");
if(GOS_FAILED(result, ubx_init(&gps_config)))
{
GOS_LOG("Failed to init GPS, err:%d", result);
hurricane_display_write_msg(&GUI_Font16B_1, "Failed to initialize GPS");
return;
}
else if(GOS_FAILED(result, ubx_getProtocolVersion(&version)))
{
GOS_LOG("Failed to get version, err:%d", result);
hurricane_display_write_msg(&GUI_Font16B_1, "Failed to read GPS version");
return;
}
else
{
GOS_LOG("Version: 0x%04X", version);
}
GOS_LOG("GPS module ready...");
GOS_LOG("Enabling periodic polling with period: %d.%03ds", gps_settings->polling_period_ms / 1000, gps_settings->polling_period_ms % 1000);
GOS_LOG("NOTE: It could take awhile to get a GPS lock");
ubx_set_polling_enabled(gps_settings->polling_period_ms, (gos_handler_t)gps_polling_handler);
hurricane_display_write_msg(&GUI_Font16B_1, "Acquiring GPS lock ...");
}
/*************************************************************************************************/
static void stop_demo_handler(void *unused)
{
ubx_set_polling_enabled(0, NULL);
}
/*************************************************************************************************/
static void gps_polling_handler(const ubx_parameters_t *params)
{
char buffer[1024];
char float_str[24];
char *ptr = buffer;
ptr += sprintf(ptr, "------------------------------------\r\n");
ptr += sprintf(ptr, "GPS Time.... %02d:%02d:%02d-%03d\r\n", (int)params->gpsHour, (int)params->gpsMinute, (int)params->gpsSecond, (int)params->gpsMillisecond);
ptr += sprintf(ptr, "Latitude.... %s deg\r\n", float_to_str(ubx_latlong_to_float(params->latitude), float_str, 4));
ptr += sprintf(ptr, "Longitude... %s deg\r\n", float_to_str(ubx_latlong_to_float(params->longitude), float_str, 4));
ptr += sprintf(ptr, "Altitude.... %s m\r\n", float_to_str(ubx_altitude_to_float(params->altitudeMSL), float_str, 4));
ptr += sprintf(ptr, "Satellites.. %d\r\n", (int)params->SIV);
gos_write_log(buffer, (uint32_t)(ptr - buffer));
HURRICANE_WRITE_DISPLAY_START(0, 5, 20, 1, 13);
HURRICANE_WRITE_DISPLAY("GPS Time... %02d:%02d:%02d-%03d", (int)params->gpsHour,
(int)params->gpsMinute,
(int)params->gpsSecond,
(int)params->gpsMillisecond);
HURRICANE_WRITE_DISPLAY("Latitude.... %s deg", float_to_str(ubx_latlong_to_float(params->latitude), float_str, 4));
HURRICANE_WRITE_DISPLAY("Longitude.. %s deg", float_to_str(ubx_latlong_to_float(params->longitude), float_str, 4));
HURRICANE_WRITE_DISPLAY("Altitude..... %s m", float_to_str(ubx_altitude_to_float(params->altitudeMSL), float_str, 4));
HURRICANE_WRITE_DISPLAY("Satellites... %d", (int)params->SIV);
HURRICANE_WRITE_DISPLAY_END();
}
/*************************************************************************************************/
static void gos_lock_acquired_callback(bool lock_acquired)
{
if(lock_acquired)
{
GOS_LOG("GPS lock acquired, type: %d", ubx_params.fixType);
hurricane_gps_set_led_enabled(true);
}
else
{
GOS_LOG("GPS lock lost");
hurricane_gps_set_led_enabled(false);
hurricane_display_write_msg(&GUI_Font16B_1, "Acquiring GPS lock ...");
}
}
/*************************************************************************************************/
static gos_cmd_result_t hurricane_gps_set_antenna_command(int argc, char **argv)
{
if(strcmp(argv[1], "internal") == 0)
{
gps_settings->antenna = HURRICANE_GPS_ANT_INTERNAL;
hurricane_gps_set_antenna(HURRICANE_GPS_ANT_INTERNAL);
}
else if(strcmp(argv[1], "external") == 0)
{
gps_settings->antenna = HURRICANE_GPS_ANT_EXTERNAL;
hurricane_gps_set_antenna(HURRICANE_GPS_ANT_EXTERNAL);
}
else
{
}
}
/*************************************************************************************************/
static gos_cmd_result_t hurricane_gps_get_antenna_command(int argc, char **argv)
{
const char* antenna = (gps_settings->antenna == HURRICANE_GPS_ANT_INTERNAL) ? "internal" : "external";
}