T168_111\appl\Parser\Tspl:第16~23

Tspl.c   

/******************************************************************************
 *                                                                            *
 *                         M O D U L E   D E F I N E                          *
 *                                                                            *
 ******************************************************************************/

#define TSPL_C

/******************************************************************************
 *                                                                            *
 *        C O M P I L E R   D E F I N E D   I N C L U D E   F I L E S         *
 *                                                                            *
 ******************************************************************************/

#include <ctype.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

/******************************************************************************
 *                                                                            *
 *            U S E R   D E F I N E D   I N C L U D E   F I L E S             *
 *                                                                            *
 ******************************************************************************/

#include "Common.h"
#include "XCore.h"
#include "XProFile.h"
#include "..\Parser.h"
#include "..\ParserUtil.h"
#include "VarMgr.h"
#include "expr.h"
#include "TsplCnt.h"
#include "TsplFunc.h"
#include "TsplUtil.h"
#include "Tspl.h"

/******************************************************************************
 *                                                                            *
 *                         L O C A L   D E F I N E S                          *
 *                                                                            *
 ******************************************************************************/

#if defined(TSPL)

#define REPLACE_NUMBER_MAX        10

/******************************************************************************
 *                                                                            *
 *                        L O C A L   T Y P E D E F S                         *
 *                                                                            *
 ******************************************************************************/

/******************************************************************************
 *                                                                            *
 *             L O C A L   F U N C T I O N   P R O T O T Y P E S              *
 *                                                                            *
 ******************************************************************************/

/******************************************************************************
 *                                                                            *
 *    L O C A L   I N I T I A L I Z E D   D A T A   D E F I N I T I O N S     *
 *                                                                            *
 ******************************************************************************/

/******************************************************************************
 *                                                                            *
 *    L O C A L   U N I T I A L I Z E D   D A T A   D E F I N I T I O N S     *
 *                                                                            *
 ******************************************************************************/

STATIC CHAR ReplaceCmdBuf[REPLACE_NUMBER_MAX][TOKEN_LEN];

/******************************************************************************
 *
 * Function:
 *        CheckEquation
 *
 * Description: 
 *        
 *
 * Input:
 *        None
 *
 * Output:
 *        None.
 *
 ******************************************************************************/
STATIC BOOL CheckEquation(CHAR *pToken)
{
    BYTE data;
    BYTE buff[STRING_LEN];
    INT s = 0;

    RemoveSpace();

    data = NextByte();
    if (data != '=')
    {
        BackByte(data);
        return FALSE;
    }

    data = NextByte();

    // get a line
    while (data != 0 && !CheckChar(data, "\r\n\x1a"))
    {
        buff[s++] = data;
        if (s >= sizeof(buff))
            return FALSE;
        data = NextByte();
    }
    BackByte(data);
    buff[s] = 0;

    if (SetEquation(EQU_EXPRESSION, (BYTE *)pToken, buff))
        return TRUE;
    return FALSE;
}

/******************************************************************************
 *
 * Function:
 *        InitialTsplFunc
 *
 * Description: 
 *        
 *
 * Input:
 *        None
 *
 * Output:
 *        None.
 *
 ******************************************************************************/
BOOL InitialTspl(VOID)
{
    CHAR key[128];
    FLOAT data;
    INT i, replace;

    InitialExp();
    InitialGlobalVar();        /* initial variable */
    BasClearHandle();
    ClearCounter();

    for (i = 0; i < 256; i++)
        TsplRemapChar[i] = (BYTE)i;

    SetCodePageCross(LANG_TSPL, &pPrintCfg->CodePage, TsplRemapChar);

    memset(&sBasicData, 0, sizeof(sBasicData));

    // file command file handle
    UseHandle_0 = _NULL;
    UseHandle_1 = _NULL;

    // maxi code mode default
    MaxiCodeMode = 2;

    // driver copy
    DriverCopy = 0;

    // for key print
    PrintSets = 1;
    PrintCopies = 1;

    replace = 0;
//sysprintf("TsplEntry--\n");
    // replace command
    for (i = 0; TsplEntry[i].keyword != _NULL; i++)
    {
        
        if (replace >= REPLACE_NUMBER_MAX)
            break;
        sprintf(key, "REPLACE %s \n", TsplEntry[i].keyword);
        if (GetProfileString(key, ReplaceCmdBuf[replace]))
            TsplEntry[i].keyword = ReplaceCmdBuf[replace++];
    }

    // replace SET command
    for (i = 0; SetEntry[i].keyword != _NULL; i++)
    {
        if (replace >= REPLACE_NUMBER_MAX)
            break;
        sprintf(key, "REPLACE SET %s", SetEntry[i].keyword);
        if (GetProfileString(key, ReplaceCmdBuf[replace]))
            SetEntry[i].keyword = ReplaceCmdBuf[replace++];
    }

    InputFilter = FALSE;
    if (GetProfileInt("MIDDLEAMERICA", &data))
        InputFilter = (BOOL)data;
    else if (GetProfileInt("INPUTFILTER", &data))
        InputFilter = (BOOL)data;

#if defined(TSPL_VER_1)
    CRLF_IsInputData = FALSE;
#else
    CRLF_IsInputData = TRUE;
#endif

    if (GetProfileInt("IS CRLF INPUT DATA", &data))
        CRLF_IsInputData = (BOOL)data;

    BasFileKey = 0;
    if (GetProfileInt("BASIC PROTECT", &data))
        BasFileKey = (INT)data;

    return TRUE;
}

/******************************************************************************
 *
 * Function:
 *        TscSyntaxParsing
 *
 * Description: 
 *        
 *
 * Input:
 *        None
 *
 * Output:
 *        None.
 *
 ******************************************************************************/     //pc下发打印开始会进来执行
/*这段代码实现了一个TSPL(TSC Printer Command Language)语法解析函数。函数的返回类型是BOOL
  函数首先定义了一个指针CmdEntry和两个字符数组abString和Data。然后调用ClearParserPool函数清空解析池。
这段代码实现了一个TSPL语法解析函数,它通过逐个解析输入的字节和标记字符串,并根据不同的情况执行相应的命令函数或运行Basic文件。
函数的返回值表示解析是否成功
*/
BOOL TscSyntaxParsing(VOID)         //<--VOID Parser(VOID)
{
    _CmdEntry *CmdEntry = FALSE;
    CHAR abString[TOKEN_LEN];
    CHAR Data;

    ClearParserPool();

    while (1)
    {
        Data = NextByte();                            //读取下一个字节给Data
        // check TSPL single command
        if (CmdEntry = CheckSingleCommand(Data, DriverEntry))         //检查是否是TSPL的单个命令,并将CmdEntry指向对应的命令入口结构体
        {
            
            if (CmdEntry->func() == _SUCCESS)                        //如果找到了单个命令并且成功执行了该命令的函数,则返回TRUE;否则跳出循环。
                return TRUE;
            break;
        }

        BackByte(Data);             //将Data字节退回。  

        if (iscntrl(Data))          //如果Data是控制字符,则跳出循环
            break;

        // get command token
        if (GetToken(abString, &Data, "\r\n\t =", sizeof(abString)) >= (sizeof(abString) - 1))    //获取命令的标记字符串(token),存储在abString中
            break;

        BackByte(Data);  //并将Data字节退回
//sysprintf("TsplEntry--22\n");   //pc打印进来循环几次(14)
        // check TSPL normal command
        if (CmdEntry = CheckStringCommand(abString, TsplEntry))         // 检查abString是否是TSPL的普通命令,并将CmdEntry指向对应的命令入口结构体
        {
            if (CmdEntry->func() == _SUCCESS)                            //8.如果找到了普通命令并且成功执行了该命令的函数,则返回TRUE;否则跳出循环。
                return TRUE;
            break;
        }

        // check TSPL basic Command
        if (CmdEntry = CheckStringCommand(abString, BasicEntry))      //9. 检查abString是否是TSPL的基本命令,并将CmdEntry指向对应的命令入口结构体。
        {
            if (CmdEntry->func() == _SUCCESS)                        //10.如果找到了基本命令并且成功执行了该命令的函数,则返回TRUE;否则跳出循环。
                return TRUE;
            break;
        }

        // check basic label
        if (CheckBasLable(abString))              //11.检查abString是否是基本标签命令,如果是则返回TRUE。
            return TRUE;

        // check equation
        if (CheckEquation(abString))             //12.检查abString是否是等式,如果是则返回TRUE。
            return TRUE;

        if (sBasicData.UseHandle == _NULL)       //13.如果sBasicData.UseHandle为_NULL,则尝试运行一个Basic文件。
        {
            _FileList List;
            BOOL Find = FALSE;

            // Run Basic File
            if (strcmp(strchr(abString, '.'), ".BAS") != 0)      //14.首先将abString的扩展名改为".BAS"
                strcat(abString, ".BAS");

    // Find a file by name   //15.依次在DRAM_DEVICE、FLASH_DEVICE和CARD_DEVICE中查找文件,如果找到了文件,则设置sBasicData.UseHandle为对应的文件句柄,并执行RunFile函数运行Basic文件。
            OpenList(&List, DRAM_DEVICE);             
            if (NextFile(&List, abString))
                Find = TRUE;
            OpenList(&List, FLASH_DEVICE);
            if (NextFile(&List, abString))
                Find = TRUE;
            OpenList(&List, CARD_DEVICE);
            if (NextFile(&List, abString))
                Find = TRUE;

            while (Find == TRUE)
            {
                // for INPUT command
                RemoveLine();
                RemoveLF();

                if ((sBasicData.UseHandle = RunFile(DRAM_DEVICE,  abString, BasFileKey, BasClearHandle)) == _NULL)
                if ((sBasicData.UseHandle = RunFile(FLASH_DEVICE, abString, BasFileKey, BasClearHandle)) == _NULL)
                if ((sBasicData.UseHandle = RunFile(CARD_DEVICE,  abString, BasFileKey, BasClearHandle)) == _NULL)
                    break;

                BasInitialBASIC();            //16.在运行Basic文件之后,调用BasInitialBASIC函数进行初始化,并返回TRUE
                return TRUE;
            }
        }

        break;                                //17.跳出循环。
    }

    if (!BackParsePool())                     //18.如果无法退回解析池,则返回TRUE。
        return TRUE;

    return FALSE;
}

/******************************************************************************
 *
 * Function:
 *        RunBasicFile
 *
 * Description: 
 *        
 *
 * Input:
 *        None
 *
 * Output:
 *        None.
 *
 ******************************************************************************/
BOOL RunBasicFile(_eFileDevice device, CHAR *filename)
{
    if (sBasicData.UseHandle)
        return FALSE;
    UserDataIn(NUL_CHAR);
    sBasicData.UseHandle = RunFile(device, filename, BasFileKey, BasClearHandle);
    if (sBasicData.UseHandle != _NULL)
        BasInitialBASIC();
    return TRUE;
}

/******************************************************************************
 *
 * Function:
 *        CheckAutoBas
 *
 * Description: 
 *        
 *
 * Input:
 *        None
 *
 * Output:
 *        None.
 *
 ******************************************************************************/
VOID CheckAutoBas(VOID)
{
    if ((sBasicData.UseHandle = RunFile(DRAM_DEVICE,  (CHAR *)pPrintCfg->AutoRun, BasFileKey, BasClearHandle)) == _NULL)
    if ((sBasicData.UseHandle = RunFile(CARD_DEVICE,  (CHAR *)pPrintCfg->AutoRun, BasFileKey, BasClearHandle)) == _NULL)
    if ((sBasicData.UseHandle = RunFile(FLASH_DEVICE, (CHAR *)pPrintCfg->AutoRun, BasFileKey, BasClearHandle)) == _NULL)
        return;

    BasInitialBASIC();
}

/******************************************************************************
 *
 * Function:
 *        TsplPrintFunc
 *
 * Description: 
 *        
 *
 * Input:
 *        None
 *
 * Output:
 *        None.
 *
 ******************************************************************************/
VOID TsplPrintFunc(INT Quantity)
{
    if (Quantity)
        PrintImageLabel(Quantity, 1);
    else
        PrintImageLabel(PrintSets, PrintCopies);
//    sysprintf("PIL_2\n");
}

#endif

Tspl.h   //

#ifndef TSPL_H

/******************************************************************************
 *                                                                            *
 *                         M O D U L E   D E F I N E                          *
 *                                                                            *
 ******************************************************************************/

#define TSPL_H

/******************************************************************************
 *                                                                            *
 *        C O M P I L E R   D E F I N E D   I N C L U D E   F I L E S         *
 *                                                                            *
 ******************************************************************************/

/******************************************************************************
 *                                                                            *
 *            U S E R   D E F I N E D   I N C L U D E   F I L E S             *
 *                                                                            *
 ******************************************************************************/

#include "XFileSys.h"

#ifdef __cplusplus
extern "C" {            /* Assume C declarations for C++ */
#endif    /* __cplusplus */

/******************************************************************************
 *                                                                            *
 *                        G L O B A L   D E F I N E S                         *
 *                                                                            *
 ******************************************************************************/

/******************************************************************************
 *                                                                            *
 *                 S T R U C T U R E   D E F I N I T I O N S                  *
 *                                                                            *
 ******************************************************************************/

/******************************************************************************
 *                                                                            *
 *    G L O B A L   V A R I A B L E S   -   N O   I N I T I A L I Z E R S     *
 *                                                                            *
 ******************************************************************************/

#ifdef TSPL_C
#define EXTERN 
#else
#define EXTERN extern
#endif

/******************************************************************************
 *                                                                            *
 *       G L O B A L   V A R I A B L E S   -   I N I T I A L I Z E R S        *
 *                                                                            *
 ******************************************************************************/

/******************************************************************************
 *                                                                            *
 *                   F U N C T I O N   P R O T O T Y P E S                    *
 *                                                                            *
 ******************************************************************************/

BOOL InitialTspl(VOID);
BOOL TscSyntaxParsing(VOID);
BOOL RunBasicFile(_eFileDevice, CHAR *);
VOID CheckAutoBas(VOID);
VOID TsplPrintFunc(INT);

#undef EXTERN

#ifdef __cplusplus
}                       /* End of extern "C" { */
#endif    /* __cplusplus */

#endif


 

TsplBtFunc.c   


#include "Common.h"

#if defined(UART2_BT)

#if  !defined(UART2_BUFFER)
#error "Please open the UART2_BUFFER macros"
#endif


#include "XBt.h"
#include "XCore.h"
#include "XComm.h"
#include "XUart.h"
#include "string.h"
#include "XVarBank.h"
#include "XTask.h"
#include "XTimer.h"

#include "..\ParserUtil.h"
#include "TsplUtil.h"

#define BT_COMMAND_START1       '\n'
#define BT_COMMAND_START2       '\r'
#define BT_COMMAND_END1       '\r'
#define BT_COMMAND_END2      '\n'

#define BT_COMMAND_RESET               "AT+REBOOT\r\n"
#define BT_RETURN_RESET                "OK"
#define BT_COMMAND_NAME               "AT+NAME\r\n"
#define BT_RETURN_NAME                "+NAME="
#define BT_COMMAND_PIN                 "AT+PIN\r\n"
#define BT_RETURN_PIN                  "+PIN="
#define BT_COMMAND_MAC              "AT+ADDR\r\n"
#define BT_RETURN_MAC                  "+ADDR="
#define BT_COMMAND_VERSIONS          "AT+VER\r\n"
#define BT_RETURN_VERSIONS             "+VER="
#define BT_COMMAND_MODE_1              "AT+SFM=1\r\n"
#define BT_COMMAND_MODE_0              "AT+SFM=0\r\n"
#define BT_RETURN_MODE                 "OK"

