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