//***************************************************************************** // // led_task.c - A simple flashing LED task. // // Copyright (c) 2012 Texas Instruments Incorporated. All rights reserved. // Software License Agreement // // Texas Instruments (TI) is supplying this software for use solely and // exclusively on TI's microcontroller products. The software is owned by // TI and/or its suppliers, and is protected under applicable copyright // laws. You may not combine this software with "viral" open-source // software in order to form a larger program. // // THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. // NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT // NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR // A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY // CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL // DAMAGES, FOR ANY REASON WHATSOEVER. // // This is part of revision 9453 of the EK-LM4F120XL Firmware Package. // //***************************************************************************** #include "inc/hw_memmap.h" #include "inc/hw_types.h" #include "driverlib/gpio.h" #include "driverlib/rom.h" #include "drivers/rgb.h" #include "drivers/buttons.h" #include "utils/uartstdio.h" #include "led_task.h" #include "priorities.h" #include "FreeRTOS.h" #include "task.h" #include "queue.h" #include "semphr.h" //***************************************************************************** // // The stack size for the LED toggle task. // //***************************************************************************** #define LEDTASKSTACKSIZE 128 // Stack size in words //***************************************************************************** // // The item size and queue size for the LED message queue. // //***************************************************************************** #define LED_ITEM_SIZE sizeof(unsigned char) #define LED_QUEUE_SIZE 5 //***************************************************************************** // // Default LED toggle delay value. LED toggling frequency is twice this number. // //***************************************************************************** #define LED_TOGGLE_DELAY 250 //***************************************************************************** // // The queue that holds messages sent to the LED task. // //***************************************************************************** xQueueHandle g_pLEDQueue; // // [G, R, B] range is 0 to 0xFFFF per color. // static unsigned long g_ulColors[3] = { 0x0000, 0x0000, 0x0000 }; static unsigned char g_ucColorsIndx; extern xSemaphoreHandle g_pUARTSemaphore; //***************************************************************************** // // This task toggles the user selected LED at a user selected frequency. User // can make the selections by pressing the left and right buttons. // //***************************************************************************** static void LEDTask(void *pvParameters) { portTickType ulWakeTime; unsigned long ulLEDToggleDelay; unsigned char cMessage; // // Initialize the LED Toggle Delay to default value. // ulLEDToggleDelay = LED_TOGGLE_DELAY; // // Get the current tick count. // ulWakeTime = xTaskGetTickCount(); // // Loop forever. // while(1) { // // Read the next message, if available on queue. // if(xQueueReceive(g_pLEDQueue, &cMessage, 0) == pdPASS) { // // If left button, update to next LED. // if(cMessage == LEFT_BUTTON) { // // Update the LED buffer to turn off the currently working. // g_ulColors[g_ucColorsIndx] = 0x0000; // // Update the index to next LED g_ucColorsIndx++; if(g_ucColorsIndx > 2) { g_ucColorsIndx = 0; } // // Update the LED buffer to turn on the newly selected LED. // g_ulColors[g_ucColorsIndx] = 0x8000; // // Configure the new LED settings. // RGBColorSet(g_ulColors); // // Guard UART from concurrent access. Print the currently // blinking LED. // xSemaphoreTake(g_pUARTSemaphore, portMAX_DELAY); UARTprintf("Led %d is blinking. [G, R, B]\n", g_ucColorsIndx); xSemaphoreGive(g_pUARTSemaphore); } // // If right button, update delay time between toggles of led. // if(cMessage == RIGHT_BUTTON) { ulLEDToggleDelay *= 2; if(ulLEDToggleDelay > 1000) { ulLEDToggleDelay = LED_TOGGLE_DELAY / 2; } // // Guard UART from concurrent access. Print the currently // blinking frequency. // xSemaphoreTake(g_pUARTSemaphore, portMAX_DELAY); UARTprintf("Led blinking frequency is %d ms.\n", (ulLEDToggleDelay * 2)); xSemaphoreGive(g_pUARTSemaphore); } } // // Turn on the LED. // RGBEnable(); // // Wait for the required amount of time. // vTaskDelayUntil(&ulWakeTime, ulLEDToggleDelay / portTICK_RATE_MS); // // Turn off the LED. // RGBDisable(); // // Wait for the required amount of time. // vTaskDelayUntil(&ulWakeTime, ulLEDToggleDelay / portTICK_RATE_MS); } } //***************************************************************************** // // Initializes the LED task. // //***************************************************************************** unsigned long LEDTaskInit(void) { // // Initialize the GPIOs and Timers that drive the three LEDs. // RGBInit(1); RGBIntensitySet(0.3f); // // Turn on the Green LED // g_ucColorsIndx = 0; g_ulColors[g_ucColorsIndx] = 0x8000; RGBColorSet(g_ulColors); // // Print the current loggling LED and frequency. // UARTprintf("\nLed %d is blinking. [G, R, B]\n", g_ucColorsIndx); UARTprintf("Led blinking frequency is %d ms.\n", (LED_TOGGLE_DELAY * 2)); // // Create a queue for sending messages to the LED task. // g_pLEDQueue = xQueueCreate(LED_QUEUE_SIZE, LED_ITEM_SIZE); // // Create the LED task. // if(xTaskCreate(LEDTask, (signed portCHAR *)"LED", LEDTASKSTACKSIZE, NULL, tskIDLE_PRIORITY + PRIORITY_LED_TASK, NULL) != pdTRUE) { return(1); } // // Success. // return(0); }