📄 sms.c
字号:
// 程序开始
nowstatus = SENDING; // 发送短信
SEND_SMS(newsms->number, newsms->content);
while(!quit)
{
ASIXGetMessage(&msg, NULL, 0, 0);
switch(msg.message)
{
case WM_COMMAND:
switch(nowstatus)
{
case SENDING: //当前状态为发送中时
if(msg.lparam == cancel) //点击取消按钮
{
if(saveflag != 1) //判断是否已保存,未保存是提示是否保存!
{
if(MessageBox(mainwin, "是否保存当前短信?", "提醒", MB_ICONEXCLAMATION|MB_YESNO) == IDYES) //询问是否保存该短信,确定,则保存到短信历史记录项
{
Add2SMSHistory(newsms, SMS_SEND, NULL); // 保存短信到历史记录
saveflag = 1; // 设置已保存标志
}
}
goto SENDFAIL;
}
break;
case FAIL: //当前状态为发送失败时
if(msg.lparam == resend) //点击重发按钮
{
DestroyWindow(cancel); //重绘窗口
DestroyWindow(resend);
SetWindowText(tip, "短信发送中,请稍等···", NULL);
cancel = CreateWindow(WNDCLASS_BUTTON, "取消", WS_CHILD|BS_REGULAR, 60, 140, 40, 20, mainwin, 0, NULL);
SEND_SMS(newsms->number, newsms->content); //发送短信
nowstatus = SENDING; //设置状态
}
else
if(msg.lparam == cancel) //点击取消按钮
{
if(saveflag != 1) //判断是否已保存
{
if(MessageBox(mainwin, "是否保存该短信?", "提醒", MB_ICONEXCLAMATION|MB_YESNO) == IDYES) //询问是否保存该短信,确定,则保存到短信历史记录项
{
Add2SMSHistory(newsms, SMS_SEND, NULL);
saveflag = 1; //设置已保存标志
}
}
goto SENDFAIL;
}
break;
case SUCCESS: //当前状态为发送成功
if(msg.lparam == cancel) //这里的cancel是确定按钮
quit = 1;
break;
}
break;
case WM_AT:
switch(msg.lparam)
{
case AT_RPS_CMGS: //发送成功(不清楚消息的具体名称)
{
AT_RPS_PAR *par = (AT_RPS_PAR *)msg.data;
SetWindowText(tip, "短信发送成功!", NULL); //改变提示消息为发送成功
SetWindowText(cancel, "确定", NULL); //重绘按钮cancel为确定按钮
Add2SMSHistory(newsms, SMS_SEND, NULL); //保存短信到历史记录;
CreateTimer(&t_id, 3000, NULL, NULL, ALARM_MODE|AUTO_CLEAR_MODE); //设定定时器为3秒
StartTimer(t_id);
nowstatus = SUCCESS; //设置当前状态
FreeParameter( par );
}
break;
case AT_RPS_CMS:
case AT_RPS_ERROR:
{
AT_RPS_PAR *par = (AT_RPS_PAR *)msg.data;
SetWindowText(tip, "短信发送失败!是否需要重发?", NULL); //重绘窗口内信息
DestroyWindow(cancel);
resend = CreateWindow(WNDCLASS_BUTTON, "重发", WS_CHILD|BS_REGULAR, 20, 140, 40, 20, mainwin, 0, NULL);
cancel = CreateWindow(WNDCLASS_BUTTON, "取消", WS_CHILD|BS_REGULAR, 100, 140, 40, 20, mainwin, 0, NULL);
nowstatus = FAIL; //设置当前状态
FreeParameter( par );
}
break;
}
break;
case WM_TIMER:
if(msg.lparam == t_id)
quit = 1;
break;
case WM_ALARM: //收到短信
quit = 1;
//发送消息收到短信
AdvSendMessage(GetCurTask()->id, (P_MESSAGE)(&msg), NO_SWAP_TASK);
break;
}
DefWindowProc(msg.message, msg.lparam, msg.data, msg.wparam);
}
DestroyWindow(mainwin);
dbgprintf( "### Exit 短信发送 ###" );
return SEND_OK;
SENDFAIL:
DestroyWindow(mainwin);
dbgprintf( "### Exit 短信发送 ###" );
return SEND_FAIL;
}
// 保存短信
//---------------------------------------------------------------
// SaveSMS()
//
// save SMS acorrding to the type.
//
// Parameters:
// SMS *sms - the SMS needing save.
// S16 savetype - the type of saving.
//
// Returns:
// SAVE_SMS_OK : success saving.
// SAVE_SMS_FAIL : fail to save.
//---------------------------------------------------------------
STATUS SaveSMS(SMS *sms, S16 savetype) //sms为短信,savetype为保存类型
{
// 定义变量
// 初始化参数
// 程序开始
dbgprintf( "### Enter 保存短信 ###" );
switch(savetype)
{
case SMS_HISTORY: //保存为历史纪录
if(Add2SMSHistory(sms, SMS_SEND, NULL) == SAVE_SMS_FAIL)
return SAVE_SMS_FAIL;
break;
case SMS_PHONEBOOK: //保存电话号码
if(AddPhonetoBook(sms->number) == SAVE_SMS_FAIL)
return SAVE_SMS_FAIL;
break;
case SMS_NOTEBOOK: //保存记事本
if(SaveSmsNote(sms) == SAVE_SMS_FAIL)
return SAVE_SMS_FAIL;
break;
}
dbgprintf( "### Enter 保存短信 ###" );
return SAVE_SMS_OK;
}
// 选择常用语
//---------------------------------------------------------------
// ChoosePhrase()
//
// Choose the phrase.
//
// Parameters:
// char *rphs - the string transfer the phrase.
//
// Returns:
//---------------------------------------------------------------
void ChoosePhrase(char *rphs) //rphs为选定常用语
{
// 定义窗口和控件
U32 mainwin;
U32 phrase[PHS_DISP_MAX]; //按钮列表
U32 vscroll; //滚动条
// 定义函数用变量
MSG msg;
S16 phsnum = 0; // 已有的常用语个数
char phs[PHS_MAX_NUM*(PHS_MAX_SIZE+1)]; //常用语字符串矩阵数组
S16 i; // 用与建立按钮列表的循环
S16 no = -1; //返回时用做标识,标识第几条常用语,-1表示没有选直接退出
S16 row = 1; // 滚动条操作中使用,(当常用语个数超过了最大显示个数)拉动滚动条后的显示的第一个常用语与常用语列表的首地址的偏移量
S16 length = PHS_DISP_MAX; // 滚动条的长度
S16 flag = 0; // 滚动条中使用判断
S16 quit = 0;
// 初始化
dbgprintf( "### Enter 选择常用语 ###" );
GetPhrase(&phsnum, phs); //读入常用语列表和个数(个数通过传递变量地址得到)
if(*phs == '\0') //返回为空,则表示没有读入或读入错误
{
*rphs = '\0';
goto END;
}
if(phsnum >PHS_DISP_MAX) //判断是否使用滚动条
{
length = phsnum;
}
// 弹出常用语并选择
mainwin = CreateWindow(WNDCLASS_WIN, "PHRASE", WS_OVERLAPPEDWINDOW, 0, 90, PHY_LCD_W, 130, 0, 0, NULL);
vscroll= CreateWindow(WNDCLASS_SCROLL, "SCROLL", WS_CHILD|SBS_VERT, (LCD_WIDTH - 150)/2 + 138, 111, 20, 108, mainwin, MAKELONG(1, length - PHS_DISP_MAX + 1), NULL); //由前面的判断的到常用语个数小于显示最大值时,不显示滑动块
for(i = 0; i < PHS_DISP_MAX; i++) //创建按钮列表,每个高度20,依次向下创建按钮
{
if(i < phsnum)
phrase[i] = CreateWindow(WNDCLASS_BUTTON, (phs + i * PHS_MAX_SIZE), WS_CHILD|BS_REGULAR, (LCD_WIDTH - 150)/2, (U16)(111 + i*(20 + 1)), 137, 20, mainwin, 0, NULL);
else
phrase[i] = CreateWindow(WNDCLASS_BUTTON, "", WS_CHILD|BS_REGULAR, (LCD_WIDTH - 150)/2, (U16)(111 + i*(20 + 1)), 137, 20, mainwin, 0, NULL);
}
//程序开始
while(!quit)
{
ASIXGetMessage(&msg, NULL, 0, 0);
switch(msg.message)
{
case WM_COMMAND: //点击命令,点选某个,就把该常用语的序号附给返回标识no,并退出
for(i = 0; i < PHS_DISP_MAX; i++)
{
if(i < phsnum) //点到空按钮不作响应
{
if(msg.lparam == phrase[i])
{
no = i + row - 1; //所选常用语的序号就是滚动条的偏移量和显示的按钮序号的和
quit = 1;
break;
}
}
}
break;
case WM_VSCROLL: //操作垂直滚动条
if ( msg.lparam == vscroll )
{
if(phsnum <= PHS_DISP_MAX) //当常用语个数小于最大显示个数时,即没有滚动条时不做响应
{
break;
}
switch (msg.wparam)
{
case SB_PAGEUP:
row -= PHS_DISP_MAX;
if (row < 1) row = 1;
break;
case SB_PAGEDOWN:
row += PHS_DISP_MAX;
if (row > (length - PHS_DISP_MAX + 1)) row = (length - PHS_DISP_MAX + 1);
break;
case SB_LINEUP:
row -= 1;
if (row < 1) row = 1;
break;
case SB_LINEDOWN:
row += 1;
if (row > (length - PHS_DISP_MAX + 1)) row = (length - PHS_DISP_MAX + 1);
break;
case SB_THUMBTRACK:
flag = 1;
break;
case SB_ENDSCROLL:
row = GetScrollPos(vscroll,0,0,0);
flag = 0;
break;
}
if(!flag)
{
SetScrollPos(vscroll,row,0,0); // 滚动条拖动定位
for(i = 0; i < PHS_DISP_MAX; i++) // 刷新显示列表拖动后的列表
{
SetWindowText(phrase[i], (phs + (row + i - 1) * PHS_MAX_SIZE), NULL);
}
}
}
break;
case WM_ALARM:
quit = 1;
//发送消息收到短信
AdvSendMessage(GetCurTask()->id, (P_MESSAGE)(&msg), NO_SWAP_TASK);
break;
case WM_QUIT:
quit = 1;
break;
}
DefWindowProc(msg.message, msg.lparam, msg.data, msg.wparam);
}
DestroyWindow(mainwin);
END:
if(no == -1) //当没有选择时,带回空串
*rphs = '\0';
else
strcpy(rphs, (phs + no*PHS_MAX_SIZE)); //把选中的常用语内容附给带回的字符串
dbgprintf( "### Exit 选择常用语 ###" );
return;
}
//---------------------------------------------------------------
// GetPhrase()
//
// Read all the phrases.
//
// Parameters:
// S16 *phsnum - the pointer to the number of all the phrases.
// char *phs - the first pointer to all the phrase.
//
// Returns:
//---------------------------------------------------------------
void GetPhrase(S16 *phsnum, char *phs) //phsnum是常用语个数,phs为首地址。常用语在文件中保存时中间用','隔开,在写入常用语文件时保证常用语符合规范
{
// 定义变量
S16 i = 0;
S16 j = 0;
S16 end = 0;
FILE *fp;
#ifdef SIM_ON_PC
char *file_path = "phs.txt";
#else
char *file_path = "/db5/phs.txt";
#endif
// 程序开始
fp = fopen( file_path, "rb+");
if( fp == NULL) //判断打开文件是否成功
{
*phs = '\0';
return;
}
else //打开成功开始读入
{
while(i < PHS_MAX_NUM && !end) //文件没有结束且没有超出个数限制时,读入,在此保证不超过范围
{
for(j = 0; j < PHS_MAX_SIZE; j++)
{
if(fread((phs + i*PHS_MAX_SIZE + j), sizeof(char), 1, fp) != 1)
{
end = 1;
break;
}
if(*(phs + i*PHS_MAX_SIZE + j) == '\n') //遇到','读入下一条且不超过长度限制
{
break;
}
}
*(phs + i*PHS_MAX_SIZE + j) = '\0';
i++;
}
}
fclose(fp);
*phsnum = i;
return;
}
//回复短信
//---------------------------------------------------------------
// ReplySMS()
//
// Browse the history of SMS.
//
// Parameters:
// char *phone - the address which to be send to.
//
// Returns:
// SEND_OK : success sending
// SEND_FAIL : fail to send
//---------------------------------------------------------------
STATUS ReplySMS(char *phone)
{
// 定义窗口和控件ID
U32 mainwin; //主窗口
U32 send; //发送按钮
U32 phrase; //常用语调用按钮
U32 note; //记事本菜单
U32 smsedit; //短信内容编辑栏
U32 keyboard; //键盘
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -