/*
              LUFA Library
-     Copyright (C) Dean Camera, 2013.
+     Copyright (C) Dean Camera, 2014.
 
   dean [at] fourwalledcubicle [dot] com
            www.lufa-lib.org
 */
 
 /*
-  Copyright 2013  Dean Camera (dean [at] fourwalledcubicle [dot] com)
+  Copyright 2014  Dean Camera (dean [at] fourwalledcubicle [dot] com)
 
   Permission to use, copy, modify, distribute, and sell this
   software and its documentation for any purpose is hereby granted
        {
                .Config =
                        {
-                               .InterfaceNumber           = 0,
+                               .InterfaceNumber           = INTERFACE_ID_MassStorage,
                                .DataINEndpoint            =
                                        {
                                                .Address           = MASS_STORAGE_IN_EPADDR,
        {
                .Config =
                        {
-                               .InterfaceNumber              = 1,
+                               .InterfaceNumber              = INTERFACE_ID_HID,
                                .ReportINEndpoint             =
                                        {
                                                .Address              = GENERIC_IN_EPADDR,
 /** ISR to handle the 500ms ticks for sampling and data logging */
 ISR(TIMER1_COMPA_vect, ISR_BLOCK)
 {
-       uint8_t LEDMask = LEDs_GetLEDs();
+       /* Signal a 500ms tick has elapsed to the RTC */
+       RTC_Tick500ms();
 
        /* Check to see if the logging interval has expired */
        if (++CurrentLoggingTicks < LoggingInterval500MS_SRAM)
        /* Reset log tick counter to prepare for next logging interval */
        CurrentLoggingTicks = 0;
 
+       uint8_t LEDMask = LEDs_GetLEDs();
        LEDs_SetAllLEDs(LEDMASK_USB_BUSY);
 
        /* Only log when not connected to a USB host */
        if (USB_DeviceState == DEVICE_STATE_Unattached)
        {
                TimeDate_t CurrentTimeDate;
-               DS1307_GetTimeDate(&CurrentTimeDate);
+               RTC_GetTimeDate(&CurrentTimeDate);
 
                char     LineBuffer[100];
                uint16_t BytesWritten;
 
        /* Get the current date for the filename as "DDMMYY.csv" */
        TimeDate_t CurrentTimeDate;
-       DS1307_GetTimeDate(&CurrentTimeDate);
+       RTC_GetTimeDate(&CurrentTimeDate);
        sprintf(LogFileName, "%02d%02d%02d.csv", CurrentTimeDate.Day, CurrentTimeDate.Month, CurrentTimeDate.Year);
 
        /* Mount the storage device, open the file */
 
        /* Hardware Initialization */
        LEDs_Init();
-       SPI_Init(SPI_SPEED_FCPU_DIV_2 | SPI_SCK_LEAD_FALLING | SPI_SAMPLE_TRAILING | SPI_MODE_MASTER);
        ADC_Init(ADC_FREE_RUNNING | ADC_PRESCALE_128);
        Temperature_Init();
        Dataflash_Init();
        USB_Init();
        TWI_Init(TWI_BIT_PRESCALE_4, TWI_BITLENGTH_FROM_FREQ(4, 50000));
+       RTC_Init();
 
        /* 500ms logging interval timer configuration */
-       OCR1A   = (((F_CPU / 1024) / 2) - 1);
-       TCCR1B  = (1 << WGM12) | (1 << CS12) | (1 << CS10);
+       OCR1A   = (((F_CPU / 256) / 2) - 1);
+       TCCR1B  = (1 << WGM12) | (1 << CS12);
        TIMSK1  = (1 << OCIE1A);
 
        /* Check if the Dataflash is working, abort if not */
 {
        Device_Report_t* ReportParams = (Device_Report_t*)ReportData;
 
-       DS1307_GetTimeDate(&ReportParams->TimeDate);
+       RTC_GetTimeDate(&ReportParams->TimeDate);
 
        ReportParams->LogInterval500MS = LoggingInterval500MS_SRAM;
 
 {
        Device_Report_t* ReportParams = (Device_Report_t*)ReportData;
 
-       DS1307_SetTimeDate(&ReportParams->TimeDate);
+       RTC_SetTimeDate(&ReportParams->TimeDate);
 
        /* If the logging interval has changed from its current value, write it to EEPROM */
        if (LoggingInterval500MS_SRAM != ReportParams->LogInterval500MS)