Renamed the JTAG_DEBUG_ASSERT() macro to JTAG_ASSERT().
authorDean Camera <dean@fourwalledcubicle.com>
Mon, 22 Aug 2011 13:03:56 +0000 (13:03 +0000)
committerDean Camera <dean@fourwalledcubicle.com>
Mon, 22 Aug 2011 13:03:56 +0000 (13:03 +0000)
Changed the reports in the GenericHID device demos to control the board LEDs, to reduce user confusion over the callback routines.

Fixed swapped TWI_ADDRESS_READ and TWI_ADDRESS_WRITE values.

Fixed TWI_ReadPacket() not releasing the TWI bus on read completion.

Demos/Device/ClassDriver/GenericHID/GenericHID.c
Demos/Device/LowLevel/GenericHID/GenericHID.c
Demos/Host/Incomplete/BluetoothHost/Lib/BluetoothHCICommands.c
LUFA/Common/ArchitectureSpecific.h
LUFA/Drivers/Peripheral/AVR8/TWI_AVR8.c
LUFA/Drivers/Peripheral/AVR8/TWI_AVR8.h
LUFA/ManPages/ChangeLog.txt
LUFA/ManPages/LUFAPoweredProjects.txt

index 7eea008..f44d7fc 100644 (file)
 /** Buffer to hold the previously generated HID report, for comparison purposes inside the HID class driver. */
 static uint8_t PrevHIDReportBuffer[GENERIC_REPORT_SIZE];
 
 /** Buffer to hold the previously generated HID report, for comparison purposes inside the HID class driver. */
 static uint8_t PrevHIDReportBuffer[GENERIC_REPORT_SIZE];
 
-/** Structure to contain reports from the host, so that they can be echoed back upon request */
-static struct
-{
-       uint8_t  ReportID;
-       uint16_t ReportSize;
-       uint8_t  ReportData[GENERIC_REPORT_SIZE];
-} HIDReportEcho;
-
 /** LUFA HID Class driver interface configuration and state information. This structure is
  *  passed to all HID Class driver functions, so that multiple instances of the same class
  *  within a device can be differentiated from one another.
 /** LUFA HID Class driver interface configuration and state information. This structure is
  *  passed to all HID Class driver functions, so that multiple instances of the same class
  *  within a device can be differentiated from one another.
@@ -151,13 +143,16 @@ bool CALLBACK_HID_Device_CreateHIDReport(USB_ClassInfo_HID_Device_t* const HIDIn
                                          void* ReportData,
                                          uint16_t* const ReportSize)
 {
                                          void* ReportData,
                                          uint16_t* const ReportSize)
 {
-       if (HIDReportEcho.ReportID)
-         *ReportID = HIDReportEcho.ReportID;
-
-       memcpy(ReportData, HIDReportEcho.ReportData, HIDReportEcho.ReportSize);
-
-       *ReportSize = HIDReportEcho.ReportSize;
-       return true;
+       uint8_t* Data = (uint8_t*)ReportData;
+       uint8_t  CurrLEDMask = LEDs_GetLEDs();
+               
+       Data[0] = ((CurrLEDMask & LEDS_LED1) ? 1 : 0);
+       Data[1] = ((CurrLEDMask & LEDS_LED2) ? 1 : 0);
+       Data[2] = ((CurrLEDMask & LEDS_LED3) ? 1 : 0);
+       Data[3] = ((CurrLEDMask & LEDS_LED4) ? 1 : 0);
+
+       *ReportSize = sizeof(GENERIC_REPORT_SIZE);
+       return false;
 }
 
 /** HID class driver callback function for the processing of HID reports from the host.
 }
 
 /** HID class driver callback function for the processing of HID reports from the host.
@@ -174,8 +169,21 @@ void CALLBACK_HID_Device_ProcessHIDReport(USB_ClassInfo_HID_Device_t* const HIDI
                                           const void* ReportData,
                                           const uint16_t ReportSize)
 {
                                           const void* ReportData,
                                           const uint16_t ReportSize)
 {
-       HIDReportEcho.ReportID   = ReportID;
-       HIDReportEcho.ReportSize = ReportSize;
-       memcpy(HIDReportEcho.ReportData, ReportData, ReportSize);
+       uint8_t* Data = (uint8_t*)ReportData;
+       uint8_t  NewLEDMask = LEDS_NO_LEDS;
+       
+       if (Data[0])
+         NewLEDMask |= LEDS_LED1;
+
+       if (Data[1])
+         NewLEDMask |= LEDS_LED1;
+
+       if (Data[2])
+         NewLEDMask |= LEDS_LED1;
+
+       if (Data[3])
+         NewLEDMask |= LEDS_LED1;
+         
+       LEDs_SetAllLEDs(NewLEDMask);
 }
 
 }
 
index 70ca0a5..69c4176 100644 (file)
@@ -36,9 +36,6 @@
 
 #include "GenericHID.h"
 
 
 #include "GenericHID.h"
 
-/** Static buffer to hold the last received report from the host, so that it can be echoed back in the next sent report */
-static uint8_t LastReceived[GENERIC_REPORT_SIZE];
-
 
 /** Main program entry point. This routine configures the hardware required by the application, then
  *  enters a loop to run the application tasks in sequence.
 
 /** Main program entry point. This routine configures the hardware required by the application, then
  *  enters a loop to run the application tasks in sequence.
@@ -155,13 +152,26 @@ void EVENT_USB_Device_ControlRequest(void)
 void ProcessGenericHIDReport(uint8_t* DataArray)
 {
        /*
 void ProcessGenericHIDReport(uint8_t* DataArray)
 {
        /*
-               This is where you need to process the reports being sent from the host to the device.
-               DataArray is an array holding the last report from the host. This function is called
-               each time the host has sent a report to the device.
+               This is where you need to process reports sent from the host to the device. This
+               function is called each time the host has sent a new report. DataArray is an array
+               holding the report sent from the host.
        */
 
        */
 
