]> mj.ucw.cz Git - home-hw.git/blobdiff - test-modbus/modbus.c
Modbus: Genericized debugging
[home-hw.git] / test-modbus / modbus.c
index 39bd0399467fb9311db8f9eae88d9899e99abe24..c6336460d307d1a8fe814e77b3159409ddaeb113 100644 (file)
@@ -4,7 +4,6 @@
  *     (c) 2019 Martin Mareš <mj@ucw.cz>
  */
 
-#include "config.h"
 #include "util.h"
 #include "modbus.h"
 
@@ -90,6 +89,11 @@ static byte tx_buf[MODBUS_TX_BUFSIZE];
 static u16 tx_size;
 static u16 tx_pos;
 
+static bool check_frame(void);
+static void process_frame(void);
+
+/*** Low-level layer ***/
+
 static void rx_init(void)
 {
        state = STATE_RX;
@@ -197,7 +201,32 @@ void MODBUS_TIMER_ISR(void)
        }
 }
 
-// CRC tables
+void modbus_loop(void)
+{
+       if (state != STATE_RX_DONE)
+               return;
+       state = STATE_PROCESSING;
+
+       if (!check_frame()) {
+               rx_init();
+               return;
+       }
+
+       if (rx_buf[0] == MODBUS_OUR_ADDRESS) {
+               // Frame addressed to us: process and reply
+               process_frame();
+               tx_init();
+       } else if (rx_buf[0] == 0x00) {
+               // Broadcast frame: process, but do not reply
+               process_frame();
+               rx_init();
+       } else {
+               // Somebody else's frame: discard
+               rx_init();
+       }
+}
+
+/** CRC ***/
 
 static const byte crc_hi[] = {
        0x00, 0xc1, 0x81, 0x40, 0x01, 0xc0, 0x80, 0x41, 0x01, 0xc0,
@@ -270,6 +299,8 @@ static u16 crc16(byte *buf, u16 len)
        return (hi << 8 | lo);
 }
 
+/*** High-level layer ***/
+
 static bool check_frame(void)
 {
        if (rx_bad) {
@@ -661,87 +692,3 @@ static void process_frame(void)
        // Finish reply frame
        write_u16(crc16(tx_buf, tx_size));
 }
-
-void modbus_loop(void)
-{
-       if (state != STATE_RX_DONE)
-               return;
-       state = STATE_PROCESSING;
-
-       if (!check_frame()) {
-               rx_init();
-               return;
-       }
-
-       if (rx_buf[0] == MODBUS_OUR_ADDRESS) {
-               // Frame addressed to us: process and reply
-               process_frame();
-               tx_init();
-       } else if (rx_buf[0] == 0x00) {
-               // Broadcast frame: process, but do not reply
-               process_frame();
-               rx_init();
-       } else {
-               // Somebody else's frame: discard
-               rx_init();
-       }
-}
-
-/*** Callbacks ***/
-
-bool modbus_check_discrete_input(u16 addr UNUSED)
-{
-       return false;
-}
-
-bool modbus_get_discrete_input(u16 addr UNUSED)
-{
-       return false;
-}
-
-bool modbus_check_coil(u16 addr UNUSED)
-{
-       return false;
-}
-
-bool modbus_get_coil(u16 addr UNUSED)
-{
-       return false;
-}
-
-void modbus_set_coil(u16 addr UNUSED, bool value UNUSED)
-{
-}
-
-bool modbus_check_input_register(u16 addr UNUSED)
-{
-       return false;
-}
-
-u16 modbus_get_input_register(u16 addr UNUSED)
-{
-       return 0;
-}
-
-bool modbus_check_holding_register(u16 addr UNUSED)
-{
-       return (addr == 0);
-}
-
-u16 modbus_get_holding_register(u16 addr UNUSED)
-{
-       return 0xbeef;
-}
-
-void modbus_set_holding_register(u16 addr UNUSED, u16 value UNUSED)
-{
-}
-
-const char * const modbus_id_strings[MODBUS_ID_MAX] = {
-       [MODBUS_ID_VENDOR_NAME] = "United Computer Wizards",
-       [MODBUS_ID_PRODUCT_CODE] = "42",
-       [MODBUS_ID_MAJOR_MINOR_REVISION] = "1.0",
-       [MODBUS_ID_VENDOR_URL] = "http://www.ucw.cz/",
-       [MODBUS_ID_PRODUCT_NAME] = "Magic Gadget",
-       [MODBUS_ID_USER_APP_NAME] = NULL,
-};