#define BT_COMMAND_SET_NAME            "AT+NAME="
#define BT_COMMAND_SET_PIN             "AT+PIN="

STATIC VOID BtComSend(BYTE *msg, INT len);
STATIC VOID BtInterCommandMode(VOID);
STATIC VOID BtExitCommandMode(VOID);
STATIC INT BtComReceive(BYTE *msg);
STATIC BOOL _BtGetMsg(BYTE * buffer,BYTE * com,BYTE * callback);


_BtSetting *BtSetting;
Uart2CallbackFunctionType CallbackFunction = {Uart2ButterReceiveISR,Uart2ButterTransmitISR};
Uart2CallbackFunctionType CallbackFunCom =  {Uart2RxDataIn,NULL};

STATIC VOID BtInterCommandMode(VOID)
{
#if defined(AT91SAM9260)
    AT91F_PIO_CfgOutput(AT91C_BASE_PIOB, AT91C_PIO_PB15);
    AT91F_PIO_SetOutput(AT91C_BASE_PIOB, AT91C_PIO_PB15);
#elif defined(N3290)
    gpio_setportdir(GPIO_PORTB,BIT6,BIT6);
    gpio_setportval(GPIO_PORTB,BIT6,BIT6);

#endif
}
STATIC VOID BtExitCommandMode(VOID)
{
#if defined(AT91SAM9260)
    AT91F_PIO_CfgOutput(AT91C_BASE_PIOB, AT91C_PIO_PB15);
    AT91F_PIO_ClearOutput(AT91C_BASE_PIOB, AT91C_PIO_PB15);
#elif defined(N3290)
    gpio_setportdir(GPIO_PORTB,BIT6,BIT6);
    gpio_setportval(GPIO_PORTB,BIT6,0);

#endif
}

STATIC INT BtGetValue(BYTE * id,BYTE *msg,INT len)
{
        INT i,j = 0;
        INT start = 0,end = 0;

        for ( i = 0 ; i <  len; i++ )
        {
                if(msg[i] == '\r'||msg[i] == '\n')
                {
                        if(start&&(end == 0))
                                end = i;
                }
                else if ( id[j] == 0 )
                {
                        if(start == 0)
                                start = i;
                }
                else if(msg[i] == id[j])
                        j++;
        }
        if(end > start)
        {
                for ( i = start,j=0 ; i <end ; i++,j++ )
                        msg[j] = msg[i] ;
                msg[j] = 0;
                len = end-start;
        }
        else
                len = 0;
                
        return len;
}

STATIC BOOL CheckBtMacValue(BYTE *msg,INT len)
{
        INT i;
        
        if(len == 12)
        {
                if(memcmp(BtSetting->mac,msg,12) == 0)
                        return TRUE;
                for ( i = 0 ; i <12 ; i++ )
                {
                        if((msg[i]>='0'&&msg[i]<='9')||(msg[i]>='A'&&msg[i]<='F'))
                                ;
                        else
                              break;
                }
                if(i ==12)
                {
                        memcpy(BtSetting->mac, msg, 12);
                        return TRUE;
                }
        }
        return FALSE;
}

BOOL BtGetMsg(INT id,BYTE * buffer)
{
       BOOL reg = FALSE;

       switch ( id )
       {
           case 0 :
               reg = _BtGetMsg(buffer,BT_COMMAND_NAME,BT_RETURN_NAME);
               break;
           case 1 :
               reg = _BtGetMsg(buffer,BT_COMMAND_PIN,BT_RETURN_PIN);
               break;
           case 2 :
               reg = _BtGetMsg(buffer,BT_COMMAND_MAC,BT_RETURN_MAC);
               break;
           case 3 :
               reg = _BtGetMsg(buffer,BT_COMMAND_VERSIONS,BT_RETURN_VERSIONS);
               break;
           case 4 :
               reg = _BtGetMsg(buffer,BT_COMMAND_RESET,BT_RETURN_RESET);
               break;
           case 5 :
               reg = _BtGetMsg(buffer,BT_COMMAND_MODE_0,BT_RETURN_MODE);
               break;
           case 6 :
               reg = _BtGetMsg(buffer,BT_COMMAND_MODE_1,BT_RETURN_MODE);
               break;
            case 30 :
                 buffer[1] = '\0';
                 buffer[0] = '0';
                 if(BtSetting->enble)
                        buffer[0] = '1';
                 reg = TRUE;
                 break;
            case 31 :
                 strncpy((CHAR *)buffer,(CHAR *)BtSetting->name, BT_NAME_MAX_LEN);
                 reg = TRUE;
                 break;
            case 32 :
                 strncpy((CHAR *)buffer, (CHAR *)BtSetting->pin, BT_PIN_MAX_LEN);
                 reg = TRUE;
                 break;
            case 33 :
                 strncpy((CHAR *)buffer, BtSetting->mac, 12);
                 reg = TRUE;
                 break;
             case 34 :
                 strncpy((CHAR *)buffer, BtSetting->ver, BT_VER_MAX_LEN);
                 reg = TRUE;
                 break;
           default:
               break;
       }
       
       return reg;
}
STATIC BOOL _BtGetMsg(BYTE * buffer,BYTE * com,BYTE * callback)
{
        BYTE msg[32];
        INT len = 0;
        BOOL reg = FALSE;

        BtInterCommandMode();
        delay_msec(10);
        Uart2SetCallbackFun(CallbackFunCom);
        BtComSend(com,strlen((CHAR *)com));
        len = BtComReceive(msg);
        if(len)
        {
                if(BtGetValue(callback,msg,len))
                {
                        strncpy((CHAR *)buffer,(CHAR *)msg,len);
                        reg = TRUE;
                }
        }
        Uart2SetCallbackFun(CallbackFunction);
        BtExitCommandMode();
        return reg;
}

VOID BtComMode(BOOL mode,BOOL pin)
{
        if(mode)
                Uart2SetCallbackFun(CallbackFunCom);
        else
                Uart2SetCallbackFun(CallbackFunction);
        if(pin)
                BtInterCommandMode();
        else
                BtExitCommandMode();
}

BOOL BtSetName(BYTE * name)
{
        BYTE msg[32];
        INT len = 0;
        BOOL reg = FALSE;

        BtInterCommandMode();
        delay_msec(10);
        Uart2SetCallbackFun(CallbackFunCom);
        BtComSend(BT_COMMAND_SET_NAME,strlen(BT_COMMAND_SET_NAME));
        BtComSend(name,strlen((CHAR *)name));
        BtComSend("\r\n",2);
        len = BtComReceive(msg);
        if(len)
        {
                reg = TRUE;
                strncpy((CHAR *)BtSetting->name, (CHAR *)name,BT_NAME_MAX_LEN);
        }
        
        Uart2SetCallbackFun(CallbackFunction);
        BtExitCommandMode();
        return reg;
}

BOOL BtSetPin(BYTE * pin)
{
        BYTE msg[32];
        INT len = 0;
        BOOL reg = FALSE;

        BtInterCommandMode();
        delay_msec(10);
        Uart2SetCallbackFun(CallbackFunCom);
        BtComSend(BT_COMMAND_SET_PIN,strlen(BT_COMMAND_SET_PIN));
        BtComSend(pin,strlen((CHAR *)pin));
        BtComSend("\r\n",2);
        len = BtComReceive(msg);
        if(len)
        {
                reg = TRUE;
                strncpy((CHAR *)BtSetting->pin, (CHAR *)pin,BT_PIN_MAX_LEN);
        }
        Uart2SetCallbackFun(CallbackFunction);
        BtExitCommandMode();
        return reg;
}
STATIC TASK(CheckBtModule, arg)
{
    BYTE msg[32];
    INT len = 0;
    INT i = 0;
    INT count = 0;

#ifdef DEBUG_PRNT
sysprintf("Exec TASK(CheckBtModule, arg)()...\n"); // ch_20211209    
#endif

    BtInterCommandMode();
    delay_msec(200);
    while(count < 2)
    {
        BtComSend(BT_COMMAND_MAC,strlen(BT_COMMAND_MAC));
            len = BtComReceive(msg);
        if(len==0)
        {
            count++;
            delay_msec(100);
        }
        else
        {
            
            if(CheckBtMacValue(msg,BtGetValue(BT_RETURN_MAC,msg,len)))
            {
                //if(strlen((CHAR *)BtSetting->ver) == 0)
                {

                    while( BtComReceive(msg));
                    
                    delay_msec(100);
                    BtComSend(BT_COMMAND_VERSIONS,strlen(BT_COMMAND_VERSIONS));
                    len = BtComReceive(msg);

                    if(len != 0)
                    {
                        
                        for(i=0;i<len;i++)
                        {
                              if(msg[i]=='=')
                              {
                                    memcpy(BtSetting->ver,&msg[i+1],len-i-1);
                                    break;
                              }
                        }
                        if(i!=len)
                                break;
                    }
                }
            }
            count++;
            delay_msec(100);
        }
    }
    if(count < 2)
    {
        while( BtComReceive(msg));        
        BtComSend(BT_COMMAND_SET_NAME,strlen(BT_COMMAND_SET_NAME));        
        BtComSend(BtSetting->name,strlen((CHAR *)BtSetting->name));
        BtComSend("\r\n",2);
        len = BtComReceive(msg);
        
        while( BtComReceive(msg));
        BtComSend(BT_COMMAND_SET_PIN,strlen(BT_COMMAND_SET_PIN));
        BtComSend(BtSetting->pin,strlen((CHAR *)BtSetting->pin));
        BtComSend("\r\n",2);
        len = BtComReceive(msg);
        
        Uart2SetCallbackFun(CallbackFunction);
        SetBufferUart2Butter();
        BtSetting->enble = TRUE;
    }
    else
    {
            BtSetting->enble = FALSE ;
    }
    BtExitCommandMode();
        
    TaskExit();
}

VOID InitailBt(VOID)
{
        _PrintCfg *PrintCfg = GrabPrintConfig();

#ifdef DEBUG_PRNT
sysprintf("Enter InitailBt()...\n"); // ch_20211209
#endif
        
        BtSetting = &PrintCfg->BtSetting;
        InitialUart2ButterDrv();
        TaskCreate(CheckBtModule, 0, TASK_BT_STACK);
}

STATIC INT FN_SetName(VOID)
{
        BYTE BtName[BT_NAME_MAX_LEN];
        
        if (!GetExpString(LINE_END, (CHAR *)&BtName, sizeof(BtName))){
            sysprintf("FN GetExpString error \r\n");
            return _ERROR;
        }
        if(!BtSetName(BtName)){
            sysprintf("FN BtSetName error \r\n");
            return _ERROR;
        }
        return _SUCCESS;
}

STATIC INT FN_SetPin(VOID)
{
        BYTE BtPin[BT_PIN_MAX_LEN];
        
        if (!GetExpString(LINE_END, (CHAR *)&BtPin, sizeof(BtPin)))
        return _ERROR;
        if(!BtSetPin(BtPin))
                return _ERROR;
        return _SUCCESS;

}

INT FN_BT(VOID)
{
    CHAR bTemp;
    _CmdEntry *CmdEntry;

    CONST STATIC _CmdEntry BTEntry[] =
    {
        {"NAME",    FN_SetName},
        {"PIN",        FN_SetPin},

        {(CHAR *)_NULL,        _NULL}
    };
    CHAR Token[ STRING_LEN ];
    INT CmdID;

    RemoveSpace();

    if (GetToken(Token, &bTemp, "\r\n\t ", sizeof(Token)) >= (sizeof(Token) - 1)){

        sysprintf("bt gettoken error\r\n");
        return _ERROR;
    }

    //BackByte(bTemp);

    // check TSPL normal command

    sysprintf("--->%s\r\n",Token);
    sysprintf("FN_BT BtSetting->enble %d\r\n",BtSetting->enble);

    if ((CmdEntry = CheckStringCommand(Token, BTEntry)) && BtSetting->enble)
    {
        if (CmdEntry->func() == _SUCCESS)
        {
            delay_msec(100);
            return _SUCCESS;
        }
        return _ERROR;
    }

    return _ERROR;
}

STATIC VOID BtComSend(BYTE *msg, INT len)
{
    Uart2Buffer(msg,len);
}
STATIC INT BtComReceive(BYTE *msg)
{
    BYTE *target = msg;
    INT delayNum,len = 0;
    BYTE data = 0,flag_states = 0;

    BYTE i;

    delayNum = SetDelayTime(200);

    while(!len)
    {
        // get start character
        while (!Uart2GetByte(&data))
        {
            if (!CheckDelayTimer(delayNum))
            {
                ClrDelayTime(delayNum);
                return 0;
            }
                        continue;
        }
        if ((data != BT_COMMAND_START1)&&(data != BT_COMMAND_START2))
        {
               if(flag_states!=1)
                    continue;
        }
        else
        {
                flag_states  = 1;
                continue;
        }
                
        *target++ = data;
        len ++;

        while(data != BT_COMMAND_END1&&data != BT_COMMAND_END2)
        {
            while (!Uart2GetByte(&data))
            {
                if (!CheckDelayTimer(delayNum))
                {
                    ClrDelayTime(delayNum);
                    return 0;
                }
            }
            *target++ = data;
            len ++;
        }
        
    }
    ClrDelayTime(delayNum);
    return (len);
}

#endif
 

TsplBtFunc.h    //

/******************************************************************************

                  版权所有 (C), 2005-2015, 芯呈科技有限公司

 ******************************************************************************
  文 件 名   : TsplBtFunc.h
  版 本 号   : 初稿
  作    者   : XINC_PRINTER
  生成日期   : 2016年1月13日
  最近修改   :
  功能描述   : TsplBtFunc.c 的头文件
  函数列表   :
  修改历史   :
  1.日    期   : 2016年1月13日
    作    者   : XINC_PRINTER
    修改内容   : 创建文件

******************************************************************************/
#ifndef __TSPLBTFUNC_H__
#define __TSPLBTFUNC_H__
/*----------------------------------------------*
 * 包含头文件                                   *
 *----------------------------------------------*/

/*----------------------------------------------*
 * 常量定义                                     *
 *----------------------------------------------*/

 /*----------------------------------------------*
 * 宏定义                                       *
 *----------------------------------------------*/
#define BT_NAME_MAX_LEN              20
#define BT_PIN_MAX_LEN                   10
#define BT_VER_MAX_LEN                   10
/*----------------------------------------------*
 * 外部变量说明                                 *
 *----------------------------------------------*/
typedef struct
{
      BYTE enble;
      BYTE name[BT_NAME_MAX_LEN+1];
      BYTE pin[BT_PIN_MAX_LEN+1];
      CHAR mac[12+1];
      CHAR ver[BT_VER_MAX_LEN+1];
}_BtSetting;
/*----------------------------------------------*
 * 外部函数原型说明                             *
 *----------------------------------------------*/

/*----------------------------------------------*
 * 内部函数原型说明                             *
 *----------------------------------------------*/

/*----------------------------------------------*
 * 全局变量                                     *
 *----------------------------------------------*/

/*----------------------------------------------*
 * 模块级变量                                   *
 *----------------------------------------------*/

