gprs.c
上传用户:sdaoma
上传日期:2013-08-07
资源大小:3838k
文件大小:21k
源码类别:

GPS编程

开发平台:

C/C++

  1. /****************************************Copyright (c)**************************************************
  2. **                               广州周立功单片机发展有限公司
  3. **                                     研    究    所
  4. **                                        产品一部 
  5. **
  6. **                                 http://www.zlgmcu.com
  7. **
  8. **--------------文件信息--------------------------------------------------------------------------------
  9. **文   件   名: uart0.c
  10. **创   建   人: 陈明计
  11. **最后修改日期: 2003年7月4日
  12. **描        述: μCOS-II下LPC2000的Modem底层驱动 
  13. **              
  14. **--------------历史版本信息----------------------------------------------------------------------------
  15. ** 创建人: 陈明计
  16. ** 版  本: v1.0
  17. ** 日 期: 2004年2月25日
  18. ** 描 述: 原始版本
  19. **
  20. **------------------------------------------------------------------------------------------------------
  21. ** 修改人:
  22. ** 版  本:
  23. ** 日 期:
  24. ** 描 述:
  25. **
  26. **--------------当前版本修订------------------------------------------------------------------------------
  27. ** 修改人: 
  28. ** 日 期: 
  29. ** 描 述: 
  30. **
  31. **------------------------------------------------------------------------------------------------------
  32. ********************************************************************************************************/
  33. #define IN_MODEM
  34. #include "config.h"
  35. #define  GPRS_TASK_STK_SIZE                  128
  36. OS_STK        GPRSTaskStartStk[GPRS_TASK_STK_SIZE];
  37. static OS_EVENT *ModemSem, *Uart1Send, *Uart1Get,*HaveCall;
  38. static uint8 ModemState;
  39. /*********************************************************************************************************
  40. ** 函数名称: UART1Init
  41. ** 功能描述: 初始化UART0 
  42. ** 输 入: bps:波特率
  43. **
  44. ** 输 出:TRUE  :成功
  45. **        FALSE:失败
  46. ** 全局变量: Uart0Sem
  47. ** 调用模块: OSSemCreate
  48. **
  49. ** 作 者: 陈明计
  50. ** 日 期: 2004年2月25日
  51. **-------------------------------------------------------------------------------------------------------
  52. ** 修改人: 
  53. ** 日 期: 
  54. **-------------------------------------------------------------------------------------------------------
  55. ** 修改人: 陈明计
  56. ** 日 期: 
  57. **------------------------------------------------------------------------------------------------------
  58. ********************************************************************************************************/
  59.         void UART1Init(uint32 bps)
  60. {
  61.     uint16 Fdiv;
  62.     
  63.     PINSEL0 = (PINSEL0 & 0x0000ffff) | 0x55550000;  /* 选择管脚为UART0 */
  64.     U1LCR = 0x80;                                   /* 允许访问分频因子寄存器 */
  65.     Fdiv = (Fpclk / 16) / bps;                      /* 设置波特率 */
  66.     U1DLM = Fdiv / 256;
  67. U1DLL = Fdiv % 256;
  68.     U1LCR = 0x03;                                   /* 禁止访问分频因子寄存器 */
  69.                                                     /* 且设置为8,1,n */
  70. U1IER = 0x0f;                                   /* 允许接收和发送中断 */
  71.     U1FCR = 0x87;                                   /* 初始化FIFO */
  72.     U1MCR = 0x03;
  73.     Uart1Send = OSSemCreate(1);
  74.     Uart1Get = OSSemCreate(0);
  75. }
  76. /*********************************************************************************************************
  77. ** 函数名称: GetModemState
  78. ** 功能描述: 获取MODEM状态
  79. ** 输 入: 无
  80. **        
  81. ** 输 出: MODEM状态
  82. ** 全局变量: 无
  83. ** 调用模块: 无
  84. **
  85. ** 作 者: 陈明计
  86. ** 日 期: 2004年2月25日
  87. **-------------------------------------------------------------------------------------------------------
  88. ** 修改人:
  89. ** 日 期:
  90. **------------------------------------------------------------------------------------------------------
  91. ********************************************************************************************************/
  92.         uint8 GetModemState(void)
  93. {
  94.     return ModemState;
  95. /*********************************************************************************************************
  96. ** 函数名称: ModemWrite
  97. ** 功能描述: 发送多个字节数据
  98. ** 输 入: Data:发送数据存储位置
  99. **        NByte:发送数据个数
  100. ** 输 出:无
  101. ** 全局变量: 无
  102. ** 调用模块: UART0Putch
  103. **
  104. ** 作 者: 陈明计
  105. ** 日 期: 2004年2月25日
  106. **-------------------------------------------------------------------------------------------------------
  107. ** 修改人:
  108. ** 日 期:
  109. **------------------------------------------------------------------------------------------------------
  110. ********************************************************************************************************/
  111.         uint8 ModemWrite(char *Data, uint16 NByte)
  112. {
  113.     uint8 err,i;
  114.     
  115.     while (NByte > 0)
  116.     {
  117.         OSSemPend(Uart1Send, 0, &err);
  118.         for (i = 0; i < 8; i++)
  119.         {
  120.             U1THR = *Data++;
  121.             NByte--;
  122.             if (NByte == 0)
  123.             {
  124.                 break;
  125.             }
  126.         }
  127.     }
  128.     return ModemState;
  129. /*********************************************************************************************************
  130. ** 函数名称: UART0Getch
  131. ** 功能描述: 接收一个字节
  132. ** 输 入: 无
  133. ** 输 出: 接收到的数据
  134. ** 全局变量: 无
  135. ** 调用模块: 无
  136. **
  137. ** 作 者: 陈明计
  138. ** 日 期: 2004年2月25日
  139. **-------------------------------------------------------------------------------------------------------
  140. ** 修改人:
  141. ** 日 期:
  142. **------------------------------------------------------------------------------------------------------
  143. ********************************************************************************************************/
  144.         uint8 ModemGetch(void)
  145. {
  146.     uint8 rt;
  147.     OS_ENTER_CRITICAL();
  148.     while ((U1LSR & 0x00000001) == 0)
  149.     {                                           /* 没有收到数据 */
  150.         U1IER = U1IER | 0x01;                   /* 允许接收中断 */
  151.         OSSemPend(Uart1Get,OS_TICKS_PER_SEC/2, &rt);
  152.         
  153.         break;
  154.     }
  155.     if(rt == OS_TIMEOUT)
  156.      rt = 0;
  157.     else
  158.      rt = U1RBR;                                 /* 读取收到的数据 */
  159.     OS_EXIT_CRITICAL();
  160.     return rt;
  161. void GetAllChar()
  162. {
  163. uint8 i,j;
  164. OS_ENTER_CRITICAL();
  165. U1IER = U1IER | 0x01;                   /* 允许接收中断 */
  166. OS_EXIT_CRITICAL();
  167. for (i = 0; i < 120; i++)
  168.     {
  169.      j = ModemGetch();
  170.      if (j == 0)
  171.      break;
  172.         
  173.     }
  174. }
  175. /*********************************************************************************************************
  176. ** 函数名称: ModemDialUp
  177. ** 功能描述: 通过modem拨号 
  178. ** 输 入: 电话号码
  179. **
  180. ** 输 出: modem状态
  181. **
  182. ** 全局变量: ModemState
  183. ** 调用模块: ModemWrite,OSTimeDly
  184. **
  185. ** 作 者: 陈明计
  186. ** 日 期: 2004年2月25日
  187. **-------------------------------------------------------------------------------------------------------
  188. ** 修改人: 
  189. ** 日 期: 
  190. **-------------------------------------------------------------------------------------------------------
  191. ********************************************************************************************************/
  192.         uint8 ModemDialUp(char Number[])
  193. {
  194.     char *cp;
  195.     uint8 i;
  196.     uint8 err;
  197.     OSSemPend(ModemSem, 0, &err);
  198.     if (ModemState == MODEM_CLOSE)
  199.     {
  200.         while ((U1LSR & 0x00000001) != 0)
  201.         {
  202.             err = U1RBR;
  203.         }
  204.         ModemWrite("ATD", 3);
  205.         i = 0;
  206.         cp = Number;
  207.         while (*cp++ != 0)
  208.         {
  209.             i++;
  210.         }
  211.         ModemWrite(Number, i);
  212.         ModemWrite(";rn", 3);
  213.         GetAllChar();
  214.     }
  215.     OSSemPost(ModemSem);
  216.     return ModemState;
  217. }
  218. /*********************************************************************************************************
  219. ** 函数名称: ModemDialDown
  220. ** 功能描述: 挂断modem 
  221. ** 输 入: 无
  222. **
  223. ** 输 出: modem状态
  224. **
  225. ** 全局变量: ModemState
  226. ** 调用模块: OSTimeDly
  227. **
  228. ** 作 者: 陈明计
  229. ** 日 期: 2004年2月25日
  230. **-------------------------------------------------------------------------------------------------------
  231. ** 修改人: 
  232. ** 日 期: 
  233. **-------------------------------------------------------------------------------------------------------
  234. ********************************************************************************************************/
  235.         uint8 ModemDialDown(void)
  236. {
  237.     U1MCR = 0x02;
  238.     OSTimeDly(OS_TICKS_PER_SEC / 10);
  239.     U1MCR = 0x03;
  240.     OSTimeDly(OS_TICKS_PER_SEC / 10);
  241.     return ModemState;
  242. }
  243. /*********************************************************************************************************
  244. ** 函数名称: ModemCommand
  245. ** 功能描述: 向modem发送命令 
  246. ** 输 入: 命令字符串
  247. **
  248. ** 输 出: modem状态
  249. **
  250. ** 全局变量: ModemState
  251. ** 调用模块: ModemWrite,ModemGetch,
  252. **
  253. ** 作 者: 陈明计
  254. ** 日 期: 2004年2月25日
  255. **-------------------------------------------------------------------------------------------------------
  256. ** 修改人: 
  257. ** 日 期: 
  258. **-------------------------------------------------------------------------------------------------------
  259. ********************************************************************************************************/
  260.         uint8 ModemCommand(char *Command)
  261. {
  262.     char *cp;
  263.     uint8 i,err;
  264.     uint16 j;
  265.     OSSemPend(ModemSem, 0, &err);
  266.     GetAllChar();
  267.     if (ModemState == MODEM_CLOSE)
  268.     {
  269.         while(1)
  270.         {
  271.         while ((U1LSR & 0x00000001) != 0)
  272.         {
  273.             err = U1RBR;
  274.         }
  275.         ModemWrite("ATrn", 4);
  276.         i = ModemGetch();
  277.         j = 0;
  278.         while ( j <= 20 )
  279.         {
  280.             err = i;
  281.             i = ModemGetch();
  282.             if (err == 'O' || err == 'o')
  283.             if (i == 'K' || i == 'k')
  284.             {
  285.                 i = ModemGetch();
  286.                 i = ModemGetch();
  287.                 break;
  288.             }
  289.             if( (i == 0) && (j == 3) )
  290.             {
  291.              j=20;
  292.             }
  293.             j++;
  294.         }
  295.         if(j >=20 )
  296.          {
  297.          continue;
  298.          }
  299.          else
  300.          break;
  301.         }
  302.        
  303.         ModemWrite(Command, strlen(Command));
  304.         ModemWrite("rn", 2);
  305.         i = ModemGetch();
  306.         while (1)
  307.         {
  308.             err = i;
  309.             i = ModemGetch();
  310.             if (err == 'O' || err == 'o')
  311.             if (i == 'K' || i == 'k')
  312.             {
  313.                 i = ModemGetch();
  314.                 i = ModemGetch();
  315.                 break;
  316.             }
  317.         }
  318.         GetAllChar();
  319.         
  320.     }
  321.     OSSemPost(ModemSem);
  322.     return ModemState;
  323. }
  324. /*********************************************************************************************************
  325. ** 函数名称: GPRSCheckTask
  326. ** 功能描述: GPRS检查是否有电话来和检查是否有新的短信。
  327. ** 输 入: 无
  328. **
  329. ** 输 出: 无
  330. **
  331. ** 全局变量: ModemState
  332. ** 调用模块: UART1Init,OSTimeDly,ModemCommand,
  333. **
  334. ** 作 者: Yehaoben
  335. ** 日 期: 2005年7月2日
  336. **-------------------------------------------------------------------------------------------------------
  337. ** 修改人: 
  338. ** 日 期: 
  339. **-------------------------------------------------------------------------------------------------------
  340. ********************************************************************************************************/
  341.         void  GPRSCheckTask(void *pdata)
  342. {
  343. uint8 i,err,temp[3];
  344. while(1)
  345. {
  346. OSTimeDly(OS_TICKS_PER_SEC*2);
  347. OSSemPend(ModemSem, 0, &err);
  348. do
  349. {
  350. i = ModemGetch();
  351. if( i == 'R' )
  352. {
  353. temp[0] = ModemGetch(); 
  354. temp[1] = ModemGetch(); 
  355. temp[2] = ModemGetch(); 
  356. if( temp[0] == 'I' )
  357. if( temp[1] == 'N' )
  358. if( temp[2] == 'G' )
  359. OSSemPost(HaveCall);
  360. }
  361. }while( i != 0 );
  362. OSSemPost(ModemSem);
  363. }
  364. }
  365. /*********************************************************************************************************
  366. ** 函数名称: ModemInit
  367. ** 功能描述: 初始化Modem 
  368. ** 输 入: 波特率
  369. **
  370. ** 输 出: modem状态
  371. **
  372. ** 全局变量: ModemState
  373. ** 调用模块: UART1Init,OSTimeDly,ModemCommand,
  374. **
  375. ** 作 者: 陈明计
  376. ** 日 期: 2004年2月25日
  377. **-------------------------------------------------------------------------------------------------------
  378. ** 修改人: 
  379. ** 日 期: 
  380. **-------------------------------------------------------------------------------------------------------
  381. ********************************************************************************************************/
  382.         uint8 ModemInit(uint32 bps)
  383. {
  384.     ModemState = MODEM_CLOSE;
  385.     UART1Init(bps);
  386.     ModemSem = OSSemCreate(1);
  387.     HaveCall = OSSemCreate(0);
  388.     if (ModemSem != NULL)
  389.     {
  390.         if ((U1MSR & 0x30) != 0x30)
  391.         {
  392.             OSTimeDly(OS_TICKS_PER_SEC);
  393.             if ((U1MSR & 0x30) != 0x30)
  394.             {
  395.                 ModemState = NOT_FIND_MODEM;
  396.             }
  397.         }
  398.         if (ModemState == MODEM_CLOSE)
  399.         {
  400.             /*ModemCommand("ATE0");
  401.             ModemCommand("ATV0");
  402.             ModemCommand("AT&C1");
  403.             ModemCommand("AT&D2");
  404.             ModemCommand("AT&R0");
  405.             ModemCommand("AT&S0");
  406.             ModemCommand("ATS0=2");*/
  407.             ModemCommand("AT$NOSLEEP=1");
  408.             ModemCommand("AT+CREG=1");
  409.         }
  410.        // OSTaskCreate(GPRSCheckTask, (void *)0, &GPRSTaskStartStk[GPRS_TASK_STK_SIZE - 1], 7);
  411.     }
  412.     else
  413.     {
  414.         ModemState = NOT_INIT_MODEM;
  415.     }
  416.     return ModemState;
  417. }
  418. /*********************************************************************************************************
  419. ** 函数名称: GPRSSendMSG
  420. ** 功能描述: 发短信
  421. ** 输 入: 短信地址,短信信息
  422. **
  423. ** 输 出: 成功 0 失败1
  424. **
  425. ** 全局变量: 
  426. ** 调用模块: 
  427. **
  428. ** 作 者: Yehaoben
  429. ** 日 期: 2005年7月1日
  430. **-------------------------------------------------------------------------------------------------------
  431. ** 修改人: 
  432. ** 日 期: 
  433. **-------------------------------------------------------------------------------------------------------
  434. ********************************************************************************************************/
  435. const char GPRS_MSG_STR[]={"AT+CMGS="%s"rn"};
  436. uint8 GPRSSendMSG(char * num, char * MSG)
  437. {
  438. uint8 i,j,err;
  439. char sendchar[30];
  440. char temp[2];
  441. ModemCommand("AT+CMGF=1");
  442. OSSemPend(ModemSem, 0, &err);
  443. GetAllChar();
  444. _sprintf(sendchar,GPRS_MSG_STR,num);
  445. ModemWrite(sendchar,strlen(sendchar));
  446. i = ModemGetch();
  447.     j = 0;
  448.     while ( j <= 30 )
  449.     {
  450.         if (i == '>')
  451.         {
  452.             break;
  453.         }
  454.         i = ModemGetch();
  455.         j++;
  456.     }
  457. if(j >=30 )
  458. {
  459. OSSemPost(ModemSem);
  460. return 1;
  461. }
  462. ModemWrite(MSG,strlen(MSG));
  463. temp[1]=0;
  464. temp[0]=0x1a;
  465. ModemWrite(temp,1);
  466. i = ModemGetch();
  467.     j = 0;
  468.     OSTimeDly(OS_TICKS_PER_SEC*3);
  469.     GetAllChar();
  470. GetAllChar();
  471. OSSemPost(ModemSem);
  472. return 0;
  473. }
  474. /*********************************************************************************************************
  475. ** 函数名称: GPRSAutoTakeTheCall
  476. ** 功能描述: 接电话
  477. ** 输 入: 无
  478. **
  479. ** 输 出: 成功 0 失败1
  480. **
  481. ** 全局变量: 
  482. ** 调用模块: 
  483. **
  484. ** 作 者: Yehaoben
  485. ** 日 期: 2005年7月1日
  486. **-------------------------------------------------------------------------------------------------------
  487. ** 修改人: 
  488. ** 日 期: 
  489. **-------------------------------------------------------------------------------------------------------
  490. ********************************************************************************************************/
  491. uint8 GPRSAutoTakeTheCall()
  492. {
  493. uint8 err;
  494. OSSemPend(HaveCall, OS_TICKS_PER_SEC*2, &err);
  495. if(err == OS_NO_ERR)
  496. {
  497. ModemCommand("ATA");
  498. return 0;
  499. }
  500. else
  501. return 1;
  502. }
  503. uint8 GPRSTakeTheCall()
  504. {
  505. ModemCommand("ATA");
  506. return 0;
  507. }
  508. uint8 GPRSHangUpTheCall()
  509. {
  510. ModemCommand("AT+CHUP");
  511. return 0;
  512. }
  513. const char GPRS_DELMSG_STR[]={"AT+CMGD=%drn"};
  514. uint8 GPRSDelMSG(uint8 num)
  515. {
  516. char sendchar[15];
  517. GetAllChar();
  518. _sprintf(sendchar,GPRS_DELMSG_STR,num);
  519. ModemCommand(sendchar);
  520. return 0;
  521. }
  522. /*********************************************************************************************************
  523. ** 函数名称: GPRSReadMSG
  524. ** 功能描述: 读短信
  525. ** 输 入: 短信号码,对发号码,短信内容
  526. **
  527. ** 输 出: 成功 0 失败1
  528. **
  529. ** 全局变量: 
  530. ** 调用模块: 
  531. **
  532. ** 作 者: Yehaoben
  533. ** 日 期: 2005年7月1日
  534. **-------------------------------------------------------------------------------------------------------
  535. ** 修改人: 
  536. ** 日 期: 
  537. **-------------------------------------------------------------------------------------------------------
  538. ********************************************************************************************************/
  539. const char GPRS_RCVMSG_STR[]={"AT+CMGR=%drn"};
  540. uint8 GPRSReadMSG(uint8 num,char * number,char * MSG )
  541. {
  542. char sendchar[15];
  543. char i,j;
  544. uint8 err;
  545. GetAllChar();
  546. ModemCommand("AT+CMGF=1");
  547. OSSemPend(ModemSem, 0, &err);
  548. _sprintf(sendchar,GPRS_RCVMSG_STR,num);
  549. ModemWrite(sendchar,strlen(sendchar));
  550. i = ModemGetch();
  551. j = 0;
  552.     while ( j <= 5  )
  553.     {
  554.         if (i == 0x2c)
  555.         {
  556.             break;
  557.         }
  558.         i = ModemGetch();
  559.         if(i == 0)
  560.          j++;
  561.     }
  562.     if( j >=5 )
  563.     {
  564.      OSSemPost(ModemSem);
  565.      return 1;
  566.     }
  567. i = ModemGetch();//for "
  568. i=0;
  569. do//save number
  570. {
  571. number[i] = ModemGetch();
  572. i++;
  573. }while(number[i-1] != 0x22);
  574. number[i-1] = 0;
  575. err = 0;
  576. i = ModemGetch();
  577. while ( err <= 5 )//find the MSG
  578.     {
  579.      j = i;
  580.         i = ModemGetch();
  581.         if (j == 0x0d)
  582.         if (i == 0x0a)
  583.         {
  584.             break;
  585.         }
  586.         if(i ==  0)
  587.          err++;
  588.     }
  589.     
  590.     j = 0;
  591.     err = 0;
  592.     MSG[0] = ModemGetch();
  593.     MSG[0] = ModemGetch();
  594.     while ( err <= 5 )//Save the MSG
  595.     {
  596.         MSG[j+1] = ModemGetch();
  597.         //if ( (i == 'O') || (i == 'o') )
  598.         //if ( (MSG[j] == 'K') || (MSG[j] == 'k') )
  599. if ( (MSG[j] == 0x4f) || (MSG[j] == 0x6f) )
  600.         if ( (MSG[j+1] == 0x4b) || (MSG[j+1] == 0x6b) )
  601.         {
  602.             i = ModemGetch();
  603.             i = ModemGetch();
  604.             break;
  605.         }
  606.         if(MSG[j+1] ==  0)
  607.          err++;
  608.         else
  609.          j++;
  610.     }
  611.     if( j > 0 )
  612.     {
  613.      for(i = 0; i < j ; i++ )
  614.      {
  615.      if(MSG[i] == 0x0d )
  616.      if(MSG[i+1] == 0x0a )
  617.      if((MSG[i+2] == 0x4f) || (MSG[i+2] == 0x6f) )
  618.          if((MSG[i+3] == 0x4b) || (MSG[i+3] == 0x6b) )
  619.          {
  620.          MSG[i] = 0;
  621.          break;
  622.          }
  623.      }
  624.      OSSemPost(ModemSem);
  625.      return 0;
  626.     }
  627.     OSSemPost(ModemSem);
  628. return 1;
  629. }
  630. /*********************************************************************************************************
  631. ** 函数名称: UART1_Exception
  632. ** 功能描述: UART1中断服务程序
  633. ** 输 入: 无
  634. **
  635. ** 输 出: 无
  636. **         
  637. ** 全局变量: ModemState
  638. ** 调用模块: OSSemPost
  639. **
  640. ** 作 者: 陈明计
  641. ** 日 期: 2004年2月25日
  642. **-------------------------------------------------------------------------------------------------------
  643. ** 修改人:
  644. ** 日 期:
  645. **------------------------------------------------------------------------------------------------------
  646. ********************************************************************************************************/
  647.         void UART1_Exception(void)
  648. {
  649.     uint8 IIR, temp;
  650.     
  651.     OS_ENTER_CRITICAL();
  652.     while(((IIR = U1IIR) & 0x01) == 0)
  653.     {                                                   /* 有中断未处理完 */
  654.         switch (IIR & 0x0e)
  655.         {
  656.             case 0x00:                                  /* Modem状态变化 中断    */
  657.                 if ((U1MSR & 0x80) != 0)
  658.                 {
  659.                     ModemState = MODEM_CONNECT;
  660.                 }
  661.                 else
  662.                 {
  663.                     ModemState = MODEM_CLOSE;
  664.                 }
  665.                 if ((U1MSR & 0x40) != 0)
  666.                 {
  667.                     ModemState = MODEM_RING;
  668.                 }
  669.                 if ((U1MSR & 0x30) != 0x30)
  670.                 {
  671.                     ModemState = NOT_FIND_MODEM;
  672.                 }
  673.                 break;
  674.             case 0x02:                                  /* THRE中断    */
  675.                 OSSemPost(Uart1Send);
  676.                 break;
  677.             case 0x04:                                  /* 接收数据可用 */
  678.                 OSSemPost(Uart1Get);
  679.                 U1IER &= (~0x01);                       /* 禁止接收及字符超时中断 */
  680.                 break;
  681.             case 0x06:                                  /* 接收线状态   */
  682.                 temp = U1LSR;
  683.                 break;
  684.             case 0x0c:                                  /* 字符超时指示 */
  685.                 OSSemPost(Uart1Get);
  686.                 U1IER &= (~0x01);                       /* 禁止接收及字符超时中断 */
  687.                 break;
  688.             default :
  689.                 break;
  690.         }
  691.     } 
  692.     VICVectAddr = 0;            // 通知中断控制器中断结束
  693.     OS_EXIT_CRITICAL();
  694. }
  695. /*********************************************************************************************************
  696. **                            End Of File
  697. ********************************************************************************************************/