⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 telbook.c

📁 在ARM7和UC/OSII的平台上实现了GPS自动报站的功能,涉及GPS模块LEA_4S的驱动,位置速寻算法,语音芯片ISD4004的录放音驱动,LED页面管理等等.从启动代码到操作系统的移植以及到业
💻 C
字号:
/****************************************************************
**                                                              *
**  FILE         :  TelBook.C                                   *
**  COPYRIGHT    :  (c) 2001 .Xiamen Yaxon NetWork CO.LTD       *
**                                                              *
**                                                              *
**  By : CCH 2002.1.15                                          *
****************************************************************/
#include "includes.h"
#include "tools.h"
#include "screen.h"
#include "db_sk.h"
#include "db_tb.h"
#include "menuwin.h"
#include "itemmenu.h"
#include "editor.h"
#include "prompt.h"
#include "virphone.h"
#include "skman.h"
#include "telbook.h"

#if EN_HANDSET > 0


/*
********************************************************************************
*                  DEFINE CONFIG PARAMETERS
********************************************************************************
*/
#define SIZE_DPLYBUF                            50

/*
********************************************************************************
*                  DEFINE op_type
********************************************************************************
*/
#define OP_ADD                                  0
#define OP_MODIFY                               1
#define OP_FIND                                 2

/*
********************************************************************************
*                  DEFINE MODULE VARIANTS
********************************************************************************
*/
static TBREC_STRUCT currecord, readrecord;
static INT16S selrecord;
static INT8U  op_type;
static INT8U  dplybuf[SIZE_DPLYBUF];
static void   (*RetInformer)(INT8U tellen, INT8U *tel, INT8U namelen, INT8U *name);



static void AddRec(void)
{
    ActivateStringPrompt("存储中…");
    if (AddTBRec(&currecord))
        ActivateStringPrompt("已存");
    else
        ActivateStringPrompt("存储已满");
}

static void ACK_AddRec(void)
{
    ActivateStringPrompt("存储中…");
    DelTBRec(selrecord);
    AddRec();
}

static void ModifyRec(void)
{
    ActivateStringPrompt("存储中…");
    if (ModifyTBRec(selrecord, &currecord)) 
        ActivateStringPrompt("已修改");
    else
        ActivateStringPrompt("修改失败");
}

static void ACK_ModifyRec(void)
{
    INT16S rec;
    
    ModifyRec();
    rec = GetTBRecByName_FULL(currecord.namelen, currecord.name);
    if (rec != -1) DelTBRec(rec);
}

static void ExitPhoneEditor(void)
{
    INT8U   len;
    INT16S  rec;
    
    if ((currecord.tellen = GetEditorData(currecord.tel)) > 0) {
        if (op_type == OP_MODIFY) {
            PopMenuWin();
            rec = GetTBRecByName_FULL(currecord.namelen, currecord.name);
            if (rec != -1 && rec != selrecord) {
                len = strlen("替换?\n");
                memcpy(dplybuf, "替换?\n", len);
                memcpy(dplybuf + len, currecord.name, currecord.namelen);
                ActivateSelPrompt(dplybuf, currecord.namelen + len, ACK_ModifyRec);
            } else {
                ModifyRec();
            }
        } else {
            selrecord = GetTBRecByName_FULL(currecord.namelen, currecord.name);
            if (selrecord != -1) {
                len = strlen("替换?\n");
                memcpy(dplybuf, "替换?\n", len);
                memcpy(dplybuf + len, currecord.name, currecord.namelen);
                ActivateSelPrompt(dplybuf, currecord.namelen + len, ACK_AddRec);
            } else {
                AddRec();
            }
        }
    }
}

static EDITOR_STRUCT PhoneEditor = 
{EDT_DIGITAL | EDT_PULS | EDT_CURSOR, 1, TBREC_SIZE_TEL, 0, "请输号码:", 0, 0, 0, ExitPhoneEditor, 0, 0, 0, 0, 0};

