summaryrefslogtreecommitdiff
path: root/boards/ek-lm4f120xl/freertos_demo/led_task.c
diff options
context:
space:
mode:
authorYuval Adam <yuv.adm@gmail.com>2012-10-29 23:04:19 +0200
committerYuval Adam <yuv.adm@gmail.com>2012-10-29 23:04:19 +0200
commite018ceebed74b8223482bc9d1ed0b31c938381da (patch)
tree3151f2ec3af6fb64967a177c85ba2c2af61fb9f6 /boards/ek-lm4f120xl/freertos_demo/led_task.c
parent48395c0348a1a3fa3330e397d2463f62ff5c45c7 (diff)
New example files
Diffstat (limited to 'boards/ek-lm4f120xl/freertos_demo/led_task.c')
-rw-r--r--boards/ek-lm4f120xl/freertos_demo/led_task.c235
1 files changed, 235 insertions, 0 deletions
diff --git a/boards/ek-lm4f120xl/freertos_demo/led_task.c b/boards/ek-lm4f120xl/freertos_demo/led_task.c
new file mode 100644
index 0000000..90befb5
--- /dev/null
+++ b/boards/ek-lm4f120xl/freertos_demo/led_task.c
@@ -0,0 +1,235 @@
+//*****************************************************************************
+//
+// 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);
+}