Fixed EVENT_USB_CDC_ControLineStateChanged() event not taking the CDC interface structure as a parameter.

Converted TestApp demo over to the new demo structure.

More class driver documentation improvements.
pull/1469/head
Dean Camera 16 years ago
parent dc42c5eb6b
commit 7665bf323e

@ -36,19 +36,30 @@
#include "TestApp.h" #include "TestApp.h"
/* Scheduler Task List */
TASK_LIST
{
{ .Task = TestApp_CheckJoystick, .TaskStatus = TASK_RUN },
{ .Task = TestApp_CheckButton , .TaskStatus = TASK_RUN },
{ .Task = TestApp_CheckTemp , .TaskStatus = TASK_RUN },
{ .Task = USB_USBTask , .TaskStatus = TASK_RUN },
};
/** Main program entry point. This routine configures the hardware required by the application, then /** Main program entry point. This routine configures the hardware required by the application, then
* starts the scheduler to run the application tasks. * starts the scheduler to run the application tasks.
*/ */
int main(void) int main(void)
{
SetupHardware();
puts_P(PSTR(ESC_RESET ESC_BG_WHITE ESC_INVERSE_ON ESC_ERASE_DISPLAY
"LUFA Demo running.\r\n" ESC_INVERSE_OFF));
for (;;)
{
CheckJoystick();
CheckButton();
CheckTemperature();
/* Clear output-compare flag (logic 1 clears the flag) */
TIFR0 |= (1 << OCF0A);
USB_USBTask();
}
}
void SetupHardware(void)
{ {
/* Disable watchdog if enabled by bootloader/fuses */ /* Disable watchdog if enabled by bootloader/fuses */
MCUSR &= ~(1 << WDRF); MCUSR &= ~(1 << WDRF);
@ -65,41 +76,20 @@ int main(void)
LEDs_Init(); LEDs_Init();
Buttons_Init(); Buttons_Init();
/* Millisecond timer initialization, with output compare interrupt enabled */ /* Millisecond timer initialization */
OCR0A = 0x7D; OCR0A = 0x7D;
TCCR0A = (1 << WGM01); TCCR0A = (1 << WGM01);
TCCR0B = ((1 << CS01) | (1 << CS00)); TCCR0B = ((1 << CS01) | (1 << CS00));
TIMSK0 = (1 << OCIE0A);
/* Turn on interrupts */
sei();
/* Start-up message via USART */
puts_P(PSTR(ESC_RESET ESC_BG_WHITE ESC_INVERSE_ON ESC_ERASE_DISPLAY
"LUFA Demo running.\r\n" ESC_INVERSE_OFF));
/* Scheduling - routine never returns, so put this last in the main function */
Scheduler_Start();
}
/** ISR for the timer 0 compare vector. This ISR fires once each millisecond, and increments the
* scheduler tick counter.
*/
ISR(TIMER0_COMPA_vect, ISR_BLOCK)
{
/* Scheduler test - increment scheduler tick counter once each millisecond */
Scheduler_TickCounter++;
} }
/** Task responsible for checking the joystick position, and displaying the joystick position onto the /** Task responsible for checking the joystick position, and displaying the joystick position onto the
* board LEDs. * board LEDs.
*/ */
TASK(TestApp_CheckJoystick) void CheckJoystick(void)
{ {
uint8_t JoyStatus_LCL = Joystick_GetStatus(); uint8_t JoyStatus_LCL = Joystick_GetStatus();
uint8_t LEDMask = 0; uint8_t LEDMask = LEDS_NO_LEDS;
/* Test of the Joystick - change a mask in response to joystick */
if (JoyStatus_LCL & JOY_UP) if (JoyStatus_LCL & JOY_UP)
LEDMask |= LEDS_LED1; LEDMask |= LEDS_LED1;
@ -115,78 +105,61 @@ TASK(TestApp_CheckJoystick)
if (JoyStatus_LCL & JOY_PRESS) if (JoyStatus_LCL & JOY_PRESS)
LEDMask = LEDS_ALL_LEDS; LEDMask = LEDS_ALL_LEDS;
/* Test of LEDs - light up in response to joystick */
LEDs_SetAllLEDs(LEDMask); LEDs_SetAllLEDs(LEDMask);
} }
/** Task responsible for checking the current temperature via the temperature sensor mounted on the /** Task responsible for checking the current temperature via the temperature sensor mounted on the
* board, and displaying it through the serial USART. * board, and displaying it through the serial USART.
*/ */
TASK(TestApp_CheckTemp) void CheckTemperature(void)
{ {
static SchedulerDelayCounter_t DelayCounter = 10000; // Force immediate run on start-up static uint16_t MSElapsed = 0;
if (TIFR0 & (1 << OCF0A))
MSElapsed++;
/* Task runs every 10000 ticks, 10 seconds for this demo */ /* Task runs every 10000 ticks, 10 seconds for this demo */
if (Scheduler_HasDelayElapsed(10000, &DelayCounter)) if (MSElapsed == 1000)
{ {
printf_P(PSTR("Current temperature: %d Degrees Celcius\r\n\r\n"), printf_P(PSTR("Current temperature: %d Degrees Celcius\r\n\r\n"),
(int8_t)Temperature_GetTemperature()); (int8_t)Temperature_GetTemperature());
/* Reset the delay counter, ready to count another 10000 tick interval */ MSElapsed = 0;
Scheduler_ResetDelay(&DelayCounter);
} }
} }
/** Task responsible for checking the board's first button' position, and start-stopping other tasks and the USB /** Task responsible for checking the board's first button' position, and start-stopping other tasks and the USB
* interface in response to user joystick movements. * interface in response to user joystick movements.
*/ */
TASK(TestApp_CheckButton) void CheckButton(void)
{ {
static SchedulerDelayCounter_t DelayCounter = 0; static uint16_t DebounceMSElapsed = 0;
static bool IsPressed; static bool IsPressed;
static bool BlockingJoystickTask;
/* Check if board button pressed (start USB) */ if (TIFR0 & (1 << OCF0A))
DebounceMSElapsed++;
if (Buttons_GetStatus() & BUTTONS_BUTTON1) if (Buttons_GetStatus() & BUTTONS_BUTTON1)
{ {
/* Debounce - check 100 ticks later to see if button is still being pressed */ if (!(IsPressed) && (DebounceMSElapsed == 100))
if ((IsPressed == false) && (Scheduler_HasDelayElapsed(100, &DelayCounter)))
{ {
/* Set flag, indicating that current pressed state has been handled */
IsPressed = true; IsPressed = true;
/* First start of the USB interface permanently blocks the joystick task */
if (BlockingJoystickTask == false)
{
Scheduler_SetTaskMode(TestApp_CheckJoystick, TASK_STOP);
BlockingJoystickTask = true;
}
/* Toggle USB interface */
if (USB_IsInitialized == true) if (USB_IsInitialized == true)
{ {
USB_ShutDown(); USB_ShutDown();
LEDs_SetAllLEDs(LEDS_LED1);
puts_P(PSTR(ESC_BG_WHITE "USB Power Off.\r\n")); puts_P(PSTR(ESC_BG_WHITE "USB Power Off.\r\n"));
Scheduler_SetTaskMode(TestApp_CheckTemp, TASK_RUN);
} }
else else
{ {
Scheduler_SetTaskMode(TestApp_CheckTemp, TASK_STOP);
LEDs_SetAllLEDs(LEDS_LED2 | LEDS_LED3);
puts_P(PSTR(ESC_BG_YELLOW "USB Power On.\r\n")); puts_P(PSTR(ESC_BG_YELLOW "USB Power On.\r\n"));
USB_Init(USB_MODE_UID, USB_DEVICE_OPT_FULLSPEED | USB_OPT_REG_ENABLED | USB_OPT_AUTO_PLL); USB_Init(USB_MODE_UID, USB_DEVICE_OPT_FULLSPEED | USB_OPT_REG_ENABLED | USB_OPT_AUTO_PLL);
} }
} }
} }
else else
{ {
/* Board button not pressed - reset debounce interval counter and press handled flag */ DebounceMSElapsed = 0;
Scheduler_ResetDelay(&DelayCounter);
IsPressed = false; IsPressed = false;
} }
} }