#ifdef __cplusplus
#if __cplusplus
extern "C"{
#endif
#endif /* __cplusplus */

INT FN_BT(VOID);
VOID InitailBt(VOID);
BOOL BtSetName(BYTE * );
BOOL BtSetPin(BYTE * );
BOOL BtGetMsg(INT ,BYTE * );
VOID BtComMode(BOOL ,BOOL );
#ifdef __cplusplus
#if __cplusplus
}
#endif
#endif /* __cplusplus */


#endif /* __TSPLBTFUNC_H__ */
 

TsplCnt.c  /

/******************************************************************************
 *                                                                            *
 *                         M O D U L E   D E F I N E                          *
 *                                                                            *
 ******************************************************************************/

#define TSPLCNT_C

/******************************************************************************
 *                                                                            *
 *        C O M P I L E R   D E F I N E D   I N C L U D E   F I L E S         *
 *                                                                            *
 ******************************************************************************/

#include <ctype.h>
#include <string.h>

/******************************************************************************
 *                                                                            *
 *            U S E R   D E F I N E D   I N C L U D E   F I L E S             *
 *                                                                            *
 ******************************************************************************/

#include "Common.h"
#include "XText.h"
#include "XBarcode.h"
#include "XGraphic.h"
#include "XFunction.h"
#include "Expr.h"
#include "Error.h"
#include "VarMgr.h"
#include "TsplCnt.h"

extern UCHAR IsOnceCalDone(VOID); // ch_20220416
extern VOID RstOnceCaldoneFlg(VOID); // ch_20220416

/******************************************************************************
 *                                                                            *
 *                         L O C A L   D E F I N E S                          *
 *                                                                            *
 ******************************************************************************/

#if defined(TSPL)

#define NARROW_LEVEL                    6

/******************************************************************************
 *                                                                            *
 *                        L O C A L   T Y P E D E F S                         *
 *                                                                            *
 ******************************************************************************/

/******************************************************************************
 *                                                                            *
 *             L O C A L   F U N C T I O N   P R O T O T Y P E S              *
 *                                                                            *
 ******************************************************************************/

/******************************************************************************
 *                                                                            *
 *    L O C A L   I N I T I A L I Z E D   D A T A   D E F I N I T I O N S     *
 *                                                                            *
 ******************************************************************************/

/******************************************************************************
 *                                                                            *
 *    L O C A L   U N I T I A L I Z E D   D A T A   D E F I N I T I O N S     *
 *                                                                            *
 ******************************************************************************/


STATIC VOID EraseCntBox(_CounterLinkTable *pCntlink, _ImgBuf *pImgBuf)
{
    _BarAttr sBarAttr;

    sBarAttr.iType = DRAW_ERASE;
    sBarAttr.psImageBuffer = pImgBuf;
    sBarAttr.sCoord.iX = pCntlink->sEraseBox.iX;
    sBarAttr.sCoord.iY = pCntlink->sEraseBox.iY;
    sBarAttr.iWidth  = pCntlink->sEraseBox.iWidth;
    sBarAttr.iHeight = pCntlink->sEraseBox.iHeight;
    DrawBar(&sBarAttr);
}

STATIC VOID StoreTextBox(_CounterLinkTable *pLink, _TextAttr *pTextAttr)
{
    switch (pTextAttr->iDirection)
    {
        case 0:
            pLink->sEraseBox.iX = pTextAttr->sCoord.iX;
            pLink->sEraseBox.iY = pTextAttr->sCoord.iY;
            pLink->sEraseBox.iWidth  = pTextAttr->iRealWidth;
            pLink->sEraseBox.iHeight = pTextAttr->iRealHeight;
            break;
        case 90:
            pLink->sEraseBox.iX = pTextAttr->sCoord.iX - pTextAttr->iRealHeight;
            pLink->sEraseBox.iY = pTextAttr->sCoord.iY;
            pLink->sEraseBox.iWidth  = pTextAttr->iRealHeight;
            pLink->sEraseBox.iHeight = pTextAttr->iRealWidth;
            break;
        case 180:
            pLink->sEraseBox.iX = pTextAttr->sCoord.iX - pTextAttr->iRealWidth;
            pLink->sEraseBox.iY = pTextAttr->sCoord.iY - pTextAttr->iRealHeight;
            pLink->sEraseBox.iWidth  = pTextAttr->iRealWidth;
            pLink->sEraseBox.iHeight = pTextAttr->iRealHeight;
            break;
        case 270:
            pLink->sEraseBox.iX = pTextAttr->sCoord.iX ;
            pLink->sEraseBox.iY = pTextAttr->sCoord.iY - pTextAttr->iRealWidth;
            pLink->sEraseBox.iWidth  = pTextAttr->iRealHeight;
            pLink->sEraseBox.iHeight = pTextAttr->iRealWidth;
            break;
    }
    if (pLink->sEraseBox.iX < 0)
        pLink->sEraseBox.iX = 0;
    if (pLink->sEraseBox.iY < 0)
        pLink->sEraseBox.iY = 0;
}

STATIC VOID StoreBarcodeBox(_CounterLinkTable *pLink, _BarCodeAttr *pBarcodeAttr, _BarcodeTable *pBarcodeTable)
{
    INT Height, Width = 0, Shift;
    INT Data;

    // normal barcode
    if (pBarcodeTable->pEraseWidth == _NULL)
    {
        switch (pBarcodeAttr->iRotation)
        {
            case 0:
                pLink->sEraseBox.iX = pBarcodeAttr->sCoord.iX;
                pLink->sEraseBox.iY = pBarcodeAttr->sCoord.iY;
                pLink->sEraseBox.iWidth  = pBarcodeAttr->TotalWidth;
                pLink->sEraseBox.iHeight = pBarcodeAttr->TotalHeight;
                break;
            case 90:
                pLink->sEraseBox.iX = pBarcodeAttr->sCoord.iX - pBarcodeAttr->TotalHeight;
                pLink->sEraseBox.iY = pBarcodeAttr->sCoord.iY;
                pLink->sEraseBox.iWidth  = pBarcodeAttr->TotalHeight;
                pLink->sEraseBox.iHeight = pBarcodeAttr->TotalWidth;
                break;
            case 180:
                pLink->sEraseBox.iX = pBarcodeAttr->sCoord.iX - pBarcodeAttr->TotalWidth;
                pLink->sEraseBox.iY = pBarcodeAttr->sCoord.iY - pBarcodeAttr->TotalHeight;
                pLink->sEraseBox.iWidth  = pBarcodeAttr->TotalWidth;
                pLink->sEraseBox.iHeight = pBarcodeAttr->TotalHeight;
                break;
            case 270:
                pLink->sEraseBox.iX = pBarcodeAttr->sCoord.iX ;
                pLink->sEraseBox.iY = pBarcodeAttr->sCoord.iY - pBarcodeAttr->TotalWidth;
                pLink->sEraseBox.iWidth  = pBarcodeAttr->TotalHeight;
                pLink->sEraseBox.iHeight = pBarcodeAttr->TotalWidth;
                break;
        }
    }
    else
    {
        if (pBarcodeAttr->iHuman == 0)
        {
            Height = pBarcodeAttr->iHeight;
            Shift = 0;
        }
        else
        {
            Height = pBarcodeAttr->iHeight + ((pBarcodeAttr->iNarrow + 1) << 3);
            Shift = (pBarcodeAttr->iNarrow << 3);
        }

        Data = 0;
        if (pBarcodeAttr->iHuman)
            Data = 1;

        Width = pBarcodeTable->pEraseWidth[Data * NARROW_LEVEL + (pBarcodeAttr->iNarrow - 1)];

#if defined(TSPL_VER_1)
        Width += 16;
#endif

        if (pBarcodeTable->Shift)
        {
            switch (pBarcodeAttr->iRotation)
            {
                case 0:
                    pLink->sEraseBox.iX = pBarcodeAttr->sCoord.iX - Shift;
                    pLink->sEraseBox.iY = pBarcodeAttr->sCoord.iY;
                    pLink->sEraseBox.iWidth  = Width;
                    pLink->sEraseBox.iHeight = Height;
                    break;
                case 90:
                    pLink->sEraseBox.iX = pBarcodeAttr->sCoord.iX - Height;
                    pLink->sEraseBox.iY = pBarcodeAttr->sCoord.iY - Shift;
                    pLink->sEraseBox.iWidth  = Height;
                    pLink->sEraseBox.iHeight = Width;
                    break;
                case 180:
                    pLink->sEraseBox.iX = pBarcodeAttr->sCoord.iX - Width + Shift;
                    pLink->sEraseBox.iY = pBarcodeAttr->sCoord.iY - Height;
                    pLink->sEraseBox.iWidth  = Width;
                    pLink->sEraseBox.iHeight = Height;
                    break;
                case 270:
                    pLink->sEraseBox.iX = pBarcodeAttr->sCoord.iX;
                    pLink->sEraseBox.iY = pBarcodeAttr->sCoord.iY - Width + Shift;
                    pLink->sEraseBox.iWidth  = Height;
                    pLink->sEraseBox.iHeight = Width;
                    break;
            }
        }
        else 
        {
            switch (pBarcodeAttr->iRotation)
            {
                case 0:
                    pLink->sEraseBox.iX = pBarcodeAttr->sCoord.iX;
                    pLink->sEraseBox.iY = pBarcodeAttr->sCoord.iY;
                    pLink->sEraseBox.iWidth  = Width;
                    pLink->sEraseBox.iHeight = Height;
                    break;
                case 90:
                    pLink->sEraseBox.iX = pBarcodeAttr->sCoord.iX - Height;
                    pLink->sEraseBox.iY = pBarcodeAttr->sCoord.iY;
                    pLink->sEraseBox.iWidth  = Height;
                    pLink->sEraseBox.iHeight = Width;
                    break;
                case 180:
                    pLink->sEraseBox.iX = pBarcodeAttr->sCoord.iX - Width;
                    pLink->sEraseBox.iY = pBarcodeAttr->sCoord.iY - Height;
                    pLink->sEraseBox.iWidth  = Width;
                    pLink->sEraseBox.iHeight = Height;
                    break;
                case 270:
                    pLink->sEraseBox.iX = pBarcodeAttr->sCoord.iX;
                    pLink->sEraseBox.iY = pBarcodeAttr->sCoord.iY - Width;
                    pLink->sEraseBox.iWidth  = Height;
                    pLink->sEraseBox.iHeight = Width;
                    break;
            }
        }
    }
    if (pLink->sEraseBox.iX < 0)
        pLink->sEraseBox.iX = 0;
    if (pLink->sEraseBox.iY < 0)
        pLink->sEraseBox.iY = 0;
}

STATIC VOID Store2DBarcodeBox(_CounterLinkTable *pLink)
{
    _AztecAttr   *pAztecAttr   = &(pLink->Data.sAztecAttr);
    _DMatrixAttr *pDMatrixAttr = &(pLink->Data.sDMatrixAttr);
    _MaxiAttr    *pMaxiAttr    = &(pLink->Data.sMaxiAttr);
    _PDFAttr     *pPDFAttr     = &(pLink->Data.sPDFAttr);
    _QRCodeAttr  *pQRCodeAttr  = &(pLink->Data.sQRCodeAttr);
    _RSSAttr     *pRSSAttr     = &(pLink->Data.sRSSAttr);
    _MPDFAttr    *pMPDFAttr    = &(pLink->Data.sMPdfAttr);
    INT Rotate;

    switch (pLink->CountType)
    {
        case AZTEC_COUNT:
            pLink->sEraseBox.iX      = pAztecAttr->sCoord.iX;
            pLink->sEraseBox.iY      = pAztecAttr->sCoord.iY;
            pLink->sEraseBox.iWidth  = pAztecAttr->TotalWidth;
            pLink->sEraseBox.iHeight = pAztecAttr->TotalHeight;
            Rotate = pAztecAttr->Rotate;
            break;
        case DMATRIX_COUNT:
            pLink->sEraseBox.iX      = pDMatrixAttr->sCoord.iX;
            pLink->sEraseBox.iY      = pDMatrixAttr->sCoord.iY;
            pLink->sEraseBox.iWidth  = pDMatrixAttr->TotalWidth;
            pLink->sEraseBox.iHeight = pDMatrixAttr->TotalHeight;
            Rotate = pDMatrixAttr->Rotate;
            break;
        case MAXI_COUNT:
            pLink->sEraseBox.iX      = pMaxiAttr->sCoord.iX;
            pLink->sEraseBox.iY      = pMaxiAttr->sCoord.iY;
            pLink->sEraseBox.iWidth  = pMaxiAttr->TotalWidth;
            pLink->sEraseBox.iHeight = pMaxiAttr->TotalHeight;
            Rotate = 0;
            break;
        case PDF_COUNT:
            pLink->sEraseBox.iX      = pPDFAttr->sCoord.iX;
            pLink->sEraseBox.iY      = pPDFAttr->sCoord.iY;
            pLink->sEraseBox.iWidth  = pPDFAttr->iWLimit;
            pLink->sEraseBox.iHeight = pPDFAttr->iHLimit;
            Rotate = pPDFAttr->Rotate;
            break;
        case MPDF_COUNT:
            pLink->sEraseBox.iX      = pMPDFAttr->sCoord.iX;
            pLink->sEraseBox.iY      = pMPDFAttr->sCoord.iY;
            pLink->sEraseBox.iWidth  = pMPDFAttr->TotalWidth;
            pLink->sEraseBox.iHeight = pMPDFAttr->TotalHeight;
            Rotate = pMPDFAttr->Rotate;
            break;
        case QRCODE_COUNT:
            pLink->sEraseBox.iX      = pQRCodeAttr->sCoord.iX;
            pLink->sEraseBox.iY      = pQRCodeAttr->sCoord.iY;
            pLink->sEraseBox.iWidth  = pQRCodeAttr->TotalWidth;
            pLink->sEraseBox.iHeight = pQRCodeAttr->TotalHeight;
            Rotate = pQRCodeAttr->Rotate;
            break;
        case RSS_COUNT:
            pLink->sEraseBox.iX      = pRSSAttr->sCoord.iX;
            pLink->sEraseBox.iY      = pRSSAttr->sCoord.iY;
            pLink->sEraseBox.iWidth  = pRSSAttr->TotalWidth;
            pLink->sEraseBox.iHeight = pRSSAttr->TotalHeight;
            Rotate = pRSSAttr->Rotate;
            break;
    }

    if (Rotate == 90)
        pLink->sEraseBox.iX -= pLink->sEraseBox.iWidth;
    else if (Rotate == 180)
    {
        pLink->sEraseBox.iX -= pLink->sEraseBox.iWidth;
        pLink->sEraseBox.iY -= pLink->sEraseBox.iHeight;
    }
    else if (Rotate == 270)
        pLink->sEraseBox.iY -= pLink->sEraseBox.iHeight;

    if (pLink->sEraseBox.iX < 0)
        pLink->sEraseBox.iX = 0;
    if (pLink->sEraseBox.iY < 0)
        pLink->sEraseBox.iY = 0;
}

