aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKevin O'Connor <kevin@koconnor.net>2023-10-04 22:26:10 -0400
committerKevin O'Connor <kevin@koconnor.net>2023-10-04 22:42:14 -0400
commit447125faae62bfad4a0e483264453a39c9ba52d8 (patch)
tree5e8a69573be31428339bcc6ffd2d0437714e7f33
parent043f18da260378d11e550248c032702017dafb49 (diff)
downloadkutter-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.c9
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;
}