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.
/** 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.
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.
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);
-/** 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.
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.
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);
#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
*\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
*\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
- if (!(TWI_ReceiveByte(Buffer++, (Length == 0))))
+ if (!(TWI_ReceiveByte(Buffer++, (Length == 1))))
{
ErrorCode = TWI_ERROR_SlaveNAK;
break;
{
ErrorCode = TWI_ERROR_SlaveNAK;
break;
/** 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.
* 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:
* - 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
* - 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