2015-02-25 12:15:35 +00:00
|
|
|
/*
|
|
|
|
* Copyright (c) 2014, Texas Instruments Incorporated - http://www.ti.com/
|
|
|
|
* All rights reserved.
|
|
|
|
*
|
|
|
|
* Redistribution and use in source and binary forms, with or without
|
|
|
|
* modification, are permitted provided that the following conditions
|
|
|
|
* are met:
|
|
|
|
* 1. Redistributions of source code must retain the above copyright
|
|
|
|
* notice, this list of conditions and the following disclaimer.
|
|
|
|
* 2. Redistributions in binary form must reproduce the above copyright
|
|
|
|
* notice, this list of conditions and the following disclaimer in the
|
|
|
|
* documentation and/or other materials provided with the distribution.
|
|
|
|
* 3. Neither the name of the copyright holder nor the names of its
|
|
|
|
* contributors may be used to endorse or promote products derived
|
|
|
|
* from this software without specific prior written permission.
|
|
|
|
*
|
|
|
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|
|
|
* ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|
|
|
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
|
|
|
|
* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
|
|
|
|
* COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
|
|
|
|
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
|
|
|
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
|
|
|
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
|
|
|
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
|
|
|
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
|
|
|
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
|
|
|
|
* OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
|
|
*/
|
|
|
|
/**
|
|
|
|
* \addtogroup cc26xx-examples
|
|
|
|
* @{
|
|
|
|
*
|
|
|
|
* \defgroup cc26xx-web-demo CC26xx Web Demo
|
|
|
|
* @{
|
|
|
|
*
|
|
|
|
* An example demonstrating:
|
|
|
|
* * how to use a CC26XX-powered node in a deployment driven by a 6LBR
|
|
|
|
* * how to expose on-device sensors as CoAP resources
|
|
|
|
* * how to build a small web page which reports networking and sensory data
|
|
|
|
* * how to configure functionality through the aforementioned web page using
|
|
|
|
* HTTP POST requests
|
|
|
|
* * a network-based UART
|
|
|
|
*
|
|
|
|
* \file
|
|
|
|
* Main header file for the CC26XX web demo.
|
|
|
|
*/
|
|
|
|
/*---------------------------------------------------------------------------*/
|
|
|
|
#ifndef CC26XX_WEB_DEMO_H_
|
|
|
|
#define CC26XX_WEB_DEMO_H_
|
|
|
|
/*---------------------------------------------------------------------------*/
|
|
|
|
#include "dev/leds.h"
|
|
|
|
#include "sys/process.h"
|
|
|
|
#include "mqtt-client.h"
|
|
|
|
#include "net-uart.h"
|
|
|
|
|
|
|
|
#include <stdint.h>
|
|
|
|
/*---------------------------------------------------------------------------*/
|
|
|
|
#ifdef CC26XX_WEB_DEMO_CONF_MQTT_CLIENT
|
|
|
|
#define CC26XX_WEB_DEMO_MQTT_CLIENT CC26XX_WEB_DEMO_CONF_MQTT_CLIENT
|
|
|
|
#else
|
|
|
|
#define CC26XX_WEB_DEMO_MQTT_CLIENT 1
|
|
|
|
#endif
|
|
|
|
|
|
|
|
#ifdef CC26XX_WEB_DEMO_CONF_6LBR_CLIENT
|
|
|
|
#define CC26XX_WEB_DEMO_6LBR_CLIENT CC26XX_WEB_DEMO_CONF_6LBR_CLIENT
|
|
|
|
#else
|
|
|
|
#define CC26XX_WEB_DEMO_6LBR_CLIENT 1
|
|
|
|
#endif
|
|
|
|
|
|
|
|
#ifdef CC26XX_WEB_DEMO_CONF_COAP_SERVER
|
|
|
|
#define CC26XX_WEB_DEMO_COAP_SERVER CC26XX_WEB_DEMO_CONF_COAP_SERVER
|
|
|
|
#else
|
|
|
|
#define CC26XX_WEB_DEMO_COAP_SERVER 1
|
|
|
|
#endif
|
|
|
|
|
|
|
|
#ifdef CC26XX_WEB_DEMO_CONF_NET_UART
|
|
|
|
#define CC26XX_WEB_DEMO_NET_UART CC26XX_WEB_DEMO_CONF_NET_UART
|
|
|
|
#else
|
|
|
|
#define CC26XX_WEB_DEMO_NET_UART 1
|
|
|
|
#endif
|
2017-02-13 08:37:34 +00:00
|
|
|
|
|
|
|
#ifdef CC26XX_WEB_DEMO_CONF_ADC_DEMO
|
|
|
|
#define CC26XX_WEB_DEMO_ADC_DEMO CC26XX_WEB_DEMO_CONF_ADC_DEMO
|
|
|
|
#else
|
|
|
|
#define CC26XX_WEB_DEMO_ADC_DEMO 0
|
|
|
|
#endif
|
2015-02-25 12:15:35 +00:00
|
|
|
/*---------------------------------------------------------------------------*/
|
2015-08-16 16:16:16 +00:00
|
|
|
/* Active probing of RSSI from our preferred parent */
|
|
|
|
#if (CC26XX_WEB_DEMO_COAP_SERVER || CC26XX_WEB_DEMO_MQTT_CLIENT)
|
|
|
|
#define CC26XX_WEB_DEMO_READ_PARENT_RSSI 1
|
|
|
|
#else
|
|
|
|
#define CC26XX_WEB_DEMO_READ_PARENT_RSSI 0
|
|
|
|
#endif
|
|
|
|
|
|
|
|
#define CC26XX_WEB_DEMO_RSSI_MEASURE_INTERVAL_MAX 86400 /* secs: 1 day */
|
|
|
|
#define CC26XX_WEB_DEMO_RSSI_MEASURE_INTERVAL_MIN 5 /* secs */
|
|
|
|
/*---------------------------------------------------------------------------*/
|
2015-02-25 12:15:35 +00:00
|
|
|
/* User configuration */
|
|
|
|
/* Take a sensor reading on button press */
|
2017-11-05 20:14:34 +00:00
|
|
|
#define CC26XX_WEB_DEMO_SENSOR_READING_TRIGGER BOARD_BUTTON_HAL_INDEX_KEY_LEFT
|
2015-02-25 12:15:35 +00:00
|
|
|
|
|
|
|
/* Payload length of ICMPv6 echo requests used to measure RSSI with def rt */
|
|
|
|
#define CC26XX_WEB_DEMO_ECHO_REQ_PAYLOAD_LEN 20
|
|
|
|
|
|
|
|
#if BOARD_SENSORTAG
|
|
|
|
/* Force an MQTT publish on sensor event */
|
2017-11-05 20:14:34 +00:00
|
|
|
#define CC26XX_WEB_DEMO_MQTT_PUBLISH_TRIGGER BOARD_BUTTON_HAL_INDEX_REED_RELAY
|
2016-01-24 16:54:45 +00:00
|
|
|
#elif BOARD_LAUNCHPAD
|
2017-11-05 20:14:34 +00:00
|
|
|
#define CC26XX_WEB_DEMO_MQTT_PUBLISH_TRIGGER BOARD_BUTTON_HAL_INDEX_KEY_LEFT
|
2015-02-25 12:15:35 +00:00
|
|
|
#else
|
2017-11-05 20:14:34 +00:00
|
|
|
#define CC26XX_WEB_DEMO_MQTT_PUBLISH_TRIGGER BOARD_BUTTON_HAL_INDEX_KEY_DOWN
|
2015-02-25 12:15:35 +00:00
|
|
|
#endif
|
|
|
|
|
|
|
|
#define CC26XX_WEB_DEMO_STATUS_LED LEDS_GREEN
|
|
|
|
/*---------------------------------------------------------------------------*/
|
|
|
|
/* A timeout used when waiting to connect to a network */
|
|
|
|
#define CC26XX_WEB_DEMO_NET_CONNECT_PERIODIC (CLOCK_SECOND >> 3)
|
|
|
|
/*---------------------------------------------------------------------------*/
|
|
|
|
/* Default configuration values */
|
|
|
|
#define CC26XX_WEB_DEMO_DEFAULT_ORG_ID "quickstart"
|
2015-08-16 15:33:44 +00:00
|
|
|
#if CPU_FAMILY_CC13XX
|
|
|
|
#define CC26XX_WEB_DEMO_DEFAULT_TYPE_ID "cc13xx"
|
|
|
|
#else
|
2015-02-25 12:15:35 +00:00
|
|
|
#define CC26XX_WEB_DEMO_DEFAULT_TYPE_ID "cc26xx"
|
2015-08-16 15:33:44 +00:00
|
|
|
#endif
|
2015-02-25 12:15:35 +00:00
|
|
|
#define CC26XX_WEB_DEMO_DEFAULT_EVENT_TYPE_ID "status"
|
|
|
|
#define CC26XX_WEB_DEMO_DEFAULT_SUBSCRIBE_CMD_TYPE "+"
|
|
|
|
#define CC26XX_WEB_DEMO_DEFAULT_BROKER_PORT 1883
|
|
|
|
#define CC26XX_WEB_DEMO_DEFAULT_PUBLISH_INTERVAL (30 * CLOCK_SECOND)
|
|
|
|
#define CC26XX_WEB_DEMO_DEFAULT_KEEP_ALIVE_TIMER 60
|
|
|
|
#define CC26XX_WEB_DEMO_DEFAULT_RSSI_MEAS_INTERVAL (CLOCK_SECOND * 30)
|
|
|
|
/*---------------------------------------------------------------------------*/
|
|
|
|
/*
|
|
|
|
* You normally won't have to change anything from here onwards unless you are
|
|
|
|
* extending the example
|
|
|
|
*/
|
|
|
|
/*---------------------------------------------------------------------------*/
|
|
|
|
/* Sensor types */
|
|
|
|
#define CC26XX_WEB_DEMO_SENSOR_BATMON_TEMP 0
|
|
|
|
#define CC26XX_WEB_DEMO_SENSOR_BATMON_VOLT 1
|
|
|
|
#define CC26XX_WEB_DEMO_SENSOR_BMP_PRES 2
|
|
|
|
#define CC26XX_WEB_DEMO_SENSOR_BMP_TEMP 3
|
|
|
|
#define CC26XX_WEB_DEMO_SENSOR_TMP_AMBIENT 4
|
|
|
|
#define CC26XX_WEB_DEMO_SENSOR_TMP_OBJECT 5
|
2015-03-07 19:21:52 +00:00
|
|
|
#define CC26XX_WEB_DEMO_SENSOR_HDC_TEMP 6
|
|
|
|
#define CC26XX_WEB_DEMO_SENSOR_HDC_HUMIDITY 7
|
2015-02-25 12:15:35 +00:00
|
|
|
#define CC26XX_WEB_DEMO_SENSOR_OPT_LIGHT 8
|
|
|
|
#define CC26XX_WEB_DEMO_SENSOR_MPU_ACC_X 9
|
|
|
|
#define CC26XX_WEB_DEMO_SENSOR_MPU_ACC_Y 10
|
|
|
|
#define CC26XX_WEB_DEMO_SENSOR_MPU_ACC_Z 11
|
|
|
|
#define CC26XX_WEB_DEMO_SENSOR_MPU_GYRO_X 12
|
|
|
|
#define CC26XX_WEB_DEMO_SENSOR_MPU_GYRO_Y 13
|
|
|
|
#define CC26XX_WEB_DEMO_SENSOR_MPU_GYRO_Z 14
|
2017-02-13 08:37:34 +00:00
|
|
|
#define CC26XX_WEB_DEMO_SENSOR_ADC_DIO23 15
|
2015-02-25 12:15:35 +00:00
|
|
|
/*---------------------------------------------------------------------------*/
|
|
|
|
extern process_event_t cc26xx_web_demo_publish_event;
|
|
|
|
extern process_event_t cc26xx_web_demo_config_loaded_event;
|
|
|
|
extern process_event_t cc26xx_web_demo_load_config_defaults;
|
|
|
|
/*---------------------------------------------------------------------------*/
|
|
|
|
#define CC26XX_WEB_DEMO_UNIT_TEMP "C"
|
|
|
|
#define CC26XX_WEB_DEMO_UNIT_VOLT "mV"
|
|
|
|
#define CC26XX_WEB_DEMO_UNIT_PRES "hPa"
|
|
|
|
#define CC26XX_WEB_DEMO_UNIT_HUMIDITY "%RH"
|
|
|
|
#define CC26XX_WEB_DEMO_UNIT_LIGHT "lux"
|
|
|
|
#define CC26XX_WEB_DEMO_UNIT_ACC "G"
|
|
|
|
#define CC26XX_WEB_DEMO_UNIT_GYRO "deg per sec"
|
|
|
|
/*---------------------------------------------------------------------------*/
|
|
|
|
/* A data type for sensor readings, internally stored in a linked list */
|
|
|
|
#define CC26XX_WEB_DEMO_CONVERTED_LEN 12
|
|
|
|
|
|
|
|
typedef struct cc26xx_web_demo_sensor_reading {
|
|
|
|
struct cc26xx_web_demo_sensor_reading *next;
|
|
|
|
int raw;
|
|
|
|
int last;
|
|
|
|
const char *descr;
|
|
|
|
const char *xml_element;
|
|
|
|
const char *form_field;
|
|
|
|
char *units;
|
|
|
|
uint8_t type;
|
|
|
|
uint8_t publish;
|
|
|
|
uint8_t changed;
|
|
|
|
char converted[CC26XX_WEB_DEMO_CONVERTED_LEN];
|
|
|
|
} cc26xx_web_demo_sensor_reading_t;
|
|
|
|
/*---------------------------------------------------------------------------*/
|
|
|
|
/* Global configuration */
|
|
|
|
typedef struct cc26xx_web_demo_config_s {
|
|
|
|
uint32_t magic;
|
|
|
|
int len;
|
|
|
|
uint32_t sensors_bitmap;
|
2015-08-16 16:16:16 +00:00
|
|
|
int def_rt_ping_interval;
|
2015-02-25 12:15:35 +00:00
|
|
|
mqtt_client_config_t mqtt_config;
|
|
|
|
net_uart_config_t net_uart;
|
|
|
|
} cc26xx_web_demo_config_t;
|
|
|
|
|
|
|
|
extern cc26xx_web_demo_config_t cc26xx_web_demo_config;
|
|
|
|
/*---------------------------------------------------------------------------*/
|
|
|
|
/**
|
|
|
|
* \brief Performs a lookup for a reading of a specific type of sensor
|
|
|
|
* \param sens_type CC26XX_WEB_DEMO_SENSOR_BATMON_TEMP...
|
|
|
|
* \return A pointer to the reading data structure or NULL
|
|
|
|
*/
|
|
|
|
const cc26xx_web_demo_sensor_reading_t *cc26xx_web_demo_sensor_lookup(int sens_type);
|
|
|
|
|
|
|
|
/**
|
|
|
|
* \brief Returns the first available sensor reading
|
|
|
|
* \return A pointer to the reading data structure or NULL
|
|
|
|
*/
|
|
|
|
const cc26xx_web_demo_sensor_reading_t *cc26xx_web_demo_sensor_first(void);
|
|
|
|
|
|
|
|
/**
|
|
|
|
* \brief Print an IPv6 address into a buffer
|
|
|
|
* \param buf A pointer to the buffer where this function will print the IPv6
|
|
|
|
* address
|
|
|
|
* \param buf_len the length of the buffer
|
|
|
|
* \param addr A pointer to the IPv6 address
|
|
|
|
* \return The number of bytes written to the buffer
|
|
|
|
*
|
|
|
|
* It is the caller's responsibility to allocate enough space for buf
|
|
|
|
*/
|
|
|
|
int cc26xx_web_demo_ipaddr_sprintf(char *buf, uint8_t buf_len,
|
|
|
|
const uip_ipaddr_t *addr);
|
|
|
|
|
|
|
|
/**
|
|
|
|
* \brief Resets the example to a default configuration
|
|
|
|
*/
|
|
|
|
void cc26xx_web_demo_restore_defaults(void);
|
|
|
|
/*---------------------------------------------------------------------------*/
|
|
|
|
#endif /* CC26XX_WEB_DEMO_H_ */
|
|
|
|
/*---------------------------------------------------------------------------*/
|
|
|
|
/**
|
|
|
|
* @}
|
|
|
|
* @}
|
|
|
|
*/
|