Commit d0ac8e46 authored by Dean Camera's avatar Dean Camera
Browse files

Renamed the JTAG_DEBUG_ASSERT() macro to JTAG_ASSERT().

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.
parent 40946a57
......@@ -39,14 +39,6 @@
/** 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.
......@@ -151,13 +143,16 @@ bool CALLBACK_HID_Device_CreateHIDReport(USB_ClassInfo_HID_Device_t* const HIDIn
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.
......@@ -174,8 +169,21 @@ void CALLBACK_HID_Device_ProcessHIDReport(USB_ClassInfo_HID_Device_t* const HIDI
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);
}
......@@ -36,9 +36,6 @@
#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.
......@@ -155,13 +152,26 @@ void EVENT_USB_Device_ControlRequest(void)
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.
......@@ -176,8 +186,12 @@ void CreateGenericHIDReport(uint8_t* DataArray)
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)
......
......@@ -44,7 +44,7 @@
#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
......
......@@ -84,14 +84,14 @@
*
* \note This macro is not available for all architectures.
*/
#define JTAG_DEBUG_POINT() __asm__ __volatile__ ("NOP" ::)
#define JTAG_DEBUG_POINT() __asm__ __volatile__ ("nop" ::)
/** Defines an explicit JTAG break point in the resulting binary via the assembly \c BREAK statement. When
* a JTAG is used, this causes the program execution to halt when reached until manually resumed.
*
* \note This macro is not available for all architectures.
*/
#define JTAG_DEBUG_BREAK() __asm__ __volatile__ ("BREAK" ::)
#define JTAG_DEBUG_BREAK() __asm__ __volatile__ ("break" ::)
/** Macro for testing condition "x" and breaking via \ref JTAG_DEBUG_BREAK() if the condition is false.
*
......@@ -99,7 +99,7 @@
*
* \param[in] Condition Condition that will be evaluated.
*/
#define JTAG_DEBUG_ASSERT(Condition) MACROS{ if (!(Condition)) { JTAG_DEBUG_BREAK(); } }MACROE
#define JTAG_ASSERT(Condition) MACROS{ if (!(Condition)) { JTAG_DEBUG_BREAK(); } }MACROE
/** Macro for testing condition \c "x" and writing debug data to the stdout stream if \c false. The stdout stream
* must be pre-initialized before this macro is run and linked to an output device, such as the microcontroller's
......
......@@ -117,7 +117,7 @@ uint8_t TWI_ReadPacket(const uint8_t SlaveAddress,
{
while (Length--)
{
if (!(TWI_ReceiveByte(Buffer++, (Length == 0))))
if (!(TWI_ReceiveByte(Buffer++, (Length == 1))))
{
ErrorCode = TWI_ERROR_SlaveNAK;
break;
......
......@@ -143,12 +143,12 @@
/** 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.
*/
#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.
......
......@@ -56,10 +56,12 @@
* 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
* - 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:
......@@ -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 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
......
......@@ -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/
* - 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
......
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment