Device mode class driver callbacks are now fired before the control request status...
[pub/USBasp.git] / Projects / RelayBoard / RelayBoard.c
index 0923a23..2fb7b69 100644 (file)
@@ -7,6 +7,7 @@
 */\r
 \r
 /*\r
+  Copyright 2010  OBinou (obconseil [at] gmail [dot] com)\r
   Copyright 2010  Dean Camera (dean [at] fourwalledcubicle [dot] com)\r
 \r
   Permission to use, copy, modify, distribute, and sell this\r
@@ -43,6 +44,8 @@
 int main(void)\r
 {\r
        SetupHardware();\r
+       \r
+       sei();\r
 \r
        for (;;)\r
          USB_USBTask();\r
@@ -62,8 +65,8 @@ void SetupHardware(void)
        USB_Init();\r
 \r
        /* Initialize Relays */\r
-       DDRC  |= ALL_RELAYS;\r
-       PORTC |= ALL_RELAYS;\r
+       DDRC  |=  ALL_RELAYS;\r
+       PORTC &= ~ALL_RELAYS;\r
 }\r
 \r
 \r
@@ -76,8 +79,8 @@ void EVENT_USB_Device_ConfigurationChanged(void)
 /** Event handler for the library USB Unhandled Control Packet event. */\r
 void EVENT_USB_Device_UnhandledControlRequest(void)\r
 {\r
-    const uint8_t serial[5] = { 0, 0, 0, 0, 1 };\r
-       uint8_t data[2]         = { 0, 0 };\r
+    const uint8_t SerialNumber[5] = { 0, 0, 0, 0, 1 };\r
+       uint8_t ControlData[2]        = { 0, 0 };\r
 \r
     switch (USB_ControlRequest.bRequest)\r
        {\r
@@ -88,20 +91,22 @@ void EVENT_USB_Device_UnhandledControlRequest(void)
 \r
                                Endpoint_ClearSETUP();\r
 \r
-                               Endpoint_Read_Control_Stream_LE(data, sizeof(data));\r
+                               Endpoint_Read_Control_Stream_LE(ControlData, sizeof(ControlData));\r
                                Endpoint_ClearIN();\r
 \r
                                switch (USB_ControlRequest.wValue)\r
                                {\r
                                        case 0x303:\r
-                                               if (data[1]) PORTC |= RELAY1; else PORTC &= ~RELAY1; break;\r
+                                               if (ControlData[1]) PORTC &= ~RELAY1; else PORTC |= RELAY1;\r
+                                               break;\r
                                        case 0x306:\r
-                                               if (data[1]) PORTC |= RELAY2; else PORTC &= ~RELAY2; break;\r
+                                               if (ControlData[1]) PORTC &= ~RELAY2; else PORTC |= RELAY2;\r
+                                               break;\r
                                        case 0x309:\r
-                                               if (data[1]) PORTC |= RELAY3; else PORTC &= ~RELAY3; break;\r
+                                               if (ControlData[1]) PORTC &= ~RELAY3; else PORTC |= RELAY3;\r
+                                               break;\r
                                        case 0x30c:\r
-                                               if (data[1]) PORTC |= RELAY4; else PORTC &= ~RELAY4; break;\r
-                                       default:\r
+                                               if (ControlData[1]) PORTC &= ~RELAY4; else PORTC |= RELAY4;\r
                                                break;\r
                                }\r
                        }\r
@@ -117,22 +122,24 @@ void EVENT_USB_Device_UnhandledControlRequest(void)
                                switch (USB_ControlRequest.wValue)\r
                                {\r
                                        case 0x301:\r
-                                               Endpoint_Write_Control_Stream_LE(serial, sizeof(serial));\r
+                                               Endpoint_Write_Control_Stream_LE(SerialNumber, sizeof(SerialNumber));\r
                                                break;\r
                                        case 0x303:\r
-                                               if (PORTC & RELAY1) data[1]=3; else data[1]=2; break;\r
+                                               ControlData[1] = (PORTC & RELAY1) ? 2 : 3;\r
+                                               break;\r
                                        case 0x306:\r
-                                               if (PORTC & RELAY2) data[1]=3; else data[1]=2; break;\r
+                                               ControlData[1] = (PORTC & RELAY2) ? 2 : 3;\r
+                                               break;\r
                                        case 0x309:\r
-                                               if (PORTC & RELAY3) data[1]=3; else data[1]=2; break;\r
+                                               ControlData[1] = (PORTC & RELAY3) ? 2 : 3;\r
+                                               break;\r
                                        case 0x30c:\r
-                                               if (PORTC & RELAY4) data[1]=3; else data[1]=2; break;\r
-                                       default:\r
+                                               ControlData[1] = (PORTC & RELAY4) ? 2 : 3;\r
                                                break;\r
                                }\r
                                \r
-                               if (data[1])\r
-                                 Endpoint_Write_Control_Stream_LE(data, sizeof(data));\r
+                               if (ControlData[1])\r
+                                 Endpoint_Write_Control_Stream_LE(ControlData, sizeof(ControlData));\r
 \r
                                Endpoint_ClearOUT();\r
                        }\r