Tasmota/lib/libesp32/RadioLib/examples/NonArduino/Tock/libtock-c/libtock/temperature.c
2024-02-23 16:20:09 +01:00

48 lines
1.2 KiB
C

#include "temperature.h"
#include "tock.h"
struct data {
bool fired;
int temp;
};
static struct data result = { .fired = false };
// Internal upcall for faking synchronous reads
static void temp_upcall(int temp,
__attribute__ ((unused)) int unused,
__attribute__ ((unused)) int unused1,
void* ud) {
struct data* data = (struct data*) ud;
data->temp = temp;
data->fired = true;
}
int temperature_set_callback(subscribe_upcall callback, void* callback_args) {
subscribe_return_t sval = subscribe(DRIVER_NUM_TEMPERATURE, 0, callback, callback_args);
return tock_subscribe_return_to_returncode(sval);
}
int temperature_read(void) {
syscall_return_t cval = command(DRIVER_NUM_TEMPERATURE, 1, 0, 0);
return tock_command_return_novalue_to_returncode(cval);
}
int temperature_read_sync(int* temperature) {
int err;
result.fired = false;
err = temperature_set_callback(temp_upcall, (void*) &result);
if (err < 0) return err;
err = temperature_read();
if (err < 0) return err;
// Wait for the callback.
yield_for(&result.fired);
*temperature = result.temp;
return RETURNCODE_SUCCESS;
}