diff options
author | Kevin O'Connor <kevin@koconnor.net> | 2023-10-04 22:26:10 -0400 |
---|---|---|
committer | Kevin O'Connor <kevin@koconnor.net> | 2023-10-04 22:42:14 -0400 |
commit | 447125faae62bfad4a0e483264453a39c9ba52d8 (patch) | |
tree | 5e8a69573be31428339bcc6ffd2d0437714e7f33 | |
parent | 043f18da260378d11e550248c032702017dafb49 (diff) | |
download | kutter-447125faae62bfad4a0e483264453a39c9ba52d8.tar.gz kutter-447125faae62bfad4a0e483264453a39c9ba52d8.tar.xz kutter-447125faae62bfad4a0e483264453a39c9ba52d8.zip |
serialqueue: Eventually time out if unable to write CANbus messages
Klipper logs an error on a failed CANbus write. Unfortunately, if the
bus becomes permanently disabled (eg, due to a user removing power to
devices on the CANbus) then it can result in the logs filling with
error messages.
Permanently disable the low-level processing of messages if CANbus
writes continually fail for at least 10 seconds. This avoids filling
the log with redundant messages.
Signed-off-by: Kevin O'Connor <kevin@koconnor.net>
-rw-r--r-- | klippy/chelper/serialqueue.c | 9 |
1 files changed, 9 insertions, 0 deletions
diff --git a/klippy/chelper/serialqueue.c b/klippy/chelper/serialqueue.c index b6500fe6..e6810933 100644 --- a/klippy/chelper/serialqueue.c +++ b/klippy/chelper/serialqueue.c @@ -62,6 +62,7 @@ struct serialqueue { int ready_bytes, upcoming_bytes, need_ack_bytes, last_ack_bytes; uint64_t need_kick_clock; struct list_head notify_queue; + double last_write_fail_time; // Received messages struct list_head receive_queue; // Fastreader support @@ -376,8 +377,16 @@ do_write(struct serialqueue *sq, void *buf, int buflen) int ret = write(sq->serial_fd, &cf, sizeof(cf)); if (ret < 0) { report_errno("can write", ret); + double curtime = get_monotonic(); + if (!sq->last_write_fail_time) { + sq->last_write_fail_time = curtime; + } else if (curtime > sq->last_write_fail_time + 10.0) { + errorf("Halting reads due to CAN write errors."); + pollreactor_do_exit(sq->pr); + } return; } + sq->last_write_fail_time = 0.0; buf += size; buflen -= size; } |