STATIC VOID DrawTextCnt(_CounterLinkTable *pCntlink)
{
    _TextAttr sTextAttr = pCntlink->Data.sTextAttr;
    BYTE *pToken = pCntlink->ExpData;

    expMain(&pToken);
    if (wErrorword != NO_ERROR || bExpKind != STRING_TYPE)
        return;

    sTextAttr.ExpLength = strlen((CHAR *)szRetStr);
    sTextAttr.pExp      = szRetStr;
    sTextAttr.pFont     = pCntlink->FontName;

    if (pCntlink->Justification == 2 || pCntlink->Justification == 3)
    {
        SHORT Adjust = 0;

        PreviewText(&sTextAttr);

        if (pCntlink->Justification == 2)    // align center
            Adjust = sTextAttr.iRealWidth >> 1;
        if (pCntlink->Justification == 3)    // align right
            Adjust = sTextAttr.iRealWidth;

        if (sTextAttr.iRotation == 0)
            sTextAttr.sCoord.iX -= Adjust;
        if (sTextAttr.iRotation == 90)
            sTextAttr.sCoord.iY -= Adjust;
        if (sTextAttr.iRotation == 180)
            sTextAttr.sCoord.iX += Adjust;
        if (sTextAttr.iRotation == 270)
            sTextAttr.sCoord.iY += Adjust;
    }

    OutText(&sTextAttr);
    StoreTextBox(pCntlink, &sTextAttr);
}

STATIC VOID DrawBarcodeCnt(_CounterLinkTable *pCntlink)
{
    _BarCodeAttr sBarcodeAttr = pCntlink->Data.sBarcodeAttr;
    BYTE *pToken = pCntlink->ExpData;

    expMain(&pToken);
    if (wErrorword != NO_ERROR || bExpKind != STRING_TYPE)
        return;

    sBarcodeAttr.pFont = pCntlink->FontName;
    sBarcodeAttr.pExp  = (BYTE *)szRetStr;

    if (pCntlink->Justification == 2 || pCntlink->Justification == 3)
    {
        SHORT Adjust = 0;

        pCntlink->psBarcodeTab->PreviewBarcode(&sBarcodeAttr);

        if (pCntlink->Justification == 2)    // align center
            Adjust = sBarcodeAttr.TotalWidth >> 1;
        if (pCntlink->Justification == 3)    // align right
            Adjust = sBarcodeAttr.TotalWidth;

        if (sBarcodeAttr.iRotation == 0)
            sBarcodeAttr.sCoord.iX -= Adjust;
        if (sBarcodeAttr.iRotation == 90)
            sBarcodeAttr.sCoord.iY -= Adjust;
        if (sBarcodeAttr.iRotation == 180)
            sBarcodeAttr.sCoord.iX += Adjust;
        if (sBarcodeAttr.iRotation == 270)
            sBarcodeAttr.sCoord.iY += Adjust;
    }

//#if defined(TSPL_VER_1)
    if (strlen((CHAR *)sBarcodeAttr.pExp))
//#endif
        pCntlink->psBarcodeTab->OutBarcode(&sBarcodeAttr);

    StoreBarcodeBox(pCntlink, &sBarcodeAttr, pCntlink->psBarcodeTab);
}

STATIC VOID Draw2DBarcodeCnt(_CounterLinkTable *pCntlink)
{
    _AztecAttr   *pAztecAttr   = &(pCntlink->Data.sAztecAttr);
    _DMatrixAttr *pDMatrixAttr = &(pCntlink->Data.sDMatrixAttr);
    _MaxiAttr    *pMaxiAttr    = &(pCntlink->Data.sMaxiAttr);
    _PDFAttr     *pPDFAttr     = &(pCntlink->Data.sPDFAttr);
    _QRCodeAttr  *pQRCodeAttr  = &(pCntlink->Data.sQRCodeAttr);
    _RSSAttr     *pRSSAttr     = &(pCntlink->Data.sRSSAttr);
    _MPDFAttr    *pMPDFAttr    = &(pCntlink->Data.sMPdfAttr);
    BYTE *pToken = pCntlink->ExpData;;

    // get Data
    expMain(&pToken);
    if (wErrorword != NO_ERROR || bExpKind != STRING_TYPE)
        return;

    switch (pCntlink->CountType)
    {
        case AZTEC_COUNT:
            pAztecAttr->ExpLen = strlen((CHAR *)szRetStr);
            pAztecAttr->pExp = (BYTE *)szRetStr;
            ImpAztec(pAztecAttr, TRUE);
            break;
        case DMATRIX_COUNT:
            pDMatrixAttr->ExpLen = strlen((CHAR *)szRetStr);
            pDMatrixAttr->pExp = (BYTE *)szRetStr;
            Dmatrix(pDMatrixAttr);
            break;
        case MAXI_COUNT:
            pMaxiAttr->ExpLen = strlen((CHAR *)szRetStr);
            pMaxiAttr->pExp = (BYTE *)szRetStr;
            Maxi(pMaxiAttr);
            break;
        case PDF_COUNT:
            pPDFAttr->ExpLen = strlen((CHAR *)szRetStr);
            pPDFAttr->pExp = (BYTE *)szRetStr;
            PDF(pPDFAttr);
            break;
        case MPDF_COUNT:
            pMPDFAttr->pExp = (BYTE *)szRetStr;
            pMPDFAttr->ExpLen = strlen((CHAR *)szRetStr);
            MPDF(pMPDFAttr,FALSE);
            break;
        case QRCODE_COUNT:
            pQRCodeAttr->ExpLen = strlen((CHAR *)szRetStr);
            pQRCodeAttr->pExp = (BYTE *)szRetStr;
            QRCode(pQRCodeAttr);
            break;
        case RSS_COUNT:
            pRSSAttr->ExpLen = strlen((CHAR *)szRetStr);
            pRSSAttr->pExp = (BYTE *)szRetStr;
            RSS(pRSSAttr);
            break;
        default:
            return;
    }
    Store2DBarcodeBox(pCntlink);
}

STATIC VOID CounterAdd(BYTE *pData, INT Step)
{
    BYTE *pString;
    INT Length;
    INT i;

    if (Step == 0)
        return;
    
    Length = strlen((CHAR *)pData);
    pString = pData + Length - 1;
    
    for (i = 0; i < Length; i++)
    {  
        if (isdigit(*pString))
          {
               *pString += Step % 10;
            if (*pString > '9')
            {
                   *pString -= 10;
                   Step = Step / 10 + 1;
            }
               else if (*pString < '0')
               {
                   *pString += 10;
                   Step = Step / 10 - 1;                       
               }
               else
                   Step /= 10;
        }
        else if (isupper(*pString))
        {
             *pString += Step % 26;
            if (*pString > 'Z')
            {
                *pString -= 26;
                Step = (Step - Step % 26) / 26 + 1;
            }                           
            else if (*pString < 'A')
            {
                *pString += 26;
                Step = Step / 26 - 1;                       
            }
             else
                 Step /= 26;
        }
        else if (islower(*pString))
        {
             *pString += Step % 26;
             if (*pString > 'z')
             {
                 *pString -= 26;
                 Step = (Step - Step % 26) / 26 + 1;
             }                           
               else if (*pString < 'a')
               {
                   *pString += 26;
                   Step = Step / 26 - 1;                       
               }
             else
                 Step /= 26;
        }
        else
            break;
        pString -= 1;                       
    }
}

STATIC VOID CounterStep(VOID)
{
    BYTE String[STRING_LEN];
    INT Num;

    for (Num = 0; GetCounterVariable(Num, String); Num++)
    {
        CounterAdd(String, GetCounterStep(Num));
        SetCounterVariable(Num, String);
    }
}

STATIC VOID RunCounter(VOID)
{
    INT CntNumber;

    CntNumber = 0;
    while (sCntLinkTbl[CntNumber].CountType != NO_COUNT)
    {
        ReloadWaitTime();
        EraseCntBox(&sCntLinkTbl[CntNumber], &sImageBuffer);
        switch (sCntLinkTbl[CntNumber].CountType)
        {
            case TEXT_COUNT:
                sCntLinkTbl[CntNumber].Data.sTextAttr.psImageBuffer = &sImageBuffer;
                DrawTextCnt(&sCntLinkTbl[CntNumber]);
                break;
            case BARCODE_COUNT:
                sCntLinkTbl[CntNumber].Data.sBarcodeAttr.psImageBuffer = &sImageBuffer;
                DrawBarcodeCnt(&sCntLinkTbl[CntNumber]);
                break;
            case AZTEC_COUNT:
                sCntLinkTbl[CntNumber].Data.sAztecAttr.psImageBuffer = &sImageBuffer;
                Draw2DBarcodeCnt(&sCntLinkTbl[CntNumber]);
                break;
            case DMATRIX_COUNT:
                sCntLinkTbl[CntNumber].Data.sDMatrixAttr.psImageBuffer = &sImageBuffer;
                Draw2DBarcodeCnt(&sCntLinkTbl[CntNumber]);
                break;
            case MAXI_COUNT:
                sCntLinkTbl[CntNumber].Data.sMaxiAttr.psImageBuffer = &sImageBuffer;
                Draw2DBarcodeCnt(&sCntLinkTbl[CntNumber]);
                break;
            case PDF_COUNT:
                sCntLinkTbl[CntNumber].Data.sPDFAttr.psImageBuffer = &sImageBuffer;
                Draw2DBarcodeCnt(&sCntLinkTbl[CntNumber]);
                break;
            case MPDF_COUNT:
                sCntLinkTbl[CntNumber].Data.sMPdfAttr.psImageBuffer = &sImageBuffer;
                Draw2DBarcodeCnt(&sCntLinkTbl[CntNumber]);
                break;
            case QRCODE_COUNT:
                sCntLinkTbl[CntNumber].Data.sQRCodeAttr.psImageBuffer = &sImageBuffer;
                Draw2DBarcodeCnt(&sCntLinkTbl[CntNumber]);
                break;
            case RSS_COUNT:
                sCntLinkTbl[CntNumber].Data.sRSSAttr.psImageBuffer = &sImageBuffer;
                Draw2DBarcodeCnt(&sCntLinkTbl[CntNumber]);
                break;
        }
        CntNumber += 1;
    }
    CounterStep();
}

VOID ClearCounter(VOID)
{
    INT i;

    // clear counter link table
    for (i = 0; i < COUNTER_TABLE_MAX; i++)
        sCntLinkTbl[i].CountType = NO_COUNT;
}
/
INT SearchFreeCntTbl(VOID) 
{
    INT i;
    /* */
    // search counter link table   搜索计数器链接表
    for (i = 0; i < COUNTER_TABLE_MAX; i++)
    {
        if (sCntLinkTbl[i].CountType == NO_COUNT)
            return i;
    }
    return COUNTER_TABLE_MAX;
}
//
/*这是一个名为PrintImageLabel的函数,它用于打印标签图片。

1 该函数接受两个参数:Count和Copy,均为LONG类型。其中,Count表示需要打印的标签数量,Copy表示需要打印的每个标签的份数。

2 首先定义了几个变量,包括_PrintCfg类型的TempCfg、_ImgBuf类型的TempImg、ULONG类型的BatchNo、LONG类型的DspTotal和DspBase,以及TotalCnt。

3 判断是否需要执行切刀分批打印操作。如果没有可用的计数器,则将Copy乘以Count,并将Count设置为1。然后,分别赋值给DspTotal和TotalCnt。

4 在循环中,首先根据当前的打印配置信息,决定是否需要启用切刀分批打印模式或者显示打印信息。如果存在可用的计数器,则调用RunCounter函数执行计数操作。

接下来,计算DspBase的值,并调用PrintBatch函数打印标签。如果打印成功,则更新标签里程数,并将sImageBuffer的内容存储到TempImg中。

最后,继续循环打印标签,直到打印的数量达到Count为止。如果打印失败,则退出循环。  */
//    // pc下发打印进来执行1次
VOID PrintImageLabel(LONG Count, LONG Copy)        //<--FN_PRINT(VOID)   
{
    _PrintCfg TempCfg;
    _ImgBuf TempImg;
    ULONG BatchNo = 0;
    LONG DspTotal, DspBase;
    LONG TotalCnt;

//sysprintf("C%d\n", Count); // ch_20220323    

    // cutter batch
    TempCfg = *pPrintCfg;

    // if don't have counter
    if (SearchFreeCntTbl() == 0)        //3  判断是否需要执行切刀分批打印操作
    {
        Copy *= Count;
        Count = 1;
    }

    DspTotal = Count * Copy;
    TotalCnt = Count;

    while (Count)           //Count表示需要打印的标签数量
    {
        // cutter batch  //切刀分批
        if (pPrintCfg->PrintOutMode == CUTTER_MODE && pPrintCfg->CutterPieces == 0)
        {
            if (Count == 1)    // last batch
            {
                TempCfg.PrintOutMode = CUTTER_MODE;
                TempCfg.CutterPieces = Copy;
            }
            else
                TempCfg.PrintOutMode = OFF_MODE;
        }

        if (pPrintCfg->PrintKey && pPrintCfg->PrintKeyCnt == 0)
        {
            if (Count == TotalCnt)    // first batch
            {
                TempCfg.PrintKey = TRUE;
                TempCfg.PrintKeyCnt = Copy;
            }
            else
                TempCfg.PrintKey = FALSE;
        }
        if (SearchFreeCntTbl() != 0)      //如果存在可用的计数器,则调用RunCounter函数执行计数操作
            RunCounter();
//sysprintf("PB_6\n");
        DspBase = Copy * (Count - 1);    
        //打印标签。如果打印成功,则更新标签里程数,并将sImageBuffer的内容存储到TempImg中
        BatchNo = PrintBatch(BatchNo, Copy, &TempCfg, &sImageBuffer, TRUE, 0, DspTotal, DspBase, _NULL);
        
        if (BatchNo == 0)
            break;

        Count--;
        pPrintRec->LabelMilage += Copy;       //更新标签里程数

        TempImg = sImageBuffer;
        while (!AllocImageBuffer(&sImageBuffer))
            NutSleep(10);

//sysprintf("ByteW = %d\tByteH = %d\n", sImageBuffer.iByteWidth, sImageBuffer.iHeight); // ch_20220308

        memcpy(sImageBuffer.pBuffer, TempImg.pBuffer, sImageBuffer.iByteWidth * sImageBuffer.iHeight);
    }
}
///
// ch_20220416
VOID PrintImageLabel4Special(LONG Count, LONG Copy)
{
    _PrintCfg TempCfg;
    _ImgBuf TempImg;
    ULONG BatchNo = 0;
    LONG DspTotal, DspBase;
    LONG TotalCnt;
_WorkJob *WorkJob; // ch_20220416    

//sysprintf("C%d\n", Count); // ch_20220323    
//sysprintf("PIL_3\n");
    // cutter batch
    TempCfg = *pPrintCfg;

    // if don't have counter
    if (SearchFreeCntTbl() == 0)
    {
        Copy *= Count;
        Count = 1;
    }

    DspTotal = Count * Copy;
    TotalCnt = Count;

    while (Count)
    {        
        // cutter batch
        if (pPrintCfg->PrintOutMode == CUTTER_MODE && pPrintCfg->CutterPieces == 0)
        {
            if (Count == 1)    // last batch
            {
                TempCfg.PrintOutMode = CUTTER_MODE;
                TempCfg.CutterPieces = Copy;
            }
            else
                TempCfg.PrintOutMode = OFF_MODE;
        }

        if (pPrintCfg->PrintKey && pPrintCfg->PrintKeyCnt == 0)
        {
            if (Count == TotalCnt)    // first batch
            {
                TempCfg.PrintKey = TRUE;
                TempCfg.PrintKeyCnt = Copy;
            }
            else
                TempCfg.PrintKey = FALSE;
        }
        if (SearchFreeCntTbl() != 0)
            RunCounter();
//        sysprintf("PB_5\n");
        DspBase = Copy * (Count - 1);
        
        BatchNo = PrintBatch(BatchNo, Copy, &TempCfg, NULL/*&sImageBuffer*/, TRUE, 0, DspTotal, DspBase, _NULL);
        
        if (BatchNo == 0)
            break;

        Count--;
        pPrintRec->LabelMilage += Copy;

        TempImg = sImageBuffer;
        while (!AllocImageBuffer(&sImageBuffer))
            NutSleep(10);

//sysprintf("ByteW = %d\tByteH = %d\n", sImageBuffer.iByteWidth, sImageBuffer.iHeight); // ch_20220308

        memcpy(sImageBuffer.pBuffer, TempImg.pBuffer, sImageBuffer.iByteWidth * sImageBuffer.iHeight);
    }
}

