You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@mynewt.apache.org by GitBox <gi...@apache.org> on 2018/07/12 00:46:53 UTC

[GitHub] ccollins476ad closed pull request #1260: hw/sensor: Limit a sensor to one error callback

ccollins476ad closed pull request #1260: hw/sensor: Limit a sensor to one error callback
URL: https://github.com/apache/mynewt-core/pull/1260
 
 
   

This is a PR merged from a forked repository.
As GitHub hides the original diff on merge, it is displayed below for
the sake of provenance:

As this is a foreign pull request (from a fork), the diff is supplied
below (as it won't show otherwise due to GitHub magic):

diff --git a/hw/sensor/include/sensor/sensor.h b/hw/sensor/include/sensor/sensor.h
index 215946a125..ce17424308 100644
--- a/hw/sensor/include/sensor/sensor.h
+++ b/hw/sensor/include/sensor/sensor.h
@@ -246,18 +246,15 @@ typedef int
 (*sensor_notifier_func_t)(struct sensor *, void *, sensor_event_type_t);
 
 /**
- * Callback for reporting a sensor read error.  Specified in a sensor error
- * listener.
+ * Callback for reporting a sensor read error.
  *
  * @param sensor The sensor for which a read failed.
- * @param arg The optional argument associated with the error listener.
+ * @param arg The optional argument registered with the callback.
  * @param status Indicates the cause of the read failure.  Determined by the
  *               underlying sensor driver.
- * @param type The type of sensor data for which a read was attempted.
  */
 typedef void
-(*sensor_error_func_t)(struct sensor *sensor, void *arg, int status,
-                       sensor_type_t type);
+(*sensor_error_func_t)(struct sensor *sensor, void *arg, int status);
 
 /**
  *
@@ -281,29 +278,6 @@ struct sensor_listener {
     SLIST_ENTRY(sensor_listener) sl_next;
 };
 
-/**
- * Reports failed reads of specific kinds of sensor data.
- */
-struct sensor_err_listener {
-
-    /* The type of sensor reads to report errors for.  This is interpreted as a
-     * mask; this listener is called for failed reads of all sensor types on
-     * this sensor that match the mask.
-     */
-    sensor_type_t sel_sensor_type;
-
-    /* Sensor error handler function.  Called when a read fails. */
-    sensor_error_func_t sel_func;
-
-    /* Optional argument for the error callback. */
-    void *sel_arg;
-
-    /* Next item in the sensor error listener list.  The head of this list is
-     * contained within the sensor object.
-     */
-    SLIST_ENTRY(sensor_err_listener) sel_next;
-};
-
 /**
  * Registration for sensor event notifications
  */
@@ -616,10 +590,9 @@ struct sensor {
      */
     SLIST_HEAD(, sensor_listener) s_listener_list;
 
-    /* A list of listeners that are registered to report read errors for this
-     * sensor
-     */
-    SLIST_HEAD(, sensor_err_listener) s_err_listener_list;
+    /* A callback that reports read errors for this sensor */
+    sensor_error_func_t s_err_fn;
+    void *s_err_arg;
 
     /* A list of notifiers that are registered to receive events from this
      * sensor
@@ -715,28 +688,17 @@ int sensor_register_listener(struct sensor *sensor, struct sensor_listener *list
 int sensor_unregister_listener(struct sensor *sensor, struct sensor_listener *listener);
 
 /**
- * Register a sensor error listener.  The listener is executed when the sensor
+ * Register a sensor error callback.  The callback is executed when the sensor
  * manager fails to read from the given sensor.
  *
- * @param sensor The sensor to register an error listener on.
- * @param err_listener The error listener to register.
- *
- * @return 0 on success, non-zero error code on failure.
- */
-int sensor_register_err_listener(struct sensor *sensor,
-        struct sensor_err_listener *err_listener);
-
-/**
- * Un-register a sensor error listener. This allows a calling application to
- * clear error callbacks for a given sensor object.
- *
- * @param sensor The sensor object.
- * @param err_listener The error listener to remove from the sensor.
+ * @param sensor The sensor to register an error callback on.
+ * @param err_fn The function to execute when a read fails.
+ * @param arg Optional argument to pass to the callback.
  *
  * @return 0 on success, non-zero error code on failure.
  */
-int sensor_unregister_err_listener(struct sensor *sensor,
-        struct sensor_err_listener *err_listener);
+int sensor_register_err_func(struct sensor *sensor,
+        sensor_error_func_t err_fn, void *arg);
 
 /**
  * @} SensorListenerAPI
diff --git a/hw/sensor/src/sensor.c b/hw/sensor/src/sensor.c
index 310acaea80..d3bd2b9118 100644
--- a/hw/sensor/src/sensor.c
+++ b/hw/sensor/src/sensor.c
@@ -1029,8 +1029,8 @@ sensor_unregister_listener(struct sensor *sensor,
 }
 
 int
-sensor_register_err_listener(struct sensor *sensor,
-        struct sensor_err_listener *err_listener)
+sensor_register_err_func(struct sensor *sensor, sensor_error_func_t err_fn,
+                         void *arg)
 {
     int rc;
 
@@ -1039,35 +1039,8 @@ sensor_register_err_listener(struct sensor *sensor,
         goto err;
     }
 
-    SLIST_INSERT_HEAD(&sensor->s_err_listener_list, err_listener, sel_next);
-
-    sensor_unlock(sensor);
-
-    return (0);
-err:
-    return (rc);
-}
-
-int
-sensor_unregister_err_listener(struct sensor *sensor,
-        struct sensor_err_listener *err_listener)
-{
-    struct sensor_err_listener *cur;
-    int rc;
-
-    rc = sensor_lock(sensor);
-    if (rc != 0) {
-        goto err;
-    }
-
-    SLIST_FOREACH(cur, &sensor->s_err_listener_list, sel_next) {
-        if (cur == err_listener) {
-            /* Remove this entry from the list */
-            SLIST_REMOVE(&sensor->s_err_listener_list, cur,
-                         sensor_err_listener, sel_next);
-            break;
-        }
-    }
+    sensor->s_err_fn = err_fn;
+    sensor->s_err_arg = arg;
 
     sensor_unlock(sensor);
 
