From e54a050b154d85ea1397de5f8e3d7a2d99ba981f Mon Sep 17 00:00:00 2001
From: Philipp Claves <pclaves@web.de>
Date: Sun, 6 Nov 2011 00:27:12 +0100
Subject: [PATCH] CardReader: Remove powersave mode (the final hardware
 supports turning of the reader power completely). CardReader: Send reply when
 an LCD command is complete.

---
 CardReader/Makefile                  |  9 +++---
 CardReader/main.c                    | 41 ++++++++++------------------
 common/cardreader_interface-common.h |  2 --
 3 files changed, 20 insertions(+), 32 deletions(-)

diff --git a/CardReader/Makefile b/CardReader/Makefile
index 6b3755e..f0da19b 100644
--- a/CardReader/Makefile
+++ b/CardReader/Makefile
@@ -151,12 +151,13 @@ LDFLAGS += -lm
 # to get a full listing.
 #
 
-AVRDUDE_PROGRAMMER = stk500v2
+#AVRDUDE_PROGRAMMER = stk500v2
+#AVRDUDE_PROGRAMMER = dragon_isp
 #AVRDUDE_PROGRAMMER = usbtiny
-#AVRDUDE_PROGRAMMER = USBasp
+AVRDUDE_PROGRAMMER = USBasp
 
-#AVRDUDE_PORT = usb        # programmer connected to USB port
-AVRDUDE_PORT = /dev/ttyUSB0	   # programmer connected to serial device
+AVRDUDE_PORT = usb        # programmer connected to USB port
+#AVRDUDE_PORT = /dev/ttyUSB0	   # programmer connected to serial device
 #AVRDUDE_PORT = lpt1	       # programmer connected to parallel port
 
 AVRDUDE_WRITE_FLASH = -U flash:w:$(TARGET).hex $(FUSE_BITS)
diff --git a/CardReader/main.c b/CardReader/main.c
index 8702089..eb53ab6 100644
--- a/CardReader/main.c
+++ b/CardReader/main.c
@@ -48,14 +48,6 @@ void cardreader_alive(void){
 	transport_send_interrupt_message(2);
 }
 