-       for (uint8_t i = 0; i < GENERIC_REPORT_SIZE; i++)
-         LastReceived[i] = DataArray[i];
+       uint8_t NewLEDMask = LEDS_NO_LEDS;      
+
+       if (DataArray[0])
+         NewLEDMask |= LEDS_LED1;
+
+       if (DataArray[1])
+         NewLEDMask |= LEDS_LED1;
+
+       if (DataArray[2])
+         NewLEDMask |= LEDS_LED1;
+
+       if (DataArray[3])
+         NewLEDMask |= LEDS_LED1;
+         
+       LEDs_SetAllLEDs(NewLEDMask);
 }
 
 /** Function to create the next report to send back to the host at the next reporting interval.
 }
 
 /** Function to create the next report to send back to the host at the next reporting interval.
@@ -176,8 +186,12 @@ void CreateGenericHIDReport(uint8_t* DataArray)
                an array to hold the report to the host.
        */
 
                an array to hold the report to the host.
        */
 
-       for (uint8_t i = 0; i < GENERIC_REPORT_SIZE; i++)
-         DataArray[i] = LastReceived[i];
+       uint8_t CurrLEDMask = LEDs_GetLEDs();
+               
+       DataArray[0] = ((CurrLEDMask & LEDS_LED1) ? 1 : 0);
+       DataArray[1] = ((CurrLEDMask & LEDS_LED2) ? 1 : 0);
+       DataArray[2] = ((CurrLEDMask & LEDS_LED3) ? 1 : 0);
+       DataArray[3] = ((CurrLEDMask & LEDS_LED4) ? 1 : 0);
 }
 
 void HID_Task(void)
 }
 
 void HID_Task(void)
index 35bfcdd..ed4a248 100644 (file)
@@ -44,7 +44,7 @@
 #define  INCLUDE_FROM_BLUETOOTHHCICOMMANDS_C
 #include "BluetoothHCICommands.h"
 
 #define  INCLUDE_FROM_BLUETOOTHHCICOMMANDS_C
 #include "BluetoothHCICommands.h"
 
-/** Temporary Bluetooth Device Address, for HCI responses which much include the destination address */
+/** Temporary Bluetooth Device Address, for HCI responses which must include the destination address */
 static uint8_t Bluetooth_TempDeviceAddress[6];
 
 /** Bluetooth HCI processing task. This task should be called repeatedly the main Bluetooth
 static uint8_t Bluetooth_TempDeviceAddress[6];
 
 /** Bluetooth HCI processing task. This task should be called repeatedly the main Bluetooth
index 4f29be6..3920cb9 100644 (file)
                                 *\r
                                 *  \note This macro is not available for all architectures.\r
                                 */\r
                                 *\r
                                 *  \note This macro is not available for all architectures.\r
                                 */\r
