/*
-         USB Missile Launcher Demo
-        Copyright (C) Dave Fletcher, 2010.
-         fletch at fletchtronics dot net
+            USB Missile Launcher Demo
+        Copyright (C) Dave Fletcher, 2010.
+         fletch at fletchtronics dot net
 
-        Based on research by Scott Weston at
-         http://code.google.com/p/pymissile
+       Based on research by Scott Weston at
+        http://code.google.com/p/pymissile
  */
 
 /*
-  Copyright 2011  Dean Camera (dean [at] fourwalledcubicle [dot] com)
+  Copyright 2018  Dean Camera (dean [at] fourwalledcubicle [dot] com)
   Copyright 2010  Dave Fletcher (fletch [at] fletchtronics [dot] net)
 
   Permission to use, copy, modify, distribute, and sell this
   advertising or publicity pertaining to distribution of the
   software without specific, written prior permission.
 
-  The author disclaim all warranties with regard to this
+  The author disclaims all warranties with regard to this
   software, including all implied warranties of merchantability
   and fitness.  In no event shall the author be liable for any
   special, indirect or consequential damages or any damages
        CmdState = CMD_STOP;
 
        LEDs_SetAllLEDs(LEDMASK_USB_NOTREADY);
-       sei();
+       GlobalInterruptEnable();
 
        for (;;)
        {
                Read_Joystick_Status();
+               DiscardNextReport();
 
-               HID_Host_Task();
                USB_USBTask();
        }
 }
 /** Configures the board hardware and chip peripherals for the demo's functionality. */
 void SetupHardware(void)
 {
+#if (ARCH == ARCH_AVR8)
        /* Disable watchdog if enabled by bootloader/fuses */
        MCUSR &= ~(1 << WDRF);
        wdt_disable();
 
        /* Disable clock division */
        clock_prescale_set(clock_div_1);
+#endif
 
        /* Hardware Initialization */
        LEDs_Init();
        WriteNextReport(CmdBuffer, ReportSize);
 }
 
-/** Sends one of the CMD_* command constants to the attached device.
+/** Sends one of the \c CMD_* command constants to the attached device.
  *
  *  \param[in] Command  One of the command constants.
  */
  */
 void EVENT_USB_Host_DeviceEnumerationComplete(void)
 {
+       LEDs_SetAllLEDs(LEDMASK_USB_ENUMERATING);
+
+       /* Get and process the configuration descriptor data */
+       if (ProcessConfigurationDescriptor() != SuccessfulConfigRead)
+       {
+               LEDs_SetAllLEDs(LEDMASK_USB_ERROR);
+               return;
+       }
+
+       /* Set the device configuration to the first configuration (rarely do devices use multiple configurations) */
+       if (USB_Host_SetDeviceConfiguration(1) != HOST_SENDCONTROL_Successful)
+       {
+               LEDs_SetAllLEDs(LEDMASK_USB_ERROR);
+               return;
+       }
+
        LEDs_SetAllLEDs(LEDMASK_USB_READY);
 }
 
 /** Reads in and discards the next report from the attached device. */
 void DiscardNextReport(void)
 {
+       if (USB_HostState != HOST_STATE_Configured)
+         return;
+
        /* Select and unfreeze HID data IN pipe */
        Pipe_SelectPipe(HID_DATA_IN_PIPE);
        Pipe_Unfreeze();
 void WriteNextReport(uint8_t* const ReportOUTData,
                      const uint16_t ReportLength)
 {
+       if (USB_HostState != HOST_STATE_Configured)
+         return;
+
        /* Select and unfreeze HID data OUT pipe */
        Pipe_SelectPipe(HID_DATA_OUT_PIPE);
 
        }
 }
 
-/** Task to set the configuration of the attached device after it has been enumerated, and to read and process
- *  HID reports from the device and to send reports if desired.
- */
-void HID_Host_Task(void)
-{
-       uint8_t ErrorCode;
-
-       /* Switch to determine what user-application handled host state the host state machine is in */
-       switch (USB_HostState)
-       {
-               case HOST_STATE_Addressed:
-                       /* Get and process the configuration descriptor data */
-                       if ((ErrorCode = ProcessConfigurationDescriptor()) != SuccessfulConfigRead)
-                       {
-                               /* Indicate error status */
-                               LEDs_SetAllLEDs(LEDMASK_USB_ERROR);
-
-                               /* Wait until USB device disconnected */
-                               USB_HostState = HOST_STATE_WaitForDeviceRemoval;
-                               break;
-                       }
-
-                       /* Set the device configuration to the first configuration (rarely do devices use multiple configurations) */
-                       if ((ErrorCode = USB_Host_SetDeviceConfiguration(1)) != HOST_SENDCONTROL_Successful)
-                       {
-                               /* Indicate error status */
-                               LEDs_SetAllLEDs(LEDMASK_USB_ERROR);
-
-                               /* Wait until USB device disconnected */
-                               USB_HostState = HOST_STATE_WaitForDeviceRemoval;
-                               break;
-                       }
-
-                       USB_HostState = HOST_STATE_Configured;
-                       break;
-               case HOST_STATE_Configured:
-                       DiscardNextReport();
-
-                       break;
-       }
-}
-