Module_InternalComm.c 135 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206220722082209221022112212221322142215221622172218221922202221222222232224222522262227222822292230223122322233223422352236223722382239224022412242224322442245224622472248224922502251225222532254225522562257225822592260226122622263226422652266226722682269227022712272227322742275227622772278227922802281228222832284228522862287228822892290229122922293229422952296229722982299230023012302230323042305230623072308230923102311231223132314231523162317231823192320232123222323232423252326232723282329233023312332233323342335233623372338233923402341234223432344234523462347234823492350235123522353235423552356235723582359236023612362236323642365236623672368236923702371237223732374237523762377237823792380238123822383238423852386238723882389239023912392239323942395239623972398239924002401240224032404240524062407240824092410241124122413241424152416241724182419242024212422242324242425242624272428242924302431243224332434243524362437243824392440244124422443244424452446244724482449245024512452245324542455245624572458245924602461246224632464246524662467246824692470247124722473247424752476247724782479248024812482248324842485248624872488248924902491249224932494249524962497249824992500250125022503250425052506250725082509251025112512251325142515251625172518251925202521252225232524252525262527252825292530253125322533253425352536253725382539254025412542254325442545254625472548254925502551255225532554255525562557255825592560256125622563256425652566256725682569257025712572257325742575257625772578257925802581258225832584258525862587258825892590259125922593259425952596259725982599260026012602260326042605260626072608260926102611261226132614261526162617261826192620262126222623262426252626262726282629263026312632263326342635263626372638263926402641264226432644264526462647264826492650265126522653265426552656265726582659266026612662266326642665266626672668266926702671267226732674267526762677267826792680268126822683268426852686268726882689269026912692269326942695269626972698269927002701270227032704270527062707270827092710271127122713271427152716271727182719272027212722272327242725272627272728272927302731273227332734273527362737273827392740274127422743274427452746274727482749275027512752275327542755275627572758275927602761276227632764276527662767276827692770277127722773277427752776277727782779278027812782278327842785278627872788278927902791279227932794279527962797279827992800280128022803280428052806280728082809281028112812281328142815281628172818281928202821282228232824282528262827282828292830283128322833283428352836283728382839284028412842284328442845284628472848284928502851285228532854285528562857285828592860286128622863286428652866286728682869287028712872287328742875287628772878287928802881288228832884288528862887288828892890289128922893289428952896289728982899290029012902290329042905290629072908290929102911291229132914291529162917291829192920292129222923292429252926292729282929293029312932293329342935293629372938293929402941294229432944294529462947294829492950295129522953295429552956295729582959296029612962296329642965296629672968296929702971297229732974297529762977297829792980298129822983298429852986298729882989299029912992299329942995299629972998299930003001300230033004300530063007300830093010301130123013301430153016301730183019302030213022302330243025302630273028302930303031303230333034303530363037303830393040304130423043304430453046304730483049305030513052305330543055305630573058305930603061306230633064306530663067306830693070307130723073307430753076307730783079308030813082308330843085308630873088308930903091309230933094309530963097309830993100310131023103310431053106310731083109311031113112311331143115311631173118311931203121312231233124312531263127312831293130313131323133313431353136313731383139314031413142314331443145314631473148314931503151315231533154315531563157315831593160316131623163316431653166316731683169317031713172317331743175317631773178317931803181318231833184318531863187318831893190319131923193319431953196319731983199320032013202320332043205320632073208320932103211321232133214321532163217321832193220322132223223322432253226322732283229323032313232323332343235323632373238323932403241324232433244324532463247324832493250325132523253325432553256325732583259326032613262326332643265326632673268326932703271327232733274327532763277327832793280328132823283328432853286328732883289329032913292329332943295329632973298329933003301330233033304330533063307330833093310331133123313331433153316331733183319332033213322332333243325332633273328332933303331333233333334333533363337333833393340334133423343334433453346334733483349335033513352335333543355335633573358335933603361336233633364336533663367336833693370337133723373337433753376337733783379338033813382338333843385338633873388338933903391339233933394339533963397339833993400340134023403340434053406340734083409341034113412341334143415341634173418341934203421342234233424342534263427342834293430343134323433343434353436343734383439344034413442344334443445344634473448344934503451345234533454345534563457345834593460346134623463346434653466346734683469347034713472347334743475347634773478347934803481348234833484348534863487348834893490349134923493
  1. #include <sys/time.h>
  2. #include <sys/timeb.h>
  3. #include <sys/types.h>
  4. #include <sys/stat.h>
  5. #include <sys/types.h>
  6. #include <sys/ioctl.h>
  7. #include <sys/socket.h>
  8. #include <sys/ipc.h>
  9. #include <sys/shm.h>
  10. #include <sys/shm.h>
  11. #include <sys/mman.h>
  12. #include <linux/wireless.h>
  13. #include <arpa/inet.h>
  14. #include <netinet/in.h>
  15. #include <unistd.h>
  16. #include <stdarg.h>
  17. #include <stdio.h>
  18. #include <stdlib.h>
  19. #include <unistd.h>
  20. #include <fcntl.h>
  21. #include <termios.h>
  22. #include <errno.h>
  23. #include <errno.h>
  24. #include <string.h>
  25. #include <time.h>
  26. #include <ctype.h>
  27. #include <ifaddrs.h>
  28. #include <math.h>
  29. #include <limits.h>
  30. #include "define.h"
  31. #include "main.h"
  32. #include "Module_InternalComm.h"
  33. //#define SIMULATION
  34. #define FAIL_SPEC_COMM 100
  35. #define ARRAY_SIZE(A) (sizeof(A) / sizeof(A[0]))
  36. #define PASS 1
  37. #define FAIL 0
  38. #define ON 1
  39. #define OFF 0
  40. #define PRIORITY_HIGH 0
  41. #define PRIORITY_LOW 1
  42. struct SysConfigAndInfo *ShmSysConfigAndInfo;
  43. struct StatusCodeData *ShmStatusCodeData;
  44. struct PrimaryMcuData *ShmPrimaryMcuData;
  45. struct OCPP16Data *ShmOCPP16Data;
  46. struct Charger *ShmCharger;
  47. uint16_t stepIndex=21, logIndex;
  48. long long tsLast, tsNow, tsPrintLog[2];
  49. uint64_t tmpPowerConsumption;
  50. uint64_t tmpL1PowerConsumption;
  51. uint64_t tmpL2PowerConsumption;
  52. uint64_t tmpL3PowerConsumption;
  53. void trim(char *s);
  54. int mystrcmp(char *p1,char *p2);
  55. void substr(char *dest, const char* src, unsigned int start, unsigned int cnt);
  56. void split(char **arr, char *str, const char *del);
  57. int StoreLogMsg(const char *fmt, ...)
  58. {
  59. char Buf[4096+256];
  60. char buffer[4096];
  61. time_t CurrentTime;
  62. struct tm *tm;
  63. struct timeval tv;
  64. va_list args;
  65. va_start(args, fmt);
  66. int rc = vsnprintf(buffer, sizeof(buffer), fmt, args);
  67. va_end(args);
  68. memset(Buf,0,sizeof(Buf));
  69. CurrentTime = time(NULL);
  70. tm=localtime(&CurrentTime);
  71. gettimeofday(&tv, NULL); // get microseconds, 10^-6
  72. sprintf(Buf,"echo -n \'[%04d.%02d.%02d %02d:%02d:%02d.%06ld]%s\' >> /Storage/SystemLog/[%04d.%02d]Module_InterCommLog",
  73. tm->tm_year+1900,tm->tm_mon+1,tm->tm_mday,tm->tm_hour,tm->tm_min,tm->tm_sec,tv.tv_usec,
  74. buffer,
  75. tm->tm_year+1900,tm->tm_mon+1);
  76. #ifdef SystemLogMessage
  77. system(Buf);
  78. #endif
  79. #ifdef ConsloePrintLog
  80. printf("[%04d.%02d.%02d %02d:%02d:%02d.%06ld]%s", tm->tm_year+1900,tm->tm_mon+1,tm->tm_mday,tm->tm_hour,tm->tm_min,tm->tm_sec,tv.tv_usec, buffer);
  81. #endif
  82. return rc;
  83. }
  84. int DiffTimeb(struct timeb ST, struct timeb ET)
  85. {
  86. //return milli-second
  87. unsigned int StartTime,StopTime;
  88. StartTime=(unsigned int)ST.time;
  89. StopTime=(unsigned int)ET.time;
  90. return (StopTime-StartTime)*1000+ET.millitm-ST.millitm;
  91. }
  92. long long current_timestamp()
  93. {
  94. struct timeval te;
  95. gettimeofday(&te, NULL); // get current time
  96. long long milliseconds = te.tv_sec*1000LL + te.tv_usec/1000; // calculate milliseconds
  97. return milliseconds;
  98. }
  99. //=================================
  100. // Common routine
  101. //=================================
  102. void trim(char *s)
  103. {
  104. int i=0, j, k, l=0;
  105. while((s[i]==' ')||(s[i]=='\t')||(s[i]=='\n'))
  106. i++;
  107. j = strlen(s)-1;
  108. while((s[j]==' ')||(s[j]=='\t')||(s[j]=='\n'))
  109. j--;
  110. if(i==0 && j==strlen(s)-1) { }
  111. else if(i==0) s[j+1] = '\0';
  112. else {
  113. for(k=i; k<=j; k++) s[l++] = s[k];
  114. s[l] = '\0';
  115. }
  116. }
  117. int mystrcmp(char *p1,char *p2)
  118. {
  119. while(*p1==*p2)
  120. {
  121. if(*p1=='\0' || *p2=='\0')
  122. break;
  123. p1++;
  124. p2++;
  125. }
  126. if(*p1=='\0' && *p2=='\0')
  127. return(PASS);
  128. else
  129. return(FAIL);
  130. }
  131. void substr(char *dest, const char* src, unsigned int start, unsigned int cnt)
  132. {
  133. strncpy(dest, src + start, cnt);
  134. dest[cnt] = 0;
  135. }
  136. void split(char **arr, char *str, const char *del)
  137. {
  138. char *s = strtok(str, del);
  139. while(s != NULL)
  140. {
  141. *arr++ = s;
  142. s = strtok(NULL, del);
  143. }
  144. }
  145. //==========================================
  146. // Init all share memory
  147. //==========================================
  148. int InitShareMemory()
  149. {
  150. int result = PASS;
  151. int MeterSMId;
  152. //Initial ShmSysConfigAndInfo
  153. if ((MeterSMId = shmget(ShmSysConfigAndInfoKey, sizeof(struct SysConfigAndInfo), 0777)) < 0)
  154. {
  155. #ifdef SystemLogMessage
  156. DEBUG_ERROR("shmget ShmSysConfigAndInfo NG\n");
  157. #endif
  158. result = FAIL;
  159. }
  160. else if ((ShmSysConfigAndInfo = shmat(MeterSMId, NULL, 0)) == (void *) -1)
  161. {
  162. #ifdef SystemLogMessage
  163. DEBUG_ERROR("[shmat ShmSysConfigAndInfo NG\n");
  164. #endif
  165. result = FAIL;
  166. }
  167. //Initial ShmStatusCodeData
  168. if ((MeterSMId = shmget(ShmStatusCodeKey, sizeof(struct StatusCodeData), 0777)) < 0)
  169. {
  170. #ifdef SystemLogMessage
  171. DEBUG_ERROR("shmget ShmStatusCodeData NG\n");
  172. #endif
  173. result = FAIL;
  174. }
  175. else if ((ShmStatusCodeData = shmat(MeterSMId, NULL, 0)) == (void *) -1)
  176. {
  177. #ifdef SystemLogMessage
  178. DEBUG_ERROR("shmat ShmStatusCodeData NG\n");
  179. #endif
  180. result = FAIL;
  181. }
  182. //Initial ShmPrimaryMcuKey
  183. if ((MeterSMId = shmget(ShmPrimaryMcuKey, sizeof(struct PrimaryMcuData), 0777)) < 0)
  184. {
  185. #ifdef SystemLogMessage
  186. DEBUG_ERROR("shmget ShmPrimaryMcuData NG\n");
  187. #endif
  188. result = FAIL;
  189. }
  190. else if ((ShmPrimaryMcuData = shmat(MeterSMId, NULL, 0)) == (void *) -1)
  191. {
  192. #ifdef SystemLogMessage
  193. DEBUG_ERROR("shmat ShmPrimaryMcuData NG\n");
  194. #endif
  195. result = FAIL;
  196. }
  197. //creat ShmOCPP16Data
  198. if ((MeterSMId = shmget(ShmOcppModuleKey, sizeof(struct OCPP16Data), 0777)) < 0)
  199. {
  200. #ifdef SystemLogMessage
  201. DEBUG_ERROR("shmget ShmOCPP16Data NG");
  202. #endif
  203. result = FAIL;
  204. }
  205. else if ((ShmOCPP16Data = shmat(MeterSMId, NULL, 0)) == (void *) -1)
  206. {
  207. #ifdef SystemLogMessage
  208. DEBUG_ERROR("shmat ShmOCPP16Data NG");
  209. #endif
  210. result = FAIL;
  211. }
  212. else
  213. {}
  214. //Initial ShmCharger
  215. if ((MeterSMId = shmget(ShmChargerKey, sizeof(struct Charger), 0777)) < 0)
  216. {
  217. #ifdef SystemLogMessage
  218. DEBUG_ERROR("shmget ShmChargerKey NG\n");
  219. #endif
  220. result = FAIL;
  221. }
  222. else if ((ShmCharger = shmat(MeterSMId, NULL, 0)) == (void *) -1)
  223. {
  224. #ifdef SystemLogMessage
  225. DEBUG_ERROR("shmat ShmChargerKey NG\n");
  226. #endif
  227. result = FAIL;
  228. }
  229. return result;
  230. }
  231. int InitComPort()
  232. {
  233. int fd;
  234. struct termios tios;
  235. fd = open("/dev/ttyS1", O_RDWR);
  236. if(fd<=0)
  237. {
  238. #ifdef SystemLogMessage
  239. DEBUG_ERROR("open /dev/ttyS1 NG\n");
  240. #endif
  241. return -1;
  242. }
  243. ioctl (fd, TCGETS, &tios);
  244. tios.c_cflag = B115200| CS8 | CLOCAL | CREAD;
  245. tios.c_lflag = 0;
  246. tios.c_iflag = 0;
  247. tios.c_oflag = 0;
  248. tios.c_cc[VMIN]=0;
  249. tios.c_cc[VTIME]=(unsigned char)5; // timeout 0.5 secod
  250. tios.c_lflag=0;
  251. tcflush(fd, TCIFLUSH);
  252. ioctl (fd, TCSETS, &tios);
  253. return fd;
  254. }
  255. void ack_delay(unsigned char cmd)
  256. {
  257. switch(cmd)
  258. {
  259. case CMD_UPDATE_START:
  260. case CMD_UPDATE_END:
  261. usleep(300000);
  262. break;
  263. case CMD_QUERY_PTB_METER_MESSAGE:
  264. usleep(500000);
  265. break;
  266. default:
  267. usleep(100000);
  268. break;
  269. }
  270. }
  271. int tranceive(int fd, unsigned char* cmd, unsigned char cmd_len, unsigned char* rx)
  272. {
  273. int len;
  274. tcflush(fd,TCIOFLUSH);
  275. if(write(fd, cmd, cmd_len) >= cmd_len)
  276. {
  277. ack_delay(cmd[3]);
  278. len = read(fd, rx, 2048);
  279. }
  280. else
  281. {
  282. #ifdef SystemLogMessage
  283. DEBUG_ERROR("Serial command %s response fail.\n", cmd);
  284. #endif
  285. }
  286. return len;
  287. }
  288. unsigned char Query_FW_Ver(unsigned char fd, unsigned char targetAddr, Ver *Ret_Buf)
  289. {
  290. unsigned char result = FAIL;
  291. unsigned char tx[7] = {0xaa, 0x00, targetAddr, CMD_QUERY_FW_VER, 0x00, 0x00, 0x00};
  292. unsigned char rx[512];
  293. unsigned char chksum = 0x00;
  294. unsigned char len = tranceive(fd, tx, sizeof(tx), rx);
  295. if(len > 6)
  296. {
  297. if(len < 6+(rx[4] | rx[5]<<8))
  298. return result;
  299. for(int idx = 0;idx<(rx[4] | rx[5]<<8);idx++)
  300. {
  301. chksum ^= rx[6+idx];
  302. }
  303. if((chksum == rx[6+(rx[4] | rx[5]<<8)]) &&
  304. (rx[2] == tx[1]) &&
  305. (rx[1] == tx[2]) &&
  306. (rx[3] == tx[3]))
  307. {
  308. strncpy(Ret_Buf->Version_FW, (char *)rx+6, (rx[4] | rx[5]<<8));
  309. result = PASS;
  310. }
  311. }
  312. return result;
  313. }
  314. unsigned char Query_HW_Ver(unsigned char fd, unsigned char targetAddr, Ver *Ret_Buf)
  315. {
  316. unsigned char result = FAIL;
  317. unsigned char tx[7] = {0xaa, 0x00, targetAddr, CMD_QUERY_HW_VER, 0x00, 0x00, 0x00};
  318. unsigned char rx[512];
  319. unsigned char chksum = 0x00;
  320. unsigned char len = tranceive(fd, tx, sizeof(tx), rx);
  321. if(len > 6)
  322. {
  323. if(len < 6+(rx[4] | rx[5]<<8))
  324. return result;
  325. for(int idx = 0;idx<(rx[4] | rx[5]<<8);idx++)
  326. {
  327. chksum ^= rx[6+idx];
  328. }
  329. if((chksum == rx[6+(rx[4] | rx[5]<<8)]) &&
  330. (rx[2] == tx[1]) &&
  331. (rx[1] == tx[2]) &&
  332. (rx[3] == tx[3]))
  333. {
  334. strncpy(Ret_Buf->Version_HW, (char *)rx+6, (rx[4] | rx[5]<<8));
  335. result = PASS;
  336. }
  337. }
  338. return result;
  339. }
  340. unsigned char Query_Present_InputVoltage(unsigned char fd, unsigned char targetAddr, PresentInputVoltage *Ret_Buf)
  341. {
  342. unsigned char result = FAIL;
  343. unsigned char tx[7] = {0xaa, 0x00, targetAddr, CMD_QUERY_PRESENT_INPUTVOLTAGE, 0x00, 0x00, 0x00};
  344. unsigned char rx[512];
  345. unsigned char chksum = 0x00;
  346. unsigned char len = tranceive(fd, tx, sizeof(tx), rx);
  347. if(len > 6)
  348. {
  349. if(len < 6+(rx[4] | rx[5]<<8))
  350. return result;
  351. for(int idx = 0;idx<(rx[4] | rx[5]<<8);idx++)
  352. {
  353. chksum ^= rx[6+idx];
  354. }
  355. if((chksum == rx[6+(rx[4] | rx[5]<<8)]) &&
  356. (rx[2] == tx[1]) &&
  357. (rx[1] == tx[2]) &&
  358. (rx[3] == tx[3]))
  359. {
  360. Ret_Buf->inputType = rx[6];
  361. Ret_Buf->L1N_L12 =( rx[7] | (rx[8]<<8))/10.0;
  362. if(ShmSysConfigAndInfo->SysConfig.AcPhaseCount == 3)
  363. {
  364. Ret_Buf->L2N_L23 =( rx[9] | (rx[10]<<8))/10.0;
  365. Ret_Buf->L3N_L31 =( rx[11] | (rx[12]<<8))/10.0;
  366. }
  367. result = PASS;
  368. }
  369. }
  370. return result;
  371. }
  372. unsigned char Query_Present_OutputVoltage(unsigned char fd, unsigned char targetAddr, PresentOutputVoltage *Ret_Buf)
  373. {
  374. unsigned char result = FAIL;
  375. unsigned char tx[7] = {0xaa, 0x00, targetAddr, CMD_QUERY_PRESENT_OUTPUTVOLTAGE, 0x00, 0x00, 0x00};
  376. unsigned char rx[512];
  377. unsigned char chksum = 0x00;
  378. unsigned char len = tranceive(fd, tx, sizeof(tx), rx);
  379. if(len > 6)
  380. {
  381. if(len < 6+(rx[4] | rx[5]<<8))
  382. return result;
  383. for(int idx = 0;idx<(rx[4] | rx[5]<<8);idx++)
  384. {
  385. chksum ^= rx[6+idx];
  386. }
  387. if((chksum == rx[6+(rx[4] | rx[5]<<8)]) &&
  388. (rx[2] == tx[1]) &&
  389. (rx[1] == tx[2]) &&
  390. (rx[3] == tx[3]))
  391. {
  392. Ret_Buf->behindFuse_Voltage_C1 =(rx[6] | (rx[7]<<8))/10.0;
  393. Ret_Buf->behindRelay_Voltage_C1 =(rx[8] | (rx[9]<<8))/10.0;
  394. if((rx[4] | rx[5]<<8) > 4)
  395. {
  396. Ret_Buf->behindFuse_Voltage_C2 =(rx[10] | (rx[11]<<8))/10.0;
  397. Ret_Buf->behindRelay_Voltage_C2 =(rx[12] | (rx[13]<<8))/10.0;
  398. }
  399. result = PASS;
  400. }
  401. }
  402. return result;
  403. }
  404. unsigned char Query_Fan_Speed(unsigned char fd, unsigned char targetAddr, FanSpeed *Ret_Buf)
  405. {
  406. unsigned char result = FAIL;
  407. unsigned char tx[7] = {0xaa, 0x00, targetAddr, CMD_QUERY_FAN_SPEED, 0x00, 0x00, 0x00};
  408. unsigned char rx[512];
  409. unsigned char chksum = 0x00;
  410. unsigned char len = tranceive(fd, tx, sizeof(tx), rx);
  411. if(len > 6)
  412. {
  413. if(len < 6+(rx[4] | rx[5]<<8))
  414. return result;
  415. for(int idx = 0;idx<(rx[4] | rx[5]<<8);idx++)
  416. {
  417. chksum ^= rx[6+idx];
  418. }
  419. if((chksum == rx[6+(rx[4] | rx[5]<<8)]) &&
  420. (rx[2] == tx[1]) &&
  421. (rx[1] == tx[2]) &&
  422. (rx[3] == tx[3]))
  423. {
  424. for(int idx=0;idx<((rx[4] | rx[5]<<8)>>1);idx++)
  425. Ret_Buf->speed[idx] =(rx[6+(2*idx)] | (rx[6+(2*idx)+1]<<8));
  426. result = PASS;
  427. }
  428. }
  429. return result;
  430. }
  431. unsigned char Query_Temperature(unsigned char fd, unsigned char targetAddr, Temperature *Ret_Buf)
  432. {
  433. unsigned char result = FAIL;
  434. unsigned char tx[7] = {0xaa, 0x00, targetAddr, CMD_QUERY_TEMPERATURE, 0x00, 0x00, 0x00};
  435. unsigned char rx[512];
  436. unsigned char chksum = 0x00;
  437. unsigned char len = tranceive(fd, tx, sizeof(tx), rx);
  438. if(len > 6)
  439. {
  440. if(len < 6+(rx[4] | rx[5]<<8))
  441. return result;
  442. for(int idx = 0;idx<(rx[4] | rx[5]<<8);idx++)
  443. {
  444. chksum ^= rx[6+idx];
  445. }
  446. if((chksum == rx[6+(rx[4] | rx[5]<<8)]) &&
  447. (rx[2] == tx[1]) &&
  448. (rx[1] == tx[2]) &&
  449. (rx[3] == tx[3]))
  450. {
  451. for(int idx=0;idx<(rx[4] | rx[5]<<8);idx++)
  452. Ret_Buf->point[idx] = rx[6+idx] - 60;
  453. result = PASS;
  454. }
  455. }
  456. return result;
  457. }
  458. unsigned char Query_Aux_PowerVoltage(unsigned char fd, unsigned char targetAddr, AuxPower *Ret_Buf)
  459. {
  460. unsigned char result = FAIL;
  461. unsigned char tx[7] = {0xaa, 0x00, targetAddr, CMD_QUERY_AUX_POWERVOLTAGE, 0x00, 0x00, 0x00};
  462. unsigned char rx[512];
  463. unsigned char chksum = 0x00;
  464. unsigned char len = tranceive(fd, tx, sizeof(tx), rx);
  465. if(len > 6)
  466. {
  467. if(len < 6+(rx[4] | rx[5]<<8))
  468. return result;
  469. for(int idx = 0;idx<(rx[4] | rx[5]<<8);idx++)
  470. {
  471. chksum ^= rx[6+idx];
  472. }
  473. if((chksum == rx[6+(rx[4] | rx[5]<<8)]) &&
  474. (rx[2] == tx[1]) &&
  475. (rx[1] == tx[2]) &&
  476. (rx[3] == tx[3]))
  477. {
  478. for(int idx=0;idx<(rx[4] | rx[5]<<8);idx++)
  479. Ret_Buf->voltage[idx] = rx[6+idx];
  480. result = PASS;
  481. }
  482. }
  483. return result;
  484. }
  485. unsigned char Query_Relay_Output(unsigned char fd, unsigned char targetAddr, Relay *Ret_Buf)
  486. {
  487. unsigned char result = FAIL;
  488. unsigned char tx[7] = {0xaa, 0x00, targetAddr, CMD_QUERY_RELAY_OUTPUT, 0x00, 0x00, 0x00};
  489. unsigned char rx[512];
  490. unsigned char chksum = 0x00;
  491. unsigned char len = tranceive(fd, tx, sizeof(tx), rx);
  492. if(len > 6)
  493. {
  494. if(len < 6+(rx[4] | rx[5]<<8))
  495. return result;
  496. for(int idx = 0;idx<(rx[4] | rx[5]<<8);idx++)
  497. {
  498. chksum ^= rx[6+idx];
  499. }
  500. if((chksum == rx[6+(rx[4] | rx[5]<<8)]) &&
  501. (rx[2] == tx[1]) &&
  502. (rx[1] == tx[2]) &&
  503. (rx[3] == tx[3]))
  504. {
  505. for(int idx_connector=0;idx_connector<(rx[4] | rx[5]<<8);idx_connector++)
  506. {
  507. for(int idx=0;idx<8;idx++)
  508. Ret_Buf->relay_status[idx_connector][idx] = (rx[6+idx_connector]>>idx) & 0x01;
  509. }
  510. result = PASS;
  511. }
  512. }
  513. return result;
  514. }
  515. unsigned char Query_Gfd_Adc(unsigned char fd, unsigned char targetAddr, Gfd *Ret_Buf)
  516. {
  517. unsigned char result = FAIL;
  518. unsigned char tx[7] = {0xaa, 0x00, targetAddr, CMD_QUERY_GFD_ADC, 0x00, 0x00, 0x00};
  519. unsigned char rx[512];
  520. unsigned char chksum = 0x00;
  521. unsigned char len = tranceive(fd, tx, sizeof(tx), rx);
  522. if(len > 6)
  523. {
  524. if(len < 6+(rx[4] | rx[5]<<8))
  525. return result;
  526. for(int idx = 0;idx<(rx[4] | rx[5]<<8);idx++)
  527. {
  528. chksum ^= rx[6+idx];
  529. }
  530. if((chksum == rx[6+(rx[4] | rx[5]<<8)]) &&
  531. (rx[2] == tx[1]) &&
  532. (rx[1] == tx[2]) &&
  533. (rx[3] == tx[3]))
  534. {
  535. for(int idx_connector=0;idx_connector<((rx[4] | rx[5]<<8)>>2);idx_connector++)
  536. {
  537. Ret_Buf->adc_value_positive[idx_connector] = (rx[6+(4*idx_connector)] | rx[6+(4*idx_connector)+1]<<8);
  538. Ret_Buf->adc_value_negative[idx_connector] = (rx[6+(4*idx_connector)+2] | rx[6+(4*idx_connector)+3]<<8);;
  539. }
  540. result = PASS;
  541. }
  542. }
  543. return result;
  544. }
  545. unsigned char Query_Gpio_Input(unsigned char fd, unsigned char targetAddr, Gpio_in *Ret_Buf)
  546. {
  547. unsigned char result = FAIL;
  548. unsigned char tx[7] = {0xaa, 0x00, targetAddr, CMD_QUERY_GPIO_INPUT, 0x00, 0x00, 0x00};
  549. unsigned char rx[512];
  550. unsigned char chksum = 0x00;
  551. unsigned char len = tranceive(fd, tx, sizeof(tx), rx);
  552. if(len > 6)
  553. {
  554. if(len < 6+(rx[4] | rx[5]<<8))
  555. return result;
  556. for(int idx = 0;idx<(rx[4] | rx[5]<<8);idx++)
  557. {
  558. chksum ^= rx[6+idx];
  559. }
  560. if((chksum == rx[6+(rx[4] | rx[5]<<8)]) &&
  561. (rx[2] == tx[1]) &&
  562. (rx[1] == tx[2]) &&
  563. (rx[3] == tx[3]))
  564. {
  565. Ret_Buf->AC_Connector = (rx[6] >> 0) & 0x01;
  566. Ret_Buf->AC_MainBreaker = (rx[6] >> 1) & 0x01;
  567. Ret_Buf->SPD = (rx[6] >> 2) & 0x01;
  568. Ret_Buf->Door_Open = (rx[6] >> 3) & 0x01;
  569. Ret_Buf->GFD[0] = (rx[6] >> 4) & 0x01;
  570. Ret_Buf->GFD[1] = (rx[6] >> 5) & 0x01;
  571. Ret_Buf->Button[0] = (rx[6] >> 6) & 0x01;
  572. Ret_Buf->Button[1] = (rx[6] >> 7) & 0x01;
  573. Ret_Buf->Button_Emergency = (rx[7] >> 0) & 0x01;
  574. Ret_Buf->Button_Mode_Switch = (rx[7] >> 7) & 0x01;
  575. result = PASS;
  576. }
  577. }
  578. return result;
  579. }
  580. unsigned char Query_Alarm_Log(unsigned char fd, unsigned char targetAddr, Alarm_Log *Ret_Buf)
  581. {
  582. unsigned char result = FAIL;
  583. unsigned char tx[10] = {0xaa, 0x00, targetAddr, CMD_QUERY_ALARM_LOG, 0x03, 0x00, Ret_Buf->logArea, Ret_Buf->alarmIndex&0xff, ((Ret_Buf->alarmIndex>>8)&0xff), 0x00};
  584. unsigned char rx[512];
  585. unsigned char chksum = Ret_Buf->logArea ^ (Ret_Buf->alarmIndex&0xff) ^ ((Ret_Buf->alarmIndex>>8)&0xff);
  586. unsigned char len = tranceive(fd, tx, sizeof(tx), rx);
  587. if(len > 6)
  588. {
  589. if(len < 6+(rx[4] | rx[5]<<8))
  590. return result;
  591. for(int idx=0;idx<(rx[4] | rx[5]<<8);idx++)
  592. {
  593. chksum ^= rx[6+idx];
  594. }
  595. if((chksum == rx[6+(rx[4] | rx[5]<<8)]) &&
  596. (rx[2] == tx[1]) &&
  597. (rx[1] == tx[2]) &&
  598. (rx[3] == tx[3]))
  599. {
  600. memcpy(&Ret_Buf->log[0], &rx[8], 8);
  601. result = PASS;
  602. }
  603. }
  604. return result;
  605. }
  606. unsigned char Query_RTC(unsigned char fd, unsigned char targetAddr, Rtc *Ret_Buf)
  607. {
  608. unsigned char result = FAIL;
  609. unsigned char tx[7] = {0xaa, 0x00, targetAddr, CMD_QUERY_RTC, 0x00, 0x00, 0x00};
  610. unsigned char rx[512];
  611. unsigned char chksum = 0x00;
  612. unsigned char len = tranceive(fd, tx, sizeof(tx), rx);
  613. if(len > 6)
  614. {
  615. if(len < 6+(rx[4] | rx[5]<<8))
  616. return result;
  617. for(int idx=0;idx<(rx[4] | rx[5]<<8);idx++)
  618. {
  619. chksum ^= rx[6+idx];
  620. }
  621. if((chksum == rx[6+(rx[4] | rx[5]<<8)]) &&
  622. (rx[2] == tx[1]) &&
  623. (rx[1] == tx[2]) &&
  624. (rx[3] == tx[3]))
  625. {
  626. Ret_Buf->year = ((rx[6]-'0')*1000) + ((rx[7]-'0')*100) + ((rx[8]-'0')*10) + ((rx[9]-'0')*1);
  627. Ret_Buf->month = ((rx[10]-'0')*10) + ((rx[11]-'0')*1);
  628. Ret_Buf->day = ((rx[12]-'0')*10) + ((rx[13]-'0')*1);
  629. Ret_Buf->hour = ((rx[14]-'0')*10) + ((rx[15]-'0')*1);
  630. Ret_Buf->min = ((rx[16]-'0')*10) + ((rx[17]-'0')*1);
  631. Ret_Buf->sec = ((rx[18]-'0')*10) + ((rx[19]-'0')*1);
  632. result = PASS;
  633. }
  634. }
  635. return result;
  636. }
  637. unsigned char Query_AC_MCU_Status(unsigned char fd, unsigned char targetAddr, Ac_Primary_Mcu *Ret_Buf)
  638. {
  639. unsigned char result = FAIL;
  640. unsigned char tx[7] = {0xaa, 0x00, targetAddr, CMD_QUERY_AC_STATUS, 0x00, 0x00, 0x00};
  641. unsigned char rx[512];
  642. unsigned char chksum = 0x00;
  643. unsigned char len = tranceive(fd, tx, sizeof(tx), rx);
  644. if(len > 6)
  645. {
  646. if(len < 6+(rx[4] | rx[5]<<8))
  647. return result;
  648. for(int idx=0;idx<(rx[4] | rx[5]<<8);idx++)
  649. {
  650. chksum ^= rx[6+idx];
  651. }
  652. if((chksum == rx[6+(rx[4] | rx[5]<<8)]) &&
  653. (rx[2] == tx[1]) &&
  654. (rx[1] == tx[2]) &&
  655. (rx[3] == tx[3]))
  656. {
  657. Ret_Buf->cp_state = rx[6];
  658. Ret_Buf->current_limit = rx[7] | (rx[8]<<0x08);
  659. Ret_Buf->cp_voltage_positive = (rx[9] | (rx[10]<<0x08))/100.0;
  660. Ret_Buf->cp_voltage_negtive = (rx[11] | (rx[12]<<0x08))/100.0;
  661. Ret_Buf->locker_state = rx[13];
  662. Ret_Buf->relay_state = rx[14];
  663. Ret_Buf->shutter_state = rx[15];
  664. Ret_Buf->meter_state = rx[16];
  665. Ret_Buf->pp_state = rx[17];
  666. Ret_Buf->rating_current = rx[18];
  667. Ret_Buf->rotatory_switch = (rx[19] & 0x0F);
  668. Ret_Buf->socket_e.isSocketEMode = (rx[20] & 0x01);
  669. Ret_Buf->socket_e.isSocketEPinOn = ((rx[20]>>1) & 0x01);
  670. result = PASS;
  671. }
  672. }
  673. return result;
  674. }
  675. unsigned char Query_AC_MCU_Alarm(unsigned char fd, unsigned char targetAddr, Ac_Primary_Mcu_Alarm *Ret_Buf)
  676. {
  677. unsigned char result = FAIL;
  678. unsigned char tx[7] = {0xaa, 0x00, targetAddr, CMD_QUERY_AC_ALARM, 0x00, 0x00, 0x00};
  679. unsigned char rx[512];
  680. unsigned char chksum = 0x00;
  681. unsigned char len = tranceive(fd, tx, sizeof(tx), rx);
  682. if(len > 6)
  683. {
  684. if(len < 6+(rx[4] | rx[5]<<8))
  685. return result;
  686. for(int idx=0;idx<(rx[4] | rx[5]<<8);idx++)
  687. {
  688. chksum ^= rx[6+idx];
  689. }
  690. if((chksum == rx[6+(rx[4] | rx[5]<<8)]) &&
  691. (rx[2] == tx[1]) &&
  692. (rx[1] == tx[2]) &&
  693. (rx[3] == tx[3]))
  694. {
  695. //rx[6]
  696. Ret_Buf->bits.OVP_L1 = (((rx[6]>>0)&0x01)?1:0);
  697. Ret_Buf->bits.UVP_L1 = (((rx[6]>>1)&0x01)?1:0);
  698. Ret_Buf->bits.OCP_L1 = (((rx[6]>>2)&0x01)?1:0);
  699. Ret_Buf->bits.OTP = (((rx[6]>>3)&0x01)?1:0);
  700. Ret_Buf->bits.gmi_fault = (((rx[6]>>4)&0x01)?1:0);
  701. Ret_Buf->bits.cp_fault = (((rx[6]>>5)&0x01)?1:0);
  702. Ret_Buf->bits.ac_leak = (((rx[6]>>6)&0x01)?1:0);
  703. Ret_Buf->bits.dc_leak = (((rx[6]>>7)&0x01)?1:0);
  704. //rx[7]
  705. Ret_Buf->bits.mcu_selftest_fail = (((rx[7]>>0)&0x01)?1:0);
  706. Ret_Buf->bits.handshaking_timeout = (((rx[7]>>1)&0x01)?1:0);
  707. Ret_Buf->bits.emergency_stop = (((rx[7]>>2)&0x01)?1:0);
  708. Ret_Buf->bits.relay_welding = (((rx[7]>>3)&0x01)?1:0);
  709. Ret_Buf->bits.leak_module_fail = (((rx[7]>>4)&0x01)?1:0);
  710. Ret_Buf->bits.shutter_fault = (((rx[7]>>5)&0x01)?1:0);
  711. Ret_Buf->bits.locker_fault = (((rx[7]>>6)&0x01)?1:0);
  712. Ret_Buf->bits.power_drop = (((rx[7]>>7)&0x01)?1:0);
  713. //rx[8] bit 3 reserved
  714. Ret_Buf->bits.short_circuit_L1 = (((rx[8]>>0)&0x01)?1:0);
  715. Ret_Buf->bits.rotate_switch_fault = (((rx[8]>>1)&0x01)?1:0);
  716. Ret_Buf->bits.relay_drive_fault = (((rx[8]>>2)&0x01)?1:0);
  717. if(ShmSysConfigAndInfo->SysConfig.AcPhaseCount == 3)
  718. {
  719. Ret_Buf->bits.OVP_L2 = (((rx[8]>>4)&0x01)?1:0);
  720. Ret_Buf->bits.OVP_L3 = (((rx[8]>>5)&0x01)?1:0);
  721. Ret_Buf->bits.UVP_L2 = (((rx[8]>>6)&0x01)?1:0);
  722. Ret_Buf->bits.UVP_L3 = (((rx[8]>>7)&0x01)?1:0);
  723. }
  724. //rx[9] bits 6 & 7 Reserved
  725. if(ShmSysConfigAndInfo->SysConfig.AcPhaseCount == 3)
  726. {
  727. Ret_Buf->bits.OCP_L2 = (((rx[9]>>0)&0x01)?1:0);
  728. Ret_Buf->bits.OCP_L3 = (((rx[9]>>1)&0x01)?1:0);
  729. Ret_Buf->bits.short_circuit_L2 = (((rx[9]>>2)&0x01)?1:0);
  730. Ret_Buf->bits.short_circuit_L3 = (((rx[9]>>3)&0x01)?1:0);
  731. }
  732. Ret_Buf->bits.meter_comm_timeout = (((rx[9]>>4)&0x01)?1:0);
  733. Ret_Buf->bits.meter_ic_comm_timeout = (((rx[9]>>5)&0x01)?1:0);
  734. Ret_Buf->bits.pilot_negative_error = (((rx[9]>>6)&0x01)?1:0);
  735. result = PASS;
  736. }
  737. }
  738. return result;
  739. }
  740. unsigned char Query_Present_OutputCurrent(unsigned char fd, unsigned char targetAddr, Presentoutputcurrent *Ret_Buf)
  741. {
  742. unsigned char result = FAIL;
  743. unsigned char tx[7] = {0xaa, 0x00, targetAddr, CMD_QUERY_PRESENT_OUTPUTCURRENT, 0x00, 0x00, 0x00};
  744. unsigned char rx[512];
  745. unsigned char chksum = 0x00;
  746. unsigned char len = tranceive(fd, tx, sizeof(tx), rx);
  747. if(len > 0)
  748. {
  749. if(len < 6+(rx[4] | rx[5]<<8))
  750. return result;
  751. for(int idx=0;idx<(rx[4] | rx[5]<<8);idx++)
  752. {
  753. chksum ^= rx[6+idx];
  754. }
  755. if((chksum == rx[6+(rx[4] | rx[5]<<8)]) &&
  756. (rx[2] == tx[1]) &&
  757. (rx[1] == tx[2]) &&
  758. (rx[3] == tx[3]))
  759. {
  760. Ret_Buf->L1N_L12[0] = (rx[6] | (rx[7]<<8))/10.0;
  761. if(ShmSysConfigAndInfo->SysConfig.AcPhaseCount == 3)
  762. {
  763. Ret_Buf->L2N_L23[0] = (rx[8] | (rx[9]<<8))/10.0;
  764. Ret_Buf->L3N_L31[0] = (rx[10] | (rx[11]<<8))/10.0;
  765. }
  766. Ret_Buf->L1N_L12[1] = (rx[12] | (rx[13]<<8))/10.0;
  767. if(ShmSysConfigAndInfo->SysConfig.AcPhaseCount == 3)
  768. {
  769. Ret_Buf->L2N_L23[1] = (rx[14] | (rx[15]<<8))/10.0;
  770. Ret_Buf->L3N_L31[1] = (rx[16] | (rx[17]<<8))/10.0;
  771. }
  772. result = PASS;
  773. }
  774. }
  775. return result;
  776. }
  777. unsigned char Query_Ble_Config(unsigned char fd, unsigned char targetAddr, Ble_Config_Data *Ret_Buf)
  778. {
  779. unsigned char result = FAIL;
  780. unsigned char tx[7] = {0xaa, 0x00, targetAddr, CMD_QUERY_BLE_CONFIG_DATA, 0x00, 0x00, 0x00};
  781. unsigned char rx[512];
  782. unsigned char chksum = 0x00;
  783. unsigned char len = tranceive(fd, tx, sizeof(tx), rx);
  784. if(len > 0)
  785. {
  786. if(len < 6+(rx[4] | rx[5]<<8))
  787. return result;
  788. for(int idx=0;idx<(rx[4] | rx[5]<<8);idx++)
  789. {
  790. chksum ^= rx[6+idx];
  791. }
  792. if((chksum == rx[6+(rx[4] | rx[5]<<8)]) &&
  793. (rx[2] == tx[1]) &&
  794. (rx[1] == tx[2]) &&
  795. (rx[3] == tx[3]))
  796. {
  797. Ret_Buf->isLogin = (rx[6]?0x01:0x00);
  798. Ret_Buf->isRequestStart = (rx[7]?0x01:0x00);
  799. Ret_Buf->isRequestStop = (rx[8]?0x01:0x00);
  800. result = PASS;
  801. }
  802. }
  803. return result;
  804. }
  805. unsigned char Query_Ble_Central_ID(unsigned char fd, unsigned char targetAddr, Ble_Login_Central_Id *Ret_Buf)
  806. {
  807. unsigned char result = FAIL;
  808. unsigned char tx[7] = {0xaa, 0x00, targetAddr, CMD_QUERY_BLE_CENTRAL_ID, 0x00, 0x00, 0x00};
  809. unsigned char rx[512];
  810. unsigned char chksum = 0x00;
  811. unsigned char len = tranceive(fd, tx, sizeof(tx), rx);
  812. if(len > 0)
  813. {
  814. if(len < 6+(rx[4] | rx[5]<<8))
  815. return result;
  816. for(int idx=0;idx<(rx[4] | rx[5]<<8);idx++)
  817. {
  818. chksum ^= rx[6+idx];
  819. }
  820. if((chksum == rx[6+(rx[4] | rx[5]<<8)]) &&
  821. (rx[2] == tx[1]) &&
  822. (rx[1] == tx[2]) &&
  823. (rx[3] == tx[3]))
  824. {
  825. memset(Ret_Buf->id, 0x00, ARRAY_SIZE(Ret_Buf->id));
  826. memcpy(&Ret_Buf->id[0], &rx[6], (rx[4] | (rx[5]<<8)));
  827. result = PASS;
  828. }
  829. }
  830. return result;
  831. }
  832. unsigned char Query_Power_Consumption(unsigned char fd, unsigned char targetAddr, Power_Consumption *Ret_Buf_T, Power_Consumption *Ret_Buf_L1, Power_Consumption *Ret_Buf_L2, Power_Consumption *Ret_Buf_L3)
  833. {
  834. unsigned char result = FAIL;
  835. unsigned char tx[7] = {0xaa, 0x00, targetAddr, CMD_QUERY_POWER_CONSUMPTION, 0x00, 0x00, 0x00};
  836. unsigned char rx[512];
  837. unsigned char chksum = 0x00;
  838. unsigned char len = tranceive(fd, tx, sizeof(tx), rx);
  839. if(len > 0)
  840. {
  841. if(len < 6+(rx[4] | rx[5]<<8))
  842. return result;
  843. for(int idx=0;idx<(rx[4] | rx[5]<<8);idx++)
  844. {
  845. chksum ^= rx[6+idx];
  846. }
  847. if((chksum == rx[6+(rx[4] | rx[5]<<8)]) &&
  848. (rx[2] == tx[1]) &&
  849. (rx[1] == tx[2]) &&
  850. (rx[3] == tx[3]))
  851. {
  852. #ifndef SIMULATION
  853. Ret_Buf_T-> power_consumption = ((uint64_t)rx[6] | (((uint64_t)rx[7])<<8) | (((uint64_t)rx[8])<<16) | (((uint64_t)rx[9])<<24) | (((uint64_t)rx[10])<<32) | (((uint64_t)rx[11])<<40) | (((uint64_t)rx[12])<<48) | (((uint64_t)rx[13])<<56));
  854. Ret_Buf_L1-> power_consumption = ((uint64_t)rx[14] | (((uint64_t)rx[15])<<8) | (((uint64_t)rx[16])<<16) | (((uint64_t)rx[17])<<24) | (((uint64_t)rx[18])<<32) | (((uint64_t)rx[19])<<40) | (((uint64_t)rx[20])<<48) | (((uint64_t)rx[21])<<56));
  855. if(ShmSysConfigAndInfo->SysConfig.AcPhaseCount == 3)
  856. {
  857. Ret_Buf_L2-> power_consumption = ((uint64_t)rx[22] | (((uint64_t)rx[23])<<8) | (((uint64_t)rx[24])<<16) | (((uint64_t)rx[25])<<24) | (((uint64_t)rx[26])<<32) | (((uint64_t)rx[27])<<40) | (((uint64_t)rx[28])<<48) | (((uint64_t)rx[29])<<56));
  858. Ret_Buf_L3-> power_consumption = ((uint64_t)rx[30] | (((uint64_t)rx[31])<<8) | (((uint64_t)rx[32])<<16) | (((uint64_t)rx[33])<<24) | (((uint64_t)rx[34])<<32) | (((uint64_t)rx[35])<<40) | (((uint64_t)rx[36])<<48) | (((uint64_t)rx[37])<<56));
  859. }
  860. #else //SIMULATION
  861. tsNow = current_timestamp();
  862. if(ShmSysConfigAndInfo->SysConfig.AcPhaseCount == 3)
  863. {
  864. tmpPowerConsumption += ((uint64_t)((ShmSysConfigAndInfo->SysInfo.AcChargingData[0].PresentChargingVoltage*ShmSysConfigAndInfo->SysInfo.AcChargingData[0].PresentChargingCurrent)*((tsNow-tsLast)/360000.0)) +
  865. (uint64_t)((ShmSysConfigAndInfo->SysInfo.AcChargingData[0].PresentChargingVoltageL2*ShmSysConfigAndInfo->SysInfo.AcChargingData[0].PresentChargingCurrentL2)*((tsNow-tsLast)/360000.0)) +
  866. (uint64_t)((ShmSysConfigAndInfo->SysInfo.AcChargingData[0].PresentChargingVoltageL3*ShmSysConfigAndInfo->SysInfo.AcChargingData[0].PresentChargingCurrentL3)*((tsNow-tsLast)/360000.0)));
  867. tmpL1PowerConsumption += (uint64_t)((ShmSysConfigAndInfo->SysInfo.AcChargingData[0].PresentChargingVoltage*ShmSysConfigAndInfo->SysInfo.AcChargingData[0].PresentChargingCurrent)*((tsNow-tsLast)/360000.0));
  868. tmpL2PowerConsumption += (uint64_t)((ShmSysConfigAndInfo->SysInfo.AcChargingData[0].PresentChargingVoltageL2*ShmSysConfigAndInfo->SysInfo.AcChargingData[0].PresentChargingCurrentL2)*((tsNow-tsLast)/360000.0));
  869. tmpL3PowerConsumption += (uint64_t)((ShmSysConfigAndInfo->SysInfo.AcChargingData[0].PresentChargingVoltageL3*ShmSysConfigAndInfo->SysInfo.AcChargingData[0].PresentChargingCurrentL3)*((tsNow-tsLast)/360000.0));
  870. Ret_Buf_L1-> power_consumption = tmpL1PowerConsumption;
  871. Ret_Buf_L2-> power_consumption = tmpL2PowerConsumption;
  872. Ret_Buf_L3-> power_consumption = tmpL3PowerConsumption;
  873. }
  874. else
  875. {
  876. tmpPowerConsumption += (uint64_t)((ShmSysConfigAndInfo->SysInfo.AcChargingData[0].PresentChargingVoltage*ShmSysConfigAndInfo->SysInfo.AcChargingData[0].PresentChargingCurrent)*((tsNow-tsLast)/360000.0));
  877. }
  878. Ret_Buf_T-> power_consumption = tmpPowerConsumption;
  879. tsLast = tsNow;
  880. #endif //SIMULATION
  881. result = PASS;
  882. }
  883. }
  884. return result;
  885. }
  886. unsigned char Query_MeterIc_CorrectionPara(unsigned char fd, unsigned char targetAddr, MeterIcCorrection *Ret_Buf)
  887. {
  888. unsigned char result = FAIL;
  889. unsigned char tx[8] = {0xaa, 0x00, targetAddr, CMD_QUERY_METER_IC_CORRECTION_PARA, 0x01, 0x00, 0xb0, 0xb0};
  890. unsigned char rx[512];
  891. unsigned char chksum = 0x00;
  892. for(int idx=0;idx<(tx[4] | tx[5]<<8);idx++)
  893. chksum ^= tx[6+idx];
  894. tx[7] = chksum;
  895. unsigned char len = tranceive(fd, tx, sizeof(tx), rx);
  896. if(len > 0)
  897. {
  898. if(len < (6+(rx[4] | rx[5]<<8)))
  899. return result;
  900. chksum = 0x00;
  901. for(int idx=0;idx<(rx[4] | rx[5]<<8);idx++)
  902. {
  903. chksum ^= rx[6+idx];
  904. }
  905. if((chksum == rx[6+(rx[4] | rx[5]<<8)]) &&
  906. (rx[2] == tx[1]) &&
  907. (rx[1] == tx[2]) &&
  908. (rx[3] == tx[3]) &&
  909. (rx[6]) == 0xb0)
  910. {
  911. uint32_t cali_flag = (rx[7] | (rx[8]<<8) | (rx[9]<<16) | (rx[10]<<24));
  912. if(!(cali_flag & 0x80000000))
  913. {
  914. Ret_Buf->bits.isCalibratedVaGain = cali_flag & (1 << 0) ? 1 : 0;
  915. Ret_Buf->bits.isCalibratedVbGain = cali_flag & (1 << 1) ? 1 : 0;
  916. Ret_Buf->bits.isCalibratedVcGain = cali_flag & (1 << 2) ? 1 : 0;
  917. Ret_Buf->bits.isCalibratedVaOffset = cali_flag & (1 << 3) ? 1 : 0;
  918. Ret_Buf->bits.isCalibratedVbOffset = cali_flag & (1 << 4) ? 1 : 0;
  919. Ret_Buf->bits.isCalibratedVcOffset = cali_flag & (1 << 5) ? 1 : 0;
  920. Ret_Buf->bits.isCalibratedCaGain = cali_flag & (1 << 6) ? 1 : 0;
  921. Ret_Buf->bits.isCalibratedCbGain = cali_flag & (1 << 7) ? 1 : 0;
  922. Ret_Buf->bits.isCalibratedCcGain = cali_flag & (1 << 8) ? 1 : 0;
  923. Ret_Buf->bits.isCalibratedCaOffset = cali_flag & (1 << 9) ? 1 : 0;
  924. Ret_Buf->bits.isCalibratedCbOffset = cali_flag & (1 << 10) ? 1 : 0;
  925. Ret_Buf->bits.isCalibratedCcOffset = cali_flag & (1 << 11) ? 1 : 0;
  926. Ret_Buf->bits.isCalibratedPa = cali_flag & (1 << 12) ? 1 : 0;
  927. Ret_Buf->bits.isCalibratedPb = cali_flag & (1 << 13) ? 1 : 0;
  928. Ret_Buf->bits.isCalibratedPc = cali_flag & (1 << 14) ? 1 : 0;
  929. }
  930. else
  931. {
  932. Ret_Buf->value = 0;
  933. }
  934. result = PASS;
  935. }
  936. }
  937. return result;
  938. }
  939. unsigned char Query_AC_GUN_PLUGIN_TIMES(unsigned char fd, unsigned char targetAddr, Gun_Plugin_Times *Ret_Buf)
  940. {
  941. unsigned char result = FAIL;
  942. unsigned char tx[7] = {0xaa, 0x00, targetAddr, CMD_QUERY_GUN_PLUGIN_TIMES, 0x00, 0x00, 0x00};
  943. unsigned char rx[512];
  944. unsigned char chksum = 0x00;
  945. unsigned char len = tranceive(fd, tx, sizeof(tx), rx);
  946. if(len > 6)
  947. {
  948. if(len < 6+(rx[4] | rx[5]<<8))
  949. return result;
  950. for(int idx=0;idx<(rx[4] | rx[5]<<8);idx++)
  951. {
  952. chksum ^= rx[6+idx];
  953. }
  954. if((chksum == rx[6+(rx[4] | rx[5]<<8)]) &&
  955. (rx[2] == tx[1]) &&
  956. (rx[1] == tx[2]) &&
  957. (rx[3] == tx[3]))
  958. {
  959. Ret_Buf-> GunPluginTimes = ((uint32_t)rx[6] | (((uint32_t)rx[7])<<8) | (((uint32_t)rx[8])<<16) | (((uint32_t)rx[9])<<24));
  960. result = PASS;
  961. }
  962. }
  963. return result;
  964. }
  965. unsigned char Query_PTB_METER_MESSAGE(unsigned char fd, unsigned char targetAddr, Ptb_Meter *Ret_Buf, uint8_t CMD)
  966. {
  967. unsigned char result = FAIL;
  968. unsigned char tx[8] = {0};
  969. unsigned char rx[2048] = {0};
  970. unsigned char chksum = 0x00;
  971. tx[0] = 0xaa;
  972. tx[1] = 0x00;
  973. tx[2] = targetAddr;
  974. tx[3] = CMD_QUERY_PTB_METER_MESSAGE;
  975. tx[4] = 0x01;
  976. tx[5] = 0x00;
  977. tx[6] = CMD;
  978. for(int idx=0;idx<(tx[4] | tx[5]<<8);idx++)
  979. chksum ^= tx[6+idx];
  980. tx[7] = chksum;
  981. int len = tranceive(fd, tx, sizeof(tx), rx);
  982. if(len > 6)
  983. {
  984. if(len < 6+(rx[4] | rx[5]<<8))
  985. return result;
  986. chksum = 0x00;
  987. for(int idx=0;idx<(rx[4] | rx[5]<<8);idx++)
  988. {
  989. chksum ^= rx[6+idx];
  990. }
  991. if((chksum == rx[6+(rx[4] | rx[5]<<8)]) &&
  992. (rx[2] == tx[1]) &&
  993. (rx[1] == tx[2]) &&
  994. (rx[3] == tx[3]))
  995. {
  996. if(CMD == CMD_READ_OUTPUT_MESSAGE_FORMAT_ID)
  997. {
  998. memset(Ret_Buf->ReadOutputMessageFormatId, 0x00, ARRAY_SIZE(Ret_Buf->ReadOutputMessageFormatId));
  999. if(rx[6] == CMD_READ_OUTPUT_MESSAGE_FORMAT_ID)
  1000. {
  1001. memcpy(&Ret_Buf->ReadOutputMessageFormatId[0], &rx[8], ((rx[4] | (rx[5]<<8))-2));
  1002. }
  1003. }
  1004. else if(CMD == CMD_READ_OUTPUT_MESSAGE_LENGTH)
  1005. {
  1006. Ret_Buf->ReadOutputMessageLength = 0;
  1007. if(rx[6] == CMD_READ_OUTPUT_MESSAGE_LENGTH)
  1008. Ret_Buf->ReadOutputMessageLength = (rx[7] | (rx[8]<<8));
  1009. }
  1010. else if(CMD == CMD_READ_OUTPUT_MESSAGE)
  1011. {
  1012. memset(Ret_Buf->ReadOutputMessage, 0x00, ARRAY_SIZE(Ret_Buf->ReadOutputMessage));
  1013. if((Ret_Buf->ReadOutputMessageLength == ((rx[4] | (rx[5]<<8))-1)) && (rx[6] == CMD_READ_OUTPUT_MESSAGE))
  1014. {
  1015. memcpy(&Ret_Buf->ReadOutputMessage[0], &rx[7], ((rx[4] | (rx[5]<<8))-1));
  1016. }
  1017. }
  1018. else if(CMD == CMD_READ_OUTPUT_SIGNATURE_LENGTH)
  1019. {
  1020. Ret_Buf->ReadOuputSignatureLength = 0;
  1021. if(rx[6] == CMD_READ_OUTPUT_SIGNATURE_LENGTH)
  1022. Ret_Buf->ReadOuputSignatureLength = (rx[7] | (rx[8]<<8));
  1023. }
  1024. else if(CMD == CMD_READ_OUTPUT_SIGNATURE)
  1025. {
  1026. memset(Ret_Buf->ReadOutputSignature, 0x00, ARRAY_SIZE(Ret_Buf->ReadOutputSignature));
  1027. if((Ret_Buf->ReadOuputSignatureLength == ((rx[4] | (rx[5]<<8))-1)) && (rx[6] == CMD_READ_OUTPUT_SIGNATURE))
  1028. {
  1029. memcpy(&Ret_Buf->ReadOutputSignature[0], &rx[7], ((rx[4] | (rx[5]<<8))-1));
  1030. }
  1031. }
  1032. else if(CMD == CMD_READ_PUBLIC_KEY_HEADER_LENGTH)
  1033. {
  1034. Ret_Buf->ReadPublicKeyHeaderLength = 0;
  1035. if(rx[6] == CMD_READ_PUBLIC_KEY_HEADER_LENGTH)
  1036. Ret_Buf->ReadPublicKeyHeaderLength = (rx[7] | (rx[8]<<8));
  1037. }
  1038. else if(CMD == CMD_READ_PUBLIC_KEY_HEADER)
  1039. {
  1040. memset(Ret_Buf->ReadPublicKeyHeader, 0x00, ARRAY_SIZE(Ret_Buf->ReadPublicKeyHeader));
  1041. if((Ret_Buf->ReadPublicKeyHeaderLength == ((rx[4] | (rx[5]<<8))-1)) && (rx[6] == CMD_READ_PUBLIC_KEY_HEADER))
  1042. {
  1043. memcpy(&Ret_Buf->ReadPublicKeyHeader[0], &rx[7], ((rx[4] | (rx[5]<<8))-1));
  1044. }
  1045. }
  1046. else if(CMD == CMD_READ_PUBLIC_KEY_LENGTH)
  1047. {
  1048. Ret_Buf->ReadPublicKeyLength = 0;
  1049. if(rx[6] == CMD_READ_PUBLIC_KEY_LENGTH)
  1050. Ret_Buf->ReadPublicKeyLength = (rx[7] | (rx[8]<<8));
  1051. }
  1052. else if(CMD == CMD_READ_PUBLIC_KEY)
  1053. {
  1054. memset(Ret_Buf->ReadPublicKey, 0x00, ARRAY_SIZE(Ret_Buf->ReadPublicKey));
  1055. if((Ret_Buf->ReadPublicKeyLength == ((rx[4] | (rx[5]<<8))-1)) && (rx[6] == CMD_READ_PUBLIC_KEY))
  1056. {
  1057. memcpy(&Ret_Buf->ReadPublicKey[0], &rx[7], ((rx[4] | (rx[5]<<8))-1));
  1058. }
  1059. }
  1060. else
  1061. {}
  1062. result = PASS;
  1063. }
  1064. }
  1065. return result;
  1066. }
  1067. unsigned char Config_Fan_Speed(unsigned char fd, unsigned char targetAddr, FanSpeed *Set_Buf)
  1068. {
  1069. unsigned char result = FAIL;
  1070. unsigned char tx[15] = {0xaa, 0x00, targetAddr, CMD_CONFIG_FAN_SPEED, 0x08, 0x00, Set_Buf->speed[0]&0xff, (Set_Buf->speed[0]>>8)&0xff, Set_Buf->speed[1]&0xff, (Set_Buf->speed[1]>>8)&0xff, Set_Buf->speed[2]&0xff, (Set_Buf->speed[2]>>8)&0xff, Set_Buf->speed[3]&0xff, (Set_Buf->speed[3]>>8)&0xff, 0x00};
  1071. unsigned char rx[512];
  1072. unsigned char chksum = 0x00;
  1073. for(int idx=0;idx<(tx[4] | tx[5]<<8);idx++)
  1074. chksum ^= tx[6+idx];
  1075. tx[14] = chksum;
  1076. unsigned char len = tranceive(fd, tx, sizeof(tx), rx);
  1077. if(len > 6)
  1078. {
  1079. if(len < 6+(rx[4] | rx[5]<<8))
  1080. return result;
  1081. chksum = 0x00;
  1082. for(int idx=0;idx<(rx[4] | rx[5]<<8);idx++)
  1083. {
  1084. chksum ^= rx[6+idx];
  1085. }
  1086. if((chksum == rx[6+(rx[4] | rx[5]<<8)]) &&
  1087. (rx[2] == tx[1]) &&
  1088. (rx[1] == tx[2]) &&
  1089. (rx[3] == tx[3]) &&
  1090. (rx[6] == 0x01))
  1091. {
  1092. result = PASS;
  1093. }
  1094. }
  1095. return result;
  1096. }
  1097. unsigned char Config_Serial_Number(unsigned char fd, unsigned char targetAddr, Evse_Id *Set_Buf)
  1098. {
  1099. unsigned char result = FAIL;
  1100. unsigned char tx[27] = {0xaa, 0x00, targetAddr, CMD_CONFIG_SERIAL_NUMBER, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
  1101. unsigned char rx[512];
  1102. unsigned char chksum = 0x00;
  1103. memcpy(&tx[14], &Set_Buf->serial_number[0], ARRAY_SIZE(Set_Buf->serial_number));
  1104. for(int idx=0;idx<(tx[4] | tx[5]<<8);idx++)
  1105. chksum ^= tx[6+idx];
  1106. tx[26] = chksum;
  1107. unsigned char len = tranceive(fd, tx, sizeof(tx), rx);
  1108. if(len > 6)
  1109. {
  1110. if(len < 6+(rx[4] | rx[5]<<8))
  1111. return result;
  1112. chksum = 0x00;
  1113. for(int idx=0;idx<(rx[4] | rx[5]<<8);idx++)
  1114. {
  1115. chksum ^= rx[6+idx];
  1116. }
  1117. if((chksum == rx[6+(rx[4] | rx[5]<<8)]) &&
  1118. (rx[2] == tx[1]) &&
  1119. (rx[1] == tx[2]) &&
  1120. (rx[3] == tx[3]) &&
  1121. (rx[6] == 0x01))
  1122. {
  1123. result = PASS;
  1124. }
  1125. }
  1126. return result;
  1127. }
  1128. unsigned char Config_Model_Name(unsigned char fd, unsigned char targetAddr, Evse_Id *Set_Buf)
  1129. {
  1130. unsigned char result = FAIL;
  1131. unsigned char tx[21] = {0xaa, 0x00, targetAddr, CMD_CONFIG_MODEL_NAME, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
  1132. unsigned char rx[512];
  1133. unsigned char chksum = 0x00;
  1134. memcpy(&tx[6], &Set_Buf->model_name[0], ARRAY_SIZE(Set_Buf->model_name));
  1135. for(int idx=0;idx<(tx[4] | tx[5]<<8);idx++)
  1136. chksum ^= tx[6+idx];
  1137. tx[20] = chksum;
  1138. unsigned char len = tranceive(fd, tx, sizeof(tx), rx);
  1139. if(len > 6)
  1140. {
  1141. if(len < 6+(rx[4] | rx[5]<<8))
  1142. return result;
  1143. chksum = 0x00;
  1144. for(int idx=0;idx<(rx[4] | rx[5]<<8);idx++)
  1145. {
  1146. chksum ^= rx[6+idx];
  1147. }
  1148. if((chksum == rx[6+(rx[4] | rx[5]<<8)]) &&
  1149. (rx[2] == tx[1]) &&
  1150. (rx[1] == tx[2]) &&
  1151. (rx[3] == tx[3]) &&
  1152. (rx[6] == 0x01))
  1153. {
  1154. result = PASS;
  1155. }
  1156. }
  1157. return result;
  1158. }
  1159. unsigned char Config_Relay_Output(unsigned char fd, unsigned char targetAddr, Relay *Set_Buf)
  1160. {
  1161. unsigned char result = FAIL;
  1162. unsigned char tx[15] = {0};
  1163. unsigned char rx[512];
  1164. unsigned char chksum = 0x00;
  1165. tx[0] = 0xaa;
  1166. tx[1] = 0x00;
  1167. tx[2] = targetAddr;
  1168. tx[3] = CMD_CONFIG_RELAY_OUTPUT;
  1169. tx[4] = 0x08;
  1170. tx[5] = 0x00;
  1171. tx[6] = 0x00;
  1172. tx[7] = 0x00;
  1173. tx[8] = 0x00;
  1174. for(int idx_connector=0;idx_connector<2;idx_connector++)
  1175. for(int idx = 0;idx<8;idx++)
  1176. tx[9+idx_connector] |= ((Set_Buf->relay_status[idx_connector][idx]?0x01:0x00)<<idx);
  1177. tx[11] = 0x00;
  1178. tx[12] = 0x00;
  1179. tx[13] = 0x00;
  1180. for(int idx=0;idx<(tx[4] | tx[5]<<8);idx++)
  1181. chksum ^= tx[6+idx];
  1182. tx[14] = chksum;
  1183. //for(int count = 0; count < ARRAY_SIZE(tx); count++)
  1184. //printf("TX[%d] : %x \n",count, tx[count]);
  1185. unsigned char len = tranceive(fd, tx, sizeof(tx), rx);
  1186. if(len > 6)
  1187. {
  1188. if(len < 6+(rx[4] | rx[5]<<8))
  1189. return result;
  1190. chksum = 0x00;
  1191. for(int idx=0;idx<(rx[4] | rx[5]<<8);idx++)
  1192. {
  1193. chksum ^= rx[6+idx];
  1194. }
  1195. if((chksum == rx[6+(rx[4] | rx[5]<<8)]) &&
  1196. (rx[2] == tx[1]) &&
  1197. (rx[1] == tx[2]) &&
  1198. (rx[3] == tx[3]) &&
  1199. (rx[6] == 0x01))
  1200. {
  1201. result = PASS;
  1202. }
  1203. }
  1204. return result;
  1205. }
  1206. unsigned char Config_Gpio_Output(unsigned char fd, unsigned char targetAddr, Gpio_out *Set_Buf)
  1207. {
  1208. unsigned char result = FAIL;
  1209. unsigned char tx[9] = {0xaa, 0x00, targetAddr, CMD_CONFIG_GPIO_OUTPUT, 0x01, 0x00, 0x00, 0x00};
  1210. unsigned char rx[512];
  1211. unsigned char chksum = 0x00;
  1212. tx[6] |= (Set_Buf->AC_Connector?0x01:0x00);
  1213. for(int idx=0;idx<2;idx++)
  1214. tx[6] |= (Set_Buf->Button_LED[idx]?0x01:0x00)<<(1+idx);
  1215. for(int idx=0;idx<4;idx++)
  1216. tx[6] |= (Set_Buf->System_LED[idx]?0x01:0x00)<<(3+idx);
  1217. for(int idx=0;idx<(tx[4] | tx[5]<<8);idx++)
  1218. chksum ^= tx[6+idx];
  1219. tx[8] = chksum;
  1220. unsigned char len = tranceive(fd, tx, sizeof(tx), rx);
  1221. if(len > 6)
  1222. {
  1223. if(len < 6+(rx[4] | rx[5]<<8))
  1224. return result;
  1225. chksum = 0x00;
  1226. for(int idx=0;idx<(rx[4] | rx[5]<<8);idx++)
  1227. {
  1228. chksum ^= rx[6+idx];
  1229. }
  1230. if((chksum == rx[6+(rx[4] | rx[5]<<8)]) &&
  1231. (rx[2] == tx[1]) &&
  1232. (rx[1] == tx[2]) &&
  1233. (rx[3] == tx[3]) &&
  1234. (rx[6] == tx[6]))
  1235. {
  1236. result = PASS;
  1237. }
  1238. }
  1239. return result;
  1240. }
  1241. unsigned char Config_RTC(unsigned char fd, unsigned char targetAddr, Rtc *Set_Buf)
  1242. {
  1243. unsigned char result = FAIL;
  1244. unsigned char tx[21] = {0};
  1245. unsigned char rx[512];
  1246. unsigned char chksum = 0x00;
  1247. tx[0] = 0xaa;
  1248. tx[1] = 0x00;
  1249. tx[2] = targetAddr;
  1250. tx[3] = CMD_CONFIG_RTC;
  1251. tx[4] = 0x0e;
  1252. tx[5] = 0x00;
  1253. tx[6] = ((Set_Buf->year)/1000)+'0';
  1254. tx[7] = ((Set_Buf->year)/100%10)+'0';
  1255. tx[8] = ((Set_Buf->year)/10%10)+'0';
  1256. tx[9] = ((Set_Buf->year)%10)+'0';
  1257. tx[10] = ((Set_Buf->month)/10)+'0';
  1258. tx[11] = ((Set_Buf->month)%10)+'0';
  1259. tx[12] = ((Set_Buf->day)/10)+'0';
  1260. tx[13] = ((Set_Buf->day)%10)+'0';
  1261. tx[14] = ((Set_Buf->hour)/10)+'0';
  1262. tx[15] = ((Set_Buf->hour)%10)+'0';
  1263. tx[16] = ((Set_Buf->min)/10)+'0';
  1264. tx[17] = ((Set_Buf->min)%10)+'0';
  1265. tx[18] = ((Set_Buf->sec)/10)+'0';
  1266. tx[19] = ((Set_Buf->sec)%10)+'0';
  1267. for(int idx=0;idx<(tx[4] | tx[5]<<8);idx++)
  1268. chksum ^= tx[6+idx];
  1269. tx[20] = chksum;
  1270. unsigned char len = tranceive(fd, tx, sizeof(tx), rx);
  1271. if(len > 6)
  1272. {
  1273. if(len < 6+(rx[4] | rx[5]<<8))
  1274. return result;
  1275. chksum = 0x00;
  1276. for(int idx=0;idx<(rx[4] | rx[5]<<8);idx++)
  1277. {
  1278. chksum ^= rx[6+idx];
  1279. }
  1280. if((chksum == rx[6+(rx[4] | rx[5]<<8)]) &&
  1281. (rx[2] == tx[1]) &&
  1282. (rx[1] == tx[2]) &&
  1283. (rx[3] == tx[3]) &&
  1284. (rx[6] == 0x01))
  1285. {
  1286. result = PASS;
  1287. }
  1288. }
  1289. return result;
  1290. }
  1291. unsigned char Config_AC_MCU_LED(unsigned char fd, unsigned char targetAddr, Ac_Primary_Mcu_Led *Set_Buf)
  1292. {
  1293. unsigned char result = FAIL;
  1294. unsigned char tx[12] = {0};
  1295. unsigned char rx[512];
  1296. unsigned char chksum = 0x00;
  1297. tx[0] = 0xaa;
  1298. tx[1] = 0x00;
  1299. tx[2] = targetAddr;
  1300. tx[3] = CMD_CONFIG_AC_LED;
  1301. tx[4] = 0x05;
  1302. tx[5] = 0x00;
  1303. tx[6] = Set_Buf->mode;
  1304. tx[7] = ((Set_Buf->alarm_code>>0)&0xff);
  1305. tx[8] = ((Set_Buf->alarm_code>>8)&0xff);
  1306. tx[9] = ((Set_Buf->alarm_code>>16)&0xff);
  1307. tx[10] = ((Set_Buf->alarm_code>>24)&0xff);
  1308. for(int idx=0;idx<(tx[4] | tx[5]<<8);idx++)
  1309. chksum ^= tx[6+idx];
  1310. tx[11] = chksum;
  1311. unsigned char len = tranceive(fd, tx, sizeof(tx), rx);
  1312. if(len > 6)
  1313. {
  1314. if(len < 6+(rx[4] | rx[5]<<8))
  1315. return result;
  1316. chksum = 0x00;
  1317. for(int idx=0;idx<(rx[4] | rx[5]<<8);idx++)
  1318. {
  1319. chksum ^= rx[6+idx];
  1320. }
  1321. if((chksum == rx[6+(rx[4] | rx[5]<<8)]) &&
  1322. (rx[2] == tx[1]) &&
  1323. (rx[1] == tx[2]) &&
  1324. (rx[3] == tx[3]) &&
  1325. (rx[6] == 0x01))
  1326. {
  1327. result = PASS;
  1328. }
  1329. }
  1330. return result;
  1331. }
  1332. unsigned char Config_AC_MCU_LEGACY_REQUEST(unsigned char fd, unsigned char targetAddr, Legacy_Request *Set_Buf)
  1333. {
  1334. unsigned char result = FAIL;
  1335. unsigned char tx[9] = {0};
  1336. unsigned char rx[512];
  1337. unsigned char chksum = 0x00;
  1338. tx[0] = 0xaa;
  1339. tx[1] = 0x00;
  1340. tx[2] = targetAddr;
  1341. tx[3] = CMD_CONFIG_LEGACY_REQUEST;
  1342. tx[4] = 0x02;
  1343. tx[5] = 0x00;
  1344. tx[6] = Set_Buf->isLegacyRequest;
  1345. tx[7] = 0x00;
  1346. for(int idx=0;idx<(tx[4] | tx[5]<<8);idx++)
  1347. chksum ^= tx[6+idx];
  1348. tx[8] = chksum;
  1349. unsigned char len = tranceive(fd, tx, sizeof(tx), rx);
  1350. if(len > 6)
  1351. {
  1352. if(len < 6+(rx[4] | rx[5]<<8))
  1353. return result;
  1354. chksum = 0x00;
  1355. for(int idx=0;idx<(rx[4] | rx[5]<<8);idx++)
  1356. {
  1357. chksum ^= rx[6+idx];
  1358. }
  1359. if((chksum == rx[6+(rx[4] | rx[5]<<8)]) &&
  1360. (rx[2] == tx[1]) &&
  1361. (rx[1] == tx[2]) &&
  1362. (rx[3] == tx[3]) &&
  1363. (rx[6] == 0x01))
  1364. {
  1365. result = PASS;
  1366. }
  1367. }
  1368. return result;
  1369. }
  1370. unsigned char Config_AC_MCU_RESET_REQUEST(unsigned char fd, unsigned char targetAddr, Mcu_Reset_Request *Set_Buf)
  1371. {
  1372. unsigned char result = FAIL;
  1373. unsigned char tx[9] = {0};
  1374. unsigned char rx[512];
  1375. unsigned char chksum = 0x00;
  1376. tx[0] = 0xaa;
  1377. tx[1] = 0x00;
  1378. tx[2] = targetAddr;
  1379. tx[3] = CMD_CONFIG_MCU_RESET_REQUEST;
  1380. tx[4] = 0x02;
  1381. tx[5] = 0x00;
  1382. tx[6] = Set_Buf->isMcuResetRequest;
  1383. tx[7] = 0x00;
  1384. for(int idx=0;idx<(tx[4] | tx[5]<<8);idx++)
  1385. chksum ^= tx[6+idx];
  1386. tx[8] = chksum;
  1387. unsigned char len = tranceive(fd, tx, sizeof(tx), rx);
  1388. if(len > 6)
  1389. {
  1390. if(len < 6+(rx[4] | rx[5]<<8))
  1391. return result;
  1392. chksum = 0x00;
  1393. for(int idx=0;idx<(rx[4] | rx[5]<<8);idx++)
  1394. {
  1395. chksum ^= rx[6+idx];
  1396. }
  1397. if((chksum == rx[6+(rx[4] | rx[5]<<8)]) &&
  1398. (rx[2] == tx[1]) &&
  1399. (rx[1] == tx[2]) &&
  1400. (rx[3] == tx[3]) &&
  1401. (rx[6] == 0x01))
  1402. {
  1403. result = PASS;
  1404. }
  1405. }
  1406. return result;
  1407. }
  1408. unsigned char Config_AC_MaxCurrent_And_CpPwmDuty(unsigned char fd, unsigned char targetAddr, Ac_Primary_Mcu_Cp_Pwm_Duty *Set_Buf)
  1409. {
  1410. unsigned char result = FAIL;
  1411. unsigned char tx[8] = {0};
  1412. unsigned char rx[512];
  1413. unsigned char chksum = 0x00;
  1414. tx[0] = 0xaa;
  1415. tx[1] = 0x00;
  1416. tx[2] = targetAddr;
  1417. tx[3] = CMD_CONFIG_CURRENT_LINIT;
  1418. tx[4] = 0x01;
  1419. tx[5] = 0x00;
  1420. tx[6] = Set_Buf->max_current;
  1421. //DEBUG_WARN("Config_AC_MaxCurrent_And_CpPwmDuty...%d\n", Set_Buf->max_current);
  1422. for(int idx=0;idx<(tx[4] | tx[5]<<8);idx++)
  1423. chksum ^= tx[6+idx];
  1424. tx[7] = chksum;
  1425. unsigned char len = tranceive(fd, tx, sizeof(tx), rx);
  1426. if(len > 6)
  1427. {
  1428. if(len < 6+(rx[4] | rx[5]<<8))
  1429. return result;
  1430. chksum = 0x00;
  1431. for(int idx=0;idx<(rx[4] | rx[5]<<8);idx++)
  1432. {
  1433. chksum ^= rx[6+idx];
  1434. }
  1435. if((chksum == rx[6+(rx[4] | rx[5]<<8)]) &&
  1436. (rx[2] == tx[1]) &&
  1437. (rx[1] == tx[2]) &&
  1438. (rx[3] == tx[3]) &&
  1439. ((rx[6] == 0x00) || (rx[6] == 0x01)))
  1440. {
  1441. result = PASS;
  1442. }
  1443. }
  1444. return result;
  1445. }
  1446. unsigned char Config_AC_Set_Breathe_Led_Timing(unsigned char fd, unsigned char targetAddr,Set_Breathe_Led_Timing *Set_Buf)
  1447. {
  1448. unsigned char result = FAIL;
  1449. unsigned char tx[19] = {0};
  1450. unsigned char rx[512];
  1451. unsigned char chksum = 0x00;
  1452. tx[0] = 0xaa;
  1453. tx[1] = 0x00;
  1454. tx[2] = targetAddr;
  1455. tx[3] = CMD_CONFIG_MCU_SET_BREATHE_LED_TIMING;
  1456. tx[4] = 0x0C;
  1457. tx[5] = 0x00;
  1458. // Increase LED_ACTION_CONNECTED
  1459. tx[6] = (Set_Buf->set_Led_Action_Connected_Fade_In & 0xff);
  1460. tx[7] = (Set_Buf->set_Led_Action_Connected_Fade_In >> 8);
  1461. // Decrease LED_ACTION_CONNECTED
  1462. tx[8] = (Set_Buf->set_Led_Action_Connected_Fade_Out & 0xff);
  1463. tx[9] = (Set_Buf->set_Led_Action_Connected_Fade_Out >> 8);
  1464. // Increase LED_ACTION_AUTHED
  1465. tx[10] = (Set_Buf->set_Led_Action_Authed_Fade_In & 0xff);
  1466. tx[11] = (Set_Buf->set_Led_Action_Authed_Fade_In >> 8);
  1467. // Decrease LED_ACTION_AUTHED
  1468. tx[12] = (Set_Buf->set_Led_Action_Authed_Fade_Out & 0xff);
  1469. tx[13] = (Set_Buf->set_Led_Action_Authed_Fade_Out >> 8);
  1470. // Increase_LED_ACTION_CHARGING
  1471. tx[14] = (Set_Buf->Set_Led_Action_Chaging_Fade_In & 0xff);
  1472. tx[15] = (Set_Buf->Set_Led_Action_Chaging_Fade_In >> 8);
  1473. // Decrease_LED_ACTION_CHARGING
  1474. tx[16] = (Set_Buf->set_Led_Action_Chaging_Fade_Out & 0xff);
  1475. tx[17] = (Set_Buf->set_Led_Action_Chaging_Fade_Out >> 8);
  1476. for(int idx=0;idx<(tx[4] | tx[5]<<8);idx++)
  1477. chksum ^= tx[6+idx];
  1478. tx[18] = chksum;
  1479. unsigned char len = tranceive(fd, tx, sizeof(tx), rx);
  1480. if(len > 6)
  1481. {
  1482. if(len < 6+(rx[4] | rx[5]<<8))
  1483. return result;
  1484. chksum = 0x00;
  1485. for(int idx=0;idx<(rx[4] | rx[5]<<8);idx++)
  1486. {
  1487. chksum ^= rx[6+idx];
  1488. }
  1489. if((chksum == rx[6+(rx[4] | rx[5]<<8)]) &&
  1490. (rx[2] == tx[1]) &&
  1491. (rx[1] == tx[2]) &&
  1492. (rx[3] == tx[3]) &&
  1493. (rx[6] == 0x01))
  1494. {
  1495. result = PASS;
  1496. }
  1497. }
  1498. return result;
  1499. }
  1500. unsigned char Config_AC_Set_Led_Brightness(unsigned char fd, unsigned char targetAddr,Set_Led_Brightness *Set_Buf)
  1501. {
  1502. unsigned char result = FAIL;
  1503. unsigned char tx[19] = {0};
  1504. unsigned char rx[512];
  1505. unsigned char chksum = 0x00;
  1506. tx[0] = 0xaa;
  1507. tx[1] = 0x00;
  1508. tx[2] = targetAddr;
  1509. tx[3] = CMD_CONFIG_MCU_SET_LED_BRIGHTNESS;
  1510. tx[4] = 0x0C;
  1511. tx[5] = 0x00;
  1512. tx[6] = Set_Buf-> sector_1; // 0~1 AM and 1~2 AM
  1513. tx[7] = Set_Buf-> sector_2; // 2~3 AM and 3~4 AM
  1514. tx[8] = Set_Buf-> sector_3; // 4~5 AM and 5~6 AM
  1515. tx[9] = Set_Buf-> sector_4; // 6~7 AM and 7~8 AM
  1516. tx[10] = Set_Buf-> sector_5; // 8~9 AM and 9~10 AM
  1517. tx[11] = Set_Buf-> sector_6; // 10~11 AM and 11~12 AM
  1518. tx[12] = Set_Buf-> sector_7; // 12~13 PM and 13~14 PM
  1519. tx[13] = Set_Buf-> sector_8; // 14~15 PM and 15~16 PM
  1520. tx[14] = Set_Buf-> sector_9; // 16~17 PM and 17~18 PM
  1521. tx[15] = Set_Buf-> sector_10; // 18~19 PM and 19~20 PM
  1522. tx[16] = Set_Buf-> sector_11; // 20~21 PM and 21~22 PM
  1523. tx[17] = Set_Buf-> sector_12; // 22~23 PM and 23~24 PM
  1524. for(int idx=0;idx<(tx[4] | tx[5]<<8);idx++)
  1525. chksum ^= tx[6+idx];
  1526. tx[18] = chksum;
  1527. unsigned char len = tranceive(fd, tx, sizeof(tx), rx);
  1528. if(len > 6)
  1529. {
  1530. if(len < 6+(rx[4] | rx[5]<<8))
  1531. return result;
  1532. chksum = 0x00;
  1533. for(int idx=0;idx<(rx[4] | rx[5]<<8);idx++)
  1534. {
  1535. chksum ^= rx[6+idx];
  1536. }
  1537. if((chksum == rx[6+(rx[4] | rx[5]<<8)]) &&
  1538. (rx[2] == tx[1]) &&
  1539. (rx[1] == tx[2]) &&
  1540. (rx[3] == tx[3]) &&
  1541. (rx[6] == 0x01))
  1542. {
  1543. result = PASS;
  1544. }
  1545. }
  1546. return result;
  1547. }
  1548. unsigned char Config_Aux_Power_Switch(unsigned char fd, unsigned char targetAddr, Set_Aux_Power_Switch *Set_Buf)
  1549. {
  1550. unsigned char result = FAIL;
  1551. unsigned char tx[9];
  1552. unsigned char rx[512];
  1553. unsigned char chksum = 0x00;
  1554. tx[0] = 0xaa;
  1555. tx[1] = 0x00;
  1556. tx[2] = targetAddr;
  1557. tx[3] = CMD_CONFIG_AUX_POWER_SWITCH;
  1558. tx[4] = 0x02;
  1559. tx[5] = 0x00;
  1560. tx[6] = Set_Buf->power_type; // 0~1 AM and 1~2 AM
  1561. tx[7] = Set_Buf->power_switch; // 2~3 AM and 3~4 AM
  1562. for(int idx=0;idx<(tx[4] | tx[5]<<8);idx++)
  1563. chksum ^= tx[6+idx];
  1564. tx[8] = chksum;
  1565. unsigned char len = tranceive(fd, tx, sizeof(tx), rx);
  1566. if(len > 6)
  1567. {
  1568. if(len < 6+(rx[4] | rx[5]<<8))
  1569. return result;
  1570. chksum = 0x00;
  1571. for(int idx=0;idx<(rx[4] | rx[5]<<8);idx++)
  1572. {
  1573. chksum ^= rx[6+idx];
  1574. }
  1575. if((chksum == rx[6+(rx[4] | rx[5]<<8)]) &&
  1576. (rx[2] == tx[1]) &&
  1577. (rx[1] == tx[2]) &&
  1578. (rx[3] == tx[3]) &&
  1579. (rx[6] == 0x01))
  1580. {
  1581. result = PASS;
  1582. }
  1583. }
  1584. return result;
  1585. }
  1586. unsigned char Config_Ptb_Meter_Permission_Status(unsigned char fd, unsigned char targetAddr, Ptb_Meter *Set_Buf)
  1587. {
  1588. unsigned char result = FAIL;
  1589. unsigned char tx[8] = {0};
  1590. unsigned char rx[512];
  1591. unsigned char chksum = 0x00;
  1592. tx[0] = 0xaa;
  1593. tx[1] = 0x00;
  1594. tx[2] = targetAddr;
  1595. tx[3] = CMD_CONFIG_PTB_METER_PERMISSION;
  1596. tx[4] = 0x01;
  1597. tx[5] = 0x00;
  1598. tx[6] = Set_Buf->PtbMeterPermissionStatus;
  1599. for(int idx=0;idx<(tx[4] | tx[5]<<8);idx++)
  1600. chksum ^= tx[6+idx];
  1601. tx[7] = chksum;
  1602. unsigned char len = tranceive(fd, tx, sizeof(tx), rx);
  1603. if(len > 6)
  1604. {
  1605. if(len < 6+(rx[4] | rx[5]<<8))
  1606. return result;
  1607. chksum = 0x00;
  1608. for(int idx=0;idx<(rx[4] | rx[5]<<8);idx++)
  1609. {
  1610. chksum ^= rx[6+idx];
  1611. }
  1612. if((chksum == rx[6+(rx[4] | rx[5]<<8)]) &&
  1613. (rx[2] == tx[1]) &&
  1614. (rx[1] == tx[2]) &&
  1615. (rx[3] == tx[3]) &&
  1616. ((rx[6] == 0x00) || (rx[6] == 0x01)))
  1617. {
  1618. result = PASS;
  1619. }
  1620. }
  1621. return result;
  1622. }
  1623. unsigned char Update_Start(unsigned char fd, unsigned char targetAddr, unsigned int crc32)
  1624. {
  1625. unsigned char result = FAIL;
  1626. unsigned char tx[11] = {0xaa, 0x00, targetAddr, CMD_UPDATE_START, 0x04, 0x00, (crc32>>0)&0xff, (crc32>>8)&0xff, (crc32>>16)&0xff, (crc32>>24)&0xff, 0x00};
  1627. unsigned char rx[512];
  1628. unsigned char chksum = 0x00;
  1629. for(int idx=0;idx<(tx[4] | tx[5]<<8);idx++)
  1630. chksum ^= tx[6+idx];
  1631. tx[10] = chksum;
  1632. unsigned char len = tranceive(fd, tx, sizeof(tx), rx);
  1633. if(len > 6)
  1634. {
  1635. if(len < 6+(rx[4] | rx[5]<<8))
  1636. return result;
  1637. chksum = 0x00;
  1638. for(int idx = 0;idx<(rx[4] | rx[5]<<8);idx++)
  1639. {
  1640. chksum ^= rx[6+idx];
  1641. }
  1642. if((chksum == rx[6+(rx[4] | rx[5]<<8)]) &&
  1643. (rx[2] == tx[1]) &&
  1644. (rx[1] == tx[2]) &&
  1645. (rx[3] == tx[3]) &&
  1646. (rx[6] == 0x00))
  1647. {
  1648. result = PASS;
  1649. }
  1650. }
  1651. return result;
  1652. }
  1653. unsigned char Update_Abord(unsigned char fd, unsigned char targetAddr)
  1654. {
  1655. unsigned char result = FAIL;
  1656. unsigned char tx[7] = {0xaa, 0x00, targetAddr, CMD_UPDATE_ABOARD, 0x04, 0x00, 0x00};
  1657. unsigned char rx[512];
  1658. unsigned char chksum = 0x00;
  1659. unsigned char len = tranceive(fd, tx, sizeof(tx), rx);
  1660. if(len > 6)
  1661. {
  1662. if(len < 6+(rx[4] | rx[5]<<8))
  1663. return result;
  1664. for(int idx = 0;idx<(rx[4] | rx[5]<<8);idx++)
  1665. {
  1666. chksum ^= rx[6+idx];
  1667. }
  1668. if((chksum == rx[6+(rx[4] | rx[5]<<8)]) &&
  1669. (rx[2] == tx[1]) &&
  1670. (rx[1] == tx[2]) &&
  1671. (rx[3] == tx[3]) &&
  1672. (rx[6] == 0x00))
  1673. {
  1674. result = PASS;
  1675. }
  1676. }
  1677. return result;
  1678. }
  1679. unsigned char Update_Transfer(unsigned char fd, unsigned char targetAddr, unsigned int startAddr, unsigned char *data, unsigned short int length)
  1680. {
  1681. unsigned char result = FAIL;
  1682. unsigned char tx[11 + length];
  1683. unsigned char rx[512];
  1684. unsigned char chksum = 0x00;
  1685. tx[0] = 0xaa;
  1686. tx[1] = 0x00;
  1687. tx[2] = targetAddr;
  1688. tx[3] = CMD_UPDATE_TRANSFER;
  1689. tx[4] = (4 + length) & 0xff;
  1690. tx[5] = ((4 + length)>>8) & 0xff;
  1691. tx[6] = (startAddr>>0) & 0xff;
  1692. tx[7] = (startAddr>>8) & 0xff;
  1693. tx[8] = (startAddr>>16) & 0xff;
  1694. tx[9] = (startAddr>>24) & 0xff;
  1695. memcpy(tx+10, data, length);
  1696. for(int idx=0;idx<(tx[4] | tx[5]<<8);idx++)
  1697. chksum ^= tx[6+idx];
  1698. tx[ARRAY_SIZE(tx)-1] = chksum;
  1699. unsigned char len = tranceive(fd, tx, sizeof(tx), rx);
  1700. if(len > 6)
  1701. {
  1702. if(len < 6+(rx[4] | rx[5]<<8))
  1703. return result;
  1704. for(int idx = 0;idx<(rx[4] | rx[5]<<8);idx++)
  1705. {
  1706. chksum ^= rx[6+idx];
  1707. }
  1708. if((chksum == rx[6+(rx[4] | rx[5]<<8)]) &&
  1709. (rx[2] == tx[1]) &&
  1710. (rx[1] == tx[2]) &&
  1711. (rx[3] == tx[3]) &&
  1712. (rx[6] == 0x00))
  1713. {
  1714. result = PASS;
  1715. }
  1716. }
  1717. return result;
  1718. }
  1719. unsigned char Update_Finish(unsigned char fd, unsigned char targetAddr)
  1720. {
  1721. unsigned char result = FAIL;
  1722. unsigned char tx[7] = {0xaa, 0x00, targetAddr, CMD_UPDATE_END, 0x04, 0x00, 0x00};
  1723. unsigned char rx[512];
  1724. unsigned char chksum = 0x00;
  1725. unsigned char len = tranceive(fd, tx, sizeof(tx), rx);
  1726. if(len > 6)
  1727. {
  1728. if(len < 6+(rx[4] | rx[5]<<8))
  1729. return result;
  1730. for(int idx=0;idx<(rx[4] | rx[5]<<8);idx++)
  1731. {
  1732. chksum ^= rx[6+idx];
  1733. }
  1734. if((chksum == rx[6+(rx[4] | rx[5]<<8)]) &&
  1735. (rx[2] == tx[1]) &&
  1736. (rx[1] == tx[2]) &&
  1737. (rx[3] == tx[3]) &&
  1738. (rx[6] == 0x01))
  1739. {
  1740. result = PASS;
  1741. }
  1742. }
  1743. return result;
  1744. }
  1745. //================================================
  1746. // Main process
  1747. //================================================
  1748. int main(void)
  1749. {
  1750. int Uart1Fd;
  1751. unsigned short int failCount[2] = {0,0};
  1752. struct Charger previousCharger;
  1753. if(InitShareMemory() == FAIL)
  1754. {
  1755. #ifdef SystemLogMessage
  1756. DEBUG_ERROR("InitShareMemory NG\n");
  1757. #endif
  1758. if(ShmStatusCodeData!=NULL)
  1759. {
  1760. ShmStatusCodeData->AlarmCode.AlarmEvents.bits.FailToCreateShareMemory=1;
  1761. }
  1762. sleep(5);
  1763. return 0;
  1764. }
  1765. else
  1766. {
  1767. DEBUG_INFO("InitShareMemory OK.\n");
  1768. }
  1769. Uart1Fd=InitComPort();
  1770. if(Uart1Fd<0)
  1771. {
  1772. DEBUG_ERROR("InitComPort NG\n");
  1773. if(ShmStatusCodeData!=NULL)
  1774. {
  1775. ShmStatusCodeData->AlarmCode.AlarmEvents.bits.CsuInitFailed=1;
  1776. }
  1777. sleep(5);
  1778. return 0;
  1779. }
  1780. else
  1781. {
  1782. DEBUG_INFO("ttyS1 port open success.\n");
  1783. }
  1784. if(fork() == 0)
  1785. {
  1786. for(;;)
  1787. {
  1788. for(int gun_index=0;gun_index<AC_QUANTITY;gun_index++)
  1789. {
  1790. //==========================================================
  1791. // High priority polling log print out
  1792. //==========================================================
  1793. //==================================================
  1794. // Case 1: Configuration primary MCU LED
  1795. //==================================================
  1796. if((previousCharger.gun_info[gun_index].primaryMcuLed.mode != ShmCharger->gun_info[gun_index].primaryMcuLed.mode) ||
  1797. (previousCharger.gun_info[gun_index].primaryMcuLed.alarm_code != ShmCharger->gun_info[gun_index].primaryMcuLed.alarm_code))
  1798. {
  1799. DEBUG_INFO("*******************************************\n");
  1800. DEBUG_INFO("***** High priority polling : Case 1 ******\n");
  1801. DEBUG_INFO("*******************************************\n");
  1802. DEBUG_INFO("MCU-%d set Led mode : %d\n",gun_index, ShmCharger->gun_info[gun_index].primaryMcuLed.mode);
  1803. DEBUG_INFO("MCU-%d set Alarm code : %x\n",gun_index, ShmCharger->gun_info[gun_index].primaryMcuLed.alarm_code);
  1804. previousCharger.gun_info[gun_index].primaryMcuLed.mode = ShmCharger->gun_info[gun_index].primaryMcuLed.mode;
  1805. previousCharger.gun_info[gun_index].primaryMcuLed.alarm_code = ShmCharger->gun_info[gun_index].primaryMcuLed.alarm_code;
  1806. }
  1807. //==================================================
  1808. // Case 2: Configuration primary Legacy request
  1809. //==================================================
  1810. if(previousCharger.gun_info[gun_index].legacyRequest.isLegacyRequest != ShmCharger->gun_info[gun_index].legacyRequest.isLegacyRequest)
  1811. {
  1812. DEBUG_INFO("*******************************************\n");
  1813. DEBUG_INFO("***** High priority polling : Case 2 ******\n");
  1814. DEBUG_INFO("*******************************************\n");
  1815. DEBUG_INFO("MCU-%d set PWN request : %d\n", gun_index, ShmCharger->gun_info[gun_index].legacyRequest.isLegacyRequest);
  1816. previousCharger.gun_info[gun_index].legacyRequest.isLegacyRequest = ShmCharger->gun_info[gun_index].legacyRequest.isLegacyRequest;
  1817. }
  1818. //==================================================
  1819. // Case 2: Configuration primary Relay
  1820. //==================================================
  1821. if((previousCharger.gun_info[gun_index].primaryMcuState.relayState.relay_status[0][0] != ShmCharger->gun_info[gun_index].primaryMcuState.relayState.relay_status[0][0]) ||
  1822. (previousCharger.gun_info[gun_index].primaryMcuState.relayState.relay_status[0][1] != ShmCharger->gun_info[gun_index].primaryMcuState.relayState.relay_status[0][1]) ||
  1823. (previousCharger.gun_info[gun_index].primaryMcuState.relayState.relay_status[0][2] != ShmCharger->gun_info[gun_index].primaryMcuState.relayState.relay_status[0][2]) ||
  1824. (previousCharger.gun_info[gun_index].primaryMcuState.relayState.relay_status[0][3] != ShmCharger->gun_info[gun_index].primaryMcuState.relayState.relay_status[0][3]))
  1825. {
  1826. DEBUG_INFO("*******************************************\n");
  1827. DEBUG_INFO("**** High priority polling : Case 2-X *****\n");
  1828. DEBUG_INFO("*******************************************\n");
  1829. DEBUG_INFO("MCU-%d set relay status [0][0] : %d\n", gun_index, ShmCharger->gun_info[gun_index].primaryMcuState.relayState.relay_status[0][0]);
  1830. DEBUG_INFO("MCU-%d set relay status [0][1] : %d\n", gun_index, ShmCharger->gun_info[gun_index].primaryMcuState.relayState.relay_status[0][1]);
  1831. DEBUG_INFO("MCU-%d set relay status [0][2] : %d\n", gun_index, ShmCharger->gun_info[gun_index].primaryMcuState.relayState.relay_status[0][2]);
  1832. DEBUG_INFO("MCU-%d set relay status [0][3] : %d\n", gun_index, ShmCharger->gun_info[gun_index].primaryMcuState.relayState.relay_status[0][3]);
  1833. previousCharger.gun_info[gun_index].primaryMcuState.relayState.relay_status[0][0] = ShmCharger->gun_info[gun_index].primaryMcuState.relayState.relay_status[0][0];
  1834. previousCharger.gun_info[gun_index].primaryMcuState.relayState.relay_status[0][1] = ShmCharger->gun_info[gun_index].primaryMcuState.relayState.relay_status[0][1];
  1835. previousCharger.gun_info[gun_index].primaryMcuState.relayState.relay_status[0][2] = ShmCharger->gun_info[gun_index].primaryMcuState.relayState.relay_status[0][2];
  1836. previousCharger.gun_info[gun_index].primaryMcuState.relayState.relay_status[0][3] = ShmCharger->gun_info[gun_index].primaryMcuState.relayState.relay_status[0][3];
  1837. }
  1838. //==================================================
  1839. // Case 3: Query primary MCU status
  1840. //==================================================
  1841. if((previousCharger.gun_info[gun_index].primaryMcuState.cp_state != ShmCharger->gun_info[gun_index].primaryMcuState.cp_state) ||
  1842. (previousCharger.gun_info[gun_index].primaryMcuState.current_limit != ShmCharger->gun_info[gun_index].primaryMcuState.current_limit) ||
  1843. (previousCharger.gun_info[gun_index].primaryMcuState.relay_state != ShmCharger->gun_info[gun_index].primaryMcuState.relay_state) ||
  1844. (previousCharger.gun_info[gun_index].primaryMcuState.rotatory_switch != ShmCharger->gun_info[gun_index].primaryMcuState.rotatory_switch) ||
  1845. (previousCharger.gun_info[gun_index].primaryMcuState.socket_e.isSocketEMode != ShmCharger->gun_info[gun_index].primaryMcuState.socket_e.isSocketEMode) ||
  1846. (previousCharger.gun_info[gun_index].primaryMcuState.socket_e.isSocketEPinOn != ShmCharger->gun_info[gun_index].primaryMcuState.socket_e.isSocketEPinOn))
  1847. {
  1848. DEBUG_INFO("*******************************************\n");
  1849. DEBUG_INFO("***** High priority polling : Case 3 ******\n");
  1850. DEBUG_INFO("*******************************************\n");
  1851. DEBUG_INFO("MCU-%d get Pilot State : %d\n", gun_index, ShmCharger->gun_info[gun_index].primaryMcuState.cp_state);
  1852. DEBUG_INFO("MCU-%d get Pilot Duty : %.2f\n", gun_index, (float)ShmCharger->gun_info[gun_index].primaryMcuState.current_limit);
  1853. DEBUG_INFO("MCU-%d get Pilot Voltage Positive : %.2f\n", gun_index, ShmCharger->gun_info[gun_index].primaryMcuState.cp_voltage_positive);
  1854. DEBUG_INFO("MCU-%d get Pilot Voltage Negative : %.2f\n", gun_index, ShmCharger->gun_info[gun_index].primaryMcuState.cp_voltage_negtive);
  1855. if(ShmCharger->gun_info[gun_index].primaryMcuState.relay_state == ON)
  1856. {
  1857. if(ShmCharger->gun_info[gun_index].primaryMcuState.socket_e.isSocketEPinOn == ON)
  1858. DEBUG_INFO("Relay mode : CHARGING_MODE_SOCKETE. \n");
  1859. else
  1860. DEBUG_INFO("Relay mode : CHARGING_MODE_BS / CHARGING_MODE_HLC. \n");
  1861. }
  1862. DEBUG_INFO("MCU-%d get Relay State : %d\n", gun_index, ShmCharger->gun_info[gun_index].primaryMcuState.relay_state);
  1863. DEBUG_INFO("MCU-%d get Rating Current : %.2f\n", gun_index, (float)ShmCharger->gun_info[gun_index].primaryMcuState.rating_current);
  1864. DEBUG_INFO("MCU-%d get Rotary switch : %d\n", gun_index, ShmCharger->gun_info[gun_index].primaryMcuState.rotatory_switch);
  1865. DEBUG_INFO("MCU-%d get is on Socket-E mode : %d\n", gun_index, ShmCharger->gun_info[gun_index].primaryMcuState.socket_e.isSocketEMode);
  1866. DEBUG_INFO("MCU-%d get Socket-E detect pin : %d\n", gun_index, ShmCharger->gun_info[gun_index].primaryMcuState.socket_e.isSocketEPinOn);
  1867. DEBUG_INFO("MCU-%d get Locker State : %d\n", gun_index, ShmCharger->gun_info[gun_index].primaryMcuState.locker_state);
  1868. DEBUG_INFO("MCU-%d get Shutter State : %d\n", gun_index, ShmCharger->gun_info[gun_index].primaryMcuState.shutter_state);
  1869. DEBUG_INFO("MCU-%d get Meter State : %d\n", gun_index, ShmCharger->gun_info[gun_index].primaryMcuState.meter_state);
  1870. DEBUG_INFO("MCU-%d get PP State : %d\n", gun_index, ShmCharger->gun_info[gun_index].primaryMcuState.pp_state);
  1871. previousCharger.gun_info[gun_index].primaryMcuState.cp_state = ShmCharger->gun_info[gun_index].primaryMcuState.cp_state;
  1872. previousCharger.gun_info[gun_index].primaryMcuState.current_limit = ShmCharger->gun_info[gun_index].primaryMcuState.current_limit;
  1873. previousCharger.gun_info[gun_index].primaryMcuState.rotatory_switch = ShmCharger->gun_info[gun_index].primaryMcuState.rotatory_switch;
  1874. previousCharger.gun_info[gun_index].primaryMcuState.relay_state = ShmCharger->gun_info[gun_index].primaryMcuState.relay_state;
  1875. previousCharger.gun_info[gun_index].primaryMcuState.socket_e.isSocketEMode = ShmCharger->gun_info[gun_index].primaryMcuState.socket_e.isSocketEMode;
  1876. previousCharger.gun_info[gun_index].primaryMcuState.socket_e.isSocketEPinOn = ShmCharger->gun_info[gun_index].primaryMcuState.socket_e.isSocketEPinOn;
  1877. }
  1878. //==================================================
  1879. // Case 4: Query primary MCU Alarm code
  1880. //==================================================
  1881. if((previousCharger.gun_info[gun_index].primaryMcuAlarm.InputAlarmCode != ShmCharger->gun_info[gun_index].primaryMcuAlarm.InputAlarmCode))
  1882. {
  1883. if((ShmCharger->gun_info[gun_index].primaryMcuAlarm.InputAlarmCode>0))
  1884. {
  1885. DEBUG_INFO("*******************************************\n");
  1886. DEBUG_INFO("***** High priority polling : Case 4 ******\n");
  1887. DEBUG_INFO("*******************************************\n");
  1888. DEBUG_INFO("MCU-%d get OVP_L1 : %d\n", gun_index, ShmCharger->gun_info[gun_index].primaryMcuAlarm.bits.OVP_L1);
  1889. DEBUG_INFO("MCU-%d get UVP_L1 : %d\n", gun_index, ShmCharger->gun_info[gun_index].primaryMcuAlarm.bits.UVP_L1);
  1890. DEBUG_INFO("MCU-%d get OCP_L1 : %d\n", gun_index, ShmCharger->gun_info[gun_index].primaryMcuAlarm.bits.OCP_L1);
  1891. if(ShmSysConfigAndInfo->SysConfig.AcPhaseCount == 3)
  1892. {
  1893. DEBUG_INFO("MCU-%d get OVP_L2 : %d\n", gun_index, ShmCharger->gun_info[gun_index].primaryMcuAlarm.bits.OVP_L2);
  1894. DEBUG_INFO("MCU-%d get UVP_L2 : %d\n", gun_index, ShmCharger->gun_info[gun_index].primaryMcuAlarm.bits.UVP_L2);
  1895. DEBUG_INFO("MCU-%d get OCP_L2 : %d\n", gun_index, ShmCharger->gun_info[gun_index].primaryMcuAlarm.bits.OCP_L2);
  1896. DEBUG_INFO("MCU-%d get OVP_L3 : %d\n", gun_index, ShmCharger->gun_info[gun_index].primaryMcuAlarm.bits.OVP_L3);
  1897. DEBUG_INFO("MCU-%d get UVP_L3 : %d\n", gun_index, ShmCharger->gun_info[gun_index].primaryMcuAlarm.bits.UVP_L3);
  1898. DEBUG_INFO("MCU-%d get OCP_L3 : %d\n", gun_index, ShmCharger->gun_info[gun_index].primaryMcuAlarm.bits.OCP_L3);
  1899. }
  1900. DEBUG_INFO("MCU-%d get OTP : %d\n", gun_index, ShmCharger->gun_info[gun_index].primaryMcuAlarm.bits.OTP);
  1901. DEBUG_INFO("MCU-%d get gmi_fault : %d\n", gun_index, ShmCharger->gun_info[gun_index].primaryMcuAlarm.bits.gmi_fault);
  1902. DEBUG_INFO("MCU-%d get cp_fault : %d\n", gun_index, ShmCharger->gun_info[gun_index].primaryMcuAlarm.bits.cp_fault);
  1903. DEBUG_INFO("MCU-%d get ac_leak : %d\n", gun_index, ShmCharger->gun_info[gun_index].primaryMcuAlarm.bits.ac_leak);
  1904. DEBUG_INFO("MCU-%d get dc_leak : %d\n", gun_index, ShmCharger->gun_info[gun_index].primaryMcuAlarm.bits.dc_leak);
  1905. DEBUG_INFO("MCU-%d get mcu_selftest_fail : %d\n", gun_index, ShmCharger->gun_info[gun_index].primaryMcuAlarm.bits.mcu_selftest_fail);
  1906. DEBUG_INFO("MCU-%d get handshaking_timeout : %d\n", gun_index, ShmCharger->gun_info[gun_index].primaryMcuAlarm.bits.handshaking_timeout);
  1907. DEBUG_INFO("MCU-%d get emergency_stop : %d\n", gun_index, ShmCharger->gun_info[gun_index].primaryMcuAlarm.bits.emergency_stop);
  1908. DEBUG_INFO("MCU-%d get relay_welding : %d\n", gun_index, ShmCharger->gun_info[gun_index].primaryMcuAlarm.bits.relay_welding);
  1909. DEBUG_INFO("MCU-%d get leak_module_fail : %d\n", gun_index, ShmCharger->gun_info[gun_index].primaryMcuAlarm.bits.leak_module_fail);
  1910. DEBUG_INFO("MCU-%d get shutter_fault : %d\n", gun_index, ShmCharger->gun_info[gun_index].primaryMcuAlarm.bits.shutter_fault);
  1911. DEBUG_INFO("MCU-%d get locker_fault : %d\n", gun_index, ShmCharger->gun_info[gun_index].primaryMcuAlarm.bits.locker_fault);
  1912. DEBUG_INFO("MCU-%d get power_drop : %d\n", gun_index, ShmCharger->gun_info[gun_index].primaryMcuAlarm.bits.power_drop);
  1913. DEBUG_INFO("MCU-%d get rotate_switch_fault : %d\n", gun_index, ShmCharger->gun_info[gun_index].primaryMcuAlarm.bits.rotate_switch_fault);
  1914. DEBUG_INFO("MCU-%d get short_circuit_L1 : %d\n", gun_index, ShmCharger->gun_info[gun_index].primaryMcuAlarm.bits.short_circuit_L1);
  1915. if(ShmSysConfigAndInfo->SysConfig.AcPhaseCount == 3)
  1916. {
  1917. DEBUG_INFO("MCU-%d get short_circuit_L2 : %d\n", gun_index, ShmCharger->gun_info[gun_index].primaryMcuAlarm.bits.short_circuit_L2);
  1918. DEBUG_INFO("MCU-%d get short_circuit_L3 : %d\n", gun_index, ShmCharger->gun_info[gun_index].primaryMcuAlarm.bits.short_circuit_L3);
  1919. }
  1920. DEBUG_INFO("MCU-%d get relay_drive_fault : %d\n", gun_index, ShmCharger->gun_info[gun_index].primaryMcuAlarm.bits.relay_drive_fault);
  1921. DEBUG_INFO("MCU-%d get meter_comm_timeout : %d\n", gun_index, ShmCharger->gun_info[gun_index].primaryMcuAlarm.bits.meter_comm_timeout);
  1922. DEBUG_INFO("MCU-%d get meter_ic_comm_timeout : %d\n", gun_index, ShmCharger->gun_info[gun_index].primaryMcuAlarm.bits.meter_ic_comm_timeout);
  1923. DEBUG_INFO("MCU-%d get pilot_negative_error : %d\n", gun_index, ShmCharger->gun_info[gun_index].primaryMcuAlarm.bits.pilot_negative_error);
  1924. DEBUG_INFO("MCU-%d get InputAlarmCode : %x\n", gun_index, ShmCharger->gun_info[gun_index].primaryMcuAlarm.InputAlarmCode);
  1925. }
  1926. previousCharger.gun_info[gun_index].primaryMcuAlarm.InputAlarmCode = ShmCharger->gun_info[gun_index].primaryMcuAlarm.InputAlarmCode;
  1927. }
  1928. //==================================================
  1929. // Case 5: Query primary MCU BLE config
  1930. //==================================================
  1931. /*
  1932. if((previousCharger.gun_info[gun_index].bleConfigData.isLogin != ShmCharger->gun_info[gun_index].bleConfigData.isLogin) ||
  1933. (previousCharger.gun_info[gun_index].bleConfigData.isRequestStart != ShmCharger->gun_info[gun_index].bleConfigData.isRequestStart) ||
  1934. (previousCharger.gun_info[gun_index].bleConfigData.isRequestStop != ShmCharger->gun_info[gun_index].bleConfigData.isRequestStop))
  1935. {
  1936. if(ShmCharger->gun_info[gun_index].bleConfigData.isLogin == ON)
  1937. {
  1938. DEBUG_INFO("*******************************************\n");
  1939. DEBUG_INFO("***** High priority polling : Case 5 ******\n");
  1940. DEBUG_INFO("*******************************************\n");
  1941. DEBUG_INFO("MCU-%d get isUserLogin : %d\n", gun_index, ShmCharger->gun_info[gun_index].bleConfigData.isLogin);
  1942. DEBUG_INFO("MCU-%d get isRequestStartCharger : %d\n", gun_index, ShmCharger->gun_info[gun_index].bleConfigData.isRequestStart);
  1943. DEBUG_INFO("MCU-%d get isRequestStopCharger : %d\n", gun_index, ShmCharger->gun_info[gun_index].bleConfigData.isRequestStop);
  1944. }
  1945. previousCharger.gun_info[gun_index].bleConfigData.isLogin = ShmCharger->gun_info[gun_index].bleConfigData.isLogin;
  1946. previousCharger.gun_info[gun_index].bleConfigData.isRequestStart = ShmCharger->gun_info[gun_index].bleConfigData.isRequestStart;
  1947. previousCharger.gun_info[gun_index].bleConfigData.isRequestStop = ShmCharger->gun_info[gun_index].bleConfigData.isRequestStop;
  1948. }
  1949. */
  1950. //==================================================
  1951. // Case 6: Query primary MCU ble login id
  1952. //==================================================
  1953. /*
  1954. if((strcmp((char *)&previousCharger.gun_info[gun_index].bleLoginCentralId.id,(char *)&ShmCharger->gun_info[gun_index].bleLoginCentralId.id) != 0))
  1955. {
  1956. if(strcmp((char *)&ShmCharger->gun_info[gun_index].bleLoginCentralId.id,"") != 0)
  1957. {
  1958. DEBUG_INFO("*******************************************\n");
  1959. DEBUG_INFO("***** High priority polling : Case 6 ******\n");
  1960. DEBUG_INFO("*******************************************\n");
  1961. DEBUG_INFO("MCU-%d get ble central id : %s\n", gun_index, ShmCharger->gun_info[gun_index].bleLoginCentralId.id);
  1962. }
  1963. memcpy(&previousCharger.gun_info[gun_index].bleLoginCentralId.id, ShmCharger->gun_info[gun_index].bleLoginCentralId.id, ARRAY_SIZE(ShmCharger->gun_info[gun_index].bleLoginCentralId.id));
  1964. }
  1965. */
  1966. //==================================================
  1967. // Case 8: Config primary MCU duty
  1968. //==================================================
  1969. if(previousCharger.gun_info[gun_index].primaryMcuCp_Pwn_Duty.max_current != ShmCharger->gun_info[gun_index].primaryMcuCp_Pwn_Duty.max_current)
  1970. {
  1971. DEBUG_INFO("*******************************************\n");
  1972. DEBUG_INFO("***** High priority polling : Case 8 ******\n");
  1973. DEBUG_INFO("*******************************************\n");
  1974. DEBUG_INFO("MCU-%d set cp pwn duty : %d\n",gun_index, ShmCharger->gun_info[gun_index].primaryMcuCp_Pwn_Duty.max_current);
  1975. previousCharger.gun_info[gun_index].primaryMcuCp_Pwn_Duty.max_current = ShmCharger->gun_info[gun_index].primaryMcuCp_Pwn_Duty.max_current;
  1976. }
  1977. //==================================================
  1978. // Case 10: Query primary MCU power consumption
  1979. //==================================================
  1980. if((abs(ShmCharger->gun_info[gun_index].powerConsumptionTotal.power_consumption - previousCharger.gun_info[gun_index].powerConsumptionTotal.power_consumption) > 200) ||
  1981. (abs(ShmCharger->gun_info[gun_index].powerConsumption[0].power_consumption - previousCharger.gun_info[gun_index].powerConsumption[0].power_consumption) > 200) ||
  1982. (abs(ShmCharger->gun_info[gun_index].powerConsumption[1].power_consumption - previousCharger.gun_info[gun_index].powerConsumption[1].power_consumption) > 200) ||
  1983. (abs(ShmCharger->gun_info[gun_index].powerConsumption[2].power_consumption - previousCharger.gun_info[gun_index].powerConsumption[2].power_consumption) > 200))
  1984. {
  1985. DEBUG_INFO("*******************************************\n");
  1986. DEBUG_INFO("***** High priority polling : Case 10 *****\n");
  1987. DEBUG_INFO("*******************************************\n");
  1988. DEBUG_INFO("MCU-%d get total power consumption : %f kWh\n",gun_index, ((float)ShmCharger->gun_info[gun_index].powerConsumptionTotal.power_consumption/10000.0));
  1989. DEBUG_INFO("MCU-%d get L1N_L12 power consumption : %f kWh\n",gun_index, ((float)ShmCharger->gun_info[gun_index].powerConsumption[0].power_consumption/10000.0));
  1990. if(ShmSysConfigAndInfo->SysConfig.AcPhaseCount == 3)
  1991. {
  1992. DEBUG_INFO("MCU-%d get L2N_L23 power consumption : %f kWh\n",gun_index, ((float)ShmCharger->gun_info[gun_index].powerConsumption[1].power_consumption/10000.0));
  1993. DEBUG_INFO("MCU-%d get L3N_L31 power consumption : %f kWh\n",gun_index, ((float)ShmCharger->gun_info[gun_index].powerConsumption[2].power_consumption/10000.0));
  1994. }
  1995. previousCharger.gun_info[gun_index].powerConsumptionTotal.power_consumption = ShmCharger->gun_info[gun_index].powerConsumptionTotal.power_consumption;
  1996. previousCharger.gun_info[gun_index].powerConsumption[0].power_consumption = ShmCharger->gun_info[gun_index].powerConsumption[0].power_consumption;
  1997. previousCharger.gun_info[gun_index].powerConsumption[1].power_consumption = ShmCharger->gun_info[gun_index].powerConsumption[1].power_consumption;
  1998. previousCharger.gun_info[gun_index].powerConsumption[2].power_consumption = ShmCharger->gun_info[gun_index].powerConsumption[2].power_consumption;
  1999. }
  2000. //==================================================
  2001. // Case 11: Query primary Out put current config
  2002. //==================================================
  2003. if((abs((int)ShmCharger->gun_info[gun_index].outputCurrent.L1N_L12[0] - (int)previousCharger.gun_info[gun_index].outputCurrent.L1N_L12[0]) >= 2) ||
  2004. (abs((int)ShmCharger->gun_info[gun_index].outputCurrent.L2N_L23[0] - (int)previousCharger.gun_info[gun_index].outputCurrent.L2N_L23[0]) >= 2) ||
  2005. (abs((int)ShmCharger->gun_info[gun_index].outputCurrent.L3N_L31[0] - (int)previousCharger.gun_info[gun_index].outputCurrent.L3N_L31[0]) >= 2))
  2006. {
  2007. DEBUG_INFO("*******************************************\n");
  2008. DEBUG_INFO("***** High priority polling : Case 11 *****\n");
  2009. DEBUG_INFO("*******************************************\n");
  2010. DEBUG_INFO("MCU-%d get output current L1: %f\n", gun_index, (float)ShmCharger->gun_info[gun_index].outputCurrent.L1N_L12[0]);
  2011. if(ShmSysConfigAndInfo->SysConfig.AcPhaseCount == 3)
  2012. {
  2013. DEBUG_INFO("MCU-%d get output current L2: %f\n", gun_index, (float)ShmCharger->gun_info[gun_index].outputCurrent.L2N_L23[0]);
  2014. DEBUG_INFO("MCU-%d get output current L3: %f\n", gun_index, (float)ShmCharger->gun_info[gun_index].outputCurrent.L3N_L31[0]);
  2015. }
  2016. previousCharger.gun_info[gun_index].outputCurrent.L1N_L12[0] = ShmCharger->gun_info[gun_index].outputCurrent.L1N_L12[0];
  2017. previousCharger.gun_info[gun_index].outputCurrent.L2N_L23[0] = ShmCharger->gun_info[gun_index].outputCurrent.L2N_L23[0];
  2018. previousCharger.gun_info[gun_index].outputCurrent.L3N_L31[0] = ShmCharger->gun_info[gun_index].outputCurrent.L3N_L31[0];
  2019. }
  2020. //==================================================
  2021. // Case 12: Configuration PTB permission status
  2022. //==================================================
  2023. if(ShmSysConfigAndInfo->SysConfig.ModelName[3] == 'P')
  2024. {
  2025. if(previousCharger.gun_info[gun_index].Ptb_Meter_Parameters.PtbMeterPermissionStatus != ShmCharger->gun_info[gun_index].Ptb_Meter_Parameters.PtbMeterPermissionStatus)
  2026. {
  2027. DEBUG_INFO("*******************************************\n");
  2028. DEBUG_INFO("***** High priority polling : Case 12 *****\n");
  2029. DEBUG_INFO("*******************************************\n");
  2030. if(ShmCharger->gun_info[gun_index].Ptb_Meter_Parameters.PtbMeterPermissionStatus == PERMISSION_START_CHARGING)
  2031. {
  2032. DEBUG_INFO("MCU-%d set permission to PTB meter: %d [Start Charging] \n", gun_index, ShmCharger->gun_info[gun_index].Ptb_Meter_Parameters.PtbMeterPermissionStatus);
  2033. }
  2034. else if(ShmCharger->gun_info[gun_index].Ptb_Meter_Parameters.PtbMeterPermissionStatus == PERMISSION_END_CHARGING)
  2035. {
  2036. DEBUG_INFO("MCU-%d set permission to PTB meter: %d [End Charging] \n", gun_index, ShmCharger->gun_info[gun_index].Ptb_Meter_Parameters.PtbMeterPermissionStatus);
  2037. }
  2038. else
  2039. {}
  2040. previousCharger.gun_info[gun_index].Ptb_Meter_Parameters.PtbMeterPermissionStatus = ShmCharger->gun_info[gun_index].Ptb_Meter_Parameters.PtbMeterPermissionStatus;
  2041. }
  2042. }
  2043. //==================================================
  2044. // Case 13: Case 13; Query PTB meter messages
  2045. //==================================================
  2046. if(ShmSysConfigAndInfo->SysConfig.ModelName[3] == 'P')
  2047. {
  2048. if((strcmp((char*)previousCharger.gun_info[gun_index].Ptb_Meter_Parameters.ReadOutputMessageFormatId, (char*)ShmCharger->gun_info[gun_index].Ptb_Meter_Parameters.ReadOutputMessageFormatId) != 0))
  2049. {
  2050. DEBUG_INFO("*******************************************\n");
  2051. DEBUG_INFO("** High priority polling : Case 13-0x10 ***\n");
  2052. DEBUG_INFO("*******************************************\n");
  2053. DEBUG_INFO("MCU-%d get PTB meter output message format id: %s \n", gun_index, &ShmCharger->gun_info[gun_index].Ptb_Meter_Parameters.ReadOutputMessageFormatId);
  2054. memcpy((char*)previousCharger.gun_info[gun_index].Ptb_Meter_Parameters.ReadOutputMessageFormatId,(char*)ShmCharger->gun_info[gun_index].Ptb_Meter_Parameters.ReadOutputMessageFormatId,ARRAY_SIZE(ShmCharger->gun_info[gun_index].Ptb_Meter_Parameters.ReadOutputMessageFormatId));
  2055. }
  2056. if(previousCharger.gun_info[gun_index].Ptb_Meter_Parameters.ReadOutputMessageLength != ShmCharger->gun_info[gun_index].Ptb_Meter_Parameters.ReadOutputMessageLength)
  2057. {
  2058. DEBUG_INFO("*******************************************\n");
  2059. DEBUG_INFO("** High priority polling : Case 13-0x11 ***\n");
  2060. DEBUG_INFO("*******************************************\n");
  2061. DEBUG_INFO("MCU-%d get PTB meter output message length: %d \n", gun_index, ShmCharger->gun_info[gun_index].Ptb_Meter_Parameters.ReadOutputMessageLength);
  2062. previousCharger.gun_info[gun_index].Ptb_Meter_Parameters.ReadOutputMessageLength = ShmCharger->gun_info[gun_index].Ptb_Meter_Parameters.ReadOutputMessageLength;
  2063. }
  2064. if((strcmp((char*)previousCharger.gun_info[gun_index].Ptb_Meter_Parameters.ReadOutputMessage, (char*)ShmCharger->gun_info[gun_index].Ptb_Meter_Parameters.ReadOutputMessage) != 0))
  2065. {
  2066. DEBUG_INFO("*******************************************\n");
  2067. DEBUG_INFO("** High priority polling : Case 13-0x12 ***\n");
  2068. DEBUG_INFO("*******************************************\n");
  2069. DEBUG_INFO("MCU-%d get PTB meter output message: %s \n", gun_index, &ShmCharger->gun_info[gun_index].Ptb_Meter_Parameters.ReadOutputMessage);
  2070. memcpy((char*)previousCharger.gun_info[gun_index].Ptb_Meter_Parameters.ReadOutputMessage,(char*)ShmCharger->gun_info[gun_index].Ptb_Meter_Parameters.ReadOutputMessage,ARRAY_SIZE(ShmCharger->gun_info[gun_index].Ptb_Meter_Parameters.ReadOutputMessage));
  2071. }
  2072. if(previousCharger.gun_info[gun_index].Ptb_Meter_Parameters.ReadOuputSignatureLength != ShmCharger->gun_info[gun_index].Ptb_Meter_Parameters.ReadOuputSignatureLength)
  2073. {
  2074. DEBUG_INFO("*******************************************\n");
  2075. DEBUG_INFO("** High priority polling : Case 13-0x13 ***\n");
  2076. DEBUG_INFO("*******************************************\n");
  2077. DEBUG_INFO("MCU-%d get PTB meter output signature length: %d \n", gun_index, ShmCharger->gun_info[gun_index].Ptb_Meter_Parameters.ReadOuputSignatureLength);
  2078. previousCharger.gun_info[gun_index].Ptb_Meter_Parameters.ReadOuputSignatureLength = ShmCharger->gun_info[gun_index].Ptb_Meter_Parameters.ReadOuputSignatureLength;
  2079. }
  2080. if((strcmp((char*)previousCharger.gun_info[gun_index].Ptb_Meter_Parameters.ReadOutputSignature, (char*)ShmCharger->gun_info[gun_index].Ptb_Meter_Parameters.ReadOutputSignature) != 0))
  2081. {
  2082. DEBUG_INFO("*******************************************\n");
  2083. DEBUG_INFO("** High priority polling : Case 13-0x14 ***\n");
  2084. DEBUG_INFO("*******************************************\n");
  2085. DEBUG_INFO("MCU-%d get PTB meter output signature: %s \n", gun_index, &ShmCharger->gun_info[gun_index].Ptb_Meter_Parameters.ReadOutputSignature);
  2086. memcpy((char*)previousCharger.gun_info[gun_index].Ptb_Meter_Parameters.ReadOutputSignature,(char*)ShmCharger->gun_info[gun_index].Ptb_Meter_Parameters.ReadOutputSignature,ARRAY_SIZE(ShmCharger->gun_info[gun_index].Ptb_Meter_Parameters.ReadOutputSignature));
  2087. }
  2088. if(previousCharger.gun_info[gun_index].Ptb_Meter_Parameters.ReadPublicKeyHeaderLength != ShmCharger->gun_info[gun_index].Ptb_Meter_Parameters.ReadPublicKeyHeaderLength)
  2089. {
  2090. DEBUG_INFO("*******************************************\n");
  2091. DEBUG_INFO("** High priority polling : Case 13-0x15 ***\n");
  2092. DEBUG_INFO("*******************************************\n");
  2093. DEBUG_INFO("MCU-%d get PTB meter public key header length: %d \n", gun_index, ShmCharger->gun_info[gun_index].Ptb_Meter_Parameters.ReadPublicKeyHeaderLength);
  2094. previousCharger.gun_info[gun_index].Ptb_Meter_Parameters.ReadPublicKeyHeaderLength = ShmCharger->gun_info[gun_index].Ptb_Meter_Parameters.ReadPublicKeyHeaderLength;
  2095. }
  2096. if((strcmp((char*)previousCharger.gun_info[gun_index].Ptb_Meter_Parameters.ReadPublicKeyHeader, (char*)ShmCharger->gun_info[gun_index].Ptb_Meter_Parameters.ReadPublicKeyHeader) != 0))
  2097. {
  2098. DEBUG_INFO("*******************************************\n");
  2099. DEBUG_INFO("** High priority polling : Case 13-0x16 ***\n");
  2100. DEBUG_INFO("*******************************************\n");
  2101. DEBUG_INFO("MCU-%d get PTB meter public key header: %s \n", gun_index, &ShmCharger->gun_info[gun_index].Ptb_Meter_Parameters.ReadPublicKeyHeader);
  2102. memcpy((char*)previousCharger.gun_info[gun_index].Ptb_Meter_Parameters.ReadPublicKeyHeader,(char*)ShmCharger->gun_info[gun_index].Ptb_Meter_Parameters.ReadPublicKeyHeader,ARRAY_SIZE(ShmCharger->gun_info[gun_index].Ptb_Meter_Parameters.ReadPublicKeyHeader));
  2103. }
  2104. if(previousCharger.gun_info[gun_index].Ptb_Meter_Parameters.ReadPublicKeyLength != ShmCharger->gun_info[gun_index].Ptb_Meter_Parameters.ReadPublicKeyLength)
  2105. {
  2106. DEBUG_INFO("*******************************************\n");
  2107. DEBUG_INFO("** High priority polling : Case 13-0x17 ***\n");
  2108. DEBUG_INFO("*******************************************\n");
  2109. DEBUG_INFO("MCU-%d get PTB meter public key length: %d \n", gun_index, ShmCharger->gun_info[gun_index].Ptb_Meter_Parameters.ReadPublicKeyLength);
  2110. previousCharger.gun_info[gun_index].Ptb_Meter_Parameters.ReadPublicKeyLength = ShmCharger->gun_info[gun_index].Ptb_Meter_Parameters.ReadPublicKeyLength;
  2111. }
  2112. if((strcmp((char*)previousCharger.gun_info[gun_index].Ptb_Meter_Parameters.ReadPublicKey, (char*)ShmCharger->gun_info[gun_index].Ptb_Meter_Parameters.ReadPublicKey) != 0))
  2113. {
  2114. DEBUG_INFO("*******************************************\n");
  2115. DEBUG_INFO("** High priority polling : Case 13-0x18 ***\n");
  2116. DEBUG_INFO("*******************************************\n");
  2117. DEBUG_INFO("MCU-%d get PTB meter public key: %s \n", gun_index, &ShmCharger->gun_info[gun_index].Ptb_Meter_Parameters.ReadPublicKey);
  2118. memcpy((char*)previousCharger.gun_info[gun_index].Ptb_Meter_Parameters.ReadPublicKey,(char*)ShmCharger->gun_info[gun_index].Ptb_Meter_Parameters.ReadPublicKey,ARRAY_SIZE(ShmCharger->gun_info[gun_index].Ptb_Meter_Parameters.ReadPublicKey));
  2119. }
  2120. }
  2121. //==========================================================
  2122. // Low priority polling log print out
  2123. //==========================================================
  2124. //==================================================
  2125. // Case 1: Query primary In put voltage
  2126. //==================================================
  2127. if((abs((int)ShmCharger->gun_info[gun_index].inputVoltage.L1N_L12 - (int)previousCharger.gun_info[gun_index].inputVoltage.L1N_L12) >= 2) ||
  2128. (abs((int)ShmCharger->gun_info[gun_index].inputVoltage.L2N_L23 - (int)previousCharger.gun_info[gun_index].inputVoltage.L2N_L23) >= 2) ||
  2129. (abs((int)ShmCharger->gun_info[gun_index].inputVoltage.L3N_L31 - (int)previousCharger.gun_info[gun_index].inputVoltage.L3N_L31) >= 2))
  2130. {
  2131. DEBUG_INFO("===========================================\n");
  2132. DEBUG_INFO("==== Normal priority polling : Case 1 =====\n");
  2133. DEBUG_INFO("===========================================\n");
  2134. DEBUG_INFO("MCU-%d get Input voltage L1: %.2f\n", gun_index, (float)ShmCharger->gun_info[gun_index].inputVoltage.L1N_L12);
  2135. DEBUG_INFO("MCU-%d get PresentChargingVoltage L1: %.2f\n", gun_index, (float)ShmSysConfigAndInfo->SysInfo.AcChargingData[gun_index].PresentChargingVoltage);
  2136. if(ShmSysConfigAndInfo->SysConfig.AcPhaseCount == 3)
  2137. {
  2138. DEBUG_INFO("MCU-%d get Input voltage L2: %f\n", gun_index, (float)ShmCharger->gun_info[gun_index].inputVoltage.L2N_L23);
  2139. DEBUG_INFO("MCU-%d get PresentChargingVoltage L2: %.2f\n", gun_index, (float)ShmSysConfigAndInfo->SysInfo.AcChargingData[gun_index].PresentChargingVoltageL2);
  2140. DEBUG_INFO("MCU-%d get Input voltage L3: %f\n", gun_index, (float)ShmCharger->gun_info[gun_index].inputVoltage.L3N_L31);
  2141. DEBUG_INFO("MCU-%d get PresentChargingVoltage L3: %.2f\n", gun_index, (float)ShmSysConfigAndInfo->SysInfo.AcChargingData[gun_index].PresentChargingVoltageL3);
  2142. }
  2143. previousCharger.gun_info[gun_index].inputVoltage.L1N_L12 = ShmCharger->gun_info[gun_index].inputVoltage.L1N_L12;
  2144. previousCharger.gun_info[gun_index].inputVoltage.L2N_L23 = ShmCharger->gun_info[gun_index].inputVoltage.L2N_L23;
  2145. previousCharger.gun_info[gun_index].inputVoltage.L3N_L31 = ShmCharger->gun_info[gun_index].inputVoltage.L3N_L31;
  2146. }
  2147. //==================================================
  2148. // Case 5: Query primary plug in times
  2149. //==================================================
  2150. if(previousCharger.gun_info[gun_index].gunPluginTimes.GunPluginTimes != ShmCharger->gun_info[gun_index].gunPluginTimes.GunPluginTimes)
  2151. {
  2152. DEBUG_INFO("===========================================\n");
  2153. DEBUG_INFO("==== Normal priority polling : Case 5 =====\n");
  2154. DEBUG_INFO("===========================================\n");
  2155. DEBUG_INFO("MCU-%d get gun plugin times : %ld\n", gun_index, (long)ShmCharger->gun_info[gun_index].gunPluginTimes.GunPluginTimes);
  2156. previousCharger.gun_info[gun_index].gunPluginTimes.GunPluginTimes = ShmCharger->gun_info[gun_index].gunPluginTimes.GunPluginTimes;
  2157. }
  2158. //==================================================
  2159. // Case 7: Query primary temperature
  2160. //==================================================
  2161. if(previousCharger.gun_info[gun_index].temperature.point[0] != ShmCharger->gun_info[gun_index].temperature.point[0])
  2162. {
  2163. DEBUG_INFO("===========================================\n");
  2164. DEBUG_INFO("==== Normal priority polling : Case 7 =====\n");
  2165. DEBUG_INFO("===========================================\n");
  2166. DEBUG_INFO("MCU-%d get temperature : %d\n", gun_index, ShmCharger->gun_info[gun_index].temperature.point[0]);
  2167. previousCharger.gun_info[gun_index].temperature.point[0] = ShmCharger->gun_info[gun_index].temperature.point[0];
  2168. }
  2169. //==================================================
  2170. // Case 11: Configuration primary RTC time
  2171. //==================================================
  2172. if(previousCharger.gun_info[gun_index].rtc.min != ShmCharger->gun_info[gun_index].rtc.min)
  2173. {
  2174. DEBUG_INFO("===========================================\n");
  2175. DEBUG_INFO("==== Normal priority polling : Case 11 ====\n");
  2176. DEBUG_INFO("===========================================\n");
  2177. if(ShmCharger->gun_info[gun_index].bleConfigData.isLogin && !ShmOCPP16Data->OcppConnStatus)
  2178. {
  2179. DEBUG_INFO("Sync from MCU-%d rtc OK...%04d-%02d-%02d %02d:%02d:%02d\n", gun_index,
  2180. ShmCharger->gun_info[gun_index].rtc.year,
  2181. ShmCharger->gun_info[gun_index].rtc.month,
  2182. ShmCharger->gun_info[gun_index].rtc.day,
  2183. ShmCharger->gun_info[gun_index].rtc.hour,
  2184. ShmCharger->gun_info[gun_index].rtc.min,
  2185. ShmCharger->gun_info[gun_index].rtc.sec);
  2186. }
  2187. else
  2188. {
  2189. DEBUG_INFO("MCU-%d set rtc OK...%04d-%02d-%02d %02d:%02d:%02d\n", gun_index,
  2190. ShmCharger->gun_info[gun_index].rtc.year,
  2191. ShmCharger->gun_info[gun_index].rtc.month,
  2192. ShmCharger->gun_info[gun_index].rtc.day,
  2193. ShmCharger->gun_info[gun_index].rtc.hour,
  2194. ShmCharger->gun_info[gun_index].rtc.min,
  2195. ShmCharger->gun_info[gun_index].rtc.sec);
  2196. }
  2197. previousCharger.gun_info[gun_index].rtc.min = ShmCharger->gun_info[gun_index].rtc.min;
  2198. }
  2199. //==================================================
  2200. // Case 15: Configuration led breathe timing
  2201. //==================================================
  2202. if((previousCharger.gun_info[gun_index].setBreatheLedTiming.set_Led_Action_Authed_Fade_In != ShmCharger->gun_info[gun_index].setBreatheLedTiming.set_Led_Action_Authed_Fade_In) ||
  2203. (previousCharger.gun_info[gun_index].setBreatheLedTiming.set_Led_Action_Authed_Fade_Out != ShmCharger->gun_info[gun_index].setBreatheLedTiming.set_Led_Action_Authed_Fade_Out) ||
  2204. (previousCharger.gun_info[gun_index].setBreatheLedTiming.Set_Led_Action_Chaging_Fade_In != ShmCharger->gun_info[gun_index].setBreatheLedTiming.Set_Led_Action_Chaging_Fade_In) ||
  2205. (previousCharger.gun_info[gun_index].setBreatheLedTiming.set_Led_Action_Chaging_Fade_Out != ShmCharger->gun_info[gun_index].setBreatheLedTiming.set_Led_Action_Chaging_Fade_Out) ||
  2206. (previousCharger.gun_info[gun_index].setBreatheLedTiming.set_Led_Action_Connected_Fade_In != ShmCharger->gun_info[gun_index].setBreatheLedTiming.set_Led_Action_Connected_Fade_In) ||
  2207. (previousCharger.gun_info[gun_index].setBreatheLedTiming.set_Led_Action_Connected_Fade_Out != ShmCharger->gun_info[gun_index].setBreatheLedTiming.set_Led_Action_Connected_Fade_Out))
  2208. {
  2209. if(ShmCharger->gun_info[gun_index].isSetBreatheLedTiming == ON)
  2210. {
  2211. DEBUG_INFO("===========================================\n");
  2212. DEBUG_INFO("==== Normal priority polling : Case 15 ====\n");
  2213. DEBUG_INFO("===========================================\n");
  2214. DEBUG_INFO("MCU-%d set breathe led timing : Authed Fade in [%ld].\n", gun_index, (long)ShmCharger->gun_info[gun_index].setBreatheLedTiming.set_Led_Action_Authed_Fade_In);
  2215. DEBUG_INFO("MCU-%d set breathe led timing : Authed Fade out [%ld].\n", gun_index, (long)ShmCharger->gun_info[gun_index].setBreatheLedTiming.set_Led_Action_Authed_Fade_Out);
  2216. DEBUG_INFO("MCU-%d set breathe led timing : Charging Fade in [%ld].\n", gun_index, (long)ShmCharger->gun_info[gun_index].setBreatheLedTiming.Set_Led_Action_Chaging_Fade_In);
  2217. DEBUG_INFO("MCU-%d set breathe led timing : Charging Fade out [%ld].\n", gun_index, (long)ShmCharger->gun_info[gun_index].setBreatheLedTiming.set_Led_Action_Chaging_Fade_Out);
  2218. DEBUG_INFO("MCU-%d set breathe led timing : Connected Fade in [%ld].\n", gun_index, (long)ShmCharger->gun_info[gun_index].setBreatheLedTiming.set_Led_Action_Connected_Fade_In);
  2219. DEBUG_INFO("MCU-%d set breathe led timing : Connected Fade out [%ld].\n", gun_index, (long)ShmCharger->gun_info[gun_index].setBreatheLedTiming.set_Led_Action_Connected_Fade_Out);
  2220. }
  2221. previousCharger.gun_info[gun_index].setBreatheLedTiming.set_Led_Action_Authed_Fade_In = ShmCharger->gun_info[gun_index].setBreatheLedTiming.set_Led_Action_Authed_Fade_In;
  2222. previousCharger.gun_info[gun_index].setBreatheLedTiming.set_Led_Action_Authed_Fade_Out = ShmCharger->gun_info[gun_index].setBreatheLedTiming.set_Led_Action_Authed_Fade_Out;
  2223. previousCharger.gun_info[gun_index].setBreatheLedTiming.Set_Led_Action_Chaging_Fade_In = ShmCharger->gun_info[gun_index].setBreatheLedTiming.Set_Led_Action_Chaging_Fade_In;
  2224. previousCharger.gun_info[gun_index].setBreatheLedTiming.set_Led_Action_Chaging_Fade_Out = ShmCharger->gun_info[gun_index].setBreatheLedTiming.set_Led_Action_Chaging_Fade_Out;
  2225. previousCharger.gun_info[gun_index].setBreatheLedTiming.set_Led_Action_Connected_Fade_In = ShmCharger->gun_info[gun_index].setBreatheLedTiming.set_Led_Action_Connected_Fade_In;
  2226. previousCharger.gun_info[gun_index].setBreatheLedTiming.set_Led_Action_Connected_Fade_Out = ShmCharger->gun_info[gun_index].setBreatheLedTiming.set_Led_Action_Connected_Fade_Out;
  2227. }
  2228. //==================================================
  2229. // Case 17: Configuration led brightness
  2230. //==================================================
  2231. if((previousCharger.gun_info[gun_index].setLedBrightness.sector_1 != ShmCharger->gun_info[gun_index].setLedBrightness.sector_1) ||
  2232. (previousCharger.gun_info[gun_index].setLedBrightness.sector_2 != ShmCharger->gun_info[gun_index].setLedBrightness.sector_2) ||
  2233. (previousCharger.gun_info[gun_index].setLedBrightness.sector_3 != ShmCharger->gun_info[gun_index].setLedBrightness.sector_3) ||
  2234. (previousCharger.gun_info[gun_index].setLedBrightness.sector_4 != ShmCharger->gun_info[gun_index].setLedBrightness.sector_4) ||
  2235. (previousCharger.gun_info[gun_index].setLedBrightness.sector_5 != ShmCharger->gun_info[gun_index].setLedBrightness.sector_5) ||
  2236. (previousCharger.gun_info[gun_index].setLedBrightness.sector_6 != ShmCharger->gun_info[gun_index].setLedBrightness.sector_6) ||
  2237. (previousCharger.gun_info[gun_index].setLedBrightness.sector_7 != ShmCharger->gun_info[gun_index].setLedBrightness.sector_7) ||
  2238. (previousCharger.gun_info[gun_index].setLedBrightness.sector_8 != ShmCharger->gun_info[gun_index].setLedBrightness.sector_8) ||
  2239. (previousCharger.gun_info[gun_index].setLedBrightness.sector_9 != ShmCharger->gun_info[gun_index].setLedBrightness.sector_9) ||
  2240. (previousCharger.gun_info[gun_index].setLedBrightness.sector_10 != ShmCharger->gun_info[gun_index].setLedBrightness.sector_10) ||
  2241. (previousCharger.gun_info[gun_index].setLedBrightness.sector_11 != ShmCharger->gun_info[gun_index].setLedBrightness.sector_11) ||
  2242. (previousCharger.gun_info[gun_index].setLedBrightness.sector_12 != ShmCharger->gun_info[gun_index].setLedBrightness.sector_12))
  2243. {
  2244. if(ShmCharger->gun_info[gun_index].isSetLedBrightness == ON)
  2245. {
  2246. DEBUG_INFO("===========================================\n");
  2247. DEBUG_INFO("==== Normal priority polling : Case 17 ====\n");
  2248. DEBUG_INFO("===========================================\n");
  2249. DEBUG_INFO("MCU-%d set led brightness Sector 01 : [%x].\n", gun_index, ShmCharger->gun_info[gun_index].setLedBrightness.sector_1);
  2250. DEBUG_INFO("MCU-%d set led brightness Sector 02 : [%x].\n", gun_index, ShmCharger->gun_info[gun_index].setLedBrightness.sector_2);
  2251. DEBUG_INFO("MCU-%d set led brightness Sector 03 : [%x].\n", gun_index, ShmCharger->gun_info[gun_index].setLedBrightness.sector_3);
  2252. DEBUG_INFO("MCU-%d set led brightness Sector 04 : [%x].\n", gun_index, ShmCharger->gun_info[gun_index].setLedBrightness.sector_4);
  2253. DEBUG_INFO("MCU-%d set led brightness Sector 05 : [%x].\n", gun_index, ShmCharger->gun_info[gun_index].setLedBrightness.sector_5);
  2254. DEBUG_INFO("MCU-%d set led brightness Sector 06 : [%x].\n", gun_index, ShmCharger->gun_info[gun_index].setLedBrightness.sector_6);
  2255. DEBUG_INFO("MCU-%d set led brightness Sector 07 : [%x].\n", gun_index, ShmCharger->gun_info[gun_index].setLedBrightness.sector_7);
  2256. DEBUG_INFO("MCU-%d set led brightness Sector 08 : [%x].\n", gun_index, ShmCharger->gun_info[gun_index].setLedBrightness.sector_8);
  2257. DEBUG_INFO("MCU-%d set led brightness Sector 09 : [%x].\n", gun_index, ShmCharger->gun_info[gun_index].setLedBrightness.sector_9);
  2258. DEBUG_INFO("MCU-%d set led brightness Sector 10 : [%x].\n", gun_index, ShmCharger->gun_info[gun_index].setLedBrightness.sector_10);
  2259. DEBUG_INFO("MCU-%d set led brightness Sector 11 : [%x].\n", gun_index, ShmCharger->gun_info[gun_index].setLedBrightness.sector_11);
  2260. DEBUG_INFO("MCU-%d set led brightness Sector 12 : [%x].\n", gun_index, ShmCharger->gun_info[gun_index].setLedBrightness.sector_12);
  2261. }
  2262. previousCharger.gun_info[gun_index].setLedBrightness.sector_1 = ShmCharger->gun_info[gun_index].setLedBrightness.sector_1;
  2263. previousCharger.gun_info[gun_index].setLedBrightness.sector_2 = ShmCharger->gun_info[gun_index].setLedBrightness.sector_2;
  2264. previousCharger.gun_info[gun_index].setLedBrightness.sector_3 = ShmCharger->gun_info[gun_index].setLedBrightness.sector_3;
  2265. previousCharger.gun_info[gun_index].setLedBrightness.sector_4 = ShmCharger->gun_info[gun_index].setLedBrightness.sector_4;
  2266. previousCharger.gun_info[gun_index].setLedBrightness.sector_5 = ShmCharger->gun_info[gun_index].setLedBrightness.sector_5;
  2267. previousCharger.gun_info[gun_index].setLedBrightness.sector_6 = ShmCharger->gun_info[gun_index].setLedBrightness.sector_6;
  2268. previousCharger.gun_info[gun_index].setLedBrightness.sector_7 = ShmCharger->gun_info[gun_index].setLedBrightness.sector_7;
  2269. previousCharger.gun_info[gun_index].setLedBrightness.sector_8 = ShmCharger->gun_info[gun_index].setLedBrightness.sector_8;
  2270. previousCharger.gun_info[gun_index].setLedBrightness.sector_9 = ShmCharger->gun_info[gun_index].setLedBrightness.sector_9;
  2271. previousCharger.gun_info[gun_index].setLedBrightness.sector_10 = ShmCharger->gun_info[gun_index].setLedBrightness.sector_10;
  2272. previousCharger.gun_info[gun_index].setLedBrightness.sector_11 = ShmCharger->gun_info[gun_index].setLedBrightness.sector_11;
  2273. previousCharger.gun_info[gun_index].setLedBrightness.sector_12 = ShmCharger->gun_info[gun_index].setLedBrightness.sector_12;
  2274. }
  2275. }
  2276. usleep(100000);
  2277. }
  2278. exit(0);
  2279. }
  2280. for(;;)
  2281. {
  2282. for(int gun_index=0;gun_index<AC_QUANTITY;gun_index++)
  2283. {
  2284. /*
  2285. * Polling loop
  2286. */
  2287. if((stepIndex%2)==0)
  2288. {
  2289. /*
  2290. * High priority communication
  2291. */
  2292. //========================================
  2293. // Case 1 : Configuration primary MCU LED
  2294. //========================================
  2295. ShmCharger->gun_info[gun_index].primaryMcuLed.alarm_code = ShmCharger->gun_info[gun_index].systemAlarmCode.SystemAlarmCode;
  2296. if(Config_AC_MCU_LED(Uart1Fd, (gun_index>0?ADDR_AC_PRIMARY_2:ADDR_AC_PRIMARY_1), &ShmCharger->gun_info[gun_index].primaryMcuLed))
  2297. {
  2298. failCount[gun_index] = 0;
  2299. }
  2300. else
  2301. {
  2302. DEBUG_WARN("MCU-%d set led fail...%d\n", gun_index, failCount[gun_index]);
  2303. if(failCount[gun_index]<USHRT_MAX)
  2304. failCount[gun_index]++;
  2305. else
  2306. failCount[gun_index] = FAIL_SPEC_COMM;
  2307. }
  2308. //========================================
  2309. // Case 2 : Configuration primary Legacy request
  2310. //========================================
  2311. if(Config_AC_MCU_LEGACY_REQUEST(Uart1Fd, (gun_index>0?ADDR_AC_PRIMARY_2:ADDR_AC_PRIMARY_1),&ShmCharger->gun_info[gun_index].legacyRequest))
  2312. {
  2313. failCount[gun_index] = 0;
  2314. }
  2315. else
  2316. {
  2317. DEBUG_WARN("MCU-%d set PWN request fail...%d\n", gun_index, failCount[gun_index]);
  2318. if(failCount[gun_index]<USHRT_MAX)
  2319. failCount[gun_index]++;
  2320. else
  2321. failCount[gun_index] = FAIL_SPEC_COMM;
  2322. }
  2323. //========================================
  2324. // Case 2-X : Configuration primary Relay
  2325. //========================================
  2326. if(Config_Relay_Output(Uart1Fd, (gun_index>0?ADDR_AC_PRIMARY_2:ADDR_AC_PRIMARY_1),&ShmCharger->gun_info[gun_index].primaryMcuState.relayState))
  2327. {
  2328. failCount[gun_index] = 0;
  2329. }
  2330. else
  2331. {
  2332. DEBUG_WARN("MCU-%d set relay fail...%d\n", gun_index, failCount[gun_index]);
  2333. if(failCount[gun_index]<USHRT_MAX)
  2334. failCount[gun_index]++;
  2335. else
  2336. failCount[gun_index] = FAIL_SPEC_COMM;
  2337. }
  2338. //========================================
  2339. // Case 3 : Query primary MCU status
  2340. //========================================
  2341. if(Query_AC_MCU_Status(Uart1Fd, (gun_index>0?ADDR_AC_PRIMARY_2:ADDR_AC_PRIMARY_1), &ShmCharger->gun_info[gun_index].primaryMcuState))
  2342. {
  2343. ShmSysConfigAndInfo->SysInfo.AcChargingData[gun_index].PilotState = ShmCharger->gun_info[gun_index].primaryMcuState.cp_state;
  2344. ShmSysConfigAndInfo->SysInfo.AcChargingData[gun_index].PilotDuty = (ShmCharger->gun_info[gun_index].primaryMcuState.current_limit>51?(unsigned char)((ShmCharger->gun_info[gun_index].primaryMcuState.current_limit/2.5)+64):(unsigned char)(ShmCharger->gun_info[gun_index].primaryMcuState.current_limit/0.6));
  2345. ShmSysConfigAndInfo->SysInfo.AcChargingData[gun_index].PilotVoltage = ShmCharger->gun_info[gun_index].primaryMcuState.cp_voltage_positive;
  2346. ShmCharger->gun_info[gun_index].PilotVoltage.PilotVoltagePositive = ShmCharger->gun_info[gun_index].primaryMcuState.cp_voltage_positive;
  2347. ShmCharger->gun_info[gun_index].PilotVoltage.PilotVoltageNegative = ShmCharger->gun_info[gun_index].primaryMcuState.cp_voltage_negtive;
  2348. //pass info 2 CCS task
  2349. if(ShmSysConfigAndInfo->SysInfo.AcChargingData[gun_index].PilotState == CP_STATE_UNKNOWN)
  2350. {
  2351. if(ShmCharger->gun_info[gun_index].PilotVoltage.PilotVoltageNegative >= -12)
  2352. {
  2353. ShmCharger->gun_info[gun_index].acCcsInfo.CpPresentState = CCS_CP_STATE_G;
  2354. }
  2355. else
  2356. {
  2357. ShmCharger->gun_info[gun_index].acCcsInfo.CpPresentState = CCS_CP_STATE_H;
  2358. }
  2359. }
  2360. else if(ShmSysConfigAndInfo->SysInfo.AcChargingData[gun_index].PilotState == CP_STATE_A)
  2361. {
  2362. ShmCharger->gun_info[gun_index].acCcsInfo.CpPresentState = CCS_CP_STATE_A;
  2363. }
  2364. else if(ShmSysConfigAndInfo->SysInfo.AcChargingData[gun_index].PilotState == CP_STATE_B)
  2365. {
  2366. if(ShmCharger->gun_info[gun_index].PilotVoltage.PilotVoltageNegative == 0.0)
  2367. {
  2368. ShmCharger->gun_info[gun_index].acCcsInfo.CpPresentState = CCS_CP_STATE_B1;
  2369. }
  2370. else
  2371. {
  2372. ShmCharger->gun_info[gun_index].acCcsInfo.CpPresentState = CCS_CP_STATE_B2;
  2373. }
  2374. }
  2375. else if(ShmSysConfigAndInfo->SysInfo.AcChargingData[gun_index].PilotState == CP_STATE_C)
  2376. {
  2377. ShmCharger->gun_info[gun_index].acCcsInfo.CpPresentState = CCS_CP_STATE_C;
  2378. }
  2379. else if(ShmSysConfigAndInfo->SysInfo.AcChargingData[gun_index].PilotState == CP_STATE_D)
  2380. {
  2381. ShmCharger->gun_info[gun_index].acCcsInfo.CpPresentState = CCS_CP_STATE_D;
  2382. }
  2383. else if(ShmSysConfigAndInfo->SysInfo.AcChargingData[gun_index].PilotState == CP_STATE_E)
  2384. {
  2385. ShmCharger->gun_info[gun_index].acCcsInfo.CpPresentState = CCS_CP_STATE_E;
  2386. }
  2387. else //CP_STATE_F
  2388. {
  2389. ShmCharger->gun_info[gun_index].acCcsInfo.CpPresentState = CCS_CP_STATE_F;
  2390. }
  2391. ShmCharger->gun_info[gun_index].acCcsInfo.CpPositiveVoltage = ShmCharger->gun_info[gun_index].PilotVoltage.PilotVoltagePositive;
  2392. ShmCharger->gun_info[gun_index].acCcsInfo.CpNegativeVoltage = ShmCharger->gun_info[gun_index].PilotVoltage.PilotVoltageNegative;
  2393. ShmCharger->gun_info[gun_index].acCcsInfo.CpPresentPWMDuty = ShmCharger->gun_info[gun_index].primaryMcuState.current_limit;
  2394. if(ShmCharger->gun_info[gun_index].primaryMcuState.relay_state)
  2395. {
  2396. ShmCharger->gun_info[gun_index].acCcsInfo.OutputRelayStatus = ON;
  2397. ShmSysConfigAndInfo->SysInfo.AcChargingData[gun_index].RelayK1K2Status = ON;
  2398. }
  2399. else
  2400. {
  2401. ShmCharger->gun_info[gun_index].acCcsInfo.OutputRelayStatus = OFF;
  2402. ShmSysConfigAndInfo->SysInfo.AcChargingData[gun_index].RelayK1K2Status = OFF;
  2403. }
  2404. failCount[gun_index] = 0;
  2405. }
  2406. else
  2407. {
  2408. DEBUG_WARN("MCU-%d get status fail...%d\n", gun_index, failCount[gun_index]);
  2409. if(failCount[gun_index]<USHRT_MAX)
  2410. failCount[gun_index]++;
  2411. else
  2412. failCount[gun_index] = FAIL_SPEC_COMM;
  2413. }
  2414. //========================================
  2415. // Case 4 : Query primary MCU Alarm code
  2416. //========================================
  2417. if(Query_AC_MCU_Alarm(Uart1Fd, (gun_index>0?ADDR_AC_PRIMARY_2:ADDR_AC_PRIMARY_1), &ShmCharger->gun_info[gun_index].primaryMcuAlarm))
  2418. {
  2419. //DEBUG_INFO("MCU-%d get alarm code success.\n",gun_index);
  2420. failCount[gun_index] = 0;
  2421. ShmCharger->gun_info[gun_index].acCcsInfo.CSUAlarmStatusCode = ShmCharger->gun_info[gun_index].primaryMcuAlarm.InputAlarmCode;
  2422. }
  2423. else
  2424. {
  2425. DEBUG_WARN("MCU-%d get alarm fail...%d\n", gun_index, failCount[gun_index]);
  2426. if(failCount[gun_index]<USHRT_MAX)
  2427. failCount[gun_index]++;
  2428. else
  2429. failCount[gun_index] = FAIL_SPEC_COMM;
  2430. }
  2431. /*
  2432. //========================================
  2433. // Case 5 : Query primary MCU BLE config
  2434. //========================================
  2435. if(Query_Ble_Config(Uart1Fd, (gun_index>0?ADDR_AC_PRIMARY_2:ADDR_AC_PRIMARY_1), &ShmCharger->gun_info[gun_index].bleConfigData))
  2436. {
  2437. ShmSysConfigAndInfo->SysConfig.Bluetooth.isLogin = ShmCharger->gun_info[gun_index].bleConfigData.isLogin;
  2438. ShmSysConfigAndInfo->SysConfig.Bluetooth.isRequestStart = ShmCharger->gun_info[gun_index].bleConfigData.isRequestStart;
  2439. ShmSysConfigAndInfo->SysConfig.Bluetooth.isRequestStop = ShmCharger->gun_info[gun_index].bleConfigData.isRequestStop;
  2440. failCount[gun_index] = 0;
  2441. }
  2442. else
  2443. {
  2444. DEBUG_WARN("MCU-%d get ble config fail...%d\n", gun_index, failCount[gun_index]);
  2445. if(failCount[gun_index]<USHRT_MAX)
  2446. failCount[gun_index]++;
  2447. else
  2448. failCount[gun_index] = FAIL_SPEC_COMM;
  2449. }
  2450. //========================================
  2451. // Case 6 : Query primary MCU ble login id
  2452. //========================================
  2453. if(Query_Ble_Central_ID(Uart1Fd, (gun_index>0?ADDR_AC_PRIMARY_2:ADDR_AC_PRIMARY_1), &ShmCharger->gun_info[gun_index].bleLoginCentralId))
  2454. {
  2455. memcpy(ShmSysConfigAndInfo->SysConfig.Bluetooth.LoginCentralID, ShmCharger->gun_info[gun_index].bleLoginCentralId.id, sizeof ShmSysConfigAndInfo->SysConfig.Bluetooth.LoginCentralID);
  2456. failCount[gun_index] = 0;
  2457. }
  2458. else
  2459. {
  2460. DEBUG_WARN("MCU-%d get ble login central id fail...%d\n", gun_index, failCount[gun_index]);
  2461. if(failCount[gun_index]<USHRT_MAX)
  2462. failCount[gun_index]++;
  2463. else
  2464. failCount[gun_index] = FAIL_SPEC_COMM;
  2465. }*/
  2466. //========================================
  2467. // Case 7 : Configuration primary MCU reset request
  2468. //========================================
  2469. if((access("/sys/class/gpio/gpio116/value", F_OK)) != -1)
  2470. {
  2471. if(ShmCharger->gun_info[gun_index].mcuResetRequest.isMcuResetRequest == ON)
  2472. {
  2473. if(Config_AC_MCU_RESET_REQUEST(Uart1Fd, (gun_index>0?ADDR_AC_PRIMARY_2:ADDR_AC_PRIMARY_1), &ShmCharger->gun_info[gun_index].mcuResetRequest) == PASS)
  2474. {
  2475. DEBUG_INFO("*******************************************\n");
  2476. DEBUG_INFO("**** High priority polling : Case 7 *******\n");
  2477. DEBUG_INFO("*******************************************\n");
  2478. DEBUG_INFO("MCU-%d set MCU reset Request : %d\n", gun_index, ShmCharger->gun_info[gun_index].mcuResetRequest.isMcuResetRequest);
  2479. ShmCharger->gun_info[gun_index].mcuResetRequest.isMcuResetRequest = OFF;
  2480. failCount[gun_index] = 0;
  2481. }
  2482. else
  2483. {
  2484. DEBUG_WARN("MCU-%d get MCU reset fail...%d\n", gun_index, failCount[gun_index]);
  2485. if(failCount[gun_index]<USHRT_MAX)
  2486. failCount[gun_index]++;
  2487. else
  2488. failCount[gun_index] = FAIL_SPEC_COMM;
  2489. }
  2490. }
  2491. }
  2492. //========================================
  2493. // Case 8 : Configuration primary set CP PWN duty
  2494. //========================================
  2495. if(ShmCharger->gun_info[gun_index].mcuFlag.isSetCpPwmDuty == ON)
  2496. {
  2497. //DEBUG_WARN("Case 8 : Config primary set CP PWN duty...%d\n", ShmCharger->gun_info[gun_index].primaryMcuCp_Pwn_Duty);
  2498. if(Config_AC_MaxCurrent_And_CpPwmDuty(Uart1Fd, (gun_index>0?ADDR_AC_PRIMARY_2:ADDR_AC_PRIMARY_1), &ShmCharger->gun_info[gun_index].primaryMcuCp_Pwn_Duty))
  2499. {
  2500. failCount[gun_index] = 0;
  2501. ShmCharger->gun_info[gun_index].mcuFlag.isSetCpPwmDuty = OFF;
  2502. }
  2503. else
  2504. {
  2505. DEBUG_WARN("MCU-%d set cp pwn duty fail...%d\n", gun_index, failCount[gun_index]);
  2506. if(failCount[gun_index]<USHRT_MAX)
  2507. failCount[gun_index]++;
  2508. else
  2509. failCount[gun_index] = FAIL_SPEC_COMM;
  2510. }
  2511. }
  2512. //========================================
  2513. // Case 9 : Query GPIO
  2514. //========================================
  2515. if(Query_Gpio_Input(Uart1Fd, (gun_index>0?ADDR_AC_PRIMARY_2:ADDR_AC_PRIMARY_1), &ShmCharger->gun_info[gun_index].GPIO_Input))
  2516. {
  2517. failCount[gun_index] = 0;
  2518. }
  2519. else
  2520. {
  2521. DEBUG_WARN("MCU-%d get GPIO input fail...%d\n", gun_index, failCount[gun_index]);
  2522. if(failCount[gun_index]<USHRT_MAX)
  2523. failCount[gun_index]++;
  2524. else
  2525. failCount[gun_index] = FAIL_SPEC_COMM;
  2526. }
  2527. //========================================
  2528. // Case 10 : Query primary MCU power consumption
  2529. //========================================
  2530. if(Query_Power_Consumption(Uart1Fd, (gun_index>0?ADDR_AC_PRIMARY_2:ADDR_AC_PRIMARY_1), &ShmCharger->gun_info[gun_index].powerConsumptionTotal, &ShmCharger->gun_info[gun_index].powerConsumption[0], &ShmCharger->gun_info[gun_index].powerConsumption[1], &ShmCharger->gun_info[gun_index].powerConsumption[2]))
  2531. {
  2532. ShmSysConfigAndInfo->SysInfo.AcChargingData[gun_index].PowerConsumption = (ShmCharger->gun_info[gun_index].powerConsumptionTotal.power_consumption/10000.0);
  2533. failCount[gun_index] = 0;
  2534. }
  2535. else
  2536. {
  2537. DEBUG_WARN("MCU-%d get power consumption fail...%d\n", gun_index, failCount[gun_index]);
  2538. if(failCount[gun_index]<USHRT_MAX)
  2539. failCount[gun_index]++;
  2540. else
  2541. failCount[gun_index] = FAIL_SPEC_COMM;
  2542. }
  2543. //========================================
  2544. // Case 11 : Query present output current
  2545. //========================================
  2546. if(Query_Present_OutputCurrent(Uart1Fd, (gun_index>0?ADDR_AC_PRIMARY_2:ADDR_AC_PRIMARY_1), &ShmCharger->gun_info[gun_index].outputCurrent) == PASS)
  2547. {
  2548. #ifndef SIMULATION
  2549. ShmSysConfigAndInfo->SysInfo.AcChargingData[gun_index].PresentChargingCurrent = (float)ShmCharger->gun_info[gun_index].outputCurrent.L1N_L12[0];
  2550. ShmSysConfigAndInfo->SysInfo.AcChargingData[gun_index].PresentChargingCurrentL2 = (float)ShmCharger->gun_info[gun_index].outputCurrent.L2N_L23[0];
  2551. ShmSysConfigAndInfo->SysInfo.AcChargingData[gun_index].PresentChargingCurrentL3 = (float)ShmCharger->gun_info[gun_index].outputCurrent.L3N_L31[0];
  2552. ShmCharger->gun_info[gun_index].acCcsInfo.EVSEPresentCurrent[0] = (float)ShmCharger->gun_info[gun_index].outputCurrent.L1N_L12[0];
  2553. ShmCharger->gun_info[gun_index].acCcsInfo.EVSEPresentCurrent[1] = (float)ShmCharger->gun_info[gun_index].outputCurrent.L1N_L12[0];
  2554. ShmCharger->gun_info[gun_index].acCcsInfo.EVSEPresentCurrent[2] = (float)ShmCharger->gun_info[gun_index].outputCurrent.L1N_L12[0];
  2555. #else //SIMULATION
  2556. ShmSysConfigAndInfo->SysInfo.AcChargingData[gun_index].PresentChargingCurrent = (float)(ShmSysConfigAndInfo->SysInfo.AcChargingData[gun_index].SystemStatus==SYS_MODE_CHARGING?(((rand()%10)+((ShmCharger->gun_info[gun_index].targetCurrent*10)-5))/10.0):0);
  2557. if(ShmSysConfigAndInfo->SysConfig.AcPhaseCount == 3)
  2558. {
  2559. ShmSysConfigAndInfo->SysInfo.AcChargingData[gun_index].PresentChargingCurrentL2 = (float)(ShmSysConfigAndInfo->SysInfo.AcChargingData[gun_index].SystemStatus==SYS_MODE_CHARGING?(((rand()%10)+((ShmCharger->gun_info[gun_index].targetCurrent*10)-5))/10.0):0);
  2560. ShmSysConfigAndInfo->SysInfo.AcChargingData[gun_index].PresentChargingCurrentL3 = (float)(ShmSysConfigAndInfo->SysInfo.AcChargingData[gun_index].SystemStatus==SYS_MODE_CHARGING?(((rand()%10)+((ShmCharger->gun_info[gun_index].targetCurrent*10)-5))/10.0):0);
  2561. }
  2562. #endif //SIMULATION
  2563. failCount[gun_index] = 0;
  2564. }
  2565. else
  2566. {
  2567. DEBUG_WARN("MCU-%d get output current fail...%d\n", gun_index, failCount[gun_index]);
  2568. if(failCount[gun_index]<USHRT_MAX)
  2569. failCount[gun_index]++;
  2570. else
  2571. failCount[gun_index] = FAIL_SPEC_COMM;
  2572. }
  2573. //========================================
  2574. // Case 12: Configuration PTB permission status
  2575. //========================================
  2576. if(ShmSysConfigAndInfo->SysConfig.ModelName[3] == 'P')
  2577. {
  2578. if(ShmCharger->gun_info[gun_index].isSetPtbMeterPermisson == ON)
  2579. {
  2580. if(Config_Ptb_Meter_Permission_Status(Uart1Fd, (gun_index>0?ADDR_AC_PRIMARY_2:ADDR_AC_PRIMARY_1), &ShmCharger->gun_info[gun_index].Ptb_Meter_Parameters) == PASS)
  2581. {
  2582. failCount[gun_index] = 0;
  2583. ShmCharger->gun_info[gun_index].isSetPtbMeterPermisson = OFF;
  2584. }
  2585. else
  2586. {
  2587. DEBUG_WARN("MCU-%d set permission to PTB meter fail...%d\n", gun_index, failCount[gun_index]);
  2588. if(failCount[gun_index]<USHRT_MAX)
  2589. failCount[gun_index]++;
  2590. else
  2591. failCount[gun_index] = FAIL_SPEC_COMM;
  2592. }
  2593. }
  2594. }
  2595. //========================================
  2596. // Case 13; Query PTB meter messages
  2597. //========================================
  2598. if(ShmSysConfigAndInfo->SysConfig.ModelName[3] == 'P')
  2599. {
  2600. if((ShmCharger->gun_info[gun_index].isGetPtbMeterMessage == ON))
  2601. {
  2602. for(uint8_t idx = CMD_READ_OUTPUT_MESSAGE_FORMAT_ID; idx <= (CMD_READ_PUBLIC_KEY+1); idx++)
  2603. {
  2604. if(Query_PTB_METER_MESSAGE(Uart1Fd, (gun_index>0?ADDR_AC_PRIMARY_2:ADDR_AC_PRIMARY_1), &ShmCharger->gun_info[gun_index].Ptb_Meter_Parameters, idx) == PASS)
  2605. {
  2606. failCount[gun_index] = 0;
  2607. }
  2608. else
  2609. {
  2610. if(idx == CMD_READ_OUTPUT_MESSAGE_FORMAT_ID)
  2611. {
  2612. DEBUG_WARN("MCU-%d get PTB meter output message format id fail...%d\n", gun_index, failCount[gun_index]);
  2613. }
  2614. else if(idx == CMD_READ_OUTPUT_MESSAGE_LENGTH)
  2615. {
  2616. DEBUG_WARN("MCU-%d get PTB meter output message length fail...%d\n", gun_index, failCount[gun_index]);
  2617. }
  2618. else if(idx == CMD_READ_OUTPUT_MESSAGE)
  2619. {
  2620. DEBUG_WARN("MCU-%d get PTB meter output message fail...%d\n", gun_index, failCount[gun_index]);
  2621. }
  2622. else if(idx == CMD_READ_OUTPUT_SIGNATURE_LENGTH)
  2623. {
  2624. DEBUG_WARN("MCU-%d get PTB meter output signature length fail...%d\n", gun_index, failCount[gun_index]);
  2625. }
  2626. else if(idx == CMD_READ_OUTPUT_SIGNATURE)
  2627. {
  2628. DEBUG_WARN("MCU-%d get PTB meter output signature fail...%d\n", gun_index, failCount[gun_index]);
  2629. }
  2630. else if(idx == CMD_READ_PUBLIC_KEY_HEADER_LENGTH)
  2631. {
  2632. DEBUG_WARN("MCU-%d get PTB meter public key header length fail...%d\n", gun_index, failCount[gun_index]);
  2633. }
  2634. else if(idx == CMD_READ_PUBLIC_KEY_HEADER)
  2635. {
  2636. DEBUG_WARN("MCU-%d get PTB meter public key header fail...%d\n", gun_index, failCount[gun_index]);
  2637. }
  2638. else if(idx == CMD_READ_PUBLIC_KEY_LENGTH)
  2639. {
  2640. DEBUG_WARN("MCU-%d get PTB meter public key length fail...%d\n", gun_index, failCount[gun_index]);
  2641. }
  2642. else if(idx == CMD_READ_PUBLIC_KEY)
  2643. {
  2644. DEBUG_WARN("MCU-%d get PTB meter public key fail...%d\n", gun_index, failCount[gun_index]);
  2645. }
  2646. else
  2647. {}
  2648. if(failCount[gun_index]<USHRT_MAX)
  2649. failCount[gun_index]++;
  2650. else
  2651. failCount[gun_index] = FAIL_SPEC_COMM;
  2652. }
  2653. if(idx == (CMD_READ_PUBLIC_KEY+1))
  2654. {
  2655. ShmCharger->gun_info[gun_index].isGetPtbMeterMessage = OFF;
  2656. DEBUG_INFO("========================================\n");
  2657. DEBUG_INFO("Stop query PTB meter messages.\n");
  2658. DEBUG_INFO("========================================\n");
  2659. }
  2660. }
  2661. }
  2662. }
  2663. }
  2664. else
  2665. {
  2666. /*
  2667. * Normal priority communication
  2668. */
  2669. switch(stepIndex)
  2670. {
  2671. case 1:
  2672. //===============================
  2673. // Query present input voltage
  2674. //===============================
  2675. if(Query_Present_InputVoltage(Uart1Fd, (gun_index>0?ADDR_AC_PRIMARY_2:ADDR_AC_PRIMARY_1), &ShmCharger->gun_info[gun_index].inputVoltage) == PASS)
  2676. {
  2677. ShmSysConfigAndInfo->SysInfo.InputVoltageR = ShmCharger->gun_info[gun_index].inputVoltage.L1N_L12;
  2678. ShmSysConfigAndInfo->SysInfo.InputVoltageS = ShmCharger->gun_info[gun_index].inputVoltage.L2N_L23;
  2679. ShmSysConfigAndInfo->SysInfo.InputVoltageT = ShmCharger->gun_info[gun_index].inputVoltage.L3N_L31;
  2680. ShmSysConfigAndInfo->SysInfo.AcChargingData[gun_index].PresentChargingVoltage = ShmCharger->gun_info[gun_index].inputVoltage.L1N_L12;
  2681. ShmSysConfigAndInfo->SysInfo.AcChargingData[gun_index].PresentChargingVoltageL2 = ShmCharger->gun_info[gun_index].inputVoltage.L2N_L23;
  2682. ShmSysConfigAndInfo->SysInfo.AcChargingData[gun_index].PresentChargingVoltageL3 = ShmCharger->gun_info[gun_index].inputVoltage.L3N_L31;
  2683. ShmCharger->gun_info[gun_index].acCcsInfo.GridVoltage[0] = ShmSysConfigAndInfo->SysInfo.InputVoltageR;
  2684. ShmCharger->gun_info[gun_index].acCcsInfo.GridVoltage[1] = ShmSysConfigAndInfo->SysInfo.InputVoltageS;
  2685. ShmCharger->gun_info[gun_index].acCcsInfo.GridVoltage[2] = ShmSysConfigAndInfo->SysInfo.InputVoltageT;
  2686. failCount[gun_index] = 0;
  2687. }
  2688. else
  2689. {
  2690. DEBUG_WARN("MCU-%d get input voltage fail...%d\n", gun_index, failCount[gun_index]);
  2691. if(failCount[gun_index]<USHRT_MAX)
  2692. failCount[gun_index]++;
  2693. else
  2694. failCount[gun_index] = FAIL_SPEC_COMM;
  2695. }
  2696. break;
  2697. case 3:
  2698. /*
  2699. //===============================
  2700. // Query present output current
  2701. //===============================
  2702. if(Query_Present_OutputCurrent(Uart1Fd, (gun_index>0?ADDR_AC_PRIMARY_2:ADDR_AC_PRIMARY_1), &ShmCharger->gun_info[gun_index].outputCurrent) == PASS)
  2703. {
  2704. #ifndef SIMULATION
  2705. ShmSysConfigAndInfo->SysInfo.AcChargingData[gun_index].PresentChargingCurrent = (float)ShmCharger->gun_info[gun_index].outputCurrent.L1N_L12[0];
  2706. ShmSysConfigAndInfo->SysInfo.AcChargingData[gun_index].PresentChargingCurrentL2 = (float)ShmCharger->gun_info[gun_index].outputCurrent.L2N_L23[0];
  2707. ShmSysConfigAndInfo->SysInfo.AcChargingData[gun_index].PresentChargingCurrentL3 = (float)ShmCharger->gun_info[gun_index].outputCurrent.L3N_L31[0];
  2708. ShmCharger->gun_info[gun_index].acCcsInfo.EVSEPresentCurrent[0] = (float)ShmCharger->gun_info[gun_index].outputCurrent.L1N_L12[0];
  2709. ShmCharger->gun_info[gun_index].acCcsInfo.EVSEPresentCurrent[1] = (float)ShmCharger->gun_info[gun_index].outputCurrent.L1N_L12[0];
  2710. ShmCharger->gun_info[gun_index].acCcsInfo.EVSEPresentCurrent[2] = (float)ShmCharger->gun_info[gun_index].outputCurrent.L1N_L12[0];
  2711. #else //SIMULATION
  2712. ShmSysConfigAndInfo->SysInfo.AcChargingData[gun_index].PresentChargingCurrent = (float)(ShmSysConfigAndInfo->SysInfo.AcChargingData[gun_index].SystemStatus==SYS_MODE_CHARGING?(((rand()%10)+((ShmCharger->gun_info[gun_index].targetCurrent*10)-5))/10.0):0);
  2713. if(ShmSysConfigAndInfo->SysConfig.AcPhaseCount == 3)
  2714. {
  2715. ShmSysConfigAndInfo->SysInfo.AcChargingData[gun_index].PresentChargingCurrentL2 = (float)(ShmSysConfigAndInfo->SysInfo.AcChargingData[gun_index].SystemStatus==SYS_MODE_CHARGING?(((rand()%10)+((ShmCharger->gun_info[gun_index].targetCurrent*10)-5))/10.0):0);
  2716. ShmSysConfigAndInfo->SysInfo.AcChargingData[gun_index].PresentChargingCurrentL3 = (float)(ShmSysConfigAndInfo->SysInfo.AcChargingData[gun_index].SystemStatus==SYS_MODE_CHARGING?(((rand()%10)+((ShmCharger->gun_info[gun_index].targetCurrent*10)-5))/10.0):0);
  2717. }
  2718. #endif //SIMULATION
  2719. failCount[gun_index] = 0;
  2720. }
  2721. else
  2722. {
  2723. DEBUG_WARN("MCU-%d get output current fail...%d\n", gun_index, failCount[gun_index]);
  2724. if(failCount[gun_index]<USHRT_MAX)
  2725. failCount[gun_index]++;
  2726. else
  2727. failCount[gun_index] = FAIL_SPEC_COMM;
  2728. }
  2729. */
  2730. break;
  2731. case 5:
  2732. //===============================
  2733. // Query gun plug-in times
  2734. //===============================
  2735. if(Query_AC_GUN_PLUGIN_TIMES(Uart1Fd, (gun_index>0?ADDR_AC_PRIMARY_2:ADDR_AC_PRIMARY_1), &ShmCharger->gun_info[gun_index].gunPluginTimes) == PASS)
  2736. {
  2737. ShmSysConfigAndInfo->SysConfig.AcPlugInTimes = ((long)ShmCharger->gun_info[gun_index].gunPluginTimes.GunPluginTimes & 0xFFFF);
  2738. failCount[gun_index] = 0;
  2739. }
  2740. else
  2741. {
  2742. DEBUG_WARN("MCU-%d get gun plugin times fail...%d\n", gun_index, failCount[gun_index]);
  2743. if(failCount[gun_index]<USHRT_MAX)
  2744. failCount[gun_index]++;
  2745. else
  2746. failCount[gun_index] = FAIL_SPEC_COMM;
  2747. }
  2748. break;
  2749. case 7:
  2750. //===============================
  2751. // Query temperature
  2752. //===============================
  2753. if(Query_Temperature(Uart1Fd, (gun_index>0?ADDR_AC_PRIMARY_2:ADDR_AC_PRIMARY_1), &ShmCharger->gun_info[gun_index].temperature) == PASS)
  2754. {
  2755. ShmSysConfigAndInfo->SysInfo.SystemAmbientTemp = ShmCharger->gun_info[gun_index].temperature.point[0];
  2756. ShmSysConfigAndInfo->SysInfo.AcChargingData[gun_index].ConnectorTemp = ShmCharger->gun_info[gun_index].temperature.point[0];
  2757. failCount[gun_index] = 0;
  2758. }
  2759. else
  2760. {
  2761. DEBUG_WARN("MCU-%d get temperature fail...%d\n", gun_index, failCount[gun_index]);
  2762. if(failCount[gun_index]<USHRT_MAX)
  2763. failCount[gun_index]++;
  2764. else
  2765. failCount[gun_index] = FAIL_SPEC_COMM;
  2766. }
  2767. break;
  2768. case 9:
  2769. //===============================
  2770. // Query RTC
  2771. //===============================
  2772. if(Query_RTC(Uart1Fd, (gun_index>0?ADDR_AC_PRIMARY_2:ADDR_AC_PRIMARY_1), &ShmCharger->gun_info[gun_index].rtc))
  2773. {
  2774. struct timeb csuTime, mcuTime;
  2775. struct tm *tmCSU;
  2776. struct tm tmMcu;
  2777. ftime(&csuTime);
  2778. tmCSU = localtime(&csuTime.time);
  2779. tmMcu.tm_year = ShmCharger->gun_info[gun_index].rtc.year-1900;
  2780. tmMcu.tm_mon = ShmCharger->gun_info[gun_index].rtc.month-1;
  2781. tmMcu.tm_mday = ShmCharger->gun_info[gun_index].rtc.day;
  2782. tmMcu.tm_hour = ShmCharger->gun_info[gun_index].rtc.hour;
  2783. tmMcu.tm_min = ShmCharger->gun_info[gun_index].rtc.min;
  2784. tmMcu.tm_sec = ShmCharger->gun_info[gun_index].rtc.sec;
  2785. mcuTime.time = mktime(&tmMcu);
  2786. if(ShmCharger->gun_info[gun_index].bleConfigData.isLogin && !ShmOCPP16Data->OcppConnStatus)
  2787. {
  2788. if(abs(DiffTimeb(csuTime, mcuTime)) > 10000)
  2789. {
  2790. char cmdBuf[128];
  2791. sprintf(cmdBuf, "date -u -s \"%04d-%02d-%02d %02d:%02d:%02d\"", ShmCharger->gun_info[gun_index].rtc.year,
  2792. ShmCharger->gun_info[gun_index].rtc.month,
  2793. ShmCharger->gun_info[gun_index].rtc.day,
  2794. ShmCharger->gun_info[gun_index].rtc.hour,
  2795. ShmCharger->gun_info[gun_index].rtc.min,
  2796. ShmCharger->gun_info[gun_index].rtc.sec);
  2797. system(cmdBuf);
  2798. system("hwclock -w -u");
  2799. system("hwclock -s");
  2800. }
  2801. }
  2802. else
  2803. {
  2804. if(abs(DiffTimeb(csuTime, mcuTime)) > 10000)
  2805. {
  2806. ShmCharger->gun_info[gun_index].rtc.year = tmCSU->tm_year+1900;
  2807. ShmCharger->gun_info[gun_index].rtc.month = tmCSU->tm_mon+1;
  2808. ShmCharger->gun_info[gun_index].rtc.day = tmCSU->tm_mday;
  2809. ShmCharger->gun_info[gun_index].rtc.hour = tmCSU->tm_hour;
  2810. ShmCharger->gun_info[gun_index].rtc.min = tmCSU->tm_min;
  2811. ShmCharger->gun_info[gun_index].rtc.sec = tmCSU->tm_sec;
  2812. Config_RTC(Uart1Fd, (gun_index>0?ADDR_AC_PRIMARY_2:ADDR_AC_PRIMARY_1), &ShmCharger->gun_info[gun_index].rtc);
  2813. }
  2814. }
  2815. failCount[gun_index] = 0;
  2816. }
  2817. else
  2818. {
  2819. DEBUG_WARN("MCU-%d get rtc fail...%d\n", gun_index, failCount[gun_index]);
  2820. if(failCount[gun_index]<USHRT_MAX)
  2821. failCount[gun_index]++;
  2822. else
  2823. failCount[gun_index] = FAIL_SPEC_COMM;
  2824. }
  2825. break;
  2826. case 11:
  2827. break;
  2828. case 13:
  2829. //===============================
  2830. // Upgrade MCU
  2831. //===============================
  2832. if(ShmCharger->gun_info[gun_index].mcuFlag.isMcuUpgradeReq)
  2833. {
  2834. DEBUG_INFO("===========================================\n");
  2835. DEBUG_INFO("==== Normal priority polling : Case 13 ====\n");
  2836. DEBUG_INFO("===========================================\n");
  2837. unsigned char cmd[512];
  2838. if(Upgrade_UART(Uart1Fd, AC_WALLMOUNT_CONTROLLER, (gun_index>0?ADDR_AC_PRIMARY_2:ADDR_AC_PRIMARY_1), ShmCharger->fwUpgradeInfo.location, ShmCharger->fwUpgradeInfo.modelName))
  2839. {
  2840. DEBUG_INFO("MCU-%d upgrade firmware OK...%s\n", gun_index, ShmCharger->gun_info[gun_index].ver.Version_FW);
  2841. sleep(20);
  2842. ShmCharger->gun_info[gun_index].mcuFlag.isMcuUpgradeReq = OFF;
  2843. failCount[gun_index] = 0;
  2844. }
  2845. else
  2846. {
  2847. DEBUG_WARN("MCU-%d upgrade firmware fail...%d\n", gun_index, failCount[gun_index]);
  2848. if(failCount[gun_index]<USHRT_MAX)
  2849. failCount[gun_index]++;
  2850. else
  2851. failCount[gun_index] = FAIL_SPEC_COMM;
  2852. }
  2853. sprintf((char*)cmd, "yes|rm %s", ShmCharger->fwUpgradeInfo.location);
  2854. system((char*)cmd);
  2855. }
  2856. break;
  2857. case 15:
  2858. //===============================
  2859. // Config set breathe led timing
  2860. //===============================
  2861. if(ShmCharger->gun_info[gun_index].isSetBreatheLedTiming == ON)
  2862. {
  2863. if(Config_AC_Set_Breathe_Led_Timing(Uart1Fd, (gun_index>0?ADDR_AC_PRIMARY_2:ADDR_AC_PRIMARY_1), &ShmCharger->gun_info[gun_index].setBreatheLedTiming))
  2864. {
  2865. failCount[gun_index] = 0;
  2866. ShmCharger->gun_info[gun_index].isSetBreatheLedTiming = OFF;
  2867. }
  2868. else
  2869. {
  2870. DEBUG_WARN("MCU-%d set breathe led timing fail...%d\n", gun_index, failCount[gun_index]);
  2871. if(failCount[gun_index]<USHRT_MAX)
  2872. failCount[gun_index]++;
  2873. else
  2874. failCount[gun_index] = FAIL_SPEC_COMM;
  2875. }
  2876. }
  2877. break;
  2878. case 17:
  2879. //===============================
  2880. // Config set led brightness
  2881. //===============================
  2882. if(ShmCharger->gun_info[gun_index].isSetLedBrightness == ON)
  2883. {
  2884. if(Config_AC_Set_Led_Brightness(Uart1Fd, (gun_index>0?ADDR_AC_PRIMARY_2:ADDR_AC_PRIMARY_1), &ShmCharger->gun_info[gun_index].setLedBrightness))
  2885. {
  2886. failCount[gun_index] = 0;
  2887. ShmCharger->gun_info[gun_index].isSetLedBrightness = OFF;
  2888. }
  2889. else
  2890. {
  2891. DEBUG_WARN("MCU-%d set led brightness fail...%d\n", gun_index, failCount[gun_index]);
  2892. if(failCount[gun_index]<USHRT_MAX)
  2893. failCount[gun_index]++;
  2894. else
  2895. failCount[gun_index] = FAIL_SPEC_COMM;
  2896. }
  2897. }
  2898. break;
  2899. case 19:
  2900. //===============================
  2901. // Query firmware version
  2902. //===============================
  2903. if(ShmCharger->gun_info[gun_index].mcuFlag.isReadFwVerPass != PASS)
  2904. {
  2905. DEBUG_INFO("===========================================\n");
  2906. DEBUG_INFO("==== Normal priority polling : Case 19-1===\n");
  2907. DEBUG_INFO("===========================================\n");
  2908. if(Query_FW_Ver(Uart1Fd, (gun_index>0?ADDR_AC_PRIMARY_2:ADDR_AC_PRIMARY_1), &ShmCharger->gun_info[gun_index].ver) == PASS)
  2909. {
  2910. DEBUG_INFO("MCU-%d get firmware version : %s\n", gun_index, ShmCharger->gun_info[gun_index].ver.Version_FW);
  2911. memcpy(ShmPrimaryMcuData->version, ShmCharger->gun_info[gun_index].ver.Version_FW, sizeof(ShmPrimaryMcuData->version));
  2912. ShmCharger->gun_info[gun_index].mcuFlag.isReadFwVerPass = PASS;
  2913. failCount[gun_index] = 0;
  2914. }
  2915. else
  2916. {
  2917. DEBUG_WARN("MCU-%d get firmware version fail...%d\n", gun_index, failCount[gun_index]);
  2918. if(failCount[gun_index]<USHRT_MAX)
  2919. failCount[gun_index]++;
  2920. else
  2921. failCount[gun_index] = FAIL_SPEC_COMM;
  2922. }
  2923. }
  2924. //===============================
  2925. // Query meter ic correction status
  2926. //===============================
  2927. if(ShmCharger->gun_info[gun_index].mcuFlag.isReadMeterIcCorrectionStatus != PASS)
  2928. {
  2929. DEBUG_INFO("===========================================\n");
  2930. DEBUG_INFO("==== Normal priority polling : Case 19-2===\n");
  2931. DEBUG_INFO("===========================================\n");
  2932. if(Query_MeterIc_CorrectionPara(Uart1Fd, (gun_index>0?ADDR_AC_PRIMARY_2:ADDR_AC_PRIMARY_1), &ShmCharger->gun_info[gun_index].meterIcCorrectionStatus) == PASS)
  2933. {
  2934. DEBUG_INFO("MCU-%d get meter ic correction status: 0x%08X\n", gun_index, ShmCharger->gun_info[gun_index].meterIcCorrectionStatus.value);
  2935. ShmSysConfigAndInfo->SysInfo.AcChargingData[gun_index].meterIcCalInfo.isCalibratedVaGain = ShmCharger->gun_info[gun_index].meterIcCorrectionStatus.bits.isCalibratedVaGain;
  2936. ShmSysConfigAndInfo->SysInfo.AcChargingData[gun_index].meterIcCalInfo.isCalibratedVbGain = ShmCharger->gun_info[gun_index].meterIcCorrectionStatus.bits.isCalibratedVbGain;
  2937. ShmSysConfigAndInfo->SysInfo.AcChargingData[gun_index].meterIcCalInfo.isCalibratedVcGain = ShmCharger->gun_info[gun_index].meterIcCorrectionStatus.bits.isCalibratedVcGain;
  2938. ShmSysConfigAndInfo->SysInfo.AcChargingData[gun_index].meterIcCalInfo.isCalibratedVaOffset = ShmCharger->gun_info[gun_index].meterIcCorrectionStatus.bits.isCalibratedVaOffset;
  2939. ShmSysConfigAndInfo->SysInfo.AcChargingData[gun_index].meterIcCalInfo.isCalibratedVbOffset = ShmCharger->gun_info[gun_index].meterIcCorrectionStatus.bits.isCalibratedVbOffset;
  2940. ShmSysConfigAndInfo->SysInfo.AcChargingData[gun_index].meterIcCalInfo.isCalibratedVcOffset = ShmCharger->gun_info[gun_index].meterIcCorrectionStatus.bits.isCalibratedVcOffset;
  2941. ShmSysConfigAndInfo->SysInfo.AcChargingData[gun_index].meterIcCalInfo.isCalibratedCaGain = ShmCharger->gun_info[gun_index].meterIcCorrectionStatus.bits.isCalibratedCaGain;
  2942. ShmSysConfigAndInfo->SysInfo.AcChargingData[gun_index].meterIcCalInfo.isCalibratedCbGain = ShmCharger->gun_info[gun_index].meterIcCorrectionStatus.bits.isCalibratedCbGain;
  2943. ShmSysConfigAndInfo->SysInfo.AcChargingData[gun_index].meterIcCalInfo.isCalibratedCcGain = ShmCharger->gun_info[gun_index].meterIcCorrectionStatus.bits.isCalibratedCcGain;
  2944. ShmSysConfigAndInfo->SysInfo.AcChargingData[gun_index].meterIcCalInfo.isCalibratedCaOffset = ShmCharger->gun_info[gun_index].meterIcCorrectionStatus.bits.isCalibratedCaOffset;
  2945. ShmSysConfigAndInfo->SysInfo.AcChargingData[gun_index].meterIcCalInfo.isCalibratedCbOffset = ShmCharger->gun_info[gun_index].meterIcCorrectionStatus.bits.isCalibratedCbOffset;
  2946. ShmSysConfigAndInfo->SysInfo.AcChargingData[gun_index].meterIcCalInfo.isCalibratedCcOffset = ShmCharger->gun_info[gun_index].meterIcCorrectionStatus.bits.isCalibratedCcOffset;
  2947. ShmSysConfigAndInfo->SysInfo.AcChargingData[gun_index].meterIcCalInfo.isCalibratedPa = ShmCharger->gun_info[gun_index].meterIcCorrectionStatus.bits.isCalibratedPa;
  2948. ShmSysConfigAndInfo->SysInfo.AcChargingData[gun_index].meterIcCalInfo.isCalibratedPb = ShmCharger->gun_info[gun_index].meterIcCorrectionStatus.bits.isCalibratedPb;
  2949. ShmSysConfigAndInfo->SysInfo.AcChargingData[gun_index].meterIcCalInfo.isCalibratedPc = ShmCharger->gun_info[gun_index].meterIcCorrectionStatus.bits.isCalibratedPc;
  2950. ShmCharger->gun_info[gun_index].mcuFlag.isReadMeterIcCorrectionStatus = PASS;
  2951. failCount[gun_index] = 0;
  2952. }
  2953. else
  2954. {
  2955. DEBUG_WARN("MCU-%d get meter ic correction status fail...%d\n", gun_index, failCount[gun_index]);
  2956. if(failCount[gun_index]<USHRT_MAX)
  2957. failCount[gun_index]++;
  2958. else
  2959. failCount[gun_index] = FAIL_SPEC_COMM;
  2960. }
  2961. }
  2962. //===============================
  2963. // Config primary MCU serial number
  2964. //===============================
  2965. if(ShmCharger->gun_info[gun_index].mcuFlag.isSetSerialNumberPass != PASS)
  2966. {
  2967. DEBUG_INFO("===========================================\n");
  2968. DEBUG_INFO("==== Normal priority polling : Case 19-3===\n");
  2969. DEBUG_INFO("===========================================\n");
  2970. memcpy(ShmCharger->evseId.serial_number, ShmSysConfigAndInfo->SysConfig.SerialNumber, ARRAY_SIZE(ShmCharger->evseId.serial_number));
  2971. if(Config_Serial_Number(Uart1Fd, (gun_index>0?ADDR_AC_PRIMARY_2:ADDR_AC_PRIMARY_1), &ShmCharger->evseId))
  2972. {
  2973. DEBUG_INFO("MCU-%d set serial number : %.12s\n",gun_index,ShmCharger->evseId.serial_number);
  2974. ShmCharger->gun_info[gun_index].mcuFlag.isSetSerialNumberPass = PASS;
  2975. failCount[gun_index] = 0;
  2976. }
  2977. else
  2978. {
  2979. DEBUG_WARN("MCU-%d set serial number fail...%d\n", gun_index, failCount[gun_index]);
  2980. if(failCount[gun_index]<USHRT_MAX)
  2981. failCount[gun_index]++;
  2982. else
  2983. failCount[gun_index] = FAIL_SPEC_COMM;
  2984. }
  2985. }
  2986. //===============================
  2987. // Config primary MCU model name
  2988. //===============================
  2989. if(ShmCharger->gun_info[gun_index].mcuFlag.isSetModelNamePass != PASS)
  2990. {
  2991. DEBUG_INFO("===========================================\n");
  2992. DEBUG_INFO("==== Normal priority polling : Case 19-4===\n");
  2993. DEBUG_INFO("===========================================\n");
  2994. memcpy(ShmCharger->evseId.model_name, ShmSysConfigAndInfo->SysConfig.ModelName, ARRAY_SIZE(ShmCharger->evseId.model_name));
  2995. if(Config_Model_Name(Uart1Fd, (gun_index>0?ADDR_AC_PRIMARY_2:ADDR_AC_PRIMARY_1), &ShmCharger->evseId))
  2996. {
  2997. DEBUG_INFO("MCU-%d set model name : %.14s\n",gun_index,ShmCharger->evseId.model_name);
  2998. ShmCharger->gun_info[gun_index].mcuFlag.isSetModelNamePass = PASS;
  2999. failCount[gun_index] = 0;
  3000. }
  3001. else
  3002. {
  3003. DEBUG_WARN("MCU-%d set model name fail...%d\n", gun_index, failCount[gun_index]);
  3004. if(failCount[gun_index]<USHRT_MAX)
  3005. failCount[gun_index]++;
  3006. else
  3007. failCount[gun_index] = FAIL_SPEC_COMM;
  3008. }
  3009. }
  3010. break;
  3011. case 21:
  3012. //===============================
  3013. // Config aux power switch
  3014. //===============================
  3015. ShmCharger->gun_info[gun_index].setAuxPowerSwitch.power_switch = 0x01;
  3016. ShmCharger->gun_info[gun_index].setAuxPowerSwitch.power_switch = ShmCharger->gun_info[gun_index].isMeterOn;
  3017. if(Config_Aux_Power_Switch(Uart1Fd, (gun_index>0?ADDR_AC_PRIMARY_2:ADDR_AC_PRIMARY_1), &ShmCharger->gun_info[gun_index].setAuxPowerSwitch))
  3018. {
  3019. failCount[gun_index] = 0;
  3020. }
  3021. else
  3022. {
  3023. DEBUG_WARN("MCU-%d set aux power switch fail...%d\n", gun_index, failCount[gun_index]);
  3024. if(failCount[gun_index]<USHRT_MAX)
  3025. failCount[gun_index]++;
  3026. else
  3027. failCount[gun_index] = FAIL_SPEC_COMM;
  3028. }
  3029. break;
  3030. default:
  3031. stepIndex = 0;
  3032. break;
  3033. }
  3034. }
  3035. stepIndex++;
  3036. //===============================
  3037. // Communication fail check
  3038. //===============================
  3039. if(failCount[gun_index] >= 13)
  3040. ShmCharger->gun_info[gun_index].mcuFlag.isSetCpPwmDuty = ON;
  3041. if(failCount[gun_index] >= FAIL_SPEC_COMM)
  3042. {
  3043. if((0 <= failCount[gun_index]%FAIL_SPEC_COMM) && (failCount[gun_index]%FAIL_SPEC_COMM < 10))
  3044. sleep(10);
  3045. if(ShmCharger->gun_info[gun_index].primaryMcuAlarm.bits.comm_timeout == OFF)
  3046. {
  3047. DEBUG_ERROR("Primary MCU-%d communication fault. \n", gun_index);
  3048. ShmCharger->gun_info[gun_index].primaryMcuAlarm.bits.comm_timeout = ON;
  3049. }
  3050. }
  3051. else
  3052. {
  3053. if(ShmCharger->gun_info[gun_index].primaryMcuAlarm.bits.comm_timeout == ON)
  3054. {
  3055. DEBUG_ERROR("Primary MCU-%d communication recover. \n", gun_index);
  3056. ShmCharger->gun_info[gun_index].primaryMcuAlarm.bits.comm_timeout = OFF;
  3057. }
  3058. }
  3059. usleep(100000);
  3060. }
  3061. }
  3062. return FAIL;
  3063. }