From db12fc85da98febb8ed4e4c0deb76fbd91c047a2 Mon Sep 17 00:00:00 2001
From: Philipp Claves <pclaves@web.de>
Date: Sun, 6 Nov 2011 00:32:13 +0100
Subject: [PATCH] Control: Add support for turing the cardreader power on an
 off. Control: Wait for Cardreader LCD commands to be acked. Control: Refactor
 state constant names.

---
 Control/cardreader_interface.c | 90 +++++++++++++++++++++-------------
 Control/cardreader_interface.h |  1 +
 2 files changed, 57 insertions(+), 34 deletions(-)

diff --git a/Control/cardreader_interface.c b/Control/cardreader_interface.c
index 3713d32..ce73109 100644
--- a/Control/cardreader_interface.c
+++ b/Control/cardreader_interface.c
@@ -50,17 +50,22 @@ void cardreader_display_move(uint8_t x, uint8_t y);
 void cardreader_display_write_sz(char* string);
 void cardreader_display_write_sz_P(char* string);
 void cardreader_display_show_result(uint8_t success);
+void cardreader_display_set_backlight(uint8_t on);
 uint8_t cardreader_sys_get_card_status(void);
 
-static uint8_t cardreader_power_on = 0;
+#define CARDREADER_POWER_STATE_OFF     1
+#define CARDREADER_POWER_STATE_STARTUP 2
+#define CARDREADER_POWER_STATE_READY   3
+static uint8_t cardreader_power_state = CARDREADER_POWER_STATE_OFF;
+static volatile uint8_t cardreader_startup_event = 0;
 
-#define STATE_NONE 0
-#define STATE_CARD_INSERTED 1
-#define STATE_SELECTING_AUTH_APPLET 2
-#define STATE_AUTH_REQUESTED_SENT 3
-#define STATE_AUTH_VERYFIED 4
+#define AUTH_STATE_NONE 1
+#define AUTH_STATE_CARD_INSERTED 2
+#define AUTH_STATE_SELECTING_AUTH_APPLET 3
+#define AUTH_STATE_AUTH_REQUESTED_SENT 4
+#define AUTH_STATE_AUTH_VERYFIED 5
 
-volatile uint8_t cardreader_state = STATE_NONE;
+volatile uint8_t auth_state = AUTH_STATE_NONE;
 volatile uint16_t state_timeout;
 
 static uint8_t auth_retry_count = 0;
