summaryrefslogtreecommitdiff
path: root/rivulet.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'rivulet.cpp')
-rw-r--r--rivulet.cpp118
1 files changed, 118 insertions, 0 deletions
diff --git a/rivulet.cpp b/rivulet.cpp
new file mode 100644
index 0000000..5b18bb0
--- /dev/null
+++ b/rivulet.cpp
@@ -0,0 +1,118 @@
1#include <hardware/gpio.h>
2#include <pico/printf.h>
3#include <pico/stdio_usb.h>
4#include <pico/stdlib.h>
5
6constexpr const unsigned int PERIOD_MS = 3000;
7
8enum {
9 PIN_CLOCK,
10
11 PIN_DATA,
12
13 PIN_CS0,
14 PIN_CS1,
15 PIN_CS2,
16 PIN_CS3,
17 PIN_CS4,
18 PIN_CS5,
19 PIN_CS6,
20 PIN_CS7,
21
22 PIN_LED = 25,
23};
24
25constexpr unsigned int MASK(unsigned int pin) { return 1 << pin; }
26
27enum {
28 MASK_CLOCK = MASK(PIN_CLOCK),
29
30 MASK_DATA = MASK(PIN_DATA),
31
32 MASK_CS0 = MASK(PIN_CS0),
33 MASK_CS1 = MASK(PIN_CS1),
34 MASK_CS2 = MASK(PIN_CS2),
35 MASK_CS3 = MASK(PIN_CS3),
36 MASK_CS4 = MASK(PIN_CS4),
37 MASK_CS5 = MASK(PIN_CS5),
38 MASK_CS6 = MASK(PIN_CS6),
39 MASK_CS7 = MASK(PIN_CS7),
40
41 MASK_LED = MASK(PIN_LED),
42
43 MASK_CSALL = MASK_CS0 | MASK_CS1 | MASK_CS2 | MASK_CS3 | MASK_CS4 | MASK_CS5 | MASK_CS6 | MASK_CS7,
44 MASK_IN = MASK_DATA,
45 MASK_OUT = MASK_CLOCK | MASK_CSALL | MASK_LED,
46 MASK_ALL = MASK_IN | MASK_OUT,
47};
48
49unsigned int read_bit() {
50 gpio_set_mask(MASK_CLOCK);
51 sleep_us(1);
52 gpio_clr_mask(MASK_CLOCK);
53 auto bit = gpio_get(PIN_DATA);
54 sleep_us(1);
55 return bit;
56}
57
58unsigned int read_sensor(unsigned int i) {
59 unsigned int cs;
60 switch (i) {
61 case 0: cs = PIN_CS0; break;
62 case 1: cs = PIN_CS1; break;
63 case 2: cs = PIN_CS2; break;
64 case 3: cs = PIN_CS3; break;
65 case 4: cs = PIN_CS4; break;
66 case 5: cs = PIN_CS5; break;
67 case 6: cs = PIN_CS6; break;
68 case 7: cs = PIN_CS7; break;
69 default: return 0;
70 }
71
72 gpio_clr_mask(MASK(cs));
73 sleep_us(1);
74
75 // 3 leading zero bits
76 for (unsigned int i = 0; i < 3; ++i)
77 read_bit();
78
79 // 12 data bits; big endian
80 unsigned int result = 0;
81 for (unsigned int i = 0; i < 12; ++i)
82 result = (result << 1) | read_bit();
83
84 gpio_set_mask(MASK(cs));
85 sleep_us(1);
86
87 return result;
88}
89
90int main() {
91 stdio_usb_init();
92 gpio_init_mask(MASK_ALL);
93 gpio_set_dir_in_masked(MASK_IN);
94 gpio_set_dir_out_masked(MASK_OUT);
95 gpio_set_mask(MASK_CSALL);
96 gpio_clr_mask(MASK_CLOCK | MASK_LED);
97
98 while (true) {
99 if (!stdio_usb_connected()) {
100 sleep_ms(1000);
101 continue;
102 }
103
104 gpio_set_mask(MASK_LED);
105
106 while (stdio_usb_connected()) {
107 printf("[");
108 for (unsigned int i = 0; i < 8; ++i)
109 printf(" %u", read_sensor(i));
110 printf(" ]\n");
111 sleep_ms(PERIOD_MS);
112 }
113
114 gpio_clr_mask(MASK_LED);
115 }
116
117 return 0;
118}