Added new Relay Controller Board project (thanks to OBinou).
[pub/USBasp.git] / Demos / Device / LowLevel / Joystick / Joystick.c
index 8c50a2c..0edead5 100644 (file)
@@ -1,21 +1,21 @@
 /*\r
              LUFA Library\r
 /*\r
              LUFA Library\r
-     Copyright (C) Dean Camera, 2009.\r
+     Copyright (C) Dean Camera, 2010.\r
               \r
   dean [at] fourwalledcubicle [dot] com\r
       www.fourwalledcubicle.com\r
 */\r
 \r
 /*\r
               \r
   dean [at] fourwalledcubicle [dot] com\r
       www.fourwalledcubicle.com\r
 */\r
 \r
 /*\r
-  Copyright 2009  Dean Camera (dean [at] fourwalledcubicle [dot] com)\r
-\r
-  Permission to use, copy, modify, and distribute this software\r
-  and its documentation for any purpose and without fee is hereby\r
-  granted, provided that the above copyright notice appear in all\r
-  copies and that both that the copyright notice and this\r
-  permission notice and warranty disclaimer appear in supporting\r
-  documentation, and that the name of the author not be used in\r
-  advertising or publicity pertaining to distribution of the\r
+  Copyright 2010  Dean Camera (dean [at] fourwalledcubicle [dot] com)\r
+\r
+  Permission to use, copy, modify, distribute, and sell this \r
+  software and its documentation for any purpose is hereby granted\r
+  without fee, provided that the above copyright notice appear in \r
+  all copies and that both that the copyright notice and this\r
+  permission notice and warranty disclaimer appear in supporting \r
+  documentation, and that the name of the author not be used in \r
+  advertising or publicity pertaining to distribution of the \r
   software without specific, written prior permission.\r
 \r
   The author disclaim all warranties with regard to this\r
   software without specific, written prior permission.\r
 \r
   The author disclaim all warranties with regard to this\r
 \r
 #include "Joystick.h"\r
 \r
 \r
 #include "Joystick.h"\r
 \r
-/* Scheduler Task List */\r
-TASK_LIST\r
-{\r
-       { .Task = USB_USBTask          , .TaskStatus = TASK_STOP },\r
-       { .Task = USB_Joystick_Report  , .TaskStatus = TASK_STOP },\r
-};\r
-\r
 /** Main program entry point. This routine configures the hardware required by the application, then\r
 /** Main program entry point. This routine configures the hardware required by the application, then\r
- *  starts the scheduler to run the application tasks.\r
+ *  enters a loop to run the application tasks in sequence.\r
  */\r
 int main(void)\r
 {\r
  */\r
 int main(void)\r
 {\r
+       SetupHardware();\r
+       \r
+       LEDs_SetAllLEDs(LEDMASK_USB_NOTREADY);\r
+\r
+       for (;;)\r
+       {\r
+               HID_Task();\r
+               USB_USBTask();\r
+       }\r
+}\r
+\r
+/** Configures the board hardware and chip peripherals for the demo's functionality. */\r
+void SetupHardware(void)\r
+{\r
        /* Disable watchdog if enabled by bootloader/fuses */\r
        MCUSR &= ~(1 << WDRF);\r
        wdt_disable();\r
        /* Disable watchdog if enabled by bootloader/fuses */\r
        MCUSR &= ~(1 << WDRF);\r
        wdt_disable();\r
@@ -59,67 +66,49 @@ int main(void)
        Joystick_Init();\r
        LEDs_Init();\r
        Buttons_Init();\r
        Joystick_Init();\r
        LEDs_Init();\r
        Buttons_Init();\r
-       \r
-       /* Indicate USB not ready */\r
-       UpdateStatus(Status_USBNotReady);\r
-       \r
-       /* Initialize Scheduler so that it can be used */\r
-       Scheduler_Init();\r
-\r
-       /* Initialize USB Subsystem */\r
        USB_Init();\r
        USB_Init();\r
-\r
-       /* Scheduling - routine never returns, so put this last in the main function */\r
-       Scheduler_Start();\r
 }\r
 \r
 /** Event handler for the USB_Connect event. This indicates that the device is enumerating via the status LEDs and\r
  *  starts the library USB task to begin the enumeration and USB management process.\r
  */\r
 }\r
 \r
 /** Event handler for the USB_Connect event. This indicates that the device is enumerating via the status LEDs and\r
  *  starts the library USB task to begin the enumeration and USB management process.\r
  */\r