#endif

TsplCnt.h   //

#ifndef TSPLCNT_H

/******************************************************************************
 *                                                                            *
 *                         M O D U L E   D E F I N E                          *
 *                                                                            *
 ******************************************************************************/

#define TSPLCNT_H

/******************************************************************************
 *                                                                            *
 *        C O M P I L E R   D E F I N E D   I N C L U D E   F I L E S         *
 *                                                                            *
 ******************************************************************************/

/******************************************************************************
 *                                                                            *
 *            U S E R   D E F I N E D   I N C L U D E   F I L E S             *
 *                                                                            *
 ******************************************************************************/

#ifdef __cplusplus
extern "C" {            /* Assume C declarations for C++ */
#endif    /* __cplusplus */

/******************************************************************************
 *                                                                            *
 *                        G L O B A L   D E F I N E S                         *
 *                                                                            *
 ******************************************************************************/

#define COUNTER_TABLE_MAX                100

/******************************************************************************
 *                                                                            *
 *                 S T R U C T U R E   D E F I N I T I O N S                  *
 *                                                                            *
 ******************************************************************************/

typedef enum
{
    NO_COUNT,
    TEXT_COUNT,
    BARCODE_COUNT,
    AZTEC_COUNT,
    DMATRIX_COUNT,
    MAXI_COUNT,
    PDF_COUNT,
    QRCODE_COUNT,
    MPDF_COUNT,
    RSS_COUNT,
    RFID_COUNT,
}_eCounterType;

typedef struct
{
    _eCounterType        CountType;               
    _EraseBox            sEraseBox;
    _BarcodeTable        *psBarcodeTab;
    BYTE                FontName[FONT_NAME_MAX];
    BYTE                ExpData[EXPRESS_LEN];
    SHORT                Justification;
    union
    {
        _TextAttr        sTextAttr;
        _BarCodeAttr    sBarcodeAttr;
        _AztecAttr        sAztecAttr;
        _DMatrixAttr    sDMatrixAttr;
        _MaxiAttr        sMaxiAttr;
        _PDFAttr        sPDFAttr;
        _QRCodeAttr        sQRCodeAttr;
        _MPDFAttr        sMPdfAttr;
        _RSSAttr        sRSSAttr;
    }Data;
}_CounterLinkTable;    

/******************************************************************************
 *                                                                            *
 *    G L O B A L   V A R I A B L E S   -   N O   I N I T I A L I Z E R S     *
 *                                                                            *
 ******************************************************************************/

#ifdef TSPLCNT_C
#define EXTERN 
#else
#define EXTERN extern
#endif

//Counter Table
EXTERN _CounterLinkTable sCntLinkTbl[COUNTER_TABLE_MAX];

/******************************************************************************
 *                                                                            *
 *       G L O B A L   V A R I A B L E S   -   I N I T I A L I Z E R S        *
 *                                                                            *
 ******************************************************************************/

/******************************************************************************
 *                                                                            *
 *                   F U N C T I O N   P R O T O T Y P E S                    *
 *                                                                            *
 ******************************************************************************/

VOID ClearCounter(VOID);
INT SearchFreeCntTbl(VOID);
VOID PrintImageLabel(LONG, LONG);
VOID PrintImageLabel4Special(LONG Count, LONG Copy); // ch_20220416

#undef EXTERN

#ifdef __cplusplus
}                       /* End of extern "C" { */
#endif    /* __cplusplus */

#endif    

TsplFunc.c  //

/******************************************************************************
 *                                                                            *
 *                         M O D U L E   D E F I N E                          *
 *                                                                            *
 ******************************************************************************/

#define TSPLFUNC_C

/******************************************************************************
 *                                                                            *
 *        C O M P I L E R   D E F I N E D   I N C L U D E   F I L E S         *
 *                                                                            *
 ******************************************************************************/

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>

/******************************************************************************
 *                                                                            *
 *            U S E R   D E F I N E D   I N C L U D E   F I L E S             *
 *                                                                            *
 ******************************************************************************/

#include "Common.h"
#include "XCore.h"
#include "XLCD.h"
#include "XLED.h"
#include "XKey.h"
#include "XBuzzer.h"
#include "XPrtEng.h"
#include "XFlash.h"
#include "XRTC.h"
#include "XTimer.h"
#include "XFuseFlash.h"
#include "XText.h"
#include "XDisplay.h"
#include "XCodePage.h"
#include "XProfile.h"
#include "XFunction.h"
#include "XAppVer.h"
#include "..\Parser.h"
#include "..\ParserUtil.h"
#include "Expr.h"
#include "Error.h"
#include "VarMgr.h"
#include "TsplCnt.h"
#include "TsplUtil.h"
#include "TsplFunc.h"

/******************************************************************************
 *                                                                            *
 *                         L O C A L   D E F I N E S                          *
 *                                                                            *
 ******************************************************************************/

#if defined(TSPL)

/******************************************************************************
 *                                                                            *
 *                        L O C A L   T Y P E D E F S                         *
 *                                                                            *
 ******************************************************************************/

/******************************************************************************
 *                                                                            *
 *             L O C A L   F U N C T I O N   P R O T O T Y P E S              *
 *                                                                            *
 ******************************************************************************/

/******************************************************************************
 *                                                                            *
 *    L O C A L   I N I T I A L I Z E D   D A T A   D E F I N I T I O N S     *
 *                                                                            *
 ******************************************************************************/
//  <--TscSyntaxParsing(VOID)
_CmdEntry TsplEntry[] = 
{
    // image command
    {"CLS",                FN_CLS},
    {"BAR",                FN_BAR},
    {"CIRCLE",            FN_CIRCLE},
    {"DIAGONAL",        FN_DIAGONAL},
    {"ERASE",            FN_ERASE},
    {"REVERSE",            FN_REVERSE},
    {"BOX",                FN_BOX},
    {"BARCODE",            FN_BARCODE},
    {"TEXT",            FN_TEXT},
    {"BITMAP",            FN_BITMAP},
    {"PUTBMP",            FN_PUTBMP},
    {"PUTPCX",            FN_PUTPCX},
    {"AZTEC",            FN_AZTEC},
    {"DMATRIX",            FN_DMATRIX},
    {"MAXICODE",        FN_MAXI},
    {"PDF417",            FN_PDF},
    {"MPDF417",            FN_MPDF},
    {"QRCODE",            FN_QRCODE},
    {"RSS",                FN_RSS},

    // normal command
    {"SIZE",            FN_SIZE},
    {"GAP",                FN_GAP},
    {"BLINE",            FN_BLINE},
    {"SHIFT",            FN_SHIFT},
    {"SPEED",            FN_SPEED},
    {"FEED",            FN_FEED},
    {"BACKUP",            FN_BACKFEED},
    {"BACKFEED",        FN_BACKFEED},
    {"FORMFEED",        FN_FORMFEED},
    {"HOME",            FN_HOME},
    {"DENSITY",            FN_DENSITY},    //~{4rS!C\6HIhVC~}
    {"DIRECTION",        FN_DIRECTION},
    {"OFFSET",            FN_OFFSET},
    {"REFERENCE",        FN_REFERENCE},
    {"PRINT",            FN_PRINT},       //打印
    {"CUT",                FN_CUT},
    {"REM",                FN_REM},
    {"SET",                FN_SET},
    {"REDRAW",            FN_REDRAW},
    {"DOWNLOAD",        FN_DOWNLOAD},
    {"EOP",                FN_EOP},
    {"LOAD",            FN_LOAD},
    {"RUN",                FN_RUN},
    {"KILL",            FN_KILL},
    {"COUNTRY",            FN_COUNTRY},
    {"CODEPAGE",        FN_CODEPAGE},
    {"INPUT",            FN_INPUT},
    {"OUT",                FN_OUT},
    {"OUTR",            FN_OUTR},
    {"MOVE",            FN_MOVE},
    {"COPY",            FN_COPY},
    {"BEEP",            FN_BEEP},
    {"SOUND",            FN_SOUND},
    {"DISPLAY",            FN_DISPLAY},
    {"DELAY",            FN_DELAY},
    {"EOJ",                FN_EOJ},
    {"PREINPUT",        FN_INPUTPREFIX},
    {"POSTINPUT",        FN_INPUTSUFFIX},

    // proprietary command
    {"ST",                FN_ST},
    {"INPUTPREFIX",        FN_INPUTPREFIX},
    {"INPUTSUFFIX",        FN_INPUTSUFFIX},

    // file command
    {"OPEN",            FN_OPEN},
    {"CLOSE",            FN_CLOSE},
    {"SEEK",            FN_SEEK},
    {"READ",            FN_READ},
    {"WRITE",            FN_WRITE},

#if defined(DURALABEL)
    {"RFSET",            FN_RFSET},
    {"RFID",            FN_RFID},
#endif
#if defined(UART2_BT)
        {"BT",            FN_BT},
#endif
    {(CHAR *)_NULL,        _NULL}
};

/******************************************************************************
 *                                                                            *
 *    L O C A L   U N I T I A L I Z E D   D A T A   D E F I N I T I O N S     *
 *                                                                            *
 ******************************************************************************/

/******************************************************************************
 *
 * Function:
 *        FN_REM
 *
 * Description: 
 *        
 *
 * Input:
 *        None
 *
 * Output:
 *        None.
 *
 ******************************************************************************/
INT FN_REM(VOID)
{
#ifdef DEBUG_PRNT
sysprintf("FN_REM()...\n"); // ch_20220409
#endif    
      RemoveLine();
    return _SUCCESS;
}

/******************************************************************************
 *
 * Function:
 *        FN_SIZE
 *
 * Description: 
 *        
 *
 * Input:
 *        None
 *
 * Output:
 *        None.
 *
 ******************************************************************************/
INT FN_SIZE(VOID)
{
    DOUBLE dData;
    INT iWidth;
    FLOAT fHeight;
    WORD LabelSize;

#ifdef DEBUG_PRNT
sysprintf("FN_SIZE()...\n"); // ch_20220409
#endif        

    if (!GetExpSize(COMMA_END, &dData))
        return _ERROR;
    iWidth = dData;
    
    if (!GetExpSize(LINE_END, &dData))
        return _ERROR;
    fHeight = dData;

    iWidth = abs(iWidth);
    //iWidth %= TPH_WIDTH_DOT;
    
//    if (iWidth == 0 || iWidth > TPH_WIDTH_DOT) // ch_20220519
    if (iWidth == 0) // ch_20220519
        iWidth = TPH_WIDTH_DOT;

//    if (iWidth > TPH_WIDTH_DOT || iWidth <= 0)
//        return _ERROR;

    if ((WORD)fHeight > MAX_IMAGE_LENGTH || fHeight <= 0)
        return _ERROR;

    if (pPrintCfg->PaperWidth == iWidth && pPrintCfg->fPaperSize == fHeight)
        return _SUCCESS;

    pPrintCfg->PaperWidth = iWidth;
    pPrintCfg->fPaperSize = fHeight;

    LabelSize = (WORD)CalculateLabelSize(pPrintCfg);
    
    ReallocImageBuffer(&sImageBuffer, LabelSize);
    InitialCalibration();
    return _SUCCESS;
}

INT FN_GAP(VOID)
{
    DOUBLE dData;
    FLOAT fGapOffset;
    FLOAT fGapSize;
    WORD LabelSize;

#ifdef DEBUG_PRNT
sysprintf("FN_GAP()...\n"); // ch_20220409
#endif    

    if (!GetExpSize(COMMA_END, &dData))
        return _ERROR;
    fGapSize = dData;

    if (!GetExpSize(LINE_END, &dData))
        return _ERROR;
    fGapOffset = dData;

    if ((WORD)fGapSize > (WORD)(TPH_DPI * 5))
        return _ERROR;

    if ((WORD)fGapSize == 0)
    {
#if defined(DLP200) || defined(DLP300)
        if (pPrintCfg->SensorMode != CONTINUE_MODE_R)
            DetectContinuousIntenBm(pPrintCfg);
        pPrintCfg->SensorMode = CONTINUE_MODE_R;
#else
        if (pPrintCfg->SensorMode != CONTINUE_MODE_T)
            DetectContinuousInten(pPrintCfg);
        pPrintCfg->SensorMode = CONTINUE_MODE_T;
#endif
    }
    else
    {
//        pPrintCfg->SensorMode = GAP_MODE; // ch_20220409
        pPrintCfg->fGapSize = fGapSize;
        pPrintCfg->fGapOffset = fGapOffset;
    }
    LabelSize = (WORD)CalculateLabelSize(pPrintCfg);
    ReallocImageBuffer(&sImageBuffer, LabelSize);
    InitialCalibration();

#ifdef DEBUG_PRNT
sysprintf("FN_GAP()...\n"); // ch_20220409
#endif

    return _SUCCESS;
}

INT FN_BLINE(VOID)
{
    DOUBLE dData;
    FLOAT fBlineOffset;
    FLOAT fBlineSize;
    WORD LabelSize;

#ifdef DEBUG_PRNT
sysprintf("FN_BLINE()...\n"); // ch_20220409
#endif    

    if(ProfileLimit("NO BLINE MODE")==1)
            return _ERROR;

    if (!GetExpSize(COMMA_END, &dData))
        return _ERROR;
    fBlineSize = dData;

    if (!GetExpSize(LINE_END, &dData))
        return _ERROR;
    fBlineOffset = dData;

    if ((WORD)fBlineSize > (WORD)(TPH_DPI * 5))
        return _ERROR;

    if ((WORD)fBlineSize == 0)
    {
#if defined(ANALOG_MEDIA)
        if (pPrintCfg->SensorMode != CONTINUE_MODE_R)
            DetectContinuousIntenBm(pPrintCfg);
        pPrintCfg->SensorMode = CONTINUE_MODE_R;
#else
        if (pPrintCfg->SensorMode != CONTINUE_MODE_T)
            DetectContinuousInten(pPrintCfg);
        pPrintCfg->SensorMode = CONTINUE_MODE_T;
#endif
    }
    else
    {
//        pPrintCfg->SensorMode = BLINE_MODE; // ch_20220409
        pPrintCfg->fBlineSize = fBlineSize;
        pPrintCfg->fBlineOffset = fBlineOffset;
    }
    LabelSize = (WORD)CalculateLabelSize(pPrintCfg);
    ReallocImageBuffer(&sImageBuffer, LabelSize);
    InitialCalibration();
    return _SUCCESS;
}

/******************************************************************************
 *
 * TSPL Commands
 *        SHIFT
 *
 * Description:
 *
 * Syntax:
 *        SHIFT [x,]y
 *
 * Parameters:
 *        x = Horizontal coordinate, with "dot" as the unit.
 *        y = Vertical coordinate, with "dot" as the unit.
 *
 ******************************************************************************/
