]> mj.ucw.cz Git - home-hw.git/commitdiff
Aircon: Separate registers, temperatures in ddegC
authorMartin Mares <mj@ucw.cz>
Tue, 16 Jul 2019 19:24:27 +0000 (21:24 +0200)
committerMartin Mares <mj@ucw.cz>
Tue, 16 Jul 2019 19:24:27 +0000 (21:24 +0200)
aircon/firmware/main.c
aircon/firmware/registers.h [new file with mode: 0644]

index 89307b48710cd0c3c7680df1386c6b0ccbb4a9d2..824ee7a999c7805c3b330eea8a6742b9c3326177 100644 (file)
@@ -7,6 +7,7 @@
 #include "util.h"
 #include "ds18b20.h"
 #include "modbus.h"
+#include "registers.h"
 
 #include <libopencm3/cm3/nvic.h>
 #include <libopencm3/cm3/systick.h>
@@ -227,28 +228,6 @@ int main(void)
 
 /*** Modbus callbacks ***/
 
-enum aircon_coils {
-       AIRCON_COIL_EXCHANGER_BYPASS,
-       AIRCON_COIL_MAX,
-};
-
-enum aircon_input_registers {
-       AIRCON_IREG_TEMP_FROM_INSIDE,
-       AIRCON_IREG_TEMP_TO_INSIDE,
-       AIRCON_IREG_TEMP_FROM_OUTSIDE,
-       AIRCON_IREG_TEMP_TO_OUTSIDE,
-       AIRCON_IREG_TEMP_MIXED,
-       AIRCON_IREG_MAX,
-       AIRCON_IREG_DS_ID_BASE = 0x1000,
-       AIRCON_IREG_DS_ID_MAX = AIRCON_IREG_DS_ID_BASE + 3*DS_NUM_SENSORS,
-};
-
-enum aircon_holding_registers {
-       AIRCON_HREG_EXCHANGER_FAN,
-       AIRCON_HREG_REMOTE_CONTROL,
-       AIRCON_HREG_MAX,
-};
-
 bool modbus_check_discrete_input(u16 addr UNUSED)
 {
        return false;
@@ -315,7 +294,7 @@ u16 modbus_get_input_register(u16 addr)
                        return 0x8000;
                if (ds_sensors[i].current_temp == DS_TEMP_UNKNOWN)
                        return 0x8000;
-               return ds_sensors[i].current_temp & 0xffff;
+               return ((ds_sensors[i].current_temp + 5) / 10) & 0xffff;
        } else if (addr >= AIRCON_IREG_DS_ID_BASE && addr < AIRCON_IREG_DS_ID_MAX) {
                byte i = (addr - AIRCON_IREG_DS_ID_BASE) / 3;
                byte j = (addr - AIRCON_IREG_DS_ID_BASE) % 3;
diff --git a/aircon/firmware/registers.h b/aircon/firmware/registers.h
new file mode 100644 (file)
index 0000000..bf444cf
--- /dev/null
@@ -0,0 +1,32 @@
+/*
+ *     Air Conditioning Controller -- MODBUS Registers
+ *
+ *     (c) 2019 Martin Mareš <mj@ucw.cz>
+ */
+
+#ifndef _AIRCON_REGISTERS_H
+#define _AIRCON_REGISTERS_H
+
+enum aircon_coils {
+       AIRCON_COIL_EXCHANGER_BYPASS,
+       AIRCON_COIL_MAX,
+};
+
+enum aircon_input_registers {
+       AIRCON_IREG_TEMP_FROM_INSIDE,   // s16 in 0.01 °C
+       AIRCON_IREG_TEMP_TO_INSIDE,
+       AIRCON_IREG_TEMP_FROM_OUTSIDE,
+       AIRCON_IREG_TEMP_TO_OUTSIDE,
+       AIRCON_IREG_TEMP_MIXED,
+       AIRCON_IREG_MAX,
+       AIRCON_IREG_DS_ID_BASE = 0x1000,
+       AIRCON_IREG_DS_ID_MAX = AIRCON_IREG_DS_ID_BASE + 3*DS_NUM_SENSORS,
+};
+
+enum aircon_holding_registers {
+       AIRCON_HREG_EXCHANGER_FAN,
+       AIRCON_HREG_REMOTE_CONTROL,
+       AIRCON_HREG_MAX,
+};
+
+#endif