TJ-WW03-H03/APP_smoke_N_V1.3/HARDWARE/LED/led.c

815 lines
14 KiB
C
Raw Normal View History

2024-07-29 10:32:25 +08:00
////////////////////////////////////////////////////////////////////////////////
/// @file led.c
/// @author AE TEAM
/// @brief THIS FILE PROVIDES ALL THE SYSTEM FUNCTIONS.
////////////////////////////////////////////////////////////////////////////////
/// @attention
///
/// THE EXISTING FIRMWARE IS ONLY FOR REFERENCE, WHICH IS DESIGNED TO PROVIDE
/// CUSTOMERS WITH CODING INFORMATION ABOUT THEIR PRODUCTS SO THEY CAN SAVE
/// TIME. THEREFORE, MINDMOTION SHALL NOT BE LIABLE FOR ANY DIRECT, INDIRECT OR
/// CONSEQUENTIAL DAMAGES ABOUT ANY CLAIMS ARISING OUT OF THE CONTENT OF SUCH
/// HARDWARE AND/OR THE USE OF THE CODING INFORMATION CONTAINED HEREIN IN
/// CONNECTION WITH PRODUCTS MADE BY CUSTOMERS.
///
/// <H2><CENTER>&COPY; COPYRIGHT MINDMOTION </CENTER></H2>
////////////////////////////////////////////////////////////////////////////////
// Define to prevent recursive inclusion
#define _LED_C_
// Files includes
#include "led.h"
#include "key.h"
#include "public.h"
//#include "uart.h"
#include "sim_eeprom.h"
////////////////////////////////////////////////////////////////////////////////
/// @addtogroup MM32_Example_Layer
/// @{
////////////////////////////////////////////////////////////////////////////////
/// @addtogroup LED
/// @{
////////////////////////////////////////////////////////////////////////////////
/// @addtogroup LED_Exported_Constants
/// @{
////////////////////////////////////////////////////////////////////////////////
/// @brief initialize LED GPIO pin
/// @note if use jtag/swd interface GPIO PIN as LED, need to be careful,
/// can not debug or program.
/// @param None.
/// @retval None.
////////////////////////////////////////////////////////////////////////////////
void LED_Init(void)
{
GPIO_InitTypeDef GPIO_InitStruct;
RCC_AHBPeriphClockCmd(RCC_AHBENR_GPIOA, ENABLE);
RCC_AHBPeriphClockCmd(RCC_AHBENR_GPIOB, ENABLE);
GPIO_StructInit(&GPIO_InitStruct);
GPIO_InitStruct.GPIO_Pin = Bat_T_Pin; // 初始化电池温度检测
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(GPIOB, &GPIO_InitStruct);
GPIO_InitStruct.GPIO_Pin = LED1_Pin | LED2_Pin | LED3_Pin | Beep_Pin | TemP_Pin | LDO_EN_Pin | CHANGE_Pin ; // LED灯初始化
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(GPIOA, &GPIO_InitStruct);
//禁用SWD功能
GPIO_PinAFConfig(GPIOA, GPIO_PinSource13, GPIO_AF_2); //AF to not pararell
GPIO_InitStruct.GPIO_Pin = TEST_Pin; // LED灯初始化
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(GPIOA, &GPIO_InitStruct);
LED1_OFF();
LED2_OFF();
LED3_OFF();
TEST_OFF();
}
//void LED
void V_led(void)
{
/***g_work.m_conditon.m_conditon.V_conditon:
0:
1
2
3
100% .
70%-99%
30%-69%
1-29%
***/
GPIO_InitTypeDef GPIO_InitStruct;
switch(g_work.m_conditon.m_conditon.V_conditon )
{
case 0 : // 4.0 以上满电
g_work.v_condtion = 2;
if( V_5_V == 1 )
{
if(g_work.m_time._Sleep_time / 500%2 == 0 )
{
RED_ON;
BLUE_ON;
GREEN_ON;
}
else
{
RED_OFF;
BLUE_OFF;
GREEN_OFF;
}
}
else
{
RED_ON;
BLUE_ON;
GREEN_ON;
}
break;
case 1 : //
g_work.v_condtion = 1;
if( V_5_V == 1 )
{
if(g_work.m_time._Sleep_time / 500%2 == 0 )
{
BLUE_ON;
}
else
{
BLUE_OFF;;
}
}
else
{
BLUE_ON;
}
RED_OFF;
GREEN_OFF;
break;
case 2 :
if( V_5_V == 1 )
{
if(g_work.m_time._Sleep_time / 500%2 == 0 )
{
RED_OFF;
}
else
{
RED_ON;
}
}
else
{
RED_ON;
}
BLUE_OFF;
GREEN_OFF;
break;
case 3:
if( V_5_V == 1 )
{
if(g_work.m_time._Sleep_time / 500%2 == 0 )
{
RED_OFF;
}
else
{
RED_ON;
}
}
else
{
if(g_work.m_time._Sleep_time / 205%2 == 0 )
{
RED_OFF;
}
else if( g_work.m_time._Sleep_time / 205%2 == 1 )
{
RED_ON;
}
}
BLUE_OFF;
GREEN_OFF;
break;
}
}
/*******
V_proess()
g_work.v_condtion
1% 3.50v
25% 3.70v
55% 3.90v
75% 4.13v
100% 4.35v
03.5-3.74v
13.75V-4.09V
24.10-4.34V
34.35V
44.35V
*************/
void V_proess()
{
// printf("\ng_work.V_real_Value:%d\n",g_work.V_real_Value);
GPIO_InitTypeDef GPIO_InitStruct;
// g_work.V_real_Value = g_work.v_value * 100 /510.0f * 710.0f+ 44;
// g_work.v_value = g_work.v_value + 18; // 相差 25
// printf("\ng_work.v_condtion:%d\n",g_work.v_condtion);
//printf("\ng_work.V_real_Value:%d\n",g_work.V_real_Value);
switch (g_work.v_condtion)
{
case 0:
if( g_work.V_real_Value >= 374 ) // 电压小于 3.55V 3.45 V 246 277
{
g_work.v_condtion = 1;
}
else
{
if ( g_work.V_real_Value < 370 )
{
if( g_work.m_conditon.m_conditon.V_conditon != 2 )
{
g_work.m_conditon.m_conditon.V_conditon = 2;
Write_condtion();
}
}
if( V_5_V == 1 )
{
if(g_work.m_time._Sleep_time / 500%2 == 0 )
{
RED_OFF;
}
else
{
RED_ON;
}
GREEN_OFF;
BLUE_OFF;
}
}
break;
case 1:
if ( g_work.V_real_Value >= 409) // 电压小于3.900 288 4.09 :294
{
g_work.v_condtion = 2;
}
else
{
if( V_5_V == 1 )
{
if(g_work.m_time._Sleep_time / 500%2 == 0 )
{
BLUE_OFF;
}
else
{
BLUE_ON;
}
RED_OFF;
GREEN_OFF;
if( g_work.m_conditon.m_conditon.V_conditon != 1 )
{
g_work.m_conditon.m_conditon.V_conditon = 1;
Write_condtion();
}
}
}
break;
case 2:
if( g_work.V_real_Value >= 434 )
{
g_work.v_condtion = 3;
}
else
{
if( V_5_V == 1 )
{
if(STANDBY == 1)
{
// RED_ON;
// BLUE_ON;
// GREEN_ON;
if ( g_work.m_time._Standby_time > 4500 )
{
g_work.v_condtion = 4;
}
}
if(g_work.m_time._Sleep_time / 500%2 == 0 )
{
RED_ON;
BLUE_ON;
GREEN_ON;
}
else
{
RED_OFF;
GREEN_OFF;
BLUE_OFF;
}
if( g_work.m_conditon.m_conditon.V_conditon != 0 )
{
g_work.m_conditon.m_conditon.V_conditon = 0;
Write_condtion();
}
}
}
break;
case 3:
if( V_5_V == 1 )
{
if(STANDBY == 1)
{
// RED_ON;
// BLUE_ON;
// GREEN_ON;
if ( g_work.m_time._Standby_time > 4500 )
{
g_work.v_condtion = 4;
}
}
// else
// {
if( g_work.m_time._Sleep_time / 500%2 == 0 )
{
RED_ON;
BLUE_ON;
GREEN_ON;
}
else
{
RED_OFF;
GREEN_OFF;
BLUE_OFF;
}
// }
if( g_work.m_conditon.m_conditon.V_conditon != 0 )
{
g_work.m_conditon.m_conditon.V_conditon = 0;
Write_condtion();
}
}
break;
case 4 :
if( V_5_V == 1 )
{
if( g_work.m_conditon.m_conditon.V_conditon != 0 )
{
g_work.m_conditon.m_conditon.V_conditon = 0;
Write_condtion();
}
if( g_work.m_time._full_stop_led_time < 30000 )
{
RED_ON;
BLUE_ON;
GREEN_ON;
}
else
{
RED_OFF;
GREEN_OFF;
BLUE_OFF;
}
if( g_work.m_work_flag.chargeflag == NOCHARGE )
{
g_work.v_condtion = 3;
}
}
break;
default:
break;
}
//Write_condtion();
}
/********************
err_led()
g_work.err_fault
NO_WARING:
LOW_T_ERR: // 低温报警 红蓝交替1次
PRO_T_ERR: // 保温报警 红蓝交替2次
HIG_T_ERR: // 高温报警 红蓝交替3次
OPEN_ERR: // 开路报警 红灯闪 3
SHORT_ERR: // 短路报警 红灯闪 2
BATT_HIG_ERR: // 电池高温报警 红蓝交替4次
NO_HOT_ERR: // 不加热报警 4 红灯闪
********************/
unsigned char err_led()
{
if( g_work.power == 1 && g_work.m_work_flag.led_err_flag == 0)
{
switch( g_work.err_fault )
{
case NO_WARING:
return 0;
break;
case LOW_T_ERR: // 低温报警 红蓝交替1次
if(g_work.m_time._Sleep_time / 400%4 == 0 )
{
RED_OFF;
BLUE_OFF;
}
else if( g_work.m_time._Sleep_time / 400%4 == 1 )
{
RED_ON;
BLUE_OFF;
}
else if ( g_work.m_time._Sleep_time / 400%4 == 2 )
{
RED_OFF;
BLUE_OFF;
}
else if ( g_work.m_time._Sleep_time / 400%4 == 3 )
{
BLUE_ON;
RED_OFF;
}
GREEN_OFF;
return 1;
break;
case PRO_T_ERR: // 保温报警 红蓝交替2次
if(g_work.m_time._Sleep_time / 200%4 == 0 )
{
RED_OFF;
BLUE_OFF;
}
else if( g_work.m_time._Sleep_time / 200%4 == 1 )
{
RED_ON;
BLUE_OFF;
}
else if ( g_work.m_time._Sleep_time / 200%4 == 2 )
{
RED_OFF;
BLUE_OFF;
}
else if ( g_work.m_time._Sleep_time / 200%4 == 3 )
{
BLUE_ON;
RED_OFF;
}
GREEN_OFF;
return 1;
break;
case HIG_T_ERR: // 高温报警 红蓝交替3次
if(g_work.m_time._Sleep_time / 200%4 == 0 )
{
RED_OFF;
BLUE_OFF;
}
else if( g_work.m_time._Sleep_time / 200%4 == 1 )
{
RED_ON;
BLUE_OFF;
}
else if ( g_work.m_time._Sleep_time / 200%4 == 2 )
{
RED_OFF;
BLUE_OFF;
}
else if ( g_work.m_time._Sleep_time / 200%4 == 3 )
{
BLUE_ON;
RED_OFF;
}
GREEN_OFF;
return 1;
break;
case OPEN_ERR: // 开路报警 红灯闪 3
if(g_work.m_time._Sleep_time / 300%2 == 0 )
{
RED_OFF;
}
else if( g_work.m_time._Sleep_time / 300%2 == 1 )
{
RED_ON;
}
GREEN_OFF;
BLUE_OFF;
return 1;
break;
case SHORT_ERR: // 短路报警 红灯闪 2
if(g_work.m_time._Sleep_time / 400%2 == 0 )
{
RED_OFF;
}
else if( g_work.m_time._Sleep_time / 400%2 == 1 )
{
RED_ON;
}
GREEN_OFF;
BLUE_OFF;
return 1;
break;
case BATT_HIG_ERR: // 高温报警 红蓝交替4次
if(g_work.m_time._Sleep_time / 200%4 == 0 )
{
RED_OFF;
BLUE_OFF;
}
else if( g_work.m_time._Sleep_time / 200%4 == 1 )
{
RED_ON;
BLUE_OFF;
}
else if ( g_work.m_time._Sleep_time / 200%4 == 2 )
{
RED_OFF;
BLUE_OFF;
}
else if ( g_work.m_time._Sleep_time / 200%4 == 3 )
{
BLUE_ON;
RED_OFF;
}
GREEN_OFF;
return 1;
break;
case NO_HOT_ERR: // 不加热报警 4 红灯闪
if(g_work.m_time._Sleep_time / 200%2 == 0 )
{
RED_OFF;
}
else if( g_work.m_time._Sleep_time / 200%2 == 1 )
{
RED_ON;
}
GREEN_OFF;
BLUE_OFF;
return 1;
break;
}
}
}
/***************************
led灯处理函数led_flash()
***************************/
void led_flash(void)
{
GPIO_InitTypeDef GPIO_InitStruct;
WWDG_SetCounter(0x7e);
if( err_led() == 1 )
{
return;
}
// if( g_work.err_fault == 1)
// {
// if( g_work.power == 1 )
// {
// if(g_work.m_time._Sleep_time / 200%2 == 0 )
// {
//
// RED_OFF;
// }
// else if( g_work.m_time._Sleep_time / 200%2 == 1 )
// {
// RED_ON;
// }
// }
//
//
// GREEN_OFF;
// BLUE_OFF;
// return;
// }
// else if( g_work.err_fault == 2)
// {
// if( g_work.power == 1 )
// {
// if(g_work.m_time._Sleep_time / 300%4 == 0 )
// {
//
// RED_ON;
// BLUE_OFF;
// }
// else if( g_work.m_time._Sleep_time / 300%4 == 1 )
// {
// RED_OFF;
// BLUE_OFF;
// }
// else if ( g_work.m_time._Sleep_time / 300%4 == 2 )
// {
// BLUE_ON;
// RED_OFF;
// }
// else if ( g_work.m_time._Sleep_time / 300%4 == 3 )
// {
// BLUE_OFF;
// RED_OFF;
// }
// }
//
//
// GREEN_OFF;
//
// return;
// }
if( g_work.power == 1 )
switch(g_work.work_conditon)
{
case STANDY:
if( V_5_V == 0 ) // 不充电
{
g_work._get_v_from_down = 1; //不记录电池电压
if( g_work.m_time._full_stop_led_time < 30000 && g_work.m_time._Sleep_time < 2000) // 满电亮灯 不让 再次显示
{
if( g_work.m_conditon.m_conditon.lock == 0 )
{
V_led(); // 上电显示
}
else
{
RED_OFF;
GREEN_OFF;
BLUE_OFF;
}
}
}
else
{
if( g_work.m_time._Charge_start_time < 30000 )// 充电前30 S 只是显示当前电量
{
V_led();
}
else // 30S 之后开始 充电判断显示
{
g_work._get_v_from_down = 1; //开始读取电压
V_proess(); // 充电的时候显示
}
}
break;
case ORDER_HOT: // 在预加热阶段 白灯闪烁
if(g_work.m_time._Sleep_time / 500%2 == 0 )
{
RED_ON;
BLUE_ON;
GREEN_ON;
}
else
{
RED_OFF;
GREEN_OFF;
BLUE_OFF;
}
break;
default:
if( g_work.work_conditon == FINISH ) // 结束阶段 白灯闪烁
{
if(g_work.m_time._Sleep_time / 500%2 == 0 )
{
RED_ON;
BLUE_ON;
GREEN_ON;
}
else
{
RED_OFF;
GREEN_OFF;
BLUE_OFF;
}
}
else if ( g_work.work_conditon == TEST ) // 测试阶段 灯灭
{
RED_OFF;
GREEN_OFF;
BLUE_OFF;
}
else // 其它阶段 白灯常亮
{
RED_ON;
BLUE_ON;
GREEN_ON;
}
break;
}
}
/// @}
/// @}
/// @}