A common failure mode is that the magnet slips and does not provide
the signal, so it appears as if constantly braking. Avoid this situation
by allowing continuous braking of at most 16 seconds. After that, report
brake off, and wait for the real "brake off" signall from the Hall sensor.
static void handle_brake(unsigned char cur, unsigned char prev)
{
static void handle_brake(unsigned char cur, unsigned char prev)
{
if (cur && !prev) { // --- just pressed ---
button_start[2] = jiffies;
if (cur && !prev) { // --- just pressed ---
button_start[2] = jiffies;
} else if (!cur && prev) { // --- just released ---
button_start[2] = jiffies;
} else if (!cur && prev) { // --- just released ---
button_start[2] = jiffies;
- } else { // --- no change ---
- uint16_t duration = jiffies - button_start[2];
-
- if (duration > 6) {
- if (cur) {
- if (button_state.brake_working
- && !button_state.brake_reported) {
- button_state.brake_reported = 1;
- brake_on();
- }
- } else {
- button_state.brake_working = 1;
- if (button_state.brake_reported) {
- button_state.brake_reported = 0;
+ return;
+ }
+ // --- no change ---
+ duration = jiffies - button_start[2];
+
+ if (duration <= 3)
+ return;
+
+ if (cur) {
+ if (button_state.brake_working) {
+ static unsigned int brake_time;
+ if (button_state.brake_reported) {
+ if (brake_time) {
+ brake_time--;
+ } else {
+ button_state.brake_working = 0;
+ button_state.brake_reported = 0;
+ } else {
+ button_state.brake_reported = 1;
+ brake_on();
+ brake_time = 255; // avoid longer than ~16s
- button_start[2] = jiffies - 7; // avoid overflow
+ }
+ } else {
+ button_state.brake_working = 1;
+ if (button_state.brake_reported) {
+ button_state.brake_reported = 0;
+ brake_off();
+
+ button_start[2] = jiffies - 7; // avoid overflow
}
void timer_check_buttons()
}
void timer_check_buttons()