EvComm.c 63 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668
  1. /*===========================================================================
  2. Combined Charging System (CCS): SECC
  3. EVComm.c
  4. initiated by Vern, Joseph
  5. (since 2019/07/19)
  6. =============================================================================*/
  7. #include <netinet/ip.h>
  8. #include <arpa/inet.h>
  9. #include <sys/types.h>
  10. #include <sys/stat.h>
  11. #include <fcntl.h>
  12. #include <linux/termios.h>
  13. #include <stdio.h>
  14. #include <string.h>
  15. #include <time.h>
  16. #include <stdlib.h>
  17. #include <sys/ipc.h>
  18. #include <sys/shm.h>
  19. #include <sys/mman.h>
  20. #include <linux/sockios.h>
  21. #include <linux/socket.h>
  22. #include <sys/socket.h>
  23. #include <netinet/in.h>
  24. #include <sys/time.h>
  25. #include <sys/timeb.h>
  26. #include <math.h>//for pow
  27. #include <unistd.h>
  28. #include <linux/if_packet.h>
  29. #include <netinet/if_ether.h>
  30. #include <net/if.h>
  31. #include <netinet/ether.h>
  32. #include "define.h"
  33. #include "EvComm.h"
  34. #include "NidNmk.h"
  35. #include "EvComm.h"
  36. #define Debug
  37. struct SysConfigAndInfo *ShmSysConfigAndInfo;
  38. struct StatusCodeData *ShmStatusCodeData;
  39. struct CcsData *ShmCcsData;
  40. struct InternalComm *ShmInternalComm;
  41. pid_t PilotDetectionPid;
  42. enum MsgFlowStatus V2gFlowStatus;
  43. int RawSock,UdpSock,TcpSock;
  44. unsigned char *RecvBuffer,*SendBuffer;
  45. int RecvBufferSize=64*1024;
  46. int SendBufferSize=64*1024;
  47. unsigned short Aag[64];
  48. struct MmeHeader SendMmePacket;
  49. int SendMmePacketSize;
  50. unsigned char CsuMac[6],QcaMac[6],EvMac[6],SlacRunId[8];
  51. struct sockaddr_ll DestSocketAddress;
  52. struct ifreq Req;
  53. unsigned int PwmStartTime;
  54. struct timeb SeqStartTime,SeqEndTime;
  55. unsigned char AagGroupsNum, MnbcSoundNum,AttenProfileNum;
  56. unsigned char NewNmkKey[16],Nid[7];
  57. #ifdef SystemLogMessage
  58. int StoreLogMsg(unsigned char *DataString)
  59. {
  60. unsigned char Buf[256];
  61. time_t CurrentTime;
  62. struct tm *tm;
  63. memset(Buf,0,sizeof(Buf));
  64. CurrentTime = time(NULL);
  65. tm=localtime(&CurrentTime);
  66. sprintf(Buf,"echo \"%04d.%02d.%02d %02d:%02d:%02d - %s\" >> /Storage/SystemLog/[%04d.%02d]SystemLog",
  67. tm->tm_year+1900,
  68. tm->tm_mon+1,
  69. tm->tm_mday,
  70. tm->tm_hour,
  71. tm->tm_min,
  72. tm->tm_sec,
  73. DataString,
  74. tm->tm_year+1900,
  75. tm->tm_mon+1
  76. );
  77. system(Buf);
  78. #ifdef Debug
  79. printf("%s \n",DataString);
  80. #endif
  81. }
  82. #endif
  83. int DiffTimeb(struct timeb ST, struct timeb ET)
  84. {
  85. //return milli-second
  86. unsigned int StartTime,StopTime;
  87. StartTime=(unsigned int)ST.time;
  88. StopTime=(unsigned int)ET.time;
  89. return (StopTime-StartTime)*1000+ET.millitm-ST.millitm;
  90. }
  91. int CreatShareMemory()
  92. {
  93. int MeterSMId;
  94. //creat ShmSysConfigAndInfo
  95. if ((MeterSMId = shmget(ShmSysConfigAndInfoKey, sizeof(struct SysConfigAndInfo), IPC_CREAT | 0777)) < 0)
  96. {
  97. #ifdef SystemLogMessage
  98. StoreLogMsg("[main]CreatShareMemory:shmget ShmSysConfigAndInfo NG");
  99. #endif
  100. return 0;
  101. }
  102. else if ((ShmSysConfigAndInfo = shmat(MeterSMId, NULL, 0)) == (void *) -1)
  103. {
  104. #ifdef SystemLogMessage
  105. StoreLogMsg("[main]CreatShareMemory:shmat ShmSysConfigAndInfo NG");
  106. #endif
  107. return 0;
  108. }
  109. memset(ShmSysConfigAndInfo,0,sizeof(struct SysConfigAndInfo));
  110. //creat ShmStatusCodeData
  111. if ((MeterSMId = shmget(ShmStatusCodeKey, sizeof(struct StatusCodeData), IPC_CREAT | 0777)) < 0)
  112. {
  113. #ifdef SystemLogMessage
  114. StoreLogMsg("[main]CreatShareMemory:shmget ShmStatusCodeData NG");
  115. #endif
  116. return 0;
  117. }
  118. else if ((ShmStatusCodeData = shmat(MeterSMId, NULL, 0)) == (void *) -1)
  119. {
  120. #ifdef SystemLogMessage
  121. StoreLogMsg("[main]CreatShareMemory:shmat ShmStatusCodeData NG");
  122. #endif
  123. return 0;
  124. }
  125. memset(ShmStatusCodeData,0,sizeof(struct StatusCodeData));
  126. //creat ShmCcsData
  127. if ((MeterSMId = shmget(ShmCcsCommKey, sizeof(struct CcsData), IPC_CREAT | 0777)) < 0)
  128. {
  129. #ifdef SystemLogMessage
  130. StoreLogMsg("[main]CreatShareMemory:shmget ShmCcsData NG");
  131. #endif
  132. return 0;
  133. }
  134. else if ((ShmCcsData = shmat(MeterSMId, NULL, 0)) == (void *) -1)
  135. {
  136. #ifdef SystemLogMessage
  137. StoreLogMsg("[main]CreatShareMemory:shmat ShmCcsData NG");
  138. #endif
  139. return 0;
  140. }
  141. memset(ShmCcsData,0,sizeof(struct CcsData));
  142. return 1;
  143. }
  144. int InitShareMemory()
  145. {
  146. int MeterSMId;
  147. //creat ShmSysConfigAndInfo
  148. if ((MeterSMId = shmget(ShmSysConfigAndInfoKey, sizeof(struct SysConfigAndInfo), 0777)) < 0)
  149. {
  150. #ifdef SystemLogMessage
  151. StoreLogMsg("[EvComm]InitShareMemory:shmget ShmSysConfigAndInfo NG");
  152. #endif
  153. return 0;
  154. }
  155. else if ((ShmSysConfigAndInfo = shmat(MeterSMId, NULL, 0)) == (void *) -1)
  156. {
  157. #ifdef SystemLogMessage
  158. StoreLogMsg("[EvComm]InitShareMemory:shmat ShmSysConfigAndInfo NG");
  159. #endif
  160. return 0;
  161. }
  162. //creat ShmStatusCodeData
  163. if ((MeterSMId = shmget(ShmStatusCodeKey, sizeof(struct StatusCodeData), 0777)) < 0)
  164. {
  165. #ifdef SystemLogMessage
  166. StoreLogMsg("[EvComm]InitShareMemory:shmget ShmStatusCodeData NG");
  167. #endif
  168. return 0;
  169. }
  170. else if ((ShmStatusCodeData = shmat(MeterSMId, NULL, 0)) == (void *) -1)
  171. {
  172. #ifdef SystemLogMessage
  173. StoreLogMsg("[EvComm]InitShareMemory:shmat ShmStatusCodeData NG");
  174. #endif
  175. return 0;
  176. }
  177. //creat ShmCcsData
  178. if ((MeterSMId = shmget(ShmCcsCommKey, sizeof(struct CcsData), 0777)) < 0)
  179. {
  180. #ifdef SystemLogMessage
  181. StoreLogMsg("[EvComm]InitShareMemory:shmget ShmCcsData NG");
  182. #endif
  183. return 0;
  184. }
  185. else if ((ShmCcsData = shmat(MeterSMId, NULL, 0)) == (void *) -1)
  186. {
  187. #ifdef SystemLogMessage
  188. StoreLogMsg("[EvComm]InitShareMemory:shmat ShmCcsData NG");
  189. #endif
  190. return 0;
  191. }
  192. //creat ShmInternalComm
  193. if ((MeterSMId = shmget(ShmInternalCommKey, sizeof(struct InternalComm), 0777)) < 0)
  194. {
  195. #ifdef SystemLogMessage
  196. StoreLogMsg("[EvComm]InitShareMemory:shmget ShmInternalComm NG");
  197. #endif
  198. return 0;
  199. }
  200. else if ((ShmInternalComm = shmat(MeterSMId, NULL, 0)) == (void *) -1)
  201. {
  202. #ifdef SystemLogMessage
  203. StoreLogMsg("[EvComm]InitShareMemory:shmat ShmInternalComm NG");
  204. #endif
  205. return 0;
  206. }
  207. return 1;
  208. }
  209. int GetEthMac(unsigned char *Eth, unsigned char *mac)
  210. {
  211. //Parameters:MAC,IP,Mask,Gateway
  212. int fd,rd=0;
  213. unsigned char addr[18], Buffer[128];
  214. memset(Buffer,0,sizeof(Buffer));
  215. sprintf(Buffer,"cat /sys/class/net/%s/address > /mnt/GetEthInfo",Eth);
  216. system(Buffer);
  217. fd = open("/mnt/GetEthInfo", O_RDONLY);
  218. if(fd<0)
  219. {
  220. system("rm -f /mnt/GetEthInfo");
  221. #ifdef SystemLogMessage
  222. StoreLogMsg("[EvComm]GetEthMac: MAC Address open error");
  223. #endif
  224. return 0;
  225. }
  226. memset(mac,0,6);
  227. memset(addr,0,sizeof(addr));
  228. rd=read(fd,addr,17);
  229. close(fd);
  230. system("rm -f /mnt/GetEthInfo");
  231. sscanf(addr, "%02x:%02x:%02x:%02x:%02x:%02x", &mac[0], &mac[1], &mac[2], &mac[3], &mac[4], &mac[5]);
  232. return 1;
  233. }
  234. float ReadAdcVolt(unsigned char AdcChannel)
  235. {
  236. //AIN0=CCS GUN Temp 1
  237. //AIN1=CCS GUN Temp 2
  238. //AIN2=CCS_Proximity/2
  239. //AIN3=pilot voltage
  240. FILE *fp;
  241. unsigned char str[64];
  242. unsigned char AdcValue[8];
  243. if(AdcChannel>7)
  244. return -1;
  245. memset(str,0,sizeof(str));
  246. memset(AdcValue,0,sizeof(AdcValue));
  247. sprintf(str,"cat /sys/bus/iio/devices/iio\\:device0/in_voltage%d_raw",AdcChannel);
  248. fp=popen(str, "r");
  249. if(fgets(AdcValue,sizeof(AdcValue),fp)==NULL)
  250. {
  251. pclose(fp);
  252. return -1;
  253. }
  254. pclose(fp);
  255. //Vin = Vref *D / (2^n - 1)
  256. return ((float)1.8*(float)atoi(AdcValue))/4095;
  257. }
  258. void Qca7kPowerReset()
  259. {
  260. system("echo 1 > /sys/class/gpio/gpio88/value");
  261. usleep(500000);
  262. system("echo 0 > /sys/class/gpio/gpio88/value");
  263. }
  264. void SwitchCpStateE(unsigned char OnOff)
  265. {
  266. //OnOff=1 => switch State to E
  267. //OnOff=0 => return noraml
  268. if(OnOff==0)
  269. system("echo 0 > /sys/class/gpio/gpio86/value");
  270. else
  271. system("echo 1 > /sys/class/gpio/gpio86/value");
  272. }
  273. int OutputCpPwmDuty(unsigned char Duty)
  274. {
  275. unsigned char str[128];
  276. int DutyInNanoSec;
  277. if((Duty<0)||(Duty>100))
  278. return -1;
  279. memset(str,0,sizeof(str));
  280. DutyInNanoSec=10000*Duty;
  281. sprintf(str,"echo %d > /sys/class/pwm/pwmchip0/pwm0/duty_cycle",DutyInNanoSec);//nanoseconds
  282. system(str);
  283. ShmSysConfigAndInfo->SysInfo.CcsChargingData[0].PilotDuty=Duty;
  284. return 0;
  285. }
  286. int ConnectorPlugIn()
  287. {
  288. //return 0 => unplug
  289. //return 1 => plug-in
  290. float TmpProximity;
  291. unsigned char Rtn=0;
  292. if(((FirmwareVersion&0x0000FF00)>>8)==0x01)
  293. {
  294. //UL version: judge with CP and proximity
  295. TmpProximity=ReadAdcVolt(2);
  296. if((ShmSysConfigAndInfo->SysInfo.CcsChargingData[0].PilotState>=2)&&(ShmSysConfigAndInfo->SysInfo.CcsChargingData[0].PilotState<=5)&&
  297. (TmpProximity>=0.4)&&(TmpProximity<=0.9))
  298. {
  299. Rtn=1;
  300. }
  301. }
  302. else
  303. {
  304. //CE version: judge with CP only
  305. if((ShmSysConfigAndInfo->SysInfo.CcsChargingData[0].PilotState>=2)&&(ShmSysConfigAndInfo->SysInfo.CcsChargingData[0].PilotState<=5))
  306. Rtn=1;
  307. }
  308. ShmSysConfigAndInfo->SysInfo.CcsChargingData[0].ConnectorPlugIn=Rtn;
  309. return Rtn;
  310. }
  311. void PilotDetection()
  312. {
  313. pid_t tmp=0;
  314. struct timeb StartTime,EndTime;
  315. unsigned char CpState[3],count;
  316. float TmpVolt;
  317. if(PilotDetectionPid==0)
  318. {
  319. tmp=fork();
  320. if(tmp>0)
  321. {
  322. PilotDetectionPid=tmp;
  323. {
  324. unsigned char buf[64];
  325. memset(buf,0,sizeof(buf));
  326. sprintf(buf,"renice -20 -p %d",tmp);
  327. system(buf);
  328. }
  329. return;
  330. }
  331. }
  332. while(1)
  333. {
  334. //ADC_Voltage = (1+RE62/RE63)*0.9 - (RE62/RE63)*Pilot_Voltage, RE62/RE63=0.06
  335. //=>Pilot_Voltage=(0.954-ADC_Voltage)/0.06
  336. //ftime(&StartTime);
  337. TmpVolt=0;
  338. for(count=0; count<3; count++)
  339. {
  340. TmpVolt+=(0.954-ReadAdcVolt(3))/0.06;
  341. }
  342. TmpVolt/=3;
  343. ShmSysConfigAndInfo->SysInfo.CcsChargingData[0].PilotVoltage=TmpVolt;
  344. if(TmpVolt>=13.5)
  345. {
  346. //Pilot Error
  347. if((ShmSysConfigAndInfo->SysInfo.CcsChargingData[0].PilotState==1)&&(TmpVolt<13.75))
  348. ShmSysConfigAndInfo->SysInfo.CcsChargingData[0].PilotState=1;
  349. else
  350. ShmSysConfigAndInfo->SysInfo.CcsChargingData[0].PilotState=8;
  351. }
  352. else if((TmpVolt>=10.5)&&(TmpVolt<13.5))
  353. {
  354. //State A
  355. if((ShmSysConfigAndInfo->SysInfo.CcsChargingData[0].PilotState>=2)&&(ShmSysConfigAndInfo->SysInfo.CcsChargingData[0].PilotState<=3)&&(TmpVolt<10.75))
  356. {
  357. if((ShmSysConfigAndInfo->SysInfo.CcsChargingData[0].PilotDuty>=5)&&(ShmSysConfigAndInfo->SysInfo.CcsChargingData[0].PilotDuty<100))
  358. ShmSysConfigAndInfo->SysInfo.CcsChargingData[0].PilotState=3;
  359. else
  360. ShmSysConfigAndInfo->SysInfo.CcsChargingData[0].PilotState=2;
  361. }
  362. else if((ShmSysConfigAndInfo->SysInfo.CcsChargingData[0].PilotState==8)&&(TmpVolt>=13.25))
  363. ShmSysConfigAndInfo->SysInfo.CcsChargingData[0].PilotState=8;
  364. else
  365. ShmSysConfigAndInfo->SysInfo.CcsChargingData[0].PilotState=1;
  366. }
  367. else if((TmpVolt>=7.5)&&(TmpVolt<10.5))
  368. {
  369. //State B
  370. if((ShmSysConfigAndInfo->SysInfo.CcsChargingData[0].PilotState==4)&&(TmpVolt<7.75))
  371. ShmSysConfigAndInfo->SysInfo.CcsChargingData[0].PilotState=4;
  372. else if((ShmSysConfigAndInfo->SysInfo.CcsChargingData[0].PilotState==1)&&(TmpVolt>=10.25))
  373. ShmSysConfigAndInfo->SysInfo.CcsChargingData[0].PilotState=1;
  374. else
  375. {
  376. if((ShmSysConfigAndInfo->SysInfo.CcsChargingData[0].PilotDuty>=5)&&(ShmSysConfigAndInfo->SysInfo.CcsChargingData[0].PilotDuty<100))
  377. ShmSysConfigAndInfo->SysInfo.CcsChargingData[0].PilotState=3;
  378. else
  379. ShmSysConfigAndInfo->SysInfo.CcsChargingData[0].PilotState=2;
  380. }
  381. }
  382. else if((TmpVolt>=4.5)&&(TmpVolt<7.5))
  383. {
  384. //State C
  385. if((ShmSysConfigAndInfo->SysInfo.CcsChargingData[0].PilotState==5)&&(TmpVolt<4.75))
  386. ShmSysConfigAndInfo->SysInfo.CcsChargingData[0].PilotState=5;
  387. else if((ShmSysConfigAndInfo->SysInfo.CcsChargingData[0].PilotState>=2)&&(ShmSysConfigAndInfo->SysInfo.CcsChargingData[0].PilotState<=3)&&(TmpVolt>=7.25))
  388. {
  389. if((ShmSysConfigAndInfo->SysInfo.CcsChargingData[0].PilotDuty>=5)&&(ShmSysConfigAndInfo->SysInfo.CcsChargingData[0].PilotDuty<100))
  390. ShmSysConfigAndInfo->SysInfo.CcsChargingData[0].PilotState=3;
  391. else
  392. ShmSysConfigAndInfo->SysInfo.CcsChargingData[0].PilotState=2;
  393. }
  394. else
  395. {
  396. ShmSysConfigAndInfo->SysInfo.CcsChargingData[0].PilotState=4;
  397. }
  398. }
  399. else if((TmpVolt>=1.5)&&(TmpVolt<4.5))
  400. {
  401. //State D
  402. if((ShmSysConfigAndInfo->SysInfo.CcsChargingData[0].PilotState==6)&&(TmpVolt<1.75))
  403. ShmSysConfigAndInfo->SysInfo.CcsChargingData[0].PilotState=6;
  404. else if((ShmSysConfigAndInfo->SysInfo.CcsChargingData[0].PilotState==4)&&(TmpVolt>=4.25))
  405. ShmSysConfigAndInfo->SysInfo.CcsChargingData[0].PilotState=4;
  406. else
  407. {
  408. ShmSysConfigAndInfo->SysInfo.CcsChargingData[0].PilotState=5;
  409. }
  410. }
  411. else if((TmpVolt>= -1.5)&&(TmpVolt<1.5))
  412. {
  413. //State E
  414. if((ShmSysConfigAndInfo->SysInfo.CcsChargingData[0].PilotState==8)&&(TmpVolt< -1.25))
  415. ShmSysConfigAndInfo->SysInfo.CcsChargingData[0].PilotState=8;
  416. else if((ShmSysConfigAndInfo->SysInfo.CcsChargingData[0].PilotState==5)&&(TmpVolt>=1.25))
  417. ShmSysConfigAndInfo->SysInfo.CcsChargingData[0].PilotState=5;
  418. else
  419. {
  420. ShmSysConfigAndInfo->SysInfo.CcsChargingData[0].PilotState=6;
  421. }
  422. }
  423. else if((TmpVolt>= -13.5)&&(TmpVolt< -10.5))
  424. {
  425. //State F
  426. if((ShmSysConfigAndInfo->SysInfo.CcsChargingData[0].PilotState==8)&&(TmpVolt>= -10.75))
  427. ShmSysConfigAndInfo->SysInfo.CcsChargingData[0].PilotState=8;
  428. else
  429. {
  430. ShmSysConfigAndInfo->SysInfo.CcsChargingData[0].PilotState=7;
  431. }
  432. }
  433. //ftime(&EndTime);
  434. //printf("duration:%d\n", DiffTimeb(StartTime, EndTime));
  435. }//while
  436. }
  437. int MmeProcess(unsigned char *Buffer, int DataLength)
  438. {
  439. //struct ethhdr *EthPacket;
  440. struct MmeHeader *MmePacket;
  441. int Rtn;
  442. static unsigned char counter;
  443. MmePacket = (struct MmeHeader *)Buffer;
  444. #ifdef Debug
  445. printf("\n\n***********************************\n");
  446. printf("***** Received MME Packet *****\n");
  447. printf("***********************************\n");
  448. printf("DataLength=%d\n",DataLength);
  449. printf("ODA: %02x:%02x:%02x:%02x:%02x:%02x\n",
  450. MmePacket->ODA[0],MmePacket->ODA[1],MmePacket->ODA[2],MmePacket->ODA[3],MmePacket->ODA[4],MmePacket->ODA[5]);
  451. printf("OSA: %02x:%02x:%02x:%02x:%02x:%02x\n",
  452. MmePacket->OSA[0],MmePacket->OSA[1],MmePacket->OSA[2],MmePacket->OSA[3],MmePacket->OSA[4],MmePacket->OSA[5]);
  453. printf("MTYPE: 0x%x\n", htons(MmePacket->MTYPE));
  454. printf("MMV: 0x%x\n", MmePacket->MMV);
  455. printf("MMTYPE: 0x%x\n", MmePacket->MMTYPE);
  456. printf("FMI 0x%x, 0x%x\n", MmePacket->FMI[0],MmePacket->FMI[1]);
  457. #endif
  458. //check if the destination address is broadcast or EVSE itself, it can be ignore if not belong to itself.
  459. switch(MmePacket->MMTYPE)
  460. {
  461. case MMTYPE_CM_SET_KEY_CNF:
  462. {
  463. #ifdef Debug
  464. printf("--- MMTYPE_CM_SET_KEY_CNF ---\n");
  465. printf("Result: 0x%x\n", MmePacket->MMENTRY[0]);
  466. #endif
  467. V2gFlowStatus=CM_SET_KEY_CNF;
  468. break;
  469. }
  470. case MMTYPE_CM_SLAC_PARM_REQ:
  471. {
  472. #ifdef Debug
  473. printf("--- MMTYPE_CM_SLAC_PARM_REQ ---\n");
  474. printf("APPLICATION_TYPE: 0x%x\n", MmePacket->MMENTRY[0]);
  475. printf("SECURITY_TYPE: 0x%x\n", MmePacket->MMENTRY[1]);
  476. printf("RunID: %02x,%02x,%02x,%02x,%02x,%02x,%02x,%02x\n",
  477. MmePacket->MMENTRY[2],MmePacket->MMENTRY[3],MmePacket->MMENTRY[4],MmePacket->MMENTRY[5],MmePacket->MMENTRY[6],
  478. MmePacket->MMENTRY[7],MmePacket->MMENTRY[8],MmePacket->MMENTRY[9]);
  479. printf("CipherSuiteSetSize: 0x%x\n", MmePacket->MMENTRY[10]);
  480. printf("CipherSuite [1]: 0x%x,0x%x\n", MmePacket->MMENTRY[11], MmePacket->MMENTRY[12]);
  481. #endif
  482. V2gFlowStatus=CM_SLAC_PARM_REQ;
  483. memcpy(EvMac,MmePacket->OSA,sizeof(EvMac));
  484. memcpy(DestSocketAddress.sll_addr,MmePacket->OSA,sizeof(EvMac));
  485. memcpy(SlacRunId,MmePacket->MMENTRY+2,sizeof(SlacRunId));
  486. memset(&SendMmePacket,0,sizeof(struct MmeHeader));
  487. memcpy(SendMmePacket.ODA,MmePacket->OSA,6);
  488. memcpy(SendMmePacket.OSA,CsuMac,6);
  489. SendMmePacket.MTYPE=htons(EtherType_HomePlug);
  490. SendMmePacket.MMV=MmePacket->MMV;
  491. SendMmePacket.MMTYPE=MMTYPE_CM_SLAC_PARM_CNF;
  492. SendMmePacket.FMI[0]=SendMmePacket.FMI[1]=0;
  493. SendMmePacketSize=0;
  494. memset(SendMmePacket.MMENTRY,0xFF,6); //Fixed value indicating that M-Sounds to be sent as Ethernet broadcast
  495. SendMmePacketSize+=6;
  496. SendMmePacket.MMENTRY[SendMmePacketSize++]=C_EV_match_MNBC;
  497. SendMmePacket.MMENTRY[SendMmePacketSize++]=TT_EVSE_match_MNBC;
  498. 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
  499. memcpy(SendMmePacket.MMENTRY+SendMmePacketSize,EvMac,6);
  500. SendMmePacketSize+=6;
  501. SendMmePacket.MMENTRY[SendMmePacketSize++]=0; //Fixed value indicating ��PEVEVSEMatching��
  502. SendMmePacket.MMENTRY[SendMmePacketSize++]=0; //Fixed value indicating ��No Security��
  503. memcpy(SendMmePacket.MMENTRY+SendMmePacketSize,SlacRunId,sizeof(SlacRunId));
  504. SendMmePacketSize+=sizeof(SlacRunId);
  505. SendMmePacketSize+=19; //the size before MMENTRY
  506. #ifdef Debug
  507. printf("\n\n***** Response MME Packet *****\n");
  508. printf("SendMmePacket.ODA: %02x:%02x:%02x:%02x:%02x:%02x:\n",
  509. SendMmePacket.ODA[0],SendMmePacket.ODA[1],SendMmePacket.ODA[2],SendMmePacket.ODA[3],SendMmePacket.ODA[4],SendMmePacket.ODA[5]);
  510. printf("SendMmePacket.OSA: %02x:%02x:%02x:%02x:%02x:%02x:\n",
  511. SendMmePacket.OSA[0],SendMmePacket.OSA[1],SendMmePacket.OSA[2],SendMmePacket.OSA[3],SendMmePacket.OSA[4],SendMmePacket.OSA[5]);
  512. printf("MTYPE: 0x%x\n", htons(SendMmePacket.MTYPE));
  513. printf("MMV: 0x%x\n", SendMmePacket.MMV);
  514. printf("MMTYPE: 0x%x\n", SendMmePacket.MMTYPE);
  515. printf("FMI 0x%x, 0x%x\n", SendMmePacket.FMI[0],SendMmePacket.FMI[1]);
  516. printf("--- CM_SLAC_PARM_CNF ---\n");
  517. printf("M-SOUND_TARGET: %02x:%02x:%02x:%02x:%02x:%02x\n",
  518. SendMmePacket.MMENTRY[0],SendMmePacket.MMENTRY[1],SendMmePacket.MMENTRY[2],SendMmePacket.MMENTRY[3],
  519. SendMmePacket.MMENTRY[4],SendMmePacket.MMENTRY[5]);
  520. printf("NUM_SOUNDS: 0x%x\n", SendMmePacket.MMENTRY[6]);
  521. printf("Time_Out: 0x%x\n", SendMmePacket.MMENTRY[7]);
  522. printf("RESP_TYPE: 0x%x\n", SendMmePacket.MMENTRY[8]);
  523. printf("M-FORWARDING_STA: %02x:%02x:%02x:%02x:%02x:%02x:\n",
  524. SendMmePacket.MMENTRY[9],SendMmePacket.MMENTRY[10],SendMmePacket.MMENTRY[11],SendMmePacket.MMENTRY[12],
  525. SendMmePacket.MMENTRY[13],SendMmePacket.MMENTRY[14]);
  526. printf("APPLICATION_TYPE: 0x%x\n", SendMmePacket.MMENTRY[15]);
  527. printf("SECURITY_TYPE: 0x%x\n", SendMmePacket.MMENTRY[16]);
  528. printf("RunID: %02x,%02x,%02x,%02x,%02x,%02x,%02x,%02x\n",
  529. SendMmePacket.MMENTRY[17],SendMmePacket.MMENTRY[18],SendMmePacket.MMENTRY[19],SendMmePacket.MMENTRY[20],
  530. SendMmePacket.MMENTRY[21],SendMmePacket.MMENTRY[22],SendMmePacket.MMENTRY[23],SendMmePacket.MMENTRY[24]);
  531. #endif
  532. V2gFlowStatus=CM_SLAC_PARM_CONF;
  533. Rtn=sendto(RawSock, &SendMmePacket, SendMmePacketSize, 0, (struct sockaddr*)&DestSocketAddress, sizeof(struct sockaddr_ll));
  534. #ifdef Debug
  535. printf("SendMmePacketSize=%d,Rtn=%d\n",SendMmePacketSize,Rtn);
  536. #endif
  537. ftime(&SeqStartTime);
  538. counter=0;
  539. break;
  540. }
  541. case MMTYPE_CM_START_ATTEN_CHAR_IND:
  542. {
  543. #ifdef Debug
  544. printf("--- MMTYPE_CM_START_ATTEN_CHAR_IND (counter : %d/3 ) ---\n",counter+1);
  545. printf("APPLICATION_TYPE: 0x%x\n", MmePacket->MMENTRY[0]);
  546. printf("SECURITY_TYPE: 0x%x\n", MmePacket->MMENTRY[1]);
  547. printf("NUM_SOUNDS: 0x%x\n", MmePacket->MMENTRY[2]);
  548. printf("Time_Out 0x%x\n", MmePacket->MMENTRY[3]);
  549. printf("RESP_TYPE 0x%x\n", MmePacket->MMENTRY[4]); //Fixed value (0x01) indicating ��other Green PHY station��
  550. printf("FORWARDING_STA: %02x:%02x:%02x:%02x:%02x:%02x\n",
  551. MmePacket->MMENTRY[5],MmePacket->MMENTRY[6],MmePacket->MMENTRY[7],MmePacket->MMENTRY[8],
  552. MmePacket->MMENTRY[9],MmePacket->MMENTRY[10]);
  553. printf("RunID: %02x,%02x,%02x,%02x,%02x,%02x,%02x,%02x\n",
  554. MmePacket->MMENTRY[11],MmePacket->MMENTRY[12],MmePacket->MMENTRY[13],MmePacket->MMENTRY[14],
  555. MmePacket->MMENTRY[15],MmePacket->MMENTRY[16],MmePacket->MMENTRY[17],MmePacket->MMENTRY[18]);
  556. #endif
  557. MnbcSoundNum=MmePacket->MMENTRY[2];
  558. V2gFlowStatus=CM_START_ATTEN_CHAR_IND;
  559. counter++;
  560. if(counter==1)
  561. {
  562. memset(Aag,0,sizeof(Aag));
  563. AttenProfileNum=0;
  564. ftime(&SeqStartTime); //start TT_EVSE_match_MNBC
  565. }
  566. else if(counter>=3)
  567. {
  568. counter=0;
  569. }
  570. break;
  571. }
  572. case MMTYPE_CM_MNBC_SOUND_IND:
  573. {
  574. if(V2gFlowStatus>=CM_ATTEN_CHAR_IND)
  575. break;
  576. #ifdef Debug
  577. printf("--- MMTYPE_CM_MNBC_SOUND_IND (counter : %d/%d) ---\n",counter+1,MnbcSoundNum);
  578. printf("APPLICATION_TYPE: 0x%x\n", MmePacket->MMENTRY[0]);
  579. printf("SECURITY_TYPE: 0x%x\n", MmePacket->MMENTRY[1]);
  580. printf("SenderID: %02x,%02x,%02x,%02x,%02x,%02x,%02x,%02x,%02x,%02x,%02x,%02x,%02x,%02x,%02x,%02x,%02x\n",
  581. MmePacket->MMENTRY[2],MmePacket->MMENTRY[3],MmePacket->MMENTRY[4],MmePacket->MMENTRY[5],
  582. MmePacket->MMENTRY[6],MmePacket->MMENTRY[7],MmePacket->MMENTRY[8],MmePacket->MMENTRY[9],
  583. MmePacket->MMENTRY[10],MmePacket->MMENTRY[11],MmePacket->MMENTRY[12],MmePacket->MMENTRY[13],
  584. MmePacket->MMENTRY[14],MmePacket->MMENTRY[15],MmePacket->MMENTRY[16],MmePacket->MMENTRY[17],
  585. MmePacket->MMENTRY[18]);
  586. printf("Cnt: 0x%x\n", MmePacket->MMENTRY[19]);
  587. printf("RunID: %02x,%02x,%02x,%02x,%02x,%02x,%02x,%02x\n",
  588. MmePacket->MMENTRY[20],MmePacket->MMENTRY[21],MmePacket->MMENTRY[22],MmePacket->MMENTRY[23],
  589. MmePacket->MMENTRY[24],MmePacket->MMENTRY[25],MmePacket->MMENTRY[26],MmePacket->MMENTRY[27]);
  590. printf("RSVD: %02x,%02x,%02x,%02x,%02x,%02x,%02x,%02x\n",
  591. MmePacket->MMENTRY[28],MmePacket->MMENTRY[29],MmePacket->MMENTRY[30],MmePacket->MMENTRY[31],
  592. MmePacket->MMENTRY[32],MmePacket->MMENTRY[33],MmePacket->MMENTRY[34],MmePacket->MMENTRY[35]);
  593. printf("Rnd: %02x,%02x,%02x,%02x,%02x,%02x,%02x,%02x,%02x,%02x,%02x,%02x,%02x,%02x,%02x,%02x,%02x\n",
  594. MmePacket->MMENTRY[36],MmePacket->MMENTRY[37],MmePacket->MMENTRY[38],MmePacket->MMENTRY[39],
  595. MmePacket->MMENTRY[40],MmePacket->MMENTRY[41],MmePacket->MMENTRY[42],MmePacket->MMENTRY[43],
  596. MmePacket->MMENTRY[44],MmePacket->MMENTRY[45],MmePacket->MMENTRY[46],MmePacket->MMENTRY[47],
  597. MmePacket->MMENTRY[48],MmePacket->MMENTRY[49],MmePacket->MMENTRY[50],MmePacket->MMENTRY[51]);
  598. #endif
  599. V2gFlowStatus=CM_MNBC_SOUND_IND;
  600. counter++;
  601. break;
  602. }
  603. case MMTYPE_CM_ATTEN_PROFILE_IND:
  604. {
  605. if(V2gFlowStatus>=CM_ATTEN_CHAR_IND)
  606. {
  607. break;
  608. }
  609. #ifdef Debug
  610. printf("--- MMTYPE_CM_ATTEN_PROFILE_IND (counter : %d/%d) ---\n",counter,MnbcSoundNum);
  611. printf("EV MAC: %02x:%02x:%02x:%02x:%02x:%02x\n",
  612. MmePacket->MMENTRY[0],MmePacket->MMENTRY[1],MmePacket->MMENTRY[2],MmePacket->MMENTRY[3],
  613. MmePacket->MMENTRY[4],MmePacket->MMENTRY[5]);
  614. printf("NumGroups: 0x%x\n", MmePacket->MMENTRY[6]);
  615. printf("RSVD: 0x%x\n", MmePacket->MMENTRY[7]);
  616. printf("AAG: \n");
  617. for(Rtn=0; Rtn<MmePacket->MMENTRY[6]; Rtn++)
  618. printf("%02x, ",MmePacket->MMENTRY[8+Rtn]);
  619. printf("\n");
  620. #endif
  621. AagGroupsNum=MmePacket->MMENTRY[6];
  622. for(Rtn=0; Rtn<MmePacket->MMENTRY[6]; Rtn++)
  623. Aag[Rtn]+=MmePacket->MMENTRY[8+Rtn];
  624. AttenProfileNum++;
  625. V2gFlowStatus=CM_MNBC_SOUND_IND;
  626. break;
  627. }
  628. case MMTYPE_CM_ATTN_CHAR_RSP:
  629. {
  630. #ifdef Debug
  631. printf("--- MMTYPE_CM_ATTN_CHAR_RSP ---\n");
  632. printf("APPLICATION_TYPE: 0x%x\n", MmePacket->MMENTRY[0]);
  633. printf("SECURITY_TYPE: 0x%x\n", MmePacket->MMENTRY[1]);
  634. printf("SOURCE_ADDRESS: %02x:%02x:%02x:%02x:%02x:%02x\n",
  635. MmePacket->MMENTRY[2],MmePacket->MMENTRY[3],MmePacket->MMENTRY[4],MmePacket->MMENTRY[5],
  636. MmePacket->MMENTRY[6],MmePacket->MMENTRY[7]);
  637. printf("RunID: %02x,%02x,%02x,%02x,%02x,%02x,%02x,%02x\n",
  638. MmePacket->MMENTRY[8],MmePacket->MMENTRY[9],MmePacket->MMENTRY[10],MmePacket->MMENTRY[11],
  639. MmePacket->MMENTRY[12],MmePacket->MMENTRY[13],MmePacket->MMENTRY[14],MmePacket->MMENTRY[15]);
  640. printf("SOURCE_ID: \n");
  641. for(Rtn=0; Rtn<17; Rtn++)
  642. printf("%02x, ",MmePacket->MMENTRY[16+Rtn]);
  643. printf("\n");
  644. printf("RESP_ID: \n");
  645. for(Rtn=0; Rtn<17; Rtn++)
  646. printf("%02x, ",MmePacket->MMENTRY[33+Rtn]);
  647. printf("\n");
  648. printf("Result: 0x%x\n", MmePacket->MMENTRY[50]); //Fixed value of 0x00 indicates a successful SLAC process
  649. #endif
  650. V2gFlowStatus=CM_ATTEN_CHAR_RSP;
  651. ftime(&SeqStartTime);
  652. break;
  653. }
  654. case MMTYPE_CM_VALIDATE_REQ:
  655. {
  656. #ifdef Debug
  657. printf("--- MMTYPE_CM_VALIDATE_REQ ---\n");
  658. printf("Signal Type: 0x%x\n", MmePacket->MMENTRY[0]); //Fixed value (0x00) to indicate ��PEV S2 toggles on control pilot line��
  659. printf("Timer: 0x%x\n", MmePacket->MMENTRY[1]); //Fixed value In the first VALIDATE Request-Response exchange, the Timer field shall be set to zero.
  660. printf("Result: 0x%x\n", MmePacket->MMENTRY[2]); //Fixed value In the first VALIDATE Request-Response exchange, the Result field shall be set to 0x01 = ��ready��.
  661. #endif
  662. counter=0;
  663. for(Rtn=0; Rtn<6; Rtn++)
  664. {
  665. if(MmePacket->ODA[Rtn]!=CsuMac[Rtn])
  666. {
  667. counter=1;
  668. break;
  669. }
  670. }
  671. memset(&SendMmePacket,0,sizeof(struct MmeHeader));
  672. memcpy(SendMmePacket.ODA,EvMac,6);
  673. memcpy(SendMmePacket.OSA,CsuMac,6);
  674. SendMmePacket.MTYPE=htons(EtherType_HomePlug);
  675. SendMmePacket.MMV=0x01;
  676. SendMmePacket.MMTYPE=MMTYPE_CM_VALIDATE_CNF;
  677. SendMmePacket.FMI[0]=SendMmePacket.FMI[1]=0;
  678. SendMmePacketSize=0;
  679. if(counter==0)
  680. {
  681. //First MMTYPE_CM_VALIDATE_REQ because Unicast
  682. SendMmePacket.MMENTRY[SendMmePacketSize++]=0; //Fixed value to indicate ��PEV S2 toggles on control pilot line��
  683. SendMmePacket.MMENTRY[SendMmePacketSize++]=0; //Fixed value In the first VALIDATE Request-Response exchange, the ToggleNum field shall be set to zero.
  684. #ifdef SupportBcbToggle
  685. SendMmePacket.MMENTRY[SendMmePacketSize++]=1; //0x01 = Ready
  686. #else
  687. SendMmePacket.MMENTRY[SendMmePacketSize++]=4; //0x04 = Not Required
  688. #endif
  689. }
  690. else
  691. {
  692. //second MMTYPE_CM_VALIDATE_REQ because Broadcast
  693. unsigned char PreStatus=3,ToggleNum=0;
  694. ftime(&SeqStartTime);
  695. while(1)
  696. {
  697. ftime(&SeqEndTime);
  698. if((ShmSysConfigAndInfo->SysInfo.CcsChargingData[0].PilotState==4)&&(PreStatus==3))
  699. {
  700. ToggleNum++;
  701. PreStatus=4;
  702. }
  703. else
  704. {
  705. PreStatus=3;
  706. }
  707. if(DiffTimeb(SeqStartTime, SeqEndTime)>=(SendMmePacket.MMENTRY[1]*100+100))
  708. {
  709. SendMmePacket.MMENTRY[SendMmePacketSize++]=0; //Fixed value to indicate ��PEV S2 toggles on control pilot line��
  710. SendMmePacket.MMENTRY[SendMmePacketSize++]= ToggleNum;
  711. #ifdef SupportBcbToggle
  712. SendMmePacket.MMENTRY[SendMmePacketSize++]=2; //0x02 = Success
  713. #else
  714. SendMmePacket.MMENTRY[SendMmePacketSize++]=4; //0x04 = Not Required
  715. #endif
  716. break;
  717. }
  718. }
  719. }
  720. SendMmePacketSize+=19; //the size before MMENTRY
  721. sendto(RawSock, &SendMmePacket, SendMmePacketSize, 0, (struct sockaddr*)&DestSocketAddress, sizeof(struct sockaddr_ll));
  722. V2gFlowStatus=CM_VALIDATE_CNF;
  723. ftime(&SeqStartTime);
  724. break;
  725. }
  726. case MMTYPE_CM_SLAC_MATCH_REQ:
  727. {
  728. #ifdef Debug
  729. printf("--- MMTYPE_CM_SLAC_MATCH_REQ ---\n");
  730. printf("APPLICATION_TYPE: 0x%x\n", MmePacket->MMENTRY[0]);
  731. printf("SECURITY_TYPE: 0x%x\n", MmePacket->MMENTRY[1]);
  732. printf("MVFLength: 0x%x, 0x%x\n", MmePacket->MMENTRY[2],MmePacket->MMENTRY[3]); //Fixed value (0x3E) for matching
  733. printf("PEV ID: \n");
  734. for(Rtn=0; Rtn<17; Rtn++)
  735. printf("%02x, ",MmePacket->MMENTRY[4+Rtn]);
  736. printf("\n");
  737. printf("PEV MAC: \n");
  738. for(Rtn=0; Rtn<6; Rtn++)
  739. printf("%02x, ",MmePacket->MMENTRY[21+Rtn]);
  740. printf("\n");
  741. printf("EVSE ID: \n");
  742. for(Rtn=0; Rtn<17; Rtn++)
  743. printf("%02x, ",MmePacket->MMENTRY[27+Rtn]);
  744. printf("\n");
  745. printf("EVSE MAC: \n");
  746. for(Rtn=0; Rtn<6; Rtn++)
  747. printf("%02x, ",MmePacket->MMENTRY[44+Rtn]);
  748. printf("\n");
  749. printf("RunID: \n");
  750. for(Rtn=0; Rtn<8; Rtn++)
  751. printf("%02x, ",MmePacket->MMENTRY[50+Rtn]);
  752. printf("\n");
  753. printf("RSVD: \n");
  754. for(Rtn=0; Rtn<8; Rtn++)
  755. printf("%02x, ",MmePacket->MMENTRY[58+Rtn]);
  756. printf("\n");
  757. #endif
  758. V2gFlowStatus=CM_SLAC_MATCH_REQ;
  759. memset(&SendMmePacket,0,sizeof(struct MmeHeader));
  760. memcpy(SendMmePacket.ODA,MmePacket->OSA,6);
  761. memcpy(SendMmePacket.OSA,CsuMac,6);
  762. SendMmePacket.MTYPE=htons(EtherType_HomePlug);
  763. SendMmePacket.MMV=MmePacket->MMV;
  764. SendMmePacket.MMTYPE=MMTYPE_CM_SLAC_MATCH_CNF;
  765. SendMmePacket.FMI[0]=SendMmePacket.FMI[1]=0;
  766. SendMmePacketSize=0;
  767. SendMmePacket.MMENTRY[SendMmePacketSize++]=0x00; //Fixed value (0x00) indicating ��PEV-EVSE matching��
  768. SendMmePacket.MMENTRY[SendMmePacketSize++]=0x00; //Fixed value (0x00) indicating ��No Security��
  769. SendMmePacket.MMENTRY[SendMmePacketSize++]=0x00; //Fixed value (0x0056) for matching
  770. SendMmePacket.MMENTRY[SendMmePacketSize++]=0x56; //Fixed value (0x0056) for matching
  771. memset(SendMmePacket.MMENTRY+SendMmePacketSize,0,17); //PEV ID
  772. SendMmePacketSize+=17;
  773. memcpy(SendMmePacket.MMENTRY+SendMmePacketSize,EvMac,6);
  774. SendMmePacketSize+=6;
  775. memset(SendMmePacket.MMENTRY+SendMmePacketSize,0,17); //EVSE ID
  776. SendMmePacketSize+=17;
  777. memcpy(SendMmePacket.MMENTRY+SendMmePacketSize,CsuMac,6);
  778. SendMmePacketSize+=6;
  779. memcpy(SendMmePacket.MMENTRY+SendMmePacketSize,SlacRunId,sizeof(SlacRunId));
  780. SendMmePacketSize+=sizeof(SlacRunId);
  781. memset(SendMmePacket.MMENTRY+SendMmePacketSize,0,8); //RSVD
  782. SendMmePacketSize+=8;
  783. memcpy(SendMmePacket.MMENTRY+SendMmePacketSize,Nid,sizeof(Nid));
  784. SendMmePacketSize+=sizeof(Nid);
  785. SendMmePacket.MMENTRY[SendMmePacketSize++]=0x00; //RSVD
  786. memcpy(SendMmePacket.MMENTRY+SendMmePacketSize,NewNmkKey,sizeof(NewNmkKey));
  787. SendMmePacketSize+=sizeof(NewNmkKey);
  788. SendMmePacketSize+=19; //the size before MMENTRY
  789. #ifdef Debug
  790. printf("\n\n***** Response MME Packet *****\n");
  791. printf("SendMmePacket.ODA: %02x:%02x:%02x:%02x:%02x:%02x:\n",
  792. SendMmePacket.ODA[0],SendMmePacket.ODA[1],SendMmePacket.ODA[2],SendMmePacket.ODA[3],SendMmePacket.ODA[4],SendMmePacket.ODA[5]);
  793. printf("SendMmePacket.OSA: %02x:%02x:%02x:%02x:%02x:%02x:\n",
  794. SendMmePacket.OSA[0],SendMmePacket.OSA[1],SendMmePacket.OSA[2],SendMmePacket.OSA[3],SendMmePacket.OSA[4],SendMmePacket.OSA[5]);
  795. printf("MTYPE: 0x%x\n", htons(SendMmePacket.MTYPE));
  796. printf("MMV: 0x%x\n", SendMmePacket.MMV);
  797. printf("MMTYPE: 0x%x\n", SendMmePacket.MMTYPE);
  798. printf("FMI 0x%x, 0x%x\n", SendMmePacket.FMI[0],SendMmePacket.FMI[1]);
  799. printf("--- CM_SLAC_MATCH_CNF ---\n");
  800. printf("APPLICATION_TYPE: 0x%x\n", SendMmePacket.MMENTRY[0]);
  801. printf("SECURITY_TYPE: 0x%x\n", SendMmePacket.MMENTRY[1]);
  802. printf("MVFLength: 0x%x, 0x%x\n", SendMmePacket.MMENTRY[2],SendMmePacket.MMENTRY[3]);
  803. printf("PEV ID: \n");
  804. for(Rtn=0; Rtn<17; Rtn++)
  805. printf("%02x, ",SendMmePacket.MMENTRY[4+Rtn]);
  806. printf("\n");
  807. printf("PEV MAC: \n");
  808. for(Rtn=0; Rtn<6; Rtn++)
  809. printf("%02x, ",SendMmePacket.MMENTRY[21+Rtn]);
  810. printf("\n");
  811. printf("EVSE ID: \n");
  812. for(Rtn=0; Rtn<17; Rtn++)
  813. printf("%02x, ",SendMmePacket.MMENTRY[27+Rtn]);
  814. printf("\n");
  815. printf("EVSE MAC: \n");
  816. for(Rtn=0; Rtn<6; Rtn++)
  817. printf("%02x, ",SendMmePacket.MMENTRY[44+Rtn]);
  818. printf("\n");
  819. printf("RunID: \n");
  820. for(Rtn=0; Rtn<8; Rtn++)
  821. printf("%02x, ",SendMmePacket.MMENTRY[50+Rtn]);
  822. printf("\n");
  823. printf("RSVD: \n");
  824. for(Rtn=0; Rtn<8; Rtn++)
  825. printf("%02x, ",SendMmePacket.MMENTRY[58+Rtn]);
  826. printf("\n");
  827. printf("NID: \n");
  828. for(Rtn=0; Rtn<7; Rtn++)
  829. printf("%02x, ",SendMmePacket.MMENTRY[66+Rtn]);
  830. printf("\n");
  831. printf("RSVD: 0x%x\n", SendMmePacket.MMENTRY[73]);
  832. printf("NMK: \n");
  833. for(Rtn=0; Rtn<16; Rtn++)
  834. printf("%02x, ",SendMmePacket.MMENTRY[74+Rtn]);
  835. printf("\n");
  836. #endif
  837. V2gFlowStatus=CM_SLAC_MATCH_CNF;
  838. Rtn=sendto(RawSock, &SendMmePacket, SendMmePacketSize, 0, (struct sockaddr*)&DestSocketAddress, sizeof(struct sockaddr_ll));
  839. #ifdef Debug
  840. printf("SendMmePacketSize=%d,Rtn=%d\n",SendMmePacketSize,Rtn);
  841. #endif
  842. ftime(&SeqStartTime);
  843. break;
  844. }
  845. case MMTYPE_VENDOR_VS_HOST_ACTION:
  846. {
  847. struct QcaVendorMmeHeader *RecvPacket;
  848. RecvPacket = (struct QcaVendorMmeHeader *)Buffer;
  849. //#ifdef Debug
  850. printf("--- MMTYPE_VENDOR_VS_HOST_ACTION ---\n");
  851. //#endif
  852. switch (RecvPacket->MBODY[0])
  853. {
  854. case 0x00:
  855. //Loader (Device Softloader or Bootloader) ready
  856. printf("QCA7K: Loader Ready\n");
  857. break;
  858. case 0x01:
  859. //Firmware Upgrade Ready
  860. printf("QCA7K: Firmware Upgrade Ready\n");
  861. break;
  862. case 0x02:
  863. //PIB Update Ready
  864. printf("QCA7K: PIB Update Ready\n");
  865. break;
  866. case 0x03:
  867. //Firmware Upgrade and PIB Update ready
  868. printf("QCA7K: Firmware Upgrade and PIB Update ready\n");
  869. break;
  870. case 0x04:
  871. //Loader (Bootloader) ready to receive SDRAM configuration.
  872. printf("QCA7K: Loader ready to receive SDRAM configuration\n");
  873. break;
  874. case 0x05:
  875. //Reset to Factory Defaults.
  876. printf("QCA7K: Reset to Factory Defaults\n");
  877. break;
  878. default:
  879. //Reserved
  880. printf("QCA7K: Reserved\n");
  881. break;
  882. }
  883. break;
  884. }
  885. case MMTYPE_VENDOR_ATTEN_CHAR:
  886. {
  887. #ifdef Debug
  888. printf("--- MMTYPE_VENDOR_ATTEN_CHAR ---\n");
  889. #endif
  890. break;
  891. }
  892. case MMTYPE_VENDOR_VS_NW_INFO_CNF:
  893. {
  894. memcpy(QcaMac,MmePacket->OSA,6);
  895. #ifdef Debug
  896. printf("--- MMTYPE_VENDOR_VS_NW_INFO_CNF ---\n");
  897. printf("QcaMac: %02x:%02x:%02x:%02x:%02x:%02x\n",
  898. QcaMac[0],QcaMac[1],QcaMac[2],QcaMac[3],QcaMac[4],QcaMac[5]);
  899. #endif
  900. V2gFlowStatus=CM_SET_KEY_REQ;
  901. }
  902. default:
  903. {
  904. break;
  905. }
  906. }
  907. }
  908. int SendSetKey()
  909. {
  910. int i = 0;
  911. unsigned char nRandValue = 0x0;
  912. unsigned char ConstString[16]="PhihongKey000000";
  913. memset(&SendMmePacket,0,sizeof(struct MmeHeader));
  914. memcpy(SendMmePacket.ODA,QcaMac,6);
  915. memcpy(SendMmePacket.OSA,CsuMac,6);
  916. SendMmePacket.MTYPE=htons(EtherType_HomePlug);
  917. SendMmePacket.MMV=0x01;
  918. SendMmePacket.MMTYPE=MMTYPE_CM_SET_KEY_REQ;
  919. SendMmePacket.FMI[0]=SendMmePacket.FMI[1]=0;
  920. SendMmePacketSize=0;
  921. SendMmePacket.MMENTRY[SendMmePacketSize++]=0x01;//Fixed value (0x01) to indicate ��NMK��
  922. memset(SendMmePacket.MMENTRY+SendMmePacketSize,0,4);//My Nonce, Fixed value(0x00000000), encrypted payload not used
  923. SendMmePacketSize+=4;
  924. memset(SendMmePacket.MMENTRY+SendMmePacketSize,0,4);//Your Nonce, Fixed value(0x00000000), encrypted payload not used
  925. SendMmePacketSize+=4;
  926. SendMmePacket.MMENTRY[SendMmePacketSize++]=0x04;//PID, Fixed value (0x04) to indicate ��HLE protocol��
  927. memset(SendMmePacket.MMENTRY+SendMmePacketSize,0,2);//PRN, Fixed value(0x00), encrypted payload not used
  928. SendMmePacketSize+=2;
  929. SendMmePacket.MMENTRY[SendMmePacketSize++]=0x00;//PMN, Fixed value(0x00) encrypted payload not used
  930. SendMmePacket.MMENTRY[SendMmePacketSize++]=0x01;//CCo Capablility
  931. srand(time(NULL));
  932. for(i=10; i<16; i++)
  933. {
  934. nRandValue = (rand()%62)+1;
  935. if((nRandValue>=0)&&(nRandValue<=9)) // 0 ~ 9
  936. ConstString[i]= nRandValue + 0x30;
  937. else if((nRandValue>=10)&&(nRandValue<=35)) // A ~ Z
  938. ConstString[i]= nRandValue -10 + 0x41;
  939. else if((nRandValue>=36)&&(nRandValue<=61)) // a ~ z
  940. ConstString[i]= nRandValue -37 + 0x61;
  941. else
  942. ConstString[i]= 0x30;
  943. }
  944. memset(NewNmkKey,0,sizeof(NewNmkKey));
  945. memset(Nid,0,sizeof(Nid));
  946. HPAVKeyNMK(NewNmkKey,ConstString);
  947. HPAVKeyNID(Nid,NewNmkKey,DEFAULT_LEVEL);
  948. memcpy(SendMmePacket.MMENTRY+SendMmePacketSize,Nid,sizeof(Nid)); //NID, 54 LSBs contain the NID 2 MSBs = 0b00
  949. SendMmePacketSize+=sizeof(Nid);
  950. SendMmePacket.MMENTRY[SendMmePacketSize++]=0x01;//NewEKS,Fixed value (0x01)to indicate ��NMK��
  951. memcpy(SendMmePacket.MMENTRY+SendMmePacketSize,NewNmkKey,sizeof(NewNmkKey));//NewKey
  952. SendMmePacketSize+=sizeof(NewNmkKey);
  953. SendMmePacketSize+=19; //the size before MMENTRY
  954. V2gFlowStatus=CM_SET_KEY_REQ;
  955. i=sendto(RawSock, &SendMmePacket, SendMmePacketSize, 0, (struct sockaddr*)&DestSocketAddress, sizeof(struct sockaddr_ll));
  956. #ifdef Debug
  957. printf("SendSetKey: send size =%d\n",i);
  958. #endif
  959. }
  960. int GetQca7kMac()
  961. {
  962. int i = 0;
  963. struct QcaVendorMmeHeader SendPacket;
  964. memset(&SendPacket,0,sizeof(struct QcaVendorMmeHeader));
  965. memset(SendPacket.ODA, 0xFF, 6);
  966. memcpy(SendPacket.OSA,CsuMac,6);
  967. SendPacket.MTYPE=htons(EtherType_HomePlug);
  968. SendPacket.MMV=0x00;
  969. SendPacket.MMTYPE=MMTYPE_VENDOR_VS_NW_INFO;
  970. SendPacket.OUI[0]=0x00;
  971. SendPacket.OUI[1]=0xB0;
  972. SendPacket.OUI[2]=0x52;
  973. i=sendto(RawSock, &SendPacket, 20, 0, (struct sockaddr*)&DestSocketAddress, sizeof(struct sockaddr_ll));
  974. #ifdef Debug
  975. printf("GetQca7kMac: send size =%d\n",i);
  976. #endif
  977. }
  978. int SlacComm()
  979. {
  980. int packet_size,count;
  981. static unsigned int STime;
  982. if(RawSock>=0)
  983. {
  984. memset(RecvBuffer,0,RecvBufferSize);
  985. packet_size = recvfrom(RawSock, RecvBuffer, RecvBufferSize, 0, NULL, NULL);
  986. if(packet_size>0)
  987. {
  988. /*#ifdef Debug
  989. printf("Raw Data: ");
  990. for(count=0;count<packet_size;count++)
  991. printf("0x%x, ",RecvBuffer[count]);
  992. printf("\n");
  993. #endif*/
  994. MmeProcess(RecvBuffer, packet_size);
  995. }
  996. }
  997. switch(V2gFlowStatus)
  998. {
  999. case Idle:
  1000. {
  1001. if(RawSock<0)
  1002. {
  1003. struct timeval tv;
  1004. RawSock= socket(PF_PACKET, SOCK_RAW, htons(EtherType_HomePlug));
  1005. #ifdef Debug
  1006. printf("RawSock=%d\n",RawSock);
  1007. #endif
  1008. if(RawSock == -1)
  1009. {
  1010. #ifdef SystemLogMessage
  1011. StoreLogMsg("[EvComm]SlacComm:Failed to create socke");
  1012. #endif
  1013. V2gFlowStatus=Other_Fault;
  1014. return -1;
  1015. }
  1016. setsockopt(RawSock, SOL_SOCKET, SO_BINDTODEVICE,QcaInterface, 4);
  1017. /*tv.tv_sec = 0;
  1018. tv.tv_usec = 10000;
  1019. if (setsockopt(RawSock, SOL_SOCKET, SO_RCVTIMEO, (char *)&tv, sizeof(struct timeval)) < 0)
  1020. {
  1021. #ifdef SystemLogMessage
  1022. StoreLogMsg("[EvComm]SlacComm:Set SO_RCVTIMEO NG");
  1023. #endif
  1024. V2gFlowStatus=Other_Fault;
  1025. return -1;
  1026. }*/
  1027. memset(&Req, 0, sizeof(struct ifreq));
  1028. strcpy( (char*)Req.ifr_name, QcaInterface);
  1029. if (ioctl(RawSock, SIOCGIFINDEX, &Req) < 0)
  1030. {
  1031. #ifdef SystemLogMessage
  1032. StoreLogMsg("[EvComm]SlacComm: ioctl NG");
  1033. #endif
  1034. V2gFlowStatus=Other_Fault;
  1035. return -1;
  1036. }
  1037. memset( &DestSocketAddress, 0, sizeof(struct sockaddr_ll) );
  1038. DestSocketAddress.sll_ifindex = Req.ifr_ifindex;
  1039. DestSocketAddress.sll_halen = ETH_ALEN;
  1040. //Get QCA7K MAC address
  1041. GetQca7kMac();
  1042. PwmStartTime=0;
  1043. count=0;
  1044. STime=time(NULL);
  1045. }
  1046. else
  1047. {
  1048. if((time(NULL)-STime)>=3)
  1049. {
  1050. if((count++) >=3)
  1051. V2gFlowStatus=Sequence_Timeout;
  1052. else
  1053. {
  1054. GetQca7kMac();
  1055. STime=time(NULL);
  1056. }
  1057. }
  1058. }
  1059. break;
  1060. }
  1061. case CM_SET_KEY_REQ:
  1062. {
  1063. //CM_SET_KEY_REQ
  1064. SendSetKey();
  1065. break;
  1066. }
  1067. case CM_SET_KEY_CNF:
  1068. {
  1069. OutputCpPwmDuty(5);
  1070. if(PwmStartTime<=0)
  1071. PwmStartTime=time(NULL);
  1072. else
  1073. {
  1074. if((time(NULL)-PwmStartTime)>TT_EVSE_SLAC_init)
  1075. {
  1076. #ifdef SystemLogMessage
  1077. StoreLogMsg("[EvComm]SlacComm: Wait CM_SLAC_PARM_REQ Timeout - TT_EVSE_SLAC_init ");
  1078. #endif
  1079. V2gFlowStatus=Sequence_Timeout;
  1080. return -1;
  1081. }
  1082. }
  1083. break;
  1084. }
  1085. case CM_SLAC_PARM_CONF:
  1086. {
  1087. ftime(&SeqEndTime);
  1088. if(DiffTimeb(SeqStartTime, SeqEndTime)>TT_match_sequence)
  1089. {
  1090. #ifdef SystemLogMessage
  1091. StoreLogMsg("[EvComm]SlacComm: Wait CM_START_ATTEN_CHAR_IND Timeout - TT_match_sequence ");
  1092. #endif
  1093. V2gFlowStatus=Sequence_Timeout;
  1094. return -1;
  1095. }
  1096. break;
  1097. }
  1098. case CM_START_ATTEN_CHAR_IND:
  1099. {
  1100. ftime(&SeqEndTime);
  1101. if(DiffTimeb(SeqStartTime, SeqEndTime)>(3*TP_EV_batch_msg_interval)) //one more time interval for tolerance
  1102. {
  1103. #ifdef SystemLogMessage
  1104. StoreLogMsg("[EvComm]SlacComm: Wait CM_MNBC_SOUND_IND Timeout - 3*TP_EV_batch_msg_interval ");
  1105. #endif
  1106. V2gFlowStatus=Sequence_Timeout;
  1107. return -1;
  1108. }
  1109. break;
  1110. }
  1111. case CM_MNBC_SOUND_IND:
  1112. {
  1113. ftime(&SeqEndTime);
  1114. if(DiffTimeb(SeqStartTime, SeqEndTime)>(TT_EVSE_match_MNBC*100)||(AttenProfileNum>=MnbcSoundNum))
  1115. {
  1116. memset(&SendMmePacket,0,sizeof(struct MmeHeader));
  1117. memcpy(SendMmePacket.ODA,EvMac,6);
  1118. memcpy(SendMmePacket.OSA,CsuMac,6);
  1119. SendMmePacket.MTYPE=htons(EtherType_HomePlug);
  1120. SendMmePacket.MMV=0x01;
  1121. SendMmePacket.MMTYPE=MMTYPE_CM_ATTN_CHAR_IND;
  1122. SendMmePacket.FMI[0]=SendMmePacket.FMI[1]=0;
  1123. SendMmePacketSize=0;
  1124. SendMmePacket.MMENTRY[SendMmePacketSize++]=0; //APPLICATION_TYPE, Fixed value indicating ��PEVEVSE matching��
  1125. SendMmePacket.MMENTRY[SendMmePacketSize++]=0; //SECURITY_TYPE, Fixed value indicating ��No Security��
  1126. memcpy(SendMmePacket.MMENTRY+SendMmePacketSize,EvMac,6); //SOURCE_ADDRESS, MAC address of the EV Host
  1127. SendMmePacketSize+=6;
  1128. memcpy(SendMmePacket.MMENTRY+SendMmePacketSize,SlacRunId,sizeof(SlacRunId));
  1129. SendMmePacketSize+=sizeof(SlacRunId);
  1130. memset(SendMmePacket.MMENTRY+SendMmePacketSize,0,17); //SOURCE_ID
  1131. SendMmePacketSize+=17;
  1132. memset(SendMmePacket.MMENTRY+SendMmePacketSize,0,17); //RESP_ID
  1133. SendMmePacketSize+=17;
  1134. SendMmePacket.MMENTRY[SendMmePacketSize++]=AttenProfileNum; //NumSounds
  1135. SendMmePacket.MMENTRY[SendMmePacketSize++]=AagGroupsNum; //NumGroups
  1136. for(count=0; count<AagGroupsNum; count++)
  1137. {
  1138. unsigned char TmpAag;
  1139. TmpAag=((Aag[count]/AttenProfileNum)&0xFF);
  1140. if(TmpAag>=39)
  1141. {
  1142. /*
  1143. // [To-do] If this statement is enabled, SLAC will fail due to timeout.
  1144. #ifdef SystemLogMessage
  1145. {
  1146. unsigned char TmpBuf[64];
  1147. memset(TmpBuf,0,sizeof(TmpBuf));
  1148. sprintf(TmpBuf,"[EvComm]SlacComm: bad Aag[%d]=%d",count,TmpAag);
  1149. StoreLogMsg(TmpBuf);
  1150. }
  1151. #endif
  1152. */
  1153. TmpAag=37;
  1154. }
  1155. SendMmePacket.MMENTRY[SendMmePacketSize++]=TmpAag;
  1156. }
  1157. SendMmePacketSize+=19; //the size before MMENTRY
  1158. #ifdef Debug
  1159. printf("\n\n***** Send MME Packet *****\n");
  1160. printf("SendMmePacket.ODA: %02x:%02x:%02x:%02x:%02x:%02x:\n",
  1161. SendMmePacket.ODA[0],SendMmePacket.ODA[1],SendMmePacket.ODA[2],SendMmePacket.ODA[3],SendMmePacket.ODA[4],SendMmePacket.ODA[5]);
  1162. printf("SendMmePacket.OSA: %02x:%02x:%02x:%02x:%02x:%02x:\n",
  1163. SendMmePacket.OSA[0],SendMmePacket.OSA[1],SendMmePacket.OSA[2],SendMmePacket.OSA[3],SendMmePacket.OSA[4],SendMmePacket.OSA[5]);
  1164. printf("MTYPE: 0x%x\n", htons(SendMmePacket.MTYPE));
  1165. printf("MMV: 0x%x\n", SendMmePacket.MMV);
  1166. printf("MMTYPE: 0x%x\n", SendMmePacket.MMTYPE);
  1167. printf("FMI 0x%x, 0x%x\n", SendMmePacket.FMI[0],SendMmePacket.FMI[1]);
  1168. printf("--- CM_ATTEN_CHAR_IND ---\n");
  1169. printf("APPLICATION_TYPE: 0x%x\n", SendMmePacket.MMENTRY[0]);
  1170. printf("SECURITY_TYPE: 0x%x\n", SendMmePacket.MMENTRY[1]);
  1171. printf("SOURCE_ADDRESS: %02x:%02x:%02x:%02x:%02x:%02x\n",
  1172. SendMmePacket.MMENTRY[2],SendMmePacket.MMENTRY[3],SendMmePacket.MMENTRY[4],SendMmePacket.MMENTRY[5],
  1173. SendMmePacket.MMENTRY[6],SendMmePacket.MMENTRY[7]);
  1174. printf("RunID: %02x,%02x,%02x,%02x,%02x,%02x,%02x,%02x\n",
  1175. SendMmePacket.MMENTRY[8],SendMmePacket.MMENTRY[9],SendMmePacket.MMENTRY[10],SendMmePacket.MMENTRY[11],
  1176. SendMmePacket.MMENTRY[12],SendMmePacket.MMENTRY[13],SendMmePacket.MMENTRY[14],SendMmePacket.MMENTRY[15]);
  1177. printf("SOURCE_ID: \n");
  1178. for(count=0; count<17; count++)
  1179. printf("%02x, ",SendMmePacket.MMENTRY[16+count]);
  1180. printf("\n");
  1181. printf("RESP_ID: \n");
  1182. for(count=0; count<17; count++)
  1183. printf("%02x, ",SendMmePacket.MMENTRY[33+count]);
  1184. printf("\n");
  1185. printf("NumSounds: 0x%x\n", SendMmePacket.MMENTRY[50]);
  1186. printf("ATTEN_PROFILE: \n");
  1187. for(count=0; count<AagGroupsNum; count++)
  1188. printf("%02x, ",SendMmePacket.MMENTRY[51+count]);
  1189. printf("\n");
  1190. #endif
  1191. V2gFlowStatus=CM_ATTEN_CHAR_IND;
  1192. count=sendto(RawSock, &SendMmePacket, SendMmePacketSize, 0, (struct sockaddr*)&DestSocketAddress, sizeof(struct sockaddr_ll));
  1193. #ifdef Debug
  1194. printf("SendMmePacketSize=%d,Rtn=%d\n",SendMmePacketSize,count);
  1195. #endif
  1196. ftime(&SeqStartTime);
  1197. }
  1198. break;
  1199. }
  1200. case CM_ATTEN_CHAR_IND:
  1201. {
  1202. ftime(&SeqEndTime);
  1203. //if(DiffTimeb(SeqStartTime, SeqEndTime)>TT_match_response)
  1204. if(DiffTimeb(SeqStartTime, SeqEndTime)>TT_match_response*2) //extended to 400ms due to the response of CM_ATTEN_CHAR.RSP of some EVCC is slower than 200ms.
  1205. {
  1206. #ifdef SystemLogMessage
  1207. StoreLogMsg("[EvComm]SlacComm: Wait CM_ATTEN_CHAR_RSP Timeout - TT_match_response ");
  1208. #endif
  1209. V2gFlowStatus=Sequence_Timeout;
  1210. return -1;
  1211. }
  1212. break;
  1213. }
  1214. case CM_ATTEN_CHAR_RSP:
  1215. {
  1216. ftime(&SeqEndTime);
  1217. if(DiffTimeb(SeqStartTime, SeqEndTime)>TT_EVSE_match_session)
  1218. {
  1219. #ifdef SystemLogMessage
  1220. StoreLogMsg("[EvComm]SlacComm: Wait CM_VALIDATE_REQ or CM_SLAC_MATCH_REQ Timeout - TT_EVSE_match_session ");
  1221. #endif
  1222. V2gFlowStatus=Sequence_Timeout;
  1223. return -1;
  1224. }
  1225. break;
  1226. }
  1227. case CM_VALIDATE_CNF:
  1228. {
  1229. ftime(&SeqEndTime);
  1230. if(DiffTimeb(SeqStartTime, SeqEndTime)>TT_match_sequence)
  1231. {
  1232. #ifdef SystemLogMessage
  1233. StoreLogMsg("[EvComm]SlacComm: Wait CM_VALIDATE_CNF or CM_SLAC_MATCH_REQ Timeout - TT_match_sequence ");
  1234. #endif
  1235. V2gFlowStatus=Sequence_Timeout;
  1236. return -1;
  1237. }
  1238. break;
  1239. }
  1240. case CM_SLAC_MATCH_CNF:
  1241. {
  1242. if(UdpSock>0)
  1243. {
  1244. close(UdpSock);
  1245. UdpSock=-1;
  1246. }
  1247. if(TcpSock>0)
  1248. {
  1249. close(TcpSock);
  1250. TcpSock=-1;
  1251. }
  1252. ftime(&SeqStartTime);
  1253. V2gFlowStatus=SLACC_SDP_UDP_Connection;
  1254. break;
  1255. }
  1256. defaudlt:
  1257. {
  1258. break;
  1259. }
  1260. }
  1261. return 0;
  1262. }
  1263. int V2gMsgProcess(unsigned char *Buffer, int DataLength)
  1264. {
  1265. struct V2gtpHeader *RecvHeader;
  1266. unsigned char *PayloadData;
  1267. RecvHeader= (struct V2gtpHeader *) Buffer;
  1268. #ifdef Debug
  1269. printf("\n\n***********************************\n");
  1270. printf("***** Received V2G Packet *****\n");
  1271. printf("***********************************\n");
  1272. printf("ProtocolVersion=%d\n",RecvHeader->ProtocolVersion);
  1273. printf("InverseProtocolVersion=0x%x\n",RecvHeader->InverseProtocolVersion);
  1274. printf("PayloadType=0x%x\n",htons(RecvHeader->PayloadType));
  1275. printf("PayloadLength=0x%x\n",htonl(RecvHeader->PayloadLength));
  1276. #endif
  1277. if(htons(RecvHeader->PayloadType)!=V2GTP_PAYLOAD_TYPE_EXI_MSG)
  1278. {
  1279. #ifdef SystemLogMessage
  1280. StoreLogMsg("[EvComm]V2gMsgProcess: Wrong Payload Type");
  1281. #endif
  1282. return 0;
  1283. }
  1284. //EXI decode
  1285. //process received message and change status flag
  1286. }
  1287. int V2gComm(int AcceptFd)
  1288. {
  1289. int packet_size,count;
  1290. memset(RecvBuffer,0,RecvBufferSize);
  1291. packet_size=recv(AcceptFd, RecvBuffer, RecvBufferSize, 0);
  1292. if(packet_size>0)
  1293. {
  1294. /*#ifdef Debug
  1295. printf("V2gComm Data: ");
  1296. for(count=0;count<packet_size;count++)
  1297. printf("0x%x, ",RecvBuffer[count]);
  1298. printf("\n");
  1299. #endif*/
  1300. V2gMsgProcess(RecvBuffer, packet_size);
  1301. }
  1302. //following are the response message handling according to status flag
  1303. switch(V2gFlowStatus)
  1304. {
  1305. case SupportedAppProtocolRequest:
  1306. break;
  1307. default:
  1308. break;
  1309. }
  1310. return 0;
  1311. }
  1312. int SdpUdpConnected()
  1313. {
  1314. int packet_size,Rtn;
  1315. struct sockaddr_in6 ServerAddr,ClientAddr;
  1316. struct V2gtpHeader *RecvHeader;
  1317. unsigned char *PayloadData;
  1318. if(UdpSock<=0)
  1319. {
  1320. if ((UdpSock = socket(AF_INET6, SOCK_DGRAM, 0)) <0)
  1321. {
  1322. #ifdef SystemLogMessage
  1323. StoreLogMsg("[EvComm]SdpUdpConnected: Fail to open UdpSock");
  1324. #endif
  1325. return 0;
  1326. }
  1327. memset(&ServerAddr,0, sizeof(struct sockaddr_in));
  1328. ServerAddr.sin6_family = AF_INET6;
  1329. ServerAddr.sin6_addr=in6addr_any;
  1330. ServerAddr.sin6_port = htons(SdpUdpServerPort);
  1331. if(bind(UdpSock, (struct sockaddr *)&ServerAddr, sizeof(struct sockaddr_in6)) <0)
  1332. {
  1333. #ifdef SystemLogMessage
  1334. StoreLogMsg("[EvComm]SdpUdpConnected: Fail to bind UdpSock");
  1335. #endif
  1336. close(UdpSock);
  1337. UdpSock=-1;
  1338. return 0;
  1339. }
  1340. #ifdef Debug
  1341. printf("UdpSock=%d\n",UdpSock);
  1342. #endif
  1343. }
  1344. memset(RecvBuffer,0,RecvBufferSize);
  1345. memset(&ClientAddr,0, sizeof(struct sockaddr_in));
  1346. Rtn=sizeof(struct sockaddr_in6);
  1347. packet_size = recvfrom(UdpSock, RecvBuffer, RecvBufferSize, MSG_DONTWAIT, (struct sockaddr *)&ClientAddr, &Rtn);
  1348. #ifdef Debug
  1349. printf("packet_size=%d\n",packet_size);
  1350. #endif
  1351. if(packet_size>0)
  1352. {
  1353. RecvHeader= (struct V2gtpHeader *) RecvBuffer;
  1354. PayloadData=RecvBuffer+sizeof(struct V2gtpHeader);
  1355. #ifdef Debug
  1356. printf("\n\n***********************************\n");
  1357. printf("***** Received SDP Packet *****\n");
  1358. printf("***********************************\n");
  1359. printf("ClientAddress=");
  1360. for(Rtn=0; Rtn<16; Rtn+=2)
  1361. printf("%02x%02x:",ClientAddr.sin6_addr.s6_addr[Rtn],ClientAddr.sin6_addr.s6_addr[Rtn+1]);
  1362. printf("\n");
  1363. printf("ClientPort=%d\n",ClientAddr.sin6_port);
  1364. printf("ProtocolVersion=%d\n",RecvHeader->ProtocolVersion);
  1365. printf("InverseProtocolVersion=0x%x\n",RecvHeader->InverseProtocolVersion);
  1366. printf("PayloadType=0x%x\n",htons(RecvHeader->PayloadType));
  1367. printf("PayloadLength=0x%x\n",htonl(RecvHeader->PayloadLength));
  1368. #endif
  1369. if((RecvHeader->ProtocolVersion==0x01)&&(RecvHeader->InverseProtocolVersion==0xFE)&&(htons(RecvHeader->PayloadType)==V2GTP_PAYLOAD_TYPE_SDP_REQUEST))
  1370. {
  1371. #ifdef Debug
  1372. printf("Security=0x%x\n",*(PayloadData+0));
  1373. printf("TransportProtocol=0x%x\n",*(PayloadData+1));
  1374. #endif
  1375. RecvHeader->PayloadType=htons(V2GTP_PAYLOAD_TYPE_SDP_RESPONSE);
  1376. RecvHeader->PayloadLength=htonl(20); //Fixed Length=20
  1377. memset(PayloadData,0,20);
  1378. // MAC address[0:2] + FFFE + MAC address[3:5]
  1379. PayloadData[0]=(IPV6_LINK_LOCAL_PREFIX>>8)&0xFF;
  1380. PayloadData[1]=IPV6_LINK_LOCAL_PREFIX&0xFF;
  1381. PayloadData[8]=CsuMac[0];
  1382. PayloadData[8]^=0x02;// bit 1 should complemented.
  1383. PayloadData[9]=CsuMac[1];
  1384. PayloadData[10]=CsuMac[2];
  1385. PayloadData[11]=0xFF;
  1386. PayloadData[12]=0xFE;
  1387. PayloadData[13] =CsuMac[3];
  1388. PayloadData[14]=CsuMac[4];
  1389. PayloadData[15]=CsuMac[5];
  1390. //TCP port
  1391. PayloadData[16]=(SdpTcpServerPort>>8)&0xFF;
  1392. PayloadData[17]=SdpTcpServerPort&0xFF;
  1393. PayloadData[18]=SDP_PAYLOAD_SECURITY_NONE; //Security
  1394. PayloadData[19]=SDP_PAYLOAD_TRANS_PROTOCOL_TCP; //Transport protocol
  1395. Rtn=sendto(UdpSock, RecvBuffer, sizeof(struct V2gtpHeader)+htonl(RecvHeader->PayloadLength), 0, (struct sockaddr *)&ClientAddr, sizeof(struct sockaddr_in6));
  1396. #ifdef Debug
  1397. printf("\n\n***** Response SDP Packet *****\n");
  1398. printf("Send size=%d\n",Rtn);
  1399. printf("Destination Address=");
  1400. for(Rtn=0; Rtn<16; Rtn++)
  1401. printf("%02x, ",ClientAddr.sin6_addr.s6_addr[Rtn]);
  1402. printf("\n");
  1403. printf("Destination Port=%d\n",ClientAddr.sin6_port);
  1404. printf("ProtocolVersion=%d\n",RecvHeader->ProtocolVersion);
  1405. printf("InverseProtocolVersion=0x%x\n",RecvHeader->InverseProtocolVersion);
  1406. printf("PayloadType=0x%x\n",htons(RecvHeader->PayloadType));
  1407. printf("PayloadLength=0x%x\n",htonl(RecvHeader->PayloadLength));
  1408. printf("SECC Ipv6 Address=");
  1409. for(Rtn=0; Rtn<16; Rtn++)
  1410. printf("%02x:",PayloadData[Rtn]);
  1411. printf("\n");
  1412. printf("SECC Port=%d\n",(PayloadData[16]<<8|PayloadData[17]));
  1413. printf("Security=0x%x\n",PayloadData[19]);
  1414. printf("TransportProtocol=0x%x\n",PayloadData[20]);
  1415. #endif
  1416. if(Rtn>0)
  1417. return 1;
  1418. }
  1419. }
  1420. return 0;
  1421. }
  1422. int V2gTcpConnected()
  1423. {
  1424. int packet_size,Rtn,AcceptFd;
  1425. struct sockaddr_in6 ServerAddr,ClientAddr;
  1426. if(TcpSock<=0)
  1427. {
  1428. if ((TcpSock = socket(PF_INET6, SOCK_STREAM, 0)) <0)
  1429. {
  1430. #ifdef SystemLogMessage
  1431. StoreLogMsg("[EvComm]V2gTcpConnected: Fail to open TcpSock");
  1432. #endif
  1433. return 0;
  1434. }
  1435. fcntl(TcpSock, F_SETFL, O_NONBLOCK); //set to O_NONBLOCK
  1436. memset(&ServerAddr,0, sizeof(struct sockaddr_in));
  1437. ServerAddr.sin6_family = PF_INET6;
  1438. ServerAddr.sin6_addr=in6addr_any;
  1439. ServerAddr.sin6_port = htons(SdpTcpServerPort);
  1440. if(bind(TcpSock, (struct sockaddr *)&ServerAddr, sizeof(struct sockaddr_in6)) <0)
  1441. {
  1442. #ifdef SystemLogMessage
  1443. StoreLogMsg("[EvComm]V2gTcpConnected: Fail to bind TcpSock");
  1444. #endif
  1445. close(TcpSock);
  1446. TcpSock=-1;
  1447. return 0;
  1448. }
  1449. if(listen(TcpSock, 1) == -1) //only accept one connection
  1450. {
  1451. #ifdef SystemLogMessage
  1452. StoreLogMsg("[EvComm]V2gTcpConnected: Fail to listen TcpSock");
  1453. #endif
  1454. close(TcpSock);
  1455. TcpSock=-1;
  1456. return 0;
  1457. }
  1458. #ifdef Debug
  1459. printf("TcpSock=%d\n",TcpSock);
  1460. #endif
  1461. }
  1462. Rtn=sizeof(struct sockaddr_in6);
  1463. if((AcceptFd=accept(TcpSock,(struct sockaddr *)&ClientAddr,&Rtn))==-1)
  1464. {
  1465. #ifdef Debug
  1466. printf("Wait TCP connection\n");
  1467. #endif
  1468. return 0;
  1469. }
  1470. #ifdef Debug
  1471. printf("Accept one TCP connection:\n");
  1472. printf("AcceptFd=%d\n",AcceptFd);
  1473. printf("ClientAddress=");
  1474. for(Rtn=0; Rtn<16; Rtn+=2)
  1475. printf("%02x%02x:",ClientAddr.sin6_addr.s6_addr[Rtn],ClientAddr.sin6_addr.s6_addr[Rtn+1]);
  1476. printf("\n");
  1477. printf("ClientPort=%d\n",ClientAddr.sin6_port);
  1478. #endif
  1479. return AcceptFd;
  1480. }
  1481. int main(int argc,char *argv[])
  1482. {
  1483. unsigned char Rtn;
  1484. int TcpAcceptFd;
  1485. //Initialization
  1486. InitShareMemory();
  1487. //start to detect pilot state
  1488. PilotDetectionPid=0;
  1489. PilotDetection();
  1490. //Init communication parameters
  1491. GetEthMac(QcaInterface, CsuMac);
  1492. RecvBuffer=(unsigned char *)malloc(RecvBufferSize);
  1493. memset(RecvBuffer,0,RecvBufferSize);
  1494. SendBuffer=(unsigned char *)malloc(SendBufferSize);
  1495. memset(SendBuffer,0,SendBufferSize);
  1496. if(RawSock>0)
  1497. close(RawSock);
  1498. if(UdpSock>0)
  1499. close(UdpSock);
  1500. if(TcpSock>0)
  1501. close(TcpSock);
  1502. RawSock=UdpSock=TcpSock=-1;
  1503. V2gFlowStatus=0;
  1504. AttenProfileNum=0;
  1505. while(1)
  1506. {
  1507. #ifdef Debug
  1508. printf("V2gFlowStatus=%d\n",V2gFlowStatus);
  1509. #endif
  1510. //if((ShmInternalComm->ChargingPermission==0x01)&&(ConnectorPlugIn()==1))
  1511. if(1)
  1512. {
  1513. if(V2gFlowStatus<SLACC_SDP_UDP_Connection)
  1514. SlacComm();
  1515. else if(V2gFlowStatus==SLACC_SDP_UDP_Connection)
  1516. {
  1517. if(SdpUdpConnected()==1)
  1518. {
  1519. V2gFlowStatus=SLACC_SDP_TCP_Connection;
  1520. continue;
  1521. }
  1522. ftime(&SeqEndTime);
  1523. if(DiffTimeb(SeqStartTime, SeqEndTime)>TT_match_join)
  1524. {
  1525. #ifdef SystemLogMessage
  1526. StoreLogMsg("[EvComm]main: Wait SLACC_SDP_UDP_Connection Timeout - TT_match_join ");
  1527. #endif
  1528. V2gFlowStatus=Sequence_Timeout;
  1529. }
  1530. }
  1531. else if(V2gFlowStatus==SLACC_SDP_TCP_Connection)
  1532. {
  1533. if((TcpAcceptFd=V2gTcpConnected())>0)
  1534. {
  1535. V2gFlowStatus=SupportedAppProtocolRequest;
  1536. continue;
  1537. }
  1538. ftime(&SeqEndTime);
  1539. if(DiffTimeb(SeqStartTime, SeqEndTime)>TT_match_join)
  1540. {
  1541. #ifdef SystemLogMessage
  1542. StoreLogMsg("[EvComm]main: Wait SLACC_SDP_TCP_Connection Timeout - TT_match_join ");
  1543. #endif
  1544. V2gFlowStatus=Sequence_Timeout;
  1545. }
  1546. }
  1547. else if(V2gFlowStatus<Performance_Timeout)
  1548. V2gComm(TcpAcceptFd);
  1549. }
  1550. if(V2gFlowStatus>=Performance_Timeout)
  1551. {
  1552. //Normal Stop
  1553. //alarm and duty to 100%
  1554. OutputCpPwmDuty(100);
  1555. goto ReSet;
  1556. }
  1557. /*else if((ConnectorPlugIn()==0)&&(V2gFlowStatus>Idle))
  1558. {
  1559. //Emergency stop
  1560. OutputCpPwmDuty(100);
  1561. goto ReSet;
  1562. }*/
  1563. continue;
  1564. ReSet:
  1565. if(RawSock>0)
  1566. close(RawSock);
  1567. if(UdpSock>0)
  1568. close(UdpSock);
  1569. if(TcpSock>0)
  1570. {
  1571. close(TcpSock);
  1572. close(TcpAcceptFd);
  1573. }
  1574. RawSock=UdpSock=TcpSock=TcpAcceptFd=-1;
  1575. V2gFlowStatus=0;
  1576. while(1)
  1577. {
  1578. //wait for CSU configrm
  1579. }
  1580. }//main while
  1581. }