@ -42,20 +42,21 @@
#include <avr/wdt.h> #include <avr/wdt.h>
#include <avr/power.h> #include <avr/power.h>
#include <LUFA/Version.h> // Library Version Information #include <LUFA/Version.h>
#include <LUFA/Drivers/USB/USB.h> // USB Functionality #include <LUFA/Drivers/USB/USB.h>
#include <LUFA/Scheduler/Scheduler.h> // Simple scheduler for task management #include <LUFA/Drivers/Misc/TerminalCodes.h>
#include <LUFA/Drivers/Misc/TerminalCodes.h> // ANSI Terminal Escape Codes #include <LUFA/Drivers/Peripheral/ADC.h>
#include <LUFA/Drivers/Peripheral/ADC.h> // ADC driver #include <LUFA/Drivers/Peripheral/SerialStream.h>
#include <LUFA/Drivers/Peripheral/SerialStream.h> // USART Stream driver #include <LUFA/Drivers/Board/Joystick.h>
#include <LUFA/Drivers/Board/Joystick.h> // Joystick driver #include <LUFA/Drivers/Board/LEDs.h>
#include <LUFA/Drivers/Board/LEDs.h> // LED driver #include <LUFA/Drivers/Board/Buttons.h>
#include <LUFA/Drivers/Board/Buttons.h> // Board Buttons driver #include <LUFA/Drivers/Board/Temperature.h>
#include <LUFA/Drivers/Board/Temperature.h> // Temperature sensor driver
/* Function Prototypes: */
/* Task Definitions: */ void SetupHardware(void);
TASK(TestApp_CheckJoystick);
TASK(TestApp_CheckButton); void CheckJoystick(void);
TASK(TestApp_CheckTemp); void CheckButton(void);
void CheckTemperature(void);
#endif #endif

