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

📄 shortmsg.c

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

#if EN_HANDSET > 0



/*
********************************************************************************
*                  DEFINE MODULE VARIANTS
********************************************************************************
*/
static INT8U        dplybuf[50];
static INT16S       SelRecord;
static SMREC_STRUCT CurRecord, EditRecord;
static INT8U        StoreBuf[300];


static EDITOR_STRUCT TelEditorEntry;
static void CreateSMEditor(void);
static void CreateTelEditor(void);

static void ACK_EraseSM(void)
{
    PopMenuWin();
    PopMenuWin();
    ActivateStringPrompt("删除中…");
    DelSMRec(SelRecord);
    if (!HaveUnReadSMRec()) TurnoffSMIndicator();
    ActivateStringPrompt("已删除");
}

static void EraseSM(void)
{
    ActivateSelPrompt("删除?", 0, ACK_EraseSM);
}

static void TransmitSM(void)
{
    PopMenuWin();
    memcpy(&EditRecord, &CurRecord, sizeof(EditRecord));
    EditRecord.tellen = 0;
    CreateSMEditor();
}

static void WriteBackSM(void)
{
    PopMenuWin();
    memcpy(&EditRecord, &CurRecord, sizeof(EditRecord));
    EditRecord.datalen = 0;
    CreateSMEditor();
}

static void SaveTel(void)
{
    SaveToTB(CurRecord.tel, CurRecord.tellen);
}

static void DialTel(void)
{
    ActivateVirPhone_Dial(FALSE, CurRecord.tellen, CurRecord.tel);
}

static ITEMMENU_STRUCT  MENU_WRITEBACK          = {ITEM_FCN,   "回复",     WriteBackSM, 0, 0};
static ITEMMENU_STRUCT  MENU_TRANSMIT           = {ITEM_FCN,   "转发",     TransmitSM,  0, 0};
static ITEMMENU_STRUCT  MENU_ERASE              = {ITEM_FCN,   "删除",     EraseSM,     0, 0};
static ITEMMENU_STRUCT  MENU_SAVE               = {ITEM_FCN,   "存储号码", SaveTel,     0, 0};
static ITEMMENU_STRUCT  MENU_DIAL               = {ITEM_FCN,   "呼出",     DialTel,     0, 0};
static ITEMMENU_STRUCT *MENU_OPSM_CHILD[]       = {&MENU_ERASE, &MENU_TRANSMIT, &MENU_WRITEBACK, &MENU_SAVE, &MENU_DIAL};
static ITEMMENU_STRUCT  MENU_OPSM               = {ITEM_LMENU, 0, 0, 5, MENU_OPSM_CHILD};

static void Handler_KEY_ACK_CONTENT(void)
{
    ActivateItemMenu(&MENU_OPSM);
}

static INT16U MaxRecordProc_CONTENT(void)
{
    return 3;
}

static INT16U ReadRecordProc_CONTENT(INT16S numrec, INT8U *ptr)
{
    INT8U len, templen;
    
    if (numrec == 0) {
        memcpy(ptr, CurRecord.data, CurRecord.datalen);
        return CurRecord.datalen;
    } else if (numrec == 1) {
        len  = strlen("发信人:");
        memcpy(ptr, "发信人:", len);
        ptr    += len;        
        memcpy(ptr, CurRecord.tel, CurRecord.tellen);
        len    += CurRecord.tellen;
        return len;
    } else if (numrec == 2) {
        len     = strlen("时间:");
        memcpy(ptr, "时间:", len);
        ptr    += len;
        templen = FormatTime(dplybuf, CurRecord.time[0], CurRecord.time[1], CurRecord.time[2]);
        memcpy(ptr, dplybuf, 5);
        len    += 5;
        ptr    += 5;
        *ptr++  = '\n';
        len    += 1;
        templen = FormatYear(ptr, CurRecord.date[0], CurRecord.date[1], CurRecord.date[2]);
        len    += templen;
        return len;
    } else {
        return 0;
    }
}


static MENUWIN_STRUCT MENU_READCONTENT = 
{WIN_FMENU, Handler_KEY_ACK_CONTENT, 0, 0, 0, 0, MaxRecordProc_CONTENT, 0, ReadRecordProc_CONTENT};

static void Handler_KEY_ACK(void)
{
    SelRecord = GetMenuWinRecordNum();
    if (SelRecord != -1) {
        if (GetSMRec(SelRecord, &CurRecord)) {
            ActivateMenuWin(&MENU_READCONTENT);
            ClearSMRecUnReadFlag(SelRecord);                /* clear unread flag */
            if (!HaveUnReadSMRec()) TurnoffSMIndicator();
        }
    }
}

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

static INT16U ReadRecordProc(INT16S numrec, INT8U *ptr)
{
    INT8U len1, len2;
    
    if (numrec == -1) {
        memcpy(ptr, "无信息", strlen("无信息"));
        return strlen("无信息");
    }
    if (SMRecUnRead(numrec)) 
        *ptr++ = 0x7e;
    else 
        *ptr++ = ' ';

    len1 = GetSMRecTel(numrec, dplybuf);
    len2 = GetTBNameByTel(ptr, len1, dplybuf);
    if (len2 > 0) {
        return len2 + 1;
    } else {
        memcpy(ptr, dplybuf, len1);
        return len1 + 1;
    }
}


static MENUWIN_STRUCT MENU_LISTSM = 
{WIN_LMENU, Handler_KEY_ACK, 0, 0, 0, 0, MaxRecordProc, 0, ReadRecordProc};