-void EVENT_USB_Connect(void)\r
+void EVENT_USB_Device_Connect(void)\r
 {\r
 {\r
-       /* Start USB management task */\r
-       Scheduler_SetTaskMode(USB_USBTask, TASK_RUN);\r
-\r
        /* Indicate USB enumerating */\r
        /* Indicate USB enumerating */\r
-       UpdateStatus(Status_USBEnumerating);\r
+       LEDs_SetAllLEDs(LEDMASK_USB_ENUMERATING);\r
 }\r
 \r
 /** Event handler for the USB_Disconnect event. This indicates that the device is no longer connected to a host via\r
  *  the status LEDs and stops the USB management and joystick reporting tasks.\r
  */\r
 }\r
 \r
 /** Event handler for the USB_Disconnect event. This indicates that the device is no longer connected to a host via\r
  *  the status LEDs and stops the USB management and joystick reporting tasks.\r
  */\r
-void EVENT_USB_Disconnect(void)\r
+void EVENT_USB_Device_Disconnect(void)\r
 {\r
 {\r
-       /* Stop running joystick reporting and USB management tasks */\r
-       Scheduler_SetTaskMode(USB_Joystick_Report, TASK_STOP);\r
-       Scheduler_SetTaskMode(USB_USBTask, TASK_STOP);\r
-\r
        /* Indicate USB not ready */\r
        /* Indicate USB not ready */\r
-       UpdateStatus(Status_USBNotReady);\r
+       LEDs_SetAllLEDs(LEDMASK_USB_NOTREADY);\r
 }\r
 \r
 /** Event handler for the USB_ConfigurationChanged event. This is fired when the host set the current configuration\r
  *  of the USB device after enumeration - the device endpoints are configured and the joystick reporting task started.\r
  */ \r
 }\r
 \r
 /** Event handler for the USB_ConfigurationChanged event. This is fired when the host set the current configuration\r
  *  of the USB device after enumeration - the device endpoints are configured and the joystick reporting task started.\r
  */ \r
-void EVENT_USB_ConfigurationChanged(void)\r
+void EVENT_USB_Device_ConfigurationChanged(void)\r
 {\r
 {\r
-       /* Setup Joystick Report Endpoint */\r
-       Endpoint_ConfigureEndpoint(JOYSTICK_EPNUM, EP_TYPE_INTERRUPT,\r
-                                      ENDPOINT_DIR_IN, JOYSTICK_EPSIZE,\r
-                                  ENDPOINT_BANK_SINGLE);\r
-\r
        /* Indicate USB connected and ready */\r
        /* Indicate USB connected and ready */\r
-       UpdateStatus(Status_USBReady);\r
+       LEDs_SetAllLEDs(LEDMASK_USB_READY);\r
 \r
 \r
-       /* Start joystick reporting task */\r
-       Scheduler_SetTaskMode(USB_Joystick_Report, TASK_RUN);\r
+       /* Setup Joystick Report Endpoint */\r
+       if (!(Endpoint_ConfigureEndpoint(JOYSTICK_EPNUM, EP_TYPE_INTERRUPT,\r
+                                            ENDPOINT_DIR_IN, JOYSTICK_EPSIZE,\r
+                                        ENDPOINT_BANK_SINGLE)))\r
+       {\r
+               LEDs_SetAllLEDs(LEDMASK_USB_ERROR);\r
+       }\r
 }\r
 \r
 }\r
 \r
-/** Event handler for the USB_UnhandledControlPacket event. This is used to catch standard and class specific\r
+/** Event handler for the USB_UnhandledControlRequest event. This is used to catch standard and class specific\r
  *  control requests that are not handled internally by the USB library (including the HID commands, which are\r
  *  all issued via the control endpoint), so that they can be handled appropriately for the application.\r
  */\r
  *  control requests that are not handled internally by the USB library (including the HID commands, which are\r
  *  all issued via the control endpoint), so that they can be handled appropriately for the application.\r
  */\r