-void enable_power_save_mode(void){
-	powersave_mode = 1;
-	lcd_set_backlight(0);
-}
-void disable_power_save_mode(void){
-	powersave_mode = 0;
-	lcd_set_backlight(1);
-}
 //^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 
 void handle_sys_msg(uint8_t msg){
@@ -149,17 +141,17 @@ void display_receive_error(uint16_t status){
 		case 0:                              lcd_write_string_sz_P(PSTR("0-Byte Message")); break;
 		case TRANSPORT_ERR_TIMEOUT:          lcd_write_string_sz_P(PSTR("Read timeout")); break;
 		case TRANSPORT_ERR_CHECKSUM_FAIL:    lcd_write_string_sz_P(PSTR("Checksum fail")); break;
-		case TRANSPORT_ERR_MESSAGE_ABORT:    lcd_write_string_sz_P(PSTR("Msg truncated")); break;
+// 		case TRANSPORT_ERR_MESSAGE_ABORT:    lcd_write_string_sz_P(PSTR("Msg truncated")); break;
 		case TRANSPORT_ERR_MESSAGE_TOO_LONG: lcd_write_string_sz_P(PSTR("Msg too long")); break;
-		case TRANSPORT_ERR_UNEXPCETED_END:   lcd_write_string_sz_P(PSTR("Unexp End of Msg")); break;
-		case TRANSPORT_ERR_NESTED_INTERRUPTS:lcd_write_string_sz_P(PSTR("Nested int. Msgs")); break;
+// 		case TRANSPORT_ERR_UNEXPCETED_END:   lcd_write_string_sz_P(PSTR("Unexp End of Msg")); break;
+// 		case TRANSPORT_ERR_NESTED_INTERRUPTS:lcd_write_string_sz_P(PSTR("Nested int. Msgs")); break;
 	}
 }
 
 void display_card_status(void){
 	lcd_clear();
 	lcd_home();
-	lcd_write_string_sz_P(PSTR("AVR CardReader"));
+	lcd_write_string_sz_P(PSTR("PortalCardReader"));
 	lcd_set_pos(0,1);
 	switch (card_status){
 		case CARD_STATUS_REMOVED:
@@ -183,15 +175,12 @@ void display_card_status(void){
 
 void sleep(void){
 	transport_flush();//be sure all data is sent to the host.
+	wdt_disable(); //Disable watchdog while sleeping
 	
-// 	wdt_disable();
-// 	if (powersave_mode){
-// 		set_sleep_mode(SLEEP_MODE_PWR_DOWN);
-// 	} else {
-// 		set_sleep_mode(SLEEP_MODE_IDLE);
-// 	}
+// 	set_sleep_mode(SLEEP_MODE_IDLE);
 // 	sleep_mode();
 // 	sleep_disable();
+	
 	wdt_enable(WDTO_8S);
 }
 
@@ -209,19 +198,15 @@ int main(void){
 	transport_set_interrupt_handler(CARDREADER_INTERRUPT_RESET, reset);
 	transport_set_interrupt_handler(CARDREADER_INTERRUPT_HOST_ALIVE, host_alive);
 	transport_set_interrupt_handler(CARDREADER_INTERRUPT_CARDREADER_ALIVE, cardreader_alive);
-	transport_set_interrupt_handler(CARDREADER_INTERRUPT_ENABLE_POWER_SAVE_MODE, enable_power_save_mode);
-	transport_set_interrupt_handler(CARDREADER_INTERRUPT_DISABLE_POWER_SAVE_MODE, disable_power_save_mode);
 	
-	lcd_set_backlight(!powersave_mode);
+	lcd_set_backlight(0);
 	_delay_ms(200);
 	lcd_init();
-
+	
 	display_card_status();
 	//lcd_write_string_sz_P(PSTR("Waiting for Host"));
 	
-	//"Ping" host
-	transport_send_interrupt_message(CARDREADER_INTERRUPT_HOST_ALIVE);
-	
+	//"Ping" host	
 	
 	if (ISO7816_is_card_present()) card_status = CARD_STATUS_INSERTED;
 	
@@ -233,6 +218,9 @@ int main(void){
 	
 	uint8_t old_card_status = CARD_STATUS_REMOVED;
 	
+	transport_send_interrupt_message(CARDREADER_INTERRUPT_CARDREADER_ALIVE);
+	transport_send_interrupt_message(CARDREADER_INTERRUPT_HOST_ALIVE);
+
 	
 	while(1){
 		wdt_reset();
@@ -258,7 +246,8 @@ int main(void){
 					clockout_start();
 					uint8_t ret = ISO7816_readATR(&card_atr);
 					if (ATR_IS_ERROR(ret)){
-						card_status = CARD_STATUS_ERROR;
+						//Set to error state (if the error was not caused by a removed card)
+						if (ret != ERR_ATR_CARD_REMOVED) card_status = CARD_STATUS_ERROR;
 					} else {
 						card_status = CARD_STATUS_READY;
 					}
diff --git a/common/cardreader_interface-common.h b/common/cardreader_interface-common.h
index aca5d71..ac8330e 100644
--- a/common/cardreader_interface-common.h
+++ b/common/cardreader_interface-common.h
@@ -7,8 +7,6 @@
 #define CARDREADER_INTERRUPT_RESET 0
 #define CARDREADER_INTERRUPT_HOST_ALIVE 1
 #define CARDREADER_INTERRUPT_CARDREADER_ALIVE 2
-#define CARDREADER_INTERRUPT_ENABLE_POWER_SAVE_MODE 3
-#define CARDREADER_INTERRUPT_DISABLE_POWER_SAVE_MODE 4
 #define CARDREADER_INTERRUPT_CARD_INSERTED 5
 #define CARDREADER_INTERRUPT_CARD_REMOVED 6
 
-- 
GitLab