549 lines
14 KiB
C
Raw Normal View History

2025-04-26 16:03:23 +08:00
/** ##########################################################################
** Filename : keyboard_adc_mid.c
** Project : RGB LED
** Module :
** Processor : Cypress CY8C4125LQE-S433
** Version : V1.0
** Compiler : PSoC Creator 4.2
** Date/Time : 2020/02/26
** Abstract :
**
** Contents :
**
**
** (c) Copyright dmdz Co.,Ltd
** --------------------------------------------------------------------------
** R E V I S I O N H I S T O R Y
** --------------------------------------------------------------------------
** Date Ver Author Description
** --------- ---- ----------------- --------------------------------------
** #########################################################################*/
#include "common_memory.h"
#include "key_adc_mid.h"
#include "adc.h"
/*****************************************************************************
* I N C L U D E F I L E S
*****************************************************************************/
/*****************************************************************************
* D E F I N E S
*****************************************************************************/
static key_adc_mid_s g_key_adc_mid;
/*****************************************************************************
|Prototype : void key_adc_drive_init(void)
|Called by : None
|Preconditions : None
|Input parameters : None
|Output parameters : None
|Return value : None
|Description : cycle task
*****************************************************************************/
void key_adc_mid_init(void)
{
key_adc_driver_init();
common_memory_clear((u8*)&g_key_adc_mid,(u16)sizeof(g_key_adc_mid));
}
/*****************************************************************************
|Prototype : void key_adc_drive_task(void)
|Called by : None
|Preconditions : None
|Input parameters : None
|Output parameters : None
|Return value : None
|Description : cycle task
*****************************************************************************/
void key_adc_mid_task(void)
{
u8 i;
key_adc_result_e l_temp;
key_adc_driver_task();
for(i=0;i<KEY_ADC_ID_MAX;i++)
{
l_temp = key_adc_mid_get_drv_state(i);
if( (l_temp == KEY_ADC_RESULT_IDLE) || (l_temp == KEY_ADC_RESULT_FAULT) || (l_temp == KEY_ADC_RESULT_UNKNOW) )
{
g_key_adc_mid.key[i].count=0;
g_key_adc_mid.key[i].state = l_temp;
if(l_temp == KEY_ADC_RESULT_UNKNOW) //未弹起过也认为idle
{
g_key_adc_mid.key[i].state = KEY_ADC_RESULT_IDLE;
}
#ifdef KEY_ADC_MID_INIT_INVALID
if(l_temp == KEY_ADC_RESULT_IDLE)
{
g_key_adc_mid.key[i].sub_state = KEY_ADC_SUB_STATE_UP; //表示己经弹起过
}
#endif
}
else
{
/*code*/
switch(g_key_adc_mid.key[i].state)
{
case KEY_ADC_RESULT_IDLE:
case KEY_ADC_RESULT_UNKNOW:
case KEY_ADC_RESULT_FAULT: //认为在异常电平时,也可以判断有效;不做功能安全的话
/*if(l_temp == KEY_ADC_RESULT_PRESSS)*/
{
g_key_adc_mid.key[i].state = KEY_ADC_RESULT_PRESSS;
}
break;
#if 1
case KEY_ADC_RESULT_PRESSS:
/*if(l_temp == KEY_ADC_RESULT_PRESSS)*/
{
g_key_adc_mid.key[i].count++;
if(g_key_adc_mid.key[i].count>=g_key_adc_mid_time_cfg[i].long_press)//g_key_cfg_times[KEY_ADC_LONGPRESS_TIME_ID])
{
g_key_adc_mid.key[i].state = KEY_ADC_RESULT_LONG;
}
}
break;
case KEY_ADC_RESULT_LONG:
/*if(l_temp == KEY_ADC_RESULT_PRESSS)*/
{
g_key_adc_mid.key[i].count++;
if(g_key_adc_mid.key[i].count>=g_key_adc_mid_time_cfg[i].stick_press) //g_key_cfg_times[KEY_ADC_STICKPRESS_TIME_ID]) /*g_key_adc_mid_time_cfg[i].stick_press*/
{
g_key_adc_mid.key[i].state = KEY_ADC_RESULT_STICK;
}
}
break;
#else
case KEY_ADC_RESULT_PRESSS:
/*if(l_temp == KEY_ADC_RESULT_PRESSS)*/
{
g_key_adc_mid.key[i].count++;
if(g_key_adc_mid.key[i].count>=g_key_cfg_times[KEY_TIME_CFG_AD_STUCK_ID])
{
g_key_adc_mid.key[i].state = KEY_ADC_RESULT_STICK;
}
}
break;
#endif
#if 0
case KEY_ADC_RESULT_STICK:
/*if(l_temp == KEY_ADC_RESULT_PRESSS)*/
{
if(g_key_adc_mid.key[i].count<0xffffu)
{
g_key_adc_mid.key[i].count++;
}
}
break;
#endif
default:
/*code*/
break;
}
}
if(g_key_adc_mid.key[i].pre_state != g_key_adc_mid.key[i].state)
{
if((g_key_adc_mid.key[i].state == KEY_ADC_RESULT_PRESSS))
{
g_key_adc_mid.key[i].event |= KEY_ADC_EVENT_PRESSED;
}
else if (g_key_adc_mid.key[i].state == KEY_ADC_RESULT_LONG)
{
g_key_adc_mid.key[i].event |= KEY_ADC_EVENT_LONG_DOWN;
}
else if((g_key_adc_mid.key[i].pre_state == KEY_ADC_RESULT_PRESSS) && (g_key_adc_mid.key[i].state == KEY_ADC_RESULT_IDLE))
{
g_key_adc_mid.key[i].event |= KEY_ADC_EVENT_SHORT_DOWN_RELEASE;
}
if(g_key_adc_mid.key[i].state == KEY_ADC_RESULT_IDLE)
{
g_key_adc_mid.key[i].count=0;
g_key_adc_mid.key[i].state = KEY_ADC_RESULT_IDLE;
if((g_key_adc_mid.key[i].pre_state == KEY_ADC_RESULT_LONG) || (g_key_adc_mid.key[i].pre_state == KEY_ADC_RESULT_FAULT))
{
g_key_adc_mid.key[i].event = KEY_ADC_EVENT_RELEASE;
}
}
if( (g_key_adc_mid.key[i].state == KEY_ADC_RESULT_IDLE) || (g_key_adc_mid.key[i].state == KEY_ADC_RESULT_PRESSS) )
{
g_key_adc_mid.key[i].state_change =1u;
}
}
else
{
g_key_adc_mid.key[i].state_change =0u;
}
g_key_adc_mid.key[i].pre_state = g_key_adc_mid.key[i].state;
}
}
void key_adc_mid_quick_task(void)
{
u8 i;
#if 0
for(i=0;i<ADC_KEY_CHANNEL_TOTALS;i++)
{
adc_get_value_quick(ADC_CHANNEL_KEY_AD1+i,&g_key_adc_mid.channel[i]);
}
#else
#if 1
#ifndef RAM_OPTIMIZE_EN
for(i=0;i<KEY_ADC_CHANNEL_TOTALS;i++)
{
g_key_adc_mid.channel[i] = adc_manage_get_voltage(i+ADC0_LOGIC_CHN_NORMAL_KEY_START); /*PRQA S 2985*/ /*宏暫時為0*/
}
#endif
#else
for(i=0;i<ADC_KEY_CHANNEL_TOTALS;i++)
{
g_key_adc_mid.channel[i] = get_adc_key_org_value(i);
}
#endif
#endif
}
/*****************************************************************************
|Prototype : void key_adc_mid_get_result(void)
|Called by : None
|Preconditions : None
|Input parameters : channel AD邏輯通道 sub_id key排序
|Output parameters : None
|Return value : None
|Description :
*****************************************************************************/
key_adc_result_e key_adc_mid_get_result(u8 key_id)
{
#ifdef KEY_ADC_MID_DEBUG_STATE
key_adc_result_e l_result=KEY_ADC_RESULT_IDLE;
l_result = g_key_adc_mid.key[key_id].result;
#else
key_adc_result_e l_result=KEY_ADC_RESULT_IDLE;
if(key_id < KEY_ADC_ID_MAX)
{
#ifdef KEY_ADC_MID_INIT_INVALID
if(g_key_adc_mid.key[key_id].sub_state==KEY_ADC_SUB_STATE_UP) //弹起过
{
l_result = g_key_adc_mid.key[key_id].state;
}
else //未弹起过
{
if(g_key_adc_mid.key[key_id].state>=KEY_ADC_RESULT_STICK) //未弹起过,也要计时卡滞
{
l_result = g_key_adc_mid.key[key_id].state;
}
else
{
l_result = KEY_ADC_RESULT_IDLE;
}
}
#else
l_result = g_key_adc_mid.key[key_id].state;
#endif
}
#endif
return l_result;
}
/*****************************************************************************
|Prototype :
|Called by :
|Preconditions : -
|Input parameters : None id id
|Output parameters : None
|Return value : None
|Description : ,
*****************************************************************************/
u8 key_adc_mid_driver_get_change(u8 id)
{
u8 l_change;
if(id<KEY_ADC_ID_MAX)
{
l_change = g_key_adc_mid.key[id].state_change;
}
else
{
l_change = 0u;
}
return l_change;
}
/*****************************************************************************
|Prototype :
|Called by :
|Preconditions : -
|Input parameters : None id id
|Output parameters : None
|Return value : None
|Description : ,
*****************************************************************************/
u8 key_adc_mid_driver_get_event(u8 id)
{
u8 l_change;
if(id<KEY_ADC_ID_MAX)
{
l_change = g_key_adc_mid.key[id].event;
}
else
{
l_change = KEY_ADC_EVENT_NULL;
}
g_key_adc_mid.key[id].event = KEY_ADC_EVENT_NULL;
return l_change;
}
/*****************************************************************************
|Prototype :
|Called by :
|Preconditions : -
|Input parameters : None id id
|Output parameters : None
|Return value : None
|Description : 01
*****************************************************************************/
key_adc_mid_driver_diff_e key_adc_mid_judge_diff_wakeup(void)
{
u8 i;
key_adc_mid_driver_diff_e l_result =KEY_ADC_MID_DIFF_NULL;
for(i=0u;i<KEY_ADC_ID_MAX;i++)
{
if(g_key_adc_mid.key[i].pre_state != g_key_adc_mid.key[i].state)
{
l_result=KEY_ADC_MID_DIFF_SURE;
break;
}
}
return l_result;
}
/*****************************************************************************
|Prototype :
|Called by :
|Preconditions : -
|Input parameters : None id id
|Output parameters : None
|Return value : None
|Description :
*****************************************************************************/
key_adc_mid_driver_diff_e key_adc_mid_judge_state_wakeup(void)
{
u8 i;
key_adc_mid_driver_diff_e l_result =KEY_ADC_MID_DIFF_NULL;
for(i=0u;i<KEY_ADC_ID_MAX;i++)
{
if( (g_key_adc_mid.key[i].state >= KEY_ADC_RESULT_PRESSS) && (g_key_adc_mid.key[i].state <= KEY_ADC_RESULT_STICK) )
{
l_result=KEY_ADC_MID_DIFF_SURE;
break;
}
}
return l_result;
}
/*****************************************************************************
|Prototype :
|Called by :
|Preconditions : -
|Input parameters : None id id
|Output parameters : None
|Return value : None
|Description : sleep前;---
*****************************************************************************/
void key_adc_mid_goto_sleep(void)
{
u8 i;
key_adc_goto_sleep();
//再次记录 上次值和当前值,保持一致
for(i=0u;i<KEY_ADC_ID_MAX;i++)
{
g_key_adc_mid.key[i].count = 0x0u;
g_key_adc_mid.key[i].state_change = 0x0u;
g_key_adc_mid.key[i].state = KEY_ADC_RESULT_IDLE;
g_key_adc_mid.key[i].pre_state = g_key_adc_mid.key[i].state ;
}
}
/*****************************************************************************
|Prototype :
|Called by :
|Preconditions : -
|Input parameters : None id id
|Output parameters : None
|Return value : None
|Description : sleep前;---
*****************************************************************************/
void key_adc_mid_goto_wakeup(void)
{
}
#if 0
/*****************************************************************************
|Prototype : void key_adc_judge_valid(void)
|Called by : None
|Preconditions : None
|Input parameters :
|Output parameters : None
|Return value : None
|Description :
*****************************************************************************/
/* software detailed design ID SWDD120213 */
u8 key_adc_judge_valid(void)
{
u8 l_result = 0u;
u8 i;
#if 1
for(i=0;i<KEY_ADC_ID_MAX;i++)
{
if(g_key_adc_mid.key[i].state != KEY_ADC_RESULT_IDLE)
{
l_result =1;
break;
}
}
#else
for(i=0;i<ADC_KEY_CHANNEL_TOTALS;i++)
{
if(g_key_adc_mid.channel[i] <= ADC_ORIGINAL_NO_KEY_MIN ) /*ADC_ORIGINAL_NO_KEY_MIN*/
{
l_result =1;
break;
}
}
#endif
return l_result;
}
/*****************************************************************************
|Prototype : void key_adc_judge_wake(void)
|Called by : None
|Preconditions : None
|Input parameters :
|Output parameters : None
|Return value : None
|Description :
*****************************************************************************/
/* software detailed design ID SWDD120214 */
u8 key_adc_judge_wake(void)
{
u8 l_result = 0u;
u8 i;
/*adc_result_t l_adc;*/
/*l_result=0;*/
#if 0
for(i=0;i<KEY_ADC_ID_MAX;i++)
{
if(g_key_adc_mid.key[i].state != KEY_ADC_RESULT_IDLE)
{
l_result =1;
break;
}
}
#else
for(i=0;i<ADC_KEY_CHANNEL_TOTALS;i++)
{
if(g_key_adc_mid.channel[i] <= ADC_ORIGINAL_NO_KEY_ORG_MAX ) /*ADC_ORIGINAL_NO_KEY_MIN*/
{
l_result =1;
break;
}
}
#endif
/*l_result =0;*/
return l_result;
}
/*****************************************************************************
|Prototype : void key_adc_judge_pre_wake(void)
|Called by : None
|Preconditions : None
|Input parameters :
|Output parameters : None
|Return value : None
|Description :
*****************************************************************************/
u8 key_adc_judge_pre_wake(void) /*PRQA S 1503*/
{
u8 l_result = 0u;
#ifdef TEST_PIN_WAKEUP
#endif
#if 0
adc_get_value_quick(ADC_CHANNEL_KEY_AD1,&l_adc);
if( (l_adc <= ADC_ORIGINAL_NO_KEY_ORG_MAX) && (l_adc >= ADC_ORIGINAL_NO_KEY_ORG_MIN) )
{
l_result =1;
}
#else
l_result =1;
#endif
return l_result;
}
void key_adc_clear_result(void)
{
u8 i;
#if 0
for(i=0;i<KEY_ADC_ID_MAX;i++)
{
g_key_adc_mid.key[i].state = KEY_ADC_RESULT_IDLE;
}
#endif
for(i=0;i<ADC_KEY_CHANNEL_TOTALS;i++)
{
g_key_adc_mid.channel[i] = ADC_ORIGINAL_NO_KEY_ORG_INIT;
}
}
#if 0
/*****************************************************************************
|Prototype : void key_adc_mid_get_org_adc(void)
|Called by : None
|Preconditions : None
|Input parameters : channel AD邏輯通道 sub_id key排序
|Output parameters : None
|Return value : None
|Description :
*****************************************************************************/
u16 key_adc_mid_get_org_adc(u8 key_id)
{
u16 l_result=0;
if(key_id < ADC_KEY_CHANNEL_TOTALS)
{
l_result = g_key_adc_mid.channel[key_id];
}
return l_result;
}
#endif
#endif
/* [] END OF FILE */