Module_EvComm.c 78 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704
  1. #include <sys/time.h>
  2. #include <sys/timeb.h>
  3. #include <sys/types.h>
  4. #include <sys/stat.h>
  5. #include <sys/types.h>
  6. #include <sys/ioctl.h>
  7. #include <sys/socket.h>
  8. #include <sys/ipc.h>
  9. #include <sys/shm.h>
  10. #include <sys/shm.h>
  11. #include <sys/mman.h>
  12. #include <linux/can.h>
  13. #include <linux/can/raw.h>
  14. #include <linux/wireless.h>
  15. #include <arpa/inet.h>
  16. #include <netinet/in.h>
  17. #include <unistd.h>
  18. #include <stdarg.h>
  19. #include <stdio.h> /*標準輸入輸出定義*/
  20. #include <stdlib.h> /*標準函數庫定義*/
  21. #include <unistd.h> /*Unix 標準函數定義*/
  22. #include <fcntl.h> /*檔控制定義*/
  23. #include <termios.h> /*PPSIX 終端控制定義*/
  24. #include <errno.h> /*錯誤號定義*/
  25. #include <errno.h>
  26. #include <string.h>
  27. #include <time.h>
  28. #include <ctype.h>
  29. #include <ifaddrs.h>
  30. #include "../../define.h"
  31. #include "Config.h"
  32. #include "Module_EvComm.h"
  33. #include "VCCU.h"
  34. #define Debug
  35. #define ARRAY_SIZE(A) (sizeof(A) / sizeof(A[0]))
  36. #define PASS 1
  37. #define FAIL -1
  38. #define START 1
  39. #define STOP 0
  40. #define YES 1
  41. #define NO 0
  42. #define DEMO 0
  43. struct SysConfigAndInfo *ShmSysConfigAndInfo;
  44. struct StatusCodeData *ShmStatusCodeData;
  45. struct FanModuleData *ShmFanModuleData;
  46. struct RelayModuleData *ShmRelayModuleData;
  47. struct LedModuleData *ShmLedModuleData;
  48. struct PsuData *ShmPsuData;
  49. struct OCPP16Data *ShmOCPP16Data;
  50. byte gunCount;
  51. byte gun_count = CHAdeMO_QUANTITY + CCS_QUANTITY + GB_QUANTITY;
  52. int chargingTime[CHAdeMO_QUANTITY + CCS_QUANTITY + GB_QUANTITY];
  53. float maxChargingVol = 5000; // 限制最大充電電壓,如依照模塊則填上 0
  54. float maxChargingCur = 100; // 限制最大充電電流,如依照模塊則填上 0
  55. int maxValue = 950;
  56. int gbmaxValue = 7500;
  57. int whileLoopTime = 500000;//45000;//500ms//10000; // 10 ms
  58. int soc = 70;
  59. // 槍資訊
  60. struct ChargingInfoData *_chargingData[CHAdeMO_QUANTITY + CCS_QUANTITY + GB_QUANTITY];
  61. byte normalStop = 0x01;
  62. byte stopReason[6] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
  63. byte evstaus[5] = { 0x01, 0x02, 0x03, 0x04, 0x05 };
  64. struct Ev_Board_Cmd Ev_Cmd={
  65. 0,
  66. 0x00000200,
  67. 0x00000400,
  68. 0x00000500,
  69. 0x00000600,
  70. 0x00000700,
  71. 0x00000800,
  72. 0x00000900,
  73. 0x00000A00,
  74. 0x00000C00,
  75. 0x00000D00,
  76. 0x00000E00,
  77. 0x00000F00,
  78. 0x00001000,
  79. 0x00001100,
  80. 0x00001200,
  81. 0x00001500,
  82. };
  83. //==========================================
  84. // Init all share memory
  85. //==========================================
  86. int InitShareMemory()
  87. {
  88. int result = PASS;
  89. int MeterSMId;
  90. if ((MeterSMId = shmget(ShmSysConfigAndInfoKey, sizeof(struct SysConfigAndInfo), IPC_CREAT | 0777)) < 0)
  91. {
  92. #ifdef SystemLogMessage
  93. printf("EV shmget ShmSysConfigAndInfo NG\n");
  94. #endif
  95. result = FAIL;
  96. }
  97. else if ((ShmSysConfigAndInfo = shmat(MeterSMId, NULL, 0)) == (void *) -1)
  98. {
  99. #ifdef SystemLogMessage
  100. printf("[shmat ShmSysConfigAndInfo NG\n");
  101. #endif
  102. result = FAIL;
  103. }
  104. if ((MeterSMId = shmget(ShmStatusCodeKey, sizeof(struct StatusCodeData), IPC_CREAT | 0777)) < 0)
  105. {
  106. #ifdef SystemLogMessage
  107. printf("shmget ShmStatusCodeData NG\n");
  108. #endif
  109. result = FAIL;
  110. }
  111. else if ((ShmStatusCodeData = shmat(MeterSMId, NULL, 0)) == (void *) -1)
  112. {
  113. #ifdef SystemLogMessage
  114. printf("shmat ShmStatusCodeData NG\n");
  115. #endif
  116. result = FAIL;
  117. }
  118. if ((MeterSMId = shmget(ShmFanBdKey, sizeof(struct FanModuleData), IPC_CREAT | 0777)) < 0)
  119. {
  120. #ifdef SystemLogMessage
  121. printf("shmget ShmFanModuleData NG\n");
  122. #endif
  123. result = FAIL;
  124. }
  125. else if ((ShmFanModuleData = shmat(MeterSMId, NULL, 0)) == (void *) -1)
  126. {
  127. #ifdef SystemLogMessage
  128. printf("shmat ShmFanModuleData NG\n");
  129. #endif
  130. result = FAIL;
  131. }
  132. memset(ShmFanModuleData,0,sizeof(struct FanModuleData));
  133. if ((MeterSMId = shmget(ShmRelayBdKey, sizeof(struct RelayModuleData), IPC_CREAT | 0777)) < 0)
  134. {
  135. #ifdef SystemLogMessage
  136. printf("shmget ShmRelayModuleData NG\n");
  137. #endif
  138. result = FAIL;
  139. }
  140. else if ((ShmRelayModuleData = shmat(MeterSMId, NULL, 0)) == (void *) -1)
  141. {
  142. #ifdef SystemLogMessage
  143. printf("shmat ShmRelayModuleData NG\n");
  144. #endif
  145. result = FAIL;
  146. }
  147. memset(ShmRelayModuleData,0,sizeof(struct RelayModuleData));
  148. if ((MeterSMId = shmget(ShmLedBdKey, sizeof(struct LedModuleData), IPC_CREAT | 0777)) < 0)
  149. {
  150. #ifdef SystemLogMessage
  151. printf("shmget ShmLedModuleData NG\n");
  152. #endif
  153. result = FAIL;
  154. }
  155. else if ((ShmLedModuleData = shmat(MeterSMId, NULL, 0)) == (void *) -1)
  156. {
  157. #ifdef SystemLogMessage
  158. printf("shmat ShmLedModuleData NG\n");
  159. #endif
  160. result = FAIL;
  161. }
  162. memset(ShmLedModuleData,0,sizeof(struct LedModuleData));
  163. if ((MeterSMId = shmget(ShmPsuKey, sizeof(struct PsuData), IPC_CREAT | 0777)) < 0)
  164. {
  165. #ifdef SystemLogMessage
  166. printf("shmget ShmPsuData NG \n");
  167. #endif
  168. result = FAIL;
  169. }
  170. else if ((ShmPsuData = shmat(MeterSMId, NULL, 0)) == (void *) -1)
  171. {
  172. #ifdef SystemLogMessage
  173. printf("shmat ShmPsuData NG \n");
  174. #endif
  175. result = FAIL;
  176. }
  177. return result;
  178. }
  179. int InitCanBus()
  180. {
  181. int s0, nbytes;
  182. struct timeval tv;
  183. struct ifreq ifr0;
  184. struct sockaddr_can addr0;
  185. /*
  186. //can0
  187. system("/sbin/ip link set can0 down");//先將interface disable
  188. system("/sbin/ip link set can0 type can bitrate 500000 restart-ms 100");
  189. system("/sbin/ip link set can0 up");
  190. */
  191. //can1
  192. system("/sbin/ip link set can0 down");//先將interface disable
  193. system("/sbin/ip link set can0 type can bitrate 250000 restart-ms 100");
  194. system("/sbin/ip link set can0 up");
  195. s0 = socket(PF_CAN, SOCK_RAW, CAN_RAW);
  196. tv.tv_sec = 0;
  197. tv.tv_usec = 10000;
  198. if(setsockopt(s0, SOL_SOCKET, SO_RCVTIMEO, (char *)&tv, sizeof(struct timeval)) < 0)
  199. {
  200. #ifdef SystemLogMessage
  201. //StoreLogMsg("[CsuComm]InitCanBus:Set SO_RCVTIMEO NG");
  202. #endif
  203. }
  204. nbytes = 40960;
  205. if(setsockopt(s0, SOL_SOCKET, SO_RCVBUF, &nbytes, sizeof(int)) < 0)
  206. {
  207. #ifdef SystemLogMessage
  208. //StoreLogMsg("[CsuComm]InitCanBus:Set SO_RCVBUF NG");
  209. #endif
  210. }
  211. nbytes = 40960;
  212. if(setsockopt(s0, SOL_SOCKET, SO_SNDBUF, &nbytes, sizeof(int)) < 0)
  213. {
  214. #ifdef SystemLogMessage
  215. //StoreLogMsg("[CsuComm]InitCanBus:Set SO_SNDBUF NG");
  216. #endif
  217. }
  218. //strcpy(ifr0.ifr_name, "can0" );
  219. strcpy(ifr0.ifr_name, "can0" );
  220. ioctl(s0, SIOCGIFINDEX, &ifr0); /* ifr.ifr_ifindex gets filled with that device's index */
  221. addr0.can_family = AF_CAN;
  222. addr0.can_ifindex = ifr0.ifr_ifindex;
  223. bind(s0, (struct sockaddr *)&addr0, sizeof(addr0));
  224. return s0;
  225. }
  226. int CHROMAInitCanBus()
  227. {
  228. int s0,nbytes;
  229. struct timeval tv;
  230. struct ifreq ifr0;
  231. struct sockaddr_can addr0;
  232. system("/sbin/ip link set can1 down");
  233. system("/sbin/ip link set can1 type can bitrate 500000 restart-ms 100");
  234. system("/sbin/ip link set can1 up");
  235. s0 = socket(PF_CAN, SOCK_RAW, CAN_RAW);
  236. tv.tv_sec = 0;
  237. tv.tv_usec = 10000;
  238. if (setsockopt(s0, SOL_SOCKET, SO_RCVTIMEO, (char *)&tv, sizeof(struct timeval)) < 0)
  239. {
  240. #ifdef SystemLogMessage
  241. //DEBUG_ERROR("Set SO_RCVTIMEO NG");
  242. #endif
  243. }
  244. nbytes=40960;
  245. if (setsockopt(s0, SOL_SOCKET, SO_RCVBUF, &nbytes, sizeof(int)) < 0)
  246. {
  247. #ifdef SystemLogMessage
  248. //DEBUG_ERROR("Set SO_RCVBUF NG");
  249. #endif
  250. }
  251. nbytes=40960;
  252. if (setsockopt(s0, SOL_SOCKET, SO_SNDBUF, &nbytes, sizeof(int)) < 0)
  253. {
  254. #ifdef SystemLogMessage
  255. //DEBUG_ERROR("Set SO_SNDBUF NG");
  256. #endif
  257. }
  258. strcpy(ifr0.ifr_name, "can1" );
  259. ioctl(s0, SIOCGIFINDEX, &ifr0); /* ifr.ifr_ifindex gets filled with that device's index */
  260. addr0.can_family = AF_CAN;
  261. addr0.can_ifindex = ifr0.ifr_ifindex;
  262. bind(s0, (struct sockaddr *)&addr0, sizeof(addr0));
  263. return s0;
  264. }
  265. bool CheckUniqNumber(byte value)
  266. {
  267. for (byte index = 0; index < gun_count; index++)
  268. {
  269. if (_chargingData[index]->Evboard_id == value)
  270. {
  271. struct timeval _end_time;
  272. gettimeofday(&_end_time, NULL);
  273. unsigned long diff = 1000000 * (_end_time.tv_sec - _id_assign_time.tv_sec) + _end_time.tv_usec - _id_assign_time.tv_usec;
  274. if (diff >= 3000000)
  275. {
  276. gettimeofday(&_id_assign_time, NULL);
  277. return true;
  278. }
  279. else
  280. {
  281. return false;
  282. }
  283. }
  284. }
  285. gettimeofday(&_id_assign_time, NULL);
  286. return true;
  287. }
  288. void AddrAssignment(byte *data)
  289. {
  290. byte target_number[8];
  291. byte index = 0x00;
  292. memcpy(target_number, data, sizeof(target_number));
  293. index = *(data + 4);
  294. if (CheckUniqNumber(index))
  295. {
  296. //printf("EV board id = %x \n", index);
  297. if (index < 1)
  298. return;
  299. printf("SetTargetAddr \n");
  300. SetTargetAddr(target_number, index);
  301. }
  302. }
  303. void setATEMode(byte gun_index, byte mode)
  304. {
  305. _chargingData[gun_index]->ATEStatus = mode;
  306. }
  307. void setStatusMode(byte gun_index, byte mode)
  308. {
  309. _chargingData[gun_index]->ATEStatus = mode;
  310. }
  311. unsigned char isStatusChange(unsigned char gun_index)
  312. {
  313. unsigned char result = NO;
  314. if(_chargingData[gun_index]->ATEStatus != _chargingData[gun_index]->PreviousATEStatus)
  315. {
  316. result = YES;
  317. _chargingData[gun_index]->PreviousATEStatus = _chargingData[gun_index]->ATEStatus;
  318. }
  319. return result;
  320. }
  321. int bitExtracted(byte number, int k, int p)
  322. {
  323. return (((1 << k) - 1) & (number >> (p - 1)));
  324. }
  325. unsigned short bitextract(unsigned short value, int begin, int end)
  326. {
  327. unsigned short mask = (1 << (end - begin)) - 1;
  328. return (value >> begin) & mask;
  329. }
  330. //接收can
  331. void CANReceiver()
  332. {
  333. pid_t canRecPid;
  334. canRecPid = fork();
  335. if(canRecPid > 0){
  336. int nbytes;
  337. struct can_frame frame;
  338. int intCmd;
  339. while (1){
  340. if(ShmSysConfigAndInfo->ate.ATEState == 1){
  341. //清空 canbus recever buf
  342. memset(&frame, 0, sizeof(struct can_frame));
  343. //讀取 canbus 是否有接收到封包
  344. nbytes = read(CanFd, &frame, sizeof(struct can_frame));
  345. //如果有收到 canbus 封包
  346. if (nbytes > 0){
  347. intCmd = (int) (frame.can_id & CAN_EFF_MASK);//extended frame format
  348. #ifdef Debug
  349. //printf("hsout0StatusChange Get-INFYPWR-Msg : %08x - %02x %02x %02x %02x %02x %02x %02x %02x\n ", intCmd, frame.data[0], frame.data[1], frame.data[2], frame.data[3],frame.data[4], frame.data[5], frame.data[6], frame.data[7] );
  350. //printf(" Get-Msg : %08X - %02x %02x %02x %02x %02x %02x %02x %02x\n ", frame.can_id, frame.data[0], frame.data[1], frame.data[2], frame.data[3],frame.data[4], frame.data[5], frame.data[6], frame.data[7] );
  351. #endif
  352. switch (intCmd){
  353. case VCCU_ChargeFromVehicleId:{
  354. //memcpy(&ShmSysConfigAndInfo->ate.vccu.chargeFromVehicle, &frame.data, frame.can_dlc);
  355. ShmSysConfigAndInfo->ate.vccu.chargeFromVehicle.VCCU_Vehicle_ContactorVoltage = ((short) frame.data[1] << 8) + (short) frame.data[0];
  356. ShmSysConfigAndInfo->ate.vccu.chargeFromVehicle.VCCU_Vehicle_LinkVoltage = ((short) frame.data[3] << 8) + (short) frame.data[2];
  357. ShmSysConfigAndInfo->ate.vccu.chargeFromVehicle.DATA.bits.VCCU_Vehicle_IsolationMeasurem = bitextract(frame.data[4],0, 2);//((short) frame.data[4] >> 0)+((short) frame.data[4] >> 1);//((short) frame.data[4] << 2);
  358. ShmSysConfigAndInfo->ate.vccu.chargeFromVehicle.DATA.bits.VCCU_Vehicle_PlugLockPermissio = bitextract(frame.data[4],2, 4);//((short) frame.data[4] >> 2)+((short) frame.data[4] >> 3);
  359. ShmSysConfigAndInfo->ate.vccu.chargeFromVehicle.DATA.bits.VCCU_Vehicle_PlugUnlockPermiss = bitextract(frame.data[4],4, 6);//((short) frame.data[4] >> 4)+((short) frame.data[4] >> 5);
  360. ShmSysConfigAndInfo->ate.vccu.chargeFromVehicle.DATA.bits.VCCU_Vehicle_ChargePermission = bitextract(frame.data[4],6, 8);//((short) frame.data[4] >> 6)+((short) frame.data[4] >> 7);
  361. ShmSysConfigAndInfo->ate.vccu.chargeFromVehicle.bits.VCCU_Vehicle_ContactorStatus = bitextract(frame.data[5],0, 2);
  362. //memset(&ShmSysConfigAndInfo->ate.vccu.chargeFromVehicle,*frame.data, frame.can_dlc);
  363. break;
  364. }
  365. case VCCU_ControlPilotStatusId:{
  366. //memcpy(&ShmSysConfigAndInfo->ate.vccu.controlPilotStatus, &frame.data, frame.can_dlc);
  367. ShmSysConfigAndInfo->ate.vccu.controlPilotStatus.ControlPilot_Frequency.bits.VCCU_ControlPilot_Frequency = ((short) frame.data[1] << 8) + (short) frame.data[0];
  368. ShmSysConfigAndInfo->ate.vccu.controlPilotStatus.ControlPilot_DutyCycle.bits.value = ((short) frame.data[2] ) ;
  369. ShmSysConfigAndInfo->ate.vccu.controlPilotStatus.ControlPilot_Voltage.bits.value = ((short) frame.data[4] << 8) + (short) frame.data[3];
  370. ShmSysConfigAndInfo->ate.vccu.controlPilotStatus.DATA.bits.VCCU_ControlPilot_Wakeup = bitextract(((short) (frame.data[5])), 0, 2);
  371. ShmSysConfigAndInfo->ate.vccu.controlPilotStatus.DATA.bits.VCCU_ChargeUnit_Mode = bitextract(frame.data[5],2, 5);
  372. ShmSysConfigAndInfo->ate.vccu.controlPilotStatus.DATA.bits.VCCU_ChargeUnit_State = bitextract(((short) (frame.data[5])), 5, 8);
  373. ShmSysConfigAndInfo->ate.vccu.controlPilotStatus.ChargeUnit_MaxCurrent = ((short) frame.data[6] );
  374. //printf("ControlPilot_Voltage===== %d %02x %02x\n", (32000-ShmSysConfigAndInfo->ate.vccu.controlPilotStatus.ControlPilot_Voltage.bits.value), frame.data[4], frame.data[3]);
  375. //memset(&ShmSysConfigAndInfo->ate.vccu.controlPilotStatus.ControlPilot_Voltage,frame.data[5], frame.can_dlc);
  376. break;
  377. }
  378. case VCCU_V2G_StateMId:{
  379. //memcpy(&ShmSysConfigAndInfo->ate.vccu.v2g_StateM, &frame.data, frame.can_dlc);
  380. ShmSysConfigAndInfo->ate.vccu.v2g_StateM.VCCU_V2G_StateM_EnergyTransfer = (short) frame.data[0];
  381. ShmSysConfigAndInfo->ate.vccu.v2g_StateM.VCCU_V2G_StateM_StateMachineEr = (short) frame.data[1];
  382. ShmSysConfigAndInfo->ate.vccu.v2g_StateM.VCCU_V2G_StateM_StateMachineMe = (short) frame.data[2];
  383. ShmSysConfigAndInfo->ate.vccu.v2g_StateM.VCCU_V2G_StateM_StateMachineSt = (short) frame.data[3];
  384. ShmSysConfigAndInfo->ate.vccu.v2g_StateM.DATA.bits.VCCU_V2G_StateM_InternetAvaila = bitextract(frame.data[4],0, 1);
  385. ShmSysConfigAndInfo->ate.vccu.v2g_StateM.DATA.bits.VCCU_V2G_Appl_SccChargeModeReq = bitextract(frame.data[4],1, 4);
  386. ShmSysConfigAndInfo->ate.vccu.v2g_StateM.DATA.bits.VCCU_V2G_Appl_SccFuncModeReq = bitextract(frame.data[4],4, 6);
  387. //memset(&ShmSysConfigAndInfo->ate.vccu.v2g_StateM.VCCU_V2G_StateM_StateMachineSt,*frame.data, frame.can_dlc);
  388. break;
  389. }
  390. case VCCU_InletStatusId:{
  391. //memcpy(&ShmSysConfigAndInfo->ate.vccu.inletStatus, &frame.data, frame.can_dlc);
  392. ShmSysConfigAndInfo->ate.vccu.inletStatus.VCCU_POSFeedback_Voltage = ((short) frame.data[1] << 8) + (short) frame.data[0];
  393. ShmSysConfigAndInfo->ate.vccu.inletStatus.DATA2.VCCU_PlugPresent_SelfDiagnosti = bitextract(frame.data[2],0, 3);
  394. ShmSysConfigAndInfo->ate.vccu.inletStatus.DATA2.VCCU_PlugPresent_Resistance = bitextract(frame.data[2],3, 6);
  395. ShmSysConfigAndInfo->ate.vccu.inletStatus.DATA2.VCCU_PlugPresent_Status = bitextract(frame.data[2],6, 8);
  396. ShmSysConfigAndInfo->ate.vccu.inletStatus.DATA3.VCCU_PlugPresent_Wakeup = bitextract(frame.data[3],0, 2);
  397. ShmSysConfigAndInfo->ate.vccu.inletStatus.DATA3.VCCU_POSFeedback_SelfDiagnosti = bitextract(frame.data[3],2, 5);
  398. ShmSysConfigAndInfo->ate.vccu.inletStatus.DATA3.VCCU_PlugLock_MotorStatus = bitextract(frame.data[3],5, 8);
  399. ShmSysConfigAndInfo->ate.vccu.inletStatus.DATA4.VCCU_PlugLock_Output0_SelfDiag = bitextract(frame.data[4],0, 3);
  400. ShmSysConfigAndInfo->ate.vccu.inletStatus.DATA4.VCCU_PlugLock_Output1_SelfDiag = bitextract(frame.data[4],3, 6);
  401. ShmSysConfigAndInfo->ate.vccu.inletStatus.DATA4.VCCU_Inlet_HWVariant = bitextract(frame.data[4],6, 8);
  402. ShmSysConfigAndInfo->ate.vccu.inletStatus.DATA5.bits.VCCU_DigitalInput_Status = bitextract(frame.data[5],0, 2);
  403. ShmSysConfigAndInfo->ate.vccu.inletStatus.DATA5.bits.VCCU_DigitalInput_Wakeup = bitextract(frame.data[5],2, 4);
  404. ShmSysConfigAndInfo->ate.vccu.inletStatus.DATA5.bits.VCCU_Inlet_MotorStatus = bitextract(frame.data[5],4, 7);
  405. ShmSysConfigAndInfo->ate.vccu.inletStatus.VCCU_Inlet_MaxCurrent = (short) frame.data[6];
  406. ShmSysConfigAndInfo->ate.vccu.inletStatus.DATA7.bits.VCCU_DigitalInput_DebouncedSta = bitextract(frame.data[7],0, 2);
  407. ShmSysConfigAndInfo->ate.vccu.inletStatus.DATA7.bits.VCCU_Inlet_ConnectionStatus = bitextract(frame.data[7],2, 4);
  408. ShmSysConfigAndInfo->ate.vccu.inletStatus.DATA7.bits.VCCU_S3Switch_Status = bitextract(frame.data[7],4, 6);
  409. ShmSysConfigAndInfo->ate.vccu.inletStatus.DATA7.bits.VCCU_S3Switch_DebouncedStatus = bitextract(frame.data[7],6, 8);
  410. //memset(&ShmSysConfigAndInfo->ate.vccu.inletStatus,*frame.data, frame.can_dlc);
  411. //printf("VCCU_ControlPilotStatus Get-INFYPWR-Msg : %08x - %02x %02x %02x %02x %02x %02x %02x %02x\n ", intCmd, frame.data[0], frame.data[1], frame.data[2], frame.data[3],frame.data[4], frame.data[5], frame.data[6], frame.data[7] );
  412. break;
  413. }
  414. case VCCU_ChargeToVehicleId:{
  415. //memcpy(&ShmSysConfigAndInfo->ate.vccu.chargeToVehicle, &frame.data, frame.can_dlc);
  416. //ShmSysConfigAndInfo->ate.vccu.chargeToVehicle.Data.bits.VCCU_Vehicle_IsolationMea_0000 = bitextract(frame.data[0],0, 2);
  417. ShmSysConfigAndInfo->ate.vccu.chargeToVehicle.bits.VCCU_Vehicle_IsolationMea_0000 = bitextract(frame.data[0],0, 2);
  418. ShmSysConfigAndInfo->ate.vccu.chargeToVehicle.bits.VCCU_Vehicle_ContactorRequest = bitextract(frame.data[0],2, 4);
  419. //memset(&ShmSysConfigAndInfo->ate.vccu.chargeToVehicle,*frame.data, frame.can_dlc);
  420. //printf("VCCU_ControlPilotStatus Get-INFYPWR-Msg : %08x - %02x %02x %02x %02x %02x %02x %02x %02x\n ", intCmd, frame.data[0], frame.data[1], frame.data[2], frame.data[3],frame.data[4], frame.data[5], frame.data[6], frame.data[7] );
  421. break;
  422. }
  423. case VCCU_V2G_EVMaximumVoltageLimitId:{
  424. //memcpy(&ShmSysConfigAndInfo->ate.vccu.v2g_EVMaximumVoltageLimit, &frame.data, frame.can_dlc);
  425. //memset(&ShmSysConfigAndInfo->ate.vccu.v2g_EVMaximumVoltageLimit,*frame.data, frame.can_dlc);
  426. break;
  427. }
  428. case VCCU_V2G_EVSEMaximumCurrentLimId:{
  429. ShmSysConfigAndInfo->ate.vccu.v2g_EVSEMaximumCurrentLim.DATA.VCCU_V2G_EVSEMaximumCurre_0002 = bitextract(frame.data[0],0, 4);
  430. ShmSysConfigAndInfo->ate.vccu.v2g_EVSEMaximumCurrentLim.DATA.VCCU_V2G_EVSEMaximumCurrentLim = bitextract(frame.data[0],4, 6);
  431. ShmSysConfigAndInfo->ate.vccu.v2g_EVSEMaximumCurrentLim.VCCU_V2G_EVSEMaximumCurre_0003 = (short) frame.data[1];
  432. ShmSysConfigAndInfo->ate.vccu.v2g_EVSEMaximumCurrentLim.VCCU_V2G_EVSEMaximumCurre_0000 = ((short) frame.data[3] << 8) + (short) frame.data[2];
  433. ShmSysConfigAndInfo->ate.vccu.v2g_EVSEMaximumCurrentLim.VCCU_V2G_EVSEMaximumCurre_0001 = (short) frame.data[4];//樁的電流
  434. //printf("VCCU_V2G_EVSEMaximumCurrentLimId Get-INFYPWR-Msg : VCCU_V2G_EVSEMaximumCurre_0000 = %d \n ", ShmSysConfigAndInfo->ate.vccu.v2g_EVSEMaximumCurrentLim.VCCU_V2G_EVSEMaximumCurre_0000);
  435. //memcpy(&ShmSysConfigAndInfo->ate.vccu.v2g_EVMaximumCurrentLimit, &frame.data, frame.can_dlc);
  436. //memset(&ShmSysConfigAndInfo->ate.vccu.v2g_EVMaximumCurrentLimit,*frame.data, frame.can_dlc);
  437. break;
  438. }
  439. case VCCU_V2G_EVTargetCurrentId:{
  440. //memcpy(&ShmSysConfigAndInfo->ate.vccu.v2g_EVTargetCurrent, &frame.data, frame.can_dlc);
  441. //memset(&ShmSysConfigAndInfo->ate.vccu.v2g_EVTargetCurrent,*frame.data, frame.can_dlc);
  442. break;
  443. }
  444. case VCCU_V2G_EVTargetVoltageId:{
  445. //memcpy(&ShmSysConfigAndInfo->ate.vccu.v2g_EVTargetVoltage, &frame.data, frame.can_dlc);
  446. //memset(&ShmSysConfigAndInfo->ate.vccu.v2g_EVTargetVoltage,*frame.data, frame.can_dlc);
  447. break;
  448. }
  449. case VCCU_V2G_EVSEPresentVoltageId:{
  450. ShmSysConfigAndInfo->ate.vccu.v2g_EVSEPresentVoltage.VCCU_V2G_EVSEPresentVoltage_Va = ((short) frame.data[3] << 8) + (short) frame.data[2];
  451. //printf("EVSEPresentVoltage = %d\n ", ShmSysConfigAndInfo->ate.vccu.v2g_EVSEPresentVoltage.VCCU_V2G_EVSEPresentVoltage_Va );
  452. ShmSysConfigAndInfo->ate.vccu.v2g_EVSEPresentVoltage.VCCU_V2G_EVSEPresentVoltage_Va = ShmSysConfigAndInfo->ate.vccu.v2g_EVSEPresentVoltage.VCCU_V2G_EVSEPresentVoltage_Va / 10;
  453. //printf("EVSEPresentVoltage = %d\n ", ShmSysConfigAndInfo->ate.vccu.v2g_EVSEPresentVoltage.VCCU_V2G_EVSEPresentVoltage_Va );
  454. /*
  455. if(ShmSysConfigAndInfo->ate.vccu.v2g_EVSEPresentVoltage.VCCU_V2G_EVSEPresentVoltage_Va != 0){
  456. ShmSysConfigAndInfo->ate.targetVoltage_Value = ShmSysConfigAndInfo->ate.vccu.v2g_EVSEPresentVoltage.VCCU_V2G_EVSEPresentVoltage_Va;
  457. }
  458. */
  459. break;
  460. }
  461. default:
  462. break;
  463. }
  464. }
  465. usleep(2000);
  466. }else if(ShmSysConfigAndInfo->ate.ATEState == 2){
  467. memset(&frame, 0, sizeof(struct can_frame));
  468. nbytes = read(CanFd, &frame, sizeof(struct can_frame));
  469. if (nbytes > 0)
  470. {
  471. intCmd = (int) (frame.can_id & CAN_EFF_MASK);
  472. #ifdef Debug
  473. //printf("hsout0StatusChange Get-INFYPWR-Msg : %08x - %02x %02x %02x %02x %02x %02x %02x %02x\n ", intCmd, frame.data[0], frame.data[1], frame.data[2], frame.data[3],frame.data[4], frame.data[5], frame.data[6], frame.data[7] );
  474. //printf(" Get-Msg2 : %08X - %02x %02x %02x %02x %02x %02x %02x %02x\n ", frame.can_id, frame.data[0], frame.data[1], frame.data[2], frame.data[3],frame.data[4], frame.data[5], frame.data[6], frame.data[7] );
  475. #endif
  476. if (intCmd == ADDRESS_REQ)
  477. {
  478. AddrAssignment(frame.data);
  479. continue;
  480. }
  481. intCmd = (int) (frame.can_id & CAN_EFF_MASK & 0xFFFFFF00);
  482. if(intCmd == 256)
  483. {
  484. continue;
  485. }
  486. //gettimeofday(&_cmd_ack_timeout[targetGun], NULL);
  487. //printf ("intCmd = %x \n", intCmd);
  488. switch (intCmd)
  489. {
  490. case EV_BOARD_STATUS_NOTIFICATION:
  491. {
  492. //printf(" EV_BOARD_STATUS_NOTIFICATION\n ");
  493. ShmSysConfigAndInfo->ate.chademo.id03.ProximitySignal = frame.data[2];
  494. ShmSysConfigAndInfo->ate.chademo.id03.state = frame.data[3];
  495. //printf(" EV_BOARD_STATUS_NOTIFICATION %d \n ", ShmSysConfigAndInfo->ate.chademo.id03.state);
  496. //printf(" EV_BOARD_STATUS_NOTIFICATION Get-Msg : %08X - %02x %02x %02x %02x %02x %02x %02x %02x\n ", frame.can_id, frame.data[0], frame.data[1], frame.data[2], frame.data[3],frame.data[4], frame.data[5], frame.data[6], frame.data[7] );
  497. //printf("EVBoardStatusNotification Get-Msg : %08X - %02x %02x %02x %02x %02x %02x %02x %02x\n ", frame.can_id, frame.data[0], frame.data[1], frame.data[2], frame.data[3],frame.data[4], frame.data[5], frame.data[6], frame.data[7] );
  498. //printf("ConnectorPlugIn = %x, data[0] = %x \n", _chargingData[target]->ConnectorPlugIn, frame.data[0]);
  499. //printf("ConnectorPlugIn = %x \n", (-120 + frame.data[1]) / 10);
  500. }
  501. break;
  502. case ACK_EV_FW_VERSION:
  503. {
  504. printf(" ACK_EV_FW_VERSION\n ");
  505. /*
  506. if (_chargingData[targetGun]->Type == _Type_Chademo)
  507. {
  508. memcpy(ShmCHAdeMOData->evse[_chargingData[targetGun]->type_index].version, frame.data, ARRAY_SIZE(frame.data));
  509. ShmCHAdeMOData->evse[_chargingData[targetGun]->type_index].SelfTest_Comp = PASS;
  510. }
  511. else if (_chargingData[targetGun]->Type == _Type_CCS)
  512. {
  513. if (ShmCcsData->CommProtocol == 0x01)
  514. {
  515. memcpy(&ShmCcsData->V2GMessage_DIN70121[_chargingData[targetGun]->type_index].version, frame.data, ARRAY_SIZE(frame.data));
  516. ShmCcsData->V2GMessage_DIN70121[_chargingData[targetGun]->type_index].SelfTest_Comp = PASS;
  517. }
  518. }
  519. */
  520. }
  521. break;
  522. case ACK_EV_HW_VERSION:
  523. {
  524. printf("Get EV HW = %s \n", frame.data);
  525. }
  526. break;
  527. case ACK__GET_EVSE_OUTPUT_STATUS:
  528. {
  529. //printf(" ACK__GET_EVSE_OUTPUT_STATUS\n ");
  530. //printf(" ACK__GET_EVSE_OUTPUT_STATUS\n ");
  531. //printf(" Get EVSE output status Get-Msg : %08X - %02x %02x %02x %02x %02x %02x %02x %02x\n ", frame.can_id, frame.data[0], frame.data[1], frame.data[2], frame.data[3],frame.data[4], frame.data[5], frame.data[6], frame.data[7] );
  532. ShmSysConfigAndInfo->ate.chademo.id09_ack.DcEvState = frame.data[0];//EV模擬器
  533. ShmSysConfigAndInfo->ate.chademo.id09_ack.ChargingMode = frame.data[1];
  534. ShmSysConfigAndInfo->ate.chademo.id09_ack.EvsePresentOutputVoltage = ((short) frame.data[3] << 8) + (short) frame.data[2];//充電樁輸出電壓
  535. ShmSysConfigAndInfo->ate.chademo.id09_ack.EvsePresentOutputCurrent = ((short) frame.data[5] << 8) + (short) frame.data[4];//充電樁輸出電流
  536. ShmSysConfigAndInfo->ate.chademo.id09_ack.RemainingTimeSec = ((short) frame.data[7] << 8) + (short) frame.data[6];//剩餘時間
  537. /*
  538. _chargingData[targetGun]->EvBatterySoc = frame.data[1];
  539. _chargingData[targetGun]->EvBatterytargetVoltage = ((short) frame.data[3] << 8) + (short) frame.data[2];
  540. _chargingData[targetGun]->EvBatterytargetCurrent = ((short) frame.data[5] << 8) + (short) frame.data[4];
  541. _chargingData[targetGun]->PresentChargedDuration = ((short) frame.data[7] << 8) + (short) frame.data[6];
  542. if (_chargingData[targetGun]->Type == _Type_Chademo)
  543. {
  544. if (ShmCHAdeMOData->ev[_chargingData[targetGun]->type_index].EvDetection != frame.data[0])
  545. {
  546. // log
  547. }
  548. ShmCHAdeMOData->ev[_chargingData[targetGun]->type_index].EvDetection = frame.data[0];
  549. ShmCHAdeMOData->ev[_chargingData[targetGun]->type_index].SOC = _chargingData[targetGun]->EvBatterySoc;
  550. ShmCHAdeMOData->ev[_chargingData[targetGun]->type_index].TargetBatteryVoltage = _chargingData[targetGun]->EvBatterytargetVoltage;
  551. ShmCHAdeMOData->ev[_chargingData[targetGun]->type_index].ChargingCurrentRequest = _chargingData[targetGun]->EvBatterytargetCurrent;
  552. }
  553. else if (_chargingData[targetGun]->Type == _Type_CCS)
  554. {
  555. if(ShmCcsData->CommProtocol == 0x01)
  556. {
  557. ShmCcsData->V2GMessage_DIN70121[_chargingData[targetGun]->type_index].PresentMsgFlowStatus = frame.data[0];
  558. }
  559. }
  560. */
  561. //printf("frame.data_2 = %x, frame.data_3 = %x \n", frame.data[2], frame.data[3]);
  562. //printf("EvBatterytargetVoltage = %f \n", _chargingData[targetGun]->EvBatterytargetVoltage);
  563. //printf("EvBatterytargetCurrent = %f \n", _chargingData[targetGun]->EvBatterytargetCurrent);
  564. //printf("BatteryVoltage = %d \n", ShmCHAdeMOData->ev[_chargingData[target]->type_index].TargetBatteryVoltage);
  565. //printf("CurrentRequest = %d \n", ShmCHAdeMOData->ev[_chargingData[target]->type_index].ChargingCurrentRequest);
  566. }
  567. break;
  568. case ACK_GET_EVSE_Capacity_INFO:
  569. {
  570. ShmSysConfigAndInfo->ate.chademo.id0A_ack.EvseMaxChargeVoltage = ((short) frame.data[1] << 8) + (short) frame.data[0];//樁的最大電壓
  571. ShmSysConfigAndInfo->ate.chademo.id0A_ack.EvseMaxChargeCurrent = ((short) frame.data[3] << 8) + (short) frame.data[2];//樁的最大電流
  572. ShmSysConfigAndInfo->ate.chademo.id0A_ack.EvseMinChargeVoltage = ((short) frame.data[5] << 8) + (short) frame.data[4];
  573. ShmSysConfigAndInfo->ate.chademo.id0A_ack.EvseMinChargeCurrent = ((short) frame.data[7] << 8) + (short) frame.data[6];
  574. /*
  575. //_chargingData[target].EvACorDCcharging = frame.data[0];
  576. //_chargingData[target]->TotalBatteryCap = ((float) frame.data[4] << 8) + (short) frame.data[3];
  577. _chargingData[targetGun]->EvBatteryMaxVoltage = ((short) frame.data[4] << 8) + (short) frame.data[3];
  578. //_chargingData[target]->EvBatteryMaxCurrent = ((float) frame.data[4] << 8) + (short) frame.data[3];
  579. //_chargingData[target].MaxiBatteryCurrent = ((short) frame.data[6] << 8) + (short) frame.data[5];
  580. if (_chargingData[targetGun]->Type == _Type_Chademo)
  581. {
  582. ShmCHAdeMOData->ev[_chargingData[targetGun]->type_index].TotalBatteryCapacity = ((short) frame.data[2] << 8) + (short) frame.data[1];
  583. ShmCHAdeMOData->ev[_chargingData[targetGun]->type_index].MaxiBatteryVoltage = _chargingData[targetGun]->EvBatteryMaxVoltage;
  584. //printf("EvBatteryMaxVoltage = %f \n", _chargingData[target]->EvBatteryMaxVoltage);
  585. //printf("TotalBatteryCapacity = %d \n", ShmCHAdeMOData->ev[_chargingData[target]->type_index].TotalBatteryCapacity);
  586. //printf("MaxiBatteryVoltage = %d \n", ShmCHAdeMOData->ev[_chargingData[target]->type_index].MaxiBatteryVoltage);
  587. }
  588. else if (_chargingData[targetGun]->Type == _Type_CCS)
  589. {
  590. if(ShmCcsData->CommProtocol == 0x01)
  591. {
  592. }
  593. }
  594. */
  595. }
  596. break;
  597. case ACK_GET_MISCELLANEOUS_INFO:
  598. {
  599. //printf(" ACK_GET_MISCELLANEOUS_INFO\n ");
  600. //printf(" ACK_GET_MISCELLANEOUS_INFO\n ");
  601. ShmSysConfigAndInfo->ate.chademo.id0D_ack.K1K2OnOff = frame.data[5];
  602. if(ShmSysConfigAndInfo->ate.chademo.relaystatus == 0){
  603. ShmSysConfigAndInfo->ate.chademo.id0D_req.K1K2Status = ShmSysConfigAndInfo->ate.chademo.id0D_ack.K1K2OnOff;
  604. setStatusMode(CCS_QUANTITY, ShmSysConfigAndInfo->ate.chademo.id0D_req.K1K2Status);
  605. int status = isStatusChange(CCS_QUANTITY);
  606. if(status){
  607. /*
  608. if(ShmSysConfigAndInfo->ate.chademo.id0D_req.K1K2Status == 1){
  609. if(ShmSysConfigAndInfo->ate.ATEState == 1){
  610. //usleep(whileLoopTime);
  611. //outputRelay.relay_event.bits.Gun1_Parallel_N = 0x00;
  612. //outputRelay.relay_event.bits.Gun1_Parallel_P = 0x00;
  613. //Config_Relay_Output(Uart5Fd, Addr.Relay, &outputRelay);
  614. }else if(ShmSysConfigAndInfo->ate.ATEState == 2){
  615. //outputRelay.relay_event.bits.Gun1_Parallel_N = 0x01;
  616. //outputRelay.relay_event.bits.Gun1_Parallel_P = 0x01;
  617. //Config_Relay_Output(Uart5Fd, Addr.Relay, &outputRelay);
  618. }
  619. }else{
  620. }
  621. */
  622. }
  623. }
  624. //memcpy(&ShmSysConfigAndInfo->ate.chademo.id0D_ack, &frame.data, frame.can_dlc);
  625. //printf("%d %d\n", ShmSysConfigAndInfo->ate.chademo.id0D_ack.K1K2OnOff, ShmSysConfigAndInfo->ate.chademo.id0D_ack.EvBoardState);
  626. //printf(" Get-Msg : %08X - %02x %02x %02x %02x %02x %02x %02x %02x\n ", frame.can_id, frame.data[0], frame.data[1], frame.data[2], frame.data[3],frame.data[4], frame.data[5], frame.data[6], frame.data[7] );
  627. /*
  628. float pilotVol = (float)(-120 + frame.data[3]) / 10;
  629. // if (pilotVol != _chargingData[targetGun]->PilotVoltage)
  630. // DEBUG_INFO("PilotVoltage = %f \n", _chargingData[targetGun]->PilotVoltage);
  631. if (_chargingData[targetGun]->Type == _Type_Chademo)
  632. {
  633. _chargingData[targetGun]->GunLocked = frame.data[0];
  634. ShmCHAdeMOData->evse[_chargingData[targetGun]->type_index].ConnectorTemperatureP = frame.data[1];
  635. ShmCHAdeMOData->evse[_chargingData[targetGun]->type_index].ConnectorTemperatureN = frame.data[2];
  636. _chargingData[targetGun]->PilotVoltage = pilotVol;
  637. ShmCHAdeMOData->evse[_chargingData[targetGun]->type_index].EvboardStatus = frame.data[7];
  638. }
  639. else if (_chargingData[targetGun]->Type == _Type_CCS)
  640. {
  641. if (ShmCcsData->CommProtocol == 0x01)
  642. {
  643. _chargingData[targetGun]->GunLocked = frame.data[0];
  644. //ShmCcsData->V2GMessage_DIN70121[_chargingData[targetGun]->type_index]. .ConnectorTemperatureP = frame.data[1];
  645. //ShmCcsData->V2GMessage_DIN70121[_chargingData[targetGun]->type_index]. .ConnectorTemperatureN = frame.data[2];
  646. _chargingData[targetGun]->PilotVoltage = pilotVol;
  647. }
  648. }
  649. */
  650. //printf("ConnectorPlug locked = %x \n", frame.data[0]);
  651. //printf("ConnectorTemp 0= %d \n", ShmCHAdeMOData->evse[_chargingData[target]->type_index].ConnectorTemperatureP);
  652. //printf("ConnectorTemp 1= %d \n", ShmCHAdeMOData->evse[_chargingData[target]->type_index].ConnectorTemperatureN);
  653. }
  654. break;
  655. case ACK_EVSE_ISOLATION_STATUS: { } break;
  656. case ACK_EVSE_PRECHAGE_INFO:
  657. {
  658. //_chargingData[targetGun]->PrechargeStatus = frame.data[0];
  659. }
  660. break;
  661. case NOTIFICATION_EV_STOP:
  662. {
  663. printf(" ACK_GET_MISCELLANEOUS_INFO\n ");
  664. ShmSysConfigAndInfo->ate.chademo.id0B.EvStopReason = frame.data[0];
  665. ShmSysConfigAndInfo->ate.chademo.id0B.AlarmCode1 = frame.data[1];
  666. ShmSysConfigAndInfo->ate.chademo.id0B.AlarmCode2 = frame.data[2];
  667. ShmSysConfigAndInfo->ate.chademo.id0B.AlarmCode3 = frame.data[3];
  668. ShmSysConfigAndInfo->ate.chademo.id0B.AlarmCode4 = frame.data[4];
  669. ShmSysConfigAndInfo->ate.chademo.id0B.AlarmCode5 = frame.data[5];
  670. ShmSysConfigAndInfo->ate.chademo.id0B.AlarmCode6 = frame.data[6];
  671. printf("EvStopReason = %d %d %d %d %d %d %d \n", ShmSysConfigAndInfo->ate.chademo.id0B.EvStopReason, ShmSysConfigAndInfo->ate.chademo.id0B.AlarmCode1, ShmSysConfigAndInfo->ate.chademo.id0B.AlarmCode2, ShmSysConfigAndInfo->ate.chademo.id0B.AlarmCode3, ShmSysConfigAndInfo->ate.chademo.id0B.AlarmCode4, ShmSysConfigAndInfo->ate.chademo.id0B.AlarmCode5, ShmSysConfigAndInfo->ate.chademo.id0B.AlarmCode6);
  672. //byte normalStop = 0x01;
  673. //byte stopReason[6] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
  674. //byte evstaus[5] = { 0x01, 0x02, 0x03, 0x04, 0x05 };
  675. //ShmSysConfigAndInfo->ate.Permission = STOP;
  676. //setChargerMode(CCS_QUANTITY, ShmSysConfigAndInfo->ate.Permission);
  677. //ShmSysConfigAndInfo->ate.ATEStatus = 0x00;
  678. //SetChargingPermission(CCS_QUANTITY, ShmSysConfigAndInfo->ate.Permission, ShmSysConfigAndInfo->ate.TotalBatteryCap, ShmSysConfigAndInfo->ate.MaxBatteryCurrent, ShmSysConfigAndInfo->ate.MaxBatteryVoltage, 1);
  679. //EvseStopChargingEvent(normalStop, stopReason, 1);
  680. setEVStatus1(evstaus[4]);
  681. ShmSysConfigAndInfo->ate.Permission = STOP;
  682. setStatusMode(CCS_QUANTITY, ShmSysConfigAndInfo->ate.Permission);
  683. ShmSysConfigAndInfo->ate.ATEStatus = 0x00;
  684. SetChargingPermission(CCS_QUANTITY, ShmSysConfigAndInfo->ate.Permission, ShmSysConfigAndInfo->ate.TotalBatteryCap, ShmSysConfigAndInfo->ate.MaxBatteryCurrent, ShmSysConfigAndInfo->ate.MaxBatteryVoltage, 1);
  685. EvseStopChargingEvent(normalStop, stopReason, 1);
  686. /*
  687. ShmSysConfigAndInfo->ate.Permission = STOP;
  688. setChargerMode(CCS_QUANTITY, ShmSysConfigAndInfo->ate.Permission);
  689. ShmSysConfigAndInfo->ate.ATEStatus = 0x00;
  690. SetChargingPermission(CCS_QUANTITY, ShmSysConfigAndInfo->ate.Permission, ShmSysConfigAndInfo->ate.TotalBatteryCap, ShmSysConfigAndInfo->ate.MaxBatteryCurrent, ShmSysConfigAndInfo->ate.MaxBatteryVoltage, 1);
  691. */
  692. /*
  693. time_t CurrentTime;
  694. struct tm *tm;
  695. CurrentTime = time(NULL);
  696. tm = localtime(& CurrentTime);
  697. printf(" Get-Msg : %08X - %02x %02x %02x %02x %02x %02x %02x %02x\n ", frame.can_id, frame.data[0], frame.data[1], frame.data[2], frame.data[3],frame.data[4], frame.data[5], frame.data[6], frame.data[7] );
  698. printf("NOTIFICATION_EV_STOP : %04d-%02d-%02d %02d:%02d:%02d \n",
  699. tm->tm_year+1900,tm->tm_mon+1,tm->tm_mday,tm->tm_hour,tm->tm_min,tm->tm_sec);
  700. // 車端要求停止
  701. // frame.data[0] : 0x01 => normal stop, 0x02 => ev emergency stop
  702. if (frame.data[0] == 0x02)
  703. {
  704. //printf("NOTIFICATION_EV_STOP -----------------------------\n");
  705. AbnormalStopAnalysis(targetGun, frame.data + 1);
  706. }
  707. _chargingData[targetGun]->StopChargeFlag = YES;
  708. */
  709. }
  710. break;
  711. default:
  712. //printf("Ack none defined. intCmd = %d \n", intCmd);
  713. break;
  714. }
  715. }
  716. usleep(10000);
  717. }
  718. }
  719. }
  720. }
  721. //接收can
  722. void CHROMACANReceiver()
  723. {
  724. pid_t canRecPid;
  725. canRecPid = fork();
  726. if(canRecPid > 0){
  727. int nbytes;
  728. struct can_frame frame;
  729. int intCmd;
  730. while (1){
  731. //清空 canbus recever buf
  732. memset(&frame, 0, sizeof(struct can_frame));
  733. //讀取 canbus 是否有接收到封包
  734. nbytes = read(CanFd2, &frame, sizeof(struct can_frame));
  735. //如果有收到 canbus 封包
  736. if (nbytes > 0){
  737. intCmd = (int) (frame.can_id & CAN_EFF_MASK);//extended frame format
  738. #ifdef Debug
  739. //printf("hsout0StatusChange Get-INFYPWR-Msg : %08x - %02x %02x %02x %02x %02x %02x %02x %02x\n ", intCmd, frame.data[0], frame.data[1], frame.data[2], frame.data[3],frame.data[4], frame.data[5], frame.data[6], frame.data[7] );
  740. //printf(" Get-Msg : %08X - %02x %02x %02x %02x %02x %02x %02x %02x\n ", frame.can_id, frame.data[0], frame.data[1], frame.data[2], frame.data[3],frame.data[4], frame.data[5], frame.data[6], frame.data[7] );
  741. #endif
  742. //printf("hsout0StatusChange Get-INFYPWR-Msg : %08x - %02x %02x %02x %02x %02x %02x %02x %02x\n ", frame.can_id, frame.data[0], frame.data[1], frame.data[2], frame.data[3],frame.data[4], frame.data[5], frame.data[6], frame.data[7] );
  743. //printf("Ack none defined. intCmd = %08x \n", intCmd);
  744. switch (intCmd){
  745. case bn_res1:{
  746. /*
  747. ShmSysConfigAndInfo->ate.ATEState = (short) frame.data[0];
  748. setATEMode(CCS_QUANTITY, ShmSysConfigAndInfo->ate.ATEState);
  749. printf("00010102 Get-Msg : %d %08X - %02x %02x %02x %02x %02x %02x %02x %02x\n ", ShmSysConfigAndInfo->ate.ATEState, frame.can_id, frame.data[0], frame.data[1], frame.data[2], frame.data[3],frame.data[4], frame.data[5], frame.data[6], frame.data[7] );
  750. */
  751. break;
  752. }
  753. case bn_res2:{
  754. //printf(" Get-Msg : %08X - %02x %02x %02x %02x %02x %02x %02x %02x\n ", frame.can_id, frame.data[0], frame.data[1], frame.data[2], frame.data[3],frame.data[4], frame.data[5], frame.data[6], frame.data[7] );
  755. break;
  756. }
  757. case ATE_Connector2:{
  758. /*
  759. ShmSysConfigAndInfo->ate.chroma.ate_Connector_2.TargetVoltage = ((short) frame.data[1] << 8) + (short) frame.data[0];//
  760. ShmSysConfigAndInfo->ate.chroma.ate_Connector_2.TargetCurrent = ((short) frame.data[3] << 8) + (short) frame.data[2];//
  761. ShmSysConfigAndInfo->ate.chroma.ate_Connector_2.PresentVoltage = ((short) frame.data[5] << 8) + (short) frame.data[4];
  762. ShmSysConfigAndInfo->ate.chroma.ate_Connector_2.PresentCurrent = ((short) frame.data[7] << 8) + (short) frame.data[6];
  763. //ShmSysConfigAndInfo->ate.linkVoltage = ShmSysConfigAndInfo->ate.chroma.ate_Connector_2.PresentVoltage;
  764. ShmSysConfigAndInfo->ate.targetVoltage_Value = ((short) frame.data[1] << 8) + (short) frame.data[0];
  765. ShmSysConfigAndInfo->ate.targetCurrent_Value = ((short) frame.data[3] << 8) + (short) frame.data[2];
  766. //ShmSysConfigAndInfo->ate.maximumVoltage_value = ShmSysConfigAndInfo->ate.targetVoltage_Value+(ShmSysConfigAndInfo->ate.targetVoltage_Value*0.1);
  767. ShmSysConfigAndInfo->ate.maximumVoltage_value = ShmSysConfigAndInfo->ate.targetVoltage_Value+10;
  768. ShmSysConfigAndInfo->ate.linkVoltage = ShmSysConfigAndInfo->ate.targetVoltage_Value;
  769. */
  770. //printf("targetVoltage_Value= %d targetCurrent_Value =%d maximumVoltage_value = %d linkVoltage = %d \n",ShmSysConfigAndInfo->ate.targetVoltage_Value, ShmSysConfigAndInfo->ate.targetCurrent_Value, ShmSysConfigAndInfo->ate.maximumVoltage_value, ShmSysConfigAndInfo->ate.linkVoltage);
  771. //printf("ATE_Connector2 Get-Msg : %08X - %02x %02x %02x %02x %02x %02x %02x %02x %d %d %d %d %d %d \n ", frame.can_id, frame.data[0], frame.data[1], frame.data[2], frame.data[3],frame.data[4], frame.data[5], frame.data[6], frame.data[7], ShmSysConfigAndInfo->ate.chroma.ate_Connector_2.TargetVoltage, ShmSysConfigAndInfo->ate.chroma.ate_Connector_2.TargetCurrent, ShmSysConfigAndInfo->ate.chroma.ate_Connector_2.PresentVoltage, ShmSysConfigAndInfo->ate.chroma.ate_Connector_2.PresentCurrent, ShmSysConfigAndInfo->ate.targetVoltage_Value, ShmSysConfigAndInfo->ate.targetCurrent_Value);
  772. break;
  773. }
  774. case ATE_Connector1:{
  775. if(ShmSysConfigAndInfo->ate.ATEState == 1){//ccs
  776. ShmSysConfigAndInfo->ate.chroma.ate_Connector_1.TargetVoltage = ((short) frame.data[1] << 8) + (short) frame.data[0];//
  777. ShmSysConfigAndInfo->ate.chroma.ate_Connector_1.TargetCurrent = ((short) frame.data[3] << 8) + (short) frame.data[2];//
  778. ShmSysConfigAndInfo->ate.chroma.ate_Connector_1.PresentVoltage = ((short) frame.data[5] << 8) + (short) frame.data[4];
  779. ShmSysConfigAndInfo->ate.chroma.ate_Connector_1.PresentCurrent = ((short) frame.data[7] << 8) + (short) frame.data[6];
  780. //ShmSysConfigAndInfo->ate.linkVoltage = ShmSysConfigAndInfo->ate.chroma.ate_Connector_1.PresentVoltage;
  781. //ShmSysConfigAndInfo->ate.targetVoltage_Value = ((short) frame.data[1] << 8) + (short) frame.data[0];
  782. int voltage = ((short) frame.data[1] << 8) + (short) frame.data[0];
  783. int evseMaxCurrent = ShmSysConfigAndInfo->ate.vccu.v2g_EVSEMaximumCurrentLim.VCCU_V2G_EVSEMaximumCurre_0000 / 10;
  784. //int evseMaxvoltage = ShmSysConfigAndInfo->ate.vccu.v2g_EVSEPresentVoltage.VCCU_V2G_EVSEPresentVoltage_Va / 10;
  785. ShmSysConfigAndInfo->ate.targetCurrent_Value = ((short) frame.data[3] << 8) + (short) frame.data[2];
  786. //ShmSysConfigAndInfo->ate.maximumVoltage_value = ShmSysConfigAndInfo->ate.targetVoltage_Value+(ShmSysConfigAndInfo->ate.targetVoltage_Value*0.1);
  787. //ShmSysConfigAndInfo->ate.maximumVoltage_value = ShmSysConfigAndInfo->ate.targetVoltage_Value+10;
  788. //ShmSysConfigAndInfo->ate.maximumVoltage_value = 0;
  789. //ShmSysConfigAndInfo->ate.targetVoltage_Value = 0;
  790. if(voltage > (maxValue - 10)){
  791. ShmSysConfigAndInfo->ate.maximumVoltage_value = maxValue;
  792. ShmSysConfigAndInfo->ate.targetVoltage_Value = maxValue - 20;
  793. ShmSysConfigAndInfo->ate.linkVoltage = maxValue - 20;
  794. }else{
  795. ShmSysConfigAndInfo->ate.maximumVoltage_value = voltage + 10;
  796. ShmSysConfigAndInfo->ate.targetVoltage_Value = voltage - 10;
  797. ShmSysConfigAndInfo->ate.linkVoltage = voltage - 10;
  798. }
  799. if((ShmSysConfigAndInfo->ate.targetCurrent_Value > evseMaxCurrent) && (evseMaxCurrent > 0)){
  800. ShmSysConfigAndInfo->ate.targetCurrent_Value = evseMaxCurrent;
  801. }
  802. }else if (ShmSysConfigAndInfo->ate.ATEState == 2){//gb
  803. ShmSysConfigAndInfo->ate.chroma.ate_Connector_2.TargetVoltage = ((short) frame.data[1] << 8) + (short) frame.data[0];//
  804. ShmSysConfigAndInfo->ate.chroma.ate_Connector_2.TargetCurrent = ((short) frame.data[3] << 8) + (short) frame.data[2];//
  805. ShmSysConfigAndInfo->ate.chroma.ate_Connector_2.PresentVoltage = ((short) frame.data[5] << 8) + (short) frame.data[4];
  806. ShmSysConfigAndInfo->ate.chroma.ate_Connector_2.PresentCurrent = ((short) frame.data[7] << 8) + (short) frame.data[6];
  807. int voltage = ShmSysConfigAndInfo->ate.chroma.ate_Connector_2.TargetVoltage * 10;
  808. int current = ShmSysConfigAndInfo->ate.chroma.ate_Connector_2.TargetCurrent * 10;
  809. if(voltage > (gbmaxValue - 100)){
  810. //ShmSysConfigAndInfo->ate.targetVoltage_Value = maxValue - 100;
  811. ShmSysConfigAndInfo->ate.chademoTargetVoltage_Value = gbmaxValue - 100;
  812. ShmSysConfigAndInfo->ate.RequireVoltage = gbmaxValue -100;
  813. ShmSysConfigAndInfo->ate.MaxBatteryVoltage = gbmaxValue;
  814. }else{
  815. ShmSysConfigAndInfo->ate.chademoTargetVoltage_Value = voltage;
  816. ShmSysConfigAndInfo->ate.RequireVoltage = voltage;
  817. ShmSysConfigAndInfo->ate.MaxBatteryVoltage = gbmaxValue;
  818. }
  819. //ShmSysConfigAndInfo->ate.targetVoltage_Value = voltage;
  820. ShmSysConfigAndInfo->ate.chademoTargetCurrent_Value = current;
  821. ShmSysConfigAndInfo->ate.RequireCurrent = current;
  822. //printf("voltage= %d cstatus = %d current= %d voltage =%d %02x %02x \n", ShmSysConfigAndInfo->ate.targetVoltage_Value, ShmSysConfigAndInfo->ate.chademo.id03.state , current, voltage, frame.data[1], frame.data[0]);
  823. }else if (ShmSysConfigAndInfo->ate.ATEState == 3){//chademo
  824. }
  825. //printf("targetVoltage_Value= %d targetCurrent_Value =%d maximumVoltage_value = %d linkVoltage = %d \n",ShmSysConfigAndInfo->ate.targetVoltage_Value, ShmSysConfigAndInfo->ate.targetCurrent_Value, ShmSysConfigAndInfo->ate.maximumVoltage_value, ShmSysConfigAndInfo->ate.linkVoltage);
  826. //printf("ATE_Connector1 Get-Msg : %08X - %02x %02x %02x %02x %02x %02x %02x %02x %d %d %d %d %d %d \n ", frame.can_id, frame.data[0], frame.data[1], frame.data[2], frame.data[3],frame.data[4], frame.data[5], frame.data[6], frame.data[7], ShmSysConfigAndInfo->ate.chroma.ate_Connector_1.TargetVoltage, ShmSysConfigAndInfo->ate.chroma.ate_Connector_1.TargetCurrent, ShmSysConfigAndInfo->ate.chroma.ate_Connector_1.PresentVoltage, ShmSysConfigAndInfo->ate.chroma.ate_Connector_1.PresentCurrent, ShmSysConfigAndInfo->ate.targetVoltage_Value, ShmSysConfigAndInfo->ate.targetCurrent_Value );
  827. break;
  828. }
  829. default:
  830. break;
  831. }
  832. }
  833. usleep(2000);
  834. //usleep(100000);
  835. }
  836. }
  837. }
  838. int DiffTimeb(struct timeb ST, struct timeb ET)
  839. {
  840. //return milli-second
  841. unsigned int StartTime,StopTime;
  842. StartTime=(unsigned int)ST.time;
  843. StopTime=(unsigned int)ET.time;
  844. //return (StopTime-StartTime)*1000+ET.millitm-ST.millitm;
  845. return (StopTime-StartTime);
  846. }
  847. unsigned short MaxValue(unsigned short value1, unsigned short value2)
  848. {
  849. return value1 >= value2 ? value1 : value2;
  850. }
  851. void Initialization()
  852. {
  853. _chargingData[CCS_QUANTITY] = &ShmSysConfigAndInfo->SysInfo.CcsChargingData[CCS_QUANTITY];
  854. }
  855. void VCCU_Requests(int LED0, int LED1, int LED2,
  856. int HighSideOut0, int HighSideOut1, int HighSideOut2, int HighSideOut3,
  857. int HighSideOut4, int RTC_TimerRequest, int PlugLock,
  858. int RTC_TimerValue,
  859. int ControlPilot, int ChargeUnit, int Inlet){
  860. struct VCCU_Requests obj;
  861. obj.VCCU_LED0_Request = LED0;//0.0
  862. obj.VCCU_LED1_Request = LED1;//0.0
  863. obj.VCCU_LED2_Request = LED2;//0.0
  864. obj.byte3.VCCU_HighSideOut0_Request = HighSideOut0;//3
  865. obj.byte3.VCCU_HighSideOut1_Request = HighSideOut1;//3
  866. obj.byte3.VCCU_HighSideOut2_Request = HighSideOut2;//3
  867. obj.byte3.VCCU_HighSideOut3_Request = HighSideOut3;//3
  868. obj.byte4.VCCU_HighSideOut4_Request = HighSideOut4;//3
  869. obj.byte4.VCCU_RTC_TimerRequest = RTC_TimerRequest;//3
  870. obj.byte4.VCCU_PlugLock_MotorRequest = PlugLock;//7
  871. obj.VCCU_RTC_TimerValue= RTC_TimerValue;//0
  872. obj.byte6.VCCU_ControlPilot_ChargeModeRe = ControlPilot;//7
  873. obj.byte6.VCCU_ChargeUnit_Request = ChargeUnit;//3
  874. obj.byte6.VCCU_Inlet_MotorRequest = Inlet;//3
  875. byte data[7];
  876. data[0] = *((UBYTE *) &obj.VCCU_LED0_Request);
  877. data[1] = *((UBYTE *) &obj.VCCU_LED1_Request);
  878. data[2] = *((UBYTE *) &obj.VCCU_LED2_Request);
  879. data[3] = *((UBYTE *) &obj.byte3);
  880. data[4] = *((UBYTE *) &obj.byte4);
  881. data[5] = *((UBYTE *) &obj.VCCU_RTC_TimerValue);
  882. data[6] = *((UBYTE *) &obj.byte6);
  883. //printf("%02x %02x %02x %02x %02x %02x %02x \n", data[0], data[1], data[2], data[3], data[4], data[5] , data[6]);
  884. setVCCU_Requests(data, sizeof(data));
  885. }
  886. void VCCU_ChargeFromVehicle(int canfd, int linkVoltage, int contactorVoltage,
  887. int chargePermission, int isolationMeasurem,
  888. int plugLockPermissio, int plugUnlockPermiss, int contactorStatus){
  889. struct VCCU_ChargeFromVehicle obj;
  890. obj.VCCU_Vehicle_LinkVoltage= linkVoltage;//500
  891. obj.VCCU_Vehicle_ContactorVoltage = contactorVoltage;//0
  892. obj.DATA.bits.VCCU_Vehicle_ChargePermission = chargePermission;//Not_allowed
  893. obj.DATA.bits.VCCU_Vehicle_IsolationMeasurem = isolationMeasurem;//Active
  894. obj.DATA.bits.VCCU_Vehicle_PlugLockPermissio = plugLockPermissio;//Allowed//Not_allowed;
  895. obj.DATA.bits.VCCU_Vehicle_PlugUnlockPermiss = plugUnlockPermiss;//Not_allowed
  896. obj.bits.VCCU_Vehicle_ContactorStatus = contactorStatus;//Open
  897. obj.bits.VCCU_Vehicle_StopCharge = 3;//Open
  898. obj.bits.VCCU_Vehicle_ChargeSelection = 3;//Open
  899. byte* data1;
  900. data1 = (byte*) &(*((UWORD *) &obj.VCCU_Vehicle_ContactorVoltage));
  901. byte* data2;
  902. data2 = (byte*) &(*((UWORD *) &obj.VCCU_Vehicle_LinkVoltage));
  903. byte data[6];
  904. data[0] = data1[0];
  905. data[1] = data1[1];
  906. data[2] = data2[0];
  907. data[3] = data2[1];
  908. data[4] = *((UBYTE *) &obj.DATA);
  909. data[5] = *((UBYTE *) &obj.bits);
  910. setVCCU_ChargeFromVehicle(data, sizeof(data));
  911. }
  912. void VCVCCU_V2G_RemainingTimeToFullSO(int remainingTime){
  913. struct VCCU_V2G_RemainingTimeToFullSO obj;
  914. obj.VCCU_V2G_RemainingTimeToB_0000.value = remainingTime;
  915. obj.DATA.VCCU_V2G_RemainingTimeToFullSO = 1;
  916. obj.DATA.VCCU_V2G_RemainingTimeToF_0002 = 0;//520
  917. obj.VCCU_V2G_RemainingTimeToB_0001.value = 0;//1
  918. obj.VCCU_V2G_RemainingTimeToB_0003.value = 0;//0
  919. byte* data1;
  920. data1 = (byte*) &(*((UWORD *) &obj.VCCU_V2G_RemainingTimeToB_0000));
  921. byte data[5];
  922. data[0] = data1[0];
  923. data[1] = data1[1];
  924. data[2] = *((UBYTE *) &obj.VCCU_V2G_RemainingTimeToB_0003);
  925. data[3] = *((UBYTE *) &obj.VCCU_V2G_RemainingTimeToB_0001);
  926. data[4] = *((UBYTE *) &obj.DATA);
  927. setVCCU_V2G_RemainingTimeToFullSO(data, sizeof(data));
  928. }
  929. void VCCU_V2G_EVMaximumVoltageLimit(int VMaximumVoltageLimit,
  930. int EVMaximumVoltage_0002,
  931. int EVMaximumVoltage_0000,
  932. int EVMaximumVoltage_0001,
  933. int EVMaximumVoltage_0003){
  934. struct VCCU_V2G_EVMaximumVoltageLimit obj;
  935. obj.DATA1.VCCU_V2G_EVMaximumVoltageLimit = VMaximumVoltageLimit;//1
  936. obj.DATA1.VCCU_V2G_EVMaximumVoltage_0002 = EVMaximumVoltage_0002;//5
  937. obj.VCCU_V2G_EVMaximumVoltage_0000.value = EVMaximumVoltage_0000;//520
  938. obj.VCCU_V2G_EVMaximumVoltage_0001.value = EVMaximumVoltage_0001;//1
  939. obj.VCCU_V2G_EVMaximumVoltage_0003.value = EVMaximumVoltage_0003;//0
  940. byte* data1;
  941. data1 = (byte*) &(*((UWORD *) &obj.VCCU_V2G_EVMaximumVoltage_0000));
  942. byte data[5];
  943. data[0] = *((UBYTE *) &obj.DATA1);
  944. data[1] = *((UBYTE *) &obj.VCCU_V2G_EVMaximumVoltage_0003);
  945. data[2] = data1[0];
  946. data[3] = data1[1];
  947. data[4] = *((UBYTE *) &obj.VCCU_V2G_EVMaximumVoltage_0001);
  948. //printf("%02x %02x %02x %02x %02x \n", data[0], data[1], data[2], data[3], data[4]);
  949. setVCCU_V2G_EVMaximumVoltageLimit(data, sizeof(data));
  950. }
  951. void VCCU_V2G_EVMaximumCurrentLimit(int EVMaximumCurrentLimit,
  952. int EVMaximumCurrent_0000,
  953. int EVMaximumCurrent_0001,
  954. int EVMaximumCurrent_0002,
  955. int EVMaximumCurrent_0003){
  956. struct VCCU_V2G_EVMaximumCurrentLimit obj;
  957. obj.DATA1.VCCU_V2G_EVMaximumCurrentLimit = EVMaximumCurrentLimit;//1
  958. obj.DATA1.VCCU_V2G_EVMaximumCurrent_0000 = EVMaximumCurrent_0000;//3
  959. obj.VCCU_V2G_EVMaximumCurrent_0001.value = EVMaximumCurrent_0001;//1
  960. obj.VCCU_V2G_EVMaximumCurrent_0002.value = EVMaximumCurrent_0002;//0
  961. obj.VCCU_V2G_EVMaximumCurrent_0003.value = EVMaximumCurrent_0003;//10
  962. byte* data1;
  963. data1 = (byte*) &(*((UWORD *) &obj.VCCU_V2G_EVMaximumCurrent_0003));
  964. byte data[5];
  965. data[0] = *((UBYTE *) &obj.DATA1);
  966. data[1] = *((UBYTE *) &obj.VCCU_V2G_EVMaximumCurrent_0002);
  967. data[2] = data1[0];
  968. data[3] = data1[1];
  969. data[4] = *((UBYTE *) &obj.VCCU_V2G_EVMaximumCurrent_0001);
  970. //printf("%02x %02x %02x %02x %02x \n", data[0], data[1], data[2], data[3], data[4]);
  971. setVCCU_V2G_EVMaximumCurrentLimit(data, sizeof(data));
  972. }
  973. void VCCU_V2G_EVTargetVoltage(int EVTargetVoltage_Value,
  974. int EVTargetVoltage_Unit,
  975. int EVTargetVoltage_UnitF,
  976. int EVTargetVoltage_Multi){//C2 01 00 01 05
  977. struct VCCU_V2G_EVTargetVoltage obj;
  978. obj.VCCU_V2G_EVTargetVoltage_Value.value = EVTargetVoltage_Value;//450
  979. obj.VCCU_V2G_EVTargetVoltage_Unit.value = EVTargetVoltage_Unit;//5
  980. obj.VCCU_V2G_EVTargetVoltage_UnitF.value = EVTargetVoltage_UnitF;//1
  981. obj.VCCU_V2G_EVTargetVoltage_Multi.value = EVTargetVoltage_Multi;//0
  982. byte* data1;
  983. data1 = (byte*) &(*((UWORD *) &obj.VCCU_V2G_EVTargetVoltage_Value));
  984. byte data[5];
  985. data[0] = data1[0];
  986. data[1] = data1[1];
  987. data[2] = *((UBYTE *) &obj.VCCU_V2G_EVTargetVoltage_Multi);
  988. data[3] = *((UBYTE *) &obj.VCCU_V2G_EVTargetVoltage_UnitF);
  989. data[4] = *((UBYTE *) &obj.VCCU_V2G_EVTargetVoltage_Unit);
  990. //printf("%d %02x %02x \n",obj.VCCU_V2G_EVTargetVoltage_Value.value, data[0], data[1]);
  991. //printf("%02x %02x %02x %02x %02x \n", data[0], data[1], data[2], data[3], data[4]);
  992. setVCCU_V2G_EVTargetVoltage(data, sizeof(data));
  993. }
  994. void VCCU_V2G_EVTargetCurrent(int EVTargetCurrent_Unit,
  995. int EVTargetCurrent_Value,
  996. int EVTargetCurrent_UnitF,
  997. int EVTargetCurrent_Multi){//05 00 00 01 03
  998. struct VCCU_V2G_EVTargetCurrent obj;
  999. obj.VCCU_V2G_EVTargetCurrent_Unit.value = EVTargetCurrent_Unit;//3
  1000. obj.VCCU_V2G_EVTargetCurrent_Value.value = EVTargetCurrent_Value;//5
  1001. obj.VCCU_V2G_EVTargetCurrent_UnitF.value = EVTargetCurrent_UnitF;//1
  1002. obj.VCCU_V2G_EVTargetCurrent_Multi.value = EVTargetCurrent_Multi;//0
  1003. byte* data1;
  1004. data1 = (byte*) &(*((UWORD *) &obj.VCCU_V2G_EVTargetCurrent_Value));
  1005. byte data[5];
  1006. data[0] = data1[0];
  1007. data[1] = data1[1];
  1008. data[2] = *((UBYTE *) &obj.VCCU_V2G_EVTargetCurrent_Multi);
  1009. data[3] = *((UBYTE *) &obj.VCCU_V2G_EVTargetCurrent_UnitF);
  1010. data[4] = *((UBYTE *) &obj.VCCU_V2G_EVTargetCurrent_Unit);
  1011. //printf("%02x %02x %02x %02x %02x \n", data[0], data[1], data[2], data[3], data[4]);
  1012. setVCCU_V2G_EVTargetCurrent(data, sizeof(data));
  1013. }
  1014. void VCCU_V2G_VehicleStatus(int canfd, int EnergyTra, int EVErrorCode,
  1015. int EVPowerDeliveryParame, int EVRESSSOC,
  1016. int EVRESSConditioningFla, int EVRESSConditionin, int EVReady,
  1017. int BulkChargingCompleteF, int EVCabinConditioningFl, int EVCabinConditioning,
  1018. int ChargingComplete, int FullSOCFlag, int FullSOC,
  1019. int BulkSOCFlag, int BulkSOC, int BulkChargingComplete,
  1020. int BulkChargingCompleteFValue){
  1021. struct VCCU_V2G_VehicleStatus obj;
  1022. obj.DATA4.VCCU_V2G_StateM_EnergyTra_0000 = EnergyTra;//VCCU_V2G_StateM_EnergyTra_0000_DC_DC_extended;
  1023. obj.DATA1.VCCU_V2G_EVErrorCode = EVErrorCode;//0;
  1024. obj.DATA4.VCCU_V2G_EVPowerDeliveryParame = EVPowerDeliveryParame;//3;
  1025. obj.VCCU_V2G_EVRESSSOC.value = EVRESSSOC;//0;
  1026. obj.DATA3.VCCU_V2G_EVRESSConditioningFla = EVRESSConditioningFla;//3;
  1027. obj.DATA3.VCCU_V2G_EVRESSConditioning = EVRESSConditionin;//3;
  1028. obj.DATA3.VCCU_V2G_EVReady = EVReady;//3;
  1029. obj.DATA1.VCCU_V2G_BulkChargingCompleteF = BulkChargingCompleteF;//3;
  1030. obj.DATA3.VCCU_V2G_EVCabinConditioningFl = EVCabinConditioningFl;//3;
  1031. obj.DATA2.VCCU_V2G_EVCabinConditioning = EVCabinConditioning;//3;
  1032. obj.DATA2.VCCU_V2G_ChargingComplete = ChargingComplete;//3;
  1033. obj.DATA2.VCCU_V2G_FullSOCFlag = FullSOCFlag;//0;
  1034. obj.VCCU_V2G_FullSOC.value = FullSOC;//3;
  1035. obj.DATA2.VCCU_V2G_BulkSOCFlag = BulkSOCFlag;//3;
  1036. obj.VCCU_V2G_BulkSOC.value = BulkSOC;//0;
  1037. obj.DATA1.VCCU_V2G_BulkChargingComplete = BulkChargingComplete;//3;
  1038. obj.DATA1.VCCU_V2G_BulkChargingCompleteF = BulkChargingCompleteFValue;//3;
  1039. byte data[7];
  1040. data[0] = *((UBYTE *) &obj.DATA1);
  1041. data[1] = *((UBYTE *) &obj.DATA2);
  1042. data[2] = *((UBYTE *) &obj.DATA3);
  1043. data[3] = *((UBYTE *) &obj.DATA4);
  1044. data[4] = *((UBYTE *) &obj.VCCU_V2G_BulkSOC);
  1045. data[5] = *((UBYTE *) &obj.VCCU_V2G_FullSOC);
  1046. data[6] = *((UBYTE *) &obj.VCCU_V2G_EVRESSSOC);
  1047. setVCCU_V2G_VehicleStatus(data, sizeof(data));
  1048. }
  1049. unsigned char isModeChange(unsigned char gun_index)
  1050. {
  1051. unsigned char result = NO;
  1052. if(_chargingData[gun_index]->SystemStatus != _chargingData[gun_index]->PreviousSystemStatus)
  1053. {
  1054. result = YES;
  1055. _chargingData[gun_index]->PreviousSystemStatus = _chargingData[gun_index]->SystemStatus;
  1056. }
  1057. return result;
  1058. }
  1059. void setChargerMode(byte gun_index, byte mode)
  1060. {
  1061. _chargingData[gun_index]->SystemStatus = mode;
  1062. }
  1063. void handleEmulatorFaultStatus(){
  1064. setEVStatus1(evstaus[4]);
  1065. ShmSysConfigAndInfo->ate.Permission = STOP;
  1066. setStatusMode(CCS_QUANTITY, ShmSysConfigAndInfo->ate.Permission);
  1067. ShmSysConfigAndInfo->ate.ATEStatus = 0x00;
  1068. SetChargingPermission(CCS_QUANTITY, ShmSysConfigAndInfo->ate.Permission, ShmSysConfigAndInfo->ate.TotalBatteryCap,
  1069. ShmSysConfigAndInfo->ate.MaxBatteryCurrent, ShmSysConfigAndInfo->ate.MaxBatteryVoltage, 1);
  1070. EvseStopChargingEvent(normalStop, stopReason, 1);
  1071. }
  1072. int main(int argc, char *argv[])
  1073. {
  1074. if(InitShareMemory() == FAIL)
  1075. {
  1076. #ifdef SystemLogMessage
  1077. printf("InitShareMemory NG\n");
  1078. #endif
  1079. if(ShmStatusCodeData != NULL)
  1080. {
  1081. ShmStatusCodeData->AlarmCode.AlarmEvents.bits.FailToCreateShareMemory=1;
  1082. }
  1083. sleep(5);
  1084. return 0;
  1085. }
  1086. Initialization();
  1087. CanFd = InitCanBus();
  1088. CanFd2 = CHROMAInitCanBus();
  1089. CANReceiver();
  1090. CHROMACANReceiver();
  1091. //printf("%08X %08X %d %d %d ....................\n" , bn1, (bn1 | 0x80000000), CanFd, CanFd2, ShmSysConfigAndInfo->ate.ATEState);
  1092. /*
  1093. sleep(2);
  1094. system("killall Module_InternalComm");
  1095. system("killall Module_EvComm");
  1096. return 0;
  1097. */
  1098. printf("EvComm %d....................\n" , ShmSysConfigAndInfo->ate.ATEState);
  1099. while(true){
  1100. if(ShmSysConfigAndInfo->ate.ATEState == 1){//VCCU
  1101. setBootNotification1();
  1102. VCCU_TD();
  1103. VCCU_Requests(0, 0, 0,
  1104. 3, 3, 3, 3,
  1105. 3, 3, 7,
  1106. 0,
  1107. 7, 3, 3);
  1108. int status = isModeChange(CCS_QUANTITY);
  1109. VCVCCU_V2G_RemainingTimeToFullSO(8000);
  1110. switch(_chargingData[CCS_QUANTITY]->SystemStatus){
  1111. case V_IDLE:{
  1112. if (status){
  1113. printf("CCS IDLE Processing 1....................\n");
  1114. }
  1115. setEVStatus1(evstaus[0]);
  1116. break;
  1117. }
  1118. case V_UNMATEDPLUG:{
  1119. if (status){
  1120. printf("CCS UNMATEDPLUG Processing 2....................\n");
  1121. }
  1122. setEVStatus1(evstaus[0]);
  1123. VCCU_ChargeFromVehicle(CanFd, ShmSysConfigAndInfo->ate.linkVoltage, 0, Not_allowed, Active, Not_allowed, Not_allowed, Opened);
  1124. break;
  1125. }
  1126. case V_MATED_PLUG_INLET_UNLOCKED:{
  1127. if (status){
  1128. if(ShmSysConfigAndInfo->ate.vccu.inletStatus.DATA2.VCCU_PlugPresent_Status == VCCU_InletStatus_Connected){
  1129. }
  1130. printf("CCS MATED_PLUG_INLET_UNLOCKED Processing 3....................\n");
  1131. }
  1132. setEVStatus1(evstaus[0]);
  1133. VCCU_ChargeFromVehicle(CanFd, ShmSysConfigAndInfo->ate.linkVoltage, 0, Not_allowed, Active, Allowed, Not_allowed, Opened);
  1134. //VCCU_ChargeFromVehicle(CanFd, ShmSysConfigAndInfo->ate.linkVoltage, 0, Not_allowed, Active, Allowed, Not_allowed, Opened);
  1135. break;
  1136. }
  1137. case V_INLETLOCKING:{
  1138. if (status){
  1139. printf("CCS INLETLOCKING Processing 4....................\n");
  1140. }
  1141. setEVStatus1(evstaus[0]);
  1142. break;
  1143. }
  1144. case V_INLETLOCKED:{
  1145. if (status){
  1146. printf("CCS INLETLOCKED Processing 5....................\n");
  1147. }
  1148. setEVStatus1(evstaus[1]);
  1149. VCCU_ChargeFromVehicle(CanFd, ShmSysConfigAndInfo->ate.linkVoltage, 0, Not_allowed, Active, Allowed, Not_allowed, Opened);
  1150. VCCU_V2G_EVMaximumVoltageLimit(TRUE, U_V, ShmSysConfigAndInfo->ate.maximumVoltage_value, TRUE, 0);
  1151. VCCU_V2G_EVMaximumCurrentLimit(TRUE, U_A, TRUE, 0, ShmSysConfigAndInfo->ate.maximumCurrent_value);
  1152. VCCU_V2G_EVTargetVoltage(ShmSysConfigAndInfo->ate.targetVoltage_Value, U_V, TRUE, 0);
  1153. VCCU_V2G_EVTargetCurrent(U_A, ShmSysConfigAndInfo->ate.targetCurrent_Value, TRUE, 0);
  1154. VCCU_V2G_VehicleStatus(CanFd, VCCU_V2G_StateM_EnergyTra_0000_DC_DC_extended, 0,
  1155. 3, soc,
  1156. 3, 3, TRUE,
  1157. 3, 3, 3,
  1158. 3, 3, 0,
  1159. 3, 0, 3,
  1160. 3);
  1161. /*
  1162. VCCU_V2G_EVMaximumVoltageLimit(TRUE, U_V, ShmSysConfigAndInfo->ate.maximumVoltage_value, TRUE, 0);
  1163. VCCU_V2G_EVMaximumCurrentLimit(TRUE, U_A, TRUE, 0, ShmSysConfigAndInfo->ate.maximumCurrent_value);
  1164. */
  1165. break;
  1166. }
  1167. case V_SLAC:{
  1168. if (status){
  1169. printf("CCS SLAC Processing 6....................\n");
  1170. }
  1171. setEVStatus1(evstaus[1]);
  1172. VCCU_ChargeFromVehicle(CanFd, ShmSysConfigAndInfo->ate.linkVoltage, 0, Not_allowed, Active, Allowed, Not_allowed, Opened);
  1173. /*
  1174. VCCU_V2G_EVMaximumVoltageLimit(TRUE, U_V, ShmSysConfigAndInfo->ate.maximumVoltage_value, TRUE, 0);
  1175. VCCU_V2G_EVMaximumCurrentLimit(TRUE, U_A, TRUE, 0, ShmSysConfigAndInfo->ate.maximumCurrent_value);
  1176. */
  1177. VCCU_V2G_VehicleStatus(CanFd, VCCU_V2G_StateM_EnergyTra_0000_DC_DC_extended, 0,
  1178. 3, soc,
  1179. 3, 3, TRUE,
  1180. 3, 3, 3,
  1181. 3, 3, 0,
  1182. 3, 0, 3,
  1183. 3);
  1184. VCCU_V2G_EVMaximumVoltageLimit(TRUE, U_V, ShmSysConfigAndInfo->ate.maximumVoltage_value, TRUE, 0);
  1185. VCCU_V2G_EVMaximumCurrentLimit(TRUE, U_A, TRUE, 0, ShmSysConfigAndInfo->ate.maximumCurrent_value);
  1186. VCCU_V2G_EVTargetVoltage(ShmSysConfigAndInfo->ate.targetVoltage_Value, U_V, TRUE, 0);
  1187. VCCU_V2G_EVTargetCurrent(U_A, ShmSysConfigAndInfo->ate.targetCurrent_Value, TRUE, 0);
  1188. break;
  1189. }
  1190. case V_DEFINITION:{
  1191. if (status){
  1192. printf("CCS DEFINITION Processing 7....................\n");
  1193. }
  1194. setEVStatus1(evstaus[1]);
  1195. /*
  1196. VCCU_V2G_VehicleStatus(CanFd, VCCU_V2G_StateM_EnergyTra_0000_DC_DC_extended, 0, 3, 0,
  1197. 3, 3, TRUE, 3, 3, 3, 3, 3, 0, 3, 0, 3, 3);
  1198. */
  1199. /*
  1200. VCCU_V2G_EVMaximumVoltageLimit(TRUE, U_V, 500, TRUE, 0);
  1201. VCCU_V2G_EVMaximumCurrentLimit(TRUE, U_A, TRUE, 0, 10);
  1202. VCCU_V2G_EVMaximumVoltageLimit(TRUE, U_V, ShmSysConfigAndInfo->ate.maximumVoltage_value, TRUE, 0);
  1203. VCCU_V2G_EVMaximumCurrentLimit(TRUE, U_A, TRUE, 0, ShmSysConfigAndInfo->ate.maximumCurrent_value);
  1204. */
  1205. VCCU_ChargeFromVehicle(CanFd, ShmSysConfigAndInfo->ate.linkVoltage, 0, Not_allowed, Active, Allowed, Not_allowed, Opened);
  1206. VCCU_V2G_VehicleStatus(CanFd, VCCU_V2G_StateM_EnergyTra_0000_DC_DC_extended, 0,
  1207. 3, soc,
  1208. 3, 3, TRUE,
  1209. 3, 3, 3,
  1210. 3, 3, 0,
  1211. 3, 0, 3,
  1212. 3);
  1213. VCCU_V2G_EVMaximumVoltageLimit(TRUE, U_V, ShmSysConfigAndInfo->ate.maximumVoltage_value, TRUE, 0);
  1214. VCCU_V2G_EVMaximumCurrentLimit(TRUE, U_A, TRUE, 0, ShmSysConfigAndInfo->ate.maximumCurrent_value);
  1215. VCCU_V2G_EVTargetVoltage(ShmSysConfigAndInfo->ate.targetVoltage_Value, U_V, TRUE, 0);
  1216. VCCU_V2G_EVTargetCurrent(U_A, ShmSysConfigAndInfo->ate.targetCurrent_Value, TRUE, 0);
  1217. break;
  1218. }
  1219. case V_CABLECHECK:{
  1220. if (status){
  1221. printf("CCS CABLECHECK Processing 8....................\n");
  1222. }
  1223. setEVStatus1(evstaus[1]);
  1224. VCCU_ChargeFromVehicle(CanFd, ShmSysConfigAndInfo->ate.linkVoltage, 0, Allowed, Active, Allowed, Not_allowed, Opened);
  1225. VCCU_V2G_VehicleStatus(CanFd, VCCU_V2G_StateM_EnergyTra_0000_DC_DC_extended, 0,
  1226. 3, soc,
  1227. 3, 3, TRUE,
  1228. 3, 3, 3,
  1229. 3, 3, 0,
  1230. 3, 0, 3,
  1231. 3);
  1232. VCCU_V2G_EVMaximumVoltageLimit(TRUE, U_V, ShmSysConfigAndInfo->ate.maximumVoltage_value, TRUE, 0);
  1233. VCCU_V2G_EVMaximumCurrentLimit(TRUE, U_A, TRUE, 0, ShmSysConfigAndInfo->ate.maximumCurrent_value);
  1234. VCCU_V2G_EVTargetVoltage(ShmSysConfigAndInfo->ate.targetVoltage_Value, U_V, TRUE, 0);
  1235. VCCU_V2G_EVTargetCurrent(U_A, ShmSysConfigAndInfo->ate.targetCurrent_Value, TRUE, 0);
  1236. break;
  1237. }
  1238. case V_ISOLATION:{
  1239. if (status){
  1240. printf("CCS ISOLATION Processing 9....................\n");
  1241. }
  1242. setEVStatus1(evstaus[1]);
  1243. VCCU_ChargeFromVehicle(CanFd, ShmSysConfigAndInfo->ate.linkVoltage, 0, Allowed, Not_Active, Allowed, Not_allowed, Opened);
  1244. VCCU_V2G_VehicleStatus(CanFd, VCCU_V2G_StateM_EnergyTra_0000_DC_DC_extended, 0,
  1245. 3, soc,
  1246. 3, 3, TRUE,
  1247. 3, 3, 3,
  1248. 3, 3, 0,
  1249. 3, 0, 3,
  1250. 3);
  1251. VCCU_V2G_EVMaximumVoltageLimit(TRUE, U_V, ShmSysConfigAndInfo->ate.maximumVoltage_value, TRUE, 0);
  1252. VCCU_V2G_EVMaximumCurrentLimit(TRUE, U_A, TRUE, 0, ShmSysConfigAndInfo->ate.maximumCurrent_value);
  1253. VCCU_V2G_EVTargetVoltage(ShmSysConfigAndInfo->ate.targetVoltage_Value, U_V, TRUE, 0);
  1254. VCCU_V2G_EVTargetCurrent(U_A, ShmSysConfigAndInfo->ate.targetCurrent_Value, TRUE, 0);
  1255. break;
  1256. }
  1257. case V_VOLTAGEDIFFERENCE:{
  1258. if (status){
  1259. printf("CCS VOLTAGEDIFFERENCE Processing 10 VCCU_V2G_EVSEPresentVoltage_Va = %d ....................\n", ShmSysConfigAndInfo->ate.vccu.v2g_EVSEPresentVoltage.VCCU_V2G_EVSEPresentVoltage_Va);
  1260. }
  1261. setEVStatus1(evstaus[1]);
  1262. /*
  1263. int val = (ShmSysConfigAndInfo->ate.linkVoltage - ShmSysConfigAndInfo->ate.vccu.v2g_EVSEPresentVoltage.VCCU_V2G_EVSEPresentVoltage_Va);
  1264. printf("linkVoltage = %d v2g_EVSEPresentVoltage = %d val = %d RemainChargingDuration = %d....................\n", ShmSysConfigAndInfo->ate.linkVoltage, ShmSysConfigAndInfo->ate.vccu.v2g_EVSEPresentVoltage.VCCU_V2G_EVSEPresentVoltage_Va, val, _chargingData[CCS_QUANTITY]->RemainChargingDuration);
  1265. */
  1266. VCCU_ChargeFromVehicle(CanFd, ShmSysConfigAndInfo->ate.linkVoltage, ShmSysConfigAndInfo->ate.vccu.v2g_EVSEPresentVoltage.VCCU_V2G_EVSEPresentVoltage_Va, Allowed, Not_Active, Allowed, Not_allowed, Opened);
  1267. //VCCU_V2G_EVTargetCurrent(U_A, ShmSysConfigAndInfo->ate.targetCurrent_Value, TRUE, 0);
  1268. VCCU_V2G_VehicleStatus(CanFd, VCCU_V2G_StateM_EnergyTra_0000_DC_DC_extended, 0,
  1269. 3, soc,
  1270. 3, 3, TRUE,
  1271. 3, 3, 3,
  1272. 3, 3, 0,
  1273. 3, 0, 3,
  1274. 3);
  1275. VCCU_V2G_EVMaximumVoltageLimit(TRUE, U_V, ShmSysConfigAndInfo->ate.maximumVoltage_value, TRUE, 0);
  1276. VCCU_V2G_EVMaximumCurrentLimit(TRUE, U_A, TRUE, 0, ShmSysConfigAndInfo->ate.maximumCurrent_value);
  1277. VCCU_V2G_EVTargetVoltage(ShmSysConfigAndInfo->ate.targetVoltage_Value, U_V, TRUE, 0);
  1278. VCCU_V2G_EVTargetCurrent(U_A, ShmSysConfigAndInfo->ate.targetCurrent_Value, TRUE, 0);
  1279. break;
  1280. }
  1281. case V_CONTACTORSCLOSED:{
  1282. if (status){
  1283. printf("CCS CONTACTORSCLOSED Processing 11....................\n");
  1284. //printf("EVSEPresentVoltage = %d\n ", ShmSysConfigAndInfo->ate.vccu.v2g_EVSEPresentVoltage.VCCU_V2G_EVSEPresentVoltage_Va );
  1285. }
  1286. //
  1287. setEVStatus1(evstaus[1]);
  1288. if(ShmSysConfigAndInfo->ate.vccu.chargeToVehicle.bits.VCCU_Vehicle_ContactorRequest == Closed){
  1289. VCCU_ChargeFromVehicle(CanFd, ShmSysConfigAndInfo->ate.linkVoltage, ShmSysConfigAndInfo->ate.vccu.v2g_EVSEPresentVoltage.VCCU_V2G_EVSEPresentVoltage_Va, Allowed, Not_Active, Allowed, Not_allowed, Closed);
  1290. }else{
  1291. VCCU_ChargeFromVehicle(CanFd, ShmSysConfigAndInfo->ate.linkVoltage, ShmSysConfigAndInfo->ate.vccu.v2g_EVSEPresentVoltage.VCCU_V2G_EVSEPresentVoltage_Va, Allowed, Not_Active, Allowed, Not_allowed, Opened);
  1292. }
  1293. VCCU_V2G_VehicleStatus(CanFd, VCCU_V2G_StateM_EnergyTra_0000_DC_DC_extended, 0,
  1294. 3, soc,
  1295. 3, 3, TRUE,
  1296. 3, 3, 3,
  1297. 3, 3, 0,
  1298. 3, 0, 3,
  1299. 3);
  1300. VCCU_V2G_EVMaximumVoltageLimit(TRUE, U_V, ShmSysConfigAndInfo->ate.maximumVoltage_value, TRUE, 0);
  1301. VCCU_V2G_EVMaximumCurrentLimit(TRUE, U_A, TRUE, 0, ShmSysConfigAndInfo->ate.maximumCurrent_value);
  1302. VCCU_V2G_EVTargetVoltage(ShmSysConfigAndInfo->ate.targetVoltage_Value, U_V, TRUE, 0);
  1303. VCCU_V2G_EVTargetCurrent(U_A, ShmSysConfigAndInfo->ate.targetCurrent_Value, TRUE, 0);
  1304. break;
  1305. }
  1306. case V_POWERDELIVERY:{
  1307. if (status){
  1308. printf("CCS POWERDELIVERY Processing 12....................\n");
  1309. //usleep(50000);
  1310. }
  1311. VCCU_ChargeFromVehicle(CanFd, ShmSysConfigAndInfo->ate.linkVoltage, ShmSysConfigAndInfo->ate.vccu.v2g_EVSEPresentVoltage.VCCU_V2G_EVSEPresentVoltage_Va, Allowed, Not_Active, Allowed, Not_allowed, Closed);
  1312. /*
  1313. if(ShmSysConfigAndInfo->ate.ATEStatus == 0){
  1314. VCCU_ChargeFromVehicle(CanFd, ShmSysConfigAndInfo->ate.linkVoltage, ShmSysConfigAndInfo->ate.vccu.v2g_EVSEPresentVoltage.VCCU_V2G_EVSEPresentVoltage_Va, Allowed, Not_Active, Allowed, Not_allowed, Closed);
  1315. }else{
  1316. VCCU_ChargeFromVehicle(CanFd, ShmSysConfigAndInfo->ate.linkVoltage, ShmSysConfigAndInfo->ate.vccu.v2g_EVSEPresentVoltage.VCCU_V2G_EVSEPresentVoltage_Va, Not_allowed, Not_Active, Allowed, Not_allowed, Opened);
  1317. }
  1318. */
  1319. //VCCU_V2G_EVTargetVoltage(400, U_V, TRUE, 0);
  1320. VCCU_V2G_VehicleStatus(CanFd, VCCU_V2G_StateM_EnergyTra_0000_DC_DC_extended, 0,
  1321. 3, soc,
  1322. 3, 3, TRUE,
  1323. 3, 3, 3,
  1324. 3, 3, 0,
  1325. 3, 0, 3,
  1326. 3);
  1327. VCCU_V2G_EVMaximumVoltageLimit(TRUE, U_V, ShmSysConfigAndInfo->ate.maximumVoltage_value, TRUE, 0);
  1328. VCCU_V2G_EVMaximumCurrentLimit(TRUE, U_A, TRUE, 0, ShmSysConfigAndInfo->ate.maximumCurrent_value);
  1329. VCCU_V2G_EVTargetVoltage(ShmSysConfigAndInfo->ate.targetVoltage_Value, U_V, TRUE, 0);
  1330. VCCU_V2G_EVTargetCurrent(U_A, ShmSysConfigAndInfo->ate.targetCurrent_Value, TRUE, 0);
  1331. setEVStatus1(evstaus[1]);
  1332. break;
  1333. }
  1334. case V_CURRENTDEMAND:{
  1335. if (status){
  1336. printf("CCS CURRENTDEMAND Processing 13 %d %d %d %d....................\n", ShmSysConfigAndInfo->ate.targetCurrent_Value, ShmSysConfigAndInfo->ate.targetVoltage_Value, ShmSysConfigAndInfo->ate.linkVoltage, ShmSysConfigAndInfo->ate.vccu.v2g_EVSEPresentVoltage.VCCU_V2G_EVSEPresentVoltage_Va);
  1337. //ShmSysConfigAndInfo->ate.linkVoltage = ShmSysConfigAndInfo->ate.vccu.v2g_EVSEPresentVoltage.VCCU_V2G_EVSEPresentVoltage_Va;
  1338. //printf("maximumVoltage_value = %d Voltage = %d maximumCurrent_value = %d Current = %d....................\n", ShmSysConfigAndInfo->ate.maximumVoltage_value, ShmSysConfigAndInfo->ate.targetVoltage_Value, ShmSysConfigAndInfo->ate.maximumCurrent_value, ShmSysConfigAndInfo->ate.targetCurrent_Value);
  1339. //usleep(50000);
  1340. }
  1341. setEVStatus1(evstaus[2]);
  1342. if(ShmSysConfigAndInfo->ate.vccu.chargeToVehicle.bits.VCCU_Vehicle_ContactorRequest == Opened){
  1343. printf("CCS CURRENTDEMAND Processing %d %d %d %d....................\n", ShmSysConfigAndInfo->ate.targetCurrent_Value, ShmSysConfigAndInfo->ate.targetVoltage_Value, ShmSysConfigAndInfo->ate.linkVoltage, ShmSysConfigAndInfo->ate.vccu.v2g_EVSEPresentVoltage.VCCU_V2G_EVSEPresentVoltage_Va);
  1344. //VCCU_ChargeFromVehicle(CanFd, ShmSysConfigAndInfo->ate.linkVoltage, ShmSysConfigAndInfo->ate.vccu.v2g_EVSEPresentVoltage.VCCU_V2G_EVSEPresentVoltage_Va, Not_allowed, Not_Active, Allowed, Not_allowed, Opened);
  1345. }else{
  1346. //VCCU_ChargeFromVehicle(CanFd, ShmSysConfigAndInfo->ate.linkVoltage, ShmSysConfigAndInfo->ate.vccu.v2g_EVSEPresentVoltage.VCCU_V2G_EVSEPresentVoltage_Va, Allowed, Not_Active, Allowed, Not_allowed, Closed);
  1347. }
  1348. VCCU_ChargeFromVehicle(CanFd, ShmSysConfigAndInfo->ate.linkVoltage, ShmSysConfigAndInfo->ate.vccu.v2g_EVSEPresentVoltage.VCCU_V2G_EVSEPresentVoltage_Va, Allowed, Not_Active, Allowed, Not_allowed, Closed);
  1349. /*
  1350. if(ShmSysConfigAndInfo->ate.ATEStatus == 0){
  1351. //VCCU_ChargeFromVehicle(CanFd, 500, 500, Allowed, Not_Active, Allowed, Not_allowed, Closed);
  1352. VCCU_ChargeFromVehicle(CanFd, ShmSysConfigAndInfo->ate.linkVoltage, ShmSysConfigAndInfo->ate.vccu.v2g_EVSEPresentVoltage.VCCU_V2G_EVSEPresentVoltage_Va, Allowed, Not_Active, Allowed, Not_allowed, Closed);
  1353. }else{
  1354. //VCCU_ChargeFromVehicle(CanFd, 500, 500, Not_allowed, Not_Active, Allowed, Not_allowed, Closed);
  1355. VCCU_ChargeFromVehicle(CanFd, ShmSysConfigAndInfo->ate.linkVoltage, ShmSysConfigAndInfo->ate.vccu.v2g_EVSEPresentVoltage.VCCU_V2G_EVSEPresentVoltage_Va, Not_allowed, Not_Active, Allowed, Not_allowed, Closed);
  1356. }
  1357. */
  1358. VCCU_V2G_VehicleStatus(CanFd, VCCU_V2G_StateM_EnergyTra_0000_DC_DC_extended, 0,
  1359. 3, soc,
  1360. 3, 3, TRUE,
  1361. 3, 3, 3,
  1362. 3, 3, 0,
  1363. 3, 0, 3,
  1364. 3);
  1365. VCCU_V2G_EVMaximumVoltageLimit(TRUE, U_V, ShmSysConfigAndInfo->ate.maximumVoltage_value, TRUE, 0);
  1366. VCCU_V2G_EVMaximumCurrentLimit(TRUE, U_A, TRUE, 0, ShmSysConfigAndInfo->ate.maximumCurrent_value);
  1367. VCCU_V2G_EVTargetVoltage(ShmSysConfigAndInfo->ate.targetVoltage_Value, U_V, TRUE, 0);
  1368. VCCU_V2G_EVTargetCurrent(U_A, ShmSysConfigAndInfo->ate.targetCurrent_Value, TRUE, 0);
  1369. break;
  1370. }
  1371. case V_POWERDELIVERYFALSE:{
  1372. if (status){
  1373. printf("CCS POWERDELIVERYFALSE Processing 14....................\n");
  1374. }
  1375. setEVStatus1(evstaus[3]);
  1376. VCCU_ChargeFromVehicle(CanFd, ShmSysConfigAndInfo->ate.linkVoltage, ShmSysConfigAndInfo->ate.linkVoltage, Not_allowed, Not_Active, Allowed, Not_allowed, Opened);
  1377. break;
  1378. }
  1379. case V_DETECTION:{
  1380. if (status){
  1381. printf("CCS DETECTION Processing 15....................\n");
  1382. }
  1383. setEVStatus1(evstaus[3]);
  1384. VCCU_ChargeFromVehicle(CanFd, ShmSysConfigAndInfo->ate.linkVoltage, 0, Not_allowed, Active, Allowed, Not_allowed, Opened);
  1385. break;
  1386. }
  1387. case V_SESSION_STOP:{
  1388. if (status){
  1389. printf("CCS SESSION_STOP Processing 16....................\n");
  1390. }
  1391. setEVStatus1(evstaus[3]);
  1392. VCCU_ChargeFromVehicle(CanFd, ShmSysConfigAndInfo->ate.linkVoltage, 0, Not_allowed, Active, Allowed, Not_allowed, Opened);
  1393. break;
  1394. }
  1395. case V_STOP_COMMUNICATION_SESSION:{
  1396. if (status){
  1397. printf("CCS STOP_COMMUNICATION_SESSION Processing 17....................\n");
  1398. }
  1399. setEVStatus1(evstaus[3]);
  1400. VCCU_ChargeFromVehicle(CanFd, ShmSysConfigAndInfo->ate.linkVoltage, 0, Not_allowed, Active, Allowed, Not_allowed, Opened);
  1401. break;
  1402. }
  1403. case V_FINISHED:{
  1404. if (status){
  1405. printf("CCS FINISHED Processing 18....................\n");
  1406. }
  1407. setEVStatus1(evstaus[3]);
  1408. VCCU_ChargeFromVehicle(CanFd, ShmSysConfigAndInfo->ate.linkVoltage, 0, Not_allowed, Active, Allowed, Not_allowed, Opened);
  1409. break;
  1410. }
  1411. default:{
  1412. break;
  1413. }
  1414. }
  1415. //usleep(25000);
  1416. usleep(40000);
  1417. //setBootNotification1();
  1418. }else if(ShmSysConfigAndInfo->ate.ATEState == 2){//GB
  1419. if(ShmSysConfigAndInfo->ate.status == 0){
  1420. int status = isModeChange(CCS_QUANTITY);
  1421. setBootNotification1();
  1422. usleep(1000);
  1423. setMisc(1, ShmSysConfigAndInfo->ate.chademo.id0D_req.K1K2Status, ShmSysConfigAndInfo->ate.chademo.id0D_req.Soc);
  1424. if(ShmSysConfigAndInfo->ate.ATEStatus == 1){
  1425. ShmSysConfigAndInfo->ate.Permission = START;
  1426. setChargerMode(CCS_QUANTITY, ShmSysConfigAndInfo->ate.Permission);
  1427. //ShmSysConfigAndInfo->ate.Permission = START;
  1428. //setChargerMode(CCS_QUANTITY, ShmSysConfigAndInfo->ate.Permission);
  1429. //printf("ATEStatus == 1 %d \n",ShmSysConfigAndInfo->ate.ATEStatus);
  1430. }else if(ShmSysConfigAndInfo->ate.ATEStatus == 2){
  1431. ShmSysConfigAndInfo->ate.Permission = STOP;
  1432. setChargerMode(CCS_QUANTITY, ShmSysConfigAndInfo->ate.Permission);
  1433. //printf("ATEStatus == 2 %d \n",ShmSysConfigAndInfo->ate.ATEStatus);
  1434. ShmSysConfigAndInfo->ate.ATEStatus = 0;
  1435. }else if(ShmSysConfigAndInfo->ate.ATEStatus == 3){
  1436. //setEVStatus1(evstaus[4]);
  1437. ShmSysConfigAndInfo->ate.Permission = STOP;
  1438. setChargerMode(CCS_QUANTITY, ShmSysConfigAndInfo->ate.Permission);
  1439. ShmSysConfigAndInfo->ate.ATEStatus = 0x00;
  1440. SetChargingPermission(CCS_QUANTITY, ShmSysConfigAndInfo->ate.Permission, ShmSysConfigAndInfo->ate.TotalBatteryCap, ShmSysConfigAndInfo->ate.MaxBatteryCurrent, ShmSysConfigAndInfo->ate.MaxBatteryVoltage, 1);
  1441. EvseStopChargingEvent(normalStop, stopReason, 1);
  1442. }else{
  1443. }
  1444. //printf("state == %d permission = %d \n",ShmSysConfigAndInfo->ate.chademo.id03.state, ShmSysConfigAndInfo->ate.Permission);
  1445. if(ShmSysConfigAndInfo->ate.chademo.id03.state == 0 && ShmSysConfigAndInfo->ate.Permission == 0){
  1446. //SetChargingPermission(CCS_QUANTITY, START, 1000, 1200, 6000, 1);
  1447. //setChargerMode(CCS_QUANTITY, ShmSysConfigAndInfo->ate.Permission);
  1448. ShmSysConfigAndInfo->ate.Permission = START;
  1449. setChargerMode(CCS_QUANTITY, ShmSysConfigAndInfo->ate.Permission);
  1450. SetChargingPermission(CCS_QUANTITY, ShmSysConfigAndInfo->ate.Permission, ShmSysConfigAndInfo->ate.TotalBatteryCap, ShmSysConfigAndInfo->ate.MaxBatteryCurrent, ShmSysConfigAndInfo->ate.MaxBatteryVoltage, 1);
  1451. setEVStatus1(evstaus[0]);
  1452. }else if(ShmSysConfigAndInfo->ate.chademo.id03.state ==1){
  1453. ShmSysConfigAndInfo->ate.Permission = STOP;
  1454. setEVStatus1(evstaus[0]);
  1455. }else if(ShmSysConfigAndInfo->ate.chademo.id03.state ==2){
  1456. ShmSysConfigAndInfo->ate.Permission = STOP;
  1457. setEVStatus1(evstaus[1]);
  1458. }else if(ShmSysConfigAndInfo->ate.chademo.id03.state ==3){
  1459. ShmSysConfigAndInfo->ate.Permission = STOP;
  1460. //setEVStatus1(evstaus[1]);
  1461. setEVStatus1(evstaus[1]);
  1462. }else if(ShmSysConfigAndInfo->ate.chademo.id03.state ==4){
  1463. ShmSysConfigAndInfo->ate.Permission = STOP;
  1464. //setEVStatus1(evstaus[1]);
  1465. setEVStatus1(evstaus[1]);
  1466. }else if(ShmSysConfigAndInfo->ate.chademo.id03.state == 5){
  1467. ShmSysConfigAndInfo->ate.Permission = STOP;
  1468. setEVStatus1(evstaus[1]);
  1469. }else if(ShmSysConfigAndInfo->ate.chademo.id03.state == 6){
  1470. ShmSysConfigAndInfo->ate.Permission = STOP;
  1471. setEVStatus1(evstaus[1]);
  1472. }else if(ShmSysConfigAndInfo->ate.chademo.id03.state == 7){
  1473. ShmSysConfigAndInfo->ate.Permission = STOP;
  1474. setEVStatus1(evstaus[2]);
  1475. //setEVStatus2(evstaus[2]);
  1476. }else if(ShmSysConfigAndInfo->ate.chademo.id03.state == 8){
  1477. ShmSysConfigAndInfo->ate.Permission = STOP;
  1478. //outputRelay.relay_event.bits.Gun1_Parallel_N = 0x00;
  1479. //outputRelay.relay_event.bits.Gun1_Parallel_P = 0x00;
  1480. setEVStatus1(evstaus[2]);
  1481. //setEVStatus2(evstaus[2]);
  1482. }//else if(ShmSysConfigAndInfo->ate.chademo.id03.state == 16 ){
  1483. else if(ShmSysConfigAndInfo->ate.chademo.id03.state >= 13 ){
  1484. handleEmulatorFaultStatus();
  1485. //setEVStatus1(evstaus[3]);
  1486. }else if(ShmSysConfigAndInfo->ate.chademo.id03.state == 14 ){
  1487. handleEmulatorFaultStatus();
  1488. //setEVStatus1(evstaus[3]);
  1489. }else if(ShmSysConfigAndInfo->ate.chademo.id03.state == 9 || ShmSysConfigAndInfo->ate.chademo.id03.state == 10
  1490. || ShmSysConfigAndInfo->ate.chademo.id03.state == 11 || ShmSysConfigAndInfo->ate.chademo.id03.state == 12
  1491. //|| ShmSysConfigAndInfo->ate.chademo.id03.state == 13
  1492. //|| ShmSysConfigAndInfo->ate.chademo.id03.state == 15
  1493. ){
  1494. ShmSysConfigAndInfo->ate.Permission = STOP;
  1495. setEVStatus1(evstaus[3]);
  1496. //setEVStatus1(evstaus[3]);
  1497. handleEmulatorFaultStatus();
  1498. }else{
  1499. setEVStatus1(evstaus[0]);
  1500. //printf("4 %d %d\n",ShmSysConfigAndInfo->ate.chademo.id03.state,ShmSysConfigAndInfo->ate.chademo.id0D_req.K1K2Status);
  1501. }
  1502. if(ShmSysConfigAndInfo->ate.chademo.id03.ProximitySignal == 0){
  1503. //printf("1 %d ===== \n", ShmSysConfigAndInfo->ate.chademo.id03.ProximitySignal);
  1504. //printf("ProximitySignal=====%d \n", ShmSysConfigAndInfo->ate.chademo.id03.ProximitySignal);
  1505. setEVStatus1(evstaus[3]);
  1506. }else if(ShmSysConfigAndInfo->ate.chademo.id03.ProximitySignal == 1 && ShmSysConfigAndInfo->ate.chademo.id03.state != 7 &&
  1507. ShmSysConfigAndInfo->ate.chademo.id03.state != 9 && ShmSysConfigAndInfo->ate.chademo.id03.state != 10
  1508. && ShmSysConfigAndInfo->ate.chademo.id03.state != 11 && ShmSysConfigAndInfo->ate.chademo.id03.state != 12
  1509. && ShmSysConfigAndInfo->ate.chademo.id03.state != 13
  1510. && ShmSysConfigAndInfo->ate.chademo.id03.state != 15){
  1511. //printf("2 %d ===== \n", ShmSysConfigAndInfo->ate.chademo.id03.ProximitySignal);
  1512. setEVStatus1(evstaus[1]);
  1513. }
  1514. if(status){
  1515. //printf("status change1 %d ===== \n", status);
  1516. SetChargingPermission(CCS_QUANTITY, ShmSysConfigAndInfo->ate.Permission, ShmSysConfigAndInfo->ate.TotalBatteryCap, ShmSysConfigAndInfo->ate.MaxBatteryCurrent, ShmSysConfigAndInfo->ate.MaxBatteryVoltage, 1);
  1517. }else{
  1518. if(ShmSysConfigAndInfo->ate.Permission == STOP ){
  1519. if(ShmSysConfigAndInfo->ate.chademo.id03.state == 0){
  1520. //printf("status change0 %d ===== \n", status);
  1521. //SetChargingPermission(CCS_QUANTITY, ShmSysConfigAndInfo->ate.Permission, ShmSysConfigAndInfo->ate.TotalBatteryCap, ShmSysConfigAndInfo->ate.MaxBatteryCurrent, ShmSysConfigAndInfo->ate.MaxBatteryVoltage, 1);
  1522. SetChargingPermission(CCS_QUANTITY, ShmSysConfigAndInfo->ate.Permission, ShmSysConfigAndInfo->ate.TotalBatteryCap, ShmSysConfigAndInfo->ate.MaxBatteryCurrent, ShmSysConfigAndInfo->ate.MaxBatteryVoltage, 1);
  1523. }
  1524. }
  1525. }
  1526. //SetChargingPermission(CCS_QUANTITY, ShmSysConfigAndInfo->ate.Permission, ShmSysConfigAndInfo->ate.TotalBatteryCap, ShmSysConfigAndInfo->ate.MaxBatteryCurrent, ShmSysConfigAndInfo->ate.MaxBatteryVoltage, 1);
  1527. //SetChargingPermission(CCS_QUANTITY, START, 1000, 1200, 6000, 1);
  1528. usleep(1000);
  1529. //給火線電壓
  1530. //07
  1531. SetPresentInputPower(ShmSysConfigAndInfo->ate.RequireVoltage, ShmSysConfigAndInfo->ate.RequireCurrent, 1);
  1532. usleep(1000);
  1533. //SetPresentInputRequirement(4800, 6000, 1920, 20);
  1534. SetPresentInputRequirement(ShmSysConfigAndInfo->ate.RequireVoltage, ShmSysConfigAndInfo->ate.RequireCurrent, ShmSysConfigAndInfo->ate.PresentBattVoltage, ShmSysConfigAndInfo->ate.MinimumChargeCurrent, 1);
  1535. }
  1536. }else if(ShmSysConfigAndInfo->ate.ATEState == 3){//chademo
  1537. }
  1538. }
  1539. #if (!DEMO)
  1540. #else
  1541. #endif
  1542. return FAIL;
  1543. }