205 lines
3.8 KiB
C
205 lines
3.8 KiB
C
|
|
#include "hwCtrl.h"
|
|
#include "r_cg_port.h"
|
|
#include "iodefine.h"
|
|
|
|
#include "r_cg_adc.h"
|
|
static uint8_t keystate[SIG_NUM] = {0};
|
|
static uint8_t keyPressFlag[SIG_NUM] = {0};
|
|
static uint8_t keyReleaseFlag[SIG_NUM] = {0};
|
|
static uint16_t keydelay[SIG_NUM] = {0};
|
|
uint16_t g_adval[12];
|
|
|
|
#define KEY_DELAY_TIMES 20 //20Ms
|
|
void ClearKeyState(void)
|
|
{
|
|
uint8_t i;
|
|
for (i = 0; i < SIG_NUM; i++)
|
|
{
|
|
keystate[i] = 0;
|
|
}
|
|
}
|
|
void setKeyPressFlag(uint8_t id)
|
|
{
|
|
if (id < SIG_NUM)
|
|
{
|
|
keyPressFlag[id] = KEY_PRESSED;
|
|
}
|
|
}
|
|
void setKeyReleaseFlag(uint8_t id)
|
|
{
|
|
|
|
if (id < SIG_NUM)
|
|
{
|
|
keyReleaseFlag[id] = KEY_PRESSED;
|
|
}
|
|
}
|
|
uint8_t getKeyPressFlag(uint8_t id)
|
|
{
|
|
uint8_t retVal = KEY_NOPRESSED;
|
|
if (id < SIG_NUM)
|
|
{
|
|
retVal = keyPressFlag[id];
|
|
keyPressFlag[id] = KEY_NOPRESSED;
|
|
}
|
|
return retVal;
|
|
}
|
|
uint8_t getKeyReleaseFlag(uint8_t id)
|
|
{
|
|
uint8_t retVal = KEY_NOPRESSED;
|
|
if (id < SIG_NUM)
|
|
{
|
|
retVal = keyReleaseFlag[id];
|
|
keyReleaseFlag[id] = KEY_NOPRESSED;
|
|
}
|
|
return retVal;
|
|
}
|
|
|
|
void KeyScan(void)
|
|
{
|
|
uint8_t i,key,key_nopress;
|
|
key_nopress = 0;
|
|
|
|
for (i = 0; i < SIG_NUM; i++)
|
|
{
|
|
key = GetIOState(i);
|
|
if (key == KEY_PRESSED && keystate[i] == KEY_NOPRESSED)
|
|
{
|
|
keydelay[i]++;
|
|
if (keydelay[i] >= KEY_DELAY_TIMES)
|
|
{
|
|
keystate[i] = KEY_PRESSED;
|
|
setKeyPressFlag(i);
|
|
}
|
|
}
|
|
else if(key == KEY_NOPRESSED)
|
|
{
|
|
if (keydelay[i] > 0)
|
|
{
|
|
keydelay[i]--;
|
|
}
|
|
else
|
|
{
|
|
if (keystate[i] == KEY_PRESSED)
|
|
{
|
|
setKeyReleaseFlag(i);
|
|
}
|
|
keystate[i] = KEY_NOPRESSED;
|
|
key_nopress++;
|
|
}
|
|
}
|
|
}
|
|
if (key_nopress == 6)
|
|
{
|
|
//
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
uint8_t GetIOState(uint8_t keyno)
|
|
{
|
|
switch (keyno)
|
|
{
|
|
//KEY
|
|
case SIGID_SW_LOCK_IN:
|
|
return I_SW_LOCK_IN==0?1:0;
|
|
case SIGID_SW_P_IN:
|
|
return I_SW_L_IN==0?1:0;
|
|
case SIGID_SW_ShiftGaresPlus:
|
|
return (getAdval(ADCH_HALL_F)<20 && getAdval(ADCH_HALL_N)>1000)?1:0;
|
|
case SIGID_SW_ShiftGaresMinus:
|
|
return (getAdval(ADCH_HALL_R)<20 && getAdval(ADCH_HALL_N)>1000)?1:0;
|
|
default:
|
|
return 0;
|
|
}
|
|
}
|
|
|
|
uint8_t GetKeyState(uint8_t keyno)
|
|
{
|
|
if (keyno < SIG_NUM)
|
|
{
|
|
return keystate[keyno];
|
|
}
|
|
return KEY_NOPRESSED;
|
|
}
|
|
|
|
|
|
void IND_Ctrl(IND_Type ind,uint8_t state)
|
|
{
|
|
//O_IND_CTRL = 1;
|
|
switch (ind)
|
|
{
|
|
case IND_P:
|
|
O_IND1_CTRL = state?1:0;
|
|
case IND_F:
|
|
O_IND2_CTRL = state?1:0;
|
|
break;
|
|
case IND_N:
|
|
O_IND3_CTRL = state?1:0;
|
|
break;
|
|
case IND_R:
|
|
O_IND4_CTRL = state?1:0;
|
|
break;
|
|
case IND_ALL_LIGHT:
|
|
O_IND1_CTRL = state?1:0;
|
|
O_IND2_CTRL = state?1:0;
|
|
O_IND3_CTRL = state?1:0;
|
|
O_IND4_CTRL = state?1:0;
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
uint16_t getAdval(ADCH_type ch)
|
|
{
|
|
if (ch < ADCH_NUM)
|
|
{
|
|
return g_adval[ch];
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
void ad_handle(void)
|
|
{
|
|
switch (ADS)
|
|
{
|
|
case _00_AD_INPUT_CHANNEL_0:
|
|
R_ADC_Get_Result(g_adval);
|
|
ADS = _01_AD_INPUT_CHANNEL_1;
|
|
break;
|
|
case _01_AD_INPUT_CHANNEL_1:
|
|
R_ADC_Get_Result(g_adval+1);
|
|
ADS = _02_AD_INPUT_CHANNEL_2;
|
|
break;
|
|
case _02_AD_INPUT_CHANNEL_2:
|
|
R_ADC_Get_Result(g_adval+2);
|
|
ADS = _03_AD_INPUT_CHANNEL_3;
|
|
break;
|
|
case _03_AD_INPUT_CHANNEL_3:
|
|
R_ADC_Get_Result(g_adval+3);
|
|
ADS = _00_AD_INPUT_CHANNEL_0;
|
|
break;
|
|
default:
|
|
ADS = _00_AD_INPUT_CHANNEL_0;
|
|
break;
|
|
}
|
|
}
|
|
|
|
|
|
/*****************diagnostic******************/
|
|
|
|
void getInputStatus(unsigned char* data)
|
|
{
|
|
data[0] = 0;
|
|
|
|
}
|
|
|
|
|