INT FN_SHIFT(VOID)
{
    SHORT Arg1, Arg2;
    DOUBLE dData;
    CHAR Data;

#ifdef DEBUG_PRNT
sysprintf("FN_SHIFT()...\n"); // ch_20220409
#endif    
sysprintf("FN_SHIFT()...\n"); 
    if (!GetExpNumber(BACK_WITHOUT_SPACE , &dData))
        return _ERROR;
    Arg1 = (SHORT)dData;

    Data = NextByte();
    if (CheckChar(Data, ",;"))
    {
        if (!GetExpNumber(LINE_END , &dData))
            return _ERROR;
        Arg2 = (SHORT)dData;

    pPrintCfg->ShiftDisX = Arg1;
        pPrintCfg->ShiftDisY = Arg2;
        return _SUCCESS;
    }
    else if (!CheckTokenEnd(LINE_END, Data))
        return _ERROR;

    pPrintCfg->ShiftDisY = Arg1;
    return _SUCCESS;
}

INT FN_SPEED(VOID)
{
    DOUBLE dData;
    CHAR Data;
//    BYTE Speed = 0; // ch_20220526

#ifdef DEBUG_PRNT
sysprintf("FN_SPEED()...\n"); // ch_20220315    
#endif

    RemoveSpace();
    Data = NextByte();
    BackByte(Data);

#if defined(B443) || defined(B443_300)
    if (!isdigit(Data) && (Data == 'H' || Data == 'L'))
    {
        CHAR Token[STRING_LEN];

        if (!GetExpToken(LINE_END, Token, sizeof(Token)))
            return _ERROR;

        if (strcmp(Token, "LOW") == 0 || strcmp(Token, "L") == 0)
            pPrintCfg->Speed = 1;
        else if (strcmp(Token, "HIGH") == 0 || strcmp(Token, "H") == 0)
            pPrintCfg->Speed = 2;
        else
            return _ERROR;
    }
    else
#endif
    {
        if (!GetExpNumber(LINE_END, &dData))
            return _ERROR;

        
        // ch_20220601 : restore
        // ch_20220526 : add
        pPrintCfg->Speed = (BYTE)SpeedRange((FLOAT)dData);
//        Speed = (BYTE)SpeedRange((FLOAT)dData);
//        if (Speed != pPrintCfg->Speed) {
//            pPrintCfg->Speed = Speed;
//
//            CalculateHeatTable();
//        }
        
        
//sysprintf("S_%d\n", pPrintCfg->Speed); // ch_20220525
    }

#ifdef DEBUG_PRNT
sysprintf("Leave FN_SPEED() with spd%d.\n", pPrintCfg->Speed); // ch_20220315
#endif

    return _SUCCESS;
}

INT FN_FEED(VOID)
{
    DOUBLE data;

#ifdef DEBUG_PRNT
sysprintf("FN_FEED()...\n"); // ch_20220409
#endif        

    if (!GetExpNumber(LINE_END, &data))
        return _ERROR;

    if (data < 0)
        return _ERROR;

    ResetHeadPosition();
    MotorMove((WORD)data, pPrintCfg, MOTOR_FORWARD, _NULL);
    return _SUCCESS;
}


INT FN_BACKFEED(VOID)
{
    DOUBLE data;

#ifdef DEBUG_PRNT
sysprintf("FN_BACKFEED()...\n"); // ch_20220409
#endif        

    if (!GetExpNumber(LINE_END, &data))
        return _ERROR;

    if (data < 0)
        return _ERROR;

    ResetHeadPosition();
    MotorMove((WORD)data, pPrintCfg, MOTOR_BACKWARD, _NULL);
    return _SUCCESS;
}

INT FN_FORMFEED(VOID)
{
#ifdef DEBUG_PRNT
sysprintf("FN_FORMFEED()...\n"); // ch_20220409
#endif

    FeedBatch(1, pPrintCfg, TRUE, _NULL);
    return _SUCCESS;
}

INT FN_HOME(VOID)
{
#ifdef DEBUG_PRNT
sysprintf("FN_HOME()...\n"); // ch_20220409
#endif

#if defined(TSPL_VER_2)
    FeedBatch(1, pPrintCfg, TRUE, _NULL);
#else
    PaperHome(pPrintCfg);
#endif
    return _SUCCESS;
}

INT FN_DENSITY(VOID)
{
    DOUBLE dData;
    FLOAT Density;

#ifdef DEBUG_PRNT
sysprintf("FN_DENSITY()...\n"); // ch_20220409
#endif    

    if (!GetExpNumber(LINE_END, &dData))
        return _ERROR;

    Density = (FLOAT)dData;
    if (Density < DensityMin || Density > DensityMax)
        return _ERROR;

    pPrintCfg->fDensity = Density;
    return _SUCCESS;
}

INT FN_DIRECTION(VOID)
{
    DOUBLE dData;
    BYTE bTemp;
    INT Direction;
    INT Mirror;

#ifdef DEBUG_PRNT
sysprintf("FN_DIRECTION()...\n"); // ch_20220409
#endif    

    if (!GetExpNumber(BACK_WITHOUT_SPACE, &dData))
        return _ERROR;
    Direction = (INT)dData;

    bTemp = NextByte();
    if (CheckChar(bTemp, ",;"))
    {
        if (!GetExpNumber(LINE_END, &dData))
            return _ERROR;
        Mirror = (INT)dData;
    }
    else
    {
        if (!CheckTokenEnd(LINE_END, bTemp))
            return _ERROR;
        Mirror = pPrintCfg->Mirror;
    }

    if (Direction < 0 || Direction > 1)
        return _ERROR;

    if (Mirror < 0 || Mirror > 1)
        return _ERROR;

    pPrintCfg->Direction = Direction;
    pPrintCfg->Mirror = Mirror;

    return _SUCCESS;
}

INT FN_OFFSET(VOID)
{
    DOUBLE dData;
    SHORT Offset;

#ifdef DEBUG_PRNT
sysprintf("FN_OFFSET()...\n"); // ch_20220409
#endif    

    if (!GetExpSize(LINE_END, &dData))
        return _ERROR;

    Offset = (SHORT)dData;

    if (abs(Offset) > (INT)TPH_DPI)
        return _ERROR;

    pPrintCfg->OffsetDis = Offset;
    return _SUCCESS;
}

INT FN_REFERENCE(VOID)
{
    DOUBLE dData;
    INT RefX, RefY;

#ifdef DEBUG_PRNT
sysprintf("FN_REFERENCE()...\n"); // ch_20220409
#endif    

    if (!GetExpNumber(COMMA_END, &dData))
        return _ERROR;
    RefX = dData;

    if (!GetExpNumber(LINE_END, &dData))
        return _ERROR;
    RefY = dData;

    if (RefX < 0 || RefY < 0)
        return _ERROR;

    pPrintCfg->ReferenceX = RefX;
    pPrintCfg->ReferenceY = RefY;
    return _SUCCESS;
}

/*  1 函数首先声明了一些局部变量,包括Sets、Copies用于存储设置和拷贝数量,dData用于存储从输入中获取的数值,Data用于存储读取的字符。

    2 通过GetExpNumber函数获取一个数值并赋值给dData,将其转换为整型并赋值给Sets。

    3 读取下一个字符并将其赋值给Data。如果Data是逗号或分号,则说明有指定拷贝数量,通过GetExpNumber函数获取一个数值并赋值给dData,将其转换为整型并赋值给Copies。
      否则,如果Data是行结束符,则将Copies设置为1。

    4 在某些条件下,将Sets和Copies取绝对值。
 
    5 如果DriverCopy大于0,则将Copies设置为DriverCopy的值,并将DriverCopy重置为0。

    6 将Sets和Copies分别赋值给全局变量PrintSets和PrintCopies。

    7 如果执行过一次计算(通过IsOnceCalDone函数判断),则重置一次计算完成标志并调用PrintImageLabel4Special函数打印特殊图像标签。

    8 最后,调用PrintImageLabel函数执行打印任务,传入Sets和Copies作为参数。

函数最后返回_SUCCESS表示成功执行打印任务。

*/
///   //pc下发打印时开始时进来执行1次
INT FN_PRINT(VOID)              //<--TsplEntry[]  
{
    LONG Sets, Copies;
    DOUBLE dData;
    CHAR Data;

#ifdef DEBUG_PRNT
sysprintf("FN_PRINT()...\n"); // ch_20220323
#endif

    if (!GetExpNumber(BACK_WITHOUT_SPACE, &dData))
        return _ERROR;
    Sets = dData;

    Data = NextByte();
    if (CheckChar(Data, ",;"))   //如果Data是逗号或分号,则说明有指定拷贝数量,
    {
        if (!GetExpNumber(LINE_END, &dData))
            return _ERROR;
        Copies = dData;
    }
    else
    {
        if (!CheckTokenEnd(LINE_END, Data))    //否则,如果Data是行结束符,则将Copies设置为1。
            return _ERROR;
        Copies = 1;
    }

#if defined(TSPL_VER_1)    
    Sets = abs(Sets);  
    Copies = abs(Copies);
#endif

    if (Sets < 1 || Copies < 1)
        return _ERROR;

    if (DriverCopy > 0)        //如果DriverCopy大于0,则将Copies设置为DriverCopy的值,并将DriverCopy重置为0。
    {
        Copies = DriverCopy;
        DriverCopy = 0;
    }

    // for print function      // 将Sets和Copies分别赋值给全局变量PrintSets和PrintCopies
    PrintSets = Sets;
    PrintCopies = Copies;

    //
    if (IsOnceCalDone()) {
        RstOnceCaldoneFlg();
//sysprintf("PIL_6\n");   //pc打印不进来
        PrintImageLabel4Special(1, 1);
    }
    //    

//sysprintf("\nPQ%d,%d\n", PrintSets, PrintCopies); // ch_20220323
sysprintf("PIL_5\n");
    PrintImageLabel(Sets, Copies);     //调用PrintImageLabel函数执行打印任务,传入Sets:打印标签数量和Copies:每个标签打印的份数作为参数

#ifdef DEBUG_PRNT
sysprintf("FN_PRINT().\n"); // ch_20220323
#endif

    return _SUCCESS;
}

INT FN_CUT(VOID)
{
    CutPaper();
    return _SUCCESS;
}

INT FN_SET(VOID)
{
    CHAR Token[STRING_LEN];
    INT CmdID;

#ifdef DEBUG_PRNT
sysprintf("FN_SET()...\n"); // ch_20211211
#endif

    RemoveSpace();

    if (!GetExpToken(SPACE_END, Token, sizeof(Token)))
        return _ERROR;

    for (CmdID = 0; SetEntry[CmdID].keyword != _NULL; CmdID++)
    {
        if (strcmp(SetEntry[CmdID].keyword, Token) ==  0)
            break;
    }

    if (SetEntry[CmdID].func == _NULL)
        return _ERROR;

#ifdef DEBUG_PRNT
sysprintf("SetEntry[%d].keyword = %s\n", CmdID, SetEntry[CmdID].keyword); // ch_20211211
#endif

    return (*SetEntry[CmdID].func)();
}

INT FN_REDRAW(VOID)
{
#if defined(DEFAULT_MCARD_MODEL)
    DOUBLE dData;
    USHORT FlashNo;
    ULONG FileLength;
    _FlashInfo *info;
    UCHAR FlashArea[2];
    ULONG addr;
    ULONG i;

#ifdef DEBUG_PRNT
sysprintf("FN_REDRAW()...\n"); // ch_20211211
#endif    

    // Get Flash NO.
    if (!GetExpNumber(COMMA_END, &dData))
        return _ERROR;
    FlashNo = dData;

    // Get File Length 
    if (!GetExpNumber(COMMA_END, &dData))
        return _ERROR;
    FileLength = dData;

    if (FlashNo < 1 || FlashNo > 4)
        return _ERROR;

    if (FileLength < 1 || FileLength > 0x100000)    // 1MB
        return _ERROR;

    addr = MEMORY_CARD_ADDR + (FlashNo - 1) * 0x100000;

    if ((info = GetFlashInfo(addr)) == _NULL)
        return _ERROR;

    // Erase memory card
    for (i = 0; i < info->Sector; i++)
    {
        SectorErase(info->Start[i], TRUE);

#if defined(MONO_LED)
        if (i & 0x1)
            ShowLED(HID_LED_IDLE, HID_LED_ON, HID_LED_IDLE);
        else
            ShowLED(HID_LED_IDLE, HID_LED_OFF, HID_LED_IDLE);
#elif defined(POLY_LED)
        if (i & 0x1)
            ShowLED(HID_LED_GREEN);
        else
            ShowLED(HID_LED_DARK);
#endif
    }

    // Write data to card
    for (i = 0; i < FileLength; i++)
    {
        FlashArea[i & 0x1] = NextByte();
        if (i & 0x1)
            WriteFlash(addr + i - 1, *(WORD *)FlashArea, TRUE);

#if defined(MONO_LED)
        if (i & 0x2000)
            ShowLED(HID_LED_IDLE, HID_LED_OFF, HID_LED_IDLE);
        else
            ShowLED(HID_LED_IDLE, HID_LED_ON, HID_LED_IDLE);
#elif defined(POLY_LED)
        if (i & 0x2000)
            ShowLED(HID_LED_DARK);
        else
            ShowLED(HID_LED_GREEN);
#endif
    }
    if (i & 0x1)
    {
        FlashArea[i&0x1] = 0xFF;
        WriteFlash(addr + i - 1, *(WORD *)FlashArea, TRUE);
    }

#if defined(MONO_LED)
    ShowLED(HID_LED_IDLE, HID_LED_ON, HID_LED_IDLE);
#elif defined(POLY_LED)
    ShowLED(HID_LED_GREEN);
#endif

#endif

    return _SUCCESS;
}

INT FN_DOWNLOAD(VOID)
{
    CHAR FileName[FILENAME_LENGTH];
    _eFileDevice Device;
    _FileHandle *Handle;
    DOUBLE Number;
    BOOL immed;
    SHORT len;
    BYTE data;
    CHAR buf[16];
    INT num, key;
    INT state;
    INT i;

#ifdef DEBUG_PRNT
sysprintf("FN_DOWNLOAD()...\n"); // ch_20211211
#endif        
    
    if (!GetFileDevice(&Device))
        return _ERROR;

    if (!GetExpString(BACK_WITHOUT_SPACE, FileName, sizeof(FileName)))
        return _ERROR;

    if (strchr(FileName, '*'))
        return _ERROR;

    num = key = 0;

    data = NextByte();
    if (CheckChar(data, ",;"))
    {
        if (!GetExpNumber(COMMA_END, &Number))
            return _ERROR;
        num = (INT)Number;
    }
    else if (!CheckTokenEnd(LINE_END, data))
        return _ERROR;

    // Download Basic File Protection (.BAX)
    if (strcmp(strchr(FileName, '.'), ".BAX") == 0)
    {
        strcpy(strchr(FileName, '.'), ".BAS");
        key = BasFileKey;
    }

#if defined(LCD_MODEL)
    SetDisplayStatus(DIS_DOWNLOADING);
#endif

#if defined(MONO_LED)
    StartPeriodFunc(FlashLED2);
#elif defined(POLY_LED)
    StartPeriodFunc(FlashGreenLED);
#endif

    immed = CtrlImmedCmd(FALSE);

    Remove(Device, FileName);
    Handle = Fopen(Device, FileName, "w");
    state = _NULL;

    if (num)
    {
        for (i = 0; i < num; i++)
        {
            data = NextByte();
            if (state != END_OF_FILE)
                state = Fputc((INT)data ^ key, Handle);
        }
    }
    else
    {
        while (1)
        {
            if (CompareKeyword(NextByte(), "EOP", buf, &len))
            {
                strcpy(buf, "EOP");
                len = 3;
                while (CheckChar((buf[len] = NextByte()), "\t "))
                {
                    if (len < sizeof(buf) - 1)
                        len += 1;
                }
                if (CheckChar(buf[len], "\r\n"))
                    break;
                len += 1;
            }

            for (i = 0; i < len; i++)
            {
                if (state != END_OF_FILE)
                    state = Fputc((INT)buf[i] ^ key, Handle);
            }
        }
    }
    Fclose(Handle);

    CtrlImmedCmd(immed);

    if (state == END_OF_FILE)
    {
        Remove(Device, FileName);
        MemoryFailed();
    }

#if defined(MONO_LED)
    CancelPeriodFunc(FlashLED2);
    ShowLED(HID_LED_IDLE, HID_LED_ON, HID_LED_IDLE);
#elif defined(POLY_LED)
    CancelPeriodFunc(FlashGreenLED);
    ShowLED(HID_LED_GREEN);
#endif

#if defined(LCD_MODEL)
    ClrDisplayStatus(DIS_DOWNLOADING);
#endif

    return _SUCCESS;
}

