Module_EvRxComm.c 29 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <stdint.h>
  4. #include <string.h>
  5. #include <fcntl.h>
  6. #include <unistd.h>
  7. #include <sys/stat.h>
  8. #include <linux/can.h>
  9. #include <linux/can/raw.h>
  10. #include "../Config.h"
  11. #include "../Log/log.h"
  12. #include "../Define/define.h"
  13. #include "../ShareMemory/shmMem.h"
  14. #include "Ev_Comm.h"
  15. #include "Module_EvComm.h"
  16. //------------------------------------------------------------------------------
  17. static struct SysConfigData *pSysConfig = NULL;
  18. static struct SysInfoData *pSysInfo = NULL;
  19. static struct WARNING_CODE_INFO *pSysWarning = NULL;
  20. static struct AlarmCodeData *pAlarmCode = NULL;
  21. static struct CHAdeMOData *ShmCHAdeMOData = NULL;
  22. static struct GBTData *ShmGBTData = NULL;
  23. static struct CcsData *ShmCcsData = NULL;
  24. static struct FanModuleData *ShmFanModuleData = NULL;
  25. static DcCommonInfo *ShmDcCommonData = NULL;
  26. #define TempArraySize 10
  27. uint8_t TempArray_1[TempArraySize]={0};
  28. uint8_t TempArray_2[TempArraySize]={0};
  29. uint8_t ptemp_1 = 0;
  30. uint8_t ptemp_2 = 0;
  31. bool firstcircule = true;
  32. //------------------------------------------------------------------------------
  33. extern bool AbnormalStopAnalysis(uint8_t gun_index, uint8_t *errCode);
  34. //------------------------------------------------------------------------------
  35. /*static uint8_t getMaxConnectTempAndChiller(uint8_t headTemp1, uint8_t headTemp2,
  36. uint8_t chillerTemp1, uint8_t chillerTemp2)
  37. {
  38. uint8_t i = 0;
  39. uint8_t tempSource[4] = {headTemp1, headTemp2, chillerTemp1, chillerTemp2};
  40. uint8_t maxTemp = 0;
  41. if (headTemp1 == UNDEFINED_TEMP &&
  42. headTemp2 == UNDEFINED_TEMP &&
  43. chillerTemp1 == UNDEFINED_TEMP &&
  44. chillerTemp2 == UNDEFINED_TEMP) {
  45. return UNDEFINED_TEMP;
  46. }
  47. //先取得第一個非UNDEFINED_TEMP的值
  48. for (i = 0; i < (sizeof(tempSource) / sizeof(uint8_t)); i++) {
  49. if (tempSource[i] != UNDEFINED_TEMP) {
  50. maxTemp = tempSource[i];
  51. break;
  52. }
  53. }
  54. //找最大的溫度值
  55. for (i = 0; i < (sizeof(tempSource) / sizeof(uint8_t)); i++) {
  56. if (tempSource[i] != UNDEFINED_TEMP) {
  57. if (maxTemp < tempSource[i]) {
  58. maxTemp = tempSource[i];
  59. }
  60. }
  61. }
  62. return maxTemp;
  63. }
  64. */
  65. static uint8_t getAvageTemp(uint8_t value,uint8_t gun)
  66. {
  67. uint16_t avagetemp = 0;
  68. int i;
  69. uint8_t ptr = 0;
  70. uint8_t *pArray;
  71. if(gun == 0) {
  72. pArray = &TempArray_1;
  73. ptr = ptemp_1;
  74. } else {
  75. pArray = &TempArray_2;
  76. ptr = ptemp_2;
  77. }
  78. pArray[ptr] = value;
  79. for(i=0;i<TempArraySize;i++)
  80. avagetemp+=pArray[i];
  81. if (firstcircule) {
  82. avagetemp/=(ptr+1);
  83. } else {
  84. avagetemp/=TempArraySize;
  85. }
  86. ptr++;
  87. if(ptr >= TempArraySize){
  88. ptr = 0;
  89. firstcircule = false;
  90. }
  91. if(gun == 0 )
  92. ptemp_1 = ptr;
  93. else
  94. ptemp_2 = ptr;
  95. if(avagetemp > TEMP_BOUNDARY)
  96. return UNDEFINED_TEMP;
  97. return avagetemp;
  98. }
  99. static uint8_t getMaxConnectTemp(uint8_t headTemp1, uint8_t headTemp2)
  100. {
  101. uint8_t maxTemp = 0;
  102. if (headTemp1 > TEMP_BOUNDARY &&
  103. headTemp2 > TEMP_BOUNDARY) {
  104. return UNDEFINED_TEMP;
  105. }
  106. if (headTemp1 <= TEMP_BOUNDARY) {
  107. maxTemp = headTemp1;
  108. }
  109. if (headTemp2 <= TEMP_BOUNDARY) {
  110. if (headTemp2 > maxTemp) {
  111. maxTemp = headTemp2;
  112. }
  113. }
  114. return maxTemp;
  115. }
  116. static float ReadAdcVolt(uint8_t AdcChannel)
  117. {
  118. //AIN0=CCS GUN Temp 1
  119. //AIN1=CCS GUN Temp 2
  120. //AIN2=CCS_Proximity/2
  121. //AIN3=pilot voltage
  122. int fd = -1;
  123. uint8_t str[64] = {0};
  124. uint8_t AdcValue[8] = {'\0'};
  125. if (AdcChannel > 7) {
  126. return -1;
  127. }
  128. sprintf((char *)str, "/sys/bus/iio/devices/iio\:device0/in_voltage%d_raw", AdcChannel);
  129. fd = open((char *)str, O_RDONLY);
  130. read(fd, AdcValue, 4);
  131. close(fd);
  132. return (1.8 * atoi((char *)&AdcValue[0])) / 4095;
  133. //return (1.8 * atoi((char *)&AdcValue)) / 4095;
  134. }
  135. static void getChillerTemperature(ChillerTemp *chillerTemp)
  136. {
  137. uint8_t i = 0;
  138. float adcVoltage = 0.0;
  139. ChillerTemp *pChillerTemp = (ChillerTemp *)chillerTemp;
  140. for (i = 0; i < 4; i++) {
  141. adcVoltage = 0.0;
  142. adcVoltage = ReadAdcVolt(i);
  143. if ((adcVoltage <= 0.9) && (adcVoltage >= 0.8)) { //0 ~ -40
  144. pChillerTemp->Temp[i] = ((adcVoltage - 0.908) * 500) + 60;
  145. //log_info("1 adcVoltage = %f", (adcVoltage - 0.9) * 500);
  146. } else if ((adcVoltage <= 1.07) && (adcVoltage > 0.9)) {
  147. pChillerTemp->Temp[i] = ((adcVoltage - 0.91) * 705.88) + 60;
  148. //log_info("2 adcVoltage = %f", (adcVoltage - 0.9) * 500);
  149. } else {
  150. pChillerTemp->Temp[i] = UNDEFINED_TEMP;
  151. }
  152. /*CcsConnectorTemp1 = ReadAdcVolt(i);
  153. if ((CcsConnectorTemp1 <= 0.9) && (CcsConnectorTemp1 >= 0.8)) { //0 ~ -40
  154. CcsConnectorTemp1 = (CcsConnectorTemp1 - 0.9) * 500;
  155. } else if ((CcsConnectorTemp1 <= 1.07) && (CcsConnectorTemp1 > 0.9)) {
  156. CcsConnectorTemp1 = (CcsConnectorTemp1 - 0.9) * 705.88;
  157. } else {
  158. CcsConnectorTemp1 = 195; //not available
  159. }
  160. CcsConnectorTemp |= ((unsigned int)(CcsConnectorTemp1 + 60) & 0xFF) << (i * 8); //0x00(-60)~0xFE(194)
  161. */
  162. }
  163. }
  164. static void AddrAssignment(uint8_t *data)
  165. {
  166. uint8_t target_number[8];
  167. uint8_t index = 0x00;
  168. struct ChargingInfoData *pDcChargingInfo = NULL;
  169. memcpy(target_number, data, sizeof(target_number));
  170. index = *(data + 4);
  171. if (pSysConfig->TotalConnectorCount == 1) {
  172. index = 0x01;
  173. }
  174. //if (CheckUniqNumber(index)) {
  175. pDcChargingInfo = (struct ChargingInfoData *)GetDcChargingInfoData(index - 1);
  176. //DS60-120 add
  177. if (pDcChargingInfo->Type == _Type_Chademo) {
  178. log_info("Set EV board info : (Chademo) TargetAddr = %d ", index);
  179. } else if (pDcChargingInfo->Type == _Type_CCS_2) {
  180. log_info("Set EV board info : (CCS) TargetAddr = %d ", index);
  181. } else if (pDcChargingInfo->Type == _Type_GB) {
  182. log_info("Set EV board info : (GB) TargetAddr = %d ", index);
  183. }
  184. //log_info("EV board id = %x ", index); //DS60-120 remove
  185. //log_info("target_number[0] = %x ", target_number[0]);
  186. //log_info("target_number[1] = %x ", target_number[1]);
  187. //log_info("target_number[2] = %x ", target_number[2]);
  188. //log_info("target_number[3] = %x ", target_number[3]);
  189. //log_info("target_number[4] = %x ", target_number[4]);
  190. log_info("SetTargetAddr = %d, type = %d ", index, pDcChargingInfo->Type);
  191. SetTargetAddr(target_number, index);
  192. //}
  193. }
  194. void CANReceiver(int fd)
  195. {
  196. pid_t canRecPid;
  197. canRecPid = fork();
  198. if (canRecPid < 0) {
  199. log_error("Create CAN Bus receive task failed");
  200. return;
  201. }
  202. if (canRecPid == 0) {
  203. int isContinue = 1;
  204. int nbytes;
  205. int intCmd;
  206. uint8_t _index = 0;
  207. uint8_t recvID = 0;
  208. uint8_t targetGun = 0x00;
  209. uint8_t gunTypeIndex = 0;
  210. uint8_t ver[16] = {0};
  211. uint8_t printChillerTemp = NO;
  212. uint8_t printConnTemp = NO;
  213. uint8_t chillerTemp[2] = {0, 0};
  214. uint8_t maxChillerTemp = 0;
  215. uint8_t lastChillerTemp = 0;
  216. uint8_t maxConnTemp = 0;
  217. uint8_t lastConnTemp[2] = {0, 0};
  218. struct can_frame frame;
  219. ChillerTemp chiilerTemp = {0};
  220. struct ChargingInfoData *pDcChargingInfo = NULL;
  221. pSysConfig = (struct SysConfigData *)GetShmSysConfigData();
  222. pSysInfo = (struct SysInfoData *)GetShmSysInfoData();
  223. pSysWarning = (struct WARNING_CODE_INFO *)GetShmSysWarningInfo();
  224. pAlarmCode = (struct AlarmCodeData *)GetShmAlarmCodeData();
  225. ShmCHAdeMOData = (struct CHAdeMOData *)GetShmCHAdeMOData();
  226. ShmGBTData = (struct GBTData *)GetShmGBTData();
  227. ShmCcsData = (struct CcsData *)GetShmCcsData();
  228. ShmDcCommonData = (DcCommonInfo *)GetShmDcCommonData();
  229. ShmFanModuleData = (struct FanModuleData *)GetShmFanModuleData();
  230. //log_info("Module_EvRXComm Child's PID is %d", getpid());
  231. while (isContinue) {
  232. memset(&frame, 0, sizeof(struct can_frame));
  233. nbytes = read(fd, &frame, sizeof(struct can_frame));
  234. if (nbytes <= 0) {
  235. usleep(10000);
  236. continue;
  237. }
  238. recvID = 0;
  239. targetGun = 0x00;
  240. intCmd = (int) (frame.can_id & CAN_EFF_MASK);
  241. if (intCmd == ADDRESS_REQ) {
  242. //ShmDcCommonData->CcsVersion = _CCS_VERSION_CHECK_TAG_V013S0;
  243. AddrAssignment(frame.data);
  244. continue;
  245. }
  246. intCmd = (int) (frame.can_id & CAN_EFF_MASK & 0xFFFFFF00);
  247. recvID = ((uint8_t) (frame.can_id & 0x000000FF)); // 0x01 or 0x02
  248. for (_index = 0; _index < pSysConfig->TotalConnectorCount; _index++) { // 假設有找到回應的 Index
  249. pDcChargingInfo = (struct ChargingInfoData *)GetDcChargingInfoData(_index);
  250. //if (gun_count == 1 &&
  251. // _chargingData[_index]->Type == _Type_CCS_2 &&
  252. // ShmDcCommonData->CcsVersion == _CCS_VERSION_CHECK_TAG_V015S0) {
  253. // target -= 1;
  254. //}
  255. if (pDcChargingInfo->Evboard_id == recvID) {
  256. targetGun = _index;
  257. break;
  258. }
  259. }
  260. if ((targetGun < 0) || (targetGun >= CHAdeMO_QUANTITY + CCS_QUANTITY + GB_QUANTITY)) {
  261. log_info("EvComm (CANReceiver) : Target index = %x is < 0 or > QUANTITY ", targetGun);
  262. usleep(10000);
  263. continue;
  264. }
  265. //else if (gun_count == 1 && targetGun == 0 && findIndex == 1 &&
  266. // ShmDcCommonData->CcsVersion == _CCS_VERSION_CHECK_TAG_V015S0) {
  267. // // 這樣的條件下~ 也是單槍 CCS 舊版本的狀況 : 因為舊版 CCS 不會 timeout, then send request id
  268. // ShmDcCommonData->CcsVersion = _CCS_VERSION_CHECK_TAG_V013S0;
  269. //}
  270. if (intCmd == 256) {
  271. log_info("EvComm command = 256");
  272. usleep(10000);
  273. continue;
  274. }
  275. pDcChargingInfo = (struct ChargingInfoData *)GetDcChargingInfoData(targetGun);
  276. gunTypeIndex = pDcChargingInfo->type_index;
  277. switch (intCmd) {
  278. case NOTIFICATION_EV_STATUS:
  279. if (pDcChargingInfo->ConnectorPlugIn != frame.data[0]) {
  280. if (frame.data[0] == PLUG) {
  281. log_info("Conn %d, Plugin. ", targetGun);
  282. pDcChargingInfo->isEVCCIDVerify = false;
  283. #ifdef DD360Audi
  284. if (pSysConfig->isAuthrizeByEVCCID)
  285. pSysInfo->CurGunSelected = targetGun;
  286. #endif
  287. } else if (frame.data[0] == UNPLUG) {
  288. log_info("Conn %d, Unplug. ", targetGun);
  289. strcpy( (char *) pDcChargingInfo->EVCCID, "");
  290. } else {
  291. log_info("Conn %d, None Check. (%d) ", targetGun, frame.data[0]);
  292. }
  293. }
  294. pDcChargingInfo->ConnectorPlugIn = frame.data[0];
  295. pDcChargingInfo->PilotVoltage = frame.data[1];
  296. //log_info("index = %d, ConnectorPlugIn = %x, data[0] = %x ",
  297. // targetGun,
  298. // pDcChargingInfo->ConnectorPlugIn,
  299. // frame.data[0]);
  300. //log_info("ConnectorPlugIn = %x ", (-120 + frame.data[1]) / 10);
  301. break;
  302. case ACK_EV_FW_VERSION:
  303. memset(ver, 0, sizeof(ver));
  304. if (pDcChargingInfo->Type == _Type_Chademo) {
  305. memcpy(ver, frame.data, frame.can_dlc);
  306. memcpy(ShmCHAdeMOData->evse[gunTypeIndex].version, ver, ARRAY_SIZE(ver));
  307. ShmCHAdeMOData->evse[gunTypeIndex].SelfTest_Comp = PASS;
  308. log_info("chademo ver. : %s", ShmCHAdeMOData->evse[gunTypeIndex].version);
  309. } else if (pDcChargingInfo->Type == _Type_GB) {
  310. memcpy(ver, frame.data, frame.can_dlc);
  311. memcpy(ShmGBTData->evse[gunTypeIndex].version, ver, ARRAY_SIZE(ver));
  312. ShmGBTData->evse[gunTypeIndex].SelfTest_Comp = PASS;
  313. log_info("gbt ver. : %s", ShmGBTData->evse[gunTypeIndex].version);
  314. } else if (pDcChargingInfo->Type == _Type_CCS_2) {
  315. if (ShmCcsData->CommProtocol == _CCS_COMM_V2GMessage_DIN70121) {
  316. memcpy(ver, frame.data, frame.can_dlc); //DS60-120 add
  317. //for (uint8_t _vCount = 0, _vPoint = 0; _vCount < frame.can_dlc; _vCount++) {//DS60-120 remove
  318. /*if (_vCount % 2 == 0 && _vCount != 0)
  319. {
  320. ver[_vCount + _vPoint] = 0x2E;
  321. _vPoint++;
  322. }*/
  323. //ver[_vCount + _vPoint] = frame.data[_vCount];
  324. //}
  325. memcpy(&ShmCcsData->V2GMessage_DIN70121[gunTypeIndex].version, ver, ARRAY_SIZE(ver));
  326. ShmCcsData->V2GMessage_DIN70121[gunTypeIndex].SelfTest_Comp = PASS;
  327. log_info("CCS FW = %s ", ShmCcsData->V2GMessage_DIN70121[gunTypeIndex].version);
  328. }
  329. }
  330. if (targetGun == 0) {
  331. memset(pSysInfo->Connector1FwRev,
  332. 0,
  333. sizeof(pSysInfo->Connector1FwRev));
  334. memcpy(pSysInfo->Connector1FwRev, ver, ARRAY_SIZE(ver));
  335. } else if (targetGun == 1) {
  336. memset(pSysInfo->Connector2FwRev,
  337. 0,
  338. sizeof(pSysInfo->Connector2FwRev));
  339. memcpy(pSysInfo->Connector2FwRev, ver, ARRAY_SIZE(ver));
  340. }
  341. break;
  342. case ACK_EV_HW_VERSION:
  343. //log_info("Get EV HW = %s ", frame.data);
  344. break;
  345. case ACK_GET_OUTPUT_REQ:
  346. //DS60-120 add
  347. if ((pDcChargingInfo->SystemStatus >= S_PREPARING_FOR_EV &&
  348. pDcChargingInfo->SystemStatus <= S_CHARGING) ||
  349. (pDcChargingInfo->SystemStatus >= S_CCS_PRECHARGE_ST0 &&
  350. pDcChargingInfo->SystemStatus <= S_CCS_PRECHARGE_ST1)
  351. ) {
  352. if (pDcChargingInfo->EvBatteryStartSoc <= 0 &&
  353. pDcChargingInfo->SystemStatus >= S_PREPARING_FOR_EVSE) {
  354. pDcChargingInfo->EvBatteryStartSoc = frame.data[1];
  355. }
  356. if (frame.data[1] > pDcChargingInfo->EvBatterySoc) {
  357. pDcChargingInfo->EvBatterySoc = frame.data[1];
  358. }
  359. }
  360. //pDcChargingInfo->EvBatterySoc = frame.data[1]; //DS60-120 remove
  361. //Jerry add set voltage limit
  362. pDcChargingInfo->EvBatterytargetVoltage = (float)((frame.data[3] << 8) + frame.data[2]) / 10;
  363. if (pDcChargingInfo->EvBatterytargetVoltage > (GetMaxChargingVol(targetGun) * 0.1)) {
  364. pDcChargingInfo->EvBatterytargetVoltage = (GetMaxChargingVol(targetGun) * 0.1);
  365. }
  366. //printf("id = %d, EvBatterytargetVoltage = %.2f", targetGun, pDcChargingInfo->EvBatterytargetVoltage);
  367. //Jerry add set currency limit
  368. pDcChargingInfo->EvBatterytargetCurrent = (float)((frame.data[5] << 8) + frame.data[4]) / 10;
  369. if (pDcChargingInfo->EvBatterytargetCurrent > (GetMaxCharginigCur(targetGun) * 0.1)) {
  370. pDcChargingInfo->EvBatterytargetCurrent = (GetMaxCharginigCur(targetGun) * 0.1);
  371. }
  372. //printf("id = %d, EvBatterytargetCurrent = %.2f", targetGun, pDcChargingInfo->EvBatterytargetCurrent);
  373. pDcChargingInfo->RemainChargingDuration = ((short) frame.data[7] << 8) + (short) frame.data[6];
  374. //printf("RemainChargingDuration = %d", pDcChargingInfo->RemainChargingDuration);
  375. if (pDcChargingInfo->Type == _Type_Chademo) {
  376. //if (ShmCHAdeMOData->ev[gunTypeIndex].EvDetection != frame.data[0])
  377. {
  378. ShmCHAdeMOData->ev[gunTypeIndex].PresentMsgFlowStatus = frame.data[0];
  379. }
  380. ShmCHAdeMOData->ev[gunTypeIndex].EvDetection = frame.data[0];
  381. ShmCHAdeMOData->ev[gunTypeIndex].SOC = pDcChargingInfo->EvBatterySoc;
  382. ShmCHAdeMOData->ev[gunTypeIndex].TargetBatteryVoltage = (pDcChargingInfo->EvBatterytargetVoltage * 10);
  383. ShmCHAdeMOData->ev[gunTypeIndex].ChargingCurrentRequest = (pDcChargingInfo->EvBatterytargetCurrent * 10);
  384. } else if (pDcChargingInfo->Type == _Type_GB) {
  385. //if (ShmGBTData->ev[gunTypeIndex].EvDetection != frame.data[0])
  386. {
  387. ShmGBTData->ev[gunTypeIndex].PresentMsgFlowStatus = frame.data[0];
  388. }
  389. ShmGBTData->ev[gunTypeIndex].EvDetection = frame.data[0];
  390. ShmGBTData->ev[gunTypeIndex].SOC = pDcChargingInfo->EvBatterySoc;
  391. ShmGBTData->ev[gunTypeIndex].TargetBatteryVoltage = (pDcChargingInfo->EvBatterytargetVoltage * 10);
  392. ShmGBTData->ev[gunTypeIndex].ChargingCurrentRequest = (pDcChargingInfo->EvBatterytargetCurrent * 10);
  393. } else if (pDcChargingInfo->Type == _Type_CCS_2) {
  394. if (ShmCcsData->CommProtocol == _CCS_COMM_V2GMessage_DIN70121) {
  395. ShmCcsData->V2GMessage_DIN70121[gunTypeIndex].PresentMsgFlowStatus = frame.data[0];
  396. }
  397. }
  398. //log_info("EvBatterytargetVoltage = %f ", pDcChargingInfo->EvBatterytargetVoltage);
  399. //log_info("EvBatterytargetCurrent = %f ", pDcChargingInfo->EvBatterytargetCurrent);
  400. //log_info("BatteryVoltage = %d ",
  401. // ShmCHAdeMOData->ev[_chargingData[target]->type_index].TargetBatteryVoltage);
  402. //log_info("CurrentRequest = %d ",
  403. // ShmCHAdeMOData->ev[_chargingData[target]->type_index].ChargingCurrentRequest);
  404. break;
  405. case ACK_GET_EV_BATTERY_INFO:
  406. //_chargingData[target].EvACorDCcharging = frame.data[0];
  407. //_chargingData[target]->TotalBatteryCap = ((float) frame.data[4] << 8) + (short) frame.data[3];
  408. pDcChargingInfo->EvBatteryMaxVoltage = ((float)(((uint16_t)frame.data[4] << 8) + (uint16_t)frame.data[3])) / 10;
  409. //_chargingData[target]->EvBatteryMaxCurrent = ((float) frame.data[4] << 8) + (short) frame.data[3];
  410. //_chargingData[target].MaxiBatteryCurrent = ((short) frame.data[6] << 8) + (short) frame.data[5];
  411. if (pDcChargingInfo->Type == _Type_Chademo) {
  412. ShmCHAdeMOData->ev[gunTypeIndex].TotalBatteryCapacity = ((uint16_t)frame.data[2] << 8) + (uint16_t)frame.data[1];
  413. ShmCHAdeMOData->ev[gunTypeIndex].MaxiBatteryVoltage = pDcChargingInfo->EvBatteryMaxVoltage;
  414. //log_info("EvBatteryMaxVoltage = %f ", _chargingData[target]->EvBatteryMaxVoltage);
  415. //log_info("TotalBatteryCapacity = %d ", ShmCHAdeMOData->ev[_chargingData[target]->type_index].TotalBatteryCapacity);
  416. //log_info("MaxiBatteryVoltage = %d ", ShmCHAdeMOData->ev[_chargingData[target]->type_index].MaxiBatteryVoltage);
  417. } else if (pDcChargingInfo->Type == _Type_GB) {
  418. ShmGBTData->ev[gunTypeIndex].TotalBatteryCapacity = ((uint16_t)frame.data[2] << 8) + (uint16_t)frame.data[1];
  419. ShmGBTData->ev[gunTypeIndex].MaxiBatteryVoltage = pDcChargingInfo->EvBatteryMaxVoltage;
  420. }
  421. //else if (pDcChargingInfo->Type == _Type_CCS_2) {
  422. //}
  423. break;
  424. case ACK_GET_MISCELLANEOUS_INFO:
  425. pDcChargingInfo->GunLocked = frame.data[0];
  426. pDcChargingInfo->PilotVoltage = ((float)(-120 + frame.data[3])) / 10;
  427. if (pDcChargingInfo->Type == _Type_Chademo) {
  428. ShmCHAdeMOData->evse[gunTypeIndex].ConnectorTemperatureP = frame.data[1];
  429. ShmCHAdeMOData->evse[gunTypeIndex].ConnectorTemperatureN = frame.data[2];
  430. ShmCHAdeMOData->evse[gunTypeIndex].EvboardStatus = frame.data[7];
  431. } else if (pDcChargingInfo->Type == _Type_GB) {
  432. ShmGBTData->evse[gunTypeIndex].ConnectorTemperatureP = frame.data[1];
  433. ShmGBTData->evse[gunTypeIndex].ConnectorTemperatureN = frame.data[2];
  434. ShmGBTData->evse[gunTypeIndex].EvboardStatus = frame.data[7];
  435. }
  436. /*else if (pDcChargingInfo->Type == _Type_CCS_2) {
  437. if (ShmCcsData->CommProtocol == _CCS_COMM_V2GMessage_DIN70121) {
  438. //ShmCcsData->V2GMessage_DIN70121[gunTypeIndex]. .ConnectorTemperatureP = frame.data[1];
  439. //ShmCcsData->V2GMessage_DIN70121[gunTypeIndex]. .ConnectorTemperatureN = frame.data[2];
  440. }
  441. }*/
  442. ShmDcCommonData->ConnectorTemp[gunTypeIndex][0] = frame.data[1];
  443. ShmDcCommonData->ConnectorTemp[gunTypeIndex][1] = frame.data[2];
  444. if (ShmDcCommonData->TestTemperature == YES) { //ReadCmdline test
  445. break;
  446. }
  447. printChillerTemp = NO;
  448. printConnTemp = NO;
  449. if (((ShmDcCommonData->ChillerValve.MultiChillerGun & 0x80) >> 7) == YES) {
  450. getChillerTemperature(&chiilerTemp);
  451. memcpy((char *)ShmDcCommonData->SystemTemp, (char *)chiilerTemp.Temp, sizeof(ChillerTemp));
  452. chillerTemp[0] = getMaxConnectTemp(chiilerTemp.Temp[0], chiilerTemp.Temp[1]);
  453. chillerTemp[1] = getMaxConnectTemp(chiilerTemp.Temp[2], chiilerTemp.Temp[3]);
  454. maxChillerTemp = getMaxConnectTemp(chillerTemp[0], chillerTemp[1]);
  455. //if ((maxChillerTemp - 3) >= pDcChargingInfo->ChillerTemp) {
  456. // printChillerTemp = YES;
  457. //}
  458. if(maxChillerTemp > (lastChillerTemp + 2) || maxChillerTemp < (lastChillerTemp - 2))
  459. {
  460. lastChillerTemp = maxChillerTemp;
  461. printChillerTemp = YES;
  462. }
  463. pDcChargingInfo->ChillerTemp = maxChillerTemp;
  464. }
  465. maxConnTemp = getMaxConnectTemp(frame.data[1], frame.data[2]);
  466. //if ((maxConnTemp - 3) >= pDcChargingInfo->ConnectorTemp) {
  467. // printConnTemp = YES;
  468. //}
  469. maxConnTemp = getAvageTemp(maxConnTemp,targetGun);
  470. if(maxConnTemp > (lastConnTemp[targetGun] + 2) || maxConnTemp < (lastConnTemp[targetGun] - 2))
  471. {
  472. lastConnTemp[targetGun] = maxConnTemp;
  473. printConnTemp = YES;
  474. }
  475. pDcChargingInfo->ConnectorTemp = maxConnTemp;
  476. //紀錄槍頭和水冷機溫度, 在系統狀態變化或溫度大於150
  477. if ((ShmDcCommonData->SystemModeChange[targetGun] == YES) ||
  478. (printConnTemp == YES) ||
  479. (printChillerTemp == YES) //&&
  480. //(((pDcChargingInfo->ConnectorTemp >= GUN_OTP_VALUE) &&
  481. // (pDcChargingInfo->ConnectorTemp != UNDEFINED_TEMP)) ||
  482. // ((pDcChargingInfo->ChillerTemp >= GUN_OTP_VALUE) &&
  483. // (pDcChargingInfo->ChillerTemp != UNDEFINED_TEMP)))
  484. ) {
  485. ShmDcCommonData->SystemModeChange[targetGun] = NO;
  486. log_info("Conn %d max head temp = %d, max chiller = %d, max chiller2 = %d",
  487. targetGun,
  488. maxConnTemp,
  489. chillerTemp[0],
  490. chillerTemp[1]);
  491. }
  492. if (((ShmDcCommonData->ChillerValve.MultiChillerGun & 0x80) >> 7) == YES) {
  493. //沒有水冷槍
  494. break;
  495. }
  496. if ((ShmDcCommonData->ChillerValve.MultiChillerGun & 0x7F) == 1) {
  497. //單一水冷槍,不需要切換水冷機油閥
  498. //ShmFanModuleData-> ? = YES; //尚未定義
  499. break;
  500. }
  501. //紀錄槍頭溫度
  502. if (pDcChargingInfo->ConnectorTemp != UNDEFINED_TEMP) {
  503. if (targetGun == 0) {
  504. ShmDcCommonData->ChillerValve.LeftTemp = pDcChargingInfo->ConnectorTemp;
  505. } else if (targetGun == 1) {
  506. ShmDcCommonData->ChillerValve.RightTemp = pDcChargingInfo->ConnectorTemp;
  507. }
  508. }
  509. //有兩把水冷槍,判斷兩把槍頭溫度,將水冷機節流閥導向溫度高的那一把槍
  510. if (ShmDcCommonData->ChillerValve.LeftTemp > ShmDcCommonData->ChillerValve.RightTemp) {
  511. //ShmFanModuleData->? = YES; //尚未定義
  512. } else {
  513. //ShmFanModuleData->? = NO; //尚未定義
  514. }
  515. //log_info("EvboardStatus = %x ",
  516. // ShmCHAdeMOData->evse[gunTypeIndex].EvboardStatus);
  517. //log_info("ConnectorPlug locked = %x ",
  518. // frame.data[0]);
  519. //log_info("PilotVoltage = %x ", (-120 + frame.data[3]) / 10);
  520. break;
  521. case ACK_EVSE_ISOLATION_STATUS:
  522. break;
  523. case ACK_EVSE_PRECHAGE_INFO:
  524. pDcChargingInfo->PrechargeStatus = frame.data[0];
  525. break;
  526. case NOTIFICATION_EV_STOP:
  527. // 車端要求停止
  528. if ((pDcChargingInfo->SystemStatus >= S_REASSIGN_CHECK && //DS60-120 add
  529. pDcChargingInfo->SystemStatus <= S_TERMINATING) ||
  530. (pDcChargingInfo->SystemStatus >= S_CCS_PRECHARGE_ST0 &&
  531. pDcChargingInfo->SystemStatus <= S_CCS_PRECHARGE_ST1)) {
  532. // frame.data[0] : 0x01 => normal stop, 0x02 => ev emergency stop
  533. log_info("----------------------------- (%d) NOTIFICATION_EV_STOP err level = %d -----------------------------",
  534. targetGun,
  535. frame.data[0]);
  536. if (frame.data[0] == 0x02) {
  537. if (AbnormalStopAnalysis(targetGun, frame.data + 1) == true) {
  538. pDcChargingInfo->StopChargeFlag = YES;
  539. } else {
  540. pDcChargingInfo->NormalStopChargeFlag = YES;
  541. }
  542. } else {
  543. AbnormalStopAnalysis(targetGun, frame.data + 1);
  544. pDcChargingInfo->NormalStopChargeFlag = YES;
  545. }
  546. }
  547. break;
  548. case ACK_EVCCID_REQ:
  549. if (frame.can_dlc > 0 && strcmp ( (char *)pDcChargingInfo->EVCCID, "" ) == EQUAL &&
  550. pDcChargingInfo->Type == _Type_CCS_2)
  551. {
  552. {
  553. memset (
  554. ShmCcsData->V2GMessage_DIN70121 [pDcChargingInfo->type_index].SessionSetupRequest.EVCCID,
  555. 0,
  556. sizeof(ShmCcsData->V2GMessage_DIN70121 [pDcChargingInfo->type_index].SessionSetupRequest.EVCCID) );
  557. memcpy (
  558. ShmCcsData->V2GMessage_DIN70121 [pDcChargingInfo->type_index].SessionSetupRequest.EVCCID,
  559. frame.data, frame.can_dlc );
  560. }
  561. sprintf ( (char *) pDcChargingInfo->EVCCID, "%.2x%.2x%.2x%.2x%.2x%.2x", frame.data [0],
  562. frame.data [1], frame.data [2], frame.data [3], frame.data [4], frame.data [5] );
  563. pDcChargingInfo->EVCCID [17] = '\0';
  564. log_info( "************* Gun %d->EVCCID = %s ************* ", targetGun, pDcChargingInfo->EVCCID );
  565. }
  566. break;
  567. default:
  568. log_info("EV board = %d, Ack none defined. intCmd = %d ", targetGun, intCmd);
  569. break;
  570. }//switch
  571. usleep(10000);
  572. }//while
  573. }
  574. }