diff --git a/examples/ble-uart/main.c b/examples/ble-uart/main.c index 2a1db7bf2..2095fecaa 100644 --- a/examples/ble-uart/main.c +++ b/examples/ble-uart/main.c @@ -62,7 +62,7 @@ void ble_evt_user_handler(ble_evt_t* p_ble_evt) { // This gets called with the serial data from the BLE central. static void nus_data_handler(ble_nus_t* p_nus, uint8_t* p_data, uint16_t length) { UNUSED_PARAMETER(p_nus); - int bytes_written; + uint32_t bytes_written; // In this app, just print it to the console. libtocksync_console_write(p_data, length, &bytes_written); diff --git a/examples/i2c-usb-bridge/main.c b/examples/i2c-usb-bridge/main.c index b0771ee30..0b6aad3d1 100644 --- a/examples/i2c-usb-bridge/main.c +++ b/examples/i2c-usb-bridge/main.c @@ -14,13 +14,13 @@ uint8_t send_buf[DATA_LEN]; static int getch(void) { uint8_t buffer[1]; - int number_read; + uint32_t number_read; libtocksync_console_read(buffer, 1, &number_read); return buffer[0]; } -static int putnstr(char* str, int len) { - int number_written; +static uint32_t putnstr(char* str, int len) { + uint32_t number_written; libtocksync_console_read((uint8_t*) str, len, &number_written); return number_written; } diff --git a/examples/tests/console/console/main.c b/examples/tests/console/console/main.c index 61b5f43bc..44a87f3a5 100644 --- a/examples/tests/console/console/main.c +++ b/examples/tests/console/console/main.c @@ -7,7 +7,7 @@ static int getch(void) { uint8_t buffer[1]; - int number_read; + uint32_t number_read; libtocksync_console_read(buffer, 1, &number_read); return buffer[0]; } diff --git a/examples/tests/console/console_recv_long/main.c b/examples/tests/console/console_recv_long/main.c index 2a3d5afa6..6f53fdf16 100644 --- a/examples/tests/console/console_recv_long/main.c +++ b/examples/tests/console/console_recv_long/main.c @@ -5,7 +5,7 @@ uint8_t buf[100]; int main(void) { - int number_read; + uint32_t number_read; int ret = libtocksync_console_read(buf, 61, &number_read); if (ret != RETURNCODE_SUCCESS) { printf("[SHORT] Error doing UART receive: %i\n", ret); @@ -13,7 +13,7 @@ int main(void) { } printf("\n\nconsole_recv_long: "); - for (int i = 0; i < number_read; i++) { + for (uint32_t i = 0; i < number_read; i++) { printf("%c", buf[i]); } printf("\n"); diff --git a/examples/tests/console/console_recv_short/main.c b/examples/tests/console/console_recv_short/main.c index 97a3569ca..5c74a7934 100644 --- a/examples/tests/console/console_recv_short/main.c +++ b/examples/tests/console/console_recv_short/main.c @@ -5,7 +5,7 @@ uint8_t buf[100]; int main(void) { - int number_read; + uint32_t number_read; int ret = libtocksync_console_read(buf, 11, &number_read); if (ret != RETURNCODE_SUCCESS) { printf("[SHORT] Error doing UART receive: %i\n", ret); @@ -13,7 +13,7 @@ int main(void) { } printf("\n\nconsole_recv_short: "); - for (int i = 0; i < number_read; i++) { + for (uint32_t i = 0; i < number_read; i++) { printf("%c", buf[i]); } printf("\n"); diff --git a/examples/tests/kv/kv_interactive/main.c b/examples/tests/kv/kv_interactive/main.c index 42b4c319f..5ee88449b 100644 --- a/examples/tests/kv/kv_interactive/main.c +++ b/examples/tests/kv/kv_interactive/main.c @@ -17,7 +17,7 @@ char read_buf[DATA_LEN]; static int getch(void) { uint8_t buffer[1]; - int number_read; + uint32_t number_read; libtocksync_console_read(buffer, 1, &number_read); return buffer[0]; } diff --git a/examples/tests/number_guess_game/main.c b/examples/tests/number_guess_game/main.c index 394db999d..bc1ae9708 100644 --- a/examples/tests/number_guess_game/main.c +++ b/examples/tests/number_guess_game/main.c @@ -8,13 +8,13 @@ static int getch(void) { uint8_t buffer[1]; - int number_read; + uint32_t number_read; libtocksync_console_read(buffer, 1, &number_read); return buffer[0]; } -static int putnstr(const char* str, int len) { - int number_written; +static uint32_t putnstr(const char* str, int len) { + uint32_t number_written; libtocksync_console_read((uint8_t*) str, len, &number_written); return number_written; } diff --git a/libtock-sync/interface/console.c b/libtock-sync/interface/console.c index 28945d424..a1568f023 100644 --- a/libtock-sync/interface/console.c +++ b/libtock-sync/interface/console.c @@ -1,51 +1,41 @@ +#include #include #include "console.h" -struct console_result { - bool fired; - int length; - returncode_t result; -}; - -static struct console_result result = { .fired = false }; - -static void generic_cb(returncode_t ret, uint32_t length) { - result.length = length; - result.fired = true; - result.result = ret; -} +#include "syscalls/console_syscalls.h" bool libtocksync_console_exists(void) { return libtock_console_driver_exists(); } -returncode_t libtocksync_console_write(const uint8_t* buffer, uint32_t length, int* written) { - int err; - result.fired = false; +returncode_t libtocksync_console_write(const uint8_t* buffer, uint32_t length, uint32_t* written) { + returncode_t ret; - err = libtock_console_write(buffer, length, &generic_cb); - if (err != RETURNCODE_SUCCESS) return err; + ret = libtock_console_set_read_allow(buffer, length); + if (ret != RETURNCODE_SUCCESS) return ret; + defer { libtock_console_set_read_allow(NULL, 0); + }; - // Wait for the callback. - yield_for(&result.fired); - if (result.result != RETURNCODE_SUCCESS) return result.result; + ret = libtock_console_command_write(length); + if (ret != RETURNCODE_SUCCESS) return ret; - *written = result.length; - return RETURNCODE_SUCCESS; + ret = libtocksync_console_yield_wait_for_write(written); + return ret; } -returncode_t libtocksync_console_read(uint8_t* buffer, uint32_t length, int* read) { - int err; - result.fired = false; - err = libtock_console_read(buffer, length, &generic_cb); - if (err != RETURNCODE_SUCCESS) return err; +returncode_t libtocksync_console_read(uint8_t* buffer, uint32_t length, uint32_t* read) { + returncode_t ret; + + ret = libtock_console_set_readwrite_allow(buffer, length); + if (ret != RETURNCODE_SUCCESS) return ret; + defer { libtock_console_set_readwrite_allow(NULL, 0); + }; - // Wait for the callback. - yield_for(&result.fired); - if (result.result != RETURNCODE_SUCCESS) return result.result; + ret = libtock_console_command_read(length); + if (ret != RETURNCODE_SUCCESS) return ret; - *read = result.length; - return RETURNCODE_SUCCESS; + ret = libtocksync_console_yield_wait_for_write(read); + return ret; } diff --git a/libtock-sync/interface/console.h b/libtock-sync/interface/console.h index c752000d2..8118c713f 100644 --- a/libtock-sync/interface/console.h +++ b/libtock-sync/interface/console.h @@ -1,6 +1,5 @@ #pragma once -#include #include #ifdef __cplusplus @@ -9,9 +8,9 @@ extern "C" { bool libtocksync_console_exists(void); -returncode_t libtocksync_console_write(const uint8_t* buffer, uint32_t length, int* written); +returncode_t libtocksync_console_write(const uint8_t* buffer, uint32_t length, uint32_t* written); -returncode_t libtocksync_console_read(uint8_t* buffer, uint32_t length, int* read); +returncode_t libtocksync_console_read(uint8_t* buffer, uint32_t length, uint32_t* read); #ifdef __cplusplus } diff --git a/libtock-sync/interface/syscalls/console_syscalls.c b/libtock-sync/interface/syscalls/console_syscalls.c new file mode 100644 index 000000000..88ee29a3e --- /dev/null +++ b/libtock-sync/interface/syscalls/console_syscalls.c @@ -0,0 +1,19 @@ +#include "console_syscalls.h" + +returncode_t libtocksync_console_yield_wait_for_write(uint32_t* bytes_written) { + yield_waitfor_return_t ret; + ret = yield_wait_for(DRIVER_NUM_CONSOLE, 1); + + *bytes_written = ret.data1; + + return (returncode_t) ret.data0; +} + +returncode_t libtocksync_console_yield_wait_for_read(uint32_t* bytes_read) { + yield_waitfor_return_t ret; + ret = yield_wait_for(DRIVER_NUM_CONSOLE, 2); + + *bytes_read = ret.data1; + + return (returncode_t) ret.data0; +} diff --git a/libtock-sync/interface/syscalls/console_syscalls.h b/libtock-sync/interface/syscalls/console_syscalls.h new file mode 100644 index 000000000..44365ba71 --- /dev/null +++ b/libtock-sync/interface/syscalls/console_syscalls.h @@ -0,0 +1,15 @@ +#pragma once + +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +returncode_t libtocksync_console_yield_wait_for_write(uint32_t* bytes_written); +returncode_t libtocksync_console_yield_wait_for_read(uint32_t* bytes_read); + +#ifdef __cplusplus +} +#endif diff --git a/libtock-sync/sys.c b/libtock-sync/sys.c index a26a1cafd..45c59e356 100644 --- a/libtock-sync/sys.c +++ b/libtock-sync/sys.c @@ -12,7 +12,7 @@ // ------------------------------ int _write(__attribute__ ((unused)) int fd, const void* buf, uint32_t count) { - int written; + uint32_t written; libtocksync_console_write((const uint8_t*) buf, count, &written); - return written; + return (int) written; } diff --git a/libtock/interface/console.h b/libtock/interface/console.h index 608e76331..742c5f6e1 100644 --- a/libtock/interface/console.h +++ b/libtock/interface/console.h @@ -8,12 +8,12 @@ extern "C" { // Function signature for write done callbacks. // -// - `length` (`int`): Number of bytes written +// - `length` (`uint32_t`): Number of bytes written typedef void (*libtock_console_callback_write)(returncode_t, uint32_t); // Function signature for read done callbacks. // -// - `length` (`int`): Number of bytes read +// - `length` (`uint32_t`): Number of bytes read typedef void (*libtock_console_callback_read)(returncode_t, uint32_t); // Check if the driver exists.