-                               #define JTAG_DEBUG_POINT()              __asm__ __volatile__ ("NOP" ::)\r
+                               #define JTAG_DEBUG_POINT()              __asm__ __volatile__ ("nop" ::)\r
 \r
                                /** Defines an explicit JTAG break point in the resulting binary via the assembly \c BREAK statement. When\r
                                 *  a JTAG is used, this causes the program execution to halt when reached until manually resumed.\r
                                 *\r
                                 *  \note This macro is not available for all architectures.\r
                                 */\r
 \r
                                /** Defines an explicit JTAG break point in the resulting binary via the assembly \c BREAK statement. When\r
                                 *  a JTAG is used, this causes the program execution to halt when reached until manually resumed.\r
                                 *\r
                                 *  \note This macro is not available for all architectures.\r
                                 */\r
-                               #define JTAG_DEBUG_BREAK()              __asm__ __volatile__ ("BREAK" ::)\r
+                               #define JTAG_DEBUG_BREAK()              __asm__ __volatile__ ("break" ::)\r
 \r
                                /** Macro for testing condition "x" and breaking via \ref JTAG_DEBUG_BREAK() if the condition is false.\r
                                 *\r
 \r
                                /** Macro for testing condition "x" and breaking via \ref JTAG_DEBUG_BREAK() if the condition is false.\r
                                 *\r
@@ -99,7 +99,7 @@
                                 *\r
                                 *  \param[in] Condition  Condition that will be evaluated.\r
                                */\r
                                 *\r
                                 *  \param[in] Condition  Condition that will be evaluated.\r
                                */\r
-                               #define JTAG_DEBUG_ASSERT(Condition)    MACROS{ if (!(Condition)) { JTAG_DEBUG_BREAK(); } }MACROE\r
+                               #define JTAG_ASSERT(Condition)          MACROS{ if (!(Condition)) { JTAG_DEBUG_BREAK(); } }MACROE\r
 \r
                                /** Macro for testing condition \c "x" and writing debug data to the stdout stream if \c false. The stdout stream\r
                                 *  must be pre-initialized before this macro is run and linked to an output device, such as the microcontroller's\r
 \r
                                /** Macro for testing condition \c "x" and writing debug data to the stdout stream if \c false. The stdout stream\r
                                 *  must be pre-initialized before this macro is run and linked to an output device, such as the microcontroller's\r
index 2f65921..d4f594f 100644 (file)
@@ -117,7 +117,7 @@ uint8_t TWI_ReadPacket(const uint8_t SlaveAddress,
        {
                while (Length--)
                {
        {
                while (Length--)
                {
-                       if (!(TWI_ReceiveByte(Buffer++, (Length == 0))))
+                       if (!(TWI_ReceiveByte(Buffer++, (Length == 1))))
                        {
                                ErrorCode = TWI_ERROR_SlaveNAK;
                                break;
                        {
                                ErrorCode = TWI_ERROR_SlaveNAK;
                                break;
index c35499e..63b9f03 100644 (file)
                        /** TWI slave device address mask for a read session. Mask with a slave device base address to obtain
                         *  the correct TWI bus address for the slave device when reading data from it.
                         */
                        /** TWI slave device address mask for a read session. Mask with a slave device base address to obtain
                         *  the correct TWI bus address for the slave device when reading data from it.
                         */
-                       #define TWI_ADDRESS_READ         0x00
+                       #define TWI_ADDRESS_READ         0x01
 
                        /** TWI slave device address mask for a write session. Mask with a slave device base address to obtain
                         *  the correct TWI bus address for the slave device when writing data to it.
                         */
 
                        /** TWI slave device address mask for a write session. Mask with a slave device base address to obtain
                         *  the correct TWI bus address for the slave device when writing data to it.
                         */
