nxp/nfc3d/local.c
/*
* 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
{
.samp_freq = ACCEL_SAMP_FREQ_100HZ,
.axis_en = ACCEL_AXIS_EN_X | ACCEL_AXIS_EN_Y | ACCEL_AXIS_EN_Z,
.mode = ACCEL_MODE_NORMAL
};
/*************************************************************************************************/
zos_result_t local_init(void)
{
zos_result_t result;
{
ZOS_LOG("Failed to initialise sensors");
}
{
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");
}
{
ZOS_LOG("Failed to start the HTTP server");
result = ZOS_UNINITIALIZED;
}
else
{
zn_network_register_softap_event_handler(softap_event_handler);
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()");
}
/*************************************************************************************************/
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;
}
/*************************************************************************************************/
{
local_set_lcd_line_text(msg, LINE1_Y);
return ZOS_SUCCESS;
}
/*************************************************************************************************/
{
// 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.passkey", passkey, MAX_DISPLAY_CHARS);
sprintf(credentials, "%s/%s", ssid, passkey);
lcd_put_str_centered_x(credentials, LINE3_Y);
return ZOS_SUCCESS;
}
/*************************************************************************************************/
{
UNUSED_PARAMETER(client);
cloud_post_update();
}
/*************************************************************************************************/
{
/* Draw a rectangle border */
lcd_draw_rect(BORDER_X1, BORDER_Y1, BORDER_X2, BORDER_Y2, 1);
/* Set foreground as ON */
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;
}
/*************************************************************************************************/
{
zos_result_t retval = ZOS_SUCCESS;
zos_result_t result;
{
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)
{
{
ZOS_LOG("Stream listener registered, streaming data");
zn_event_register_periodic(accelerometer_read_event_handler, handle, ACCELEROMETER_READ_PERIOD, EVENT_FLAGS1(RUN_NOW));
}
{
ZOS_LOG("Stream listener unregistered");
zn_event_unregister(accelerometer_read_event_handler, handle);
}
{
char *update_interval_str;
{
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));
}
{
ZOS_LOG("Thermometer stream listener unregistered");
zn_event_unregister(thermometer_read_event_handler, handle);
}
{
char *update_interval_str;
{
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;
{
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)
{
zos_result_t result;
{
{
ZOS_LOG("Failed to get accelerometer data!");
return;
}
}
send_accel_data(handle, &accel_data);
}
/*************************************************************************************************/
static void thermometer_read_event_handler(void *arg)
{
zos_result_t result;
zos_hs_handle_t handle = (zos_hs_handle_t)arg;
{
if(result != ZOS_NO_DATA)
{
ZOS_LOG("Failed to get thermometer data!");
return;
}
}
send_thermometer_data(handle, &thermometer_data);
}
/*************************************************************************************************/
{
char buffer[64];
char *ptr = buffer;
return send_data(handle, ACCELEROMETER_STREAM_NAME, buffer);
}
/*************************************************************************************************/
{
char buffer[20];
return send_data(handle, THERMOMETER_STREAM_NAME, buffer);
}
/*************************************************************************************************/
{
zos_buffer_t json_buffer =
{
.data = (uint8_t*)data,
.size = strlen(data)
};
// json encode the string in-place
json_encode_buffer(&json_buffer);
}
/*************************************************************************************************/
{
zos_bool_t has_data = ZOS_FALSE;
{
if (has_data == ZOS_TRUE)
{
{
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;
}