Message.c 19 KB

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