-                       #define TWI_ADDRESS_WRITE        0x01
+                       #define TWI_ADDRESS_WRITE        0x00
 
                        /** Mask to retrieve the base address for a TWI device, which can then be ORed with \ref TWI_ADDRESS_READ
                         *  or \ref TWI_ADDRESS_WRITE to obtain the device's read and write address respectively.
 
                        /** Mask to retrieve the base address for a TWI device, which can then be ORed with \ref TWI_ADDRESS_READ
                         *  or \ref TWI_ADDRESS_WRITE to obtain the device's read and write address respectively.
index d46123a..fcfce3e 100644 (file)
   *     USB_Host_ConfigurationNumber global as required
   *   - Added endian correcting code to the library USB class drivers for multiple architecture support
   *   - Removed the ENDPOINT_DESCRIPTOR_DIR_* macros, replaced by ENDPOINT_DIR_* instead
   *     USB_Host_ConfigurationNumber global as required
   *   - Added endian correcting code to the library USB class drivers for multiple architecture support
   *   - Removed the ENDPOINT_DESCRIPTOR_DIR_* macros, replaced by ENDPOINT_DIR_* instead
+  *   - Renamed the JTAG_DEBUG_ASSERT() macro to JTAG_ASSERT()
   *  - Library Applications:
   *   - Modified the Low Level and Class Driver AudioInput and AudioOutput demos to support multiple audio sample rates
   *   - Updated all host mode demos and projects to use the EVENT_USB_Host_DeviceEnumerationComplete() event callback for device configuration
   *     instead of manual host state machine manipulations in the main application task
   *  - Library Applications:
   *   - Modified the Low Level and Class Driver AudioInput and AudioOutput demos to support multiple audio sample rates
   *   - Updated all host mode demos and projects to use the EVENT_USB_Host_DeviceEnumerationComplete() event callback for device configuration
   *     instead of manual host state machine manipulations in the main application task
+  *   - Changed the reports in the GenericHID device demos to control the board LEDs, to reduce user confusion over the callback routines
   *
   *  <b>Fixed:</b>
   *  - Core:
   *
   *  <b>Fixed:</b>
   *  - Core:
@@ -71,6 +73,8 @@
   *   - Fixed lack of C++ compatibility in some internal header files causing compile errors when using LUFA in C++ projects
   *   - Fixed error in the pipe unordered allocation algorithm for the AVR8 devices breaking compatibility with some devices
   *   - Fixed USB_USBTask not being called internally in stream transfers between packets when Partial Stream Transfers are used
   *   - Fixed lack of C++ compatibility in some internal header files causing compile errors when using LUFA in C++ projects
   *   - Fixed error in the pipe unordered allocation algorithm for the AVR8 devices breaking compatibility with some devices
   *   - Fixed USB_USBTask not being called internally in stream transfers between packets when Partial Stream Transfers are used
+  *   - Fixed swapped TWI_ADDRESS_READ and TWI_ADDRESS_WRITE values
+  *   - Fixed TWI_ReadPacket() not releasing the TWI bus on read completion
   *  - Library Applications:
   *   - Fixed incorrect signature in the CDC and DFU class bootloaders for the ATMEGA8U2
   *   - Fixed KeyboardHost and KeyboardHostWithParser demos displaying incorrect values when numerical keys were pressed
   *  - Library Applications:
   *   - Fixed incorrect signature in the CDC and DFU class bootloaders for the ATMEGA8U2
   *   - Fixed KeyboardHost and KeyboardHostWithParser demos displaying incorrect values when numerical keys were pressed
index 1931dce..b715872 100644 (file)
@@ -55,6 +55,7 @@
  *  - Generic HID Device Creator: http://generichid.sourceforge.net/
  *  - Ghetto Drum, a MIDI drum controller: http://noisybox.net/art/gdrum/
  *  - Hiduino, a USB-MIDI replacement firmware for the Arduino Uno: http://code.google.com/p/hiduino/
  *  - Generic HID Device Creator: http://generichid.sourceforge.net/
  *  - Ghetto Drum, a MIDI drum controller: http://noisybox.net/art/gdrum/
  *  - Hiduino, a USB-MIDI replacement firmware for the Arduino Uno: http://code.google.com/p/hiduino/
+ *  - Ikea RGB LED USB modification: http://slashhome.se/p/projects/id/ikea_dioder_usb/#project
  *  - IR Remote to Keyboard decoder: http://netzhansa.blogspot.com/2010/04/our-living-room-hi-fi-setup-needs-mp3.html
  *  - LED Panel controller: http://projects.peterpolidoro.net/caltech/panelscontroller/panelscontroller.htm
  *  - LUFA powered DDR dance mat (French): http://logicien-parfait.fr/dokuwiki/doku.php?id=projet:ddr_repair
  *  - IR Remote to Keyboard decoder: http://netzhansa.blogspot.com/2010/04/our-living-room-hi-fi-setup-needs-mp3.html
  *  - LED Panel controller: http://projects.peterpolidoro.net/caltech/panelscontroller/panelscontroller.htm
  *  - LUFA powered DDR dance mat (French): http://logicien-parfait.fr/dokuwiki/doku.php?id=projet:ddr_repair