INT FN_EOP(VOID)
{
    return _SUCCESS;
}

INT FN_LOAD(VOID)
{
    _eFileDevice Device;
    _FileHandle *Handle;
    CHAR FileName[FILENAME_LENGTH];
    INT i;

#ifdef DEBUG_PRNT
sysprintf("FN_LOAD()...\n"); // ch_20211211
#endif    

    // Load file from DRAM & FLASH on borad or card
    if (!GetFileDevice(&Device))
        return _ERROR;

    if (!GetExpString(LINE_END, FileName, sizeof(FileName)))
        return _ERROR;

    if ((Handle = Fopen(Device, FileName, "r")) == _NULL)
        return _ERROR;

    while ((i = Fgetc(Handle)) != END_OF_FILE)
        SendChar((BYTE)i);

    Fclose(Handle);
    return _SUCCESS;
}

INT FN_RUN(VOID)
{
    CHAR FileName[FILENAME_LENGTH];
    CHAR Data;

#ifdef DEBUG_PRNT
sysprintf("FN_RUN()...\n"); // ch_20211211
#endif        

    if (sBasicData.UseHandle != _NULL)
        return _ERROR;

    RemoveSpace();

    Data = NextByte();
    BackByte(Data);

    if (Data != '"')
    {
        if (!GetExpToken(LINE_END, FileName, sizeof(FileName)))
            return _ERROR;
    }
    else if (!GetExpString(LINE_END, FileName, sizeof(FileName)))
        return _ERROR;

    // Run Basic File
    if (strcmp(strchr(FileName, '.'), ".BAS") != 0)
        strcat(FileName, ".BAS");

    RemoveLF();    // for INPUT command
    if ((sBasicData.UseHandle = RunFile(DRAM_DEVICE,  FileName, BasFileKey, BasClearHandle)) == _NULL)
    if ((sBasicData.UseHandle = RunFile(FLASH_DEVICE, FileName, BasFileKey, BasClearHandle)) == _NULL)
    if ((sBasicData.UseHandle = RunFile(CARD_DEVICE,  FileName, BasFileKey, BasClearHandle)) == _NULL)
        return _ERROR;

    BasInitialBASIC();
    return _SUCCESS;
}

INT FN_KILL(VOID)
{
    _eFileDevice Device;
    CHAR FileName[FILENAME_LENGTH];

#ifdef DEBUG_PRNT
sysprintf("FN_KILL()...\n"); // ch_20211211
#endif        

    // Delete file from DRAM & FLASH on borad or crad
    if (!GetFileDevice(&Device))
        return _ERROR;

    if (!GetExpString(LINE_END, FileName, sizeof(FileName)))
        return _ERROR;

    ErasingFile(Device, FileName);
    return _SUCCESS;
}

INT FN_COUNTRY(VOID)
{
    CHAR Token[STRING_LEN];

#ifdef DEBUG_PRNT
sysprintf("FN_COUNTRY()...\n"); // ch_20211211
#endif        

    if (!GetExpToken(LINE_END, Token, sizeof(Token)))
        return _ERROR;

    if (!SetCountry(Token))
        return _ERROR;

    return _SUCCESS;
}

INT FN_CODEPAGE(VOID)
{
    CHAR Token[STRING_LEN];

#ifdef DEBUG_PRNT
sysprintf("FN_CODEPAGE()...\n"); // ch_20211211
#endif    

    if (!GetExpToken(LINE_END, Token, sizeof(Token)))
        return _ERROR;

    if (!SetCodePage(Token))
        return _ERROR;

    return _SUCCESS;
}

INT FN_INPUT(VOID)
{
    CHAR Data;
    DOUBLE Number;
    WORD LimitLen = 0;
    BOOL PromptFlag = FALSE;
    CHAR Prompt[PROMPT_LEN];
    CHAR VarName[TOKEN_LEN];
    CHAR Filter[16];
    CHAR *HugeBuf;
    BYTE *pHuge, *pExp;
    INT VarType;
    INT FilterSet;
    INT State;
    INT i;

#ifdef DEBUG_PRNT
sysprintf("FN_INPUT()...\n"); // ch_20211211
#endif    

    RemoveSpace();
     Data = NextByte();
    BackByte(Data);

    // input prompt
    if (Data == '\"')
    {
        if (!GetExpString(COMMA_END, Prompt, sizeof(Prompt)))
            return _ERROR;
        PromptFlag = TRUE;
    }

    RemoveSpace();
     Data = NextByte();
    BackByte(Data);

    // get string limit length
    if (IsNumber(Data))
    {
        if (!GetExpNumber(COMMA_END, &Number))
            return _ERROR;
        LimitLen = (WORD)Number;
    }

    // get variable
    if (!GetExpToken(LINE_END, VarName, sizeof(VarName)))
        return _ERROR;

    if ((HugeBuf = malloc(HUGE_LEN)) == 0)
        return _ERROR;
    memset(HugeBuf, 0, HUGE_LEN);

    pExp = (BYTE *)VarName;
    expMain(&pExp);
    if (wErrorword == NO_ERROR)
    {
        VarType = bExpKind;
        strcpy(HugeBuf, (CHAR *)szRetStr);
    }
    else if (wErrorword == VARIABLE_NOT_DEFINED)
    {
        VarType = CheckVariableType((BYTE *)VarName);
        if (VarType != STRING_TYPE)
            strcpy(HugeBuf, "0");
    }
    else
    {
        free(HugeBuf);
        return _ERROR;
    }

    if (PromptFlag)
    {
        SendString("~#");            // KP-200 Command LCD first line
        SendString(Prompt);            // Prompt string
        SendString("~&");            // KP-200 Command LCD second line

        if (LimitLen != 0)            // Data length limit
        {
            SendChar(0x1B);
            SendChar((BYTE)LimitLen);
        }
        if (VarType != STRING_TYPE)    // Number type return 0x01
            SendChar(0x01);

        SendString(HugeBuf);
        SendString("\r\n");
    }

#if defined(PS2_MODEL) || defined(USB_HOST_MODEL)
    EntryInputKB(Prompt, HugeBuf, (VarType == STRING_TYPE) ? FALSE : TRUE, (INT)LimitLen);
#endif

    pHuge = (BYTE *)HugeBuf;

    if (InputFilter)
    {
        INT idx[4] = { 0,0,0,0 };
        INT set;

        // Multiple Input Filter
        FilterSet = (-1);
        while (FilterSet == (-1))
        {
            Data = DirectNextByte();
            for (set = 0; set < 4; set++)
            {
                if (pPrintCfg->InputSuffix[set][0] != '\0')
                {
                    if (pPrintCfg->InputPrefix[set][idx[set]] == '\0')
                        FilterSet = set;
                    if (Data != (CHAR)pPrintCfg->InputPrefix[set][idx[set]++])
                        idx[set] = 0;
                }
            }
        }
        if (Data == '\0')    // Replace NULL with space
            Data = ' ';
        *pHuge++ = Data;
    }
    else if (!CRLF_IsInputData)
    {
        // Ignore <CR> <LF>
        do    Data = DirectNextByte();
        while (Data == (CHAR)CR_CHAR || Data == (CHAR)LF_CHAR);
        *pHuge++ = Data;
    }

    i = 0;
    while (1)
    {
        if (InputFilter)
        {
            if (pPrintCfg->InputSuffix[FilterSet][i] == '\0')
                break;

            Data = DirectNextByte();
            if (Data == '\0')    // Replace NULL with space
                Data = ' ';

            Filter[i] = Data;
            if (Filter[i] == pPrintCfg->InputSuffix[FilterSet][i])
                i++;
            else
            {
                memcpy(pHuge, Filter, i + 1);
                pHuge += i + 1;
                i = 0;
            }
        }
        else
        {
            Data = DirectNextByte();
            if (Data == CR_CHAR)
                SetDirectIgnoreLF(TRUE);
            if (Data == CR_CHAR || Data == LF_CHAR)
                break;
            *pHuge++ = Data;
        }
    }
    *pHuge = '\0';

#if defined(PS2_MODEL) || defined(USB_HOST_MODEL)
    LeaveInputKB();
#endif

    // set data
    if (VarType == STRING_TYPE)
        State = SetEquation(EQU_STRING, (BYTE *)VarName, (BYTE *)HugeBuf);
    else
        State = SetEquation(EQU_EXPRESSION, (BYTE *)VarName, (BYTE *)HugeBuf);

    free(HugeBuf);
    return (State ? _SUCCESS : _ERROR);
}

INT FN_OUT(VOID)
{
    CHAR Token[STRING_LEN];
    CHAR Data;
    BYTE *pExp;
    INT n;

#ifdef DEBUG_PRNT
sysprintf("FN_OUT()...\n"); // ch_20211211
#endif    

    memset(Token, 0, sizeof(Token));

    while (1)
    {
        RemoveSpace();
        Data = NextByte();
        if (CheckTokenEnd(LINE_END, Data))
            break;

        if (!GetExpToken(BACK_WITH_SPACE, Token, sizeof(Token)))
            return _ERROR;

        pExp = (BYTE *)Token;
        expMain(&pExp);
        if (wErrorword != NO_ERROR)
            return _ERROR;

        RemoveSpace();
        Data = NextByte();
        if (CheckChar(Data, ",\r\n"))
            strcat((CHAR *)szRetStr, "\r\n");

        SendString((CHAR *)szRetStr);

        if (CheckChar(Data, "\r\n"))
            break;
    }

    return _SUCCESS;
}

INT FN_OUTR(VOID)
{
    CHAR Token[STRING_LEN];
    CHAR Data;
    BYTE *pExp;
    INT n;

#ifdef DEBUG_PRNT
sysprintf("FN_OUTR()...\n"); // ch_20211211
#endif    

    memset(Token, 0, sizeof(Token));

    while (1)
    {
        RemoveSpace();
        Data = NextByte();
        if (CheckTokenEnd(LINE_END, Data))
            break;

        if (!GetExpToken(BACK_WITH_SPACE, Token, sizeof(Token)))
            return _ERROR;

        pExp = (BYTE *)Token;
        expMain(&pExp);
        if (wErrorword != NO_ERROR)
            return _ERROR;

        RemoveSpace();
        Data = NextByte();
        if (CheckChar(Data, ",\r\n"))
            strcat((CHAR *)szRetStr, "\r\n");

        CommWrite(UART_PORT, szRetStr, strlen((CHAR *)szRetStr), 3000);

        if (CheckChar(Data, "\r\n"))
            break;
    }

    return _SUCCESS;
}

INT FN_MOVE(VOID)
{
    BOOL state;

#ifdef DEBUG_PRNT
sysprintf("FN_MOVE()...\n"); // ch_20211211
#endif    

#if defined(LCD_MODEL)
    SetDisplayStatus(DIS_DOWNLOADING);
#endif

#if defined(MONO_LED)
    StartPeriodFunc(FlashLED2);
#elif defined(POLY_LED)
    StartPeriodFunc(FlashGreenLED);
#endif

    state = CopyFile(DRAM_DEVICE, "*.*", FLASH_DEVICE, "*.*");

    if (!state)
        MemoryFailed();

#if defined(MONO_LED)
    CancelPeriodFunc(FlashLED2);
    ShowLED(HID_LED_IDLE, HID_LED_ON, HID_LED_IDLE);
#elif defined(POLY_LED)
    CancelPeriodFunc(FlashGreenLED);
    ShowLED(HID_LED_GREEN);
#endif

#if defined(LCD_MODEL)
    ClrDisplayStatus(DIS_DOWNLOADING);
#endif

    return _SUCCESS;
}

/******************************************************************************
 *
 * TSPL Commands
 *        COPY
 *
 * Description:
 *        Copies an existing file to a new file.
 *
 * Syntax:
 *        COPY [existdev,]"existname",[newdev,]"newname"
 *
 * Parameters:
 *        existdev  = device of an existing file.
 *        existname = name of an existing file.
 *        newdev    = device of the new file.
 *        newname   = name of the new file.
 *
 ******************************************************************************/
INT FN_COPY(VOID)
{
    CHAR existname[FILENAME_LENGTH], newname[FILENAME_LENGTH];
    _eFileDevice existdev, newdev;
    BOOL state;

#ifdef DEBUG_PRNT
sysprintf("FN_COPY()...\n"); // ch_20211211
#endif    

    if (!GetFileDevice(&existdev))
        return _ERROR;

    if (!GetExpString(COMMA_END, existname, sizeof(existname)))
        return _ERROR;

    if (!GetFileDevice(&newdev))
        return _ERROR;

    if (!GetExpString(LINE_END, newname, sizeof(newname)))
        return _ERROR;

    if (newdev == CARD_DEVICE && existdev != newdev)
        return _ERROR;

#if defined(LCD_MODEL)
    SetDisplayStatus(DIS_DOWNLOADING);
#endif

#if defined(MONO_LED)
    StartPeriodFunc(FlashLED2);
#elif defined(POLY_LED)
    StartPeriodFunc(FlashGreenLED);
#endif

    state = CopyFile(existdev, existname, newdev, newname);

    if (!state)
        MemoryFailed();

#if defined(MONO_LED)
    CancelPeriodFunc(FlashLED2);
    ShowLED(HID_LED_IDLE, HID_LED_ON, HID_LED_IDLE);
#elif defined(POLY_LED)
    CancelPeriodFunc(FlashGreenLED);
    ShowLED(HID_LED_GREEN);
#endif

#if defined(LCD_MODEL)
    ClrDisplayStatus(DIS_DOWNLOADING);
#endif

    return _SUCCESS;
}

INT FN_BEEP(VOID)
{
#ifdef DEBUG_PRNT
sysprintf("FN_BEEP()...\n"); // ch_20211211
#endif

    RemoveLine();
    // KP200 function
    UartChar(0x07);
    return _SUCCESS;
}

