From 02eff4be14630986b664f25f5afbad383ab8189f Mon Sep 17 00:00:00 2001 From: Christian Pointner Date: Tue, 29 Jan 2013 21:33:29 +0000 Subject: better handling for stdio (usb vs serial - works now) update-keys still not working over serial ...?? git-svn-id: https://svn.spreadspace.org/avr/trunk@95 aa12f405-d877-488e-9caf-2d797e2a1cc7 --- usb-i2c-sl018/tuer-rfid.c | 30 ++++++++++++++++++++---------- usb-i2c-sl018/update-keys.c | 3 +++ 2 files changed, 23 insertions(+), 10 deletions(-) diff --git a/usb-i2c-sl018/tuer-rfid.c b/usb-i2c-sl018/tuer-rfid.c index e991302..f6fe870 100644 --- a/usb-i2c-sl018/tuer-rfid.c +++ b/usb-i2c-sl018/tuer-rfid.c @@ -111,8 +111,9 @@ typedef struct __attribute__((__packed__)) sl018_message_t* recv_twi_msg = (sl018_message_t *)&recv_twi_buf; uint8_t card_status =0; -FILE stdio_stream; -FILE * stdio = &stdio_stream; +FILE usb_stream; +FILE serial_stream; +FILE * stdio = &serial_stream; /* LUFA Library @@ -149,7 +150,8 @@ USB_ClassInfo_CDC_Device_t VirtualSerial_CDC_Interface = void EVENT_USB_Device_ConfigurationChanged(void) { CDC_Device_ConfigureEndpoints(&VirtualSerial_CDC_Interface); - CDC_Device_CreateStream(&VirtualSerial_CDC_Interface,stdio); + CDC_Device_CreateStream(&VirtualSerial_CDC_Interface,&usb_stream); + stdio = &usb_stream; } void EVENT_USB_Device_ControlRequest(void) @@ -159,11 +161,18 @@ void EVENT_USB_Device_ControlRequest(void) void EVENT_USB_Device_Disconnect(void) { - Serial_CreateStream(stdio); + stdio = &serial_stream; } /* end LUFA CDC-ACM specific definitions*/ +int16_t stdio_BytesReceived(void) +{ + if(stdio == &usb_stream) + return CDC_Device_BytesReceived(&VirtualSerial_CDC_Interface); + else + return (int16_t)Serial_IsCharReceived(); +} bool sl018_cmd_raw(const uint8_t * send_twi_buf) { @@ -228,7 +237,7 @@ void flash_eeprom_from_stdio(void) fprintf(stdio,"Flashing keys:\n\r"); fflush(stdio); for(keyslot_pos=0;keyslot_pos0) { keyslot.byte[byte_pos++]=fgetc(stdio); BytesReceived--; @@ -260,8 +269,7 @@ void dump_eeprom_to_stdio(void) } } - -void handle_cmd(uint8_t cmd) +void handle_stdio(uint8_t cmd) { switch(cmd) { case 'r': @@ -365,6 +373,8 @@ void handle_card(void) } } + + int main(void) { MCUSR &= ~(1 << WDRF); @@ -376,11 +386,11 @@ int main(void) TWI_Init(TWI_BIT_PRESCALE_1, TWI_BITLENGTH_FROM_FREQ(1, 200000)); sei(); Serial_Init(115200,false); - Serial_CreateStream(stdio); + Serial_CreateStream(&serial_stream); for(;;) { - int16_t BytesReceived = CDC_Device_BytesReceived(&VirtualSerial_CDC_Interface); + int16_t BytesReceived = stdio_BytesReceived(); if(BytesReceived > 0) { - handle_cmd(fgetc(stdio)); + handle_stdio(fgetc(stdio)); } if(CARD_PRESENT != card_status) { card_status = CARD_PRESENT; diff --git a/usb-i2c-sl018/update-keys.c b/usb-i2c-sl018/update-keys.c index efeca83..9428fc3 100644 --- a/usb-i2c-sl018/update-keys.c +++ b/usb-i2c-sl018/update-keys.c @@ -40,6 +40,7 @@ uint8_t generate_csum(keyslot_t data) void send_key(keyslot_t key, FILE* dev) { fwrite(key, sizeof(keyslot_t), 1, dev); + fflush(dev); char tmp; while(fread(&tmp, 1, 1, dev)) { fwrite(&tmp, 1, 1, stdout); @@ -64,6 +65,8 @@ int main(int argc, char* argv[]) int fd = fileno(dev); struct termios t; tcgetattr(fd, &t); + t.c_lflag &= ~(ICANON | ECHO); + t.c_iflag &= ~(ICRNL | INLCR | IXON | IXOFF); cfmakeraw(&t); tcflush(fd, TCIOFLUSH); tcsetattr(fd, TCSANOW, &t); -- cgit v1.2.3