From: Jan "Yenya" Kasprzak <kas@fi.muni.cz>
Date: Thu, 14 Mar 2013 21:12:33 +0000 (+0100)
Subject: buttons.c: magnet for the Hall probe not present?
X-Git-Url: https://www.fi.muni.cz/~kas/git//home/kas/public_html/git/?a=commitdiff_plain;h=cadcc858f6c65c9fd7a18fb8309f7305ec6adb28;p=bike-lights.git

buttons.c: magnet for the Hall probe not present?

Handle the case when the Hall probe magnet is not present.
---

diff --git a/firmware/buttons.c b/firmware/buttons.c
index be3a865..017a56c 100644
--- a/firmware/buttons.c
+++ b/firmware/buttons.c
@@ -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) {