diff options
| author | Julian Blake Kongslie | 2024-07-25 13:28:55 -0700 |
|---|---|---|
| committer | Julian Blake Kongslie | 2024-07-25 13:28:55 -0700 |
| commit | 5c49f7c2e46d6fced0763094ec05bba41298cbed (patch) | |
| tree | 951d9fd4744eec31557274e3af659aab01185436 /rivulet.cpp | |
| download | rivulet-5c49f7c2e46d6fced0763094ec05bba41298cbed.tar.xz | |
Diffstat (limited to 'rivulet.cpp')
| -rw-r--r-- | rivulet.cpp | 118 |
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 | |||
| 6 | constexpr const unsigned int PERIOD_MS = 3000; | ||
| 7 | |||
| 8 | enum { | ||
| 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 | |||
| 25 | constexpr unsigned int MASK(unsigned int pin) { return 1 << pin; } | ||
| 26 | |||
| 27 | enum { | ||
| 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 | |||
| 49 | unsigned 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 | |||
| 58 | unsigned 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 | |||
| 90 | int 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 | } | ||
