EvComm.c 29 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843
  1. #include<netinet/ip.h>
  2. #include<arpa/inet.h>
  3. #include <sys/types.h>
  4. #include <sys/stat.h>
  5. #include <fcntl.h>
  6. #include <linux/termios.h>
  7. #include <stdio.h>
  8. #include <string.h>
  9. #include <time.h>
  10. #include <stdlib.h>
  11. #include <sys/ipc.h>
  12. #include <sys/shm.h>
  13. #include <sys/mman.h>
  14. #include <linux/sockios.h>
  15. #include <linux/socket.h>
  16. #include <sys/socket.h>
  17. #include <netinet/in.h>
  18. #include <sys/time.h>
  19. #include <sys/timeb.h>
  20. #include <math.h>//for pow
  21. #include <unistd.h>
  22. #include <linux/if_packet.h>
  23. #include <netinet/if_ether.h>
  24. #include <net/if.h>
  25. #include <netinet/ether.h>
  26. #include "define.h"
  27. #include "EvComm.h"
  28. #define Debug
  29. struct SysConfigAndInfo *ShmSysConfigAndInfo;
  30. struct StatusCodeData *ShmStatusCodeData;
  31. struct CcsData *ShmCcsData;
  32. struct InternalComm *ShmInternalComm;
  33. pid_t PilotDetectionPid;
  34. enum MsgFlowStatus V2gFlowStatus;
  35. int RawSock;
  36. unsigned char *RecvBuffer,*SendBuffer;
  37. int RecvBufferSize=64*1024;
  38. int SendBufferSize=64*1024;
  39. struct MmeHeader SendMmePacket;
  40. int SendMmePacketSize
  41. unsigned char CsuMac[6],QcaMac[6],EvMac[6],SlacRunId[8];
  42. struct sockaddr_ll DestSocketAddress;
  43. struct ifreq Req;
  44. unsigned int PwmStartTime;
  45. struct timeb SeqStartTime,SeqEndTime;
  46. unsigned char AagGroupsNum;
  47. #ifdef SystemLogMessage
  48. int StoreLogMsg(unsigned char *DataString)
  49. {
  50. unsigned char Buf[256];
  51. time_t CurrentTime;
  52. struct tm *tm;
  53. memset(Buf,0,sizeof(Buf));
  54. CurrentTime = time(NULL);
  55. tm=localtime(&CurrentTime);
  56. sprintf(Buf,"echo \"%04d.%02d.%02d %02d:%02d:%02d - %s\" >> /Storage/SystemLog/[%04d.%02d]SystemLog",
  57. tm->tm_year+1900,tm->tm_mon+1,tm->tm_mday,tm->tm_hour,tm->tm_min,tm->tm_sec,
  58. DataString,
  59. tm->tm_year+1900,tm->tm_mon+1);
  60. system(Buf);
  61. #ifdef Debug
  62. printf("%s \n",DataString);
  63. #endif
  64. }
  65. #endif
  66. int DiffTimeb(struct timeb ST, struct timeb ET)
  67. {
  68. //return milli-second
  69. unsigned int StartTime,StopTime;
  70. StartTime=(unsigned int)ST.time;
  71. StopTime=(unsigned int)ET.time;
  72. return (StopTime-StartTime)*1000+ET.millitm-ST.millitm;
  73. }
  74. int CreatShareMemory()
  75. {
  76. int MeterSMId;
  77. //creat ShmSysConfigAndInfo
  78. if ((MeterSMId = shmget(ShmSysConfigAndInfoKey, sizeof(struct SysConfigAndInfo), IPC_CREAT | 0777)) < 0)
  79. {
  80. #ifdef SystemLogMessage
  81. StoreLogMsg("[main]CreatShareMemory:shmget ShmSysConfigAndInfo NG");
  82. #endif
  83. return 0;
  84. }
  85. else if ((ShmSysConfigAndInfo = shmat(MeterSMId, NULL, 0)) == (void *) -1)
  86. {
  87. #ifdef SystemLogMessage
  88. StoreLogMsg("[main]CreatShareMemory:shmat ShmSysConfigAndInfo NG");
  89. #endif
  90. return 0;
  91. }
  92. memset(ShmSysConfigAndInfo,0,sizeof(struct SysConfigAndInfo));
  93. //creat ShmStatusCodeData
  94. if ((MeterSMId = shmget(ShmStatusCodeKey, sizeof(struct StatusCodeData), IPC_CREAT | 0777)) < 0)
  95. {
  96. #ifdef SystemLogMessage
  97. StoreLogMsg("[main]CreatShareMemory:shmget ShmStatusCodeData NG");
  98. #endif
  99. return 0;
  100. }
  101. else if ((ShmStatusCodeData = shmat(MeterSMId, NULL, 0)) == (void *) -1)
  102. {
  103. #ifdef SystemLogMessage
  104. StoreLogMsg("[main]CreatShareMemory:shmat ShmStatusCodeData NG");
  105. #endif
  106. return 0;
  107. }
  108. memset(ShmStatusCodeData,0,sizeof(struct StatusCodeData));
  109. //creat ShmCcsData
  110. if ((MeterSMId = shmget(ShmCcsCommKey, sizeof(struct CcsData), IPC_CREAT | 0777)) < 0)
  111. {
  112. #ifdef SystemLogMessage
  113. StoreLogMsg("[main]CreatShareMemory:shmget ShmCcsData NG");
  114. #endif
  115. return 0;
  116. }
  117. else if ((ShmCcsData = shmat(MeterSMId, NULL, 0)) == (void *) -1)
  118. {
  119. #ifdef SystemLogMessage
  120. StoreLogMsg("[main]CreatShareMemory:shmat ShmCcsData NG");
  121. #endif
  122. return 0;
  123. }
  124. memset(ShmCcsData,0,sizeof(struct CcsData));
  125. return 1;
  126. }
  127. int InitShareMemory()
  128. {
  129. int MeterSMId;
  130. //creat ShmSysConfigAndInfo
  131. if ((MeterSMId = shmget(ShmSysConfigAndInfoKey, sizeof(struct SysConfigAndInfo), 0777)) < 0)
  132. {
  133. #ifdef SystemLogMessage
  134. StoreLogMsg("[CsuComm]InitShareMemory:shmget ShmSysConfigAndInfo NG");
  135. #endif
  136. return 0;
  137. }
  138. else if ((ShmSysConfigAndInfo = shmat(MeterSMId, NULL, 0)) == (void *) -1)
  139. {
  140. #ifdef SystemLogMessage
  141. StoreLogMsg("[CsuComm]InitShareMemory:shmat ShmSysConfigAndInfo NG");
  142. #endif
  143. return 0;
  144. }
  145. //creat ShmStatusCodeData
  146. if ((MeterSMId = shmget(ShmStatusCodeKey, sizeof(struct StatusCodeData), 0777)) < 0)
  147. {
  148. #ifdef SystemLogMessage
  149. StoreLogMsg("[CsuComm]InitShareMemory:shmget ShmStatusCodeData NG");
  150. #endif
  151. return 0;
  152. }
  153. else if ((ShmStatusCodeData = shmat(MeterSMId, NULL, 0)) == (void *) -1)
  154. {
  155. #ifdef SystemLogMessage
  156. StoreLogMsg("[CsuComm]InitShareMemory:shmat ShmStatusCodeData NG");
  157. #endif
  158. return 0;
  159. }
  160. //creat ShmCcsData
  161. if ((MeterSMId = shmget(ShmCcsCommKey, sizeof(struct CcsData), 0777)) < 0)
  162. {
  163. #ifdef SystemLogMessage
  164. StoreLogMsg("[CsuComm]InitShareMemory:shmget ShmCcsData NG");
  165. #endif
  166. return 0;
  167. }
  168. else if ((ShmCcsData = shmat(MeterSMId, NULL, 0)) == (void *) -1)
  169. {
  170. #ifdef SystemLogMessage
  171. StoreLogMsg("[CsuComm]InitShareMemory:shmat ShmCcsData NG");
  172. #endif
  173. return 0;
  174. }
  175. //creat ShmInternalComm
  176. if ((MeterSMId = shmget(ShmInternalCommKey, sizeof(struct InternalComm), 0777)) < 0)
  177. {
  178. #ifdef SystemLogMessage
  179. StoreLogMsg("[CsuComm]InitShareMemory:shmget ShmInternalComm NG");
  180. #endif
  181. return 0;
  182. }
  183. else if ((ShmInternalComm = shmat(MeterSMId, NULL, 0)) == (void *) -1)
  184. {
  185. #ifdef SystemLogMessage
  186. StoreLogMsg("[CsuComm]InitShareMemory:shmat ShmInternalComm NG");
  187. #endif
  188. return 0;
  189. }
  190. return 1;
  191. }
  192. int GetEthMac(unsigned char *Eth, unsigned char *mac)
  193. {
  194. //Parameters:MAC,IP,Mask,Gateway
  195. int fd,rd=0;
  196. unsigned char addr[18], Buffer[128];
  197. memset(Buffer,0,sizeof(Buffer));
  198. sprintf(Buffer,"cat /sys/class/net/%s/address > /mnt/GetEthInfo",Eth);
  199. system(Buffer);
  200. fd = open("/mnt/GetEthInfo", O_RDONLY);
  201. if(fd<0)
  202. {
  203. system("rm -f /mnt/GetEthInfo");
  204. #ifdef SystemLogMessage
  205. StoreLogMsg("[EvComm]GetEthMac: MAC Address open error");
  206. #endif
  207. return 0;
  208. }
  209. memset(mac,0,6);
  210. memset(addr,0,sizeof(addr));
  211. rd=read(fd,addr,17);
  212. close(fd);
  213. system("rm -f /mnt/GetEthInfo");
  214. sscanf(addr, "%02x:%02x:%02x:%02x:%02x:%02x", &mac[0], &mac[1], &mac[2], &mac[3], &mac[4], &mac[5]);
  215. return 1;
  216. }
  217. float ReadAdcVolt(unsigned char AdcChannel)
  218. {
  219. FILE *fp;
  220. unsigned char str[64];
  221. unsigned char AdcValue[8];
  222. if(AdcChannel>7)
  223. return -1;
  224. memset(str,0,sizeof(str));
  225. memset(AdcValue,0,sizeof(AdcValue));
  226. sprintf(str,"cat /sys/bus/iio/devices/iio\\:device0/in_voltage%d_raw",AdcChannel);
  227. fp=popen(str, "r");
  228. if(fgets(AdcValue,sizeof(AdcValue),fp)==NULL)
  229. {
  230. pclose(fp);
  231. return -1;
  232. }
  233. pclose(fp);
  234. //Vin = Vref *D / (2^n - 1)
  235. return ((float)1.8*(float)atoi(AdcValue))/4095;
  236. }
  237. void Qca7kPowerReset()
  238. {
  239. system("echo 1 > /sys/class/gpio/gpio88/value");
  240. usleep(500000);
  241. system("echo 0 > /sys/class/gpio/gpio88/value");
  242. }
  243. void SwitchCpStateE(unsigned char OnOff)
  244. {
  245. //OnOff=1 => switch State to E
  246. //OnOff=0 => return noraml
  247. if(OnOff==0)
  248. system("echo 0 > /sys/class/gpio/gpio86/value");
  249. else
  250. system("echo 1 > /sys/class/gpio/gpio86/value");
  251. }
  252. int OutputCpPwmDuty(unsigned char Duty)
  253. {
  254. unsigned char str[128];
  255. int DutyInNanoSec;
  256. if((Duty<0)||(Duty>100))
  257. return -1;
  258. memset(str,0,sizeof(str));
  259. DutyInNanoSec=10000*Duty;
  260. sprintf(str,"echo %d > /sys/class/pwm/pwmchip0/pwm0/duty_cycle",DutyInNanoSec);//nanoseconds
  261. system(str);
  262. ShmSysConfigAndInfo->SysInfo.CcsChargingData[0].PilotDuty=Duty;
  263. return 0;
  264. }
  265. int ConnectorPlugIn()
  266. {
  267. //return 0 => unplug
  268. //return 1 => plug-in
  269. float TmpProximity;
  270. unsigned char Rtn=0;
  271. if(((FirmwareVersion&0x0000FF00)>>8)==0x01)
  272. {
  273. //UL version: judge with CP and proximity
  274. TmpProximity=ReadAdcVolt(2);
  275. if((ShmSysConfigAndInfo->SysInfo.CcsChargingData[0].PilotState>=2)&&(ShmSysConfigAndInfo->SysInfo.CcsChargingData[0].PilotState<=5)&&
  276. (TmpProximity>=0.4)&&(TmpProximity<=0.9))
  277. {
  278. Rtn=1;
  279. }
  280. }
  281. else
  282. {
  283. //CE version: judge with CP only
  284. if((ShmSysConfigAndInfo->SysInfo.CcsChargingData[0].PilotState>=2)&&(ShmSysConfigAndInfo->SysInfo.CcsChargingData[0].PilotState<=5))
  285. Rtn=1;
  286. }
  287. ShmSysConfigAndInfo->SysInfo.CcsChargingData[0].ConnectorPlugIn=Rtn;
  288. return Rtn;
  289. }
  290. void PilotDetection()
  291. {
  292. pid_t tmp=0;
  293. struct timeb StartTime,EndTime;
  294. unsigned char CpState[3],count;
  295. float TmpVolt;
  296. if(PilotDetectionPid==0)
  297. {
  298. tmp=fork();
  299. if(tmp>0)
  300. {
  301. PilotDetectionPid=tmp;
  302. {
  303. unsigned char buf[64];
  304. memset(buf,0,sizeof(buf));
  305. sprintf(buf,"renice -20 -p %d",tmp);
  306. system(buf);
  307. }
  308. return;
  309. }
  310. }
  311. while(1)
  312. {
  313. //ADC_Voltage = (1+RE62/RE63)*0.9 - (RE62/RE63)*Pilot_Voltage, RE62/RE63=0.06
  314. //=>Pilot_Voltage=(0.954-ADC_Voltage)/0.06
  315. //ftime(&StartTime);
  316. TmpVolt=0;
  317. for(count=0;count<3;count++)
  318. {
  319. TmpVolt+=(0.954-ReadAdcVolt(3))/0.06;
  320. }
  321. TmpVolt/=3;
  322. ShmSysConfigAndInfo->SysInfo.CcsChargingData[0].PilotVoltage=TmpVolt;
  323. if(TmpVolt>=13.5)
  324. {
  325. //Pilot Error
  326. if((ShmSysConfigAndInfo->SysInfo.CcsChargingData[0].PilotState==1)&&(TmpVolt<13.75))
  327. ShmSysConfigAndInfo->SysInfo.CcsChargingData[0].PilotState=1;
  328. else
  329. ShmSysConfigAndInfo->SysInfo.CcsChargingData[0].PilotState=8;
  330. }
  331. else if((TmpVolt>=10.5)&&(TmpVolt<13.5))
  332. {
  333. //State A
  334. if((ShmSysConfigAndInfo->SysInfo.CcsChargingData[0].PilotState>=2)&&(ShmSysConfigAndInfo->SysInfo.CcsChargingData[0].PilotState<=3)&&(TmpVolt<10.75))
  335. {
  336. if((ShmSysConfigAndInfo->SysInfo.CcsChargingData[0].PilotDuty>=5)&&(ShmSysConfigAndInfo->SysInfo.CcsChargingData[0].PilotDuty<100))
  337. ShmSysConfigAndInfo->SysInfo.CcsChargingData[0].PilotState=3;
  338. else
  339. ShmSysConfigAndInfo->SysInfo.CcsChargingData[0].PilotState=2;
  340. }
  341. else if((ShmSysConfigAndInfo->SysInfo.CcsChargingData[0].PilotState==8)&&(TmpVolt>=13.25))
  342. ShmSysConfigAndInfo->SysInfo.CcsChargingData[0].PilotState=8;
  343. else
  344. ShmSysConfigAndInfo->SysInfo.CcsChargingData[0].PilotState=1;
  345. }
  346. else if((TmpVolt>=7.5)&&(TmpVolt<10.5))
  347. {
  348. //State B
  349. if((ShmSysConfigAndInfo->SysInfo.CcsChargingData[0].PilotState==4)&&(TmpVolt<7.75))
  350. ShmSysConfigAndInfo->SysInfo.CcsChargingData[0].PilotState=4;
  351. else if((ShmSysConfigAndInfo->SysInfo.CcsChargingData[0].PilotState==1)&&(TmpVolt>=10.25))
  352. ShmSysConfigAndInfo->SysInfo.CcsChargingData[0].PilotState=1;
  353. else
  354. {
  355. if((ShmSysConfigAndInfo->SysInfo.CcsChargingData[0].PilotDuty>=5)&&(ShmSysConfigAndInfo->SysInfo.CcsChargingData[0].PilotDuty<100))
  356. ShmSysConfigAndInfo->SysInfo.CcsChargingData[0].PilotState=3;
  357. else
  358. ShmSysConfigAndInfo->SysInfo.CcsChargingData[0].PilotState=2;
  359. }
  360. }
  361. else if((TmpVolt>=4.5)&&(TmpVolt<7.5))
  362. {
  363. //State C
  364. if((ShmSysConfigAndInfo->SysInfo.CcsChargingData[0].PilotState==5)&&(TmpVolt<4.75))
  365. ShmSysConfigAndInfo->SysInfo.CcsChargingData[0].PilotState=5;
  366. else if((ShmSysConfigAndInfo->SysInfo.CcsChargingData[0].PilotState>=2)&&(ShmSysConfigAndInfo->SysInfo.CcsChargingData[0].PilotState<=3)&&(TmpVolt>=7.25))
  367. {
  368. if((ShmSysConfigAndInfo->SysInfo.CcsChargingData[0].PilotDuty>=5)&&(ShmSysConfigAndInfo->SysInfo.CcsChargingData[0].PilotDuty<100))
  369. ShmSysConfigAndInfo->SysInfo.CcsChargingData[0].PilotState=3;
  370. else
  371. ShmSysConfigAndInfo->SysInfo.CcsChargingData[0].PilotState=2;
  372. }
  373. else
  374. {
  375. ShmSysConfigAndInfo->SysInfo.CcsChargingData[0].PilotState=4;
  376. }
  377. }
  378. else if((TmpVolt>=1.5)&&(TmpVolt<4.5))
  379. {
  380. //State D
  381. if((ShmSysConfigAndInfo->SysInfo.CcsChargingData[0].PilotState==6)&&(TmpVolt<1.75))
  382. ShmSysConfigAndInfo->SysInfo.CcsChargingData[0].PilotState=6;
  383. else if((ShmSysConfigAndInfo->SysInfo.CcsChargingData[0].PilotState==4)&&(TmpVolt>=4.25))
  384. ShmSysConfigAndInfo->SysInfo.CcsChargingData[0].PilotState=4;
  385. else
  386. {
  387. ShmSysConfigAndInfo->SysInfo.CcsChargingData[0].PilotState=5;
  388. }
  389. }
  390. else if((TmpVolt>= -1.5)&&(TmpVolt<1.5))
  391. {
  392. //State E
  393. if((ShmSysConfigAndInfo->SysInfo.CcsChargingData[0].PilotState==8)&&(TmpVolt< -1.25))
  394. ShmSysConfigAndInfo->SysInfo.CcsChargingData[0].PilotState=8;
  395. else if((ShmSysConfigAndInfo->SysInfo.CcsChargingData[0].PilotState==5)&&(TmpVolt>=1.25))
  396. ShmSysConfigAndInfo->SysInfo.CcsChargingData[0].PilotState=5;
  397. else
  398. {
  399. ShmSysConfigAndInfo->SysInfo.CcsChargingData[0].PilotState=6;
  400. }
  401. }
  402. else if((TmpVolt>= -13.5)&&(TmpVolt< -10.5))
  403. {
  404. //State F
  405. if((ShmSysConfigAndInfo->SysInfo.CcsChargingData[0].PilotState==8)&&(TmpVolt>= -10.75))
  406. ShmSysConfigAndInfo->SysInfo.CcsChargingData[0].PilotState=8;
  407. else
  408. {
  409. ShmSysConfigAndInfo->SysInfo.CcsChargingData[0].PilotState=7;
  410. }
  411. }
  412. //ftime(&EndTime);
  413. //printf("duration:%d\n", DiffTimeb(StartTime, EndTime));
  414. }//while
  415. }
  416. int MmeProcess(unsigned char *Buffer, int DataLength)
  417. {
  418. //struct ethhdr *EthPacket;
  419. struct MmeHeader *MmePacket;
  420. int Rtn;
  421. static unsigned char counter;
  422. static unsigned short Aag[64];
  423. MmePacket = (struct MmeHeader *)Buffer;
  424. #ifdef Debug
  425. printf("\n***** Received MME Packet *****\n");
  426. printf("DataLength=%d\n",DataLength);
  427. printf("ODA: %02x:%02x:%02x:%02x:%02x:%02x\n",
  428. MmePacket->ODA[0],MmePacket->ODA[1],MmePacket->ODA[2],MmePacket->ODA[3],MmePacket->ODA[4],MmePacket->ODA[5]);
  429. printf("OSA: %02x:%02x:%02x:%02x:%02x:%02x\n",
  430. MmePacket->OSA[0],MmePacket->OSA[1],MmePacket->OSA[2],MmePacket->OSA[3],MmePacket->OSA[4],MmePacket->OSA[5]);
  431. printf("MTYPE: 0x%x\n", htons(MmePacket->MTYPE));
  432. printf("MMV: 0x%x\n", MmePacket->MMV);
  433. printf("MMTYPE: 0x%x\n", MmePacket->MMTYPE);
  434. printf("FMI 0x%x, 0x%x\n", MmePacket->FMI[0],MmePacket->FMI[1]);
  435. #endif
  436. //check if the destination address is broadcast or EVSE itself, it can be ignore if not belong to itself.
  437. switch(MmePacket->MMTYPE)
  438. {
  439. case MMTYPE_CM_SLAC_PARM_REQ:
  440. #ifdef Debug
  441. printf("--- CM_SLAC_PARM_REQ ---\n");
  442. printf("APPLICATION_TYPE: 0x%x\n", MmePacket->MMENTRY[0]);
  443. printf("SECURITY_TYPE: 0x%x\n", MmePacket->MMENTRY[1]);
  444. printf("RunID: %02x,%02x,%02x,%02x,%02x,%02x,%02x,%02x\n",
  445. MmePacket->MMENTRY[2],MmePacket->MMENTRY[3],MmePacket->MMENTRY[4],MmePacket->MMENTRY[5],MmePacket->MMENTRY[6],
  446. MmePacket->MMENTRY[7],MmePacket->MMENTRY[8],MmePacket->MMENTRY[9]);
  447. printf("CipherSuiteSetSize: 0x%x\n", MmePacket->MMENTRY[10]);
  448. printf("CipherSuite [1]: 0x%x,0x%x\n", MmePacket->MMENTRY[11], MmePacket->MMENTRY[12]);
  449. #endif
  450. V2gFlowStatus=CM_SLAC_PARM_REQ;
  451. memcpy(EvMac,MmePacket->OSA,sizeof(EvMac));
  452. memcpy(DestSocketAddress.sll_addr,MmePacket->OSA,sizeof(EvMac));
  453. memcpy(SlacRunId,MmePacket->MMENTRY+2,sizeof(SlacRunId));
  454. memset(&SendMmePacket,0,sizeof(struct MmeHeader));
  455. memcpy(SendMmePacket.ODA,MmePacket->OSA,6);
  456. memcpy(SendMmePacket.OSA,CsuMac,6);
  457. SendMmePacket.MTYPE=htons(EtherType_HomePlug);
  458. SendMmePacket.MMV=MmePacket->MMV;
  459. SendMmePacket.MMTYPE=MMTYPE_CM_SLAC_PARM_CNF;
  460. SendMmePacket.FMI[0]=SendMmePacket.FMI[1]=0;
  461. SendMmePacketSize=0;
  462. memset(SendMmePacket.MMENTRY,0xFF,6); //Fixed value indicating that M-Sounds to be sent as Ethernet broadcast
  463. SendMmePacketSize+=6;
  464. SendMmePacket.MMENTRY[SendMmePacketSize++]=C_EV_match_MNBC;
  465. SendMmePacket.MMENTRY[SendMmePacketSize++]=TT_EVSE_match_MNBC;
  466. SendMmePacket.MMENTRY[SendMmePacketSize++]=0x01; //Fixed value indicating ¡§Other GP station¡¨, 0x00 ¡V HLE of the STA, 0x01 ¡V Another GP STA, 0x02 ¡V 0xFF ¡V Reserved
  467. memcpy(SendMmePacket.MMENTRY+SendMmePacketSize,EvMac,6);
  468. SendMmePacketSize+=6;
  469. SendMmePacket.MMENTRY[SendMmePacketSize++]=0; //Fixed value indicating ¡§PEVEVSEMatching¡¨
  470. SendMmePacket.MMENTRY[SendMmePacketSize++]=0; //Fixed value indicating ¡§No Security¡¨
  471. memcpy(SendMmePacket.MMENTRY+SendMmePacketSize,SlacRunId,sizeof(SlacRunId));
  472. SendMmePacketSize+=sizeof(SlacRunId);
  473. SendMmePacketSize+=19; //the size before MMENTRY
  474. V2gFlowStatus=CM_SLAC_PARM_CONF;
  475. Rtn=sendto(RawSock, &SendMmePacket, SendMmePacketSize, 0, (struct sockaddr*)&DestSocketAddress, sizeof(struct sockaddr_ll));
  476. ftime(&SeqStartTime);
  477. counter=0;
  478. #ifdef Debug
  479. printf("\n***** Response MME Packet *****\n");
  480. printf("SendMmePacketSize=%d,Rtn=%d\n",SendMmePacketSize,Rtn);
  481. printf("SendMmePacket->ODA: %02x:%02x:%02x:%02x:%02x:%02x:\n",
  482. SendMmePacket.ODA[0],SendMmePacket.ODA[1],SendMmePacket.ODA[2],SendMmePacket.ODA[3],SendMmePacket.ODA[4],SendMmePacket.ODA[5]);
  483. printf("SendMmePacket->OSA: %02x:%02x:%02x:%02x:%02x:%02x:\n",
  484. SendMmePacket.OSA[0],SendMmePacket.OSA[1],SendMmePacket.OSA[2],SendMmePacket.OSA[3],SendMmePacket.OSA[4],SendMmePacket.OSA[5]);
  485. printf("MTYPE: 0x%x\n", htons(SendMmePacket.MTYPE));
  486. printf("MMV: 0x%x\n", SendMmePacket.MMV);
  487. printf("MMTYPE: 0x%x\n", SendMmePacket.MMTYPE);
  488. printf("FMI 0x%x, 0x%x\n", SendMmePacket.FMI[0],SendMmePacket.FMI[1]);
  489. printf("--- CM_SLAC_PARM_CNF ---\n");
  490. printf("M-SOUND_TARGET: %02x:%02x:%02x:%02x:%02x:%02x\n",
  491. SendMmePacket.MMENTRY[0],SendMmePacket.MMENTRY[1],SendMmePacket.MMENTRY[2],SendMmePacket.MMENTRY[3],
  492. SendMmePacket.MMENTRY[4],SendMmePacket.MMENTRY[5]);
  493. printf("NUM_SOUNDS: 0x%x\n", SendMmePacket.MMENTRY[6]);
  494. printf("Time_Out: 0x%x\n", SendMmePacket.MMENTRY[7]);
  495. printf("RESP_TYPE: 0x%x\n", SendMmePacket.MMENTRY[8]);
  496. printf("M-FORWARDING_STA: %02x:%02x:%02x:%02x:%02x:%02x:\n",
  497. SendMmePacket.MMENTRY[9],SendMmePacket.MMENTRY[10],SendMmePacket.MMENTRY[11],SendMmePacket.MMENTRY[12],
  498. SendMmePacket.MMENTRY[13],SendMmePacket.MMENTRY[14]);
  499. printf("APPLICATION_TYPE: 0x%x\n", SendMmePacket.MMENTRY[15]);
  500. printf("SECURITY_TYPE: 0x%x\n", SendMmePacket.MMENTRY[16]);
  501. printf("RunID: %02x,%02x,%02x,%02x,%02x,%02x,%02x,%02x\n",
  502. SendMmePacket.MMENTRY[17],SendMmePacket.MMENTRY[18],SendMmePacket.MMENTRY[19],SendMmePacket.MMENTRY[20],
  503. SendMmePacket.MMENTRY[21],SendMmePacket.MMENTRY[22],SendMmePacket.MMENTRY[23],SendMmePacket.MMENTRY[24]);
  504. #endif
  505. break;
  506. case MMTYPE_CM_START_ATTEN_CHAR_IND:
  507. #ifdef Debug
  508. printf("--- CM_START_ATTEN_CHAR_IND (counter : %d) ---\n",counter+1);
  509. printf("APPLICATION_TYPE: 0x%x\n", MmePacket->MMENTRY[0]);
  510. printf("SECURITY_TYPE: 0x%x\n", MmePacket->MMENTRY[1]);
  511. printf("NUM_SOUNDS: 0x%x\n", MmePacket->MMENTRY[2]);
  512. printf("Time_Out 0x%x\n", MmePacket->MMENTRY[3]);
  513. printf("RESP_TYPE 0x%x\n", MmePacket->MMENTRY[4]);//Fixed value (0x01) indicating ¡§other Green PHY station¡¨
  514. printf("FORWARDING_STA: %02x:%02x:%02x:%02x:%02x:%02x\n",
  515. MmePacket->MMENTRY[5],MmePacket->MMENTRY[6],MmePacket->MMENTRY[7],MmePacket->MMENTRY[8],
  516. MmePacket->MMENTRY[9],MmePacket->MMENTRY[10]);
  517. printf("RunID: %02x,%02x,%02x,%02x,%02x,%02x,%02x,%02x\n",
  518. MmePacket.MMENTRY[11],MmePacket.MMENTRY[12],MmePacket.MMENTRY[13],MmePacket.MMENTRY[14],
  519. MmePacket.MMENTRY[15],MmePacket.MMENTRY[16],MmePacket.MMENTRY[17],MmePacket.MMENTRY[18]);
  520. #endif
  521. V2gFlowStatus=CM_START_ATTEN_CHAR_IND;
  522. counter++;
  523. if(counter==1)
  524. {
  525. ftime(&SeqStartTime); //start TT_EVSE_match_MNBC
  526. memset(Aag,0,sizeof(Aag));
  527. }
  528. else if(counter>=3)
  529. {
  530. counter=0;
  531. }
  532. break;
  533. case MMTYPE_CM_MNBC_SOUND_IND:
  534. #ifdef Debug
  535. printf("--- MMTYPE_CM_MNBC_SOUND_IND (counter : %d) ---\n",counter+1);
  536. printf("APPLICATION_TYPE: 0x%x\n", MmePacket->MMENTRY[0]);
  537. printf("SECURITY_TYPE: 0x%x\n", MmePacket->MMENTRY[1]);
  538. printf("SenderID: %02x,%02x,%02x,%02x,%02x,%02x,%02x,%02x,%02x,%02x,%02x,%02x,%02x,%02x,%02x,%02x,%02x\n",
  539. MmePacket.MMENTRY[2],MmePacket.MMENTRY[3],MmePacket.MMENTRY[4],MmePacket.MMENTRY[5],
  540. MmePacket.MMENTRY[6],MmePacket.MMENTRY[7],MmePacket.MMENTRY[8],MmePacket.MMENTRY[9],
  541. MmePacket.MMENTRY[10],MmePacket.MMENTRY[11],MmePacket.MMENTRY[12],MmePacket.MMENTRY[13],
  542. MmePacket.MMENTRY[14],MmePacket.MMENTRY[15],MmePacket.MMENTRY[16],MmePacket.MMENTRY[17],
  543. MmePacket.MMENTRY[18]);
  544. printf("Cnt: 0x%x\n", MmePacket->MMENTRY[19]);
  545. printf("RunID: %02x,%02x,%02x,%02x,%02x,%02x,%02x,%02x\n",
  546. MmePacket.MMENTRY[20],MmePacket.MMENTRY[21],MmePacket.MMENTRY[22],MmePacket.MMENTRY[23],
  547. MmePacket.MMENTRY[24],MmePacket.MMENTRY[25],MmePacket.MMENTRY[26],MmePacket.MMENTRY[27]);
  548. printf("RSVD: %02x,%02x,%02x,%02x,%02x,%02x,%02x,%02x\n",
  549. MmePacket.MMENTRY[28],MmePacket.MMENTRY[29],MmePacket.MMENTRY[30],MmePacket.MMENTRY[31],
  550. MmePacket.MMENTRY[32],MmePacket.MMENTRY[33],MmePacket.MMENTRY[34],MmePacket.MMENTRY[35]);
  551. printf("Rnd: %02x,%02x,%02x,%02x,%02x,%02x,%02x,%02x,%02x,%02x,%02x,%02x,%02x,%02x,%02x,%02x,%02x\n",
  552. MmePacket.MMENTRY[36],MmePacket.MMENTRY[37],MmePacket.MMENTRY[38],MmePacket.MMENTRY[39],
  553. MmePacket.MMENTRY[40],MmePacket.MMENTRY[41],MmePacket.MMENTRY[42],MmePacket.MMENTRY[43],
  554. MmePacket.MMENTRY[44],MmePacket.MMENTRY[45],MmePacket.MMENTRY[46],MmePacket.MMENTRY[47],
  555. MmePacket.MMENTRY[48],MmePacket.MMENTRY[49],MmePacket.MMENTRY[50],MmePacket.MMENTRY[51]);
  556. #endif
  557. V2gFlowStatus=CM_MNBC_SOUND_IND;
  558. counter++;
  559. break;
  560. case MMTYPE_CM_ATTEN_PROFILE_IND:
  561. #ifdef Debug
  562. printf("--- MMTYPE_CM_ATTEN_PROFILE_IND (counter : %d) ---\n",counter+1);
  563. printf("EV MAC: %02x:%02x:%02x:%02x:%02x:%02x\n",
  564. MmePacket->MMENTRY[0],MmePacket->MMENTRY[1],MmePacket->MMENTRY[2],MmePacket->MMENTRY[3],
  565. MmePacket->MMENTRY[4],MmePacket->MMENTRY[5]);
  566. printf("NumGroups: 0x%x\n", MmePacket->MMENTRY[6]);
  567. printf("RSVD: 0x%x\n", MmePacket->MMENTRY[7]);
  568. printf("AAG: \n");
  569. for(Rtn=0;Rtn<MmePacket->MMENTRY[6];Rtn++)
  570. printf("%02x, ",MmePacket->MMENTRY[8+Rtn]);
  571. printf("\n");
  572. #endif
  573. AagGroupsNum=MmePacket->MMENTRY[6];
  574. for(Rtn=0;Rtn<MmePacket->MMENTRY[6];Rtn++)
  575. Aag[Rtn]+=MmePacket->MMENTRY[8+Rtn];
  576. //V2gFlowStatus=CM_MNBC_SOUND_IND;
  577. break;
  578. case MMTYPE_CM_ATTN_CHAR_RSP:
  579. #ifdef Debug
  580. printf("--- MMTYPE_CM_ATTN_CHAR_RSP ---\n");
  581. printf("APPLICATION_TYPE: 0x%x\n", MmePacket->MMENTRY[0]);
  582. printf("SECURITY_TYPE: 0x%x\n", MmePacket->MMENTRY[1]);
  583. printf("SOURCE_ADDRESS: %02x:%02x:%02x:%02x:%02x:%02x\n",
  584. MmePacket->MMENTRY[2],MmePacket->MMENTRY[3],MmePacket->MMENTRY[4],MmePacket->MMENTRY[5],
  585. MmePacket->MMENTRY[6],MmePacket->MMENTRY[7]);
  586. printf("RunID: %02x,%02x,%02x,%02x,%02x,%02x,%02x,%02x\n",
  587. MmePacket.MMENTRY[8],MmePacket.MMENTRY[9],MmePacket.MMENTRY[10],MmePacket.MMENTRY[11],
  588. MmePacket.MMENTRY[12],MmePacket.MMENTRY[13],MmePacket.MMENTRY[14],MmePacket.MMENTRY[15]);
  589. printf("SOURCE_ID: \n");
  590. for(Rtn=0;Rtn<17;Rtn++)
  591. printf("%02x, ",MmePacket->MMENTRY[16+Rtn]);
  592. printf("\n");
  593. printf("RESP_ID: \n");
  594. for(Rtn=0;Rtn<17;Rtn++)
  595. printf("%02x, ",MmePacket->MMENTRY[33+Rtn]);
  596. printf("\n");
  597. printf("Result: 0x%x\n", MmePacket->MMENTRY[50]);//Fixed value of 0x00 indicates a successful SLAC process
  598. #endif
  599. V2gFlowStatus=CM_ATTEN_CHAR_RSP;
  600. break;
  601. default:
  602. break;
  603. }
  604. }
  605. int SlacComm()
  606. {
  607. int packet_size,count;
  608. if(RawSock>=0)
  609. {
  610. packet_size = recvfrom(RawSock , RecvBuffer , RecvBufferSize , 0 , NULL, NULL);
  611. #ifdef Debug
  612. printf("packet_size=%d\n",packet_size);
  613. #endif
  614. if(packet_size>0)
  615. {
  616. /*#ifdef Debug
  617. printf("Raw Data: ");
  618. for(count=0;count<packet_size;count++)
  619. printf("0x%x, ",RecvBuffer[count]);
  620. printf("\n");
  621. #endif*/
  622. MmeProcess(RecvBuffer, packet_size);
  623. }
  624. }
  625. switch(V2gFlowStatus)
  626. {
  627. case Idle:
  628. if(RawSock<0)
  629. {
  630. struct timeval tv;
  631. RawSock= socket(PF_PACKET, SOCK_RAW, htons(EtherType_HomePlug));
  632. #ifdef Debug
  633. printf("RawSock=%d\n",RawSock);
  634. #endif
  635. if(RawSock == -1)
  636. {
  637. #ifdef SystemLogMessage
  638. StoreLogMsg("[EvComm]SlacComm:Failed to create socke");
  639. #endif
  640. V2gFlowStatus=Other_Fault;
  641. return -1;
  642. }
  643. setsockopt(RawSock, SOL_SOCKET, SO_BINDTODEVICE, "eth0", 4);
  644. tv.tv_sec = 0;
  645. tv.tv_usec = 10000;
  646. if (setsockopt(RawSock, SOL_SOCKET, SO_RCVTIMEO, (char *)&tv, sizeof(struct timeval)) < 0)
  647. {
  648. #ifdef SystemLogMessage
  649. StoreLogMsg("[EvComm]SlacComm:Set SO_RCVTIMEO NG");
  650. #endif
  651. V2gFlowStatus=Other_Fault;
  652. return -1;
  653. }
  654. memset(&Req, 0, sizeof(struct ifreq));
  655. strcpy( (char*)Req.ifr_name, /*QcaInterface*/"eth0");
  656. if (ioctl(RawSock, SIOCGIFINDEX, &Req) < 0)
  657. {
  658. #ifdef SystemLogMessage
  659. StoreLogMsg("[EvComm]SlacComm: ioctl NG");
  660. #endif
  661. V2gFlowStatus=Other_Fault;
  662. return -1;
  663. }
  664. memset( &DestSocketAddress, 0, sizeof(struct sockaddr_ll) );
  665. //DestSocketAddress.sll_family = PF_PACKET;
  666. //DestSocketAddress.sll_protocol = 0;
  667. DestSocketAddress.sll_ifindex = Req.ifr_ifindex;
  668. DestSocketAddress.sll_halen = ETH_ALEN;
  669. OutputCpPwmDuty(5);
  670. PwmStartTime=time(NULL);
  671. }
  672. else
  673. {
  674. if((time(NULL)-PwmStartTime)>TT_EVSE_SLAC_init)
  675. {
  676. #ifdef SystemLogMessage
  677. StoreLogMsg("[EvComm]SlacComm: Wait CM_SLAC_PARM_REQ Timeout - TT_EVSE_SLAC_init ");
  678. #endif
  679. V2gFlowStatus=Sequence_Timeout;
  680. return -1;
  681. }
  682. }
  683. break;
  684. case CM_SLAC_PARM_CONF:
  685. ftime(&SeqEndTime);
  686. if(DiffTimeb(SeqStartTime, SeqEndTime)>TT_match_sequence)
  687. {
  688. #ifdef SystemLogMessage
  689. StoreLogMsg("[EvComm]SlacComm: Wait CM_START_ATTEN_CHAR_IND Timeout - TT_match_sequence ");
  690. #endif
  691. V2gFlowStatus=Sequence_Timeout;
  692. return -1;
  693. }
  694. break;
  695. case CM_START_ATTEN_CHAR_IND:
  696. ftime(&SeqEndTime);
  697. if(DiffTimeb(SeqStartTime, SeqEndTime)>(3*TP_EV_batch_msg_interval))//one more time interval for tolerance
  698. {
  699. #ifdef SystemLogMessage
  700. StoreLogMsg("[EvComm]SlacComm: Wait CM_MNBC_SOUND_IND Timeout - 3*TP_EV_batch_msg_interval ");
  701. #endif
  702. V2gFlowStatus=Sequence_Timeout;
  703. return -1;
  704. }
  705. break;
  706. case CM_MNBC_SOUND_IND:
  707. ftime(&SeqEndTime);
  708. if(DiffTimeb(SeqStartTime, SeqEndTime)>TT_EVSE_match_MNBC)
  709. {
  710. memset(&SendMmePacket,0,sizeof(struct MmeHeader));
  711. memcpy(SendMmePacket.ODA,EvMac,6);
  712. memcpy(SendMmePacket.OSA,CsuMac,6);
  713. SendMmePacket.MTYPE=htons(EtherType_HomePlug);
  714. SendMmePacket.MMV=0x01;
  715. SendMmePacket.MMTYPE=MMTYPE_CM_ATTN_CHAR_IND;
  716. SendMmePacket.FMI[0]=SendMmePacket.FMI[1]=0;
  717. SendMmePacketSize=0;
  718. SendMmePacket.MMENTRY[SendMmePacketSize++]=0;//APPLICATION_TYPE, Fixed value indicating ¡§PEVEVSE matching¡¨
  719. SendMmePacket.MMENTRY[SendMmePacketSize++]=0;//SECURITY_TYPE, Fixed value indicating ¡§No Security¡¨
  720. memcpy(SendMmePacket.MMENTRY+SendMmePacketSize,EvMac,6);//SOURCE_ADDRESS, MAC address of the EV Host
  721. SendMmePacketSize+=6;
  722. memcpy(SendMmePacket.MMENTRY+SendMmePacketSize,SlacRunId,sizeof(SlacRunId));
  723. SendMmePacketSize+=sizeof(SlacRunId);
  724. memset(SendMmePacket.MMENTRY+SendMmePacketSize,0,17);//SOURCE_ID
  725. SendMmePacketSize+=17;
  726. memset(SendMmePacket.MMENTRY+SendMmePacketSize,0,17);//RESP_ID
  727. SendMmePacketSize+=17;
  728. SendMmePacket.MMENTRY[SendMmePacketSize++]=C_EV_match_MNBC;//NumSounds
  729. for(count=0;count<AagGroupsNum;count++)
  730. SendMmePacket.MMENTRY[SendMmePacketSize++]=(Aag[count]/C_EV_match_MNBC)&0xFF;
  731. SendMmePacketSize--;
  732. SendMmePacketSize+=19; //the size before MMENTRY
  733. V2gFlowStatus=CM_ATTEN_CHAR_IND;
  734. count=sendto(RawSock, &SendMmePacket, SendMmePacketSize, 0, (struct sockaddr*)&DestSocketAddress, sizeof(struct sockaddr_ll));
  735. ftime(&SeqStartTime);
  736. }
  737. break;
  738. case CM_ATTEN_CHAR_IND:
  739. ftime(&SeqEndTime);
  740. if(DiffTimeb(SeqStartTime, SeqEndTime)>TT_match_response)
  741. {
  742. #ifdef SystemLogMessage
  743. StoreLogMsg("[EvComm]SlacComm: Wait CM_ATTEN_CHAR_RSP Timeout - TT_match_response ");
  744. #endif
  745. V2gFlowStatus=Sequence_Timeout;
  746. return -1;
  747. }
  748. break;
  749. defaudlt:
  750. break;
  751. }
  752. return 0;
  753. }
  754. int V2gComm()
  755. {
  756. return 0;
  757. }
  758. int main(int argc,char *argv[])
  759. {
  760. //Initialization
  761. //InitShareMemory();
  762. CreatShareMemory();
  763. //Qca7kPowerReset();
  764. //PilotDetectionPid=0;
  765. //PilotDetection();
  766. GetEthMac("eth0",CsuMac);
  767. GetEthMac(QcaInterface, QcaMac);
  768. RecvBuffer=(unsigned char *)malloc(RecvBufferSize);
  769. memset(RecvBuffer,0,RecvBufferSize);
  770. SendBuffer=(unsigned char *)malloc(SendBufferSize);
  771. memset(SendBuffer,0,SendBufferSize);
  772. RawSock=-1;
  773. V2gFlowStatus=0;
  774. while(1)
  775. {
  776. SlacComm();
  777. continue;
  778. if((ShmInternalComm->ChargingPermission==0x01)&&(ConnectorPlugIn()==1))
  779. {
  780. if(V2gFlowStatus<=CM_AMP_MAP_CNF)
  781. SlacComm();
  782. else if(V2gFlowStatus<=Performance_Timeout)
  783. V2gComm();
  784. }
  785. if(V2gFlowStatus>=Performance_Timeout)
  786. {
  787. //Normal Stop
  788. //alarm and duty to 100%
  789. goto ReSet;
  790. }
  791. else if((ConnectorPlugIn()==0)&&(V2gFlowStatus>Idle))
  792. {
  793. //Emergency stop
  794. goto ReSet;
  795. }
  796. ReSet:
  797. RawSock=-1;
  798. V2gFlowStatus=0;
  799. while(1)
  800. {
  801. //wait for CSU configrm
  802. }
  803. }//main while
  804. }