@@ -72,8 +77,10 @@ static KEY new_key_delta;
 
 void card_power_request_pin_changed(uint8_t power_request){
 	if ((power_get_status() & POWER_STATUS_AC_ON) == 0){//If we are on AC, don't give a damn. Keep the Cardreader always powerd.
-		if (cardreader_power_on != power_request){
-			if (power_request) {cardreader_powerup();} else {cardreader_shutdown();}
+		if (cardreader_power_state == CARDREADER_POWER_STATE_OFF && power_request != 0){
+			cardreader_powerup();
+		} else if (cardreader_power_state != CARDREADER_POWER_STATE_OFF && power_request == 0){
+			cardreader_shutdown();
 		}
 	}
 }
@@ -83,15 +90,16 @@ static void host_alive(void){//answer ping
 }
 static void cardreader_alive(void){
 	printf_P(PSTR("Cardreader Online\n"));
+	cardreader_startup_event = 1;
 }
 
 static void card_inserted(void){
 	printf_P(PSTR("Card Inserted\n"));
-	cardreader_state = STATE_CARD_INSERTED;
+	auth_state = AUTH_STATE_CARD_INSERTED;
 	power_disable_battery_shutdown();
 }
 static void card_removed(void){
-	cardreader_state = STATE_NONE;
+	auth_state = AUTH_STATE_NONE;
 	power_enable_battery_shutdown();
 	printf_P(PSTR("Card Removed\n"));
 }
@@ -108,29 +116,32 @@ void cardreader_powerup(void){
 	CARDREADER_POWER_PORT &= ~(1 << CARDREADER_POWER_PIN);
 	CARDREADER_POWER_DDR  |= (1 << CARDREADER_POWER_PIN);
 	
-	cardreader_power_on = 1;
+	cardreader_power_state = CARDREADER_POWER_STATE_STARTUP;
 	
-	printf_P(PSTR("Cardreader powered up\n"));
-	
-	if (cardreader_sys_get_card_status()) cardreader_state = STATE_CARD_INSERTED;
+	printf_P(PSTR("Cardreader startup...\n"));
 }
 void cardreader_shutdown(void){
 	CARDREADER_POWER_PORT |= (1 << CARDREADER_POWER_PIN);
-	cardreader_power_on = 0;
+	cardreader_power_state = CARDREADER_POWER_STATE_OFF;
 	
 	printf_P(PSTR("Cardreader turned off\n"));
 }
 
 uint8_t cardreader_is_powered(){
-	return cardreader_power_on;
+	return cardreader_power_state != CARDREADER_POWER_STATE_OFF;
 }
 
 void cardreader_process(void){
+	if (cardreader_startup_event){
+		if (cardreader_sys_get_card_status()) auth_state = AUTH_STATE_CARD_INSERTED;
+		cardreader_display_set_backlight(power_get_status() & POWER_STATUS_AC_ON);
+		cardreader_startup_event = 0;
+	}
 	
-	if (cardreader_state == STATE_CARD_INSERTED){
+	if (auth_state == AUTH_STATE_CARD_INSERTED){
 		auth_retry_count = 0;
 		cardreader_select_auth_applet();
-		cardreader_state = STATE_SELECTING_AUTH_APPLET;
+		auth_state = AUTH_STATE_SELECTING_AUTH_APPLET;
 		return;
 	}
 	
@@ -143,30 +154,30 @@ void cardreader_process(void){
 		printf_P(PSTR("CardReader Recv Error: 0x%04x\n"), ret);
 	} else {
 		uint8_t length = ret & 0xFF;
-		if (cardreader_state == STATE_SELECTING_AUTH_APPLET){
+		if (auth_state == AUTH_STATE_SELECTING_AUTH_APPLET){
 			if (cardreader_select_auth_applet_result(msg_buffer, length)){
 				cardreader_auth_request();
-				cardreader_state = STATE_AUTH_REQUESTED_SENT;
+				auth_state = AUTH_STATE_AUTH_REQUESTED_SENT;
 			} else {
-				cardreader_state = STATE_NONE;
+				auth_state = AUTH_STATE_NONE;
 				power_enable_battery_shutdown();
 			}
-		} else if (cardreader_state == STATE_AUTH_REQUESTED_SENT){
+		} else if (auth_state == AUTH_STATE_AUTH_REQUESTED_SENT){
 			if (cardreader_auth_request_result(msg_buffer,length)){
 				cardreader_update_key();
-				cardreader_state = STATE_AUTH_VERYFIED;
+				auth_state = AUTH_STATE_AUTH_VERYFIED;
 			} else if (auth_retry_count < AUTH_RETRY_MAX) {
 				printf_P(PSTR("-- Auth Retry --\n"));
 				cardreader_auth_request();
-				cardreader_state = STATE_AUTH_REQUESTED_SENT;
+				auth_state = AUTH_STATE_AUTH_REQUESTED_SENT;
 				auth_retry_count++;
 			} else {
-				cardreader_state = STATE_NONE;
+				auth_state = AUTH_STATE_NONE;
 				power_enable_battery_shutdown();
 			}
-		} else if (cardreader_state == STATE_AUTH_VERYFIED){
+		} else if (auth_state == AUTH_STATE_AUTH_VERYFIED){
 			cardreader_update_key_result(msg_buffer, length);
-			cardreader_state = STATE_NONE;
+			auth_state = AUTH_STATE_NONE;
 			power_enable_battery_shutdown();
 		}
 	}
@@ -175,8 +186,8 @@ void cardreader_process(void){
 void cardreader_tick(void){
 	if (state_timeout) {
 		state_timeout--;
-		if (state_timeout == 0 && cardreader_state != STATE_NONE){
-			cardreader_state = STATE_NONE;
+		if (state_timeout == 0 && auth_state != AUTH_STATE_NONE){
+			auth_state = AUTH_STATE_NONE;
 			power_enable_battery_shutdown();
 			cardreader_timeout();
 		}
@@ -345,7 +356,7 @@ void cardreader_display_clear(void){
 	transport_send_message((uint8_t*)&msg, 2);
 	
 	uint8_t success;
-	uint8_t ret = transport_receive_message(&success, 1, 3000);
+	transport_receive_message(&success, 1, 3000);
 }
 
 void cardreader_display_move(uint8_t x, uint8_t y){
@@ -356,7 +367,7 @@ void cardreader_display_move(uint8_t x, uint8_t y){
 	transport_send_message((uint8_t*)&msg, 4);
 	
 	uint8_t success;
-	uint8_t ret = transport_receive_message(&success, 1, 3000);
+	transport_receive_message(&success, 1, 3000);
 }
 
 void cardreader_display_write_sz(char* string){
@@ -368,7 +379,7 @@ void cardreader_display_write_sz(char* string){
 	transport_send_message((uint8_t*)&msg, len+2);
 	
 	uint8_t success;
-	uint8_t ret = transport_receive_message(&success, 1, 3000);
+	transport_receive_message(&success, 1, 3000);
 }
 
 void cardreader_display_write_sz_P(char* string){
@@ -380,7 +391,7 @@ void cardreader_display_write_sz_P(char* string){
 	transport_send_message((uint8_t*)&msg, len+2);
 	
 	uint8_t success;
-	uint8_t ret = transport_receive_message(&success, 1, 3000);
+	transport_receive_message(&success, 1, 3000);
 }
 
 void cardreader_display_show_result(uint8_t success){
@@ -390,4 +401,15 @@ void cardreader_display_show_result(uint8_t success){
 	} else {
 		cardreader_display_write_sz_P(PSTR("Failed :("));
 	}
+}
+
+
+void cardreader_display_set_backlight(uint8_t on){
+	cardreader_display_message_t msg = {CARDREADER_MSG_TYPE_DISPALY};
+	msg.command = CARDREADER_DISPLAY_MSG_SET_BACKLIGHT;
+	msg.body[0] = on ? 1 : 0;
+	transport_send_message((uint8_t*)&msg,2+1);
+	
+	uint8_t success;
+	transport_receive_message(&success, 1, 3000);
 }
\ No newline at end of file
diff --git a/Control/cardreader_interface.h b/Control/cardreader_interface.h
index 440aee8..0ab374d 100644
--- a/Control/cardreader_interface.h
+++ b/Control/cardreader_interface.h
@@ -17,6 +17,7 @@ void cardreader_init(void);
 void cardreader_powerup(void);
 void cardreader_shutdown(void);
 uint8_t cardreader_is_powered(void);
+void card_power_request_pin_changed(uint8_t power_request);
 
 void cardreader_process(void);
 void cardreader_tick(void);
-- 
GitLab