/* * spreadspace avr utils * * * Copyright (C) 2013 Christian Pointner * Othmar Gsenger * * This file is part of spreadspace avr utils. * * spreadspace avr utils is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * any later version. * * spreadspace avr utils is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with spreadspace avr utils. If not, see . */ #include #include #include #include #include #include #include "util.h" #include "led.h" #include "heartbeat.h" #include "stepper.h" #include "ledmatrix.h" #include "sl018.h" #include "LUFA/Drivers/Peripheral/TWI.h" #include "LUFA/Drivers/Peripheral/Serial.h" #include "LUFA/Drivers/Misc/RingBuffer.h" #include #define EEPROM_SIZE 1024 typedef uint8_t keyslot_t[8]; keyslot_t EEMEM keystore[EEPROM_SIZE/sizeof(keyslot_t)]; FILE usb_stream; FILE serial_stream; FILE * stdio = &serial_stream; /* LUFA Library Copyright (C) Dean Camera, 2012. dean [at] fourwalledcubicle [dot] com www.lufa-lib.org */ #include #include "lufa-descriptor-usbserial.h" USB_ClassInfo_CDC_Device_t VirtualSerial_CDC_Interface = { .Config = { .ControlInterfaceNumber = 0, .DataINEndpointNumber = CDC_TX_EPNUM, .DataINEndpointSize = CDC_TXRX_EPSIZE, .DataINEndpointDoubleBank = false, .DataOUTEndpointNumber = CDC_RX_EPNUM, .DataOUTEndpointSize = CDC_TXRX_EPSIZE, .DataOUTEndpointDoubleBank = false, .NotificationEndpointNumber = CDC_NOTIFICATION_EPNUM, .NotificationEndpointSize = CDC_NOTIFICATION_EPSIZE, .NotificationEndpointDoubleBank = false, }, }; void EVENT_USB_Device_ConfigurationChanged(void) { CDC_Device_ConfigureEndpoints(&VirtualSerial_CDC_Interface); } void EVENT_USB_Device_ControlRequest(void) { CDC_Device_ProcessControlRequest(&VirtualSerial_CDC_Interface); } void EVENT_CDC_Device_ControLineStateChanged(USB_ClassInfo_CDC_Device_t* const CDCInterfaceInfo) { if(CDCInterfaceInfo->State.ControlLineStates.HostToDevice & CDC_CONTROL_LINE_OUT_DTR) stdio = &usb_stream; else stdio = &serial_stream; } void EVENT_USB_Device_Disconnect(void) { stdio = &serial_stream; } /* end LUFA CDC-ACM specific definitions*/ int16_t stdio_bytes_received(void) { if(stdio == &usb_stream) return CDC_Device_BytesReceived(&VirtualSerial_CDC_Interface); else return (int16_t)Serial_IsCharReceived(); } void flash_keystore_from_stdio(void) { keyslot_t ks; uint8_t byte_pos=0; fprintf(stdio,"Flashing keys:\n\r"); fflush(stdio); for(uint8_t ks_pos=0;ks_pos 0) { ks[byte_pos++]=fgetc(stdio); bytes_received--; if (byte_pos == sizeof(ks)) { byte_pos=0; eeprom_update_block(&ks,&keystore[ks_pos],sizeof(ks)); ks_pos++; fputc('.', stdio); fflush(stdio); led_toggle(); } } } fprintf(stdio,"\n"); fputc(0, stdio); led_off(); } void dump_keystore_to_stdio(void) { keyslot_t ks; for(uint8_t ks_pos=0;ks_pos 0) handle_stdio(fgetc(stdio)); if (sl018_check_for_new_card(stdio)) handle_card(); handle_heartbeat(); } }