main.c 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <unistd.h>
  5. #include <stdarg.h>
  6. #include <signal.h>
  7. #include <pthread.h>
  8. #include <dirent.h>
  9. #include "pxTools.h"
  10. #include "pxEpoll.h"
  11. #include "JMcan.h"
  12. #include "JMremote.h"
  13. #include "JMPlc.h"
  14. #include "JMros.h"
  15. #include "JMmqtt.h"
  16. #include "JMrtk.h"
  17. #include "canTransmit.h"
  18. extern POSTDATABUF_S postData;
  19. int epollfd=0;
  20. CONFIG_S config={
  21. .logLevel=3,
  22. .MqttBrockerAddress="127.0.0.1",
  23. .MqttBrockerPort=1883,
  24. .MqttClientID="x",
  25. .MqttUserName="",
  26. .MqttPassWord="",
  27. .MqttReconnectTime=60,
  28. .canName="",
  29. .PlcIP=NULL,
  30. .LeftLeg=408,
  31. .RightLeg=410,
  32. };
  33. void readConfig(char *path)
  34. {
  35. cJSON* confJson=pxReadJsonFile_malloc(path);
  36. if(confJson==NULL)
  37. {
  38. pxLog(NONE,"read config error:\"%s\"",path);
  39. exit(-1);
  40. }
  41. pxJsonIntcpy(confJson,"logLevel", &config.logLevel);
  42. pxJsonStrdup(confJson,"MqttBrockerAddress", &config.MqttBrockerAddress);
  43. pxJsonIntcpy(confJson,"MqttBrockerPort", &config.MqttBrockerPort);
  44. pxJsonStrdup(confJson,"MqttClientID", &config.MqttClientID);
  45. pxJsonStrdup(confJson,"MqttUserName", &config.MqttUserName);
  46. pxJsonStrdup(confJson,"MqttPassWord", &config.MqttPassWord);
  47. pxJsonIntcpy(confJson,"MqttReconnectTime", &config.MqttReconnectTime);
  48. pxJsonStrdup(confJson,"RemoteControlTopic", &config.RemoteControlTopic);
  49. pxJsonStrdup(confJson,"AutoControlTopic", &config.AutoControlTopic);
  50. pxJsonStrdup(confJson,"ManualControlTopic", &config.ManualControlTopic);
  51. pxJsonStrdup(confJson,"canName", &config.canName);
  52. pxJsonStrdup(confJson,"PlcIP", &config.PlcIP);
  53. pxJsonIntcpy(confJson,"LeftLeg", &config.LeftLeg);
  54. pxJsonIntcpy(confJson,"RightLeg", &config.RightLeg);
  55. cJSON_Delete(confJson);
  56. pxLog(NONE,"use config[\n\
  57. logLevel:%d,\n\
  58. MqttBrockerAddress:%s\n\
  59. MqttBrockerPort:%d\n\
  60. MqttClientID:%s\n\
  61. MqttUserName:%s\n\
  62. MqttPassWord:%s\n\
  63. MqttReconnectTime:%d\n\
  64. RemoteControlTopic:%s\n\
  65. AutoControlTopic:%s\n\
  66. ManualControlTopic:%s\n\
  67. canName:%s\n\
  68. PlcIP:%s\n\
  69. LeftLeg:%d\n\
  70. RightLeg:%d\n\
  71. ]\n",
  72. config.logLevel,
  73. config.MqttBrockerAddress,
  74. config.MqttBrockerPort,
  75. config.MqttClientID,
  76. config.MqttUserName,
  77. config.MqttPassWord,
  78. config.MqttReconnectTime,
  79. config.RemoteControlTopic,
  80. config.AutoControlTopic,
  81. config.ManualControlTopic,
  82. config.canName,
  83. config.PlcIP,
  84. config.LeftLeg,
  85. config.RightLeg
  86. );
  87. }
  88. char topic[100]={0};
  89. void postTimer(PXTIMER_S *timer)
  90. {
  91. char buf[2048]={0};
  92. // struct timeval tv;
  93. // gettimeofday(&tv,NULL);
  94. // uint64_t milliseconds = (uint64_t)(tv.tv_sec) * 1000 + (uint64_t)(tv.tv_usec) / 1000 ;
  95. // pxLog(EVENT,"[POST] post can data");
  96. u64 milliseconds = get_timeStamp();
  97. buf[0]=2;
  98. memcpy(buf+1,&postData,sizeof(postData));
  99. memcpy(buf+sizeof(postData)+1,&milliseconds,8);
  100. static int times=0;
  101. if(++times>=2)
  102. {
  103. times=0;
  104. if(postData.status.mqtt)
  105. {
  106. MQTT_publishBytes(topic,buf+1,sizeof(postData)+8);
  107. }
  108. }
  109. if(postData.status.system==REMOTECONTROL && postData.status.udp)
  110. {
  111. Remote_send(buf,sizeof(postData)+9);
  112. }
  113. }
  114. void rotateLog(PXTIMER_S *timer)
  115. {
  116. time_t now;
  117. struct tm *dateNow;
  118. struct dirent **name_list;
  119. pxLog(EVENT,"[LOG] rotateLog");
  120. int n = scandir(DATALOGPATH,&name_list,0,alphasort);
  121. if(n > 0)
  122. {
  123. int index=0;
  124. time(&now);
  125. dateNow = localtime(&now);
  126. while(index < n)
  127. {
  128. if(name_list[index]->d_name[0]!='.')
  129. {
  130. int year,month,day;
  131. int count=sscanf(name_list[index]->d_name,"%d-%d-%d",&year,&month,&day);
  132. if(count==3)
  133. {
  134. int dmonth=(dateNow->tm_year+1900-year)*12+dateNow->tm_mon+1-month;
  135. int dday=dmonth*30+dateNow->tm_mday-day;
  136. if(dday>60)
  137. {
  138. pxLog(EVENT,"[LOG] file %s timeout,delete",name_list[index]->d_name);
  139. char file_path[256];
  140. sprintf(file_path,DATALOGPATH"%s",name_list[index]->d_name);
  141. remove(file_path);
  142. }
  143. }
  144. }
  145. free(name_list[index++]);
  146. }
  147. free(name_list);
  148. }
  149. }
  150. void canTransmitRun()
  151. {
  152. pthread_t thread;
  153. pthread_t rtkthreadhd;
  154. epollfd=epollInit("MAIN");
  155. while (pthread_create(&thread, NULL, CAN_Run, (void*)config.canName) != 0)
  156. {
  157. pxLog(WARNING,"create CAN thread WRONG,retry");
  158. sleep(3);
  159. }
  160. while (pthread_create(&rtkthreadhd, NULL, rtkthread, NULL) != 0)
  161. {
  162. pxLog(WARNING,"create RTK thread WRONG,retry");
  163. sleep(3);
  164. }
  165. while (MQTT_connect()!=0)
  166. {
  167. pxLog(WARNING,"connect MQTT WRONG,retry");
  168. sleep(3);
  169. }
  170. ROS_listen(NULL);
  171. PLC_conn(NULL);
  172. sprintf(topic,"%s/data/canData",config.MqttClientID);
  173. timerAdd(epollfd,1,POSTTIMERINTERVAL,1,postTimer,NULL);
  174. timerAdd(epollfd,2,60*1000,1,rotateLog,NULL);
  175. timerAdd(epollfd,3,1000,1,mqttTimer,NULL);
  176. epollMain(epollfd,"MAIN");
  177. }
  178. int main(int argc, char **argv)
  179. {
  180. int opt = 0;
  181. int debugLevel=-1;
  182. char *configPath="/etc/config/cantTransmit";
  183. while ((opt = getopt(argc, argv, "c:l:h")) != -1)
  184. {
  185. switch (opt)
  186. {
  187. case 'c':
  188. configPath=optarg;
  189. break;
  190. case 'l':
  191. debugLevel=optarg[0] - 0x30;
  192. break;
  193. case 'h':
  194. printf("cantTransmit -l $loglevel -c $configPath(default /etc/config/cantTransmit)");
  195. exit(0);
  196. break;
  197. default:
  198. break;
  199. }
  200. }
  201. pxDeamonUniq(SFOTWARE_NAME);
  202. pxOpenLogFile(SFOTWARE_NAME);
  203. readConfig(configPath);
  204. if(debugLevel!=-1)
  205. pxSetLogLevel(debugLevel);
  206. else
  207. pxSetLogLevel(config.logLevel);
  208. canTransmitRun();
  209. }