@ -42,19 +42,13 @@
* Pressing the HWB will initiate the USB subsystem, enumerating * Pressing the HWB will initiate the USB subsystem, enumerating
* the device (which has <b>no actual functionality beyond * the device (which has <b>no actual functionality beyond
* enumeration as a device or as a host in this demo</b>, and serves * enumeration as a device or as a host in this demo</b>, and serves
* only to demonstrate the USB portion of the library). It will * only to demonstrate the USB portion of the library).
* also suspend the joystick and temperature monitoring tasks.
* *
* Pressing the HWB a second time will turn off the USB system * Pressing the HWB a second time will turn off the USB system.
* and resume the temperature printing task (but not the joystick
* monitoring task).
* *
* When activated, the USB events will be printed through the * When activated, the USB events will be printed through the
* serial USART. * serial USART.
* *
* When the USB subsystem is activated, the board LEDs will show
* the current USB status.
*
* \section SSec_Options Project Options * \section SSec_Options Project Options
* *
* The following defines can be found in this demo, which can control the demo behaviour when defined, or changed in value. * The following defines can be found in this demo, which can control the demo behaviour when defined, or changed in value.

@ -79,9 +79,6 @@ void EVENT_USB_VBUSDisconnect(void)
void EVENT_USB_Connect(void) void EVENT_USB_Connect(void)
{ {
puts_P(PSTR(EVENT_PREFIX "USB +\r\n")); puts_P(PSTR(EVENT_PREFIX "USB +\r\n"));
LEDs_SetAllLEDs(LEDS_LED2 | LEDS_LED3 | LEDS_LED4);
Scheduler_SetTaskMode(USB_USBTask, TASK_RUN);
} }
/** /**
@ -90,24 +87,19 @@ void EVENT_USB_Connect(void)
*/ */
void EVENT_USB_Disconnect(void) void EVENT_USB_Disconnect(void)
{ {
Scheduler_SetTaskMode(USB_USBTask, TASK_STOP);
puts_P(PSTR(EVENT_PREFIX "USB -\r\n")); puts_P(PSTR(EVENT_PREFIX "USB -\r\n"));
LEDs_SetAllLEDs(LEDS_LED2 | LEDS_LED3 | LEDS_LED3);
} }
/** Event handler for the USB_Suspend event. When fired, the event is logged to the USART. */ /** Event handler for the USB_Suspend event. When fired, the event is logged to the USART. */
void EVENT_USB_Suspend(void) void EVENT_USB_Suspend(void)
{ {
puts_P(PSTR(EVENT_PREFIX ESC_BG_YELLOW "USB Sleep\r\n")); puts_P(PSTR(EVENT_PREFIX ESC_BG_YELLOW "USB Sleep\r\n"));
LEDs_SetAllLEDs(LEDS_ALL_LEDS);
} }
/** Event handler for the USB_WakeUp event. When fired, the event is logged to the USART. */ /** Event handler for the USB_WakeUp event. When fired, the event is logged to the USART. */
void EVENT_USB_WakeUp(void) void EVENT_USB_WakeUp(void)
{ {
puts_P(PSTR(EVENT_PREFIX ESC_BG_GREEN "USB Wakeup\r\n")); puts_P(PSTR(EVENT_PREFIX ESC_BG_GREEN "USB Wakeup\r\n"));
LEDs_SetAllLEDs(LEDS_LED2 | LEDS_LED4);
} }
/** Event handler for the USB_Reset event. When fired, the event is logged to the USART. */ /** Event handler for the USB_Reset event. When fired, the event is logged to the USART. */
@ -130,8 +122,6 @@ void EVENT_USB_UIDChange(void)
else else
ModeStrPtr = PSTR("N/A"); ModeStrPtr = PSTR("N/A");
LEDs_SetAllLEDs(LEDS_LED2 | LEDS_LED3);
printf_P(PSTR(" -- New Mode %S\r\n"), ModeStrPtr); printf_P(PSTR(" -- New Mode %S\r\n"), ModeStrPtr);
} }
@ -192,16 +182,12 @@ void EVENT_USB_UnhandledControlPacket(void)
void EVENT_USB_ConfigurationChanged(void) void EVENT_USB_ConfigurationChanged(void)
{ {
puts_P(PSTR(EVENT_PREFIX "Configuration Number Changed\r\n")); puts_P(PSTR(EVENT_PREFIX "Configuration Number Changed\r\n"));
LEDs_SetAllLEDs(LEDS_LED2 | LEDS_LED4);
} }
/** Event handler for the USB_DeviceAttached event. When fired, the event is logged to the USART. */ /** Event handler for the USB_DeviceAttached event. When fired, the event is logged to the USART. */
void EVENT_USB_DeviceAttached(void) void EVENT_USB_DeviceAttached(void)
{ {
puts_P(PSTR(EVENT_PREFIX ESC_BG_GREEN "Device +\r\n")); puts_P(PSTR(EVENT_PREFIX ESC_BG_GREEN "Device +\r\n"));
Scheduler_SetTaskMode(USB_USBTask, TASK_RUN);
} }
/** Event handler for the USB_DeviceUnattached event. When fired, the event is logged to the USART. */ /** Event handler for the USB_DeviceUnattached event. When fired, the event is logged to the USART. */

