]> git.friedersdorff.com Git - max/lanthanide_pdu.git/blob - pdu.c
Initial commit
[max/lanthanide_pdu.git] / pdu.c
1 #include <stdio.h>
2 #include <string.h>
3
4 #include "uart.h"
5 #include "pico/stdlib.h"
6 #include "hardware/uart.h"
7
8 #define UART_ID uart0
9 #define DATA_BITS 8
10 #define STOP_BITS 1
11 #define PARITY UART_PARITY_NONE
12
13 #define UART_TX_PIN 16
14 #define UART_RX_PIN 17
15
16 #define MAX_COMMAND_LENGTH 32
17
18 #define PINA 6
19 #define PINB 7
20 #define PINC 8
21 #define PIND 9
22
23
24 void set_power_state(char relay, bool on) {
25     uint state;
26     if (on)
27         state = 0;
28     else
29         state = 1;
30
31     uint pin;
32     switch (relay) {
33         case 'a' :
34             pin = PINA;
35             break;
36         case 'b' :
37             pin = PINB;
38             break;
39         case 'c' :
40             pin = PINC;
41             break;
42         case 'd' :
43             pin = PIND;
44             break;
45     }
46
47     gpio_put(pin, state);
48 }
49
50 int main() {
51     char command_string[MAX_COMMAND_LENGTH + 1];
52     command_string[0] = 0;
53     uint command_len = 0;
54
55     uart_init(UART_ID, 9600);
56     gpio_set_function(UART_TX_PIN, GPIO_FUNC_UART);
57     gpio_set_function(UART_RX_PIN, GPIO_FUNC_UART);
58
59     uart_set_hw_flow(UART_ID, false, false);
60     uart_set_format(UART_ID, DATA_BITS, STOP_BITS, PARITY);
61
62     gpio_init(PINA);
63     gpio_init(PINB);
64     gpio_init(PINC);
65     gpio_init(PIND);
66
67     gpio_set_dir(PINA, GPIO_OUT);
68     gpio_set_dir(PINB, GPIO_OUT);
69     gpio_set_dir(PINC, GPIO_OUT);
70     gpio_set_dir(PIND, GPIO_OUT);
71
72     gpio_put(PINA, 1);
73     gpio_put(PINB, 1);
74     gpio_put(PINC, 1);
75     gpio_put(PIND, 1);
76
77     bool eol;
78     char word[9];
79     char relay;
80     while (true) {
81         read_word(UART_ID, word, 9, &eol);
82
83         if (strcmp(word, "on") == 0) {
84             if (eol) {
85                 uart_puts(UART_ID, "Missing argument: n");
86                 continue;
87             }
88             relay = uart_getc(UART_ID);
89             finish_line(UART_ID);
90             set_power_state(relay, true);
91         } else if (strcmp(word, "off") == 0) {
92             if (eol) {
93                 uart_puts(UART_ID, "Missing argument: n");
94                 continue;
95             }
96             relay = uart_getc(UART_ID);
97             finish_line(UART_ID);
98             set_power_state(relay, false);
99         } else if (strcmp(word, "temps") == 0) {
100             uart_puts(UART_ID, "Not implemented yet");
101         }
102     }
103 }