/**
******************************************************************************
* @file Key.c
* @author jjj
* @version V1.0.0
* @date 06/13/2022
* @brief
******************************************************************************
*
*
*
© COPYRIGHT 2022
******************************************************************************
**/
#include "global.h"
#include "Key.h"
#define IDLE 0
#define KEY_INPUT_MAX 11
uint8_t key_input[KEY_INPUT_MAX+5];
volatile uint8_t num_key_input=0;
volatile uint16_t keyValue_last=0;
volatile uint16_t key_processed = 0;
uint8_t gKeyAction = 0;
extern uint8_t gReceiveKey;
const uint16_t KEY_ROW[4] = {KEYA_ROW0,KEYA_ROW1,KEYA_ROW2,KEYA_ROW3};
KEY_STATUS stKey1={0,1,0,0,0},
stKey2={0,1,0,0,0},
stKey3={0,1,0,0,0},
stKey4={0,1,0,0,0},
stKey5={0,1,0,0,0},
stKey6={0,1,0,0,0},
stKey7={0,1,0,0,0},
stKey8={0,1,0,0,0},
stKey9={0,1,0,0,0},
stKey0={0,1,0,0,0},
stKeyFn={0,1,0,0,0},
stKeyDA={0,1,0,0,0},
stKeyDB={0,1,0,0,0},
stKeyC={0,1,0,0,0},
stKeyVA={0,1,0,0,0},
stKeyVB={0,1,0,0,0};
extern void LCD_Erase();
extern void LCD_Display();
extern void LCD_CharDisplay();
extern void JJJ_Prompt();
extern uint8_t HIDKBW(BarData *pCode);
extern uint8_t DisableCodeBarRead(BarData *pCode);
extern uint8_t DisableRaedALl(BarData *pCode);
extern uint8_t EnableCodeBarRead(BarData *pCode);
extern uint8_t EnableQRRead(BarData *pCode);
extern uint8_t DisableQRRead(BarData *pCode);
extern uint8_t USBVirtualCOM(BarData *pCode);
extern uint8_t DisableKeyboard(BarData *pCode);
extern uint8_t EnableKeyboard(BarData *pCode);
extern uint8_t DisableOneDimReadNoUpd(BarData *pCode);
extern uint8_t EnableOneDimReadNoUpd(BarData *pCode);
extern uint8_t KeyRestoreFactorySetting(BarData *pCode);
extern void GetChipSNStr(int commtype);
extern void Play_KeyVoiceOne(void);
extern void Play_KeyVoiceTwo(void);
extern void Play_KeyVoiceThree(void);
extern void Play_KeyVoiceFour(void);
extern void Play_KeyVoiceFive(void);
extern void Play_KeyVoiceSix(void);
extern void Play_KeyVoiceSeven(void);
extern void Play_KeyVoiceEight(void);
extern void Play_KeyVoiceNine(void);
extern void Play_KeyVoiceZero(void);
extern void Play_KeyVoiceMinus(void);
extern void Play_KeyVoiceDelete(void);
extern void Play_KeyVoiceVerify(void);
extern void Play_KeyVoiceClean(void);
extern void Play_KeyVoiceTooLong(void);
extern void Play_KeyVoiceGainMode(void);
extern void Play_JinYongOneCode(void);
extern void Play_QiYongOneCode(void);
extern void Play_JinYongTwoCode(void);
extern void Play_QiYongTwoCode(void);
extern void Play_JinYongKeyboard(void);
extern void Play_QiYongKeyboard(void);
extern void Delay_us(uint32_t us);
#define FUN_KEY_SCAN(GPIOx,COL,stKey,KEYx) \
{ \
if(GPIO_ReadInputDataBit(GPIOx,COL)) \
{ \
stKey.release_count++; \
if(stKey.release_count>KEY_SHAKE_COUNT) \
{ \
stKey.pressed = 0; \
stKey.press_count = 0; \
stKey.released = 1; \
stKey.release_count = KEY_SHAKE_COUNT; \
} \
} else { \
stKey.press_count++; \
if(stKey.press_count>KEY_SHAKE_COUNT) \
{ \
stKey.released = 0; \
stKey.release_count = 0; \
stKey.press_count = KEY_SHAKE_COUNT; \
return KEYx; \
} \
} \
return 0; \
}
#define FUN_KEYPRESS(x,KEYx,stKey,PLAY_KEYVOICEx) \
if(!stKey.pressed) \
{ \
stKey.hold_count = 0; \
} else { \
stKey.hold_count++; \
if(stKey.hold_count==KEY_HOLDCOUNT)stKey.hold_count = 0; \
} \
key_processed = KEYx; \
stKey.pressed = 1; \
stKey.released = 0; \
if(stKey.hold_count==0) \
{ \
if(gConfgBuf.statusKey==OFF)break; \
if(num_key_inputbartype);
}
else
{
EnableOneDimReadNoUpd(pCode);
Play_QiYongOneCode();
if(gCfgUpdateFlag!=UPDATEALCFG)gCfgUpdateFlag = UPDATEALCFG;
SetOutputData((uint8_t *)"BARCODEENABLE",13);
ReportData(pCode->bartype);
}
return TMC_NONE;
}
uint8_t EnOrDisTwoDimCode(BarData *pCode)
{
if(gConfgBuf.QR==ON)
{
gConfgBuf.QR = OFF;
if(gCfgUpdateFlag!=UPDATEALCFG)gCfgUpdateFlag = UPDATEALCFG;
Play_JinYongTwoCode();
SetOutputData((uint8_t *)"Fn59DISABLE",11);
ReportData(pCode->bartype);
} else
{
gConfgBuf.QR = ON;
if(gCfgUpdateFlag!=UPDATEALCFG)gCfgUpdateFlag = UPDATEALCFG;
Play_QiYongTwoCode();
SetOutputData((uint8_t *)"Fn59ENABLE",11);
ReportData(pCode->bartype);
}
return TMC_NONE;
}
uint8_t EnOrDisKey(BarData *pCode)
{
if(gConfgBuf.statusKey==ON)
{
gConfgBuf.statusKey = OFF;
if(gCfgUpdateFlag==0)gCfgUpdateFlag = UPDATECFG;
Play_JinYongKeyboard();
SetOutputData((uint8_t *)"KEYBOARDDISABLE",15);
ReportData(pCode->bartype);
}
else
{
gConfgBuf.statusKey = ON;
if(gCfgUpdateFlag==0)gCfgUpdateFlag = UPDATECFG;
Play_QiYongKeyboard();
SetOutputData((uint8_t *)"KEYBOARDENABLE",14);
ReportData(pCode->bartype);
}
return TMC_NONE;
}
uint8_t IncreaseVolume(BarData *pCode)
{
if(gConfgBuf.voiceGain<4)
{
gConfgBuf.voiceGain++;
if(gCfgUpdateFlag==0)gCfgUpdateFlag = UPDATECFG;
SpeakerOff();
Delay_us(800);
Delay_us(500);
SpeakerOn();
}
Play_KeyVoiceGainMode();
SetOutputData((uint8_t *)"INCREASEV",9);
return TMC_OK;
}
uint8_t DecreaseVolume(BarData *pCode)
{
if(gConfgBuf.voiceGain>1)
{
gConfgBuf.voiceGain--;
if(gCfgUpdateFlag==0)gCfgUpdateFlag = UPDATECFG;
SpeakerOff();
Delay_us(800);
Delay_us(500);
SpeakerOn();
}
Play_KeyVoiceGainMode();
SetOutputData((uint8_t *)"DECREASEV",9);
return TMC_OK;
}
uint8_t ShowSN(BarData *pCode)
{
num_key_input = 0;
LCD_Erase();
uint8_t *p_sn = (uint8_t *) TUSNADDR;
if(*(p_sn + SN_SFLAG_OFFS) == 'S' && *(p_sn + SN_NFLAG_OFFS) == 'N')
{
LCD_CharDisplay((p_sn + SN_NFLAG_OFFS+1),*(p_sn+SN_LEN_OFFS) - SN_SNFLAG_LEN);
} else
{
}
return TMC_NONE;
}
uint8_t Fn29ShowSN(BarData *pCode)
{
num_key_input = 0;
LCD_Erase();
SetOutputData((uint8_t *)"Fn29",4);
uint8_t *p_sn = (uint8_t *) TUSNADDR;
if(*(p_sn + SN_SFLAG_OFFS) == 'S' && *(p_sn + SN_NFLAG_OFFS) == 'N')
{
if(!gReceiveKey)
{
SetPackType(PACK_TYPEA);
SetOutputData((uint8_t *)"NOKEY",5);
ReportData(Communication_Id);
} else {
SetOutputData((p_sn + SN_NFLAG_OFFS+1),*(p_sn+SN_LEN_OFFS) - SN_SNFLAG_LEN);
ReportData(Communication_Id);
}
} else
{
SetPackType(PACK_TYPEA);
SetOutputData("ERR",3);
ReportData(Communication_Id);
}
return TMC_NONE;
}
/**
* @function Key_Action
* @brief 扫描键盘事件后,执行相应的动作
*/
void Key_Action(void)
{
uint16_t keyValue;
gKeyAction = 0;
keyValue = Key_Scan();
if(keyValue==0)
{
keyValue_last = keyValue;
key_processed = 0;
return ;
}
gKeyAction = 1;
BarData data;
data.bartype = Communication_Id;
switch(keyValue)
{
case (KEYF|KEY5|KEY9):
//en/disable qr code
if(key_processed==(KEYF|KEY5|KEY9))break;
key_processed = (KEYF|KEY5|KEY9);
stKey9.pressed = 1;
stKey9.released = 0;
stKeyFn.pressed = 1;
stKeyFn.released = 0;
stKey5.pressed = 1;
stKey5.released = 0;
EnOrDisTwoDimCode(&data);
num_key_input = 0;
LCD_Erase();
break;
case (KEY1):
FUN_KEYPRESS(1,KEY1,stKey1,Play_KeyVoiceOne());
break;
case (KEY2):
FUN_KEYPRESS(2,KEY2,stKey2,Play_KeyVoiceTwo());
break;
case (KEY3):
FUN_KEYPRESS(3,KEY3,stKey3,Play_KeyVoiceThree());
break;
case (KEY4):
FUN_KEYPRESS(4,KEY4,stKey4,Play_KeyVoiceFour());
break;
case (KEY5):
FUN_KEYPRESS(5,KEY5,stKey5,Play_KeyVoiceFive());
break;
case (KEY6):
FUN_KEYPRESS(6,KEY6,stKey6,Play_KeyVoiceSix());
break;
case (KEY7):
FUN_KEYPRESS(7,KEY7,stKey7,Play_KeyVoiceSeven());
break;
case (KEY8):
FUN_KEYPRESS(8,KEY8,stKey8,Play_KeyVoiceEight());
break;
case (KEY9):
FUN_KEYPRESS(9,KEY9,stKey9,Play_KeyVoiceNine());
break;
case (KEY0):
FUN_KEYPRESS(0,KEY0,stKey0,Play_KeyVoiceZero());
break;
case (KEYF):
FUN_KEYPRESS(10,KEYF,stKeyFn,Play_KeyVoiceMinus());
break;
case (KEYC):
if(!stKeyC.pressed)
{
key_processed = KEYC;
stKeyC.pressed = 1;
stKeyC.released = 0;
LCD_Erase();
if(num_key_input>0)
{
num_key_input = 0;
Play_KeyVoiceClean();
CleanPlayList();
}
}
break;
case (KEYD):
case (KEYDA):
case (KEYDB):
if((!stKeyDA.pressed)&&(!stKeyDB.pressed))
{
stKeyDA.hold_count = 0;
} else {
stKeyDA.hold_count++;
if(stKeyDA.hold_count==KEY_HOLDCOUNT)stKeyDA.hold_count = 0;
}
key_processed = KEYD;
stKeyDA.pressed = 1;
stKeyDB.pressed = 1;
stKeyDA.released = 0;
stKeyDB.released = 0;
if(stKeyDA.hold_count==0)
{
if(gConfgBuf.statusKey==OFF)break;
if(num_key_input>0)
{
num_key_input--;
LCD_Display(key_input,num_key_input);
Play_KeyVoiceDelete();
CleanPlayList();
}
}
break;
case (KEYV):
case (KEYVA):
case (KEYVB):
if((!stKeyVA.pressed)&&(!stKeyVB.pressed))
{
key_processed = KEYV;
stKeyVA.pressed = 1;
stKeyVB.pressed = 1;
stKeyVA.released = 0;
stKeyVB.released = 0;
if(gConfgBuf.statusKey==OFF)break;
if(num_key_input>0)
{
Key_SendData();
Play_KeyVoiceVerify();
CleanPlayList();
}
num_key_input = 0;
LCD_Erase();
}
break;
default:
key_processed = keyValue;
break;
}
keyValue_last = keyValue;
}
/**
* @function TIMER6_IRQHandler
* @brief 键盘定时中断
*/
void TIMER6_IRQHandler(void)
{
TIM_ClearITStatus(TIM6);
TIM_ITConfig(TIM6, DISABLE);
TIM_Cmd(TIM6,DISABLE);
Key_Action();
TIM_ITConfig(TIM6, ENABLE);
TIM_Cmd(TIM6,ENABLE);
}
/**
* @function Key_SendData
* @brief send data to computer
*/
void Key_SendData(void)
{
uint8_t i,j;
char dat[20];
j = 0;
for(i=0;i