/** ****************************************************************************** * @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