@ -39,12 +39,11 @@
/* Includes: */ /* Includes: */
#include <avr/io.h> #include <avr/io.h>
#include <LUFA/Common/Common.h> // Commonly used macros #include <LUFA/Common/Common.h>
#include <LUFA/Drivers/USB/USB.h> // USB Functionality #include <LUFA/Drivers/USB/USB.h>
#include <LUFA/Drivers/Board/LEDs.h> // LED driver #include <LUFA/Drivers/Board/LEDs.h>
#include <LUFA/Drivers/Peripheral/SerialStream.h> // USART Stream driver #include <LUFA/Drivers/Peripheral/SerialStream.h>
#include <LUFA/Drivers/Misc/TerminalCodes.h> // ANSI Terminal Escape Codes #include <LUFA/Drivers/Misc/TerminalCodes.h>
#include <LUFA/Scheduler/Scheduler.h> // Simple scheduler for task management
/* Macros: */ /* Macros: */
/** Prefix sent through the USART when an even fires before the actual event message. */ /** Prefix sent through the USART when an even fires before the actual event message. */

@ -126,7 +126,6 @@ LUFA_PATH = ../../..
SRC = $(TARGET).c \ SRC = $(TARGET).c \
TestEvents.c \ TestEvents.c \
Descriptors.c \ Descriptors.c \
$(LUFA_PATH)/LUFA/Scheduler/Scheduler.c \
$(LUFA_PATH)/LUFA/Drivers/Board/Temperature.c \ $(LUFA_PATH)/LUFA/Drivers/Board/Temperature.c \
$(LUFA_PATH)/LUFA/Drivers/Peripheral/SerialStream.c \ $(LUFA_PATH)/LUFA/Drivers/Peripheral/SerialStream.c \
$(LUFA_PATH)/LUFA/Drivers/Peripheral/Serial.c \ $(LUFA_PATH)/LUFA/Drivers/Peripheral/Serial.c \

@ -73,7 +73,7 @@ void USB_CDC_ProcessControlPacket(USB_ClassInfo_CDC_t* CDCInterfaceInfo)
CDCInterfaceInfo->ControlLineState = USB_ControlRequest.wValue; CDCInterfaceInfo->ControlLineState = USB_ControlRequest.wValue;
EVENT_USB_CDC_ControLineStateChanged(); EVENT_USB_CDC_ControLineStateChanged(CDCInterfaceInfo);
while (!(Endpoint_IsINReady())); while (!(Endpoint_IsINReady()));
Endpoint_ClearIN(); Endpoint_ClearIN();