static void ReadSM(void)
{
    ActivateMenuWin(&MENU_LISTSM);
}

static void SendInformer(INT8U result)
{
    if (result == _SUCCESS) 
        ActivateStringPrompt("发送成功!");
    else
        ActivateStringPrompt("发送失败!");
}

static void GetTelFromTB(INT8U tellen, INT8U *tel, INT8U namelen, INT8U *name)
{
    namelen = namelen;
    name    = name;
    TelEditorEntry.InitLen = tellen;
    TelEditorEntry.InitPtr = tel;
    ResetEditor(&TelEditorEntry);
}

static void ExitTelEditor(void)
{
    INT16U  i;
    BOOLEAN SendSuccess;

    EditRecord.tellen = GetEditorData(EditRecord.tel);
    if (EditRecord.tellen > 0) {
        ExitEditor();                                           /* Exit Editor */
        
        if (!SearchGBCode(EditRecord.data, EditRecord.datalen)) {
            for (i = 0; i < EditRecord.datalen; i++) {
                EditRecord.data[i] = ASCIIToGsmCode(EditRecord.data[i]);
            }
        }        
        SendSuccess = SendSM(SM_ATTR_COMMON | SM_ATTR_DISCODE6 | SM_ATTR_AUTOCODE, 
        EditRecord.tel, EditRecord.tellen, EditRecord.data, EditRecord.datalen, SendInformer);
        EditRecord.tellen = 0;
        if (!SendSuccess)
            ActivateStringPrompt("发送失败!");
        else
            ActivateStringPrompt("发送中…");
    } else {
        if (!ListTB_RET(GetTelFromTB)) {
            ExitEditor();
        }
    }
}

static void CreateTelEditor(void)
{
    memset(&TelEditorEntry, 0, sizeof(TelEditorEntry));
    TelEditorEntry.Mode     = EDT_DIGITAL | EDT_CURSOR | EDT_PULS;
    TelEditorEntry.MinLen   = 0;
    TelEditorEntry.MaxLen   = SMREC_SIZE_TEL;
    TelEditorEntry.LabelLen = strlen("手机号:    ");
    TelEditorEntry.LabelPtr = "手机号:    ";
    TelEditorEntry.InitLen  = EditRecord.tellen;
    TelEditorEntry.InitPtr  = EditRecord.tel;
    TelEditorEntry.AckProc  = ExitTelEditor;
    CreateEditor(&TelEditorEntry);
}

static void AckSMEditor(void)
{
    EditRecord.datalen = GetEditorData(EditRecord.data);
    CreateTelEditor();
}

static INT16U CurLenProc(INT16U len, INT8U *ptr)
{
    return TestGBLen(ptr, len);
}

static INT16U MaxLenProc(INT16U len, INT8U *ptr)
{
    if (SearchGBCode(ptr, len)) 
        return 140;
    else 
        return SMREC_SIZE_DATA;
}

static EDITOR_STRUCT SMEditorEntry = 
{EDT_CURSOR | EDT_CHINESE, 0, 0, 0, 0, 0, 0, StoreBuf, 0, AckSMEditor, CurLenProc, 0, MaxLenProc, 0};

static void CreateSMEditor(void)
{
    SMEditorEntry.InitLen = EditRecord.datalen;
    SMEditorEntry.InitPtr = EditRecord.data;
    CreateEditor(&SMEditorEntry);
}

static void WriteSM(void)
{
    EditRecord.tellen  = 0;
    EditRecord.datalen = 0;
    CreateSMEditor();
}

static void ReadSMSTel(void)
{
    INT8U len;
    
    len = strlen("号码:");
    memcpy(dplybuf, "号码:", len);
    if (!PubParaValid(SMSTEL_) || SmsTel.len == 0) {
        memcpy(&dplybuf[len], "(空白)", strlen("(空白)"));
        len += strlen("(空白)");
    } else {
        memcpy(&dplybuf[len], SmsTel.tel, sizeof(SmsTel.tel));
        len += SmsTel.len;
    }
    
    if (len >= sizeof(dplybuf)) len = sizeof(dplybuf) - 1;
    dplybuf[len] = '\0';
    ActivateStringPrompt_TIME((char *)dplybuf, 0);
}

static void ACK_DelAll(void)
{
    TurnoffSMIndicator();
    ActivateStringPrompt("删除中…");
    DelAllSMRec();
    ActivateStringPrompt("已删除");
}

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


static ITEMMENU_STRUCT  MENU_READSM             = {ITEM_FCN,   "收到的信息",         ReadSM,     0, 0};
static ITEMMENU_STRUCT  MENU_WRITESM            = {ITEM_FCN,   "写信息",             WriteSM,    0, 0};
static ITEMMENU_STRUCT  MENU_SMSTEL             = {ITEM_FCN,   "查看\n短信中心号码", ReadSMSTel, 0, 0};
static ITEMMENU_STRUCT  MENU_DELALL             = {ITEM_FCN,   "删除\n所有信息",     DelAll,     0, 0};
static ITEMMENU_STRUCT *MENU_SHORTMSG_CHILD[]   = {&MENU_WRITESM, &MENU_READSM, &MENU_SMSTEL, &MENU_DELALL};
ITEMMENU_STRUCT MENU_SHORTMSG                   = {ITEM_FMENU, "   短消息", 0, 4, MENU_SHORTMSG_CHILD};


void ActivateReadShorMsgMenu(void)
{
    ReadSM();
}
#endif

⌨️ 快捷键说明

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