]> www.fi.muni.cz Git - bike-lights.git/commitdiff
buttons.c: magnet for the Hall probe not present?
authorJan "Yenya" Kasprzak <kas@fi.muni.cz>
Thu, 14 Mar 2013 21:12:33 +0000 (22:12 +0100)
committerJan "Yenya" Kasprzak <kas@fi.muni.cz>
Thu, 14 Mar 2013 21:12:33 +0000 (22:12 +0100)
Handle the case when the Hall probe magnet is not present.

firmware/buttons.c

index be3a86581f477f825cbbaaa9728bcc0bdc282cdb..017a56c6560632fa2a1afe5280fdb966dab05a1f 100644 (file)
@@ -14,6 +14,8 @@ union {
                unsigned char btn1 : 1;
                unsigned char btn2 : 1;
                unsigned char brake : 1;
+               unsigned char brake_working : 1;
+               unsigned char brake_reported : 1;
        };
 } button_state, prev_state;
 
@@ -185,25 +187,42 @@ static void handle_brake(unsigned char cur, unsigned char prev)
 {
        if (cur && !prev) {                   // --- just pressed ---
                button_start[2] = jiffies;
-       } else if (cur && prev) {           // --- is still pressed ---
+       } else if (!cur && prev) {            // --- just released ---
+               button_start[2] = jiffies;
+       } else {                              // --- no change ---
                uint16_t duration = jiffies - button_start[2];
 
                if (duration > 6) {
-                       brake_on();
+                       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;
+                                       brake_off();
+                               }
+                       }
                        button_start[2] = jiffies - 7; // avoid overflow
                }
-       } else if (!cur && prev) {            // --- just released ---
-               brake_off();
        }
 }
 
 void timer_check_buttons()
 {
        handle_button(0, button_state.btn1, prev_state.btn1);
-       handle_button(1, button_state.btn2, prev_state.btn2);
-       handle_brake(button_state.brake, prev_state.brake);
 
-       prev_state.all = button_state.all;
+       // when button 1 is on, all other states are unreadable
+       if (button_state.btn1) {
+               prev_state.btn1 = button_state.btn1;
+       } else {
+               handle_button(1, button_state.btn2, prev_state.btn2);
+               handle_brake(button_state.brake, prev_state.brake);
+               prev_state.all = button_state.all;
+       }
 
        if (user_params_state && jiffies - user_params_starttime > 1000) {
                user_params_state = 0;
@@ -239,7 +258,10 @@ void button_adc(uint16_t adcval)
        PORTA &= ~_BV(PA3); // disable +5V to the hall probe
                // adc.c will re-enable it again
 
-       button_state.all = 0;
+       button_state.btn1 = 0;
+       button_state.btn2 = 0;
+       button_state.brake = 0;
+
        if (adcval == 0x3FF) {
                button_state.brake = 1;
        } else if (adcval > 0x240) {