MainTask.c 9.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413
  1. /********************************************************************************
  2. * File Name: MainTask.c
  3. * Function Describe:The main task for the system
  4. * Relate Module:
  5. * Explain: Hardware version is HS121
  6. * Writer: ShiLiangWen
  7. * Date: 2015.7.8
  8. *******************************************************************************/
  9. #define THIS_FILE_ID 7
  10. //---------------------------------------------------------------------------------
  11. #include "includes.h"
  12. //OS ID
  13. OS_TID idMainTask=0;
  14. U64 stkMainTask[MAIN_TASK_STK_SIZE];
  15. //=====================================
  16. unsigned char g_ucUart1Activated;
  17. //-----
  18. #ifdef USE_RUNNING_MAKE
  19. void RunningMake(unsigned short FileID,unsigned long line)
  20. {
  21. g_usFileID=FileID;
  22. g_ulFileLine=line;
  23. }
  24. #endif
  25. unsigned short g_usFileID=0;
  26. unsigned long g_ulFileLine=0;
  27. unsigned char g_ucSystemReset=0;
  28. /*******************************************************************
  29. *GetParaFromStr
  30. *从Str中找到Para=后面至';'或非字符的字串并放入Value
  31. 返回Value的长度
  32. 举例:Str="GT+SMP=IP=192.168.1.1;Port=12345"
  33. 如果Para="Port" 则Value将被赋值为"12345",并返回5
  34. 如果Para="IP" 则Value将被赋值为"192.168.1.1",并返回11
  35. 要求Para长度不大于20字节 ,Value长度不大于40字节
  36. ********************************************************************/
  37. int GetParaFromStr(char *Str,char *Para,char *Value)
  38. {
  39. int ValueLen=0,ParaLen=0;
  40. char ParaTemp[22];
  41. char *p;
  42. char d;
  43. int i=0;
  44. if(0==*Str || 0==*Para)return 0;
  45. while(0!=(d=*Para) && ParaLen<20)
  46. {
  47. ParaTemp[i++]=d;
  48. if(d=='=' || d==';')return 0;
  49. Para++;
  50. ParaLen++;
  51. }
  52. ParaTemp[ParaLen++]='=';
  53. ParaTemp[ParaLen]=0;
  54. p=strstr(Str,ParaTemp);
  55. p+=ParaLen;
  56. //--
  57. while(*p>0x20 && ';'!=*p && ValueLen<40)
  58. {
  59. *Value=*p;
  60. p++;
  61. Value++;
  62. ValueLen++;
  63. }
  64. *Value=0;
  65. return ValueLen;
  66. }
  67. /***********************************************
  68. 强制复位
  69. ************************************************/
  70. void SystemReset(void)
  71. {
  72. g_ucSystemReset=1;
  73. SlwTrace(DEBUG,"Reboot now!\r\n");
  74. while(1);
  75. }
  76. unsigned char AscToHex(unsigned char aHex)
  77. {
  78. if((aHex>=0)&&(aHex<=9))
  79. aHex += 0x30;
  80. else if((aHex>=10)&&(aHex<=15))//A-F
  81. //aHex += 0x37;
  82. aHex += 0x57;
  83. else aHex = 0xff;
  84. return aHex;
  85. }
  86. void AscStrToHexStr(char *AscStr, char *HexStr)
  87. {
  88. char *pAscStr=AscStr;
  89. unsigned char d,h,l;
  90. while(0!=(d=(unsigned char)*pAscStr++)){
  91. l=d&0x0f;
  92. h=d>>4;
  93. *HexStr++=AscToHex(h);
  94. *HexStr++=AscToHex(l);
  95. }
  96. *HexStr=0;
  97. }
  98. void PcMsgHandle(char *msg)
  99. {
  100. const char *CmdList[]={
  101. "TM", //调试Modem
  102. "SWFI", //set wifiID and wifiPwd
  103. "RWFI",
  104. "SMP", //set IP and PSN
  105. "RMP",
  106. "XH", //set info
  107. "DEBUG",
  108. "NODEBUG",
  109. ""//必须以空字串为结束
  110. };
  111. unsigned short Port;
  112. unsigned long PSN,AKEY;
  113. char buf[100];
  114. char strIP[40];
  115. int i,j,temp,len;
  116. char flag;
  117. const char *pCmd;
  118. char *pMsg;
  119. int CmdListNum=0;
  120. RunMake(THIS_FILE_ID);
  121. pMsg = msg;
  122. while(*CmdList[CmdListNum++]);//计算命令列表个数
  123. CmdListNum--;
  124. RunMake(THIS_FILE_ID);
  125. //查找与命令列表相同的命令位置
  126. for(i=0;i<CmdListNum;i++){
  127. pCmd=CmdList[i];
  128. pMsg=&msg[3];
  129. flag=0;
  130. j=0;
  131. while(*pCmd){
  132. if(*pCmd!=*pMsg){
  133. flag=1;
  134. break;
  135. }
  136. pCmd++;
  137. pMsg++;
  138. j++;
  139. }
  140. if(!flag){
  141. break;
  142. }
  143. }
  144. RunMake(THIS_FILE_ID);
  145. if(i==CmdListNum)return;
  146. //处理命令
  147. switch(i)
  148. {
  149. case 0://"RT+TM"
  150. SlwTrace(INF,"RT+TM:OK\r\n");
  151. ComSelect(COM_SEL_MODEM);
  152. break;
  153. case 1://"SWFI",
  154. len=GetParaFromStr(msg,"ID",buf);
  155. if(len<1 || len>=40){
  156. break;
  157. }
  158. strcpy(sutProductPara.Wifi_ID,buf);
  159. len=GetParaFromStr(msg,"PWD",buf);
  160. if(len==0){
  161. SlwTrace(INF,"PWD is null");
  162. break;
  163. }
  164. strcpy(sutProductPara.Wifi_Pwd,buf);
  165. SaveProductParaToFlash();
  166. break;
  167. case 2: //"RWFI"
  168. snprintf(buf, sizeof(buf),"RT+RWFI:ID=%s;PWD=%s",sutProductPara.Wifi_ID,sutProductPara.Wifi_Pwd);
  169. SlwTrace(INF,buf);
  170. break;
  171. case 3://"SMP" GT+SMP=IP=地址或域名;Port=端口号;PSN=终端序列号
  172. len=GetParaFromStr(msg,"IP",buf);
  173. if(len<1 || len>=40){
  174. //SlwTrace(INF,"GT+SMP:FAIL[IP Invalid]",1);
  175. break;
  176. }
  177. strcpy(strIP,buf);
  178. len=GetParaFromStr(msg,"Port",buf);
  179. if(len==0)Port=0;
  180. else if(len>5){
  181. //SlwTrace(INF,"GT+SMP:FAIL[Port Invalid]",1);
  182. break;
  183. }else{
  184. Port=atoi(buf);
  185. }
  186. len=GetParaFromStr(msg,"PSN",buf);
  187. if(len<1 || len>10){
  188. //SlwTrace(INF,"GT+SMP:FAIL[PSN Invalid]",1);
  189. break;
  190. }else{
  191. PSN=atol(buf);
  192. }
  193. //PSN
  194. sutProductPara.PSN=PSN;
  195. strcpy(sutProductPara.SIP,strIP);
  196. sutProductPara.Port=Port;
  197. SaveProductParaToFlash();
  198. break;
  199. case 4://RMP
  200. snprintf(buf, sizeof(buf),"RT+RMP:PSN=%lu;Port=%d,IP=%s",sutProductPara.PSN,sutProductPara.Port,sutProductPara.SIP);
  201. SlwTrace(INF,buf);
  202. break;
  203. // case 5://SADDR
  204. // len=GetParaFromStr(msg,"ADDR",buf);
  205. // sutProductPara.addr=atoi(buf);
  206. // SaveProductParaToFlash();
  207. // break;
  208. // case 6://RADDR
  209. // snprintf(buf, sizeof(buf),"RT+RADDR:ADDR=%d",sutProductPara.addr);
  210. // SlwTrace(INF,buf);
  211. // break;
  212. case 5:
  213. snprintf(buf, sizeof(buf),"RT+XH\r\n");
  214. SlwTrace(INF,buf);
  215. g_ucModemTaskEn=1;//进入写号模式
  216. break;
  217. case 6 :
  218. snprintf(buf, sizeof(buf),"RT+DEBUG\r\n");
  219. SlwTrace(INF,buf);
  220. sutProductPara.Debug=1;
  221. SaveProductParaToFlash();
  222. break;
  223. case 7 :
  224. snprintf(buf, sizeof(buf),"RT+NODEBUG\r\n");
  225. SlwTrace(INF,buf);
  226. sutProductPara.Debug=0;
  227. SaveProductParaToFlash();
  228. break;
  229. default:
  230. break;
  231. }
  232. RunMake(THIS_FILE_ID);
  233. // //AB CD E5 02 54 4D 32 5C
  234. // if(msg[0]=='T' && msg[1]=='M'){//0x544D
  235. // printf("----TM----\r\n");
  236. //
  237. // ComSelect(COM_SEL_MODEM);
  238. // }
  239. }
  240. void ShowHex(unsigned char *pData,unsigned char len)
  241. {
  242. char temp[5];
  243. char buf[100];
  244. int i;
  245. if(len>(sizeof(buf)-3))len=(sizeof(buf)-3);
  246. buf[0]=0;
  247. for(i=0;i<len;i++){
  248. sprintf(temp,"%02X",(int)pData[i]);
  249. strcat(buf,temp);
  250. }
  251. strcat(buf,"\r\n");
  252. SlwTrace(DEBUG,buf);
  253. }
  254. /*******************************************************************
  255. *MainTask
  256. *主任务
  257. ********************************************************************/
  258. __task void MainTask(void)
  259. {
  260. static unsigned int sucCt=0;
  261. static char flag=0;
  262. char tracebuf[20];
  263. //Obtain own system task identification number. */
  264. AuthIng=0;
  265. Uart1Init();
  266. authLink();
  267. AuthIng=1;
  268. idMainTask = os_tsk_self();
  269. LedInit();
  270. LedProcess(1);
  271. ReadProductParaFromFlash();//读取产品参数
  272. //Uart1Init();
  273. SlwTrace(DEBUG,"UART init OK\r\n");
  274. SlwTrace(DEBUG,sutProductPara.ProductName);
  275. sprintf(tracebuf,"_V%d\r\n",sutProductPara.ProductVersion);
  276. SlwTrace(DEBUG,tracebuf);
  277. sprintf(tracebuf,"PSN=%lu\r\n",sutProductPara.PSN);
  278. SlwTrace(DEBUG,tracebuf);
  279. Reg_Init();
  280. sprintf(tracebuf,"NetMode=%d\r\n",sutDeviceConfig.NetMode);
  281. SlwTrace(DEBUG,tracebuf);
  282. // sprintf(tracebuf,"NetMode=%d\r\n",sutDeviceConfig.NetMode);
  283. // SlwTrace(DEBUG,tracebuf);
  284. FEED_EXTWATCHDOG();
  285. idModemUartTask=os_tsk_create_user(ModemUartTask,3,&stkModemUartTask,sizeof(stkModemUartTask));
  286. FEED_EXTWATCHDOG();
  287. idModemTask=os_tsk_create_user(ModemTask,3,&stkModemTask,sizeof(stkModemTask));
  288. FEED_EXTWATCHDOG();
  289. idWLanTask=os_tsk_create_user(WiredLanTask,5,&stkWLANTask,sizeof(stkWLANTask));
  290. FEED_EXTWATCHDOG();
  291. RunMake(THIS_FILE_ID);
  292. while(1){
  293. LedProcess(0);
  294. os_dly_wait(1);
  295. if(g_ucUARTSel==COM_SEL_MODEM && g_ucModemTaskEn==0){
  296. //RT+TM透传模式
  297. if(g_ucUARTSel==COM_SEL_MODEM && g_usUart1RecvLen>0){
  298. //printf("rxbuffer1===%s,len==%d\r\n",RxBuffer1,g_usUart1RecvLen);
  299. Uart2Send((char *)RxBuffer1,g_usUart1RecvLen);
  300. g_usUart1RecvLen=0;
  301. }
  302. }else if(g_usUart1RecvLen){
  303. //正常模式下,处理UART1发过来的命令
  304. g_ucUart1Activated=1; //串口一有数据过来
  305. if(RxBuffer1[0]==0xAA && RxBuffer1[1]==0xBB&& g_ucModemTaskEn==0){//处理485 从机过来的数据
  306. ModbusRecvProcess(RxBuffer1);
  307. }else if(RxBuffer1[0]=='R' && RxBuffer1[1]=='T' && RxBuffer1[2]=='+'){//处理电脑发过来的RT指令数据包
  308. PcMsgHandle((char *)RxBuffer1);
  309. }
  310. memset(RxBuffer1,0,sizeof(RxBuffer1));
  311. g_usUart1RecvLen=0;
  312. }
  313. /********************是否扫描3次以保证确定从机个数,从而减少扫描所用时长*******************************/
  314. //第一次扫描在线从机个数,及地址存储。 (还是说每次隔一段时间扫描个数)
  315. //已经登录且不处于发送状态时候查询。
  316. if(sut_sys_status.Logined==1&&sut_sys_status.OnceFlag==0 &&sut_sys_status.SetSlaveing==0&& sut_sys_status.Resend==0) ModbusRefreshValue();
  317. /*****************一秒一次*******************/
  318. //ModbusCmdReadOneValue(0x0C); // 测试485查询
  319. // if(os_time_get() < sucCt) continue;
  320. // sucCt = os_time_get()+100;
  321. // if(flag){
  322. // Device_Down.sut_device_write[12].Addr=12;
  323. // Device_Down.sut_device_write[12].STU_RGB[6].R=1;
  324. // Device_Down.sut_device_write[12].STU_RGB[6].G=0;
  325. // Device_Down.sut_device_write[12].STU_RGB[6].B=0;
  326. // Device_Down.sut_device_write[12].STU_RGB[7].R=1;
  327. // Device_Down.sut_device_write[12].STU_RGB[7].G=0;
  328. // Device_Down.sut_device_write[12].STU_RGB[7].B=0;
  329. // ModbusCmdSetValue(&Device_Down.sut_device_write[12]);
  330. // flag=!flag;
  331. // }else{
  332. // Device_Down.sut_device_write[12].Addr=12;
  333. // Device_Down.sut_device_write[12].STU_RGB[6].R=0;
  334. // Device_Down.sut_device_write[12].STU_RGB[6].G=1;
  335. // Device_Down.sut_device_write[12].STU_RGB[6].B=0;
  336. // Device_Down.sut_device_write[12].STU_RGB[7].R=0;
  337. // Device_Down.sut_device_write[12].STU_RGB[7].G=1;
  338. // Device_Down.sut_device_write[12].STU_RGB[7].B=0;
  339. // ModbusCmdSetValue(&Device_Down.sut_device_write[12]);
  340. // flag=!flag;
  341. // }
  342. if(os_time_get() < sucCt) continue;
  343. sucCt = os_time_get()+100;
  344. FEED_EXTWATCHDOG();
  345. IWDG_ReloadCounter();
  346. //ModbusCmdReadOneValue(0xff);
  347. //SlwTrace(DEBUG,"main while \r\n");
  348. }
  349. }