app.c 54 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415
  1. /*******************************
  2. *
  3. * 骑享程序测试
  4. *
  5. * ****************************/
  6. #include "bsp.h"
  7. #include "bsp_custom.h"
  8. #include "osasys.h"
  9. #include "ostask.h"
  10. #include "queue.h"
  11. #include "ps_event_callback.h"
  12. #include "app.h"
  13. #include "cmisim.h"
  14. #include "cmimm.h"
  15. #include "cmips.h"
  16. #include "sockets.h"
  17. #include "psifevent.h"
  18. #include "ps_lib_api.h"
  19. #include "lwip/netdb.h"
  20. #include <cis_def.h>
  21. #include "debug_log.h"
  22. #include "slpman_ec616.h"
  23. #include "plat_config.h"
  24. //空间及变量定义
  25. #define PROC_MAIN_TASK_STACK_SIZE (1024)
  26. #define PROC_UART_TASK_STACK_SIZE (1024)
  27. #define PROC_CAN_TASK_STACK_SIZE (1024)
  28. #define PROC_TCP_TASK_STACK_SIZE (1024)
  29. #define APP_EVENT_QUEUE_SIZE (10)
  30. uint8_t deepslpTimerID = DEEPSLP_TIMER_ID7;
  31. uint8_t MainSlpHandler = 0xff;
  32. uint8_t UartSlpHandler = 0xfe;
  33. uint8_t CanSlpHandler = 0xfd;
  34. uint8_t TcpSlpHandler = 0xfd;
  35. #define Uart_Send_LEN (8)
  36. #define Uart_Rece_LEN (40)
  37. #define battbuffer_len (110)
  38. #define RTE_UART_RX_IO_MODE RTE_UART1_RX_IO_MODE
  39. extern ARM_DRIVER_USART Driver_USART1;
  40. static ARM_DRIVER_USART *USARTdrv = &Driver_USART1;
  41. volatile bool isRecvTimeout = false;
  42. volatile bool isRecvComplete = false;
  43. QueueHandle_t gpsMsgQueue = NULL;
  44. GPS_INFO Gps_Data;
  45. static volatile UINT32 Event;
  46. static QueueHandle_t psEventQueueHandle;
  47. static UINT8 gImsi[16] = {0};
  48. static INT32 sockfd = -1;
  49. static UINT32 gCellID = 0;
  50. int TcpconnectID = -1;
  51. volatile bool tcp_ready = false;
  52. uint8_t Batt_Cell_Num = 17;//默认数值14、17
  53. uint8_t Batt_Cell_Num_2 ;//默认数值
  54. uint8_t Batt_Temp_Num = 7;//默认数值5、7
  55. int16_t Uart_Rece_BattI=0x0000;
  56. uint8_t Can_Rece_buffer[8];
  57. volatile bool Can_Enable = false;
  58. uint16_t data_index = 0x0000;
  59. volatile bool Sleep_Flag = false;
  60. volatile bool Uart_Sleep_Flag = false;
  61. volatile bool Can_Sleep_Flag = false;
  62. volatile bool Tcp_Sleep_Flag = false;
  63. uint8_t battbuffer[battbuffer_len];//电池数据都存在此数组中————电压14,温度5
  64. /**
  65. * 存放规则如下:
  66. * 位置: 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
  67. * 数据: 年 月 日 时 分 秒 信息体标志 年 月 日 时 分 秒 网络信号 故障等级 故障代码高 故障代码低
  68. *
  69. * 17 18 19 20 21 22 23 24 25 26 27 28 29 30 30+1 .... 30+X*2 31+X*2 31+1...31+X*2+N
  70. * 电流H 电流L Link电压H Link电压L Pack电压H Pack电压L 开关状态 SOC SOH 均衡状态 单体个数X 单体v1...单体vX 温度个数N 温度1..温度N
  71. * 32+X*2+N 33+X*2+N 34+x*2+N 35 +X*2+N 36+X*2 +N 37+X*2+N
  72. * 电池状态 是否加热 最高单体H 最高单体L 最低单体H 最低单体L
  73. * */
  74. //GPS信息
  75. uint8_t gpsbuffer[30];//定位都存在此数组中
  76. /**
  77. * 存放规则如下:
  78. * 位置: 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
  79. * 数据: 年 月 日 时 分 秒 信息体标志 年 月 日 时 分 秒 定位标志 卫星数目 航向H 航向L
  80. *
  81. * 17 18 19 20 21 22 23 24 25 26 27 28
  82. * 速度H 速度L 海拔H 海拔L 纬度HH 纬度HL 纬度LH 纬度LL 经度HH 经度HL 经度LH 经度LL
  83. *
  84. * */
  85. //GPS信息
  86. //状态机定义
  87. typedef enum
  88. {
  89. PROCESS_STATE_IDLE = 0,
  90. PROCESS_STATE_WORK,
  91. PROCESS_STATE_SLEEP
  92. }process_Main;
  93. static process_Main gProcess_Main_Task = PROCESS_STATE_IDLE;
  94. #define PROC_MAIN_STATE_SWITCH(a) (gProcess_Main_Task = a)
  95. typedef enum
  96. {
  97. PROCESS_UART_STATE_IDLE = 0,
  98. PROCESS_UART_STATE_CHECK,
  99. PROCESS_UART_STATE_WORK,
  100. PROCESS_UART_STATE_SLEEP
  101. }process_Uart;
  102. static process_Uart gProcess_Uart_Task = PROCESS_UART_STATE_IDLE;
  103. #define PROC_UART_STATE_SWITCH(a) (gProcess_Uart_Task = a)
  104. typedef enum
  105. {
  106. PROCESS_CAN_STATE_IDLE = 0,
  107. PROCESS_CAN_STATE_RECV,
  108. PROCESS_CAN_STATE_SEND,
  109. PROCESS_CAN_STATE_SLEEP
  110. }process_CAN;
  111. static process_CAN gProcess_Can_Task = PROCESS_CAN_STATE_IDLE;
  112. #define PROC_CAN_STATE_SWITCH(a) (gProcess_Can_Task = a)
  113. typedef enum
  114. {
  115. PROCESS_TCP_STATE_IDLE = 0,
  116. PROCESS_TCP_STATE_LINK,
  117. PROCESS_TCP_STATE_WORK,
  118. PROCESS_TCP_STATE_SLEEP
  119. }process_TCP;
  120. static process_TCP gProcess_Tcp_Task = PROCESS_TCP_STATE_IDLE;
  121. #define PROC_TCP_STATE_SWITCH(a) (gProcess_Tcp_Task = a)
  122. //堆栈申请
  123. static StaticTask_t gProcess_Main_Task_t;
  124. static UINT8 gProcess_Main_TaskStack[PROC_UART_TASK_STACK_SIZE];
  125. static StaticTask_t gProcess_Uart_Task_t;
  126. static UINT8 gProcess_Uart_TaskStack[PROC_UART_TASK_STACK_SIZE];
  127. static StaticTask_t gProcess_Can_Task_t;
  128. static UINT8 gProcess_Can_TaskStack[PROC_CAN_TASK_STACK_SIZE];
  129. static StaticTask_t gProcess_Tcp_Task_t;
  130. static UINT8 gProcess_Tcp_TaskStack[PROC_TCP_TASK_STACK_SIZE];
  131. //睡眠进出函数
  132. static void appBeforeHib(void *pdata, slpManLpState state)
  133. {
  134. uint32_t *p_param = (uint32_t *)pdata;
  135. #ifdef USING_PRINTF
  136. printf("Before Hibernate:%d \n",state);
  137. #endif
  138. slpManAONIOLatchEn(AonIOLatch_Enable);
  139. }
  140. static void appAfterHib(void *pdata, slpManLpState state)
  141. {
  142. #ifdef USING_PRINTF
  143. printf("Try Hibernate Failed:%d \n",state);
  144. #endif
  145. }
  146. static void appBeforeSlp1(void *pdata, slpManLpState state)
  147. {
  148. #ifdef USING_PRINTF
  149. printf("Before Sleep1:%d \n",state);
  150. #endif
  151. slpManAONIOLatchEn(AonIOLatch_Enable);
  152. }
  153. static void appAfterSlp1(void *pdata, slpManLpState state)
  154. {
  155. #ifdef USING_PRINTF
  156. printf("After Sleep1:%d \n",state);
  157. #endif
  158. }
  159. static void appBeforeSlp2(void *pdata, slpManLpState state)
  160. {
  161. #ifdef USING_PRINTF
  162. printf("before sleep2:%d \n",state);
  163. #endif
  164. slpManAONIOLatchEn(AonIOLatch_Enable);
  165. }
  166. static void appAfterSlp2(void *pdata, slpManLpState state)
  167. {
  168. #ifdef USING_PRINTF
  169. printf("sleep2 failed:%d \n",state);
  170. #endif
  171. }
  172. // 主任务线程
  173. static void Main_Task(void* arg)
  174. {
  175. UINT16 Can_index = 0;
  176. UINT16 Uart_index = 0;
  177. UINT16 Tcp_index = 0;
  178. uint32_t sleep_index = 0;
  179. uint32_t sleep_time_flag;
  180. int32_t inParam = 0xAABBCCDD;
  181. uint32_t Chrgend_Work_time = 180000;
  182. uint32_t Wakeup_Work_time = 30000;
  183. uint32_t Sleep_Time = 1800000;
  184. //上述参数应写入文件里
  185. slpManWakeSrc_e Wakeup_source;
  186. PROC_MAIN_STATE_SWITCH(PROCESS_STATE_IDLE);
  187. NetSocDisplay(LED_SOC_0,LED_TURN_OFF);
  188. NetSocDisplay(LED_SOC_1,LED_TURN_OFF);
  189. NetSocDisplay(LED_SOC_2,LED_TURN_OFF);
  190. NetSocDisplay(LED_SOC_3,LED_TURN_OFF);
  191. FaultDisplay(LED_TURN_OFF);
  192. NVIC_EnableIRQ(PadWakeup1_IRQn);
  193. slpManSetPmuSleepMode(true,SLP_HIB_STATE,false);
  194. slpManApplyPlatVoteHandle("MainSlp",&MainSlpHandler);
  195. slpManPlatVoteDisableSleep(MainSlpHandler, SLP_SLP2_STATE);
  196. slpManRegisterUsrdefinedBackupCb(appBeforeHib,&inParam,SLPMAN_HIBERNATE_STATE);
  197. slpManRegisterUsrdefinedRestoreCb(appAfterHib,NULL,SLPMAN_HIBERNATE_STATE);
  198. slpManRegisterUsrdefinedBackupCb(appBeforeSlp1,NULL,SLPMAN_SLEEP1_STATE);
  199. slpManRegisterUsrdefinedRestoreCb(appAfterSlp1,NULL,SLPMAN_SLEEP1_STATE);
  200. slpManRegisterUsrdefinedBackupCb(appBeforeSlp2,NULL,SLPMAN_SLEEP2_STATE);
  201. slpManRegisterUsrdefinedRestoreCb(appAfterSlp2,NULL,SLPMAN_SLEEP2_STATE);
  202. slpManSlpState_t slpstate = slpManGetLastSlpState();
  203. #ifdef USING_PRINTF
  204. printf("slpstate:%d \n",slpstate);
  205. #endif
  206. Wakeup_source = slpManGetWakeupSrc();//获取唤醒源
  207. #ifdef USING_PRINTF
  208. printf("Wakeup_source:%d \n",Wakeup_source);
  209. #endif
  210. if (Wakeup_source==0)
  211. {
  212. sleep_time_flag = Wakeup_Work_time;
  213. }
  214. else if (Wakeup_source==1)
  215. {
  216. sleep_time_flag = Wakeup_Work_time;
  217. }
  218. else
  219. {
  220. sleep_time_flag = Chrgend_Work_time;
  221. }
  222. if((slpstate == SLP_SLP2_STATE) || (slpstate == SLP_HIB_STATE))
  223. {
  224. PROC_MAIN_STATE_SWITCH(PROCESS_STATE_WORK);
  225. }
  226. else
  227. {
  228. PROC_MAIN_STATE_SWITCH(PROCESS_STATE_WORK);
  229. }
  230. //线程初始化完成
  231. while (true)
  232. {
  233. switch(gProcess_Main_Task)
  234. {
  235. case PROCESS_STATE_IDLE:
  236. {
  237. // 暂时不区分唤醒
  238. PROC_MAIN_STATE_SWITCH(PROCESS_STATE_WORK);
  239. break;
  240. }
  241. case PROCESS_STATE_WORK:
  242. {
  243. NetSocDisplay(LED_SOC_0,LED_TURN_ON);
  244. osDelay(10/portTICK_PERIOD_MS);
  245. Can_index++;
  246. Uart_index++;
  247. Tcp_index++;
  248. if (Uart_index >100)//Uart 1s 调用一次
  249. {
  250. PROC_UART_STATE_SWITCH(PROCESS_UART_STATE_WORK);
  251. Uart_index = 0;
  252. }
  253. if (Can_index >=100)//Can 1s 调用一次
  254. {
  255. PROC_CAN_STATE_SWITCH(PROCESS_CAN_STATE_RECV);
  256. Can_index = 0;
  257. }
  258. if (Tcp_index >=100)//Tcp 1s 调用一次
  259. {
  260. PROC_TCP_STATE_SWITCH(PROCESS_TCP_STATE_LINK);
  261. Tcp_index = 0;
  262. }
  263. if((!Can_Enable)&&((Uart_Rece_BattI==0x0000)||(Uart_Rece_BattI==0xffff)))
  264. {
  265. sleep_index++;
  266. }
  267. else
  268. {
  269. sleep_index = 0;
  270. }
  271. if (sleep_index >=sleep_time_flag)
  272. {
  273. PROC_MAIN_STATE_SWITCH(PROCESS_STATE_SLEEP);
  274. sleep_index = 0;
  275. }
  276. break;
  277. }
  278. case PROCESS_STATE_SLEEP:
  279. {
  280. while(true)
  281. {
  282. PROC_UART_STATE_SWITCH(PROCESS_UART_STATE_SLEEP);
  283. PROC_CAN_STATE_SWITCH(PROCESS_CAN_STATE_SLEEP);
  284. PROC_TCP_STATE_SWITCH(PROCESS_TCP_STATE_SLEEP);
  285. if((Uart_Sleep_Flag)&&(Can_Sleep_Flag)&&(Tcp_Sleep_Flag))
  286. break;
  287. }
  288. Sleep_Flag = TRUE;
  289. osDelay(2000);
  290. #ifdef USING_PRINTF
  291. printf("Ms_sleep:uart_%d,can_%d,tcp_%d\r\n",gProcess_Uart_Task,gProcess_Can_Task,gProcess_Tcp_Task);
  292. #endif
  293. slpManSlpState_t State;
  294. uint8_t cnt;
  295. if(slpManCheckVoteState(MainSlpHandler, &State, &cnt)==RET_TRUE)
  296. {
  297. #ifdef USING_PRINTF
  298. printf("[%d]We Can Check Vote Main State, state=%d, cnt=%d\r\n",__LINE__,State,cnt);
  299. #endif
  300. }
  301. slpManPlatVoteForceEnableSleep(MainSlpHandler, SLP_SLP2_STATE); //增加强制投票
  302. if(slpManCheckVoteState(MainSlpHandler, &State, &cnt)==RET_TRUE)
  303. {
  304. #ifdef USING_PRINTF
  305. printf("[%d]We Can Check Vote Main State Again, state=%d, cnt=%d\r\n",__LINE__,State,cnt);
  306. #endif
  307. }
  308. #ifdef USING_PRINTF
  309. printf("[%d]Waiting sleep\r\n",__LINE__);
  310. #endif
  311. FaultDisplay(LED_TURN_ON);
  312. slpManSlpState_t slpstate = slpManPlatGetSlpState();
  313. #ifdef USING_PRINTF
  314. printf("which slpstate can go now :%d \n",slpstate);
  315. #endif
  316. slpManDeepSlpTimerStart(deepslpTimerID, Sleep_Time);
  317. while(1)
  318. {
  319. osDelay(60000/portTICK_PERIOD_MS);
  320. }
  321. break;
  322. }
  323. }
  324. }
  325. }
  326. //Uart校验程序
  327. unsigned int crc_chk(uint8_t* data, uint8_t length)
  328. {
  329. int j;
  330. uint16_t reg_crc=0xFFFF;
  331. while(length--)
  332. {
  333. reg_crc ^= *data++;
  334. for(j=0;j<8;j++)
  335. {
  336. if(reg_crc & 0x01)
  337. {
  338. reg_crc=(reg_crc>>1) ^ 0xA001;
  339. }
  340. else
  341. {
  342. reg_crc=reg_crc >>1;
  343. }
  344. }
  345. }
  346. return reg_crc;
  347. }
  348. //Uart回调程序
  349. void USART_callback(uint32_t event)
  350. {
  351. if(event & ARM_USART_EVENT_RX_TIMEOUT)
  352. {
  353. isRecvTimeout = true;
  354. }
  355. if(event & ARM_USART_EVENT_RECEIVE_COMPLETE)
  356. {
  357. isRecvComplete = true;
  358. }
  359. }
  360. //Uart发送接收函数
  361. uint8_t* Uart_Receive_func(Uart_Receive_Type Uart_Receive_Msg,uint8_t* Uart_Rece_buffer,uint8_t Data_Len)
  362. {
  363. uint16_t CRC_Rece_buffer;
  364. uint16_t CRC_chk_buffer;
  365. uint8_t Uart_Send_buffer[8];
  366. Uart_Send_buffer[0] = Uart_Receive_Msg.Bms_Address;
  367. Uart_Send_buffer[1] = Uart_Receive_Msg.Bms_Read_Funcode;
  368. Uart_Send_buffer[2] = Uart_Receive_Msg.Reg_Begin_H;
  369. Uart_Send_buffer[3] = Uart_Receive_Msg.Reg_Begin_L;
  370. Uart_Send_buffer[4] = Uart_Receive_Msg.Reg_Num_H;
  371. Uart_Send_buffer[5] = Uart_Receive_Msg.Reg_Num_L;
  372. CRC_chk_buffer = crc_chk(Uart_Send_buffer,6);
  373. Uart_Send_buffer[6] = CRC_chk_buffer;
  374. Uart_Send_buffer[7] = CRC_chk_buffer>>8;
  375. uint32_t timeout = 0x00000000;
  376. USARTdrv->Send(Uart_Send_buffer,8);
  377. // #ifdef USING_PRINTF
  378. // printf("Uart_Send_buffer: ");
  379. // for(int i=0;i<8;i++)
  380. // {
  381. // printf("%x ",Uart_Send_buffer[i]);
  382. // }
  383. // printf("\n");
  384. // #endif
  385. USARTdrv->Receive(Uart_Rece_buffer,Data_Len);
  386. while((isRecvTimeout == false) && (isRecvComplete == false))
  387. {
  388. timeout++;
  389. osDelay(100);
  390. if (timeout>=10)
  391. {
  392. timeout =0;
  393. isRecvTimeout = true;
  394. break;
  395. }
  396. }
  397. // #ifdef USING_PRINTF
  398. // printf("Uart_Rece_buffer1: ");
  399. // for(int i=0;i<Data_Len;i++)
  400. // {
  401. // printf("%x ",*(Uart_Rece_buffer+i));
  402. // }
  403. // #endif
  404. if (isRecvComplete == true)
  405. {
  406. isRecvComplete = false;
  407. CRC_Rece_buffer =*(Uart_Rece_buffer+Data_Len-1)<<8|*(Uart_Rece_buffer+Data_Len-2);
  408. CRC_chk_buffer = crc_chk(Uart_Rece_buffer,Data_Len-2);
  409. // #ifdef USING_PRINTF
  410. // printf("Uart_Rece_buffer2: ");
  411. // for(int i=0;i<Data_Len;i++)
  412. // {
  413. // printf("%x ",*(Uart_Rece_buffer+i));
  414. // }
  415. // printf("\ncrcchk:%x,%x\n ",CRC_chk_buffer,CRC_Rece_buffer);
  416. // #endif
  417. if (CRC_Rece_buffer == CRC_chk_buffer)//满足校验
  418. {
  419. return Uart_Rece_buffer;//此处指针移位出现重启问题
  420. }
  421. else //接收数据的校验不过屏蔽
  422. {
  423. memset(Uart_Rece_buffer,0xff,Data_Len);
  424. return Uart_Rece_buffer;
  425. }
  426. }
  427. else
  428. {
  429. memset(Uart_Rece_buffer,0x00,Data_Len);
  430. isRecvTimeout = false;
  431. return Uart_Rece_buffer;
  432. }
  433. }
  434. void GGACallBack(UINT8 res, UINT8 * params)
  435. {
  436. #ifdef USING_PRINTF
  437. printf("GPS:len=%d,data=%s\r\n",res,params);
  438. #else
  439. ECOMM_STRING(UNILOG_PLA_STRING, GPS_DATA, P_INFO, "gps:%s", params);
  440. #endif
  441. }
  442. //Uart线程
  443. static void Uart_Task(void* arg)
  444. {
  445. USARTdrv->Initialize(USART_callback);
  446. USARTdrv->PowerControl(ARM_POWER_FULL);
  447. USARTdrv->Control(ARM_USART_MODE_ASYNCHRONOUS |
  448. ARM_USART_DATA_BITS_8 |
  449. ARM_USART_PARITY_NONE |
  450. ARM_USART_STOP_BITS_1 |
  451. ARM_USART_FLOW_CONTROL_NONE, 9600);
  452. int Rece_index = 0;
  453. volatile uint8_t Data_Len;
  454. Uart_Receive_Type Uart_Receive_Msg;
  455. memset(&battbuffer[0],0x00,battbuffer_len);
  456. PROC_UART_STATE_SWITCH(PROCESS_UART_STATE_IDLE);
  457. slpManApplyPlatVoteHandle("UARTSLP",&UartSlpHandler);
  458. slpManPlatVoteDisableSleep(UartSlpHandler, SLP_SLP2_STATE);
  459. Uart_Receive_Msg.Bms_Address = 0x01;
  460. Uart_Receive_Msg.Bms_Read_Funcode = 0x03;
  461. uint8_t *Uart_Rece_buffer = NULL;
  462. volatile bool Uart_task = false;
  463. Batt_Cell_Num_2 = Batt_Cell_Num<<1;
  464. while (true)
  465. {
  466. switch (gProcess_Uart_Task)
  467. {
  468. case PROCESS_UART_STATE_IDLE:
  469. {
  470. Rece_index = 0;
  471. break;
  472. }
  473. case PROCESS_UART_STATE_CHECK:
  474. {
  475. Uart_Rece_buffer = (uint8_t *)malloc(Uart_Rece_LEN);
  476. Uart_Receive_Msg.Reg_Begin_H = 0x00;
  477. Uart_Receive_Msg.Reg_Begin_L= 0x02+Batt_Cell_Num;
  478. Uart_Receive_Msg.Reg_Num_H = 0x00;
  479. Uart_Receive_Msg.Reg_Num_L = 0x01;
  480. Data_Len = Uart_Receive_Msg.Reg_Num_L*2+5;
  481. memset(Uart_Rece_buffer,0x00,Data_Len);
  482. Uart_Rece_buffer = Uart_Receive_func(Uart_Receive_Msg,Uart_Rece_buffer,Data_Len);
  483. Uart_Rece_BattI = *(Uart_Rece_buffer+3+0)<<8 |*(Uart_Rece_buffer+3+1);
  484. #ifdef USING_PRINTF
  485. printf("Check_Current!\n");
  486. #endif
  487. PROC_UART_STATE_SWITCH(PROCESS_UART_STATE_IDLE);
  488. free(Uart_Rece_buffer);
  489. break;
  490. }
  491. case PROCESS_UART_STATE_WORK:
  492. {
  493. #ifdef USING_PRINTF
  494. printf("UART_STATE_WORK!\n");
  495. #endif
  496. NetSocDisplay(LED_SOC_1,LED_TURN_ON);
  497. Uart_task = false;
  498. Uart_Rece_buffer = (uint8_t *)malloc(Uart_Rece_LEN);
  499. while(!Uart_task)
  500. {
  501. switch (Rece_index)
  502. {
  503. case 0://current
  504. {
  505. Uart_Receive_Msg.Reg_Begin_H = 0x00;
  506. Uart_Receive_Msg.Reg_Begin_L= 0x02+Batt_Cell_Num;
  507. Uart_Receive_Msg.Reg_Num_H = 0x00;
  508. Uart_Receive_Msg.Reg_Num_L = 0x01;
  509. Data_Len = Uart_Receive_Msg.Reg_Num_L*2+5;
  510. memset(Uart_Rece_buffer,0x00,Data_Len);
  511. Uart_Rece_buffer = Uart_Receive_func(Uart_Receive_Msg,Uart_Rece_buffer,Data_Len);
  512. Uart_Rece_BattI = *(Uart_Rece_buffer+3+0)<<8 |*(Uart_Rece_buffer+3+1);
  513. break;
  514. }
  515. case 1://cell votage
  516. {
  517. Uart_Receive_Msg.Reg_Begin_H = 0x00;
  518. Uart_Receive_Msg.Reg_Begin_L = 0x02;
  519. Uart_Receive_Msg.Reg_Num_H = Batt_Cell_Num>>8;
  520. Uart_Receive_Msg.Reg_Num_L = Batt_Cell_Num;
  521. Data_Len = Uart_Receive_Msg.Reg_Num_L*2+5;
  522. memset(Uart_Rece_buffer,0x00,Data_Len);
  523. Uart_Rece_buffer = Uart_Receive_func(Uart_Receive_Msg,Uart_Rece_buffer,Data_Len);
  524. battbuffer[30] = Batt_Cell_Num;
  525. memcpy(&battbuffer[31],Uart_Rece_buffer+3,Batt_Cell_Num_2);
  526. break;
  527. }
  528. case 2://temprature
  529. {
  530. Uart_Receive_Msg.Reg_Begin_H = 0x00;
  531. Uart_Receive_Msg.Reg_Begin_L = 0x06+Batt_Cell_Num;
  532. Uart_Receive_Msg.Reg_Num_H = Batt_Temp_Num>>8;
  533. Uart_Receive_Msg.Reg_Num_L = Batt_Temp_Num;
  534. Data_Len = Uart_Receive_Msg.Reg_Num_L*2+5;
  535. memset(Uart_Rece_buffer,0x00,Data_Len);
  536. Uart_Rece_buffer = Uart_Receive_func(Uart_Receive_Msg,Uart_Rece_buffer,Data_Len);
  537. battbuffer[31+Batt_Cell_Num_2] = Batt_Temp_Num;
  538. for (int i = 0; i < Batt_Temp_Num; i++)
  539. {
  540. battbuffer[32+Batt_Cell_Num_2+i] = *(Uart_Rece_buffer+3+2*i+1);
  541. }
  542. break;
  543. }
  544. case 3://batt votage
  545. {
  546. Uart_Receive_Msg.Reg_Begin_H = 0x00;
  547. Uart_Receive_Msg.Reg_Begin_L = 0x18+Batt_Cell_Num+Batt_Temp_Num;
  548. Uart_Receive_Msg.Reg_Num_H = 0x00;
  549. Uart_Receive_Msg.Reg_Num_L = 0x01;
  550. Data_Len = Uart_Receive_Msg.Reg_Num_L*2+5;
  551. memset(Uart_Rece_buffer,0x00,Data_Len);
  552. Uart_Rece_buffer = Uart_Receive_func(Uart_Receive_Msg,Uart_Rece_buffer,Data_Len);
  553. battbuffer[19] = *(Uart_Rece_buffer+3+0);//Link U
  554. battbuffer[20] = *(Uart_Rece_buffer+3+1);
  555. battbuffer[21] = *(Uart_Rece_buffer+3+0);//Pack U
  556. battbuffer[22] = *(Uart_Rece_buffer+3+1);
  557. break;
  558. }
  559. case 4://soc,soh
  560. {
  561. Uart_Receive_Msg.Reg_Begin_H = 0x00;
  562. Uart_Receive_Msg.Reg_Begin_L = 0x09+Batt_Cell_Num+Batt_Temp_Num;
  563. Uart_Receive_Msg.Reg_Num_H = 0x00;
  564. Uart_Receive_Msg.Reg_Num_L = 0x04;
  565. Data_Len = Uart_Receive_Msg.Reg_Num_L*2+5;
  566. memset(Uart_Rece_buffer,0x00,Data_Len);
  567. Uart_Rece_buffer = Uart_Receive_func(Uart_Receive_Msg,Uart_Rece_buffer,Data_Len);
  568. battbuffer[23] = *(Uart_Rece_buffer+3+0)>>1;//mos状态
  569. battbuffer[24] = *(Uart_Rece_buffer+3+5);//SOC
  570. battbuffer[25] = *(Uart_Rece_buffer+3+7);//SOH
  571. break;
  572. }
  573. case 5://均衡
  574. {
  575. Uart_Receive_Msg.Reg_Begin_H = 0x00;
  576. Uart_Receive_Msg.Reg_Begin_L = 0x06+Batt_Cell_Num+Batt_Temp_Num;
  577. Uart_Receive_Msg.Reg_Num_H = 0x00;
  578. Uart_Receive_Msg.Reg_Num_L = 0x02;
  579. Data_Len = Uart_Receive_Msg.Reg_Num_L*2+5;
  580. memset(Uart_Rece_buffer,0x00,Data_Len);
  581. Uart_Rece_buffer = Uart_Receive_func(Uart_Receive_Msg,Uart_Rece_buffer,Data_Len);
  582. memcpy(&battbuffer[26],Uart_Rece_buffer+3,4);
  583. break;
  584. }
  585. case 6:
  586. {
  587. Uart_Receive_Msg.Reg_Begin_H = 0x00;
  588. Uart_Receive_Msg.Reg_Begin_L = 0x19+Batt_Cell_Num+Batt_Temp_Num;
  589. Uart_Receive_Msg.Reg_Num_H = 0x00;
  590. Uart_Receive_Msg.Reg_Num_L = 0x02;
  591. Data_Len = Uart_Receive_Msg.Reg_Num_L*2+5;
  592. memset(Uart_Rece_buffer,0x00,Data_Len);
  593. Uart_Rece_buffer = Uart_Receive_func(Uart_Receive_Msg,Uart_Rece_buffer,Data_Len);
  594. memcpy(&battbuffer[34+Batt_Cell_Num_2+Batt_Temp_Num],Uart_Rece_buffer+3,4);
  595. break;
  596. }
  597. default:
  598. {
  599. PROC_UART_STATE_SWITCH(PROCESS_UART_STATE_IDLE);
  600. Uart_task = true;
  601. break;
  602. }
  603. }
  604. Rece_index++;
  605. }
  606. free(Uart_Rece_buffer);
  607. break;
  608. }
  609. case PROCESS_UART_STATE_SLEEP:
  610. {
  611. slpManPlatVoteEnableSleep(UartSlpHandler, SLP_SLP2_STATE);
  612. #ifdef USING_PRINTF
  613. printf("UART_STATE_SLEEP\n");
  614. #endif
  615. Uart_Sleep_Flag = true;
  616. while(1)
  617. {
  618. osDelay(60000/portTICK_PERIOD_MS);
  619. }
  620. }
  621. }
  622. }
  623. }
  624. //Can-线程任务
  625. static void Can_Task(void* arg)
  626. {
  627. uint32_t Can_ID;
  628. Can_InitType param;
  629. Can_TxMsgType Can_TxMsg;
  630. param.baudrate = CAN_500Kbps;
  631. param.mode = REQOP_NORMAL;
  632. //过滤ID配置
  633. param.TxStdIDH = 0x00;
  634. param.TxStdIDL = 0x00;
  635. param.RxStdIDH[0] = 0x00;
  636. param.RxStdIDL[0] = 0x00;
  637. /*stdid 0000 0000 001x*/
  638. param.RxStdIDH[1] = 0x00;
  639. param.RxStdIDL[1] = 0x20;
  640. /*stdid 0000 0000 010x */
  641. param.RxStdIDH[2] = 0x00;
  642. param.RxStdIDL[2] = 0x40;
  643. /*stdid 0000 0000 011x*/
  644. param.RxStdIDH[3] = 0x00;
  645. param.RxStdIDL[3] =0x60;
  646. /*stdid 0000 0000 100x */
  647. param.RxStdIDH[4] = 0x00;
  648. param.RxStdIDL[4] = 0x80;
  649. /*stdid 0000 0000 101x*/
  650. param.RxStdIDH[5] = 0x00;
  651. param.RxStdIDL[5] =0xa0;
  652. //配置完毕
  653. param.packType = STD_PACK;
  654. HAL_Can_Init(param);
  655. int send_index = 0;
  656. uint16_t Batt_Cell_addU = 0x0000;
  657. slpManApplyPlatVoteHandle("CanSlp",&CanSlpHandler);
  658. slpManPlatVoteDisableSleep(CanSlpHandler, SLP_SLP2_STATE);
  659. volatile bool Can_Flag=false;
  660. PROC_CAN_STATE_SWITCH(PROCESS_CAN_STATE_IDLE);
  661. posGGAServiceStart(GGACallBack);
  662. while(1)
  663. {
  664. switch(gProcess_Can_Task)
  665. {
  666. case PROCESS_CAN_STATE_IDLE:
  667. {
  668. Can_Rece_buffer[0]=0xff;
  669. send_index = 0;
  670. break;
  671. }
  672. case PROCESS_CAN_STATE_RECV:
  673. {
  674. //加入GPS启动程序
  675. if(gpsMsgQueue == NULL)
  676. {
  677. gpsMsgQueue = osMessageQueueNew(1,sizeof(GPS_INFO), NULL);
  678. }
  679. osMessageQueueGet(gpsMsgQueue, &Gps_Data, 0, 1000);
  680. #ifdef USING_PRINTF
  681. printf("Gpsmsgqueue: %d,%d,%d,%d\r\n\n",Gps_Data.latitude,Gps_Data.longitude,Gps_Data.speed,Gps_Data.direction);
  682. #endif
  683. //can采用先接收后发送的策略
  684. HAL_Can_Receive(Can_Rece_buffer);
  685. if (Can_Rece_buffer[0]!=0xff)//满足can发送使能
  686. {
  687. PROC_CAN_STATE_SWITCH(PROCESS_CAN_STATE_SEND);
  688. Can_Enable = true;
  689. }
  690. else
  691. {
  692. PROC_CAN_STATE_SWITCH(PROCESS_CAN_STATE_IDLE);
  693. Can_Enable = false;
  694. }
  695. break;
  696. }
  697. case PROCESS_CAN_STATE_SEND:
  698. {
  699. #ifdef USING_PRINTF
  700. printf("CAN_STATE_SEND!\n");
  701. #endif
  702. Can_Flag=false;
  703. while(!Can_Flag)
  704. {
  705. switch(send_index)
  706. {
  707. case 0:
  708. {
  709. Can_ID = 0x001;
  710. for (int i = 0; i < 8; i++)
  711. {
  712. Can_TxMsg.Data[i] = battbuffer[i+31+send_index*8];
  713. }
  714. Can_TxMsg.stdIDH = Can_ID>>3;
  715. Can_TxMsg.stdIDL = Can_ID<<5;
  716. Can_TxMsg.DLC = 8;
  717. HAL_Can_Transmit(Can_TxMsg);
  718. break;
  719. }
  720. case 1:
  721. {
  722. Can_ID = 0x011;
  723. for (int i = 0; i < 8; i++)
  724. {
  725. Can_TxMsg.Data[i] = battbuffer[i+31+send_index*8];
  726. }
  727. Can_TxMsg.stdIDH = Can_ID>>3;
  728. Can_TxMsg.stdIDL = Can_ID<<5;
  729. Can_TxMsg.DLC = 8;
  730. HAL_Can_Transmit(Can_TxMsg);
  731. break;
  732. }
  733. case 2:
  734. {
  735. Can_ID = 0x020;
  736. for (int i = 0; i < 8; i++)
  737. {
  738. Can_TxMsg.Data[i] = battbuffer[i+31+send_index*8];
  739. }
  740. Can_TxMsg.stdIDH = Can_ID>>3;
  741. Can_TxMsg.stdIDL = Can_ID<<5;
  742. Can_TxMsg.DLC = 8;
  743. HAL_Can_Transmit(Can_TxMsg);
  744. break;
  745. }
  746. case 3:
  747. {
  748. Can_ID = 0x031;
  749. for (int i = 0; i < 8; i++)
  750. {
  751. Can_TxMsg.Data[i] = battbuffer[i+31+send_index*8];
  752. }
  753. Can_TxMsg.stdIDH = Can_ID>>3;
  754. Can_TxMsg.stdIDL = Can_ID<<5;
  755. Can_TxMsg.DLC = 8;
  756. HAL_Can_Transmit(Can_TxMsg);
  757. break;
  758. }
  759. case 8:
  760. {
  761. Can_ID = 0x041;
  762. for (int i = 0; i < 2; i++)
  763. {
  764. Can_TxMsg.Data[i] = battbuffer[i+31+4*8];
  765. }
  766. for (int i = 0; i < 6; i++)
  767. {
  768. Can_TxMsg.Data[i+2] = 0x00;
  769. }
  770. Can_TxMsg.stdIDH = Can_ID>>3;
  771. Can_TxMsg.stdIDL = Can_ID<<5;
  772. Can_TxMsg.DLC = 8;
  773. HAL_Can_Transmit(Can_TxMsg);
  774. break;
  775. }
  776. case 4:
  777. {
  778. Can_ID = 0x101;
  779. for (int i = 0; i < Batt_Temp_Num; i++)
  780. {
  781. Can_TxMsg.Data[i] = battbuffer[i+32+Batt_Cell_Num_2];
  782. }
  783. Can_TxMsg.stdIDH = Can_ID>>3;
  784. Can_TxMsg.stdIDL = Can_ID<<5;
  785. Can_TxMsg.DLC = 8;
  786. HAL_Can_Transmit(Can_TxMsg);
  787. break;
  788. }
  789. case 5:
  790. {
  791. Batt_Cell_addU = 0x0000;
  792. for (int i = 0; i < Batt_Cell_Num; i++)
  793. {
  794. Batt_Cell_addU = Batt_Cell_addU + (battbuffer[31+i*2]<<8|battbuffer[31+i*2+1]);
  795. }
  796. Can_ID = 0x201;
  797. Can_TxMsg.Data[0] = battbuffer[19];
  798. Can_TxMsg.Data[1] = battbuffer[20];
  799. Can_TxMsg.Data[2] = battbuffer[21];
  800. Can_TxMsg.Data[3] = battbuffer[22];//外电压
  801. Can_TxMsg.Data[4] = Batt_Cell_addU>>8;
  802. Can_TxMsg.Data[5] = Batt_Cell_addU;//累加电压
  803. Can_TxMsg.Data[6] = Uart_Rece_BattI>>8;
  804. Can_TxMsg.Data[7] = Uart_Rece_BattI;
  805. Can_TxMsg.stdIDH = Can_ID>>3;
  806. Can_TxMsg.stdIDL = Can_ID<<5;
  807. Can_TxMsg.DLC = 8;
  808. HAL_Can_Transmit(Can_TxMsg);
  809. break;
  810. }
  811. case 6:
  812. {
  813. Can_ID = 0x211;
  814. Can_TxMsg.Data[0] = battbuffer[34+Batt_Cell_Num_2+Batt_Temp_Num];
  815. Can_TxMsg.Data[1] = battbuffer[35+Batt_Cell_Num_2+Batt_Temp_Num];
  816. Can_TxMsg.Data[2] = battbuffer[36+Batt_Cell_Num_2+Batt_Temp_Num];
  817. Can_TxMsg.Data[3] = battbuffer[37+Batt_Cell_Num_2+Batt_Temp_Num];
  818. Can_TxMsg.Data[4] = 0x00;
  819. Can_TxMsg.Data[5] = 0x00;
  820. Can_TxMsg.Data[6] = battbuffer[24];
  821. Can_TxMsg.Data[7] = Batt_Temp_Num<<4|0;
  822. Can_TxMsg.stdIDH = Can_ID>>3;
  823. Can_TxMsg.stdIDL = Can_ID<<5;
  824. Can_TxMsg.DLC = 8;
  825. HAL_Can_Transmit(Can_TxMsg);
  826. break;
  827. }
  828. case 7:
  829. {
  830. Can_ID = 0x221;
  831. Can_TxMsg.Data[0] = battbuffer[25];//SOH
  832. Can_TxMsg.Data[1] = 0x00;
  833. Can_TxMsg.Data[2] = 0x00;
  834. Can_TxMsg.Data[3] = 0x00;
  835. Can_TxMsg.Data[4] = 0x00;
  836. Can_TxMsg.Data[5] = 0x00;
  837. Can_TxMsg.Data[6] = 0x00;
  838. Can_TxMsg.Data[7] = 0x00;
  839. Can_TxMsg.stdIDH = Can_ID>>3;
  840. Can_TxMsg.stdIDL = Can_ID<<5;
  841. Can_TxMsg.DLC = 8;
  842. HAL_Can_Transmit(Can_TxMsg);
  843. break;
  844. }
  845. default:
  846. {
  847. Can_Flag=true;
  848. PROC_CAN_STATE_SWITCH(PROCESS_CAN_STATE_IDLE);
  849. break;
  850. }
  851. }
  852. send_index ++;
  853. }
  854. break;
  855. }
  856. case PROCESS_CAN_STATE_SLEEP:
  857. {
  858. posGGAServiceStop();
  859. HAL_Can_Sleep();
  860. slpManSlpState_t State;
  861. uint8_t cnt;
  862. if(slpManCheckVoteState(CanSlpHandler, &State, &cnt)==RET_TRUE)
  863. {
  864. #ifdef USING_PRINTF
  865. printf("[%d]We Can Check Vote Can State, state=%d, cnt=%d\r\n",__LINE__,State,cnt);
  866. #endif
  867. }
  868. slpManPlatVoteEnableSleep(CanSlpHandler, SLP_SLP2_STATE);
  869. if(slpManCheckVoteState(CanSlpHandler, &State, &cnt)==RET_TRUE)
  870. {
  871. #ifdef USING_PRINTF
  872. printf("[%d]We Can Check Vote can State Again, state=%d, cnt=%d\r\n",__LINE__,State,cnt);
  873. #endif
  874. }
  875. Can_Sleep_Flag = true;
  876. while(true)
  877. {
  878. osDelay(60000/portTICK_PERIOD_MS);
  879. }
  880. }
  881. }
  882. }
  883. }
  884. static void sendQueueMsg(UINT32 msgId, UINT32 xTickstoWait)
  885. {
  886. eventCallbackMessage_t *queueMsg = NULL;
  887. queueMsg = malloc(sizeof(eventCallbackMessage_t));
  888. queueMsg->messageId = msgId;
  889. if (psEventQueueHandle)
  890. {
  891. if (pdTRUE != xQueueSend(psEventQueueHandle, &queueMsg, xTickstoWait))
  892. {
  893. ECOMM_TRACE(UNILOG_PLA_APP, sendQueueMsg_1, P_ERROR, 0, "xQueueSend error");
  894. }
  895. }
  896. }
  897. static INT32 socketRegisterPSUrcCallback(urcID_t eventID, void *param, UINT32 paramLen)
  898. {
  899. CmiSimImsiStr *imsi = NULL;
  900. CmiPsCeregInd *cereg = NULL;
  901. UINT8 rssi = 0, index = 0;
  902. NmAtiNetifInfo *netif = NULL;
  903. switch(eventID)
  904. {
  905. case NB_URC_ID_SIM_READY:
  906. {
  907. imsi = (CmiSimImsiStr *)param;
  908. memcpy(gImsi, imsi->contents, imsi->length);
  909. #ifdef USING_PRINTF
  910. printf("SIM ready(imsi=%s)\n",(UINT8 *)imsi->contents);
  911. #endif
  912. break;
  913. }
  914. case NB_URC_ID_MM_SIGQ:
  915. {
  916. rssi = *(UINT8 *)param;
  917. #ifdef USING_PRINTF
  918. printf("RSSI signal=%d\n",rssi);
  919. #endif
  920. ECOMM_TRACE(UNILOG_PLA_APP, socketRegisterPSUrcCallback_1, P_INFO, 1, "RSSI signal=%d", rssi);
  921. break;
  922. }
  923. case NB_URC_ID_PS_BEARER_ACTED:
  924. {
  925. #ifdef USING_PRINTF
  926. printf("Default bearer activated\n");
  927. #endif
  928. break;
  929. }
  930. case NB_URC_ID_PS_BEARER_DEACTED:
  931. {
  932. #ifdef USING_PRINTF
  933. printf("Default bearer Deactivated\n");
  934. #endif
  935. break;
  936. }
  937. case NB_URC_ID_PS_CEREG_CHANGED:
  938. {
  939. cereg = (CmiPsCeregInd *)param;
  940. gCellID = cereg->celId;
  941. #ifdef USING_PRINTF
  942. printf("URCCallBack:CEREG changed act:%d celId:%d locPresent:%d tac:%d\n", cereg->act, cereg->celId, cereg->locPresent, cereg->tac);
  943. #endif
  944. break;
  945. }
  946. case NB_URC_ID_PS_NETINFO:
  947. {
  948. netif = (NmAtiNetifInfo *)param;
  949. if (netif->netStatus == NM_NETIF_ACTIVATED)
  950. sendQueueMsg(QMSG_ID_NW_IP_READY, 0);
  951. tcp_ready = true;
  952. break;
  953. }
  954. }
  955. return 0;
  956. }
  957. uint8_t bcc_chk(uint8_t* data, uint8_t length)//发送bcc校验函数
  958. {
  959. uint8_t bcc_chk_return = 0x00;
  960. uint8_t count = 0;
  961. while (count<length)
  962. {
  963. bcc_chk_return^=data[count];
  964. count++;
  965. }
  966. return bcc_chk_return;
  967. }
  968. //电池数据组装函数
  969. void Tcp_Batt_Data_Assemble(void)
  970. {
  971. int16_t Batt_current;
  972. uint16_t BattU = 0x00;
  973. uint8_t csq=0;
  974. int8_t snr=0;
  975. int8_t rsnr=0;
  976. Batt_current = Uart_Rece_BattI;
  977. OsaUtcTimeTValue timestracture;
  978. appGetSystemTimeUtcSync(&timestracture);
  979. battbuffer[0] = timestracture.UTCtimer1>>16;
  980. battbuffer[0] = battbuffer[0] - 0x07D0;
  981. battbuffer[1] = timestracture.UTCtimer1>>8;
  982. battbuffer[2] = timestracture.UTCtimer1;
  983. battbuffer[3] = timestracture.UTCtimer2>>24;
  984. battbuffer[4] = timestracture.UTCtimer2>>16;
  985. battbuffer[5] = timestracture.UTCtimer2>>8;
  986. battbuffer[6] = 0x80;//信息体标志,此处为电池信息
  987. battbuffer[7] = battbuffer[0];//年
  988. battbuffer[8] = battbuffer[1];//月
  989. battbuffer[9] = battbuffer[2];//日
  990. battbuffer[10] = battbuffer[3];//时 0时区时间
  991. battbuffer[11] = battbuffer[4];//分
  992. battbuffer[12] = battbuffer[5];//秒
  993. appGetSignalInfoSync(&csq,&snr,&rsnr);//获取信号质量
  994. battbuffer[13] = csq;// 网络信号
  995. battbuffer[14] = 0x00;//故障等级
  996. battbuffer[15] = 0x00;//故障代码高
  997. battbuffer[16] = 0x00;//故障代码低
  998. //电流适应性更改,从int转换到uint,加10000的偏移量,100mA的单位
  999. if (Batt_current>0x8000)
  1000. {
  1001. Batt_current = Batt_current|0x7fff;
  1002. Batt_current = 0x2710 - Batt_current;
  1003. Batt_current = Batt_current;
  1004. }
  1005. else
  1006. {
  1007. Batt_current = Batt_current+0x2710;
  1008. Batt_current = Batt_current;
  1009. }
  1010. battbuffer[17] = Batt_current>>8;
  1011. battbuffer[18] = Batt_current;
  1012. BattU = battbuffer[19]<<8|battbuffer[20];
  1013. BattU = BattU/10;
  1014. battbuffer[19] = BattU>>8;
  1015. battbuffer[20] = BattU;
  1016. battbuffer[21] = BattU>>8;
  1017. battbuffer[22] = BattU;//外电压
  1018. data_index = 32+Batt_Cell_Num_2+Batt_Temp_Num;
  1019. battbuffer[data_index] = 0x00;//电池状态
  1020. data_index++;
  1021. battbuffer[data_index] = 0x00;//是否加热
  1022. data_index++;
  1023. }
  1024. //Gps 数据组装函数
  1025. void Tcp_Gps_Data_Assemble(void)
  1026. {
  1027. OsaUtcTimeTValue timestracture;
  1028. appGetSystemTimeUtcSync(&timestracture);
  1029. gpsbuffer[0] = timestracture.UTCtimer1>>16;
  1030. gpsbuffer[0] = gpsbuffer[0] - 0x07D0;
  1031. gpsbuffer[1] = timestracture.UTCtimer1>>8;
  1032. gpsbuffer[2] = timestracture.UTCtimer1;
  1033. gpsbuffer[3] = timestracture.UTCtimer2>>24;
  1034. gpsbuffer[4] = timestracture.UTCtimer2>>16;
  1035. gpsbuffer[5] = timestracture.UTCtimer2>>8;
  1036. gpsbuffer[6] = 0x82;//信息体标志,此处为GPS信息
  1037. gpsbuffer[7] = gpsbuffer[0];//年
  1038. gpsbuffer[8] = gpsbuffer[1];//月
  1039. gpsbuffer[9] = gpsbuffer[2];//日
  1040. gpsbuffer[10] = gpsbuffer[3];//时 0时区时间
  1041. gpsbuffer[11] = gpsbuffer[4];//分
  1042. gpsbuffer[12] = gpsbuffer[5];//秒
  1043. gpsbuffer[13] = Gps_Data.status;
  1044. gpsbuffer[14] = Gps_Data.satellite_num;
  1045. gpsbuffer[15] = Gps_Data.direction>>8;
  1046. gpsbuffer[16] = Gps_Data.direction;
  1047. gpsbuffer[17] = Gps_Data.speed>>8;
  1048. gpsbuffer[18] = Gps_Data.speed;
  1049. gpsbuffer[19] = Gps_Data.altitude>>8;
  1050. gpsbuffer[20] = Gps_Data.altitude;
  1051. gpsbuffer[21] = Gps_Data.latitude>>24;
  1052. gpsbuffer[22] = Gps_Data.latitude>>16;
  1053. gpsbuffer[23] = Gps_Data.latitude>>8;
  1054. gpsbuffer[24] = Gps_Data.latitude;
  1055. gpsbuffer[25] = Gps_Data.longitude>>24;
  1056. gpsbuffer[26] = Gps_Data.longitude>>16;
  1057. gpsbuffer[27] = Gps_Data.longitude>>8;
  1058. gpsbuffer[28] = Gps_Data.longitude;
  1059. }
  1060. //Tcp线程
  1061. static void Tcp_Task(void* arg)
  1062. {
  1063. CHAR SN[] = "GYTEST00000000003";//SN应写到osfile里面
  1064. CHAR serverip[] = "47.97.127.222";
  1065. CHAR serverport[] = "8712";
  1066. struct addrinfo hints, *server_res;
  1067. int TcpsendID = -1;
  1068. memset( &hints, 0, sizeof( hints ) );
  1069. hints.ai_socktype = SOCK_STREAM;
  1070. hints.ai_protocol = IPPROTO_TCP;
  1071. psEventQueueHandle = xQueueCreate(APP_EVENT_QUEUE_SIZE, sizeof(eventCallbackMessage_t*));
  1072. slpManApplyPlatVoteHandle("TcpSlp",&TcpSlpHandler);
  1073. slpManPlatVoteDisableSleep(TcpSlpHandler, SLP_SLP2_STATE);
  1074. PROC_TCP_STATE_SWITCH(PROCESS_TCP_STATE_IDLE);
  1075. uint8_t Tcp_Index = 0;
  1076. uint8_t* TcpSendBuffer=NULL;
  1077. volatile bool Tcp_Flag=false;
  1078. eventCallbackMessage_t *queueItem = NULL;
  1079. uint8_t pmode;
  1080. uint32_t tau;
  1081. uint32_t act;
  1082. uint8_t NB_send_len;
  1083. appSetEDRXSettingSync(0,5,0);
  1084. appSetPSMSettingSync(1,3*60*60,10);
  1085. #ifdef USING_PRINTF
  1086. printf("psm:pmode-%d,tau-%d,act-%d!\n",pmode,tau,act);
  1087. #endif
  1088. while(true)
  1089. {
  1090. switch(gProcess_Tcp_Task)
  1091. {
  1092. case PROCESS_TCP_STATE_IDLE:
  1093. {
  1094. osDelay(100);
  1095. break;
  1096. }
  1097. case PROCESS_TCP_STATE_LINK:
  1098. {
  1099. if(!tcp_ready)
  1100. {
  1101. #ifdef USING_PRINTF
  1102. printf("tcp not ready!\n");
  1103. #endif
  1104. PROC_TCP_STATE_SWITCH(PROCESS_TCP_STATE_IDLE);
  1105. }
  1106. else
  1107. {
  1108. if(TcpconnectID<0)
  1109. {
  1110. #ifdef USING_PRINTF
  1111. printf("Connecting...!%d\n",TcpconnectID);
  1112. #endif
  1113. if (getaddrinfo( serverip, serverport , &hints, &server_res ) != 0 )
  1114. {
  1115. #ifdef USING_PRINTF
  1116. printf("TCP connect unresolved dns\n");
  1117. #endif
  1118. }
  1119. sockfd = socket(AF_INET, SOCK_STREAM, 0);
  1120. if(sockfd<0)
  1121. {
  1122. #ifdef USING_PRINTF
  1123. printf("socket create error\n");
  1124. #endif
  1125. }
  1126. TcpconnectID = connect(sockfd, (struct sockaddr *) server_res->ai_addr, server_res->ai_addrlen);
  1127. if(TcpconnectID<0 && errno != EINPROGRESS)
  1128. {
  1129. #ifdef USING_PRINTF
  1130. printf("Connect failed!%d\n",TcpconnectID);
  1131. #endif
  1132. closesocket(sockfd);
  1133. PROC_TCP_STATE_SWITCH(PROCESS_TCP_STATE_IDLE);
  1134. break;
  1135. }
  1136. else
  1137. {
  1138. PROC_TCP_STATE_SWITCH(PROCESS_TCP_STATE_WORK);
  1139. break;
  1140. }
  1141. }
  1142. else
  1143. {
  1144. PROC_TCP_STATE_SWITCH(PROCESS_TCP_STATE_WORK);
  1145. }
  1146. }
  1147. #ifdef USING_PRINTF
  1148. printf("tcp_statuts,%d,%d!\n",tcp_ready,TcpconnectID);
  1149. #endif
  1150. break;
  1151. }
  1152. case PROCESS_TCP_STATE_WORK:
  1153. {
  1154. #ifdef USING_PRINTF
  1155. printf("TCP_STATE_WORK!\n");
  1156. #endif
  1157. appGetPSMSettingSync(&pmode,&tau,&act);
  1158. #ifdef USING_PRINTF
  1159. printf("psm:pmode-%d,tau-%d,act-%d!\n",pmode,tau,act);
  1160. #endif
  1161. Tcp_Flag = false;
  1162. while (!Tcp_Flag)
  1163. {
  1164. switch(Tcp_Index)
  1165. {
  1166. case 0://发送登录信息
  1167. {
  1168. Tcp_Index=1;
  1169. break;
  1170. }
  1171. case 1://发送电池数据
  1172. {
  1173. NB_send_len=59+Batt_Cell_Num_2+Batt_Temp_Num;//电池数据长度
  1174. TcpSendBuffer = (uint8_t *)malloc(NB_send_len);
  1175. data_index = 0;
  1176. memset(TcpSendBuffer,0x00,NB_send_len);
  1177. *(TcpSendBuffer+0) = 0x23;
  1178. *(TcpSendBuffer+1) = 0x23;
  1179. *(TcpSendBuffer+2) = 0x02;
  1180. *(TcpSendBuffer+3) = 0xfe;
  1181. memcpy(TcpSendBuffer+4,SN,17);
  1182. *(TcpSendBuffer+21) = 0x01;//01表示不加密
  1183. Tcp_Batt_Data_Assemble();//数据组装函数
  1184. *(TcpSendBuffer+22) = data_index>>8;//数据长度
  1185. *(TcpSendBuffer+23) = data_index;//数据长度
  1186. memcpy(TcpSendBuffer+24,battbuffer,data_index);
  1187. *(TcpSendBuffer+NB_send_len-1) = bcc_chk(TcpSendBuffer,NB_send_len-1);
  1188. #ifdef USING_PRINTF
  1189. printf("battbuffer:");
  1190. for (int i = 0; i < data_index; i++)
  1191. {
  1192. printf("%x ",battbuffer[i]);
  1193. }
  1194. printf("\n");
  1195. #endif
  1196. TcpsendID = send(sockfd, TcpSendBuffer, NB_send_len, 0 );
  1197. //发送失败暂时不写
  1198. #ifdef USING_PRINTF
  1199. printf("ConnectID:%d,TcpSend:%d,data length:%d,Data: ",sockfd,TcpsendID,NB_send_len);
  1200. for (int i = 0; i < NB_send_len; i++)
  1201. {
  1202. printf("%x ",*(TcpSendBuffer+i));
  1203. }
  1204. printf("\n");
  1205. #endif
  1206. free(TcpSendBuffer);
  1207. if (TcpsendID<0)
  1208. {
  1209. closesocket(sockfd);
  1210. TcpconnectID = -1;
  1211. Tcp_Index=-1;
  1212. }
  1213. else
  1214. {
  1215. Tcp_Index=2;
  1216. }
  1217. break;
  1218. }
  1219. case 2:
  1220. {
  1221. data_index = 29;
  1222. NB_send_len = 25+29;//数据总长度:25个固定+29个GPS长度
  1223. TcpSendBuffer = (uint8_t *)malloc(NB_send_len);
  1224. memset(TcpSendBuffer,0x00,NB_send_len);
  1225. *(TcpSendBuffer+0) = 0x23;
  1226. *(TcpSendBuffer+1) = 0x23;
  1227. *(TcpSendBuffer+2) = 0x02;
  1228. *(TcpSendBuffer+3) = 0xfe;
  1229. memcpy(TcpSendBuffer+4,SN,17);
  1230. *(TcpSendBuffer+21) = 0x01;//01表示不加密
  1231. Tcp_Gps_Data_Assemble();//Gps数据组装
  1232. *(TcpSendBuffer+22) = data_index>>8;//数据长度
  1233. *(TcpSendBuffer+23) = data_index;//数据长度
  1234. memcpy(TcpSendBuffer+24,gpsbuffer,data_index);
  1235. *(TcpSendBuffer+NB_send_len-1) = bcc_chk(TcpSendBuffer,NB_send_len-1);
  1236. #ifdef USING_PRINTF
  1237. printf("ConnectID:%d,TcpSend:%d,data length:%d,Data: ",sockfd,TcpsendID,NB_send_len);
  1238. for (int i = 0; i < NB_send_len; i++)
  1239. {
  1240. printf("%x ",*(TcpSendBuffer+i));
  1241. }
  1242. printf("\n");
  1243. #endif
  1244. TcpsendID = send(sockfd, TcpSendBuffer, NB_send_len, 0 );
  1245. free(TcpSendBuffer);
  1246. if (TcpsendID<0)
  1247. {
  1248. closesocket(sockfd);
  1249. TcpconnectID = -1;
  1250. Tcp_Index=-1;
  1251. }
  1252. else
  1253. {
  1254. Tcp_Index=3;
  1255. }
  1256. break;
  1257. }
  1258. default:
  1259. {
  1260. PROC_TCP_STATE_SWITCH(PROCESS_TCP_STATE_IDLE);
  1261. Tcp_Index = 0;
  1262. Tcp_Flag = true;
  1263. }
  1264. }
  1265. }
  1266. break;
  1267. }
  1268. case PROCESS_TCP_STATE_SLEEP:
  1269. {
  1270. slpManPlatVoteEnableSleep(TcpSlpHandler, SLP_SLP2_STATE);
  1271. closesocket(sockfd);
  1272. tcp_ready = false;
  1273. deregisterPSEventCallback(socketRegisterPSUrcCallback);//注销NB网络事件函数
  1274. #ifdef USING_PRINTF
  1275. printf("TCP_STATE_SLEEP\n");
  1276. #endif
  1277. Tcp_Sleep_Flag = TRUE;
  1278. while(1)
  1279. {
  1280. osDelay(30000/portTICK_PERIOD_MS);
  1281. }
  1282. }
  1283. }
  1284. }
  1285. }
  1286. //主任务线程初始化
  1287. void Main_Task_Init()
  1288. {
  1289. #ifndef USING_PRINTF
  1290. if(BSP_GetPlatConfigItemValue(PLAT_CONFIG_ITEM_LOG_CONTROL) != 0)
  1291. {
  1292. HAL_UART_RecvFlowControl(false);
  1293. }
  1294. #endif
  1295. osThreadAttr_t task_attr;
  1296. memset(&task_attr,0,sizeof(task_attr));
  1297. memset(gProcess_Main_TaskStack, 0xA5, PROC_MAIN_TASK_STACK_SIZE);
  1298. task_attr.name = "Main_Task";
  1299. task_attr.stack_mem = gProcess_Main_TaskStack;
  1300. task_attr.stack_size = PROC_MAIN_TASK_STACK_SIZE;
  1301. task_attr.priority = osPriorityNormal;
  1302. task_attr.cb_mem = &gProcess_Main_Task_t;
  1303. task_attr.cb_size = sizeof(StaticTask_t);
  1304. osThreadNew(Main_Task, NULL, &task_attr);
  1305. }
  1306. //Uart读取线程初始化
  1307. void Uart_Task_Init()
  1308. {
  1309. osThreadAttr_t task_attr;
  1310. memset(&task_attr,0,sizeof(task_attr));
  1311. memset(gProcess_Uart_TaskStack, 0xA5, PROC_UART_TASK_STACK_SIZE);
  1312. task_attr.name = "Uart_Task";
  1313. task_attr.stack_mem = gProcess_Uart_TaskStack;
  1314. task_attr.stack_size = PROC_UART_TASK_STACK_SIZE;
  1315. task_attr.priority = osPriorityNormal;
  1316. task_attr.cb_mem = &gProcess_Uart_Task_t;
  1317. task_attr.cb_size = sizeof(StaticTask_t);
  1318. osThreadNew(Uart_Task, NULL, &task_attr);
  1319. }
  1320. //Can线程初始化
  1321. void Can_Task_Init()
  1322. {
  1323. osThreadAttr_t task_attr;
  1324. memset(&task_attr,0,sizeof(task_attr));
  1325. memset(gProcess_Can_TaskStack, 0xA5, PROC_CAN_TASK_STACK_SIZE);
  1326. task_attr.name = "Can_Task";
  1327. task_attr.stack_mem = gProcess_Can_TaskStack;
  1328. task_attr.stack_size = PROC_CAN_TASK_STACK_SIZE;
  1329. task_attr.priority = osPriorityNormal;
  1330. task_attr.cb_mem = &gProcess_Can_Task_t;
  1331. task_attr.cb_size = sizeof(StaticTask_t);
  1332. osThreadNew(Can_Task, NULL, &task_attr);
  1333. }
  1334. //Tcp线程初始化
  1335. void Tcp_Task_Init()
  1336. {
  1337. osThreadAttr_t task_attr;
  1338. registerPSEventCallback(NB_GROUP_ALL_MASK, socketRegisterPSUrcCallback);
  1339. memset(&task_attr,0,sizeof(task_attr));
  1340. memset(gProcess_Tcp_TaskStack, 0xA5, PROC_TCP_TASK_STACK_SIZE);
  1341. task_attr.name = "Tcp_Task";
  1342. task_attr.stack_mem = gProcess_Tcp_TaskStack;
  1343. task_attr.stack_size = PROC_TCP_TASK_STACK_SIZE;
  1344. task_attr.priority = osPriorityNormal;
  1345. task_attr.cb_mem = &gProcess_Tcp_Task_t;
  1346. task_attr.cb_size = sizeof(StaticTask_t);
  1347. osThreadNew(Tcp_Task, NULL, &task_attr);
  1348. }
  1349. void appInit(void *arg)
  1350. {
  1351. Main_Task_Init();
  1352. Uart_Task_Init();
  1353. Can_Task_Init();
  1354. GpsTaskInit();
  1355. Tcp_Task_Init();
  1356. }
  1357. //主函数入口
  1358. void main_entry(void) {
  1359. BSP_CommonInit();
  1360. osKernelInitialize();
  1361. registerAppEntry(appInit, NULL);
  1362. if (osKernelGetState() == osKernelReady)
  1363. {
  1364. osKernelStart();
  1365. }
  1366. while(1);
  1367. }