From: Jan "Yenya" Kasprzak Date: Mon, 25 May 2015 18:21:33 +0000 (+0200) Subject: error counters to modbus X-Git-Url: https://www.fi.muni.cz/~kas/git//home/kas/public_html/git/?p=openparking.git;a=commitdiff_plain;h=087a60aae1ad8d3f96f94601c68910154f884735 error counters to modbus --- diff --git a/firmware/firmware.c b/firmware/firmware.c index 8e97351..c2dd944 100644 --- a/firmware/firmware.c +++ b/firmware/firmware.c @@ -25,6 +25,7 @@ #define free_bitmap (hold_regs[MB_N_HOLD_REGS_EEPROM+13]) #define err_bitmap (hold_regs[MB_N_HOLD_REGS_EEPROM+14]) #define max_distances (hold_regs+MB_N_HOLD_REGS_EEPROM+21) +#define err_counts (hold_regs+MB_N_HOLD_REGS_EEPROM+41) static void pull_trigger(uint8_t trig) { @@ -104,16 +105,32 @@ static void do_measurement(unsigned char trig) } } - for (i = 0; i < N_TRIG_SENSORS; i++) - if (to_start & (1 << i)) - distances[trig*N_TRIG_SENSORS + i] = -1; - else if (to_measure & (1 << i)) + for (i = 0; i < N_TRIG_SENSORS; i++) { + uint8_t off = trig*N_TRIG_SENSORS + i; + + if (to_start & (1 << i)) { // echo not received + uint16_t err_count = err_counts[off] & 0xFF; + if (err_count < 255) { + err_count++; + err_counts[off] = (err_counts[off] & 0xFF00) + | err_count; + } + distances[off] = -1; + } else if (to_measure & (1 << i)) { // echo pulse too long + uint16_t err_count = err_counts[off] >> 8; + + if (err_count < 255) { + err_count++; + err_counts[off] = (err_counts[off] & 0x00FF) + | (err_count << 8); + } /* * If the echo pulse is too long, do not treat it * as error, just count it as maximum length. */ - distances[trig*N_TRIG_SENSORS + i] - = now - starttimes[i]; + distances[off] = now - starttimes[i]; + } + } } static void led_set(uint8_t led, uint8_t state) diff --git a/firmware/modbus.c b/firmware/modbus.c index b726280..c895c5f 100644 --- a/firmware/modbus.c +++ b/firmware/modbus.c @@ -14,7 +14,7 @@ #include "clock.h" #include "modbus.h" -#define BUFSIZE 128 // maximum request size +#define BUFSIZE 180 // maximum request size // configure the control pin #define ctl_pin_setup() do { DDRD |= _BV(PD2); } while (0) diff --git a/firmware/modbus.h b/firmware/modbus.h index e762b70..3a3fcdf 100644 --- a/firmware/modbus.h +++ b/firmware/modbus.h @@ -27,11 +27,11 @@ typedef enum { MB_ILLEGAL_VAL = 3, } mb_exception; -#define MB_HOLD_REGS_BASE 1000 -#define MB_N_HOLD_REGS 60 -#define MB_N_HOLD_REGS_EEPROM 20 +#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]) +#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);