398 lines
8.8 KiB
C
398 lines
8.8 KiB
C
/**
|
||
******************************************************************************
|
||
* @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.
|
||
*
|
||
* <h2><center>© COPYRIGHT 2016 TMC</center></h2>
|
||
******************************************************************************
|
||
**/
|
||
|
||
#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++<us);
|
||
}
|