static void ActivatePhoneEditor(void)
{
    PhoneEditor.InitPtr = currecord.tel;
    PhoneEditor.InitLen = currecord.tellen;
    CreateEditor(&PhoneEditor);
}

static void ListTB_Init(INT16U initrecord);

static void ExitNameEditor(void)
{
    INT16S findrec;
    
    if ((currecord.namelen = GetEditorData(currecord.name)) > 0) {
        if (op_type != OP_FIND) ActivatePhoneEditor();
        else {
            if ((findrec = GetTBRecByName(currecord.namelen, currecord.name)) == -1) findrec = 0;
            ListTB_Init(findrec);
        }
    }
}

static EDITOR_STRUCT NameEditor = 
{EDT_CURSOR | EDT_CHINESE, 1, TBREC_SIZE_NAME, 0, "姓名:", 0, 0, 0, ExitNameEditor, 0, 0, 0, 0, 0};

static void ActivateNameEditor(void)
{
    NameEditor.InitPtr = currecord.name;
    NameEditor.InitLen = currecord.namelen;
    CreateEditor(&NameEditor);
}

static void AddTB(void)
{
    op_type = OP_ADD;
    currecord.namelen = 0;
    currecord.tellen  = 0;
    ActivateNameEditor();
}

static void ACK_DelProc(void)
{
    PopMenuWin();
    PopMenuWin();
    ActivateStringPrompt("删除中…");
    DelTBRec(selrecord);
    ActivateStringPrompt("已删除");
}

static void DelProc(void)
{
    ActivateSelPrompt("删除?", 0, ACK_DelProc);
}

static void ModifyProc(void)
{
    op_type = OP_MODIFY;
    if (GetTBRec(selrecord, &currecord) == 0) 
        PopMenuWin();
    else 
        ActivateNameEditor();
}

static void DialProc(void)
{
    if (GetTBRec(selrecord, &currecord)) 
        ActivateVirPhone_Dial(FALSE, currecord.tellen, currecord.tel);
}

static ITEMMENU_STRUCT MENU_DIAL                = {ITEM_FCN,  "呼出", DialProc,   0, 0};
static ITEMMENU_STRUCT MENU_DEL                 = {ITEM_FCN,  "删除", DelProc,    0, 0};
static ITEMMENU_STRUCT MENU_MODIFY              = {ITEM_FCN,  "修改", ModifyProc, 0, 0};

static ITEMMENU_STRUCT *MENU_OPREC_CHILD[]      = {&MENU_DIAL, &MENU_MODIFY, &MENU_DEL};
static ITEMMENU_STRUCT MENU_OPREC               = {ITEM_LMENU, 0, 0, 3, MENU_OPREC_CHILD};

static void Handler_KEY_ACK(void)
{
    selrecord = GetMenuWinRecordNum();
    ActivateItemMenu(&MENU_OPREC);
}

static void Handler_KEY_ACK_RET(void)
{
    INT16U num;
    
    num = GetMenuWinRecordNum();
    PopMenuWin();
    if (GetTBRec(num, &currecord)) {
        if (RetInformer != 0) 
            RetInformer(currecord.tellen, currecord.tel, currecord.namelen, currecord.name);
    } else if (RetInformer != 0) {
        RetInformer(0, 0, 0, 0);
    }
}

static INT16U MaxRecordProc(void)
{
    return GetTBItem();
}

static INT16U InitRecordProc(void)
{
    return selrecord;
}

