PageRenderTime 58ms CodeModel.GetById 29ms RepoModel.GetById 0ms app.codeStats 0ms

/windcatcher/src/modem.c

https://github.com/FlameN/STM32RUNO
C | 562 lines | 408 code | 70 blank | 84 comment | 90 complexity | 7071b58fa5cdb38e87e00c16226b3ebd MD5 | raw file
  1. /*
  2. * modem.c
  3. *
  4. * Created on: Jan 18, 2010
  5. * Author: albert
  6. */
  7. #include <stdlib.h>
  8. #include <stdio.h>
  9. #include <stdarg.h>
  10. #include <string.h>
  11. #include "board.h"
  12. #include "FreeRTOS.h"
  13. #include "task.h"
  14. #include "dbg.h"
  15. #include "modem.h"
  16. #include "usart2.h"
  17. #include "typedef.h"
  18. #include "usermemory.h"
  19. #define MODEM_SIO_BUFF_SIZE 1024
  20. #define MODEM_ENABLE { GPIO_ResetBits(GPIOA, GPIO_Pin_1);}
  21. #define MODEM_DISABLE {GPIO_SetBits(GPIOA, GPIO_Pin_1); }
  22. uint8 sio_buf[MODEM_SIO_BUFF_SIZE];
  23. #define SIOFIFOSIZE 1024
  24. uint8 sio_fifo[SIOFIFOSIZE];
  25. //uint8 sio_buf[64];
  26. volatile int bufpoint, bufsize;
  27. #define STRBUFLEN 256
  28. char strbuf[STRBUFLEN];
  29. #define MODEM_PORT (&COM0)
  30. const AT_COMMAND atset[AT_AMOUNT] =
  31. { "Call Ready", MA_CALLREADY, "OK", MA_OK, "SERVER OK", MA_SERVEROK,
  32. "NORMAL POWER DOWN", MA_NORMALPOWERDOWN, "STATE: IP STATUS",
  33. MA_STATEIPSTATUS, "STATE: IP CLOSE", MA_STATEIPCLOSE,
  34. "STATE: IP INITIAL", MA_STATEIPINITIAL, "STATE: IP GPRSACT",
  35. MA_STATEIPGPRSACT, "STATE: PDP DEACT", MA_STATEPDPDEACT, "> ",
  36. MA_CIPSENDREADY, "CONNECT", MA_CONNECT, "NO CARRIER", MA_NOCARRIER,
  37. "ERROR", MA_ERROR };
  38. bool IsLiteral(char ch)
  39. {
  40. if ((ch >= ' ') && (ch <= '~'))
  41. {
  42. return true;
  43. }
  44. return false;
  45. }
  46. void InitSioBuf()
  47. {
  48. bufpoint = 0;
  49. bufsize = 0;
  50. }
  51. bool PopFromBuf(char *ch)
  52. {
  53. if (bufpoint >= bufsize)
  54. {
  55. return false;
  56. }
  57. *ch = sio_buf[bufpoint];
  58. bufpoint++;
  59. return true;
  60. }
  61. void FillBufEx(char* abuf,int16_t* aSize)
  62. {
  63. InitSioBuf();
  64. uint16_t time = 4000;
  65. uint16_t counter = 0;
  66. while(ReceivedMsg.flag == false && counter < time)
  67. {
  68. counter++;
  69. vTaskDelay(1);
  70. }
  71. if(ReceivedMsg.flag == true)
  72. {
  73. for(int i=0;i<ReceivedMsg.size;i++)
  74. {
  75. abuf[i] = ReceivedMsg.buffer[i];
  76. }
  77. *aSize = ReceivedMsg.size;
  78. ReceivedMsg.flag = false;
  79. ReceivedMsg.size = 0;
  80. //TIM_Cmd(TIM5, ENABLE);
  81. }
  82. //vTaskDelay(1000);
  83. //bufsize = uart2Read(sio_buf,256);
  84. }
  85. void FillBuf()
  86. {
  87. InitSioBuf();
  88. uint16_t time = 1500;
  89. uint16_t counter = 0;
  90. while(ReceivedMsg.flag == false && counter < time)
  91. {
  92. counter++;
  93. vTaskDelay(1);
  94. }
  95. if(ReceivedMsg.flag == true)
  96. {
  97. for(int i=0;i<ReceivedMsg.size;i++)
  98. {
  99. sio_buf[i] = ReceivedMsg.buffer[i];
  100. }
  101. bufsize = ReceivedMsg.size;
  102. ReceivedMsg.size = 0;
  103. ReceivedMsg.flag = false;
  104. //TIM_Cmd(TIM5, ENABLE);
  105. }
  106. //vTaskDelay(1000);
  107. //bufsize = uart2Read(sio_buf,256);
  108. }
  109. bool ReadString(char *str, int size)
  110. {
  111. char ch;
  112. if (bufpoint >= bufsize)
  113. {
  114. FillBuf();
  115. }
  116. do // remove non symbolic data
  117. {
  118. if (PopFromBuf(&ch) == false)
  119. {
  120. return false;
  121. }
  122. } while (!IsLiteral(ch));
  123. do
  124. {
  125. if (IsLiteral(ch))
  126. {
  127. *str = ch;
  128. str++;
  129. }
  130. else // packet end
  131. {
  132. *str = 0; // add end of string
  133. return true;
  134. }
  135. } while (PopFromBuf(&ch) == true);
  136. return false;
  137. }
  138. MDEM_ANSWER GetModemAnswer(char *s)
  139. {
  140. int i;
  141. if (*s == 0)
  142. {
  143. return MA_UNKNOWN;
  144. }
  145. for (i = 0; i < AT_AMOUNT; i++)
  146. {
  147. if (strcmp(atset[i].str, s) == 0)
  148. {
  149. return (atset[i].ma);
  150. }
  151. }
  152. return MA_UNKNOWN;
  153. }
  154. MDEM_ANSWER ReadModem()
  155. {
  156. if (ReadString(strbuf, STRBUFLEN) == false)
  157. {
  158. return MA_UNKNOWN;
  159. }
  160. dbgmessage("from modem>");
  161. dbgmessage(strbuf);
  162. return GetModemAnswer((char*) strbuf);
  163. }
  164. /* ----------------------- Start implementation -----------------------------*/
  165. void ModemWrite(char *str)
  166. {
  167. dbgmessage("to modem>");
  168. dbgmessage(str);
  169. uint32 i = 0;
  170. char *tmpstr = str;
  171. while (*str)
  172. {
  173. str++;
  174. i++;
  175. if (i == 62)
  176. break;
  177. }
  178. //AT91F_USART_SEND(MODEM_PORT, (uint8*) tmpstr, i);
  179. uart2Write((uint8*) tmpstr, i);
  180. }
  181. bool WaitAnsver(MDEM_ANSWER ma)
  182. {
  183. int i = 5;
  184. while (ReadModem() != ma)
  185. {
  186. if (i == 0)
  187. {
  188. return false;
  189. }
  190. i--;
  191. }
  192. // dbgmessage("Ok\n");
  193. return true;
  194. }
  195. bool WaitCallReady()
  196. {
  197. int i = 0;
  198. dbgmessage("Waiting for modem.");
  199. while (ReadModem() != MA_CALLREADY)
  200. {
  201. vTaskDelay(200);
  202. if (i > 7)
  203. {
  204. return false;
  205. }
  206. i++;
  207. };
  208. return true;
  209. }
  210. bool WaitOk()
  211. {
  212. ModemWrite("AT\r");
  213. return WaitAnsver(MA_OK);
  214. }
  215. bool WaitAtd()
  216. {
  217. ModemWrite("AT&D0\r");
  218. return WaitAnsver(MA_OK);
  219. }
  220. bool WaitAte()
  221. {
  222. ModemWrite("ATE0V1\r");
  223. return WaitAnsver(MA_OK);
  224. }
  225. bool WaitGprsConnect()
  226. {
  227. char myIp[17];
  228. char strsipstart[256];
  229. char buf[64];
  230. char header[] = "+IPD";
  231. int packSize;
  232. int headerSize;
  233. FLASHMEM *pxConfig = (FLASHMEM*) DEVICE_FLASHMEM_LOCATION;
  234. int i;
  235. ModemWrite("AT+CIPMODE=0\r");
  236. if (WaitAnsver(MA_OK) == false)
  237. return false;
  238. // ModemWrite("AT+CSQ\r");
  239. // WaitAnsver(MA_OK); // TODO replace wait answer with parsing level string
  240. // if (WaitAnsver(MA_OK) == false)
  241. // return false;
  242. // ModemWrite("AT+CREG?\r");
  243. // WaitAnsver(MA_OK);// TODO replace wait answer with parsing status
  244. // if (WaitAnsver(MA_OK) == false)
  245. // return false;
  246. strcpy(buf,"AT+CGDCONT=1,\"IP\",\"");
  247. strcat(buf,PPP_ADPARAM);
  248. strcat(buf,"\"\r");
  249. //sprintf(buf,PPP_ADDSTR,pxConfig->devcfg.gprs.adparam);
  250. ModemWrite(buf);
  251. if (WaitAnsver(MA_OK) == false)
  252. return false;
  253. if(strlen(pxConfig->devcfg.gprs.login)>16 || strlen(pxConfig->devcfg.gprs.password)>16 || strlen(pxConfig->devcfg.gprs.adparam)>32)
  254. {
  255. strcpy(buf,"AT+CSTT=\"");
  256. strcat(buf,PPP_ADPARAM);
  257. strcat(buf,"\",\"");
  258. strcat(buf,PPP_USER);
  259. strcat(buf,"\",\"");
  260. strcat(buf,PPP_PASS);
  261. strcat(buf,"\"\r");
  262. //sprintf(buf,PPP_CSTT,PPP_ADPARAM,PPP_USER,PPP_PASS);
  263. }
  264. else
  265. {
  266. strcpy(buf,"AT+CSTT=\"");
  267. strcat(buf,pxConfig->devcfg.gprs.adparam);
  268. strcat(buf,"\",\"");
  269. strcat(buf,pxConfig->devcfg.gprs.login);
  270. strcat(buf,"\",\"");
  271. strcat(buf,pxConfig->devcfg.gprs.password);
  272. strcat(buf,"\"\r");
  273. //sprintf(buf,PPP_CSTT,pxConfig->devcfg.gprs.adparam,pxConfig->devcfg.gprs.login,pxConfig->devcfg.gprs.password);
  274. }
  275. ModemWrite(buf);
  276. if (WaitAnsver(MA_OK) == false)
  277. return false;
  278. ModemWrite("AT+CMGF=1\r");
  279. if (WaitAnsver(MA_OK) == false)
  280. return false;
  281. ModemWrite("AT+CIPSPRT=2\r");
  282. if (WaitAnsver(MA_OK) == false)
  283. return false;
  284. ModemWrite("AT+CIPHEAD=1\r");
  285. if (WaitAnsver(MA_OK) == false)
  286. return false;
  287. ModemWrite("AT+CIICR\r");
  288. if (WaitAnsver(MA_OK) == false)
  289. return false;
  290. ModemWrite("AT+CIPCSGP=1,\"CMNET\"\r");
  291. if (WaitAnsver(MA_OK) == false)
  292. return false;
  293. ModemWrite("AT+CLPORT=\"TCP\",\"4444\"\r");
  294. if (WaitAnsver(MA_OK) == false)
  295. return false;
  296. ModemWrite("AT+CIFSR\r");
  297. WaitAnsver(MA_UNKNOWN);
  298. for (i = 0; i < 5; i++)
  299. {
  300. ModemWrite("AT+CIPSERVER\r");
  301. if (WaitAnsver(MA_OK) == true)
  302. break;
  303. }
  304. if (i > 4)
  305. return false;
  306. ModemWrite("AT+CIPCCON=2\r");
  307. if (WaitAnsver(MA_OK) == false)
  308. return false;
  309. dbgmessage("GPRS Connected");
  310. return true;
  311. }
  312. void ModemInit()
  313. {
  314. //AT91F_USART_OPEN(AT91_USART_COM0_ID, 115200, AT91C_US_ASYNC_MODE);
  315. uart2Init(115200);
  316. USART2TIMConfigure(50);
  317. //------------------------------------------------------------
  318. while (1)
  319. {
  320. dbgmessage("!!!!!!!!!!!");
  321. dbgHeapFreeSize();
  322. uint16_t counter=0;
  323. //LED_MODE_GREEN(0);
  324. //LED_MODE_RED(1);
  325. dbgmessage("Init Modem.\r\n");
  326. dbgmessage("Modem ... ");
  327. MODEM_ENABLE;
  328. dbgmessage("Enabled .... ");
  329. vTaskDelay(3000);
  330. MODEM_DISABLE;
  331. dbgmessage("Disable .... ");
  332. vTaskDelay(10000);
  333. MODEM_ENABLE;
  334. vTaskDelay(1000);
  335. WaitCallReady();
  336. //LED_MODE_RED(0);
  337. //if (!WaitCallReady())
  338. //continue;
  339. while (!WaitOk() && counter++ < 11)
  340. {
  341. vTaskDelay(100);
  342. }
  343. if(counter >= 10)continue;
  344. //LED_MODE_RED(1);
  345. //LED_MODE_GREEN(1);
  346. vTaskDelay(50);
  347. if (!WaitAtd())
  348. continue;
  349. vTaskDelay(30);
  350. //LED_MODE_GREEN(1);
  351. if (!WaitAte())
  352. continue;
  353. vTaskDelay(50);
  354. //LED_MODE_GREEN(0);
  355. if (!WaitOk())
  356. continue;
  357. vTaskDelay(50);
  358. //LED_MODE_GREEN(1);
  359. if (!WaitGprsConnect())
  360. continue;
  361. vTaskDelay(50);
  362. //LED_MODE_GREEN(0);
  363. return;
  364. }
  365. }
  366. int ModemReceiveData(uint8 *buf, int maxsize)
  367. {
  368. //LED_MODE_GREEN(1);
  369. dbgmessage("modem receive data:");
  370. char debugbuf[64];
  371. char header[] = "+IPD";
  372. int packSize;
  373. int headerSize;
  374. int i;
  375. //bufsize = AT91F_USART_RECEIVE(MODEM_PORT, (uint8*) sio_buf, SIOFIFOSIZE,
  376. //4000);
  377. FillBuf();
  378. if(bufsize == 0) return 0;
  379. for (i = 0; i < 4; i++)
  380. {
  381. if (sio_buf[i] != header[i])
  382. {
  383. return 0;
  384. }
  385. };
  386. dbgmessage(sio_buf);
  387. char* cmpbuf = "+IPD";
  388. char* strbufsize[16];
  389. int cmpPoint = 0;
  390. int strbufsizePoint = 0;
  391. //sscanf((char*) sio_buf, "+IPD%d:", &packSize);
  392. headerSize = 0;
  393. while (sio_buf[headerSize] != ':')
  394. {
  395. if(cmpPoint<4)
  396. {
  397. if(cmpbuf[cmpPoint] == sio_buf[headerSize])
  398. {
  399. cmpPoint++;
  400. }
  401. }else
  402. {
  403. strbufsize[strbufsizePoint++] = sio_buf[headerSize];
  404. }
  405. headerSize++;
  406. }
  407. strbufsize[strbufsizePoint]=0;
  408. //packSize = atoi(strbufsize);
  409. //char* c = &strbufsize[0];
  410. int it = 0;
  411. int res = 0;
  412. while (strbufsize[it] >= '0' && strbufsize[it] <= '9')
  413. {
  414. res = res * 10 + strbufsize[it] - '0';
  415. it++;
  416. }
  417. packSize = res;
  418. headerSize++;
  419. while (bufsize < (packSize + headerSize))
  420. {
  421. int tmpsize;
  422. /*tmpsize = AT91F_USART_RECEIVE(MODEM_PORT, (uint8*) (&sio_buf[bufsize]),
  423. SIOFIFOSIZE - bufsize, 5000);*/
  424. //********************************************************
  425. /*
  426. uint16_t time = 5000;
  427. uint16_t counter = 0;
  428. do
  429. {
  430. counter++;
  431. vTaskDelay(1);
  432. }while(ReceivedMsg.flag == false && counter < time);
  433. if(ReceivedMsg.flag == true)
  434. {
  435. for(int i=0;i<ReceivedMsg.size;i++)
  436. {
  437. sio_buf[i] = ReceivedMsg.buffer[i];
  438. }
  439. tmpsize =ReceivedMsg.size;
  440. }
  441. */
  442. FillBufEx((uint8*) (&sio_buf[bufsize]),tmpsize);
  443. //********************************************************
  444. if (tmpsize == 0)
  445. {
  446. //sprintf(debugbuf,"tmpsize:%i",tmpsize);
  447. //dbgmessage(debugbuf);
  448. break;
  449. }
  450. bufsize += tmpsize;
  451. }
  452. i = 0;
  453. bufsize-=headerSize;
  454. //LED_MODE_GREEN(0);//led off
  455. //sprintf(debugbuf,"bufsize:%i",bufsize);
  456. //dbgmessage(debugbuf);
  457. while (bufsize)
  458. {
  459. if (i >= maxsize)
  460. {
  461. return 0;
  462. }
  463. *buf = sio_buf[i + headerSize];
  464. //sprintf(debugbuf,"msg[%i]:%i|%c",i,sio_buf[i + headerSize],(char)(sio_buf[i + headerSize]));
  465. //dbgmessage(debugbuf);
  466. buf++;
  467. i++;
  468. bufsize--;
  469. }
  470. return packSize;
  471. }
  472. void ModemSendData(uint8 *buf, uint8 size)
  473. {
  474. //dbgmessage("modem send data:");
  475. char* tempbuf[6];
  476. //LED_MODE_GREEN(1);
  477. //LED_MODE_RED(1);
  478. //dbgmessage(buf);
  479. char strCipsend[20];
  480. strcpy(strCipsend,"AT+CIPSEND=");
  481. itoa(size,tempbuf,10);
  482. strcat(strCipsend,tempbuf);
  483. strcat(strCipsend,"\r");
  484. //sprintf(strCipsend, "AT+CIPSEND=%d\r", size);
  485. ModemWrite(strCipsend);
  486. //vTaskDelay(10);
  487. //AT91F_USART_SEND(MODEM_PORT, buf, size);
  488. uart2Write( buf, size);
  489. // WaitAnsver(MA_UNKNOWN); // listen here send ok or error ... no matter//
  490. //LED_MODE_GREEN(0);
  491. //LED_MODE_RED(0);
  492. }