You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@mynewt.apache.org by ma...@apache.org on 2017/04/17 23:46:12 UTC
[09/11] incubator-mynewt-core git commit: MYNEWT-729 SensorAPI: Send
sensor data over OIC
MYNEWT-729 SensorAPI: Send sensor data over OIC
- Add multiple sensor oic reqource support
Project: http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/commit/686b92db
Tree: http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/tree/686b92db
Diff: http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/diff/686b92db
Branch: refs/heads/master
Commit: 686b92dbbccb7dee7e1ebb12c718df065946c14c
Parents: a6b41a5
Author: Vipul Rahane <vi...@apache.org>
Authored: Tue Apr 11 17:24:17 2017 -0700
Committer: Vipul Rahane <vi...@apache.org>
Committed: Mon Apr 17 16:14:20 2017 -0700
----------------------------------------------------------------------
apps/sensors_test/src/main.c | 35 +++---
apps/sensors_test/syscfg.yml | 5 +-
hw/sensor/src/sensor_oic.c | 244 ++++++++++++++++++++++++++++++++++++--
3 files changed, 256 insertions(+), 28 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/686b92db/apps/sensors_test/src/main.c
----------------------------------------------------------------------
diff --git a/apps/sensors_test/src/main.c b/apps/sensors_test/src/main.c
index 8b5a975..81dcc9f 100755
--- a/apps/sensors_test/src/main.c
+++ b/apps/sensors_test/src/main.c
@@ -92,6 +92,8 @@ static struct os_sem g_test_sem;
/* For LED toggling */
static int g_led_pin;
+extern int oc_stack_errno;
+
STATS_SECT_START(gpio_stats)
STATS_SECT_ENTRY(toggles)
STATS_SECT_END
@@ -659,21 +661,6 @@ main(int argc, char **argv)
/* Initialize the OIC */
log_register("oic", &oc_log, &log_console_handler, NULL, LOG_SYSLEVEL);
- oc_ble_coap_gatt_srv_init();
-
- ble_hs_cfg.reset_cb = sensor_oic_on_reset;
- ble_hs_cfg.sync_cb = sensor_oic_on_sync;
- ble_hs_cfg.gatts_register_cb = gatt_svr_register_cb;
-
- /* Set the default device name. */
- rc = ble_svc_gap_device_name_set("pi");
- assert(rc == 0);
-
- oc_main_init((oc_handler_t *)&sensor_oic_handler);
-
- oc_init_platform("MyNewt", NULL, NULL);
- oc_add_device("/oic/d", "oic.d.color", "color0", "1.0", "1.0", NULL,
- NULL);
flash_test_init();
@@ -710,6 +697,24 @@ main(int argc, char **argv)
config_sensor();
+ oc_ble_coap_gatt_srv_init();
+
+ ble_hs_cfg.reset_cb = sensor_oic_on_reset;
+ ble_hs_cfg.sync_cb = sensor_oic_on_sync;
+ ble_hs_cfg.gatts_register_cb = gatt_svr_register_cb;
+
+ /* Set the default device name. */
+ rc = ble_svc_gap_device_name_set("pi");
+ assert(rc == 0);
+
+ rc = oc_main_init((oc_handler_t *)&sensor_oic_handler);
+ assert(!rc);
+
+ oc_init_platform("MyNewt", NULL, NULL);
+ oc_add_device("/oic/d", "oic.d.color", "color0", "1.0", "1.0", NULL,
+ NULL);
+ assert(!oc_stack_errno);
+
/*
* As the last thing, process events from default event queue.
*/
http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/686b92db/apps/sensors_test/syscfg.yml
----------------------------------------------------------------------
diff --git a/apps/sensors_test/syscfg.yml b/apps/sensors_test/syscfg.yml
index 5097574..1d650b1 100644
--- a/apps/sensors_test/syscfg.yml
+++ b/apps/sensors_test/syscfg.yml
@@ -42,7 +42,7 @@ syscfg.vals:
CONFIG_NEWTMGR: 0
TSL2561_CLI: 0
- BNO055_CLI: 0
+ BNO055_CLI: 1
TCS34725_CLI: 1
SENSOR_BLE_OIC: 1
@@ -50,6 +50,7 @@ syscfg.vals:
BLE_ROLE_OBSERVER: 0
OC_SERVER: 1
OC_TRANSPORT_GATT: 1
+ OC_APP_RESOURCES : 20
syscfg.defs:
TSL2561_PRESENT:
@@ -60,7 +61,7 @@ syscfg.defs:
value : 0
BNO055_PRESENT:
description: 'BNO055 is present'
- value : 0
+ value : 1
TCS34725_PRESENT:
description: 'TCS34725 is present'
value : 1
http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/686b92db/hw/sensor/src/sensor_oic.c
----------------------------------------------------------------------
diff --git a/hw/sensor/src/sensor_oic.c b/hw/sensor/src/sensor_oic.c
index b30f417..132b940 100644
--- a/hw/sensor/src/sensor_oic.c
+++ b/hw/sensor/src/sensor_oic.c
@@ -289,17 +289,187 @@ err:
return rc;
}
+static int
+sensor_typename_to_type(char *typename, sensor_type_t *type,
+ struct sensor *sensor)
+{
+ if (!strcmp(typename, "acc")) {
+ /* Accelerometer functionality supported */
+ *type = SENSOR_TYPE_ACCELEROMETER;
+ } else if (!strcmp(typename, "mag")) {
+ /* Magnetic field supported */
+ *type = SENSOR_TYPE_MAGNETIC_FIELD;
+ } else if (!strcmp(typename, "gyr")) {
+ /* Gyroscope supported */
+ *type = SENSOR_TYPE_GYROSCOPE;
+ } else if (!strcmp(typename, "lt")) {
+ /* Light supported */
+ *type = SENSOR_TYPE_LIGHT;
+ } else if (!strcmp(typename, "tmp")) {
+ /* Temperature supported */
+ *type = SENSOR_TYPE_TEMPERATURE;
+ } else if (!strcmp(typename, "ambtmp")) {
+ /* Ambient temperature supported */
+ *type = SENSOR_TYPE_AMBIENT_TEMPERATURE;
+ } else if (!strcmp(typename, "psr")) {
+ /* Pressure sensor supported */
+ *type = SENSOR_TYPE_PRESSURE;
+ } else if (!strcmp(typename, "prox")) {
+ /* Proximity sensor supported */
+ *type = SENSOR_TYPE_PROXIMITY;
+ } else if (!strcmp(typename, "rhmty")) {
+ /* Relative humidity supported */
+ *type = SENSOR_TYPE_RELATIVE_HUMIDITY;
+ } else if (!strcmp(typename, "quat")) {
+ /* Rotation vector (quaternion)) supported */
+ *type = SENSOR_TYPE_ROTATION_VECTOR;
+ } else if (!strcmp(typename, "alt")) {
+ /* Altitude Supported */
+ *type = SENSOR_TYPE_ALTITUDE;
+ } else if (!strcmp(typename, "wt")) {
+ /* Weight Supported */
+ *type = SENSOR_TYPE_WEIGHT;
+ } else if (!strcmp(typename, "lacc")) {
+ /* Linear Accelerometer (Without Gravity)) */
+ *type = SENSOR_TYPE_LINEAR_ACCEL;
+ } else if (!strcmp(typename, "grav")) {
+ /* Gravity Sensor */
+ *type = SENSOR_TYPE_GRAVITY;
+ } else if (!strcmp(typename, "eul")) {
+ /* Euler Orientation Sensor */
+ *type = SENSOR_TYPE_EULER;
+ } else if (!strcmp(typename, "col")) {
+ /* Color Sensor */
+ *type = SENSOR_TYPE_COLOR;
+ } else if (!strcmp(typename, "udef1")) {
+ /* User defined sensor type 1 */
+ *type = SENSOR_TYPE_USER_DEFINED_1;
+ } else if (!strcmp(typename, "udef2")) {
+ /* User defined sensor type 2 */
+ *type = SENSOR_TYPE_USER_DEFINED_2;
+ } else {
+ goto err;
+ }
+
+ if (!(*type & sensor->s_types)) {
+ goto err;
+ }
+
+ return SYS_EOK;
+err:
+ return SYS_EINVAL;
+}
+
+static int
+sensor_type_to_typename(char **typename, sensor_type_t type,
+ struct sensor *sensor)
+{
+ switch(type) {
+ /* Accelerometer functionality supported */
+ case SENSOR_TYPE_ACCELEROMETER:
+ *typename = "acc";
+ break;
+ /* Magnetic field supported */
+ case SENSOR_TYPE_MAGNETIC_FIELD:
+ *typename = "mag";
+ break;
+ /* Gyroscope supported */
+ case SENSOR_TYPE_GYROSCOPE:
+ *typename = "gyr";
+ break;
+ /* Light supported */
+ case SENSOR_TYPE_LIGHT:
+ *typename = "lt";
+ break;
+ /* Temperature supported */
+ case SENSOR_TYPE_TEMPERATURE:
+ *typename = "tmp";
+ break;
+ /* Ambient temperature supported */
+ case SENSOR_TYPE_AMBIENT_TEMPERATURE:
+ *typename = "ambtmp";
+ break;
+ /* Pressure sensor supported */
+ case SENSOR_TYPE_PRESSURE:
+ *typename = "psr";
+ break;
+ /* Proximity sensor supported */
+ case SENSOR_TYPE_PROXIMITY:
+ *typename = "prox";
+ break;
+ /* Relative humidity supported */
+ case SENSOR_TYPE_RELATIVE_HUMIDITY:
+ *typename = "rhmty";
+ break;
+ /* Rotation vector (quaternion)) supported */
+ case SENSOR_TYPE_ROTATION_VECTOR:
+ *typename = "quat";
+ break;
+ /* Altitude Supported */
+ case SENSOR_TYPE_ALTITUDE:
+ *typename = "alt";
+ break;
+ /* Weight Supported */
+ case SENSOR_TYPE_WEIGHT:
+ *typename = "wt";
+ break;
+ /* Linear Accelerometer (Without Gravity)) */
+ case SENSOR_TYPE_LINEAR_ACCEL:
+ *typename = "lacc";
+ break;
+ /* Gravity Sensor */
+ case SENSOR_TYPE_GRAVITY:
+ *typename = "grav";
+ break;
+ /* Euler Orientation Sensor */
+ case SENSOR_TYPE_EULER:
+ *typename = "eul";
+ break;
+ /* Color Sensor */
+ case SENSOR_TYPE_COLOR:
+ *typename = "col";
+ break;
+ /* User defined sensor type 1 */
+ case SENSOR_TYPE_USER_DEFINED_1:
+ *typename = "udef1";
+ break;
+ /* User defined sensor type 2 */
+ case SENSOR_TYPE_USER_DEFINED_2:
+ *typename = "udef2";
+ break;
+ default:
+ goto err;
+ }
+
+ if (!(type & sensor->s_types)) {
+ goto err;
+ }
+
+ return SYS_EOK;
+err:
+ return SYS_EINVAL;
+}
+
static void
sensor_oic_get_data(oc_request_t *request, oc_interface_mask_t interface)
{
int rc;
struct sensor *sensor;
struct sensor_listener listener;
+ char *devname;
+ char *typename;
+ sensor_type_t type;
+ const char s[2] = "/";
+
+ /* Parse the sensor device name from the uri */
+ devname = strtok((char *)&(request->resource->uri.os_str[1]), s);
+ typename = strtok(NULL, s);
/* Look up sensor by name */
- sensor = sensor_mgr_find_next_bydevname("color0", NULL);
+ sensor = sensor_mgr_find_next_bydevname(devname, NULL);
if (!sensor) {
- console_printf("Sensor %s not found!\n", "color0");
+ rc = SYS_EINVAL;
+ goto err;
}
oc_rep_start_root_object();
@@ -311,7 +481,13 @@ sensor_oic_get_data(oc_request_t *request, oc_interface_mask_t interface)
/* Register a listener and then trigger/read a bunch of samples */
memset(&listener, 0, sizeof(listener));
- listener.sl_sensor_type = sensor->s_types & SENSOR_TYPE_COLOR;
+ rc = sensor_typename_to_type(typename, &type, sensor);
+ if (rc) {
+ /* Type either not supported by sensor or not found */
+ goto err;
+ }
+
+ listener.sl_sensor_type = type;
listener.sl_func = sensor_oic_encode;
listener.sl_arg = (void *)&listener.sl_sensor_type;
@@ -348,16 +524,62 @@ void
sensor_oic_init(void)
{
oc_resource_t *res;
+ struct sensor *sensor;
+ char *tmpstr;
+ size_t bufsize;
+ char *typename;
+ int i;
+ int rc;
+
+ sensor = NULL;
+
+ while (1) {
+
+ sensor_mgr_lock();
+
+ sensor = sensor_mgr_find_next_bytype(SENSOR_TYPE_ALL, sensor);
- res = oc_new_resource("/color0", 1, 0);
- oc_resource_bind_resource_type(res, "sensors.r.color0");
- oc_resource_bind_resource_interface(res, OC_IF_R);
- oc_resource_set_default_interface(res, OC_IF_R);
+ sensor_mgr_unlock();
- oc_resource_set_discoverable(res);
- oc_resource_set_periodic_observable(res, 1);
- oc_resource_set_request_handler(res, OC_GET, sensor_oic_get_data);
- oc_add_resource(res);
+ if (sensor == NULL) {
+ /* Sensor not found */
+ break;
+ }
+
+ i = 0;
+ typename = NULL;
+
+ /* Iterate through N types of sensors */
+ while (i < 32) {
+ if (sensor->s_types & (1 << i)) {
+ rc = sensor_type_to_typename(&typename, (1 << i), sensor);
+ if (rc) {
+ break;
+ }
+ bufsize = strlen(sensor->s_dev->od_name) + 1;
+ tmpstr = (char *)calloc(bufsize, bufsize);
+ sprintf(tmpstr, "/%s/%s", sensor->s_dev->od_name, typename);
+ res = oc_new_resource(tmpstr, 1, 0);
+ free(tmpstr);
+
+ bufsize = strlen(sensor->s_dev->od_name) + strlen("sensors.r.");
+ tmpstr = (char *)calloc(bufsize, bufsize);
+ sprintf(tmpstr, "sensors.r.%s", sensor->s_dev->od_name);
+
+ oc_resource_bind_resource_type(res, tmpstr);
+ free(tmpstr);
+
+ oc_resource_bind_resource_interface(res, OC_IF_R);
+ oc_resource_set_default_interface(res, OC_IF_R);
+
+ oc_resource_set_discoverable(res);
+ oc_resource_set_periodic_observable(res, 1);
+ oc_resource_set_request_handler(res, OC_GET, sensor_oic_get_data);
+ oc_add_resource(res);
+ }
+ i++;
+ }
+ }
}
#endif