Module_CabinetParallel.c 61 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846
  1. /*
  2. * Module_CabinetParallel.c
  3. *
  4. * Created on: 2021年9月28日
  5. * Author: 7978
  6. */
  7. #include <sys/time.h>
  8. #include <sys/timeb.h>
  9. #include <sys/types.h>
  10. #include <sys/stat.h>
  11. #include <sys/types.h>
  12. #include <sys/ioctl.h>
  13. #include <sys/socket.h>
  14. #include <sys/ipc.h>
  15. #include <sys/shm.h>
  16. #include <sys/shm.h>
  17. #include <sys/mman.h>
  18. #include <linux/can.h>
  19. #include <linux/can/raw.h>
  20. #include <linux/wireless.h>
  21. #include <arpa/inet.h>
  22. #include <netinet/in.h>
  23. #include <unistd.h>
  24. #include <stdarg.h>
  25. #include <stdio.h> /*標準輸入輸出定義*/
  26. #include <stdlib.h> /*標準函數庫定義*/
  27. #include <unistd.h> /*Unix 標準函數定義*/
  28. #include <fcntl.h> /*檔控制定義*/
  29. #include <termios.h> /*PPSIX 終端控制定義*/
  30. #include <errno.h> /*錯誤號定義*/
  31. #include <errno.h>
  32. #include <string.h>
  33. #include <time.h>
  34. #include <ctype.h>
  35. #include <ifaddrs.h>
  36. #include <signal.h>
  37. #include <net/if_arp.h>
  38. #include "../../define.h"
  39. #include "Module_EvComm.h"
  40. #include "Module_CabinetParallel.h"
  41. #include "Config.h"
  42. #include "Common.h"
  43. //==========================================
  44. // Share Memory
  45. //==========================================
  46. struct SysConfigAndInfo *ShmSysConfigAndInfo;
  47. ChargerInfoData *ShmChargerInfo;
  48. struct ChargingInfoData *chargingInfo[CONNECTOR_QUANTITY];
  49. PsuGroupCollectionData *ShmGroupCollection;
  50. struct PsuData *ShmPsuData;
  51. //==========================================
  52. // Local Variable
  53. //==========================================
  54. struct WARNING_CODE_INFO SlaveWarningInfo[MAX_SLAVE_CABINET_QUANTITY];
  55. unsigned char _SCabinetUpdateState = 0;
  56. unsigned char PCabinetUpdateRequest[MAX_SLAVE_CABINET_QUANTITY];
  57. int _regReqLen[PARALLEL_CABINET_REG_QUANTITY] =
  58. {
  59. REG_REQ_LEN_NONE, // reg: 0x00
  60. REG_REQ_LEN_MODELNAME, // reg: 0x01
  61. REG_REQ_LEN_ID, // reg: 0x02
  62. REG_REQ_LEN_REG03, // reg: 0x03
  63. REG_REQ_LEN_STATUS, // reg: 0x04
  64. REG_REQ_LEN_OUTPUT_RELAY, // reg: 0x05
  65. REG_REQ_LEN_AC_CONTACTOR, // reg: 0x06
  66. REG_REQ_LEN_UPDATE, // reg: 0x07
  67. REG_REQ_LEN_PARALLEL_RELAY, // reg: 0x08
  68. };
  69. int _regResLen[PARALLEL_CABINET_REG_QUANTITY] =
  70. {
  71. REG_RES_LEN_NONE, // reg: 0x00
  72. REG_RES_LEN_MODELNAME, // reg: 0x01
  73. REG_RES_LEN_ID, // reg: 0x02
  74. REG_RES_LEN_REG03, // reg: 0x03
  75. REG_RES_LEN_STATUS, // reg: 0x04
  76. REG_RES_LEN_OUTPUT_RELAY, // reg: 0x05
  77. REG_RES_LEN_AC_CONTACTOR, // reg: 0x06
  78. REG_RES_LEN_UPDATE, // reg: 0x07
  79. REG_RES_LEN_PARALLEL_RELAY, // reg: 0x08
  80. };
  81. void ShowSocketData(struct PACKET_STRUCTURE *packet)
  82. {
  83. printf("se: %02X, id: %02X, op: %d, len: %3d, reg: %02X",
  84. packet->Header.se, packet->Header.id, packet->Header.op, packet->Header.len, packet->Payload.reg);
  85. if(packet->Header.len > 1)
  86. {
  87. printf(", Data:");
  88. for(int i = 0; i < packet->Header.len - 1; i++)
  89. {
  90. printf(" %02X", packet->Payload.data[i]);
  91. }
  92. }
  93. printf("\n");
  94. }
  95. //==========================================
  96. // Init all share memory
  97. //==========================================
  98. int InitShareMemory(void)
  99. {
  100. int result = PASS;
  101. int MeterSMId;
  102. //creat ShmSysConfigAndInfo
  103. if ((MeterSMId = shmget(ShmSysConfigAndInfoKey, sizeof(struct SysConfigAndInfo), 0777)) < 0)
  104. {
  105. #ifdef SystemLogMessage
  106. LOG_ERROR("shmget ShmSysConfigAndInfo NG");
  107. #endif
  108. result = FAIL;
  109. }
  110. else if ((ShmSysConfigAndInfo = shmat(MeterSMId, NULL, 0)) == (void *) -1)
  111. {
  112. #ifdef SystemLogMessage
  113. LOG_ERROR("shmat ShmSysConfigAndInfo NG");
  114. #endif
  115. result = FAIL;
  116. }
  117. else
  118. {
  119. }
  120. if ((MeterSMId = shmget(SM_ChargerInfoKey, sizeof(ChargerInfoData), 0777)) < 0)
  121. {
  122. #ifdef SystemLogMessage
  123. LOG_ERROR("shmat ChargerInfoData NG");
  124. #endif
  125. result = FAIL;
  126. }
  127. else if ((ShmChargerInfo = shmat(MeterSMId, NULL, 0)) == (void *) -1)
  128. {
  129. #ifdef SystemLogMessage
  130. LOG_ERROR("shmat ChargerInfoData NG");
  131. #endif
  132. result = FAIL;
  133. }
  134. if ((MeterSMId = shmget(ShmPsuKey, sizeof(struct PsuData), 0777)) < 0)
  135. {
  136. #ifdef SystemLogMessage
  137. LOG_ERROR("shmget ShmPsuData NG");
  138. #endif
  139. result = FAIL;
  140. }
  141. else if ((ShmPsuData = shmat(MeterSMId, NULL, 0)) == (void *) -1)
  142. {
  143. #ifdef SystemLogMessage
  144. LOG_ERROR("shmat ShmPsuData NG");
  145. #endif
  146. result = FAIL;
  147. }
  148. if(result == PASS)
  149. {
  150. ShmGroupCollection = &ShmChargerInfo->PsuGrouping.GroupCollection[0];
  151. }
  152. return result;
  153. }
  154. void InitialConnector(void)
  155. {
  156. for(int i = 0; i < CONNECTOR_QUANTITY; i++)
  157. {
  158. chargingInfo[i] = &ShmSysConfigAndInfo->SysInfo.ConnectorInfo[i].GeneralChargingData;
  159. }
  160. }
  161. void SlaveCabinetCheckInUpdate(void)
  162. {
  163. unsigned char slaveCnt = 0;
  164. for(int i = 0; i < MAX_SLAVE_CABINET_QUANTITY; i++)
  165. {
  166. if(ShmChargerInfo->ParallelCabinet.PCabinet[i].LocalStatus != _DS_None &&
  167. ShmChargerInfo->ParallelCabinet.PCabinet[i].LocalStatus != _DS_Timeout)
  168. {
  169. slaveCnt++;
  170. }
  171. }
  172. ShmChargerInfo->ParallelCabinet.PresentParallelCabinetQuantity = slaveCnt;
  173. if(slaveCnt > ShmChargerInfo->ParallelCabinet.ParallelCabinetQuantity)
  174. {
  175. ShmChargerInfo->ParallelCabinet.ParallelCabinetQuantity = slaveCnt;
  176. }
  177. }
  178. void SetSlaveCabinetStatus(unsigned char DeviceIndex, unsigned char status)
  179. {
  180. if(DeviceIndex < MAX_SLAVE_CABINET_QUANTITY)
  181. {
  182. switch(status)
  183. {
  184. case _DS_Identification:
  185. case _DS_Alarm:
  186. case _DS_Charging:
  187. ShmChargerInfo->ParallelCabinet.PCabinet[DeviceIndex].LocalStatus = status;
  188. break;
  189. case _DS_Idle:
  190. if(ShmChargerInfo->ParallelCabinet.PCabinet[DeviceIndex].LocalStatus != status)
  191. {
  192. ShmChargerInfo->ParallelCabinet.PCabinet[DeviceIndex].ParallelRequest = YES;
  193. }
  194. ShmChargerInfo->ParallelCabinet.PCabinet[DeviceIndex].LocalStatus = status;
  195. break;
  196. case _DS_Timeout:
  197. memset(&ShmChargerInfo->ParallelCabinet.PCabinet[DeviceIndex], 0x00, sizeof(SlaveCabinetInfoData));
  198. ShmChargerInfo->ParallelCabinet.PCabinet[DeviceIndex].LocalStatus = status;
  199. break;
  200. case _DS_None:
  201. default:
  202. memset(&ShmChargerInfo->ParallelCabinet.PCabinet[DeviceIndex], 0x00, sizeof(SlaveCabinetInfoData));
  203. break;
  204. }
  205. }
  206. }
  207. void SlaveCabinetIpConflictedCheck(void)
  208. {
  209. unsigned char DuplicatedConfirm[MAX_SLAVE_CABINET_QUANTITY];
  210. struct timespec _Conflicted_Time[MAX_SLAVE_CABINET_QUANTITY];
  211. memset(DuplicatedConfirm, 0x00, MAX_SLAVE_CABINET_QUANTITY);
  212. while(1)
  213. {
  214. for(int i = 0; i < MAX_SLAVE_CABINET_QUANTITY; i++)
  215. {
  216. if(ShmChargerInfo->ParallelCabinet.PCabinet[i].IpDuplicatedFlag == true)
  217. {
  218. if(DuplicatedConfirm[i] == false)
  219. {
  220. DuplicatedConfirm[i] = true;
  221. GetClockTime(&_Conflicted_Time[i]);
  222. LOG_INFO("Slave Cabinet %d IP Conflicted Confirm", i + 1);
  223. }
  224. else
  225. {
  226. if((GetTimeoutValue(_Conflicted_Time[i]) / mSEC_VAL) >= IP_CONFLICTED_TIME)
  227. {
  228. // reach here only when MCabinetCommProcess is stopped
  229. if(ShmChargerInfo->ParallelCabinet.PCabinet[i].LocalStatus != _DS_None &&
  230. ShmChargerInfo->ParallelCabinet.PCabinet[i].LocalStatus != _DS_Timeout)
  231. {
  232. unsigned char channel = ShmChargerInfo->ParallelCabinet.PCabinet[i].SocketChannel;
  233. if(ShmChargerInfo->CabinetConnInfo[channel].Status != _SCONN_FREE)
  234. {
  235. SetSlaveCabinetStatus(i, _DS_Timeout);
  236. SlaveCabinetCheckInUpdate();
  237. memset(&ShmChargerInfo->CabinetConnInfo[channel], 0x00, sizeof(SocketConnInfoData));
  238. LOG_INFO("Cabinet ConnInfo Channel %d Clean", channel);
  239. }
  240. }
  241. ShmChargerInfo->ParallelCabinet.PCabinet[i].IpDuplicatedFlag = false;
  242. DuplicatedConfirm[i] = false;
  243. LOG_INFO("Slave Cabinet %d IP Conflicted Stop", i + 1);
  244. }
  245. }
  246. }
  247. }
  248. usleep(500000);
  249. }
  250. }
  251. int ConflictedCabinetCheck(void)
  252. {
  253. pid_t forkId;
  254. forkId = fork();
  255. if(forkId == 0)
  256. {
  257. SlaveCabinetIpConflictedCheck();
  258. return forkId;
  259. }
  260. else if(forkId == -1)
  261. {
  262. LOG_INFO("fork fail");
  263. }
  264. return forkId;
  265. }
  266. int GetFreeSocketChannel(SocketConnInfoData *SocketConn, int Len)
  267. {
  268. for(int i = 0; i < Len; i++)
  269. {
  270. if(SocketConn[i].Status == _SCONN_FREE)
  271. {
  272. return i;
  273. }
  274. }
  275. return FAIL;
  276. }
  277. bool IsConflictCabinetIp(uint32_t ipAddress)
  278. {
  279. for(int i = 0; i < ARRAY_SIZE(ShmChargerInfo->CabinetConnInfo); i++)
  280. {
  281. if(ShmChargerInfo->CabinetConnInfo[i].IpAddress == ipAddress)
  282. {
  283. int slaveCabinet = ShmChargerInfo->CabinetConnInfo[i].DeviceIndex;
  284. if(slaveCabinet < MAX_SLAVE_CABINET_QUANTITY)
  285. {
  286. if(ShmChargerInfo->ParallelCabinet.PCabinet[slaveCabinet].IpDuplicatedFlag == false)
  287. {
  288. ShmChargerInfo->ParallelCabinet.PCabinet[slaveCabinet].IpDuplicatedFlag = true;
  289. }
  290. return true;
  291. }
  292. }
  293. }
  294. return false;
  295. }
  296. bool FindSlaveCabinet(unsigned char DeviceIndex, unsigned char ID)
  297. {
  298. bool find = false;
  299. if(ShmChargerInfo->ParallelCabinet.PCabinet[DeviceIndex].SlaveID == ID)
  300. {
  301. find = true;
  302. }
  303. return find;
  304. }
  305. void SendPacket(int socket, struct PACKET_STRUCTURE *packet)
  306. {
  307. //ShowSocketData(packet);
  308. //send(socket, packet, packet->Header.len + 4, 0);
  309. send(socket, packet, packet->Header.len + 4, MSG_NOSIGNAL);
  310. }
  311. // Reg: 0x01, Slave Cabinet Model Name Handler
  312. // allow slave cabinet switch value: 2 ~ 5
  313. // allow slave cabinet ip address: 31 ~ 34
  314. // return legal id: 1 ~ 4
  315. unsigned char MCabinetModelNameHandler(unsigned char connIndex, struct PACKET_STRUCTURE *packet)
  316. {
  317. unsigned char modelName[64];
  318. unsigned char cabinetId = 0;
  319. memset(modelName, 0x00, 64);
  320. memcpy(modelName, packet->Payload.data, packet->Header.len - 1);
  321. cabinetId = (ShmChargerInfo->CabinetConnInfo[connIndex].IpAddress >> 24) & 0xFF;
  322. if(cabinetId <= 30 || cabinetId > (30 + MAX_SLAVE_CABINET_QUANTITY))
  323. {
  324. LOG_INFO("Slave Cabinet DeviceID Out Of Range(%d), Model Name: %s", cabinetId, modelName);
  325. cabinetId = 0;
  326. }
  327. else
  328. {
  329. cabinetId -= 30;
  330. LOG_INFO("Slave Cabinet Check In, Device ID: %d, Model Name: %s", cabinetId, modelName);
  331. memcpy(ShmChargerInfo->ParallelCabinet.PCabinet[cabinetId - 1].ModelName, modelName, packet->Header.len - 1);
  332. ShmChargerInfo->ParallelCabinet.PCabinet[cabinetId - 1].SocketChannel = connIndex;
  333. }
  334. return cabinetId;
  335. }
  336. // Reg: 0x01, Slave Cabinet Model Name Response
  337. void MCabinetModelNameResponse(int socket, struct PACKET_STRUCTURE *packet, unsigned char result)
  338. {
  339. struct PACKET_STRUCTURE sendBuffer;
  340. memset(&sendBuffer, 0x00, sizeof(sendBuffer));
  341. sendBuffer.Header.se = packet->Header.se;
  342. sendBuffer.Header.id = 0xFF;
  343. sendBuffer.Header.op = _Header_Response;
  344. sendBuffer.Header.len = 2;
  345. sendBuffer.Payload.reg = _Reg_Dispenser_Model_Name;
  346. sendBuffer.Payload.data[0] = result;
  347. SendPacket(socket, &sendBuffer);
  348. }
  349. // Reg: 0x02, Slave Cabinet ID Response
  350. void MCabinetIDResponse(int socket, struct PACKET_STRUCTURE *packet, unsigned char result, unsigned char DeviceIndex)
  351. {
  352. struct PACKET_STRUCTURE sendBuffer;
  353. memset(&sendBuffer, 0x00, sizeof(sendBuffer));
  354. sendBuffer.Header.se = packet->Header.se;
  355. sendBuffer.Header.id = 0xFF;
  356. sendBuffer.Header.op = _Header_Response;
  357. sendBuffer.Header.len = 3;
  358. sendBuffer.Payload.reg = _Reg_SCabinet_ID;
  359. sendBuffer.Payload.data[0] = result;
  360. sendBuffer.Payload.data[1] = ShmChargerInfo->ParallelCabinet.PCabinet[DeviceIndex].SlaveID;
  361. SendPacket(socket, &sendBuffer);
  362. }
  363. // Reg: 0x04, Slave Cabinet Status Handler
  364. bool MCabinetStatusHandler(struct PACKET_STRUCTURE *packet, unsigned char DeviceIndex)
  365. {
  366. bool find = FindSlaveCabinet(DeviceIndex, packet->Header.id);
  367. bool chagne = false;
  368. struct WARNING_CODE_INFO warning;
  369. if(find)
  370. {
  371. memset(&warning, 0x00, sizeof(struct WARNING_CODE_INFO));
  372. warning.WarningCount = (packet->Header.len - 1) / 6;
  373. if(warning.WarningCount > 10)
  374. {
  375. warning.WarningCount = 10;
  376. }
  377. for(int i = 0; i < warning.WarningCount; i++)
  378. {
  379. memcpy(&warning.WarningCode[i][0], &packet->Payload.data[i * 6], 6);
  380. }
  381. if(SlaveWarningInfo[DeviceIndex].WarningCount != warning.WarningCount)
  382. {
  383. chagne = true;
  384. }
  385. else
  386. {
  387. if(warning.WarningCount != 0)
  388. {
  389. for(int i = 0; i < warning.WarningCount; i++)
  390. {
  391. if(strcmp((char *)&SlaveWarningInfo[DeviceIndex].WarningCode[i][0], (char *)&warning.WarningCode[i][0]) != EQUAL)
  392. {
  393. chagne = true;
  394. break;
  395. }
  396. }
  397. }
  398. }
  399. if(chagne)
  400. {
  401. memcpy(&SlaveWarningInfo[DeviceIndex], &warning, sizeof(struct WARNING_CODE_INFO));
  402. char strSlaveDeviceStatus[128];
  403. sprintf(strSlaveDeviceStatus, "PCabinet %d, Status Code Len: %d",
  404. ShmChargerInfo->ParallelCabinet.PCabinet[DeviceIndex].SlaveID, SlaveWarningInfo[DeviceIndex].WarningCount);
  405. if(SlaveWarningInfo[DeviceIndex].WarningCount > 0)
  406. {
  407. for(int i = 0; i < SlaveWarningInfo[DeviceIndex].WarningCount; i++)
  408. {
  409. char strTemp[16];
  410. sprintf(strTemp, ", %s", SlaveWarningInfo[DeviceIndex].WarningCode[i]);
  411. strcat(strSlaveDeviceStatus, strTemp);
  412. }
  413. }
  414. LOG_INFO("%s", strSlaveDeviceStatus);
  415. }
  416. }
  417. else
  418. {
  419. // do nothing
  420. }
  421. return find;
  422. }
  423. // Reg: 0x04, Slave Cabinet Status Response
  424. void MCabinetStatusResponse(int socket, struct PACKET_STRUCTURE *packet, unsigned char result, unsigned char DeviceIndex)
  425. {
  426. struct PACKET_STRUCTURE sendBuffer;
  427. memset(&sendBuffer, 0x00, sizeof(sendBuffer));
  428. sendBuffer.Header.se = packet->Header.se;
  429. sendBuffer.Header.id = packet->Header.id;
  430. sendBuffer.Header.op = _Header_Response;
  431. sendBuffer.Header.len = 2;
  432. sendBuffer.Payload.reg = _Reg_SCabinet_Status;
  433. sendBuffer.Payload.data[0] = result;
  434. SendPacket(socket, &sendBuffer);
  435. }
  436. // Reg: 0x05, Output Relay Status Handler
  437. bool MCabinetOutputRelayHandler(struct PACKET_STRUCTURE *packet, unsigned char DeviceIndex)
  438. {
  439. bool find = FindSlaveCabinet(DeviceIndex, packet->Header.id);
  440. bool chagne = false;
  441. unsigned char relayState[MAX_GROUP_QUANTITY];
  442. unsigned char *slaveRelayState;
  443. if(find)
  444. {
  445. if((packet->Header.len - 1) >= MAX_GROUP_QUANTITY)
  446. {
  447. slaveRelayState = &ShmChargerInfo->ParallelCabinet.PCabinet[DeviceIndex].GunOutputRelayState[0];
  448. memcpy(relayState, &packet->Payload.data, MAX_GROUP_QUANTITY);
  449. for(int i = 0; i < MAX_GROUP_QUANTITY; i++)
  450. {
  451. if(slaveRelayState[i] != relayState[i])
  452. {
  453. chagne = true;
  454. break;
  455. }
  456. }
  457. if(chagne)
  458. {
  459. memcpy(slaveRelayState, relayState, MAX_GROUP_QUANTITY);
  460. char strRelayStatus[128];
  461. sprintf(strRelayStatus, "PCabinet %d Output Relay", DeviceIndex + 1);
  462. for(int i = 0; i < MAX_GROUP_QUANTITY; i++)
  463. {
  464. char strTemp[16];
  465. sprintf(strTemp, " Gun %d %3s", i + 1, slaveRelayState[i] > 0 ? "ON" : "OFF");
  466. strcat(strRelayStatus, strTemp);
  467. }
  468. LOG_INFO("%s", strRelayStatus);
  469. }
  470. }
  471. }
  472. else
  473. {
  474. // do nothing
  475. }
  476. return find;
  477. }
  478. // Reg: 0x05, Output Relay Status Response
  479. void MCabinetOutputRelayResponse(int socket, struct PACKET_STRUCTURE *packet, unsigned char result, unsigned char DeviceIndex)
  480. {
  481. struct PACKET_STRUCTURE sendBuffer;
  482. unsigned char *slaveRelayState;
  483. slaveRelayState = &ShmChargerInfo->ParallelCabinet.PCabinet[DeviceIndex].OutputRelaySetting[0];
  484. memset(&sendBuffer, 0x00, sizeof(sendBuffer));
  485. sendBuffer.Header.se = packet->Header.se;
  486. sendBuffer.Header.id = packet->Header.id;
  487. sendBuffer.Header.op = _Header_Response;
  488. sendBuffer.Header.len = 6;
  489. sendBuffer.Payload.reg = _Reg_OutputRelay_Status;
  490. sendBuffer.Payload.data[0] = result;
  491. sendBuffer.Payload.data[1] = result == _R_OK ? slaveRelayState[0] : Relay_OFF;
  492. sendBuffer.Payload.data[2] = result == _R_OK ? slaveRelayState[1] : Relay_OFF;
  493. sendBuffer.Payload.data[3] = result == _R_OK ? slaveRelayState[2] : Relay_OFF;
  494. sendBuffer.Payload.data[4] = result == _R_OK ? slaveRelayState[3] : Relay_OFF;
  495. SendPacket(socket, &sendBuffer);
  496. }
  497. // Reg: 0x06, Ac Contactor Status Handler
  498. bool MCabinetAcContactorHandler(struct PACKET_STRUCTURE *packet, unsigned char DeviceIndex)
  499. {
  500. bool find = FindSlaveCabinet(DeviceIndex, packet->Header.id);
  501. bool chagne = false;
  502. unsigned char contactorState;
  503. unsigned char *slaveContactorState;
  504. if(find)
  505. {
  506. if((packet->Header.len - 1) >= 1)
  507. {
  508. slaveContactorState = &ShmChargerInfo->ParallelCabinet.PCabinet[DeviceIndex].AcContactorState;
  509. contactorState = packet->Payload.data[0];
  510. if(*slaveContactorState != contactorState)
  511. {
  512. chagne = true;
  513. }
  514. if(chagne)
  515. {
  516. *slaveContactorState = contactorState;
  517. LOG_INFO("PCabinet %d AC Contactor State: %s", DeviceIndex + 1, *slaveContactorState > 0 ? "ON" : "OFF");
  518. }
  519. }
  520. }
  521. else
  522. {
  523. // do nothing
  524. }
  525. return find;
  526. }
  527. // Reg: 0x06, Ac Contactor Status Response
  528. void MCabinetAcContactorResponse(int socket, struct PACKET_STRUCTURE *packet, unsigned char result, unsigned char DeviceIndex)
  529. {
  530. struct PACKET_STRUCTURE sendBuffer;
  531. unsigned char slaveContactorState = ShmChargerInfo->ParallelCabinet.PCabinet[DeviceIndex].AcContactorSetting;
  532. memset(&sendBuffer, 0x00, sizeof(sendBuffer));
  533. sendBuffer.Header.se = packet->Header.se;
  534. sendBuffer.Header.id = packet->Header.id;
  535. sendBuffer.Header.op = _Header_Response;
  536. sendBuffer.Header.len = 3;
  537. sendBuffer.Payload.reg = _Reg_AcContactor_Status;
  538. sendBuffer.Payload.data[0] = result;
  539. sendBuffer.Payload.data[1] = result == _R_OK ? slaveContactorState : Relay_OFF;
  540. SendPacket(socket, &sendBuffer);
  541. }
  542. // Reg: 0x07, Slave Cabinet Firmware Upgrade Handler
  543. bool MCabinetFwUpgradeHandler(struct PACKET_STRUCTURE *packet, unsigned char DeviceIndex)
  544. {
  545. bool find = FindSlaveCabinet(DeviceIndex, packet->Header.id);
  546. bool chagne = false;
  547. unsigned char updateState;
  548. unsigned char *slaveUpdateState;
  549. char *strUpdate[] = {"Not Update", "Updating", "Updated"};
  550. if(find)
  551. {
  552. if((packet->Header.len - 1) >= 1)
  553. {
  554. slaveUpdateState = &ShmChargerInfo->ParallelCabinet.PCUpdateState[DeviceIndex];
  555. updateState = packet->Payload.data[0];
  556. if(*slaveUpdateState != updateState)
  557. {
  558. chagne = true;
  559. }
  560. if(chagne)
  561. {
  562. switch(updateState)
  563. {
  564. case Updated:
  565. ShmChargerInfo->ParallelCabinet.PCabinet[DeviceIndex].UpdateRequest = NO;
  566. break;
  567. }
  568. *slaveUpdateState = updateState;
  569. LOG_INFO("PCabinet %d Update State: %s", DeviceIndex + 1, *slaveUpdateState <= Updated ? strUpdate[*slaveUpdateState] : "Unknown");
  570. }
  571. }
  572. }
  573. else
  574. {
  575. }
  576. return find;
  577. }
  578. // Reg: 0x07, Slave Cabinet Firmware Upgrade Response
  579. void MCabinetUpgradeResponse(int socket, struct PACKET_STRUCTURE *packet, unsigned char result, unsigned char DeviceIndex)
  580. {
  581. struct PACKET_STRUCTURE sendBuffer;
  582. unsigned char slaveUpdateRequest = ShmChargerInfo->ParallelCabinet.PCabinet[DeviceIndex].UpdateRequest;
  583. memset(&sendBuffer, 0x00, sizeof(sendBuffer));
  584. sendBuffer.Header.se = packet->Header.se;
  585. sendBuffer.Header.id = packet->Header.id;
  586. sendBuffer.Header.op = _Header_Response;
  587. sendBuffer.Header.len = 3;
  588. sendBuffer.Payload.reg = _Reg_SCabinet_FwUpdate;
  589. sendBuffer.Payload.data[0] = result;
  590. if(result == _R_OK)
  591. {
  592. sendBuffer.Payload.data[1] = slaveUpdateRequest > 0 ? _R_NeedUpgrade : _R_NoUpgrade;
  593. if(slaveUpdateRequest > 0)
  594. {
  595. int length = strlen(ShmChargerInfo->ParallelCabinet.PCabinet[DeviceIndex].FwFileName);
  596. memcpy(&sendBuffer.Payload.data[2], ShmChargerInfo->ParallelCabinet.PCabinet[DeviceIndex].FwFileName, length);
  597. sendBuffer.Header.len += length;
  598. if(PCabinetUpdateRequest[DeviceIndex] != slaveUpdateRequest)
  599. {
  600. LOG_INFO("MCabinet >> PCabinet %d Start Upgrade: %s", DeviceIndex + 1, ShmChargerInfo->ParallelCabinet.PCabinet[DeviceIndex].FwFileName);
  601. }
  602. }
  603. PCabinetUpdateRequest[DeviceIndex] = slaveUpdateRequest;
  604. }
  605. SendPacket(socket, &sendBuffer);
  606. }
  607. // Reg: 0x08, Parallel Relay Status Handler
  608. bool MCabinetParallelRelayHandler(struct PACKET_STRUCTURE *packet, unsigned char DeviceIndex)
  609. {
  610. bool find = FindSlaveCabinet(DeviceIndex, packet->Header.id);
  611. bool chagne = false;
  612. unsigned char relayState[MAX_GROUP_QUANTITY];
  613. unsigned char *slaveRelayState;
  614. if(find)
  615. {
  616. if((packet->Header.len - 1) >= MAX_GROUP_QUANTITY)
  617. {
  618. slaveRelayState = &ShmChargerInfo->ParallelCabinet.PCabinet[DeviceIndex].ParallelRelayState[0];
  619. memcpy(relayState, &packet->Payload.data, MAX_GROUP_QUANTITY);
  620. for(int i = 0; i < MAX_GROUP_QUANTITY; i++)
  621. {
  622. if(slaveRelayState[i] != relayState[i])
  623. {
  624. chagne = true;
  625. break;
  626. }
  627. }
  628. if(chagne)
  629. {
  630. memcpy(slaveRelayState, relayState, MAX_GROUP_QUANTITY);
  631. char strRelayStatus[128];
  632. sprintf(strRelayStatus, "PCabinet %d Parallel Relay", DeviceIndex + 1);
  633. for(int i = 0; i < MAX_GROUP_QUANTITY; i++)
  634. {
  635. char strTemp[16];
  636. sprintf(strTemp, " Location %d %3s", i + 1, slaveRelayState[i] > 0 ? "ON" : "OFF");
  637. strcat(strRelayStatus, strTemp);
  638. }
  639. LOG_INFO("%s", strRelayStatus);
  640. }
  641. }
  642. }
  643. else
  644. {
  645. // do nothing
  646. }
  647. return find;
  648. }
  649. // Reg: 0x08, Parallel Relay Status Response
  650. void MCabinetParallelRelayResponse(int socket, struct PACKET_STRUCTURE *packet, unsigned char result, unsigned char DeviceIndex)
  651. {
  652. struct PACKET_STRUCTURE sendBuffer;
  653. unsigned char *slaveRelayState;
  654. slaveRelayState = &ShmChargerInfo->ParallelCabinet.PCabinet[DeviceIndex].ParallelRelaySetting[0];
  655. memset(&sendBuffer, 0x00, sizeof(sendBuffer));
  656. sendBuffer.Header.se = packet->Header.se;
  657. sendBuffer.Header.id = packet->Header.id;
  658. sendBuffer.Header.op = _Header_Response;
  659. sendBuffer.Header.len = 6;
  660. sendBuffer.Payload.reg = _Reg_ParallelRelay_Status;
  661. sendBuffer.Payload.data[0] = result;
  662. sendBuffer.Payload.data[1] = result == _R_OK ? slaveRelayState[0] : Relay_OFF;
  663. sendBuffer.Payload.data[2] = result == _R_OK ? slaveRelayState[1] : Relay_OFF;
  664. sendBuffer.Payload.data[3] = result == _R_OK ? slaveRelayState[2] : Relay_OFF;
  665. sendBuffer.Payload.data[4] = result == _R_OK ? slaveRelayState[3] : Relay_OFF;
  666. SendPacket(socket, &sendBuffer);
  667. }
  668. int BufferRePacket(int dataLength, unsigned char *buffer, struct PACKET_STRUCTURE *packet)
  669. {
  670. int totalLength = 0, packetCnt = 0, singleLength = 0;
  671. struct PACKET_STRUCTURE *tempPacket;
  672. while(dataLength > 0)
  673. {
  674. tempPacket = (struct PACKET_STRUCTURE *)&buffer[totalLength];
  675. singleLength = tempPacket->Header.len + PACKET_HEADER_LENGTH;
  676. if(dataLength >= singleLength)
  677. {
  678. totalLength += singleLength;
  679. dataLength -= singleLength;
  680. memset(&packet[packetCnt], 0x00, sizeof(struct PACKET_STRUCTURE));
  681. memcpy(&packet[packetCnt], tempPacket, singleLength);
  682. packetCnt++;
  683. }
  684. else
  685. {
  686. LOG_INFO("Packet[%d] is incomplete(%d/%d)", packetCnt, dataLength, singleLength);
  687. dataLength = 0;
  688. }
  689. }
  690. return packetCnt;
  691. }
  692. void MCabinetPacketHandler(int socketFd, unsigned char socketIndex, struct PACKET_STRUCTURE *packet)
  693. {
  694. unsigned char ackResult = _R_NG;
  695. unsigned char deviceIndex = 0;
  696. if(ShmChargerInfo->CabinetConnInfo[socketIndex].Status == _SCONN_WAIT)
  697. {
  698. // Reg: 0x01, Dispenser model name
  699. if(packet->Header.op == _Header_Write && packet->Payload.reg == _Reg_SCabinet_Model_Name)
  700. {
  701. unsigned char deviceID = MCabinetModelNameHandler(socketIndex, packet);
  702. if(deviceID > 0)
  703. {
  704. ackResult = _R_OK;
  705. deviceIndex = deviceID - 1;
  706. }
  707. MCabinetModelNameResponse(socketFd, packet, ackResult);
  708. ShmChargerInfo->CabinetConnInfo[socketIndex].Status = ackResult == _R_OK ? _SCONN_MATCHED : _SCONN_WAIT;
  709. ShmChargerInfo->CabinetConnInfo[socketIndex].DeviceIndex = deviceIndex;
  710. if(ackResult == _R_OK)
  711. {
  712. ShmChargerInfo->ParallelCabinet.PCabinet[deviceIndex].SlaveID = deviceID;
  713. SetSlaveCabinetStatus(deviceIndex, _DS_Identification);
  714. SlaveCabinetCheckInUpdate();
  715. }
  716. }
  717. else
  718. {
  719. // do nothing
  720. }
  721. // do not clear timeout value, then close socket when timeout value exceed SOCKET_RECEIVE_INTERVAL
  722. }
  723. else if(ShmChargerInfo->CabinetConnInfo[socketIndex].Status == _SCONN_MATCHED)
  724. {
  725. deviceIndex = ShmChargerInfo->CabinetConnInfo[socketIndex].DeviceIndex;
  726. // Reg: 0x01, Dispenser model name
  727. if(packet->Header.op == _Header_Write && packet->Payload.reg == _Reg_SCabinet_Model_Name)
  728. {
  729. ackResult = _R_OK;
  730. MCabinetModelNameResponse(socketFd, packet, ackResult);
  731. }
  732. // Reg: 0x02, Slave Cabinet ID
  733. if(packet->Header.op == _Header_Read && packet->Payload.reg == _Reg_SCabinet_ID)
  734. {
  735. ackResult = _R_OK;
  736. SetSlaveCabinetStatus(deviceIndex, _DS_Idle);
  737. MCabinetIDResponse(socketFd, packet, ackResult, deviceIndex);
  738. }
  739. // Reg: 0x04, Slave Cabinet Status
  740. if(packet->Header.op == _Header_Write && packet->Payload.reg == _Reg_SCabinet_Status)
  741. {
  742. if(MCabinetStatusHandler(packet, deviceIndex))
  743. {
  744. ackResult = _R_OK;
  745. }
  746. MCabinetStatusResponse(socketFd, packet, ackResult, deviceIndex);
  747. }
  748. // Reg: 0x05, Sync Output Relay Status
  749. if(packet->Header.op == _Header_Read && packet->Payload.reg == _Reg_OutputRelay_Status)
  750. {
  751. if(MCabinetOutputRelayHandler(packet, deviceIndex))
  752. {
  753. ackResult = _R_OK;
  754. }
  755. MCabinetOutputRelayResponse(socketFd, packet, ackResult, deviceIndex);
  756. }
  757. // Reg: 0x06, Sync Ac Contactor Status
  758. if(packet->Header.op == _Header_Read && packet->Payload.reg == _Reg_AcContactor_Status)
  759. {
  760. if(MCabinetAcContactorHandler(packet, deviceIndex))
  761. {
  762. ackResult = _R_OK;
  763. }
  764. MCabinetAcContactorResponse(socketFd, packet, ackResult, deviceIndex);
  765. }
  766. // Reg: 0x07, Fw Update
  767. if(packet->Header.op == _Header_Read && packet->Payload.reg == _Reg_SCabinet_FwUpdate)
  768. {
  769. if(MCabinetFwUpgradeHandler(packet, deviceIndex))
  770. {
  771. ackResult = _R_OK;
  772. }
  773. MCabinetUpgradeResponse(socketFd, packet, ackResult, deviceIndex);
  774. }
  775. // Reg: 0x08, Sync Parallel Relay Status
  776. if(packet->Header.op == _Header_Read && packet->Payload.reg == _Reg_ParallelRelay_Status)
  777. {
  778. if(MCabinetParallelRelayHandler(packet, deviceIndex))
  779. {
  780. ackResult = _R_OK;
  781. }
  782. MCabinetParallelRelayResponse(socketFd, packet, ackResult, deviceIndex);
  783. }
  784. }
  785. }
  786. void MCabinetCommProcess(int socketFd, struct sockaddr_in clientInfo, unsigned char socketIndex)
  787. {
  788. int rxLen = 0, packetCnt = 0;
  789. unsigned char dataBuffer[MAX_DATA_BUFFER_LEN];
  790. struct PACKET_STRUCTURE packetBuffer[MAX_PACKET_BUFFER_LEN];
  791. struct timespec _MCabinet_timeout;
  792. LOG_INFO("Start Slave Cabinet Communication Process, IP %s connection(%d), PID = %d", (inet_ntoa(clientInfo.sin_addr)), socketIndex, getpid());
  793. GetClockTime(&_MCabinet_timeout);
  794. while(1)
  795. {
  796. if((rxLen = recv(socketFd, &dataBuffer[0], MAX_DATA_BUFFER_LEN, MSG_DONTWAIT )) > 0)
  797. {
  798. packetCnt = BufferRePacket(rxLen, &dataBuffer[0], &packetBuffer[0]);
  799. if(packetCnt > 0)
  800. {
  801. //LOG_INFO("Socket[%d] %d packet received", socketIndex, packetCnt);
  802. for(int i = 0; i < packetCnt; i++)
  803. {
  804. //ShowSocketData(&packetBuffer[i]);
  805. MCabinetPacketHandler(socketFd, socketIndex, &packetBuffer[i]);
  806. }
  807. if(ShmChargerInfo->CabinetConnInfo[socketIndex].Status == _SCONN_MATCHED)
  808. {
  809. // clear timeout value
  810. GetClockTime(&_MCabinet_timeout);
  811. }
  812. }
  813. }
  814. else
  815. {
  816. usleep((SOCKET_RECEIVE_INTERVAL * 1000));
  817. }
  818. if(GetTimeoutValue(_MCabinet_timeout) / uSEC_VAL >= MASTER_SLAVE_CABINET_TIMEOUT)
  819. {
  820. //timeout
  821. LOG_INFO("Slave Cabinet IP: %s, Socket %d Communication Timeout", (inet_ntoa(clientInfo.sin_addr)), socketIndex);
  822. if(ShmChargerInfo->CabinetConnInfo[socketIndex].Status == _SCONN_MATCHED)
  823. {
  824. SetSlaveCabinetStatus(ShmChargerInfo->CabinetConnInfo[socketIndex].DeviceIndex, _DS_Timeout);
  825. SlaveCabinetCheckInUpdate();
  826. }
  827. break;
  828. }
  829. if(ShmChargerInfo->CabinetConnInfo[socketIndex].Status == _SCONN_MATCHED)
  830. {
  831. if(ShmChargerInfo->ParallelCabinet.PCabinet[ShmChargerInfo->CabinetConnInfo[socketIndex].DeviceIndex].IpDuplicatedFlag == true)
  832. {
  833. LOG_INFO("Slave Cabinet %d has been kick", ShmChargerInfo->CabinetConnInfo[socketIndex].DeviceIndex + 1);
  834. SetSlaveCabinetStatus(ShmChargerInfo->CabinetConnInfo[socketIndex].DeviceIndex, _DS_Timeout);
  835. SlaveCabinetCheckInUpdate();
  836. break;
  837. }
  838. }
  839. }
  840. }
  841. void InitMasterCabinetInfo(void)
  842. {
  843. for(int i = 0; i < MAX_SLAVE_CABINET_QUANTITY; i++)
  844. {
  845. memset(&SlaveWarningInfo[i], 0x00, sizeof(struct WARNING_CODE_INFO));
  846. }
  847. }
  848. bool IsReadyAcceptSlaveCabinet(void)
  849. {
  850. bool ready = true;
  851. for(int i = 0; i < ShmChargerInfo->Control.MaxConnector; i++)
  852. {
  853. if (chargingInfo[i]->SystemStatus != S_IDLE && chargingInfo[i]->SystemStatus != S_MAINTAIN)
  854. {
  855. ready = false;
  856. break;
  857. }
  858. }
  859. return ready;
  860. }
  861. int MasterCabinetProcess(void)
  862. {
  863. int sockFd = 0;
  864. int clientSockFd = 0;
  865. int connIndex = 0;
  866. int bindStatus = 0;
  867. int reuseaddr = 1;
  868. pid_t forkId;
  869. bool isConflict = false, isReady = false, preReady = false;
  870. struct sockaddr_in serverInfo, clientInfo;
  871. socklen_t addrlen = sizeof(clientInfo);
  872. sockFd = socket(AF_INET, SOCK_STREAM, 0);
  873. if(sockFd == -1)
  874. {
  875. LOG_INFO("InitSocketServer NG\n");
  876. sleep(5);
  877. return FAIL;
  878. }
  879. setsockopt(sockFd, SOL_SOCKET, SO_REUSEADDR, &reuseaddr, sizeof(reuseaddr));
  880. InitMasterCabinetInfo();
  881. bzero(&serverInfo,sizeof(serverInfo));
  882. serverInfo.sin_family = PF_INET;
  883. serverInfo.sin_addr.s_addr = htonl(INADDR_ANY);
  884. serverInfo.sin_port = htons(MASTER_TCP_LISTEN_PORT);
  885. bindStatus = bind(sockFd, (struct sockaddr *)&serverInfo, sizeof(serverInfo));
  886. if(bindStatus < 0)
  887. {
  888. LOG_INFO("Master Cabinet socket bind fail");
  889. return FAIL;
  890. }
  891. listen(sockFd, CONNECTION_LIMIT);
  892. LOG_INFO("Master Cabinet Server Start");
  893. signal(SIGCHLD, SIG_IGN);
  894. if(ConflictedCabinetCheck() <= 0)
  895. {
  896. // child process return here
  897. return 0;
  898. }
  899. // Main loop
  900. while(1)
  901. {
  902. clientSockFd = accept(sockFd, (struct sockaddr*) &clientInfo, &addrlen);
  903. isReady = IsReadyAcceptSlaveCabinet();
  904. if(isReady)
  905. {
  906. LOG_INFO("Slave Cabinet ip: %s is accepted at port: %d", inet_ntoa(clientInfo.sin_addr), clientInfo.sin_port);
  907. }
  908. else
  909. {
  910. // not ready
  911. if(preReady != isReady)
  912. {
  913. LOG_INFO("MCabinet Is Not Ready To Paralleling");
  914. }
  915. close(clientSockFd);
  916. preReady = isReady;
  917. continue;
  918. }
  919. preReady = isReady;
  920. connIndex = GetFreeSocketChannel(ShmChargerInfo->CabinetConnInfo, ARRAY_SIZE(ShmChargerInfo->CabinetConnInfo));
  921. if(connIndex >= 0)
  922. {
  923. isConflict = IsConflictCabinetIp(clientInfo.sin_addr.s_addr);
  924. if(isConflict == false)
  925. {
  926. ShmChargerInfo->CabinetConnInfo[connIndex].Status = _SCONN_WAIT;
  927. ShmChargerInfo->CabinetConnInfo[connIndex].IpAddress = clientInfo.sin_addr.s_addr;
  928. forkId = fork();
  929. if(forkId == 0)
  930. {
  931. // child process
  932. MCabinetCommProcess(clientSockFd, clientInfo, connIndex);
  933. close(clientSockFd);
  934. memset(&ShmChargerInfo->CabinetConnInfo[connIndex], 0x00, sizeof(SocketConnInfoData));
  935. return 0;
  936. }
  937. else if(forkId == -1)
  938. {
  939. LOG_INFO("Slave Cabinet Process Fork Fail");
  940. }
  941. }
  942. else
  943. {
  944. if(isConflict)
  945. {
  946. // conflict ip address
  947. LOG_INFO("Conflict Slave Cabinet IP address, Close Socket");
  948. }
  949. close(clientSockFd);
  950. memset(&ShmChargerInfo->CabinetConnInfo[connIndex], 0x00, sizeof(SocketConnInfoData));
  951. }
  952. }
  953. else
  954. {
  955. // no free channel
  956. LOG_INFO("No Free Cabinet Channel, Close Socket");
  957. close(clientSockFd);
  958. }
  959. usleep(10000);
  960. }
  961. return 0;
  962. }
  963. // ****************************** Slave ****************************** //
  964. unsigned char _modelNameAck = 0;
  965. unsigned char _idAck = 0;
  966. unsigned char _header_SE = 0;
  967. struct timespec _regQreuyTime[PARALLEL_CABINET_REG_QUANTITY];
  968. int _regTimeout[PARALLEL_CABINET_REG_QUANTITY] =
  969. {
  970. REG_RSEND_TIME_NONE, // reg: 0x00
  971. REG_RSEND_TIME_MODELNAME, // reg: 0x01
  972. REG_RSEND_TIME_ID, // reg: 0x02
  973. REG_RSEND_TIME_REG03, // reg: 0x03
  974. REG_RSEND_TIME_STATUS, // reg: 0x04
  975. REG_RSEND_TIME_OUTPUT_RELAY, // reg: 0x05
  976. REG_RSEND_TIME_AC_CONTACTOR, // reg: 0x06
  977. REG_RSEND_TIME_UPDATE, // reg: 0x07
  978. REG_RSEND_TIME_PARALLEL_RELAY, // reg: 0x08
  979. };
  980. int ConnectToMasterCabinet(void)
  981. {
  982. int sockFd = 0;
  983. struct sockaddr_in serverInfo;
  984. struct timeval tv;
  985. sockFd = socket(AF_INET, SOCK_STREAM, 0);
  986. if(sockFd < 0)
  987. {
  988. LOG_INFO("Create Slave Cabinet Socket Fail");
  989. return -1;
  990. }
  991. tv.tv_sec = 3;
  992. tv.tv_usec = 0;
  993. setsockopt(sockFd, SOL_SOCKET, SO_RCVTIMEO, &tv, sizeof(struct timeval)); //設定等待3s
  994. setsockopt(sockFd, SOL_SOCKET, SO_SNDTIMEO, &tv, sizeof(struct timeval)); //設定傳送3s
  995. bzero(&serverInfo,sizeof(serverInfo));
  996. serverInfo.sin_family = AF_INET;
  997. serverInfo.sin_addr.s_addr = inet_addr(MASTER_ETH1_IP);
  998. serverInfo.sin_port = htons(MASTER_TCP_LISTEN_PORT);
  999. if(connect(sockFd, (struct sockaddr *)&serverInfo, sizeof(serverInfo)) < 0)
  1000. {
  1001. //LOG_INFO("Connect To Master Cabinet Error[%d]", errno);
  1002. close(sockFd);
  1003. return -1;
  1004. }
  1005. return sockFd;
  1006. }
  1007. void SendParallelPacket(int fd, unsigned char opCode, unsigned char length, unsigned char reg, unsigned char *data)
  1008. {
  1009. struct PACKET_STRUCTURE packet;
  1010. packet.Header.se = _header_SE++;
  1011. packet.Header.id = ShmChargerInfo->SCabinetControl.SCabinetID;
  1012. packet.Header.op = opCode;
  1013. packet.Header.len = length;
  1014. packet.Payload.reg = reg;
  1015. if(length > 1)
  1016. {
  1017. memcpy(packet.Payload.data, data, length - 1);
  1018. }
  1019. SendPacket(fd, &packet);
  1020. }
  1021. // reg: 0x01, Slave Cabinet Write Model Name
  1022. void SCabinetWriteModelName(int fd)
  1023. {
  1024. if(GetTimeoutValue(_regQreuyTime[_Reg_SCabinet_Model_Name]) / mSEC_VAL >= _regTimeout[_Reg_SCabinet_Model_Name])
  1025. {
  1026. SendParallelPacket(
  1027. fd,
  1028. _Header_Write,
  1029. strlen((char *)ShmSysConfigAndInfo->SysConfig.ModelName) + 1,
  1030. _Reg_SCabinet_Model_Name,
  1031. ShmSysConfigAndInfo->SysConfig.ModelName);
  1032. GetClockTime(&_regQreuyTime[_Reg_SCabinet_Model_Name]);
  1033. //LOG_INFO("SCabinet Write Model Nname...");
  1034. }
  1035. }
  1036. // reg: 0x01, Slave Cabinet Model Name Handler
  1037. unsigned char SCabinetModelNameHandler(struct PACKET_STRUCTURE *packet)
  1038. {
  1039. unsigned char ack = _R_NG;
  1040. if(packet->Header.len >= _regResLen[_Reg_SCabinet_Model_Name])
  1041. {
  1042. ack = packet->Payload.data[0] == _R_OK ? _R_OK : _R_NG;
  1043. if(_modelNameAck != ack)
  1044. {
  1045. LOG_INFO("SCabinet Write Model Name %s", ack == _R_OK ? "OK" : "NG");
  1046. }
  1047. _modelNameAck = ack;
  1048. }
  1049. return ack;
  1050. }
  1051. // reg: 0x02, Slave Cabinet Read ID
  1052. void SCabinetReadID(int fd)
  1053. {
  1054. if(GetTimeoutValue(_regQreuyTime[_Reg_SCabinet_ID]) / mSEC_VAL >= _regTimeout[_Reg_SCabinet_ID])
  1055. {
  1056. SendParallelPacket(
  1057. fd,
  1058. _Header_Read,
  1059. _regReqLen[_Reg_SCabinet_ID],
  1060. _Reg_SCabinet_ID,
  1061. 0);
  1062. GetClockTime(&_regQreuyTime[_Reg_SCabinet_ID]);
  1063. //LOG_INFO("SCabinet Read ID...");
  1064. }
  1065. }
  1066. // reg: 0x02, Slave Cabinet ID Handler
  1067. unsigned char SCabinetIDHandler(struct PACKET_STRUCTURE *packet)
  1068. {
  1069. unsigned char ack = _R_NG;
  1070. unsigned char id = 0;
  1071. if(packet->Header.len >= _regResLen[_Reg_SCabinet_ID])
  1072. {
  1073. ack = packet->Payload.data[0] == _R_OK ? _R_OK : _R_NG;
  1074. if(ack == _R_OK)
  1075. {
  1076. id = packet->Payload.data[1];
  1077. if(ShmChargerInfo->SCabinetControl.SCabinetID != id && id != 0)
  1078. {
  1079. ShmChargerInfo->SCabinetControl.SCabinetID = id;
  1080. LOG_INFO("Get SCabinet ID: %d", ShmChargerInfo->SCabinetControl.SCabinetID);
  1081. }
  1082. }
  1083. if(_idAck != ack)
  1084. {
  1085. LOG_INFO("SCabinet Read ID %s", ack == _R_OK ? "OK" : "NG");
  1086. }
  1087. }
  1088. return ack;
  1089. }
  1090. // reg: 0x04
  1091. void SCabinetWriteStatus(int fd)
  1092. {
  1093. bool chagne = false;
  1094. unsigned char statusCode[256];
  1095. if(ShmSysConfigAndInfo->SysWarningInfo.WarningCount != SlaveWarningInfo[0].WarningCount)
  1096. {
  1097. chagne = true;
  1098. }
  1099. else
  1100. {
  1101. if(ShmSysConfigAndInfo->SysWarningInfo.WarningCount != 0)
  1102. {
  1103. for(int i = 0; i < ShmSysConfigAndInfo->SysWarningInfo.WarningCount; i++)
  1104. {
  1105. if(strcmp((char *)&SlaveWarningInfo[0].WarningCode[i][0], (char *)&ShmSysConfigAndInfo->SysWarningInfo.WarningCode[i][0]) != EQUAL)
  1106. {
  1107. chagne = true;
  1108. break;
  1109. }
  1110. }
  1111. }
  1112. }
  1113. if(chagne)
  1114. {
  1115. memcpy(&SlaveWarningInfo[0], &ShmSysConfigAndInfo->SysWarningInfo, sizeof(struct WARNING_CODE_INFO));
  1116. }
  1117. if(GetTimeoutValue(_regQreuyTime[_Reg_SCabinet_Status]) / mSEC_VAL >= _regTimeout[_Reg_SCabinet_Status] || chagne)
  1118. {
  1119. for(int i = 0; i < ShmSysConfigAndInfo->SysWarningInfo.WarningCount; i++)
  1120. {
  1121. memcpy(&statusCode[i * 6], &ShmSysConfigAndInfo->SysWarningInfo.WarningCode[i][0], 6);
  1122. }
  1123. SendParallelPacket(
  1124. fd,
  1125. _Header_Write,
  1126. (ShmSysConfigAndInfo->SysWarningInfo.WarningCount * 6) + 1,
  1127. _Reg_SCabinet_Status,
  1128. &statusCode[0]);
  1129. GetClockTime(&_regQreuyTime[_Reg_SCabinet_Status]);
  1130. //LOG_INFO("SCabinet Write Status...");
  1131. }
  1132. }
  1133. // reg: 0x04, Slave Cabinet Status Handler
  1134. unsigned char SCabinetStatusHandler(struct PACKET_STRUCTURE *packet)
  1135. {
  1136. unsigned char ack = _R_NG;
  1137. if(packet->Header.id != ShmChargerInfo->SCabinetControl.SCabinetID)
  1138. {
  1139. return ack;
  1140. }
  1141. if(packet->Header.len >= _regResLen[_Reg_SCabinet_Status])
  1142. {
  1143. ack = packet->Payload.data[0] == _R_OK ? _R_OK : _R_NG;
  1144. }
  1145. return ack;
  1146. }
  1147. // reg: 0x05
  1148. void SCabinetReadOutputRelay(int fd)
  1149. {
  1150. unsigned char outputRelay[GENERAL_GUN_QUANTITY] = {0};
  1151. if(GetTimeoutValue(_regQreuyTime[_Reg_OutputRelay_Status]) / mSEC_VAL >= _regTimeout[_Reg_OutputRelay_Status])
  1152. {
  1153. memcpy(&outputRelay[0], &ShmChargerInfo->SCabinetControl.SOutputRelay[0], GENERAL_GUN_QUANTITY);
  1154. SendParallelPacket(
  1155. fd,
  1156. _Header_Read,
  1157. _regReqLen[_Reg_OutputRelay_Status],
  1158. _Reg_OutputRelay_Status,
  1159. &outputRelay[0]);
  1160. GetClockTime(&_regQreuyTime[_Reg_OutputRelay_Status]);
  1161. //LOG_INFO("SCabinet Read OutputRelay...");
  1162. }
  1163. }
  1164. // reg: 0x05, Slave Cabinet Output Relay Handler
  1165. unsigned char SCabinetOutputRelayHandler(struct PACKET_STRUCTURE *packet)
  1166. {
  1167. bool chagne = false;
  1168. unsigned char ack = _R_NG;
  1169. if(packet->Header.id != ShmChargerInfo->SCabinetControl.SCabinetID)
  1170. {
  1171. return ack;
  1172. }
  1173. if(packet->Header.len >= _regResLen[_Reg_OutputRelay_Status])
  1174. {
  1175. ack = packet->Payload.data[0] == _R_OK ? _R_OK : _R_NG;
  1176. if(ack == _R_OK)
  1177. {
  1178. for(int i = 0; i < GENERAL_GUN_QUANTITY; i++)
  1179. {
  1180. if(packet->Payload.data[i + 1] != ShmChargerInfo->SCabinetControl.SOutputRelay[i])
  1181. {
  1182. chagne = true;
  1183. }
  1184. }
  1185. memcpy(&ShmChargerInfo->SCabinetControl.SOutputRelay[0], &packet->Payload.data[1], GENERAL_GUN_QUANTITY);
  1186. if(chagne)
  1187. {
  1188. LOG_INFO("SCabinet[%d] Need Set OutputRelay: %3s %3s %3s %3s",
  1189. ShmChargerInfo->SCabinetControl.SCabinetID,
  1190. ShmChargerInfo->SCabinetControl.SOutputRelay[0] > 0 ? "ON" : "OFF",
  1191. ShmChargerInfo->SCabinetControl.SOutputRelay[1] > 0 ? "ON" : "OFF",
  1192. ShmChargerInfo->SCabinetControl.SOutputRelay[2] > 0 ? "ON" : "OFF",
  1193. ShmChargerInfo->SCabinetControl.SOutputRelay[3] > 0 ? "ON" : "OFF");
  1194. }
  1195. }
  1196. }
  1197. return ack;
  1198. }
  1199. // reg: 0x06
  1200. void SCabinetReadAcContactor(int fd)
  1201. {
  1202. unsigned char acContactor = 0;
  1203. if(GetTimeoutValue(_regQreuyTime[_Reg_AcContactor_Status]) / mSEC_VAL >= _regTimeout[_Reg_AcContactor_Status])
  1204. {
  1205. acContactor = ShmChargerInfo->SCabinetControl.SAcContactor;
  1206. SendParallelPacket(
  1207. fd,
  1208. _Header_Read,
  1209. _regReqLen[_Reg_AcContactor_Status],
  1210. _Reg_AcContactor_Status,
  1211. &acContactor);
  1212. GetClockTime(&_regQreuyTime[_Reg_AcContactor_Status]);
  1213. //LOG_INFO("SCabinet Read AcContactor...");
  1214. }
  1215. }
  1216. // reg: 0x06, Slave Cabinet Ac Contactor Handler
  1217. unsigned char SCabinetAcContactorHandler(struct PACKET_STRUCTURE *packet)
  1218. {
  1219. bool chagne = false;
  1220. unsigned char ack = _R_NG;
  1221. if(packet->Header.id != ShmChargerInfo->SCabinetControl.SCabinetID)
  1222. {
  1223. return ack;
  1224. }
  1225. if(packet->Header.len >= _regResLen[_Reg_AcContactor_Status])
  1226. {
  1227. ack = packet->Payload.data[0] == _R_OK ? _R_OK : _R_NG;
  1228. if(ack == _R_OK)
  1229. {
  1230. if(packet->Payload.data[1] != ShmChargerInfo->SCabinetControl.SAcContactor)
  1231. {
  1232. chagne = true;
  1233. }
  1234. ShmChargerInfo->SCabinetControl.SAcContactor = packet->Payload.data[1];
  1235. if(chagne)
  1236. {
  1237. LOG_INFO("SCabinet[%d] Need Set AC Contactor: %3s",
  1238. ShmChargerInfo->SCabinetControl.SCabinetID,
  1239. ShmChargerInfo->SCabinetControl.SAcContactor > 0 ? "ON" : "OFF");
  1240. }
  1241. }
  1242. }
  1243. return ack;
  1244. }
  1245. // reg: 0x07
  1246. void SCabinetReadFwUpdate(int fd)
  1247. {
  1248. bool chagne = false;
  1249. if(_SCabinetUpdateState != ShmChargerInfo->SCabinetControl.UpgradeState)
  1250. {
  1251. chagne = true;
  1252. }
  1253. _SCabinetUpdateState = ShmChargerInfo->SCabinetControl.UpgradeState;
  1254. if(GetTimeoutValue(_regQreuyTime[_Reg_SCabinet_FwUpdate]) / mSEC_VAL >= _regTimeout[_Reg_SCabinet_FwUpdate] || chagne)
  1255. {
  1256. SendParallelPacket(
  1257. fd,
  1258. _Header_Read,
  1259. _regReqLen[_Reg_SCabinet_FwUpdate],
  1260. _Reg_SCabinet_FwUpdate,
  1261. &_SCabinetUpdateState);
  1262. GetClockTime(&_regQreuyTime[_Reg_SCabinet_FwUpdate]);
  1263. }
  1264. }
  1265. // reg: 0x07, Slave Cabinet FW Update Handler
  1266. unsigned char SCabinetFwUpdateHandler(struct PACKET_STRUCTURE *packet)
  1267. {
  1268. bool chagne = false;
  1269. unsigned char update = _R_NoUpgrade;
  1270. unsigned char ack = _R_NG;
  1271. unsigned char image[128];
  1272. if(packet->Header.id != ShmChargerInfo->SCabinetControl.SCabinetID)
  1273. {
  1274. return ack;
  1275. }
  1276. if(packet->Header.len >= _regResLen[_Reg_SCabinet_FwUpdate])
  1277. {
  1278. ack = packet->Payload.data[0] == _R_OK ? _R_OK : _R_NG;
  1279. if(ack == _R_OK)
  1280. {
  1281. update = packet->Payload.data[1] == _R_NeedUpgrade ? _R_NeedUpgrade : _R_NoUpgrade;
  1282. if(update == _R_NeedUpgrade && ShmChargerInfo->SCabinetControl.UpgradeState == Not_Update)
  1283. {
  1284. if(packet->Header.len > _regResLen[_Reg_SCabinet_FwUpdate])
  1285. {
  1286. memset(&image[0], 0x00, sizeof(image));
  1287. memcpy(&image[0], &packet->Payload.data[2], packet->Header.len - _regResLen[_Reg_SCabinet_FwUpdate]);
  1288. }
  1289. else
  1290. {
  1291. LOG_INFO("SCabinet[%d] %s image length fail: %d", ShmChargerInfo->SCabinetControl.SCabinetID, packet->Header.len);
  1292. update = _R_NoUpgrade;
  1293. }
  1294. }
  1295. if(update != ShmChargerInfo->SCabinetControl.NeedUpgrade)
  1296. {
  1297. chagne = true;
  1298. }
  1299. ShmChargerInfo->SCabinetControl.NeedUpgrade = update;
  1300. if(chagne)
  1301. {
  1302. LOG_INFO("SCabinet[%d] Update Indicator [%s]", ShmChargerInfo->SCabinetControl.SCabinetID,
  1303. ShmChargerInfo->SCabinetControl.NeedUpgrade == _R_NeedUpgrade ? "Need Upgrade" : "No Update");
  1304. if(ShmChargerInfo->SCabinetControl.UpgradeState == Not_Update &&
  1305. ShmChargerInfo->SCabinetControl.NeedUpgrade == _R_NeedUpgrade)
  1306. {
  1307. LOG_INFO("SCabinet[%d] Get Image: [%s]", ShmChargerInfo->SCabinetControl.SCabinetID, image);
  1308. memcpy(ShmChargerInfo->SCabinetControl.FwFileName, image, sizeof(image));
  1309. ShmSysConfigAndInfo->SysInfo.FirmwareUpdate = YES;
  1310. }
  1311. if(ShmChargerInfo->SCabinetControl.UpgradeState == Updated &&
  1312. ShmChargerInfo->SCabinetControl.NeedUpgrade == _R_NoUpgrade)
  1313. {
  1314. LOG_INFO("MCabinet & SCabinet[%d] upgrade completed", ShmChargerInfo->SCabinetControl.SCabinetID);
  1315. }
  1316. }
  1317. }
  1318. }
  1319. return ack;
  1320. }
  1321. // reg: 0x08
  1322. void SCabinetReadParallelRelay(int fd)
  1323. {
  1324. unsigned char parallelRelay[GENERAL_GUN_QUANTITY] = {0};
  1325. if(GetTimeoutValue(_regQreuyTime[_Reg_ParallelRelay_Status]) / mSEC_VAL >= _regTimeout[_Reg_ParallelRelay_Status])
  1326. {
  1327. memcpy(&parallelRelay[0], &ShmChargerInfo->SCabinetControl.SParallelRelay[0], GENERAL_GUN_QUANTITY);
  1328. SendParallelPacket(
  1329. fd,
  1330. _Header_Read,
  1331. _regReqLen[_Reg_ParallelRelay_Status],
  1332. _Reg_ParallelRelay_Status,
  1333. &parallelRelay[0]);
  1334. GetClockTime(&_regQreuyTime[_Reg_ParallelRelay_Status]);
  1335. //LOG_INFO("SCabinet Read ParallelRelay...");
  1336. }
  1337. }
  1338. // reg: 0x08, Slave Cabinet Parallel Relay Handler
  1339. unsigned char SCabinetParallelRelayHandler(struct PACKET_STRUCTURE *packet)
  1340. {
  1341. bool chagne = false;
  1342. unsigned char ack = _R_NG;
  1343. if(packet->Header.id != ShmChargerInfo->SCabinetControl.SCabinetID)
  1344. {
  1345. return ack;
  1346. }
  1347. if(packet->Header.len >= _regResLen[_Reg_ParallelRelay_Status])
  1348. {
  1349. ack = packet->Payload.data[0] == _R_OK ? _R_OK : _R_NG;
  1350. if(ack == _R_OK)
  1351. {
  1352. for(int i = 0; i < GENERAL_GUN_QUANTITY; i++)
  1353. {
  1354. if(packet->Payload.data[i + 1] != ShmChargerInfo->SCabinetControl.SParallelRelay[i])
  1355. {
  1356. chagne = true;
  1357. }
  1358. }
  1359. memcpy(&ShmChargerInfo->SCabinetControl.SParallelRelay[0], &packet->Payload.data[1], GENERAL_GUN_QUANTITY);
  1360. if(chagne)
  1361. {
  1362. LOG_INFO("SCabinet[%d] Need Set ParallelRelay: %3s %3s %3s %3s",
  1363. ShmChargerInfo->SCabinetControl.SCabinetID,
  1364. ShmChargerInfo->SCabinetControl.SParallelRelay[0] > 0 ? "ON" : "OFF",
  1365. ShmChargerInfo->SCabinetControl.SParallelRelay[1] > 0 ? "ON" : "OFF",
  1366. ShmChargerInfo->SCabinetControl.SParallelRelay[2] > 0 ? "ON" : "OFF",
  1367. ShmChargerInfo->SCabinetControl.SParallelRelay[3] > 0 ? "ON" : "OFF");
  1368. }
  1369. }
  1370. }
  1371. return ack;
  1372. }
  1373. void SCabinetPacketHandler(struct PACKET_STRUCTURE *packet)
  1374. {
  1375. // Reg: 0x01, Dispenser model name
  1376. if(packet->Header.op == _Header_Response && packet->Payload.reg == _Reg_SCabinet_Model_Name)
  1377. {
  1378. SCabinetModelNameHandler(packet);
  1379. }
  1380. // Reg: 0x02, Slave Cabinet ID
  1381. if(packet->Header.op == _Header_Response && packet->Payload.reg == _Reg_SCabinet_ID)
  1382. {
  1383. SCabinetIDHandler(packet);
  1384. }
  1385. // Reg: 0x04, Slave Cabinet Status
  1386. if(packet->Header.op == _Header_Response && packet->Payload.reg == _Reg_SCabinet_Status)
  1387. {
  1388. SCabinetStatusHandler(packet);
  1389. }
  1390. // Reg: 0x05, Sync Output Relay Status
  1391. if(packet->Header.op == _Header_Response && packet->Payload.reg == _Reg_OutputRelay_Status)
  1392. {
  1393. SCabinetOutputRelayHandler(packet);
  1394. }
  1395. // Reg: 0x06, Sync Ac Contactor Status
  1396. if(packet->Header.op == _Header_Response && packet->Payload.reg == _Reg_AcContactor_Status)
  1397. {
  1398. SCabinetAcContactorHandler(packet);
  1399. }
  1400. // Reg: 0x07, Fw Update
  1401. if(packet->Header.op == _Header_Response && packet->Payload.reg == _Reg_SCabinet_FwUpdate)
  1402. {
  1403. SCabinetFwUpdateHandler(packet);
  1404. }
  1405. // Reg: 0x08, Sync Parallel Relay Status
  1406. if(packet->Header.op == _Header_Response && packet->Payload.reg == _Reg_ParallelRelay_Status)
  1407. {
  1408. SCabinetParallelRelayHandler(packet);
  1409. }
  1410. }
  1411. int SlaveCabinetProcess(void)
  1412. {
  1413. int slavefd = 0, rxLen = 0, packetCnt = 0;
  1414. //struct PACKET_STRUCTURE receiveBuffer;
  1415. unsigned char dataBuffer[MAX_DATA_BUFFER_LEN];
  1416. struct PACKET_STRUCTURE packetBuffer[MAX_PACKET_BUFFER_LEN];
  1417. unsigned char Status = 0xFF, preStatus = 0xFF;
  1418. struct timespec _slaveCabinetStatus_time;
  1419. struct timespec _SCabinet_timeout;
  1420. ShmChargerInfo->SCabinetControl.SCabinetStatus = _DeviceStatus_DisConnect;
  1421. ShmChargerInfo->SCabinetControl.SCabinetID = 0xFF;
  1422. _modelNameAck = 0;
  1423. _idAck = 0;
  1424. _header_SE = 0;
  1425. ShmChargerInfo->SCabinetControl.SCabinetID = 0xFF;
  1426. slavefd = socket(AF_INET, SOCK_STREAM, 0);
  1427. if (slavefd == -1)
  1428. {
  1429. LOG_INFO("Create Slave Cabinet Socket Fail");
  1430. return -1;
  1431. }
  1432. LOG_INFO("Slave Cabinet Client Start, PID = %d", getpid());
  1433. while(1)
  1434. {
  1435. // **************************************** transmit ****************************************
  1436. Status = ShmChargerInfo->SCabinetControl.SCabinetStatus;
  1437. //LOG_INFO("SCabinet Status: %d", Status);
  1438. switch(Status)
  1439. {
  1440. case _DeviceStatus_DisConnect:
  1441. if(preStatus != Status)
  1442. {
  1443. _modelNameAck = 0;
  1444. _idAck = 0;
  1445. _header_SE = 0x00;
  1446. ShmChargerInfo->SCabinetControl.SCabinetID = 0xFF;
  1447. memset(&SlaveWarningInfo[0], 0x00, sizeof(struct WARNING_CODE_INFO));
  1448. LOG_INFO("Slave Cabinet [Disconnect]");
  1449. GetClockTime(&_slaveCabinetStatus_time);
  1450. }
  1451. slavefd = ConnectToMasterCabinet();
  1452. if(slavefd > 0)
  1453. {
  1454. GetClockTime(&_SCabinet_timeout);
  1455. ShmChargerInfo->SCabinetControl.SCabinetStatus = _DeviceStatus_Identification;
  1456. LOG_INFO("Connecting to MCabinet...");
  1457. break;
  1458. }
  1459. if(GetTimeoutValue(_slaveCabinetStatus_time) / uSEC_VAL >= DISCONNECT_PROMPT)
  1460. {
  1461. LOG_INFO("SCabinet Connecting...");
  1462. GetClockTime(&_slaveCabinetStatus_time);
  1463. }
  1464. break;
  1465. case _DeviceStatus_Identification:
  1466. if(preStatus != Status)
  1467. {
  1468. _modelNameAck = 0;
  1469. _idAck = 0;
  1470. _header_SE = 0x00;
  1471. ShmChargerInfo->SCabinetControl.SCabinetID = 0xFF;
  1472. memset(&SlaveWarningInfo[0], 0x00, sizeof(struct WARNING_CODE_INFO));
  1473. GetClockTime(&_SCabinet_timeout);
  1474. LOG_INFO("Slave Cabinet [Identification]");
  1475. GetClockTime(&_slaveCabinetStatus_time);
  1476. }
  1477. if(_modelNameAck != _R_OK)
  1478. {
  1479. SCabinetWriteModelName(slavefd);
  1480. }
  1481. if(ShmChargerInfo->SCabinetControl.SCabinetID == 0xFF || ShmChargerInfo->SCabinetControl.SCabinetID == 0)
  1482. {
  1483. SCabinetReadID(slavefd);
  1484. }
  1485. if(_modelNameAck == _R_OK && ShmChargerInfo->SCabinetControl.SCabinetID != 0xFF && ShmChargerInfo->SCabinetControl.SCabinetID != 0)
  1486. {
  1487. ShmChargerInfo->SCabinetControl.SCabinetStatus = _DeviceStatus_Idle;
  1488. }
  1489. break;
  1490. case _DeviceStatus_Idle:
  1491. if(preStatus != Status)
  1492. {
  1493. LOG_INFO("Slave Cabinet [Idle]");
  1494. GetClockTime(&_slaveCabinetStatus_time);
  1495. }
  1496. SCabinetWriteStatus(slavefd);
  1497. SCabinetReadOutputRelay(slavefd);
  1498. SCabinetReadAcContactor(slavefd);
  1499. SCabinetReadFwUpdate(slavefd);
  1500. SCabinetReadParallelRelay(slavefd);
  1501. break;
  1502. case _DeviceStatus_Alarm:
  1503. if(preStatus != Status)
  1504. {
  1505. LOG_INFO("Slave Cabinet [Alarm]");
  1506. GetClockTime(&_slaveCabinetStatus_time);
  1507. }
  1508. break;
  1509. case _DeviceStatus_Charging:
  1510. break;
  1511. case _DeviceStatus_Timeout:
  1512. if(preStatus != Status)
  1513. {
  1514. LOG_INFO("Slave Cabinet Retry [Timeout]");
  1515. GetClockTime(&_slaveCabinetStatus_time);
  1516. }
  1517. ShmChargerInfo->SCabinetControl.SCabinetStatus = _DeviceStatus_RetryWait;
  1518. break;
  1519. case _DeviceStatus_RetryWait:
  1520. if(preStatus != Status)
  1521. {
  1522. LOG_INFO("Slave Cabinet Retry [Wait]");
  1523. GetClockTime(&_slaveCabinetStatus_time);
  1524. }
  1525. if(GetTimeoutValue(_slaveCabinetStatus_time) / uSEC_VAL >= 3)
  1526. {
  1527. ShmChargerInfo->SCabinetControl.SCabinetStatus = _DeviceStatus_DisConnect;
  1528. }
  1529. break;
  1530. default:
  1531. break;
  1532. }
  1533. preStatus = Status;
  1534. // **************************************** receive ****************************************
  1535. if(ShmChargerInfo->SCabinetControl.SCabinetStatus != _DeviceStatus_DisConnect &&
  1536. ShmChargerInfo->SCabinetControl.SCabinetStatus != _DeviceStatus_Timeout &&
  1537. ShmChargerInfo->SCabinetControl.SCabinetStatus != _DeviceStatus_RetryWait)
  1538. {
  1539. if((rxLen = recv(slavefd, &dataBuffer[0], MAX_DATA_BUFFER_LEN, MSG_DONTWAIT )) > 0)
  1540. {
  1541. packetCnt = BufferRePacket(rxLen, &dataBuffer[0], &packetBuffer[0]);
  1542. if(packetCnt > 0)
  1543. {
  1544. //LOG_INFO("SCabinet %d packet received", packetCnt);
  1545. for(int i = 0; i < packetCnt; i++)
  1546. {
  1547. //ShowSocketData(&packetBuffer[i]);
  1548. SCabinetPacketHandler(&packetBuffer[i]);
  1549. }
  1550. // clear timeout value
  1551. GetClockTime(&_SCabinet_timeout);
  1552. }
  1553. }
  1554. }
  1555. // **************************************** timeout ****************************************
  1556. if(ShmChargerInfo->SCabinetControl.SCabinetStatus != _DeviceStatus_DisConnect &&
  1557. ShmChargerInfo->SCabinetControl.SCabinetStatus != _DeviceStatus_Timeout &&
  1558. ShmChargerInfo->SCabinetControl.SCabinetStatus != _DeviceStatus_RetryWait)
  1559. {
  1560. if(GetTimeoutValue(_SCabinet_timeout) / uSEC_VAL >= MASTER_SLAVE_CABINET_TIMEOUT)
  1561. {
  1562. if(slavefd > 0)
  1563. {
  1564. close(slavefd);
  1565. }
  1566. LOG_INFO("SCabinet timeout, close socket...");
  1567. ShmChargerInfo->SCabinetControl.SCabinetStatus = _DeviceStatus_Timeout;
  1568. }
  1569. }
  1570. usleep((SOCKET_RECEIVE_INTERVAL * 1000));
  1571. }
  1572. return 0;
  1573. }
  1574. int main(void)
  1575. {
  1576. if(InitShareMemory() == FAIL)
  1577. {
  1578. #ifdef SystemLogMessage
  1579. LOG_ERROR("InitShareMemory NG");
  1580. #endif
  1581. sleep(5);
  1582. return 0;
  1583. }
  1584. InitialConnector();
  1585. // wait for self test completed
  1586. while(ShmSysConfigAndInfo->SysInfo.BootingStatus == BOOTTING ||
  1587. ShmSysConfigAndInfo->SysInfo.SelfTestSeq != _STEST_COMPLETE ||
  1588. ShmChargerInfo->Control.CabinetRole == _CROLE_SINGLE)
  1589. {
  1590. sleep(1);
  1591. }
  1592. if(ShmChargerInfo->Control.CabinetRole == _CROLE_MASTER)
  1593. {
  1594. MasterCabinetProcess();
  1595. }
  1596. else if(ShmChargerInfo->Control.CabinetRole == _CROLE_SLAVE)
  1597. {
  1598. SlaveCabinetProcess();
  1599. }
  1600. return 0;
  1601. }