T168_111\appl\Parser:第1~5

Menu.h   。。。。。。。。。。。。。。。。。。。。。

#ifndef MENU_H

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

#define MENU_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 "XPrtEng.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                         *
 *                                                                            *
 ******************************************************************************/

/* None */

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

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

/* None */

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

VOID MainMenu(VOID);
VOID JobMenu(VOID);
INT ErrorMenu(VOID);
VOID SensorMenu(_eSensorMode);
VOID KeyboardMenu(VOID);
VOID KeyboardFlashListMenu(VOID);

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

#endif    

MenuKB.c   。。。。。。。。。。。。。。。。。。。。。。。。

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

#define MENUKB_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 <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 "XTask.h"
#include "XBuzzer.h"
#include "XTimer.h"
#include "XFileSys.h"
#include "XDisplay.h"
#include "XKeyboard.h"
#include "XVarBank.h"
#include "Menu.h"

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

#if defined(PS2_MODEL) || defined(USB_HOST_MODEL)

#if defined(MENU_TSPL_3) || defined(MENU_TSPL_4)

#define KB_ESC_KEY                1
#define KB_UP_KEY                2
#define KB_DOWN_KEY                3
#define KB_ENTER_KEY            4

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

typedef struct
{
    CHAR **tag;
    CHAR **title;
    _eFileDevice device;
}_FileItem;

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

/* None */

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

/* None */

