From 9d87c925a9eaa4fc256be3173c14a20d1469472d Mon Sep 17 00:00:00 2001 From: fishsoupisgood Date: Wed, 9 Sep 2020 11:53:37 +0100 Subject: everything, mostly, working --- radiator-plc/stm32/app/logic.c | 158 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 158 insertions(+) create mode 100644 radiator-plc/stm32/app/logic.c (limited to 'radiator-plc/stm32/app/logic.c') diff --git a/radiator-plc/stm32/app/logic.c b/radiator-plc/stm32/app/logic.c new file mode 100644 index 0000000..8cab7ca --- /dev/null +++ b/radiator-plc/stm32/app/logic.c @@ -0,0 +1,158 @@ +#include "project.h" + + +#define N_VALVES 8 + +static volatile int semaphore = 0; + + + +static const char *valve_name[N_VALVES] = { + "dd_radiator1", + "dd_radiator2", + "dd_radiator3", + "hall_radiator", + "kitchen_radiator", + "music_room_radiator", + "bathroom_radiator", + "plc0_radiator7", +}; + +static Onewire_addr valve_owa[N_VALVES] = { + {{0x28, 0xe3, 0x5d, 0x56, 0xb5, 0x01, 0x3c, 0x96}}, + {{0x28, 0x0d, 0xaf, 0x56, 0xb5, 0x01, 0x3c, 0x89}}, + {{0x28, 0x79, 0xb1, 0x56, 0xb5, 0x01, 0x3c, 0x13}}, + {{0x28, 0x99, 0x8f, 0x56, 0xb5, 0x01, 0x3c, 0x1c}}, + {{0x28, 0xb4, 0x98, 0x6e, 0x32, 0x20, 0x01, 0xc7}}, + {{0x28, 0x0d, 0x4d, 0x56, 0xb5, 0x01, 0x3c, 0xd0}}, + {{0x28, 0xb1, 0x71, 0x75, 0x32, 0x20, 0x01, 0xa9}}, + {{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, +}; +volatile int temp[N_VALVES]; + +#define BAD_TEMP 0x7fffffff + +int low_limit[N_VALVES] = { + 15000, + 15000, + 15000, + 15000, + 15000, + 15000, + 15000, + 00000, +}; + + +int high_limit[N_VALVES] = { + 15000, + 15000, + 15000, + 15000, + 15000, + 15000, + 15000, + 00000, +}; + +int valve_state[N_VALVES]; + + + +void mqtt_dispatch (char *type, char *who, char *what, char *msg) +{ + unsigned i; + + if (strcmp (type, "cmnd")) return; + + for (i = 0; i < N_VALVES; ++i) { + + if (!strcmp (who, valve_name[i])) { + if (!strcmp (what, "var1")) + low_limit[i] = atoi (msg) * 1000; + + if (!strcmp (what, "var2")) + high_limit[i] = atoi (msg) * 1000; + } + } +} + + +static float scale(int i) +{ +float ret; + +ret=i; +return ret/1000.; +} + +void logic_tick (void) +{ + static unsigned i; + static int read_failed = 1; + static char msg_buf[80]; + int t; + int o; + int v; + + + + if (!read_failed) + read_failed = ds18b20_read (&valve_owa[i], &t); + + if (read_failed) { + temp[i] = BAD_TEMP; + valve_state[i] = 0; + } else { + temp[i] = t; + + if (t < low_limit[i]) + valve_state[i] = 1; + + if (t >= high_limit[i]) + valve_state[i] = 0; + } + + o = valve_state[i]; + + output_write (i, o); + v = input_get (i); + + usart1_queue_buf (msg_buf, sprintf (msg_buf, "\r\nMQTTR stat/%s/POWER %s\r\n", valve_name[i], o ? "ON" : "OFF")); + usart1_queue_buf (msg_buf, sprintf (msg_buf, "\r\nMQTTR stat/%s/OPEN %d\r\n", valve_name[i], v)); + + usart1_queue_buf (msg_buf, sprintf (msg_buf, "\r\nMQTTR stat/%s/var1 %.2f\r\n", valve_name[i], scale(low_limit[i]))); + + usart1_queue_buf (msg_buf, sprintf (msg_buf, "\r\nMQTTR stat/%s/var2 %.2f\r\n", valve_name[i], scale(high_limit[i]))); + + + + if (!read_failed) { + usart1_queue_buf (msg_buf, sprintf (msg_buf, "\r\nMQTTR stat/%s/TEMPERATURE %.2f\r\n", valve_name[i], scale(temp[i]))); + usart1_queue_buf (msg_buf, sprintf (msg_buf, "\r\nMQTTR stat/%s/DELTA %.2f\r\n", valve_name[i], scale(low_limit[i]-temp[i]))); + } + + + i++; + + if (i >= N_VALVES) + i = 0; + + if (request_search) { + request_search = 0; + onewire_search(); + } + + read_failed = ds18b20_set_12_convert (&valve_owa[i]); +} + + +void logic_slow_tick (void) +{ + semaphore = 1; +} + + +void logic_dispatch (void) +{ +} -- cgit v1.2.3