#define RUN_LED_PORT
#define RUN_LED_PIN
#define SD_LED_PORT
#define SD_LED_PIN
#define LEVEL_LED_PORT
#define LEVEL_LED_PIN_0
#define LEVEL_LED_PIN_1
#define LEVEL_LED_PIN_2
#define LEVEL_LED_PIN_3
#define LED_PIN_BACK
#define DETECT_PORT
#define DETECT_PIN_ON
#define DETECT_PIN_SINGLE
#define DETECT_PIN_BACK
#define CTRL_PORT
#define CTRL_PIN_CAMERA
#define CTRL_PIN_ROUTER
#define CTRL_PIN_BACK
#define AD_PORT
#define AD_PIN_V
#define AD_PIN_A
#define LED_STATE_ON 0
#define LED_STATE_OFF 1
#define VOLTAGE_LEVEL 4
#define VOLTAGE_FULL 4240 / 2
#define VOLTAGE_QUARTER_3
#define VOLTAGE_HALF
#define VOLTAGE_EMPTY
typedef enum
{
NO_POWER_INPUT = 0,
POWER_INPUT = 1,
}MODE_RUN;
typedef enum
{
ON_KEY_UP = 0,
ON_KEY_DOWN = 1,
}MODE_KEY_ON;
typedef struct _tag_LEVEL_LED_STATE
{
u8 index;
u8 state;
MODE_RUN mode;
}LEVEL_LED_STATE;
LEVEL_LED_STATE gLevelLedState[VOLTAGE_LEVEL];
u32 AdVoltage_Get(u32 port, u32 pin, u8 state)
{
u32 voltage = 0;
return voltage;
}
MODE_KEY_ON DetectKeyOn_GetState(u32 port, u32 pin)
{
u32 PinState = 0;
PinState = GPIO_ReadBit();
if(0 == PinState)
return ON_KEY_UP;
else if (1 == PinState)
rerutn ON_KEY_DOWN;
}
void Led_Ctrl(u32 port, u32 pin, u8 state)
{
if(LED_STATE_ON == state)
GPIO_SetBit();
else if(LED_STATE_OFF == state)
GPIO_ResetBit();
}
void LevelLed_StateInit()
{
memset(&gLevelLedState[0], 0, VOLTAGE_LEVEL * sizeof(gLevelLedState[0]));
}
void LevelLed_StateChange()
{
u8 LedIndex = 0;
for(LedIndex = 0; LedIndex < VOLTAGE_LEVEL; LedIndex++)
{
gLevelLedState[]
}
}
void Main_Proc()
{
LevelLed_StateChange();
}
void main()
{
while(1)
{
Main_Proc();
}
}
void TIM1_Handler()
{
return;
}
#define RUN_LED_PORT
#define RUN_LED_PIN
#define SD_LED_PORT
#define SD_LED_PIN
#define LEVEL_LED_PORT
#define LEVEL_LED_PIN_0
#define LEVEL_LED_PIN_1
#define LEVEL_LED_PIN_2
#define LEVEL_LED_PIN_3
#define LED_PIN_BACK
#define DETECT_PORT
#define DETECT_PIN_ON
#define DETECT_PIN_SINGLE
#define DETECT_PIN_BACK
#define CTRL_PORT
#define CTRL_PIN_CAMERA
#define CTRL_PIN_ROUTER
#define CTRL_PIN_BACK
#define AD_PORT
#define AD_PIN_V
#define AD_PIN_A
#define VOLTAGE_LEVEL 4
#define VOLTAGE_FULL 4240 / 2
#define VOLTAGE_QUARTER_3
#define VOLTAGE_HALF
#define VOLTAGE_EMPTY 3140 / 2
#define LEVEL_LED_PERIOD 1000
typedef enum
{
LED_STATE_ON = 0,
LED_STATE_OFF = 1,
}MODE_LED;
typedef enum
{
NO_POWER_INPUT = 0,
POWER_INPUT = 1,
}MODE_RUN;
typedef enum
{
ON_KEY_OFF = 0,
ON_KEY_ON = 1,
}MODE_KEY_ON;
typedef enum
{
CTRL_OUTPUT_OFF = 0,
CTRL_OUTPUT_ON = 1,
}MODE_CTRL_OUTPUT;
typedef struct _tag_LED_TWINKLE
{
u32 index;
u32 TickCount;
MODE_LED TwinkleFlag;
}LED_TWINKLE;
typedef struct _tag_LEVEL_LED_STATE
{
MODE_RUN mode;
LED_TWINKLE TwinkleState;
MODE_LED LedFlag[VOLTAGE_LEVEL];
}LEVEL_LED_STATE;
LEVEL_LED_STATE gLevelLedState = {0};
u32 gBatteryVoltage = 0;
u32 AdVoltage_Get(u32 port, u32 pin)
{
u32 voltage = 0;
return voltage;
}
void BatteryVlotage_GetValue()
{
gBatteryVoltage = AdVoltage_Get(AD_PORT , AD_PIN_V);
}
MODE_KEY_ON DetectKeyOn_GetState(u32 port, u32 pin)
{
u16 PinState = 0;
PinState = GPIO_ReadBit();
if(ON_KEY_OFF == PinState)
return ON_KEY_OFF;
else if (ON_KEY_ON == PinState)
rerutn ON_KEY_ON;
}
void Ctrl_Output(u32 port, u32 pin, MODE_CTRL state)
{
if(CTRL_OUTPUT_ON == state)
GPIO_SetBit();
else if(CTRL_OUTPUT_OFF == state)
GPIO_ResetBit();
}
void Led_Ctrl(u32 port, u32 pin, MODE_LED state)
{
if(LED_STATE_ON == state)
GPIO_SetBit();
else if(LED_STATE_OFF == state)
GPIO_ResetBit();
}
void LevelLed_ChangeModeByInput()
{
u16 state = 0;
state = DetectKeyOn_GetState();
if(ON_KEY_OFF == state)
{
gLevelLedState.mode = ON_KEY_OFF;
}
else if(ON_KEY_ON == state)
{
gLevelLedState.mode = ON_KEY_ON;
}
}
void LevelLed_InvertTwinkleLedFlag()
{
if (LED_STATE_ON == gLevelLedState.TwinkleState.TwinkleFlag)
{
gLevelLedState.TwinkleState.TwinkleFlag = LED_STATE_OFF;
}
else if (LED_STATE_OFF == gLevelLedState.TwinkleState.TwinkleFlag)
{
gLevelLedState.TwinkleState.TwinkleFlag = LED_STATE_ON;
}
}
void LevelLed_TickInc()
{
if(ON_KEY_ON == gLevelLedState.mode)
{
if(LEVEL_LED_PERIOD <= gLevelLedState.TickCount)
{
LevelLed_InvertTwinkleLedFlag();
}
else
{
gLevelLedState.TwinkleState.TickCount++;
}
}
}
void LevelLed_PosCycleSetFlag(u32 num, MODE_LED flag)
{
u32 index = 0;
for(index = 0;index < num; index++)
{
gLevelLedState.LedFlag[index] = flag;
}
}
void LevelLed_NegCycleSetFlag(u32 num, MODE_LED flag)
{
u32 index = VOLTAGE_LEVEL - 1;
for(index = VOLTAGE_LEVEL - 1;index >= VOLTAGE_LEVEL - num; index--)
{
gLevelLedState.LedFlag[index] = flag;
}
}
void LevelLed_CalcByVlotage()
{
if(VOLTAGE_EMPTY > gBatteryVoltage)
{
LevelLed_PosCycleSetFlag(VOLTAGE_LEVEL, LED_STATE_OFF);
}
else if(VOLTAGE_EMPTY <= gBatteryVoltage && gBatteryVoltage < VOLTAGE_HALF)
{
LevelLed_PosCycleSetFlag(1, LED_STATE_ON);
LevelLed_NegCycleSetFlag(3, LED_STATE_OFF);
}
else if(VOLTAGE_HALF <= gBatteryVoltage && gBatteryVoltage < VOLTAGE_QUARTER_3)
{
LevelLed_PosCycleSetFlag(2, LED_STATE_ON);
LevelLed_NegCycleSetFlag(2, LED_STATE_OFF);
}
else if(VOLTAGE_QUARTER_3 <= gBatteryVoltage && gBatteryVoltage < VOLTAGE_FULL)
{
LevelLed_PosCycleSetFlag(3, LED_STATE_ON);
LevelLed_NegCycleSetFlag(1, LED_STATE_OFF);
}
else if (VOLTAGE_FULL <= gBatteryVoltage)
{
LevelLed_NegCycleSetFlag(4, LED_STATE_ON);
}
}
void LevelLed_GetTwinkleIndex()
{
if(ON_KEY_ON == gLevelLedState.mode)
return;
else if(ON_KEY_OFF == gLevelLedState.mode)
{
if(VOLTAGE_EMPTY > gBatteryVoltage)
{
gLevelLedState.TwinkleState.index = 0;
}
else if(VOLTAGE_EMPTY <= gBatteryVoltage && gBatteryVoltage < VOLTAGE_HALF)
{
gLevelLedState.TwinkleState.index = 1;
}
else if(VOLTAGE_HALF <= gBatteryVoltage && gBatteryVoltage < VOLTAGE_QUARTER_3)
{
gLevelLedState.TwinkleState.index = 2;
}
else if(VOLTAGE_QUARTER_3 <= gBatteryVoltage && gBatteryVoltage < VOLTAGE_FULL)
{
gLevelLedState.TwinkleState.index = 3;
}
else if (VOLTAGE_FULL <= gBatteryVoltage)
{
return;
}
}
}
void LevelLed_Ctrl(u32 index, MODE_LED flag)
{
switch (index)
{
case 0:
Led_Ctrl(LEVEL_LED_PORT ,LEVEL_LED_PIN_0, flag);
break;
case 1:
Led_Ctrl(LEVEL_LED_PORT ,LEVEL_LED_PIN_1, flag);
break;
case 2:
Led_Ctrl(LEVEL_LED_PORT ,LEVEL_LED_PIN_2, flag);
break;
case 3:
Led_Ctrl(LEVEL_LED_PORT ,LEVEL_LED_PIN_3, flag);
break;
default:
break
}
}
void LevelLed_Play()
{
u32 index = 0;
if(ON_KEY_ON == gLevelLedState.mode)
{
for(index = 0;index < num; index++)
{
LevelLed_Ctrl(index, gLevelLedState.LedFlag[index]);
}
}
else if(ON_KEY_OFF == gLevelLedState.mode)
{
for(index = 0;index < num; index++)
{
if(index == gLevelLedState.TwinkleState.index)
{
LevelLed_Ctrl(index, gLevelLedState.TwinkleState.TwinkleFlag);
}
else
{
LevelLed_Ctrl(index, gLevelLedState.LedFlag[index]);
}
}
}
}
void Main_Proc()
{
BatteryVlotage_GetValue();
LevelLed_ChangeModeByInput();
LevelLed_CalcByVlotage();
LevelLed_GetTwinkleIndex();
LevelLed_Play();
}
void main()
{
while(1)
{
Main_Proc();
}
}
void TIM1_Handler()
{
LevelLed_TickInc();
return;
}