You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
144 lines
3.5 KiB
144 lines
3.5 KiB
/*
|
|
* led.c
|
|
*
|
|
* Created on: 19/08/2015
|
|
* Author: Robert Fisk
|
|
*
|
|
* This Source Code Form is subject to the terms of the Mozilla Public
|
|
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
|
*/
|
|
|
|
|
|
#include "led.h"
|
|
#include "board_config.h"
|
|
#include "build_config.h"
|
|
|
|
uint32_t FaultLedCounter;
|
|
uint32_t ReadWriteFlashEndTime;
|
|
|
|
LedStatusTypeDef FaultLedState;
|
|
uint16_t FaultLedOnMs;
|
|
uint16_t FaultLedOffMs;
|
|
uint8_t FaultLedBlinkCount;
|
|
|
|
uint8_t FaultLedBlinkCountState;
|
|
uint8_t FaultLedOutputState;
|
|
|
|
|
|
void LED_Init(void)
|
|
{
|
|
FAULT_LED_ON;
|
|
ReadWriteFlashEndTime = 0;
|
|
FaultLedState = LED_STATUS_STARTUP;
|
|
}
|
|
|
|
|
|
void LED_SetState(LedStatusTypeDef newState)
|
|
{
|
|
switch (newState)
|
|
{
|
|
case LED_STATUS_OFF:
|
|
FaultLedCounter = UINT32_MAX;
|
|
FaultLedBlinkCountState = 0;
|
|
FaultLedOutputState = 0;
|
|
FAULT_LED_OFF;
|
|
break;
|
|
|
|
case LED_STATUS_FLASH_UNSUPPORTED:
|
|
FaultLedOnMs = LED_UNSUPPORTED_BLINK_MS;
|
|
FaultLedOffMs = LED_UNSUPPORTED_BLINK_MS;
|
|
FaultLedBlinkCount = 1;
|
|
break;
|
|
|
|
case LED_STATUS_FLASH_BOTDETECT:
|
|
FaultLedOnMs = LED_BOTDETECT_ON_MS;
|
|
FaultLedOffMs = LED_BOTDETECT_OFF_MS;
|
|
FaultLedBlinkCount = 2;
|
|
break;
|
|
|
|
case LED_STATUS_FLASH_READWRITE:
|
|
#ifdef CONFIG_WRITE_FLASH_TIME_MS
|
|
if (FaultLedState == LED_STATUS_OFF)
|
|
{
|
|
FaultLedOnMs = LED_READWRITE_ON_MS;
|
|
FaultLedOffMs = LED_READWRITE_OFF_MS;
|
|
FaultLedBlinkCount = 1;
|
|
ReadWriteFlashEndTime = HAL_GetTick() + CONFIG_WRITE_FLASH_TIME_MS;
|
|
}
|
|
else
|
|
#endif
|
|
{
|
|
newState = FaultLedState; //Don't override other active states
|
|
}
|
|
break;
|
|
|
|
default:
|
|
FaultLedOnMs = LED_ERROR_BLINK_MS; //Everything else is LED_STATUS_ERROR
|
|
FaultLedOffMs = LED_ERROR_BLINK_MS;
|
|
FaultLedBlinkCount = 1;
|
|
}
|
|
|
|
FaultLedState = newState;
|
|
}
|
|
|
|
|
|
void LED_Tick(void)
|
|
{
|
|
if (FaultLedState == LED_STATUS_OFF) return;
|
|
|
|
if (FaultLedState == LED_STATUS_STARTUP)
|
|
{
|
|
if (HAL_GetTick() >= STARTUP_FLASH_DELAY_MS)
|
|
{
|
|
LED_SetState(LED_STATUS_OFF);
|
|
}
|
|
return;
|
|
}
|
|
|
|
#ifdef CONFIG_WRITE_FLASH_TIME_MS
|
|
if (FaultLedState == LED_STATUS_FLASH_READWRITE)
|
|
{
|
|
if ((int32_t)(HAL_GetTick() - ReadWriteFlashEndTime) > 0)
|
|
{
|
|
LED_SetState(LED_STATUS_OFF);
|
|
return;
|
|
}
|
|
}
|
|
#endif
|
|
|
|
if (FaultLedOutputState)
|
|
{
|
|
if (FaultLedCounter++ >= FaultLedOnMs) //Check to turn LED off
|
|
{
|
|
FaultLedBlinkCountState++;
|
|
FaultLedCounter = 0;
|
|
FaultLedOutputState = 0;
|
|
FAULT_LED_OFF;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
if (FaultLedBlinkCountState >= FaultLedBlinkCount) //Checks to turn LED on...
|
|
{
|
|
if (FaultLedCounter++ >= FaultLedOffMs) //Last flash may have longer off-time
|
|
{
|
|
FaultLedBlinkCountState = 0;
|
|
FaultLedCounter = 0;
|
|
FaultLedOutputState = 1;
|
|
FAULT_LED_ON;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
if (FaultLedCounter++ >= FaultLedOnMs) //Flash sequence uses on-time as intermediate off-time
|
|
{
|
|
FaultLedCounter = 0;
|
|
FaultLedOutputState = 1;
|
|
FAULT_LED_ON;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|