diff --git a/include/mgos_barometer.h b/include/mgos_barometer.h index f98f91d..44eab77 100644 --- a/include/mgos_barometer.h +++ b/include/mgos_barometer.h @@ -30,11 +30,23 @@ enum mgos_barometer_type { struct mgos_barometer; +struct mgos_barometer_stats { + double last_read_time; // value of mg_time() upon last call to _read() + uint32_t read; // calls to _read() + uint32_t read_success; // successful _read() + uint32_t read_success_cached; // calls to _read() which were cached + // Note: read_errors := read - read_success - read_success_cached + double read_success_usecs; // time spent in successful uncached _read() +}; + struct mgos_barometer *mgos_barometer_create_i2c(struct mgos_i2c *i2c, uint8_t i2caddr, enum mgos_barometer_type type); void mgos_barometer_destroy(struct mgos_barometer **sensor); bool mgos_barometer_has_thermometer(struct mgos_barometer *sensor); bool mgos_barometer_has_barometer(struct mgos_barometer *sensor); +/* Set cache TTL -- will limit reads and return cached data. Set msecs=0 to turn off */ +bool mgos_barometer_set_cache_ttl(struct mgos_barometer *sensor, uint16_t msecs); + /* Read all available sensor data from the IMU */ bool mgos_barometer_read(struct mgos_barometer *sensor); @@ -44,6 +56,12 @@ bool mgos_barometer_get_pressure(struct mgos_barometer *sensor, float *p); /* Return temperature data in units of Celcius */ bool mgos_barometer_get_temperature(struct mgos_barometer *sensor, float *t); +/* + * Return statistics on the sensor. + */ +bool mgos_barometer_get_stats(struct mgos_barometer *sensor, struct mgos_barometer_stats *stats); + + /* * Initialization function for MGOS -- currently a noop. */ diff --git a/src/main.c b/src/main.c index 4374ff0..6485d44 100644 --- a/src/main.c +++ b/src/main.c @@ -217,6 +217,8 @@ int main() { */ if (!(baro=mgos_barometer_create_i2c(i2c, 0x60, BARO_MPL115))) { LOG(LL_ERROR, ("Cannot create MPL115 barometer")); + } else { + mgos_barometer_set_cache_ttl(baro, 5000); } for (;;) { diff --git a/src/mgos_barometer.c b/src/mgos_barometer.c index 81fea2e..4958768 100644 --- a/src/mgos_barometer.c +++ b/src/mgos_barometer.c @@ -87,9 +87,25 @@ bool mgos_barometer_has_barometer(struct mgos_barometer *sensor) { } bool mgos_barometer_read(struct mgos_barometer *sensor) { + double start = mg_time(); + bool ret = false; + if (!sensor) return false; if (!sensor->read) return false; - return sensor->read(sensor); + + sensor->stats.read++; + if (1000*(start - sensor->stats.last_read_time) < sensor->cache_ttl_ms) { + sensor->stats.read_success_cached++; + return true; + } + + ret = sensor->read(sensor); + if (ret) { + sensor->stats.read_success++; + sensor->stats.read_success_usecs += 1000000 * (mg_time() - start); + sensor->stats.last_read_time = start; + } + return ret; } bool mgos_barometer_get_pressure(struct mgos_barometer *sensor, float *p) { @@ -106,6 +122,22 @@ bool mgos_barometer_get_temperature(struct mgos_barometer *sensor, float *t) { return true; } +bool mgos_barometer_set_cache_ttl(struct mgos_barometer *sensor, uint16_t msecs) { + if (!sensor) return false; + sensor->cache_ttl_ms = msecs; + return true; +} + +bool mgos_barometer_get_stats(struct mgos_barometer *sensor, struct mgos_barometer_stats *stats) { + if (!sensor || !stats) { + return false; + } + + memcpy((void *)stats, (const void *)&sensor->stats, sizeof(struct mgos_barometer_stats)); + return true; +} + + bool mgos_barometer_init(void) { return true; } diff --git a/src/mgos_barometer_internal.h b/src/mgos_barometer_internal.h index 33d6ec5..ba07743 100644 --- a/src/mgos_barometer_internal.h +++ b/src/mgos_barometer_internal.h @@ -32,6 +32,7 @@ typedef bool (*mgos_barometer_mag_read_fn)(struct mgos_barometer *dev); struct mgos_barometer { struct mgos_i2c * i2c; uint8_t i2caddr; + uint16_t cache_ttl_ms; enum mgos_barometer_type type; bool has_thermometer; bool has_barometer; @@ -45,6 +46,8 @@ struct mgos_barometer { float pressure; // in Pascals float temperature; // in Celcius + + struct mgos_barometer_stats stats; }; #ifdef __cplusplus diff --git a/src/mgos_barometer_mpl115.c b/src/mgos_barometer_mpl115.c index e7a6e82..b3e1ed5 100644 --- a/src/mgos_barometer_mpl115.c +++ b/src/mgos_barometer_mpl115.c @@ -12,6 +12,7 @@ bool mgos_barometer_mpl115_create(struct mgos_barometer *dev) { mpl115_data=calloc(1, sizeof(struct mgos_barometer_mpl115_data)); if (!mpl115_data) return false; + // TODO(pim): fix this -- math is wrong. mpl115_data->a0=(float)(((uint16_t) data[0] << 8) | data[1]) / 8.0; mpl115_data->b1=(float)(((uint16_t) data[2] << 8) | data[3]) / 8192.0; mpl115_data->b2=(float)(((uint16_t) data[4] << 8) | data[5]) / 16384.0;