549 lines
14 KiB
C
549 lines
14 KiB
C
/** ##########################################################################
|
||
** 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 : 轻量级判斷,是否按鍵有變化; 0表示沒有變化,1表示有變化
|
||
*****************************************************************************/
|
||
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 */
|