-void EVENT_USB_UnhandledControlPacket(void)\r
+void EVENT_USB_Device_UnhandledControlRequest(void)\r
 {\r
        /* Handle HID Class specific requests */\r
        switch (USB_ControlRequest.bRequest)\r
 {\r
        /* Handle HID Class specific requests */\r
        switch (USB_ControlRequest.bRequest)\r
@@ -147,7 +136,7 @@ void EVENT_USB_UnhandledControlPacket(void)
 \r
 /** Fills the given HID report data structure with the next HID report to send to the host.\r
  *\r
 \r
 /** Fills the given HID report data structure with the next HID report to send to the host.\r
  *\r
- *  \param ReportData  Pointer to a HID report data structure to be filled\r
+ *  \param[out] ReportData  Pointer to a HID report data structure to be filled\r
  *\r
  *  \return Boolean true if the new report differs from the last report, false otherwise\r
  */\r
  *\r
  *  \return Boolean true if the new report differs from the last report, false otherwise\r
  */\r
@@ -167,10 +156,10 @@ bool GetNextReport(USB_JoystickReport_Data_t* ReportData)
        else if (JoyStatus_LCL & JOY_DOWN)\r
          ReportData->Y =  100;\r
 \r
        else if (JoyStatus_LCL & JOY_DOWN)\r
          ReportData->Y =  100;\r
 \r
-       if (JoyStatus_LCL & JOY_RIGHT)\r
-         ReportData->X =  100;\r
-       else if (JoyStatus_LCL & JOY_LEFT)\r
+       if (JoyStatus_LCL & JOY_LEFT)\r
          ReportData->X = -100;\r
          ReportData->X = -100;\r
+       else if (JoyStatus_LCL & JOY_RIGHT)\r
+         ReportData->X =  100;\r
 \r
        if (JoyStatus_LCL & JOY_PRESS)\r
          ReportData->Button  = (1 << 1);\r
 \r
        if (JoyStatus_LCL & JOY_PRESS)\r
          ReportData->Button  = (1 << 1);\r
@@ -189,58 +178,31 @@ bool GetNextReport(USB_JoystickReport_Data_t* ReportData)
        return InputChanged;\r
 }\r
 \r
        return InputChanged;\r
 }\r
 \r
-/** Function to manage status updates to the user. This is done via LEDs on the given board, if available, but may be changed to\r
- *  log to a serial port, or anything else that is suitable for status updates.\r
- *\r
- *  \param CurrentStatus  Current status of the system, from the Joystick_StatusCodes_t enum\r
- */\r
-void UpdateStatus(uint8_t CurrentStatus)\r
+/** Function to manage HID report generation and transmission to the host. */\r
+void HID_Task(void)\r
 {\r
 {\r
-       uint8_t LEDMask = LEDS_NO_LEDS;\r
-       \r
-       /* Set the LED mask to the appropriate LED mask based on the given status code */\r
-       switch (CurrentStatus)\r
+       /* Device must be connected and configured for the task to run */\r
+       if (USB_DeviceState != DEVICE_STATE_Configured)\r
+         return;\r
+  \r
+       /* Select the Joystick Report Endpoint */\r
+       Endpoint_SelectEndpoint(JOYSTICK_EPNUM);\r
+\r
+       /* Check to see if the host is ready for another packet */\r
+       if (Endpoint_IsINReady())\r
        {\r
        {\r
-               case Status_USBNotReady:\r
-                       LEDMask = (LEDS_LED1);\r
-                       break;\r
-               case Status_USBEnumerating:\r
-                       LEDMask = (LEDS_LED1 | LEDS_LED2);\r
-                       break;\r
-               case Status_USBReady:\r
-                       LEDMask = (LEDS_LED2 | LEDS_LED4);\r
-                       break;\r
-       }\r
+               USB_JoystickReport_Data_t JoystickReportData;\r
+               \r
+               /* Create the next HID report to send to the host */\r
+               GetNextReport(&JoystickReportData);\r
        \r
        \r
-       /* Set the board LEDs to the new LED mask */\r
-       LEDs_SetAllLEDs(LEDMask);\r
-}\r
+               /* Write Joystick Report Data */\r
+               Endpoint_Write_Stream_LE(&JoystickReportData, sizeof(JoystickReportData));\r
 \r
 \r
-/** Function to manage HID report generation and transmission to the host. */\r
-TASK(USB_Joystick_Report)\r
-{\r
-       /* Check if the USB System is connected to a Host */\r
-       if (USB_IsConnected)\r
-       {\r
-               /* Select the Joystick Report Endpoint */\r
-               Endpoint_SelectEndpoint(JOYSTICK_EPNUM);\r
-\r
-               /* Check to see if the host is ready for another packet */\r
-               if (Endpoint_IsINReady())\r
-               {\r
-                       USB_JoystickReport_Data_t JoystickReportData;\r
-                       \r
-                       /* Create the next HID report to send to the host */\r
-                       GetNextReport(&JoystickReportData);\r
+               /* Finalize the stream transfer to send the last packet */\r
+               Endpoint_ClearIN();\r
                \r
                \r
-                       /* Write Joystick Report Data */\r
-                       Endpoint_Write_Stream_LE(&JoystickReportData, sizeof(JoystickReportData));\r
-\r
-                       /* Finalize the stream transfer to send the last packet */\r
-                       Endpoint_ClearIN();\r
-                       \r
-                       /* Clear the report data afterwards */\r
-                       memset(&JoystickReportData, 0, sizeof(JoystickReportData));\r
-               }\r
+               /* Clear the report data afterwards */\r
+               memset(&JoystickReportData, 0, sizeof(JoystickReportData));\r
        }\r
 }\r
        }\r
 }\r