Skip to content

Commit 874efe2

Browse files
authored
Merge pull request #475 from alistair23/alistair/moisture
examples: sensors: Support moisture readings
2 parents c0202f9 + 0b1a550 commit 874efe2

File tree

7 files changed

+138
-0
lines changed

7 files changed

+138
-0
lines changed

examples/sensors/main.c

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33

44
#include <libtock-sync/sensors/ambient_light.h>
55
#include <libtock-sync/sensors/humidity.h>
6+
#include <libtock-sync/sensors/moisture.h>
67
#include <libtock-sync/sensors/ninedof.h>
78
#include <libtock-sync/sensors/proximity.h>
89
#include <libtock-sync/sensors/sound_pressure.h>
@@ -20,12 +21,14 @@ static bool ninedof_mag = false;
2021
static bool ninedof_gyro = false;
2122
static bool proximity = false;
2223
static bool sound_pressure = false;
24+
static bool moisture = false;
2325
static void alarm_cb(__attribute__ ((unused)) uint32_t now,
2426
__attribute__ ((unused)) uint32_t scheduled,
2527
__attribute__ ((unused)) void* opaque) {
2628
int lite = 0;
2729
int temp = 0;
2830
int humi = 0;
31+
int mois = 0;
2932
int ninedof_accel_x = 0, ninedof_accel_y = 0, ninedof_accel_z = 0;
3033
int ninedof_magneto_x = 0, ninedof_magneto_y = 0, ninedof_magneto_z = 0;
3134
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,
4144
if (ninedof_gyro) libtocksync_ninedof_read_gyroscope(&ninedof_gyro_x, &ninedof_gyro_y, &ninedof_gyro_z);
4245
if (proximity) libtocksync_proximity_read(&prox_reading);
4346
if (sound_pressure) libtocksync_sound_pressure_read(&sound_pressure_reading);
47+
if (moisture) libtocksync_moisture_read(&mois);
4448

4549
if (light) printf("Amb. Light: Light Intensity: %d\n", lite);
4650
if (temperature) printf("Temperature: %d deg C\n", temp/100);
@@ -50,6 +54,7 @@ static void alarm_cb(__attribute__ ((unused)) uint32_t now,
5054
if (ninedof_gyro) printf("Gyro: X: %d Y: %d Z: %d\n", ninedof_gyro_x, ninedof_gyro_y, ninedof_gyro_z);
5155
if (proximity) printf("Proximity: %u\n", prox_reading);
5256
if (sound_pressure) printf("Sound Pressure: %u\n", sound_pressure_reading);
57+
if (moisture) printf("Moisture: %d%%\n", mois/100);
5358

5459
/* *INDENT-ON* */
5560

@@ -68,6 +73,7 @@ int main(void) {
6873
ninedof = libtock_ninedof_exists();
6974
proximity = libtock_proximity_exists();
7075
sound_pressure = libtock_sound_pressure_exists();
76+
moisture = libtock_moisture_exists();
7177
/* *INDENT-ON* */
7278

7379
if (ninedof) {
@@ -86,6 +92,7 @@ int main(void) {
8692
if (ninedof_gyro) printf("[Sensors] Sampling Gyroscope.\n");
8793
if (proximity) printf("[Sensors] Sampling Proximity sensor.\n");
8894
if (sound_pressure) printf("[Sensors] Sampling Sound Pressure sensor.\n");
95+
if (moisture) printf("[Sensors] Sampling Moisture sensor.\n");
8996
/* *INDENT-ON* */
9097

9198
if (sound_pressure) {

libtock-sync/sensors/moisture.c

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
#include "moisture.h"
2+
3+
typedef struct {
4+
int moisture;
5+
returncode_t ret;
6+
bool fired;
7+
} moisture_result_t;
8+
9+
static moisture_result_t result = {.fired = false};
10+
11+
// callback for synchronous reads
12+
static void moisture_callback(returncode_t ret, int moisture) {
13+
result.moisture = moisture;
14+
result.ret = ret;
15+
result.fired = true;
16+
}
17+
18+
returncode_t libtocksync_moisture_read(int* moisture) {
19+
returncode_t err;
20+
21+
result.fired = false;
22+
23+
err = libtock_moisture_read(moisture_callback);
24+
if (err != RETURNCODE_SUCCESS) return err;
25+
26+
yield_for(&result.fired);
27+
if (result.ret != RETURNCODE_SUCCESS) return result.ret;
28+
29+
*moisture = result.moisture;
30+
31+
return RETURNCODE_SUCCESS;
32+
}

libtock-sync/sensors/moisture.h

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
#pragma once
2+
3+
#include <libtock/sensors/moisture.h>
4+
#include <libtock/tock.h>
5+
6+
#ifdef __cplusplus
7+
extern "C" {
8+
#endif
9+
10+
// Read the moisture sensor synchronously.
11+
//
12+
// ## Arguments
13+
//
14+
// - `moisture`: Set to the moisture in hundredths of a percent.
15+
//
16+
// ## Return Value
17+
//
18+
// A returncode indicating whether the sensor read was completed successfully.
19+
returncode_t libtocksync_moisture_read(int* moisture);
20+
21+
#ifdef __cplusplus
22+
}
23+
#endif

libtock/sensors/moisture.c

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
#include "moisture.h"
2+
3+
static void moisture_upcall(int status,
4+
int moisture,
5+
__attribute__ ((unused)) int unused2, void* opaque) {
6+
libtock_moisture_callback cb = (libtock_moisture_callback) opaque;
7+
cb(status, moisture);
8+
}
9+
10+
returncode_t libtock_moisture_read(libtock_moisture_callback cb) {
11+
returncode_t err;
12+
13+
err = libtock_moisture_set_upcall(moisture_upcall, cb);
14+
if (err != RETURNCODE_SUCCESS) return err;
15+
16+
err = libtock_moisture_command_read();
17+
return err;
18+
}

libtock/sensors/moisture.h

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
#pragma once
2+
3+
#include "../tock.h"
4+
#include "syscalls/moisture_syscalls.h"
5+
6+
#ifdef __cplusplus
7+
extern "C" {
8+
#endif
9+
10+
// Function signature for moisture data callback.
11+
//
12+
// - `arg1` (`int`): Returncode indicating status from sampling the sensor.
13+
// - `arg2` (`int`): moisture in hundredths of percent.
14+
typedef void (*libtock_moisture_callback)(returncode_t, int);
15+
16+
// Start a moisture measurement. The reading will be provided via the callback.
17+
returncode_t libtock_moisture_read(libtock_moisture_callback cb);
18+
19+
#ifdef __cplusplus
20+
}
21+
#endif
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
#include "moisture_syscalls.h"
2+
3+
bool libtock_moisture_exists(void) {
4+
return driver_exists(DRIVER_NUM_MOISTURE);
5+
}
6+
7+
returncode_t libtock_moisture_set_upcall(subscribe_upcall callback, void* opaque) {
8+
subscribe_return_t sval = subscribe(DRIVER_NUM_MOISTURE, 0, callback, opaque);
9+
return tock_subscribe_return_to_returncode(sval);
10+
}
11+
12+
returncode_t libtock_moisture_command_read(void) {
13+
syscall_return_t rval = command(DRIVER_NUM_MOISTURE, 1, 0, 0);
14+
return tock_command_return_novalue_to_returncode(rval);
15+
}
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
#pragma once
2+
3+
#include "../../tock.h"
4+
5+
#ifdef __cplusplus
6+
extern "C" {
7+
#endif
8+
9+
#define DRIVER_NUM_MOISTURE 0x6000A
10+
11+
// Check if the moisture driver is installed.
12+
bool libtock_moisture_exists(void);
13+
14+
// Configure the upcall for when the reading is ready.
15+
returncode_t libtock_moisture_set_upcall(subscribe_upcall callback, void* opaque);
16+
17+
// Read the sensor.
18+
returncode_t libtock_moisture_command_read(void);
19+
20+
#ifdef __cplusplus
21+
}
22+
#endif

0 commit comments

Comments
 (0)