You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@mynewt.apache.org by vi...@apache.org on 2017/02/24 19:38:16 UTC

[21/50] incubator-mynewt-core git commit: Added mag simulator

Added mag simulator


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/95a34bd3
Tree: http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/tree/95a34bd3
Diff: http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/diff/95a34bd3

Branch: refs/heads/develop
Commit: 95a34bd3ad89cfeba6d3417ec8858405937445c7
Parents: b04fe06
Author: microbuilder <co...@microbuilder.eu>
Authored: Thu Dec 29 15:01:28 2016 +0100
Committer: microbuilder <co...@microbuilder.eu>
Committed: Thu Dec 29 15:01:28 2016 +0100

----------------------------------------------------------------------
 hw/drivers/sensors/sim/include/sim/sim_mag.h |  50 ++++++
 hw/drivers/sensors/sim/src/generic_mag.c     | 177 ++++++++++++++++++++++
 2 files changed, 227 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/95a34bd3/hw/drivers/sensors/sim/include/sim/sim_mag.h
----------------------------------------------------------------------
diff --git a/hw/drivers/sensors/sim/include/sim/sim_mag.h b/hw/drivers/sensors/sim/include/sim/sim_mag.h
new file mode 100644
index 0000000..c28df97
--- /dev/null
+++ b/hw/drivers/sensors/sim/include/sim/sim_mag.h
@@ -0,0 +1,50 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *  http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+#ifndef __SIM_MAG_H__
+#define __SIM_MAG_H__
+
+#include "os/os.h"
+#include "os/os_dev.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+struct sim_mag_cfg {
+    uint8_t smc_nr_samples;
+    uint8_t smc_nr_axises;
+    uint16_t smc_sample_itvl;
+};
+
+struct sim_mag {
+    struct os_dev sm_dev;
+    struct sensor sm_sensor;
+    struct sim_mag_cfg sm_cfg;
+    os_time_t sm_last_read_time;
+};
+
+int sim_mag_init(struct os_dev *, void *);
+int sim_mag_config(struct sim_mag *, struct sim_mag_cfg *);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* __SIM_MAG_H__ */

http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/95a34bd3/hw/drivers/sensors/sim/src/generic_mag.c
----------------------------------------------------------------------
diff --git a/hw/drivers/sensors/sim/src/generic_mag.c b/hw/drivers/sensors/sim/src/generic_mag.c
new file mode 100644
index 0000000..e21f10e
--- /dev/null
+++ b/hw/drivers/sensors/sim/src/generic_mag.c
@@ -0,0 +1,177 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * resarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *  http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+#include <string.h>
+#include <errno.h>
+#include <assert.h>
+
+#include "defs/error.h"
+
+#include "os/os.h"
+#include "sysinit/sysinit.h"
+
+#include "sensor/sensor.h"
+#include "sensor/mag.h"
+
+#include "sim/sim_mag.h"
+
+/* Exports for the sensor interface.
+ */
+static void *sim_mag_sensor_get_interface(struct sensor *, sensor_type_t);
+static int sim_mag_sensor_read(struct sensor *, sensor_type_t,
+        sensor_data_func_t, void *, uint32_t);
+static int sim_mag_sensor_get_config(struct sensor *, sensor_type_t,
+        struct sensor_cfg *);
+
+static const struct sensor_driver g_sim_mag_sensor_driver = {
+    sim_mag_sensor_get_interface,
+    sim_mag_sensor_read,
+    sim_mag_sensor_get_config
+};
+
+/**
+ * Expects to be called back through os_dev_create().
+ *
+ * @param The device object associated with this magnetometer
+ * @param Argument passed to OS device init, unused
+ *
+ * @return 0 on success, non-zero error on failure.
+ */
+int
+sim_mag_init(struct os_dev *dev, void *arg)
+{
+    struct sim_mag *sm;
+    struct sensor *sensor;
+    int rc;
+
+    sm = (struct sim_mag *) dev;
+
+    sensor = &sm->sm_sensor;
+
+    rc = sensor_init(sensor, dev);
+    if (rc != 0) {
+        goto err;
+    }
+
+    rc = sensor_set_driver(sensor, SENSOR_TYPE_MAGNETIC_FIELD,
+            (struct sensor_driver *) &g_sim_mag_sensor_driver);
+    if (rc != 0) {
+        goto err;
+    }
+
+    rc = sensor_mgr_register(sensor);
+    if (rc != 0) {
+        goto err;
+    }
+
+    return (0);
+err:
+    return (rc);
+}
+
+int
+sim_mag_config(struct sim_mag *sm, struct sim_mag_cfg *cfg)
+{
+    /* Overwrite the configuration associated with this generic magnetometer. */
+    memcpy(&sm->sm_cfg, cfg, sizeof(*cfg));
+
+    return (0);
+}
+
+static void *
+sim_mag_sensor_get_interface(struct sensor *sensor, sensor_type_t type)
+{
+    return (NULL);
+}
+
+
+static int
+sim_mag_sensor_read(struct sensor *sensor, sensor_type_t type,
+        sensor_data_func_t data_func, void *data_arg, uint32_t timeout)
+{
+    struct sim_mag *sm;
+    struct sensor_mag_data smd;
+    os_time_t now;
+    uint32_t num_samples;
+    int i;
+    int rc;
+
+    /* If the read isn't looking for accel data, then don't do anything. */
+    if (!(type & SENSOR_TYPE_MAGNETIC_FIELD)) {
+        rc = SYS_EINVAL;
+        goto err;
+    }
+
+    sm = (struct sim_mag *) SENSOR_GET_DEVICE(sensor);
+
+    /* When a sensor is "read", we get the last 'n' samples from the device
+     * and pass them to the sensor data function.  Based on the sample
+     * interval provided to sim_accel_config() and the last time this function
+     * was called, 'n' samples are generated.
+     */
+    now = os_time_get();
+
+    num_samples = (now - sm->sm_last_read_time) / sm->sm_cfg.smc_sample_itvl;
+    num_samples = min(num_samples, sm->sm_cfg.smc_nr_samples);
+
+    /* By default only readings are provided for 1-axis (x), however,
+     * if number of axises is configured, up to 3-axises of data can be
+     * returned.
+     */
+    smd.smd_x = 0.0;
+    smd.smd_y = SENSOR_MAG_DATA_UNUSED;
+    smd.smd_z = SENSOR_MAG_DATA_UNUSED;
+
+    if (sm->sm_cfg.smc_nr_axises > 1) {
+        smd.smd_y = 0.0;
+    }
+    if (sm->sm_cfg.smc_nr_axises > 2) {
+        smd.smd_z = 0.0;
+    }
+
+    /* Call data function for each of the generated readings. */
+    for (i = 0; i < num_samples; i++) {
+        rc = data_func(sensor, data_arg, &smd);
+        if (rc != 0) {
+            goto err;
+        }
+    }
+
+    return (0);
+err:
+    return (rc);
+}
+
+static int
+sim_mag_sensor_get_config(struct sensor *sensor, sensor_type_t type,
+        struct sensor_cfg *cfg)
+{
+    int rc;
+
+    if (type != SENSOR_TYPE_MAGNETIC_FIELD) {
+        rc = SYS_EINVAL;
+        goto err;
+    }
+
+    cfg->sc_valtype = SENSOR_VALUE_TYPE_FLOAT_TRIPLET;
+
+    return (0);
+err:
+    return (rc);
+}