message.c 25 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928
  1. #include "includes.h"
  2. SUT_SMS_DEFINE sutSms;
  3. SUT_MESSAGE_EDIT sutMEdit;
  4. static void SmsScan(unsigned char ret);
  5. //#ifdef USE_GWSD_POC
  6. //
  7. //
  8. ////unicodeToGbk(tempSMS, ptr, &sutMess.len);
  9. //#endif
  10. void ShowMessageFlag(unsigned char show){
  11. static unsigned char smsUnReadBackup;
  12. unsigned char showFlag;
  13. showFlag=0;
  14. if(show){
  15. if(sutSms.haveUnRead) showFlag=1;
  16. }else{
  17. if(smsUnReadBackup == sutSms.haveUnRead) return;
  18. smsUnReadBackup = sutSms.haveUnRead;
  19. if(sutSms.haveUnRead) showFlag=1;
  20. }
  21. switch(showFlag)
  22. {
  23. case 0:
  24. guiClearRect(SMS_ICON_X,0,SMS_ICON_X+SMS_ICON_WX,12,COLOR_STATUS_BAR);
  25. //guiShowStr(70,1," ",FONT_MODE_12X12, REVERSED_NO, guiGetForeColor(), COLOR_STATUS_BAR);
  26. break;
  27. case 1:guiShowBmp(SMS_ICON_X,3,"Mail.bmp");break;
  28. //case 2:GuiShowStr(60,3," ",0x01,0);break;
  29. default:break;
  30. }
  31. }
  32. //读取所有信息的前15字节内容
  33. //返回消息总数目
  34. unsigned char GetPagePreMessage(SUT_LIST_BOX *p,unsigned char firstRead, char up_down){
  35. unsigned char i,*ptr,buf[16],ptrTem[8];
  36. uint32_t readAddr;
  37. uint16_t totalnum,retNum;
  38. SUT_SMS_INFO_HEADER info;
  39. unsigned char downFindFirst;//向下查找时第一次找到消息-此时要记录向上查找记录upToBeRead
  40. unsigned char upFindFirst;
  41. unsigned char reCtPerTime;
  42. int fd;
  43. //以下用于交换用
  44. SUT_LIST_BOX_SMS_INFO boxinfo;
  45. unsigned char temp,*Cptr1,*Cptr2;
  46. fd=LSAPI_FS_Open(SMS_FILE, LSAPI_FS_O_RDONLY,0);
  47. if(fd<0){
  48. MSG_ERR(1,"%s GetPagePreMessage open failed", SMS_FILE);
  49. return;
  50. }
  51. //1从最新消息,即sutSms.newestAddr开始读出最多5项
  52. if(sutSms.smsTotalNum >= LIST_ROW) reCtPerTime=LIST_ROW;
  53. else reCtPerTime = sutSms.smsTotalNum;
  54. downFindFirst=0;
  55. upFindFirst=0;
  56. totalnum = SMS_TOTAL_NUM;
  57. ptr=(unsigned char *)&info;
  58. if(firstRead == 1){
  59. //SmsScan(1);
  60. sutSms.downToBeRead = sutSms.newestAddr;
  61. LSAPI_FS_Seek(fd, sutSms.newestAddr, LSAPI_FS_SEEK_SET);
  62. LSAPI_FS_Read(fd, ptr,sizeof( SUT_SMS_INFO_HEADER));
  63. //sFlash_Read(ptr, sutSms.newestAddr, sizeof(struct SUT_SMS_INFO_HEADER));
  64. sutSms.upToBeRead = info.upperAddr;
  65. firstRead=0;
  66. }
  67. i=0;
  68. if(up_down == 'd')
  69. {//向下读
  70. while(1)
  71. {
  72. readAddr = sutSms.downToBeRead;
  73. //1.1读出年月日(16/06/01 = 8字节)+内容7字节
  74. LSAPI_FS_Seek(fd, readAddr, LSAPI_FS_SEEK_SET);
  75. LSAPI_FS_Read(fd, ptr,sizeof( SUT_SMS_INFO_HEADER));
  76. LSAPI_FS_Seek(fd, readAddr+SMS_INFO_DETAIL_OFFSET, LSAPI_FS_SEEK_SET);
  77. LSAPI_FS_Read(fd, ptrTem,8);
  78. //sFlash_Read(ptr, readAddr, sizeof(struct SUT_SMS_INFO_HEADER));
  79. //sFlash_Read(ptrTem, readAddr+SMS_INFO_DETAIL_OFFSET, 8);//8字节内容
  80. if(1==info.flag)
  81. {
  82. if(!downFindFirst)
  83. {
  84. downFindFirst++;
  85. sutSms.upToBeRead = info.upperAddr;
  86. }
  87. sprintf(p->boxinfo[i].item,"%02d/%02d/%02d ", (info.recTime>>26)&0x3F,(info.recTime>>22)&0x0F,(info.recTime>>17)&0x1F);
  88. strcat(p->boxinfo[i].item, (char *)ptrTem);
  89. if(1==info.read)
  90. p->boxinfo[i].features = 0;
  91. else p->boxinfo[i].features = 1;
  92. sutSms.downToBeRead = info.nextAddr;
  93. sutSms.ReadAddr[i] = readAddr;
  94. i++;
  95. if(i>=reCtPerTime)
  96. {
  97. retNum=i;
  98. break;
  99. }
  100. }else
  101. {//读完了,转到一开始
  102. sutSms.downToBeRead = sutSms.newestAddr;
  103. //sutSms.downToBeRead = info.nextAddr;
  104. continue;
  105. }
  106. totalnum--;
  107. if(!totalnum)
  108. {
  109. //error
  110. MSG_ERR(1, "[SMS]err1");
  111. retNum=i;
  112. break;
  113. }
  114. }
  115. p->handle=0;
  116. }else
  117. {//向上读
  118. while(1)
  119. {
  120. readAddr = sutSms.upToBeRead;
  121. //1.1读出年月日(16/06/01 = 8字节)+内容7字节
  122. LSAPI_FS_Seek(fd, readAddr, LSAPI_FS_SEEK_SET);
  123. LSAPI_FS_Read(fd, ptr,sizeof( SUT_SMS_INFO_HEADER));
  124. LSAPI_FS_Seek(fd, readAddr+SMS_INFO_DETAIL_OFFSET, LSAPI_FS_SEEK_SET);
  125. LSAPI_FS_Read(fd, ptrTem,8);
  126. //sFlash_Read(ptr, readAddr, sizeof(struct SUT_SMS_INFO_HEADER));
  127. //sFlash_Read(ptrTem, readAddr+SMS_INFO_DETAIL_OFFSET, 8);//8字节内容
  128. if(1==info.flag)
  129. {
  130. if(!upFindFirst)
  131. {
  132. upFindFirst++;
  133. sutSms.downToBeRead = info.nextAddr;
  134. }
  135. sprintf(p->boxinfo[i].item,"%d/%d/%d ", (info.recTime>>26)&0x3F,(info.recTime>>22)&0x0F,(info.recTime>>17)&0x1F);
  136. strcat(p->boxinfo[i].item, (char *)ptrTem);
  137. if(1==info.read)
  138. p->boxinfo[i].features = 0;
  139. else p->boxinfo[i].features = 1;
  140. sutSms.upToBeRead = info.upperAddr;
  141. sutSms.ReadAddr[i] = readAddr;
  142. i++;
  143. if(i>=reCtPerTime)
  144. {
  145. retNum=i;
  146. break;
  147. }
  148. }else
  149. {//读完了,转到最后一条
  150. //sutSms.upToBeRead = sutSms.newestAddr+(sutSms.smsTotalNum-1)*SMS_SIZE_PER;
  151. //sutSms.upToBeRead = SMS_START_ADDRESS+(sutSms.smsTotalNum-1)*SMS_SIZE_PER;
  152. sutSms.upToBeRead = info.upperAddr;
  153. continue;
  154. }
  155. totalnum--;
  156. if(!totalnum)
  157. {
  158. //error
  159. MSG_ERR(1,"[SMS]err2");
  160. retNum=i;
  161. break;
  162. }
  163. }
  164. //switch
  165. ptr=(unsigned char *)&boxinfo;//copy
  166. temp = retNum/2;
  167. for(i=0;i<temp;i++)
  168. {
  169. Cptr1=(unsigned char *)&p->boxinfo[i];
  170. Cptr2=(unsigned char *)&p->boxinfo[retNum-1-i];
  171. memcpy(ptr, Cptr1, LIST_ITEM_TEXT_LEN_MAX+1);
  172. memcpy(Cptr1, Cptr2, LIST_ITEM_TEXT_LEN_MAX+1);
  173. memcpy(Cptr2, ptr, LIST_ITEM_TEXT_LEN_MAX+1);
  174. readAddr=sutSms.ReadAddr[i];
  175. sutSms.ReadAddr[i] = sutSms.ReadAddr[retNum-1-i];
  176. sutSms.ReadAddr[retNum-1-i] = readAddr;
  177. }
  178. p->handle=reCtPerTime-1;
  179. }
  180. if(fd>0) LSAPI_FS_Close(fd);
  181. p->itemnum=retNum;
  182. p->pageChange=0;
  183. ListBoxItemNumShowSMS(p->notehandle,p->totalnum);
  184. ListBoxShowSMS(p);
  185. }
  186. void SetGotNewMessage(void)
  187. {
  188. unsigned char type,encode,def1,def2;
  189. type = sutMess.GBKMess1[0];
  190. encode=sutMess.GBKMess1[1];
  191. def1 = sutMess.GBKMess1[2];
  192. def2 = sutMess.GBKMess1[3];
  193. //处理分析消息类型
  194. if(type == 0x30 &&
  195. encode == 0x30 &&
  196. def1 == 0x32 &&
  197. def2 == 0x30)
  198. {//一键报警
  199. sutMess.len -= 4;
  200. sutMess.Update=1;//收到一条消息标记
  201. sutMess.startCntFlag=1;
  202. sutMess.skipCnt=0;//从此时开始计数
  203. sutMess.forcePullGroupOn=0;
  204. MSG_WARN(1,"AlarmStart");
  205. sutMess.codeType=2;//unicode
  206. //sutSms.smsUpdate=1;//need to store
  207. }else
  208. if(type == 0x01 &&
  209. encode == 0x02)
  210. {//纯TTS播报
  211. sutMess.len -= 4;
  212. sutMess.Update=2;
  213. sutMess.codeType=2;//unicode
  214. sutSms.smsUpdate=1;//need to store
  215. MSG_WARN(1,"Pure TTS");
  216. }else
  217. if(type == 0x20 &&
  218. encode == 0x20 &&
  219. def1 == 0x20 &&
  220. def2 == 0x20)
  221. {//全文本
  222. sutMess.len -= 4;
  223. sutMess.Update=0;
  224. sutMess.codeType=1;//gb2312
  225. sutSms.smsUpdate=1;//need to store
  226. MSG_WARN(1,"Pure TXT");
  227. }
  228. // sutFeed.result=0;
  229. // sutFeed.feedBackStart=1;
  230. }
  231. //扫描消息 ret值:
  232. //0、重置过的
  233. //1、获得消息总数以及未读数目
  234. //2、往上查找当前最新消息位置上一条空地址
  235. static void SmsScan(unsigned char ret)
  236. {
  237. unsigned char *ptr;
  238. unsigned short i;
  239. SUT_SMS_INFO_HEADER smsinfo,*info;
  240. unsigned int readAddr;
  241. int fd=-1;
  242. if(ret > 2) return;//出错不扫描
  243. if(0!=ret){
  244. fd=LSAPI_FS_Open(SMS_FILE, LSAPI_FS_O_RDONLY,0);
  245. if(fd<0){
  246. MSG_ERR(1,"%s smsscan but open failed", SMS_FILE);
  247. return;
  248. }
  249. }
  250. if(0 == ret)
  251. {//已reset过
  252. }else if(1 == ret)
  253. {//查找消息总数和未读数
  254. sutSms.smsTotalNum=0;
  255. sutSms.smsUnReadNum=0;
  256. ptr = (unsigned char *)&smsinfo;
  257. readAddr = sutSms.newestAddr;
  258. info=&smsinfo;
  259. i=SMS_TOTAL_NUM;
  260. while(1)
  261. {
  262. LSAPI_FS_Seek(fd, readAddr, LSAPI_FS_SEEK_SET);
  263. LSAPI_FS_Read(fd, ptr, sizeof(SUT_SMS_INFO_HEADER));
  264. //sFlash_Read(ptr, readAddr, sizeof(struct SUT_SMS_INFO_HEADER));
  265. if(1==smsinfo.flag)
  266. {
  267. sutSms.smsTotalNum ++;
  268. if(1==smsinfo.read)
  269. {
  270. sutSms.smsUnReadNum ++;
  271. sutSms.haveUnRead = 1;
  272. }
  273. }
  274. i--;
  275. if(!i) break;
  276. readAddr = info->nextAddr;
  277. }
  278. }else if(2 == ret)
  279. {//向上查找空地址
  280. ptr = (unsigned char *)&smsinfo;
  281. readAddr = sutSms.newestAddr;
  282. info=&smsinfo;
  283. i=SMS_TOTAL_NUM;
  284. while(1)
  285. {
  286. LSAPI_FS_Seek(fd, readAddr, LSAPI_FS_SEEK_SET);
  287. LSAPI_FS_Read(fd, ptr, sizeof(SUT_SMS_INFO_HEADER));
  288. //sFlash_Read(ptr, readAddr, sizeof(struct SUT_SMS_INFO_HEADER));
  289. if(0==smsinfo.flag)
  290. {//找到
  291. sutSms.emptyAddr = readAddr;
  292. break;
  293. }
  294. i--;
  295. if(!i)
  296. {
  297. sutSms.poolFull = 1;
  298. MSG_WARN(1,"[SMS]Full");
  299. //SpeakerEnable();
  300. ttsPlay(ENCODE_USER_GBK,"CFFBCFA2D2D1C2FA");
  301. break;
  302. }
  303. readAddr = smsinfo.upperAddr;
  304. }
  305. }
  306. if(fd>0) LSAPI_FS_Close(fd);
  307. }
  308. ///////////////////////////////////////////////////////////
  309. //uint8_t defaultSMS[] = "0我们都是好朋友";
  310. //重置设置
  311. //返回值0到2用实际用处
  312. unsigned char ResetSMSConfi(void){
  313. int endAddress,temp1,i;
  314. unsigned char *ptr,process=0;
  315. SUT_SMS_INFO_HEADER smsinfo;
  316. unsigned short sectorNum,startSector,k,x,y,lx;
  317. unsigned int totalBytes;
  318. unsigned char tbuf[SMS_SIZE_PER];
  319. long ret;
  320. switch(newPara.messageResetFlag){
  321. case 'N'://不用重置
  322. sutSms.smsEnable = 1;
  323. //读出最新消息地址
  324. sutSms.newestAddr = newPara.messageNewAddr;
  325. MSG_WARN(1,"[SMS]IDLE");
  326. return 1;
  327. break;
  328. case 'R'://重置
  329. MSG_WARN(1,"[SMS]Reset");
  330. break;
  331. default://文件内容错误
  332. MSG_ERR(1,"[SMS]RErr3");
  333. sutSms.smsEnable = 0;
  334. return 5;
  335. break;
  336. }
  337. //2,根据短信格式初始化消息内存
  338. y=(GLCD_HEIGHT-24-4)/2;
  339. guiShowStr(26,y,"消息内存配置",FONT_MODE_12X12, REVERSED_NO, COLOR_BLACK, guiGetBackColor());
  340. x=29;y+=(12+4);lx=x;
  341. guiDrawRect(x,y,x+100,y+16,1,COLOR_BLACK);
  342. //guiDrawRect(29,50+50,128,66+50,1,COLOR_BLACK);
  343. //新建文件,如果存在则清空
  344. int fd;
  345. fd=LSAPI_FS_Open(SMS_FILE, LSAPI_FS_O_RDWR|LSAPI_FS_O_CREAT,0);
  346. if(fd<0){
  347. MSG_ERR(1,"[SMS]%s open err",SMS_FILE);
  348. sutSms.smsEnable = 0;
  349. return 5;
  350. }
  351. ptr = (unsigned char *)&smsinfo;
  352. for(i=0;i<SMS_TOTAL_NUM;i++){
  353. smsinfo.flag = 0;
  354. smsinfo.read = 0;
  355. smsinfo.len = 0;
  356. smsinfo.recTime = 0;
  357. if(0==i)
  358. {//第一条
  359. smsinfo.upperAddr = SMS_START_ADDRESS+(SMS_TOTAL_NUM-1)*SMS_SIZE_PER;//连接最后一条地址
  360. smsinfo.nextAddr = SMS_START_ADDRESS+SMS_SIZE_PER;//指向下一条地址
  361. sutSms.emptyAddr = smsinfo.upperAddr;//空地址为上一条
  362. //sFlash_Write(defaultSMS, SMS_START_ADDRESS+SMS_INFO_DETAIL_OFFSET, sizeof(defaultSMS));
  363. }else if(i == (SMS_TOTAL_NUM-1))
  364. {//最后一条
  365. smsinfo.upperAddr = SMS_START_ADDRESS+(SMS_TOTAL_NUM-2)*SMS_SIZE_PER;//倒数第二条地址
  366. smsinfo.nextAddr = SMS_START_ADDRESS;//第一条地址
  367. //sFlash_Write(defaultSMS, SMS_START_ADDRESS+i*SMS_SIZE_PER+SMS_INFO_DETAIL_OFFSET, sizeof(defaultSMS));
  368. }
  369. else
  370. {
  371. smsinfo.upperAddr = SMS_START_ADDRESS+(i-1)*SMS_SIZE_PER;
  372. smsinfo.nextAddr = SMS_START_ADDRESS+(i+1)*SMS_SIZE_PER;
  373. //sFlash_Write(defaultSMS, SMS_START_ADDRESS+i*SMS_SIZE_PER+SMS_INFO_DETAIL_OFFSET, sizeof(defaultSMS));
  374. }
  375. LSAPI_FS_Seek(fd, SMS_START_ADDRESS+i*SMS_SIZE_PER, LSAPI_FS_SEEK_SET);
  376. //LSAPI_FS_Write(fd,ptr,sizeof(SUT_SMS_INFO_HEADER));
  377. memset(tbuf, 0, sizeof(tbuf));
  378. memcpy(tbuf, ptr, sizeof(SUT_SMS_INFO_HEADER));
  379. ret=LSAPI_FS_Write(fd,tbuf,SMS_SIZE_PER);
  380. if(ret==-1) MSG_INFO(1, "sms init failed:%d",i);
  381. if(i%10==0){
  382. process = i*100/SMS_TOTAL_NUM;
  383. guiFillRect(lx,y+2,x+process,y+14,COLOR_BLACK);
  384. lx=x+process;
  385. }
  386. }
  387. guiFillRect(lx,y+2,x+100,y+14,COLOR_BLACK);
  388. LSAPI_FS_Close(fd);
  389. newPara.messageResetFlag = 'N';
  390. newPara.messageNewAddr = SMS_START_ADDRESS;
  391. //save sys
  392. sysIniSave();
  393. //3,初始化参数
  394. sutSms.newestAddr = SMS_START_ADDRESS;
  395. sutSms.smsTotalNum=0;
  396. sutSms.smsUnReadNum=0;
  397. sutSms.haveUnRead = 0;
  398. sutSms.smsUpdate = 0;
  399. sutSms.poolFull = 0;
  400. sutSms.smsEnable = 1;
  401. SmsScan(1);
  402. fd=LSAPI_FS_Open(SMS_FILE, LSAPI_FS_O_RDONLY,0);
  403. if(fd<0) MSG_WARN(1,"%s open to read but failed",SMS_FILE);
  404. else{
  405. LSAPI_FS_Seek(fd, SMS_START_ADDRESS, LSAPI_FS_SEEK_SET);
  406. LSAPI_FS_Read(fd, ptr, sizeof( SUT_SMS_INFO_HEADER));
  407. LSAPI_FS_Close(fd);
  408. }
  409. return 0;
  410. }
  411. void SetMessageConfi(void)
  412. {
  413. SmsScan(ResetSMSConfi());
  414. MSG_INFO(1,"[SMS]Ok");
  415. }
  416. void MessageResponse(void)
  417. {
  418. if(sutSms.smsTotalNum) ListBoxResponseSMS(&sutListBox);
  419. switch(getKeyValue()){
  420. case MKEY_VALUE_ESC:
  421. uISetNextStatus(UIS_MENU_MAIN);
  422. break;
  423. case MKEY_VALUE_MENU:
  424. if(sutSms.smsTotalNum)
  425. uISetNextStatus(UIS_MENU_MAIL_READ);
  426. break;
  427. case MKEY_VALUE_PWR:
  428. uISetNextStatus(UIS_MENU_MAIL_OPTION);
  429. break;
  430. default:
  431. break;
  432. }
  433. }
  434. void MessageDeletShow(char update)
  435. {
  436. if(update)
  437. {
  438. guiClearAll(guiGetBackColor());//clear
  439. guiShowCaption(0,"消息删除",UI_STATUS_ITEM_Y+1,guiGetBackColor(),guiGetForeColor(),FONT_MODE_12X12);
  440. guiShowMessageBox("确定删除?");
  441. uiMenuShowBottomLine();
  442. uiMenuShowBottomIndacitor("确定", "取消");
  443. }
  444. }
  445. void MessageFormatShow(char update)
  446. {
  447. if(update)
  448. {
  449. guiClearAll(guiGetBackColor());//clear
  450. guiShowCaption(0,"消息格式化",UI_STATUS_ITEM_Y+1,guiGetBackColor(),guiGetForeColor(),FONT_MODE_12X12);
  451. guiShowMessageBox("确定删除所有?");
  452. uiMenuShowBottomLine();
  453. uiMenuShowBottomIndacitor("确定", "取消");
  454. }
  455. }
  456. const char *accIconFileName[]={
  457. "Mail1.bmp",
  458. "Mail2.bmp",
  459. ""
  460. };
  461. /******************************************************
  462. uiShowMailBox
  463. 信箱
  464. *******************************************************/
  465. void uiShowMailBox(char update){
  466. static unsigned int timer;
  467. static char machine=0;
  468. if(update){
  469. guiClearAll(guiGetBackColor());
  470. guiShowCaption(40,"文本消息",UI_STATUS_ITEM_Y+1,guiGetBackColor(),guiGetForeColor(),FONT_MODE_12X12);
  471. uiMenuShowBottomLine();
  472. machine=1;
  473. uiMenuShowBottomIndacitor(NULL, "返回");
  474. guiShowMessageBox("版本不支持");
  475. uTimerStart(&timer, 1000);
  476. return;
  477. if(sutSms.smsTotalNum>=1){
  478. ListBoxInitSMS(&sutListBox,sutSms.smsTotalNum,accIconFileName,0);
  479. uiMenuShowBottomIndacitor("查阅", "[S]选项");
  480. }else{
  481. ListBoxItemNumShowSMS(0,0);
  482. uiMenuShowBottomIndacitor(NULL, "[S]选项");
  483. }
  484. }
  485. if(machine==1){
  486. if(uTimerExpired(&timer)){
  487. machine=0;
  488. uISetNextStatus(UIS_MENU_MAIN);
  489. }
  490. }
  491. }
  492. void DeleteSpecificSMS(void)
  493. {
  494. SUT_SMS_INFO_HEADER smsinfo,smsinfoTem,*info;
  495. unsigned char *ptr,*ptrTem,temp;
  496. unsigned int curAddr;
  497. int fd;
  498. fd=LSAPI_FS_Open(SMS_FILE, LSAPI_FS_O_RDWR,0);
  499. if(fd<0){
  500. MSG_ERR(1,"%s del open but failed", SMS_FILE);
  501. return;
  502. }
  503. ptr=(unsigned char *)&smsinfo;
  504. info=&smsinfo;
  505. //curAddr=SMS_START_ADDRESS+index*SMS_SIZE_PER;//要删除的消息地址
  506. curAddr=sutSms.ReadAddr[sutListBox.handle];
  507. LSAPI_FS_Seek(fd, curAddr,LSAPI_FS_SEEK_SET);
  508. LSAPI_FS_Read(fd, ptr, sizeof( SUT_SMS_INFO_HEADER));
  509. //sFlash_Read(ptr, curAddr, sizeof(struct SUT_SMS_INFO_HEADER));
  510. //0 更新数目
  511. if(1==smsinfo.read)
  512. {
  513. if(sutSms.smsUnReadNum)
  514. {
  515. sutSms.smsUnReadNum --;
  516. if(0==sutSms.smsUnReadNum)
  517. sutSms.haveUnRead =0;
  518. }
  519. }
  520. if(sutSms.smsTotalNum)
  521. sutSms.smsTotalNum --;
  522. if(sutSms.poolFull)
  523. sutSms.poolFull--;
  524. if(curAddr != sutSms.newestAddr){
  525. //1将当前要删除的消息的上下消息接连起来
  526. //1.1设置上一条消息的nextAddr
  527. ptrTem=(unsigned char *)&smsinfo.nextAddr;
  528. LSAPI_FS_Seek(fd,smsinfo.upperAddr+SMS_INFO_REAL_LEN+4,LSAPI_FS_SEEK_SET );
  529. LSAPI_FS_Write(fd, ptrTem, 4);
  530. //sFlash_Write(ptrTem, smsinfo.upperAddr+SMS_INFO_REAL_LEN+4, 4);
  531. //1.2设置下一条消息的upperAddr
  532. ptrTem=(unsigned char *)&smsinfo.upperAddr;
  533. LSAPI_FS_Seek(fd,smsinfo.nextAddr+SMS_INFO_REAL_LEN,LSAPI_FS_SEEK_SET );
  534. LSAPI_FS_Write(fd, ptrTem, 4);
  535. //sFlash_Write(ptrTem, smsinfo.nextAddr+SMS_INFO_REAL_LEN, 4);
  536. }
  537. //2设置要删除的消息的标志位
  538. temp=0;
  539. LSAPI_FS_Seek(fd,curAddr,LSAPI_FS_SEEK_SET );
  540. LSAPI_FS_Write(fd, &temp, 1);
  541. //sFlash_Write(&temp, curAddr, 1);
  542. if(curAddr != sutSms.newestAddr)
  543. {
  544. //3把空的消息插到最新的那条消息的上面去,它的下面都会是连续的新消息,不要往下插
  545. LSAPI_FS_Seek(fd, sutSms.newestAddr, LSAPI_FS_SEEK_SET);
  546. LSAPI_FS_Read(fd, ptr, sizeof( SUT_SMS_INFO_HEADER));
  547. //sFlash_Read(ptr, sutSms.newestAddr, sizeof(struct SUT_SMS_INFO_HEADER));
  548. //3.1设置最新的消息的upperAddr
  549. LSAPI_FS_Seek(fd, sutSms.newestAddr+SMS_INFO_REAL_LEN, LSAPI_FS_SEEK_SET);
  550. LSAPI_FS_Write(fd, (unsigned char *)&curAddr, 4);
  551. //sFlash_Write((uint8_t *)&curAddr, sutSms.newestAddr+SMS_INFO_REAL_LEN, 4);
  552. //3.2设置最新消息原来的上一条消息的nextAddr
  553. LSAPI_FS_Seek(fd, smsinfo.upperAddr+SMS_INFO_REAL_LEN+4, LSAPI_FS_SEEK_SET);
  554. LSAPI_FS_Write(fd, (unsigned char *)&curAddr, 4);
  555. //sFlash_Write((uint8_t *)&curAddr, smsinfo.upperAddr+SMS_INFO_REAL_LEN+4, 4);
  556. //4设置被删除的消息的upperAddr and nextAddr
  557. //4.1设置upperAddr
  558. LSAPI_FS_Seek(fd, curAddr+SMS_INFO_REAL_LEN, LSAPI_FS_SEEK_SET);
  559. LSAPI_FS_Write(fd, (unsigned char *)&smsinfo.upperAddr, 4);
  560. //sFlash_Write((uint8_t *)&smsinfo.upperAddr, curAddr+SMS_INFO_REAL_LEN, 4);
  561. //4.2设置nextAddr
  562. LSAPI_FS_Seek(fd, curAddr+SMS_INFO_REAL_LEN+4, LSAPI_FS_SEEK_SET);
  563. LSAPI_FS_Write(fd, (unsigned char *)&sutSms.newestAddr, 4);
  564. //sFlash_Write((uint8_t *)&sutSms.newestAddr, curAddr+SMS_INFO_REAL_LEN+4, 4);
  565. }else
  566. {
  567. //如果是删除最新的那条消息,不用更改位置,只要将更改最新消息的地址即可
  568. sutSms.newestAddr = smsinfo.nextAddr;
  569. }
  570. if(fd>0) LSAPI_FS_Close(fd);
  571. }
  572. void MessageDeletResponse(void)
  573. {
  574. unsigned short key=getKeyValue();
  575. if(MKEY_VALUE_MENU==key)
  576. {
  577. if(sutSms.smsTotalNum>=1)
  578. DeleteSpecificSMS();
  579. uISetNextStatus(UIS_MENU_MAIL_SEL);
  580. }
  581. if(MKEY_VALUE_ESC==key)uISetNextStatus(UIS_MENU_MAIL_SEL);
  582. }
  583. void FormatSMS(void)
  584. {
  585. unsigned short i;
  586. unsigned char *ptr;
  587. SUT_SMS_INFO_HEADER info;
  588. unsigned int readAddr;
  589. unsigned char process;
  590. int fd;
  591. fd=LSAPI_FS_Open(SMS_FILE, LSAPI_FS_O_RDWR,0);
  592. if(fd<0){
  593. MSG_ERR(1,"%s format but open failed", SMS_FILE);
  594. return;
  595. }
  596. guiClearRect(0,44,GLCD_WIDTH,84,guiGetBackColor());
  597. guiDrawRect(29,50,128,66,1,guiGetForeColor());
  598. process=0;
  599. readAddr = sutSms.newestAddr;
  600. ptr=(unsigned char *)&info;
  601. for(i=0;i<SMS_TOTAL_NUM;i++)
  602. {
  603. LSAPI_FS_Seek(fd, readAddr,LSAPI_FS_SEEK_SET);
  604. LSAPI_FS_Read(fd, ptr, sizeof(SUT_SMS_INFO_HEADER));
  605. //sFlash_Read(ptr, readAddr, sizeof(struct SUT_SMS_INFO_HEADER));
  606. if(info.flag == 1)
  607. {
  608. info.flag=0;
  609. LSAPI_FS_Seek(fd, readAddr,LSAPI_FS_SEEK_SET);
  610. LSAPI_FS_Write(fd, ptr, 1);
  611. //sFlash_Write(ptr, readAddr, 1);
  612. }
  613. readAddr = info.nextAddr;
  614. if(i%10==0)
  615. {
  616. guiDrawVLine(52,64,29+process,1,guiGetForeColor());
  617. process++;
  618. }
  619. }
  620. if(fd>0) LSAPI_FS_Close(fd);
  621. sutSms.smsTotalNum = 0;
  622. sutSms.smsUnReadNum = 0;
  623. sutSms.haveUnRead = 0;
  624. }
  625. void MessageFormatResponse(void)
  626. {
  627. unsigned short key=getKeyValue();
  628. if(MKEY_VALUE_MENU==key)
  629. {
  630. FormatSMS();
  631. uISetNextStatus(UIS_MENU_MAIL_SEL);
  632. }
  633. if(MKEY_VALUE_ESC==key)uISetNextStatus(UIS_MENU_MAIL_SEL);
  634. }
  635. void MessageOptionResponse(void)
  636. {
  637. char buf[30];
  638. unsigned short key;
  639. key=uiMenuResponse(&sutMenuSysSetup);
  640. if(MKEY_VALUE_MENU==key)
  641. {
  642. switch(sutMenuSysSetup.handle)
  643. {
  644. case 0:uISetNextStatus(UIS_MENU_MAIL_DEL);break;
  645. case 1:uISetNextStatus(UIS_MENU_MAIL_FORMAT);break;
  646. }
  647. }
  648. else if(MKEY_VALUE_ESC==key) uISetNextStatus(sutUIstatus.LastStatus);
  649. }
  650. void MessageOptionShow(char update)
  651. {
  652. static const char *apcMenuSysSetup[]=
  653. {"删除","格式化",""};
  654. if(update)
  655. {
  656. guiClearAll(guiGetBackColor());
  657. guiShowCaption(0,"文本选项",UI_STATUS_ITEM_Y+1,guiGetBackColor(),guiGetForeColor(),FONT_MODE_12X12);
  658. uiMenuShowBottomLine();
  659. uiMenuInit(&sutMenuSysSetup,apcMenuSysSetup, FONT_MODE_12X12);
  660. uiMenuShowBottomIndacitor("确定", "返回");
  661. }
  662. }
  663. //读取index短信全部内容到bufPt
  664. static void ReadSpecificSms(unsigned char *bufPt)
  665. {
  666. SUT_SMS_INFO_HEADER info;
  667. unsigned char *ptr;
  668. int fd;
  669. fd=LSAPI_FS_Open(SMS_FILE, LSAPI_FS_O_RDWR,0);
  670. if(fd<0){
  671. MSG_ERR(1,"%s read sms but open failed", SMS_FILE);
  672. return;
  673. }
  674. ptr=(unsigned char *)&info;
  675. LSAPI_FS_Seek(fd, sutSms.ReadAddr[sutListBox.handle]+SMS_INFO_DETAIL_OFFSET, LSAPI_FS_SEEK_SET);
  676. LSAPI_FS_Read(fd,bufPt, SMS_SIGNAL_LEN);
  677. //sFlash_Read(bufPt, sutSms.ReadAddr[sutListBox.handle]+SMS_INFO_DETAIL_OFFSET, SMS_SIGNAL_LEN);
  678. LSAPI_FS_Seek(fd, sutSms.ReadAddr[sutListBox.handle], LSAPI_FS_SEEK_SET);
  679. LSAPI_FS_Read(fd,ptr, 2);
  680. //sFlash_Read(ptr, sutSms.ReadAddr[sutListBox.handle],2);
  681. info.read = 0;
  682. LSAPI_FS_Seek(fd, sutSms.ReadAddr[sutListBox.handle], LSAPI_FS_SEEK_SET);
  683. LSAPI_FS_Write(fd,ptr, 2);
  684. //sFlash_Write(ptr, sutSms.ReadAddr[sutListBox.handle], 2);
  685. if(sutSms.smsUnReadNum)
  686. {
  687. sutSms.smsUnReadNum--;
  688. if(sutSms.smsUnReadNum==0)
  689. sutSms.haveUnRead = 0;
  690. }
  691. if(fd>0) LSAPI_FS_Close(fd);
  692. }
  693. static unsigned short lastShowIndex=0;
  694. unsigned char smsDetail[SMS_SIGNAL_LEN];
  695. void MessageReadShow(char update)
  696. {
  697. if(update)
  698. {
  699. lastShowIndex=0;
  700. memset(smsDetail,0,sizeof(smsDetail));
  701. guiClearAll(guiGetBackColor());
  702. guiShowCaption(0,"消息阅读",UI_STATUS_ITEM_Y+1,guiGetBackColor(),guiGetForeColor(),FONT_MODE_12X12);
  703. ReadSpecificSms(smsDetail);
  704. MessageEditInit(&sutMEdit,8,UI_CONTENT_SHOW_Y+5, (char *)smsDetail);
  705. lastShowIndex=MessageEditShow(&sutMEdit,(char *)smsDetail+lastShowIndex);
  706. uiMenuShowBottomLine();
  707. #ifdef REPORT_SMS_VOICE
  708. uiMenuShowBottomIndacitor("播放", "返回");
  709. #else
  710. uiMenuShowBottomIndacitor(NULL, "返回");
  711. #endif
  712. return;
  713. }
  714. }
  715. void MessageReadResponse(void)
  716. {
  717. unsigned short len;
  718. unsigned short key=getKeyValue();
  719. if(MKEY_VALUE_ESC==getKeyValue())uISetNextStatus(UIS_MENU_MAIL_SEL);
  720. else if(MKEY_VALUE_MENU == key)
  721. {
  722. #ifdef REPORT_SMS_VOICE
  723. // ReadSpecificSms(smsDetail);
  724. // AnsiToStrUnicode(unicodeSms,sizeof(unicodeSms),(char *)smsDetail);
  725. // ModemSendAt("AT+ZTTS=1,\"");
  726. // ModemSendAt((char *)unicodeSms);
  727. // ModemSendAt("\"\r");
  728. #endif
  729. }else if(MKEY_VALUE_DOWN==key)
  730. {
  731. //printf("len:%d,%d\r\n",lastShowIndex,strlen(smsDetail));
  732. if(lastShowIndex<strlen(smsDetail))
  733. {
  734. guiClearRect(0,UI_CONTENT_SHOW_Y+5,GLCD_WIDTH-1,UI_BOTTOM_LINE_Y-2,guiGetBackColor());
  735. MessageEditInit(&sutMEdit,8,UI_CONTENT_SHOW_Y+5, (char *)smsDetail);
  736. len=MessageEditShow(&sutMEdit,(char *)smsDetail+lastShowIndex);
  737. if(len !=0) lastShowIndex+=len;
  738. else lastShowIndex=0;
  739. }
  740. }
  741. }
  742. void SwitchSMS_ToGB2312(void)
  743. {
  744. unsigned char *ptr;
  745. unsigned char tempSMS[SMS_SIGNAL_LEN+1];
  746. ptr = sutMess.GBKMess1+4;
  747. //source data:sutMess.GBKMess1+4;
  748. //data len:sutMess.len
  749. switch(sutMess.codeType)
  750. {
  751. case 2://unicode to gb2312
  752. memcpy(tempSMS, ptr, SMS_SIGNAL_LEN+1-4);
  753. //StrUnicodeToAnsi(ptr, sutMess.len, (const char *)tempSMS);//
  754. unicodeToGbk(tempSMS, ptr, &sutMess.len);
  755. //len no change
  756. break;
  757. default:
  758. break;
  759. }
  760. }
  761. //向上存方式
  762. void IncomingSMS(void)
  763. {
  764. SUT_SMS_INFO_HEADER infosms;
  765. unsigned char *ptr,i;
  766. static unsigned short showCt;
  767. unsigned char *smsPtr;
  768. unsigned char tempyear;
  769. MY_CLOCK time;
  770. /*获取系统时间*/
  771. getMyClock(&time);
  772. if(0 == sutSms.smsEnable)
  773. {
  774. if(++showCt >= 500){
  775. showCt=0;
  776. MSG_ERR(1,"[SMS]Invalid");
  777. }
  778. return;
  779. }
  780. if(0 != sutMess.Update) return;//消息播报处理完毕
  781. if(0 == sutSms.smsUpdate) return;//没有可存储处理
  782. sutSms.smsUpdate = 0;
  783. MSG_INFO(1,"[SMS]Store SMS");
  784. SmsScan(2);
  785. if(sutSms.poolFull)
  786. return;
  787. int fd;
  788. fd=LSAPI_FS_Open(SMS_FILE, LSAPI_FS_O_RDWR,0);
  789. if(fd<0){
  790. MSG_ERR(1,"%s open to save but failed",SMS_FILE);
  791. return;
  792. }
  793. SwitchSMS_ToGB2312();
  794. // SpeakerEnable();
  795. // ModemSendAt("AT+ZTTS=1,\"36653052B065886D6F60\"\r");
  796. //1.1
  797. ptr = (unsigned char*)&infosms;
  798. infosms.flag=1;
  799. infosms.read=1;
  800. tempyear=time.year%2000;
  801. infosms.recTime = (unsigned int)tempyear<<26 |
  802. (unsigned int)time.month<<22 |
  803. (unsigned int)time.day<<17 |
  804. (unsigned int)time.hour<<12 |
  805. (unsigned int)time.min<<6 |
  806. (unsigned int)time.sec<<0;
  807. infosms.len = sutMess.len;
  808. //保存头信息
  809. LSAPI_FS_Seek(fd, sutSms.emptyAddr, LSAPI_FS_SEEK_SET);
  810. LSAPI_FS_Write(fd, ptr, SMS_INFO_REAL_LEN);
  811. //保存内容
  812. smsPtr = sutMess.GBKMess1+4;
  813. LSAPI_FS_Seek(fd, sutSms.emptyAddr+SMS_INFO_DETAIL_OFFSET,LSAPI_FS_SEEK_SET);
  814. LSAPI_FS_Write(fd, smsPtr, SMS_SIGNAL_LEN);
  815. LSAPI_FS_Close(fd);
  816. sutSms.haveUnRead=1;
  817. sutSms.smsTotalNum ++;
  818. sutSms.smsUnReadNum ++;
  819. sutSms.newestAddr = sutSms.emptyAddr;
  820. //保存
  821. newPara.messageNewAddr=sutSms.newestAddr;
  822. //save sys
  823. sysIniSave();
  824. }
  825. void SMSHandle(void)
  826. {
  827. unsigned char temp1,temp2;
  828. unsigned short i;
  829. char buf[30];
  830. static unsigned int cnt=0;
  831. unsigned char *p;
  832. if(sutMess.startCntFlag)
  833. {
  834. // if(os_time_get() > cnt)
  835. // {//秒粗计数器
  836. // cnt=os_time_get()+100;
  837. // if(++sutMess.skipCnt>20)
  838. // {//时间到了
  839. // sutMess.startCntFlag=0;
  840. // SlwTrace(INF,"Timeout",1);
  841. // }
  842. // }
  843. }
  844. if(sutMess.Update == 1 || sutMess.Update == 2)
  845. {
  846. MSG_INFO(1,"TTS_LEN:%d",sutMess.len);
  847. p = sutMess.GBKMess1+4;
  848. // for(i=0;i<sutMess.len;i+=4)
  849. // {
  850. // temp1 = p[i+2];
  851. // temp2 = p[i+3];
  852. // p[i+2] = p[i];
  853. // p[i+3] = p[i+1];
  854. // p[i] = temp1;
  855. // p[i+1]=temp2;
  856. // }
  857. //p[sutMess.len]=0;
  858. ttsPlay(ENCODE_USER_UNICODE_BE, (char *)p);
  859. sutMess.Update=0;
  860. }
  861. }