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 <vipulrah...@apache.org>
Authored: Tue Apr 11 17:24:17 2017 -0700
Committer: Vipul Rahane <vipulrah...@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

Reply via email to