/******************************************************************************
 *                                                                            *
 *    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 _PrintCfg *pMenuCfg;    // printer config data point

STATIC BOOL ExitMenu;


STATIC VOID InitialMenu(VOID)
{
    pMenuCfg = GrabPrintConfig();
}

STATIC VOID EntryMenuFunc(VOID)
{
    WaitWorkJobEnd();

#if defined(CARRIAGE_OPEN_MODEL)
    StopCheckCarriageOpen();
#endif

    StopKeyFunc();
}

STATIC VOID LeaveMenuFunc(VOID)
{
    delay_msec(200);

    StartKeyFunc(TRUE);

#if defined(CARRIAGE_OPEN_MODEL)
    StartCheckCarriageOpen();
#endif
}

STATIC INT MenuWaitKey(VOID)
{
    INT Status;
    INT Key;

    while (1)
    {
        if (Key = KeyboardOut())
        {
            if (Key == SCAN_KEY_ESC)
            {
                Status = KB_ESC_KEY;
                break;
            }
            if (Key == SCAN_KEY_UP)
            {
                Status = KB_UP_KEY;
                break;
            }
            if (Key == SCAN_KEY_DOWN)
            {
                Status = KB_DOWN_KEY;
                break;
            }
            if (Key == SCAN_KEY_ENTER)
            {
                Status = KB_ENTER_KEY;
                break;
            }
        }
        NutSleep(10);
    }

    sysprintf("MenuWaitKey\r\n");
    EnableBuzzer(26, 100);
    return Status;
}

STATIC VOID FileListMenu(CHAR **title, _eFileDevice device)
{
    CONST STATIC CHAR rev[] = "               ";
    _FileList list;
    CHAR name[DSP_LINES][20];
    INT index;

    memset(name, 0, sizeof(name));

    OpenList(&list, device);
    if (!NextFile(&list, "*.*"))
    {
        DspClearDisplay();
        ShowLCDString(0, 0, *(title + pMenuCfg->Language), 0);
        ShowLCDString(0, 1, (CHAR *)LCDMessage[MSG_NO_FILE][pMenuCfg->Language], 0);
        while (CheckKeyPin(SELECT_KEY)){}
        MenuWaitKey();
        return;
    }

#if (DSP_LINES == 2)
    strcpy(name[0], list.FileName);
    PrevFile(&list, "*.*");

#elif (DSP_LINES == 3)
    strcpy(name[0], list.FileName);
    if (NextFile(&list, "*.*"))
        strcpy(name[1], list.FileName);
    PrevFile(&list, "*.*");
    PrevFile(&list, "*.*");

#elif (DSP_LINES == 4)
    strcpy(name[0], list.FileName);
    if (NextFile(&list, "*.*"))
        strcpy(name[1], list.FileName);
    if (NextFile(&list, "*.*"))
        strcpy(name[2], list.FileName);
    PrevFile(&list, "*.*");
    PrevFile(&list, "*.*");
    PrevFile(&list, "*.*");

#endif

    index = 1;
    while (1)
    {
        while (CheckBuzzerStatus()){}

#if (DSP_LINES == 2)
        DspClearDisplay();
        ShowLCDString(0, 0, *(title + pMenuCfg->Language), 0);
        ShowLCDString(0, 1, name[0], 0);

#elif (DSP_LINES == 3)
        DspClearDisplay();
        ShowLCDString(0, index, ">", 0);
        ShowLCDString(0, 0, *(title + pMenuCfg->Language), 0);
        ShowLCDString(1, 1, name[0], 0);
        ShowLCDString(1, 2, name[1], 0);

#elif (DSP_LINES == 4)
        DspClearDisplay();
        ShowLCDString(0, index, ">", 0);
        ShowLCDString(1, index, (CHAR *)rev, 1);
        ShowLCDString(0, 0, *(title + pMenuCfg->Language), 0);
        ShowLCDString(1, 1, name[0], index == 1 ? 1 : 0);
        ShowLCDString(1, 2, name[1], index == 2 ? 1 : 0);
        ShowLCDString(1, 3, name[2], index == 3 ? 1 : 0);

#endif
        while (CheckKeyPin(SELECT_KEY)){}

        switch (MenuWaitKey())
        {
            case KB_ESC_KEY:    // exit
                return;

            case KB_UP_KEY:        // prev
                if (PrevFile(&list, "*.*"))
                {
                    if (--index < 1)
                    {
#if (DSP_LINES == 2)
                        strcpy(name[0], list.FileName);

#elif (DSP_LINES == 3)
                        strcpy(name[1], name[0]);
                        strcpy(name[0], list.FileName);

#elif (DSP_LINES == 4)
                        strcpy(name[2], name[1]);
                        strcpy(name[1], name[0]);
                        strcpy(name[0], list.FileName);
#endif
                        index = 1;
                    }
                }
                break;

            case KB_DOWN_KEY:    // next
                if (NextFile(&list, "*.*"))
                {
                    if (NextFile(&list, "*.*"))
                    {
                        if (++index > DSP_LINES - 1)
                        {
#if (DSP_LINES == 2)
                            strcpy(name[DSP_LINES - 2], list.FileName);

#elif (DSP_LINES == 3)
                            strcpy(name[DSP_LINES - 3], name[DSP_LINES - 2]);
                            strcpy(name[DSP_LINES - 2], list.FileName);

#elif (DSP_LINES == 4)
                            strcpy(name[DSP_LINES - 4], name[DSP_LINES - 3]);
                            strcpy(name[DSP_LINES - 3], name[DSP_LINES - 2]);
                            strcpy(name[DSP_LINES - 2], list.FileName);
#endif
                            index = DSP_LINES - 1;
                        }
                    }
                    PrevFile(&list, "*.*");
                }
                break;

            case KB_ENTER_KEY:    // run
                if (strcmp(strchr(list.FileName, '.'), ".BAS"))
                    break;
                RunBasicFile(device, list.FileName);
                ExitMenu = TRUE;
                return;
        }
    }
}

STATIC VOID DevListMenu(_FileItem *index, CHAR **title)
{
    CONST STATIC CHAR rev[] = "               ";
    _FileItem *top, *mid, *bot;
    CHAR buf[20];
    INT item, total;

    index += 1;
    item = 1;

    // caculate total item
    total = 1;
    while ((index + total)->tag)
        total += 1;

#if (DSP_LINES == 2)
    top = index;
    mid = index;
    bot = index;

#elif (DSP_LINES == 3)
    top = index;
    mid = index + 1;
    bot = index + 1;

#elif (DSP_LINES == 4)
    top = index;
    mid = index + 1;
    bot = index + 2;

#endif

    ExitMenu = FALSE;
    while (!ExitMenu)
    {
        while (CheckBuzzerStatus()){}

#if (DSP_LINES == 2)
        DspClearDisplay();
        ShowLCDString(0, 0, *(title + pMenuCfg->Language), 0);
        ShowLCDString(0, 1, *(index->tag + pMenuCfg->Language), 0);

#elif (DSP_LINES == 3)
        DspClearDisplay();
        ShowLCDString(0, 0, *(title + pMenuCfg->Language), 0);

        if (index == top)
        {
            ShowLCDString(1, 1, *(top->tag + pMenuCfg->Language), 0);
            ShowLCDString(1, 2, *(bot->tag + pMenuCfg->Language), 0);
            ShowLCDString(0, 1, ">", 0);
        }
        else if (index == mid)
        {
            ShowLCDString(1, 1, *(top->tag + pMenuCfg->Language), 0);
            ShowLCDString(1, 2, *(bot->tag + pMenuCfg->Language), 0);
            ShowLCDString(0, 2, ">", 0);
        }

#elif (DSP_LINES == 4)
        DspClearDisplay();
        ShowLCDString(0, 0, *(title + pMenuCfg->Language), 0);
        sprintf(buf, "%1d/%1d", item, total);
        ShowLCDString((16 - strlen(buf)), 0, buf, 0);

        if (index == top)
        {
            ShowLCDString(1, 1, (CHAR *)rev, 1);
            ShowLCDString(1, 1, *(top->tag + pMenuCfg->Language), 1);
            ShowLCDString(1, 2, *(mid->tag + pMenuCfg->Language), 0);
            ShowLCDString(1, 3, *(bot->tag + pMenuCfg->Language), 0);
            ShowLCDString(0, 1, ">", 0);
        }
        else if (index == mid)
        {
            ShowLCDString(1, 2, (CHAR *)rev, 1);
            ShowLCDString(1, 1, *(top->tag + pMenuCfg->Language), 0);
            ShowLCDString(1, 2, *(mid->tag + pMenuCfg->Language), 1);
            ShowLCDString(1, 3, *(bot->tag + pMenuCfg->Language), 0);
            ShowLCDString(0, 2, ">", 0);
        }
        else if (index == bot)
        {
            ShowLCDString(1, 3, (CHAR *)rev, 1);
            ShowLCDString(1, 1, *(top->tag + pMenuCfg->Language), 0);
            ShowLCDString(1, 2, *(mid->tag + pMenuCfg->Language), 0);
            ShowLCDString(1, 3, *(bot->tag + pMenuCfg->Language), 1);
            ShowLCDString(0, 3, ">", 0);
        }
#endif
        switch (MenuWaitKey())
        {
            case KB_ESC_KEY:    // exit
                return;

            case KB_UP_KEY:        // prev
                if ((index - 1)->tag)
                {
                    if (index == top)
                    {
                        top--;
                        mid--;
                        bot--;
                    }
                    index--;
                    item--;
                }
                break;

            case KB_DOWN_KEY:    // next
                if ((index + 1)->tag)
                {
                    if (index == bot)
                    {
                        top++;
                        mid++;
                        bot++;
                    }
                    index++;
                    item++;
                }
                break;
        
            case KB_ENTER_KEY:    // entry
                if (!index->title)
                    return;
                FileListMenu(index->title, index->device);
                break;
        }
    }
}

VOID KeyboardMenu(VOID)
{
    CONST STATIC _FileItem FileItem[] = 
    {
        {_NULL, _NULL, (_eFileDevice)_NULL},
        {(CHAR **)LCDMessage[MSG_DRAM],  (CHAR **)LCDMessage[MSG_DRAM_FILE_LIST],  DRAM_DEVICE},
        {(CHAR **)LCDMessage[MSG_FLASH], (CHAR **)LCDMessage[MSG_FLASH_FILE_LIST], FLASH_DEVICE},
        {(CHAR **)LCDMessage[MSG_CARD],  (CHAR **)LCDMessage[MSG_CARD_FILE_LIST],  CARD_DEVICE},
        {(CHAR **)LCDMessage[MSG_EXIT], _NULL, (_eFileDevice)_NULL},
        {_NULL, _NULL, (_eFileDevice)_NULL}
    };

    ClrDisplayStatus(DIS_READY);

    EntryMenuFunc();

    InitialMenu();

    EnableBuzzer(26, 100);
    while (CheckBuzzerStatus()){}

    DevListMenu((_FileItem *)FileItem, (CHAR **)LCDMessage[MSG_FILE_LIST]);

    LeaveMenuFunc();

    SetDisplayStatus(DIS_READY);
}

VOID KeyboardFlashListMenu(VOID)
{
    ClrDisplayStatus(DIS_READY);

    EntryMenuFunc();

    InitialMenu();
    sysprintf("KeyboardFlashListMenu\r\n");

    EnableBuzzer(26, 100);
    while (CheckBuzzerStatus()){}

    FileListMenu((CHAR **)LCDMessage[MSG_FLASH_FILE_LIST], FLASH_DEVICE);

    LeaveMenuFunc();

    SetDisplayStatus(DIS_READY);
}

#endif

#endif

MenuVer1.c  。。。。。。。。。。。。。。。。。。。。。。。。。。。。。

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

#define MENUVER1_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 <string.h>
#include <stdlib.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 "XADC.h"
#include "XKey.h"
#include "XBuzzer.h"
#include "XTask.h"
#include "XVarBank.h"
#include "XFileSys.h"
#include "XRTC.h"
#include "XPrtEng.h"
#include "XDisplay.h"
#include "XCodePage.h"
#include "XAppVer.h"
#include "Tspl\TsplFunc.h"
#include "Tspl\TsplUtil.h"
#include "Menu.h"

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

#if defined(LCD_MODEL) && defined(MENU_TSPL_1)

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

typedef struct 
{
    INT FeedKeyIndex;
    INT PauseKeyIndex;
    INT MenuKeyIndex;
}_MenuKey;

typedef enum
{
    MAIN_SHOW_PRINT_INFO,
    MAIN_SHOW_FILE_INFO,
    MAIN_SHOW_MEMORY_INFO,
    MAIN_SHOW_DATE_TIME,
    MAIN_PRINT_SETUP,
    MAIN_ROTATE_CUTTER,
    MAIN_TOTAL,
}_eMainItem;

typedef enum
{
    INFO_VERSION,
    INFO_SPEED,
    INFO_DENSITY,
    INFO_COM,
    INFO_CODEPAGE,
    INFO_COUNTRY,
    INFO_SIZE,
    INFO_GAP,
    INFO_PEEL_MODE,
    INFO_CUT_MODE,
    INFO_RIBBON,
    INFO_MILLAGE,
    INFO_ITEM_TOTAL,
}_ePrintInfoItem;

typedef enum
{
    MEMORY_SIZE_TOTAL,
    MEMORY_SIZE_REMAIN,
    MEMORY_ITEM_TOATL,
}_eMemoryInfoItem;

typedef enum
{
    INFO_DATE,
    INFO_TIME,
    DATE_TIME_TOTAL,
}_eDateTimeInfo;

typedef enum
{
    SETUP_LANGUAGE,
    SETUP_SPEED,
    SETUP_DENSITY,
    SETUP_BAUD,
    SETUP_PARITY,
    SETUP_DATABITS,
    SETUP_STOPBIT,
    SETUP_TOTAL,
}_ePrintSetup;

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

CONST STATIC CHAR *COM_BAUD_FULL[] = 
{
    "0",
    "1200",
    "2400",
    "4800",
    "9600",
    "19200",
    "38400",
    "57600",
    "115200",
};

CONST STATIC CHAR *COM_BAUD[] = 
{
    "0",
    "12",
    "24",
    "48",
    "96",
    "19",
    "38",
    "57",
    "115",
};

CONST STATIC CHAR *COM_PARITY_FULL[] =
{
    "NONE",
    "ODD",
    "EVEN",
};

CONST STATIC CHAR *COM_PARITY[] =
{
    "N",
    "O",
    "E",
};

CONST STATIC CHAR *COM_DATABITS[] =
{
    "7",
    "8",
};

CONST STATIC CHAR *COM_STOP[] =
{
    "1",
    "2",
};

/******************************************************************************
 *                                                                            *
 *    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 _PrintCfg *pMenuCfg;    // priner config data point
STATIC _PrintRecord* pMenuRec;    // printer record

STATIC _FileList FileList;
STATIC _eFileDevice ListDevice;
STATIC INT FileTotal;

VOID InitialMenu(VOID)
{
    pMenuCfg = GrabPrintConfig();
    pMenuRec = GrabPrintRecord();

    FileTotal = GetFileTotal(FLASH_DEVICE, "*.*");
    FileTotal += GetFileTotal(CARD_DEVICE, "*.*");
    FileTotal += GetFileTotal(DRAM_DEVICE, "*.*");

    ListDevice = DRAM_DEVICE;
    OpenList(&FileList, ListDevice);
}

INT MenuWaitKey(VOID)
{
    while (1)
    {
        if ( GetKey(FEED_KEY) )
            return FEED_KEY;
        if ( GetKey(PAUSE_KEY) )
            return PAUSE_KEY;
        if ( GetKey(MENU_KEY) )
            return MENU_KEY;
    }
}

VOID DispatchSubMenuInfo(_MenuKey *pMenuKey)
{
    CHAR InfoStr[256];
    
    DspClearLine(1, LCD_LANG_ENG);
    switch ( pMenuKey->FeedKeyIndex )
    {
        case INFO_VERSION:
            sprintf( InfoStr,"%s %s", ModelName, VerName);
            break;
        case INFO_SPEED:
            sprintf( InfoStr,"%s%s", LCDMessage[MSG_SPEED][pMenuCfg->Language], ToSpeedString(pMenuCfg->Speed));
            break;
        case INFO_DENSITY:
            sprintf( InfoStr,"%s%d", LCDMessage[MSG_DENSITY][pMenuCfg->Language], (INT)pMenuCfg->fDensity);
            break;
        case INFO_COM:
            sprintf( InfoStr,"%s%s,%s,%s,%s", LCDMessage[MSG_COM1][pMenuCfg->Language], 
                COM_BAUD[pMenuCfg->UartSetting.Baud], COM_PARITY[pMenuCfg->UartSetting.Parity], 
                COM_DATABITS[pMenuCfg->UartSetting.DataBits], COM_STOP[pMenuCfg->UartSetting.Stop] );
            break;
        case INFO_CODEPAGE:
            sprintf( InfoStr,"%s%s", LCDMessage[MSG_CODEPAGE][pMenuCfg->Language], CodePageNameTable[pMenuCfg->CodePage]);
            break;
        case INFO_COUNTRY:
            sprintf( InfoStr,"%s%s", LCDMessage[MSG_COUNTRY][pMenuCfg->Language], CountryNameTable[pMenuCfg->Country]);
            break;
        case INFO_SIZE:
            sprintf( InfoStr,"%s%.2f,%.2f", LCDMessage[MSG_SIZE][pMenuCfg->Language], (FLOAT)pMenuCfg->PaperWidth / TPH_DPI, pMenuCfg->fPaperSize / TPH_DPI);
            break;
        case INFO_GAP:
            if ( pMenuCfg->SensorMode == GAP_MODE )
                sprintf( InfoStr,"%s%.2f,%.2f", LCDMessage[MSG_GAP][pMenuCfg->Language], pMenuCfg->fGapSize / TPH_DPI, pMenuCfg->fGapOffset / TPH_DPI);
            else if ( pMenuCfg->SensorMode == BLINE_MODE )
                sprintf( InfoStr,"%s%.2f,%.2f", LCDMessage[MSG_BLINE][pMenuCfg->Language], pMenuCfg->fBlineSize / TPH_DPI, pMenuCfg->fBlineOffset / TPH_DPI);
            else
                sprintf( InfoStr,"%s%.2f,%.2f", LCDMessage[MSG_GAP][pMenuCfg->Language], (FLOAT)0, (FLOAT)0);
            break;
        case INFO_PEEL_MODE:
            if ( pMenuCfg->PrintOutMode == PEEL_MODE )
                sprintf( InfoStr,"%s", LCDMessage[MSG_PEEL_ON][pMenuCfg->Language]);
            else
                sprintf( InfoStr,"%s", LCDMessage[MSG_PEEL_OFF][pMenuCfg->Language]);
            break;
        case INFO_CUT_MODE:
            if ( pMenuCfg->PrintOutMode == CUTTER_MODE )
                sprintf( InfoStr,"%s", LCDMessage[MSG_CUTTER_ON ][pMenuCfg->Language]);
            else
                sprintf( InfoStr,"%s", LCDMessage[MSG_CUTTER_OFF][pMenuCfg->Language]);
            break;

        case INFO_RIBBON:
            if ( pMenuCfg->RibbonFlag  )
                sprintf( InfoStr,"%s", LCDMessage[MSG_RIBBON_ON ][pMenuCfg->Language]);
            else
                sprintf( InfoStr,"%s", LCDMessage[MSG_RIBBON_OFF][pMenuCfg->Language]);
            break;
        case INFO_MILLAGE:
            sprintf( InfoStr,"%s%.2f", LCDMessage[MSG_MILAGE][pMenuCfg->Language], (FLOAT)pMenuRec->DotMilage / (MM_DOT * 1000000));
            break;
    }
    ShowLCDString(0,1,InfoStr,0);
}

VOID DispatchSubMenuFileInfo(_MenuKey *pMenuKey)
{
    DspClearLine(1, LCD_LANG_ENG);
    if ( pMenuKey->FeedKeyIndex == FileTotal )
        ShowMessage(0, 1, MSG_END_OF_FILE, 0);
    else
    {
        while ( !NextFile(&FileList, "*.*") )
        {
            if ( ListDevice == DRAM_DEVICE )
                ListDevice = FLASH_DEVICE;
            else if ( ListDevice == FLASH_DEVICE )
                ListDevice = CARD_DEVICE;
            else if ( ListDevice == CARD_DEVICE )
                ListDevice = DRAM_DEVICE;
            OpenList(&FileList, ListDevice);
        }
        ShowLCDString(0, 1, FileList.FileName, 0);
    }
}

VOID DispatchSubMenuMemoryInfo(_MenuKey *pMenuKey)
{
    CHAR InfoStr[256];
    
    DspClearLine(1, LCD_LANG_ENG);
    switch ( pMenuKey->FeedKeyIndex )
    {
        case MEMORY_SIZE_TOTAL:
            sprintf( InfoStr,"%s%4dK", LCDMessage[MSG_MEMORY_TOTAL][pMenuCfg->Language], TotalSpace( DRAM_DEVICE ));
            break;
        case MEMORY_SIZE_REMAIN:
            sprintf( InfoStr,"%s%4dK", LCDMessage[MSG_MEMORY_REMAIN][pMenuCfg->Language], FreeSpace( DRAM_DEVICE ));
            break;
    }
    ShowLCDString(0,1,InfoStr,0);
}

VOID DispatchSubMenuDateTimeInfo(_MenuKey *pMenuKey)
{
    CHAR InfoStr[256];

    DspClearLine(1, LCD_LANG_ENG);
    switch ( pMenuKey->FeedKeyIndex )
    {
        case INFO_DATE:
            sprintf( InfoStr, "%s%4d/%2d/%2d", LCDMessage[MSG_DATE][pMenuCfg->Language],
                GetRTC(RTC_YEAR), GetRTC(RTC_MONTH), GetRTC(RTC_DATE) );
            break;
        case INFO_TIME:
            sprintf( InfoStr, "%s%2d:%2d", LCDMessage[MSG_TIME][pMenuCfg->Language],
                GetRTC(RTC_HOUR), GetRTC(RTC_MIN) );
            break;
    }
    ShowLCDString(0,1,InfoStr,0);
}

VOID DispatchSubMenuPrintSetup(_MenuKey *pMenuKey)
{
    CHAR InfoStr[256];
    DspClearLine(1, LCD_LANG_ENG);
    switch ( pMenuKey->FeedKeyIndex )
    {
        case SETUP_LANGUAGE:
            sprintf( InfoStr,"%s", LCDMessage[MSG_LANG][pMenuCfg->Language]);
            break;
        case SETUP_SPEED:
            sprintf( InfoStr,"%s%s", LCDMessage[MSG_SPEED][pMenuCfg->Language], ToSpeedString(pMenuCfg->Speed));
            break;
        case SETUP_DENSITY:
            sprintf( InfoStr,"%s%d", LCDMessage[MSG_DENSITY][pMenuCfg->Language], (INT)pMenuCfg->fDensity);
            break;
        case SETUP_BAUD:
            sprintf( InfoStr,"%s%s", LCDMessage[MSG_BAUD_RATE][pMenuCfg->Language], COM_BAUD_FULL[pMenuCfg->UartSetting.Baud]);
            break;
        case SETUP_PARITY:
            sprintf( InfoStr,"%s%s", LCDMessage[MSG_PARITY][pMenuCfg->Language], COM_PARITY_FULL[pMenuCfg->UartSetting.Parity]);
            break;
        case SETUP_DATABITS:
            sprintf( InfoStr,"%s%s", LCDMessage[MSG_DATA_BITS][pMenuCfg->Language], COM_DATABITS[pMenuCfg->UartSetting.DataBits]);
            break;
        case SETUP_STOPBIT:
            sprintf( InfoStr,"%s%s", LCDMessage[MSG_STOP_BIT][pMenuCfg->Language], COM_STOP[pMenuCfg->UartSetting.Stop]);
            break;
    }
    ShowLCDString(0,1,InfoStr,0);
}

VOID DispatchSubMenuRotateCutter(_MenuKey *pMenuKey)
{
    CHAR InfoStr[256];
    DspClearLine(1, LCD_LANG_ENG);
    sprintf( InfoStr,"-     +");
    ShowLCDString(7,1,InfoStr,0);
}

INT DispatchSubMenu(_MenuKey *pMenuKey)
{
    switch ( pMenuKey->MenuKeyIndex )
    {
        case MAIN_SHOW_PRINT_INFO:
            DispatchSubMenuInfo(pMenuKey);
            break;
        case MAIN_SHOW_FILE_INFO:
            DispatchSubMenuFileInfo(pMenuKey);
            break;
        case MAIN_SHOW_MEMORY_INFO:
            DispatchSubMenuMemoryInfo(pMenuKey);
            break;
        case MAIN_SHOW_DATE_TIME:
            DispatchSubMenuDateTimeInfo(pMenuKey);
            break;
        case MAIN_PRINT_SETUP:
            DispatchSubMenuPrintSetup(pMenuKey);
            break;
        case MAIN_ROTATE_CUTTER:
            DispatchSubMenuRotateCutter(pMenuKey);
            break;
        default:
            return FALSE;
    }
    return TRUE;
}

INT DispatchMainMenu(_MenuKey *pMenuKey)
{
    DspClearLine(0, LCD_LANG_ENG);
    switch ( pMenuKey->MenuKeyIndex )
    {
        case MAIN_SHOW_PRINT_INFO:
            ShowMessage(0,0, MSG_PRINTER_INFO, 0);
            break;
        case MAIN_SHOW_FILE_INFO:
            ShowMessage(0,0, MSG_FILE_LIST, 0);
            break;
        case MAIN_SHOW_MEMORY_INFO:
            ShowMessage(0,0, MSG_MEMORY_INFO, 0);
            break;
        case MAIN_SHOW_DATE_TIME:
            ShowMessage(0,0, MSG_DATE_TIME, 0);
            break;
        case MAIN_PRINT_SETUP:
            ShowMessage(0,0, MSG_PRINTER_SETUP, 0);
            break;
        case MAIN_ROTATE_CUTTER:
            if ( pMenuCfg->PrintOutMode != CUTTER_MODE )
                return FALSE;

            ShowMessage(0,0, MSG_ROTATE_CUTTER, 0);
            break;
        default:
            return FALSE;
    }
    DispatchSubMenu(pMenuKey);
    return TRUE;
}

INT CheckMenuKeyItem( _MenuKey *pMenuKey, INT PressKey )
{
    if ( pMenuKey->MenuKeyIndex != MAIN_ROTATE_CUTTER || PressKey == MENU_KEY )
    {
        sysprintf("CheckMenuKeyItem\r\n");
        EnableBuzzer(26, 100);
        while ( CheckBuzzerStatus() ){}
    }

    // Menu key press
    if ( PressKey == MENU_KEY )
    {
        pMenuKey->MenuKeyIndex += 1;
        pMenuKey->PauseKeyIndex = 0;
        pMenuKey->FeedKeyIndex = 0;
        return TRUE;
    }
    // Feed key press
    else if ( PressKey == FEED_KEY )
    {
        switch ( pMenuKey->MenuKeyIndex )
        {
            case MAIN_SHOW_PRINT_INFO:
                pMenuKey->FeedKeyIndex += 1;
                if ( pMenuKey->FeedKeyIndex >= INFO_ITEM_TOTAL )
                    pMenuKey->FeedKeyIndex = 0;
                return TRUE;
            case MAIN_SHOW_FILE_INFO:
                pMenuKey->FeedKeyIndex += 1;
                if ( pMenuKey->FeedKeyIndex > FileTotal )
                    pMenuKey->FeedKeyIndex = 0;
                return TRUE;
            case MAIN_SHOW_MEMORY_INFO:
                pMenuKey->FeedKeyIndex += 1;
                if ( pMenuKey->FeedKeyIndex >= MEMORY_ITEM_TOATL )
                    pMenuKey->FeedKeyIndex = 0;
                return TRUE;
            case MAIN_SHOW_DATE_TIME:
                pMenuKey->FeedKeyIndex += 1;
                if ( pMenuKey->FeedKeyIndex >= DATE_TIME_TOTAL )
                    pMenuKey->FeedKeyIndex = 0;
                return TRUE;
            case MAIN_PRINT_SETUP:
                pMenuKey->FeedKeyIndex += 1;
                if ( pMenuKey->FeedKeyIndex >= SETUP_TOTAL )
                    pMenuKey->FeedKeyIndex = 0;
                return TRUE;
            case MAIN_ROTATE_CUTTER:
                EnableCutter(CUT_DIR_FORWARD);
                while ( CheckKeyPin(FEED_KEY) );
                DisableCutter();
                return TRUE;
        }

    }
    // Pause key press
    else if ( PressKey == PAUSE_KEY && pMenuKey->MenuKeyIndex == MAIN_PRINT_SETUP)
    {
        switch ( pMenuKey->FeedKeyIndex )
        {
            case SETUP_LANGUAGE:
                pMenuCfg->Language += 1;
                if (pMenuCfg->Language >= LANGUAGE_TOTAL)
                    pMenuCfg->Language = 0;
                return TRUE;
            case SETUP_SPEED:
                pMenuCfg->Speed += 1;
                if (pMenuCfg->Speed > PRINT_SPEED_MAX)
                    pMenuCfg->Speed = PRINT_SPEED_MIN;
                
                return TRUE;
            case SETUP_DENSITY:
                pMenuCfg->fDensity += (FLOAT)1;
                if (pMenuCfg->fDensity > DensityMax)
                    pMenuCfg->fDensity = DensityMin;
                return TRUE;
            case SETUP_BAUD:
                pMenuCfg->UartSetting.Baud += 1;
                if (pMenuCfg->UartSetting.Baud > UART_BAUD_38400)
                    pMenuCfg->UartSetting.Baud = UART_BAUD_1200;
                return TRUE;
            case SETUP_PARITY:
                pMenuCfg->UartSetting.Parity += 1;
                if (pMenuCfg->UartSetting.Parity > UART_PARITY_EVEN)
                    pMenuCfg->UartSetting.Parity = UART_PARITY_NONE;
                return TRUE;
            case SETUP_DATABITS:
                pMenuCfg->UartSetting.DataBits += 1;
                if (pMenuCfg->UartSetting.DataBits > UART_DATA_8)
                    pMenuCfg->UartSetting.DataBits= UART_DATA_7;
                return TRUE;
            case SETUP_STOPBIT:
                pMenuCfg->UartSetting.Stop += 1;
                if (pMenuCfg->UartSetting.Stop > UART_STOP_TWO)
                    pMenuCfg->UartSetting.Stop= UART_STOP_ONE;
                return TRUE;
        }
    }
    // Pause key press
    else if ( PressKey == PAUSE_KEY && pMenuKey->MenuKeyIndex == MAIN_ROTATE_CUTTER )
    {
        EnableCutter(CUT_DIR_BACKWARD);
        while ( CheckKeyPin(PAUSE_KEY) );
        DisableCutter();
        return TRUE;
    }
    return FALSE;
}

VOID MainMenu(VOID)
{
    _MenuKey MenuKey;
    INT PressKey;

    ClrDisplayStatus(DIS_READY);

#if defined(CARRIAGE_OPEN_MODEL)
    StopCheckCarriageOpen();
#endif

    StopKeyFunc();

    InitialMenu();

    sysprintf("InitialMenu1\r\n");
    EnableBuzzer(26, 100);
    while ( CheckBuzzerStatus() ){}

    MenuKey.FeedKeyIndex = 0;
    MenuKey.PauseKeyIndex = 0;
    MenuKey.MenuKeyIndex = 0;

    DspClearDisplay();
    DispatchMainMenu(&MenuKey);

    while (1)
    {
        PressKey = MenuWaitKey();
        if ( CheckMenuKeyItem( &MenuKey, PressKey ) )
        {
            if ( PressKey == MENU_KEY )
            {
                // dispatch menu key == flase is exit
                if ( !DispatchMainMenu(&MenuKey) )
                    break;
            }
            else if ( PressKey == FEED_KEY )
            {
                DispatchSubMenu(&MenuKey);
            }
            if ( ( PressKey == PAUSE_KEY ) && ( MenuKey.MenuKeyIndex == MAIN_PRINT_SETUP ) )
            {
                DispatchSubMenu(&MenuKey);
            }
        }
    }

    StartKeyFunc(TRUE);

#if defined(CARRIAGE_OPEN_MODEL)
    StartCheckCarriageOpen();
#endif

    SetDisplayStatus(DIS_READY);
}

#endif


MenuVer2.c   。。。。。。。。。。。。。。。。。。。。。。。。。。。

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

#define MENUVER2_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 <string.h>
#include <stdlib.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 "XTask.h"
#include "XVarBank.h"
#include "XADC.h"
#include "XLED.h"
#include "XKey.h"
#include "XBuzzer.h"
#include "XTimer.h"
#include "XPrtEng.h"
#include "XFileSys.h"
#include "XDisplay.h"
#include "XCodePage.h"
#include "XFunction.h"
#include "Tspl\TsplFunc.h"
#include "Tspl\TsplUtil.h"
#include "Bsc\BscReport.h"
#include "Menu.h"

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

#if defined(LCD_MODEL) && defined(MENU_TSPL_2)

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

typedef struct
{
    VOID (*DspFunc)(VOID);
    VOID (*MenuFunc)(VOID *);
    VOID (*PauseFunc)(VOID *);
    VOID (*FeedFunc)(VOID *);
}_MenuItem;

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

CONST STATIC CHAR *COM_BAUD_FULL[] = 
{
    "0",
    "1200",
    "2400",
    "4800",
    "9600",
    "19200",
    "38400",
    "57600",
    "115200",
};

CONST STATIC CHAR *COM_DATABITS[] =
{
    "7",
    "8",
};

CONST STATIC CHAR *COM_STOP[] =
{
    "1",
    "2",
};

/******************************************************************************
 *                                                                            *
 *    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 _PrintCfg *pMenuCfg;    // priner config data point
STATIC _PrintRecord* pMenuRec;    // printer record

STATIC INT CodePageTotal;
STATIC INT CountryTotal;

STATIC _FileList DramList;
STATIC INT DramFile;

STATIC _FileList FlashList;
STATIC INT FlashFile;

STATIC _FileList CardList;
STATIC INT CardFile;

STATIC BOOL RotateTimes;

STATIC VOID InitialMenu(VOID)
{
    pMenuCfg = GrabPrintConfig();
    pMenuRec = GrabPrintRecord();
    CodePageTotal = GetCodePageTotal();
    CountryTotal = GetCountryTotal();
}

STATIC INT AddItemValue(INT Data, INT Step, INT Max, INT Min)
{
    Data += Step;
    if ( Data > Max )
        Data = Min;
    if ( Data < Min )
        Data = Max;
    return Data;
}

STATIC INT GetPrintOutMode(VOID)
{
    if (pMenuCfg->PrintOutMode == PEEL_MODE)
        return 1;
    else if ( pMenuCfg->PrintOutMode == CUTTER_MODE && pMenuCfg->CutterPieces )
        return 2;
    else if ( pMenuCfg->PrintOutMode == CUTTER_MODE && pMenuCfg->CutterPieces == 0 )
        return 3;
    else
        return 0;
}

STATIC VOID SetPrintOutMode(INT Kind)
{
    if ( Kind > 3 )
        Kind = 0;
    if ( Kind < 0 )
        Kind = 3;

    switch ( Kind )
    {
        case 0:
            pMenuCfg->PrintOutMode = TEAR_MODE;
            break;
        case 1:
            pMenuCfg->PrintOutMode = PEEL_MODE;
            break;
        case 2:
            pMenuCfg->PrintOutMode = CUTTER_MODE;
            pMenuCfg->CutterPieces = 1;
            break;
        case 3:
            pMenuCfg->PrintOutMode = CUTTER_MODE;
            pMenuCfg->CutterPieces = 0;
            break;
    }
}

STATIC INT MenuWaitKey(VOID)
{
    INT Status;

    delay_msec(150);
    while (1)
    {
        if ( CheckKeyPin(FEED_KEY) )
        {
            Status = FEED_KEY;
            break;
        }
        if ( CheckKeyPin(PAUSE_KEY) )
        {
            Status = PAUSE_KEY;
            break;
        }
        if ( CheckKeyPin(MENU_KEY) )
        {
            Status = MENU_KEY;
            break;
        }
    }
    sysprintf("MenuWaitKey\r\n");
    EnableBuzzer(26, 100);
    return Status;
}

STATIC VOID RunMenu(CONST _MenuItem *ItemIndex, INT def, CHAR **Title)
{
    INT Total, Index;
    CHAR buf[20];

    // caculate total item
    Total = 0;
    while ( (ItemIndex + Total)->DspFunc )
        Total += 1;

    if ( ( def < Total ) && (ItemIndex + def)->DspFunc )
        Index = def;
    else
        Index = 0;

    while ( 1 )
    {
        if ( Index >= Total )
            Index = 0;
        if ( Index < 0 )
            Index = Total - 1;

        while ( CheckBuzzerStatus() ){}
        DspClearDisplay();
        sprintf(buf, "%-12s%1d/%1d", *(Title + pMenuCfg->Language), Index + 1, Total);
        ShowLCDString(0, 0, buf, 0);
        if ( (ItemIndex + Index)->DspFunc )
            (ItemIndex + Index)->DspFunc();

        switch ( MenuWaitKey() )
        {
            case MENU_KEY:
                if ( (ItemIndex + Index)->MenuFunc )
                    (ItemIndex + Index)->MenuFunc(&Index);
                else 
                    return;
                break;
            case PAUSE_KEY:
                if ( (ItemIndex + Index)->PauseFunc )
                    (ItemIndex + Index)->PauseFunc(&Index);
                else 
                    return;
                break;
            case FEED_KEY:
                if ( (ItemIndex + Index)->FeedFunc )
                    (ItemIndex + Index)->FeedFunc(&Index);
                else 
                    return;
                break;
        }
    }
}

STATIC VOID EntryMenuFunc(VOID)
{
    WaitWorkJobEnd();

#if defined(CARRIAGE_OPEN_MODEL)
    StopCheckCarriageOpen();
#endif

    StopKeyFunc();
}

STATIC VOID LeaveMenuFunc(VOID)
{
    delay_msec(200);

    GetKey(MENU_KEY);
    GetKey(PAUSE_KEY);
    GetKey(FEED_KEY);

    StartKeyFunc(TRUE);

#if defined(CARRIAGE_OPEN_MODEL)
    StartCheckCarriageOpen();
#endif

}

STATIC VOID MenuNextItem(VOID *Num)
{
    *(INT *)Num += 1;
}

STATIC VOID MenuBackItem(VOID *Num)
{
    *(INT *)Num -= 1;
}

STATIC VOID MenuNULLKey(VOID *Num)
{
    DisableBuzzer();
}

STATIC VOID MenuDspExit(VOID)
{
    ShowLCDString(0, 1, (CHAR *)LCDMessage[MSG_EXIT][pMenuCfg->Language], 0);
}

STATIC VOID MenuSpeedNext(VOID *Num)
{
    pMenuCfg->Speed = AddItemValue(pMenuCfg->Speed, 1, PRINT_SPEED_MAX, PRINT_SPEED_MIN);
}

STATIC VOID MenuSpeedBack(VOID *Num)
{
    pMenuCfg->Speed = AddItemValue(pMenuCfg->Speed, -1, PRINT_SPEED_MAX, PRINT_SPEED_MIN);
}

STATIC VOID MenuDensityNext(VOID *Num)
{
    pMenuCfg->fDensity = (FLOAT)AddItemValue((INT)pMenuCfg->fDensity, 1, DensityMax, DensityMin);
}

STATIC VOID MenuDensityBack(VOID *Num)
{
    pMenuCfg->fDensity = (FLOAT)AddItemValue((INT)pMenuCfg->fDensity, -1, DensityMax, DensityMin);
}

STATIC VOID MenuDirectionNext(VOID *Num)
{
    pMenuCfg->Direction = AddItemValue(pMenuCfg->Direction, 1, 1, 0);
}

STATIC VOID MenuDirectionBack(VOID *Num)
{
    pMenuCfg->Direction = AddItemValue(pMenuCfg->Direction, -1, 1, 0);
}

STATIC VOID MenuPrintOutModeNext(VOID *Num)
{
    SetPrintOutMode( GetPrintOutMode() + 1);
}

STATIC VOID MenuPrintOutModeBack(VOID *Num)
{
    SetPrintOutMode( GetPrintOutMode() - 1);
}

STATIC VOID MenuOffsetNext(VOID *Num)
{
    DisableBuzzer();
    pMenuCfg->OffsetDis = AddItemValue(pMenuCfg->OffsetDis, 1, (INT)TPH_DPI, 0 - (INT)TPH_DPI);
}

STATIC VOID MenuOffsetBack(VOID *Num)
{
    DisableBuzzer();
    pMenuCfg->OffsetDis = AddItemValue(pMenuCfg->OffsetDis, -1, (INT)TPH_DPI, 0 - (INT)TPH_DPI);
}

STATIC VOID MenuReferenceXNext(VOID *Num)
{
    DisableBuzzer();
    pMenuCfg->ReferenceX = AddItemValue(pMenuCfg->ReferenceX, 1, 999, 0);
}

STATIC VOID MenuReferenceXBack(VOID *Num)
{
    DisableBuzzer();
    pMenuCfg->ReferenceX = AddItemValue(pMenuCfg->ReferenceX, -1, 999, 0);
}

STATIC VOID MenuReferenceYNext(VOID *Num)
{
    DisableBuzzer();
    pMenuCfg->ReferenceY = AddItemValue(pMenuCfg->ReferenceY, 1, 999, 0);
}

STATIC VOID MenuReferenceYBack(VOID *Num)
{
    DisableBuzzer();
    pMenuCfg->ReferenceY = AddItemValue(pMenuCfg->ReferenceY, -1, 999, 0);
}

STATIC VOID MenuDspSpeed(VOID)
{
    CHAR Buf[20];

    sprintf(Buf, "%s %s \"/S", LCDMessage[MSG_SPEED][pMenuCfg->Language], ToSpeedString(pMenuCfg->Speed));
    ShowLCDString(0, 1, Buf, 0);
}

STATIC VOID MenuDspDensity(VOID)
{
    CHAR Buf[20];

    sprintf(Buf, "%s %d", LCDMessage[MSG_DENSITY][pMenuCfg->Language], (INT)pMenuCfg->fDensity);
    ShowLCDString(0, 1, Buf, 0);
}

STATIC VOID MenuDspDirection(VOID)
{
    CHAR Buf[20];

    sprintf(Buf, "%s %d", LCDMessage[MSG_DIRECTION][pMenuCfg->Language], pMenuCfg->Direction);
    ShowLCDString(0, 1, Buf, 0);
}

STATIC VOID MenuDspPrintOutMode(VOID)
{
    INT mode = GetPrintOutMode();
    ShowLCDString(0, 1, (CHAR *)LCDMessage[MSG_TEAR_MODE + mode][pMenuCfg->Language], 0);
}

STATIC VOID MenuDspOffset(VOID)
{
    CHAR Buf[20];

    sprintf(Buf, "%s %+04d", LCDMessage[MSG_OFFSET][pMenuCfg->Language], pMenuCfg->OffsetDis);
    ShowLCDString(0, 1, Buf, 0);
}

STATIC VOID MenuDspReferenceY(VOID)
{
    CHAR Buf[20];

    sprintf(Buf, "%s %03d", LCDMessage[MSG_REFERENCE_Y][pMenuCfg->Language], pMenuCfg->ReferenceY);
    ShowLCDString(0, 1, Buf, 0);
}

STATIC VOID MenuDspReferenceX(VOID)
{
    CHAR Buf[20];

    sprintf(Buf, "%s %03d", LCDMessage[MSG_REFERENCE_X][pMenuCfg->Language], pMenuCfg->ReferenceX);
    ShowLCDString(0, 1, Buf, 0);
}

STATIC VOID MenuSetup(VOID *Num)
{
    CONST STATIC _MenuItem MenuItem[] = 
    {
        {MenuDspSpeed,            MenuNextItem,    MenuSpeedNext,            MenuSpeedBack},
        {MenuDspDensity,        MenuNextItem,    MenuDensityNext,        MenuDensityBack},
        {MenuDspDirection,        MenuNextItem,    MenuDirectionNext,        MenuDirectionBack},
        {MenuDspPrintOutMode,    MenuNextItem,    MenuPrintOutModeNext,    MenuPrintOutModeBack},
        {MenuDspOffset,            MenuNextItem,    MenuOffsetNext,            MenuOffsetBack},
        {MenuDspReferenceX,        MenuNextItem,    MenuReferenceXNext,        MenuReferenceXBack},
        {MenuDspReferenceY,        MenuNextItem,    MenuReferenceYNext,        MenuReferenceYBack},
        {MenuDspExit,            MenuNextItem,    _NULL,                    MenuBackItem},
        {_NULL, _NULL, _NULL, _NULL},
    };

    RunMenu(MenuItem , 0, (CHAR **)LCDMessage[MSG_PRINTER]);
}

STATIC VOID MenuManualGapNext(VOID *Num)
{
    pMenuCfg->GapInten = AddItemValue(pMenuCfg->GapInten, 1, GAP_SENSOR_SCALE - 1, 0);
    InitialCalibration();
}

STATIC VOID MenuManualGapBack(VOID *Num)
{
    pMenuCfg->GapInten = AddItemValue(pMenuCfg->GapInten, -1, GAP_SENSOR_SCALE - 1, 0);
    InitialCalibration();
}

STATIC VOID MenuManualBlineNext(VOID *Num)
{
    pMenuCfg->BlineInten = AddItemValue(pMenuCfg->BlineInten, 1, BLINE_SENSOR_SCALE - 1, 0);
    InitialCalibration();
}

STATIC VOID MenuManualBlineBack(VOID *Num)
{
    pMenuCfg->BlineInten = AddItemValue(pMenuCfg->BlineInten, -1, BLINE_SENSOR_SCALE - 1, 0);
    InitialCalibration();
}

STATIC VOID MenuManualRibbonNext(VOID *Num)
{
    pMenuCfg->RibbonInten = AddItemValue(pMenuCfg->RibbonInten, 1, RIBBON_SENSOR_SCALE - 1, 0);
}

STATIC VOID MenuManualRibbonBack(VOID *Num)
{
    pMenuCfg->RibbonInten = AddItemValue(pMenuCfg->RibbonInten, -1, RIBBON_SENSOR_SCALE - 1, 0);
}

STATIC VOID MenuAutoGap(VOID *Num)
{
#ifdef DEBUG_PRNT
sysprintf("Enter MenuAutoGap()...\n"); // ch_20211208
#endif

    LeaveMenuFunc();
    pMenuCfg->SensorMode = GAP_MODE;
    DetectSensorInten(pMenuCfg, TRUE, FALSE, 0, 0);
    EntryMenuFunc();
}

STATIC VOID MenuAutoBline(VOID *Num)
{
#ifdef DEBUG_PRNT
sysprintf("Enter MenuAutoBline()...\n"); // ch_20211208    
#endif

    LeaveMenuFunc();
    pMenuCfg->SensorMode = BLINE_MODE;
    DetectSensorInten(pMenuCfg, TRUE, FALSE, 0, 0);
    EntryMenuFunc();
}

STATIC VOID MenuAutoRibbon(VOID *Num)
{
    DetectRibbonInten();
}

STATIC VOID DspGapSensor(VOID)
{
    STATIC INT PreSignal = SENSOR_FLOATING;
    INT Signal;
    CHAR Buf[20];

    Signal = GetSensorSignal(GAP_SENSOR);
    if ( PreSignal == Signal )
        return;

    PreSignal = Signal;
    if ( Signal == SENSOR_DETECTED )
        sprintf(Buf, "%-11s", LCDMessage[MSG_THROUGH][pMenuCfg->Language]);
    else
        sprintf(Buf, "%-11s", LCDMessage[MSG_NOT_THROUGH][pMenuCfg->Language]);

    ShowLCDString(4, 1, Buf, 0);
}

STATIC VOID DspBlineSensor(VOID)
{
    STATIC INT PreSignal = SENSOR_FLOATING;
    INT Signal;
    CHAR Buf[20];

    Signal = GetSensorSignal(BLINE_SENSOR);
    if ( PreSignal == Signal )
        return;

    PreSignal = Signal;
    if ( Signal == SENSOR_DETECTED )
        sprintf(Buf, "%-11s", LCDMessage[MSG_REFLECTED][pMenuCfg->Language]);
    else
        sprintf(Buf, "%-11s", LCDMessage[MSG_NOT_REFLECTE][pMenuCfg->Language]);

    ShowLCDString(4, 1, Buf, 0);
}

STATIC VOID DspRibbonSensor(VOID)
{
    STATIC INT PreSignal = SENSOR_FLOATING;
    INT Signal;
    CHAR Buf[20];

    Signal = GetSensorSignal(RIBBON_SENSOR);
    if ( PreSignal == Signal )
        return;

    PreSignal = Signal;
    if ( Signal == SENSOR_DETECTED )
        sprintf(Buf, "%-11s", LCDMessage[MSG_THROUGH][pMenuCfg->Language]);
    else
        sprintf(Buf, "%-11s", LCDMessage[MSG_NOT_THROUGH][pMenuCfg->Language]);

    ShowLCDString(4, 1, Buf, 0);

}

STATIC VOID MenuDspManualGap(VOID)
{
    CHAR Buf[20];

    EnableSensor(GAP_SENSOR, pMenuCfg->GapInten, pMenuCfg->RibbonFlag, HALF_AD_SCALE);

    CancelPeriodFunc(DspGapSensor);

    DspClearLine(0, LCD_LANG_ENG);
    ShowLCDString(0, 0, (CHAR *)LCDMessage[MSG_MANUAL_GAP][pMenuCfg->Language], 0);

    if ( GetSensorSignal(GAP_SENSOR) == SENSOR_DETECTED )
        sprintf(Buf, "%03d %s", pMenuCfg->GapInten, LCDMessage[MSG_THROUGH][pMenuCfg->Language]);
    else
        sprintf(Buf, "%03d %s", pMenuCfg->GapInten, LCDMessage[MSG_NOT_THROUGH][pMenuCfg->Language]);

    ShowLCDString(0, 1, Buf, 0);

    StartPeriodFunc(DspGapSensor);
}

STATIC VOID MenuDspManualBline(VOID)
{
    CHAR Buf[20];

    EnableSensor(BLINE_SENSOR, pMenuCfg->BlineInten, pMenuCfg->RibbonFlag, HALF_AD_SCALE);

    CancelPeriodFunc(DspBlineSensor);

    DspClearLine(0, LCD_LANG_ENG);
    ShowLCDString(0, 0, (CHAR *)LCDMessage[MSG_MANUAL_BLINE][pMenuCfg->Language], 0);

    if ( GetSensorSignal(BLINE_SENSOR) == SENSOR_DETECTED )
        sprintf(Buf, "%03d %s", pMenuCfg->BlineInten, LCDMessage[MSG_REFLECTED][pMenuCfg->Language]);
    else
        sprintf(Buf, "%03d %s", pMenuCfg->BlineInten, LCDMessage[MSG_NOT_REFLECTE][pMenuCfg->Language]);

    ShowLCDString(0, 1, Buf, 0);

    StartPeriodFunc(DspBlineSensor);
}

STATIC VOID MenuDspManualRibbon(VOID)
{
    CHAR Buf[20];

    EnableSensor(RIBBON_SENSOR, pMenuCfg->RibbonInten, 0, HALF_AD_SCALE);

    CancelPeriodFunc(DspRibbonSensor);

    DspClearLine(0, LCD_LANG_ENG);
    ShowLCDString(0, 0, (CHAR *)LCDMessage[MSG_MANUAL_RIBBON][pMenuCfg->Language], 0);

    if ( GetSensorSignal(RIBBON_SENSOR) == SENSOR_DETECTED )
        sprintf(Buf, "%03d %s", pMenuCfg->RibbonInten, LCDMessage[MSG_THROUGH][pMenuCfg->Language]);
    else
        sprintf(Buf, "%03d %s", pMenuCfg->RibbonInten, LCDMessage[MSG_NOT_THROUGH][pMenuCfg->Language]);

    ShowLCDString(0, 1, Buf, 0);

    StartPeriodFunc(DspRibbonSensor);
}

STATIC VOID MenuDspAutoGap(VOID)
{
    ShowLCDString(0, 1, (CHAR *)LCDMessage[MSG_AUTO_GAP][pMenuCfg->Language], 0);
}

STATIC VOID MenuDspAutoBline(VOID)
{
    DisableSensor(GAP_SENSOR);
    CancelPeriodFunc(DspGapSensor);
    ShowLCDString(0, 1, (CHAR *)LCDMessage[MSG_AUTO_BLINE][pMenuCfg->Language], 0);
}

STATIC VOID MenuDspAutoRibbon(VOID)
{
    DisableSensor(BLINE_SENSOR);
    CancelPeriodFunc(DspBlineSensor);
    ShowLCDString(0, 1, (CHAR *)LCDMessage[MSG_AUTO_RIBBON][pMenuCfg->Language], 0);
}

STATIC VOID MenuDspSensorExit(VOID)
{
    DisableSensor(RIBBON_SENSOR);
    CancelPeriodFunc(DspRibbonSensor);
    ShowLCDString(0, 1, (CHAR *)LCDMessage[MSG_EXIT][pMenuCfg->Language], 0);
}

STATIC VOID MenuSensor(VOID *Num)
{
    CONST STATIC _MenuItem MenuItem[] = 
    {
        {MenuDspAutoGap,        MenuNextItem,    MenuAutoGap,            MenuNULLKey},
        {MenuDspManualGap,        MenuNextItem,    MenuManualGapNext,        MenuManualGapBack},
        {MenuDspAutoBline,        MenuNextItem,    MenuAutoBline,            MenuNULLKey},
        {MenuDspManualBline,    MenuNextItem,    MenuManualBlineNext,    MenuManualBlineBack},
        {MenuDspAutoRibbon,        MenuNextItem,    MenuAutoRibbon,            MenuNULLKey},
        {MenuDspManualRibbon,    MenuNextItem,    MenuManualRibbonNext,    MenuManualRibbonBack},
        {MenuDspSensorExit,        MenuNextItem,    _NULL,                    MenuBackItem},
        {_NULL, _NULL, _NULL, _NULL},
    };

    RunMenu(MenuItem , 0, (CHAR **)LCDMessage[MSG_SENSOR]);
}

STATIC VOID MenuLanguageNext(VOID *Num)
{
    pMenuCfg->Language = AddItemValue(pMenuCfg->Language, 1, LANGUAGE_TOTAL - 1, 0);
}

STATIC VOID MenuLanguageBack(VOID *Num)
{
    pMenuCfg->Language = AddItemValue(pMenuCfg->Language, -1, LANGUAGE_TOTAL - 1, 0);
}

STATIC VOID MenuCodePageNext(VOID *Num)
{
    pMenuCfg->CodePage = AddItemValue(pMenuCfg->CodePage, 1, CodePageTotal - 1, 0);
}

STATIC VOID MenuCodePageBack(VOID *Num)
{
    pMenuCfg->CodePage = AddItemValue(pMenuCfg->CodePage, -1, CodePageTotal - 1, 0);
}

STATIC VOID MenuCountryNext(VOID *Num)
{
    pMenuCfg->Country = AddItemValue(pMenuCfg->Country, 1, CountryTotal - 1, 0);
}

STATIC VOID MenuCountryBack(VOID *Num)
{
    pMenuCfg->Country = AddItemValue(pMenuCfg->Country, -1, CountryTotal - 1, 0);
}

STATIC VOID MenuBaudNext(VOID *Num)
{
    pMenuCfg->UartSetting.Baud = AddItemValue(pMenuCfg->UartSetting.Baud, 1, UART_BAUD_38400, UART_BAUD_2400);
}

STATIC VOID MenuBaudBack(VOID *Num)
{
    pMenuCfg->UartSetting.Baud = AddItemValue(pMenuCfg->UartSetting.Baud, -1, UART_BAUD_38400, UART_BAUD_2400);
}

STATIC VOID MenuParityNext(VOID *Num)
{
    pMenuCfg->UartSetting.Parity = AddItemValue(pMenuCfg->UartSetting.Parity, 1, UART_PARITY_EVEN, UART_PARITY_NONE);
}

STATIC VOID MenuParityBack(VOID *Num)
{
    pMenuCfg->UartSetting.Parity = AddItemValue(pMenuCfg->UartSetting.Parity, -1, UART_PARITY_EVEN, UART_PARITY_NONE);
}

STATIC VOID MenuDataBitsNext(VOID *Num)
{
    pMenuCfg->UartSetting.DataBits = AddItemValue(pMenuCfg->UartSetting.DataBits, 1, UART_DATA_8, UART_DATA_7);
}

STATIC VOID MenuDataBitsBack(VOID *Num)
{
    pMenuCfg->UartSetting.DataBits = AddItemValue(pMenuCfg->UartSetting.DataBits, -1, UART_DATA_8, UART_DATA_7);
}

STATIC VOID MenuStopBitsNext(VOID *Num)
{
    pMenuCfg->UartSetting.Stop = AddItemValue(pMenuCfg->UartSetting.Stop, 1, UART_STOP_TWO, UART_STOP_ONE);
}

STATIC VOID MenuStopBitsBack(VOID *Num)
{
    pMenuCfg->UartSetting.Stop = AddItemValue(pMenuCfg->UartSetting.Stop, -1, UART_STOP_TWO, UART_STOP_ONE);
}

STATIC VOID MenuDspBaudRate(VOID)
{
    CHAR Buf[20];

    sprintf(Buf, "%s %s", LCDMessage[MSG_BAUD_RATE][pMenuCfg->Language], COM_BAUD_FULL[pMenuCfg->UartSetting.Baud]);
    ShowLCDString(0, 1, Buf, 0);
}

STATIC VOID MenuDspParity(VOID)
{
    if ( pMenuCfg->UartSetting.Parity == 0 )
        ShowLCDString(0, 1, (CHAR *)LCDMessage[MSG_PARITY_NONE][pMenuCfg->Language], 0);
    if ( pMenuCfg->UartSetting.Parity == 1 )
        ShowLCDString(0, 1, (CHAR *)LCDMessage[MSG_PARITY_ODD][pMenuCfg->Language], 0);
    if ( pMenuCfg->UartSetting.Parity == 2 )
        ShowLCDString(0, 1, (CHAR *)LCDMessage[MSG_PARITY_EVEN][pMenuCfg->Language], 0);
}

STATIC VOID MenuDspDataBits(VOID)
{
    CHAR Buf[20];

    sprintf(Buf, "%s %s", LCDMessage[MSG_DATA_BITS][pMenuCfg->Language], COM_DATABITS[pMenuCfg->UartSetting.DataBits]);
    ShowLCDString(0, 1, Buf, 0);
}

STATIC VOID MenuDspStopBits(VOID)
{
    CHAR Buf[20];

    sprintf(Buf, "%s %s", LCDMessage[MSG_STOP_BITS][pMenuCfg->Language], COM_STOP[pMenuCfg->UartSetting.Stop]);
    ShowLCDString(0, 1, Buf, 0);
}

STATIC VOID MenuRS232Setup(VOID *Num)
{
    CONST STATIC _MenuItem MenuItem[] = 
    {
        {MenuDspBaudRate,    MenuNextItem,    MenuBaudNext,        MenuBaudBack},
        {MenuDspParity,        MenuNextItem,    MenuParityNext,        MenuParityBack},
        {MenuDspDataBits,    MenuNextItem,    MenuDataBitsNext,    MenuDataBitsBack},
        {MenuDspStopBits,    MenuNextItem,    MenuStopBitsNext,    MenuStopBitsBack},
        {MenuDspExit,        MenuNextItem,    _NULL,                MenuBackItem},
        {_NULL, _NULL, _NULL, _NULL},
    };

    RunMenu(MenuItem , 0, (CHAR **)LCDMessage[MSG_RS232_SETUP]);

    UartSetting(pMenuCfg->UartSetting);
}

STATIC VOID MenuRestoreDef(VOID *Num)
{
    InitialDefaultVar();
}

STATIC VOID MenuDspLanguage(VOID)
{
    CHAR Buf[20];

    sprintf(Buf, "%s %s", LCDMessage[MSG_LANG][pMenuCfg->Language], LCDMessage[MSG_LANG_DATA][pMenuCfg->Language]);
    ShowLCDString(0, 1, Buf, 0);
}

STATIC VOID MenuDspCodePage(VOID)
{
    CHAR Buf[20];

    sprintf(Buf, "%s %s", LCDMessage[MSG_CODEPAGE][pMenuCfg->Language], CodePageNameTable[pMenuCfg->CodePage]);
    ShowLCDString(0, 1, Buf, 0);
}

STATIC VOID MenuDspCountry(VOID)
{
    CHAR Buf[20];

    sprintf(Buf, "%s %s", LCDMessage[MSG_COUNTRY][pMenuCfg->Language], CountryNameTable[pMenuCfg->Country]);
    ShowLCDString(0, 1, Buf, 0);
}

STATIC VOID MenuDspRS232Setup(VOID)
{
    ShowLCDString(0, 1, (CHAR *)LCDMessage[MSG_RS232_SETUP][pMenuCfg->Language], 0);
}

STATIC VOID MenuDspRestoreDef(VOID)
{
    ShowLCDString(0, 1, (CHAR *)LCDMessage[MSG_RESTORE][pMenuCfg->Language], 0);
}

STATIC VOID MenuSystem(VOID *Num)
{
    CONST STATIC _MenuItem MenuItem[] = 
    {
        {MenuDspLanguage,    MenuNextItem,    MenuLanguageNext,    MenuLanguageBack},
        {MenuDspCodePage,    MenuNextItem,    MenuCodePageNext,    MenuCodePageBack},
        {MenuDspCountry,    MenuNextItem,    MenuCountryNext,    MenuCountryBack},
        {MenuDspRS232Setup,    MenuNextItem,    MenuRS232Setup,        MenuNULLKey},
        {MenuDspRestoreDef,    MenuNextItem,    MenuRestoreDef,        MenuNULLKey},
        {MenuDspExit,        MenuNextItem,    _NULL,                MenuBackItem},
        {_NULL, _NULL, _NULL, _NULL},
    };

    RunMenu(MenuItem , 0, (CHAR **)LCDMessage[MSG_SYSTEM]);
}

STATIC VOID MenuDspDram(VOID)
{
    CHAR Buf[20];

    sprintf(Buf, "%-15s", LCDMessage[MSG_DRAM_FILE_LIST][pMenuCfg->Language]);
    ShowLCDString(0, 0, Buf, 0);
    if ( DramFile )
    {
        sprintf(Buf, "%-15s", DramList.FileName);
        ShowLCDString(0, 1, Buf, 0);
    }
    else
        ShowLCDString(0, 1, (CHAR *)LCDMessage[MSG_NO_FILE][pMenuCfg->Language], 0);
}

STATIC VOID MenuDramNextFile(VOID *Num)
{
    if ( DramFile )
    {
        if ( !NextFile(&DramList, "*.*") )
        {
            OpenList(&DramList, DRAM_DEVICE);
            DramFile = NextFile(&DramList, "*.*");
            *(INT *)Num += 1;
        }
    }
    else
        *(INT *)Num += 1;
}

STATIC VOID MenuDramNextItem(VOID *Num)
{
    OpenList(&DramList, DRAM_DEVICE);
    DramFile = NextFile(&DramList, "*.*");
    *(INT *)Num += 1;
}

STATIC VOID MenuDspFlash(VOID)
{
    CHAR Buf[20];

    sprintf(Buf, "%-15s", LCDMessage[MSG_FLASH_FILE_LIST][pMenuCfg->Language]);
    ShowLCDString(0, 0, Buf, 0);
    if ( FlashFile )
    {
        sprintf(Buf, "%-15s", FlashList.FileName);
        ShowLCDString(0, 1, Buf, 0);
    }
    else
        ShowLCDString(0, 1, (CHAR *)LCDMessage[MSG_NO_FILE][pMenuCfg->Language], 0);
}

STATIC VOID MenuFlashNextFile(VOID *Num)
{
    if ( FlashFile )
    {
        if ( !NextFile(&FlashList, "*.*") )
        {
            OpenList(&FlashList, FLASH_DEVICE);
            FlashFile = NextFile(&FlashList, "*.*");
            *(INT *)Num += 1;
        }
    }
    else
        *(INT *)Num += 1;
}

STATIC VOID MenuFlashNextItem(VOID *Num)
{
    OpenList(&FlashList, FLASH_DEVICE);
    FlashFile = NextFile(&FlashList, "*.*");
    *(INT *)Num += 1;
}

STATIC VOID MenuDspCard(VOID)
{
    CHAR Buf[20];

    ShowLCDString(0, 0, "CARD File List ", 0);
    if ( CardFile )
    {
        sprintf(Buf, "%-15s", CardList.FileName);
        ShowLCDString(0, 1, Buf, 0);
    }
    else
        ShowLCDString(0, 1, (CHAR *)LCDMessage[MSG_NO_FILE][pMenuCfg->Language], 0);
}

STATIC VOID MenuCardNextFile(VOID *Num)
{
    if ( CardFile )
    {
        if ( !NextFile(&CardList, "*.*") )
        {
            OpenList(&CardList, CARD_DEVICE);
            CardFile = NextFile(&CardList, "*.*");
            *(INT *)Num += 1;
        }
    }
    else
        *(INT *)Num += 1;
}

STATIC VOID MenuCardNextItem(VOID *Num)
{
    OpenList(&CardList, CARD_DEVICE);
    CardFile = NextFile(&CardList, "*.*");
    *(INT *)Num += 1;
}

STATIC VOID MenuFileListNext(VOID *Num)
{
    CONST STATIC _MenuItem MenuItem[] = 
    {
        {MenuDspDram,    MenuDramNextFile,    MenuDramNextItem,    _NULL},
        {MenuDspFlash,    MenuFlashNextFile,    MenuFlashNextItem,    _NULL},
        {_NULL, _NULL, _NULL, _NULL},
    };

    CONST STATIC _MenuItem MenuItemCard[] = 
    {
        {MenuDspDram,    MenuDramNextFile,    MenuDramNextItem,    _NULL},
        {MenuDspFlash,    MenuFlashNextFile,    MenuFlashNextItem,    _NULL},
        {MenuDspCard,    MenuCardNextFile,    MenuCardNextItem,    _NULL},
        {_NULL, _NULL, _NULL, _NULL},
    };

    OpenList(&DramList, DRAM_DEVICE);
    DramFile = NextFile(&DramList, "*.*");
    OpenList(&FlashList, FLASH_DEVICE);
    FlashFile = NextFile(&FlashList, "*.*");
    OpenList(&CardList, CARD_DEVICE);
    CardFile = NextFile(&CardList, "*.*");

#if defined(FLASH_MCARD_MODEL) || defined(SDCARD_MODEL )
    if ( IsCardDevice() )
        RunMenu(MenuItemCard, 0, (CHAR **)LCDMessage[MSG_NULL_STR]);
    else
#endif
        RunMenu(MenuItem , 0, (CHAR **)LCDMessage[MSG_NULL_STR]);
}

STATIC VOID MenuDspAvailDram(VOID)
{
    CHAR Buf[20];

    sprintf(Buf,"%-15s",LCDMessage[MSG_DRAM][pMenuCfg->Language]);
    ShowLCDString(0, 0, Buf, 0);
    sprintf(Buf,"%d %s", FreeSpace(DRAM_DEVICE) , LCDMessage[MSG_KB_FREE][pMenuCfg->Language]);
    ShowLCDString(0, 1, Buf, 0);
}

STATIC VOID MenuDspAvailFlash(VOID)
{
    CHAR Buf[20];

    sprintf(Buf,"%-15s",LCDMessage[MSG_FLASH][pMenuCfg->Language]);
    ShowLCDString(0, 0, Buf, 0);
    sprintf(Buf,"%d %s", FreeSpace(FLASH_DEVICE) , LCDMessage[MSG_KB_FREE][pMenuCfg->Language]);
    ShowLCDString(0, 1, Buf, 0);
}

STATIC VOID MenuDspExtAvailFlash(VOID)
{
    CHAR Buf[20];

    sprintf(Buf,"%-15s",LCDMessage[MSG_MEMORY_CARD][pMenuCfg->Language]);
    ShowLCDString(0, 0, Buf, 0);
    sprintf(Buf,"%d %s", FreeSpace(CARD_DEVICE) , LCDMessage[MSG_KB_FREE][pMenuCfg->Language]);
    ShowLCDString(0, 1, Buf, 0);
}

STATIC VOID MenuAvailMemory(VOID *Num)
{
    CONST STATIC _MenuItem MenuItem[] = 
    {
        {MenuDspAvailDram,        MenuNULLKey,    MenuNextItem,    MenuNextItem},
        {MenuDspAvailFlash,        MenuNULLKey,    MenuNextItem,    MenuNextItem},
        {MenuDspExtAvailFlash,    MenuNULLKey,    _NULL,            _NULL},
        {_NULL, _NULL, _NULL, _NULL},
    };

    RunMenu(MenuItem , 0, (CHAR **)LCDMessage[MSG_NULL_STR]);
}

STATIC INT MenuKeyYesNo(VOID)
{
    INT Key;

    DspClearDisplay();
    ShowLCDString(0, 0, (CHAR *)LCDMessage[MSG_PAUSE_YES][pMenuCfg->Language], 0);
    ShowLCDString(0, 1, (CHAR *)LCDMessage[MSG_FEED_NO][pMenuCfg->Language], 0);
    
    while (1)
    {
        Key = MenuWaitKey();
        if ( Key == PAUSE_KEY )
        {
            Key = TRUE;
            break;
        }
        else if ( Key == FEED_KEY )
        {
            Key = FALSE;
            break;
        }
        DisableBuzzer();
    }
    while ( CheckBuzzerStatus() ){}
    return Key;
}

STATIC VOID MenuDeleteFiles(VOID *Num)
{
    INT Key;

    while ( CheckBuzzerStatus() ){}
    DspClearDisplay();

#if defined(FLASH_MCARD_MODEL) || defined(SDCARD_MODEL )
    if ( IsCardDevice() )
    {
        ShowLCDString(0, 0, "PAUSE:FLASH ALL ", 0);
        ShowLCDString(0, 1, "FEED:M.CARD ALL ", 0);
    }
    else
#endif

    {
        ShowLCDString(0, 0, (CHAR *)LCDMessage[MSG_PAUSE_FLASH_ALL][pMenuCfg->Language], 0);
        ShowLCDString(0, 1, (CHAR *)LCDMessage[MSG_FEED_EXIT][pMenuCfg->Language], 0);
    }
    while (1)
    {
        Key = MenuWaitKey();
        if ( Key == PAUSE_KEY || Key == FEED_KEY )
            break;
        DisableBuzzer();
    }
    while ( CheckBuzzerStatus() ){}

    if ( Key == PAUSE_KEY )
    {
        if ( MenuKeyYesNo() )
        {
            ErasingFile(DRAM_DEVICE,  "*");
            ErasingFile(FLASH_DEVICE, "*");
        }
    }

#if defined(FLASH_MCARD_MODEL) || defined(SDCARD_MODEL )
    else if ( Key == FEED_KEY && IsCardDevice() )
    {
        if ( MenuKeyYesNo() )
        {
            ErasingFile(DRAM_DEVICE, "*");
            ErasingFile(CARD_DEVICE, "*");
        }
    }
#endif

}

STATIC VOID MenuDspFileList(VOID)
{
    ShowLCDString(0, 1, (CHAR *)LCDMessage[MSG_FILE_LIST][pMenuCfg->Language], 0);
}

STATIC VOID MenuDspAvailMemory(VOID)
{
    ShowLCDString(0, 1, (CHAR *)LCDMessage[MSG_AVAIL_MEM][pMenuCfg->Language], 0);
}

STATIC VOID MenuDspDeleteFiles(VOID)
{
    ShowLCDString(0, 1, (CHAR *)LCDMessage[MSG_DELETE_FILE][pMenuCfg->Language], 0);
}

STATIC VOID MenuFileManager(VOID *Num)
{
    CONST STATIC _MenuItem MenuItem[] = 
    {
        {MenuDspFileList,        MenuNextItem,    MenuFileListNext,    MenuFileListNext},
        {MenuDspAvailMemory,    MenuNextItem,    MenuAvailMemory,    MenuNULLKey},
        {MenuDspDeleteFiles,    MenuNextItem,    MenuDeleteFiles,    MenuNULLKey},
        {MenuDspExit,            MenuNextItem,    _NULL,                MenuBackItem},
        {_NULL, _NULL, _NULL, _NULL},
    };

    RunMenu(MenuItem , 0, (CHAR **)LCDMessage[MSG_FILE]);
}

STATIC VOID MenuPrintCfg(VOID *Num)
{
    REPORT *Report;

    LeaveMenuFunc();
    Report = SelfTestReport(NULL, FALSE, OUTPUT_LABEL);
#if defined(NUTNET)
    if (GetThreadByName("ethernet"))
        Report = IpConfigReport(Report, FALSE, OUTPUT_LABEL);
#endif
    FileReport(Report, TRUE, OUTPUT_LABEL);
    EntryMenuFunc();
}

STATIC VOID MenuDumpMode(VOID *Num)
{
    LeaveMenuFunc();
    HexDumpMode();
    EntryMenuFunc();
}

STATIC VOID MenuRotateCutter(VOID *Num)
{
    LeaveMenuFunc();
    while ( CutterClear() == CUTTER_CUTTING ){}
    EntryMenuFunc();
}

STATIC VOID DecRotateTimes(VOID)
{
    RotateTimes -= 1;
}

STATIC VOID MenuRotateMotor(VOID *Num)
{
    while ( CheckBuzzerStatus() ){}
    DspClearDisplay();
    ShowMessage(0,0, MSG_MENU_FWD, 0);
    ShowMessage(0,1, MSG_PAUSE_REV, 0);

    RotateTimes = 0;
    while ( CheckKeyPin(MENU_KEY) || CheckKeyPin(PAUSE_KEY) || CheckKeyPin(FEED_KEY) ){}
    while ( 1 )
    {
        if ( RotateTimes > 1 ){}
        else if ( CheckKeyPin(MENU_KEY) )
        {
            RotateTimes += 1;
            MotorMove((LONG)TPH_DPI>>4, pMenuCfg, MOTOR_FORWARD, DecRotateTimes);
        }
        else if ( CheckKeyPin(PAUSE_KEY) )
        {
            RotateTimes += 1;
            MotorMove((LONG)TPH_DPI>>4, pMenuCfg, MOTOR_BACKWARD, DecRotateTimes);
        }
        else if ( CheckKeyPin(FEED_KEY) )
            break;
    }
}

STATIC VOID MenuDspMileageValue(VOID)
{
    CHAR Buf[20];

    sprintf(Buf,"%-15s",LCDMessage[MSG_MILEAGE][pMenuCfg->Language]);
    ShowLCDString(0, 0, Buf, 0);
    sprintf(Buf,"     %010d", pMenuRec->DotMilage / (INT)(MM_DOT * 1000));
    ShowLCDString(0, 1, Buf, 0);
}

STATIC VOID MenuDspLabelValue(VOID)
{
    CHAR Buf[20];

    sprintf(Buf,"%-15s", LCDMessage[MSG_LABEL][pMenuCfg->Language]);
    ShowLCDString(0, 0, Buf, 0);
    sprintf(Buf,"     %010d", pMenuRec->LabelMilage);
    ShowLCDString(0, 1, Buf, 0);
}

STATIC VOID MenuMileageInfo(VOID *Num)
{
    CONST STATIC _MenuItem MenuItem[] = 
    {
        {MenuDspMileageValue,    MenuNULLKey,    MenuNextItem,    MenuNextItem},
        {MenuDspLabelValue,        MenuNULLKey,    _NULL,            _NULL},
        {_NULL, _NULL, _NULL, _NULL},
    };
    
    RunMenu(MenuItem , 0, (CHAR **)LCDMessage[MSG_NULL_STR]);
}

STATIC VOID MenuDspPrintCfg(VOID)
{
    ShowLCDString(0, 1, (CHAR *)LCDMessage[MSG_PRINTER_CFG][pMenuCfg->Language], 0);
}

STATIC VOID MenuDspDumpMode(VOID)
{
    ShowLCDString(0, 1, (CHAR *)LCDMessage[MSG_DUMPMODE][pMenuCfg->Language], 0);
}

STATIC VOID MenuDspCutter(VOID)
{
    ShowLCDString(0, 1, (CHAR *)LCDMessage[MSG_ROTATE_CUTTER][pMenuCfg->Language], 0);
}

STATIC VOID MenuDspMotor(VOID)
{
    ShowLCDString(0, 1, (CHAR *)LCDMessage[MSG_ROTATE_MOTOR][pMenuCfg->Language], 0);
}

STATIC VOID MenuDspMileage(VOID)
{
    ShowLCDString(0, 1, (CHAR *)LCDMessage[MSG_MILEAGE_INFO][pMenuCfg->Language], 0);
}

STATIC VOID MenuPrinterTest(VOID *Num)
{
    CONST STATIC _MenuItem MenuItem[] = 
    {
        {MenuDspPrintCfg,    MenuNextItem,    MenuPrintCfg,        MenuNULLKey},
        {MenuDspDumpMode,    MenuNextItem,    MenuDumpMode,        MenuNULLKey},
        {MenuDspCutter,        MenuNextItem,    MenuRotateCutter,    MenuNULLKey},
        {MenuDspMotor,        MenuNextItem,    MenuRotateMotor,    MenuNULLKey},
        {MenuDspMileage,    MenuNextItem,    MenuMileageInfo,    MenuNULLKey},
        {MenuDspExit,        MenuNextItem,    _NULL,                MenuBackItem},
        {_NULL, _NULL, _NULL, _NULL},
    };

    RunMenu(MenuItem , 0, (CHAR **)LCDMessage[MSG_TEST]);
}

STATIC VOID MenuDspPrinterSetup(VOID)
{
    ShowLCDString(0, 1, (CHAR *)LCDMessage[MSG_PRINTER_SETUP][pMenuCfg->Language], 0);
}

STATIC VOID MenuDspSensorCalib(VOID)
{
    ShowLCDString(0, 1, (CHAR *)LCDMessage[MSG_SENSOR_CALIB][pMenuCfg->Language], 0);
}

STATIC VOID MenuDspSystemSetup(VOID)
{
    ShowLCDString(0, 1, (CHAR *)LCDMessage[MSG_SYSTEM_SETUP][pMenuCfg->Language], 0);
}

STATIC VOID MenuDspFileManage(VOID)
{
    ShowLCDString(0, 1, (CHAR *)LCDMessage[MSG_FILE_MANAGE][pMenuCfg->Language], 0);
}

STATIC VOID MenuDspPrinterTest(VOID)
{
    ShowLCDString(0, 1, (CHAR *)LCDMessage[MSG_PRINTER_TEST][pMenuCfg->Language], 0);
}

VOID MainMenu(VOID)
{
    CONST STATIC _MenuItem MenuItem[] = 
    {
        {MenuDspPrinterSetup,    MenuNextItem,    MenuSetup,            MenuBackItem},
        {MenuDspSensorCalib,    MenuNextItem,    MenuSensor,            MenuBackItem},
        {MenuDspSystemSetup,    MenuNextItem,    MenuSystem,            MenuBackItem},
        {MenuDspFileManage,        MenuNextItem,    MenuFileManager,    MenuBackItem},
        {MenuDspPrinterTest,    MenuNextItem,    MenuPrinterTest,    MenuBackItem},
        {MenuDspExit,            MenuNextItem,    _NULL,                MenuBackItem},
        {_NULL, _NULL, _NULL, _NULL},
    };

    ClrDisplayStatus(DIS_READY);

    EntryMenuFunc();

    InitialMenu();
    sysprintf("MainMenu2\r\n");
    EnableBuzzer(26, 100);
    while ( CheckBuzzerStatus() ){}

    DspClearDisplay();

    RunMenu(MenuItem , 0, (CHAR **)LCDMessage[MSG_MAIN_MENU]);

    LeaveMenuFunc();

    SetDisplayStatus(DIS_READY);
}

#endif

MenuVer3.c   、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、

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

#define MENUVER3_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 <string.h>
#include <stdlib.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 "XTask.h"
#include "XADC.h"
#include "XLED.h"
#include "XLCD.h"
#include "XRTC.h"
#include "XKey.h"
#include "XBuzzer.h"
#include "XTimer.h"
#include "XFileSys.h"
#include "XProFile.h"
#include "XVarBank.h"
#include "XDisplay.h"
#include "XCodePage.h"
#include "XFunction.h"
#include "Parser.h"
#include "ParserUtil.h"
#include "Zpl2\Zpl2Report.h"
#include "Zpl2\Zpl2Control.h"
#include "Tspl\TsplFunc.h"
#include "Tspl\TsplUtil.h"
#include "Bsc\BscReport.h"
#include "Menu.h"

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

#if defined(TTP2410M)
#define MENU_SPEED_MAX        12
#define MENU_SPEED_MIN        4

#elif defined(TTP246MP)
#define MENU_SPEED_MAX        8
#define MENU_SPEED_MIN        4

#elif defined(TTP346M)
#define MENU_SPEED_MAX        8
#define MENU_SPEED_MIN        3

#elif defined(TTP344MP)
#define MENU_SPEED_MAX        6
#define MENU_SPEED_MIN        3

#elif defined(TTP644M)
#define MENU_SPEED_MAX        4
#define MENU_SPEED_MIN        2

#elif defined(TTP384M) || defined(DL9000)
#define MENU_SPEED_MAX        4
#define MENU_SPEED_MIN        2

#endif

#if defined(LCD_MODEL) && defined(MENU_TSPL_3)

#define SET_ITEM_EXIT        0x80000000

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

typedef struct
{
    CHAR **tag;
    VOID (*func)(VOID);
}_MenuItem;

typedef struct
{
    CHAR **tag;
    INT    num;
}_SetItem;

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

STATIC CONST BYTE IcoPrev[] = {0x00,0x10,0x18,0x7c,0x7e,0x7c,0x18,0x10};    // Prev icon
STATIC CONST BYTE IcoNext[] = {0x00,0x08,0x18,0x3e,0x7e,0x3e,0x18,0x08};    // Next icon

/******************************************************************************
 *                                                                            *
 *    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 _PrintCfg *pMenuCfg;    // priner config data point
STATIC _PrintRecord* pMenuRec;    // printer record

STATIC INT CodePageTotal;
STATIC INT CountryTotal;

STATIC BOOL WriteProtect;
STATIC BOOL WritePassword;

STATIC BOOL ExitMenu;
STATIC BOOL ExitFile;

STATIC BOOL FileRunning;

STATIC VOID InitialMenu(VOID)
{
    CHAR Buf[128];

    pMenuCfg = GrabPrintConfig();
    pMenuRec = GrabPrintRecord();

    CodePageTotal = GetCodePageTotal();
    CountryTotal  = GetCountryTotal();

    WriteProtect  = FALSE;
    WritePassword = FALSE;
    if (GetProfileString("MENU WR PROTECT", Buf))
    {
        if (strcmp("ENABLE", Buf) == 0)
            WriteProtect  = TRUE;
        if (strcmp("PASSWORD", Buf) == 0)
            WritePassword = TRUE;
    }
}

STATIC BOOL EntryMenuFunc(VOID)
{
    WaitWorkJobEnd();

#if defined(CARRIAGE_OPEN_MODEL)
    StopCheckCarriageOpen();
#endif

    return StopKeyFunc();
}

STATIC VOID LeaveMenuFunc(BOOL EnableKey)
{
    delay_msec(200);

    GetKey(MENU_KEY);
    GetKey(PAUSE_KEY);
    GetKey(FEED_KEY);

    GetKey(UP_KEY);
    GetKey(DOWN_KEY);
    GetKey(SELECT_KEY);

    StartKeyFunc(EnableKey);

#if defined(CARRIAGE_OPEN_MODEL)
    StartCheckCarriageOpen();
#endif
}

STATIC INT MenuWaitKey(VOID)
{
    STATIC INT interval = 150;
    INT key;

    delay_msec(interval);
    while (1)
    {
        if (CheckKeyPin(key = MENU_KEY))
            break;
        if (CheckKeyPin(key = UP_KEY))
            break;
        if (CheckKeyPin(key = DOWN_KEY))
            break;
        if (CheckKeyPin(key = SELECT_KEY))
            break;
        interval = 150 + 5;
        NutSleep(10);
    }
    sysprintf("MenuWaitKey\r\n");
    EnableBuzzer(26, 100);
    interval -= 5;
    if (interval < 0)
        interval = 0;
    return key;
}

STATIC BOOL MenuWriteProtect(VOID)
{
    CHAR *msgProtect  = (CHAR *)LCDMessage[MSG_WRITE_PROTECT][pMenuCfg->Language];
    CHAR *msgPassword = (CHAR *)LCDMessage[MSG_PASSWORD][pMenuCfg->Language];
    CHAR editBuf[20] = "0000", rev[2] = " ";
    INT index;

    if (WriteProtect)
    {
        while (CheckBuzzerStatus()){}
        DspClearDisplay();
        ShowLCDString(((16 - strlen(msgProtect)) / 2), 1, msgProtect, 0);
        while (CheckKeyPin(SELECT_KEY)){}
        MenuWaitKey();
        return TRUE;
    }

    index = 0;
    while (WritePassword)
    {
        while (CheckBuzzerStatus()){}
        DspClearDisplay();
        ShowLCDString(((16 - strlen(msgPassword)) / 2), 1, msgPassword, 0);
        ShowLCDString(((16 - strlen(editBuf)) / 2), 2, editBuf, 0);

        rev[0] = editBuf[index];
        ShowLCDString(((16 - strlen(editBuf)) / 2) + index, 2, rev, 1);

        while (CheckKeyPin(SELECT_KEY)){}

        switch (MenuWaitKey())
        {
            case MENU_KEY:        // exit
                return TRUE;

            case UP_KEY:        // inc
                editBuf[index] += 1;
                if (editBuf[index] > '9')
                    editBuf[index] = '0';
                break;

            case DOWN_KEY:        // shift
                index += 1;
                if (index >= strlen(editBuf))
                    index = 0;
                break;

            case SELECT_KEY:    // entry
                if (strcmp(editBuf, "8888") == 0)
                    WritePassword = FALSE;
                break;
        }
    }
    return FALSE;
}

STATIC BOOL SureMenu(CHAR **title)
{
    CHAR *msg = *(title + pMenuCfg->Language);
    CHAR buf[20];
    INT key = SELECT_KEY;

    while (1)
    {
        DspClearDisplay();
        ShowLCDString(((16 - strlen(msg)) / 2), 0, msg, 0);
        sprintf(buf, "SELECT:%9s", LCDMessage[MSG_YES][pMenuCfg->Language]);
        ShowLCDString(0, 2, buf, 0);
        sprintf(buf, "MENU:%11s", LCDMessage[MSG_NO][pMenuCfg->Language]);
        ShowLCDString(0, 3, buf, 0);

        while (CheckKeyPin(key)){}

        switch (key = MenuWaitKey())
        {
            case MENU_KEY:        // no
                return FALSE;

            case SELECT_KEY:    // sure
                if (MenuWriteProtect())
                    break;
                return TRUE;
        }
    }
}

STATIC VOID RunMenu(_MenuItem *index, INT def, CHAR **title)
{
    CONST STATIC CHAR rev[] = "               ";
    _MenuItem *top, *mid, *bot;
    CHAR buf[20];
    INT i, total;

    index += 1;

    // caculate total item
    total = 1;
    while ((index + total)->tag)
        total += 1;

    i = 0;
    if (def < total && (index + i)->func)
        i = def;

    index += i;
    top = index;
    mid = index + 1;
    bot = index + 2;

    ExitMenu = FALSE;
    while (!ExitMenu)
    {
        while (CheckBuzzerStatus()){}
        DspClearDisplay();
        ShowLCDString(0, 0, *(title + pMenuCfg->Language), 0);
        sprintf(buf, "%1d/%1d", i + 1, total);
        ShowLCDString((16 - strlen(buf)), 0, buf, 0);

        if (index == top)
        {
            ShowLCDString(1, 1, (CHAR *)rev, 1);
            ShowLCDString(1, 1, *(top->tag + pMenuCfg->Language), 1);
            ShowLCDString(1, 2, *(mid->tag + pMenuCfg->Language), 0);
            ShowLCDString(1, 3, *(bot->tag + pMenuCfg->Language), 0);
            ShowLCDString(0, 1, ">", 0);
        }
        else if (index == mid)
        {
            ShowLCDString(1, 2, (CHAR *)rev, 1);
            ShowLCDString(1, 1, *(top->tag + pMenuCfg->Language), 0);
            ShowLCDString(1, 2, *(mid->tag + pMenuCfg->Language), 1);
            ShowLCDString(1, 3, *(bot->tag + pMenuCfg->Language), 0);
            ShowLCDString(0, 2, ">", 0);
        }
        else if (index == bot)
        {
            ShowLCDString(1, 3, (CHAR *)rev, 1);
            ShowLCDString(1, 1, *(top->tag + pMenuCfg->Language), 0);
            ShowLCDString(1, 2, *(mid->tag + pMenuCfg->Language), 0);
            ShowLCDString(1, 3, *(bot->tag + pMenuCfg->Language), 1);
            ShowLCDString(0, 3, ">", 0);
        }

        while (CheckKeyPin(SELECT_KEY)){}

        switch (MenuWaitKey())
        {
            case MENU_KEY:        // exit
                return;

            case UP_KEY:        // prev
                if ((index - 1)->tag)
                {
                    if (index == top)
                    {
                        top--;
                        mid--;
                        bot--;
                    }
                    index--;
                    i--;
                }
                break;

            case DOWN_KEY:        // next
                if ((index + 1)->tag)
                {
                    if (index == bot)
                    {
                        top++;
                        mid++;
                        bot++;
                    }
                    index++;
                    i++;
                }
                break;

            case SELECT_KEY:    // entry
                if (index->func)
                    index->func();
                else
                    return;
                break;
        }
    }
}

STATIC INT SetMenu(_SetItem *index, INT def, CHAR **title)
{
    CONST STATIC CHAR rev[] = "               ";
    _SetItem *top, *mid, *bot;
    CHAR buf[20];
    INT i, total;

    index += 1;

    // caculate total item
    total = 1;
    while ((index + total)->tag)
        total += 1;

    i = 0;
    while ((index + i)->tag)
    {
        if ((index + i)->num == def)
            break;
        i++;
    }
    if (i >= total)
        i = 0;

    if ((index + i)->tag)
        index += i;

    if ((index + 2)->tag)
    {
        top = index;
        mid = index + 1;
        bot = index + 2;
    }
    else
    {
        top = index -1;
        mid = index;
        bot = index + 1;
    }

    while (1)
    {
        while (CheckBuzzerStatus()){}
        DspClearDisplay();
        ShowLCDString(0, 0, *(title + pMenuCfg->Language), 0);
        sprintf(buf, "%1d/%1d", i + 1, total);
        ShowLCDString((16 - strlen(buf)), 0, buf, 0);

        if (index == top)
        {
            ShowLCDString(1, 1, (CHAR *)rev, 1);
            ShowLCDString(1, 1, *(top->tag + pMenuCfg->Language), 1);
            ShowLCDString(1, 2, *(mid->tag + pMenuCfg->Language), 0);
            ShowLCDString(1, 3, *(bot->tag + pMenuCfg->Language), 0);
            ShowLCDString(0, 1, ">", 0);
        }
        else if (index == mid)
        {
            ShowLCDString(1, 2, (CHAR *)rev, 1);
            ShowLCDString(1, 1, *(top->tag + pMenuCfg->Language), 0);
            ShowLCDString(1, 2, *(mid->tag + pMenuCfg->Language), 1);
            ShowLCDString(1, 3, *(bot->tag + pMenuCfg->Language), 0);
            ShowLCDString(0, 2, ">", 0);
        }
        else if (index == bot)
        {
            ShowLCDString(1, 3, (CHAR *)rev, 1);
            ShowLCDString(1, 1, *(top->tag + pMenuCfg->Language), 0);
            ShowLCDString(1, 2, *(mid->tag + pMenuCfg->Language), 0);
            ShowLCDString(1, 3, *(bot->tag + pMenuCfg->Language), 1);
            ShowLCDString(0, 3, ">", 0);
        }

        while (CheckKeyPin(SELECT_KEY)){}

        switch (MenuWaitKey())
        {
            case MENU_KEY:        // exit
                return def;

            case UP_KEY:        // prev
                if ((index - 1)->tag)
                {
                    if (index == top)
                    {
                        top--;
                        mid--;
                        bot--;
                    }
                    index--;
                    i--;
                }
                break;

            case DOWN_KEY:        // next
                if ((index + 1)->tag)
                {
                    if (index == bot)
                    {
                        top++;
                        mid++;
                        bot++;
                    }
                    index++;
                    i++;
                }
                break;

            case SELECT_KEY:    // entry
                if (index->num != SET_ITEM_EXIT && index->num != def)
                {
                    if (MenuWriteProtect())
                        break;
                    return index->num;
                }
                return def;
        }
    }
}

STATIC VOID FileFinish(VOID)
{
    BasClearHandle();
    FileRunning = FALSE;
}

STATIC VOID FileContMenu(_eFileDevice device, CHAR *name, INT size)
{
    CHAR buf[32];
    INT key = SELECT_KEY;

    while (1)
    {
        while (CheckBuzzerStatus()){}

        DspClearDisplay();
        ShowLCDString(0, 0, name, 0);

        if (strcmp(strchr(name, '.'), ".BAS") == 0)
        {
            sprintf(buf, "UP:%13s", LCDMessage[MSG_AUTO][pMenuCfg->Language]);
            ShowLCDString(0, 1, buf, 0);
            sprintf(buf, "DOWN:%11s", LCDMessage[MSG_DELETE][pMenuCfg->Language]);
            ShowLCDString(0, 2, buf, 0);
            sprintf(buf, "SELECT:%9s", LCDMessage[MSG_RUN][pMenuCfg->Language]);
            ShowLCDString(0, 3, buf, 0);
        }
        else
        {
            sprintf(buf, "%8d Byte(s)", size);
            if (size > 1024)
                sprintf(buf, "%13.2f KB", (FLOAT)size / 1024);
            if (size > 1024 * 1024)
                sprintf(buf, "%13.2f MB", (FLOAT)size / 1024 / 1024);
            ShowLCDString(0, 1, buf, 0);

            sprintf(buf, "DOWN:%11s", LCDMessage[MSG_DELETE][pMenuCfg->Language]);
            ShowLCDString(0, 3, buf, 0);
        }

        while (CheckKeyPin(key)){}

        switch (key = MenuWaitKey())
        {
            case MENU_KEY:        // exit
                return;

            case UP_KEY:        // set to AutoRun
                if (strcmp(strchr(name, '.'), ".BAS"))
                    break;
                if (MenuWriteProtect())
                    break;
                strcpy((CHAR *)pMenuCfg->AutoRun, name);
                return;

            case DOWN_KEY:        // delete
                if (MenuWriteProtect())
                    break;
                if (!SureMenu((CHAR **)LCDMessage[MSG_DELETE]))
                    break;
                DspClearDisplay();
                ErasingFile(device, name);
                ExitFile = TRUE;
                return;

            case SELECT_KEY:    // run
                if (strcmp(strchr(name, '.'), ".BAS"))
                    break;
                LeaveMenuFunc(TRUE);
                SetDisplayStatus(DIS_READY);

                UserDataIn(CR_CHAR);
            //    UserDataIn(LF_CHAR);

                RemoveLF();    // for INPUT command
                sBasicData.UseHandle = RunFile(device, name, BasFileKey, FileFinish);
                if (sBasicData.UseHandle != _NULL)
                {
                    BasInitialBASIC();
                    FileRunning = TRUE;
                    while (FileRunning)
                        NutSleep(255);
                }

                ClrDisplayStatus(DIS_READY);
                EntryMenuFunc();
                return;
        }
    }
}

STATIC VOID FileMenu(CHAR **title, _eFileDevice device)
{
    CONST STATIC CHAR rev[] = "               ";
    _FileList list;
    CHAR name[3][20];
    INT index;

    memset(name, 0, sizeof(name));

    OpenList(&list, device);
    if (!NextFile(&list, "*.*"))
    {
        DspClearDisplay();
        ShowLCDString(0, 0, *(title + pMenuCfg->Language), 0);
        ShowLCDString(0, 1, (CHAR *)LCDMessage[MSG_NO_FILE][pMenuCfg->Language], 0);
        while (CheckKeyPin(SELECT_KEY)){}
        MenuWaitKey();
        return;
    }

    strcpy(name[0], list.FileName);
    if (NextFile(&list, "*.*"))
        strcpy(name[1], list.FileName);
    if (NextFile(&list, "*.*"))
        strcpy(name[2], list.FileName);
    PrevFile(&list, "*.*");
    PrevFile(&list, "*.*");
    PrevFile(&list, "*.*");

    index = 1;

    ExitFile = FALSE;
    while (!ExitFile)
    {
        while (CheckBuzzerStatus()){}

        DspClearDisplay();
        ShowLCDString(0, index, ">", 0);
        ShowLCDString(1, index, (CHAR *)rev, 1);
        ShowLCDString(0, 0, *(title + pMenuCfg->Language), 0);
        ShowLCDString(1, 1, name[0], index == 1 ? 1 : 0);
        ShowLCDString(1, 2, name[1], index == 2 ? 1 : 0);
        ShowLCDString(1, 3, name[2], index == 3 ? 1 : 0);

        if (strcmp(name[0], (CHAR *)pMenuCfg->AutoRun) == 0)
            ShowLCDString(0, 1, "*", 0);
        if (strcmp(name[1], (CHAR *)pMenuCfg->AutoRun) == 0)
            ShowLCDString(0, 2, "*", 0);
        if (strcmp(name[2], (CHAR *)pMenuCfg->AutoRun) == 0)
            ShowLCDString(0, 3, "*", 0);

        while (CheckKeyPin(SELECT_KEY)){}

        switch (MenuWaitKey())
        {
            case MENU_KEY:        // exit
                return;

            case UP_KEY:        // prev
                if (PrevFile(&list, "*.*"))
                {
                    if (--index < 1)
                    {
                        strcpy(name[2], name[1]);
                        strcpy(name[1], name[0]);
                        strcpy(name[0], list.FileName);
                        index = 1;
                    }
                }
                break;

            case DOWN_KEY:        // next
                if (NextFile(&list, "*.*"))
                {
                    if (NextFile(&list, "*.*"))
                    {
                        if (++index > 3)
                        {
                            strcpy(name[0], name[1]);
                            strcpy(name[1], name[2]);
                            strcpy(name[2], list.FileName);
                            index = 3;
                        }
                    }
                    PrevFile(&list, "*.*");
                }
                break;

            case SELECT_KEY:    // entry
                FileContMenu(device, list.FileName, list.FileSize);
                break;
        }
    }
}

STATIC INT NumMenu(CHAR **title, INT def, INT higher, INT lower, INT step)
{
    CHAR *msg = *(title + pMenuCfg->Language);
    CHAR buf[20];
    INT num;

    num = def;
    while (1)
    {
        while (CheckBuzzerStatus()){}
        DspClearDisplay();
        ShowLCDString(((16 - strlen(msg)) / 2), 1, msg, 0);
        sprintf((CHAR *)buf, "%d", num);
        ShowLCDString(((16 - strlen(buf)) / 2), 2, buf, 0);

        while (CheckKeyPin(SELECT_KEY)){}

        switch (MenuWaitKey())
        {
            case MENU_KEY:        // exit
                return def;

            case UP_KEY:        // +
                if (MenuWriteProtect())
                    break;
                if (num + step <= higher)
                    num += step;
                break;

            case DOWN_KEY:        // -
                if (MenuWriteProtect())
                    break;
                if (num - step >= lower)
                    num -= step;
                break;

            case SELECT_KEY:    // entry
                if (num != def)
                    return num;
                return def;
        }
    }
}

STATIC INT ToUnitNumber(CHAR *buf, INT unit)
{
    if (unit == 0)    // dot
        return atoi(buf);
    if (unit == 1)    // mm
        return atof(buf) * MM_DOT;
    if (unit == 2)    // inch
        return atof(buf) * TPH_DPI;
    return 0;
}

STATIC INT ToUnitString(CHAR *buf, INT num, INT unit)
{
    if (unit == 0)    // dot
        return sprintf(buf, "%d", abs(num));
    if (unit == 1)    // mm
        return sprintf(buf, "%.01f", (FLOAT)abs(num) / MM_DOT);
    if (unit == 2)    // inch
        return sprintf(buf, "%.02f", (FLOAT)abs(num) / TPH_DPI);
    return 0;
}

STATIC INT EditNumMenu(CHAR **title, INT def, INT range, BOOL sign, BOOL useUnit, INT *keyback)
{
    STATIC CONST CHAR *unitMsg[3] = { "dot", "mm", "inch" };

    CHAR *msg = *(title + pMenuCfg->Language);
    CHAR editBuf[20], rev[2] = " ";
    CHAR tempBuf[20];
    INT tempLen, unitLen[3];
    INT index;
    INT unit;
    INT num;

    num = MAX(abs(def), abs(range));

    unitLen[0] = ToUnitString(tempBuf, num, 0);
    unitLen[1] = ToUnitString(tempBuf, num, 1);
    unitLen[2] = ToUnitString(tempBuf, num, 2);

    editBuf[0] = (def < 0) ? '-' : '+';

    tempLen = unitLen[0] - ToUnitString(tempBuf, def, 0);
    for (num = (sign ? 1 : 0); tempLen > 0; tempLen--)
        editBuf[num++] = '0';
    strcpy((CHAR *)&editBuf[num], tempBuf);

    index = 0;
    unit = 0;
    while (1)
    {
        while (CheckBuzzerStatus()){}

        tempLen = strlen(editBuf);
        if (useUnit)
            tempLen += 1 + strlen(unitMsg[unit]);
        tempLen = (16 - tempLen) / 2;

        DspClearDisplay();
        ShowLCDString(((16 - strlen(msg)) / 2), 1, msg, 0);
        ShowLCDString(tempLen, 2, editBuf, 0);

        if (index != (-1))
        {
            rev[0] = editBuf[index];
            ShowLCDString(tempLen + index, 2, rev, 1);
            if (useUnit)
                ShowLCDString(tempLen + strlen(editBuf) + 1, 2, (CHAR *)unitMsg[unit], 0);
        }
        else if (useUnit)
            ShowLCDString(tempLen + strlen(editBuf) + 1, 2, (CHAR *)unitMsg[unit], 1);

        while (CheckKeyPin(SELECT_KEY)){}

        switch (MenuWaitKey())
        {
            case MENU_KEY:        // exit
                if (keyback)
                    *keyback = MENU_KEY;
                return def;

            case UP_KEY:        // inc
                if (MenuWriteProtect())
                    break;
                if (index == (-1))    // select unit
                {
                    num = ToUnitNumber(editBuf, unit);

                    unit += 1;
                    if (unit >= 3)
                        unit = 0;

                    tempLen = unitLen[unit] - ToUnitString(tempBuf, num, unit);
                    for (num = (sign ? 1 : 0); tempLen > 0; tempLen--)
                        editBuf[num++] = '0';
                    strcpy((CHAR *)&editBuf[num], tempBuf);
                }
                else if (editBuf[index] == '+')
                    editBuf[index] = '-';
                else if (editBuf[index] == '-')
                    editBuf[index] = '+';
                else if (editBuf[index] == '9')
                    editBuf[index] = '0';
                else
                {
                    tempLen = unitLen[unit] - ToUnitString(tempBuf, range, unit);
                    if (strcmp(editBuf + tempLen + (sign ? 1 : 0), tempBuf) != 0)
                    {
                        editBuf[index] += 1;
                        num = ToUnitNumber(editBuf, unit);
                        if (abs(num) > abs(range))
                        {
                            for (num = (sign ? 1 : 0); tempLen > 0; tempLen--)
                                editBuf[num++] = '0';
                            strcpy((CHAR *)&editBuf[num], tempBuf);
                        }
                    }
                    else
                        editBuf[index] = '0';
                }
                break;

            case DOWN_KEY:        // shift
                index += 1;
                if (editBuf[index] == '.')
                    index += 1;
                if (index >= strlen(editBuf))
                    index = useUnit ? (-1) : 0;
                break;

            case SELECT_KEY:    // entry
                if (keyback)
                    *keyback = SELECT_KEY;
                num = ToUnitNumber(editBuf, unit);
                if (num != def)
                    return num;
                return def;
        }
    }
}

STATIC ULONG EditAddrMenu(CHAR **title, ULONG def, INT *keyback)
{
    CHAR *msg = *(title + pMenuCfg->Language);
    CHAR editBuf[20], rev[2] = " ";
    BYTE *IP = (BYTE *)&def;
    INT index;

    sprintf(editBuf, "%03d.%03d.%03d.%03d",    IP[0], IP[1], IP[2], IP[3]);

    index = 0;
    while (1)
    {
        while (CheckBuzzerStatus()){}
        DspClearDisplay();
        ShowLCDString(((16 - strlen(msg)) / 2), 1, msg, 0);
        ShowLCDString(((16 - strlen(editBuf)) / 2), 2, editBuf, 0);

        rev[0] = editBuf[index];
        ShowLCDString(((16 - strlen(editBuf)) / 2) + index, 2, rev, 1);

        while (CheckKeyPin(SELECT_KEY)){}

        switch (MenuWaitKey())
        {
            case MENU_KEY:    // exit
                if (keyback)
                    *keyback = MENU_KEY;
                return def;
            
            case UP_KEY:    // next
                if (MenuWriteProtect())
                    break;
                editBuf[index] += 1;
                if ((index % 4) == 0)
                {
                    if (editBuf[index] == '3')
                        editBuf[index] = '0';
                }
                else if ((index % 4) == 1)
                {
                    if (editBuf[index-1] == '2' && editBuf[index] > '5')
                        editBuf[index] = '0';
                    else if (editBuf[index] > '9')
                        editBuf[index] = '0';
                }
                else if ((index % 4) == 2)
                {
                    if (editBuf[index-2] == '2' && editBuf[index-1] == '5'
                        && editBuf[index] > '5')
                        editBuf[index] = '0';
                    else if (editBuf[index] > '9')
                        editBuf[index] = '0';
                }
                break;

            case DOWN_KEY:    // shift
                index += 1;
                if (index >= strlen(editBuf))
                    index = 0;
                else if ((index % 4) == 3)
                    index += 1;
                break;

            case SELECT_KEY:    // entry
                if (keyback)
                    *keyback = SELECT_KEY;
                return inet_addr(editBuf);
        }
    }
}

STATIC BYTE EditCharMenu(CHAR **title, BYTE def)
{
    CHAR *msg = *(title + pMenuCfg->Language);
    CHAR buf[20], rev[2] = " ";
    BYTE num = def;
    BYTE mask;
    INT shift;
    INT index = 1;

    while (1)
    {
        while (CheckBuzzerStatus()){}
        DspClearDisplay();
        ShowLCDString(((16 - strlen(msg)) / 2), 1, msg, 0);
        sprintf((CHAR *)buf, "<%c>  %02XH", num ? num : ' ', num);
        ShowLCDString(((16 - strlen(buf)) / 2), 2, buf, 0);

        rev[0] = buf[5 + (1 - index)];
        ShowLCDString(((16 - strlen(buf)) / 2) + 5 + (1 - index), 2, rev, 1);

        while (CheckKeyPin(SELECT_KEY)){}

        switch (MenuWaitKey())
        {
            case MENU_KEY:        // exit
                return def;

            case UP_KEY:        // inc
                if (MenuWriteProtect())
                    break;
                shift = index * 4;
                mask = 0xF << shift;
                num = (num + (1 << shift)) & mask | (num & ~mask);
                break;

            case DOWN_KEY:        // shift
                index += 1;
                if (index > 1)
                    index = 0;
                break;

            case SELECT_KEY:    // entry
                if (num != def)
                    return num;
                return def;
        }
    }
}

STATIC VOID GapSensorRepeat(VOID)
{
    STATIC WORD Scan;
    CHAR buf[20];
    INT StockAD;

    if (++Scan > (250 / PERIOD_TIMES))    // each 250 msec
    {
        Scan = 0;
        DspClearLine(3, LCD_LANG_ENG);
        StartADConvert(GAP_SENSOR_AD);
        StockAD = ReadAD(GAP_SENSOR_AD);
        sprintf(buf, "%-12s%4d", LCDMessage[MSG_REF_LEVEL][pMenuCfg->Language], StockAD);
        ShowLCDString(((16 - strlen(buf)) / 2), 3, buf, 0);
    }
}

STATIC VOID BlineSensorRepeat(VOID)
{
    STATIC WORD Scan;
    CHAR buf[20];
    INT StockAD;

    if (++Scan > (250 / PERIOD_TIMES))    // each 250 msec
    {
        Scan = 0;
        DspClearLine(3, LCD_LANG_ENG);
        StartADConvert(BLINE_SENSOR_AD);
        StockAD = ReadAD(BLINE_SENSOR_AD);
        sprintf(buf, "%-12s%4d", LCDMessage[MSG_REF_LEVEL][pMenuCfg->Language], StockAD);
        ShowLCDString(((16 - strlen(buf)) / 2), 3, buf, 0);
    }
}

STATIC INT EditGainMenu(_eSensorType Type, INT def, INT higher, INT lower, INT *keyback)
{
    PERIODFUNC SensorRepeat = (Type == GAP_SENSOR) ? GapSensorRepeat : BlineSensorRepeat;
    CHAR buf[20];
    INT num, ret, key;

    num = def;
    ret = FALSE;

    while (CheckKeyPin(UP_KEY) || CheckKeyPin(DOWN_KEY)){}

    EnableSensor(Type, num, pMenuCfg->RibbonFlag, 0);
    StartPeriodFunc(SensorRepeat);
    while (!ret)
    {
        while (CheckBuzzerStatus()){}
        DspClearLine(2, LCD_LANG_ENG);
        sprintf(buf, "%-13s%3d", LCDMessage[MSG_INTENSITY][pMenuCfg->Language], num);
        ShowLCDString(((16 - strlen(buf)) / 2), 2, buf, 0);

        while (CheckKeyPin(MENU_KEY) || CheckKeyPin(SELECT_KEY)){}

        key = MenuWaitKey();
        switch (key)
        {
            case MENU_KEY:        // exit
                num = def;
                ret = TRUE;
                break;

            case UP_KEY:        // +
                if (num + 1 <= higher)
                    num += 1;
                break;

            case DOWN_KEY:        // -
                if (num - 1 >= lower)
                    num -= 1;
                break;

            case SELECT_KEY:    // entry
                CancelPeriodFunc(SensorRepeat);
                if (MenuWriteProtect())
                    break;
                ret = TRUE;
                break;
        }
        EnableSensor(Type, num, pMenuCfg->RibbonFlag, 0);
        StartPeriodFunc(SensorRepeat);
    }
    CancelPeriodFunc(SensorRepeat);
    DisableSensor(Type);
    if (keyback)
        *keyback = key;
    return num;
}

STATIC VOID MenuTsplSpeed(VOID)
{
    INT Speed = atoi(ToSpeedString(pMenuCfg->Speed));

    Speed = NumMenu((CHAR **)LCDMessage[MSG_SPEED], Speed, MENU_SPEED_MAX, MENU_SPEED_MIN, 1);

    pMenuCfg->Speed = ToMotorSpeed(Speed);
}

STATIC VOID MenuTsplDensity(VOID)
{
    pMenuCfg->fDensity = 
        (FLOAT)NumMenu((CHAR **)LCDMessage[MSG_DENSITY], (INT)pMenuCfg->fDensity, DensityMax, DensityMin, 1);
}

STATIC VOID MenuTsplDirection(VOID)
{
    pMenuCfg->Direction = 
        NumMenu((CHAR **)LCDMessage[MSG_DIRECTION], pMenuCfg->Direction, 1, 0, 1);
}

STATIC VOID MenuTsplPrintMode(VOID)
{
    CONST STATIC _SetItem SetItem[] = 
    {
        {(CHAR **)_NULL,                            _NULL},
        {(CHAR **)LCDMessage[MSG_NONE],                OFF_MODE},
        {(CHAR **)LCDMessage[MSG_BATCH_MODE],        TEAR_MODE},
        {(CHAR **)LCDMessage[MSG_PEELER_MODE],        PEEL_MODE},
        {(CHAR **)LCDMessage[MSG_CUTTER_MODE],        CUTTER_MODE},
        {(CHAR **)LCDMessage[MSG_CUTTER_BATCH],        CUTTER_MODE + 1},
        {(CHAR **)LCDMessage[MSG_EXIT],                SET_ITEM_EXIT},
        {(CHAR **)_NULL,                            _NULL}
    };

    INT Removal = pMenuCfg->PrintOutMode;

    if (Removal == CUTTER_MODE && pMenuCfg->CutterPieces == 0)
        Removal += 1;

    pMenuCfg->PrintOutMode = 
        (_ePrintOutMode)SetMenu((_SetItem *)SetItem, Removal, (CHAR **)LCDMessage[MSG_PRINT_MODE]);

    if (pMenuCfg->PrintOutMode == OFF_MODE)
        pMenuCfg->TearMode = FALSE;
    else if (pMenuCfg->PrintOutMode == TEAR_MODE)
        pMenuCfg->TearMode = TRUE;
    else if (pMenuCfg->PrintOutMode == CUTTER_MODE)
        pMenuCfg->CutterPieces = 1;
    else if (pMenuCfg->PrintOutMode == CUTTER_MODE + 1)
    {
        pMenuCfg->PrintOutMode = CUTTER_MODE;
        pMenuCfg->CutterPieces = 0;
    }
}

STATIC VOID MenuTsplOffset(VOID)
{
    pMenuCfg->OffsetDis = 
        EditNumMenu((CHAR **)LCDMessage[MSG_OFFSET], pMenuCfg->OffsetDis, 999, TRUE, FALSE, _NULL);
}

STATIC VOID MenuTsplShiftX(VOID)
{
    pMenuCfg->ShiftDisX = 
        EditNumMenu((CHAR **)LCDMessage[MSG_SHIFT_X], pMenuCfg->ShiftDisX, 999, TRUE, FALSE, _NULL);
}

STATIC VOID MenuTsplShiftY(VOID)
{
    pMenuCfg->ShiftDisY = 
        EditNumMenu((CHAR **)LCDMessage[MSG_SHIFT_Y], pMenuCfg->ShiftDisY, 999, TRUE, FALSE, _NULL);
}

STATIC VOID MenuTsplReferenceX(VOID)
{
    pMenuCfg->ReferenceX = 
        EditNumMenu((CHAR **)LCDMessage[MSG_REFERENCE_X], pMenuCfg->ReferenceX, 999, FALSE, FALSE, _NULL);
}

STATIC VOID MenuTsplReferenceY(VOID)
{
    pMenuCfg->ReferenceY = 
        EditNumMenu((CHAR **)LCDMessage[MSG_REFERENCE_Y], pMenuCfg->ReferenceY, 999, FALSE, FALSE, _NULL);
}

STATIC VOID MenuTsplCodePage(VOID)
{
    CONST STATIC _SetItem ItemExit = {(CHAR **)LCDMessage[MSG_EXIT],    SET_ITEM_EXIT}; 
    CONST STATIC _SetItem ItemNull = {(CHAR **)_NULL,    _NULL}; 
    _SetItem *pSetItem; 
    CHAR **pSetTag;
    INT item;
    INT i, j;

    pSetItem = malloc((CodePageTotal + 3) * sizeof(_SetItem));     
    pSetTag  = malloc(CodePageTotal * LANGUAGE_TOTAL * sizeof(CHAR *));

    item = 0;
    *(pSetItem + item++) = ItemNull;
    for (i = 0; i < CodePageTotal; i++)
    {
        for (j = 0; j < LANGUAGE_TOTAL; j++)
            *(pSetTag + i * LANGUAGE_TOTAL + j) = (CHAR *)CodePageNameTable[i];
        (pSetItem + item)->tag = pSetTag + i * LANGUAGE_TOTAL;
        (pSetItem + item)->num = i;
        item++;
    }
    *(pSetItem + item++) = ItemExit;
    *(pSetItem + item++) = ItemNull;

    pMenuCfg->CodePage = SetMenu(pSetItem, pMenuCfg->CodePage, (CHAR **)LCDMessage[MSG_CODEPAGE]);

    free(pSetTag);
    free(pSetItem);
}

STATIC VOID MenuTsplCountry(VOID)
{
    CONST STATIC _SetItem ItemExit = {(CHAR **)LCDMessage[MSG_EXIT],    SET_ITEM_EXIT}; 
    CONST STATIC _SetItem ItemNull = {(CHAR **)_NULL,    _NULL}; 
    _SetItem *pSetItem;
    CHAR **pSetTag;
    INT item;
    INT i, j;

    pSetItem = malloc((CountryTotal + 3) * sizeof(_SetItem));
    pSetTag  = malloc(CountryTotal * LANGUAGE_TOTAL * sizeof(CHAR *));

    item = 0;
    *(pSetItem + item++) = ItemNull;
    for (i = 0; i < CountryTotal; i++)
    {
        for (j = 0; j < LANGUAGE_TOTAL; j++)
            *(pSetTag + i * LANGUAGE_TOTAL + j) = (CHAR *)CountryNameTable[i];
        (pSetItem + item)->tag = pSetTag + i * LANGUAGE_TOTAL;
        (pSetItem + item)->num = i;
        item++;
    }
    *(pSetItem + item++) = ItemExit;
    *(pSetItem + item++) = ItemNull;

    pMenuCfg->Country = SetMenu(pSetItem, pMenuCfg->Country, (CHAR **)LCDMessage[MSG_COUNTRY]);

    free(pSetTag);
    free(pSetItem);
}

STATIC VOID MenuTsplSetup(VOID)
{
    CONST STATIC _MenuItem MenuItem[] = 
    {
        {(CHAR **)_NULL,                        _NULL},
        {(CHAR **)LCDMessage[MSG_SPEED],        MenuTsplSpeed},
        {(CHAR **)LCDMessage[MSG_DENSITY],        MenuTsplDensity},
        {(CHAR **)LCDMessage[MSG_DIRECTION],    MenuTsplDirection},
        {(CHAR **)LCDMessage[MSG_PRINT_MODE],    MenuTsplPrintMode},
        {(CHAR **)LCDMessage[MSG_OFFSET],        MenuTsplOffset},
        {(CHAR **)LCDMessage[MSG_SHIFT_X],        MenuTsplShiftX},
        {(CHAR **)LCDMessage[MSG_SHIFT_Y],        MenuTsplShiftY},
        {(CHAR **)LCDMessage[MSG_REFERENCE_X],    MenuTsplReferenceX},
        {(CHAR **)LCDMessage[MSG_REFERENCE_Y],    MenuTsplReferenceY},
        {(CHAR **)LCDMessage[MSG_CODEPAGE],        MenuTsplCodePage},
        {(CHAR **)LCDMessage[MSG_COUNTRY],        MenuTsplCountry},
        {(CHAR **)LCDMessage[MSG_EXIT],            _NULL},
        {(CHAR **)_NULL,                        _NULL}
    };

    RunMenu((_MenuItem *)MenuItem, 0, (CHAR **)LCDMessage[MSG_PRINT_SETUP]);
}

#if defined(ZPL2)

STATIC VOID MenuZpl2Darkness(VOID)
{
    PrintDarkness = 
        NumMenu((CHAR **)LCDMessage[MSG_DARKNESS], PrintDarkness, 30, 0, 1);
}

STATIC VOID MenuZpl2PrintSpeed(VOID)
{
    INT Speed = atoi(ToSpeedString(ToSpeed(PrintSpeed)));

    PrintSpeed = 
        NumMenu((CHAR **)LCDMessage[MSG_PRINT_SPEED], Speed, MENU_SPEED_MAX, MENU_SPEED_MIN, 1);
}

STATIC VOID MenuZpl2TearOff(VOID)
{
    AdjustPosition = 
        EditNumMenu((CHAR **)LCDMessage[MSG_ADJUST_POSITION], AdjustPosition, 120, TRUE, FALSE, _NULL);
}

STATIC VOID MenuZpl2PrintMode(VOID)
{
    CONST STATIC _SetItem SetItem[] = 
    {
        {(CHAR **)_NULL,                        _NULL},
        {(CHAR **)LCDMessage[MSG_TEAR_OFF],        'T'},
        {(CHAR **)LCDMessage[MSG_PEEL_OFF],        'P'},
        {(CHAR **)LCDMessage[MSG_CUTTER],        'C'},
        {(CHAR **)LCDMessage[MSG_EXIT],            SET_ITEM_EXIT},
        {(CHAR **)_NULL,                        _NULL}
    };

    // Accepted Values: T = Tear-off, P = Peel-off, C = Cutter
    PrintMode = 
        (_ePrintOutMode)SetMenu((_SetItem *)SetItem, PrintMode, (CHAR **)LCDMessage[MSG_PRINT_MODE]);
}

STATIC VOID MenuZpl2PrintWidth(VOID)
{
    LabelWidth = 
        EditNumMenu((CHAR **)LCDMessage[MSG_PRINT_WIDTH], LabelWidth, MAX_LABEL_WIDTH, FALSE, TRUE, _NULL);
}

STATIC VOID MenuZpl2MaximumLength(VOID)
{
    MaxLabelLength = 
        EditNumMenu((CHAR **)LCDMessage[MSG_MAXIMUM_LENGTH], MaxLabelLength, MAX_LABEL_LENGTH, FALSE, TRUE, _NULL);
}

STATIC VOID MenuZpl2ListFonts(VOID)
{
    _ObjFile FileTTF = {'*', "*.TTF"};
    _ObjFile FileFNT = {'*', "*.FNT"};

    LeaveMenuFunc(TRUE);
    SetDisplayStatus(DIS_SELFTEST);
    DirectoryList(&FileTTF, OUTPUT_LABEL);
    DirectoryList(&FileFNT, OUTPUT_LABEL);
    ClrDisplayStatus(DIS_SELFTEST);
    EntryMenuFunc();
}

STATIC VOID MenuZpl2ListImages(VOID)
{
    _ObjFile FileGRF = {'*', "*.GRF"};

    LeaveMenuFunc(TRUE);
    SetDisplayStatus(DIS_SELFTEST);
    DirectoryList(&FileGRF, OUTPUT_LABEL);
    ClrDisplayStatus(DIS_SELFTEST);
    EntryMenuFunc();
}

STATIC VOID MenuZpl2ListFormats(VOID)
{
    _ObjFile FileZPL = {'*', "*.ZPL"};

    LeaveMenuFunc(TRUE);
    SetDisplayStatus(DIS_SELFTEST);
    DirectoryList(&FileZPL, OUTPUT_LABEL);
    ClrDisplayStatus(DIS_SELFTEST);
    EntryMenuFunc();
}

STATIC VOID MenuZpl2ListSetup(VOID)
{
    LeaveMenuFunc(TRUE);
    SetDisplayStatus(DIS_SELFTEST);
    ConfigLabel(OUTPUT_LABEL);
    ClrDisplayStatus(DIS_SELFTEST);
    EntryMenuFunc();
}

STATIC VOID MenuZpl2ControlPrefix(VOID)
{
    TildeChar = 
        (CHAR)EditCharMenu((CHAR **)LCDMessage[MSG_CONTROL_PREFIX], (BYTE)TildeChar);
}

STATIC VOID MenuZpl2FormatPrefix(VOID)
{
    CaretChar = 
        (CHAR)EditCharMenu((CHAR **)LCDMessage[MSG_FORMAT_PREFIX], (BYTE)CaretChar);
}

STATIC VOID MenuZpl2DelimiterChar(VOID)
{
    DelimiterChar = 
        (CHAR)EditCharMenu((CHAR **)LCDMessage[MSG_DELIMITER_CHAR], (BYTE)DelimiterChar);
}

STATIC VOID MenuZpl2MediaPowerUp(VOID)
{
    CONST STATIC _SetItem SetItem[] = 
    {
        {(CHAR **)_NULL,                            _NULL},
        {(CHAR **)LCDMessage[MSG_FEED],                'F'},
        {(CHAR **)LCDMessage[MSG_CALIBRATION],        'C'},
        {(CHAR **)LCDMessage[MSG_LENGTH],            'L'},
        {(CHAR **)LCDMessage[MSG_NO_MOTION],        'N'},
        {(CHAR **)LCDMessage[MSG_EXIT],                SET_ITEM_EXIT},
        {(CHAR **)_NULL,                            _NULL}
    };

    // Accepted Values: F = feed, C = calibration, L = length, N = no motion
    FeedPowerUp = 
        (_ePrintOutMode)SetMenu((_SetItem *)SetItem, FeedPowerUp, (CHAR **)LCDMessage[MSG_MEDIA_POWER_UP]);
}

STATIC VOID MenuZpl2HeadClose(VOID)
{
    CONST STATIC _SetItem SetItem[] = 
    {
        {(CHAR **)_NULL,                            _NULL},
        {(CHAR **)LCDMessage[MSG_FEED],                'F'},
        {(CHAR **)LCDMessage[MSG_CALIBRATION],        'C'},
        {(CHAR **)LCDMessage[MSG_LENGTH],            'L'},
        {(CHAR **)LCDMessage[MSG_NO_MOTION],        'N'},
        {(CHAR **)LCDMessage[MSG_EXIT],                SET_ITEM_EXIT},
        {(CHAR **)_NULL,                            _NULL}
    };

    // Accepted Values: F = feed, C = calibration, L = length, N = no motion
    FeedCloseHead = 
        (_ePrintOutMode)SetMenu((_SetItem *)SetItem, FeedCloseHead, (CHAR **)LCDMessage[MSG_HEAD_CLOSE]);
}

STATIC VOID MenuZpl2LabelTop(VOID)
{
    LabelTop = 
        EditNumMenu((CHAR **)LCDMessage[MSG_LABEL_TOP], LabelTop, 120, TRUE, FALSE, _NULL);
}

STATIC VOID MenuZpl2LeftPosition(VOID)
{
    LabelShift = 
        EditNumMenu((CHAR **)LCDMessage[MSG_LEFT_POSITION], LabelShift, 9999, TRUE, FALSE, _NULL);
}

STATIC VOID MenuZpl2ReprintMode(VOID)
{

}

STATIC VOID MenuZpl2Setup(VOID)
{
    CONST STATIC _MenuItem MenuItem[] = 
    {
        {(CHAR **)_NULL,                            _NULL},
        {(CHAR **)LCDMessage[MSG_DARKNESS],            MenuZpl2Darkness},
        {(CHAR **)LCDMessage[MSG_PRINT_SPEED],        MenuZpl2PrintSpeed},
        {(CHAR **)LCDMessage[MSG_ADJUST_POSITION],    MenuZpl2TearOff},
        {(CHAR **)LCDMessage[MSG_PRINT_MODE],        MenuZpl2PrintMode},
        {(CHAR **)LCDMessage[MSG_PRINT_WIDTH],        MenuZpl2PrintWidth},
    //    {(CHAR **)LCDMessage[MSG_MAXIMUM_LENGTH],    MenuZpl2MaximumLength},
        {(CHAR **)LCDMessage[MSG_LIST_FONTS],        MenuZpl2ListFonts},
        {(CHAR **)LCDMessage[MSG_LIST_IMAGES],        MenuZpl2ListImages},
        {(CHAR **)LCDMessage[MSG_LIST_FORMATS],        MenuZpl2ListFormats},
        {(CHAR **)LCDMessage[MSG_LIST_SETUP],        MenuZpl2ListSetup},
        {(CHAR **)LCDMessage[MSG_CONTROL_PREFIX],    MenuZpl2ControlPrefix},
        {(CHAR **)LCDMessage[MSG_FORMAT_PREFIX],    MenuZpl2FormatPrefix},
        {(CHAR **)LCDMessage[MSG_DELIMITER_CHAR],    MenuZpl2DelimiterChar},
        {(CHAR **)LCDMessage[MSG_MEDIA_POWER_UP],    MenuZpl2MediaPowerUp},
        {(CHAR **)LCDMessage[MSG_HEAD_CLOSE],        MenuZpl2HeadClose},
        {(CHAR **)LCDMessage[MSG_LABEL_TOP],        MenuZpl2LabelTop},
        {(CHAR **)LCDMessage[MSG_LEFT_POSITION],    MenuZpl2LeftPosition},
    //    {(CHAR **)LCDMessage[MSG_REPRINT_MODE],        MenuZpl2ReprintMode},
        {(CHAR **)LCDMessage[MSG_EXIT],                _NULL},
        {(CHAR **)_NULL,                            _NULL}
    };

    ConfigurationUpdata(RECALL_LAST_SAVED_VALUES);

    RunMenu((_MenuItem *)MenuItem, 0, (CHAR **)LCDMessage[MSG_PRINT_SETUP]);

    ConfigurationUpdata(SAVE_CURRENT_SETTINGS);
}

#endif

STATIC VOID MenuPrinterSetup(VOID)
{
#if defined(ZPL2)
    CONST STATIC _MenuItem MenuItem[] = 
    {
        {(CHAR **)_NULL,                    _NULL},
        {(CHAR **)LCDMessage[MSG_TSPL2],    MenuTsplSetup},
        {(CHAR **)LCDMessage[MSG_ZPL2],        MenuZpl2Setup},
        {(CHAR **)LCDMessage[MSG_EXIT],        _NULL},
        {(CHAR **)_NULL,                    _NULL}
    };

    RunMenu((_MenuItem *)MenuItem, 0, (CHAR **)LCDMessage[MSG_PRINT_SETUP]);

#else
    MenuTsplSetup();

#endif
}

STATIC VOID MenuSensorStatus(VOID)
{
    CHAR Buf[20];

    DspClearDisplay();

    sprintf(Buf, "%-11s%5d", LCDMessage[MSG_PAPER_LEN][pMenuCfg->Language], (INT)pMenuCfg->fPaperSize);
    ShowLCDString(0, 0, Buf, 0);

    if (pMenuCfg->SensorMode == GAP_MODE)
        sprintf(Buf, "%-12s%4d", LCDMessage[MSG_GAP_SIZE][pMenuCfg->Language], (INT)pMenuCfg->fGapSize);
    else if (pMenuCfg->SensorMode == BLINE_MODE)
        sprintf(Buf, "%-12s%4d", LCDMessage[MSG_BLINE_SIZE][pMenuCfg->Language], (INT)pMenuCfg->fBlineSize);
    else
        sprintf(Buf, "%-12s%4d", LCDMessage[MSG_GAP_SIZE][pMenuCfg->Language], 0);
    ShowLCDString(0, 1, Buf, 0);

    if (pMenuCfg->SensorMode == GAP_MODE)
        sprintf(Buf, "%-13s%3d", LCDMessage[MSG_INTENSITY][pMenuCfg->Language], (INT)pMenuCfg->GapInten);
    else if (pMenuCfg->SensorMode == BLINE_MODE)
        sprintf(Buf, "%-13s%3d", LCDMessage[MSG_INTENSITY][pMenuCfg->Language], (INT)pMenuCfg->BlineInten);
    else
        sprintf(Buf, "%-13s%3d", LCDMessage[MSG_INTENSITY][pMenuCfg->Language], (INT)pMenuCfg->ContinuousInten);
    ShowLCDString(0, 2, Buf, 0);

    if (pMenuCfg->AutoSensorRef && (pMenuCfg->SensorMode == GAP_MODE || pMenuCfg->SensorMode == BLINE_MODE))
        sprintf(Buf, "%-12s%4s", LCDMessage[MSG_REF_LEVEL][pMenuCfg->Language], LCDMessage[MSG_AUTO][pMenuCfg->Language]);
    else if (pMenuCfg->SensorMode == GAP_MODE)
        sprintf(Buf, "%-12s%4d", LCDMessage[MSG_REF_LEVEL][pMenuCfg->Language], (INT)pMenuCfg->GapRef);
    else if (pMenuCfg->SensorMode == BLINE_MODE)
        sprintf(Buf, "%-12s%4d", LCDMessage[MSG_REF_LEVEL][pMenuCfg->Language], (INT)pMenuCfg->BlineRef);
    else
        sprintf(Buf, "%-12s%4d", LCDMessage[MSG_REF_LEVEL][pMenuCfg->Language], (INT)pMenuCfg->ContinuousRef);
    ShowLCDString(0, 3, Buf, 0);

    while (CheckKeyPin(SELECT_KEY)){}
    MenuWaitKey();
}

STATIC BOOL MenuSensorManual(_eSensorMode mode, INT *intenback, INT *refback)
{
    CHAR buf[20], *title, *msg[2];
    _eSensorType type;
    INT step, stock[2][MAX_SENSOR_SCALE], *max, *min;
    INT scale, gain;
    INT inten, ref;
    INT keyback;
    INT i;

    BOOL status = FALSE;

    if (mode == GAP_MODE)
    {
        title  = (CHAR *)LCDMessage[MSG_GAP_MODE][pMenuCfg->Language];
        msg[0] = (CHAR *)LCDMessage[MSG_SCAN_BACKING][pMenuCfg->Language];
        msg[1] = (CHAR *)LCDMessage[MSG_SCAN_PAPER][pMenuCfg->Language];
        scale  = GAP_SENSOR_SCALE;
        type   = GAP_SENSOR;
        gain   = pMenuCfg->GapInten;
    }
    else if (mode == BLINE_MODE)
    {
        title  = (CHAR *)LCDMessage[MSG_BLINE_MODE][pMenuCfg->Language];
        msg[0] = (CHAR *)LCDMessage[MSG_SCAN_MARK][pMenuCfg->Language];
        msg[1] = (CHAR *)LCDMessage[MSG_SCAN_PAPER][pMenuCfg->Language];
        scale  = BLINE_SENSOR_SCALE;
        type   = BLINE_SENSOR;
        gain   = pMenuCfg->BlineInten;
    }
    else
    {
        title  = (CHAR *)LCDMessage[MSG_CONTINUOUS_MODE][pMenuCfg->Language];
        msg[0] = (CHAR *)LCDMessage[MSG_REMOVE_LABEL][pMenuCfg->Language];
        msg[1] = (CHAR *)LCDMessage[MSG_SCAN_PAPER][pMenuCfg->Language];
        scale  = GAP_SENSOR_SCALE;
        type   = GAP_SENSOR;
        gain   = pMenuCfg->ContinuousInten;
    }

    DspClearDisplay();
    ShowLCDString(0, 0, title, 0);

    for (step = 0; step < 2; step++)
    {
        DspClearLine(1, LCD_LANG_ENG);
        ShowLCDString(0, 1, msg[step], 0);
        gain = EditGainMenu(type, gain, scale - 1, 0, &keyback);
        if (keyback == MENU_KEY)
            return status;

        for (i = 0; i < scale; i++)
        {
            EnableSensor(type, i, pMenuCfg->RibbonFlag, HALF_AD_SCALE);
            DelayTime(0x800000 / scale);
            StartADConvert(GAP_SENSOR_AD);
            stock[step][i] = ReadAD(GAP_SENSOR_AD);
        }
        DisableSensor(type);
    }

    max = stock[0];
    min = stock[1];

#if defined(GAP_LEVEL_DOWN)
    if (type == GAP_SENSOR)
    {
        min = stock[0];
        max = stock[1];
    }
#endif

#if defined(BLINE_LEVEL_DOWN)
    if (type == BLINE_SENSOR)
    {
        min = stock[0];
        max = stock[1];
    }
#endif

    if (mode == GAP_MODE && GetGapSensorReverse())
    {
        INT *tmp = max;
        max = min;
        min = tmp;
    }

    inten = 0;
    for (i = 0; i < scale; i++)
    {
        if (max[i] < min[i])
            continue;
        if (max[inten] - min[inten] < max[i] - min[i])
            inten = i;
    }
    ref = GetSensorRef(type, max[inten], min[inten]);

    DspClearDisplay();
    ShowLCDString(0, 0, title, 0);
    if (max[inten] - min[inten] < 128)
    {
        ShowLCDString(0, 1, (CHAR *)LCDMessage[MSG_CANT_CALIBRATE][pMenuCfg->Language], 0);
        status = FALSE;
    }
    else
    {
        ShowLCDString(0, 1, (CHAR *)LCDMessage[MSG_COMPLETE][pMenuCfg->Language], 0);
        sprintf(buf, "%-13s%3d", LCDMessage[MSG_INTENSITY][pMenuCfg->Language], inten);
        ShowLCDString(0, 2, buf, 0);
        sprintf(buf, "%-12s%4d", LCDMessage[MSG_REF_LEVEL][pMenuCfg->Language], ref);
        ShowLCDString(0, 3, buf, 0);

        *intenback = inten;
        *refback   = ref;
        status     = TRUE;
    }

    while (CheckKeyPin(SELECT_KEY)){}
    MenuWaitKey();
    return status;
}

STATIC VOID MenuGapAuto(VOID)
{
#ifdef DEBUG_PRNT
sysprintf("Enter MenuGapAuto()...\n"); // ch_20211208
#endif

    DspClearDisplay();
    ShowLCDString(0, 0, (CHAR *)LCDMessage[MSG_GAP_MODE][pMenuCfg->Language], 0);
    ShowLCDString(0, 1, (CHAR *)LCDMessage[MSG_AUTOMATIC][pMenuCfg->Language], 0);

    LeaveMenuFunc(TRUE);
    pMenuCfg->SensorMode    = GAP_MODE;
    pMenuCfg->AutoSensorRef = TRUE;
    DetectSensorInten(pMenuCfg, TRUE, FALSE, 0, 0);
    EntryMenuFunc();
}

STATIC VOID MenuGapManual(VOID)
{
    INT paper, gap;
    INT inten, ref;
    INT keyback;

    paper = EditNumMenu((CHAR **)LCDMessage[MSG_PAPER_LEN],
        (INT)pMenuCfg->fPaperSize, MAX_IMAGE_LENGTH, FALSE, TRUE, &keyback);

    if (keyback == MENU_KEY)
        return;

    gap = EditNumMenu((CHAR **)LCDMessage[MSG_GAP_SIZE],
        (INT)pMenuCfg->fGapSize, (TPH_DPI * 5), FALSE, TRUE, &keyback);

    if (keyback == MENU_KEY)
        return;

    if (MenuSensorManual(GAP_MODE, &inten, &ref))
    {
        pMenuCfg->SensorMode    = GAP_MODE;
        pMenuCfg->fPaperSize    = paper;
        pMenuCfg->fGapSize      = gap;
        pMenuCfg->AutoSensorRef = FALSE;
        pMenuCfg->GapInten      = inten;
        pMenuCfg->GapRef        = ref;
        InitialCalibration();
    }
}

STATIC VOID MenuGapPreprint(VOID)
{
    INT PrePaper, PreGapBline;
    INT keyback;

#ifdef DEBUG_PRNT
sysprintf("Enter MenuGapPreprint()...\n"); // ch_20211208
#endif

    PrePaper = EditNumMenu((CHAR **)LCDMessage[MSG_PAPER_LEN],
        (INT)pMenuCfg->fPaperSize, MAX_IMAGE_LENGTH, FALSE, TRUE, &keyback);

    if (keyback == MENU_KEY)
        return;

    PreGapBline = EditNumMenu((CHAR **)LCDMessage[MSG_GAP_SIZE],
        (INT)pMenuCfg->fGapSize, (TPH_DPI * 5), FALSE, TRUE, &keyback);

    if (keyback == MENU_KEY)
        return;

    DspClearDisplay();
    ShowLCDString(0, 0, (CHAR *)LCDMessage[MSG_GAP_MODE][pMenuCfg->Language], 0);
    ShowLCDString(0, 1, (CHAR *)LCDMessage[MSG_PRE_PRINTED][pMenuCfg->Language], 0);

    LeaveMenuFunc(TRUE);
    pMenuCfg->SensorMode    = GAP_MODE;
    pMenuCfg->AutoSensorRef = FALSE;
    DetectSensorInten(pMenuCfg, TRUE, FALSE, PrePaper, PreGapBline);
    EntryMenuFunc();
}

STATIC VOID MenuGapMode(VOID)
{
    CONST STATIC _MenuItem MenuItem[] = 
    {
        {(CHAR **)_NULL,                            _NULL},
        {(CHAR **)LCDMessage[MSG_AUTOMATIC],        MenuGapAuto},
        {(CHAR **)LCDMessage[MSG_MANUAL],            MenuGapManual},
        {(CHAR **)LCDMessage[MSG_PRE_PRINTED],        MenuGapPreprint},
        {(CHAR **)LCDMessage[MSG_EXIT],                _NULL},
        {(CHAR **)_NULL,                            _NULL}
    };

    RunMenu((_MenuItem *)MenuItem, 0, (CHAR **)LCDMessage[MSG_GAP_MODE]);
}

STATIC VOID MenuBlineAuto(VOID)
{
#ifdef DEBUG_PRNT
sysprintf("Enter MenuBlineAuto()...\n"); // ch_20211208
#endif

    DspClearDisplay();
    ShowLCDString(0, 0, (CHAR *)LCDMessage[MSG_BLINE_MODE][pMenuCfg->Language], 0);
    ShowLCDString(0, 1, (CHAR *)LCDMessage[MSG_AUTOMATIC][pMenuCfg->Language], 0);

    LeaveMenuFunc(TRUE);
    pMenuCfg->SensorMode    = BLINE_MODE;
    pMenuCfg->AutoSensorRef = TRUE;
    DetectSensorInten(pMenuCfg, TRUE, FALSE, 0, 0);
    EntryMenuFunc();
}

STATIC VOID MenuBlineManual(VOID)
{
    INT paper, bline;
    INT inten, ref;
    INT keyback;

    paper = EditNumMenu((CHAR **)LCDMessage[MSG_PAPER_LEN],
        (INT)pMenuCfg->fPaperSize, MAX_IMAGE_LENGTH, FALSE, TRUE, &keyback);

    if (keyback == MENU_KEY)
        return;

    bline = EditNumMenu((CHAR **)LCDMessage[MSG_BLINE_SIZE],
        (INT)pMenuCfg->fGapSize, (TPH_DPI * 5), FALSE, TRUE, &keyback);

    if (keyback == MENU_KEY)
        return;

    if (MenuSensorManual(BLINE_MODE, &inten, &ref))
    {
        pMenuCfg->SensorMode    = BLINE_MODE;
        pMenuCfg->fPaperSize    = paper;
        pMenuCfg->fBlineSize    = bline;
        pMenuCfg->AutoSensorRef = FALSE;
        pMenuCfg->BlineInten    = inten;
        pMenuCfg->BlineRef      = ref;
        InitialCalibration();
    }
}

STATIC VOID MenuBlinePreprint(VOID)
{
    INT PrePaper, PreGapBline;
    INT keyback;

#ifdef DEBUG_PRNT
sysprintf("Enter MenuBlinePreprint()...\n"); // ch_20211208    
#endif

    PrePaper = EditNumMenu((CHAR **)LCDMessage[MSG_PAPER_LEN],
        (INT)pMenuCfg->fPaperSize, MAX_IMAGE_LENGTH, FALSE, TRUE, &keyback);

    if (keyback == MENU_KEY)
        return;

    PreGapBline = EditNumMenu((CHAR **)LCDMessage[MSG_BLINE_SIZE],
        (INT)pMenuCfg->fBlineSize, (TPH_DPI * 5), FALSE, TRUE, &keyback);

    if (keyback == MENU_KEY)
        return;

    DspClearDisplay();
    ShowLCDString(0, 0, (CHAR *)LCDMessage[MSG_BLINE_MODE][pMenuCfg->Language], 0);
    ShowLCDString(0, 1, (CHAR *)LCDMessage[MSG_PRE_PRINTED][pMenuCfg->Language], 0);

    LeaveMenuFunc(TRUE);
    pMenuCfg->SensorMode    = BLINE_MODE;
    pMenuCfg->AutoSensorRef = FALSE;
    DetectSensorInten(pMenuCfg, TRUE, FALSE, PrePaper, PreGapBline);
    EntryMenuFunc();
}

STATIC VOID MenuBlineMode(VOID)
{
    CONST STATIC _MenuItem MenuItem[] = 
    {
        {(CHAR **)_NULL,                            _NULL},
        {(CHAR **)LCDMessage[MSG_AUTOMATIC],        MenuBlineAuto},
        {(CHAR **)LCDMessage[MSG_MANUAL],            MenuBlineManual},
        {(CHAR **)LCDMessage[MSG_PRE_PRINTED],        MenuBlinePreprint},
        {(CHAR **)LCDMessage[MSG_EXIT],                _NULL},
        {(CHAR **)_NULL,                            _NULL}
    };

    RunMenu((_MenuItem *)MenuItem, 0, (CHAR **)LCDMessage[MSG_BLINE_MODE]);
}

STATIC VOID MenuContAuto(VOID)
{
    DspClearDisplay();
    ShowLCDString(0, 0, (CHAR *)LCDMessage[MSG_CONTINUOUS_MODE][pMenuCfg->Language], 0);
    ShowLCDString(0, 1, (CHAR *)LCDMessage[MSG_AUTOMATIC][pMenuCfg->Language], 0);
    delay_msec(500);

    LeaveMenuFunc(TRUE);
    pMenuCfg->SensorMode = CONTINUE_MODE_T;
    DetectContinuousInten(pMenuCfg);
    EntryMenuFunc();
}

STATIC VOID MenuContManual(VOID)
{
    INT inten, ref;

    if (MenuSensorManual(CONTINUE_MODE_T, &inten, &ref))
    {
        pMenuCfg->SensorMode      = CONTINUE_MODE_T;
        pMenuCfg->ContinuousInten = inten;
        pMenuCfg->ContinuousRef   = ref;
        InitialCalibration();
    }
}

STATIC VOID MenuContMode(VOID)
{
    CONST STATIC _MenuItem MenuItem[] = 
    {
        {(CHAR **)_NULL,                        _NULL},
        {(CHAR **)LCDMessage[MSG_AUTOMATIC],    MenuContAuto},
        {(CHAR **)LCDMessage[MSG_MANUAL],        MenuContManual},
        {(CHAR **)LCDMessage[MSG_EXIT],            _NULL},
        {(CHAR **)_NULL,                        _NULL}
    };

    RunMenu((_MenuItem *)MenuItem, 0, (CHAR **)LCDMessage[MSG_CONTINUOUS_MODE]);
}

STATIC VOID MenuSensorCalibration(VOID)
{
    CONST STATIC _MenuItem MenuItem[] = 
    {
        {(CHAR **)_NULL,                            _NULL},
        {(CHAR **)LCDMessage[MSG_GAP_MODE],            MenuGapMode},
        {(CHAR **)LCDMessage[MSG_BLINE_MODE],        MenuBlineMode},
        {(CHAR **)LCDMessage[MSG_CONTINUOUS_MODE],    MenuContMode},
        {(CHAR **)LCDMessage[MSG_EXIT],                _NULL},
        {(CHAR **)_NULL,                            _NULL}
    };

    RunMenu((_MenuItem *)MenuItem, 0, (CHAR **)LCDMessage[MSG_CALIBRATION]);
}

STATIC VOID MenuSensor(VOID)
{
    CONST STATIC _MenuItem MenuItem[] = 
    {
        {(CHAR **)_NULL,                        _NULL},
        {(CHAR **)LCDMessage[MSG_STATUS],        MenuSensorStatus},
        {(CHAR **)LCDMessage[MSG_CALIBRATION],    MenuSensorCalibration},
        {(CHAR **)LCDMessage[MSG_EXIT],            _NULL},
        {(CHAR **)_NULL,                        _NULL}
    };

    RunMenu((_MenuItem *)MenuItem, 0, (CHAR **)LCDMessage[MSG_SENSOR]);
}

STATIC VOID MenuSerialBaudRate(VOID)
{
    CONST STATIC _SetItem SetItem[] = 
    {
        {(CHAR **)_NULL,                        _NULL},
        {(CHAR **)LCDMessage[MSG_1200BPS],        UART_BAUD_1200},
        {(CHAR **)LCDMessage[MSG_2400BPS],        UART_BAUD_2400},
        {(CHAR **)LCDMessage[MSG_4800BPS],        UART_BAUD_4800},
        {(CHAR **)LCDMessage[MSG_9600BPS],        UART_BAUD_9600},
        {(CHAR **)LCDMessage[MSG_19200BPS],        UART_BAUD_19200},
        {(CHAR **)LCDMessage[MSG_38400BPS],        UART_BAUD_38400},
        {(CHAR **)LCDMessage[MSG_57600BPS],        UART_BAUD_57600},
        {(CHAR **)LCDMessage[MSG_115200BPS],    UART_BAUD_115200},
        {(CHAR **)LCDMessage[MSG_EXIT],            SET_ITEM_EXIT},
        {(CHAR **)_NULL,                        _NULL}
    };

    pMenuCfg->UartSetting.Baud = 
        SetMenu((_SetItem *)SetItem, pMenuCfg->UartSetting.Baud, (CHAR **)LCDMessage[MSG_BAUD_RATE]);
}

STATIC VOID MenuSerialParity(VOID)
{
    CONST STATIC _SetItem SetItem[] = 
    {
        {(CHAR **)_NULL,                    _NULL},
        {(CHAR **)LCDMessage[MSG_NONE],        UART_PARITY_NONE},
        {(CHAR **)LCDMessage[MSG_ODD],        UART_PARITY_ODD},
        {(CHAR **)LCDMessage[MSG_EVEN],        UART_PARITY_EVEN},
        {(CHAR **)LCDMessage[MSG_EXIT],        SET_ITEM_EXIT},
        {(CHAR **)_NULL,                    _NULL}
    };

    pMenuCfg->UartSetting.Parity = 
        SetMenu((_SetItem *)SetItem, pMenuCfg->UartSetting.Parity, (CHAR **)LCDMessage[MSG_PARITY]);
}

STATIC VOID MenuSerialDataBits(VOID)
{
    CONST STATIC _SetItem SetItem[] = 
    {
        {(CHAR **)_NULL,                        _NULL},
        {(CHAR **)LCDMessage[MSG_7DATA_BITS],    UART_DATA_7},
        {(CHAR **)LCDMessage[MSG_8DATA_BITS],    UART_DATA_8},
        {(CHAR **)LCDMessage[MSG_EXIT],            SET_ITEM_EXIT},
        {(CHAR **)_NULL,                        _NULL}
    };

    pMenuCfg->UartSetting.DataBits = 
        SetMenu((_SetItem *)SetItem, pMenuCfg->UartSetting.DataBits, (CHAR **)LCDMessage[MSG_DATA_BITS]);

}

STATIC VOID MenuSerialStopBits(VOID)
{
    CONST STATIC _SetItem SetItem[] = 
    {
        {(CHAR **)_NULL,                            _NULL},
        {(CHAR **)LCDMessage[MSG_ONE_STOP_BIT],        UART_STOP_ONE},
        {(CHAR **)LCDMessage[MSG_TWO_STOP_BITS],    UART_STOP_TWO},
        {(CHAR **)LCDMessage[MSG_EXIT],                SET_ITEM_EXIT},
        {(CHAR **)_NULL,                            _NULL}
    };

    pMenuCfg->UartSetting.Stop = 
        SetMenu((_SetItem *)SetItem, pMenuCfg->UartSetting.Stop, (CHAR **)LCDMessage[MSG_STOP_BITS]);
}

STATIC VOID MenuSerialComm(VOID)
{
    CONST STATIC _MenuItem MenuItem[] = 
    {
        {(CHAR **)_NULL,                            _NULL},
        {(CHAR **)LCDMessage[MSG_BAUD_RATE],        MenuSerialBaudRate},
        {(CHAR **)LCDMessage[MSG_PARITY],            MenuSerialParity},
        {(CHAR **)LCDMessage[MSG_DATA_BITS],        MenuSerialDataBits},
        {(CHAR **)LCDMessage[MSG_STOP_BITS],        MenuSerialStopBits},
        {(CHAR **)LCDMessage[MSG_EXIT],                _NULL},
        {(CHAR **)_NULL,                            _NULL}
    };

    RunMenu((_MenuItem *)MenuItem, 0, (CHAR **)LCDMessage[MSG_SERIAL_COMM]);

    UartSetting(pMenuCfg->UartSetting);
}

STATIC VOID MenuSetDate(VOID)
{
    STATIC CONST LONG mdays[] = { 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
    CHAR *msg = (CHAR *)LCDMessage[MSG_DATE][pMenuCfg->Language];
    CHAR buf[20], rev[12];
    LONG date[3] = { GetRTC(RTC_YEAR), GetRTC(RTC_MONTH), GetRTC(RTC_DATE) };
    INT index = 0;

    DspClearDisplay();
    ShowLCDString(((16 - strlen(msg)) / 2), 1, msg, 0);

    while (1)
    {
        sprintf(buf, "%04u/%02u/%02u", date[0], date[1], date[2]);
        sprintf(rev, "%0*u", (index ? 2 : 4), date[index]);
        ShowLCDString(((16 - strlen(buf)) / 2), 2, buf, 0);
        ShowLCDString(((16 - strlen(buf)) / 2) + (index * 3) + (index ? 2 : 0), 2, rev, 1);

        while (CheckKeyPin(SELECT_KEY)){}
        while (CheckBuzzerStatus()){}
        switch (MenuWaitKey())
        {
            case MENU_KEY:    // exit
                return;
            case UP_KEY:    // next
                if (MenuWriteProtect())
                    break;
                date[index] += 1;
                if (date[0] > 2030)
                    date[0] = 1970;
                if (date[1] > 12)
                    date[1] = 1;
                if (date[2] > mdays[date[1] - 1])
                    date[2] = 1;
                break;
            case DOWN_KEY:    // shift
                index = (index + 1) % 3;
                break;
            case SELECT_KEY:    // entry
                SetRTC(RTC_YEAR,  date[0]);
                SetRTC(RTC_MONTH, date[1]);
                SetRTC(RTC_DATE,  date[2]);
                return;
        }
    }
}

STATIC VOID MenuSetTime(VOID)
{
    CHAR *msg = (CHAR *)LCDMessage[MSG_TIME][pMenuCfg->Language];
    CHAR buf[20], rev[12];
    LONG time[3] = { GetRTC(RTC_HOUR), GetRTC(RTC_MIN), GetRTC(RTC_SEC) };
    INT index = 0;

    DspClearDisplay();
    ShowLCDString(((16 - strlen(msg)) / 2), 1, msg, 0);

    while (1)
    {
        sprintf(buf, "%02u:%02u:%02u", time[0], time[1], time[2]);
        sprintf(rev, "%02u", time[index]);
        ShowLCDString(((16 - strlen(buf)) / 2), 2, buf, 0);
        ShowLCDString(((16 - strlen(buf)) / 2) + (index * 3), 2, rev, 1);

        while (CheckKeyPin(SELECT_KEY)){}
        while (CheckBuzzerStatus()){}
        switch (MenuWaitKey())
        {
            case MENU_KEY:    // exit
                return;
            case UP_KEY:    // next
                if (MenuWriteProtect())
                    break;
                time[index] = (time[index] + 1) % (index ? 60 : 24);
                break;
            case DOWN_KEY:    // shift
                index = (index + 1) % 3;
                break;
            case SELECT_KEY:    // entry
                SetRTC(RTC_HOUR, time[0]);
                SetRTC(RTC_MIN,  time[1]);
                SetRTC(RTC_SEC,  time[2]);
                return;
        }
    }
}

STATIC VOID MenuDateTime(VOID)
{
    CONST STATIC _MenuItem MenuItem[] = 
    {
        {(CHAR **)_NULL,                        _NULL},
        {(CHAR **)LCDMessage[MSG_DATE],            MenuSetDate},
        {(CHAR **)LCDMessage[MSG_TIME],            MenuSetTime},
        {(CHAR **)LCDMessage[MSG_EXIT],            _NULL},
        {(CHAR **)_NULL,                        _NULL}
    };

    RunMenu((_MenuItem *)MenuItem, 0, (CHAR **)LCDMessage[MSG_DATE_TIME]);
}

STATIC VOID MenuRibbonWound(VOID)
{
    CONST STATIC _SetItem SetItem[] = 
    {
        {(CHAR **)_NULL,                            _NULL},
        {(CHAR **)LCDMessage[MSG_INK_SIDE_IN],        TRUE},
        {(CHAR **)LCDMessage[MSG_INK_SIDE_OUT],        FALSE},
        {(CHAR **)LCDMessage[MSG_EXIT],                SET_ITEM_EXIT},
        {(CHAR **)_NULL,                            _NULL}
    };

    pMenuCfg->RibbonInside = 
        (_ePrintOutMode)SetMenu((_SetItem *)SetItem, pMenuCfg->RibbonInside, (CHAR **)LCDMessage[MSG_RIBBON_WOUND]);
}

#if defined(NUTNET)

STATIC VOID MenuNetShowIP(VOID)
{
    INT Key = SELECT_KEY;
    INT Page = 0;

    while (1)
    {
        DspClearDisplay();

        if (Page == 0)
        {
            ShowLCDString(0, 0, (CHAR *)LCDMessage[MSG_IP_ADDRESS][pMenuCfg->Language], 0);
            ShowLCDString(0, 1, inet_ntoa(GetNetworkIP(ITEM_IP_ADDRESS)), 0);
            ShowLCDString(0, 2, (CHAR *)LCDMessage[MSG_SUBNET_MASK][pMenuCfg->Language], 0);
            ShowLCDString(0, 3, inet_ntoa(GetNetworkIP(ITEM_SUBNET_MASK)), 0);

            LcdPut(119, 55, 8, 8, (UCHAR *)IcoNext, 0);
        }
        else if (Page == 1)
        {
            ShowLCDString(0, 0, (CHAR *)LCDMessage[MSG_GATEWAY][pMenuCfg->Language], 0);
            ShowLCDString(0, 1, inet_ntoa(GetNetworkIP(ITEM_GATEWAY)), 0);

            LcdPut(119, 0, 8, 8, (UCHAR *)IcoPrev, 0);
        }

        while (CheckKeyPin(Key)){}

        Key = MenuWaitKey();
        if (Key == UP_KEY)        // up page
            Page = 0;
        if (Key == DOWN_KEY)    // down page
            Page = 1;
        if (Key == MENU_KEY || Key == SELECT_KEY)    // exit
            return;
    }
}

STATIC VOID MenuNetShowMac(VOID)
{
    CHAR Buf[20];

    DspClearDisplay();

    ShowLCDString(0, 0, (CHAR *)LCDMessage[MSG_MAC_ADDRESS][pMenuCfg->Language], 0);

    sprintf(Buf, "%02X%02X%02X-%02X%02X%02X",
        pMenuCfg->confnet.cdn_mac[0], pMenuCfg->confnet.cdn_mac[1],
        pMenuCfg->confnet.cdn_mac[2], pMenuCfg->confnet.cdn_mac[3],
        pMenuCfg->confnet.cdn_mac[4], pMenuCfg->confnet.cdn_mac[5]);

    ShowLCDString(0, 1, Buf, 0);

    while (CheckKeyPin(SELECT_KEY)){}
    MenuWaitKey();
}

//STATIC VOID MenuNetShowProtocol(VOID)
//{
//    DspClearDisplay();
//    ShowLCDString(0, 0, (CHAR *)LCDMessage[MSG_TCPIP_PROTOCOL][pMenuCfg->Language], 0);
//    while (CheckKeyPin(SELECT_KEY)){}
//    MenuWaitKey();
//}

STATIC VOID MenuNetStatus(VOID)
{
    CONST STATIC _MenuItem MenuItem[] = 
    {
        {(CHAR **)_NULL,                        _NULL},
        {(CHAR **)LCDMessage[MSG_IP_ADDRESS],    MenuNetShowIP},
        {(CHAR **)LCDMessage[MSG_MAC],            MenuNetShowMac},
    //    {(CHAR **)LCDMessage[MSG_PROTOCOL],        MenuNetShowProtocol},
        {(CHAR **)LCDMessage[MSG_EXIT],            _NULL},
        {(CHAR **)_NULL,                        _NULL}
    };

    RunMenu((_MenuItem *)MenuItem, 0, (CHAR **)LCDMessage[MSG_STATUS]);
}

STATIC VOID MenuNetDHCP(VOID)
{
    if (!SureMenu((CHAR **)LCDMessage[MSG_DHCP]))
        return;

    // If this address is set to 0.0.0.0, will try
    //   to obtain one from the DHCP server.
    pMenuCfg->confnet.cdn_cip_addr = 0;

    DspClearDisplay();
    PrinterReboot();
}

STATIC VOID MenuNetStaticIP(VOID)
{
    ULONG ip, mask, geteway;
    INT keyback;

    ip = EditAddrMenu((CHAR **)LCDMessage[MSG_IP_ADDRESS], pMenuCfg->confnet.cdn_cip_addr, &keyback);
    if (keyback == MENU_KEY)
        return;

    mask = EditAddrMenu((CHAR **)LCDMessage[MSG_SUBNET_MASK], pMenuCfg->confnet.cdn_ip_mask, &keyback);
    if (keyback == MENU_KEY)
        return;

    geteway = EditAddrMenu((CHAR **)LCDMessage[MSG_GATEWAY], pMenuCfg->confnet.cdn_gateway, &keyback);
    if (keyback == MENU_KEY)
        return;

    if (!SureMenu((CHAR **)LCDMessage[MSG_STATIC_IP]))
        return;

    // Configure IP address
    pMenuCfg->confnet.cdn_cip_addr = ip;
    pMenuCfg->confnet.cdn_ip_mask  = mask;
    pMenuCfg->confnet.cdn_gateway  = geteway;

    DspClearDisplay();
    PrinterReboot();
}

STATIC VOID MenuNetConfigure(VOID)
{
    CONST STATIC _MenuItem MenuItem[] = 
    {
        {(CHAR **)_NULL,                        _NULL},
        {(CHAR **)LCDMessage[MSG_DHCP],            MenuNetDHCP},
        {(CHAR **)LCDMessage[MSG_STATIC_IP],    MenuNetStaticIP},
        {(CHAR **)LCDMessage[MSG_EXIT],            _NULL},
        {(CHAR **)_NULL,                        _NULL}
    };

    RunMenu((_MenuItem *)MenuItem, 0, (CHAR **)LCDMessage[MSG_CONFIGURE]);
}

//STATIC VOID MenuNetReset(VOID)
//{
//    if (!SureMenu((CHAR **)LCDMessage[MSG_RESET]))
//        return;
//
//    DspClearDisplay();
//    PrinterReboot();
//}

STATIC VOID MenuEthernet(VOID)
{
    CONST STATIC _MenuItem MenuItem[] = 
    {
        {(CHAR **)_NULL,                            _NULL},
        {(CHAR **)LCDMessage[MSG_STATUS],            MenuNetStatus},
        {(CHAR **)LCDMessage[MSG_CONFIGURE],        MenuNetConfigure},
    //    {(CHAR **)LCDMessage[MSG_RESET],            MenuNetReset},
        {(CHAR **)LCDMessage[MSG_EXIT],                _NULL},
        {(CHAR **)_NULL,                            _NULL}
    };

    RunMenu((_MenuItem *)MenuItem, 0, (CHAR **)LCDMessage[MSG_ETHERNET]);
}

#endif

STATIC VOID MenuSetup(VOID)
{
    CONST STATIC _MenuItem MenuItem[] = 
    {
        {(CHAR **)_NULL,                            _NULL},
        {(CHAR **)LCDMessage[MSG_PRINT_SETUP],        MenuPrinterSetup},
        {(CHAR **)LCDMessage[MSG_SENSOR],            MenuSensor},
        {(CHAR **)LCDMessage[MSG_SERIAL_COMM],        MenuSerialComm},
        {(CHAR **)LCDMessage[MSG_DATE_TIME],        MenuDateTime},
#if defined(TTP286M_MACH)
        {(CHAR **)LCDMessage[MSG_RIBBON_WOUND],        MenuRibbonWound},
#endif
        {(CHAR **)LCDMessage[MSG_EXIT],                _NULL},
        {(CHAR **)_NULL,                            _NULL}
    };

#if defined(NUTNET)
    CONST STATIC _MenuItem MenuItemNet[] = 
    {
        {(CHAR **)_NULL,                            _NULL},
        {(CHAR **)LCDMessage[MSG_PRINT_SETUP],        MenuPrinterSetup},
        {(CHAR **)LCDMessage[MSG_SENSOR],            MenuSensor},
        {(CHAR **)LCDMessage[MSG_SERIAL_COMM],        MenuSerialComm},
        {(CHAR **)LCDMessage[MSG_DATE_TIME],        MenuDateTime},
#if defined(TTP286M_MACH)
        {(CHAR **)LCDMessage[MSG_RIBBON_WOUND],        MenuRibbonWound},
#endif
        {(CHAR **)LCDMessage[MSG_ETHERNET],            MenuEthernet},
        {(CHAR **)LCDMessage[MSG_EXIT],                _NULL},
        {(CHAR **)_NULL,                            _NULL}
    };

    if (GetThreadByName("ethernet"))
        RunMenu((_MenuItem *)MenuItemNet, 0, (CHAR **)LCDMessage[MSG_SETUP]);
    else
#endif
        RunMenu((_MenuItem *)MenuItem, 0, (CHAR **)LCDMessage[MSG_SETUP]);
}

STATIC VOID MenuFilesListDram(VOID)
{
    FileMenu((CHAR **)LCDMessage[MSG_DRAM_FILE_LIST], DRAM_DEVICE);
}

STATIC VOID MenuFilesListFlash(VOID)
{
    FileMenu((CHAR **)LCDMessage[MSG_FLASH_FILE_LIST], FLASH_DEVICE);
}

STATIC VOID MenuFilesListCard(VOID)
{
    FileMenu((CHAR **)LCDMessage[MSG_CARD_FILE_LIST], CARD_DEVICE);
}

STATIC VOID MenuFileList(VOID)
{
    CONST STATIC _MenuItem MenuItem[] = 
    {
        {(CHAR **)_NULL,                        _NULL},
        {(CHAR **)LCDMessage[MSG_DRAM],            MenuFilesListDram},
        {(CHAR **)LCDMessage[MSG_FLASH],        MenuFilesListFlash},
        {(CHAR **)LCDMessage[MSG_CARD],            MenuFilesListCard},
        {(CHAR **)LCDMessage[MSG_EXIT],            _NULL},
        {(CHAR **)_NULL,                        _NULL}
    };

    RunMenu((_MenuItem *)MenuItem, 0, (CHAR **)LCDMessage[MSG_FILE_LIST]);
}

STATIC VOID MenuAvailMemory(VOID)
{
    CHAR Buf[20];

    DspClearDisplay();

    ShowLCDString(0, 0, (CHAR *)LCDMessage[MSG_AVAIL_MEM][pMenuCfg->Language], 0);

    sprintf(Buf, "DRAM: %7d KB", FreeSpace(DRAM_DEVICE));
    ShowLCDString(0, 1, Buf, 0);

    sprintf(Buf, "FLASH:%7d KB", FreeSpace(FLASH_DEVICE));
    ShowLCDString(0, 2, Buf, 0);

    sprintf(Buf, "CARD: %7d KB", FreeSpace(CARD_DEVICE));
    ShowLCDString(0, 3, Buf, 0);

    while (CheckKeyPin(SELECT_KEY)){}
    MenuWaitKey();
}

STATIC VOID MenuClearDramAllFile(VOID)
{
    if (!SureMenu((CHAR **)LCDMessage[MSG_DEL_ALL_FILE]))
        return;

    DspClearDisplay();
    ErasingFile(DRAM_DEVICE, "*");
}

STATIC VOID MenuClearFlashAllFile(VOID)
{
    if (!SureMenu((CHAR **)LCDMessage[MSG_DEL_ALL_FILE]))
        return;

    DspClearDisplay();
    ErasingFile(FLASH_DEVICE, "*");
}

STATIC VOID MenuClearCardAllFile(VOID)
{
    if (!SureMenu((CHAR **)LCDMessage[MSG_DEL_ALL_FILE]))
        return;

    DspClearDisplay();
    ErasingFile(CARD_DEVICE, "*");
}

STATIC VOID MenuClearAllFile(VOID)
{
    CONST STATIC _MenuItem MenuItem[] = 
    {
        {(CHAR **)_NULL,                    _NULL},
        {(CHAR **)LCDMessage[MSG_DRAM],        MenuClearDramAllFile},
        {(CHAR **)LCDMessage[MSG_FLASH],    MenuClearFlashAllFile},
        {(CHAR **)LCDMessage[MSG_CARD],        MenuClearCardAllFile},
        {(CHAR **)LCDMessage[MSG_EXIT],        _NULL},
        {(CHAR **)_NULL,                    _NULL}
    };

    RunMenu((_MenuItem *)MenuItem, 0, (CHAR **)LCDMessage[MSG_DELETE]);
}

STATIC VOID MenuFileManager(VOID)
{
    CONST STATIC _MenuItem MenuItem[] = 
    {
        {(CHAR **)_NULL,                            _NULL},
        {(CHAR **)LCDMessage[MSG_FILE_LIST],        MenuFileList},
        {(CHAR **)LCDMessage[MSG_AVAIL_MEM],        MenuAvailMemory},
        {(CHAR **)LCDMessage[MSG_DEL_ALL_FILE],        MenuClearAllFile},
        {(CHAR **)LCDMessage[MSG_EXIT],                _NULL},
        {(CHAR **)_NULL,                            _NULL}
    };

    RunMenu((_MenuItem *)MenuItem, 0, (CHAR **)LCDMessage[MSG_FILE_MANAGER]);
}

STATIC VOID MenuDiagPrinterConfig(VOID)
{
    REPORT *Report;

    LeaveMenuFunc(TRUE);
    SetDisplayStatus(DIS_SELFTEST);
    Report = SelfTestReport(NULL, FALSE, OUTPUT_LABEL);
#if defined(NUTNET)
    if (GetThreadByName("ethernet"))
        Report = IpConfigReport(Report, FALSE, OUTPUT_LABEL);
#endif
    FileReport(Report, TRUE, OUTPUT_LABEL);
    ClrDisplayStatus(DIS_SELFTEST);
    EntryMenuFunc();
}

STATIC VOID MenuDiagDataDump(VOID)
{
    LeaveMenuFunc(TRUE);
    HexDumpMode();
    EntryMenuFunc();
}

STATIC VOID MenuDiagRotateCutter(VOID)
{
    LeaveMenuFunc(TRUE);
    while (CutterClear() == CUTTER_CUTTING){}
    EntryMenuFunc();
}

//STATIC VOID MenuDiagPrintHead(VOID)
//{
//    CHAR Buf[20];
//    INT Temp;
//
//    DspClearDisplay();
//    ShowLCDString(0, 0, (CHAR *)LCDMessage[MSG_PRINT_HEAD][pMenuCfg->Language], 0);
//
//    StartADConvert(TPH_TEMP_AD);
//    Temp = ReadAD(TPH_TEMP_AD);
//    Temp = CalculateTPHTemp(Temp);
//
//    sprintf(Buf, "%-12s%4d",(CHAR *)LCDMessage[MSG_TEMPERATURE][pMenuCfg->Language], Temp);
//    ShowLCDString(0, 1, Buf, 0);
//
//    sprintf(Buf, "%-12s%4d",(CHAR *)LCDMessage[MSG_RESISTANCE][pMenuCfg->Language], 0);
//    ShowLCDString(0, 2, Buf, 0);
//
//    sprintf(Buf, "%-12s%4d",(CHAR *)LCDMessage[MSG_BAD_DOTS][pMenuCfg->Language], 0);
//    ShowLCDString(0, 3, Buf, 0);
//
//    while (CheckKeyPin(SELECT_KEY)){}
//    MenuWaitKey();
//}

STATIC VOID MenuDiagnostics(VOID)
{
    CONST STATIC _MenuItem MenuItem[] = 
    {
        {(CHAR **)NULL,                                _NULL},
        {(CHAR **)LCDMessage[MSG_PRINTER_CFG],        MenuDiagPrinterConfig},
        {(CHAR **)LCDMessage[MSG_DUMPMODE],            MenuDiagDataDump},
        {(CHAR **)LCDMessage[MSG_ROTATE_CUTTER],    MenuDiagRotateCutter},
//        {(CHAR **)LCDMessage[MSG_PRINT_HEAD],        MenuDiagPrintHead},
        {(CHAR **)LCDMessage[MSG_EXIT],                _NULL},
        {(CHAR **)_NULL,                            _NULL}
    };

    RunMenu((_MenuItem *)MenuItem, 0, (CHAR **)LCDMessage[MSG_DIAGNOSTICS]);
}

STATIC VOID MenuLanguage(VOID)
{
    CONST STATIC _SetItem SetItem[] = 
    {
        {(CHAR **)_NULL,                        _NULL},
        {(CHAR **)LCDMessage[MSG_ENGLISH],        LCD_LANG_ENG},
        {(CHAR **)LCDMessage[MSG_TC],            LCD_LANG_TC},
        {(CHAR **)LCDMessage[MSG_SC],            LCD_LANG_SC},
        {(CHAR **)LCDMessage[MSG_JP],            LCD_LANG_JP},
        {(CHAR **)LCDMessage[MSG_KOREAN],        LCD_LANG_KOREAN},
        {(CHAR **)LCDMessage[MSG_GERMAN],        LCD_LANG_GERMAN},
        {(CHAR **)LCDMessage[MSG_ITALIC],        LCD_LANG_ITA},
        {(CHAR **)LCDMessage[MSG_FRENCH],        LCD_LANG_FRECH},
        {(CHAR **)LCDMessage[MSG_RUSSAIN],        LCD_LANG_RUSSAIN},
        {(CHAR **)LCDMessage[MSG_POLISH],        LCD_LANG_POLISH},
        {(CHAR **)LCDMessage[MSG_SPANISH],        LCD_LANG_SPANISH},
        {(CHAR **)LCDMessage[MSG_LITHUANIAN],    LCD_LANG_LITHUANIAN},
        {(CHAR **)LCDMessage[MSG_CZECH],        LCD_LANG_CZECH},
        {(CHAR **)LCDMessage[MSG_EXIT],            SET_ITEM_EXIT},
        {(CHAR **)_NULL,                        _NULL}
    };

    pMenuCfg->Language = 
        SetMenu((_SetItem *)SetItem, pMenuCfg->Language, (CHAR **)LCDMessage[MSG_LANGUAGE]);
}

STATIC VOID MenuInitialization(VOID)
{
    if (!SureMenu((CHAR **)LCDMessage[MSG_INITIALIZATION]))
        return;

    DspClearDisplay();
    SetDisplayStatus(DIS_INITIAL);
    InitialDefaultVar();
    delay_msec(1000);
    ClrDisplayStatus(DIS_INITIAL);
}

STATIC VOID MenuMileageInfo(VOID)
{
    CHAR Buf[20];

    DspClearDisplay();

    ShowLCDString(0, 0, (CHAR *)LCDMessage[MSG_MILEAGE][pMenuCfg->Language], 0);
    sprintf(Buf, "%16d", pMenuRec->DotMilage / (INT)(MM_DOT * 1000));
    ShowLCDString(0, 1, Buf, 0);

    ShowLCDString(0, 2, (CHAR *)LCDMessage[MSG_LABEL][pMenuCfg->Language], 0);
    sprintf(Buf, "%16d", pMenuRec->LabelMilage);
    ShowLCDString(0, 3, Buf, 0);

    while (CheckKeyPin(SELECT_KEY)){}
    MenuWaitKey();
}

STATIC VOID MenuSerialNumber(VOID)
{
    CHAR Buf[32];

    DspClearDisplay();

    ShowLCDString(0, 0, (CHAR *)LCDMessage[MSG_SERIAL][pMenuCfg->Language], 0);
    sprintf(Buf, "%16s", pMenuRec->SerialNumberName);
    ShowLCDString(0, 1, Buf, 0);
    if (strlen(Buf) > 16)
        ShowLCDString(0, 2, Buf + 16, 0);

    while (CheckKeyPin(SELECT_KEY)){}
    MenuWaitKey();
}

STATIC VOID MenuService(VOID)
{
    CONST STATIC _MenuItem MenuItem[] = 
    {
        {(CHAR **)_NULL,                            _NULL},
        {(CHAR **)LCDMessage[MSG_INITIALIZATION],    MenuInitialization},
        {(CHAR **)LCDMessage[MSG_MILEAGE_INFO],        MenuMileageInfo},
        {(CHAR **)LCDMessage[MSG_SERIAL_INFO],        MenuSerialNumber},
        {(CHAR **)LCDMessage[MSG_EXIT],                _NULL},
        {(CHAR **)_NULL,                            _NULL}
    };

    RunMenu((_MenuItem *)MenuItem, 0, (CHAR **)LCDMessage[MSG_SERVICE]);
}

VOID MainMenu(VOID)
{
    CONST STATIC _MenuItem MenuItem[] = 
    {
        {(CHAR **)_NULL,                            _NULL},
        {(CHAR **)LCDMessage[MSG_SETUP],            MenuSetup},
        {(CHAR **)LCDMessage[MSG_FILE_MANAGER],        MenuFileManager},
        {(CHAR **)LCDMessage[MSG_DIAGNOSTICS],        MenuDiagnostics},
        {(CHAR **)LCDMessage[MSG_LANGUAGE],            MenuLanguage},
#if defined(GRAPHIC_PRODUCT)
        {(CHAR **)LCDMessage[MSG_INITIALIZATION],    MenuInitialization},
#else
        {(CHAR **)LCDMessage[MSG_SERVICE],            MenuService},
#endif
        {(CHAR **)LCDMessage[MSG_EXIT],                _NULL},
        {(CHAR **)_NULL,                            _NULL}
    };

    ClrDisplayStatus(DIS_READY);

    EntryMenuFunc();

    InitialMenu();

    sysprintf("InitialMenu MENUVER2\r\n");

    EnableBuzzer(26, 100);
    while (CheckBuzzerStatus()){}

    DspClearDisplay();
    while (CheckKeyPin(MENU_KEY)){}

    RunMenu((_MenuItem *)MenuItem, 0, (CHAR **)LCDMessage[MSG_MAIN_MENU]);

    LeaveMenuFunc(TRUE);

    SetDisplayStatus(DIS_READY);
}

STATIC VOID MenuJobCancel(VOID)
{
    CancelActiveJob();
    ExitMenu = TRUE;
}

STATIC VOID MenuJobReset(VOID)
{
    PrinterReboot();
}

VOID JobMenu(VOID)
{
    CONST STATIC _MenuItem MenuItem[] = 
    {
        {(CHAR **)_NULL,                    _NULL},
        {(CHAR **)LCDMessage[MSG_CANCEL],    MenuJobCancel},
        {(CHAR **)LCDMessage[MSG_RESET],    MenuJobReset},
        {(CHAR **)LCDMessage[MSG_EXIT],        _NULL},
        {(CHAR **)_NULL,                    _NULL}
    };

    BOOL KeyFunc = StopKeyFunc();

    ClrDisplayStatus(DIS_READY);

#if defined(CARRIAGE_OPEN_MODEL)
    StopCheckCarriageOpen();
#endif

    InitialMenu();
    sysprintf("InitialMenu MENUVER3\r\n");

    EnableBuzzer(26, 100);
    while (CheckBuzzerStatus()){}

    DspClearDisplay();
    while (CheckKeyPin(MENU_KEY)){}

    RunMenu((_MenuItem *)MenuItem, 0, (CHAR **)LCDMessage[MSG_JOB_MANAGER]);

    SetDisplayStatus(DIS_READY);

    LeaveMenuFunc(KeyFunc);
}

INT ErrorMenu(VOID)
{
    CONST STATIC _SetItem SetItem[] = 
    {
        {(CHAR **)_NULL,                        _NULL},
        {(CHAR **)LCDMessage[MSG_CANCEL],        1},
        {(CHAR **)LCDMessage[MSG_RESET],        2},
        {(CHAR **)LCDMessage[MSG_EXIT],            SET_ITEM_EXIT},
        {(CHAR **)_NULL,                        _NULL}
    };

    BOOL KeyFunc = StopKeyFunc();
    INT Select = -1;

#ifdef DEBUG_PRNT
sysprintf("Enter ErrorMenu()...\n"); // ch_20211210    
#endif

    ClrDisplayStatus(DIS_READY);

#if defined(CARRIAGE_OPEN_MODEL)
    StopCheckCarriageOpen();
#endif

    InitialMenu();
    sysprintf("ErrorMenu3\r\n");    
    EnableBuzzer(26, 100);
    while (CheckBuzzerStatus()){}

    DspClearDisplay();
    while (CheckKeyPin(MENU_KEY)){}

    Select = SetMenu((_SetItem *)SetItem, Select, (CHAR **)LCDMessage[MSG_JOB_MANAGER]);

    SetDisplayStatus(DIS_READY);

    LeaveMenuFunc(KeyFunc);

    return Select;
}

VOID SensorMenu(_eSensorMode Mode)
{
    BOOL KeyFunc = EntryMenuFunc();
    INT Inten, Ref;

    ClrDisplayStatus(DIS_READY);

    InitialMenu();
    sysprintf("SensorMenu3\r\n");

    EnableBuzzer(26, 100);

    if (MenuSensorManual(Mode, &Inten, &Ref))
    {
        if (Mode == GAP_MODE)
        {
            pMenuCfg->AutoSensorRef = FALSE;
            pMenuCfg->GapInten      = Inten;
            pMenuCfg->GapRef        = Ref;
        }
        else if (Mode == BLINE_MODE)
        {
            pMenuCfg->AutoSensorRef = FALSE;
            pMenuCfg->BlineInten    = Inten;
            pMenuCfg->BlineRef      = Ref;
        }
        else
        {
            pMenuCfg->ContinuousInten = Inten;
            pMenuCfg->ContinuousRef   = Ref;
        }
        pMenuCfg->SensorMode = Mode;
        InitialCalibration();
    }

    LeaveMenuFunc(KeyFunc);

    SetDisplayStatus(DIS_READY);
}

#endif

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值