@@ -1206,27 +1179,6 @@ sensor_read_data_func(struct sensor *sensor, void *arg, void *data,
     return (0);
 }
 
-/**
- * Reports a read error for the specified sensor and data type.
- *
- * @param sensor The sensor for which a read failed.
- * @param status The status code to pass to error listeners.  This should be
- *               the error reported by the underlying driver.
- * @param type The data type being read when the failure occurred.
- */
-static void
-sensor_read_error_func(struct sensor *sensor, int status, sensor_type_t type)
-{
-    struct sensor_err_listener *err_listener;
-
-    SLIST_FOREACH(err_listener, &sensor->s_err_listener_list, sel_next) {
-        if (err_listener->sel_sensor_type & type) {
-            err_listener->sel_func(sensor, err_listener->sel_arg, status,
-                                   type);
-        }
-    }
-}
-
 /**
  * Puts a interrupt event on the sensor manager evq
  *
@@ -2232,7 +2184,9 @@ sensor_read(struct sensor *sensor, sensor_type_t type,
     rc = sensor->s_funcs->sd_read(sensor, type, sensor_read_data_func, &src,
                                   timeout);
     if (rc) {
-        sensor_read_error_func(sensor, rc, type);
+        if (sensor->s_err_fn != NULL) {
+            sensor->s_err_fn(sensor, sensor->s_err_arg, rc);
+        }
         goto err;
     }
 
diff --git a/hw/sensor/test/src/testcases/sensor_test_case_poll_err.c b/hw/sensor/test/src/testcases/sensor_test_case_poll_err.c
index f9f75bfb8e..dc1a257136 100644
--- a/hw/sensor/test/src/testcases/sensor_test_case_poll_err.c
+++ b/hw/sensor/test/src/testcases/sensor_test_case_poll_err.c
@@ -39,8 +39,7 @@ static int stcpe_sensor_read_status;
  * `stcpe_error_recs` array.
  */
 static void
