From 7c6887eaaf812b63bab6c5e134f80a2ef36aeb31 Mon Sep 17 00:00:00 2001 From: fishsoupisgood Date: Tue, 12 Jan 2021 16:58:31 +0000 Subject: works --- radiator-plc/stm32/app/logic.c | 178 +++++++++++++++++++++++++++++++---------- 1 file changed, 135 insertions(+), 43 deletions(-) (limited to 'radiator-plc/stm32/app/logic.c') diff --git a/radiator-plc/stm32/app/logic.c b/radiator-plc/stm32/app/logic.c index 8cab7ca..a9f845c 100644 --- a/radiator-plc/stm32/app/logic.c +++ b/radiator-plc/stm32/app/logic.c @@ -7,7 +7,7 @@ static volatile int semaphore = 0; -static const char *valve_name[N_VALVES] = { +static const char *plc0_valve_names[N_VALVES] = { "dd_radiator1", "dd_radiator2", "dd_radiator3", @@ -18,16 +18,57 @@ static const char *valve_name[N_VALVES] = { "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}}, +static const Onewire_addr plc0_valve_owas[N_VALVES] = { + {{0x28, 0x09, 0xb3, 0xc3, 0x0b, 0x00, 0x00, 0xf9}}, + {{0x28, 0x89, 0xda, 0xc3, 0x0b, 0x00, 0x00, 0xf1}}, + {{0x28, 0xdf, 0xb2, 0xc6, 0x0b, 0x00, 0x00, 0xc3}}, + {{0x28, 0x42, 0x23, 0xc4, 0x0b, 0x00, 0x00, 0x45}}, + {{0x28, 0xf9, 0xd6, 0xc6, 0x0b, 0x00, 0x00, 0xc9}}, + {{0x28, 0x8d, 0x0a, 0xc6, 0x0b, 0x00, 0x00, 0xf2}}, + {{0x28, 0x5f, 0xb7, 0xc6, 0x0b, 0x00, 0x00, 0xfb}}, + {{0x28, 0x25, 0xe5, 0xc6, 0x0b, 0x00, 0x00, 0xba}}, +}; + + + + + + + + + + + + +static const char *plc1_valve_names[N_VALVES] = { + "2fl_main_radiator", + "2fl_stair_radiator", + "plc1_radiator2", + "plc1_radiator3", + "plc1_radiator4", + "plc1_radiator5", + "plc1_radiator6", + "plc1_radiator7", +}; + + +static const Onewire_addr plc1_valve_owas[N_VALVES] = { + {{0x28, 0x03, 0x01, 0xc5, 0x0b, 0x00, 0x00, 0xf3}}, + {{0x28, 0xea, 0x79, 0xc5, 0x0b, 0x00, 0x00, 0x1f}}, + {{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, + {{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, + {{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, + {{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, + {{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, {{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, }; + + +Onewire_addr owa_zero = {0}; + + +static const char **valve_name; +static const Onewire_addr *valve_owa; volatile int temp[N_VALVES]; #define BAD_TEMP 0x7fffffff @@ -56,80 +97,98 @@ int high_limit[N_VALVES] = { }; int valve_state[N_VALVES]; +int failed_reads[N_VALVES]; + + + +static float scale (int i) +{ + float ret; + ret = i; + return ret / 1000.; +} void mqtt_dispatch (char *type, char *who, char *what, char *msg) { unsigned i; + static char msg_buf[80]; if (strcmp (type, "cmnd")) return; for (i = 0; i < N_VALVES; ++i) { if (!strcmp (who, valve_name[i])) { - if (!strcmp (what, "var1")) + if (!strcmp (what, "var1")) { low_limit[i] = atoi (msg) * 1000; + usart1_queue_buf (msg_buf, sprintf (msg_buf, "\r\nMQTTR stat/%s/var1 %.2f\r\n", valve_name[i], scale (low_limit[i]))); + } - if (!strcmp (what, "var2")) + if (!strcmp (what, "var2")) { high_limit[i] = atoi (msg) * 1000; - } - } -} - + usart1_queue_buf (msg_buf, sprintf (msg_buf, "\r\nMQTTR stat/%s/var2 %.2f\r\n", valve_name[i], scale (high_limit[i]))); + } -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 int not_present = 1; static char msg_buf[80]; int t; int o; int v; + if (!not_present) { + if (!read_failed) + read_failed = ds18b20_read (&valve_owa[i], &t); + if (read_failed) { + temp[i] = BAD_TEMP; + valve_state[i] = 0; + failed_reads[i]++; + } else { + temp[i] = t; + failed_reads[i] = 0; - if (!read_failed) - read_failed = ds18b20_read (&valve_owa[i], &t); + if (t < low_limit[i]) + valve_state[i] = 1; - if (read_failed) { - temp[i] = BAD_TEMP; - valve_state[i] = 0; - } else { - temp[i] = t; + if (t >= high_limit[i]) + valve_state[i] = 0; + } - if (t < low_limit[i]) - valve_state[i] = 1; + o = valve_state[i]; - if (t >= high_limit[i]) - valve_state[i] = 0; - } + output_write (i, o); + v = input_get (i); - o = valve_state[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)); - output_write (i, o); - v = input_get (i); + 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/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/var2 %.2f\r\n", valve_name[i], scale (high_limit[i]))); - 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]))); + } + usart1_queue_buf (msg_buf, sprintf (msg_buf, "\r\nMQTTR stat/%s/failed_reads %d\r\n", valve_name[i], failed_reads[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]))); + } else { + valve_state[i] = 0; + o = valve_state[i]; + output_write (i, o); } @@ -143,7 +202,12 @@ void logic_tick (void) onewire_search(); } - read_failed = ds18b20_set_12_convert (&valve_owa[i]); + if (!memcmp (&valve_owa[i], &owa_zero, sizeof (owa_zero))) + not_present = 1; + else { + not_present = 0; + read_failed = ds18b20_set_12_convert (&valve_owa[i]); + } } @@ -156,3 +220,31 @@ void logic_slow_tick (void) void logic_dispatch (void) { } + + +void logic_init (void) +{ + char serial[25] = {0}; + unsigned i; + + desig_get_unique_id_as_string (serial, sizeof (serial)); + + if (!strcmp (serial, "325715574155303632FFD305")) { + valve_name = plc0_valve_names; + valve_owa = plc0_valve_owas; + + for (i = 0; i < 3; ++i) { + low_limit[i] = 19000; + high_limit[i] = 20000; + } + } else if (!strcmp (serial, "378125574155383139FFD805")) { + valve_name = plc1_valve_names; + valve_owa = plc1_valve_owas; + } else { + printf ("serial: %s\n", serial); + valve_name = plc0_valve_names; + valve_owa = plc0_valve_owas; + } + + +} -- cgit v1.2.3