hurricane/security_camera/sensor.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 <math.h>
#include "common.h"
#include "ublox.h"
static float gps_latitude = NAN;
static float gps_longitude = NAN;
/*************************************************************************************************/
gos_result_t sensor_init(void)
{
gos_result_t result;
uint16_t version;
ubx_config_t gps_config = UBX_DEFAULT_CONFIG;
// NOTE: Other sensors initialized during Hurricane component startup
GOS_LOG("Initializing the GPS module");
GOS_LOG("Using %s GPS antenna", (camera_settings->gps_antenna == HURRICANE_GPS_ANT_INTERNAL) ? "internal" : "external");
hurricane_gps_set_antenna(camera_settings->gps_antenna);
gps_config.lock_acquired_callback = gos_lock_acquired_callback;
if(GOS_FAILED(result, ubx_init(&gps_config)))
{
GOS_LOG("Failed to init GPS, err:%d", result);
}
else if(GOS_FAILED(result, ubx_getProtocolVersion(&version)))
{
GOS_LOG("Failed to get GPS version, err:%d", result);
}
else
{
GOS_LOG("GPS version: 0x%04X", version);
ubx_set_polling_enabled(10000, (gos_handler_t)gps_polling_handler);
}
return result;
}
/*************************************************************************************************/
gos_result_t sensor_set_enabled(bool enabled)
{
if(enabled)
{
gos_event_register_periodic(hurricane_sensors_perform_measurement, NULL, 30000, GOS_EVENT_FLAG_NONE);
}
else
{
gos_event_unregister(hurricane_sensors_perform_measurement, NULL);
}
return GOS_SUCCESS;
}
/*************************************************************************************************/
gos_result_t sensor_trigger(void)
{
ubx_trigger_polling();
gos_event_trigger(hurricane_sensors_perform_measurement, NULL);
return GOS_SUCCESS;
}
/*************************************************************************************************
* Populate msgpack with:
*
* {
* latitude: <gps-latitude deg>,
* longitude: <gps-longitude deg>,
* temperature: <temperature celcius>,
* humidity: <relative humidity>,
* uvi: <UV index>,
* pressure: <pressure in Hg>,
* als: <ambient light>
* }
*/
gos_result_t sensor_read_all(gos_msgpack_context_t *msgpack)
{
gos_msgpack_write_dict_float(msgpack, "latitude", gps_latitude);
gos_msgpack_write_dict_float(msgpack, "longitude", gps_longitude);
gos_msgpack_write_dict_float(msgpack, "temperature", hurricane_sensor_get_temp());
gos_msgpack_write_dict_float(msgpack, "humidity", hurricane_sensor_get_RH());
gos_msgpack_write_dict_float(msgpack, "uvi", hurricane_sensor_get_UV());
gos_msgpack_write_dict_float(msgpack, "pressure", hurricane_sensor_get_pressure());
gos_msgpack_write_dict_float(msgpack, "als", hurricane_sensor_get_ALS());
return GOS_SUCCESS;
}
/*************************************************************************************************/
static void gps_polling_handler(const ubx_parameters_t *params)
{
gps_latitude = ubx_latlong_to_float(params->latitude);
gps_longitude = ubx_latlong_to_float(params->longitude);
}
/*************************************************************************************************/
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);
}
}