diff --git a/Control/cardreader_interface.c b/Control/cardreader_interface.c index 3713d32567f5567d0a571c92334d9fb031aca829..ce7310947f508a1929b8e6a3967b560aad57456b 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 440aee8b9d7a13c4053e435c14047c9115dee152..0ab374d866708f4756da3468f5a2991ca9ea8f65 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);