You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@mynewt.apache.org by cc...@apache.org on 2017/04/07 18:44:50 UTC
[16/50] [abbrv] incubator-mynewt-core git commit: MYNEWT-703
SensorAPI: Add cputime timestamps
MYNEWT-703 SensorAPI: Add cputime timestamps
- and timeofday to SensorAPI samples
- fix sensors test app sim issues
- fix small typo bug with bno055
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/28531b95
Tree: http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/tree/28531b95
Diff: http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/diff/28531b95
Branch: refs/heads/master
Commit: 28531b95944223fca4d23ce403153e33b3d1f055
Parents: d8b0316
Author: Vipul Rahane <vi...@apache.org>
Authored: Fri Mar 31 18:30:42 2017 -0700
Committer: Vipul Rahane <vi...@apache.org>
Committed: Fri Mar 31 18:33:43 2017 -0700
----------------------------------------------------------------------
apps/sensors_test/src/main.c | 3 +-
apps/sensors_test/syscfg.yml | 11 ++-
hw/bsp/native/src/hal_bsp.c | 20 ++++
hw/drivers/sensors/bno055/src/bno055.c | 2 +-
hw/drivers/sensors/sim/include/sim/sim_accel.h | 1 +
hw/drivers/sensors/tsl2561/src/tsl2561.c | 1 +
hw/sensor/include/sensor/sensor.h | 31 ++++--
hw/sensor/src/sensor.c | 104 ++++++++++++++++++++
hw/sensor/src/sensor_shell.c | 18 +++-
9 files changed, 170 insertions(+), 21 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/28531b95/apps/sensors_test/src/main.c
----------------------------------------------------------------------
diff --git a/apps/sensors_test/src/main.c b/apps/sensors_test/src/main.c
index ac694be..42cdd10 100755
--- a/apps/sensors_test/src/main.c
+++ b/apps/sensors_test/src/main.c
@@ -30,6 +30,7 @@
#include <stats/stats.h>
#include <config/config.h>
#include <sensor/sensor.h>
+#include <sim/sim_accel.h>
#include <lsm303dlhc/lsm303dlhc.h>
#include <tsl2561/tsl2561.h>
#include <tcs34725/tcs34725.h>
@@ -358,7 +359,7 @@ static int
config_sensor(void)
{
struct os_dev *dev;
- struct cfg;
+ struct sim_accel_cfg cfg;
int rc;
dev = (struct os_dev *) os_dev_open("simaccel0", OS_TIMEOUT_NEVER, NULL);
http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/28531b95/apps/sensors_test/syscfg.yml
----------------------------------------------------------------------
diff --git a/apps/sensors_test/syscfg.yml b/apps/sensors_test/syscfg.yml
index bdbe400..4e799f4 100644
--- a/apps/sensors_test/syscfg.yml
+++ b/apps/sensors_test/syscfg.yml
@@ -41,8 +41,9 @@ syscfg.vals:
LOG_NEWTMGR: 1
CONFIG_NEWTMGR: 1
- TSL2561_CLI: 1
- BNO055_CLI: 1
+ TSL2561_CLI: 0
+ BNO055_CLI: 0
+ TCS34725_CLI: 1
syscfg.defs:
TSL2561_PRESENT:
@@ -50,11 +51,11 @@ syscfg.defs:
value : 0
LSM303DLHC_PRESENT:
description: 'LSM303 is present'
- value : 1
+ value : 0
BNO055_PRESENT:
description: 'BNO055 is present'
value : 0
TCS34725_PRESENT:
- description: 'BNO055 is present'
- value : 0
+ description: 'TCS34725 is present'
+ value : 1
http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/28531b95/hw/bsp/native/src/hal_bsp.c
----------------------------------------------------------------------
diff --git a/hw/bsp/native/src/hal_bsp.c b/hw/bsp/native/src/hal_bsp.c
index b03d1fa..0396dee 100644
--- a/hw/bsp/native/src/hal_bsp.c
+++ b/hw/bsp/native/src/hal_bsp.c
@@ -30,6 +30,12 @@
#include "uart_hal/uart_hal.h"
#include "mcu/native_bsp.h"
#include "mcu/mcu_hal.h"
+#include "syscfg/syscfg.h"
+
+#if MYNEWT_VAL(SIM_ACCEL_PRESENT)
+#include "sim/sim_accel.h"
+static struct sim_accel os_bsp_accel0;
+#endif
static struct uart_dev os_bsp_uart0;
static struct uart_dev os_bsp_uart1;
@@ -52,6 +58,14 @@ hal_bsp_power_state(int state)
return (0);
}
+#if MYNEWT_VAL(SIM_ACCEL_PRESENT)
+int
+simaccel_init(struct os_dev *odev, void *arg)
+{
+ return 0;
+}
+#endif
+
void
hal_bsp_init(void)
{
@@ -64,4 +78,10 @@ hal_bsp_init(void)
rc = os_dev_create((struct os_dev *) &os_bsp_uart1, "uart1",
OS_DEV_INIT_PRIMARY, 0, uart_hal_init, (void *) NULL);
assert(rc == 0);
+
+#if MYNEWT_VAL(SIM_ACCEL_PRESENT)
+ rc = os_dev_create((struct os_dev *) &os_bsp_accel0, "simaccel0",
+ OS_DEV_INIT_PRIMARY, 0, simaccel_init, (void *) NULL);
+ assert(rc == 0);
+#endif
}
http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/28531b95/hw/drivers/sensors/bno055/src/bno055.c
----------------------------------------------------------------------
diff --git a/hw/drivers/sensors/bno055/src/bno055.c b/hw/drivers/sensors/bno055/src/bno055.c
index 0e34987..eac3600 100644
--- a/hw/drivers/sensors/bno055/src/bno055.c
+++ b/hw/drivers/sensors/bno055/src/bno055.c
@@ -977,7 +977,7 @@ bno055_get_vector_data(void *datastruct, int type)
sad->sad_z_is_valid = 1;
break;
case SENSOR_TYPE_EULER:
- sad = datastruct;
+ sed = datastruct;
/* 1 degree = 16 LSB */
sed->sed_h = ((double)x)/euler_div;
sed->sed_r = ((double)y)/euler_div;
http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/28531b95/hw/drivers/sensors/sim/include/sim/sim_accel.h
----------------------------------------------------------------------
diff --git a/hw/drivers/sensors/sim/include/sim/sim_accel.h b/hw/drivers/sensors/sim/include/sim/sim_accel.h
index 6f0f6a1..7308489 100644
--- a/hw/drivers/sensors/sim/include/sim/sim_accel.h
+++ b/hw/drivers/sensors/sim/include/sim/sim_accel.h
@@ -22,6 +22,7 @@
#include "os/os.h"
#include "os/os_dev.h"
+#include "sensor/sensor.h"
#ifdef __cplusplus
extern "C" {
http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/28531b95/hw/drivers/sensors/tsl2561/src/tsl2561.c
----------------------------------------------------------------------
diff --git a/hw/drivers/sensors/tsl2561/src/tsl2561.c b/hw/drivers/sensors/tsl2561/src/tsl2561.c
index 27cd96e..4bb5c4b 100644
--- a/hw/drivers/sensors/tsl2561/src/tsl2561.c
+++ b/hw/drivers/sensors/tsl2561/src/tsl2561.c
@@ -37,6 +37,7 @@
#include <assert.h>
#include <stdio.h>
#include <errno.h>
+#include <string.h>
#include "defs/error.h"
#include "os/os.h"
http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/28531b95/hw/sensor/include/sensor/sensor.h
----------------------------------------------------------------------
diff --git a/hw/sensor/include/sensor/sensor.h b/hw/sensor/include/sensor/sensor.h
index 9dc7cc0..c3bc8fc 100644
--- a/hw/sensor/include/sensor/sensor.h
+++ b/hw/sensor/include/sensor/sensor.h
@@ -22,6 +22,7 @@
#include "os/os.h"
#include "os/os_dev.h"
+#include "syscfg/syscfg.h"
#ifdef __cplusplus
extern "C" {
@@ -200,14 +201,20 @@ struct sensor_driver {
sensor_get_config_func_t sd_get_config;
};
+struct sensor_timestamp {
+ struct os_timeval st_ostv;
+ struct os_timezone st_ostz;
+ uint32_t st_cputime;
+};
+
/*
* Return the OS device structure corresponding to this sensor
*/
#define SENSOR_GET_DEVICE(__s) ((__s)->s_dev)
struct sensor {
- /* The OS device this sensor inherits from, this is typically a sensor specific
- * driver.
+ /* The OS device this sensor inherits from, this is typically a sensor
+ * specific driver.
*/
struct os_dev *s_dev;
@@ -215,9 +222,9 @@ struct sensor {
struct os_mutex s_lock;
- /* A bit mask describing the types of sensor objects available from this sensor.
- * If the bit corresponding to the sensor_type_t is set, then this sensor supports
- * that variable.
+ /* A bit mask describing the types of sensor objects available from this
+ * sensor. If the bit corresponding to the sensor_type_t is set, then this
+ * sensor supports that variable.
*/
sensor_type_t s_types;
/**
@@ -225,15 +232,19 @@ struct sensor {
*/
uint32_t s_poll_rate;
- /**
- * The next time at which we want to poll data from this sensor
- */
+ /* The next time at which we want to poll data from this sensor */
os_time_t s_next_run;
- /* Sensor driver specific functions, created by the device registering the sensor.
+ /* Sensor driver specific functions, created by the device registering the
+ * sensor.
*/
struct sensor_driver *s_funcs;
- /* A list of listeners that are registered to receive data off of this sensor
+
+ /* Sensor last reading timestamp */
+ struct sensor_timestamp s_sts;
+
+ /* A list of listeners that are registered to receive data off of this
+ * sensor
*/
SLIST_HEAD(, sensor_listener) s_listener_list;
/* The next sensor in the global sensor list. */
http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/28531b95/hw/sensor/src/sensor.c
----------------------------------------------------------------------
diff --git a/hw/sensor/src/sensor.c b/hw/sensor/src/sensor.c
index 89a19df..cad73a6 100644
--- a/hw/sensor/src/sensor.c
+++ b/hw/sensor/src/sensor.c
@@ -27,6 +27,8 @@
#include "sensor/sensor.h"
#include "sensor_priv.h"
+#include "os/os_time.h"
+#include "os/os_cputime.h"
struct {
struct os_mutex mgr_lock;
@@ -42,6 +44,9 @@ struct sensor_read_ctx {
void *user_arg;
};
+struct sensor_timestamp sensor_base_ts;
+struct os_callout st_up_osco;
+
/**
* Lock sensor manager to access the list of sensors
*/
@@ -228,6 +233,48 @@ done:
}
/**
+ * Event that wakes up timestamp update procedure, this updates the base
+ * os_timeval in the global structure along with the base cputime
+ * @param OS event
+ */
+static void
+sensor_base_ts_update_event(struct os_event *ev)
+{
+ os_time_t ticks;
+ int rc;
+ struct os_timeval ostv;
+ struct os_timezone ostz;
+
+ ticks = os_time_get();
+
+ rc = os_gettimeofday(&ostv, &ostz);
+ if (rc) {
+ /* There is nothing we can do here
+ * just reset the timer frequently if we
+ * fail to get time, till then we will keep using
+ * old timestamp values.
+ */
+ ticks += OS_TICKS_PER_SEC * 600;
+ goto done;
+ }
+
+ /* CPU time gets wrapped in 4295 seconds since it is uint32_t,
+ * hence the hardcoded value of 3600 seconds, We want to make
+ * sure that the cputime never gets wrapped more than once.
+ * os_timeval usecs value gets wrapped in 2147 secs since it is int32_t.
+ * Hence, we take 2146 secs so that we update before it gets wrapped.
+ */
+ ticks += OS_TICKS_PER_SEC * 2146;
+
+ sensor_base_ts.st_ostv = ostv;
+ sensor_base_ts.st_ostz = ostz;
+ sensor_base_ts.st_cputime = os_cputime_get32();
+
+done:
+ os_callout_reset(&st_up_osco, ticks);
+}
+
+/**
* Get the current eventq, the system is misconfigured if there is still
* no parent eventq.
*/
@@ -237,12 +284,23 @@ sensor_mgr_evq_get(void)
return (sensor_mgr.mgr_eventq);
}
+void
+sensor_mgr_evq_set(struct os_eventq *evq)
+{
+ os_eventq_designate(&sensor_mgr.mgr_eventq, evq, NULL);
+}
+
static void
sensor_mgr_init(void)
{
+ struct os_timeval ostv;
+ struct os_timezone ostz;
+
memset(&sensor_mgr, 0, sizeof(sensor_mgr));
TAILQ_INIT(&sensor_mgr.mgr_sensor_list);
+ sensor_mgr_evq_set(os_eventq_dflt_get());
+
/**
* Initialize sensor polling callout and set it to fire on boot.
*/
@@ -250,6 +308,21 @@ sensor_mgr_init(void)
sensor_mgr_wakeup_event, NULL);
os_callout_reset(&sensor_mgr.mgr_wakeup_callout, 0);
+ /* Initialize sensor cputime update callout and set it to fire after an
+ * hour, CPU time gets wrapped in 4295 seconds,
+ * hence the hardcoded value of 3600 seconds, We make sure that the
+ * cputime never gets wrapped more than once.
+ */
+ os_gettimeofday(&ostv, &ostz);
+
+ sensor_base_ts.st_ostv = ostv;
+ sensor_base_ts.st_ostz = ostz;
+ sensor_base_ts.st_cputime = os_cputime_get32();
+
+ os_callout_init(&st_up_osco, sensor_mgr_evq_get(),
+ sensor_base_ts_update_event, NULL);
+ os_callout_reset(&st_up_osco, OS_TICKS_PER_SEC);
+
os_mutex_init(&sensor_mgr.mgr_lock);
}
@@ -535,6 +608,32 @@ sensor_read_data_func(struct sensor *sensor, void *arg, void *data)
}
}
+static void
+sensor_up_timestamp(struct sensor *sensor)
+{
+ uint32_t curr_ts_ticks;
+ uint32_t ts;
+
+ curr_ts_ticks = os_cputime_get32();
+
+ ts = os_cputime_ticks_to_usecs(curr_ts_ticks -
+ sensor_base_ts.st_cputime);
+
+ /* Updating cputime */
+ sensor_base_ts.st_cputime = sensor->s_sts.st_cputime = curr_ts_ticks;
+
+ /* Updating seconds */
+ sensor_base_ts.st_ostv.tv_sec = sensor_base_ts.st_ostv.tv_sec + (ts +
+ sensor_base_ts.st_ostv.tv_usec)/1000000;
+ sensor->s_sts.st_ostv.tv_sec = sensor_base_ts.st_ostv.tv_sec;
+
+ /* Updating Micro seconds */
+ sensor_base_ts.st_ostv.tv_usec =
+ (sensor_base_ts.st_ostv.tv_usec + ts)%1000000;
+ sensor->s_sts.st_ostv.tv_usec = sensor_base_ts.st_ostv.tv_usec;
+
+}
+
/**
* Read the data for sensor type "type," from the sensor, "sensor" and
* return the result into the "value" parameter.
@@ -562,8 +661,13 @@ sensor_read(struct sensor *sensor, sensor_type_t type,
src.user_func = data_func;
src.user_arg = arg;
+ sensor_up_timestamp(sensor);
+
rc = sensor->s_funcs->sd_read(sensor, type, sensor_read_data_func, &src,
timeout);
+ if (rc) {
+ goto done;
+ }
sensor_unlock(sensor);
http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/28531b95/hw/sensor/src/sensor_shell.c
----------------------------------------------------------------------
diff --git a/hw/sensor/src/sensor_shell.c b/hw/sensor/src/sensor_shell.c
index b1917ce..481e241 100644
--- a/hw/sensor/src/sensor_shell.c
+++ b/hw/sensor/src/sensor_shell.c
@@ -237,6 +237,11 @@ sensor_shell_read_listener(struct sensor *sensor, void *arg, void *data)
++ctx->num_entries;
+ console_printf("ts: [ secs: %ld usecs: %d cputime: %u ]\n",
+ (long int)sensor->s_sts.st_ostv.tv_sec,
+ (int)sensor->s_sts.st_ostv.tv_usec,
+ (unsigned int)sensor->s_sts.st_cputime);
+
if (ctx->type == SENSOR_TYPE_ACCELEROMETER ||
ctx->type == SENSOR_TYPE_LINEAR_ACCEL ||
ctx->type == SENSOR_TYPE_GRAVITY) {
@@ -331,7 +336,7 @@ sensor_shell_read_listener(struct sensor *sensor, void *arg, void *data)
console_printf("b = %u, ", scd->scd_b);
}
if (scd->scd_c_is_valid) {
- console_printf("c = %u, ", scd->scd_c);
+ console_printf("c = %u, \n", scd->scd_c);
}
if (scd->scd_lux_is_valid) {
console_printf("lux = %u, ", scd->scd_lux);
@@ -566,6 +571,7 @@ sensor_cmd_i2cscan(int argc, char **argv)
timeout = OS_TICKS_PER_SEC / 10;
+ rc = 0;
if (sensor_shell_stol(argv[2], 0, 0xf, &i2cnum)) {
console_printf("Invalid i2c interface:%s\n", argv[2]);
rc = SYS_EINVAL;
@@ -579,7 +585,11 @@ sensor_cmd_i2cscan(int argc, char **argv)
/* Scan all valid I2C addresses (0x08..0x77) */
for (addr = 0x08; addr < 0x78; addr++) {
+#ifndef ARCH_sim
rc = hal_i2c_master_probe((uint8_t)i2cnum, addr, timeout);
+#else
+ (void)timeout;
+#endif
/* Print addr header every 16 bytes */
if (!(addr % 16)) {
console_printf("\n%02x: ", addr);
@@ -629,15 +639,15 @@ sensor_cmd_exec(int argc, char **argv)
i = 4;
memset(&spd, 0, sizeof(struct sensor_poll_data));
- if (!strcmp(argv[i], "-n")) {
+ if (argv[i] && !strcmp(argv[i], "-n")) {
spd.spd_nsamples = atoi(argv[++i]);
i++;
}
- if (!strcmp(argv[i], "-i")) {
+ if (argv[i] && !strcmp(argv[i], "-i")) {
spd.spd_poll_itvl = atoi(argv[++i]);
i++;
}
- if (!strcmp(argv[i], "-d")) {
+ if (argv[i] && !strcmp(argv[i], "-d")) {
spd.spd_poll_duration = atoi(argv[++i]);
i++;
}