-stcpe_sensor_err(struct sensor *sensor, void *arg, int status,
-                 sensor_type_t type)
+stcpe_sensor_err(struct sensor *sensor, void *arg, int status)
 {
     struct stcpe_error_rec *rec;
 
@@ -50,7 +49,6 @@ stcpe_sensor_err(struct sensor *sensor, void *arg, int status,
     rec->sensor = sensor;
     rec->arg = arg;
     rec->status = status;
-    rec->type = type;
 }
 
 /**
@@ -69,17 +67,15 @@ TEST_CASE(sensor_test_case_poll_err)
         .sd_read = stcpe_sensor_read,
     };
 
-    struct sensor_err_listener sel1;
-    struct sensor_err_listener sel2;
     struct sensor sn;
     int rc;
 
     sysinit();
 
     /***
-     * Register the sensor and error listeners.
-     * Listener 1: light
-     * Listener 2: all types
+     * Register the sensor and an error callback.  Arbitrarily specify
+     * `&stcpe_sensor_read_status` as the callback argument, just so we can
+     * test that the argument is properly passed.
      */
 
     rc = sensor_init(&sn, NULL);
@@ -95,19 +91,11 @@ TEST_CASE(sensor_test_case_poll_err)
     rc = sensor_mgr_register(&sn);
     TEST_ASSERT_FATAL(rc == 0);
 
-    sel1.sel_sensor_type = SENSOR_TYPE_LIGHT;
-    sel1.sel_func = stcpe_sensor_err;
-    sel1.sel_arg = NULL;
-    rc = sensor_register_err_listener(&sn, &sel1);
+    rc = sensor_register_err_func(&sn, stcpe_sensor_err,
+                                  &stcpe_sensor_read_status);
     TEST_ASSERT_FATAL(rc == 0);
 
-    sel2.sel_sensor_type = SENSOR_TYPE_ALL;
-    sel2.sel_func = stcpe_sensor_err;
-    sel2.sel_arg = NULL;
-    rc = sensor_register_err_listener(&sn, &sel2);
-    TEST_ASSERT_FATAL(rc == 0);
-
-    /*** Successful accelerometer read; ensure no error. */
+    /*** Successful read; ensure no error. */
 
     stcpe_sensor_read_status = 0;
     rc = sensor_read(&sn, SENSOR_TYPE_ACCELEROMETER, NULL, NULL,
@@ -115,30 +103,32 @@ TEST_CASE(sensor_test_case_poll_err)
     TEST_ASSERT_FATAL(rc == 0);
     TEST_ASSERT_FATAL(stcpe_num_error_recs == 0);
 
-    /*** Failed acceleromter read; ensure one error record. */
+    /*** Three failed reads; ensure three error record. */
 
     stcpe_sensor_read_status = 1;
     rc = sensor_read(&sn, SENSOR_TYPE_ACCELEROMETER, NULL, NULL,
                      OS_TIMEOUT_NEVER);
     TEST_ASSERT_FATAL(rc == 1);
-    TEST_ASSERT_FATAL(stcpe_num_error_recs == 1);
-    TEST_ASSERT_FATAL(stcpe_error_recs[0].sensor == &sn);
-    TEST_ASSERT_FATAL(stcpe_error_recs[0].arg == NULL);
-    TEST_ASSERT_FATAL(stcpe_error_recs[0].status == 1);
-    TEST_ASSERT_FATAL(stcpe_error_recs[0].type == SENSOR_TYPE_ACCELEROMETER);
-
-    /** Failed light read; ensure two additional error records. */
 
     stcpe_sensor_read_status = 2;
-    rc = sensor_read(&sn, SENSOR_TYPE_LIGHT, NULL, NULL, OS_TIMEOUT_NEVER);
+    rc = sensor_read(&sn, SENSOR_TYPE_ACCELEROMETER, NULL, NULL,
+                     OS_TIMEOUT_NEVER);
     TEST_ASSERT_FATAL(rc == 2);
+
+    stcpe_sensor_read_status = 3;
+    rc = sensor_read(&sn, SENSOR_TYPE_ACCELEROMETER, NULL, NULL,
+                     OS_TIMEOUT_NEVER);
+    TEST_ASSERT_FATAL(rc == 3);
+
     TEST_ASSERT_FATAL(stcpe_num_error_recs == 3);
+
+    TEST_ASSERT_FATAL(stcpe_error_recs[0].sensor == &sn);
+    TEST_ASSERT_FATAL(stcpe_error_recs[0].arg == &stcpe_sensor_read_status);
+    TEST_ASSERT_FATAL(stcpe_error_recs[0].status == 1);
     TEST_ASSERT_FATAL(stcpe_error_recs[1].sensor == &sn);
-    TEST_ASSERT_FATAL(stcpe_error_recs[1].arg == NULL);
+    TEST_ASSERT_FATAL(stcpe_error_recs[1].arg == &stcpe_sensor_read_status);
     TEST_ASSERT_FATAL(stcpe_error_recs[1].status == 2);
-    TEST_ASSERT_FATAL(stcpe_error_recs[1].type == SENSOR_TYPE_LIGHT);
     TEST_ASSERT_FATAL(stcpe_error_recs[2].sensor == &sn);
-    TEST_ASSERT_FATAL(stcpe_error_recs[2].arg == NULL);
-    TEST_ASSERT_FATAL(stcpe_error_recs[2].status == 2);
-    TEST_ASSERT_FATAL(stcpe_error_recs[2].type == SENSOR_TYPE_LIGHT);
+    TEST_ASSERT_FATAL(stcpe_error_recs[2].arg == &stcpe_sensor_read_status);
+    TEST_ASSERT_FATAL(stcpe_error_recs[2].status == 3);
 }


 

----------------------------------------------------------------
This is an automated message from the Apache Git Service.
To respond to the message, please log on GitHub and use the
URL above to go to the specific comment.
 
For queries about this service, please contact Infrastructure at:
users@infra.apache.org


With regards,
Apache Git Services