341 lines
9.2 KiB
C
Raw Normal View History

2025-04-26 16:03:23 +08:00
/** ##########################################################################
** Filename : keyboard_drive.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 "key_adc_driver.h"
#include "adc.h"
#include "common_memory.h"
/*****************************************************************************
* I N C L U D E F I L E S
*****************************************************************************/
void key_adc_driver_check_channel(u16 adc_value,key_adc_driver_s *p_key_sm,const key_adc_range_cfg_s *p_key_cfg);
static u8 key_adc_driver_check_state(u8 count,key_adc_driver_s *p_key_sm,const key_adc_range_cfg_s *p_key_cfg);
static void key_adc_driver_check_channel_op(u8 result1,key_adc_driver_s *p_key_sm,const key_adc_range_cfg_s *p_key_cfg);
/*****************************************************************************
* D E F I N E S
*****************************************************************************/
static key_adc_driver_s g_key_adc_driver[KEY_ADC_CHANNEL_TOTALS];
/*****************************************************************************
|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_driver_init(void)
{
common_memory_clear((u8*)&g_key_adc_driver,(u16)sizeof(g_key_adc_driver));
}
/*****************************************************************************
|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_driver_task(void)
{
u8 i;
adc_result_t l_adc_value[KEY_ADC_CHANNEL_TOTALS];
key_adc_driver_cfg_get_value(KEY_ADC_CHANNEL_TOTALS,&l_adc_value[0]);
for(i=0u;i<KEY_ADC_CHANNEL_TOTALS;i++)
{
#ifdef KEY_ADC_DEBUG_EN
g_key_adc_driver[i].adc_org = l_adc_value[i];
#endif
key_adc_driver_check_channel(l_adc_value[i],&g_key_adc_driver[i],&g_key_adc_range_cfg[i][0]);
}
}
static u8 key_adc_driver_check_state(u8 count,key_adc_driver_s *p_key_sm,const key_adc_range_cfg_s *p_key_cfg)
{
u8 j=count;
u8 l_result=0xffu;
switch(p_key_sm->jude_line[j])
{
case KEY_ADC_RESULT_IDLE:
if(p_key_cfg[j].valid == 0x80u)
{
p_key_sm->count++;
if(p_key_sm->count>=g_key_cfg_times[KEY_ADC_FAULT_TIME_ID]) /* p_key_cfg[j].debounce */
{
p_key_sm->count =0;
p_key_sm->jude_line[j] = KEY_ADC_RESULT_PRESSS;
l_result = j;
}
}
else
{
p_key_sm->count++;
if(p_key_sm->count>=g_key_cfg_times[KEY_ADC_DEBOUNCE_TIME_ID]) /*p_key_cfg[j].debounce*/
{
p_key_sm->count =0;
p_key_sm->jude_line[j] = KEY_ADC_RESULT_PRESSS;
l_result = j;
}
}
break;
#if 0
case KEY_ADC_RESULT_PRESSS:
p_key_sm->count++;
if(p_key_sm->count>=p_key_cfg[j].long_press)
{
/*p_key_sm->count =0;*/
p_key_sm->jude_line[j] = KEY_RESULT_LONG;
}
break;
case KEY_RESULT_LONG:
p_key_sm->count++;
if(p_key_sm->count>=p_key_cfg[j].stick_press)
{
/*p_key_sm->count =0;*/
p_key_sm->jude_line[j] = KEY_ADC_RESULT_STICK;
}
break;
#else
case KEY_ADC_RESULT_PRESSS:
l_result = j;
p_key_sm->count=0u;
break;
#endif
default:
/*code*/
break;
}
return l_result;
}
static void key_adc_driver_check_channel_op(u8 result1,key_adc_driver_s *p_key_sm,const key_adc_range_cfg_s *p_key_cfg)
{
u8 j;
u8 l_result = result1;
/*如果是沒有任何按鍵有效*/
if(l_result == 0xffu)
{
#if 0
for(j=0;j<KEY_ADC_1CHANNEL_JUDGE_TOTALS;j++)
{
p_key_sm->jude_line[j] = KEY_ADC_RESULT_IDLE;
}
for(j=0;j<KEY_ADC_1CHANNEL_PHY_TOTALS;j++)
{
p_key_sm->result[j] = KEY_ADC_RESULT_IDLE;
}
#endif
}
else
{
for(j=0;j<KEY_ADC_1CHANNEL_PHY_TOTALS;j++)
{
if( (p_key_cfg[l_result].valid & (u8)((u8)0x01<<j) ) != 0u) /*PRQA S 4571*/
{
//该判断句是为了在fault时不能直接置成功
//if( (p_key_sm->result[j]!=KEY_ADC_RESULT_FAULT) )// && (p_key_sm->pre_state!=KEY_ADC_STATE_FAULT) )
{
p_key_sm->result[j] = KEY_ADC_RESULT_PRESSS;
}
}
else
{
//第一个判断句是为了保持上次fault第二个判断句是为了弹起时才清除状态
//if( (p_key_sm->result[j] != KEY_ADC_RESULT_FAULT) || (p_key_sm->state==KEY_ADC_STATE_IDLE) )
{
p_key_sm->result[j] =KEY_ADC_RESULT_IDLE;
}
}
/*机械故障*/
if(p_key_cfg[l_result].valid == 0x80u)
{
p_key_sm->result[j] =KEY_ADC_RESULT_FAULT;
p_key_sm->state = KEY_ADC_STATE_FAULT; //在错误的范围
}
}
//
}
}
/*****************************************************************************
|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_driver_check_channel(u16 adc_value,key_adc_driver_s *p_key_sm,const key_adc_range_cfg_s *p_key_cfg)
{
u8 j,k;
u8 l_result = 0xffu;
u8 l_breakout =0u;
for(j=0;j<KEY_ADC_1CHANNEL_JUDGE_TOTALS;j++)
{
if( (adc_value>= p_key_cfg[j].min) && (adc_value <= p_key_cfg[j].max) ) /*&& (p_key_cfg[j].valid!=0u) )*/
{
p_key_sm->state = (key_adc_state_e)j;
if(p_key_sm->pre_state != p_key_sm->state)
{
p_key_sm->count =0;
for(k=0;k<KEY_ADC_1CHANNEL_JUDGE_TOTALS;k++)
{
p_key_sm->jude_line[k] = KEY_ADC_RESULT_IDLE;
}
}
else
{
/*code*/
}
l_result = key_adc_driver_check_state(j,p_key_sm,p_key_cfg);
l_breakout=1u;
/*break;*/
}
else
{
/*p_key_sm->jude_line[j] = KEY_ADC_RESULT_IDLE;*/
if(p_key_sm->jude_line[j] != KEY_ADC_RESULT_IDLE)
{
p_key_sm->count++;
if(p_key_sm->count>=p_key_cfg[j].debounce)
{
p_key_sm->count =0;
p_key_sm->jude_line[j] = KEY_ADC_RESULT_IDLE;
l_result = 0xffu;
l_breakout=1u;
/*break;*/
}
}
}
if(l_breakout==1u)
{
break;
}
}
//不在任何范围内
if(l_breakout==0u)
{
//消抖的时间,要更久一点,达到秒级
p_key_sm->count++;
if(p_key_sm->count>=g_key_cfg_times[KEY_ADC_OTHER_FAULT_TIME_ID])
{
p_key_sm->count =0;
l_result = 0xffu;
for(j=0;j<KEY_ADC_1CHANNEL_JUDGE_TOTALS;j++)
{
p_key_sm->jude_line[j] = KEY_ADC_RESULT_IDLE;
}
for(j=0;j<KEY_ADC_1CHANNEL_PHY_TOTALS;j++)
{
p_key_sm->result[j] = KEY_ADC_RESULT_FAULT;
}
p_key_sm->state = KEY_ADC_STATE_FAULT; //不在任何判斷範圍
}
}
key_adc_driver_check_channel_op(l_result,p_key_sm,p_key_cfg);
p_key_sm->pre_state = p_key_sm->state;
}
/*****************************************************************************
|Prototype : void key_adc_driver_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_driver_get_result(u8 channel,u8 sub_id)
{
key_adc_result_e l_result=KEY_ADC_RESULT_IDLE;
if(channel<=KEY_ADC_CHANNEL_TOTALS)
{
if(sub_id<=KEY_ADC_1CHANNEL_PHY_TOTALS)
{
if(g_key_adc_driver[channel].result[sub_id] != KEY_ADC_RESULT_IDLE)
{
l_result = g_key_adc_driver[channel].result[sub_id];
}
else
{
l_result = KEY_ADC_RESULT_IDLE;
}
}
}
return l_result;
}
/*****************************************************************************
|Prototype : void key_adc_goto_sleep(void)
|Called by : None
|Preconditions : None
|Input parameters : None
|Output parameters : None
|Return value : None
|Description : cycle task
*****************************************************************************/
/* software detailed design ID */
void key_adc_goto_sleep(void)
{
#if 1
common_memory_clear((u8*)&g_key_adc_driver,(u16)sizeof(g_key_adc_driver));
#else
u8 i;
for(i=0u;i<KEY_ADC_CHANNEL_TOTALS;i++)
{
g_key_adc_driver[i].result[i] = KEY_ADC_RESULT_IDLE;
}
#endif
}
/*****************************************************************************
|Prototype : void key_adc_goto_sleep(void)
|Called by : None
|Preconditions : None
|Input parameters : None
|Output parameters : None
|Return value : None
|Description : cycle task
*****************************************************************************/
/* software detailed design ID */
void key_adc_goto_wakeup(void)
{
}
/* [] END OF FILE */