|
| 1 | +#include <libtock/defer.h> |
1 | 2 | #include <libtock/interface/syscalls/console_syscalls.h> |
2 | 3 |
|
3 | 4 | #include "console.h" |
4 | 5 |
|
5 | | -struct console_result { |
6 | | - bool fired; |
7 | | - int length; |
8 | | - returncode_t result; |
9 | | -}; |
10 | | - |
11 | | -static struct console_result result = { .fired = false }; |
12 | | - |
13 | | -static void generic_cb(returncode_t ret, uint32_t length) { |
14 | | - result.length = length; |
15 | | - result.fired = true; |
16 | | - result.result = ret; |
17 | | -} |
| 6 | +#include "syscalls/console_syscalls.h" |
18 | 7 |
|
19 | 8 | bool libtocksync_console_exists(void) { |
20 | 9 | return libtock_console_driver_exists(); |
21 | 10 | } |
22 | 11 |
|
23 | | -returncode_t libtocksync_console_write(const uint8_t* buffer, uint32_t length, int* written) { |
24 | | - int err; |
25 | | - result.fired = false; |
| 12 | +returncode_t libtocksync_console_write(const uint8_t* buffer, uint32_t length, uint32_t* written) { |
| 13 | + returncode_t ret; |
26 | 14 |
|
27 | | - err = libtock_console_write(buffer, length, &generic_cb); |
28 | | - if (err != RETURNCODE_SUCCESS) return err; |
| 15 | + ret = libtock_console_set_read_allow(buffer, length); |
| 16 | + if (ret != RETURNCODE_SUCCESS) return ret; |
| 17 | + defer { libtock_console_set_read_allow(NULL, 0); |
| 18 | + }; |
29 | 19 |
|
30 | | - // Wait for the callback. |
31 | | - yield_for(&result.fired); |
32 | | - if (result.result != RETURNCODE_SUCCESS) return result.result; |
| 20 | + ret = libtock_console_command_write(length); |
| 21 | + if (ret != RETURNCODE_SUCCESS) return ret; |
33 | 22 |
|
34 | | - *written = result.length; |
35 | | - return RETURNCODE_SUCCESS; |
| 23 | + ret = libtocksync_console_yield_wait_for_write(written); |
| 24 | + return ret; |
36 | 25 | } |
37 | 26 |
|
38 | | -returncode_t libtocksync_console_read(uint8_t* buffer, uint32_t length, int* read) { |
39 | | - int err; |
40 | | - result.fired = false; |
41 | 27 |
|
42 | | - err = libtock_console_read(buffer, length, &generic_cb); |
43 | | - if (err != RETURNCODE_SUCCESS) return err; |
| 28 | +returncode_t libtocksync_console_read(uint8_t* buffer, uint32_t length, uint32_t* read) { |
| 29 | + returncode_t ret; |
| 30 | + |
| 31 | + ret = libtock_console_set_readwrite_allow(buffer, length); |
| 32 | + if (ret != RETURNCODE_SUCCESS) return ret; |
| 33 | + defer { libtock_console_set_readwrite_allow(NULL, 0); |
| 34 | + }; |
44 | 35 |
|
45 | | - // Wait for the callback. |
46 | | - yield_for(&result.fired); |
47 | | - if (result.result != RETURNCODE_SUCCESS) return result.result; |
| 36 | + ret = libtock_console_command_read(length); |
| 37 | + if (ret != RETURNCODE_SUCCESS) return ret; |
48 | 38 |
|
49 | | - *read = result.length; |
50 | | - return RETURNCODE_SUCCESS; |
| 39 | + ret = libtocksync_console_yield_wait_for_write(read); |
| 40 | + return ret; |
51 | 41 | } |
0 commit comments