diff --git a/Demos/OTG/TestApp/TestApp.c b/Demos/OTG/TestApp/TestApp.c index 4dc9b44e30..dc10aadfc1 100644 --- a/Demos/OTG/TestApp/TestApp.c +++ b/Demos/OTG/TestApp/TestApp.c @@ -36,19 +36,30 @@ #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 * starts the scheduler to run the application tasks. */ 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 */ MCUSR &= ~(1 << WDRF); @@ -65,41 +76,20 @@ int main(void) LEDs_Init(); Buttons_Init(); - /* Millisecond timer initialization, with output compare interrupt enabled */ + /* Millisecond timer initialization */ OCR0A = 0x7D; TCCR0A = (1 << WGM01); 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 * board LEDs. */ -TASK(TestApp_CheckJoystick) +void CheckJoystick(void) { 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) LEDMask |= LEDS_LED1; @@ -115,78 +105,61 @@ TASK(TestApp_CheckJoystick) if (JoyStatus_LCL & JOY_PRESS) LEDMask = LEDS_ALL_LEDS; - /* Test of LEDs - light up in response to joystick */ LEDs_SetAllLEDs(LEDMask); } /** Task responsible for checking the current temperature via the temperature sensor mounted on the * 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 */ - if (Scheduler_HasDelayElapsed(10000, &DelayCounter)) + if (MSElapsed == 1000) { printf_P(PSTR("Current temperature: %d Degrees Celcius\r\n\r\n"), (int8_t)Temperature_GetTemperature()); - /* Reset the delay counter, ready to count another 10000 tick interval */ - Scheduler_ResetDelay(&DelayCounter); + MSElapsed = 0; } } /** 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. */ -TASK(TestApp_CheckButton) +void CheckButton(void) { - static SchedulerDelayCounter_t DelayCounter = 0; - static bool IsPressed; - static bool BlockingJoystickTask; + static uint16_t DebounceMSElapsed = 0; + static bool IsPressed; - /* Check if board button pressed (start USB) */ + if (TIFR0 & (1 << OCF0A)) + DebounceMSElapsed++; + if (Buttons_GetStatus() & BUTTONS_BUTTON1) { - /* Debounce - check 100 ticks later to see if button is still being pressed */ - if ((IsPressed == false) && (Scheduler_HasDelayElapsed(100, &DelayCounter))) + if (!(IsPressed) && (DebounceMSElapsed == 100)) { - /* Set flag, indicating that current pressed state has been handled */ 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) { USB_ShutDown(); - - LEDs_SetAllLEDs(LEDS_LED1); puts_P(PSTR(ESC_BG_WHITE "USB Power Off.\r\n")); - - Scheduler_SetTaskMode(TestApp_CheckTemp, TASK_RUN); } 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); } } } else { - /* Board button not pressed - reset debounce interval counter and press handled flag */ - Scheduler_ResetDelay(&DelayCounter); + DebounceMSElapsed = 0; IsPressed = false; } } diff --git a/Demos/OTG/TestApp/TestApp.h b/Demos/OTG/TestApp/TestApp.h index 7ae5663d91..832b5f9777 100644 --- a/Demos/OTG/TestApp/TestApp.h +++ b/Demos/OTG/TestApp/TestApp.h @@ -42,20 +42,21 @@ #include #include - #include // Library Version Information - #include // USB Functionality - #include // Simple scheduler for task management - #include // ANSI Terminal Escape Codes - #include // ADC driver - #include // USART Stream driver - #include // Joystick driver - #include // LED driver - #include // Board Buttons driver - #include // Temperature sensor driver + #include + #include + #include + #include + #include + #include + #include + #include + #include - /* Task Definitions: */ - TASK(TestApp_CheckJoystick); - TASK(TestApp_CheckButton); - TASK(TestApp_CheckTemp); + /* Function Prototypes: */ + void SetupHardware(void); + + void CheckJoystick(void); + void CheckButton(void); + void CheckTemperature(void); #endif diff --git a/Demos/OTG/TestApp/TestApp.txt b/Demos/OTG/TestApp/TestApp.txt index a0f1488ec4..540a59ce1e 100644 --- a/Demos/OTG/TestApp/TestApp.txt +++ b/Demos/OTG/TestApp/TestApp.txt @@ -42,19 +42,13 @@ * Pressing the HWB will initiate the USB subsystem, enumerating * the device (which has no actual functionality beyond * enumeration as a device or as a host in this demo, and serves - * only to demonstrate the USB portion of the library). It will - * also suspend the joystick and temperature monitoring tasks. + * only to demonstrate the USB portion of the library). * - * Pressing the HWB a second time will turn off the USB system - * and resume the temperature printing task (but not the joystick - * monitoring task). + * Pressing the HWB a second time will turn off the USB system. * * When activated, the USB events will be printed through the * serial USART. * - * When the USB subsystem is activated, the board LEDs will show - * the current USB status. - * * \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. diff --git a/Demos/OTG/TestApp/TestEvents.c b/Demos/OTG/TestApp/TestEvents.c index ea7fa4b55f..9b091472ff 100644 --- a/Demos/OTG/TestApp/TestEvents.c +++ b/Demos/OTG/TestApp/TestEvents.c @@ -79,9 +79,6 @@ void EVENT_USB_VBUSDisconnect(void) void EVENT_USB_Connect(void) { 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) { - Scheduler_SetTaskMode(USB_USBTask, TASK_STOP); - 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. */ void EVENT_USB_Suspend(void) { 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. */ void EVENT_USB_WakeUp(void) { 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. */ @@ -129,8 +121,6 @@ void EVENT_USB_UIDChange(void) ModeStrPtr = PSTR("DEVICE"); else ModeStrPtr = PSTR("N/A"); - - LEDs_SetAllLEDs(LEDS_LED2 | LEDS_LED3); printf_P(PSTR(" -- New Mode %S\r\n"), ModeStrPtr); } @@ -192,16 +182,12 @@ void EVENT_USB_UnhandledControlPacket(void) void EVENT_USB_ConfigurationChanged(void) { 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. */ void EVENT_USB_DeviceAttached(void) { 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. */ diff --git a/Demos/OTG/TestApp/TestEvents.h b/Demos/OTG/TestApp/TestEvents.h index 3642428f5c..b82936fb47 100644 --- a/Demos/OTG/TestApp/TestEvents.h +++ b/Demos/OTG/TestApp/TestEvents.h @@ -39,12 +39,11 @@ /* Includes: */ #include - #include // Commonly used macros - #include // USB Functionality - #include // LED driver - #include // USART Stream driver - #include // ANSI Terminal Escape Codes - #include // Simple scheduler for task management + #include + #include + #include + #include + #include /* Macros: */ /** Prefix sent through the USART when an even fires before the actual event message. */ diff --git a/Demos/OTG/TestApp/makefile b/Demos/OTG/TestApp/makefile index a8bf4ac424..55b98815aa 100644 --- a/Demos/OTG/TestApp/makefile +++ b/Demos/OTG/TestApp/makefile @@ -126,7 +126,6 @@ LUFA_PATH = ../../.. SRC = $(TARGET).c \ TestEvents.c \ Descriptors.c \ - $(LUFA_PATH)/LUFA/Scheduler/Scheduler.c \ $(LUFA_PATH)/LUFA/Drivers/Board/Temperature.c \ $(LUFA_PATH)/LUFA/Drivers/Peripheral/SerialStream.c \ $(LUFA_PATH)/LUFA/Drivers/Peripheral/Serial.c \ diff --git a/LUFA/Drivers/USB/Class/Device/Audio.h b/LUFA/Drivers/USB/Class/Device/Audio.h index cbb6d791bb..230da4d9ef 100644 --- a/LUFA/Drivers/USB/Class/Device/Audio.h +++ b/LUFA/Drivers/USB/Class/Device/Audio.h @@ -389,21 +389,21 @@ * * \return Boolean true if the endpoints were sucessfully configured, false otherwise */ - bool USB_Audio_ConfigureEndpoints(USB_ClassInfo_Audio_t* AudioInterfaceInfo); + bool USB_Audio_ConfigureEndpoints(USB_ClassInfo_Audio_t* AudioInterfaceInfo); /** Processes incomming control requests from the host, that are directed to the given Audio class interface. This should be * linked to the library \ref EVENT_USB_UnhandledControlPacket() event. * * \param AudioInterfaceInfo Pointer to a structure containing an Audio Class configuration and state. */ - void USB_Audio_ProcessControlPacket(USB_ClassInfo_Audio_t* AudioInterfaceInfo); + void USB_Audio_ProcessControlPacket(USB_ClassInfo_Audio_t* AudioInterfaceInfo); /** General management task for a given Audio 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 AudioInterfaceInfo Pointer to a structure containing an Audio Class configuration and state. */ - void USB_Audio_USBTask(USB_ClassInfo_Audio_t* AudioInterfaceInfo); + void USB_Audio_USBTask(USB_ClassInfo_Audio_t* AudioInterfaceInfo); /** Reads the next 8-bit audio sample from the current audio interface. * @@ -412,7 +412,7 @@ * * \return Signed 8-bit audio sample from the audio interface */ - int8_t USB_Audio_ReadSample8(void); + int8_t USB_Audio_ReadSample8(void); /** Reads the next 16-bit audio sample from the current audio interface. * @@ -421,7 +421,7 @@ * * \return Signed 16-bit audio sample from the audio interface */ - int16_t USB_Audio_ReadSample16(void); + int16_t USB_Audio_ReadSample16(void); /** Reads the next 24-bit audio sample from the current audio interface. * @@ -430,7 +430,7 @@ * * \return Signed 24-bit audio sample from the audio interface */ - int32_t USB_Audio_ReadSample24(void); + int32_t USB_Audio_ReadSample24(void); /** Writes the next 8-bit audio sample to the current audio interface. * @@ -439,7 +439,7 @@ * * \param Sample Signed 8-bit audio sample */ - void USB_Audio_WriteSample8(int8_t Sample); + void USB_Audio_WriteSample8(int8_t Sample); /** Writes the next 16-bit audio sample to the current audio interface. * @@ -448,7 +448,7 @@ * * \param Sample Signed 16-bit audio sample */ - void USB_Audio_WriteSample16(int16_t Sample); + void USB_Audio_WriteSample16(int16_t Sample); /** Writes the next 24-bit audio sample to the current audio interface. * @@ -457,7 +457,7 @@ * * \param Sample Signed 24-bit audio sample */ - void USB_Audio_WriteSample24(int32_t Sample); + void USB_Audio_WriteSample24(int32_t Sample); /** Determines if the given audio interface is ready for a sample to be read from it. * @@ -465,7 +465,7 @@ * * \return Boolean true if the given Audio interface has a sample to be read, false otherwise */ - bool USB_Audio_IsSampleReceived(USB_ClassInfo_Audio_t* AudioInterfaceInfo); + bool USB_Audio_IsSampleReceived(USB_ClassInfo_Audio_t* AudioInterfaceInfo); /** Determines if the given audio interface is ready to accept the next sample to be written to it. * @@ -473,7 +473,7 @@ * * \return Boolean true if the given Audio interface is ready to accept the next sample, false otherwise */ - bool USB_Audio_IsReadyForNextSample(USB_ClassInfo_Audio_t* AudioInterfaceInfo); + bool USB_Audio_IsReadyForNextSample(USB_ClassInfo_Audio_t* AudioInterfaceInfo); /* Disable C linkage for C++ Compilers: */ #if defined(__cplusplus) diff --git a/LUFA/Drivers/USB/Class/Device/CDC.c b/LUFA/Drivers/USB/Class/Device/CDC.c index dcb58dc40f..d27b0d2edc 100644 --- a/LUFA/Drivers/USB/Class/Device/CDC.c +++ b/LUFA/Drivers/USB/Class/Device/CDC.c @@ -73,7 +73,7 @@ void USB_CDC_ProcessControlPacket(USB_ClassInfo_CDC_t* CDCInterfaceInfo) CDCInterfaceInfo->ControlLineState = USB_ControlRequest.wValue; - EVENT_USB_CDC_ControLineStateChanged(); + EVENT_USB_CDC_ControLineStateChanged(CDCInterfaceInfo); while (!(Endpoint_IsINReady())); Endpoint_ClearIN(); diff --git a/LUFA/Drivers/USB/Class/Device/CDC.h b/LUFA/Drivers/USB/Class/Device/CDC.h index ae069fafaa..3e67b1b6b6 100644 --- a/LUFA/Drivers/USB/Class/Device/CDC.h +++ b/LUFA/Drivers/USB/Class/Device/CDC.h @@ -167,7 +167,7 @@ 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 */ - uint8_t ControlLineState; + uint8_t ControlLineState; /**< Current control line state, as set by the host */ struct { @@ -187,15 +187,36 @@ void USB_CDC_Event_Stub(void); void EVENT_USB_CDC_LineEncodingChanged(USB_ClassInfo_CDC_t* CDCInterfaceInfo) 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 - bool USB_CDC_ConfigureEndpoints(USB_ClassInfo_CDC_t* CDCInterfaceInfo); - void USB_CDC_ProcessControlPacket(USB_ClassInfo_CDC_t* CDCInterfaceInfo); - void USB_CDC_USBTask(USB_ClassInfo_CDC_t* CDCInterfaceInfo); + /** 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); + + /** 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); + + /** 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 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_SendByte(USB_ClassInfo_CDC_t* CDCInterfaceInfo, uint8_t Data);