#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)
{
}
}
- 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)
#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)
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);