|
| 1 | +#include <libtock/defer.h> |
1 | 2 | #include <libtock/peripherals/syscalls/adc_syscalls.h> |
2 | 3 |
|
3 | 4 | #include "adc.h" |
4 | 5 |
|
5 | | -// used for creating synchronous versions of functions |
6 | | -// |
7 | | -// fired - set when the callback has been called |
8 | | -// channel - channel that the collected sample corresponds to |
9 | | -// sample - collected sample value, valid if single sample operation |
10 | | -// length - number of collected sample values, valid if multiple sample |
11 | | -// operation |
12 | | -// buffer - pointer to buffer filled with samples, valid if multiple sample |
13 | | -// operation |
14 | | -// error - set to FAIL if an invalid callback type is detected |
15 | | -struct adc_data { |
16 | | - bool fired; |
17 | | - uint8_t channel; |
18 | | - uint16_t sample; |
19 | | - uint32_t length; |
20 | | - uint16_t* buffer; |
21 | | - int error; |
22 | | -}; |
| 6 | +#include "syscalls/adc_syscalls.h" |
23 | 7 |
|
24 | | -static struct adc_data result; |
25 | | - |
26 | | - |
27 | | -static void sample(uint8_t channel, uint16_t sample) { |
28 | | - result.fired = true; |
29 | | - result.channel = channel; |
30 | | - result.sample = sample; |
| 8 | +bool libtocksync_adc_exists(void) { |
| 9 | + return libtock_adc_driver_exists(); |
31 | 10 | } |
32 | 11 |
|
33 | | -static void buffered_sample(uint8_t channel, uint32_t length, uint16_t* buffer) { |
34 | | - result.fired = true; |
35 | | - result.channel = channel; |
36 | | - result.length = length; |
37 | | - result.buffer = buffer; |
| 12 | +returncode_t libtocksync_adc_channel_count(int* count) { |
| 13 | + return libtock_adc_command_channel_count(count); |
38 | 14 | } |
39 | 15 |
|
| 16 | +returncode_t libtocksync_adc_reference_voltage(uint32_t* reference_voltage) { |
| 17 | + return libtock_adc_command_get_reference_voltage(reference_voltage); |
| 18 | +} |
40 | 19 |
|
41 | | -static libtock_adc_callbacks callbacks = { |
42 | | - .single_sample_callback = sample, |
43 | | - .continuous_sample_callback = sample, |
44 | | - .buffered_sample_callback = buffered_sample, |
45 | | - .continuous_buffered_sample_callback = buffered_sample, |
46 | | -}; |
47 | | - |
48 | | - |
49 | | -bool libtocksync_adc_exists(void) { |
50 | | - return libtock_adc_driver_exists(); |
| 20 | +returncode_t libtocksync_adc_resolution_bits(uint32_t* resolution) { |
| 21 | + return libtock_adc_command_get_resolution_bits(resolution); |
51 | 22 | } |
52 | 23 |
|
53 | 24 | returncode_t libtocksync_adc_sample(uint8_t channel, uint16_t* sample) { |
54 | | - int err; |
55 | | - result.fired = false; |
56 | | - result.error = RETURNCODE_SUCCESS; |
| 25 | + returncode_t err; |
57 | 26 |
|
58 | | - err = libtock_adc_single_sample(channel, &callbacks); |
| 27 | + err = libtock_adc_command_single_sample(channel); |
59 | 28 | if (err != RETURNCODE_SUCCESS) return err; |
60 | 29 |
|
61 | | - // wait for callback |
62 | | - yield_for(&result.fired); |
63 | | - |
64 | | - // copy over result |
65 | | - *sample = result.sample; |
66 | | - |
67 | | - return result.error; |
| 30 | + err = libtocksync_adc_yield_wait_for_single_sample(sample); |
| 31 | + return err; |
68 | 32 | } |
69 | 33 |
|
70 | 34 | returncode_t libtocksync_adc_sample_buffer(uint8_t channel, uint32_t frequency, uint16_t* buffer, uint32_t length) { |
71 | 35 | returncode_t err; |
72 | | - result.fired = false; |
73 | | - result.error = RETURNCODE_SUCCESS; |
74 | | - |
75 | | - err = libtock_adc_set_buffer(buffer, length); |
76 | | - if (err < RETURNCODE_SUCCESS) return err; |
| 36 | + uint32_t actual_length; |
77 | 37 |
|
78 | | - err = libtock_adc_buffered_sample(channel, frequency, &callbacks); |
| 38 | + err = libtock_adc_set_readwrite_allow_set_buffer((uint8_t*) buffer, length * 2); |
79 | 39 | if (err != RETURNCODE_SUCCESS) return err; |
80 | | - |
81 | | - // wait for callback |
82 | | - yield_for(&result.fired); |
83 | | - |
84 | | - // copy over result |
85 | | - if (result.buffer != buffer) { |
86 | | - return RETURNCODE_FAIL; |
| 40 | + defer { libtock_adc_set_readwrite_allow_set_buffer(NULL, 0); |
87 | 41 | } |
88 | 42 |
|
89 | | - return result.error; |
| 43 | + err = libtock_adc_command_buffered_sample(channel, frequency); |
| 44 | + if (err != RETURNCODE_SUCCESS) return err; |
| 45 | + |
| 46 | + err = libtocksync_adc_yield_wait_for_buffered_sample(&actual_length); |
| 47 | + return err; |
90 | 48 | } |
0 commit comments