TMC32_QJB/App/main.c

398 lines
8.8 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/**
******************************************************************************
* @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>&copy; 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; //标记是否有LicensegLicenseFlag = 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);
}