From 4b6027e8b62f7934f51e3a2bc74172af0bd9e884 Mon Sep 17 00:00:00 2001 From: Alistair Francis Date: Tue, 12 Nov 2024 13:34:02 +1000 Subject: [PATCH 1/2] libtock: sensors: Support moisture sensor Signed-off-by: Alistair Francis --- libtock-sync/sensors/moisture.c | 32 ++++++++++++++++++++ libtock-sync/sensors/moisture.h | 23 ++++++++++++++ libtock/sensors/moisture.c | 18 +++++++++++ libtock/sensors/moisture.h | 21 +++++++++++++ libtock/sensors/syscalls/moisture_syscalls.c | 15 +++++++++ libtock/sensors/syscalls/moisture_syscalls.h | 22 ++++++++++++++ 6 files changed, 131 insertions(+) create mode 100644 libtock-sync/sensors/moisture.c create mode 100644 libtock-sync/sensors/moisture.h create mode 100644 libtock/sensors/moisture.c create mode 100644 libtock/sensors/moisture.h create mode 100644 libtock/sensors/syscalls/moisture_syscalls.c create mode 100644 libtock/sensors/syscalls/moisture_syscalls.h diff --git a/libtock-sync/sensors/moisture.c b/libtock-sync/sensors/moisture.c new file mode 100644 index 000000000..a0064d2c1 --- /dev/null +++ b/libtock-sync/sensors/moisture.c @@ -0,0 +1,32 @@ +#include "moisture.h" + +typedef struct { + int moisture; + returncode_t ret; + bool fired; +} moisture_result_t; + +static moisture_result_t result = {.fired = false}; + +// callback for synchronous reads +static void moisture_callback(returncode_t ret, int moisture) { + result.moisture = moisture; + result.ret = ret; + result.fired = true; +} + +returncode_t libtocksync_moisture_read(int* moisture) { + returncode_t err; + + result.fired = false; + + err = libtock_moisture_read(moisture_callback); + if (err != RETURNCODE_SUCCESS) return err; + + yield_for(&result.fired); + if (result.ret != RETURNCODE_SUCCESS) return result.ret; + + *moisture = result.moisture; + + return RETURNCODE_SUCCESS; +} diff --git a/libtock-sync/sensors/moisture.h b/libtock-sync/sensors/moisture.h new file mode 100644 index 000000000..a9e7eaa16 --- /dev/null +++ b/libtock-sync/sensors/moisture.h @@ -0,0 +1,23 @@ +#pragma once + +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +// Read the moisture sensor synchronously. +// +// ## Arguments +// +// - `moisture`: Set to the moisture in hundredths of a percent. +// +// ## Return Value +// +// A returncode indicating whether the sensor read was completed successfully. +returncode_t libtocksync_moisture_read(int* moisture); + +#ifdef __cplusplus +} +#endif \ No newline at end of file diff --git a/libtock/sensors/moisture.c b/libtock/sensors/moisture.c new file mode 100644 index 000000000..eaca910be --- /dev/null +++ b/libtock/sensors/moisture.c @@ -0,0 +1,18 @@ +#include "moisture.h" + +static void moisture_upcall(int status, + int moisture, + __attribute__ ((unused)) int unused2, void* opaque) { + libtock_moisture_callback cb = (libtock_moisture_callback) opaque; + cb(status, moisture); +} + +returncode_t libtock_moisture_read(libtock_moisture_callback cb) { + returncode_t err; + + err = libtock_moisture_set_upcall(moisture_upcall, cb); + if (err != RETURNCODE_SUCCESS) return err; + + err = libtock_moisture_command_read(); + return err; +} diff --git a/libtock/sensors/moisture.h b/libtock/sensors/moisture.h new file mode 100644 index 000000000..7e1499543 --- /dev/null +++ b/libtock/sensors/moisture.h @@ -0,0 +1,21 @@ +#pragma once + +#include "../tock.h" +#include "syscalls/moisture_syscalls.h" + +#ifdef __cplusplus +extern "C" { +#endif + +// Function signature for moisture data callback. +// +// - `arg1` (`int`): Returncode indicating status from sampling the sensor. +// - `arg2` (`int`): moisture in hundredths of percent. +typedef void (*libtock_moisture_callback)(returncode_t, int); + +// Start a moisture measurement. The reading will be provided via the callback. +returncode_t libtock_moisture_read(libtock_moisture_callback cb); + +#ifdef __cplusplus +} +#endif diff --git a/libtock/sensors/syscalls/moisture_syscalls.c b/libtock/sensors/syscalls/moisture_syscalls.c new file mode 100644 index 000000000..a4a5ca52c --- /dev/null +++ b/libtock/sensors/syscalls/moisture_syscalls.c @@ -0,0 +1,15 @@ +#include "moisture_syscalls.h" + +bool libtock_moisture_exists(void) { + return driver_exists(DRIVER_NUM_MOISTURE); +} + +returncode_t libtock_moisture_set_upcall(subscribe_upcall callback, void* opaque) { + subscribe_return_t sval = subscribe(DRIVER_NUM_MOISTURE, 0, callback, opaque); + return tock_subscribe_return_to_returncode(sval); +} + +returncode_t libtock_moisture_command_read(void) { + syscall_return_t rval = command(DRIVER_NUM_MOISTURE, 1, 0, 0); + return tock_command_return_novalue_to_returncode(rval); +} diff --git a/libtock/sensors/syscalls/moisture_syscalls.h b/libtock/sensors/syscalls/moisture_syscalls.h new file mode 100644 index 000000000..465781243 --- /dev/null +++ b/libtock/sensors/syscalls/moisture_syscalls.h @@ -0,0 +1,22 @@ +#pragma once + +#include "../../tock.h" + +#ifdef __cplusplus +extern "C" { +#endif + +#define DRIVER_NUM_MOISTURE 0x6000A + +// Check if the moisture driver is installed. +bool libtock_moisture_exists(void); + +// Configure the upcall for when the reading is ready. +returncode_t libtock_moisture_set_upcall(subscribe_upcall callback, void* opaque); + +// Read the sensor. +returncode_t libtock_moisture_command_read(void); + +#ifdef __cplusplus +} +#endif From 0b1a550ea9eaac5d15f202b10cb65d004d93fd21 Mon Sep 17 00:00:00 2001 From: Alistair Francis Date: Thu, 14 Nov 2024 09:40:57 +1000 Subject: [PATCH 2/2] examples: sensors: Add moisture support Signed-off-by: Alistair Francis --- examples/sensors/main.c | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/examples/sensors/main.c b/examples/sensors/main.c index f674dba38..3d88df11a 100644 --- a/examples/sensors/main.c +++ b/examples/sensors/main.c @@ -3,6 +3,7 @@ #include #include +#include #include #include #include @@ -20,12 +21,14 @@ static bool ninedof_mag = false; static bool ninedof_gyro = false; static bool proximity = false; static bool sound_pressure = false; +static bool moisture = false; static void alarm_cb(__attribute__ ((unused)) uint32_t now, __attribute__ ((unused)) uint32_t scheduled, __attribute__ ((unused)) void* opaque) { int lite = 0; int temp = 0; int humi = 0; + int mois = 0; int ninedof_accel_x = 0, ninedof_accel_y = 0, ninedof_accel_z = 0; int ninedof_magneto_x = 0, ninedof_magneto_y = 0, ninedof_magneto_z = 0; int ninedof_gyro_x = 0, ninedof_gyro_y = 0, ninedof_gyro_z = 0; @@ -41,6 +44,7 @@ static void alarm_cb(__attribute__ ((unused)) uint32_t now, if (ninedof_gyro) libtocksync_ninedof_read_gyroscope(&ninedof_gyro_x, &ninedof_gyro_y, &ninedof_gyro_z); if (proximity) libtocksync_proximity_read(&prox_reading); if (sound_pressure) libtocksync_sound_pressure_read(&sound_pressure_reading); + if (moisture) libtocksync_moisture_read(&mois); if (light) printf("Amb. Light: Light Intensity: %d\n", lite); if (temperature) printf("Temperature: %d deg C\n", temp/100); @@ -50,6 +54,7 @@ static void alarm_cb(__attribute__ ((unused)) uint32_t now, if (ninedof_gyro) printf("Gyro: X: %d Y: %d Z: %d\n", ninedof_gyro_x, ninedof_gyro_y, ninedof_gyro_z); if (proximity) printf("Proximity: %u\n", prox_reading); if (sound_pressure) printf("Sound Pressure: %u\n", sound_pressure_reading); + if (moisture) printf("Moisture: %d%%\n", mois/100); /* *INDENT-ON* */ @@ -68,6 +73,7 @@ int main(void) { ninedof = libtock_ninedof_exists(); proximity = libtock_proximity_exists(); sound_pressure = libtock_sound_pressure_exists(); + moisture = libtock_moisture_exists(); /* *INDENT-ON* */ if (ninedof) { @@ -86,6 +92,7 @@ int main(void) { if (ninedof_gyro) printf("[Sensors] Sampling Gyroscope.\n"); if (proximity) printf("[Sensors] Sampling Proximity sensor.\n"); if (sound_pressure) printf("[Sensors] Sampling Sound Pressure sensor.\n"); + if (moisture) printf("[Sensors] Sampling Moisture sensor.\n"); /* *INDENT-ON* */ if (sound_pressure) {