nxp/nfc3d/local.c

See examples/nxp/nfc3d

/*
* ZentriOS SDK LICENSE AGREEMENT | Zentri.com, 2015.
*
* Use of source code and/or libraries contained in the ZentriOS SDK is
* subject to the Zentri Operating System SDK license agreement and
* applicable open source license agreements.
*
*/
#include "common.h"
#include "sensor.h"
#include "accelerometer.h"
#include "thermometer.h"
#include "lcd.h"
#define ACCELEROMETER_READ_PERIOD 50 // ms
#define THERMOMETER_READ_PERIOD 1000 // ms
#define ACCELEROMETER_STREAM_NAME "accelerometer"
#define THERMOMETER_STREAM_NAME "thermometer"
#define DISPLAY_STREAM_NAME "display"
#define MAX_DISPLAY_CHARS 15
static const accelerometer_config_t const accel_config =
{
.samp_freq = ACCEL_SAMP_FREQ_100HZ,
.axis_en = ACCEL_AXIS_EN_X | ACCEL_AXIS_EN_Y | ACCEL_AXIS_EN_Z,
};
/*************************************************************************************************/
zos_result_t local_init(void)
{
zos_result_t result;
ZOS_LOG("- Initializing SoftAP and HTTP Server");
if (ZOS_FAILED(result, initialise_sensors()))
{
ZOS_LOG("Failed to initialise sensors");
}
else if (ZOS_FAILED(result, initialise_display()))
{
ZOS_LOG("Failed to initialise display");
}
else
{
zn_hs_stream_register_callback(ACCELEROMETER_STREAM_NAME, accelerometer_stream_callback, NULL);
zn_hs_stream_register_callback(THERMOMETER_STREAM_NAME, thermometer_stream_callback, NULL);
zn_hs_stream_register_callback(DISPLAY_STREAM_NAME, display_stream_callback, NULL);
{
ZOS_LOG("Failed to start the SoftAP");
}
else if(!zn_hs_is_running())
{
ZOS_LOG("Failed to start the HTTP server");
}
else
{
ZOS_LOG("[Success]");
}
}
return result;
}
/*************************************************************************************************/
zos_result_t local_set_lcd_touchnfc_msg( void )
{
lcd_put_str_centered_x(" ", LINE2_Y);
lcd_put_str_centered_x(" ", LINE3_Y);
lcd_put_str_centered_x("Touch phone to", LINE2_Y);
lcd_put_str_centered_x("NFC tag.", LINE3_Y);
//ZOS_LOG("local_set_lcd_touchnfc_msg()");
return ZOS_SUCCESS;
}
/*************************************************************************************************/
zos_result_t local_set_lcd_sending_msg( void )
{
lcd_put_str_centered_x(" ", LINE2_Y);
lcd_put_str_centered_x(" ", LINE3_Y);
lcd_put_str_centered_x("Sending data", LINE2_Y);
lcd_put_str_centered_x("to cloud ...", LINE3_Y);
//ZOS_LOG("local_set_lcd_sending_msg()");
return ZOS_SUCCESS;
}
/*************************************************************************************************/
zos_result_t local_set_lcd_seephone_msg( void )
{
lcd_put_str_centered_x(" ", LINE2_Y);
lcd_put_str_centered_x(" ", LINE3_Y);
lcd_put_str_centered_x("See phone for", LINE2_Y);
lcd_put_str_centered_x("instructions.", LINE3_Y);
//ZOS_LOG("local_set_lcd_seephone_msg()");
return ZOS_SUCCESS;
}
/*************************************************************************************************/
zos_result_t local_set_lcd_internet_msg(bool is_connected)
{
char yes[] = "Internet: YES";
char no[] = "Internet: NO";
char* msg;
msg = is_connected ? yes : no;
local_set_lcd_line_text(msg, LINE4_Y);
//ZOS_LOG("local_set_lcd_internet_msg(%d)", is_connected);
return ZOS_SUCCESS;
}
/*************************************************************************************************/
zos_result_t local_set_lcd_msg(const char *msg)
{
local_set_lcd_line_text(msg, LINE1_Y);
return ZOS_SUCCESS;
}
/*************************************************************************************************/
zos_result_t local_set_lcd_line_text(const char *msg, const int line_y_offset)
{
// clear old text first
lcd_put_str_centered_x(" ", line_y_offset);
lcd_put_str_centered_x(msg, line_y_offset);
return ZOS_SUCCESS;
}
/*************************************************************************************************/
zos_result_t local_set_lcd_wifi_text( void )
{
lcd_put_str_centered_x(" ", LINE2_Y);
lcd_put_str_centered_x(" ", LINE3_Y);
lcd_put_str_centered_x("Local Wi-Fi:", LINE2_Y);
char ssid[MAX_DISPLAY_CHARS+1];
char passkey[MAX_DISPLAY_CHARS+1];
char credentials[MAX_DISPLAY_CHARS+1];
zn_settings_get_str("softap.ssid", ssid, MAX_DISPLAY_CHARS);
zn_settings_get_str("softap.passkey", passkey, MAX_DISPLAY_CHARS);
sprintf(credentials, "%s/%s", ssid, passkey);
lcd_put_str_centered_x(credentials, LINE3_Y);
return ZOS_SUCCESS;
}
/*************************************************************************************************/
static void softap_event_handler(const zos_softap_client_t *client)
{
cloud_post_update();
}
/*************************************************************************************************/
static zos_result_t initialise_display(void)
{
lcd_init(); /* Initialize LCD Device and Turn it ON */
/* Draw a rectangle border */
lcd_draw_rect(BORDER_X1, BORDER_Y1, BORDER_X2, BORDER_Y2, 1);
/* Set foreground as ON */
lcd_set_background_color(0); /* Background is OFF */
strncpy(nfc3d_context.lcd_msg, "NFC 3D Demo!", sizeof(nfc3d_context.lcd_msg)-1);
local_set_lcd_msg(nfc3d_context.lcd_msg);
lcd_draw_line(BORDER_X1, LINE1_Y+11, BORDER_X2, LINE1_Y+11, 1);
local_set_lcd_wifi_text();
lcd_draw_line(BORDER_X1, LINE3_Y+12, BORDER_X2, LINE3_Y+12, 1);
local_set_lcd_internet_msg(ZOS_FALSE);
return ZOS_SUCCESS;
}
/*************************************************************************************************/
static zos_result_t initialise_sensors(void)
{
zos_result_t result;
if (ZOS_FAILED(result, sensor_init(SENSOR_ACCELEROMETER, (void*)&accel_config)))
{
ZOS_LOG("ERROR - Failed to initialize accelerometer!");
retval = result;
}
{
ZOS_LOG("ERROR - Failed to initialize thermometer!");
retval = result;
}
return retval;
}
/*************************************************************************************************/
static zos_result_t accelerometer_stream_callback(zos_hs_handle_t handle, const char *stream, zos_hs_stream_method_t method, void *arg)
{
if(method == HS_STREAM_LISTEN)
{
ZOS_LOG("Stream listener registered, streaming data");
zn_event_register_periodic(accelerometer_read_event_handler, handle, ACCELEROMETER_READ_PERIOD, EVENT_FLAGS1(RUN_NOW));
}
else if(method == HS_STREAM_UNLISTEN)
{
ZOS_LOG("Stream listener unregistered");
zn_event_unregister(accelerometer_read_event_handler, handle);
}
else if(method == HS_STREAM_READ)
{
char *update_interval_str;
if(zn_hs_stream_read(handle, &update_interval_str, NULL) == ZOS_SUCCESS)
{
uint32_t update_interval = str_to_uint32(update_interval_str);
zn_event_update_periodic(accelerometer_read_event_handler, handle, update_interval, EVENT_FLAGS1(RUN_NOW));
ZOS_LOG("Accelerometer update interval: %d", update_interval);
}
}
return ZOS_SUCCESS;
}
/*************************************************************************************************/
static zos_result_t thermometer_stream_callback(zos_hs_handle_t handle, const char *stream, zos_hs_stream_method_t method, void *arg)
{
if(method == HS_STREAM_LISTEN)
{
ZOS_LOG("Thermometer stream listener registered, streaming data");
zn_event_register_periodic(thermometer_read_event_handler, handle, THERMOMETER_READ_PERIOD, EVENT_FLAGS1(RUN_NOW));
}
else if(method == HS_STREAM_UNLISTEN)
{
ZOS_LOG("Thermometer stream listener unregistered");
zn_event_unregister(thermometer_read_event_handler, handle);
}
else if(method == HS_STREAM_READ)
{
char *update_interval_str;
if(zn_hs_stream_read(handle, &update_interval_str, NULL) == ZOS_SUCCESS)
{
uint32_t update_interval = str_to_uint32(update_interval_str);
zn_event_update_periodic(thermometer_read_event_handler, handle, update_interval, EVENT_FLAGS1(RUN_NOW));
ZOS_LOG("Thermometer update interval: %d", update_interval);
}
}
return ZOS_SUCCESS;
}
/*************************************************************************************************/
static zos_result_t display_stream_callback(zos_hs_handle_t handle, const char *stream, zos_hs_stream_method_t method, void *arg)
{
if(method == HS_STREAM_READ)
{
char* data;
uint16_t data_len;
if(zn_hs_stream_read(handle, &data, &data_len) == ZOS_SUCCESS)
{
data[MIN(data_len, MAX_DISPLAY_CHARS-1)] = 0;
local_set_lcd_msg(data);
cloud_post_update();
}
}
return ZOS_SUCCESS;
}
/*************************************************************************************************/
static void accelerometer_read_event_handler(void *arg)
{
static accelerometer_data_t accel_data;
zos_result_t result;
if (ZOS_FAILED(result, get_sensor_data(SENSOR_ACCELEROMETER, &accel_data)))
{
if(result != ZOS_NO_DATA)
{
ZOS_LOG("Failed to get accelerometer data!");
return;
}
}
send_accel_data(handle, &accel_data);
}
/*************************************************************************************************/
static void thermometer_read_event_handler(void *arg)
{
static thermometer_data_t thermometer_data;
zos_result_t result;
if (ZOS_FAILED(result, get_sensor_data(SENSOR_THERMOMETER, &thermometer_data)))
{
if(result != ZOS_NO_DATA)
{
ZOS_LOG("Failed to get thermometer data!");
return;
}
}
send_thermometer_data(handle, &thermometer_data);
}
/*************************************************************************************************/
static zos_result_t send_accel_data(const zos_hs_handle_t handle, accelerometer_data_t *data)
{
char buffer[64];
char *ptr = buffer;
ptr += sprintf(ptr, "{\"x\":%d,", (int)data->x);
ptr += sprintf(ptr, "\"y\":%d,", (int)data->y);
ptr += sprintf(ptr, "\"z\":%d}", (int)data->z);
return send_data(handle, ACCELEROMETER_STREAM_NAME, buffer);
}
/*************************************************************************************************/
static zos_result_t send_thermometer_data(const zos_hs_handle_t handle, thermometer_data_t *data)
{
char buffer[20];
sprintf(buffer, "{\"temp_c\":%d}", (int)data->raw);
return send_data(handle, THERMOMETER_STREAM_NAME, buffer);
}
/*************************************************************************************************/
static zos_result_t send_data(const zos_hs_handle_t handle, const char *stream, const char *data)
{
zos_buffer_t json_buffer =
{
.data = (uint8_t*)data,
.size = strlen(data)
};
// json encode the string in-place
json_encode_buffer(&json_buffer);
return zn_hs_stream_write_listener(handle, stream, data, ZOS_TRUE);
}
/*************************************************************************************************/
static zos_result_t get_sensor_data(sensor_id_t sensor, void* data)
{
zos_bool_t has_data = ZOS_FALSE;
if (sensor_has_new_data(sensor, &has_data) == ZOS_SUCCESS)
{
if (has_data == ZOS_TRUE)
{
if (sensor_get_data(sensor, data) != ZOS_SUCCESS)
{
ZOS_LOG("Failed to get data!");
}
else
{
result = ZOS_SUCCESS;
}
}
else
{
result = ZOS_NO_DATA;
}
}
else
{
ZOS_LOG("Failed to check for new data!");
}
return result;
}