giant_can.c 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593
  1. /**
  2. * @file giant_can.h
  3. * @author Ye Jin
  4. * @brief giant can protocol
  5. * @version 0.1
  6. * @date 2025-01-09
  7. *
  8. * @copyright Copyright (c) 2025
  9. *
  10. */
  11. /************************************************************************
  12. Beginning of File, do not put anything above here except notes
  13. Compiler Directives:
  14. *************************************************************************/
  15. #include "can.h"
  16. #include "giant_can.h"
  17. #include "canAppl.h"
  18. #include "string.h"
  19. #include "AssistCurve.h"
  20. #include "adc.h"
  21. #include "power.h"
  22. #include "CodePara.h"
  23. #include "flash_master.h"
  24. /******************************
  25. *
  26. * Parameter
  27. *
  28. ******************************/
  29. GiantStandardDataFrameID_Struct_t stGiantStandardDataFrameID_rx;
  30. GiantStandardRemoteFrameID_Struct_t stGiantStandardRemoteFrameID_rx;
  31. GiantControlParams_Struct_t stGiantControlParams;
  32. /***************************************************************
  33. Function:
  34. Description:
  35. Call by:
  36. Input Variables: N/A
  37. Output/Return Variables: N/A
  38. Subroutine Call: N/A;
  39. Reference: N/A
  40. ****************************************************************/
  41. void giant_Init(void)
  42. {
  43. stGiantControlParams.RidingModeEn = 0;
  44. stGiantControlParams.AdjustingMode = 0x0B;//check mode
  45. }
  46. void giant_10msTask(void)
  47. {
  48. static UBYTE giant_10mscount = 0;
  49. if(power_stPowStateOut.powerstate == POWER_OFF)
  50. {
  51. return;
  52. }
  53. giant_10mscount++;
  54. if(giant_10mscount >= 5)
  55. {
  56. giant_10mscount = 0;
  57. giant_SendDriveChainActiveData(FG_NORMALDATA, 0x0);
  58. giant_SendDriveChainActiveData(FG_NORMALDATA, 0x1);
  59. giant_SendDriveChainActiveData(FG_NORMALDATA, 0x2);
  60. giant_SendDriveChainActiveData(FG_NORMALDATA, 0x3);
  61. giant_SendDriveChainActiveData(FG_NORMALDATA, 0x4);
  62. giant_SendDriveChainActiveData(FG_NORMALDATA, 0x6);
  63. giant_SendDriveChainActiveData(FG_NORMALDATA, 0x7);
  64. giant_SendDriveChainActiveData(FG_NORMALDATA, 0x8);
  65. giant_SendDriveChainActiveData(FG_NORMALDATA, 0xF);
  66. }
  67. }
  68. void giant_DataProcess(void)
  69. {
  70. if(pRxMsg2->rx_ft == CAN_FT_DATA)
  71. {
  72. stGiantStandardDataFrameID_rx.FunctionGroup = (UBYTE)((pRxMsg2->rx_sfid & 0x600)>>9);
  73. stGiantStandardDataFrameID_rx.NodeGroup = (UBYTE)((pRxMsg2->rx_sfid & 0x1E0)>>5);
  74. stGiantStandardDataFrameID_rx.DataBehaviors = (UBYTE)((pRxMsg2->rx_sfid & 0x010)>>4);
  75. stGiantStandardDataFrameID_rx.DataAddress = (UBYTE)(pRxMsg2->rx_sfid & 0x00F);
  76. switch (stGiantStandardDataFrameID_rx.NodeGroup)
  77. {
  78. case NODE_SERVICETOOL:
  79. {
  80. break;
  81. }
  82. case NODE_USERINTERFACE:
  83. {
  84. ulOBC_ComTimeOutCount = cp_ulSystickCnt;
  85. stGiantControlParams.RefreshFlag = TRUE;
  86. switch(stGiantStandardDataFrameID_rx.DataAddress)
  87. {
  88. case 0x0:
  89. {
  90. if(pRxMsg2->rx_dlen == 2)//error
  91. {
  92. stGiantControlParams.Error = (pRxMsg2->rx_data[0] & 0x01);//Error value
  93. }
  94. break;
  95. }
  96. case 0x1:
  97. {
  98. if(pRxMsg2->rx_dlen == 7)//cmd1
  99. {
  100. stGiantControlParams.ManualSleepEn = ((pRxMsg2->rx_data[0] & 0x40)>>6);//Manual sleep
  101. stGiantControlParams.AutomaticSleepEn = ((pRxMsg2->rx_data[0] & 0x20)>>5);//Automatic sleep
  102. stGiantControlParams.InactivateErrorDetection = ((pRxMsg2->rx_data[1] & 0x80)>>7);//Inactivate the error detection
  103. if((pRxMsg2->rx_data[1] & 0x10) == 0x10)//Reset fault history
  104. {
  105. }
  106. stGiantControlParams.ThrottleEn = ((pRxMsg2->rx_data[1] & 0x08)>>3);//Throttle state
  107. if((pRxMsg2->rx_data[1] & 0x04) == 0x04)//Reset trip distance and trip time
  108. {
  109. MC_RideLog.TRIP_Km = 0;
  110. MC_RideLog.TRIP_Time = 0;
  111. MC_RunInfo.Ride_Km = 0;
  112. MC_RunInfo.Ride_Time = 0;
  113. cp_stHistoryPara.ulTripSum = 0;
  114. cp_stHistoryPara.ulTripSumTime = 0;
  115. cp_stHistoryPara.ulODOTime = cp_stHistoryPara.ulODOTime + (cp_stBikeRunInfoPara.ulRiTime >> 10) / 60;
  116. cp_stBikeRunInfoPara.ulRiTime = 0;
  117. }
  118. stGiantControlParams.BrakeleEn = ((pRxMsg2->rx_data[1] & 0x02)>>1);//Brake state
  119. stGiantControlParams.WalkEn = (pRxMsg2->rx_data[1] & 0x01);//Walk
  120. if(pRxMsg2->rx_data[2] > 100)
  121. {
  122. stGiantControlParams.ThrottlePowerPercentage = 0;
  123. }
  124. else
  125. {
  126. stGiantControlParams.ThrottlePowerPercentage = pRxMsg2->rx_data[2];//Throttle power percentage %,else 0%
  127. }
  128. stGiantControlParams.RidingModeEn = ((pRxMsg2->rx_data[3] & 0x80)>>7);//Riding mode
  129. stGiantControlParams.AdjustingMode = (pRxMsg2->rx_data[3] & 0x1F);//Adjusting mode
  130. if((pRxMsg2->rx_data[4] & 0x04) == 0x04)//Reset odometer distance and odometer time
  131. {
  132. }
  133. ass_stParaCong.uwStartMode = ((pRxMsg2->rx_data[6] & 0xC0) >> 6);//Start mode,1-soft,2-normal,3-strong
  134. }
  135. break;
  136. }
  137. case 0x2:
  138. {
  139. if(pRxMsg2->rx_dlen == 7)//cmd2
  140. {
  141. if((pRxMsg2->rx_data[0] & 0x30) == 0x00)
  142. {
  143. MC_ControlCode.LightSwitch = MC_LightSwitch_OFF;//light off
  144. }
  145. else if((pRxMsg2->rx_data[0] & 0x30) == 0x10)
  146. {
  147. MC_ControlCode.LightSwitch = MC_LightSwitch_ON;//light on
  148. }
  149. else
  150. {
  151. //rsv
  152. }
  153. MC_RunInfo.LightSwitch = MC_ControlCode.LightSwitch;
  154. stGiantControlParams.WheelCircumference = (pRxMsg2->rx_data[2] + (pRxMsg2->rx_data[3]<<8));//Tire circumference,900-2500mm
  155. // if(stGiantControlParams.WheelCircumference < 900)
  156. // {
  157. // stGiantControlParams.WheelCircumference = 900;//default
  158. // }
  159. // else if(stGiantControlParams.WheelCircumference > 2500)
  160. // {
  161. // stGiantControlParams.WheelCircumference = 2500;//default
  162. // }
  163. stGiantControlParams.MaximumTorque = ((pRxMsg2->rx_data[4] & 0xF0)>>4);//Maximum torque,*10Nm
  164. // if(0 == stGiantControlParams.MaximumTorque)
  165. // {
  166. // stGiantControlParams.MaximumTorque = 0;//default
  167. // }
  168. stGiantControlParams.Acceleration = (pRxMsg2->rx_data[4] & 0x0F);//Acceleration,*30Nm/s
  169. // if(0 == stGiantControlParams.Acceleration)
  170. // {
  171. // stGiantControlParams.Acceleration = 0;//default
  172. // }
  173. stGiantControlParams.AssistRatio = pRxMsg2->rx_data[5];;//Assist ratio, *10%
  174. stGiantControlParams.MaximumPower = pRxMsg2->rx_data[6];//Maximum power, *10Watt
  175. }
  176. break;
  177. }
  178. case 0x3:
  179. {
  180. if(pRxMsg2->rx_dlen == 7)//cmd3
  181. {
  182. stGiantControlParams.SpeedLimitation = (UWORD)(pRxMsg2->rx_data[5] + (pRxMsg2->rx_data[6]<<8));//speed limitation,0.01km/h
  183. // if(0 == stGiantControlParams.SpeedLimitation)
  184. // {
  185. // stGiantControlParams.SpeedLimitation = 2500;//DU default
  186. // }
  187. }
  188. break;
  189. }
  190. default:
  191. break;
  192. }
  193. break;
  194. }
  195. case NODE_MOTINOVA:
  196. {
  197. break;
  198. }
  199. case NODE_ENERGYPACK:
  200. {
  201. ulBMS_ComTimeOutCount = cp_ulSystickCnt;
  202. switch(stGiantStandardDataFrameID_rx.DataAddress)
  203. {
  204. case 0x1:
  205. {
  206. if(pRxMsg2->rx_dlen == 8)//Capacity
  207. {
  208. BMS_RunInfo.SOC = pRxMsg2->rx_data[0];
  209. }
  210. break;
  211. }
  212. default:
  213. break;
  214. }
  215. break;
  216. }
  217. case NODE_GIANTAPP:
  218. {
  219. switch(stGiantStandardDataFrameID_rx.DataAddress)
  220. {
  221. case 0x4:
  222. {
  223. if(pRxMsg2->rx_dlen == 8)//Customized Version
  224. {
  225. memcpy(MC_RsASSCII.CustomASCII1, pRxMsg2->rx_data, 8);
  226. //执行存储操作
  227. memcpy(flash_stPara.ubRsASSCII.CustomASCII1, MC_RsASSCII.CustomASCII1, sizeof(MC_RsASSCII.CustomASCII1));
  228. }
  229. break;
  230. }
  231. default:
  232. break;
  233. }
  234. break;
  235. }
  236. default:
  237. break;
  238. }
  239. }
  240. else if(pRxMsg2->rx_ft == CAN_FT_REMOTE)
  241. {
  242. stGiantStandardRemoteFrameID_rx.MotionGroup = (UBYTE)((pRxMsg2->rx_sfid & 0x700)>>8);
  243. stGiantStandardRemoteFrameID_rx.RequireNodeGroup = (UBYTE)((pRxMsg2->rx_sfid & 0x0F0)>>4);
  244. stGiantStandardRemoteFrameID_rx.ResponseNodeGroup = (UBYTE)(pRxMsg2->rx_sfid & 0x00F);
  245. if((stGiantStandardRemoteFrameID_rx.ResponseNodeGroup == NODE_ALL) || (stGiantStandardRemoteFrameID_rx.ResponseNodeGroup == NODE_DRIVECHAIN))//
  246. {
  247. switch(stGiantStandardRemoteFrameID_rx.MotionGroup)
  248. {
  249. case MG_HEARTBEAT:
  250. {
  251. giant_SendDriveChainPassiveData(stGiantStandardRemoteFrameID_rx.MotionGroup,0xF);
  252. break;
  253. }
  254. case MG_CONFIRMATION:
  255. {
  256. giant_SendDriveChainPassiveData(stGiantStandardRemoteFrameID_rx.MotionGroup,0xF);
  257. break;
  258. }
  259. case MG_ACTIVEDATA1:
  260. {
  261. for(int i=0;i<5;i++)
  262. {
  263. giant_SendDriveChainActiveData(FG_RESPONSEDATA, i);
  264. }
  265. for(int j=6;j<8;j++)
  266. {
  267. giant_SendDriveChainActiveData(FG_RESPONSEDATA, j);
  268. }
  269. break;
  270. }
  271. case MG_ACTIVEDATA2:
  272. {
  273. giant_SendDriveChainActiveData(FG_RESPONSEDATA, 0x8);
  274. giant_SendDriveChainActiveData(FG_RESPONSEDATA, 0xF);
  275. break;
  276. }
  277. case MG_PASSIVEDATA1:
  278. {
  279. giant_SendDriveChainPassiveData(stGiantStandardRemoteFrameID_rx.MotionGroup,0x0);
  280. giant_SendDriveChainPassiveData(stGiantStandardRemoteFrameID_rx.MotionGroup,0x1);
  281. giant_SendDriveChainPassiveData(stGiantStandardRemoteFrameID_rx.MotionGroup,0x2);
  282. break;
  283. }
  284. case MG_PASSIVEDATA2:
  285. {
  286. giant_SendDriveChainPassiveData(stGiantStandardRemoteFrameID_rx.MotionGroup,0x3);
  287. giant_SendDriveChainPassiveData(stGiantStandardRemoteFrameID_rx.MotionGroup,0x4);
  288. giant_SendDriveChainPassiveData(stGiantStandardRemoteFrameID_rx.MotionGroup,0x5);
  289. break;
  290. }
  291. case MG_PASSIVEDATA3:
  292. {
  293. break;
  294. }
  295. case MG_PASSIVEDATA4:
  296. {
  297. giant_SendDriveChainPassiveData(stGiantStandardRemoteFrameID_rx.MotionGroup,0xB);
  298. giant_SendDriveChainPassiveData(stGiantStandardRemoteFrameID_rx.MotionGroup,0xC);
  299. break;
  300. }
  301. default:
  302. break;
  303. }
  304. }
  305. }
  306. }
  307. void giant_SendDriveChainPassiveData(UBYTE remoteMG, UBYTE DataAddr)
  308. {
  309. UBYTE len = 8;
  310. UBYTE data[8] = {0,};
  311. UWORD ID = 0;
  312. ID = ((FG_RESPONSEDATA<<9)
  313. |(NODE_DRIVECHAIN<<5)
  314. |(DB_PASSIVEDATA<<4)
  315. |DataAddr);
  316. switch(DataAddr)
  317. {
  318. case 0x0:
  319. {
  320. memcpy(data, MC_VerInfo.Mode, 8);//Mode name
  321. break;
  322. }
  323. case 0x1:
  324. {
  325. memcpy(data, MC_VerInfo.FW_Version, 8);//FW1
  326. break;
  327. }
  328. case 0x2:
  329. {
  330. memcpy(data, &MC_VerInfo.FW_Version[8], 8);//FW2
  331. break;
  332. }
  333. case 0x3:
  334. {
  335. memcpy(data, MC_VerInfo.HW_Version, 8);//HW1
  336. break;
  337. }
  338. case 0x4:
  339. {
  340. memcpy(data, &MC_VerInfo.HW_Version[8], 8);//HW2
  341. break;
  342. }
  343. case 0x5:
  344. {
  345. memcpy(data, MC_RsASSCII.CustomASCII1, 8);//Customized Version
  346. break;
  347. }
  348. case 0xB:
  349. {
  350. memcpy(data, MC_VerInfo.SN_Num, 8);//SN1
  351. break;
  352. }
  353. case 0xC:
  354. {
  355. memcpy(data, &MC_VerInfo.SN_Num[8], 8);//SN2
  356. break;
  357. }
  358. case 0xF:
  359. {
  360. len = 4;
  361. data[0] = 0x1;//success
  362. memcpy(&data[1], &stGiantControlParams.WheelCircumference, 2);//circumference
  363. data[3] = (UBYTE)ass_stParaCong.swDeltPerimeter;
  364. break;
  365. }
  366. default:
  367. break;
  368. }
  369. CAN_SendData(ID, data, len);
  370. }
  371. void giant_SendDriveChainActiveData(UBYTE functiongroup, UBYTE dataaddr)
  372. {
  373. UBYTE len = 8;
  374. UBYTE data[8] = {0,};
  375. UWORD ID = 0;
  376. ID = ((functiongroup<<9)
  377. |(NODE_DRIVECHAIN<<5)
  378. |(DB_ACTIVEDATA<<4)
  379. |dataaddr);
  380. switch(dataaddr)
  381. {
  382. case 0x0: //Error
  383. {
  384. len = 2;
  385. if(0)
  386. {
  387. data[0] |= 0x01;// Corresponding error occurs
  388. }
  389. else
  390. {
  391. data[0] &= 0xFE;// Corresponding error was gone
  392. }
  393. data[1] = 0x60;//Error code-Normal
  394. break;
  395. }
  396. case 0x1: //Cycling State
  397. {
  398. len = 5;
  399. data[0] |= 0x00;//Communication sleep
  400. if(MC_RunInfo.LightSwitch == MC_LightSwitch_ON)
  401. {
  402. data[2] |= (0x01<<6);
  403. }
  404. data[2] |= (ass_stParaCong.uwStartMode<<4);
  405. data[2] |= (MC_RunInfo.CadenceDir<<2);
  406. data[3] = (UBYTE)(stGiantControlParams.SpeedLimitation & 0xFF);// speed limitation,0.01km/h
  407. data[4] = (UBYTE)((stGiantControlParams.SpeedLimitation & 0xFF00) >> 8);
  408. break;
  409. }
  410. case 0x2: //Cycling data
  411. {
  412. len = 8;
  413. data[0] = (UBYTE)(MC_RunInfo.BikeSpeed & 0xFF);// bike speed,0.1km/h
  414. data[1] = (UBYTE)((MC_RunInfo.BikeSpeed & 0xFF00) >> 8);
  415. data[2] = (UBYTE)((MC_RunInfo.Torque*10) & 0xFF);// pedal torque,0.1Nm
  416. data[3] = (UBYTE)(((MC_RunInfo.Torque*10) & 0xFF00) >> 8);
  417. data[4] = (UBYTE)((MC_RunInfo.Cadence*10) & 0xFF);// cadence,0.1RPM
  418. data[5] = (UBYTE)(((MC_RunInfo.Cadence*10) & 0xFF00) >> 8);
  419. data[6] = (UBYTE)((MC_RunInfo.BusCurrent/10) & 0xFF);// phase current,0.01A
  420. data[7] = (UBYTE)(((MC_RunInfo.BusCurrent/10) & 0xFF00) >> 8);
  421. break;
  422. }
  423. case 0x3: //cycling data 1
  424. {
  425. len = 8;
  426. if(blBMSCommFault == TRUE)
  427. {
  428. data[1] = MC_RunInfo.SOC;//%
  429. }
  430. else
  431. {
  432. data[1] = 0xFF;
  433. }
  434. data[2] = (UBYTE)(MC_RideLog.TRIP_Km & 0xFF);// trip distance,0.1km
  435. data[3] = (UBYTE)((MC_RideLog.TRIP_Km & 0xFF00) >> 8);
  436. data[4] = (UBYTE)(MC_RideLog.TRIP_Time & 0xFF);// trip time,min
  437. data[5] = (UBYTE)((MC_RideLog.TRIP_Time & 0xFF00) >> 8);
  438. data[6] = (UBYTE)((MC_RideLog.ODO_Km /10) & 0xFF);// odometer distance,km
  439. data[7] = (UBYTE)(((MC_RideLog.ODO_Km /10) & 0xFF00) >> 8);
  440. break;
  441. }
  442. case 0x4:
  443. {
  444. len = 8;
  445. data[0] = (UBYTE)((MC_RideLog.ODO_Time/60) & 0xFF);// odometer time,h
  446. data[1] = (UBYTE)(((MC_RideLog.ODO_Time/60) & 0xFF00) >> 8);
  447. if(adc_stUpOut.PCBTemp>254)
  448. {
  449. data[2] = 127;
  450. data[5] = 127;
  451. }
  452. else if(adc_stUpOut.PCBTemp>127)
  453. {
  454. data[2] = 127;
  455. data[5] = (UBYTE)(adc_stUpOut.PCBTemp/2);
  456. }
  457. else
  458. {
  459. data[2] = (UBYTE)adc_stUpOut.PCBTemp;
  460. data[5] = (UBYTE)(adc_stUpOut.PCBTemp/2);
  461. }
  462. break;
  463. }
  464. case 0x6:
  465. {
  466. len = 8;
  467. data[0] = (UBYTE)(MC_RunInfo.BusVoltage & 0xFF);// bus input voltage,mV
  468. data[1] = (UBYTE)((MC_RunInfo.BusVoltage & 0xFF00) >> 8);
  469. data[2] = (UBYTE)((BMS_VoltEstimat.uwIbusLpf/10) & 0xFF);//bus input current,0.01A
  470. data[3] = (UBYTE)(((BMS_VoltEstimat.uwIbusLpf/10) & 0xFF00) >> 8);
  471. data[4] = (UBYTE)(MC_RunInfo.MotorSpeed & 0xFF);// motor rotor speed,RPM
  472. data[5] = (UBYTE)((MC_RunInfo.MotorSpeed & 0xFF00) >> 8);
  473. // data[6] = (UBYTE)(MC_RunInfo.RemainDistance & 0xFF);// remaining range of drive chain system,km
  474. // data[7] = (UBYTE)((MC_RunInfo.RemainDistance & 0xFF00) >> 8);
  475. break;
  476. }
  477. case 0x7:
  478. {
  479. len = 8;
  480. data[0] = (UBYTE)(MC_RunInfo.Ride_Km & 0xFF);// ride distance after power on,0.1km
  481. data[1] = (UBYTE)((MC_RunInfo.Ride_Km & 0xFF00) >> 8);
  482. data[2] = (UBYTE)((MC_RunInfo.Ride_Time/60) & 0xFF);//ride time after power on,min
  483. data[3] = (UBYTE)(((MC_RunInfo.Ride_Time/60) & 0xFF00) >> 8);
  484. // data[4] = (UBYTE)((MC_RideLog.ODO_Km/10) & 0xFF);// total ride distance Can’t be reset
  485. // data[5] = (UBYTE)(((MC_RideLog.ODO_Km/10) & 0xFF00) >> 8);
  486. // data[6] = (UBYTE)((MC_RideLog.ODO_Time/60) & 0xFF);// rtotal ride time Can’t be reset
  487. // data[7] = (UBYTE)(((MC_RideLog.ODO_Time/60) & 0xFF00) >> 8);
  488. break;
  489. }
  490. case 0x8:
  491. {
  492. len = 5;
  493. data[0] = stGiantControlParams.AssistRatio;// Assist ratio state
  494. data[1] = stGiantControlParams.MaximumPower;//Maximum power
  495. data[2] = (stGiantControlParams.MaximumTorque<<4)|(stGiantControlParams.Acceleration);// rtotal ride time Can’t be reset
  496. if(adc_stUpOut.PCBTemp>254)
  497. {
  498. data[3] = 127;
  499. }
  500. else
  501. {
  502. data[3] = (UBYTE)(adc_stUpOut.PCBTemp/2);
  503. }
  504. data[4] = MC_RunInfo.PowerPerKm;//Average power consumption ,0.01Ah/km
  505. break;
  506. }
  507. case 0xF:
  508. {
  509. len = 6;
  510. // data[4] = (UBYTE)(MC_RunInfo.RemainDistance & 0xFF);// human power
  511. // data[5] = (UBYTE)((MC_RunInfo.RemainDistance & 0xFF00) >> 8);
  512. break;
  513. }
  514. default:
  515. break;
  516. }
  517. CAN_SendData(ID, data, len);
  518. }
  519. void giant_CANRxData_Process(void)
  520. {
  521. if(stGiantControlParams.RefreshFlag)
  522. {
  523. stGiantControlParams.RefreshFlag = FALSE;
  524. if((stGiantControlParams.AdjustingMode == 0xC) || (stGiantControlParams.ManualSleepEn) || (stGiantControlParams.AutomaticSleepEn) || ((cp_ulSystickCnt - ulOBC_ComTimeOutCount) < 1500))//Off state
  525. {
  526. power_stPowStateOut.powerstate = POWER_OFF;
  527. power_stPowStateOut.blPowerStartupFlg = FALSE;
  528. }
  529. if((stGiantControlParams.AdjustingMode >= AD_SERVICEMODE) && (stGiantControlParams.AdjustingMode <= AD_ERRORMODE))
  530. {
  531. MC_ControlCode.GearSt = MC_GearSt_OFF;
  532. }
  533. else if(stGiantControlParams.AssistRatio == 0)
  534. {
  535. MC_ControlCode.GearSt = MC_GearSt_OFF;
  536. }
  537. else if(stGiantControlParams.RidingModeEn == 0)
  538. {
  539. MC_ControlCode.GearSt = MC_GearSt_OFF;
  540. }
  541. else if(stGiantControlParams.WalkEn == 1)
  542. {
  543. MC_ControlCode.GearSt = MC_GearSt_WALK;
  544. }
  545. else
  546. {
  547. MC_ControlCode.GearSt = MC_GearSt_Torque_ECO;
  548. }
  549. MC_RunInfo.GearSt = (UBYTE)MC_ControlCode.GearSt;
  550. if(stGiantControlParams.AdjustingMode == AD_CHECKMODE)
  551. {
  552. ass_stParaCong.uwWheelPerimeter = stGiantControlParams.WheelCircumference;
  553. }
  554. }
  555. }
  556. /*************************************************************************
  557. End of this File (EOF)!
  558. Do not put anything after this part!
  559. *************************************************************************/