static INT16U ReadRecordProc(INT16S numrec, INT8U *ptr)
{
    INT16U linesize;
    
    if (numrec == -1) {
        memcpy(ptr, "无号码", strlen("无号码"));
        return strlen("无号码");
    }
    if (GetTBRec(numrec, &readrecord) == 0) return 0;
    memcpy(ptr, readrecord.name, readrecord.namelen);
    ptr   += readrecord.namelen;
    *ptr++ = '\n';
    
    linesize = GetScreenLineSize();
    if (linesize > readrecord.tellen) linesize -= readrecord.tellen;
    else linesize = 0;
    InitBuf(ptr, ' ', linesize);
    ptr += linesize;

    memcpy(ptr, readrecord.tel, readrecord.tellen);
    return (readrecord.namelen + 1 + linesize + readrecord.tellen);
}

static MENUWIN_STRUCT ListTBEntry = 
{WIN_FMENU, Handler_KEY_ACK, 0, 0, 0, 0, MaxRecordProc, InitRecordProc, ReadRecordProc};

static void ListTB_Init(INT16U initrecord)
{
    selrecord = initrecord;
    ListTBEntry.Handler_KEY_ACK = Handler_KEY_ACK;
    ActivateMenuWin(&ListTBEntry);
}

void ListTB(void)
{
    ListTB_Init(0);
}

BOOLEAN ListTB_RET(void Informer(INT8U tellen, INT8U *tel, INT8U namelen, INT8U *name))
{
    if (GetTBItem() == 0) return FALSE;
    selrecord   = 0;
    RetInformer = Informer;
    ListTBEntry.Handler_KEY_ACK = Handler_KEY_ACK_RET;
    ActivateMenuWin(&ListTBEntry);
    return TRUE;
}

static void FindTB(void)
{
    op_type = OP_FIND;
    currecord.namelen = 0;
    ActivateNameEditor();
}

static void ACK_DelAllTB(void)
{
    ActivateStringPrompt("删除中…");
    DelDB_TB();
    DelDB_SK();
    ActivateStringPrompt("已删除所有");
}

static void DelAllTB(void)
{
    ActivateSelPrompt("删除所有?", 0, ACK_DelAllTB);
}

static void BrowseMemory(void)
{
    INT8U len, tlen;
    
    len   = DecToAscii(&dplybuf[0], GetTBBlankItem(), 0);
    tlen  = len;
    len   = strlen("个未用\n已用");
    memcpy(&dplybuf[tlen], "个未用\n已用", len);
    tlen += len;
    len   = DecToAscii(&dplybuf[tlen], GetTBItem(), 0);
    tlen += len;
    len   = strlen("个");
    memcpy(&dplybuf[tlen], "个", len);
    tlen += len;
    dplybuf[tlen] = '\0';
    ActivateStringPrompt_TIME((char *)dplybuf, 0);
}


static ITEMMENU_STRUCT MENU_ADD                 = {ITEM_FCN,   "增加",     AddTB,         0, 0};
static ITEMMENU_STRUCT MENU_FIND                = {ITEM_FCN,   "查找",     FindTB,        0, 0};
static ITEMMENU_STRUCT MENU_LIST                = {ITEM_FCN,   "浏览",     ListTB,        0, 0};
static ITEMMENU_STRUCT MENU_DelALL              = {ITEM_FCN,   "删除所有", DelAllTB,      0, 0};
static ITEMMENU_STRUCT MENU_Browse              = {ITEM_FCN,   "存储状况", BrowseMemory,  0, 0};

static ITEMMENU_STRUCT *MENU_TELBOOK_CHILD[]    = {&MENU_ADD, &MENU_FIND, &MENU_LIST, &MENU_DelALL, &MENU_Browse, &MENU_SKMAN};
ITEMMENU_STRUCT MENU_TELBOOK                    = {ITEM_LMENU, "   电话本", 0, 6, MENU_TELBOOK_CHILD};

void SaveToTB(INT8U *tel, INT8U tellen)
{
    if (tellen > sizeof(currecord.tel)) tellen = sizeof(currecord.tel);
    op_type           = OP_ADD;
    currecord.namelen = 0;
    currecord.tellen  = tellen;
    memcpy(currecord.tel, tel, tellen);
    ActivateNameEditor();
}
#endif

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -