Skip to content
Snippets Groups Projects
Commit db12fc85 authored by da1l6's avatar da1l6
Browse files

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.
parent 61e10db3
No related branches found
No related tags found
No related merge requests found
...@@ -50,17 +50,22 @@ void cardreader_display_move(uint8_t x, uint8_t y); ...@@ -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(char* string);
void cardreader_display_write_sz_P(char* string); void cardreader_display_write_sz_P(char* string);
void cardreader_display_show_result(uint8_t success); void cardreader_display_show_result(uint8_t success);
void cardreader_display_set_backlight(uint8_t on);
uint8_t cardreader_sys_get_card_status(void); 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 AUTH_STATE_NONE 1
#define STATE_CARD_INSERTED 1 #define AUTH_STATE_CARD_INSERTED 2
#define STATE_SELECTING_AUTH_APPLET 2 #define AUTH_STATE_SELECTING_AUTH_APPLET 3
#define STATE_AUTH_REQUESTED_SENT 3 #define AUTH_STATE_AUTH_REQUESTED_SENT 4
#define STATE_AUTH_VERYFIED 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; volatile uint16_t state_timeout;
static uint8_t auth_retry_count = 0; static uint8_t auth_retry_count = 0;
...@@ -72,8 +77,10 @@ static KEY new_key_delta; ...@@ -72,8 +77,10 @@ static KEY new_key_delta;
void card_power_request_pin_changed(uint8_t power_request){ 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 ((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 (cardreader_power_state == CARDREADER_POWER_STATE_OFF && power_request != 0){
if (power_request) {cardreader_powerup();} else {cardreader_shutdown();} 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 ...@@ -83,15 +90,16 @@ static void host_alive(void){//answer ping
} }
static void cardreader_alive(void){ static void cardreader_alive(void){
printf_P(PSTR("Cardreader Online\n")); printf_P(PSTR("Cardreader Online\n"));
cardreader_startup_event = 1;
} }
static void card_inserted(void){ static void card_inserted(void){
printf_P(PSTR("Card Inserted\n")); printf_P(PSTR("Card Inserted\n"));
cardreader_state = STATE_CARD_INSERTED; auth_state = AUTH_STATE_CARD_INSERTED;
power_disable_battery_shutdown(); power_disable_battery_shutdown();
} }
static void card_removed(void){ static void card_removed(void){
cardreader_state = STATE_NONE; auth_state = AUTH_STATE_NONE;
power_enable_battery_shutdown(); power_enable_battery_shutdown();
printf_P(PSTR("Card Removed\n")); printf_P(PSTR("Card Removed\n"));
} }
...@@ -108,29 +116,32 @@ void cardreader_powerup(void){ ...@@ -108,29 +116,32 @@ void cardreader_powerup(void){
CARDREADER_POWER_PORT &= ~(1 << CARDREADER_POWER_PIN); CARDREADER_POWER_PORT &= ~(1 << CARDREADER_POWER_PIN);
CARDREADER_POWER_DDR |= (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")); printf_P(PSTR("Cardreader startup...\n"));
if (cardreader_sys_get_card_status()) cardreader_state = STATE_CARD_INSERTED;
} }
void cardreader_shutdown(void){ void cardreader_shutdown(void){
CARDREADER_POWER_PORT |= (1 << CARDREADER_POWER_PIN); 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")); printf_P(PSTR("Cardreader turned off\n"));
} }
uint8_t cardreader_is_powered(){ uint8_t cardreader_is_powered(){
return cardreader_power_on; return cardreader_power_state != CARDREADER_POWER_STATE_OFF;
} }
void cardreader_process(void){ 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; auth_retry_count = 0;
cardreader_select_auth_applet(); cardreader_select_auth_applet();
cardreader_state = STATE_SELECTING_AUTH_APPLET; auth_state = AUTH_STATE_SELECTING_AUTH_APPLET;
return; return;
} }
...@@ -143,30 +154,30 @@ void cardreader_process(void){ ...@@ -143,30 +154,30 @@ void cardreader_process(void){
printf_P(PSTR("CardReader Recv Error: 0x%04x\n"), ret); printf_P(PSTR("CardReader Recv Error: 0x%04x\n"), ret);
} else { } else {
uint8_t length = ret & 0xFF; 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)){ if (cardreader_select_auth_applet_result(msg_buffer, length)){
cardreader_auth_request(); cardreader_auth_request();
cardreader_state = STATE_AUTH_REQUESTED_SENT; auth_state = AUTH_STATE_AUTH_REQUESTED_SENT;
} else { } else {
cardreader_state = STATE_NONE; auth_state = AUTH_STATE_NONE;
power_enable_battery_shutdown(); 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)){ if (cardreader_auth_request_result(msg_buffer,length)){
cardreader_update_key(); cardreader_update_key();
cardreader_state = STATE_AUTH_VERYFIED; auth_state = AUTH_STATE_AUTH_VERYFIED;
} else if (auth_retry_count < AUTH_RETRY_MAX) { } else if (auth_retry_count < AUTH_RETRY_MAX) {
printf_P(PSTR("-- Auth Retry --\n")); printf_P(PSTR("-- Auth Retry --\n"));
cardreader_auth_request(); cardreader_auth_request();
cardreader_state = STATE_AUTH_REQUESTED_SENT; auth_state = AUTH_STATE_AUTH_REQUESTED_SENT;
auth_retry_count++; auth_retry_count++;
} else { } else {
cardreader_state = STATE_NONE; auth_state = AUTH_STATE_NONE;
power_enable_battery_shutdown(); 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_update_key_result(msg_buffer, length);
cardreader_state = STATE_NONE; auth_state = AUTH_STATE_NONE;
power_enable_battery_shutdown(); power_enable_battery_shutdown();
} }
} }
...@@ -175,8 +186,8 @@ void cardreader_process(void){ ...@@ -175,8 +186,8 @@ void cardreader_process(void){
void cardreader_tick(void){ void cardreader_tick(void){
if (state_timeout) { if (state_timeout) {
state_timeout--; state_timeout--;
if (state_timeout == 0 && cardreader_state != STATE_NONE){ if (state_timeout == 0 && auth_state != AUTH_STATE_NONE){
cardreader_state = STATE_NONE; auth_state = AUTH_STATE_NONE;
power_enable_battery_shutdown(); power_enable_battery_shutdown();
cardreader_timeout(); cardreader_timeout();
} }
...@@ -345,7 +356,7 @@ void cardreader_display_clear(void){ ...@@ -345,7 +356,7 @@ void cardreader_display_clear(void){
transport_send_message((uint8_t*)&msg, 2); transport_send_message((uint8_t*)&msg, 2);
uint8_t success; 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){ void cardreader_display_move(uint8_t x, uint8_t y){
...@@ -356,7 +367,7 @@ 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); transport_send_message((uint8_t*)&msg, 4);
uint8_t success; 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){ void cardreader_display_write_sz(char* string){
...@@ -368,7 +379,7 @@ 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); transport_send_message((uint8_t*)&msg, len+2);
uint8_t success; 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){ void cardreader_display_write_sz_P(char* string){
...@@ -380,7 +391,7 @@ 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); transport_send_message((uint8_t*)&msg, len+2);
uint8_t success; 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){ void cardreader_display_show_result(uint8_t success){
...@@ -390,4 +401,15 @@ void cardreader_display_show_result(uint8_t success){ ...@@ -390,4 +401,15 @@ void cardreader_display_show_result(uint8_t success){
} else { } else {
cardreader_display_write_sz_P(PSTR("Failed :(")); 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
...@@ -17,6 +17,7 @@ void cardreader_init(void); ...@@ -17,6 +17,7 @@ void cardreader_init(void);
void cardreader_powerup(void); void cardreader_powerup(void);
void cardreader_shutdown(void); void cardreader_shutdown(void);
uint8_t cardreader_is_powered(void); uint8_t cardreader_is_powered(void);
void card_power_request_pin_changed(uint8_t power_request);
void cardreader_process(void); void cardreader_process(void);
void cardreader_tick(void); void cardreader_tick(void);
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment