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 + -
显示快捷键?