@ -167,7 +167,7 @@
uint8_t NotificationEndpointNumber; /**< Endpoint number of the CDC interface's IN notification endpoint, if used */ uint8_t NotificationEndpointNumber; /**< Endpoint number of the CDC interface's IN notification endpoint, if used */
uint16_t NotificationEndpointSize; /**< Size in bytes of the CDC interface's IN notification endpoint, if used */ uint16_t NotificationEndpointSize; /**< Size in bytes of the CDC interface's IN notification endpoint, if used */
uint8_t ControlLineState; uint8_t ControlLineState; /**< Current control line state, as set by the host */
struct struct
{ {
@ -187,15 +187,36 @@
void USB_CDC_Event_Stub(void); void USB_CDC_Event_Stub(void);
void EVENT_USB_CDC_LineEncodingChanged(USB_ClassInfo_CDC_t* CDCInterfaceInfo) void EVENT_USB_CDC_LineEncodingChanged(USB_ClassInfo_CDC_t* CDCInterfaceInfo)
ATTR_WEAK ATTR_ALIAS(USB_CDC_Event_Stub); ATTR_WEAK ATTR_ALIAS(USB_CDC_Event_Stub);
void EVENT_USB_CDC_ControLineStateChanged(void) ATTR_WEAK ATTR_ALIAS(USB_CDC_Event_Stub);; void EVENT_USB_CDC_ControLineStateChanged(USB_ClassInfo_CDC_t* CDCInterfaceInfo)
ATTR_WEAK ATTR_ALIAS(USB_CDC_Event_Stub);
#endif #endif
/** Configures the endpoints of a given CDC interface, ready for use. This should be linked to the library
* \ref EVENT_USB_ConfigurationChanged() event so that the endpoints are configured when the configuration containing the
* given CDC interface is selected.
*
* \param CDCInterfaceInfo Pointer to a structure containing an CDC Class configuration and state.
*
* \return Boolean true if the endpoints were sucessfully configured, false otherwise
*/
bool USB_CDC_ConfigureEndpoints(USB_ClassInfo_CDC_t* CDCInterfaceInfo); bool USB_CDC_ConfigureEndpoints(USB_ClassInfo_CDC_t* CDCInterfaceInfo);
/** Processes incomming control requests from the host, that are directed to the given CDC class interface. This should be
* linked to the library \ref EVENT_USB_UnhandledControlPacket() event.
*
* \param CDCInterfaceInfo Pointer to a structure containing an CDC Class configuration and state.
*/
void USB_CDC_ProcessControlPacket(USB_ClassInfo_CDC_t* CDCInterfaceInfo); void USB_CDC_ProcessControlPacket(USB_ClassInfo_CDC_t* CDCInterfaceInfo);
/** General management task for a given CDC class interface, required for the correct operation of the interface. This should
* be called frequently in the main program loop, before the master USB management task \ref USB_USBTask().
*
* \param CDCInterfaceInfo Pointer to a structure containing an CDC Class configuration and state.
*/
void USB_CDC_USBTask(USB_ClassInfo_CDC_t* CDCInterfaceInfo); void USB_CDC_USBTask(USB_ClassInfo_CDC_t* CDCInterfaceInfo);
void EVENT_USB_CDC_LineEncodingChanged(USB_ClassInfo_CDC_t* CDCInterfaceInfo); void EVENT_USB_CDC_LineEncodingChanged(USB_ClassInfo_CDC_t* CDCInterfaceInfo);
void EVENT_USB_CDC_ControLineStateChanged(void); void EVENT_USB_CDC_ControLineStateChanged(USB_ClassInfo_CDC_t* CDCInterfaceInfo);
void USB_CDC_SendString(USB_ClassInfo_CDC_t* CDCInterfaceInfo, char* Data, uint16_t Length); void USB_CDC_SendString(USB_ClassInfo_CDC_t* CDCInterfaceInfo, char* Data, uint16_t Length);
void USB_CDC_SendByte(USB_ClassInfo_CDC_t* CDCInterfaceInfo, uint8_t Data); void USB_CDC_SendByte(USB_ClassInfo_CDC_t* CDCInterfaceInfo, uint8_t Data);

Loading…
Cancel
Save