* All bugs by Jan "Yenya" Kasprzak <kas@fi.muni.cz> :-)
*/
-void modbus_init();
-void modbus_poll();
+/*
+ * Call this at the beginning of the program.
+ */
+void modbus_init(uint8_t unit_id);
+
+/*
+ * Call this frequently. Returns 0 when no data was received
+ * and the processing went on quickly. Returns 1 after potentially lengthy
+ * packet processing.
+ */
+uint8_t modbus_poll();
+
+typedef enum {
+ MB_OK = 0,
+ MB_ILLEGAL_FUNC = 1,
+ MB_ILLEGAL_ADDR = 2,
+ MB_ILLEGAL_VAL = 3,
+} mb_exception;
+
+#define MB_HOLD_REGS_BASE 0 // first register
+#define MB_N_HOLD_REGS 80 // total # of registers
+#define MB_N_HOLD_REGS_EEPROM 20 // the first N registers eeprom-backed
+extern uint16_t hold_regs[MB_N_HOLD_REGS];
+#define mb_unit_id (hold_regs[0]) // MODBUS id in the first register
+
+uint8_t hold_reg_is_valid(uint16_t reg, uint16_t val);
#endif /* MODBUS_H__ */