/** ****************************************************************************** * @file main.c * @author TMC Scan Team * @version V1.0.0 * @date 09/12/2019 * @brief ****************************************************************************** * * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE * TIME. AS A RESULT, TMC SHALL NOT BE HELD LIABLE FOR ANY * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. * *

© COPYRIGHT 2016 TMC

****************************************************************************** **/ #include "global.h" #include "Key.h" #include "LCD.h" void SysTickInit(void); void HardwareInit(void); void PowerOnShow(void); void AppScanCodeInit(void); void Delay_us(uint32_t us); extern void BctcTestAppScanCodeInit(void); extern void JJJ_Prompt(char *buf); extern void Voice_Play(void); extern uint8_t UpdateALCfg(void); extern void KeyVoiceInit(void); extern uint32_t gFunTrace; uint8_t gCfgUpdateFlag = 0; uint8_t gLicenseFlag = 1; //标记是否有License,gLicenseFlag = 0表明license有效 uint32_t HeartBeatTick = 0; uint32_t HeartBeatTime = 3; /** ** @function NVIC_SetVectorTable ** @brief 设置中断向量表的地址 ** @param NVIC_VectTab 中断向量表的地址 ** @param Offset 偏移地址 ** @return **/ void NVIC_SetVectorTable(u32 NVIC_VectTab, u32 Offset) { SCB->VTOR = NVIC_VectTab | (Offset & (u32)0x1FFFFF80); } /** ** @function CheckHeartBeat ** @brief check heart beat ** @return **/ void CheckHeartBeat(void) { if(gConfgBuf.heartbeatInterval>0) { if((TMC_GetTick()-HeartBeatTick)>HeartBeatTime) { HeartBeatTick = TMC_GetTick(); SetPackType(PACK_TYPEA); SetOutputData((uint8_t *)"HEARTBEAT",9); ReportData(Communication_Id); } } } /** ** @function main ** @brief 程序主函数,主要进行通信命令处理和扫码命令处理 ** @param ** @return **/ int main(void) { BarData comData, codeBar; uint8_t nCmdCount = 0; //读取应用配置 SystemCfgInit(); //根据配置区初始化使用的硬件模块 HardwareInit(); //恢复BL计时器 gReturnBLCnt = TMC_GetTick(); //开机提示(灯光或语音、蜂鸣器,可自行添加) PowerOnShow(); Key_Init(); KeyVoiceInit(); LCD_Init(); uint8_t d[11] = {1,1,1,1,1,1,1,1,1,1,1}; LCD_Display(d,11); TMC_Delay(500); LCD_Erase(); AppRefreshWDT(); TimerHSIClockCount(TIM4, START_TIMER);//开启扫码定时器,用于判断扫码时间间隔 gCmdStartFlag = TRUE; AppTIMxInterrupt(TIM6,2);//keyboard use // if(gConfgBuf.heartbeatInterval==0xff||gConfgBuf.heartbeatInterval==0)gConfgBuf.heartbeatInterval=3; // HeartBeatTime = gConfgBuf.heartbeatInterval*1000; // HeartBeatTick = TMC_GetTick(); // startShowDevicemod(); while(1) { Voice_Play(); if(gCfgUpdateFlag==UPDATECFG) { //在键盘处理中写FLASH有时会死机重启,所以要放到这里写FLASH UpdateCfg(); gCfgUpdateFlag = 0; } if(gCfgUpdateFlag==UPDATEALCFG) { //在键盘处理中写FLASH有时会死机重启,所以要放到这里写FLASH UpdateALCfg(); gCfgUpdateFlag = 0; } //通信接收命令,指令分发 nCmdCount = 0; // while(RecieveData(&comData)) // { // CommunicationCmdHandle(&comData); // Delay_us(1000); // nCmdCount++; // if(nCmdCount>100)break; // } //扫码成功,指令分发 if(ScanModeReceiveData(&codeBar) == TRUE) { if(SettingCodeBatch(&codeBar) == FALSE) { ScanCodeCmdHandle(&codeBar); } } // CheckHeartBeat(); gFunTrace = 38; #ifndef DEBUG //看门狗喂狗 AppRefreshWDT(); #endif } } /** ** @function PowerOnShow ** @brief 开机提示,包括灯光,提示音等 ** @param ** @return **/ void PowerOnShow(void) { //开机灯光 switch(gConfgBuf.scanCodeMode) { case AUTOMODE: AppLEDControl(gConfgBuf.ledStatus); break; case CMDMODE: AppLEDControl(!gConfgBuf.ledStatus); break; case CMDTIMEMODE: AppLEDControl(!gConfgBuf.ledStatus); break; case SENSORMODE: AppLEDControl(!gConfgBuf.ledStatus); break; default: AppLEDControl(gConfgBuf.ledStatus); break; } //开机提示音 if(gConfgBuf.buzzerStatus) { if((*(uint32_t *)RESETFLAGADDR) != RESET_FLAG) //上电复位时蜂鸣器提示音 { *(uint32_t *)RESETFLAGADDR = RESET_FLAG; BuzzerSelect(POWERON_BUZZER); } else { BuzzerSelect(SET_CODE_SUCEESS); } } SpeakerOn(); AppVoicePlay((uint8_t *)welcomeFile, sizeof(welcomeFile), gConfgBuf.voiceVolume); } /** ** @function HardwareInit ** @brief 硬件初始化,包括通讯接口,蜂鸣器,语音,led,摄像头,扫码配置等 ** @param 无 ** @return **/ void HardwareInit(void) { //中断向量表 copy to ram1 Memcpy((void *)RAM_BASE_ADDR, (void *)IR_VECTOR_TABLE_ADDR, IR_VECTOR_TABLE_SIZE); NVIC_SetVectorTable(RAM_BASE_ADDR, 0); //Systick初始化 SysTickInit(); //扫码配置初始化 AppScanCodeInit(); //串口初始化 AppUartInit(gConfgBuf.uartBaudRate, UART_PARITY_MODE_NONE); //USB初始化 gConfgBuf.comunitationType = USBDEVTYPE_HIDKBD; AppUSBInit(gConfgBuf.comunitationType); //蜂鸣器初始化 AppBuzzerInit(); //语音初始化 AppVoiceInit(); //LED初始化 AppLEDInit(); //摄像头初始化 AppCameraInit(); #ifndef DEBUG //看门狗初始化 AppWDTInit(); #endif //模式初始化 AppScanModeInit(); } /** ** @function AppScanCodeInit ** @brief 扫码算法初始化设置 ** @param 无 ** @return **/ void AppScanCodeInit(void) { uint8_t *pliscence = (uint8_t *) LINSCENCE; gLicenseFlag = TMC_Scan_Init(pliscence); #if BCTCTEST BctcTestAppScanCodeInit(); #else /*EAN_13设置*/ TMC_Scan_Set(EAN_13, gConfgBuf.EAN13); TMC_Scan_Set(EAN_13_2, gConfgBuf.EAN13_2); TMC_Scan_Set(EAN_13_5, gConfgBuf.EAN13_5); /*EAN_8设置*/ TMC_Scan_Set(EAN_8, gConfgBuf.EAN8); TMC_Scan_Set(EAN_8_2, gConfgBuf.EAN8_2); TMC_Scan_Set(EAN_8_5, gConfgBuf.EAN8_5); /*UPC_A设置*/ TMC_Scan_Set(UPC_A, gConfgBuf.UPCA); TMC_Scan_Set(UPC_A_2, gConfgBuf.UPCA_2); TMC_Scan_Set(UPC_A_5, gConfgBuf.UPCA_5); /*UPC_E0设置*/ TMC_Scan_Set(UPC_E0, gConfgBuf.UPCE0); /*UPC_E1设置*/ TMC_Scan_Set(UPC_E1, gConfgBuf.UPCE1); TMC_Scan_Set(UPC_E1_2, gConfgBuf.UPCE1_2); TMC_Scan_Set(UPC_E1_5, gConfgBuf.UPCE1_5); /*Code_128设置*/ TMC_Scan_Set(Code_128_Min, gConfgBuf.Code128MinLen); TMC_Scan_Set(Code_128_Max, gConfgBuf.Code128MaxLen); /*Code_39设置*/ TMC_Scan_Set(Code_39, gConfgBuf.Code39); TMC_Scan_Set(Code_39_32, gConfgBuf.Code39_32); TMC_Scan_Set(Code_39_Full_Ascii, gConfgBuf.Code39_32_Full_ASCII); TMC_Scan_Set(Code_39_Min, gConfgBuf.Code39MinLen); TMC_Scan_Set(Code_39_Max, gConfgBuf.Code39MaxLen); /*Code_93设置*/ TMC_Scan_Set(Code_93, gConfgBuf.Code93); TMC_Scan_Set(Code_93_Min, gConfgBuf.Code93MinLen); TMC_Scan_Set(Code_93_Max, gConfgBuf.Code93MaxLen); /*code bar设置*/ TMC_Scan_Set(Codebar, gConfgBuf.CodeBar); TMC_Scan_Set(Codabar_Min, gConfgBuf.CodeBarMinLen); TMC_Scan_Set(Codabar_Max, gConfgBuf.CodeBarMaxLen); /*ITF设置*/ TMC_Scan_Set(ITF, gConfgBuf.Interleaved25); TMC_Scan_Set(ITF_Min, gConfgBuf.Interleaved25MinLen); TMC_Scan_Set(ITF_Max, gConfgBuf.Interleaved25MaxLen); /*PDF417设置*/ TMC_Scan_Set(PDF_417, gConfgBuf.PDF417); /*DM设置*/ TMC_Scan_Set(DM_NOT_MIRROR, gConfgBuf.DM); TMC_Scan_Set(DM_MIRROR, gConfgBuf.DM); #if SETTINGCODE_MODE_0 TMC_Scan_Set(Code_128, gConfgBuf.Code128); #elif SETTINGCODE_MODE_1 /*QR设置*/ TMC_Scan_Set(QR_NOT_MIRROR, gConfgBuf.QR); TMC_Scan_Set(QR_MIRROR, gConfgBuf.QR ); #endif /*Industrial25设置*/ TMC_Scan_Set(Industrial25, gConfgBuf.Industrial_25); TMC_Scan_Set(Industrial_Min, gConfgBuf.Industrial_25MinLen); TMC_Scan_Set(Industrial_Max, gConfgBuf.Industrial_25MaxLen); /*Matrix25设置*/ TMC_Scan_Set(Matrix25, gConfgBuf.Matrix25); TMC_Scan_Set(Matrix25_Min, gConfgBuf.Matrix25MinLen); TMC_Scan_Set(Matrix25_Max, gConfgBuf.Matrix25MaxLen); /*IATA25设置*/ TMC_Scan_Set(IATA25, gConfgBuf.IATA25); TMC_Scan_Set(IATA25_Min, gConfgBuf.IATA25MinLen); TMC_Scan_Set(IATA25_Max, gConfgBuf.IATA25MaxLen); /*ECI模式设置*/ TMC_Scan_Set(ECI_Mode, gConfgBuf.ECIMode); #endif } //Systick初始化 void SysTickInit(void) { //Systick初始化 SysTick_Config(SystemCoreClock/1000); /* SysTick_IRQn interrupt clear pending */ NVIC_ClearPendingIRQ(SysTick_IRQn); /* SysTick_IRQn interrupt enable */ NVIC_EnableIRQ(SysTick_IRQn); /* Initialization clock */ TMC_InitTick(TICK_INT_PRIORITY); NVIC_SetPriority(SysTick_IRQn, TICK_INT_PRIORITY); } void assert_failed(uint8_t *file, uint32_t line) { //while(1); ResetChip(11); } /** * @function JJJ_Prompt * @brief send to computer for display */ void JJJ_Prompt(char *buf) { uint16_t len = strlen(buf); SetOutputData((uint8_t *)buf, len); ReportData(Communication_Id); } /** * @function Delay_us * @brief delay micro seconds */ void Delay_us(uint32_t us) { int n=0; us = us*10; while(n++