Modem.c 30 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264
  1. /**********************************************************************************
  2. * File Name: Modem.c
  3. * Function Describe:device for modem
  4. * Relate Module:
  5. * Explain: the modem must be using ZTE MC8332
  6. * Writer: ShiLiangWen
  7. * Date: 2015.1.20
  8. ***********************************************************************************/
  9. #define THIS_FILE_ID 2
  10. /* Includes ------------------------------------------------------------------*/
  11. #include "includes.h"
  12. //os_mbx_declare (PocMsgBox, 5); /* Declare an RTX mailbox */
  13. //_declare_box(PocMpool,sizeof(SUT_MODEM_POC_MSG),5);
  14. //SUT_SMS_PARA sutSMSpara;
  15. //os_mbx_declare (AtMsgBox, 7); /* Declare an RTX mailbox */
  16. //_declare_box(AtMpool,sizeof(SUT_MODEM_AT_MSG),7);
  17. SUT_MODEM_AT_MSG sutAtm,sutAtmPro;
  18. unsigned char g_ucModemSentTcpCt;//TCP 发送计数器
  19. unsigned char g_usModeMTime=0x00;
  20. unsigned char g_usModeSTime=0x00;
  21. unsigned char g_usModeHTime=0x00;
  22. unsigned char g_usModeYTime=0x00;//年
  23. unsigned char g_usModemTime=0x00;//月
  24. unsigned char g_usModeDTime=0x00;//日
  25. //MODEM_TYPE MODEM_TYPE;
  26. /************************************************************************************
  27. *
  28. *************************************************************************************/
  29. void ModemSendAT(char *p)
  30. {
  31. unsigned short len;
  32. len=strlen(p);
  33. RunMake(THIS_FILE_ID);
  34. #if UART2_TX_USE_DMA==0
  35. Uart2Send(p,len);
  36. #else
  37. USART2_Send(p,len);
  38. #endif
  39. }
  40. /************************************************************************************
  41. *
  42. *************************************************************************************/
  43. void ModemSendData(unsigned char *pData,unsigned short datalen)
  44. {
  45. #if UART2_TX_USE_DMA==0
  46. Uart2Send(pData,datalen);
  47. #else
  48. USART2_Send((char *)pData,datalen);
  49. #endif
  50. }
  51. /**********************************************************************************
  52. 等待模块启动完成
  53. 0:成功 -1:超时
  54. ***********************************************************************************/
  55. int WaitModemIsOpened(void)
  56. {
  57. int i;
  58. SUT_MODEM_AT_MSG *pMsg=&sutAtmPro;
  59. RunMake(THIS_FILE_ID);
  60. for(i=0;i<100;i++){
  61. SlwTrace(INF,"AT",1);
  62. ModemSendAT("AT\r\n");
  63. //if(OS_R_TMO!=os_mbx_wait(AtMsgBox,(void **)&pMsg,50)){
  64. if((pMsg->MsgLen = MsgQueueAccept(pMsg->MsgData,sizeof(pMsg->MsgData)))){
  65. if('O'==pMsg->MsgData[0] && 'K'==pMsg->MsgData[1]){
  66. return 0;
  67. }
  68. //free(pMsg);
  69. }else os_dly_wait(1);
  70. }
  71. return -1;
  72. }
  73. void ModemCtrlInit(void)
  74. {
  75. GPIO_InitTypeDef GPIO_InitStructure;
  76. RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOC, ENABLE);
  77. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  78. MODEM_DTR_HIGH;
  79. MODEM_RING_HIGH;
  80. MODEM_DSR_HIGH;
  81. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  82. GPIO_InitStructure.GPIO_Pin = MODEM_DTR_PIN;
  83. GPIO_Init(MODEM_DTR_PORT, &GPIO_InitStructure);
  84. MODEM_DTR_HIGH;
  85. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  86. GPIO_InitStructure.GPIO_Pin = MODEM_RING_PIN;
  87. GPIO_Init(MODEM_RING_PORT, &GPIO_InitStructure);
  88. MODEM_RING_HIGH;
  89. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  90. GPIO_InitStructure.GPIO_Pin = MODEM_DSR_PIN;
  91. GPIO_Init(MODEM_DSR_PORT, &GPIO_InitStructure);
  92. MODEM_DSR_HIGH;
  93. MODEM_DCD_HIGH;
  94. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
  95. GPIO_InitStructure.GPIO_Pin = MODEM_DCD_PIN;
  96. GPIO_Init(MODEM_DCD_PORT, &GPIO_InitStructure);
  97. }
  98. /*************************************************************************
  99. *ModemWaitAtReady
  100. **************************************************************************/
  101. int ModemWaitAtReady(void)
  102. {
  103. int i;
  104. SUT_MODEM_AT_MSG *pMsg;
  105. for(i=0;i<20;i++){
  106. if(ModemSendAT2WaitAckMsg("AT\r\n","OK",&pMsg,100)){
  107. //_free_box(AtMpool,pMsg);
  108. return 1;
  109. }
  110. }
  111. return 0;
  112. }
  113. /*************************************************************************
  114. ModemWaitOpen
  115. 等待模块开机
  116. 通过检查模块主动上报:
  117. **************************************************************************/
  118. int ModemWaitOpen(int timeout)
  119. {
  120. //char *pAck;
  121. //SUT_MODEM_AT_MSG **pMsg;
  122. SUT_MODEM_AT_MSG *Msg;
  123. SlwTrace(DEBUG,"ModemWaitOpen",1);
  124. while(timeout--){
  125. //if(OS_R_TMO!=os_mbx_wait(AtMsgBox,(void **)&Msg,1)){
  126. if((Msg->MsgLen = MsgQueueAccept(Msg->MsgData,sizeof(Msg->MsgData)))){
  127. SlwTrace(DEBUG,(char *)Msg->MsgData,0);
  128. // if(0==ModemStrCmp((char *)Msg->MsgData,pAck)){
  129. // *pMsg=Msg;
  130. // return 1;
  131. // }else{
  132. // _free_box(AtMpool,Msg);
  133. //}
  134. }else os_dly_wait(1);
  135. }
  136. return 1;
  137. }
  138. //模块的电源以及复位引脚的配置
  139. //这段配置要放要最开始
  140. //目的是一开机时确保模块是没有电源的
  141. //解决原来问题:当开机到模块播报“欢迎.....”时马上关机,看到屏幕灭后马上又开机,此次开机会失败
  142. void ModemPinConfig(void)
  143. {
  144. GPIO_InitTypeDef GPIO_InitStructure;
  145. RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOC, ENABLE);
  146. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  147. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  148. GPIO_InitStructure.GPIO_Pin = MODEM_RESET_PIN;
  149. GPIO_Init(MODEM_RESET_PORT, &GPIO_InitStructure);
  150. GPIO_InitStructure.GPIO_Pin = MODEM_PWRKEY_PIN;
  151. GPIO_Init(MODEM_PWRKEY_PORT, &GPIO_InitStructure);
  152. MODEM_RESET_HIGH;
  153. MODEM_PWRKEY_LOW;
  154. }
  155. /**********************************************************************************
  156. ModemInit
  157. 返回:1 初始化成功 0-失败
  158. ***********************************************************************************/
  159. int ModemInit(void)
  160. {
  161. RunMake(THIS_FILE_ID);
  162. MsgQueueSet();//初始化队列
  163. g_ucModemSentTcpCt=0;
  164. RunMake(THIS_FILE_ID);
  165. MODEM_RESET_HIGH;
  166. os_dly_wait(100);
  167. MODEM_RESET_LOW;
  168. MODEM_PWRKEY_HIGH;
  169. os_dly_wait(100);
  170. MODEM_PWRKEY_LOW;
  171. //等待模块开机并能接受AT命令
  172. if(WaitModemStart())return 0;
  173. return 1;
  174. //ModemGetIMEI();
  175. }
  176. char ModemLCCCheck(void)
  177. {
  178. int t,i;
  179. SUT_MODEM_AT_MSG *pMsg=&sutAtmPro;
  180. SlwTrace(INF, "check version type",1);
  181. for(i=0;i<100;i++)
  182. {
  183. t=50;
  184. ModemSendAT("AT+LSPOCPF?\r\n");
  185. while(t--)
  186. {
  187. if((pMsg->MsgLen = MsgQueueAccept(pMsg->MsgData,sizeof(pMsg->MsgData))))
  188. {
  189. if((0==ModemStrCmp((char *)pMsg->MsgData,"ERROR"))){
  190. SlwTrace(INF, "It is not 3 in 1 version quit this check",1);
  191. return 0;
  192. }else if(0==ModemStrCmp((char *)pMsg->MsgData,"+LSPOCPF:")){//+LSPOCPF:hgs(1)
  193. //这个模块支持三合一指令,即为三合一模块版本
  194. if(pMsg->MsgData[13] == '1'){
  195. SlwTrace(INF, "It is hgs version now",1);
  196. return 0;
  197. }else{
  198. SlwTrace(INF, "Reset to hgs version and reboot",1);
  199. ModemSendAT("AT+LSPOCPF=hgs\r\n");
  200. ShowMessageBox("切换海高思版本");
  201. t=0;
  202. while(++t<50){
  203. DelayMs(2);
  204. IWDG_ReloadCounter();
  205. }
  206. return 1;
  207. }
  208. }
  209. }else
  210. os_dly_wait(1);
  211. }
  212. }
  213. SlwTrace(INF, "TimeOut",1);
  214. return 0;
  215. }
  216. /**********************************************************************************
  217. CSQ2Num
  218. ***********************************************************************************/
  219. int CSQ2Num(char *str)
  220. {
  221. int csq;
  222. csq=atoi(str);
  223. if(csq<0 || csq>99)return 99;
  224. else return csq;
  225. }
  226. /**********************************************************************************
  227. ModemStrCmp
  228. ***********************************************************************************/
  229. int ModemStrCmp(char *msg,char *str)
  230. {
  231. char *p1=str;
  232. char *p2=msg;
  233. while(*p1!=0){
  234. if(*p1!=*p2)return 1;
  235. p1++;
  236. p2++;
  237. }
  238. return 0;
  239. }
  240. /**********************************************************************************
  241. ModemWaitAckMsg
  242. Input:
  243. pATCmd--AT Command string
  244. pAck --期待回的ACK,头相同即可
  245. pMsg --实际消息内容,可能比pAck长
  246. timeout --超时,10ms为单位
  247. Output:
  248. if timeout return 0
  249. else return 1 注意,处理完消息要调用_free_box释放消息
  250. ***********************************************************************************/
  251. int ModemSendAT2WaitAckMsg(char *pATCmd,char *pAck,SUT_MODEM_AT_MSG **pMsg,int timeout)
  252. {
  253. SUT_MODEM_AT_MSG *Msg=&sutAtmPro;
  254. ModemSendAT(pATCmd);
  255. while(timeout){
  256. //if(OS_R_TMO!=os_mbx_wait(AtMsgBox,(void **)&Msg,1)){
  257. if((Msg->MsgLen = MsgQueueAccept(Msg->MsgData,sizeof(Msg->MsgData)))){
  258. //SlwTrace(DEBUG,(char *)Msg->MsgData);
  259. if(0==ModemStrCmp((char *)Msg->MsgData,pAck)){
  260. *pMsg=Msg;
  261. return 1;
  262. }else{
  263. //_free_box(AtMpool,Msg);
  264. }
  265. }else {
  266. timeout--;
  267. os_dly_wait(1);
  268. }
  269. }
  270. return 0;
  271. }
  272. /********************************************
  273. *0x12 --> "12" --> 0x31 0x32
  274. **********************************************/
  275. void HexToAsc(unsigned char Hex,char *pAsc)
  276. {
  277. unsigned char h,l;
  278. l=Hex & 0x0f;
  279. h=Hex >> 4;
  280. if((l>=0)&&(l<=9))l += 0x30;
  281. else if((l>=10)&&(l<=15))l += ('A'-10);
  282. if((h>=0)&&(h<=9))h += 0x30;
  283. else if((h>=10)&&(h<=15))h += ('A'-10);
  284. pAsc[0]=h;
  285. pAsc[1]=l;
  286. }
  287. void HexToStr(unsigned char *HexStr,char *AscStr,unsigned short len)
  288. {
  289. int i,j=0;
  290. for(i=0;i<len;i++)
  291. {
  292. HexToAsc(HexStr[i],&AscStr[j]);
  293. j+=2;
  294. }
  295. }
  296. /***********************************************************************************
  297. *ModemSendUdpData WCDMA没有UDP指令
  298. ************************************************************************************/
  299. int ModemSendUdpData(unsigned char socket,unsigned char *pData,unsigned short len)
  300. {
  301. int i;
  302. char buf[142];
  303. char tmp[5];
  304. unsigned char temp=0;
  305. snprintf(buf, sizeof(buf),"AT+ZIPSENDU=%d,%d\r",socket,len);
  306. ModemSendAT(buf);
  307. ModemSendData(pData,len);
  308. snprintf(buf, sizeof(buf),"UdpSend[%d]",len);
  309. SlwTrace(INF,buf,1);
  310. #ifdef SLW_DEBUG
  311. if(len>45)len=45;
  312. buf[0]='>';buf[1]='>';buf[2]=0;
  313. for(i=0;i<len;i++){
  314. snprintf(tmp, sizeof(tmp),"%02x,",pData[i]);
  315. strcat(buf,tmp);
  316. }
  317. SlwTrace(DEBUG,buf,1);
  318. #endif
  319. return 0;
  320. }
  321. /***********************************************************************************
  322. *StrToNum
  323. ************************************************************************************/
  324. unsigned short StrToNum(char *str)
  325. {
  326. unsigned short num;
  327. if(str[0]>0x2f && str[0]<0x3a){
  328. if(str[1]>0x2f && str[1]<0x3a){
  329. if(str[2]>0x2f && str[2]<0x3a){
  330. if(str[3]>0x2f && str[3]<0x3a){
  331. num=1000*(str[0]-0x30);
  332. num+=100*(str[1]-0x30);
  333. num+=10*(str[2]-0x30);
  334. num+=(str[3]-0x30);
  335. }else{
  336. num=100*(str[0]-0x30);
  337. num+=10*(str[1]-0x30);
  338. num+=(str[2]-0x30);
  339. }
  340. }else{
  341. num=10*(str[0]-0x30);
  342. num+=(str[1]-0x30);
  343. }
  344. }else{
  345. num= str[0]-0x30;
  346. }
  347. }else{
  348. num=0;
  349. }
  350. return num;
  351. }
  352. /***********************************************************************************
  353. *ModemPoweroff
  354. ************************************************************************************/
  355. void ModemPoweroff(void)
  356. {
  357. ModemSendAT("AT+ZPWROFF\r\n");
  358. os_dly_wait(50);
  359. ModemSendAT("AT+ZPWROFF\r\n");
  360. IWDG_ReloadCounter();//喂狗
  361. os_dly_wait(100);
  362. IWDG_ReloadCounter();//喂狗
  363. os_dly_wait(100);
  364. IWDG_ReloadCounter();//喂狗
  365. os_dly_wait(50);
  366. IWDG_ReloadCounter();//喂狗
  367. MODEM_PWRKEY_LOW;
  368. MODEM_RESET_HIGH;
  369. os_dly_wait(10);
  370. MODEM_RESET_LOW;
  371. }
  372. /**********************************************************************************
  373. *ModemSetDTRLow
  374. ***********************************************************************************/
  375. void ModemSetDtrLow(void)
  376. {
  377. GPIO_InitTypeDef GPIO_InitStructure;
  378. RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOC, ENABLE);
  379. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  380. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
  381. GPIO_InitStructure.GPIO_Pin = MODEM_DTR_PIN;
  382. GPIO_Init(MODEM_DTR_PORT, &GPIO_InitStructure);
  383. MODEM_DTR_LOW;
  384. }
  385. /**********************************************************************************
  386. *ModemSetRINGLow
  387. ***********************************************************************************/
  388. void ModemSetRingLow(void)
  389. {
  390. GPIO_InitTypeDef GPIO_InitStructure;
  391. RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOC, ENABLE);
  392. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  393. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
  394. GPIO_InitStructure.GPIO_Pin = MODEM_RING_PIN;
  395. GPIO_Init(MODEM_RING_PORT, &GPIO_InitStructure);
  396. MODEM_RING_LOW;
  397. }
  398. unsigned char AsciiHexStringToHexBytes(char *src, unsigned char *des)
  399. {//"3031"-->0x30,0x31
  400. unsigned char temp[2];
  401. unsigned char i,k;
  402. int len;
  403. len=strlen(src);
  404. if(len % 2) return 0;//不能为单数
  405. for(i=0;i<len/2;i++){
  406. temp[0]=src[2*i];
  407. temp[1]=src[2*i+1];
  408. for(k=0;k<2;k++){
  409. if(temp[k] >= '0' && temp[k] <= '9') temp[k] -= 0x30;
  410. else if(temp[k] >= 'a' && temp[k] <= 'f') temp[k] -= 0x57;
  411. else if(temp[k] >= 'A' && temp[k] <= 'F') temp[k] -= 0x37;
  412. }
  413. des[i] = ((temp[0]<<4)&0xf0) | temp[1];
  414. }
  415. return i;
  416. }
  417. /*******************************************************************
  418. *ModemCheckPocParam
  419. return:
  420. 1--not same, Reset
  421. 0--same,no reset
  422. ********************************************************************/
  423. int ModemCheckPocParam(void)
  424. {
  425. int t,j;
  426. int i,len;
  427. char buf[40];
  428. char buf1[100];
  429. char idFlag=0;
  430. char ipFlag=0;
  431. char pwdFlag=0;
  432. SUT_MODEM_AT_MSG *pMsg=&sutAtmPro;
  433. // #error "也测试一下这个函数正常与否呗"
  434. for(i=0;i<5;i++)
  435. {
  436. ModemSendAT("AT+POC=020000\r\n");
  437. //+POC:0200000069643D313030303031343031343B69703D3138332E3133312E31332E31303B7077643D3135303034343739303438383931343B646F6D61696E3D7777772E6869676F73706F632E636F6D3B
  438. //id=1000014014;ip=183.131.13.10;pwd=150044790488914;domain=www.higospoc.com;
  439. t=50;
  440. while(t--)
  441. {
  442. if((pMsg->MsgLen = MsgQueueAccept(pMsg->MsgData,sizeof(pMsg->MsgData))))
  443. {
  444. if(0==ModemStrCmp((char *)pMsg->MsgData,"+POC:02"))
  445. {
  446. pMsg->MsgData[pMsg->MsgLen-3]=0;
  447. len=AsciiHexStringToHexBytes(&pMsg->MsgData[13], pMsg->MsgData);
  448. pMsg->MsgData[len]=0;
  449. //找id
  450. len=GetParaFromStr(pMsg->MsgData,"id",buf);
  451. snprintf(buf1, sizeof(buf1),"%lu",sutProductPara.PSN);
  452. if(0!=strcmp(buf1, buf)) idFlag=1;;
  453. //找ip
  454. len=GetParaFromStr(pMsg->MsgData,"ip",buf);
  455. snprintf(buf1, sizeof(buf1), "%s", getPIPAddr());
  456. if(0!=strcmp(buf1, buf)) ipFlag=1;
  457. //找pwd
  458. len=GetParaFromStr(pMsg->MsgData,"pwd",buf);
  459. snprintf(buf1, sizeof(buf1), "%s",DEV_HARDID);
  460. if(0!=strcmp(buf1, buf)) pwdFlag=1;
  461. if(idFlag == 0 && ipFlag==0 && pwdFlag==0) return 0;
  462. RESET_ALL:
  463. ModemSendAT("AT+POC=010000");
  464. //更新id
  465. //if(idFlag != 0){
  466. snprintf(buf, sizeof(buf),"id=%lu;",sutProductPara.PSN);
  467. AscStrToHexStr(buf,buf1);
  468. ModemSendAT(buf1);
  469. //}
  470. //更新ip
  471. //if(ipFlag != 0){
  472. snprintf(buf, sizeof(buf), "ip=%s;", getPIPAddr());
  473. AscStrToHexStr(buf,buf1);
  474. ModemSendAT(buf1);
  475. //}
  476. //更新pwd
  477. //if(pwdFlag != 0){
  478. snprintf(buf, sizeof(buf), "pwd=%s;",DEV_HARDID);
  479. AscStrToHexStr(buf,buf1);
  480. ModemSendAT(buf1);
  481. //}
  482. ModemSendAT("\r\n");
  483. return 1;
  484. }
  485. }else os_dly_wait(1);
  486. }
  487. }
  488. return 0;
  489. }
  490. char WaitModemStart(void)
  491. {
  492. int t,i;
  493. SUT_MODEM_AT_MSG *pMsg=&sutAtmPro;
  494. SlwTrace(INF, "WaitModemRun:",0);
  495. for(i=0;i<100;i++)
  496. {
  497. t=50;
  498. ModemSendAT("ATE0\r\n");
  499. while(t--)
  500. {
  501. if((pMsg->MsgLen = MsgQueueAccept(pMsg->MsgData,sizeof(pMsg->MsgData))))
  502. {
  503. if(0==ModemStrCmp((char *)pMsg->MsgData,"OK") ||
  504. 0==ModemStrCmp((char *)pMsg->MsgData,"+POC:START"))
  505. {
  506. SlwTrace(INF, "Runing",1);
  507. return 0;
  508. }
  509. }else
  510. os_dly_wait(1);
  511. }
  512. }
  513. SlwTrace(INF, "TimeOut",1);
  514. return 1;
  515. }
  516. void ModemInfo(void)
  517. {
  518. int t;
  519. int i,len,ver,j;
  520. char bufTemp[30],version[10],type,countFlag;
  521. SUT_MODEM_AT_MSG *pMsg=&sutAtmPro;
  522. RunMake(THIS_FILE_ID);
  523. ver=0;
  524. SlwTrace(INF, "[03]ModemInfo:",1);
  525. type=0;
  526. for(i=0;i<10;i++)
  527. {
  528. if(type==0) ModemSendAT("ATI\r\n");//模块型号
  529. else ModemSendAT("AT+LCTSW\r\n");//版本信息
  530. t=50;
  531. while(t--)
  532. {
  533. if((pMsg->MsgLen = MsgQueueAccept(pMsg->MsgData,sizeof(pMsg->MsgData))))
  534. {
  535. if(type==0)
  536. {//Manufacturer: LONGSUNG
  537. //Model: U9507C 全网通模块版本
  538. //Model: U9507C_SXNT 单电信模块版本
  539. //Model: U9507C_SXNM 移动联通模块版本
  540. //Model: U9507C V3 全网通版本
  541. if(0==ModemStrCmp((char *)pMsg->MsgData,"Manufacturer:")) SlwTrace(INF, pMsg->MsgData, 0);
  542. else if(0==ModemStrCmp((char *)pMsg->MsgData,"Model:"))
  543. {
  544. if(0==ModemStrCmp((char *)pMsg->MsgData,"Model: U9507C V3")|| 0==ModemStrCmp((char *)pMsg->MsgData,"Model: U9507C SXNT")){
  545. //单电信
  546. support_type=ONLY_Telecom;
  547. }else if(0==ModemStrCmp((char *)pMsg->MsgData,"Model: U9507C_SXNM")|| 0==ModemStrCmp((char *)pMsg->MsgData,"Model: U9507C SXNM")){
  548. //移动联通版
  549. support_type=Mobile_unicom;
  550. }else if(0==ModemStrCmp((char *)pMsg->MsgData,"Model: U9507C POCC") ){
  551. support_type=All_Netcom;
  552. //全网通
  553. }else {
  554. //未知
  555. support_type=Un_Known;
  556. }
  557. SlwTrace(INF, pMsg->MsgData, 0);
  558. type ++;
  559. break;
  560. }
  561. }else{
  562. //SoftwareVersion: LLA0029.1.2_M005
  563. //InnerVersion: LLA0029_0016_1.0.57_L0901_EFS2.6
  564. //AP: LLA0029_0016_0.0.57_L0901_M005
  565. if(0==ModemStrCmp((char *)pMsg->MsgData,"SoftwareVersion:")) SlwTrace(INF, pMsg->MsgData, 0);
  566. else if(0==ModemStrCmp((char *)pMsg->MsgData,"AP:"))
  567. {
  568. SlwTrace(INF, pMsg->MsgData, 0);
  569. return;
  570. }
  571. else if(0==ModemStrCmp((char *)pMsg->MsgData,"InnerVersion:"))
  572. {
  573. SlwTrace(INF, pMsg->MsgData, 0);
  574. countFlag=0;
  575. for(j=0;j<strlen(pMsg->MsgData);j++)
  576. {
  577. if(pMsg->MsgData[j] == '_')
  578. {
  579. countFlag++;
  580. if(countFlag == 1)
  581. {
  582. version[0] = pMsg->MsgData[j+3];
  583. version[1] = pMsg->MsgData[j+4];
  584. }else if(countFlag == 3)
  585. {
  586. version[2] = pMsg->MsgData[j+2];
  587. version[3] = pMsg->MsgData[j+3];
  588. version[4] = pMsg->MsgData[j+4];
  589. version[5] = pMsg->MsgData[j+5];
  590. version[6] = 0;
  591. snprintf(bufTemp, sizeof(bufTemp), "[03]ModemVer:%s",version);
  592. SlwTrace(INF, bufTemp, 1);
  593. g_iModemVer=atoi(version);
  594. }
  595. }
  596. }
  597. }
  598. }
  599. }else os_dly_wait(1);
  600. }
  601. }
  602. }
  603. int ModemGetIMEI(void)
  604. {
  605. int t,j;
  606. int i,len;
  607. SUT_MODEM_AT_MSG *pMsg=&sutAtmPro;
  608. for(i=0;i<50;i++){
  609. ModemSendAT("AT+GSN\r\n");//0x80DA219D
  610. //862015030301209 两种情况都会返回
  611. t=50;
  612. while(t--)
  613. {
  614. if((pMsg->MsgLen = MsgQueueAccept(pMsg->MsgData,sizeof(pMsg->MsgData))))
  615. {
  616. len=strlen((char *)&(pMsg->MsgData));
  617. if(0==ModemStrCmp((char *)pMsg->MsgData,"0x"))
  618. {
  619. len -=4;
  620. memcpy(DEV_HARDID, &pMsg->MsgData[2], len);
  621. if(len < sizeof(DEV_HARDID))
  622. DEV_HARDID[len]=0;
  623. return 1;
  624. }else if(len == 17)
  625. {
  626. len -= 2;
  627. memcpy(DEV_HARDID, pMsg->MsgData, len);
  628. if(len < sizeof(DEV_HARDID))
  629. DEV_HARDID[len]=0;
  630. return 2;
  631. }
  632. }else
  633. os_dly_wait(1);
  634. }
  635. }
  636. return 0;
  637. }
  638. void CheckPocType(void)
  639. {
  640. //19001 19002 19003 自研POC版本号
  641. //1184 1191 西安POC版本号
  642. hgs_poc_type=POC_XIAN;//默认是西安的,然后通过POC版本号来判断是西安的还是自研的POC
  643. if(g_iPocVer > 19000){
  644. hgs_poc_type=POC_OWN;
  645. SlwTrace(INF, "poc-own",1);
  646. }else SlwTrace(INF, "poc-xian",1);
  647. }
  648. void ModemPocVersionCheck(void)
  649. {
  650. char bufTemp[40];
  651. short t,i,len,j;
  652. int ver;
  653. SUT_MODEM_AT_MSG *pMsg=&sutAtmPro;
  654. for(i=0;i<5;i++)
  655. {
  656. t=50;
  657. ModemSendAT("AT+POC_VER?\r\n");
  658. while(t--)
  659. {
  660. if((pMsg->MsgLen = MsgQueueAccept(pMsg->MsgData,sizeof(pMsg->MsgData))))
  661. {
  662. if(0==ModemStrCmp((char *)pMsg->MsgData,"+POC_VER:"))
  663. {
  664. len = strlen(pMsg->MsgData);
  665. j=0;
  666. for(i=0;i<len;i++)
  667. {
  668. if(pMsg->MsgData[i] == '\r')
  669. {
  670. bufTemp[j]=0;
  671. ver=atoi(bufTemp);
  672. snprintf(bufTemp, sizeof(bufTemp),"[04]POCver:%d<->%s", ver,pMsg->MsgData);
  673. SlwTrace(INF, bufTemp,0);
  674. g_iPocVer=ver;
  675. return;
  676. }else if(pMsg->MsgData[i] >= '0' && pMsg->MsgData[i] <= '9') bufTemp[j++]=pMsg->MsgData[i];
  677. }
  678. }
  679. }else
  680. os_dly_wait(1);
  681. }
  682. }
  683. snprintf(bufTemp, sizeof(bufTemp),"[04]PocVer=%d", ver);
  684. SlwTrace(INF, bufTemp, 1);
  685. }
  686. void ModemApnConfig(void)
  687. {
  688. char needAuthLogin=0;
  689. char buf[100];
  690. char buf2[80];
  691. char i,t;
  692. char ApnSetFlag=0;
  693. char *apnName=newPara.apnList.apnList[newPara.apnList.defaultuse].account;
  694. char *apnPass=newPara.apnList.apnList[newPara.apnList.defaultuse].pass;
  695. SUT_MODEM_AT_MSG *pMsg=&sutAtmPro;
  696. snprintf(buf, sizeof(buf), "[11]Accessp:");
  697. if(newPara.apnList.APN_Name[0]==0)
  698. {//接入点为空时不配置,因为模块不支持
  699. strcat(buf, "unsupport-Empty");
  700. }else
  701. {
  702. snprintf(buf2, sizeof(buf2), "AT+MIPPROFILE=1,\"%s\"\r\n",newPara.apnList.APN_Name);
  703. ModemSendAT(buf2);
  704. snprintf(buf2, sizeof(buf2), "%s",newPara.apnList.APN_Name);
  705. strcat(buf,buf2);
  706. }
  707. SlwTrace(INF,buf,0);
  708. snprintf(buf, sizeof(buf), ",Name-Pass:");
  709. if(apnName[0] ==0 ||
  710. apnPass[0] ==0)
  711. {//名称或密码为空不配置,因为模块不支持
  712. strcat(buf, "unsupport-Empty");
  713. }else
  714. {
  715. snprintf(buf2, sizeof(buf2),"AT^PPPCFG=\"%s\",\"%s\"\r\n",apnName,apnPass);
  716. ModemSendAT(buf2);
  717. snprintf(buf2, sizeof(buf2), "%s,%s",apnName,apnPass);
  718. strcat(buf,buf2);
  719. needAuthLogin=1;
  720. }
  721. SlwTrace(INF, buf,1);
  722. if(needAuthLogin != 0){
  723. //认证
  724. snprintf(buf, sizeof(buf),"AUTH-LOGIN:");
  725. switch(newPara.authType){
  726. case AUTH_LOGIN_PAP:strcat(buf, "PAP");
  727. snprintf(buf2, sizeof(buf2),"AT$QCPDPP=1,%d,%s,%s\r\n",newPara.authType,apnPass,apnName);
  728. break;
  729. case AUTH_LOGIN_CHAP:strcat(buf, "CHAP");
  730. case AUTH_LOGIN_NONE:strcat(buf, "NONE");
  731. default:strcat(buf, " Do nothing");
  732. snprintf(buf2, sizeof(buf2),"AT$QCPDPP=1,%d\r\n",newPara.authType);
  733. break;
  734. }
  735. SlwTrace(INF,buf, 1);
  736. ModemSendAT(buf2);
  737. SlwTrace(INF,buf2,0);
  738. os_dly_wait(20);
  739. SlwTrace(INF,"AuthLogin Done",1);
  740. }
  741. }
  742. void M9507CSendTcpData(unsigned char socket, unsigned char *pData, unsigned short len)
  743. {
  744. char buf[20];
  745. snprintf(buf, sizeof(buf), "AT+TCPSEND=%d,%d,",socket, len);
  746. ModemSendAT(buf);
  747. ModemSendData(pData, len);
  748. ModemSendAT("\r\n");
  749. }
  750. void ModemSetSpeed(void)
  751. {
  752. char i,t;
  753. int Volume;
  754. SUT_MODEM_AT_MSG *pMsg=&sutAtmPro;
  755. for(i=0;i<5;i++)
  756. {
  757. t=50;
  758. REGO:
  759. ModemSendAT("AT+LSHTTSSPEED?\r\n");
  760. while(t--)
  761. {
  762. if((pMsg->MsgLen = MsgQueueAccept(pMsg->MsgData,sizeof(pMsg->MsgData))))
  763. {
  764. if(0==ModemStrCmp((char *)pMsg->MsgData,"+LSHTTSSPEED:"))
  765. {
  766. Volume=atoi(&pMsg->MsgData[13]);
  767. if(7000 != Volume)
  768. {
  769. ModemSendAT("AT+LSHTTSSPEED=-1,7000\r\n");
  770. os_dly_wait(1);
  771. goto REGO;
  772. }
  773. else
  774. {
  775. SlwTrace(INF, "[06]SetTTS Speed Ok",1);
  776. return;
  777. }
  778. }
  779. }else
  780. os_dly_wait(1);
  781. }
  782. }
  783. SlwTrace(INF, "[06]SetTTS Speed Failed",1);
  784. }
  785. void VolumeSet(void)
  786. {
  787. char i,t;
  788. int Volume;
  789. SUT_MODEM_AT_MSG *pMsg=&sutAtmPro;
  790. char sendBuf[40],readBuf[30];
  791. char target[5];
  792. snprintf(sendBuf, sizeof(sendBuf), "at+syscmd=start_pcm volume ");
  793. snprintf(readBuf, sizeof(readBuf), "at+syscmd=start_pcm volume\r\n");
  794. if(newPara.SoundMode==0) snprintf(target, sizeof(target), "7 5");
  795. else snprintf(target, sizeof(target), "7 7");
  796. strcat(sendBuf, target);
  797. strcat(sendBuf, "\r\n");
  798. //先配置一次,再查,因为默认就查有可能是没有返回的
  799. ModemSendAT(sendBuf);//TTS 音量/ MIC 输入音量
  800. for(i=0;i<10;i++)
  801. {
  802. t=100;
  803. ModemSendAT(readBuf);
  804. while(t--)
  805. {
  806. if((pMsg->MsgLen = MsgQueueAccept(pMsg->MsgData,sizeof(pMsg->MsgData))))
  807. {
  808. if(0==ModemStrCmp((char *)pMsg->MsgData,target))
  809. {
  810. SlwTrace(INF, "[07]Set Volume ok",1);
  811. return;
  812. }else{
  813. if(t==0) ModemSendAT(sendBuf);
  814. }
  815. }else
  816. os_dly_wait(1);
  817. }
  818. }
  819. SlwTrace(INF, "[07]Set Volume failed",1);
  820. }
  821. void SpeakTTSVoice(void)
  822. {
  823. int len,timeout;
  824. SUT_MODEM_AT_MSG *pMsg=&sutAtmPro;
  825. unsigned char codeType=ENCODE_UNICODE;
  826. if(newPara.ttsMessage[0]==0) return;
  827. len=strlen(newPara.ttsMessage);
  828. len = len+(8-len%8);//8倍数
  829. timeout=len/8;//两个中文需要播报1秒算
  830. timeout *= 100;
  831. if(newPara.ttsCodeType==TTS_UNICODE) codeType=ENCODE_UNICODE;
  832. else if(newPara.ttsCodeType==TTS_GBK) codeType=ENCODE_GBK;
  833. MeSpeak(codeType, newPara.ttsMessage,0);
  834. // while(timeout--)
  835. // {
  836. // if((pMsg->MsgLen = MsgQueueAccept(pMsg->MsgData,sizeof(pMsg->MsgData))))
  837. // {
  838. // if(0==ModemStrCmp((char *)pMsg->MsgData,"+LSHTTS: END"))
  839. // {
  840. // SpeakerCtrl(0);
  841. // return;
  842. // }
  843. // }else os_dly_wait(1);
  844. // }
  845. // SpeakerCtrl(0);
  846. }
  847. void ServerTimeGet(void)
  848. {
  849. static unsigned short timeCnt=12000;
  850. if(++timeCnt < 12000) return;
  851. timeCnt=0;
  852. ModemSendAT("AT+CCLK?\r\n");
  853. }
  854. //total 成员总数
  855. //一次获取个数最多5个,取决于显示条目个数
  856. //前提是要使用简短模式
  857. void SimpleUserInfoScan(uint8_t firstIn,uint8_t direction)
  858. {
  859. uint16_t i;
  860. uint16_t timeout;
  861. char buf[30];
  862. uint16_t thisStartIndex;
  863. uint8_t readNum;
  864. if(firstIn) sutPocStatus.handleIndex=0;
  865. ShowMessageBox("请稍候...");
  866. os_dly_wait(1);
  867. snprintf(buf, sizeof(buf),"AT+POC=0E0000%08x\r\n",sutPocStatus.LocalGroup.ID);//先更新总数
  868. ModemSendAT(buf);
  869. SlwTrace(INF,buf,0);
  870. timeout=1000;
  871. sutPocStatus.UserNum_Update=0;
  872. sutPocStatus.UserOnLineNum=0;
  873. while(timeout)
  874. {
  875. timeout--;
  876. OsDelayTime(1);
  877. if(sutPocStatus.UserNum_Update) break;
  878. if(timeout % 200 == 0)
  879. ModemSendAT(buf);
  880. }
  881. if(sutPocStatus.UserOnLineNum<=0) {
  882. sutPocStatus.FillUserIndex=0;
  883. goto QUIT_FUNCTION;
  884. }
  885. if(sutPocStatus.handleIndex >= sutPocStatus.UserOnLineNum)
  886. {
  887. snprintf(buf, sizeof(buf), "over:%d",sutPocStatus.handleIndex);
  888. SlwTrace(INF, buf, 1);
  889. sutPocStatus.handleIndex=sutPocStatus.UserOnLineNum-1;
  890. }
  891. //然后根据最新总数来获取每个成员信息
  892. if(direction==1)//递增索引
  893. {
  894. thisStartIndex=sutPocStatus.handleIndex;
  895. if(sutPocStatus.UserOnLineNum-thisStartIndex>=5) readNum=5;
  896. else readNum=sutPocStatus.UserOnLineNum-thisStartIndex;
  897. }else{//递减索引
  898. if(sutPocStatus.handleIndex <5)
  899. {
  900. thisStartIndex=0;
  901. readNum=sutPocStatus.UserOnLineNum;
  902. }
  903. else
  904. {
  905. thisStartIndex=sutPocStatus.handleIndex-5;
  906. readNum=5;
  907. }
  908. }
  909. if(readNum >= 5) readNum=5;
  910. sutPocStatus.FillUserIndex=0;
  911. for(i=thisStartIndex;i<(thisStartIndex+readNum);i++)
  912. {
  913. sutPocStatus.GetOneUserFlag=0;
  914. snprintf(buf, sizeof(buf), "AT+POC=10000021%04x\r\n",i);
  915. ModemSendAT(buf);
  916. SlwTrace(INF, buf,0);
  917. timeout=200;
  918. while(1)
  919. {
  920. OsDelayTime(1);
  921. if(sutPocStatus.GetOneUserFlag)
  922. {
  923. sutPocStatus.FillUserIndex++;
  924. break;
  925. }
  926. if(--timeout==0) break;
  927. }
  928. }
  929. if(direction==1) sutPocStatus.handleIndex += readNum;
  930. else sutPocStatus.handleIndex -= readNum;
  931. //最终成功读了多少个回来,存在sutPocStatus.FillUserIndex中
  932. QUIT_FUNCTION:
  933. GuiClearRect(0, 40, LCD_WIDTH-1, LCD_HEIGHT-32);
  934. }
  935. void SetModemPocSimpleMode(void)
  936. {//设置使用简短模式获取成员信息
  937. short t,i;
  938. SUT_MODEM_AT_MSG *pMsg=&sutAtmPro;
  939. for(i=0;i<5;i++)
  940. {
  941. t=50;
  942. ModemSendAT("AT+POC=10000020\r\n");
  943. while(t--)
  944. {
  945. if((pMsg->MsgLen = MsgQueueAccept(pMsg->MsgData,sizeof(pMsg->MsgData))))
  946. {
  947. if(0==ModemStrCmp((char *)pMsg->MsgData,"+POC:10000000"))
  948. {
  949. SlwTrace(INF, "[14]SimpleMode_Ok",1);
  950. return;
  951. }
  952. }else
  953. os_dly_wait(1);
  954. }
  955. }
  956. SlwTrace(INF, "[14]SimpleMode_Tout",1);
  957. }
  958. char GetUniStringByID(char *HardIDString)
  959. {//输出15个字节的字符串
  960. unsigned char id[12];
  961. unsigned char string[16];
  962. long long temp;
  963. short i;
  964. unsigned char seed;
  965. if(HardIDString == '\0') return 0;
  966. GetSTM32ID(id);
  967. printf("STM32 ID==");
  968. for(i=0;i<12;i++)printf("%02x",id[i]);
  969. printf("\r\n");
  970. for(i=5;i>=0;i--){
  971. temp <<=8;
  972. temp |= id[i];
  973. }
  974. temp &= 0xffffffffffff;
  975. printf("temp=%015llu\r\n",temp);
  976. snprintf(string,sizeof(string),"%015llu",temp);
  977. for(i=0;i<15;i++) HardIDString[i]=string[i];
  978. HardIDString[15]='\0';
  979. //snprintf(HardIDString,16,"%015llu",temp);
  980. return 1;
  981. }
  982. //检查并设置POC域名
  983. int ModemCheckFotaDomain(void)
  984. {
  985. #if 1
  986. return 0;
  987. #else
  988. int t,j;
  989. int i,len;
  990. char buf1[130];
  991. char buf2[40];
  992. SUT_MODEM_AT_MSG *pMsg=&sutAtmPro;
  993. RunMake(THIS_FILE_ID);
  994. for(i=0;i<5;i++)
  995. {
  996. ModemSendAT("AT+POC=21000000\r\n");
  997. t=50;
  998. while(t--)
  999. {
  1000. if((pMsg->MsgLen = MsgQueueAccept(pMsg->MsgData,sizeof(pMsg->MsgData))))
  1001. {
  1002. if(0==ModemStrCmp((char *)pMsg->MsgData,"+POC:21000000"))
  1003. {
  1004. snprintf(buf2,sizeof(buf2),"%s",sutProductPara.fota_pocdomain);
  1005. //strcat(buf,buf2);
  1006. for(j=0;j<strlen(pMsg->MsgData);j++) if(pMsg->MsgData[j]== '\r') pMsg->MsgData[j] = 0;
  1007. if(0!=strcasecmp((char *)&pMsg->MsgData[13],buf2))
  1008. {
  1009. snprintf(buf1,sizeof(buf1),"AT+POC=21000001%s",buf1);
  1010. return 1;
  1011. }else return 0;
  1012. }
  1013. }else os_dly_wait(1);
  1014. }
  1015. }
  1016. return 0;
  1017. #endif
  1018. }
  1019. int htoi(char s[])
  1020. {
  1021. int i = 0;
  1022. int n = 0;
  1023. if (s[0] == '0' && (s[1]=='x' || s[1]=='X'))
  1024. {
  1025. i = 2;
  1026. }
  1027. else
  1028. {
  1029. i = 0;
  1030. }
  1031. for (; (s[i] >= '0' && s[i] <= '9') || (s[i] >= 'a' && s[i] <= 'z') || (s[i] >='A' && s[i] <= 'Z');++i)
  1032. {
  1033. if (tolower(s[i]) > '9')
  1034. {
  1035. n = 16 * n + (10 + tolower(s[i]) - 'a');
  1036. }
  1037. else
  1038. {
  1039. n = 16 * n + (tolower(s[i]) - '0');
  1040. }
  1041. }
  1042. return n;
  1043. }
  1044. int ModemSetCodec(unsigned char addr,unsigned short value)
  1045. {
  1046. int t,j;
  1047. int i,len;
  1048. SUT_MODEM_AT_MSG *pMsg=&sutAtmPro;
  1049. char buf[50];
  1050. for(i=0;i<10;i++){
  1051. t=50;
  1052. sprintf(buf,"AT+CODEC=3,%2x,%4x\r\n",addr,value);
  1053. ModemSendAT(buf);
  1054. while(t--)
  1055. {
  1056. if((pMsg->MsgLen = MsgQueueAccept(pMsg->MsgData,sizeof(pMsg->MsgData))))
  1057. {
  1058. len=strlen((char *)&(pMsg->MsgData));
  1059. if(0==ModemStrCmp((char *)pMsg->MsgData,"OK"))
  1060. {
  1061. //SlwTrace(INF,(char *)pMsg->MsgData,1);
  1062. return 0;
  1063. }
  1064. }else os_dly_wait(1);
  1065. }
  1066. }
  1067. return addr;
  1068. }
  1069. void VolumeSetSpk(void)
  1070. {
  1071. char i,t;
  1072. int Volume;
  1073. SUT_MODEM_AT_MSG *pMsg=&sutAtmPro;
  1074. char sendBuf[40],readBuf[30];
  1075. char target[5];
  1076. char tmp;
  1077. if(newPara.SoundMode==0)tmp=newPara.lvl;
  1078. else tmp=newPara.OutDoorLvl;
  1079. snprintf(sendBuf,sizeof(sendBuf),"AT+LVL=4,%d\r\n",tmp);
  1080. snprintf(readBuf,sizeof(readBuf),"+LVL:4,%d\r\n",tmp);
  1081. SlwTrace(INF,sendBuf,0);
  1082. for(i=0;i<15;i++)
  1083. {
  1084. t=100; //100
  1085. ModemSendAT(sendBuf);//TTS 音量/ MIC 输入音量
  1086. os_dly_wait(100);
  1087. ModemSendAT("AT+LVL?\r\n");
  1088. while(t--)
  1089. {
  1090. if((pMsg->MsgLen = MsgQueueAccept(pMsg->MsgData,sizeof(pMsg->MsgData))))
  1091. {
  1092. if(0==ModemStrCmp((char *)pMsg->MsgData,readBuf))
  1093. {
  1094. SlwTrace(INF, "[07-02]Set SPK ok",1);
  1095. return;
  1096. }
  1097. }else
  1098. os_dly_wait(1);
  1099. }
  1100. }
  1101. SlwTrace(INF, "[07-02]Set Volume failed",1);
  1102. }
  1103. void VolumeSetMIC(void)
  1104. {
  1105. char i,t;
  1106. char buf[40];
  1107. char readbuf[20];
  1108. int Volume;
  1109. SUT_MODEM_AT_MSG *pMsg=&sutAtmPro;
  1110. snprintf(buf,sizeof(buf),"AT+MIC=4,255\r\n");
  1111. snprintf(readbuf,sizeof(readbuf),"+MIC:4,255\r\n");
  1112. ModemSendAT(buf);//TTS 音量/ MIC 输入音量
  1113. SlwTrace(INF,buf,0);
  1114. SlwTrace(INF,readbuf,0);
  1115. for(i=0;i<15;i++)
  1116. {
  1117. t=50; //100
  1118. os_dly_wait(10);
  1119. ModemSendAT("AT+MIC?\r\n");
  1120. while(t--)
  1121. {
  1122. if((pMsg->MsgLen = MsgQueueAccept(pMsg->MsgData,sizeof(pMsg->MsgData))))
  1123. {
  1124. if(0==ModemStrCmp((char *)pMsg->MsgData,readbuf))
  1125. {
  1126. SlwTrace(INF, "[07-03]Set MIC ok",1);
  1127. return;
  1128. }else{
  1129. if(t==0) ModemSendAT(buf);
  1130. }
  1131. }else
  1132. os_dly_wait(1);
  1133. }
  1134. }
  1135. SlwTrace(INF, "[07-03]Set MIC failed",1);
  1136. }
  1137. /***********************************************************************************/