INT FN_SOUND(VOID)
{
    DOUBLE data;
    INT freq, time;

#ifdef DEBUG_PRNT
sysprintf("FN_SOUND()...\n"); // ch_20211211
#endif    

    // get first argument
    if (!GetExpNumber(COMMA_END, &data))
        return _ERROR;
    freq = (INT)data;

    if (!GetExpNumber(LINE_END, &data))
        return _ERROR;
    time = (INT)data;

    while (CheckBuzzerStatus()){}

    sysprintf("FN_SOUND\r\n");
    
    EnableBuzzer(freq, time);
    
    return _SUCCESS;
}

INT FN_DISPLAY(VOID)
{
    CHAR Token[STRING_LEN];

#ifdef DEBUG_PRNT
sysprintf("FN_DISPLAY()...\n"); // ch_20220418
#endif

    if (!GetExpToken(LINE_END, Token, sizeof(Token)))
        return _ERROR;

#if defined(LCD_MODEL)
    if (strcmp(Token, "IMAGE") == 0)
    {
#if defined(TDP225_PCB)
        UCHAR dspmem[(LCD_WIDTH + 7) / 8 * LCD_HEIGHT];
        UCHAR *imgsrc, *imgdst;
        INT height, width, widbyte, shift;

        height  = LCD_HEIGHT;
        width   = LCD_WIDTH + 7;
        widbyte = (LCD_WIDTH + 7) / 8;

        shift   = (8 - (XCoord(0) % 8)) % 8;
        imgsrc  = sImageBuffer.pBuffer + sImageBuffer.iWidth / 8 * YCoord(0) + XCoord(0) / 8;
        imgdst  = shift ? dspmem - 1 : dspmem;

        memset(dspmem, 0, sizeof(dspmem));
        NorOR(width, height, sImageBuffer.iByteWidth, widbyte, 0, shift, imgsrc, imgdst);
#else
        UCHAR imgmem[(LCD_HEIGHT + 7) / 8 * (LCD_WIDTH + 7)];
        UCHAR dspmem[(LCD_HEIGHT + 7) / 8 * LCD_WIDTH];
        UCHAR *image;
        INT height, width, widbyte, shift;
        INT pagemax, colmax, page, col;

        height  = LCD_WIDTH + 7;
        width   = LCD_HEIGHT;
        widbyte = (LCD_HEIGHT + 7) / 8;

        image   = sImageBuffer.pBuffer + sImageBuffer.iWidth / 8 * YCoord(0) + XCoord(0) / 8;
        shift   = XCoord(0) % 8;

        memset(imgmem, 0, sizeof(imgmem));
        RightOR(width, height, sImageBuffer.iByteWidth, widbyte, 0, 0, image, imgmem);

        pagemax = (LCD_HEIGHT + 7) / 8;
        colmax  = LCD_WIDTH;
        for (page = 0; page < pagemax; page++)
            for (col = 0; col < colmax; col++)
                dspmem[page * colmax + col] = imgmem[(col + shift) * pagemax + (pagemax - 1 - page)];
#endif
        SetDisplayImage(dspmem);
    }
    else if (strcmp(Token, "OFF") == 0)
        ClrDisplayStatus(DIS_IMAGE);
#endif

#ifdef DEBUG_PRNT
sysprintf("FN_DISPLAY...\n"); // ch_20220418
#endif

    return _SUCCESS;
}

INT FN_DELAY(VOID)
{
    DOUBLE time;

#ifdef DEBUG_PRNT
sysprintf("FN_DELAY()...\n"); // ch_20211211
#endif    

    if (!GetExpNumber(LINE_END, &time))
        return _ERROR;

    delay_msec((INT)time);
    return _SUCCESS;
}

INT FN_EOJ(VOID)
{
#ifdef DEBUG_PRNT
sysprintf("FN_EOJ()...\n"); // ch_20211211
#endif

    RemoveLine();
    WaitWorkJobEnd();
    return _SUCCESS;
}

INT FN_ST(VOID)
{
    CHAR Prefix[4][16], Suffix[4][16];

#ifdef DEBUG_PRNT
sysprintf("FN_ST()...\n"); // ch_20211211
#endif    

    memset(Prefix, 0, sizeof(Prefix));
    memset(Suffix, 0, sizeof(Suffix));

    if (!GetExpString(COMMA_END, Prefix[0], sizeof(Prefix[0])))
        return _ERROR;

    if (!GetExpString(LINE_END, Suffix[0], sizeof(Suffix[0])))
        return _ERROR;

    memcpy(pPrintCfg->InputPrefix, Prefix, sizeof(pPrintCfg->InputPrefix));
    memcpy(pPrintCfg->InputSuffix, Suffix, sizeof(pPrintCfg->InputSuffix));
    return _SUCCESS;
}

INT FN_INPUTPREFIX(VOID)
{
    CHAR prefix[4][16];
    CHAR data;
    INT set;

#ifdef DEBUG_PRNT
sysprintf("FN_INPUTPREFIX()...\n"); // ch_20211211
#endif    

    memset(prefix, 0, sizeof(prefix));

    for (set = 0; set < 4; set++)
    {
        if (GetExpString(BACK_WITHOUT_SPACE, prefix[set], sizeof(prefix[set])))
        {
            data = NextByte();
            if (CheckTokenEnd(LINE_END, data))
                break;

            data = NextByte();
            if (CheckTokenEnd(COMMA_END, data))
                continue;
        }
        return _ERROR;
    }
    if (set == 4)
        return _ERROR;

    memcpy(pPrintCfg->InputPrefix, prefix, sizeof(pPrintCfg->InputPrefix));
    return _SUCCESS;
}

INT FN_INPUTSUFFIX(VOID)
{
    CHAR suffix[4][16];
    CHAR data;
    INT set;

#ifdef DEBUG_PRNT
sysprintf("FN_INPUTSUFFIX()...\n"); // ch_20211211
#endif    

    memset(suffix, 0, sizeof(suffix));

    for (set = 0; set < 4; set++)
    {
        if (GetExpString(BACK_WITHOUT_SPACE, suffix[set], sizeof(suffix[set])))
        {
            data = NextByte();
            if (CheckTokenEnd(LINE_END, data))
                break;

            data = NextByte();
            if (CheckTokenEnd(COMMA_END, data))
                continue;
        }
        return _ERROR;
    }
    if (set == 4)
        return _ERROR;

    memcpy(pPrintCfg->InputSuffix, suffix, sizeof(pPrintCfg->InputSuffix));
    return _SUCCESS;
}

#endif

TsplFunc.h  /

#ifndef TSPLFUNC_H

/******************************************************************************
 *                                                                            *
 *                         M O D U L E   D E F I N E                          *
 *                                                                            *
 ******************************************************************************/

#define TSPLFUNC_H

/******************************************************************************
 *                                                                            *
 *        C O M P I L E R   D E F I N E D   I N C L U D E   F I L E S         *
 *                                                                            *
 ******************************************************************************/

#include "XVarBank.h"
#include "XImgMgr.h"
#include "XPrtEng.h"
#include "..\Parser.h"
#include "..\ParserUtil.h"
#include "Error.h"

/******************************************************************************
 *                                                                            *
 *            U S E R   D E F I N E D   I N C L U D E   F I L E S             *
 *                                                                            *
 ******************************************************************************/

#ifdef __cplusplus
extern "C" {            /* Assume C declarations for C++ */
#endif    /* __cplusplus */

/******************************************************************************
 *                                                                            *
 *                        G L O B A L   D E F I N E S                         *
 *                                                                            *
 ******************************************************************************/

/******************************************************************************
 *                                                                            *
 *                 S T R U C T U R E   D E F I N I T I O N S                  *
 *                                                                            *
 ******************************************************************************/

/******************************************************************************
 *                                                                            *
 *    G L O B A L   V A R I A B L E S   -   N O   I N I T I A L I Z E R S     *
 *                                                                            *
 ******************************************************************************/
 
#ifdef TSPLFUNC_C
#define EXTERN 
#else
#define EXTERN extern
#endif

EXTERN INT MaxiCodeMode;
EXTERN INT DriverCopy;
EXTERN LONG PrintSets;
EXTERN LONG PrintCopies;
EXTERN BOOL InputFilter;
EXTERN BOOL CRLF_IsInputData;
EXTERN INT BasFileKey;

// file command use handle
EXTERN _FileHandle *UseHandle_0;
EXTERN _FileHandle *UseHandle_1;

// Tspl code page remap
EXTERN BYTE TsplRemapChar[256];

/******************************************************************************
 *                                                                            *
 *       G L O B A L   V A R I A B L E S   -   I N I T I A L I Z E R S        *
 *                                                                            *
 ******************************************************************************/

extern _CmdEntry SetEntry[];
extern _CmdEntry TsplEntry[];
extern CONST _CmdEntry BasicEntry[];
extern CONST _CmdEntry DriverEntry[];

extern CONST _BarcodeTable sBarcodeTab[];

/******************************************************************************
 *                                                                            *
 *                   F U N C T I O N   P R O T O T Y P E S                    *
 *                                                                            *
 ******************************************************************************/

// Driver command ( TsplDrvFunc.c )
INT FN_DRIVER_COMMAND(VOID);
INT FN_RS232_COMMAND(VOID);

// Image command ( TsplImgFunc.c )
INT FN_CLS(VOID);
INT FN_BAR(VOID);
INT FN_DIAGONAL(VOID);
INT FN_CIRCLE(VOID);
INT FN_ERASE(VOID);
INT FN_REVERSE(VOID);
INT FN_BOX(VOID);
INT FN_BARCODE(VOID);
INT FN_TEXT(VOID);
INT FN_BITMAP(VOID);
INT FN_PUTBMP(VOID);
INT FN_PUTPCX(VOID);
INT FN_AZTEC(VOID);
INT FN_DMATRIX(VOID);
INT FN_MAXI(VOID);
INT FN_PDF(VOID);
INT FN_MPDF(VOID);
INT FN_QRCODE(VOID);
INT FN_RSS(VOID);

// Normal command ( TsplFunc.c )
INT FN_REM(VOID);
INT FN_SIZE(VOID);
INT FN_GAP(VOID);
INT FN_BLINE(VOID);
INT FN_SHIFT(VOID);
INT FN_SPEED(VOID);
INT FN_FEED(VOID);
INT FN_BACKFEED(VOID);
INT FN_FORMFEED(VOID);
INT FN_HOME(VOID);
INT FN_DENSITY(VOID);
INT FN_DIRECTION(VOID);
INT FN_OFFSET(VOID);
INT FN_REFERENCE(VOID);
INT FN_PRINT(VOID);
INT FN_CUT(VOID);
INT FN_SET(VOID);
INT FN_REDRAW(VOID);
INT FN_DOWNLOAD(VOID);
INT FN_EOP(VOID);
INT FN_LOAD(VOID);
INT FN_RUN(VOID);
INT FN_KILL(VOID);
INT FN_COUNTRY(VOID);
INT FN_CODEPAGE(VOID);
INT FN_INPUT(VOID);
INT FN_OUT(VOID);
INT FN_OUTR(VOID);
INT FN_MOVE(VOID);
INT FN_COPY(VOID);
INT FN_BEEP(VOID);
INT FN_SOUND(VOID);
INT FN_DISPLAY(VOID);
INT FN_DELAY(VOID);
INT FN_EOJ(VOID);
INT FN_ST(VOID);
INT FN_INPUTPREFIX(VOID);
INT FN_INPUTSUFFIX(VOID);

// Basic file function ( TsplFileFunc.c )
INT FN_OPEN(VOID);
INT FN_CLOSE(VOID);
INT FN_SEEK(VOID);
INT FN_READ(VOID);
INT FN_WRITE(VOID);

// Basic function ( TsplBasFunc.c )
VOID BasInitialBASIC(VOID);
VOID BasClearHandle(VOID);
BOOL CheckBasLable(CHAR *);

INT BAS_IF(VOID);
INT BAS_ELSE(VOID);
INT BAS_ELSEIF(VOID);
INT BAS_ENDIF(VOID);
INT BAS_FOR(VOID);
INT BAS_NEXT(VOID);
INT BAS_EXITFOR(VOID);
INT BAS_WHILE(VOID);
INT BAS_WEND(VOID);
INT BAS_DO(VOID);
INT BAS_LOOP(VOID);
INT BAS_EXITDO(VOID);
INT BAS_GOSUB(VOID);
INT BAS_RETURN(VOID);
INT BAS_GOTO(VOID);
INT BAS_OPEN(VOID);
INT BAS_WRITE(VOID);
INT BAS_READ(VOID);
INT BAS_CLOSE(VOID);
INT BAS_SEEK(VOID);
INT BAS_END(VOID);
INT BAS_EOP(VOID);

// Set command ( TsplSetFunc.c )
INT FN_SET_COM1(VOID);
INT FN_SET_LED1(VOID);
INT FN_SET_LED2(VOID);
INT FN_SET_LED3(VOID);
INT FN_SET_KEY1(VOID);
INT FN_SET_KEY2(VOID);
INT FN_SET_KEY3(VOID);
INT FN_SET_KEY4(VOID);
INT FN_SET_KEY5(VOID);
INT FN_SET_KEY6(VOID);
INT FN_SET_GPI1(VOID);
INT FN_SET_GPI2(VOID);
INT FN_SET_GPI3(VOID);
INT FN_SET_GPI4(VOID);
INT FN_SET_GPO1(VOID);
INT FN_SET_GPO2(VOID);
INT FN_SET_GPO3(VOID);
INT FN_SET_GPO4(VOID);
INT FN_SET_GPO5(VOID);
INT FN_SET_GPO6(VOID);
INT FN_SET_GPO7(VOID);
INT FN_SET_CUTTER(VOID);
INT FN_SET_PARTIAL_CUTTER(VOID);
INT FN_SET_BACK(VOID);
INT FN_SET_PEEL(VOID);
INT FN_SET_TEAR(VOID);
INT FN_SET_COUNTER(VOID);
INT FN_SET_DEBUG(VOID);
INT FN_SET_SENSOR_REF(VOID);
INT FN_SET_INVALID_GAP(VOID);
INT FN_SET_DISPLAY_REMAIN(VOID);
INT FN_SET_GAP(VOID);
INT FN_SET_RIBBON_I(VOID);
INT FN_SET_CONTRAST(VOID);
INT FN_SET_COMMAND(VOID);
INT FN_SET_RIBBON(VOID);
INT FN_SET_ENCODER(VOID);
INT FN_SET_HEAD(VOID);
INT FN_SET_NOBACK(VOID);
INT FN_SET_MAXICODE(VOID);
INT FN_SET_EXTFEED(VOID);
INT FN_SET_FEED_TIME(VOID);
INT FN_SET_FEED_LEN(VOID);
INT FN_SET_REPRINT(VOID);
INT FN_SET_PRINTKEY(VOID);
INT FN_SET_REPRINTKEY(VOID);
INT FN_SET_VERIFIER(VOID);
INT FN_SET_AUTORUN(VOID);
INT FN_SET_OVERHEAT(VOID);
INT FN_SET_MOTOR_OVERHEAT(VOID);
INT FN_SET_INPUTFILTER(VOID);

#if defined(DURALABEL)
INT FN_SET_RF_COMMAND(VOID);
INT FN_RFSET(VOID);
INT FN_RFID(VOID);
#endif

// for test
VOID OutBasicStatus(VOID);

#undef EXTERN

#ifdef __cplusplus
}                       /* End of extern "C" { */
#endif    /* __cplusplus */

#endif    

  • 14
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值