message.c 24 KB

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