Module_EvComm.c 77 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686
  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[3] << 8) + (short) frame.data[4];
  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. //memset(&ShmSysConfigAndInfo->ate.vccu.controlPilotStatus.ControlPilot_Voltage,frame.data[5], frame.can_dlc);
  375. break;
  376. }
  377. case VCCU_V2G_StateMId:{
  378. //memcpy(&ShmSysConfigAndInfo->ate.vccu.v2g_StateM, &frame.data, frame.can_dlc);
  379. ShmSysConfigAndInfo->ate.vccu.v2g_StateM.VCCU_V2G_StateM_EnergyTransfer = (short) frame.data[0];
  380. ShmSysConfigAndInfo->ate.vccu.v2g_StateM.VCCU_V2G_StateM_StateMachineEr = (short) frame.data[1];
  381. ShmSysConfigAndInfo->ate.vccu.v2g_StateM.VCCU_V2G_StateM_StateMachineMe = (short) frame.data[2];
  382. ShmSysConfigAndInfo->ate.vccu.v2g_StateM.VCCU_V2G_StateM_StateMachineSt = (short) frame.data[3];
  383. ShmSysConfigAndInfo->ate.vccu.v2g_StateM.DATA.bits.VCCU_V2G_StateM_InternetAvaila = bitextract(frame.data[4],0, 1);
  384. ShmSysConfigAndInfo->ate.vccu.v2g_StateM.DATA.bits.VCCU_V2G_Appl_SccChargeModeReq = bitextract(frame.data[4],1, 4);
  385. ShmSysConfigAndInfo->ate.vccu.v2g_StateM.DATA.bits.VCCU_V2G_Appl_SccFuncModeReq = bitextract(frame.data[4],4, 6);
  386. //memset(&ShmSysConfigAndInfo->ate.vccu.v2g_StateM.VCCU_V2G_StateM_StateMachineSt,*frame.data, frame.can_dlc);
  387. break;
  388. }
  389. case VCCU_InletStatusId:{
  390. //memcpy(&ShmSysConfigAndInfo->ate.vccu.inletStatus, &frame.data, frame.can_dlc);
  391. ShmSysConfigAndInfo->ate.vccu.inletStatus.VCCU_POSFeedback_Voltage = ((short) frame.data[1] << 8) + (short) frame.data[0];
  392. ShmSysConfigAndInfo->ate.vccu.inletStatus.DATA2.VCCU_PlugPresent_SelfDiagnosti = bitextract(frame.data[2],0, 3);
  393. ShmSysConfigAndInfo->ate.vccu.inletStatus.DATA2.VCCU_PlugPresent_Resistance = bitextract(frame.data[2],3, 6);
  394. ShmSysConfigAndInfo->ate.vccu.inletStatus.DATA2.VCCU_PlugPresent_Status = bitextract(frame.data[2],6, 8);
  395. ShmSysConfigAndInfo->ate.vccu.inletStatus.DATA3.VCCU_PlugPresent_Wakeup = bitextract(frame.data[3],0, 2);
  396. ShmSysConfigAndInfo->ate.vccu.inletStatus.DATA3.VCCU_POSFeedback_SelfDiagnosti = bitextract(frame.data[3],2, 5);
  397. ShmSysConfigAndInfo->ate.vccu.inletStatus.DATA3.VCCU_PlugLock_MotorStatus = bitextract(frame.data[3],5, 8);
  398. ShmSysConfigAndInfo->ate.vccu.inletStatus.DATA4.VCCU_PlugLock_Output0_SelfDiag = bitextract(frame.data[4],0, 3);
  399. ShmSysConfigAndInfo->ate.vccu.inletStatus.DATA4.VCCU_PlugLock_Output1_SelfDiag = bitextract(frame.data[4],3, 6);
  400. ShmSysConfigAndInfo->ate.vccu.inletStatus.DATA4.VCCU_Inlet_HWVariant = bitextract(frame.data[4],6, 8);
  401. ShmSysConfigAndInfo->ate.vccu.inletStatus.DATA5.bits.VCCU_DigitalInput_Status = bitextract(frame.data[5],0, 2);
  402. ShmSysConfigAndInfo->ate.vccu.inletStatus.DATA5.bits.VCCU_DigitalInput_Wakeup = bitextract(frame.data[5],2, 4);
  403. ShmSysConfigAndInfo->ate.vccu.inletStatus.DATA5.bits.VCCU_Inlet_MotorStatus = bitextract(frame.data[5],4, 7);
  404. ShmSysConfigAndInfo->ate.vccu.inletStatus.VCCU_Inlet_MaxCurrent = (short) frame.data[6];
  405. ShmSysConfigAndInfo->ate.vccu.inletStatus.DATA7.bits.VCCU_DigitalInput_DebouncedSta = bitextract(frame.data[7],0, 2);
  406. ShmSysConfigAndInfo->ate.vccu.inletStatus.DATA7.bits.VCCU_Inlet_ConnectionStatus = bitextract(frame.data[7],2, 4);
  407. ShmSysConfigAndInfo->ate.vccu.inletStatus.DATA7.bits.VCCU_S3Switch_Status = bitextract(frame.data[7],4, 6);
  408. ShmSysConfigAndInfo->ate.vccu.inletStatus.DATA7.bits.VCCU_S3Switch_DebouncedStatus = bitextract(frame.data[7],6, 8);
  409. //memset(&ShmSysConfigAndInfo->ate.vccu.inletStatus,*frame.data, frame.can_dlc);
  410. //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] );
  411. break;
  412. }
  413. case VCCU_ChargeToVehicleId:{
  414. //memcpy(&ShmSysConfigAndInfo->ate.vccu.chargeToVehicle, &frame.data, frame.can_dlc);
  415. //ShmSysConfigAndInfo->ate.vccu.chargeToVehicle.Data.bits.VCCU_Vehicle_IsolationMea_0000 = bitextract(frame.data[0],0, 2);
  416. ShmSysConfigAndInfo->ate.vccu.chargeToVehicle.bits.VCCU_Vehicle_IsolationMea_0000 = bitextract(frame.data[0],0, 2);
  417. ShmSysConfigAndInfo->ate.vccu.chargeToVehicle.bits.VCCU_Vehicle_ContactorRequest = bitextract(frame.data[0],2, 4);
  418. //memset(&ShmSysConfigAndInfo->ate.vccu.chargeToVehicle,*frame.data, frame.can_dlc);
  419. //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] );
  420. break;
  421. }
  422. case VCCU_V2G_EVMaximumVoltageLimitId:{
  423. //memcpy(&ShmSysConfigAndInfo->ate.vccu.v2g_EVMaximumVoltageLimit, &frame.data, frame.can_dlc);
  424. //memset(&ShmSysConfigAndInfo->ate.vccu.v2g_EVMaximumVoltageLimit,*frame.data, frame.can_dlc);
  425. break;
  426. }
  427. case VCCU_V2G_EVSEMaximumCurrentLimId:{
  428. ShmSysConfigAndInfo->ate.vccu.v2g_EVSEMaximumCurrentLim.DATA.VCCU_V2G_EVSEMaximumCurre_0002 = bitextract(frame.data[0],0, 4);
  429. ShmSysConfigAndInfo->ate.vccu.v2g_EVSEMaximumCurrentLim.DATA.VCCU_V2G_EVSEMaximumCurrentLim = bitextract(frame.data[0],4, 6);
  430. ShmSysConfigAndInfo->ate.vccu.v2g_EVSEMaximumCurrentLim.VCCU_V2G_EVSEMaximumCurre_0003 = (short) frame.data[1];
  431. ShmSysConfigAndInfo->ate.vccu.v2g_EVSEMaximumCurrentLim.VCCU_V2G_EVSEMaximumCurre_0000 = ((short) frame.data[3] << 8) + (short) frame.data[2];
  432. ShmSysConfigAndInfo->ate.vccu.v2g_EVSEMaximumCurrentLim.VCCU_V2G_EVSEMaximumCurre_0001 = (short) frame.data[4];//樁的電流
  433. //printf("VCCU_V2G_EVSEMaximumCurrentLimId Get-INFYPWR-Msg : VCCU_V2G_EVSEMaximumCurre_0000 = %d \n ", ShmSysConfigAndInfo->ate.vccu.v2g_EVSEMaximumCurrentLim.VCCU_V2G_EVSEMaximumCurre_0000);
  434. //memcpy(&ShmSysConfigAndInfo->ate.vccu.v2g_EVMaximumCurrentLimit, &frame.data, frame.can_dlc);
  435. //memset(&ShmSysConfigAndInfo->ate.vccu.v2g_EVMaximumCurrentLimit,*frame.data, frame.can_dlc);
  436. break;
  437. }
  438. case VCCU_V2G_EVTargetCurrentId:{
  439. //memcpy(&ShmSysConfigAndInfo->ate.vccu.v2g_EVTargetCurrent, &frame.data, frame.can_dlc);
  440. //memset(&ShmSysConfigAndInfo->ate.vccu.v2g_EVTargetCurrent,*frame.data, frame.can_dlc);
  441. break;
  442. }
  443. case VCCU_V2G_EVTargetVoltageId:{
  444. //memcpy(&ShmSysConfigAndInfo->ate.vccu.v2g_EVTargetVoltage, &frame.data, frame.can_dlc);
  445. //memset(&ShmSysConfigAndInfo->ate.vccu.v2g_EVTargetVoltage,*frame.data, frame.can_dlc);
  446. break;
  447. }
  448. case VCCU_V2G_EVSEPresentVoltageId:{
  449. ShmSysConfigAndInfo->ate.vccu.v2g_EVSEPresentVoltage.VCCU_V2G_EVSEPresentVoltage_Va = ((short) frame.data[3] << 8) + (short) frame.data[2];
  450. //printf("EVSEPresentVoltage = %d\n ", ShmSysConfigAndInfo->ate.vccu.v2g_EVSEPresentVoltage.VCCU_V2G_EVSEPresentVoltage_Va );
  451. ShmSysConfigAndInfo->ate.vccu.v2g_EVSEPresentVoltage.VCCU_V2G_EVSEPresentVoltage_Va = ShmSysConfigAndInfo->ate.vccu.v2g_EVSEPresentVoltage.VCCU_V2G_EVSEPresentVoltage_Va / 10;
  452. //printf("EVSEPresentVoltage = %d\n ", ShmSysConfigAndInfo->ate.vccu.v2g_EVSEPresentVoltage.VCCU_V2G_EVSEPresentVoltage_Va );
  453. /*
  454. if(ShmSysConfigAndInfo->ate.vccu.v2g_EVSEPresentVoltage.VCCU_V2G_EVSEPresentVoltage_Va != 0){
  455. ShmSysConfigAndInfo->ate.targetVoltage_Value = ShmSysConfigAndInfo->ate.vccu.v2g_EVSEPresentVoltage.VCCU_V2G_EVSEPresentVoltage_Va;
  456. }
  457. */
  458. break;
  459. }
  460. default:
  461. break;
  462. }
  463. }
  464. usleep(2000);
  465. }else if(ShmSysConfigAndInfo->ate.ATEState == 2){
  466. memset(&frame, 0, sizeof(struct can_frame));
  467. nbytes = read(CanFd, &frame, sizeof(struct can_frame));
  468. if (nbytes > 0)
  469. {
  470. intCmd = (int) (frame.can_id & CAN_EFF_MASK);
  471. #ifdef Debug
  472. //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] );
  473. //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] );
  474. #endif
  475. if (intCmd == ADDRESS_REQ)
  476. {
  477. AddrAssignment(frame.data);
  478. continue;
  479. }
  480. intCmd = (int) (frame.can_id & CAN_EFF_MASK & 0xFFFFFF00);
  481. if(intCmd == 256)
  482. {
  483. continue;
  484. }
  485. //gettimeofday(&_cmd_ack_timeout[targetGun], NULL);
  486. //printf ("intCmd = %x \n", intCmd);
  487. switch (intCmd)
  488. {
  489. case EV_BOARD_STATUS_NOTIFICATION:
  490. {
  491. //printf(" EV_BOARD_STATUS_NOTIFICATION\n ");
  492. ShmSysConfigAndInfo->ate.chademo.id03.ProximitySignal = frame.data[2];
  493. ShmSysConfigAndInfo->ate.chademo.id03.state = frame.data[3];
  494. //printf(" EV_BOARD_STATUS_NOTIFICATION %d \n ", ShmSysConfigAndInfo->ate.chademo.id03.state);
  495. //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] );
  496. //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] );
  497. //printf("ConnectorPlugIn = %x, data[0] = %x \n", _chargingData[target]->ConnectorPlugIn, frame.data[0]);
  498. //printf("ConnectorPlugIn = %x \n", (-120 + frame.data[1]) / 10);
  499. }
  500. break;
  501. case ACK_EV_FW_VERSION:
  502. {
  503. printf(" ACK_EV_FW_VERSION\n ");
  504. /*
  505. if (_chargingData[targetGun]->Type == _Type_Chademo)
  506. {
  507. memcpy(ShmCHAdeMOData->evse[_chargingData[targetGun]->type_index].version, frame.data, ARRAY_SIZE(frame.data));
  508. ShmCHAdeMOData->evse[_chargingData[targetGun]->type_index].SelfTest_Comp = PASS;
  509. }
  510. else if (_chargingData[targetGun]->Type == _Type_CCS)
  511. {
  512. if (ShmCcsData->CommProtocol == 0x01)
  513. {
  514. memcpy(&ShmCcsData->V2GMessage_DIN70121[_chargingData[targetGun]->type_index].version, frame.data, ARRAY_SIZE(frame.data));
  515. ShmCcsData->V2GMessage_DIN70121[_chargingData[targetGun]->type_index].SelfTest_Comp = PASS;
  516. }
  517. }
  518. */
  519. }
  520. break;
  521. case ACK_EV_HW_VERSION:
  522. {
  523. printf("Get EV HW = %s \n", frame.data);
  524. }
  525. break;
  526. case ACK__GET_EVSE_OUTPUT_STATUS:
  527. {
  528. //printf(" ACK__GET_EVSE_OUTPUT_STATUS\n ");
  529. //printf(" ACK__GET_EVSE_OUTPUT_STATUS\n ");
  530. //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] );
  531. ShmSysConfigAndInfo->ate.chademo.id09_ack.DcEvState = frame.data[0];//EV模擬器
  532. ShmSysConfigAndInfo->ate.chademo.id09_ack.ChargingMode = frame.data[1];
  533. ShmSysConfigAndInfo->ate.chademo.id09_ack.EvsePresentOutputVoltage = ((short) frame.data[3] << 8) + (short) frame.data[2];//充電樁輸出電壓
  534. ShmSysConfigAndInfo->ate.chademo.id09_ack.EvsePresentOutputCurrent = ((short) frame.data[5] << 8) + (short) frame.data[4];//充電樁輸出電流
  535. ShmSysConfigAndInfo->ate.chademo.id09_ack.RemainingTimeSec = ((short) frame.data[7] << 8) + (short) frame.data[6];//剩餘時間
  536. /*
  537. _chargingData[targetGun]->EvBatterySoc = frame.data[1];
  538. _chargingData[targetGun]->EvBatterytargetVoltage = ((short) frame.data[3] << 8) + (short) frame.data[2];
  539. _chargingData[targetGun]->EvBatterytargetCurrent = ((short) frame.data[5] << 8) + (short) frame.data[4];
  540. _chargingData[targetGun]->PresentChargedDuration = ((short) frame.data[7] << 8) + (short) frame.data[6];
  541. if (_chargingData[targetGun]->Type == _Type_Chademo)
  542. {
  543. if (ShmCHAdeMOData->ev[_chargingData[targetGun]->type_index].EvDetection != frame.data[0])
  544. {
  545. // log
  546. }
  547. ShmCHAdeMOData->ev[_chargingData[targetGun]->type_index].EvDetection = frame.data[0];
  548. ShmCHAdeMOData->ev[_chargingData[targetGun]->type_index].SOC = _chargingData[targetGun]->EvBatterySoc;
  549. ShmCHAdeMOData->ev[_chargingData[targetGun]->type_index].TargetBatteryVoltage = _chargingData[targetGun]->EvBatterytargetVoltage;
  550. ShmCHAdeMOData->ev[_chargingData[targetGun]->type_index].ChargingCurrentRequest = _chargingData[targetGun]->EvBatterytargetCurrent;
  551. }
  552. else if (_chargingData[targetGun]->Type == _Type_CCS)
  553. {
  554. if(ShmCcsData->CommProtocol == 0x01)
  555. {
  556. ShmCcsData->V2GMessage_DIN70121[_chargingData[targetGun]->type_index].PresentMsgFlowStatus = frame.data[0];
  557. }
  558. }
  559. */
  560. //printf("frame.data_2 = %x, frame.data_3 = %x \n", frame.data[2], frame.data[3]);
  561. //printf("EvBatterytargetVoltage = %f \n", _chargingData[targetGun]->EvBatterytargetVoltage);
  562. //printf("EvBatterytargetCurrent = %f \n", _chargingData[targetGun]->EvBatterytargetCurrent);
  563. //printf("BatteryVoltage = %d \n", ShmCHAdeMOData->ev[_chargingData[target]->type_index].TargetBatteryVoltage);
  564. //printf("CurrentRequest = %d \n", ShmCHAdeMOData->ev[_chargingData[target]->type_index].ChargingCurrentRequest);
  565. }
  566. break;
  567. case ACK_GET_EVSE_Capacity_INFO:
  568. {
  569. ShmSysConfigAndInfo->ate.chademo.id0A_ack.EvseMaxChargeVoltage = ((short) frame.data[1] << 8) + (short) frame.data[0];//樁的最大電壓
  570. ShmSysConfigAndInfo->ate.chademo.id0A_ack.EvseMaxChargeCurrent = ((short) frame.data[3] << 8) + (short) frame.data[2];//樁的最大電流
  571. ShmSysConfigAndInfo->ate.chademo.id0A_ack.EvseMinChargeVoltage = ((short) frame.data[5] << 8) + (short) frame.data[4];
  572. ShmSysConfigAndInfo->ate.chademo.id0A_ack.EvseMinChargeCurrent = ((short) frame.data[7] << 8) + (short) frame.data[6];
  573. /*
  574. //_chargingData[target].EvACorDCcharging = frame.data[0];
  575. //_chargingData[target]->TotalBatteryCap = ((float) frame.data[4] << 8) + (short) frame.data[3];
  576. _chargingData[targetGun]->EvBatteryMaxVoltage = ((short) frame.data[4] << 8) + (short) frame.data[3];
  577. //_chargingData[target]->EvBatteryMaxCurrent = ((float) frame.data[4] << 8) + (short) frame.data[3];
  578. //_chargingData[target].MaxiBatteryCurrent = ((short) frame.data[6] << 8) + (short) frame.data[5];
  579. if (_chargingData[targetGun]->Type == _Type_Chademo)
  580. {
  581. ShmCHAdeMOData->ev[_chargingData[targetGun]->type_index].TotalBatteryCapacity = ((short) frame.data[2] << 8) + (short) frame.data[1];
  582. ShmCHAdeMOData->ev[_chargingData[targetGun]->type_index].MaxiBatteryVoltage = _chargingData[targetGun]->EvBatteryMaxVoltage;
  583. //printf("EvBatteryMaxVoltage = %f \n", _chargingData[target]->EvBatteryMaxVoltage);
  584. //printf("TotalBatteryCapacity = %d \n", ShmCHAdeMOData->ev[_chargingData[target]->type_index].TotalBatteryCapacity);
  585. //printf("MaxiBatteryVoltage = %d \n", ShmCHAdeMOData->ev[_chargingData[target]->type_index].MaxiBatteryVoltage);
  586. }
  587. else if (_chargingData[targetGun]->Type == _Type_CCS)
  588. {
  589. if(ShmCcsData->CommProtocol == 0x01)
  590. {
  591. }
  592. }
  593. */
  594. }
  595. break;
  596. case ACK_GET_MISCELLANEOUS_INFO:
  597. {
  598. //printf(" ACK_GET_MISCELLANEOUS_INFO\n ");
  599. //printf(" ACK_GET_MISCELLANEOUS_INFO\n ");
  600. ShmSysConfigAndInfo->ate.chademo.id0D_ack.K1K2OnOff = frame.data[5];
  601. if(ShmSysConfigAndInfo->ate.chademo.relaystatus == 0){
  602. ShmSysConfigAndInfo->ate.chademo.id0D_req.K1K2Status = ShmSysConfigAndInfo->ate.chademo.id0D_ack.K1K2OnOff;
  603. setStatusMode(CCS_QUANTITY, ShmSysConfigAndInfo->ate.chademo.id0D_req.K1K2Status);
  604. int status = isStatusChange(CCS_QUANTITY);
  605. if(status){
  606. /*
  607. if(ShmSysConfigAndInfo->ate.chademo.id0D_req.K1K2Status == 1){
  608. if(ShmSysConfigAndInfo->ate.ATEState == 1){
  609. //usleep(whileLoopTime);
  610. //outputRelay.relay_event.bits.Gun1_Parallel_N = 0x00;
  611. //outputRelay.relay_event.bits.Gun1_Parallel_P = 0x00;
  612. //Config_Relay_Output(Uart5Fd, Addr.Relay, &outputRelay);
  613. }else if(ShmSysConfigAndInfo->ate.ATEState == 2){
  614. //outputRelay.relay_event.bits.Gun1_Parallel_N = 0x01;
  615. //outputRelay.relay_event.bits.Gun1_Parallel_P = 0x01;
  616. //Config_Relay_Output(Uart5Fd, Addr.Relay, &outputRelay);
  617. }
  618. }else{
  619. }
  620. */
  621. }
  622. }
  623. //memcpy(&ShmSysConfigAndInfo->ate.chademo.id0D_ack, &frame.data, frame.can_dlc);
  624. //printf("%d %d\n", ShmSysConfigAndInfo->ate.chademo.id0D_ack.K1K2OnOff, ShmSysConfigAndInfo->ate.chademo.id0D_ack.EvBoardState);
  625. //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] );
  626. /*
  627. float pilotVol = (float)(-120 + frame.data[3]) / 10;
  628. // if (pilotVol != _chargingData[targetGun]->PilotVoltage)
  629. // DEBUG_INFO("PilotVoltage = %f \n", _chargingData[targetGun]->PilotVoltage);
  630. if (_chargingData[targetGun]->Type == _Type_Chademo)
  631. {
  632. _chargingData[targetGun]->GunLocked = frame.data[0];
  633. ShmCHAdeMOData->evse[_chargingData[targetGun]->type_index].ConnectorTemperatureP = frame.data[1];
  634. ShmCHAdeMOData->evse[_chargingData[targetGun]->type_index].ConnectorTemperatureN = frame.data[2];
  635. _chargingData[targetGun]->PilotVoltage = pilotVol;
  636. ShmCHAdeMOData->evse[_chargingData[targetGun]->type_index].EvboardStatus = frame.data[7];
  637. }
  638. else if (_chargingData[targetGun]->Type == _Type_CCS)
  639. {
  640. if (ShmCcsData->CommProtocol == 0x01)
  641. {
  642. _chargingData[targetGun]->GunLocked = frame.data[0];
  643. //ShmCcsData->V2GMessage_DIN70121[_chargingData[targetGun]->type_index]. .ConnectorTemperatureP = frame.data[1];
  644. //ShmCcsData->V2GMessage_DIN70121[_chargingData[targetGun]->type_index]. .ConnectorTemperatureN = frame.data[2];
  645. _chargingData[targetGun]->PilotVoltage = pilotVol;
  646. }
  647. }
  648. */
  649. //printf("ConnectorPlug locked = %x \n", frame.data[0]);
  650. //printf("ConnectorTemp 0= %d \n", ShmCHAdeMOData->evse[_chargingData[target]->type_index].ConnectorTemperatureP);
  651. //printf("ConnectorTemp 1= %d \n", ShmCHAdeMOData->evse[_chargingData[target]->type_index].ConnectorTemperatureN);
  652. }
  653. break;
  654. case ACK_EVSE_ISOLATION_STATUS: { } break;
  655. case ACK_EVSE_PRECHAGE_INFO:
  656. {
  657. //_chargingData[targetGun]->PrechargeStatus = frame.data[0];
  658. }
  659. break;
  660. case NOTIFICATION_EV_STOP:
  661. {
  662. printf(" ACK_GET_MISCELLANEOUS_INFO\n ");
  663. ShmSysConfigAndInfo->ate.chademo.id0B.EvStopReason = frame.data[0];
  664. ShmSysConfigAndInfo->ate.chademo.id0B.AlarmCode1 = frame.data[1];
  665. ShmSysConfigAndInfo->ate.chademo.id0B.AlarmCode2 = frame.data[2];
  666. ShmSysConfigAndInfo->ate.chademo.id0B.AlarmCode3 = frame.data[3];
  667. ShmSysConfigAndInfo->ate.chademo.id0B.AlarmCode4 = frame.data[4];
  668. ShmSysConfigAndInfo->ate.chademo.id0B.AlarmCode5 = frame.data[5];
  669. ShmSysConfigAndInfo->ate.chademo.id0B.AlarmCode6 = frame.data[6];
  670. 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);
  671. //byte normalStop = 0x01;
  672. //byte stopReason[6] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
  673. //byte evstaus[5] = { 0x01, 0x02, 0x03, 0x04, 0x05 };
  674. //ShmSysConfigAndInfo->ate.Permission = STOP;
  675. //setChargerMode(CCS_QUANTITY, ShmSysConfigAndInfo->ate.Permission);
  676. //ShmSysConfigAndInfo->ate.ATEStatus = 0x00;
  677. //SetChargingPermission(CCS_QUANTITY, ShmSysConfigAndInfo->ate.Permission, ShmSysConfigAndInfo->ate.TotalBatteryCap, ShmSysConfigAndInfo->ate.MaxBatteryCurrent, ShmSysConfigAndInfo->ate.MaxBatteryVoltage, 1);
  678. //EvseStopChargingEvent(normalStop, stopReason, 1);
  679. setEVStatus1(evstaus[4]);
  680. ShmSysConfigAndInfo->ate.Permission = STOP;
  681. setStatusMode(CCS_QUANTITY, ShmSysConfigAndInfo->ate.Permission);
  682. ShmSysConfigAndInfo->ate.ATEStatus = 0x00;
  683. SetChargingPermission(CCS_QUANTITY, ShmSysConfigAndInfo->ate.Permission, ShmSysConfigAndInfo->ate.TotalBatteryCap, ShmSysConfigAndInfo->ate.MaxBatteryCurrent, ShmSysConfigAndInfo->ate.MaxBatteryVoltage, 1);
  684. EvseStopChargingEvent(normalStop, stopReason, 1);
  685. /*
  686. ShmSysConfigAndInfo->ate.Permission = STOP;
  687. setChargerMode(CCS_QUANTITY, ShmSysConfigAndInfo->ate.Permission);
  688. ShmSysConfigAndInfo->ate.ATEStatus = 0x00;
  689. SetChargingPermission(CCS_QUANTITY, ShmSysConfigAndInfo->ate.Permission, ShmSysConfigAndInfo->ate.TotalBatteryCap, ShmSysConfigAndInfo->ate.MaxBatteryCurrent, ShmSysConfigAndInfo->ate.MaxBatteryVoltage, 1);
  690. */
  691. /*
  692. time_t CurrentTime;
  693. struct tm *tm;
  694. CurrentTime = time(NULL);
  695. tm = localtime(& CurrentTime);
  696. 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] );
  697. printf("NOTIFICATION_EV_STOP : %04d-%02d-%02d %02d:%02d:%02d \n",
  698. tm->tm_year+1900,tm->tm_mon+1,tm->tm_mday,tm->tm_hour,tm->tm_min,tm->tm_sec);
  699. // 車端要求停止
  700. // frame.data[0] : 0x01 => normal stop, 0x02 => ev emergency stop
  701. if (frame.data[0] == 0x02)
  702. {
  703. //printf("NOTIFICATION_EV_STOP -----------------------------\n");
  704. AbnormalStopAnalysis(targetGun, frame.data + 1);
  705. }
  706. _chargingData[targetGun]->StopChargeFlag = YES;
  707. */
  708. }
  709. break;
  710. default:
  711. //printf("Ack none defined. intCmd = %d \n", intCmd);
  712. break;
  713. }
  714. }
  715. usleep(10000);
  716. }
  717. }
  718. }
  719. }
  720. //接收can
  721. void CHROMACANReceiver()
  722. {
  723. pid_t canRecPid;
  724. canRecPid = fork();
  725. if(canRecPid > 0){
  726. int nbytes;
  727. struct can_frame frame;
  728. int intCmd;
  729. while (1){
  730. //清空 canbus recever buf
  731. memset(&frame, 0, sizeof(struct can_frame));
  732. //讀取 canbus 是否有接收到封包
  733. nbytes = read(CanFd2, &frame, sizeof(struct can_frame));
  734. //如果有收到 canbus 封包
  735. if (nbytes > 0){
  736. intCmd = (int) (frame.can_id & CAN_EFF_MASK);//extended frame format
  737. #ifdef Debug
  738. //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] );
  739. //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] );
  740. #endif
  741. //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] );
  742. //printf("Ack none defined. intCmd = %08x \n", intCmd);
  743. switch (intCmd){
  744. case bn_res1:{
  745. /*
  746. ShmSysConfigAndInfo->ate.ATEState = (short) frame.data[0];
  747. setATEMode(CCS_QUANTITY, ShmSysConfigAndInfo->ate.ATEState);
  748. 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] );
  749. */
  750. break;
  751. }
  752. case bn_res2:{
  753. //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] );
  754. break;
  755. }
  756. case ATE_Connector2:{
  757. /*
  758. ShmSysConfigAndInfo->ate.chroma.ate_Connector_2.TargetVoltage = ((short) frame.data[1] << 8) + (short) frame.data[0];//
  759. ShmSysConfigAndInfo->ate.chroma.ate_Connector_2.TargetCurrent = ((short) frame.data[3] << 8) + (short) frame.data[2];//
  760. ShmSysConfigAndInfo->ate.chroma.ate_Connector_2.PresentVoltage = ((short) frame.data[5] << 8) + (short) frame.data[4];
  761. ShmSysConfigAndInfo->ate.chroma.ate_Connector_2.PresentCurrent = ((short) frame.data[7] << 8) + (short) frame.data[6];
  762. //ShmSysConfigAndInfo->ate.linkVoltage = ShmSysConfigAndInfo->ate.chroma.ate_Connector_2.PresentVoltage;
  763. ShmSysConfigAndInfo->ate.targetVoltage_Value = ((short) frame.data[1] << 8) + (short) frame.data[0];
  764. ShmSysConfigAndInfo->ate.targetCurrent_Value = ((short) frame.data[3] << 8) + (short) frame.data[2];
  765. //ShmSysConfigAndInfo->ate.maximumVoltage_value = ShmSysConfigAndInfo->ate.targetVoltage_Value+(ShmSysConfigAndInfo->ate.targetVoltage_Value*0.1);
  766. ShmSysConfigAndInfo->ate.maximumVoltage_value = ShmSysConfigAndInfo->ate.targetVoltage_Value+10;
  767. ShmSysConfigAndInfo->ate.linkVoltage = ShmSysConfigAndInfo->ate.targetVoltage_Value;
  768. */
  769. //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);
  770. //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);
  771. break;
  772. }
  773. case ATE_Connector1:{
  774. if(ShmSysConfigAndInfo->ate.ATEState == 1){//ccs
  775. ShmSysConfigAndInfo->ate.chroma.ate_Connector_1.TargetVoltage = ((short) frame.data[1] << 8) + (short) frame.data[0];//
  776. ShmSysConfigAndInfo->ate.chroma.ate_Connector_1.TargetCurrent = ((short) frame.data[3] << 8) + (short) frame.data[2];//
  777. ShmSysConfigAndInfo->ate.chroma.ate_Connector_1.PresentVoltage = ((short) frame.data[5] << 8) + (short) frame.data[4];
  778. ShmSysConfigAndInfo->ate.chroma.ate_Connector_1.PresentCurrent = ((short) frame.data[7] << 8) + (short) frame.data[6];
  779. //ShmSysConfigAndInfo->ate.linkVoltage = ShmSysConfigAndInfo->ate.chroma.ate_Connector_1.PresentVoltage;
  780. //ShmSysConfigAndInfo->ate.targetVoltage_Value = ((short) frame.data[1] << 8) + (short) frame.data[0];
  781. int voltage = ((short) frame.data[1] << 8) + (short) frame.data[0];
  782. int evseMaxCurrent = ShmSysConfigAndInfo->ate.vccu.v2g_EVSEMaximumCurrentLim.VCCU_V2G_EVSEMaximumCurre_0000 / 10;
  783. //int evseMaxvoltage = ShmSysConfigAndInfo->ate.vccu.v2g_EVSEPresentVoltage.VCCU_V2G_EVSEPresentVoltage_Va / 10;
  784. ShmSysConfigAndInfo->ate.targetCurrent_Value = ((short) frame.data[3] << 8) + (short) frame.data[2];
  785. //ShmSysConfigAndInfo->ate.maximumVoltage_value = ShmSysConfigAndInfo->ate.targetVoltage_Value+(ShmSysConfigAndInfo->ate.targetVoltage_Value*0.1);
  786. //ShmSysConfigAndInfo->ate.maximumVoltage_value = ShmSysConfigAndInfo->ate.targetVoltage_Value+10;
  787. //ShmSysConfigAndInfo->ate.maximumVoltage_value = 0;
  788. //ShmSysConfigAndInfo->ate.targetVoltage_Value = 0;
  789. if(voltage > (maxValue - 10)){
  790. ShmSysConfigAndInfo->ate.maximumVoltage_value = maxValue;
  791. ShmSysConfigAndInfo->ate.targetVoltage_Value = maxValue - 20;
  792. ShmSysConfigAndInfo->ate.linkVoltage = maxValue - 20;
  793. }else{
  794. ShmSysConfigAndInfo->ate.maximumVoltage_value = voltage + 10;
  795. ShmSysConfigAndInfo->ate.targetVoltage_Value = voltage - 10;
  796. ShmSysConfigAndInfo->ate.linkVoltage = voltage - 10;
  797. }
  798. if((ShmSysConfigAndInfo->ate.targetCurrent_Value > evseMaxCurrent) && (evseMaxCurrent > 0)){
  799. ShmSysConfigAndInfo->ate.targetCurrent_Value = evseMaxCurrent;
  800. }
  801. }else if (ShmSysConfigAndInfo->ate.ATEState == 2){//gb
  802. ShmSysConfigAndInfo->ate.chroma.ate_Connector_2.TargetVoltage = ((short) frame.data[1] << 8) + (short) frame.data[0];//
  803. ShmSysConfigAndInfo->ate.chroma.ate_Connector_2.TargetCurrent = ((short) frame.data[3] << 8) + (short) frame.data[2];//
  804. ShmSysConfigAndInfo->ate.chroma.ate_Connector_2.PresentVoltage = ((short) frame.data[5] << 8) + (short) frame.data[4];
  805. ShmSysConfigAndInfo->ate.chroma.ate_Connector_2.PresentCurrent = ((short) frame.data[7] << 8) + (short) frame.data[6];
  806. int voltage = ShmSysConfigAndInfo->ate.chroma.ate_Connector_2.TargetVoltage * 10;
  807. int current = ShmSysConfigAndInfo->ate.chroma.ate_Connector_2.TargetCurrent * 10;
  808. if(voltage > (gbmaxValue - 100)){
  809. //ShmSysConfigAndInfo->ate.targetVoltage_Value = maxValue - 100;
  810. ShmSysConfigAndInfo->ate.chademoTargetVoltage_Value = gbmaxValue - 100;
  811. ShmSysConfigAndInfo->ate.RequireVoltage = gbmaxValue -100;
  812. ShmSysConfigAndInfo->ate.MaxBatteryVoltage = gbmaxValue;
  813. }else{
  814. ShmSysConfigAndInfo->ate.chademoTargetVoltage_Value = voltage;
  815. ShmSysConfigAndInfo->ate.RequireVoltage = voltage;
  816. ShmSysConfigAndInfo->ate.MaxBatteryVoltage = gbmaxValue;
  817. }
  818. //ShmSysConfigAndInfo->ate.targetVoltage_Value = voltage;
  819. ShmSysConfigAndInfo->ate.chademoTargetCurrent_Value = current;
  820. ShmSysConfigAndInfo->ate.RequireCurrent = current;
  821. //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]);
  822. }else if (ShmSysConfigAndInfo->ate.ATEState == 3){//chademo
  823. }
  824. //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);
  825. //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 );
  826. break;
  827. }
  828. default:
  829. break;
  830. }
  831. }
  832. usleep(2000);
  833. //usleep(100000);
  834. }
  835. }
  836. }
  837. int DiffTimeb(struct timeb ST, struct timeb ET)
  838. {
  839. //return milli-second
  840. unsigned int StartTime,StopTime;
  841. StartTime=(unsigned int)ST.time;
  842. StopTime=(unsigned int)ET.time;
  843. //return (StopTime-StartTime)*1000+ET.millitm-ST.millitm;
  844. return (StopTime-StartTime);
  845. }
  846. unsigned short MaxValue(unsigned short value1, unsigned short value2)
  847. {
  848. return value1 >= value2 ? value1 : value2;
  849. }
  850. void Initialization()
  851. {
  852. _chargingData[CCS_QUANTITY] = &ShmSysConfigAndInfo->SysInfo.CcsChargingData[CCS_QUANTITY];
  853. }
  854. void VCCU_Requests(int LED0, int LED1, int LED2,
  855. int HighSideOut0, int HighSideOut1, int HighSideOut2, int HighSideOut3,
  856. int HighSideOut4, int RTC_TimerRequest, int PlugLock,
  857. int RTC_TimerValue,
  858. int ControlPilot, int ChargeUnit, int Inlet){
  859. struct VCCU_Requests obj;
  860. obj.VCCU_LED0_Request = LED0;//0.0
  861. obj.VCCU_LED1_Request = LED1;//0.0
  862. obj.VCCU_LED2_Request = LED2;//0.0
  863. obj.byte3.VCCU_HighSideOut0_Request = HighSideOut0;//3
  864. obj.byte3.VCCU_HighSideOut1_Request = HighSideOut1;//3
  865. obj.byte3.VCCU_HighSideOut2_Request = HighSideOut2;//3
  866. obj.byte3.VCCU_HighSideOut3_Request = HighSideOut3;//3
  867. obj.byte4.VCCU_HighSideOut4_Request = HighSideOut4;//3
  868. obj.byte4.VCCU_RTC_TimerRequest = RTC_TimerRequest;//3
  869. obj.byte4.VCCU_PlugLock_MotorRequest = PlugLock;//7
  870. obj.VCCU_RTC_TimerValue= RTC_TimerValue;//0
  871. obj.byte6.VCCU_ControlPilot_ChargeModeRe = ControlPilot;//7
  872. obj.byte6.VCCU_ChargeUnit_Request = ChargeUnit;//3
  873. obj.byte6.VCCU_Inlet_MotorRequest = Inlet;//3
  874. byte data[7];
  875. data[0] = *((UBYTE *) &obj.VCCU_LED0_Request);
  876. data[1] = *((UBYTE *) &obj.VCCU_LED1_Request);
  877. data[2] = *((UBYTE *) &obj.VCCU_LED2_Request);
  878. data[3] = *((UBYTE *) &obj.byte3);
  879. data[4] = *((UBYTE *) &obj.byte4);
  880. data[5] = *((UBYTE *) &obj.VCCU_RTC_TimerValue);
  881. data[6] = *((UBYTE *) &obj.byte6);
  882. //printf("%02x %02x %02x %02x %02x %02x %02x \n", data[0], data[1], data[2], data[3], data[4], data[5] , data[6]);
  883. setVCCU_Requests(data, sizeof(data));
  884. }
  885. void VCCU_ChargeFromVehicle(int canfd, int linkVoltage, int contactorVoltage,
  886. int chargePermission, int isolationMeasurem,
  887. int plugLockPermissio, int plugUnlockPermiss, int contactorStatus){
  888. struct VCCU_ChargeFromVehicle obj;
  889. obj.VCCU_Vehicle_LinkVoltage= linkVoltage;//500
  890. obj.VCCU_Vehicle_ContactorVoltage = contactorVoltage;//0
  891. obj.DATA.bits.VCCU_Vehicle_ChargePermission = chargePermission;//Not_allowed
  892. obj.DATA.bits.VCCU_Vehicle_IsolationMeasurem = isolationMeasurem;//Active
  893. obj.DATA.bits.VCCU_Vehicle_PlugLockPermissio = plugLockPermissio;//Allowed//Not_allowed;
  894. obj.DATA.bits.VCCU_Vehicle_PlugUnlockPermiss = plugUnlockPermiss;//Not_allowed
  895. obj.bits.VCCU_Vehicle_ContactorStatus = contactorStatus;//Open
  896. obj.bits.VCCU_Vehicle_StopCharge = 3;//Open
  897. obj.bits.VCCU_Vehicle_ChargeSelection = 3;//Open
  898. byte* data1;
  899. data1 = (byte*) &(*((UWORD *) &obj.VCCU_Vehicle_ContactorVoltage));
  900. byte* data2;
  901. data2 = (byte*) &(*((UWORD *) &obj.VCCU_Vehicle_LinkVoltage));
  902. byte data[6];
  903. data[0] = data1[0];
  904. data[1] = data1[1];
  905. data[2] = data2[0];
  906. data[3] = data2[1];
  907. data[4] = *((UBYTE *) &obj.DATA);
  908. data[5] = *((UBYTE *) &obj.bits);
  909. setVCCU_ChargeFromVehicle(data, sizeof(data));
  910. }
  911. void VCVCCU_V2G_RemainingTimeToFullSO(int remainingTime){
  912. struct VCCU_V2G_RemainingTimeToFullSO obj;
  913. obj.VCCU_V2G_RemainingTimeToB_0000.value = remainingTime;
  914. obj.DATA.VCCU_V2G_RemainingTimeToFullSO = 1;
  915. obj.DATA.VCCU_V2G_RemainingTimeToF_0002 = 0;//520
  916. obj.VCCU_V2G_RemainingTimeToB_0001.value = 0;//1
  917. obj.VCCU_V2G_RemainingTimeToB_0003.value = 0;//0
  918. byte* data1;
  919. data1 = (byte*) &(*((UWORD *) &obj.VCCU_V2G_RemainingTimeToB_0000));
  920. byte data[5];
  921. data[0] = data1[0];
  922. data[1] = data1[1];
  923. data[2] = *((UBYTE *) &obj.VCCU_V2G_RemainingTimeToB_0003);
  924. data[3] = *((UBYTE *) &obj.VCCU_V2G_RemainingTimeToB_0001);
  925. data[4] = *((UBYTE *) &obj.DATA);
  926. setVCCU_V2G_RemainingTimeToFullSO(data, sizeof(data));
  927. }
  928. void VCCU_V2G_EVMaximumVoltageLimit(int VMaximumVoltageLimit,
  929. int EVMaximumVoltage_0002,
  930. int EVMaximumVoltage_0000,
  931. int EVMaximumVoltage_0001,
  932. int EVMaximumVoltage_0003){
  933. struct VCCU_V2G_EVMaximumVoltageLimit obj;
  934. obj.DATA1.VCCU_V2G_EVMaximumVoltageLimit = VMaximumVoltageLimit;//1
  935. obj.DATA1.VCCU_V2G_EVMaximumVoltage_0002 = EVMaximumVoltage_0002;//5
  936. obj.VCCU_V2G_EVMaximumVoltage_0000.value = EVMaximumVoltage_0000;//520
  937. obj.VCCU_V2G_EVMaximumVoltage_0001.value = EVMaximumVoltage_0001;//1
  938. obj.VCCU_V2G_EVMaximumVoltage_0003.value = EVMaximumVoltage_0003;//0
  939. byte* data1;
  940. data1 = (byte*) &(*((UWORD *) &obj.VCCU_V2G_EVMaximumVoltage_0000));
  941. byte data[5];
  942. data[0] = *((UBYTE *) &obj.DATA1);
  943. data[1] = *((UBYTE *) &obj.VCCU_V2G_EVMaximumVoltage_0003);
  944. data[2] = data1[0];
  945. data[3] = data1[1];
  946. data[4] = *((UBYTE *) &obj.VCCU_V2G_EVMaximumVoltage_0001);
  947. //printf("%02x %02x %02x %02x %02x \n", data[0], data[1], data[2], data[3], data[4]);
  948. setVCCU_V2G_EVMaximumVoltageLimit(data, sizeof(data));
  949. }
  950. void VCCU_V2G_EVMaximumCurrentLimit(int EVMaximumCurrentLimit,
  951. int EVMaximumCurrent_0000,
  952. int EVMaximumCurrent_0001,
  953. int EVMaximumCurrent_0002,
  954. int EVMaximumCurrent_0003){
  955. struct VCCU_V2G_EVMaximumCurrentLimit obj;
  956. obj.DATA1.VCCU_V2G_EVMaximumCurrentLimit = EVMaximumCurrentLimit;//1
  957. obj.DATA1.VCCU_V2G_EVMaximumCurrent_0000 = EVMaximumCurrent_0000;//3
  958. obj.VCCU_V2G_EVMaximumCurrent_0001.value = EVMaximumCurrent_0001;//1
  959. obj.VCCU_V2G_EVMaximumCurrent_0002.value = EVMaximumCurrent_0002;//0
  960. obj.VCCU_V2G_EVMaximumCurrent_0003.value = EVMaximumCurrent_0003;//10
  961. byte* data1;
  962. data1 = (byte*) &(*((UWORD *) &obj.VCCU_V2G_EVMaximumCurrent_0003));
  963. byte data[5];
  964. data[0] = *((UBYTE *) &obj.DATA1);
  965. data[1] = *((UBYTE *) &obj.VCCU_V2G_EVMaximumCurrent_0002);
  966. data[2] = data1[0];
  967. data[3] = data1[1];
  968. data[4] = *((UBYTE *) &obj.VCCU_V2G_EVMaximumCurrent_0001);
  969. //printf("%02x %02x %02x %02x %02x \n", data[0], data[1], data[2], data[3], data[4]);
  970. setVCCU_V2G_EVMaximumCurrentLimit(data, sizeof(data));
  971. }
  972. void VCCU_V2G_EVTargetVoltage(int EVTargetVoltage_Value,
  973. int EVTargetVoltage_Unit,
  974. int EVTargetVoltage_UnitF,
  975. int EVTargetVoltage_Multi){//C2 01 00 01 05
  976. struct VCCU_V2G_EVTargetVoltage obj;
  977. obj.VCCU_V2G_EVTargetVoltage_Value.value = EVTargetVoltage_Value;//450
  978. obj.VCCU_V2G_EVTargetVoltage_Unit.value = EVTargetVoltage_Unit;//5
  979. obj.VCCU_V2G_EVTargetVoltage_UnitF.value = EVTargetVoltage_UnitF;//1
  980. obj.VCCU_V2G_EVTargetVoltage_Multi.value = EVTargetVoltage_Multi;//0
  981. byte* data1;
  982. data1 = (byte*) &(*((UWORD *) &obj.VCCU_V2G_EVTargetVoltage_Value));
  983. byte data[5];
  984. data[0] = data1[0];
  985. data[1] = data1[1];
  986. data[2] = *((UBYTE *) &obj.VCCU_V2G_EVTargetVoltage_Multi);
  987. data[3] = *((UBYTE *) &obj.VCCU_V2G_EVTargetVoltage_UnitF);
  988. data[4] = *((UBYTE *) &obj.VCCU_V2G_EVTargetVoltage_Unit);
  989. //printf("%d %02x %02x \n",obj.VCCU_V2G_EVTargetVoltage_Value.value, data[0], data[1]);
  990. //printf("%02x %02x %02x %02x %02x \n", data[0], data[1], data[2], data[3], data[4]);
  991. setVCCU_V2G_EVTargetVoltage(data, sizeof(data));
  992. }
  993. void VCCU_V2G_EVTargetCurrent(int EVTargetCurrent_Unit,
  994. int EVTargetCurrent_Value,
  995. int EVTargetCurrent_UnitF,
  996. int EVTargetCurrent_Multi){//05 00 00 01 03
  997. struct VCCU_V2G_EVTargetCurrent obj;
  998. obj.VCCU_V2G_EVTargetCurrent_Unit.value = EVTargetCurrent_Unit;//3
  999. obj.VCCU_V2G_EVTargetCurrent_Value.value = EVTargetCurrent_Value;//5
  1000. obj.VCCU_V2G_EVTargetCurrent_UnitF.value = EVTargetCurrent_UnitF;//1
  1001. obj.VCCU_V2G_EVTargetCurrent_Multi.value = EVTargetCurrent_Multi;//0
  1002. byte* data1;
  1003. data1 = (byte*) &(*((UWORD *) &obj.VCCU_V2G_EVTargetCurrent_Value));
  1004. byte data[5];
  1005. data[0] = data1[0];
  1006. data[1] = data1[1];
  1007. data[2] = *((UBYTE *) &obj.VCCU_V2G_EVTargetCurrent_Multi);
  1008. data[3] = *((UBYTE *) &obj.VCCU_V2G_EVTargetCurrent_UnitF);
  1009. data[4] = *((UBYTE *) &obj.VCCU_V2G_EVTargetCurrent_Unit);
  1010. //printf("%02x %02x %02x %02x %02x \n", data[0], data[1], data[2], data[3], data[4]);
  1011. setVCCU_V2G_EVTargetCurrent(data, sizeof(data));
  1012. }
  1013. void VCCU_V2G_VehicleStatus(int canfd, int EnergyTra, int EVErrorCode,
  1014. int EVPowerDeliveryParame, int EVRESSSOC,
  1015. int EVRESSConditioningFla, int EVRESSConditionin, int EVReady,
  1016. int BulkChargingCompleteF, int EVCabinConditioningFl, int EVCabinConditioning,
  1017. int ChargingComplete, int FullSOCFlag, int FullSOC,
  1018. int BulkSOCFlag, int BulkSOC, int BulkChargingComplete,
  1019. int BulkChargingCompleteFValue){
  1020. struct VCCU_V2G_VehicleStatus obj;
  1021. obj.DATA4.VCCU_V2G_StateM_EnergyTra_0000 = EnergyTra;//VCCU_V2G_StateM_EnergyTra_0000_DC_DC_extended;
  1022. obj.DATA1.VCCU_V2G_EVErrorCode = EVErrorCode;//0;
  1023. obj.DATA4.VCCU_V2G_EVPowerDeliveryParame = EVPowerDeliveryParame;//3;
  1024. obj.VCCU_V2G_EVRESSSOC.value = EVRESSSOC;//0;
  1025. obj.DATA3.VCCU_V2G_EVRESSConditioningFla = EVRESSConditioningFla;//3;
  1026. obj.DATA3.VCCU_V2G_EVRESSConditioning = EVRESSConditionin;//3;
  1027. obj.DATA3.VCCU_V2G_EVReady = EVReady;//3;
  1028. obj.DATA1.VCCU_V2G_BulkChargingCompleteF = BulkChargingCompleteF;//3;
  1029. obj.DATA3.VCCU_V2G_EVCabinConditioningFl = EVCabinConditioningFl;//3;
  1030. obj.DATA2.VCCU_V2G_EVCabinConditioning = EVCabinConditioning;//3;
  1031. obj.DATA2.VCCU_V2G_ChargingComplete = ChargingComplete;//3;
  1032. obj.DATA2.VCCU_V2G_FullSOCFlag = FullSOCFlag;//0;
  1033. obj.VCCU_V2G_FullSOC.value = FullSOC;//3;
  1034. obj.DATA2.VCCU_V2G_BulkSOCFlag = BulkSOCFlag;//3;
  1035. obj.VCCU_V2G_BulkSOC.value = BulkSOC;//0;
  1036. obj.DATA1.VCCU_V2G_BulkChargingComplete = BulkChargingComplete;//3;
  1037. obj.DATA1.VCCU_V2G_BulkChargingCompleteF = BulkChargingCompleteFValue;//3;
  1038. byte data[7];
  1039. data[0] = *((UBYTE *) &obj.DATA1);
  1040. data[1] = *((UBYTE *) &obj.DATA2);
  1041. data[2] = *((UBYTE *) &obj.DATA3);
  1042. data[3] = *((UBYTE *) &obj.DATA4);
  1043. data[4] = *((UBYTE *) &obj.VCCU_V2G_BulkSOC);
  1044. data[5] = *((UBYTE *) &obj.VCCU_V2G_FullSOC);
  1045. data[6] = *((UBYTE *) &obj.VCCU_V2G_EVRESSSOC);
  1046. setVCCU_V2G_VehicleStatus(data, sizeof(data));
  1047. }
  1048. unsigned char isModeChange(unsigned char gun_index)
  1049. {
  1050. unsigned char result = NO;
  1051. if(_chargingData[gun_index]->SystemStatus != _chargingData[gun_index]->PreviousSystemStatus)
  1052. {
  1053. result = YES;
  1054. _chargingData[gun_index]->PreviousSystemStatus = _chargingData[gun_index]->SystemStatus;
  1055. }
  1056. return result;
  1057. }
  1058. void setChargerMode(byte gun_index, byte mode)
  1059. {
  1060. _chargingData[gun_index]->SystemStatus = mode;
  1061. }
  1062. void handleEmulatorFaultStatus(){
  1063. setEVStatus1(evstaus[4]);
  1064. ShmSysConfigAndInfo->ate.Permission = STOP;
  1065. setStatusMode(CCS_QUANTITY, ShmSysConfigAndInfo->ate.Permission);
  1066. ShmSysConfigAndInfo->ate.ATEStatus = 0x00;
  1067. SetChargingPermission(CCS_QUANTITY, ShmSysConfigAndInfo->ate.Permission, ShmSysConfigAndInfo->ate.TotalBatteryCap,
  1068. ShmSysConfigAndInfo->ate.MaxBatteryCurrent, ShmSysConfigAndInfo->ate.MaxBatteryVoltage, 1);
  1069. EvseStopChargingEvent(normalStop, stopReason, 1);
  1070. }
  1071. int main(int argc, char *argv[])
  1072. {
  1073. if(InitShareMemory() == FAIL)
  1074. {
  1075. #ifdef SystemLogMessage
  1076. printf("InitShareMemory NG\n");
  1077. #endif
  1078. if(ShmStatusCodeData != NULL)
  1079. {
  1080. ShmStatusCodeData->AlarmCode.AlarmEvents.bits.FailToCreateShareMemory=1;
  1081. }
  1082. sleep(5);
  1083. return 0;
  1084. }
  1085. Initialization();
  1086. CanFd = InitCanBus();
  1087. CanFd2 = CHROMAInitCanBus();
  1088. CANReceiver();
  1089. CHROMACANReceiver();
  1090. //printf("%08X %08X %d %d %d ....................\n" , bn1, (bn1 | 0x80000000), CanFd, CanFd2, ShmSysConfigAndInfo->ate.ATEState);
  1091. /*
  1092. sleep(2);
  1093. system("killall Module_InternalComm");
  1094. system("killall Module_EvComm");
  1095. return 0;
  1096. */
  1097. printf("EvComm %d....................\n" , ShmSysConfigAndInfo->ate.ATEState);
  1098. while(true){
  1099. if(ShmSysConfigAndInfo->ate.ATEState == 1){//VCCU
  1100. setBootNotification1();
  1101. VCCU_TD();
  1102. VCCU_Requests(0, 0, 0,
  1103. 3, 3, 3, 3,
  1104. 3, 3, 7,
  1105. 0,
  1106. 7, 3, 3);
  1107. int status = isModeChange(CCS_QUANTITY);
  1108. VCVCCU_V2G_RemainingTimeToFullSO(8000);
  1109. switch(_chargingData[CCS_QUANTITY]->SystemStatus){
  1110. case V_IDLE:{
  1111. if (status){
  1112. printf("CCS IDLE Processing 1....................\n");
  1113. }
  1114. setEVStatus1(evstaus[0]);
  1115. break;
  1116. }
  1117. case V_UNMATEDPLUG:{
  1118. if (status){
  1119. printf("CCS UNMATEDPLUG Processing 2....................\n");
  1120. }
  1121. setEVStatus1(evstaus[0]);
  1122. VCCU_ChargeFromVehicle(CanFd, ShmSysConfigAndInfo->ate.linkVoltage, 0, Not_allowed, Active, Not_allowed, Not_allowed, Opened);
  1123. break;
  1124. }
  1125. case V_MATED_PLUG_INLET_UNLOCKED:{
  1126. if (status){
  1127. if(ShmSysConfigAndInfo->ate.vccu.inletStatus.DATA2.VCCU_PlugPresent_Status == VCCU_InletStatus_Connected){
  1128. }
  1129. printf("CCS MATED_PLUG_INLET_UNLOCKED Processing 3....................\n");
  1130. }
  1131. setEVStatus1(evstaus[0]);
  1132. VCCU_ChargeFromVehicle(CanFd, ShmSysConfigAndInfo->ate.linkVoltage, 0, Not_allowed, Active, Allowed, Not_allowed, Opened);
  1133. //VCCU_ChargeFromVehicle(CanFd, ShmSysConfigAndInfo->ate.linkVoltage, 0, Not_allowed, Active, Allowed, Not_allowed, Opened);
  1134. break;
  1135. }
  1136. case V_INLETLOCKING:{
  1137. if (status){
  1138. printf("CCS INLETLOCKING Processing 4....................\n");
  1139. }
  1140. setEVStatus1(evstaus[0]);
  1141. break;
  1142. }
  1143. case V_INLETLOCKED:{
  1144. if (status){
  1145. printf("CCS INLETLOCKED Processing 5....................\n");
  1146. }
  1147. setEVStatus1(evstaus[1]);
  1148. VCCU_ChargeFromVehicle(CanFd, ShmSysConfigAndInfo->ate.linkVoltage, 0, Not_allowed, Active, Allowed, Not_allowed, Opened);
  1149. VCCU_V2G_EVMaximumVoltageLimit(TRUE, U_V, ShmSysConfigAndInfo->ate.maximumVoltage_value, TRUE, 0);
  1150. VCCU_V2G_EVMaximumCurrentLimit(TRUE, U_A, TRUE, 0, ShmSysConfigAndInfo->ate.maximumCurrent_value);
  1151. VCCU_V2G_EVTargetVoltage(ShmSysConfigAndInfo->ate.targetVoltage_Value, U_V, TRUE, 0);
  1152. VCCU_V2G_EVTargetCurrent(U_A, ShmSysConfigAndInfo->ate.targetCurrent_Value, TRUE, 0);
  1153. VCCU_V2G_VehicleStatus(CanFd, VCCU_V2G_StateM_EnergyTra_0000_DC_DC_extended, 0,
  1154. 3, soc,
  1155. 3, 3, TRUE,
  1156. 3, 3, 3,
  1157. 3, 3, 0,
  1158. 3, 0, 3,
  1159. 3);
  1160. /*
  1161. VCCU_V2G_EVMaximumVoltageLimit(TRUE, U_V, ShmSysConfigAndInfo->ate.maximumVoltage_value, TRUE, 0);
  1162. VCCU_V2G_EVMaximumCurrentLimit(TRUE, U_A, TRUE, 0, ShmSysConfigAndInfo->ate.maximumCurrent_value);
  1163. */
  1164. break;
  1165. }
  1166. case V_SLAC:{
  1167. if (status){
  1168. printf("CCS SLAC Processing 6....................\n");
  1169. }
  1170. setEVStatus1(evstaus[1]);
  1171. VCCU_ChargeFromVehicle(CanFd, ShmSysConfigAndInfo->ate.linkVoltage, 0, Not_allowed, Active, Allowed, Not_allowed, Opened);
  1172. /*
  1173. VCCU_V2G_EVMaximumVoltageLimit(TRUE, U_V, ShmSysConfigAndInfo->ate.maximumVoltage_value, TRUE, 0);
  1174. VCCU_V2G_EVMaximumCurrentLimit(TRUE, U_A, TRUE, 0, ShmSysConfigAndInfo->ate.maximumCurrent_value);
  1175. */
  1176. VCCU_V2G_VehicleStatus(CanFd, VCCU_V2G_StateM_EnergyTra_0000_DC_DC_extended, 0,
  1177. 3, soc,
  1178. 3, 3, TRUE,
  1179. 3, 3, 3,
  1180. 3, 3, 0,
  1181. 3, 0, 3,
  1182. 3);
  1183. VCCU_V2G_EVMaximumVoltageLimit(TRUE, U_V, ShmSysConfigAndInfo->ate.maximumVoltage_value, TRUE, 0);
  1184. VCCU_V2G_EVMaximumCurrentLimit(TRUE, U_A, TRUE, 0, ShmSysConfigAndInfo->ate.maximumCurrent_value);
  1185. VCCU_V2G_EVTargetVoltage(ShmSysConfigAndInfo->ate.targetVoltage_Value, U_V, TRUE, 0);
  1186. VCCU_V2G_EVTargetCurrent(U_A, ShmSysConfigAndInfo->ate.targetCurrent_Value, TRUE, 0);
  1187. break;
  1188. }
  1189. case V_DEFINITION:{
  1190. if (status){
  1191. printf("CCS DEFINITION Processing 7....................\n");
  1192. }
  1193. setEVStatus1(evstaus[1]);
  1194. /*
  1195. VCCU_V2G_VehicleStatus(CanFd, VCCU_V2G_StateM_EnergyTra_0000_DC_DC_extended, 0, 3, 0,
  1196. 3, 3, TRUE, 3, 3, 3, 3, 3, 0, 3, 0, 3, 3);
  1197. */
  1198. /*
  1199. VCCU_V2G_EVMaximumVoltageLimit(TRUE, U_V, 500, TRUE, 0);
  1200. VCCU_V2G_EVMaximumCurrentLimit(TRUE, U_A, TRUE, 0, 10);
  1201. VCCU_V2G_EVMaximumVoltageLimit(TRUE, U_V, ShmSysConfigAndInfo->ate.maximumVoltage_value, TRUE, 0);
  1202. VCCU_V2G_EVMaximumCurrentLimit(TRUE, U_A, TRUE, 0, ShmSysConfigAndInfo->ate.maximumCurrent_value);
  1203. */
  1204. VCCU_ChargeFromVehicle(CanFd, ShmSysConfigAndInfo->ate.linkVoltage, 0, Not_allowed, Active, Allowed, Not_allowed, Opened);
  1205. VCCU_V2G_VehicleStatus(CanFd, VCCU_V2G_StateM_EnergyTra_0000_DC_DC_extended, 0,
  1206. 3, soc,
  1207. 3, 3, TRUE,
  1208. 3, 3, 3,
  1209. 3, 3, 0,
  1210. 3, 0, 3,
  1211. 3);
  1212. VCCU_V2G_EVMaximumVoltageLimit(TRUE, U_V, ShmSysConfigAndInfo->ate.maximumVoltage_value, TRUE, 0);
  1213. VCCU_V2G_EVMaximumCurrentLimit(TRUE, U_A, TRUE, 0, ShmSysConfigAndInfo->ate.maximumCurrent_value);
  1214. VCCU_V2G_EVTargetVoltage(ShmSysConfigAndInfo->ate.targetVoltage_Value, U_V, TRUE, 0);
  1215. VCCU_V2G_EVTargetCurrent(U_A, ShmSysConfigAndInfo->ate.targetCurrent_Value, TRUE, 0);
  1216. break;
  1217. }
  1218. case V_CABLECHECK:{
  1219. if (status){
  1220. printf("CCS CABLECHECK Processing 8....................\n");
  1221. }
  1222. setEVStatus1(evstaus[1]);
  1223. VCCU_ChargeFromVehicle(CanFd, ShmSysConfigAndInfo->ate.linkVoltage, 0, Allowed, Active, Allowed, Not_allowed, Opened);
  1224. VCCU_V2G_VehicleStatus(CanFd, VCCU_V2G_StateM_EnergyTra_0000_DC_DC_extended, 0,
  1225. 3, soc,
  1226. 3, 3, TRUE,
  1227. 3, 3, 3,
  1228. 3, 3, 0,
  1229. 3, 0, 3,
  1230. 3);
  1231. VCCU_V2G_EVMaximumVoltageLimit(TRUE, U_V, ShmSysConfigAndInfo->ate.maximumVoltage_value, TRUE, 0);
  1232. VCCU_V2G_EVMaximumCurrentLimit(TRUE, U_A, TRUE, 0, ShmSysConfigAndInfo->ate.maximumCurrent_value);
  1233. VCCU_V2G_EVTargetVoltage(ShmSysConfigAndInfo->ate.targetVoltage_Value, U_V, TRUE, 0);
  1234. VCCU_V2G_EVTargetCurrent(U_A, ShmSysConfigAndInfo->ate.targetCurrent_Value, TRUE, 0);
  1235. break;
  1236. }
  1237. case V_ISOLATION:{
  1238. if (status){
  1239. printf("CCS ISOLATION Processing 9....................\n");
  1240. }
  1241. setEVStatus1(evstaus[1]);
  1242. VCCU_ChargeFromVehicle(CanFd, ShmSysConfigAndInfo->ate.linkVoltage, 0, Allowed, Not_Active, Allowed, Not_allowed, Opened);
  1243. VCCU_V2G_VehicleStatus(CanFd, VCCU_V2G_StateM_EnergyTra_0000_DC_DC_extended, 0,
  1244. 3, soc,
  1245. 3, 3, TRUE,
  1246. 3, 3, 3,
  1247. 3, 3, 0,
  1248. 3, 0, 3,
  1249. 3);
  1250. VCCU_V2G_EVMaximumVoltageLimit(TRUE, U_V, ShmSysConfigAndInfo->ate.maximumVoltage_value, TRUE, 0);
  1251. VCCU_V2G_EVMaximumCurrentLimit(TRUE, U_A, TRUE, 0, ShmSysConfigAndInfo->ate.maximumCurrent_value);
  1252. VCCU_V2G_EVTargetVoltage(ShmSysConfigAndInfo->ate.targetVoltage_Value, U_V, TRUE, 0);
  1253. VCCU_V2G_EVTargetCurrent(U_A, ShmSysConfigAndInfo->ate.targetCurrent_Value, TRUE, 0);
  1254. break;
  1255. }
  1256. case V_VOLTAGEDIFFERENCE:{
  1257. if (status){
  1258. printf("CCS VOLTAGEDIFFERENCE Processing 10....................\n");
  1259. }
  1260. setEVStatus1(evstaus[1]);
  1261. /*
  1262. int val = (ShmSysConfigAndInfo->ate.linkVoltage - ShmSysConfigAndInfo->ate.vccu.v2g_EVSEPresentVoltage.VCCU_V2G_EVSEPresentVoltage_Va);
  1263. 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);
  1264. */
  1265. VCCU_ChargeFromVehicle(CanFd, ShmSysConfigAndInfo->ate.linkVoltage, ShmSysConfigAndInfo->ate.vccu.v2g_EVSEPresentVoltage.VCCU_V2G_EVSEPresentVoltage_Va, Allowed, Not_Active, Allowed, Not_allowed, Opened);
  1266. //VCCU_V2G_EVTargetCurrent(U_A, ShmSysConfigAndInfo->ate.targetCurrent_Value, TRUE, 0);
  1267. VCCU_V2G_VehicleStatus(CanFd, VCCU_V2G_StateM_EnergyTra_0000_DC_DC_extended, 0,
  1268. 3, soc,
  1269. 3, 3, TRUE,
  1270. 3, 3, 3,
  1271. 3, 3, 0,
  1272. 3, 0, 3,
  1273. 3);
  1274. VCCU_V2G_EVMaximumVoltageLimit(TRUE, U_V, ShmSysConfigAndInfo->ate.maximumVoltage_value, TRUE, 0);
  1275. VCCU_V2G_EVMaximumCurrentLimit(TRUE, U_A, TRUE, 0, ShmSysConfigAndInfo->ate.maximumCurrent_value);
  1276. VCCU_V2G_EVTargetVoltage(ShmSysConfigAndInfo->ate.targetVoltage_Value, U_V, TRUE, 0);
  1277. VCCU_V2G_EVTargetCurrent(U_A, ShmSysConfigAndInfo->ate.targetCurrent_Value, TRUE, 0);
  1278. break;
  1279. }
  1280. case V_CONTACTORSCLOSED:{
  1281. if (status){
  1282. printf("CCS CONTACTORSCLOSED Processing 11....................\n");
  1283. //printf("EVSEPresentVoltage = %d\n ", ShmSysConfigAndInfo->ate.vccu.v2g_EVSEPresentVoltage.VCCU_V2G_EVSEPresentVoltage_Va );
  1284. }
  1285. setEVStatus1(evstaus[1]);
  1286. VCCU_ChargeFromVehicle(CanFd, ShmSysConfigAndInfo->ate.linkVoltage, ShmSysConfigAndInfo->ate.vccu.v2g_EVSEPresentVoltage.VCCU_V2G_EVSEPresentVoltage_Va, Allowed, Not_Active, Allowed, Not_allowed, Closed);
  1287. VCCU_V2G_VehicleStatus(CanFd, VCCU_V2G_StateM_EnergyTra_0000_DC_DC_extended, 0,
  1288. 3, soc,
  1289. 3, 3, TRUE,
  1290. 3, 3, 3,
  1291. 3, 3, 0,
  1292. 3, 0, 3,
  1293. 3);
  1294. VCCU_V2G_EVMaximumVoltageLimit(TRUE, U_V, ShmSysConfigAndInfo->ate.maximumVoltage_value, TRUE, 0);
  1295. VCCU_V2G_EVMaximumCurrentLimit(TRUE, U_A, TRUE, 0, ShmSysConfigAndInfo->ate.maximumCurrent_value);
  1296. VCCU_V2G_EVTargetVoltage(ShmSysConfigAndInfo->ate.targetVoltage_Value, U_V, TRUE, 0);
  1297. VCCU_V2G_EVTargetCurrent(U_A, ShmSysConfigAndInfo->ate.targetCurrent_Value, TRUE, 0);
  1298. break;
  1299. }
  1300. case V_POWERDELIVERY:{
  1301. if (status){
  1302. printf("CCS POWERDELIVERY Processing 12....................\n");
  1303. }
  1304. VCCU_ChargeFromVehicle(CanFd, ShmSysConfigAndInfo->ate.linkVoltage, ShmSysConfigAndInfo->ate.linkVoltage, Allowed, Not_Active, Allowed, Not_allowed, Closed);
  1305. /*
  1306. if(ShmSysConfigAndInfo->ate.ATEStatus == 0){
  1307. VCCU_ChargeFromVehicle(CanFd, ShmSysConfigAndInfo->ate.linkVoltage, ShmSysConfigAndInfo->ate.vccu.v2g_EVSEPresentVoltage.VCCU_V2G_EVSEPresentVoltage_Va, Allowed, Not_Active, Allowed, Not_allowed, Closed);
  1308. }else{
  1309. VCCU_ChargeFromVehicle(CanFd, ShmSysConfigAndInfo->ate.linkVoltage, ShmSysConfigAndInfo->ate.vccu.v2g_EVSEPresentVoltage.VCCU_V2G_EVSEPresentVoltage_Va, Not_allowed, Not_Active, Allowed, Not_allowed, Opened);
  1310. }
  1311. */
  1312. //VCCU_V2G_EVTargetVoltage(400, U_V, TRUE, 0);
  1313. VCCU_V2G_VehicleStatus(CanFd, VCCU_V2G_StateM_EnergyTra_0000_DC_DC_extended, 0,
  1314. 3, soc,
  1315. 3, 3, TRUE,
  1316. 3, 3, 3,
  1317. 3, 3, 0,
  1318. 3, 0, 3,
  1319. 3);
  1320. VCCU_V2G_EVMaximumVoltageLimit(TRUE, U_V, ShmSysConfigAndInfo->ate.maximumVoltage_value, TRUE, 0);
  1321. VCCU_V2G_EVMaximumCurrentLimit(TRUE, U_A, TRUE, 0, ShmSysConfigAndInfo->ate.maximumCurrent_value);
  1322. VCCU_V2G_EVTargetVoltage(ShmSysConfigAndInfo->ate.targetVoltage_Value, U_V, TRUE, 0);
  1323. VCCU_V2G_EVTargetCurrent(U_A, ShmSysConfigAndInfo->ate.targetCurrent_Value, TRUE, 0);
  1324. setEVStatus1(evstaus[1]);
  1325. break;
  1326. }
  1327. case V_CURRENTDEMAND:{
  1328. if (status){
  1329. printf("CCS CURRENTDEMAND Processing 13 %d....................\n", ShmSysConfigAndInfo->ate.vccu.v2g_EVSEPresentVoltage.VCCU_V2G_EVSEPresentVoltage_Va);
  1330. //ShmSysConfigAndInfo->ate.linkVoltage = ShmSysConfigAndInfo->ate.vccu.v2g_EVSEPresentVoltage.VCCU_V2G_EVSEPresentVoltage_Va;
  1331. //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);
  1332. }
  1333. setEVStatus1(evstaus[2]);
  1334. if(ShmSysConfigAndInfo->ate.vccu.v2g_EVSEPresentVoltage.VCCU_V2G_EVSEPresentVoltage_Va <= 1){
  1335. VCCU_ChargeFromVehicle(CanFd, ShmSysConfigAndInfo->ate.linkVoltage, ShmSysConfigAndInfo->ate.vccu.v2g_EVSEPresentVoltage.VCCU_V2G_EVSEPresentVoltage_Va, Not_allowed, Not_Active, Allowed, Not_allowed, Closed);
  1336. }else{
  1337. VCCU_ChargeFromVehicle(CanFd, ShmSysConfigAndInfo->ate.linkVoltage, ShmSysConfigAndInfo->ate.vccu.v2g_EVSEPresentVoltage.VCCU_V2G_EVSEPresentVoltage_Va, Allowed, Not_Active, Allowed, Not_allowed, Closed);
  1338. }
  1339. /*
  1340. if(ShmSysConfigAndInfo->ate.ATEStatus == 0){
  1341. //VCCU_ChargeFromVehicle(CanFd, 500, 500, Allowed, Not_Active, Allowed, Not_allowed, Closed);
  1342. VCCU_ChargeFromVehicle(CanFd, ShmSysConfigAndInfo->ate.linkVoltage, ShmSysConfigAndInfo->ate.vccu.v2g_EVSEPresentVoltage.VCCU_V2G_EVSEPresentVoltage_Va, Allowed, Not_Active, Allowed, Not_allowed, Closed);
  1343. }else{
  1344. //VCCU_ChargeFromVehicle(CanFd, 500, 500, Not_allowed, Not_Active, Allowed, Not_allowed, Closed);
  1345. VCCU_ChargeFromVehicle(CanFd, ShmSysConfigAndInfo->ate.linkVoltage, ShmSysConfigAndInfo->ate.vccu.v2g_EVSEPresentVoltage.VCCU_V2G_EVSEPresentVoltage_Va, Not_allowed, Not_Active, Allowed, Not_allowed, Closed);
  1346. }
  1347. */
  1348. VCCU_V2G_VehicleStatus(CanFd, VCCU_V2G_StateM_EnergyTra_0000_DC_DC_extended, 0,
  1349. 3, soc,
  1350. 3, 3, TRUE,
  1351. 3, 3, 3,
  1352. 3, 3, 0,
  1353. 3, 0, 3,
  1354. 3);
  1355. VCCU_V2G_EVMaximumVoltageLimit(TRUE, U_V, ShmSysConfigAndInfo->ate.maximumVoltage_value, TRUE, 0);
  1356. VCCU_V2G_EVMaximumCurrentLimit(TRUE, U_A, TRUE, 0, ShmSysConfigAndInfo->ate.maximumCurrent_value);
  1357. VCCU_V2G_EVTargetVoltage(ShmSysConfigAndInfo->ate.targetVoltage_Value, U_V, TRUE, 0);
  1358. VCCU_V2G_EVTargetCurrent(U_A, ShmSysConfigAndInfo->ate.targetCurrent_Value, TRUE, 0);
  1359. break;
  1360. }
  1361. case V_POWERDELIVERYFALSE:{
  1362. if (status){
  1363. printf("CCS POWERDELIVERYFALSE Processing 14....................\n");
  1364. }
  1365. setEVStatus1(evstaus[3]);
  1366. VCCU_ChargeFromVehicle(CanFd, ShmSysConfigAndInfo->ate.linkVoltage, ShmSysConfigAndInfo->ate.linkVoltage, Not_allowed, Not_Active, Allowed, Not_allowed, Opened);
  1367. break;
  1368. }
  1369. case V_DETECTION:{
  1370. if (status){
  1371. printf("CCS DETECTION Processing 15....................\n");
  1372. }
  1373. setEVStatus1(evstaus[3]);
  1374. VCCU_ChargeFromVehicle(CanFd, ShmSysConfigAndInfo->ate.linkVoltage, 0, Not_allowed, Active, Allowed, Not_allowed, Opened);
  1375. break;
  1376. }
  1377. case V_SESSION_STOP:{
  1378. if (status){
  1379. printf("CCS SESSION_STOP Processing 16....................\n");
  1380. }
  1381. setEVStatus1(evstaus[3]);
  1382. VCCU_ChargeFromVehicle(CanFd, ShmSysConfigAndInfo->ate.linkVoltage, 0, Not_allowed, Active, Allowed, Not_allowed, Opened);
  1383. break;
  1384. }
  1385. case V_STOP_COMMUNICATION_SESSION:{
  1386. if (status){
  1387. printf("CCS STOP_COMMUNICATION_SESSION Processing 17....................\n");
  1388. }
  1389. setEVStatus1(evstaus[3]);
  1390. VCCU_ChargeFromVehicle(CanFd, ShmSysConfigAndInfo->ate.linkVoltage, 0, Not_allowed, Active, Allowed, Not_allowed, Opened);
  1391. break;
  1392. }
  1393. case V_FINISHED:{
  1394. if (status){
  1395. printf("CCS FINISHED Processing 18....................\n");
  1396. }
  1397. setEVStatus1(evstaus[3]);
  1398. VCCU_ChargeFromVehicle(CanFd, ShmSysConfigAndInfo->ate.linkVoltage, 0, Not_allowed, Active, Allowed, Not_allowed, Opened);
  1399. break;
  1400. }
  1401. default:{
  1402. break;
  1403. }
  1404. }
  1405. //usleep(25000);
  1406. usleep(40000);
  1407. //setBootNotification1();
  1408. }else if(ShmSysConfigAndInfo->ate.ATEState == 2){//GB
  1409. if(ShmSysConfigAndInfo->ate.status == 0){
  1410. int status = isModeChange(CCS_QUANTITY);
  1411. setBootNotification1();
  1412. usleep(1000);
  1413. setMisc(1, ShmSysConfigAndInfo->ate.chademo.id0D_req.K1K2Status, ShmSysConfigAndInfo->ate.chademo.id0D_req.Soc);
  1414. if(ShmSysConfigAndInfo->ate.ATEStatus == 1){
  1415. //ShmSysConfigAndInfo->ate.Permission = START;
  1416. //setChargerMode(CCS_QUANTITY, ShmSysConfigAndInfo->ate.Permission);
  1417. //printf("ATEStatus == 1 %d \n",ShmSysConfigAndInfo->ate.ATEStatus);
  1418. }else if(ShmSysConfigAndInfo->ate.ATEStatus == 2){
  1419. ShmSysConfigAndInfo->ate.Permission = STOP;
  1420. setChargerMode(CCS_QUANTITY, ShmSysConfigAndInfo->ate.Permission);
  1421. //printf("ATEStatus == 2 %d \n",ShmSysConfigAndInfo->ate.ATEStatus);
  1422. ShmSysConfigAndInfo->ate.ATEStatus = 0;
  1423. }else if(ShmSysConfigAndInfo->ate.ATEStatus == 3){
  1424. //setEVStatus1(evstaus[4]);
  1425. ShmSysConfigAndInfo->ate.Permission = STOP;
  1426. setChargerMode(CCS_QUANTITY, ShmSysConfigAndInfo->ate.Permission);
  1427. ShmSysConfigAndInfo->ate.ATEStatus = 0x00;
  1428. SetChargingPermission(CCS_QUANTITY, ShmSysConfigAndInfo->ate.Permission, ShmSysConfigAndInfo->ate.TotalBatteryCap, ShmSysConfigAndInfo->ate.MaxBatteryCurrent, ShmSysConfigAndInfo->ate.MaxBatteryVoltage, 1);
  1429. EvseStopChargingEvent(normalStop, stopReason, 1);
  1430. }else{
  1431. }
  1432. //printf("state == %d permission = %d \n",ShmSysConfigAndInfo->ate.chademo.id03.state, ShmSysConfigAndInfo->ate.Permission);
  1433. if(ShmSysConfigAndInfo->ate.chademo.id03.state == 0 && ShmSysConfigAndInfo->ate.Permission == 0){
  1434. //SetChargingPermission(CCS_QUANTITY, START, 1000, 1200, 6000, 1);
  1435. //setChargerMode(CCS_QUANTITY, ShmSysConfigAndInfo->ate.Permission);
  1436. ShmSysConfigAndInfo->ate.Permission = START;
  1437. setChargerMode(CCS_QUANTITY, ShmSysConfigAndInfo->ate.Permission);
  1438. SetChargingPermission(CCS_QUANTITY, ShmSysConfigAndInfo->ate.Permission, ShmSysConfigAndInfo->ate.TotalBatteryCap, ShmSysConfigAndInfo->ate.MaxBatteryCurrent, ShmSysConfigAndInfo->ate.MaxBatteryVoltage, 1);
  1439. setEVStatus1(evstaus[0]);
  1440. }else if(ShmSysConfigAndInfo->ate.chademo.id03.state ==1){
  1441. ShmSysConfigAndInfo->ate.Permission = STOP;
  1442. setEVStatus1(evstaus[0]);
  1443. }else if(ShmSysConfigAndInfo->ate.chademo.id03.state ==2){
  1444. ShmSysConfigAndInfo->ate.Permission = STOP;
  1445. setEVStatus1(evstaus[1]);
  1446. }else if(ShmSysConfigAndInfo->ate.chademo.id03.state ==3){
  1447. ShmSysConfigAndInfo->ate.Permission = STOP;
  1448. //setEVStatus1(evstaus[1]);
  1449. setEVStatus1(evstaus[1]);
  1450. }else if(ShmSysConfigAndInfo->ate.chademo.id03.state ==4){
  1451. ShmSysConfigAndInfo->ate.Permission = STOP;
  1452. //setEVStatus1(evstaus[1]);
  1453. setEVStatus1(evstaus[1]);
  1454. }else if(ShmSysConfigAndInfo->ate.chademo.id03.state == 5){
  1455. ShmSysConfigAndInfo->ate.Permission = STOP;
  1456. setEVStatus1(evstaus[1]);
  1457. }else if(ShmSysConfigAndInfo->ate.chademo.id03.state == 6){
  1458. ShmSysConfigAndInfo->ate.Permission = STOP;
  1459. setEVStatus1(evstaus[1]);
  1460. }else if(ShmSysConfigAndInfo->ate.chademo.id03.state == 7){
  1461. ShmSysConfigAndInfo->ate.Permission = STOP;
  1462. setEVStatus1(evstaus[2]);
  1463. //setEVStatus2(evstaus[2]);
  1464. }else if(ShmSysConfigAndInfo->ate.chademo.id03.state == 8){
  1465. ShmSysConfigAndInfo->ate.Permission = STOP;
  1466. //outputRelay.relay_event.bits.Gun1_Parallel_N = 0x00;
  1467. //outputRelay.relay_event.bits.Gun1_Parallel_P = 0x00;
  1468. setEVStatus1(evstaus[2]);
  1469. //setEVStatus2(evstaus[2]);
  1470. }//else if(ShmSysConfigAndInfo->ate.chademo.id03.state == 16 ){
  1471. else if(ShmSysConfigAndInfo->ate.chademo.id03.state >= 13 ){
  1472. handleEmulatorFaultStatus();
  1473. //setEVStatus1(evstaus[3]);
  1474. }else if(ShmSysConfigAndInfo->ate.chademo.id03.state == 14 ){
  1475. handleEmulatorFaultStatus();
  1476. //setEVStatus1(evstaus[3]);
  1477. }else if(ShmSysConfigAndInfo->ate.chademo.id03.state == 9 || ShmSysConfigAndInfo->ate.chademo.id03.state == 10
  1478. || ShmSysConfigAndInfo->ate.chademo.id03.state == 11 || ShmSysConfigAndInfo->ate.chademo.id03.state == 12
  1479. //|| ShmSysConfigAndInfo->ate.chademo.id03.state == 13
  1480. //|| ShmSysConfigAndInfo->ate.chademo.id03.state == 15
  1481. ){
  1482. ShmSysConfigAndInfo->ate.Permission = STOP;
  1483. setEVStatus1(evstaus[3]);
  1484. //setEVStatus1(evstaus[3]);
  1485. handleEmulatorFaultStatus();
  1486. }else{
  1487. setEVStatus1(evstaus[0]);
  1488. //printf("4 %d %d\n",ShmSysConfigAndInfo->ate.chademo.id03.state,ShmSysConfigAndInfo->ate.chademo.id0D_req.K1K2Status);
  1489. }
  1490. if(ShmSysConfigAndInfo->ate.chademo.id03.ProximitySignal == 0){
  1491. //printf("1 %d ===== \n", ShmSysConfigAndInfo->ate.chademo.id03.ProximitySignal);
  1492. //printf("ProximitySignal=====%d \n", ShmSysConfigAndInfo->ate.chademo.id03.ProximitySignal);
  1493. setEVStatus1(evstaus[3]);
  1494. }else if(ShmSysConfigAndInfo->ate.chademo.id03.ProximitySignal == 1 && ShmSysConfigAndInfo->ate.chademo.id03.state != 7 &&
  1495. ShmSysConfigAndInfo->ate.chademo.id03.state != 9 && ShmSysConfigAndInfo->ate.chademo.id03.state != 10
  1496. && ShmSysConfigAndInfo->ate.chademo.id03.state != 11 && ShmSysConfigAndInfo->ate.chademo.id03.state != 12
  1497. && ShmSysConfigAndInfo->ate.chademo.id03.state != 13
  1498. && ShmSysConfigAndInfo->ate.chademo.id03.state != 15){
  1499. //printf("2 %d ===== \n", ShmSysConfigAndInfo->ate.chademo.id03.ProximitySignal);
  1500. setEVStatus1(evstaus[1]);
  1501. }
  1502. if(status){
  1503. //printf("status change1 %d ===== \n", status);
  1504. SetChargingPermission(CCS_QUANTITY, ShmSysConfigAndInfo->ate.Permission, ShmSysConfigAndInfo->ate.TotalBatteryCap, ShmSysConfigAndInfo->ate.MaxBatteryCurrent, ShmSysConfigAndInfo->ate.MaxBatteryVoltage, 1);
  1505. }else{
  1506. if(ShmSysConfigAndInfo->ate.Permission == STOP ){
  1507. if(ShmSysConfigAndInfo->ate.chademo.id03.state == 0){
  1508. //printf("status change0 %d ===== \n", status);
  1509. //SetChargingPermission(CCS_QUANTITY, ShmSysConfigAndInfo->ate.Permission, ShmSysConfigAndInfo->ate.TotalBatteryCap, ShmSysConfigAndInfo->ate.MaxBatteryCurrent, ShmSysConfigAndInfo->ate.MaxBatteryVoltage, 1);
  1510. SetChargingPermission(CCS_QUANTITY, ShmSysConfigAndInfo->ate.Permission, ShmSysConfigAndInfo->ate.TotalBatteryCap, ShmSysConfigAndInfo->ate.MaxBatteryCurrent, ShmSysConfigAndInfo->ate.MaxBatteryVoltage, 1);
  1511. }
  1512. }
  1513. }
  1514. //SetChargingPermission(CCS_QUANTITY, ShmSysConfigAndInfo->ate.Permission, ShmSysConfigAndInfo->ate.TotalBatteryCap, ShmSysConfigAndInfo->ate.MaxBatteryCurrent, ShmSysConfigAndInfo->ate.MaxBatteryVoltage, 1);
  1515. //SetChargingPermission(CCS_QUANTITY, START, 1000, 1200, 6000, 1);
  1516. //usleep(1000);
  1517. //給火線電壓
  1518. SetPresentInputPower(ShmSysConfigAndInfo->ate.RequireVoltage, ShmSysConfigAndInfo->ate.RequireCurrent, 1);
  1519. //usleep(1000);
  1520. //SetPresentInputRequirement(4800, 6000, 1920, 20);
  1521. SetPresentInputRequirement(ShmSysConfigAndInfo->ate.RequireVoltage, ShmSysConfigAndInfo->ate.RequireCurrent, ShmSysConfigAndInfo->ate.PresentBattVoltage, ShmSysConfigAndInfo->ate.MinimumChargeCurrent, 1);
  1522. }
  1523. }
  1524. }
  1525. #if (!DEMO)
  1526. #else
  1527. #endif
  1528. return FAIL;
  1529. }