ctrl_task.c
来自「最新版IAR FOR ARM(EWARM)5.11中的代码例子」· C语言 代码 · 共 260 行
C
260 行
/*************************************************************************
*
* Used with ICCARM and AARM.
*
* (c) Copyright IAR Systems 2007
*
* File name : ctrl_task.c
* Description : Control task
*
* History :
* 1. Date : January 24, 2007
* Author : Stanimir Bonev
* Description : Create
*
* Controlling LEDs flashing speed, pattern and intensity regarding of the keys
* state and status
*
* $Revision: 15135 $
**************************************************************************/
#define __CTRL_TASK_GLOBALS
#include "ctrl_task.h"
static const unsigned char LedsIntensity[] =
{
0, // 0
1, // 1
4, // 2
7, // 3
11, // 4
15, // 5
20, // 6
35, // 7
55, // 8
150, // 9
200, // 10
255, // 11
};
const LedsCtrl_t RunningLight[] =
{
{_LED16_ID, (LedsCtrl_t *)&RunningLight[ 1]}, // step 1
{_LED15_ID, (LedsCtrl_t *)&RunningLight[ 2]}, // step 2
{_LED14_ID, (LedsCtrl_t *)&RunningLight[ 3]}, // step 3
{_LED13_ID, (LedsCtrl_t *)&RunningLight[ 4]}, // step 4
{_LED12_ID, (LedsCtrl_t *)&RunningLight[ 5]}, // step 5
{_LED11_ID, (LedsCtrl_t *)&RunningLight[ 6]}, // step 6
{_LED10_ID, (LedsCtrl_t *)&RunningLight[ 7]}, // step 7
{_LED9_ID, (LedsCtrl_t *)&RunningLight[ 8]}, // step 8
{_LED7_ID, (LedsCtrl_t *)&RunningLight[ 9]}, // step 9
{_LED6_ID, (LedsCtrl_t *)&RunningLight[10]}, // step 10
{_LED5_ID, (LedsCtrl_t *)&RunningLight[11]}, // step 11
{_LED4_ID, (LedsCtrl_t *)&RunningLight[12]}, // step 12
{_LED3_ID, (LedsCtrl_t *)&RunningLight[13]}, // step 13
{_LED2_ID, (LedsCtrl_t *)&RunningLight[14]}, // step 14
{_LED1_ID, (LedsCtrl_t *)&RunningLight[ 0]}, // step 15
};
static const LedsCtrl_t ButtonsFault [] =
{
{_LED1_ID | _LED2_ID | _LED3_ID | _LED4_ID | _LED5_ID | _LED6_ID | _LED7_ID, (LedsCtrl_t *)&ButtonsFault[1]},
{0, (LedsCtrl_t *)&ButtonsFault[2]},
{_LED9_ID | _LED10_ID | _LED11_ID | _LED12_ID | _LED13_ID | _LED14_ID | _LED15_ID, (LedsCtrl_t *)&ButtonsFault[3]},
{0, (LedsCtrl_t *)&ButtonsFault[0]},
};
__CTRL_TASK_EXT OS_TIMER SpeedKey;
__CTRL_TASK_EXT OS_TIMER IntensityKey;
/*************************************************************************
* Function Name: CtrlTask
* Parameters: none
* Return: none
*
* Description: Controlling LEDs flashing speed, pattern and intensity regarding
* of the keys state and status
*
*************************************************************************/
void CtrlTask (void)
{
CapKeysMessage_t CapKeysMess;
bool ErrorsShow = false;
// Init intensity
BSP_IntensityLED(LedsIntensity[LED_DEFAULT_INTENSITY]);
// Init LEDs pattern massive
pNewLEDsCtrl = (pLedsCtrl_t)RunningLight;
// Init LEDs scan timer
OS_CreateTimer(&ScanLEDsTimer,LEDsScan,1);
// Init LEDs pattern update timer
OS_CreateTimer(&UpdateLEDsPatternTimer,
LEDsUpdatePattern,
(LED_DEFAULT_SPEED * LED_SPEED_DELTA) + LED_SPEED_OFFSET);
OS_CreateTimer(&PowerOffTimer,
StandBy,
STAND_BY_TO * TICK_PER_SEC);
OS_CreateTimer(&SpeedKey,
UpdateSpeed,
1);
OS_CreateTimer(&IntensityKey,
UpdateIntensity,
1);
// Start timers
OS_StartTimer(&ScanLEDsTimer);
OS_StartTimer(&UpdateLEDsPatternTimer);
OS_StartTimer(&PowerOffTimer);
while(1)
{
// wait for a message from the scanning buttons task
OS_GetMail(&CapKeyMb,&CapKeysMess);
if(CapKeysMess.KeyErrorMask)
{
// Hardware fault set new LEDs pattern
if(!ErrorsShow)
{
OS_StopTimer(&IntensityKey);
OS_StopTimer(&SpeedKey);
pNewLEDsCtrl = (pLedsCtrl_t)ButtonsFault;
ErrorsShow = true;
}
}
else
{
// restart standby timer when some key is pressed
OS_RetriggerTimer(&PowerOffTimer);
if(ErrorsShow)
{
// No more hardware errors return usual LEDs pattern
ErrorsShow = false;
pNewLEDsCtrl = (pLedsCtrl_t)RunningLight;
}
// buttons data implement
// Left key control speed
// Right key control intensity
if(CapKeysMess.PressedKeysMask & KEYS_SPEED_MASK)
{
OS_RetriggerTimer(&SpeedKey);
}
else
{
OS_StopTimer(&SpeedKey);
OS_SetTimerPeriod(&SpeedKey,1);
}
if(CapKeysMess.PressedKeysMask & KEYS_INTENSITY_MASK)
{
OS_RetriggerTimer(&IntensityKey);
}
else
{
OS_StopTimer(&IntensityKey);
OS_SetTimerPeriod(&IntensityKey,1);
}
}
}
}
/*************************************************************************
* Function Name: UpdateSpeed
* Parameters: none
* Return: none
*
* Description: Change LEDs running light speed
*
*************************************************************************/
void UpdateSpeed (void)
{
static volatile bool SpeedDir = false;
static int Speed = LED_DEFAULT_SPEED;
unsigned int Temp;
Temp = OS_GetTimerPeriod(&SpeedKey);
if(Temp == 1)
{
// Speed incrementing/decrementing will be started after 1 second
OS_SetTimerPeriod(&SpeedKey,(1*TICK_PER_SEC));
}
else
{
// Speed incrementing/decrementing will be updated on every 0.3 seconds
OS_SetTimerPeriod(&SpeedKey,(0.3*TICK_PER_SEC));
}
// timer restarting
OS_RetriggerTimer(&SpeedKey);
if(SpeedDir)
{
// increment direction
if(++Speed >= _MAX_KEY_COUNT)
{
Speed = _MAX_KEY_COUNT - 2;
// change direction
SpeedDir = false;
}
}
else
{
// decrement direction
if(--Speed <= 0)
{
Speed = 2;
// change direction
SpeedDir = true;
}
}
// calculate new value and update timer
Temp = (Speed * LED_SPEED_DELTA) + LED_SPEED_OFFSET;
OS_SetTimerPeriod(&UpdateLEDsPatternTimer,Temp);
}
/*************************************************************************
* Function Name: UpdateIntensity
* Parameters: none
* Return: none
*
* Description: Change LEDs intensity
*
*************************************************************************/
void UpdateIntensity (void)
{
static volatile bool IntensityDir = true;
static unsigned int Intensity = LED_DEFAULT_INTENSITY;
unsigned int Temp;
Temp = OS_GetTimerPeriod(&IntensityKey);
if(Temp == 1)
{
// Intensity incrementing/decrementing will be started after 1 second
OS_SetTimerPeriod(&IntensityKey,(1*TICK_PER_SEC));
}
else
{
// Intensity incrementing/decrementing will be updated on every 0.3 seconds
OS_SetTimerPeriod(&IntensityKey,(0.3*TICK_PER_SEC));
}
OS_RetriggerTimer(&IntensityKey);
if(IntensityDir)
{
// increment direction
if(++Intensity >= _MAX_KEY_COUNT)
{
Intensity = _MAX_KEY_COUNT - 2;
// change direction
IntensityDir = false;
}
}
else
{
// decrement direction
if(--Intensity <= 0)
{
Intensity = 2;
// change direction
IntensityDir = true;
}
}
Temp = LedsIntensity[Intensity];
BSP_IntensityLED(Temp);
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?