Module_ATEChademo.c 125 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439244024412442244324442445244624472448244924502451245224532454245524562457245824592460246124622463246424652466246724682469247024712472247324742475247624772478247924802481248224832484248524862487248824892490249124922493249424952496249724982499250025012502250325042505250625072508250925102511251225132514251525162517251825192520252125222523252425252526252725282529253025312532253325342535253625372538253925402541254225432544254525462547254825492550255125522553255425552556255725582559256025612562256325642565256625672568256925702571257225732574257525762577257825792580258125822583258425852586258725882589259025912592259325942595259625972598259926002601260226032604260526062607260826092610261126122613261426152616261726182619262026212622262326242625262626272628262926302631263226332634263526362637263826392640264126422643264426452646264726482649265026512652265326542655265626572658265926602661266226632664266526662667266826692670267126722673267426752676267726782679268026812682268326842685268626872688268926902691269226932694269526962697269826992700270127022703270427052706270727082709271027112712271327142715271627172718271927202721272227232724272527262727272827292730273127322733273427352736273727382739274027412742274327442745274627472748274927502751275227532754275527562757275827592760276127622763276427652766276727682769277027712772277327742775277627772778277927802781278227832784278527862787278827892790279127922793279427952796279727982799280028012802280328042805280628072808280928102811281228132814281528162817281828192820282128222823282428252826282728282829283028312832283328342835283628372838283928402841284228432844284528462847284828492850285128522853285428552856285728582859286028612862286328642865286628672868286928702871287228732874287528762877287828792880288128822883288428852886288728882889289028912892289328942895289628972898289929002901290229032904290529062907290829092910291129122913291429152916291729182919292029212922292329242925292629272928292929302931293229332934293529362937293829392940294129422943294429452946294729482949295029512952295329542955295629572958295929602961296229632964296529662967296829692970297129722973297429752976297729782979298029812982298329842985298629872988298929902991299229932994299529962997299829993000300130023003300430053006300730083009301030113012301330143015301630173018301930203021302230233024302530263027302830293030303130323033303430353036303730383039304030413042304330443045304630473048304930503051305230533054305530563057305830593060306130623063306430653066306730683069307030713072307330743075307630773078307930803081308230833084308530863087308830893090309130923093309430953096309730983099310031013102310331043105310631073108310931103111311231133114311531163117311831193120312131223123312431253126312731283129313031313132313331343135313631373138313931403141314231433144314531463147314831493150315131523153315431553156315731583159316031613162316331643165316631673168316931703171317231733174317531763177317831793180318131823183318431853186318731883189319031913192319331943195319631973198319932003201320232033204320532063207320832093210321132123213321432153216321732183219322032213222322332243225322632273228322932303231323232333234323532363237323832393240324132423243324432453246324732483249325032513252325332543255325632573258325932603261326232633264326532663267326832693270327132723273327432753276327732783279328032813282328332843285328632873288328932903291329232933294329532963297329832993300330133023303330433053306330733083309331033113312331333143315331633173318331933203321332233233324332533263327332833293330333133323333333433353336333733383339334033413342334333443345334633473348334933503351335233533354335533563357335833593360336133623363336433653366336733683369337033713372337333743375337633773378337933803381338233833384338533863387338833893390339133923393339433953396339733983399340034013402340334043405340634073408340934103411341234133414341534163417341834193420342134223423342434253426342734283429343034313432343334343435343634373438343934403441344234433444344534463447344834493450345134523453345434553456345734583459346034613462346334643465346634673468346934703471347234733474347534763477347834793480348134823483348434853486348734883489349034913492349334943495349634973498349935003501350235033504350535063507350835093510351135123513351435153516351735183519352035213522352335243525352635273528352935303531353235333534353535363537353835393540354135423543354435453546354735483549355035513552355335543555355635573558355935603561356235633564356535663567356835693570357135723573357435753576357735783579358035813582358335843585358635873588358935903591359235933594359535963597359835993600360136023603360436053606360736083609361036113612361336143615361636173618361936203621362236233624362536263627362836293630363136323633363436353636363736383639364036413642364336443645364636473648364936503651365236533654365536563657365836593660366136623663366436653666366736683669367036713672367336743675367636773678367936803681368236833684368536863687368836893690369136923693369436953696369736983699370037013702370337043705370637073708370937103711371237133714371537163717371837193720372137223723372437253726372737283729373037313732373337343735373637373738373937403741374237433744374537463747374837493750375137523753375437553756375737583759376037613762376337643765376637673768376937703771377237733774377537763777377837793780378137823783378437853786378737883789379037913792379337943795379637973798379938003801380238033804380538063807380838093810381138123813381438153816381738183819382038213822382338243825382638273828382938303831383238333834383538363837383838393840384138423843384438453846384738483849385038513852385338543855385638573858385938603861386238633864386538663867386838693870387138723873387438753876387738783879388038813882
  1. #include <sys/time.h>
  2. #include <sys/timeb.h>
  3. #include <sys/types.h>
  4. #include <sys/stat.h>
  5. #include <sys/types.h>
  6. #include <sys/ioctl.h>
  7. #include <sys/socket.h>
  8. #include <sys/ipc.h>
  9. #include <sys/shm.h>
  10. #include <sys/shm.h>
  11. #include <sys/mman.h>
  12. #include <linux/can.h>
  13. #include <linux/can/raw.h>
  14. #include <linux/wireless.h>
  15. #include <arpa/inet.h>
  16. #include <netinet/in.h>
  17. #include <unistd.h>
  18. #include <stdarg.h>
  19. #include <stdio.h> /*標準輸入輸出定義*/
  20. #include <stdlib.h> /*標準函數庫定義*/
  21. #include <unistd.h> /*Unix 標準函數定義*/
  22. #include <fcntl.h> /*檔控制定義*/
  23. #include <termios.h> /*PPSIX 終端控制定義*/
  24. #include <errno.h> /*錯誤號定義*/
  25. #include <errno.h>
  26. #include <string.h>
  27. #include <time.h>
  28. #include <ctype.h>
  29. #include <ifaddrs.h>
  30. #include "../../define.h"
  31. #include "Config.h"
  32. #include "Module_EvComm.h"
  33. #include "VCCU.h"
  34. #include "internalComm.h"
  35. #include "IOComm.h"
  36. #include <stdlib.h>
  37. #include <stdio.h>
  38. #include <unistd.h> //write, close, usleep, read
  39. #include <fcntl.h> //uart
  40. #define Debug
  41. #define ARRAY_SIZE(A) (sizeof(A) / sizeof(A[0]))
  42. #define PASS 1
  43. #define FAIL -1
  44. #define START 1
  45. #define STOP 0
  46. #define YES 1
  47. #define NO 0
  48. #define DEMO 0
  49. byte flash = NO;
  50. int whileLoopTime = 500000;//10000; // 10 ms
  51. struct SysConfigAndInfo *ShmSysConfigAndInfo;
  52. struct StatusCodeData *ShmStatusCodeData;
  53. struct FanModuleData *ShmFanModuleData;
  54. struct CHAdeMOData *ShmCHAdeMOData;
  55. struct CcsData *ShmCcsData;
  56. struct RelayModuleData *ShmRelayModuleData;
  57. Ver ver;
  58. PresentInputVoltage inputVoltage;
  59. PresentOutputVoltage outputVoltage;
  60. Relay outputRelay;
  61. Relay regRelay;
  62. int Uart5Fd;
  63. int Uart1Fd;
  64. char *relayRs485PortName = "/dev/ttyS5";
  65. char* pPortName = "/dev/ttyS3";
  66. char *priPortName = "/dev/ttyS1";
  67. #define SYSFS_GPIO_DIR "/sys/class/gpio"
  68. //struct ATE *ate;
  69. byte gun_count = CHAdeMO_QUANTITY + CCS_QUANTITY + GB_QUANTITY;
  70. int chargingTime[CHAdeMO_QUANTITY + CCS_QUANTITY + GB_QUANTITY];
  71. struct timeb startChargingTime[CHAdeMO_QUANTITY + CCS_QUANTITY + GB_QUANTITY];
  72. struct timeb endChargingTime[CHAdeMO_QUANTITY + CCS_QUANTITY + GB_QUANTITY];
  73. struct timeb startPlugPresentStatusTime[CHAdeMO_QUANTITY + CCS_QUANTITY + GB_QUANTITY];
  74. struct timeb startDutyCyclTime[CHAdeMO_QUANTITY + CCS_QUANTITY + GB_QUANTITY];
  75. struct timeb endPlugPresentStatusTime[CHAdeMO_QUANTITY + CCS_QUANTITY + GB_QUANTITY];
  76. struct timeb endDutyCyclTime[CHAdeMO_QUANTITY + CCS_QUANTITY + GB_QUANTITY];
  77. float maxChargingVol = 5000; // 限制最大充電電壓,如依照模塊則填上 0
  78. float maxChargingCur = 100; // 限制最大充電電流,如依照模塊則填上 0
  79. #define MAX_BUF 64
  80. byte normalStop = 0x01;
  81. byte stopReason[6] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
  82. byte evstaus[5] = { 0x01, 0x02, 0x03, 0x04, 0x05 };
  83. byte bd0_1_status = 0;
  84. byte bd0_2_status = 0;
  85. byte bd1_1_status = 0;
  86. byte bd1_2_status = 0;
  87. // 槍資訊
  88. struct ChargingInfoData *_chargingData[CHAdeMO_QUANTITY + CCS_QUANTITY + GB_QUANTITY];
  89. struct Ev_Board_Cmd Ev_Cmd={
  90. 0,
  91. 0x00000200,
  92. 0x00000400,
  93. 0x00000500,
  94. 0x00000600,
  95. 0x00000700,
  96. 0x00000800,
  97. 0x00000900,
  98. 0x00000A00,
  99. 0x00000C00,
  100. 0x00000D00,
  101. 0x00000E00,
  102. 0x00000F00,
  103. 0x00001000,
  104. 0x00001100,
  105. 0x00001200,
  106. 0x00001500,
  107. };
  108. void GetMaxVolAndCurMethod(byte index, float *vol, float *cur);
  109. unsigned long GetTimeoutValue(struct timeval _sour_time);
  110. unsigned long GetTimeoutValue(struct timeval _sour_time)
  111. {
  112. struct timeval _end_time;
  113. gettimeofday(&_end_time, NULL);
  114. return 1000000 * (_end_time.tv_sec - _sour_time.tv_sec) + _end_time.tv_usec - _sour_time.tv_usec;
  115. }
  116. int DiffTimeb(struct timeb ST, struct timeb ET)
  117. {
  118. //return milli-second
  119. unsigned int StartTime,StopTime;
  120. StartTime=(unsigned int)ST.time;
  121. StopTime=(unsigned int)ET.time;
  122. return (StopTime-StartTime)*1000+ET.millitm-ST.millitm;
  123. }
  124. //=================================
  125. // Common routine
  126. //=================================
  127. void getTimeString(char *buff)
  128. {
  129. time_t timep;
  130. struct tm *p;
  131. time(&timep);
  132. p=gmtime(&timep);
  133. sprintf(buff, "[%04d-%02d-%02d %02d:%02d:%02d]", (1900+p->tm_year), (1+p->tm_mon), p->tm_mday, p->tm_hour, p->tm_hour, p->tm_sec);
  134. }
  135. struct Address Addr={0x01,0x02,0x03,0xFF};
  136. struct Command Cmd={0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0a,0x81,0x85,0x86,0xe0,0xe1,0xe2,0xe3};
  137. int tranceive(int fd, unsigned char* cmd, unsigned char cmd_len, unsigned char* rx)
  138. {
  139. int len;
  140. //sleep(2); //required to make flush work, for some reason
  141. tcflush(fd,TCIOFLUSH);
  142. if(write(fd, cmd, cmd_len) >= cmd_len)
  143. {
  144. usleep(5000);
  145. len = read(fd, rx, 512);
  146. }
  147. else
  148. {
  149. #ifdef SystemLogMessage
  150. //DEBUG_ERROR("Serial command %s response fail.\n", cmd);
  151. #endif
  152. }
  153. return len;
  154. }
  155. unsigned char Query_FW_Ver(unsigned char fd, unsigned char targetAddr, Ver *Ret_Buf)
  156. {
  157. unsigned char result = FAIL;
  158. unsigned char tx[7] = {0xaa, 0x00, targetAddr, Cmd.query_FW_Ver, 0x00, 0x00, 0x00};
  159. unsigned char rx[512];
  160. unsigned char chksum = 0x00;
  161. unsigned char len = tranceive(fd, tx, sizeof(tx), rx);
  162. if(len > 6)
  163. {
  164. if (len < 6+(rx[4] | rx[5]<<8))
  165. return result;
  166. for(int idx = 0;idx<(rx[4] | rx[5]<<8);idx++)
  167. {
  168. chksum ^= rx[6+idx];
  169. }
  170. if((chksum == rx[6+(rx[4] | rx[5]<<8)]) &&
  171. (rx[2] == tx[1]) &&
  172. (rx[1] == tx[2]) &&
  173. (rx[3] == tx[3]))
  174. {
  175. memcpy(Ret_Buf->Version_FW, (char *)rx+6, (rx[4] | rx[5]<<8));
  176. *(Ret_Buf->Version_FW + 8) = 0x00;
  177. result = PASS;
  178. }
  179. }
  180. return result;
  181. }
  182. unsigned char Query_HW_Ver(unsigned char fd, unsigned char targetAddr, Ver *Ret_Buf)
  183. {
  184. unsigned char result = FAIL;
  185. unsigned char tx[7] = {0xaa, 0x00, targetAddr, Cmd.query_HW_Ver, 0x00, 0x00, 0x00};
  186. unsigned char rx[512];
  187. unsigned char chksum = 0x00;
  188. unsigned char len = tranceive(fd, tx, sizeof(tx), rx);
  189. if(len > 6)
  190. {
  191. if (len < 6+(rx[4] | rx[5]<<8))
  192. return result;
  193. for(int idx = 0;idx<(rx[4] | rx[5]<<8);idx++)
  194. {
  195. chksum ^= rx[6+idx];
  196. }
  197. if((chksum == rx[6+(rx[4] | rx[5]<<8)]) &&
  198. (rx[2] == tx[1]) &&
  199. (rx[1] == tx[2]) &&
  200. (rx[3] == tx[3]))
  201. {
  202. memcpy(Ret_Buf->Version_HW, (char *)rx+6, (rx[4] | rx[5]<<8));
  203. *(Ret_Buf->Version_HW + 8) = 0x00;
  204. result = PASS;
  205. }
  206. }
  207. return result;
  208. }
  209. unsigned char Query_Present_InputVoltage(unsigned char fd, unsigned char targetAddr, PresentInputVoltage *Ret_Buf)
  210. {
  211. unsigned char result = FAIL;
  212. unsigned char tx[7] = {0xaa, 0x00, targetAddr, Cmd.query_Present_InputVoltage, 0x00, 0x00, 0x00};
  213. unsigned char rx[512];
  214. unsigned char chksum = 0x00;
  215. unsigned char len = tranceive(fd, tx, sizeof(tx), rx);
  216. if(len > 6)
  217. {
  218. if (len < 6+(rx[4] | rx[5]<<8))
  219. return result;
  220. for(int idx = 0;idx<(rx[4] | rx[5]<<8);idx++)
  221. {
  222. chksum ^= rx[6+idx];
  223. }
  224. if((chksum == rx[6+(rx[4] | rx[5]<<8)]) &&
  225. (rx[2] == tx[1]) &&
  226. (rx[1] == tx[2]) &&
  227. (rx[3] == tx[3]))
  228. {
  229. Ret_Buf->inputType = rx[6];
  230. Ret_Buf->L1N_L12 =(rx[7] | (rx[8]<<8))/10.0;
  231. Ret_Buf->L2N_L23 =(rx[9] | (rx[10]<<8))/10.0;
  232. Ret_Buf->L3N_L31 =(rx[11] | (rx[12]<<8))/10.0;
  233. result = PASS;
  234. }
  235. }
  236. return result;
  237. }
  238. unsigned char Query_Present_OutputVoltage(unsigned char fd, unsigned char targetAddr, PresentOutputVoltage *Ret_Buf)
  239. {
  240. unsigned char result = FAIL;
  241. unsigned char tx[7] = {0xaa, 0x00, targetAddr, Cmd.query_Present_OutputVoltage, 0x00, 0x00, 0x00};
  242. unsigned char rx[512];
  243. unsigned char chksum = 0x00;
  244. unsigned char len = tranceive(fd, tx, sizeof(tx), rx);
  245. if(len > 6)
  246. {
  247. if (len < 6+(rx[4] | rx[5]<<8))
  248. return result;
  249. for(int idx = 0;idx<(rx[4] | rx[5]<<8);idx++)
  250. {
  251. chksum ^= rx[6+idx];
  252. }
  253. if((chksum == rx[6+(rx[4] | rx[5]<<8)]) &&
  254. (rx[2] == tx[1]) &&
  255. (rx[1] == tx[2]) &&
  256. (rx[3] == tx[3]))
  257. {
  258. Ret_Buf->behindFuse_Voltage_C1 =(rx[6] | (rx[7]<<8));
  259. Ret_Buf->behindRelay_Voltage_C1 =(rx[8] | (rx[9]<<8));
  260. if((rx[4] | rx[5]<<8) > 4)
  261. {
  262. Ret_Buf->behindFuse_Voltage_C2 =(rx[10] | (rx[11]<<8));
  263. Ret_Buf->behindRelay_Voltage_C2 =(rx[12] | (rx[13]<<8));
  264. }
  265. result = PASS;
  266. }
  267. }
  268. return result;
  269. }
  270. unsigned char Query_Fan_Speed(unsigned char fd, unsigned char targetAddr, FanSpeed *Ret_Buf)
  271. {
  272. unsigned char result = FAIL;
  273. unsigned char tx[7] = {0xaa, 0x00, targetAddr, Cmd.query_Fan_Speed, 0x00, 0x00, 0x00};
  274. unsigned char rx[512];
  275. unsigned char chksum = 0x00;
  276. unsigned char len = tranceive(fd, tx, sizeof(tx), rx);
  277. if(len > 6)
  278. {
  279. if (len < 6+(rx[4] | rx[5]<<8))
  280. return result;
  281. for(int idx = 0;idx<(rx[4] | rx[5]<<8);idx++)
  282. {
  283. chksum ^= rx[6+idx];
  284. }
  285. if((chksum == rx[6+(rx[4] | rx[5]<<8)]) &&
  286. (rx[2] == tx[1]) &&
  287. (rx[1] == tx[2]) &&
  288. (rx[3] == tx[3]))
  289. {
  290. for(int idx=0;idx < 4;idx++)
  291. Ret_Buf->speed[idx] = (rx[6+(2*idx)] | (rx[6+(2*idx)+1]<<8));
  292. result = PASS;
  293. }
  294. }
  295. return result;
  296. }
  297. unsigned char Query_Temperature(unsigned char fd, unsigned char targetAddr, Temperature *Ret_Buf)
  298. {
  299. unsigned char result = FAIL;
  300. unsigned char tx[7] = {0xaa, 0x00, targetAddr, Cmd.query_Temperature, 0x00, 0x00, 0x00};
  301. unsigned char rx[512];
  302. unsigned char chksum = 0x00;
  303. unsigned char len = tranceive(fd, tx, sizeof(tx), rx);
  304. if(len > 6)
  305. {
  306. if (len < 6+(rx[4] | rx[5]<<8))
  307. return result;
  308. for(int idx = 0;idx<(rx[4] | rx[5]<<8);idx++)
  309. {
  310. chksum ^= rx[6+idx];
  311. }
  312. if((chksum == rx[6+(rx[4] | rx[5]<<8)]) &&
  313. (rx[2] == tx[1]) &&
  314. (rx[1] == tx[2]) &&
  315. (rx[3] == tx[3]))
  316. {
  317. for(int idx=0;idx < 4;idx++)
  318. Ret_Buf->temperature[idx] = rx[6+idx] - 60;
  319. result = PASS;
  320. }
  321. }
  322. return result;
  323. }
  324. unsigned char Query_Aux_PowerVoltage(unsigned char fd, unsigned char targetAddr, AuxPower *Ret_Buf)
  325. {
  326. unsigned char result = FAIL;
  327. unsigned char tx[7] = {0xaa, 0x00, targetAddr, Cmd.query_Aux_PowerVoltage, 0x00, 0x00, 0x00};
  328. unsigned char rx[512];
  329. unsigned char chksum = 0x00;
  330. unsigned char len = tranceive(fd, tx, sizeof(tx), rx);
  331. if(len > 6)
  332. {
  333. if (len < 6+(rx[4] | rx[5]<<8))
  334. return result;
  335. for(int idx = 0;idx<(rx[4] | rx[5]<<8);idx++)
  336. {
  337. chksum ^= rx[6+idx];
  338. }
  339. if((chksum == rx[6+(rx[4] | rx[5]<<8)]) &&
  340. (rx[2] == tx[1]) &&
  341. (rx[1] == tx[2]) &&
  342. (rx[3] == tx[3]))
  343. {
  344. for(int idx=0;idx<(rx[4] | rx[5]<<8);idx++)
  345. Ret_Buf->voltage[idx] = rx[6+idx];
  346. result = PASS;
  347. }
  348. }
  349. return result;
  350. }
  351. unsigned char Query_Relay_Output(unsigned char fd, unsigned char targetAddr, Relay *Ret_Buf)
  352. {
  353. unsigned char result = FAIL;
  354. unsigned char tx[7] = {0xaa, 0x00, targetAddr, Cmd.query_Relay_Output, 0x00, 0x00, 0x00};
  355. unsigned char rx[512];
  356. unsigned char chksum = 0x00;
  357. unsigned char len = tranceive(fd, tx, sizeof(tx), rx);
  358. if(len > 6)
  359. {
  360. if (len < 6+(rx[4] | rx[5]<<8))
  361. return result;
  362. for(int idx = 0;idx<(rx[4] | rx[5]<<8);idx++)
  363. {
  364. chksum ^= rx[6+idx];
  365. }
  366. if((chksum == rx[6+(rx[4] | rx[5]<<8)]) &&
  367. (rx[2] == tx[1]) &&
  368. (rx[1] == tx[2]) &&
  369. (rx[3] == tx[3]))
  370. {
  371. Ret_Buf->relay_event.bits.AC_Contactor = (rx[6] >> 0) & 0x01;
  372. Ret_Buf->relay_event.bits.CCS_Precharge = (rx[6] >> 1) & 0x01;
  373. Ret_Buf->relay_event.bits.Gun1_N = (rx[7] >> 0) & 0x01;
  374. Ret_Buf->relay_event.bits.Gun1_P = (rx[7] >> 1) & 0x01;
  375. Ret_Buf->relay_event.bits.Gun1_Parallel_N = (rx[7] >> 2) & 0x01;
  376. Ret_Buf->relay_event.bits.Gun1_Parallel_P = (rx[7] >> 3) & 0x01;
  377. Ret_Buf->relay_event.bits.Gun2_N = (rx[8] >> 0) & 0x01;
  378. Ret_Buf->relay_event.bits.Gun2_P = (rx[8] >> 1) & 0x01;
  379. result = PASS;
  380. }
  381. }
  382. return result;
  383. }
  384. unsigned char Query_Gfd_Adc(unsigned char fd, unsigned char targetAddr, Gfd *Ret_Buf)
  385. {
  386. unsigned char result = FAIL;
  387. unsigned char tx[7] = {0xaa, 0x00, targetAddr, Cmd.query_Gfd_Adc, 0x00, 0x00, 0x00};
  388. unsigned char rx[512];
  389. unsigned char chksum = 0x00;
  390. unsigned char len = tranceive(fd, tx, sizeof(tx), rx);
  391. if(len > 6)
  392. {
  393. if (len < 6+(rx[4] | rx[5]<<8))
  394. return result;
  395. for(int idx = 0;idx<(rx[4] | rx[5]<<8);idx++)
  396. {
  397. chksum ^= rx[6+idx];
  398. }
  399. printf("chksum = %d \n", chksum);
  400. printf("rx[2] == %d tx[1] = %d \n", rx[2], tx[1]);
  401. printf("rx[1] == %d tx[2] = %d \n", rx[1], tx[2]);
  402. printf("rx[3] == %d tx[3] = %d \n", rx[3], tx[3]);
  403. printf("chksum = %d \n", chksum);
  404. // if((chksum == rx[6+(rx[4] | rx[5]<<8)]) &&
  405. // (rx[2] == tx[1]) &&
  406. // (rx[1] == tx[2]) &&
  407. // (rx[3] == tx[3]))
  408. if(
  409. (rx[2] == tx[1]) &&
  410. (rx[1] == tx[2]) &&
  411. (rx[3] == tx[3]))
  412. {
  413. Ret_Buf->Resister = (rx[6] | (rx[7]<<8) | (rx[8]<<16) | (rx[9]<<24));
  414. Ret_Buf->voltage = rx[10] | (rx[11]<<8);
  415. Ret_Buf->result = rx[12];
  416. result = PASS;
  417. }
  418. }
  419. return result;
  420. }
  421. unsigned char Query_Gpio_Input(unsigned char fd, unsigned char targetAddr, Gpio_in *Ret_Buf)
  422. {
  423. unsigned char result = FAIL;
  424. unsigned char tx[7] = {0xaa, 0x00, targetAddr, Cmd.query_Gpio_In, 0x00, 0x00, 0x00};
  425. unsigned char rx[512];
  426. unsigned char chksum = 0x00;
  427. unsigned char len = tranceive(fd, tx, sizeof(tx), rx);
  428. if(len > 6)
  429. {
  430. if (len < 6+(rx[4] | rx[5]<<8))
  431. return result;
  432. for(int idx = 0;idx<(rx[4] | rx[5]<<8);idx++)
  433. {
  434. chksum ^= rx[6+idx];
  435. }
  436. if((chksum == rx[6+(rx[4] | rx[5]<<8)]) &&
  437. (rx[2] == tx[1]) &&
  438. (rx[1] == tx[2]) &&
  439. (rx[3] == tx[3]))
  440. {
  441. Ret_Buf->AC_Connector = (rx[6] >> 0) & 0x01;
  442. Ret_Buf->AC_MainBreaker = (rx[6] >> 1) & 0x01;
  443. Ret_Buf->SPD = (rx[6] >> 2) & 0x01;
  444. Ret_Buf->Door_Open = (rx[6] >> 3) & 0x01;
  445. Ret_Buf->GFD[0] = (rx[6] >> 4) & 0x01;
  446. Ret_Buf->GFD[1] = (rx[6] >> 5) & 0x01;
  447. Ret_Buf->AC_Drop = (rx[6] >> 6) & 0x01;
  448. Ret_Buf->Emergency_IO = (rx[7] >> 0) & 0x01;
  449. Ret_Buf->Button_Emergency_Press = (rx[8] >> 0) & 0x01;
  450. Ret_Buf->Button_On_Press = (rx[8] >> 1) & 0x01;
  451. Ret_Buf->Button_Off_Press = (rx[8] >> 2) & 0x01;
  452. Ret_Buf->Key_1_Press = (rx[8] >> 3) & 0x01;
  453. Ret_Buf->Key_2_Press = (rx[8] >> 4) & 0x01;
  454. Ret_Buf->Key_3_Press = (rx[8] >> 5) & 0x01;
  455. Ret_Buf->Key_4_Press = (rx[8] >> 6) & 0x01;
  456. result = PASS;
  457. }
  458. }
  459. return result;
  460. }
  461. unsigned char Config_Fan_Speed(unsigned char fd, unsigned char targetAddr, FanSpeed *Set_Buf)
  462. {
  463. unsigned char result = FAIL;
  464. unsigned char tx[9] = {0xaa, 0x00, targetAddr, Cmd.config_Fan_Speed, 0x02, 0x00, Set_Buf->speed[0], Set_Buf->speed[1]};
  465. unsigned char rx[512];
  466. unsigned char chksum = 0x00;
  467. for(int idx = 0;idx<(tx[4] | tx[5]<<8);idx++)
  468. chksum ^= tx[6+idx];
  469. tx[9] = chksum;
  470. unsigned char len = tranceive(fd, tx, sizeof(tx), rx);
  471. if(len > 6)
  472. {
  473. if (len < 6+(rx[4] | rx[5]<<8))
  474. return result;
  475. chksum = 0x00;
  476. for(int idx = 0;idx<(rx[4] | rx[5]<<8);idx++)
  477. {
  478. chksum ^= rx[6+idx];
  479. }
  480. if((chksum == rx[6+(rx[4] | rx[5]<<8)]) &&
  481. (rx[2] == tx[1]) &&
  482. (rx[1] == tx[2]) &&
  483. (rx[3] == tx[3]))
  484. {
  485. result = PASS;
  486. }
  487. }
  488. return result;
  489. }
  490. unsigned char Config_Relay_Output(unsigned char fd, unsigned char targetAddr, Relay *Set_Buf)
  491. {
  492. unsigned char result = FAIL;
  493. unsigned char tx[10] = {0xaa, 0x00, targetAddr, Cmd.config_Relay_Output, 0x03, 0x00, Set_Buf->relay_event.relay_status[0], Set_Buf->relay_event.relay_status[1], Set_Buf->relay_event.relay_status[2]};
  494. unsigned char rx[512];
  495. unsigned char chksum = 0x00;
  496. for(int idx = 0;idx<(tx[4] | tx[5]<<8);idx++)
  497. chksum ^= tx[6 + idx];
  498. tx[9] = chksum;
  499. unsigned char len = tranceive(fd, tx, sizeof(tx), rx);
  500. if(len > 6)
  501. {
  502. if (len < 6+(rx[4] | rx[5]<<8))
  503. return result;
  504. // for (int i = 0; i < len; i++)
  505. // printf("set relay cmd : rx = %x \n", rx[i]);
  506. chksum = 0x00;
  507. for(int idx = 0;idx<(rx[4] | rx[5]<<8);idx++)
  508. {
  509. chksum ^= rx[6+idx];
  510. }
  511. if((chksum == rx[6+(rx[4] | rx[5]<<8)]) &&
  512. (rx[2] == tx[1]) &&
  513. (rx[1] == tx[2]) &&
  514. (rx[3] == tx[3]) &&
  515. rx[6] == PASS)
  516. {
  517. result = PASS;
  518. }
  519. }
  520. return result;
  521. }
  522. unsigned char Config_Gfd_Value(unsigned char fd, unsigned char targetAddr, Gfd_config *Set_Buf)
  523. {
  524. unsigned char result = FAIL;
  525. unsigned char tx[11] = {0xaa, 0x00, targetAddr, Cmd.config_Gfd_Value, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00};
  526. unsigned char rx[512];
  527. unsigned char chksum = 0x00;
  528. tx[6] = (unsigned char)(Set_Buf->reqVol) & 0xff;
  529. tx[7] = ((unsigned char)(Set_Buf->reqVol) >> 8) & 0xff;
  530. tx[8] = (unsigned char)(Set_Buf->resister) & 0xff;
  531. tx[9] = ((unsigned char)(Set_Buf->resister) >> 8) & 0xff;
  532. for(int idx = 0;idx<(tx[4] | tx[5]<<8);idx++)
  533. chksum ^= tx[6+idx];
  534. tx[10] = chksum;
  535. unsigned char len = tranceive(fd, tx, sizeof(tx), rx);
  536. if(len > 6)
  537. {
  538. if (len < 6+(rx[4] | rx[5]<<8))
  539. return result;
  540. chksum = 0x00;
  541. for(int idx = 0;idx<(rx[4] | rx[5]<<8);idx++)
  542. {
  543. chksum ^= rx[6+idx];
  544. }
  545. if((chksum == rx[6+(rx[4] | rx[5]<<8)]) &&
  546. (rx[2] == tx[1]) &&
  547. (rx[1] == tx[2]) &&
  548. (rx[3] == tx[3]) &&
  549. (rx[6] == tx[6]))
  550. {
  551. result = PASS;
  552. }
  553. }
  554. return result;
  555. }
  556. unsigned char Update_Start(unsigned char fd, unsigned char targetAddr, unsigned int crc32)
  557. {
  558. unsigned char result = FAIL;
  559. 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};
  560. unsigned char rx[512];
  561. unsigned char chksum = 0x00;
  562. for(int idx = 0;idx<(tx[4] | tx[5]<<8);idx++)
  563. chksum ^= tx[6+idx];
  564. tx[10] = chksum;
  565. unsigned char len = tranceive(fd, tx, sizeof(tx), rx);
  566. if(len > 6)
  567. {
  568. if (len < 6+(rx[4] | rx[5]<<8))
  569. return result;
  570. chksum = 0x00;
  571. for(int idx = 0;idx<(rx[4] | rx[5]<<8);idx++)
  572. {
  573. chksum ^= rx[6+idx];
  574. }
  575. if((chksum == rx[6+(rx[4] | rx[5]<<8)]) &&
  576. (rx[2] == tx[1]) &&
  577. (rx[1] == tx[2]) &&
  578. (rx[3] == tx[3]) &&
  579. (rx[6] == 0x00))
  580. {
  581. result = PASS;
  582. }
  583. }
  584. return result;
  585. }
  586. unsigned char Update_Abord(unsigned char fd, unsigned char targetAddr)
  587. {
  588. unsigned char result = FAIL;
  589. unsigned char tx[7] = {0xaa, 0x00, targetAddr, Cmd.update_Start, 0x04, 0x00, 0x00};
  590. unsigned char rx[512];
  591. unsigned char chksum = 0x00;
  592. unsigned char len = tranceive(fd, tx, sizeof(tx), rx);
  593. if(len > 6)
  594. {
  595. if (len < 6+(rx[4] | rx[5]<<8))
  596. return result;
  597. for(int idx = 0;idx<(rx[4] | rx[5]<<8);idx++)
  598. {
  599. chksum ^= rx[6+idx];
  600. }
  601. if((chksum == rx[6+(rx[4] | rx[5]<<8)]) &&
  602. (rx[2] == tx[1]) &&
  603. (rx[1] == tx[2]) &&
  604. (rx[3] == tx[3]) &&
  605. (rx[6] == 0x00))
  606. {
  607. result = PASS;
  608. }
  609. }
  610. return result;
  611. }
  612. unsigned char Update_Transfer(unsigned char fd, unsigned char targetAddr, unsigned int startAddr, unsigned char *data, unsigned short int length)
  613. {
  614. unsigned char result = FAIL;
  615. unsigned char tx[11 + length];
  616. unsigned char rx[512];
  617. unsigned char chksum = 0x00;
  618. tx[0] = 0xaa;
  619. tx[1] = 0x00;
  620. tx[2] = targetAddr;
  621. tx[3] = Cmd.update_Transfer;
  622. tx[4] = (4 + length) & 0xff;
  623. tx[5] = ((4 + length)>>8) & 0xff;
  624. tx[6] = (startAddr>>0) & 0xff;
  625. tx[7] = (startAddr>>8) & 0xff;
  626. tx[8] = (startAddr>>16) & 0xff;
  627. tx[9] = (startAddr>>24) & 0xff;
  628. memcpy(tx+10, data, length);
  629. for(int idx = 0;idx<(tx[4] | tx[5]<<8);idx++)
  630. chksum ^= tx[6+idx];
  631. tx[sizeof(tx)-1] = chksum;
  632. unsigned char len = tranceive(fd, tx, sizeof(tx), rx);
  633. if(len > 6)
  634. {
  635. if (len < 6+(rx[4] | rx[5]<<8))
  636. return result;
  637. for(int idx = 0;idx<(rx[4] | rx[5]<<8);idx++)
  638. {
  639. chksum ^= rx[6+idx];
  640. }
  641. if((chksum == rx[6+(rx[4] | rx[5]<<8)]) &&
  642. (rx[2] == tx[1]) &&
  643. (rx[1] == tx[2]) &&
  644. (rx[3] == tx[3]) &&
  645. (rx[6] == 0x00))
  646. {
  647. result = PASS;
  648. }
  649. }
  650. return result;
  651. }
  652. unsigned char Update_Finish(unsigned char fd, unsigned char targetAddr)
  653. {
  654. unsigned char result = FAIL;
  655. unsigned char tx[7] = {0xaa, 0x00, targetAddr, Cmd.update_Finish, 0x04, 0x00, 0x00};
  656. unsigned char rx[512];
  657. unsigned char chksum = 0x00;
  658. unsigned char len = tranceive(fd, tx, sizeof(tx), rx);
  659. if(len > 6)
  660. {
  661. if (len < 6+(rx[4] | rx[5]<<8))
  662. return result;
  663. for(int idx = 0;idx<(rx[4] | rx[5]<<8);idx++)
  664. {
  665. chksum ^= rx[6+idx];
  666. }
  667. if((chksum == rx[6+(rx[4] | rx[5]<<8)]) &&
  668. (rx[2] == tx[1]) &&
  669. (rx[1] == tx[2]) &&
  670. (rx[3] == tx[3]) &&
  671. (rx[6] == 0x00))
  672. {
  673. result = PASS;
  674. }
  675. }
  676. return result;
  677. }
  678. //================================================
  679. //================================================
  680. // CANBUS send cmd
  681. //================================================
  682. //================================================
  683. int PackageIdCmd(int cmd)
  684. {
  685. return cmd | 0x80000000;
  686. }
  687. void SendCmdToEvboard(int cmd, byte *data, byte dataLen)
  688. {
  689. struct can_frame frame;
  690. frame.can_id = cmd;
  691. frame.can_dlc = dataLen;
  692. memcpy(frame.data, data, sizeof(frame.data));
  693. write(CanFd, &frame, sizeof(struct can_frame));
  694. }
  695. void SetTargetAddr(byte *target_number, byte index)
  696. {
  697. int id = PackageIdCmd(Ev_Cmd.address_assignment + index);
  698. //printf("intCmd = %x \n", cmd & CAN_EFF_MASK);
  699. //cmd = cmd & CAN_EFF_MASK;
  700. byte data[8];
  701. data[0] = *target_number;
  702. data[1] = *(target_number + 1);
  703. data[2] = *(target_number + 2);
  704. data[3] = *(target_number + 3);
  705. data[4] = index;
  706. SendCmdToEvboard(id, data, sizeof(data));
  707. }
  708. void GetFirmwareVersion(byte gun_index, byte toId)
  709. {
  710. int id = PackageIdCmd(Ev_Cmd.get_firmware_ver + toId);
  711. byte data[8];
  712. SendCmdToEvboard(id, data, 0);
  713. }
  714. void GetHardwareVersion(byte gun_index, byte toId)
  715. {
  716. int id = PackageIdCmd(Ev_Cmd.get_hardware_ver + toId);
  717. byte data[8];
  718. SendCmdToEvboard(id, data, 0);
  719. }
  720. void SetChargingPermission(byte gun_index, byte permissionStatus, short aOutputPw, short aOutputCur, short aOutputVol, byte toId)
  721. {
  722. int id = PackageIdCmd(Ev_Cmd.charging_permission + toId);
  723. byte data[8];
  724. data[0] = permissionStatus;
  725. data[1] = aOutputPw & 0xff;
  726. data[2] = (aOutputPw >> 8) & 0xff;
  727. data[3] = aOutputCur & 0xff;
  728. data[4] = (aOutputCur >> 8) & 0xff;
  729. data[5] = aOutputVol & 0xff;
  730. data[6] = (aOutputVol >> 8) & 0xff;
  731. data[7] = 0xff;
  732. //printf(" ChargingPermission Get-Msg : %08X - %02x %02x %02x %02x %02x %02x %02x %02x\n ",(Ev_Cmd.charging_permission + toId), data[0], data[1], data[2], data[3], data[4], data[5], data[6], data[7] );
  733. SendCmdToEvboard(id, data, sizeof(data));
  734. }
  735. void SetPresentInputPower(short outputVol_b1, short outputCur_b1, byte toId)
  736. {
  737. int id = PackageIdCmd(Ev_Cmd.present_input_power + toId);
  738. byte data[8];
  739. data[0] = outputVol_b1 & 0xff;
  740. data[1] = (outputVol_b1 >> 8) & 0xff;
  741. data[2] = outputCur_b1 & 0xff;
  742. data[3] = (outputCur_b1 >> 8) & 0xff;
  743. /*
  744. data[4] = outputVol_b2 & 0xff;
  745. data[5] = (outputVol_b2 >> 8) & 0xff;
  746. data[6] = outputCur_b2 & 0xff;
  747. data[7] = (outputCur_b2 >> 8) & 0xff;
  748. */
  749. //printf(" PresentInputPower Get-Msg : %08X - %02x %02x %02x %02x %02x %02x %02x %02x\n ",Ev_Cmd.present_input_power, data[0], data[1], data[2], data[3], data[4], data[5], data[6], data[7] );
  750. SendCmdToEvboard(id, data, sizeof(data));
  751. }
  752. void SetPresentInputRequirement(short aOutputPw_b1, short aOutputCur_b1, short aOutputPw_b2, short aOutputCur_b2, byte toId)
  753. {
  754. int id = PackageIdCmd(Ev_Cmd.present_input_requirement + toId );
  755. byte data[8];
  756. data[0] = aOutputPw_b1 & 0xff;
  757. data[1] = (aOutputPw_b1 >> 8) & 0xff;
  758. data[2] = aOutputCur_b1 & 0xff;
  759. data[3] = (aOutputCur_b1 >> 8) & 0xff;
  760. data[4] = aOutputPw_b2 & 0xff;
  761. data[5] = (aOutputPw_b2 >> 8) & 0xff;
  762. data[6] = aOutputCur_b2 & 0xff;
  763. data[7] = 0x01;
  764. /*
  765. data[6] = aOutputCur_b2 & 0xff;
  766. data[7] = (aOutputCur_b2 >> 8) & 0xff;
  767. */
  768. //printf(" Present Input Requirement Get-Msg : %08X - %02x %02x %02x %02x %02x %02x %02x %02x\n ",Ev_Cmd.present_input_requirement, data[0], data[1], data[2], data[3], data[4], data[5], data[6], data[7] );
  769. SendCmdToEvboard(id, data, sizeof(data));
  770. }
  771. void GetEvseOutputStatus(byte gun_index, byte toId)
  772. {
  773. int id = PackageIdCmd(Ev_Cmd.get_evse_output_status + toId);
  774. byte data[8];
  775. SendCmdToEvboard(id, data, 0);
  776. }
  777. void GetEvseCapacityInfo(byte gun_index, byte toId)
  778. {
  779. int id = PackageIdCmd(Ev_Cmd.get_evse_capacity_info + toId);
  780. byte data[8];
  781. SendCmdToEvboard(id, data, 0);
  782. }
  783. void EvseStopChargingEvent(byte stopResult, byte *stopReason, byte toId)
  784. {
  785. int id = PackageIdCmd(Ev_Cmd.evse_stop_charging + toId);
  786. byte data[8];
  787. data[0] = stopResult;
  788. data[1] = *stopReason;
  789. data[2] = *(stopReason + 1);
  790. data[3] = *(stopReason + 2);
  791. data[4] = *(stopReason + 3);
  792. data[5] = *(stopReason + 4);
  793. data[6] = *(stopReason + 5);
  794. SendCmdToEvboard(id, data, sizeof(data));
  795. }
  796. void GetMiscellaneousInfo(byte gun_index, byte toId, short K1K2Status, short soc)
  797. {
  798. int id = PackageIdCmd(Ev_Cmd.get_miscellaneous_info + toId);
  799. byte data[8];
  800. data[0] = 0x01;
  801. data[1] = 0x02;
  802. data[2] = 0x03;
  803. data[3] = 0x04;
  804. data[4] = 0x05;
  805. data[5] = K1K2Status & 0xff;
  806. data[6] = soc & 0xff;
  807. data[7] = 0x08;
  808. //printf(" Miscellaneous Info Get-Msg : %08X - %02x %02x %02x %02x %02x %02x %02x %02x\n ",Ev_Cmd.get_miscellaneous_info, data[0], data[1], data[2], data[3], data[4], data[5], data[6], data[7] );
  809. /*
  810. data[1] = 0x0001;
  811. data[2] = 0x0001;
  812. data[3] = 0x10;
  813. data[4] = 0x10;
  814. */
  815. SendCmdToEvboard(id, data, sizeof(data));
  816. }
  817. void SetIsolationStatus(byte gun_index, byte result, byte toId)
  818. {
  819. int id = PackageIdCmd(Ev_Cmd.isolation_status + toId);
  820. byte data[8];
  821. data[0] = result;
  822. SendCmdToEvboard(id, data, 1);
  823. }
  824. void SetEvsePrechargeInfo(byte gun_index, byte result, byte toId)
  825. {
  826. int id = PackageIdCmd(Ev_Cmd.evse_precharge_info + toId);
  827. byte data[8];
  828. data[0] = result;
  829. SendCmdToEvboard(id, data, 1);
  830. }
  831. bool CheckUniqNumber(byte value)
  832. {
  833. for (byte index = 0; index < gun_count; index++)
  834. {
  835. if (_chargingData[index]->Evboard_id == value)
  836. {
  837. struct timeval _end_time;
  838. gettimeofday(&_end_time, NULL);
  839. unsigned long diff = 1000000 * (_end_time.tv_sec - _id_assign_time.tv_sec) + _end_time.tv_usec - _id_assign_time.tv_usec;
  840. if (diff >= 3000000)
  841. {
  842. gettimeofday(&_id_assign_time, NULL);
  843. return true;
  844. }
  845. else
  846. {
  847. return false;
  848. }
  849. }
  850. }
  851. gettimeofday(&_id_assign_time, NULL);
  852. return true;
  853. }
  854. const int System_GPIO_Pin_Table[SYS_GPIO_NUM] =
  855. {
  856. PIN_AM_OK_FLAG, PIN_IO_BD1_1, PIN_IO_BD1_2, PIN_IO_BD2_1, PIN_IO_BD2_2, PIN_ID_BD1_1, PIN_ID_BD1_2, PIN_ID_BD2_1,
  857. PIN_ID_BD2_2, PIN_AM_RFID_RST, PIN_AM_RFID_ICC, PIN_BOARD1_PROXIMITY, PIN_BOARD2_PROXIMITY, PIN_AM_DE_1, PIN_AM_RE_1, PIN_ETHERNET_RESET
  858. };
  859. void gpio_export(int pin)
  860. {
  861. char buffer[64];
  862. snprintf(buffer, sizeof(buffer), "echo %d > /sys/class/gpio/export", pin);
  863. system(buffer);
  864. }
  865. void gpio_unexport(int pin)
  866. {
  867. char buffer[64];
  868. snprintf(buffer, sizeof(buffer), "echo %d > /sys/class/gpio/unexport", pin);
  869. system(buffer);
  870. }
  871. void gpio_set_direction(int pin, unsigned char dir)
  872. {
  873. /*
  874. char buffer[64];
  875. snprintf(buffer, sizeof(buffer), "echo %s > /sys/class/gpio/gpio%d/direction", dir == GPIO_DIR_INPUT ? "in" : "out", pin);
  876. system(buffer);
  877. */
  878. int fd;
  879. char buffer[64];
  880. snprintf(buffer, sizeof(buffer), "/sys/class/gpio/gpio%d/direction", pin);
  881. fd = open(buffer, O_WRONLY);
  882. if (fd < 0)
  883. {
  884. gpio_export(pin);
  885. fd = open(buffer, O_WRONLY);
  886. if(fd < 0)
  887. {
  888. printf("\r\nFailed to open gpio%d direction for writing!", pin);
  889. return;
  890. }
  891. }
  892. write(fd, dir == GPIO_DIR_INPUT ? "in" : "out", dir == GPIO_DIR_INPUT ? 2 : 3);
  893. close(fd);
  894. }
  895. void gpio_write(int pin, unsigned char value)
  896. {
  897. char buffer[64];
  898. snprintf(buffer, sizeof(buffer), "echo %d > /sys/class/gpio/gpio%d/value", value > 0 ? 1 : 0, pin);
  899. system(buffer);
  900. }
  901. int gpio_read(int pin)
  902. {
  903. int fd, value = 0;
  904. char ch;
  905. char buffer[64];
  906. snprintf(buffer, sizeof(buffer), "/sys/class/gpio/gpio%d/value", pin);
  907. fd = open(buffer, O_RDONLY);
  908. if (fd < 0)
  909. {
  910. return -1;
  911. }
  912. if (read(fd, &ch, 4) < 0)
  913. {
  914. return -1;
  915. }
  916. value = atoi(&ch);
  917. close(fd);
  918. return value;
  919. }
  920. int adc_read(int adc_port)
  921. {
  922. int fd, value = 0;
  923. char ch[5];
  924. char buffer[64];
  925. snprintf(buffer,sizeof(buffer), "/sys/bus/iio/devices/iio:device0/in_voltage%d_raw", adc_port);
  926. fd = open(buffer, O_RDONLY);
  927. if(fd < 0)
  928. {
  929. return -1;
  930. }
  931. if(read(fd, ch, 4) < 0)
  932. {
  933. return -1;
  934. }
  935. value = atoi(ch);
  936. close(fd);
  937. return value;
  938. }
  939. void InitIO(void)
  940. {
  941. /* GPMC_AD8 => GPIO0_22 *//*ID BD1_1*/
  942. gpio_set_direction(PIN_ID_BD1_1, GPIO_DIR_INPUT);
  943. /* GPMC_AD9 => GPIO0_23 *//*ID BD1_2*/
  944. gpio_set_direction(PIN_ID_BD1_2, GPIO_DIR_INPUT);
  945. /* GPMC_AD10 => GPIO0_26 *//*IO BD1_1*/
  946. gpio_set_direction(PIN_IO_BD1_1, GPIO_DIR_OUTPUT);
  947. gpio_write(PIN_IO_BD1_1, 0);
  948. /* GPMC_AD11 => GPIO0_27 *//*IO BD1_2*/
  949. gpio_set_direction(PIN_IO_BD1_2, GPIO_DIR_OUTPUT);
  950. gpio_write(PIN_IO_BD1_2, 0);
  951. /*XDMA_EVENT_INTR0 => GPIO0_19 *//*AM_RFID_RST*/
  952. gpio_set_direction(PIN_AM_RFID_RST, GPIO_DIR_OUTPUT);
  953. gpio_write(PIN_AM_RFID_RST, 0);
  954. /*XDMA_EVENT_INTR1 => GPIO0_20 *//*AM_RFID_ICC*/
  955. gpio_set_direction(PIN_AM_RFID_ICC, GPIO_DIR_OUTPUT);
  956. gpio_write(PIN_AM_RFID_ICC, 0);
  957. /* GPMC_AD12 => GPIO1_12 *//*ID BD2_1*/
  958. gpio_set_direction(PIN_ID_BD2_1, GPIO_DIR_INPUT);
  959. /* GPMC_AD13 => GPIO1_13 *//*ID BD2_2*/
  960. gpio_set_direction(PIN_ID_BD2_2, GPIO_DIR_INPUT);
  961. /* GPMC_AD14 => GPIO1_14 *//*IO BD2_1*/
  962. gpio_set_direction(PIN_IO_BD2_1, GPIO_DIR_OUTPUT);
  963. gpio_write(PIN_IO_BD2_1, 0);
  964. /* GPMC_AD15 => GPIO1_15 *//*IO BD2_2*/
  965. gpio_set_direction(PIN_IO_BD2_2, GPIO_DIR_OUTPUT);
  966. gpio_write(PIN_IO_BD2_2, 0);
  967. /* MCASP0_AXR0 => GPIO3_16 *//*CSU board function OK indicator.*/
  968. gpio_set_direction(PIN_AM_OK_FLAG, GPIO_DIR_OUTPUT);
  969. gpio_write(PIN_AM_OK_FLAG, 0);
  970. gpio_set_direction(PIN_BOARD1_PROXIMITY, GPIO_DIR_INPUT);
  971. gpio_set_direction(PIN_BOARD2_PROXIMITY, GPIO_DIR_INPUT);
  972. }
  973. void DeInitIO(void)
  974. {
  975. gpio_unexport(PIN_ID_BD1_1);
  976. gpio_unexport(PIN_ID_BD1_2);
  977. gpio_unexport(PIN_IO_BD1_1);
  978. gpio_unexport(PIN_IO_BD1_2);
  979. gpio_unexport(PIN_AM_RFID_RST);
  980. gpio_unexport(PIN_AM_RFID_ICC);
  981. gpio_unexport(PIN_ID_BD2_1);
  982. gpio_unexport(PIN_ID_BD2_2);
  983. gpio_unexport(PIN_IO_BD2_1);
  984. gpio_unexport(PIN_IO_BD2_2);
  985. gpio_unexport(PIN_AM_OK_FLAG);
  986. }
  987. void DoIOTest(void)
  988. {
  989. InitIO();
  990. gpio_write(PIN_IO_BD1_1, 1);
  991. if(gpio_read(PIN_ID_BD1_1) == 1)
  992. {
  993. gpio_write(PIN_IO_BD1_1, 0);
  994. if(gpio_read(PIN_ID_BD1_1) == 0)
  995. {
  996. printf("\r\nID_BD1_1 Test OK");
  997. }
  998. else
  999. {
  1000. printf("\r\nID_BD1_1 Low Test Fail");
  1001. return;
  1002. }
  1003. }
  1004. else
  1005. {
  1006. printf("\r\nID_BD1_1 High Test Fail");
  1007. return;
  1008. }
  1009. gpio_write(PIN_IO_BD1_2, 1);
  1010. if(gpio_read(PIN_ID_BD1_2) == 1)
  1011. {
  1012. gpio_write(PIN_IO_BD1_2, 0);
  1013. if(gpio_read(PIN_ID_BD1_2) == 0)
  1014. {
  1015. printf("\r\nID_BD1_2 Test OK");
  1016. }
  1017. else
  1018. {
  1019. printf("\r\nID_BD1_2 Low Test Fail");
  1020. return;
  1021. }
  1022. }
  1023. else
  1024. {
  1025. printf("\r\nID_BD1_2 High Test Fail");
  1026. return;
  1027. }
  1028. gpio_write(PIN_IO_BD2_1, 1);
  1029. if(gpio_read(PIN_ID_BD2_1) == 1)
  1030. {
  1031. gpio_write(PIN_IO_BD2_1, 0);
  1032. if(gpio_read(PIN_ID_BD2_1) == 0)
  1033. {
  1034. printf("\r\nID_BD2_1 Test OK");
  1035. }
  1036. else
  1037. {
  1038. printf("\r\nID_BD2_1 Low Test Fail");
  1039. return;
  1040. }
  1041. }
  1042. else
  1043. {
  1044. printf("\r\nID_BD2_1 High Test Fail");
  1045. return;
  1046. }
  1047. gpio_write(PIN_IO_BD2_2, 1);
  1048. if(gpio_read(PIN_ID_BD2_2) == 1)
  1049. {
  1050. gpio_write(PIN_IO_BD2_2, 0);
  1051. if(gpio_read(PIN_ID_BD2_2) == 0)
  1052. {
  1053. printf("\r\nID_BD2_2 Test OK");
  1054. }
  1055. else
  1056. {
  1057. printf("\r\nID_BD2_2 Low Test Fail");
  1058. return;
  1059. }
  1060. }
  1061. else
  1062. {
  1063. printf("\r\nID_BD2_2 High Test Fail");
  1064. return;
  1065. }
  1066. gpio_write(PIN_AM_RFID_RST, 1);
  1067. if(gpio_read(PIN_BOARD1_PROXIMITY) == 1 && gpio_read(PIN_BOARD2_PROXIMITY) == 1)
  1068. {
  1069. gpio_write(PIN_AM_RFID_RST, 0);
  1070. if(gpio_read(PIN_BOARD1_PROXIMITY) == 0 && gpio_read(PIN_BOARD2_PROXIMITY) == 0)
  1071. {
  1072. printf("\r\nBoard1 & Board2 Proximity Test OK");
  1073. }
  1074. else
  1075. {
  1076. printf("\r\nBoard1 & Board2 Proximity Low Test Fail");
  1077. return;
  1078. }
  1079. }
  1080. else
  1081. {
  1082. printf("\r\nBoard1 & Board2 Proximity High Test Fail");
  1083. return;
  1084. }
  1085. gpio_write(PIN_AM_RFID_ICC, 1);
  1086. usleep(100000);
  1087. if(adc_read(ADC_AIN0) < 100 && adc_read(ADC_AIN1) < 100 && adc_read(ADC_AIN2) < 100 && adc_read(ADC_AIN3) < 100)
  1088. {
  1089. gpio_write(PIN_AM_RFID_ICC, 0);
  1090. usleep(100000);
  1091. if(adc_read(ADC_AIN0) > 4000 && adc_read(ADC_AIN1) > 4000 && adc_read(ADC_AIN2) > 4000 && adc_read(ADC_AIN3) > 4000)
  1092. {
  1093. printf("\r\nAIN0, AIN1, AIN2, AIN3 Test OK");
  1094. }
  1095. else
  1096. {
  1097. printf("\r\nAIN0, AIN1, AIN2, AIN3 High Test Fail");
  1098. return;
  1099. }
  1100. }
  1101. else
  1102. {
  1103. printf("\r\nAIN0, AIN1, AIN2, AIN3 Low Test Fail");
  1104. return;
  1105. }
  1106. gpio_write(PIN_AM_OK_FLAG, 1);
  1107. printf("\r\nIO Test Done!");
  1108. printf("\r\nSuccess!\r\n");
  1109. }
  1110. //==========================================
  1111. // Init all share memory
  1112. //==========================================
  1113. int InitShareMemory()
  1114. {
  1115. int result = PASS;
  1116. int MeterSMId;
  1117. //initial ShmSysConfigAndInfo
  1118. if ((MeterSMId = shmget(ShmSysConfigAndInfoKey, sizeof(struct SysConfigAndInfo), IPC_CREAT | 0777)) < 0)
  1119. {
  1120. #ifdef SystemLogMessage
  1121. printf("shmget ShmSysConfigAndInfo NG\n");
  1122. #endif
  1123. return FAIL;
  1124. }
  1125. else if ((ShmSysConfigAndInfo = shmat(MeterSMId, NULL, 0)) == (void *) -1)
  1126. {
  1127. #ifdef SystemLogMessage
  1128. printf("shmat ShmSysConfigAndInfo NG\n");
  1129. #endif
  1130. return FAIL;
  1131. }
  1132. else
  1133. {}
  1134. //initial ShmSysConfigAndInfo
  1135. /*
  1136. if ((MeterSMId = shmget(ShmATEKey, sizeof(struct ATE), IPC_CREAT | 0777)) < 0)
  1137. {
  1138. #ifdef SystemLogMessage
  1139. printf("shmget ShmATEKey NG\n");
  1140. #endif
  1141. return FAIL;
  1142. }
  1143. else if ((ate = shmat(MeterSMId, NULL, 0)) == (void *) -1)
  1144. {
  1145. #ifdef SystemLogMessage
  1146. printf("shmat ShmATEKey NG\n");
  1147. #endif
  1148. return FAIL;
  1149. }
  1150. else
  1151. {}
  1152. */
  1153. //creat ShmRelayModuleData
  1154. if ((MeterSMId = shmget(ShmRelayBdKey, sizeof(struct RelayModuleData), IPC_CREAT | 0777)) < 0)
  1155. {
  1156. #ifdef SystemLogMessage
  1157. //StoreLogMsg("shmget ShmRelayModuleData NG\n");
  1158. #endif
  1159. return 0;
  1160. }
  1161. else if ((ShmRelayModuleData = shmat(MeterSMId, NULL, 0)) == (void *) -1)
  1162. {
  1163. #ifdef SystemLogMessage
  1164. //StoreLogMsg("shmat ShmRelayModuleData NG\n");
  1165. #endif
  1166. return 0;
  1167. }
  1168. memset(ShmRelayModuleData,0,sizeof(struct RelayModuleData));
  1169. //initial ShmStatusCodeData
  1170. if ((MeterSMId = shmget(ShmStatusCodeKey, sizeof(struct StatusCodeData), IPC_CREAT | 0777)) < 0)
  1171. {
  1172. #ifdef SystemLogMessage
  1173. printf("shmget ShmStatusCodeData NG\n");
  1174. #endif
  1175. return FAIL;
  1176. }
  1177. else if ((ShmStatusCodeData = shmat(MeterSMId, NULL, 0)) == (void *) -1)
  1178. {
  1179. #ifdef SystemLogMessage
  1180. printf("shmat ShmStatusCodeData NG\n");
  1181. #endif
  1182. return FAIL;
  1183. }
  1184. else
  1185. {}
  1186. if(CHAdeMO_QUANTITY > 0)
  1187. {
  1188. if ((MeterSMId = shmget(ShmCHAdeMOCommKey, sizeof(struct CHAdeMOData), IPC_CREAT | 0777)) < 0)
  1189. {
  1190. #ifdef SystemLogMessage
  1191. printf("[shmget ShmCHAdeMOData NG \n");
  1192. #endif
  1193. return FAIL;
  1194. }
  1195. else if ((ShmCHAdeMOData = shmat(MeterSMId, NULL, 0)) == (void *) -1)
  1196. {
  1197. #ifdef SystemLogMessage
  1198. printf("shmat ShmCHAdeMOData NG \n");
  1199. #endif
  1200. return FAIL;
  1201. }
  1202. else
  1203. {}
  1204. }
  1205. if(CCS_QUANTITY > 0)
  1206. {
  1207. if ((MeterSMId = shmget(ShmCcsCommKey, sizeof(struct CcsData), IPC_CREAT | 0777)) < 0)
  1208. {
  1209. #ifdef SystemLogMessage
  1210. printf("shmget ShmCcsData NG \n");
  1211. #endif
  1212. return FAIL;
  1213. }
  1214. else if ((ShmCcsData = shmat(MeterSMId, NULL, 0)) == (void *) -1) {
  1215. #ifdef SystemLogMessage
  1216. printf("shmat ShmCcsData NG \n");
  1217. #endif
  1218. return FAIL;
  1219. }
  1220. else
  1221. {}
  1222. }
  1223. return result;
  1224. }
  1225. //================================================
  1226. // initial can-bus
  1227. //================================================
  1228. int InitCanBus()
  1229. {
  1230. int s0,nbytes;
  1231. struct timeval tv;
  1232. struct ifreq ifr0;
  1233. struct sockaddr_can addr0;
  1234. system("/sbin/ip link set can0 down");
  1235. system("/sbin/ip link set can0 type can bitrate 500000 restart-ms 100");
  1236. system("/sbin/ip link set can0 up");
  1237. s0 = socket(PF_CAN, SOCK_RAW, CAN_RAW);
  1238. tv.tv_sec = 0;
  1239. tv.tv_usec = 10000;
  1240. if (setsockopt(s0, SOL_SOCKET, SO_RCVTIMEO, (char *)&tv, sizeof(struct timeval)) < 0)
  1241. {
  1242. #ifdef SystemLogMessage
  1243. //DEBUG_ERROR("Set SO_RCVTIMEO NG");
  1244. #endif
  1245. }
  1246. nbytes=40960;
  1247. if (setsockopt(s0, SOL_SOCKET, SO_RCVBUF, &nbytes, sizeof(int)) < 0)
  1248. {
  1249. #ifdef SystemLogMessage
  1250. //DEBUG_ERROR("Set SO_RCVBUF NG");
  1251. #endif
  1252. }
  1253. nbytes=40960;
  1254. if (setsockopt(s0, SOL_SOCKET, SO_SNDBUF, &nbytes, sizeof(int)) < 0)
  1255. {
  1256. #ifdef SystemLogMessage
  1257. //DEBUG_ERROR("Set SO_SNDBUF NG");
  1258. #endif
  1259. }
  1260. strcpy(ifr0.ifr_name, "can0" );
  1261. ioctl(s0, SIOCGIFINDEX, &ifr0); /* ifr.ifr_ifindex gets filled with that device's index */
  1262. addr0.can_family = AF_CAN;
  1263. addr0.can_ifindex = ifr0.ifr_ifindex;
  1264. bind(s0, (struct sockaddr *)&addr0, sizeof(addr0));
  1265. return s0;
  1266. }
  1267. int CHROMAInitCanBus()
  1268. {
  1269. int s0,nbytes;
  1270. struct timeval tv;
  1271. struct ifreq ifr0;
  1272. struct sockaddr_can addr0;
  1273. system("/sbin/ip link set can1 down");
  1274. system("/sbin/ip link set can1 type can bitrate 500000 restart-ms 100");
  1275. system("/sbin/ip link set can1 up");
  1276. s0 = socket(PF_CAN, SOCK_RAW, CAN_RAW);
  1277. tv.tv_sec = 0;
  1278. tv.tv_usec = 10000;
  1279. if (setsockopt(s0, SOL_SOCKET, SO_RCVTIMEO, (char *)&tv, sizeof(struct timeval)) < 0)
  1280. {
  1281. #ifdef SystemLogMessage
  1282. //DEBUG_ERROR("Set SO_RCVTIMEO NG");
  1283. #endif
  1284. }
  1285. nbytes=40960;
  1286. if (setsockopt(s0, SOL_SOCKET, SO_RCVBUF, &nbytes, sizeof(int)) < 0)
  1287. {
  1288. #ifdef SystemLogMessage
  1289. //DEBUG_ERROR("Set SO_RCVBUF NG");
  1290. #endif
  1291. }
  1292. nbytes=40960;
  1293. if (setsockopt(s0, SOL_SOCKET, SO_SNDBUF, &nbytes, sizeof(int)) < 0)
  1294. {
  1295. #ifdef SystemLogMessage
  1296. //DEBUG_ERROR("Set SO_SNDBUF NG");
  1297. #endif
  1298. }
  1299. strcpy(ifr0.ifr_name, "can1" );
  1300. ioctl(s0, SIOCGIFINDEX, &ifr0); /* ifr.ifr_ifindex gets filled with that device's index */
  1301. addr0.can_family = AF_CAN;
  1302. addr0.can_ifindex = ifr0.ifr_ifindex;
  1303. bind(s0, (struct sockaddr *)&addr0, sizeof(addr0));
  1304. return s0;
  1305. }
  1306. void setChargerMode(byte gun_index, byte mode)
  1307. {
  1308. _chargingData[gun_index]->SystemStatus = mode;
  1309. }
  1310. unsigned char isModeChange(unsigned char gun_index)
  1311. {
  1312. unsigned char result = NO;
  1313. if(_chargingData[gun_index]->SystemStatus != _chargingData[gun_index]->PreviousSystemStatus)
  1314. {
  1315. result = YES;
  1316. _chargingData[gun_index]->PreviousSystemStatus = _chargingData[gun_index]->SystemStatus;
  1317. }
  1318. return result;
  1319. }
  1320. // 左右槍的 Relay 前後的輸出電壓
  1321. void GetPersentOutputVol()
  1322. {
  1323. if (Query_Present_OutputVoltage(Uart5Fd, Addr.Relay, &outputVoltage) == PASS)
  1324. {
  1325. ShmSysConfigAndInfo->ate.targetVoltage_Value = (outputVoltage.behindRelay_Voltage_C2);
  1326. /*
  1327. printf("Conn1 fuse 1 = %f \n", outputVoltage.behindFuse_Voltage_C1);
  1328. printf("Conn1 relay 1 = %f \n", outputVoltage.behindRelay_Voltage_C1);
  1329. printf("Conn2 fuse 2 = %f \n", outputVoltage.behindFuse_Voltage_C2);
  1330. printf("Conn2 relay 2 = %f \n", outputVoltage.behindRelay_Voltage_C2);
  1331. */
  1332. /*
  1333. ShmRelayModuleData->Gun1FuseOutputVolt = outputVoltage.behindFuse_Voltage_C1;
  1334. ShmRelayModuleData->Gun1RelayOutputVolt = outputVoltage.behindRelay_Voltage_C1;
  1335. ShmRelayModuleData->Gun2FuseOutputVolt = outputVoltage.behindFuse_Voltage_C2;
  1336. ShmRelayModuleData->Gun2RelayOutputVolt = outputVoltage.behindRelay_Voltage_C2;
  1337. */
  1338. /*
  1339. if (_chargingData[CCS_QUANTITY]->Evboard_id == 0x01)
  1340. {
  1341. _chargingData[CCS_QUANTITY]->FuseChargingVoltage = ShmRelayModuleData->Gun1FuseOutputVolt;
  1342. _chargingData[CCS_QUANTITY]->FireChargingVoltage = ShmRelayModuleData->Gun1RelayOutputVolt;
  1343. ShmSysConfigAndInfo->ate.targetVoltage_Value = ShmRelayModuleData->Gun1RelayOutputVolt;
  1344. }*/
  1345. /*
  1346. for (int index = 0; index < gun_count; index++)
  1347. {
  1348. if (index == 0)
  1349. {
  1350. if (_chargingData[index]->Evboard_id == 0x01)
  1351. {
  1352. _chargingData[index]->FuseChargingVoltage = ShmRelayModuleData->Gun1FuseOutputVolt;
  1353. _chargingData[index]->FireChargingVoltage = ShmRelayModuleData->Gun1RelayOutputVolt;
  1354. ShmSysConfigAndInfo->ate.targetVoltage_Value = ShmRelayModuleData->Gun1RelayOutputVolt;
  1355. }
  1356. else if (_chargingData[index]->Evboard_id == 0x02)
  1357. {
  1358. _chargingData[index]->FuseChargingVoltage = ShmRelayModuleData->Gun2FuseOutputVolt;
  1359. _chargingData[index]->FireChargingVoltage = ShmRelayModuleData->Gun2RelayOutputVolt;
  1360. }
  1361. }
  1362. else if (index == 1)
  1363. {
  1364. if (_chargingData[index]->Evboard_id == 0x01)
  1365. {
  1366. _chargingData[index]->FuseChargingVoltage = ShmRelayModuleData->Gun1FuseOutputVolt;
  1367. _chargingData[index]->FireChargingVoltage = ShmRelayModuleData->Gun1RelayOutputVolt;
  1368. ShmSysConfigAndInfo->ate.targetVoltage_Value = ShmRelayModuleData->Gun1RelayOutputVolt;
  1369. }
  1370. else if (_chargingData[index]->Evboard_id == 0x02)
  1371. {
  1372. _chargingData[index]->FuseChargingVoltage = ShmRelayModuleData->Gun2FuseOutputVolt;
  1373. _chargingData[index]->FireChargingVoltage = ShmRelayModuleData->Gun2RelayOutputVolt;
  1374. }
  1375. }
  1376. //unsigned short Ovp = 0;
  1377. //unsigned short Ocp = 0;
  1378. //Ovp = MIN [VOUT_MAX_VOLTAGE, EV_BATTERY_VOLTAGE] // 最大輸出電壓與電池電壓最大值
  1379. //Ocp = MIN [IOUT_MAX_CURRENT, EV_CURRENT_REQ] // 最大輸出電流與需求電流最小值
  1380. if (_chargingData[index]->Type == _Type_Chademo)
  1381. {
  1382. //Ovp = MaxValue(_chargingData[index]->MaximumChargingVoltage, _chargingData[index]->EvBatteryMaxVoltage);
  1383. //Ocp = MaxValue(_chargingData[index]->PresentChargingCurrent, ShmCHAdeMOData->ev[_chargingData[index]->type_index].ChargingCurrentRequest);
  1384. }
  1385. }*/
  1386. }
  1387. //sleep(1);
  1388. }
  1389. //================================================
  1390. //================================================
  1391. // CANBUS receive task
  1392. //================================================
  1393. //================================================
  1394. bool FindChargingInfoData(byte target, struct ChargingInfoData **chargingData)
  1395. {
  1396. for (byte index = 0; index < CHAdeMO_QUANTITY; index++)
  1397. {
  1398. if (ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].Index == target)
  1399. {
  1400. chargingData[target] = &ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index];
  1401. return true;
  1402. }
  1403. }
  1404. for (byte index = 0; index < CCS_QUANTITY; index++)
  1405. {
  1406. if (ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].Index == target)
  1407. {
  1408. chargingData[target] = &ShmSysConfigAndInfo->SysInfo.CcsChargingData[index];
  1409. return true;
  1410. }
  1411. }
  1412. for (byte index = 0; index < GB_QUANTITY; index++)
  1413. {
  1414. if (ShmSysConfigAndInfo->SysInfo.GbChargingData[index].Index == target)
  1415. {
  1416. chargingData[target] = &ShmSysConfigAndInfo->SysInfo.GbChargingData[index];
  1417. return true;
  1418. }
  1419. }
  1420. return false;
  1421. }
  1422. void AddrAssignment(byte *data)
  1423. {
  1424. byte target_number[8];
  1425. byte index = 0x00;
  1426. memcpy(target_number, data, sizeof(target_number));
  1427. index = *(data + 4);
  1428. if (CheckUniqNumber(index))
  1429. {
  1430. printf("EV board id = %x \n", index);
  1431. // printf("target_number[0] = %x \n", target_number[0]);
  1432. // printf("target_number[1] = %x \n", target_number[1]);
  1433. // printf("target_number[2] = %x \n", target_number[2]);
  1434. // printf("target_number[3] = %x \n", target_number[3]);
  1435. // printf("target_number[4] = %x \n", target_number[4]);
  1436. if (index < 1)
  1437. return;
  1438. printf("SetTargetAddr \n");
  1439. SetTargetAddr(target_number, index);
  1440. }
  1441. }
  1442. void ClearAbnormalStatus_CCS(byte gun_index)
  1443. {
  1444. int codeValue = 0;
  1445. if (strlen((char *)ShmSysConfigAndInfo->SysStopChargingAlarmCode.StopCode[gun_index]) == 6)
  1446. {
  1447. codeValue = atoi((char *)ShmSysConfigAndInfo->SysStopChargingAlarmCode.StopCode[gun_index]);
  1448. if (codeValue >= 13600 && codeValue <= 13600)
  1449. {
  1450. memcpy(&ShmSysConfigAndInfo->SysStopChargingAlarmCode.StopCode[gun_index][0], "", 7);
  1451. ShmSysConfigAndInfo->SysStopChargingAlarmCode.Level = 0;
  1452. }
  1453. }
  1454. ShmStatusCodeData->InfoCode.InfoEvents.bits.NormalStopChargingByUser = 0x00;
  1455. }
  1456. void ClearAbnormalStatus_Chadmoe(byte gun_index)
  1457. {
  1458. int codeValue = 0;
  1459. if (strlen((char *)ShmSysConfigAndInfo->SysStopChargingAlarmCode.StopCode[gun_index]) == 6)
  1460. {
  1461. codeValue = atoi((char *)ShmSysConfigAndInfo->SysStopChargingAlarmCode.StopCode[gun_index]);
  1462. if (codeValue >= 23700 && codeValue <= 23736)
  1463. {
  1464. memcpy(&ShmSysConfigAndInfo->SysStopChargingAlarmCode.StopCode[gun_index][0], "", 7);
  1465. ShmSysConfigAndInfo->SysStopChargingAlarmCode.Level = 0;
  1466. }
  1467. }
  1468. ShmStatusCodeData->InfoCode.InfoEvents.bits.ChademoEvCommFail = 0x00;
  1469. ShmStatusCodeData->InfoCode.InfoEvents.bits.PilotFault = 0x00;
  1470. ShmStatusCodeData->InfoCode.InfoEvents.bits.ChademoBatteryMalfun = 0x00;
  1471. ShmStatusCodeData->InfoCode.InfoEvents.bits.ChademoNoPermission = 0x00;
  1472. ShmStatusCodeData->InfoCode.InfoEvents.bits.ChademoBatteryIncompatibility = 0x00;
  1473. ShmStatusCodeData->InfoCode.InfoEvents.bits.ChademoBatteryOVP = 0x00;
  1474. ShmStatusCodeData->InfoCode.InfoEvents.bits.ChademoBatteryUVP = 0x00;
  1475. ShmStatusCodeData->InfoCode.InfoEvents.bits.ChademoBatteryOTP = 0x00;
  1476. ShmStatusCodeData->InfoCode.InfoEvents.bits.ChademoBatteryCurrentDiff = 0x00;
  1477. ShmStatusCodeData->InfoCode.InfoEvents.bits.ChademoBatteryVoltageDiff = 0x00;
  1478. ShmStatusCodeData->InfoCode.InfoEvents.bits.ChademoShiftPosition = 0x00;
  1479. ShmStatusCodeData->InfoCode.InfoEvents.bits.ChademoBatteryOtherFault = 0x00;
  1480. ShmStatusCodeData->InfoCode.InfoEvents.bits.ChademoChargingSystemError = 0x00;
  1481. ShmStatusCodeData->InfoCode.InfoEvents.bits.ChademoEvNormalStop = 0x00;
  1482. ShmStatusCodeData->InfoCode.InfoEvents.bits.ChademoTempSensorBroken = 0x00;
  1483. ShmStatusCodeData->InfoCode.InfoEvents.bits.ChademoConnectorLockFail = 0x00;
  1484. ShmStatusCodeData->InfoCode.InfoEvents.bits.ChademoD1OnNoReceive = 0x00;
  1485. ShmStatusCodeData->InfoCode.InfoEvents.bits.ChademoBmsKtoJTimeout = 0x00;
  1486. ShmStatusCodeData->InfoCode.InfoEvents.bits.ChademoBmsChargeAllowTimeout = 0x00;
  1487. ShmStatusCodeData->InfoCode.InfoEvents.bits.ChademoWaitGfdTimeout = 0x00;
  1488. ShmStatusCodeData->InfoCode.InfoEvents.bits.ChademoBmsEvRelayTimeout = 0x00;
  1489. ShmStatusCodeData->InfoCode.InfoEvents.bits.ChademoBmsReqCurrentTimeout = 0x00;
  1490. ShmStatusCodeData->InfoCode.InfoEvents.bits.ChademoBmsKtoJOffTimeout = 0x00;
  1491. ShmStatusCodeData->InfoCode.InfoEvents.bits.ChademoBmsEvRelayOffTimeout = 0x00;
  1492. ShmStatusCodeData->InfoCode.InfoEvents.bits.ChademoAdcMoreThan10V = 0x00;
  1493. ShmStatusCodeData->InfoCode.InfoEvents.bits.ChademoAdcMoreThan20V = 0x00;
  1494. ShmStatusCodeData->InfoCode.InfoEvents.bits.ChademoBmsChargeBeforeStop = 0x00;
  1495. ShmStatusCodeData->InfoCode.InfoEvents.bits.ChademoChargerGetNormalStop = 0x00;
  1496. ShmStatusCodeData->InfoCode.InfoEvents.bits.ChademoChargerGetEmergencyStop = 0x00;
  1497. ShmStatusCodeData->InfoCode.InfoEvents.bits.ChademoIsolationResultFail = 0x00;
  1498. ShmStatusCodeData->InfoCode.InfoEvents.bits.ChademoMissLinkWithMotherBoard = 0x00;
  1499. ShmStatusCodeData->InfoCode.InfoEvents.bits.ChademoOutputVolMoreThanLimit = 0x00;
  1500. ShmStatusCodeData->InfoCode.InfoEvents.bits.ChademoReqCurrentMoreThanLimit = 0x00;
  1501. ShmStatusCodeData->InfoCode.InfoEvents.bits.ChademoReCapBmsEqrCurrentExceed = 0x00;
  1502. ShmStatusCodeData->InfoCode.InfoEvents.bits.ChademoChargeRemainCountDown = 0x00;
  1503. }
  1504. void AbnormalStopAnalysis(byte gun_index, byte *errCode)
  1505. {
  1506. char string[7];
  1507. sprintf(string, "%d%d%d%d%d%d", *(errCode + 5), *(errCode + 4), *(errCode + 3), *(errCode + 2), *(errCode + 1), *(errCode + 0));
  1508. if (gun_index < gun_count)
  1509. {
  1510. if (strlen((char *)ShmSysConfigAndInfo->SysStopChargingAlarmCode.StopCode[gun_index]) <= 0)
  1511. {
  1512. memcpy(&ShmSysConfigAndInfo->SysStopChargingAlarmCode.StopCode[gun_index][0], string, 7);
  1513. ShmSysConfigAndInfo->SysStopChargingAlarmCode.Level = 0x00;
  1514. }
  1515. }
  1516. if (strcmp(string, "023700") == 0) ShmStatusCodeData->InfoCode.InfoEvents.bits.ChademoEvCommFail = 0x01;
  1517. if (strcmp(string, "023701") == 0) ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsEvCommFail = 0x01;
  1518. if (strcmp(string, "023702") == 0) ShmStatusCodeData->InfoCode.InfoEvents.bits.GbEvCommFail = 0x01;
  1519. if (strcmp(string, "023703") == 0) ShmStatusCodeData->InfoCode.InfoEvents.bits.PilotFault = 0x01;
  1520. if (strcmp(string, "023704") == 0) ShmStatusCodeData->InfoCode.InfoEvents.bits.ChademoBatteryMalfun = 0x01;
  1521. if (strcmp(string, "023705") == 0) ShmStatusCodeData->InfoCode.InfoEvents.bits.ChademoNoPermission = 0x01;
  1522. if (strcmp(string, "023706") == 0) ShmStatusCodeData->InfoCode.InfoEvents.bits.ChademoBatteryIncompatibility = 0x01;
  1523. if (strcmp(string, "023707") == 0) ShmStatusCodeData->InfoCode.InfoEvents.bits.ChademoBatteryOVP = 0x01;
  1524. if (strcmp(string, "023708") == 0) ShmStatusCodeData->InfoCode.InfoEvents.bits.ChademoBatteryUVP = 0x01;
  1525. if (strcmp(string, "023709") == 0) ShmStatusCodeData->InfoCode.InfoEvents.bits.ChademoBatteryOTP = 0x01;
  1526. if (strcmp(string, "023710") == 0) ShmStatusCodeData->InfoCode.InfoEvents.bits.ChademoBatteryCurrentDiff = 0x01;
  1527. if (strcmp(string, "023711") == 0) ShmStatusCodeData->InfoCode.InfoEvents.bits.ChademoBatteryVoltageDiff = 0x01;
  1528. if (strcmp(string, "023712") == 0) ShmStatusCodeData->InfoCode.InfoEvents.bits.ChademoShiftPosition = 0x01;
  1529. if (strcmp(string, "023713") == 0) ShmStatusCodeData->InfoCode.InfoEvents.bits.ChademoBatteryOtherFault = 0x01;
  1530. if (strcmp(string, "023714") == 0) ShmStatusCodeData->InfoCode.InfoEvents.bits.ChademoChargingSystemError = 0x01;
  1531. if (strcmp(string, "023715") == 0) ShmStatusCodeData->InfoCode.InfoEvents.bits.ChademoEvNormalStop = 0x01;
  1532. if (strcmp(string, "023716") == 0) ShmStatusCodeData->InfoCode.InfoEvents.bits.ChademoTempSensorBroken = 0x01;
  1533. if (strcmp(string, "023717") == 0) ShmStatusCodeData->InfoCode.InfoEvents.bits.ChademoConnectorLockFail = 0x01;
  1534. if (strcmp(string, "023718") == 0) ShmStatusCodeData->InfoCode.InfoEvents.bits.ChademoD1OnNoReceive = 0x01;
  1535. if (strcmp(string, "023719") == 0) ShmStatusCodeData->InfoCode.InfoEvents.bits.ChademoBmsKtoJTimeout = 0x01;
  1536. if (strcmp(string, "023720") == 0) ShmStatusCodeData->InfoCode.InfoEvents.bits.ChademoBmsChargeAllowTimeout = 0x01;
  1537. if (strcmp(string, "023721") == 0) ShmStatusCodeData->InfoCode.InfoEvents.bits.ChademoWaitGfdTimeout = 0x01;
  1538. if (strcmp(string, "023722") == 0) ShmStatusCodeData->InfoCode.InfoEvents.bits.ChademoBmsEvRelayTimeout = 0x01;
  1539. if (strcmp(string, "023723") == 0) ShmStatusCodeData->InfoCode.InfoEvents.bits.ChademoBmsReqCurrentTimeout = 0x01;
  1540. if (strcmp(string, "023724") == 0) ShmStatusCodeData->InfoCode.InfoEvents.bits.ChademoBmsKtoJOffTimeout = 0x01;
  1541. if (strcmp(string, "023725") == 0) ShmStatusCodeData->InfoCode.InfoEvents.bits.ChademoBmsEvRelayOffTimeout = 0x01;
  1542. if (strcmp(string, "023726") == 0) ShmStatusCodeData->InfoCode.InfoEvents.bits.ChademoAdcMoreThan10V = 0x01;
  1543. if (strcmp(string, "023727") == 0) ShmStatusCodeData->InfoCode.InfoEvents.bits.ChademoAdcMoreThan20V = 0x01;
  1544. if (strcmp(string, "023728") == 0) ShmStatusCodeData->InfoCode.InfoEvents.bits.ChademoBmsChargeBeforeStop = 0x01;
  1545. if (strcmp(string, "023729") == 0) ShmStatusCodeData->InfoCode.InfoEvents.bits.ChademoChargerGetNormalStop = 0x01;
  1546. if (strcmp(string, "023730") == 0) ShmStatusCodeData->InfoCode.InfoEvents.bits.ChademoChargerGetEmergencyStop = 0x01;
  1547. if (strcmp(string, "023731") == 0) ShmStatusCodeData->InfoCode.InfoEvents.bits.ChademoIsolationResultFail = 0x01;
  1548. if (strcmp(string, "023732") == 0) ShmStatusCodeData->InfoCode.InfoEvents.bits.ChademoMissLinkWithMotherBoard = 0x01;
  1549. if (strcmp(string, "023733") == 0) ShmStatusCodeData->InfoCode.InfoEvents.bits.ChademoOutputVolMoreThanLimit = 0x01;
  1550. if (strcmp(string, "023734") == 0) ShmStatusCodeData->InfoCode.InfoEvents.bits.ChademoReqCurrentMoreThanLimit = 0x01;
  1551. if (strcmp(string, "023735") == 0) ShmStatusCodeData->InfoCode.InfoEvents.bits.ChademoReCapBmsEqrCurrentExceed = 0x01;
  1552. if (strcmp(string, "023736") == 0) ShmStatusCodeData->InfoCode.InfoEvents.bits.ChademoChargeRemainCountDown = 0x01;
  1553. }
  1554. void SendCmd(int cfd, int cmd, byte *data, byte dataLen)
  1555. {
  1556. struct can_frame frame;
  1557. frame.can_id = PackageIdCmd(cmd);//(0x00001000 + cmd) | 0x80000000;//(cmd | 0x80000000);
  1558. frame.can_dlc = dataLen;
  1559. memcpy(frame.data, data, sizeof(frame.data));
  1560. write(cfd, &frame, sizeof(struct can_frame));
  1561. usleep(2000);
  1562. }
  1563. void setEVStatus1(){
  1564. byte data[1];
  1565. data[0] = 0x01;
  1566. SendCmd(CanFd2, EVStatus1, data, sizeof(data));
  1567. }
  1568. void setEVStatus2(byte evstatus){
  1569. byte data[1];
  1570. data[0] = evstatus;
  1571. SendCmd(CanFd2, EVStatus2, data, sizeof(data));
  1572. }
  1573. void CANReceiver()
  1574. {
  1575. pid_t canRecPid;
  1576. canRecPid = fork();
  1577. if(canRecPid > 0)
  1578. {
  1579. int nbytes;
  1580. struct can_frame frame;
  1581. int intCmd;
  1582. // 槍資訊
  1583. //struct ChargingInfoData *_chargingData[CHAdeMO_QUANTITY + CCS_QUANTITY + GB_QUANTITY];
  1584. //struct timeval _cmd_ack_timeout[CHAdeMO_QUANTITY + CCS_QUANTITY + GB_QUANTITY];
  1585. /*
  1586. bool isPass = false;
  1587. while(!isPass)
  1588. {
  1589. isPass = true;
  1590. for (byte _index = 0; _index < gun_count; _index++)
  1591. {
  1592. if (!FindChargingInfoData(_index, &_chargingData[0]))
  1593. {
  1594. //DEBUG_ERROR("EvComm (main) : FindChargingInfoData false \n");
  1595. isPass = false;
  1596. break;
  1597. }
  1598. }
  1599. }
  1600. for (byte _index = 0; _index < gun_count; _index++)
  1601. gettimeofday(&_cmd_ack_timeout[_index], NULL);
  1602. */
  1603. while (1)
  1604. {
  1605. memset(&frame, 0, sizeof(struct can_frame));
  1606. nbytes = read(CanFd, &frame, sizeof(struct can_frame));
  1607. /*
  1608. for (byte _index = 0; _index < gun_count; _index++)
  1609. {
  1610. if (GetTimeoutValue(_cmd_ack_timeout[_index]) >= 5000000)
  1611. {
  1612. // ACK timeout
  1613. //printf("gun = %x, ack timeout \n", _index);
  1614. }
  1615. }
  1616. */
  1617. if (nbytes > 0)
  1618. {
  1619. //byte target;
  1620. //byte targetGun = 0x00;
  1621. intCmd = (int) (frame.can_id & CAN_EFF_MASK);
  1622. #ifdef Debug
  1623. //printf("hsout0StatusChange Get-INFYPWR-Msg : %08x - %02x %02x %02x %02x %02x %02x %02x %02x\n ", intCmd, frame.data[0], frame.data[1], frame.data[2], frame.data[3],frame.data[4], frame.data[5], frame.data[6], frame.data[7] );
  1624. //printf(" Get-Msg : %08X - %02x %02x %02x %02x %02x %02x %02x %02x\n ", frame.can_id, frame.data[0], frame.data[1], frame.data[2], frame.data[3],frame.data[4], frame.data[5], frame.data[6], frame.data[7] );
  1625. #endif
  1626. if (intCmd == ADDRESS_REQ)
  1627. {
  1628. AddrAssignment(frame.data);
  1629. continue;
  1630. }
  1631. intCmd = (int) (frame.can_id & CAN_EFF_MASK & 0xFFFFFF00);
  1632. //target = ((byte) (frame.can_id & 0x000000FF)); // 0x01 or 0x02
  1633. //printf("test %d %d ==========\n", intCmd, target);
  1634. /*
  1635. for (byte _index = 0; _index < gun_count; _index++)
  1636. {
  1637. if (_chargingData[_index]->Evboard_id == target)
  1638. {
  1639. targetGun = _index;
  1640. break;
  1641. }
  1642. }
  1643. if(targetGun < 0 || targetGun >= CHAdeMO_QUANTITY + CCS_QUANTITY + GB_QUANTITY)
  1644. {
  1645. printf("EvComm (CANReceiver) : Target index = %x is < 0 or > QUANTITY \n", targetGun);
  1646. continue;
  1647. }
  1648. */
  1649. if(intCmd == 256)
  1650. {
  1651. continue;
  1652. }
  1653. //gettimeofday(&_cmd_ack_timeout[targetGun], NULL);
  1654. //printf ("intCmd = %x \n", intCmd);
  1655. switch (intCmd)
  1656. {
  1657. case EV_BOARD_STATUS_NOTIFICATION:
  1658. {
  1659. ShmSysConfigAndInfo->ate.chademo.id03.ProximitySignal = frame.data[2];
  1660. ShmSysConfigAndInfo->ate.chademo.id03.state = frame.data[3];
  1661. //printf(" EV_BOARD_STATUS_NOTIFICATION Get-Msg : %08X - %02x %02x %02x %02x %02x %02x %02x %02x\n ", frame.can_id, frame.data[0], frame.data[1], frame.data[2], frame.data[3],frame.data[4], frame.data[5], frame.data[6], frame.data[7] );
  1662. //printf("EVBoardStatusNotification Get-Msg : %08X - %02x %02x %02x %02x %02x %02x %02x %02x\n ", frame.can_id, frame.data[0], frame.data[1], frame.data[2], frame.data[3],frame.data[4], frame.data[5], frame.data[6], frame.data[7] );
  1663. //printf("ConnectorPlugIn = %x, data[0] = %x \n", _chargingData[target]->ConnectorPlugIn, frame.data[0]);
  1664. //printf("ConnectorPlugIn = %x \n", (-120 + frame.data[1]) / 10);
  1665. }
  1666. break;
  1667. case ACK_EV_FW_VERSION:
  1668. {
  1669. /*
  1670. if (_chargingData[targetGun]->Type == _Type_Chademo)
  1671. {
  1672. memcpy(ShmCHAdeMOData->evse[_chargingData[targetGun]->type_index].version, frame.data, ARRAY_SIZE(frame.data));
  1673. ShmCHAdeMOData->evse[_chargingData[targetGun]->type_index].SelfTest_Comp = PASS;
  1674. }
  1675. else if (_chargingData[targetGun]->Type == _Type_CCS)
  1676. {
  1677. if (ShmCcsData->CommProtocol == 0x01)
  1678. {
  1679. memcpy(&ShmCcsData->V2GMessage_DIN70121[_chargingData[targetGun]->type_index].version, frame.data, ARRAY_SIZE(frame.data));
  1680. ShmCcsData->V2GMessage_DIN70121[_chargingData[targetGun]->type_index].SelfTest_Comp = PASS;
  1681. }
  1682. }
  1683. */
  1684. }
  1685. break;
  1686. case ACK_EV_HW_VERSION:
  1687. {
  1688. printf("Get EV HW = %s \n", frame.data);
  1689. }
  1690. break;
  1691. case ACK__GET_EVSE_OUTPUT_STATUS:
  1692. {
  1693. //printf(" Get EVSE output status Get-Msg : %08X - %02x %02x %02x %02x %02x %02x %02x %02x\n ", frame.can_id, frame.data[0], frame.data[1], frame.data[2], frame.data[3],frame.data[4], frame.data[5], frame.data[6], frame.data[7] );
  1694. ShmSysConfigAndInfo->ate.chademo.id09_ack.DcEvState = frame.data[0];//EV模擬器
  1695. ShmSysConfigAndInfo->ate.chademo.id09_ack.ChargingMode = frame.data[1];
  1696. ShmSysConfigAndInfo->ate.chademo.id09_ack.EvsePresentOutputVoltage = ((short) frame.data[3] << 8) + (short) frame.data[2];//充電樁輸出電壓
  1697. ShmSysConfigAndInfo->ate.chademo.id09_ack.EvsePresentOutputCurrent = ((short) frame.data[5] << 8) + (short) frame.data[4];//充電樁輸出電流
  1698. ShmSysConfigAndInfo->ate.chademo.id09_ack.RemainingTimeSec = ((short) frame.data[7] << 8) + (short) frame.data[6];//剩餘時間
  1699. /*
  1700. _chargingData[targetGun]->EvBatterySoc = frame.data[1];
  1701. _chargingData[targetGun]->EvBatterytargetVoltage = ((short) frame.data[3] << 8) + (short) frame.data[2];
  1702. _chargingData[targetGun]->EvBatterytargetCurrent = ((short) frame.data[5] << 8) + (short) frame.data[4];
  1703. _chargingData[targetGun]->PresentChargedDuration = ((short) frame.data[7] << 8) + (short) frame.data[6];
  1704. if (_chargingData[targetGun]->Type == _Type_Chademo)
  1705. {
  1706. if (ShmCHAdeMOData->ev[_chargingData[targetGun]->type_index].EvDetection != frame.data[0])
  1707. {
  1708. // log
  1709. }
  1710. ShmCHAdeMOData->ev[_chargingData[targetGun]->type_index].EvDetection = frame.data[0];
  1711. ShmCHAdeMOData->ev[_chargingData[targetGun]->type_index].SOC = _chargingData[targetGun]->EvBatterySoc;
  1712. ShmCHAdeMOData->ev[_chargingData[targetGun]->type_index].TargetBatteryVoltage = _chargingData[targetGun]->EvBatterytargetVoltage;
  1713. ShmCHAdeMOData->ev[_chargingData[targetGun]->type_index].ChargingCurrentRequest = _chargingData[targetGun]->EvBatterytargetCurrent;
  1714. }
  1715. else if (_chargingData[targetGun]->Type == _Type_CCS)
  1716. {
  1717. if(ShmCcsData->CommProtocol == 0x01)
  1718. {
  1719. ShmCcsData->V2GMessage_DIN70121[_chargingData[targetGun]->type_index].PresentMsgFlowStatus = frame.data[0];
  1720. }
  1721. }
  1722. */
  1723. //printf("frame.data_2 = %x, frame.data_3 = %x \n", frame.data[2], frame.data[3]);
  1724. //printf("EvBatterytargetVoltage = %f \n", _chargingData[targetGun]->EvBatterytargetVoltage);
  1725. //printf("EvBatterytargetCurrent = %f \n", _chargingData[targetGun]->EvBatterytargetCurrent);
  1726. //printf("BatteryVoltage = %d \n", ShmCHAdeMOData->ev[_chargingData[target]->type_index].TargetBatteryVoltage);
  1727. //printf("CurrentRequest = %d \n", ShmCHAdeMOData->ev[_chargingData[target]->type_index].ChargingCurrentRequest);
  1728. }
  1729. break;
  1730. case ACK_GET_EVSE_Capacity_INFO:
  1731. {
  1732. //printf(" Get EVSE Capacity Information Get-Msg : %08X - %02x %02x %02x %02x %02x %02x %02x %02x\n ", frame.can_id, frame.data[0], frame.data[1], frame.data[2], frame.data[3],frame.data[4], frame.data[5], frame.data[6], frame.data[7] );
  1733. ShmSysConfigAndInfo->ate.chademo.id0A_ack.EvseMaxChargeVoltage = ((short) frame.data[1] << 8) + (short) frame.data[0];//樁的最大電壓
  1734. ShmSysConfigAndInfo->ate.chademo.id0A_ack.EvseMaxChargeCurrent = ((short) frame.data[3] << 8) + (short) frame.data[2];//樁的最大電流
  1735. ShmSysConfigAndInfo->ate.chademo.id0A_ack.EvseMinChargeVoltage = ((short) frame.data[5] << 8) + (short) frame.data[4];
  1736. ShmSysConfigAndInfo->ate.chademo.id0A_ack.EvseMinChargeCurrent = ((short) frame.data[7] << 8) + (short) frame.data[6];
  1737. /*
  1738. //_chargingData[target].EvACorDCcharging = frame.data[0];
  1739. //_chargingData[target]->TotalBatteryCap = ((float) frame.data[4] << 8) + (short) frame.data[3];
  1740. _chargingData[targetGun]->EvBatteryMaxVoltage = ((short) frame.data[4] << 8) + (short) frame.data[3];
  1741. //_chargingData[target]->EvBatteryMaxCurrent = ((float) frame.data[4] << 8) + (short) frame.data[3];
  1742. //_chargingData[target].MaxiBatteryCurrent = ((short) frame.data[6] << 8) + (short) frame.data[5];
  1743. if (_chargingData[targetGun]->Type == _Type_Chademo)
  1744. {
  1745. ShmCHAdeMOData->ev[_chargingData[targetGun]->type_index].TotalBatteryCapacity = ((short) frame.data[2] << 8) + (short) frame.data[1];
  1746. ShmCHAdeMOData->ev[_chargingData[targetGun]->type_index].MaxiBatteryVoltage = _chargingData[targetGun]->EvBatteryMaxVoltage;
  1747. //printf("EvBatteryMaxVoltage = %f \n", _chargingData[target]->EvBatteryMaxVoltage);
  1748. //printf("TotalBatteryCapacity = %d \n", ShmCHAdeMOData->ev[_chargingData[target]->type_index].TotalBatteryCapacity);
  1749. //printf("MaxiBatteryVoltage = %d \n", ShmCHAdeMOData->ev[_chargingData[target]->type_index].MaxiBatteryVoltage);
  1750. }
  1751. else if (_chargingData[targetGun]->Type == _Type_CCS)
  1752. {
  1753. if(ShmCcsData->CommProtocol == 0x01)
  1754. {
  1755. }
  1756. }
  1757. */
  1758. }
  1759. break;
  1760. case ACK_GET_MISCELLANEOUS_INFO:
  1761. {
  1762. ShmSysConfigAndInfo->ate.chademo.id0D_ack.K1K2OnOff = frame.data[5];
  1763. if(ShmSysConfigAndInfo->ate.chademo.relaystatus == 0){
  1764. ShmSysConfigAndInfo->ate.chademo.id0D_req.K1K2Status = ShmSysConfigAndInfo->ate.chademo.id0D_ack.K1K2OnOff;
  1765. }
  1766. //memcpy(&ShmSysConfigAndInfo->ate.chademo.id0D_ack, &frame.data, frame.can_dlc);
  1767. //printf("%d %d\n", ShmSysConfigAndInfo->ate.chademo.id0D_ack.K1K2OnOff, ShmSysConfigAndInfo->ate.chademo.id0D_ack.EvBoardState);
  1768. //printf(" Get-Msg : %08X - %02x %02x %02x %02x %02x %02x %02x %02x\n ", frame.can_id, frame.data[0], frame.data[1], frame.data[2], frame.data[3],frame.data[4], frame.data[5], frame.data[6], frame.data[7] );
  1769. /*
  1770. float pilotVol = (float)(-120 + frame.data[3]) / 10;
  1771. // if (pilotVol != _chargingData[targetGun]->PilotVoltage)
  1772. // DEBUG_INFO("PilotVoltage = %f \n", _chargingData[targetGun]->PilotVoltage);
  1773. if (_chargingData[targetGun]->Type == _Type_Chademo)
  1774. {
  1775. _chargingData[targetGun]->GunLocked = frame.data[0];
  1776. ShmCHAdeMOData->evse[_chargingData[targetGun]->type_index].ConnectorTemperatureP = frame.data[1];
  1777. ShmCHAdeMOData->evse[_chargingData[targetGun]->type_index].ConnectorTemperatureN = frame.data[2];
  1778. _chargingData[targetGun]->PilotVoltage = pilotVol;
  1779. ShmCHAdeMOData->evse[_chargingData[targetGun]->type_index].EvboardStatus = frame.data[7];
  1780. }
  1781. else if (_chargingData[targetGun]->Type == _Type_CCS)
  1782. {
  1783. if (ShmCcsData->CommProtocol == 0x01)
  1784. {
  1785. _chargingData[targetGun]->GunLocked = frame.data[0];
  1786. //ShmCcsData->V2GMessage_DIN70121[_chargingData[targetGun]->type_index]. .ConnectorTemperatureP = frame.data[1];
  1787. //ShmCcsData->V2GMessage_DIN70121[_chargingData[targetGun]->type_index]. .ConnectorTemperatureN = frame.data[2];
  1788. _chargingData[targetGun]->PilotVoltage = pilotVol;
  1789. }
  1790. }
  1791. */
  1792. //printf("ConnectorPlug locked = %x \n", frame.data[0]);
  1793. //printf("ConnectorTemp 0= %d \n", ShmCHAdeMOData->evse[_chargingData[target]->type_index].ConnectorTemperatureP);
  1794. //printf("ConnectorTemp 1= %d \n", ShmCHAdeMOData->evse[_chargingData[target]->type_index].ConnectorTemperatureN);
  1795. }
  1796. break;
  1797. case ACK_EVSE_ISOLATION_STATUS: { } break;
  1798. case ACK_EVSE_PRECHAGE_INFO:
  1799. {
  1800. //_chargingData[targetGun]->PrechargeStatus = frame.data[0];
  1801. }
  1802. break;
  1803. case NOTIFICATION_EV_STOP:
  1804. {
  1805. ShmSysConfigAndInfo->ate.chademo.id0B.EvStopReason = frame.data[0];
  1806. ShmSysConfigAndInfo->ate.chademo.id0B.AlarmCode1 = frame.data[1];
  1807. ShmSysConfigAndInfo->ate.chademo.id0B.AlarmCode2 = frame.data[2];
  1808. ShmSysConfigAndInfo->ate.chademo.id0B.AlarmCode3 = frame.data[3];
  1809. ShmSysConfigAndInfo->ate.chademo.id0B.AlarmCode4 = frame.data[4];
  1810. ShmSysConfigAndInfo->ate.chademo.id0B.AlarmCode5 = frame.data[5];
  1811. ShmSysConfigAndInfo->ate.chademo.id0B.AlarmCode6 = frame.data[6];
  1812. printf("EvStopReason = %d %d %d %d %d %d %d \n", ShmSysConfigAndInfo->ate.chademo.id0B.EvStopReason, ShmSysConfigAndInfo->ate.chademo.id0B.AlarmCode1, ShmSysConfigAndInfo->ate.chademo.id0B.AlarmCode2, ShmSysConfigAndInfo->ate.chademo.id0B.AlarmCode3, ShmSysConfigAndInfo->ate.chademo.id0B.AlarmCode4, ShmSysConfigAndInfo->ate.chademo.id0B.AlarmCode5, ShmSysConfigAndInfo->ate.chademo.id0B.AlarmCode6);
  1813. //byte normalStop = 0x01;
  1814. //byte stopReason[6] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
  1815. //byte evstaus[5] = { 0x01, 0x02, 0x03, 0x04, 0x05 };
  1816. setEVStatus2(evstaus[4]);
  1817. ShmSysConfigAndInfo->ate.Permission = STOP;
  1818. setChargerMode(CCS_QUANTITY, ShmSysConfigAndInfo->ate.Permission);
  1819. ShmSysConfigAndInfo->ate.ATEStatus = 0x00;
  1820. SetChargingPermission(CCS_QUANTITY, ShmSysConfigAndInfo->ate.Permission, ShmSysConfigAndInfo->ate.TotalBatteryCap, ShmSysConfigAndInfo->ate.MaxBatteryCurrent, ShmSysConfigAndInfo->ate.MaxBatteryVoltage, 1);
  1821. EvseStopChargingEvent(normalStop, stopReason, 1);
  1822. /*
  1823. time_t CurrentTime;
  1824. struct tm *tm;
  1825. CurrentTime = time(NULL);
  1826. tm = localtime(& CurrentTime);
  1827. printf(" Get-Msg : %08X - %02x %02x %02x %02x %02x %02x %02x %02x\n ", frame.can_id, frame.data[0], frame.data[1], frame.data[2], frame.data[3],frame.data[4], frame.data[5], frame.data[6], frame.data[7] );
  1828. printf("NOTIFICATION_EV_STOP : %04d-%02d-%02d %02d:%02d:%02d \n",
  1829. tm->tm_year+1900,tm->tm_mon+1,tm->tm_mday,tm->tm_hour,tm->tm_min,tm->tm_sec);
  1830. // 車端要求停止
  1831. // frame.data[0] : 0x01 => normal stop, 0x02 => ev emergency stop
  1832. if (frame.data[0] == 0x02)
  1833. {
  1834. //printf("NOTIFICATION_EV_STOP -----------------------------\n");
  1835. AbnormalStopAnalysis(targetGun, frame.data + 1);
  1836. }
  1837. _chargingData[targetGun]->StopChargeFlag = YES;
  1838. */
  1839. }
  1840. break;
  1841. default:
  1842. //printf("Ack none defined. intCmd = %d \n", intCmd);
  1843. break;
  1844. }
  1845. }
  1846. usleep(10000);
  1847. }
  1848. }
  1849. }
  1850. int Init407ComPort()
  1851. {
  1852. int fd;
  1853. struct termios tios;
  1854. fd = open(priPortName, O_RDWR);
  1855. if(fd<=0)
  1856. {
  1857. #ifdef SystemLogMessage
  1858. //DEBUG_ERROR("open 407 Communication port NG \n");
  1859. #endif
  1860. return -1;
  1861. }
  1862. ioctl (fd, TCGETS, &tios);
  1863. tios.c_cflag = B115200| CS8 | CLOCAL | CREAD;
  1864. tios.c_lflag = 0;
  1865. tios.c_iflag = 0;
  1866. tios.c_oflag = 0;
  1867. tios.c_cc[VMIN]=0;
  1868. tios.c_cc[VTIME]=(unsigned char)1;
  1869. tios.c_lflag=0;
  1870. tcflush(fd, TCIFLUSH);
  1871. ioctl (fd, TCSETS, &tios);
  1872. return fd;
  1873. }
  1874. //接收can
  1875. void CHROMACANReceiver()
  1876. {
  1877. pid_t canRecPid;
  1878. canRecPid = fork();
  1879. if(canRecPid > 0){
  1880. int nbytes;
  1881. struct can_frame frame;
  1882. int intCmd;
  1883. while (1){
  1884. //清空 canbus recever buf
  1885. memset(&frame, 0, sizeof(struct can_frame));
  1886. //讀取 canbus 是否有接收到封包
  1887. nbytes = read(CanFd2, &frame, sizeof(struct can_frame));
  1888. //如果有收到 canbus 封包
  1889. if (nbytes > 0){
  1890. intCmd = (int) (frame.can_id & CAN_EFF_MASK);//extended frame format
  1891. #ifdef Debug
  1892. //printf("hsout0StatusChange Get-INFYPWR-Msg : %08x - %02x %02x %02x %02x %02x %02x %02x %02x\n ", intCmd, frame.data[0], frame.data[1], frame.data[2], frame.data[3],frame.data[4], frame.data[5], frame.data[6], frame.data[7] );
  1893. //printf(" Get-Msg : %08X - %02x %02x %02x %02x %02x %02x %02x %02x\n ", frame.can_id, frame.data[0], frame.data[1], frame.data[2], frame.data[3],frame.data[4], frame.data[5], frame.data[6], frame.data[7] );
  1894. #endif
  1895. //printf("hsout0StatusChange Get-INFYPWR-Msg : %08x - %02x %02x %02x %02x %02x %02x %02x %02x\n ", frame.can_id, frame.data[0], frame.data[1], frame.data[2], frame.data[3],frame.data[4], frame.data[5], frame.data[6], frame.data[7] );
  1896. //printf("Ack none defined. intCmd = %08x \n", intCmd);
  1897. switch (intCmd){
  1898. case bn_res1:{
  1899. //printf(" Get-Msg : %08X - %02x %02x %02x %02x %02x %02x %02x %02x\n ", frame.can_id, frame.data[0], frame.data[1], frame.data[2], frame.data[3],frame.data[4], frame.data[5], frame.data[6], frame.data[7] );
  1900. break;
  1901. }
  1902. case bn_res2:{
  1903. //printf(" Get-Msg : %08X - %02x %02x %02x %02x %02x %02x %02x %02x\n ", frame.can_id, frame.data[0], frame.data[1], frame.data[2], frame.data[3],frame.data[4], frame.data[5], frame.data[6], frame.data[7] );
  1904. break;
  1905. }
  1906. case ATE_Connector2:{
  1907. ShmSysConfigAndInfo->ate.chroma.ate_Connector_2.TargetVoltage = ((short) frame.data[1] << 8) + (short) frame.data[0];//
  1908. ShmSysConfigAndInfo->ate.chroma.ate_Connector_2.TargetCurrent = ((short) frame.data[3] << 8) + (short) frame.data[2];//
  1909. ShmSysConfigAndInfo->ate.chroma.ate_Connector_2.PresentVoltage = ((short) frame.data[5] << 8) + (short) frame.data[4];
  1910. ShmSysConfigAndInfo->ate.chroma.ate_Connector_2.PresentCurrent = ((short) frame.data[7] << 8) + (short) frame.data[6];
  1911. int voltage = ShmSysConfigAndInfo->ate.chroma.ate_Connector_2.TargetVoltage * 10;
  1912. int current = ShmSysConfigAndInfo->ate.chroma.ate_Connector_2.TargetCurrent * 10;
  1913. //ShmSysConfigAndInfo->ate.RequireVoltage = ShmSysConfigAndInfo->ate.chroma.ate_Connector_2.PresentVoltage * 10;
  1914. //ShmSysConfigAndInfo->ate.RequireCurrent = ShmSysConfigAndInfo->ate.chroma.ate_Connector_2.PresentCurrent * 10;
  1915. ShmSysConfigAndInfo->ate.targetVoltage_Value = voltage;
  1916. ShmSysConfigAndInfo->ate.targetCurrent_Value = current;
  1917. ShmSysConfigAndInfo->ate.RequireVoltage = voltage;
  1918. ShmSysConfigAndInfo->ate.RequireCurrent = current;
  1919. //ShmSysConfigAndInfo->ate.MaxBatteryVoltage = voltage + (voltage * 0.1);
  1920. //ShmSysConfigAndInfo->ate.MaxBatteryVoltage = voltage + (voltage + 100);
  1921. ShmSysConfigAndInfo->ate.MaxBatteryVoltage = voltage + ( 100);
  1922. //ShmSysConfigAndInfo->ate.PresentBattVoltage = voltage;
  1923. //printf("ATE_Connector1 Get-Msg : %08X - %02x %02x %02x %02x %02x %02x %02x %02x %d %d %d %d \n ", frame.can_id, frame.data[0], frame.data[1], frame.data[2], frame.data[3],frame.data[4], frame.data[5], frame.data[6], frame.data[7], ShmSysConfigAndInfo->ate.chroma.ate_Connector_2.TargetVoltage, ShmSysConfigAndInfo->ate.chroma.ate_Connector_2.TargetCurrent, ShmSysConfigAndInfo->ate.chroma.ate_Connector_2.PresentVoltage, ShmSysConfigAndInfo->ate.chroma.ate_Connector_2.PresentCurrent );
  1924. break;
  1925. }
  1926. case ATE_Connector1:{//MaxBatteryVoltage
  1927. /*
  1928. ShmSysConfigAndInfo->ate.chroma.ate_Connector_1.TargetVoltage = ((short) frame.data[1] << 8) + (short) frame.data[0];//
  1929. ShmSysConfigAndInfo->ate.chroma.ate_Connector_1.TargetCurrent = ((short) frame.data[3] << 8) + (short) frame.data[2];//
  1930. ShmSysConfigAndInfo->ate.chroma.ate_Connector_1.PresentVoltage = ((short) frame.data[5] << 8) + (short) frame.data[4];
  1931. ShmSysConfigAndInfo->ate.chroma.ate_Connector_1.PresentCurrent = ((short) frame.data[7] << 8) + (short) frame.data[6];
  1932. //ShmSysConfigAndInfo->ate.RequireVoltage = ShmSysConfigAndInfo->ate.chroma.ate_Connector_1.PresentVoltage * 10;
  1933. //ShmSysConfigAndInfo->ate.RequireCurrent = ShmSysConfigAndInfo->ate.chroma.ate_Connector_1.PresentCurrent * 10;
  1934. int voltage = ShmSysConfigAndInfo->ate.chroma.ate_Connector_1.TargetVoltage * 10;
  1935. int current = ShmSysConfigAndInfo->ate.chroma.ate_Connector_1.TargetCurrent * 10;
  1936. //ShmSysConfigAndInfo->ate.MaxBatteryVoltage = voltage + (voltage * 0.1);
  1937. //ShmSysConfigAndInfo->ate.MaxBatteryVoltage = voltage + (voltage + 100);
  1938. ShmSysConfigAndInfo->ate.MaxBatteryVoltage = voltage + ( 100);
  1939. ShmSysConfigAndInfo->ate.targetVoltage_Value = voltage;
  1940. ShmSysConfigAndInfo->ate.targetCurrent_Value = current;
  1941. ShmSysConfigAndInfo->ate.RequireVoltage = voltage;
  1942. ShmSysConfigAndInfo->ate.RequireCurrent = current;
  1943. */
  1944. //ShmSysConfigAndInfo->ate.PresentBattVoltage = voltage + (voltage * 0.1);
  1945. //printf("ATE_Connector2 Get-Msg : %08X - %02x %02x %02x %02x %02x %02x %02x %02x %d %d %d %d \n ", frame.can_id, frame.data[0], frame.data[1], frame.data[2], frame.data[3],frame.data[4], frame.data[5], frame.data[6], frame.data[7], ShmSysConfigAndInfo->ate.chroma.ate_Connector_1.TargetVoltage, ShmSysConfigAndInfo->ate.chroma.ate_Connector_1.TargetCurrent, ShmSysConfigAndInfo->ate.chroma.ate_Connector_1.PresentVoltage, ShmSysConfigAndInfo->ate.chroma.ate_Connector_1.PresentCurrent );
  1946. break;
  1947. }
  1948. default:
  1949. break;
  1950. }
  1951. }
  1952. usleep(2000);
  1953. //usleep(100000);
  1954. }
  1955. }
  1956. }
  1957. //================================================
  1958. // Main process
  1959. //================================================
  1960. // 檢查 Byte 中某個 Bit 的值
  1961. // _byte : 欲改變的 byte
  1962. // _bit : 該 byte 的第幾個 bit
  1963. unsigned char EvDetectionStatus(unsigned char _byte, unsigned char _bit)
  1964. {
  1965. return ( _byte & mask_table[_bit] ) != 0x00;
  1966. }
  1967. bool IsConnectorPlugIn(struct ChargingInfoData *chargingData)
  1968. {
  1969. return (chargingData->ConnectorPlugIn == 0x01) ? true : false;
  1970. }
  1971. void SetBitValue(unsigned char *_byte, unsigned char _bit, unsigned char value)
  1972. {
  1973. if(value == 1)
  1974. *_byte |= (1 << _bit);
  1975. else if (value == 0)
  1976. *_byte ^= (1 << _bit);
  1977. }
  1978. unsigned char DetectBitValue(unsigned char _byte, unsigned char _bit)
  1979. {
  1980. return ( _byte & mask_table[_bit] ) != 0x00;
  1981. }
  1982. void SetPresentChargingOutputPower(struct ChargingInfoData *chargingData_1, struct ChargingInfoData *chargingData_2)
  1983. {
  1984. /*
  1985. float vol1 = 0, cur1 = 0;
  1986. float vol2 = 0, cur2 = 0;
  1987. vol1 = chargingData_1->FireChargingVoltage;
  1988. cur1 = chargingData_1->PresentChargingCurrent;
  1989. vol2 = chargingData_2->FireChargingVoltage;
  1990. cur2 = chargingData_2->PresentChargingCurrent;
  1991. SetPresentInputPower(vol1, cur1, vol2, cur2);
  1992. */
  1993. }
  1994. void SetPresentChargingOutputCap(struct ChargingInfoData *chargingData_1, struct ChargingInfoData *chargingData_2)
  1995. {
  1996. /*
  1997. float pow1 = 0, cur1 = 0;
  1998. float pow2 = 0, cur2 = 0;
  1999. float vol = 0;
  2000. pow1 = chargingData_1->AvailableChargingPower;
  2001. cur1 = chargingData_1->AvailableChargingCurrent;
  2002. vol = chargingData_1->MaximumChargingVoltage;
  2003. GetMaxVolAndCurMethod(chargingData_1->Index, &vol, &cur1);
  2004. pow2 = chargingData_2->AvailableChargingPower;
  2005. cur2 = chargingData_2->AvailableChargingCurrent;
  2006. vol = chargingData_2->MaximumChargingVoltage;
  2007. GetMaxVolAndCurMethod(chargingData_2->Index, &vol, &cur2);
  2008. //printf("voltage 1 ========================================%f \n", vol);
  2009. //printf("current 1 ========================================%f \n", cur1);
  2010. SetPresentInputRequirement(pow1, cur1, pow2, cur2);
  2011. */
  2012. }
  2013. void setMisc(byte toId){
  2014. float K1K2Status = 0;
  2015. float soc = 0;
  2016. K1K2Status = ShmSysConfigAndInfo->ate.chademo.id0D_req.K1K2Status;
  2017. soc = ShmSysConfigAndInfo->ate.chademo.id0D_req.Soc;
  2018. GetMiscellaneousInfo(0, toId, K1K2Status, soc);
  2019. }
  2020. void SetOutputGpio(byte flash)
  2021. {
  2022. Gpio_out gpio;
  2023. gpio.Button_LED[0] = 0x00;
  2024. gpio.Button_LED[1] = 0x00;
  2025. gpio.System_LED[0] = 0x00;
  2026. gpio.System_LED[1] = 0x00;
  2027. gpio.System_LED[2] = 0x00;
  2028. gpio.System_LED[3] = flash;
  2029. gpio.AC_Connector = 0x00;
  2030. gpio.AC_Breaker = 0x00;
  2031. if (Config_Gpio_Output(Uart1Fd, Addr.IoExtend, &gpio) == PASS)
  2032. {
  2033. //PRINTF_FUNC("SetOutputGpio sucessfully. %d \n", flash);
  2034. }
  2035. else
  2036. {
  2037. //PRINTF_FUNC("SetOutputGpio fail. \n");
  2038. }
  2039. }
  2040. void Initialization()
  2041. {/*
  2042. bool isPass = false;
  2043. while(!isPass)
  2044. {
  2045. isPass = true;
  2046. for (byte _index = 0; _index < gun_count; _index++)
  2047. {
  2048. if (!FindChargingInfoData(_index, &_chargingData[0]))
  2049. {
  2050. //DEBUG_ERROR("EvComm (main) : FindChargingInfoData false \n");
  2051. isPass = false;
  2052. break;
  2053. }
  2054. }
  2055. }
  2056. */
  2057. char *moduleName = "DMYZ30100J01P0";
  2058. memcpy(&ShmSysConfigAndInfo->SysConfig.ModelName, moduleName, strlen(moduleName));
  2059. //printf("%s \n", ShmSysConfigAndInfo->SysConfig.ModelName);
  2060. ShmSysConfigAndInfo->SysInfo.ChademoChargingData[CCS_QUANTITY].Index = CCS_QUANTITY;
  2061. ShmSysConfigAndInfo->SysInfo.ChademoChargingData[CCS_QUANTITY].slotsIndex = 1;
  2062. _chargingData[CCS_QUANTITY] = &ShmSysConfigAndInfo->SysInfo.ChademoChargingData[CCS_QUANTITY];
  2063. _chargingData[CCS_QUANTITY]->SystemStatus = V_IDLE;
  2064. _chargingData[CCS_QUANTITY]->Type = _Type_CCS;
  2065. _chargingData[CCS_QUANTITY]->type_index = CCS_QUANTITY;
  2066. _chargingData[CCS_QUANTITY]->Evboard_id = 0x01;
  2067. ShmSysConfigAndInfo->ate.ATEStatus = 0;
  2068. // 現階段預設為走 DIN70121
  2069. ShmCcsData->CommProtocol = 0x01;
  2070. }
  2071. void GetMaxVolAndCurMethod(byte index, float *vol, float *cur)
  2072. {
  2073. if (maxChargingVol != 0 && maxChargingVol <= *vol)
  2074. *vol = maxChargingVol;
  2075. if (maxChargingCur != 0 && maxChargingCur <= *cur)
  2076. *cur = maxChargingCur;
  2077. }
  2078. void GetStopChargingReasonByEvse(byte gunIndex, byte *reason)
  2079. {
  2080. if (ShmStatusCodeData->AlarmCode.AlarmEvents.bits.EmergencyStopTrip == 0x01)
  2081. {
  2082. // 012251
  2083. *(reason + 5) = 0;
  2084. *(reason + 4) = 1;
  2085. *(reason + 3) = 2;
  2086. *(reason + 2) = 2;
  2087. *(reason + 1) = 5;
  2088. *(reason + 0) = 1;
  2089. }
  2090. else if (_chargingData[gunIndex]->Type == _Type_Chademo &&
  2091. ShmStatusCodeData->FaultCode.FaultEvents.bits.ChademoOutputRelayDrivingFault == 0x01)
  2092. {
  2093. // 011012
  2094. *(reason + 5) = 0;
  2095. *(reason + 4) = 1;
  2096. *(reason + 3) = 1;
  2097. *(reason + 2) = 0;
  2098. *(reason + 1) = 1;
  2099. *(reason + 0) = 2;
  2100. }
  2101. else if (_chargingData[gunIndex]->Type == _Type_CCS &&
  2102. ShmStatusCodeData->FaultCode.FaultEvents.bits.CcsOutputRelayDrivingFault == 0x01)
  2103. {
  2104. // 011014
  2105. *(reason + 5) = 0;
  2106. *(reason + 4) = 1;
  2107. *(reason + 3) = 1;
  2108. *(reason + 2) = 0;
  2109. *(reason + 1) = 1;
  2110. *(reason + 0) = 4;
  2111. }
  2112. else if (ShmStatusCodeData->InfoCode.InfoEvents.bits.NormalStopChargingByUser == 0x01)
  2113. {
  2114. // 013600
  2115. *(reason + 5) = 0;
  2116. *(reason + 4) = 1;
  2117. *(reason + 3) = 3;
  2118. *(reason + 2) = 6;
  2119. *(reason + 1) = 0;
  2120. *(reason + 0) = 0;
  2121. }
  2122. }
  2123. void InitRS485DirectionIO(void)
  2124. {
  2125. //LCD_AC_BIAS_EN => GPIO2_25*//*RS-485 for module DE control
  2126. gpio_set_direction(PIN_AM_DE_1, GPIO_DIR_OUTPUT);
  2127. gpio_write(PIN_AM_DE_1, 1);
  2128. //system("echo 89 > /sys/class/gpio/export");
  2129. //system("echo \"out\" > /sys/class/gpio/gpio89/direction");
  2130. //system("echo 1 > /sys/class/gpio/gpio89/value");
  2131. //LCD_HSYNC => GPIO2_23*//*RS-485 for module RE control
  2132. gpio_set_direction(PIN_AM_RE_1, GPIO_DIR_OUTPUT);
  2133. gpio_write(PIN_AM_RE_1, 0);
  2134. //system("echo 87 > /sys/class/gpio/export");
  2135. //system("echo \"out\" > /sys/class/gpio/gpio87/direction");
  2136. //system("echo 0 > /sys/class/gpio/gpio87/value");
  2137. }
  2138. int InitComPort()
  2139. {
  2140. int fd;
  2141. struct termios tios;
  2142. fd = open(relayRs485PortName, O_RDWR);
  2143. if(fd <= 0)
  2144. {
  2145. #ifdef SystemLogMessage
  2146. //DEBUG_ERROR("Module_InternalComm. InitComPort NG\n");
  2147. #endif
  2148. if(ShmStatusCodeData!=NULL)
  2149. {
  2150. ShmStatusCodeData->AlarmCode.AlarmEvents.bits.CsuInitFailed=1;
  2151. }
  2152. sleep(5);
  2153. return -1;
  2154. }
  2155. ioctl(fd, TCGETS, &tios);
  2156. tios.c_cflag = B115200 | CS8 | CLOCAL | CREAD;
  2157. tios.c_lflag = 0;
  2158. tios.c_iflag = 0;
  2159. tios.c_oflag = 0;
  2160. tios.c_cc[VMIN] = 0;
  2161. tios.c_cc[VTIME]=(byte)0; // timeout 0.5 second
  2162. //tios.c_cc[VTIME] = (unsigned char) 5;
  2163. tios.c_lflag=0;
  2164. tcflush(fd, TCIFLUSH);
  2165. ioctl(fd, TCSETS, &tios);
  2166. return fd;
  2167. }
  2168. unsigned char Config_Gpio_Output(unsigned char fd, unsigned char targetAddr, Gpio_out *Set_Buf)
  2169. {
  2170. unsigned char result = FAIL;
  2171. unsigned char tx[9] = {0xaa, 0x00, targetAddr, Cmd.config_Gpio_Output, 0x01, 0x00, 0x00, 0x00};
  2172. unsigned char rx[512];
  2173. unsigned char chksum = 0x00;
  2174. for (int idx = 0; idx < 2; idx++)
  2175. tx[6] |= (Set_Buf->Button_LED[idx] ? 0x01:0x00) << (0+idx);
  2176. for (int idx = 0; idx < 4; idx++)
  2177. tx[6] |= (Set_Buf->System_LED[idx] ? 0x01:0x00) << (2+idx);
  2178. tx[6] |= (Set_Buf->AC_Connector ? 0x01:0x00) << 6;
  2179. tx[6] |= (Set_Buf->AC_Breaker ? 0x01:0x00) << 7;
  2180. for (int idx = 0; idx < (tx[4] | tx[5] << 8); idx++)
  2181. chksum ^= tx[6+idx];
  2182. tx[7] = chksum;
  2183. if (tranceive(fd, tx, sizeof(tx), rx) > 0)
  2184. {
  2185. chksum = 0x00;
  2186. for(int idx=0;idx<(rx[4] | rx[5]<<8);idx++)
  2187. {
  2188. chksum ^= rx[6+idx];
  2189. }
  2190. if((chksum == rx[6+(rx[4] | rx[5]<<8)]) &&
  2191. (rx[2] == tx[1]) &&
  2192. (rx[1] == tx[2]) &&
  2193. (rx[3] == tx[3]) &&
  2194. (rx[6] == tx[6]))
  2195. {
  2196. result = PASS;
  2197. }
  2198. }
  2199. return result;
  2200. }
  2201. // relay 的狀態
  2202. void CheckRelayOutput(byte index)
  2203. {
  2204. if (index == 0)
  2205. {
  2206. //printf("=====%d\n",chargingInfo[index]->Evboard_id);
  2207. if (_chargingData[index]->Evboard_id == 0x02)
  2208. {
  2209. if (regRelay.relay_event.bits.Gun1_N == YES && regRelay.relay_event.bits.Gun1_P == YES)
  2210. _chargingData[0]->RelayK1K2Status = YES;
  2211. else
  2212. _chargingData[0]->RelayK1K2Status = NO;
  2213. if (regRelay.relay_event.bits.Gun1_N == YES && regRelay.relay_event.bits.CCS_Precharge == YES)
  2214. _chargingData[0]->RelayKPK2Status = YES;
  2215. else
  2216. _chargingData[0]->RelayKPK2Status = NO;
  2217. }
  2218. else if (_chargingData[index]->Evboard_id == 0x01)
  2219. {
  2220. if (regRelay.relay_event.bits.Gun2_N == YES && regRelay.relay_event.bits.Gun2_P == YES)
  2221. _chargingData[0]->RelayK1K2Status = YES;
  2222. else
  2223. _chargingData[0]->RelayK1K2Status = NO;
  2224. if (regRelay.relay_event.bits.Gun2_N == YES && regRelay.relay_event.bits.CCS_Precharge == YES)
  2225. _chargingData[0]->RelayKPK2Status = YES;
  2226. else
  2227. _chargingData[0]->RelayKPK2Status = NO;
  2228. }
  2229. }
  2230. else if (index == 1)
  2231. {
  2232. //printf("Evboard_id = %x \n", _chargingData[index]->Evboard_id);
  2233. if (regRelay.relay_event.bits.Gun1_Parallel_N == YES && regRelay.relay_event.bits.Gun1_Parallel_P == YES)
  2234. _chargingData[1]->RelayK1K2Status = YES;
  2235. else
  2236. _chargingData[1]->RelayK1K2Status = NO;
  2237. if (regRelay.relay_event.bits.Gun1_N == YES && regRelay.relay_event.bits.Gun1_P == YES)
  2238. _chargingData[1]->RelayK1K2Status = YES;
  2239. else
  2240. _chargingData[1]->RelayK1K2Status = NO;
  2241. if (regRelay.relay_event.bits.Gun2_N == YES && regRelay.relay_event.bits.CCS_Precharge == YES)
  2242. _chargingData[1]->RelayKPK2Status = YES;
  2243. else
  2244. _chargingData[1]->RelayKPK2Status = NO;
  2245. }
  2246. }
  2247. void SetEvContactorRelayStatus(byte index)
  2248. {
  2249. // 為安全起見~ 切換該槍 relay 的條件一是 relay 前後電壓須都要小於 10V
  2250. // 除了做完 CCS 端的 Precharge,因為在做完 Precharge後,車端會直接直接準備拉載,輸出並不會降低
  2251. // 另一個是 Complete 狀態,因為火線上的電壓有可能是來自車端電池電壓,導致火線上的電壓並不會降下來
  2252. // 於此同時,只要判斷火線上的電流低於 1A 來判斷 Relay 可鬆開
  2253. /*
  2254. if (chargingInfo[index]->SystemStatus != V_ISOLATION &&
  2255. chargingInfo[index]->SystemStatus != S_COMPLETE )
  2256. {
  2257. if (index == 0 && (ShmRelayModuleData->Gun1FuseOutputVolt > 600 || ShmRelayModuleData->Gun1RelayOutputVolt > 600))
  2258. {
  2259. return;
  2260. }
  2261. }
  2262. */
  2263. //printf("====%d %d %d\n",ShmSysConfigAndInfo->ate.chademo.id0D_req.K1K2Status, _chargingData[index]->Evboard_id, outputRelay.relay_event.bits.Gun1_Parallel_P);
  2264. if(ShmSysConfigAndInfo->ate.chademo.id0D_req.K1K2Status == 1){
  2265. if(_chargingData[index]->Evboard_id == 0x01)
  2266. {
  2267. // 先搭 D-
  2268. /**/
  2269. if (outputRelay.relay_event.bits.Gun1_N == 0x00)
  2270. outputRelay.relay_event.bits.Gun1_N = 0x01;
  2271. else
  2272. outputRelay.relay_event.bits.Gun1_P = 0x01;
  2273. /*
  2274. if (outputRelay.relay_event.bits.Gun2_N == 0x00)
  2275. outputRelay.relay_event.bits.Gun2_N = 0x01;
  2276. else
  2277. outputRelay.relay_event.bits.Gun2_P = 0x01;*/
  2278. /**/
  2279. if(ShmSysConfigAndInfo->ate.cstatus != 0){
  2280. if (outputRelay.relay_event.bits.Gun1_Parallel_N == 0x00)
  2281. outputRelay.relay_event.bits.Gun1_Parallel_N = 0x01;
  2282. else
  2283. outputRelay.relay_event.bits.Gun1_Parallel_P = 0x01;
  2284. }
  2285. flash = YES;
  2286. SetOutputGpio(flash);
  2287. }
  2288. }else{
  2289. if (_chargingData[index]->Evboard_id == 0x01)
  2290. {
  2291. // 先釋放 D+
  2292. /**/
  2293. if (outputRelay.relay_event.bits.Gun1_P == 0x01)
  2294. outputRelay.relay_event.bits.Gun1_P = 0x00;
  2295. else
  2296. outputRelay.relay_event.bits.Gun1_N = 0x00;
  2297. /*
  2298. if (outputRelay.relay_event.bits.Gun2_P == 0x01)
  2299. outputRelay.relay_event.bits.Gun2_P = 0x00;
  2300. else
  2301. outputRelay.relay_event.bits.Gun2_N = 0x00;
  2302. */
  2303. /**/
  2304. if(ShmSysConfigAndInfo->ate.cstatus != 0){
  2305. if (outputRelay.relay_event.bits.Gun1_Parallel_P == 0x01)
  2306. outputRelay.relay_event.bits.Gun1_Parallel_P = 0x00;
  2307. else
  2308. outputRelay.relay_event.bits.Gun1_Parallel_N = 0x00;
  2309. }
  2310. flash = NO;
  2311. SetOutputGpio(flash);
  2312. }
  2313. }
  2314. }
  2315. bool IsNoneMatchRelayStatus()
  2316. {
  2317. bool result = false;
  2318. if ((regRelay.relay_event.bits.AC_Contactor != outputRelay.relay_event.bits.AC_Contactor) ||
  2319. (regRelay.relay_event.bits.CCS_Precharge != outputRelay.relay_event.bits.CCS_Precharge) ||
  2320. (regRelay.relay_event.bits.Gun1_P != outputRelay.relay_event.bits.Gun1_P) ||
  2321. (regRelay.relay_event.bits.Gun1_N != outputRelay.relay_event.bits.Gun1_N) ||
  2322. (regRelay.relay_event.bits.Gun2_P != outputRelay.relay_event.bits.Gun2_P) ||
  2323. (regRelay.relay_event.bits.Gun2_N != outputRelay.relay_event.bits.Gun2_N)||
  2324. (regRelay.relay_event.bits.Gun1_Parallel_P != outputRelay.relay_event.bits.Gun1_Parallel_P) ||
  2325. (regRelay.relay_event.bits.Gun1_Parallel_N != outputRelay.relay_event.bits.Gun1_Parallel_N))
  2326. {
  2327. result = true;
  2328. }
  2329. return result;
  2330. }
  2331. void MatchRelayStatus()
  2332. {
  2333. // 因為 AC Contactor 沒有 Feedback,所以暫時先這樣處理
  2334. //regRelay.relay_event.bits.AC_Contactor = outputRelay.relay_event.bits.AC_Contactor;
  2335. ShmSysConfigAndInfo->SysInfo.AcContactorStatus = regRelay.relay_event.bits.AC_Contactor = outputRelay.relay_event.bits.AC_Contactor;
  2336. regRelay.relay_event.bits.CCS_Precharge = outputRelay.relay_event.bits.CCS_Precharge;
  2337. regRelay.relay_event.bits.Gun1_P = outputRelay.relay_event.bits.Gun1_P;
  2338. regRelay.relay_event.bits.Gun1_N = outputRelay.relay_event.bits.Gun1_N;
  2339. regRelay.relay_event.bits.Gun2_P = outputRelay.relay_event.bits.Gun2_P;
  2340. regRelay.relay_event.bits.Gun2_N = outputRelay.relay_event.bits.Gun2_N;
  2341. regRelay.relay_event.bits.Gun1_Parallel_N = outputRelay.relay_event.bits.Gun1_Parallel_N;
  2342. regRelay.relay_event.bits.Gun1_Parallel_P = outputRelay.relay_event.bits.Gun1_Parallel_P;
  2343. }
  2344. void setBootNotification1(){
  2345. byte data[8];
  2346. data[0] = 0x02;
  2347. data[1] = 0x02;
  2348. data[2] = 0x02;
  2349. data[3] = 0x02;
  2350. data[4] = 0x03;
  2351. data[5] = 0x03;
  2352. data[6] = 0x03;
  2353. data[7] = 0x03;
  2354. SendCmd(CanFd2, bn1, data, sizeof(data));
  2355. }
  2356. void setBootNotification2(){
  2357. byte data[8];
  2358. data[0] = 0x04;
  2359. data[1] = 0x04;
  2360. data[2] = 0x04;
  2361. data[3] = 0x04;
  2362. data[4] = 0x05;
  2363. data[5] = 0x05;
  2364. data[6] = 0x05;
  2365. data[7] = 0x05;
  2366. SendCmd(CanFd2, bn2, data, sizeof(data));
  2367. }
  2368. void handleEmulatorFaultStatus(){
  2369. setEVStatus2(evstaus[4]);
  2370. ShmSysConfigAndInfo->ate.Permission = STOP;
  2371. setChargerMode(CCS_QUANTITY, ShmSysConfigAndInfo->ate.Permission);
  2372. ShmSysConfigAndInfo->ate.ATEStatus = 0x00;
  2373. EvseStopChargingEvent(normalStop, stopReason, 1);
  2374. SetChargingPermission(CCS_QUANTITY, ShmSysConfigAndInfo->ate.Permission, ShmSysConfigAndInfo->ate.TotalBatteryCap,
  2375. ShmSysConfigAndInfo->ate.MaxBatteryCurrent, ShmSysConfigAndInfo->ate.MaxBatteryVoltage, 1);
  2376. }
  2377. void CreateTimeoutFork()
  2378. {
  2379. pid_t timeoutPid;
  2380. timeoutPid = fork();
  2381. if (timeoutPid > 0)
  2382. {
  2383. while(true)
  2384. {
  2385. }
  2386. }
  2387. }
  2388. //===============================================
  2389. // 確認 GPIO 狀態
  2390. //===============================================
  2391. int gpio_get_value(unsigned int gpio, unsigned int *value)
  2392. {
  2393. int fd;
  2394. char buf[MAX_BUF];
  2395. char ch;
  2396. snprintf(buf, sizeof(buf), SYSFS_GPIO_DIR "/gpio%d/value", gpio);
  2397. fd = open(buf, O_RDONLY);
  2398. if (fd < 0){
  2399. perror("gpio/get-value");
  2400. return fd;
  2401. }
  2402. read(fd, &ch, 1);
  2403. if (ch != '0') {
  2404. *value = 1;
  2405. } else {
  2406. *value = 0;
  2407. }
  2408. close(fd);
  2409. return 0;
  2410. }
  2411. bool CheckConnectorTypeStatus()
  2412. {
  2413. bool result = true;
  2414. printf("bd0_1_status = %d, bd0_2_status = %d, bd1_1_status = %d, bd1_2_status = %d \n",
  2415. bd0_1_status, bd0_2_status, bd1_1_status, bd1_2_status);
  2416. return result;
  2417. }
  2418. void CheckGunTypeFromHw()
  2419. {
  2420. int pinIn[4] = { 22, 23, 44, 45 };
  2421. unsigned int gpioValue = 0;
  2422. for (int i = 0; i < ARRAY_SIZE(pinIn); i++)
  2423. {
  2424. gpio_get_value(pinIn[i], &gpioValue);
  2425. switch (pinIn[i])
  2426. {
  2427. case 22:
  2428. bd1_1_status = gpioValue;
  2429. break;
  2430. case 23:
  2431. bd1_2_status = gpioValue;
  2432. break;
  2433. case 44:
  2434. bd0_1_status = gpioValue;
  2435. break;
  2436. case 45:
  2437. bd0_2_status = gpioValue;
  2438. break;
  2439. }
  2440. }
  2441. }
  2442. int main(int argc, char *argv[])
  2443. {
  2444. if(InitShareMemory() == FAIL)
  2445. {
  2446. #ifdef SystemLogMessage
  2447. //StoreLogMsg("InitShareMemory NG\n");
  2448. #endif
  2449. if(ShmStatusCodeData != NULL)
  2450. {
  2451. ShmStatusCodeData->AlarmCode.AlarmEvents.bits.FailToCreateShareMemory=1;
  2452. }
  2453. sleep(5);
  2454. return 0;
  2455. }
  2456. Initialization();
  2457. CanFd = InitCanBus();
  2458. ShmSysConfigAndInfo->ate.chademo.relaystatus = 0;
  2459. CanFd2 = CHROMAInitCanBus();
  2460. CANReceiver();
  2461. CHROMACANReceiver();
  2462. printf ("chademo 1=====. \n");
  2463. Uart1Fd = Init407ComPort();
  2464. //printf("407 Port id = %d \n", Uart1Fd);
  2465. flash = YES;
  2466. SetOutputGpio(flash);
  2467. //InitRS485DirectionIO();
  2468. // Open Uart5 for RB
  2469. InitRS485DirectionIO();
  2470. Uart5Fd = InitComPort();
  2471. printf ("2=====. \n");
  2472. //printf("%d \n", Uart5Fd);
  2473. for (byte index = 0; index < ARRAY_SIZE(outputRelay.relay_event.relay_status); index++)
  2474. {
  2475. outputRelay.relay_event.relay_status[index] = 0x00;
  2476. }
  2477. memset(&regRelay, 0xFF,sizeof(Relay));
  2478. outputRelay.relay_event.bits.AC_Contactor = 0x00;
  2479. outputRelay.relay_event.bits.CCS_Precharge = 0x00;
  2480. outputRelay.relay_event.bits.Gun1_P = 0x00;
  2481. outputRelay.relay_event.bits.Gun1_N = 0x00;
  2482. outputRelay.relay_event.bits.Gun2_P = 0x00;
  2483. outputRelay.relay_event.bits.Gun2_N = 0x00;
  2484. outputRelay.relay_event.bits.Gun1_Parallel_N = 0x00;
  2485. outputRelay.relay_event.bits.Gun1_Parallel_P = 0x00;
  2486. //Gun1_Parallel_P
  2487. Config_Relay_Output(Uart5Fd, Addr.Relay, &outputRelay);
  2488. sleep(1);
  2489. if(Uart5Fd < 0){
  2490. printf ("open port error. \n");
  2491. return 0;
  2492. }
  2493. printf ("3=====. \n");
  2494. //int id = PackageIdCmd(Ev_Cmd.get_miscellaneous_info);
  2495. //printf("==========%d\n",id);
  2496. //SetEvseStatusNotification();
  2497. //ShmSysConfigAndInfo->ate.chademo.id06.MaximumBatteryVoltage=1000;
  2498. //printf("==========\n");
  2499. //printf("==========%d\n", ShmSysConfigAndInfo->ate.chademo.id06.MaximumBatteryVoltage );
  2500. ShmSysConfigAndInfo->ate.chademo.id0D_req.K1K2Status=0x00;
  2501. ShmSysConfigAndInfo->ate.chademo.id0D_req.Soc = 50;
  2502. //byte priorityLow = 1;
  2503. /*
  2504. byte normalStop = 0x01;
  2505. byte stopReason[6] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
  2506. byte evstaus[5] = { 0x01, 0x02, 0x03, 0x04, 0x05 };
  2507. */
  2508. /*
  2509. Emulator Status
  2510. Idle: 0x01
  2511. Preparing: 0x02
  2512. Charging: 0x03
  2513. Charging terminating: 0x04
  2514. Fault: 0x05
  2515. * */
  2516. //PresentInputRequirement
  2517. //ShmSysConfigAndInfo->ate.PresentBattVoltage = 3700;
  2518. ShmSysConfigAndInfo->ate.PresentBattVoltage = 4700;
  2519. ShmSysConfigAndInfo->ate.MinimumChargeCurrent = 20;
  2520. ShmSysConfigAndInfo->ate.RequireVoltage = 3800;
  2521. //ShmSysConfigAndInfo->ate.RequireVoltage = 4700;
  2522. ShmSysConfigAndInfo->ate.RequireCurrent = 600;
  2523. ShmSysConfigAndInfo->ate.targetVoltage_Value = 4800;
  2524. ShmSysConfigAndInfo->ate.targetCurrent_Value = 30;
  2525. //ShmSysConfigAndInfo->ate.targetCurrent_Value = 1200;
  2526. ShmSysConfigAndInfo->ate.Permission = STOP;
  2527. ShmSysConfigAndInfo->ate.TotalBatteryCap = 1000; //0.1
  2528. ShmSysConfigAndInfo->ate.MaxBatteryCurrent = 1200; //0.1
  2529. ShmSysConfigAndInfo->ate.MaxBatteryVoltage = 5000; //0.1
  2530. ShmSysConfigAndInfo->ate.status = 0;
  2531. ShmSysConfigAndInfo->ate.chademo.id03.state = 0;
  2532. ShmSysConfigAndInfo->ate.ATEStatus = 0x00;
  2533. ShmSysConfigAndInfo->ate.cstatus = 0;
  2534. ShmSysConfigAndInfo->ate.chademo.PresentChargedDuration = 0;
  2535. ShmSysConfigAndInfo->ate.chademo.RemainChargingDuration = 0;
  2536. //ShmSysConfigAndInfo->ate.chademo.id0B.EvStopReason = 0;
  2537. //RequireVoltage 380
  2538. //targetVoltage_Value 380
  2539. //PresentBattVoltage
  2540. //PresentInputPower
  2541. /*
  2542. outputRelay.relay_event.bits.Gun1_N = 0x01;
  2543. outputRelay.relay_event.bits.Gun1_P = 0x01;*/
  2544. /*
  2545. outputRelay.relay_event.bits.Gun2_N = 0x01;
  2546. outputRelay.relay_event.bits.Gun2_P = 0x01;*/
  2547. //outputRelay.relay_event.bits.Gun1_Parallel_N = 0x01;
  2548. //outputRelay.relay_event.bits.Gun1_Parallel_P = 0x01;
  2549. //Gun1_Parallel_P
  2550. //Config_Relay_Output(Uart5Fd, Addr.Relay, &outputRelay);
  2551. /*
  2552. for(byte _index = 0; _index < gun_count; _index++)
  2553. {
  2554. _chargingData[_index]->Evboard_id = 0x01;
  2555. }
  2556. */
  2557. //EvseStopChargingEvent(normalStop, stopReason, 1);
  2558. //SetChargingPermission(CCS_QUANTITY, 0, 1000, 1200, 6000, 1);
  2559. setChargerMode(CCS_QUANTITY, STOP);
  2560. /*
  2561. outputRelay.relay_event.bits.Gun1_N = 0x01;
  2562. outputRelay.relay_event.bits.Gun1_P = 0x01;
  2563. outputRelay.relay_event.bits.Gun1_Parallel_N = 0x01;
  2564. outputRelay.relay_event.bits.Gun1_Parallel_P = 0x01;
  2565. Config_Relay_Output(Uart5Fd, Addr.Relay, &outputRelay);
  2566. sleep(1);
  2567. // flash = NO;
  2568. // SetOutputGpio(flash);
  2569. CheckGunTypeFromHw();
  2570. CheckConnectorTypeStatus();
  2571. //ShmSysConfigAndInfo->ate.chademo.id0D_req.K1K2Status = 1;
  2572. SetEvContactorRelayStatus(CCS_QUANTITY);
  2573. //Config_Relay_Output(Uart5Fd, Addr.Relay, &outputRelay);
  2574. *
  2575. MatchRelayStatus();
  2576. printf("reg relay, AC = %x, g1_p = %x, g1_n = %x, g2_p = %x, g2_n = %x, pn = %x, pp = %x \n",
  2577. regRelay.relay_event.bits.AC_Contactor,
  2578. regRelay.relay_event.bits.Gun1_P,
  2579. regRelay.relay_event.bits.Gun1_N,
  2580. regRelay.relay_event.bits.Gun2_P,
  2581. regRelay.relay_event.bits.Gun2_N,
  2582. regRelay.relay_event.bits.Gun1_Parallel_N,
  2583. regRelay.relay_event.bits.Gun1_Parallel_P);
  2584. return 0;
  2585. */
  2586. while(CanFd)
  2587. {
  2588. //printf("%d \n", _chargingData[_index]->Evboard_id);
  2589. setBootNotification2();
  2590. /**/
  2591. if(ShmSysConfigAndInfo->ate.status == 0){
  2592. int status = isModeChange(CCS_QUANTITY);
  2593. // 輸出電壓
  2594. //GetPersentOutputVol();
  2595. /*480+48/2*/
  2596. // Relay
  2597. CheckRelayOutput(CCS_QUANTITY);
  2598. //依據當前各槍的狀態選擇 搭上/放開 Relay
  2599. SetEvContactorRelayStatus(CCS_QUANTITY);
  2600. // 搭上/鬆開 Relay
  2601. // 放開 Relay 之前要先確認輸出的電壓電流是否已經降到某個值
  2602. if(IsNoneMatchRelayStatus())
  2603. {
  2604. if (Config_Relay_Output(Uart5Fd, Addr.Relay, &outputRelay))
  2605. {
  2606. //printf("Match Relay............................ \n");
  2607. MatchRelayStatus();
  2608. printf("reg relay, AC = %x, g1_p = %x, g1_n = %x, g2_p = %x, g2_n = %x, pn = %x, pp = %x \n",
  2609. regRelay.relay_event.bits.AC_Contactor,
  2610. regRelay.relay_event.bits.Gun1_P,
  2611. regRelay.relay_event.bits.Gun1_N,
  2612. regRelay.relay_event.bits.Gun2_P,
  2613. regRelay.relay_event.bits.Gun2_N,
  2614. regRelay.relay_event.bits.Gun1_Parallel_N,
  2615. regRelay.relay_event.bits.Gun1_Parallel_P);
  2616. //
  2617. //ftime(&startChargingTime[CCS_QUANTITY]);
  2618. }
  2619. }
  2620. /*
  2621. printf("relaystatus = 0 %d %d %d targetVoltage_Value= %d targetCurrent_Value= %d RequireVoltage = %d RequireVoltage= %d RequireCurrent= %d MaxBatteryVoltage = %d\n",
  2622. ShmSysConfigAndInfo->ate.chademo.id03.state,ShmSysConfigAndInfo->ate.chademo.id0D_req.K1K2Status,
  2623. ShmSysConfigAndInfo->ate.chademo.PresentChargedDuration, ShmSysConfigAndInfo->ate.targetVoltage_Value ,
  2624. ShmSysConfigAndInfo->ate.targetCurrent_Value, ShmSysConfigAndInfo->ate.RequireVoltage, ShmSysConfigAndInfo->ate.RequireVoltage,
  2625. ShmSysConfigAndInfo->ate.RequireCurrent, ShmSysConfigAndInfo->ate.MaxBatteryVoltage);
  2626. struct timeb tp;
  2627. ftime(&tp);
  2628. printf("===== %ld /n", tp.time);
  2629. ftime(&endChargingTime[CCS_QUANTITY]);
  2630. ShmSysConfigAndInfo->ate.chademo.PresentChargedDuration = DiffTimeb(startChargingTime[CCS_QUANTITY], endChargingTime[CCS_QUANTITY]);
  2631. */
  2632. /*
  2633. if(ShmSysConfigAndInfo->ate.chademo.id0B.EvStopReason != 0){
  2634. setEVStatus2(evstaus[4]);
  2635. ShmSysConfigAndInfo->ate.Permission = STOP;
  2636. setChargerMode(CCS_QUANTITY, ShmSysConfigAndInfo->ate.Permission);
  2637. ShmSysConfigAndInfo->ate.ATEStatus = 0x00;
  2638. EvseStopChargingEvent(normalStop, stopReason, 1);
  2639. }
  2640. */
  2641. //int status = isModeChange(CCS_QUANTITY);
  2642. //switch(_chargingData[CCS_QUANTITY]->SystemStatus)
  2643. usleep(1000);
  2644. setMisc(1);
  2645. if(ShmSysConfigAndInfo->ate.ATEStatus == 1){
  2646. ShmSysConfigAndInfo->ate.Permission = START;
  2647. setChargerMode(CCS_QUANTITY, ShmSysConfigAndInfo->ate.Permission);
  2648. //printf("ATEStatus == 1 %d \n",ShmSysConfigAndInfo->ate.ATEStatus);
  2649. }else if(ShmSysConfigAndInfo->ate.ATEStatus == 2){
  2650. ShmSysConfigAndInfo->ate.Permission = STOP;
  2651. setChargerMode(CCS_QUANTITY, ShmSysConfigAndInfo->ate.Permission);
  2652. //printf("ATEStatus == 2 %d \n",ShmSysConfigAndInfo->ate.ATEStatus);
  2653. ShmSysConfigAndInfo->ate.ATEStatus = 0;
  2654. }else if(ShmSysConfigAndInfo->ate.ATEStatus == 3){
  2655. setEVStatus2(evstaus[4]);
  2656. ShmSysConfigAndInfo->ate.Permission = STOP;
  2657. setChargerMode(CCS_QUANTITY, ShmSysConfigAndInfo->ate.Permission);
  2658. ShmSysConfigAndInfo->ate.ATEStatus = 0x00;
  2659. SetChargingPermission(CCS_QUANTITY, ShmSysConfigAndInfo->ate.Permission, ShmSysConfigAndInfo->ate.TotalBatteryCap, ShmSysConfigAndInfo->ate.MaxBatteryCurrent, ShmSysConfigAndInfo->ate.MaxBatteryVoltage, 1);
  2660. EvseStopChargingEvent(normalStop, stopReason, 1);
  2661. }else{
  2662. }
  2663. if(ShmSysConfigAndInfo->ate.chademo.id03.state == 0 || ShmSysConfigAndInfo->ate.Permission == 0){
  2664. //SetChargingPermission(CCS_QUANTITY, START, 1000, 1200, 6000, 1);
  2665. //setChargerMode(CCS_QUANTITY, ShmSysConfigAndInfo->ate.Permission);
  2666. ShmSysConfigAndInfo->ate.Permission = START;
  2667. setChargerMode(CCS_QUANTITY, ShmSysConfigAndInfo->ate.Permission);
  2668. SetChargingPermission(CCS_QUANTITY, ShmSysConfigAndInfo->ate.Permission, ShmSysConfigAndInfo->ate.TotalBatteryCap, ShmSysConfigAndInfo->ate.MaxBatteryCurrent, ShmSysConfigAndInfo->ate.MaxBatteryVoltage, 1);
  2669. }else if(ShmSysConfigAndInfo->ate.chademo.id03.state ==1){
  2670. ShmSysConfigAndInfo->ate.Permission = STOP;
  2671. }else if(ShmSysConfigAndInfo->ate.chademo.id03.state ==2){
  2672. ShmSysConfigAndInfo->ate.Permission = STOP;
  2673. }else if(ShmSysConfigAndInfo->ate.chademo.id03.state ==3){
  2674. ShmSysConfigAndInfo->ate.Permission = STOP;
  2675. }else if(ShmSysConfigAndInfo->ate.chademo.id03.state ==4){
  2676. ShmSysConfigAndInfo->ate.Permission = STOP;
  2677. }else if(ShmSysConfigAndInfo->ate.chademo.id03.state == 5){
  2678. ShmSysConfigAndInfo->ate.Permission = STOP;
  2679. setEVStatus2(evstaus[1]);
  2680. }else if(ShmSysConfigAndInfo->ate.chademo.id03.state == 6){
  2681. ShmSysConfigAndInfo->ate.Permission = STOP;
  2682. setEVStatus2(evstaus[1]);
  2683. }else if(ShmSysConfigAndInfo->ate.chademo.id03.state == 7){
  2684. ShmSysConfigAndInfo->ate.Permission = STOP;
  2685. setEVStatus2(evstaus[2]);
  2686. //setEVStatus2(evstaus[2]);
  2687. }else if(ShmSysConfigAndInfo->ate.chademo.id03.state == 8){
  2688. ShmSysConfigAndInfo->ate.Permission = STOP;
  2689. setEVStatus2(evstaus[2]);
  2690. //setEVStatus2(evstaus[2]);
  2691. }//else if(ShmSysConfigAndInfo->ate.chademo.id03.state == 16 ){
  2692. else if(ShmSysConfigAndInfo->ate.chademo.id03.state >= 13 ){
  2693. handleEmulatorFaultStatus();
  2694. }else if(ShmSysConfigAndInfo->ate.chademo.id03.state == 14 ){
  2695. handleEmulatorFaultStatus();
  2696. }else if(ShmSysConfigAndInfo->ate.chademo.id03.state == 9 || ShmSysConfigAndInfo->ate.chademo.id03.state == 10
  2697. || ShmSysConfigAndInfo->ate.chademo.id03.state == 11 || ShmSysConfigAndInfo->ate.chademo.id03.state == 12
  2698. //|| ShmSysConfigAndInfo->ate.chademo.id03.state == 13
  2699. //|| ShmSysConfigAndInfo->ate.chademo.id03.state == 15
  2700. ){
  2701. ShmSysConfigAndInfo->ate.Permission = STOP;
  2702. //setEVStatus2(evstaus[3]);
  2703. setEVStatus2(evstaus[3]);
  2704. }else{
  2705. setEVStatus2(evstaus[0]);
  2706. //printf("4 %d %d\n",ShmSysConfigAndInfo->ate.chademo.id03.state,ShmSysConfigAndInfo->ate.chademo.id0D_req.K1K2Status);
  2707. }
  2708. if(ShmSysConfigAndInfo->ate.chademo.id03.ProximitySignal == 0){
  2709. //printf("1 %d ===== \n", ShmSysConfigAndInfo->ate.chademo.id03.ProximitySignal);
  2710. setEVStatus2(evstaus[3]);
  2711. }else if(ShmSysConfigAndInfo->ate.chademo.id03.ProximitySignal == 1 && ShmSysConfigAndInfo->ate.chademo.id03.state != 7 &&
  2712. ShmSysConfigAndInfo->ate.chademo.id03.state != 9 && ShmSysConfigAndInfo->ate.chademo.id03.state != 10
  2713. && ShmSysConfigAndInfo->ate.chademo.id03.state != 11 && ShmSysConfigAndInfo->ate.chademo.id03.state != 12
  2714. && ShmSysConfigAndInfo->ate.chademo.id03.state != 13
  2715. && ShmSysConfigAndInfo->ate.chademo.id03.state != 15){
  2716. //printf("2 %d ===== \n", ShmSysConfigAndInfo->ate.chademo.id03.ProximitySignal);
  2717. setEVStatus2(evstaus[1]);
  2718. }
  2719. if(status){
  2720. //printf("status change1 %d ===== \n", status);
  2721. SetChargingPermission(CCS_QUANTITY, ShmSysConfigAndInfo->ate.Permission, ShmSysConfigAndInfo->ate.TotalBatteryCap, ShmSysConfigAndInfo->ate.MaxBatteryCurrent, ShmSysConfigAndInfo->ate.MaxBatteryVoltage, 1);
  2722. }else{
  2723. if(ShmSysConfigAndInfo->ate.Permission == STOP ){
  2724. if(ShmSysConfigAndInfo->ate.chademo.id03.state == 0){
  2725. //printf("status change0 %d ===== \n", status);
  2726. //SetChargingPermission(CCS_QUANTITY, ShmSysConfigAndInfo->ate.Permission, ShmSysConfigAndInfo->ate.TotalBatteryCap, ShmSysConfigAndInfo->ate.MaxBatteryCurrent, ShmSysConfigAndInfo->ate.MaxBatteryVoltage, 1);
  2727. SetChargingPermission(CCS_QUANTITY, ShmSysConfigAndInfo->ate.Permission, ShmSysConfigAndInfo->ate.TotalBatteryCap, ShmSysConfigAndInfo->ate.MaxBatteryCurrent, ShmSysConfigAndInfo->ate.MaxBatteryVoltage, 1);
  2728. }
  2729. }
  2730. }
  2731. //SetChargingPermission(CCS_QUANTITY, ShmSysConfigAndInfo->ate.Permission, ShmSysConfigAndInfo->ate.TotalBatteryCap, ShmSysConfigAndInfo->ate.MaxBatteryCurrent, ShmSysConfigAndInfo->ate.MaxBatteryVoltage, 1);
  2732. //SetChargingPermission(CCS_QUANTITY, START, 1000, 1200, 6000, 1);
  2733. usleep(1000);
  2734. //給火線電壓
  2735. SetPresentInputPower(ShmSysConfigAndInfo->ate.targetVoltage_Value, ShmSysConfigAndInfo->ate.targetCurrent_Value, 1);
  2736. usleep(1000);
  2737. //SetPresentInputRequirement(4800, 6000, 1920, 20);
  2738. SetPresentInputRequirement(ShmSysConfigAndInfo->ate.RequireVoltage, ShmSysConfigAndInfo->ate.RequireCurrent, ShmSysConfigAndInfo->ate.PresentBattVoltage, ShmSysConfigAndInfo->ate.MinimumChargeCurrent, 1);
  2739. //usleep(5000);
  2740. }else{
  2741. }
  2742. //500000 whileLoopTime
  2743. //usleep(50000);500000
  2744. usleep(whileLoopTime);
  2745. /*
  2746. for(byte _index = 0; _index < gun_count; _index++)
  2747. {
  2748. //printf("Permission : %d, TotalBatteryCapacity : %d, MaximumBatteryCurrent : %d, MaximumBatteryVoltage : %d, targetVoltage_Value : %d, targetCurrent_Value : %d, RequireVoltage : %d, RequireCurrent : %d, PresentBattVoltage : %d, MinimumChargeCurrent : %d, soc : %d \n", ShmSysConfigAndInfo->ate.Permission, ShmSysConfigAndInfo->ate.TotalBatteryCap, ShmSysConfigAndInfo->ate.MaxBatteryCurrent, ShmSysConfigAndInfo->ate.MaxBatteryVoltage, ShmSysConfigAndInfo->ate.targetVoltage_Value, ShmSysConfigAndInfo->ate.targetCurrent_Value, ShmSysConfigAndInfo->ate.RequireVoltage, ShmSysConfigAndInfo->ate.RequireCurrent, ShmSysConfigAndInfo->ate.PresentBattVoltage, ShmSysConfigAndInfo->ate.MinimumChargeCurrent, ShmSysConfigAndInfo->ate.chademo.id0D_req.Soc);
  2749. //printf("EV_BOARD_STATUS_NOTIFICATION %d, %d \n", ShmSysConfigAndInfo->ate.chademo.id03.ProximitySignal, ShmSysConfigAndInfo->ate.chademo.id03.state);
  2750. //printf("ACK__GET_EVSE_OUTPUT_STATUS %d, %d,%d, %d, %d \n", ShmSysConfigAndInfo->ate.chademo.id09_ack.DcEvState, ShmSysConfigAndInfo->ate.chademo.id09_ack.ChargingMode, ShmSysConfigAndInfo->ate.chademo.id09_ack.EvsePresentOutputVoltage, ShmSysConfigAndInfo->ate.chademo.id09_ack.EvsePresentOutputCurrent, ShmSysConfigAndInfo->ate.chademo.id09_ack.RemainingTimeSec);
  2751. //printf("ACK_GET_EVSE_Capacity_INFO %d, %d,%d, %d \n", ShmSysConfigAndInfo->ate.chademo.id0A_ack.EvseMaxChargeVoltage, ShmSysConfigAndInfo->ate.chademo.id0A_ack.EvseMaxChargeCurrent, ShmSysConfigAndInfo->ate.chademo.id0A_ack.EvseMinChargeVoltage, ShmSysConfigAndInfo->ate.chademo.id0A_ack.EvseMinChargeCurrent);
  2752. //printf("K1K2OnOff %d\n",ShmSysConfigAndInfo->ate.chademo.id0D_ack.K1K2OnOff);
  2753. //setChargerMode(_index, mode)
  2754. switch (_chargingData[_index]->SystemStatus)
  2755. {
  2756. case S_IDLE:{
  2757. break;
  2758. }
  2759. case S_PREPARING_FOR_EV:
  2760. {
  2761. break;
  2762. }
  2763. case S_PREPARING_FOR_EVSE:
  2764. case S_CCS_PRECHARGE_ST0:
  2765. case S_CCS_PRECHARGE_ST1:
  2766. {
  2767. break;
  2768. }
  2769. case S_CHARGING:
  2770. {
  2771. break;
  2772. }
  2773. case S_TERMINATING:
  2774. {
  2775. break;
  2776. }
  2777. case S_COMPLETE:
  2778. {
  2779. break;
  2780. }
  2781. }
  2782. //usleep(50000); //EV 小板通訊 (50 ms)
  2783. }*/
  2784. /*
  2785. switch(_chargingData[CCS_QUANTITY]->SystemStatus)
  2786. {
  2787. case AS_ZERO:{//初始階段
  2788. if (status){
  2789. printf("Processing 0....................\n");
  2790. //ShmSysConfigAndInfo->ate.Permission = START;
  2791. //setChargerMode(CCS_QUANTITY, ShmSysConfigAndInfo->ate.Permission);
  2792. //SetChargingPermission(CCS_QUANTITY, ShmSysConfigAndInfo->ate.Permission, ShmSysConfigAndInfo->ate.TotalBatteryCap, ShmSysConfigAndInfo->ate.MaxBatteryCurrent, ShmSysConfigAndInfo->ate.MaxBatteryVoltage, 1);
  2793. }
  2794. break;
  2795. }
  2796. case AS_ONE:{//ONE
  2797. if (status){
  2798. printf("Processing 1....................\n");
  2799. //ShmSysConfigAndInfo->ate.Permission = STOP;
  2800. }
  2801. break;
  2802. }
  2803. case AS_TWO:{
  2804. if (status){
  2805. printf("Processing 2....................\n");
  2806. //ShmSysConfigAndInfo->ate.Permission = STOP;
  2807. }
  2808. break;
  2809. }
  2810. case AS_THREE:{
  2811. if (status){
  2812. printf("Processing 3....................\n");
  2813. //ShmSysConfigAndInfo->ate.Permission = STOP;
  2814. }
  2815. break;
  2816. }
  2817. case AS_FOUR:{
  2818. if (status){
  2819. printf("Processing 4....................\n");
  2820. //ShmSysConfigAndInfo->ate.Permission = STOP;
  2821. }
  2822. break;
  2823. }
  2824. case AS_FIVE:{
  2825. if (status){
  2826. printf("Processing 5....................\n");
  2827. //ShmSysConfigAndInfo->ate.Permission = STOP;
  2828. }
  2829. //setEVStatus2(evstaus[1]);
  2830. break;
  2831. }
  2832. case AS_SIX:{
  2833. if (status){
  2834. printf("Processing 6....................\n");
  2835. //ShmSysConfigAndInfo->ate.Permission = STOP;
  2836. }
  2837. //setEVStatus2(evstaus[1]);
  2838. break;
  2839. }
  2840. case AS_SEVEN:{
  2841. if (status){
  2842. printf("Processing 7....................\n");
  2843. //ShmSysConfigAndInfo->ate.Permission = STOP;
  2844. }
  2845. //setEVStatus2(evstaus[2]);
  2846. break;
  2847. }
  2848. case AS_EIGHT:{
  2849. if (status){
  2850. printf("Processing 8....................\n");
  2851. //ShmSysConfigAndInfo->ate.Permission = STOP;
  2852. }
  2853. //setEVStatus2(evstaus[2]);
  2854. break;
  2855. }
  2856. case AS_NINE:{
  2857. if (status){
  2858. printf("Processing 9....................\n");
  2859. //ShmSysConfigAndInfo->ate.Permission = STOP;
  2860. //setEVStatus2(evstaus[3]);
  2861. }
  2862. break;
  2863. }
  2864. case AS_TEN:{
  2865. if (status){
  2866. printf("Processing 10....................\n");
  2867. //ShmSysConfigAndInfo->ate.Permission = STOP;
  2868. //setEVStatus2(evstaus[3]);
  2869. }
  2870. break;
  2871. }
  2872. case AS_ELEVEN:{
  2873. if (status){
  2874. printf("Processing 11....................\n");
  2875. //ShmSysConfigAndInfo->ate.Permission = STOP;
  2876. //setEVStatus2(evstaus[3]);
  2877. }
  2878. break;
  2879. }
  2880. case AS_TWELVE:{
  2881. if (status){
  2882. printf("Processing 12....................\n");
  2883. //ShmSysConfigAndInfo->ate.Permission = STOP;
  2884. //setEVStatus2(evstaus[3]);
  2885. }
  2886. break;
  2887. }
  2888. case AS_THIRTEEN:{
  2889. if (status){
  2890. printf("Processing 13....................\n");
  2891. //handleEmulatorFaultStatus();
  2892. }
  2893. break;
  2894. }
  2895. case AS_FOURTEEN:{
  2896. if (status){
  2897. printf("Processing 14....................\n");
  2898. //handleEmulatorFaultStatus();
  2899. //ShmSysConfigAndInfo->ate.Permission = STOP;
  2900. }
  2901. break;
  2902. }
  2903. case AS_FIFTEEN:{
  2904. if (status){
  2905. printf("Processing 15....................\n");
  2906. //handleEmulatorFaultStatus();
  2907. }
  2908. break;
  2909. }
  2910. case AS_SIXTEEN:{
  2911. if (status){
  2912. printf("Processing 16....................\n");
  2913. //handleEmulatorFaultStatus();
  2914. }
  2915. break;
  2916. }
  2917. case AS_SEVENTEEN:{
  2918. if (status){
  2919. printf("Processing 17....................\n");
  2920. //handleEmulatorFaultStatus();
  2921. }
  2922. break;
  2923. }
  2924. case AS_EIGHTEEN:{
  2925. if (status){
  2926. printf("Processing 18....................\n");
  2927. //handleEmulatorFaultStatus();
  2928. }
  2929. break;
  2930. }
  2931. default:{
  2932. break;
  2933. }
  2934. }*/
  2935. }
  2936. /*
  2937. byte priorityLow = 1;
  2938. #if (!DEMO)
  2939. while(CanFd)
  2940. {
  2941. for(byte _index = 0; _index < gun_count; _index++)
  2942. {
  2943. if (priorityLow == 1)
  2944. {
  2945. // 優先權較低 - 只要有回應即不會再詢問
  2946. if (_chargingData[_index]->Type == _Type_Chademo &&
  2947. ShmCHAdeMOData->evse[_chargingData[_index]->type_index].SelfTest_Comp != PASS)
  2948. {
  2949. GetFirmwareVersion(_index, _chargingData[_index]->Evboard_id);
  2950. GetHardwareVersion(_index, _chargingData[_index]->Evboard_id);
  2951. }
  2952. else if (_chargingData[_index]->Type == _Type_CCS)
  2953. {
  2954. if (ShmCcsData->CommProtocol == 0x01 &&
  2955. ShmCcsData->V2GMessage_DIN70121[_chargingData[_index]->type_index].SelfTest_Comp != PASS)
  2956. {
  2957. GetFirmwareVersion(_index, _chargingData[_index]->Evboard_id);
  2958. GetHardwareVersion(_index, _chargingData[_index]->Evboard_id);
  2959. }
  2960. }
  2961. // 固定要取得的資訊 : 1.槍鎖狀態, 2."Connector 1" 溫度, 3."Connector 2" 溫度, 4.Pilot Voltage
  2962. GetMiscellaneousInfo(_index, _chargingData[_index]->Evboard_id, 1);
  2963. }
  2964. switch (_chargingData[_index]->SystemStatus)
  2965. {
  2966. case S_IDLE:
  2967. _chargingData[_index]->PresentChargedEnergy = 0;
  2968. _chargingData[_index]->GroundFaultStatus = GFD_WAIT;
  2969. _chargingData[_index]->StopChargeFlag = NO;
  2970. _chargingData[_index]->PrechargeStatus = NO;
  2971. chargingTime[_index] = 0;
  2972. if (_chargingData[_index]->Type == _Type_Chademo)
  2973. {
  2974. ClearAbnormalStatus_Chadmoe(_index);
  2975. }
  2976. else if (_chargingData[_index]->Type == _Type_CCS)
  2977. {
  2978. ClearAbnormalStatus_CCS(_index);
  2979. }
  2980. break;
  2981. case S_PREPARING_FOR_EV:
  2982. {
  2983. if (_chargingData[_index]->Type == _Type_Chademo)
  2984. {
  2985. // 開始確認車端是否同意開始充電 : 1.SOC, 2.Target Vol, 3.Target Cur, 4.Charging remaining time
  2986. GetOutputReq(_index, _chargingData[_index]->Evboard_id);
  2987. //printf("PresentChargingVoltage = %f \n", _chargingData[_index]->PresentChargingVoltage);
  2988. //printf("PresentChargingCurrent = %f \n", _chargingData[_index]->PresentChargingCurrent);
  2989. //printf("AvailableChargingPower = %f \n", _chargingData[_index]->AvailableChargingPower);
  2990. //printf("AvailableChargingCurrent = %f \n", _chargingData[_index]->AvailableChargingCurrent);
  2991. //printf("MaximumChargingVoltage = %f \n", _chargingData[_index]->MaximumChargingVoltage);
  2992. // 設定當前輸出
  2993. if (gun_count == 1)
  2994. SetPresentChargingOutputPower(_chargingData[0], _chargingData[0]);
  2995. else if (gun_count == 2)
  2996. SetPresentChargingOutputPower(_chargingData[0], _chargingData[1]);
  2997. if (priorityLow == 1)
  2998. {
  2999. float maxVol = _chargingData[_index]->MaximumChargingVoltage;
  3000. float maxCur = _chargingData[_index]->AvailableChargingCurrent;
  3001. GetMaxVolAndCurMethod(_index, &maxVol, &maxCur);
  3002. // 樁端輸出能力
  3003. SetChargingPermission(_index, START,
  3004. _chargingData[_index]->AvailableChargingPower,
  3005. maxCur,
  3006. maxVol,
  3007. _chargingData[_index]->Evboard_id);
  3008. // 取得車端電池資訊 : 1.AC or DC ? 2.Total battery cap, 3.Max battery vol, 4.Max battery cur
  3009. GetEvBatteryInfo(_index, _chargingData[_index]->Evboard_id);
  3010. }
  3011. }
  3012. else if (_chargingData[_index]->Type == _Type_CCS)
  3013. {
  3014. // 開始確認車端是否同意開始充電 : 1.SOC, 2.Target Vol, 3.Target Cur, 4.Charging remaining time
  3015. GetOutputReq(_index, _chargingData[_index]->Evboard_id);
  3016. // 設定當前輸出
  3017. if (gun_count == 1)
  3018. SetPresentChargingOutputPower(_chargingData[0], _chargingData[0]);
  3019. else if (gun_count == 2)
  3020. SetPresentChargingOutputPower(_chargingData[0], _chargingData[1]);
  3021. if (priorityLow == 1)
  3022. {
  3023. float maxVol = _chargingData[_index]->MaximumChargingVoltage;
  3024. float maxCur = _chargingData[_index]->AvailableChargingCurrent;
  3025. GetMaxVolAndCurMethod(_index, &maxVol, &maxCur);
  3026. // 樁端輸出能力
  3027. SetChargingPermission(_index, START,
  3028. _chargingData[_index]->AvailableChargingPower,
  3029. maxCur,
  3030. maxVol,
  3031. _chargingData[_index]->Evboard_id);
  3032. // 取得車端電池資訊 : 1.AC or DC ? 2.Total battery cap, 3.Max battery vol, 4.Max battery cur
  3033. GetEvBatteryInfo(_index, _chargingData[_index]->Evboard_id);
  3034. }
  3035. }
  3036. }
  3037. break;
  3038. case S_PREPARING_FOR_EVSE:
  3039. case S_CCS_PRECHARGE_ST0:
  3040. case S_CCS_PRECHARGE_ST1:
  3041. {
  3042. // 開始確認車端是否同意開始充電
  3043. GetOutputReq(_index, _chargingData[_index]->Evboard_id);
  3044. // printf("PresentChargingVoltage = %f \n", _chargingData[_index]->PresentChargingVoltage);
  3045. // printf("PresentChargingCurrent = %f \n", _chargingData[_index]->PresentChargingCurrent);
  3046. // printf("AvailableChargingPower = %f \n", _chargingData[_index]->AvailableChargingPower);
  3047. // printf("AvailableChargingCurrent = %f \n", _chargingData[_index]->AvailableChargingCurrent);
  3048. // printf("MaximumChargingVoltage = %f \n", _chargingData[_index]->MaximumChargingVoltage);
  3049. // 設定當前輸出
  3050. if (gun_count == 1)
  3051. SetPresentChargingOutputPower(_chargingData[0], _chargingData[0]);
  3052. else if (gun_count == 2)
  3053. SetPresentChargingOutputPower(_chargingData[0], _chargingData[1]);
  3054. if (priorityLow % 5 == 1)
  3055. {
  3056. // 樁端輸出能力改變
  3057. if (gun_count == 1)
  3058. SetPresentChargingOutputCap(_chargingData[0], _chargingData[0]);
  3059. else if (gun_count == 2)
  3060. SetPresentChargingOutputCap(_chargingData[0], _chargingData[1]);
  3061. }
  3062. // 持續通知 Isolation 測試狀態
  3063. if (priorityLow == 1)
  3064. {
  3065. // 拉 500 V 如果在一秒鐘內 GFD 都符合則 PASS
  3066. //printf("GFD = %d \n", _chargingData[_index]->GroundFaultStatus);//
  3067. if(_chargingData[_index]->GroundFaultStatus != GFD_WAIT)
  3068. {
  3069. SetIsolationStatus(_index, _chargingData[_index]->GroundFaultStatus, _chargingData[_index]->Evboard_id);
  3070. }
  3071. if(_chargingData[_index]->SystemStatus == S_CCS_PRECHARGE_ST0 &&
  3072. _chargingData[_index]->PrechargeStatus == PRECHARGE_READY)
  3073. {
  3074. SetEvsePrechargeInfo(_index, PRECHARGE_PRERELAY_PASS, _chargingData[_index]->Evboard_id);
  3075. }
  3076. }
  3077. }
  3078. break;
  3079. case S_CHARGING:
  3080. {
  3081. // 計算 Power
  3082. _chargingData[_index]->PresentChargingPower = ((float)((_chargingData[_index]->PresentChargingVoltage / 10) * (_chargingData[_index]->PresentChargingCurrent / 10)) / 1000);
  3083. if (chargingTime[_index] == 0)
  3084. {
  3085. chargingTime[_index] = _chargingData[_index]->RemainChargingDuration;
  3086. }
  3087. else
  3088. {
  3089. int passTime = _chargingData[_index]->RemainChargingDuration - chargingTime[_index];
  3090. if (passTime > 0)
  3091. {
  3092. _chargingData[_index]->PresentChargedEnergy += (_chargingData[_index]->PresentChargingPower) * passTime / 3600;
  3093. chargingTime[_index] = _chargingData[_index]->RemainChargingDuration;
  3094. }
  3095. }
  3096. // 開始確認車端是否同意開始充電
  3097. GetOutputReq(_index, _chargingData[_index]->Evboard_id);
  3098. // printf("PresentChargingVoltage = %f \n",
  3099. // _chargingData[_index]->PresentChargingVoltage);
  3100. // printf("PresentChargingCurrent = %f \n",
  3101. // _chargingData[_index]->PresentChargingCurrent);
  3102. // printf("AvailableChargingPower = %f \n",
  3103. // _chargingData[_index]->AvailableChargingPower);
  3104. // printf("AvailableChargingCurrent = %f \n",
  3105. // _chargingData[_index]->AvailableChargingCurrent);
  3106. //
  3107. // printf("GFD : index = %d, result = %d, id = %d \n", _index, _chargingData[_index]->GroundFaultStatus, _chargingData[_index]->Evboard_id);
  3108. // 設定當前輸出
  3109. if (gun_count == 1)
  3110. SetPresentChargingOutputPower(_chargingData[0], _chargingData[0]);
  3111. else if (gun_count == 2)
  3112. SetPresentChargingOutputPower(_chargingData[0], _chargingData[1]);
  3113. // for test end
  3114. if (priorityLow == 1)
  3115. {
  3116. // 樁端輸出能力改變
  3117. if (gun_count == 1)
  3118. SetPresentChargingOutputCap(_chargingData[0], _chargingData[0]);
  3119. else if (gun_count == 2)
  3120. SetPresentChargingOutputCap(_chargingData[0], _chargingData[1]);
  3121. }
  3122. // GFD 失敗再通知
  3123. if (priorityLow == 1)
  3124. {
  3125. printf("GFD : index = %d, result = %d, id = %d \n", _index, _chargingData[_index]->GroundFaultStatus, _chargingData[_index]->Evboard_id);
  3126. if(_chargingData[_index]->GroundFaultStatus == GFD_FAIL)
  3127. {
  3128. SetIsolationStatus(_index, _chargingData[_index]->GroundFaultStatus, _chargingData[_index]->Evboard_id);
  3129. }
  3130. if(_chargingData[_index]->Type == _Type_CCS &&
  3131. _chargingData[_index]->PrechargeStatus == PRECHARGE_READY)
  3132. {
  3133. SetEvsePrechargeInfo(_index, PRECHARGE_CHARELAY_PASS, _chargingData[_index]->Evboard_id);
  3134. }
  3135. }
  3136. }
  3137. break;
  3138. case S_TERMINATING:
  3139. {
  3140. // 設定當前輸出
  3141. if (gun_count == 1)
  3142. SetPresentChargingOutputPower(_chargingData[0], _chargingData[0]);
  3143. else if (gun_count == 2)
  3144. SetPresentChargingOutputPower(_chargingData[0], _chargingData[1]);
  3145. // 槍鎖還在,則代表是樁端要求的停止
  3146. if (_chargingData[_index]->GunLocked == START)
  3147. {
  3148. byte normalStop = 0x01;
  3149. byte stopReason[6] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
  3150. if (strlen((char *)ShmSysConfigAndInfo->SysStopChargingAlarmCode.StopCode[_index]) > 0)
  3151. {
  3152. normalStop = 0x02;
  3153. GetStopChargingReasonByEvse(_index, stopReason);
  3154. }
  3155. else
  3156. {
  3157. DEBUG_INFO("EVSE Normal Stop by User, index = %d \n", _index);
  3158. ShmStatusCodeData->InfoCode.InfoEvents.bits.NormalStopChargingByUser = 0x01;
  3159. GetStopChargingReasonByEvse(_index, stopReason);
  3160. char string[7];
  3161. sprintf(string, "%d%d%d%d%d%d", *(stopReason + 5), *(stopReason + 4), *(stopReason + 3), *(stopReason + 2), *(stopReason + 1), *(stopReason + 0));
  3162. memcpy(&ShmSysConfigAndInfo->SysStopChargingAlarmCode.StopCode[_index][0], string, 7);
  3163. ShmSysConfigAndInfo->SysStopChargingAlarmCode.Level = 0x00;
  3164. }
  3165. EvseStopChargingEvent(normalStop, stopReason, _chargingData[_index]->Evboard_id);
  3166. }
  3167. GetOutputReq(_index, _chargingData[_index]->Evboard_id);
  3168. }
  3169. break;
  3170. case S_COMPLETE:
  3171. {
  3172. if (priorityLow == 1)
  3173. {
  3174. float maxVol = _chargingData[_index]->MaximumChargingVoltage;
  3175. float maxCur = _chargingData[_index]->AvailableChargingCurrent;
  3176. GetMaxVolAndCurMethod(_index, &maxVol, &maxCur);
  3177. SetChargingPermission(_index, STOP,
  3178. _chargingData[_index]->AvailableChargingPower,
  3179. maxCur,
  3180. maxVol,
  3181. _chargingData[_index]->Evboard_id);
  3182. }
  3183. }
  3184. break;
  3185. }
  3186. }
  3187. priorityLow >= 20 ? priorityLow = 1 : priorityLow++;
  3188. usleep(45000); //EV 小板通訊 (50 ms)
  3189. }
  3190. #else
  3191. while (CanFd)
  3192. {
  3193. for (byte _index = 0; _index < gun_count; _index++)
  3194. {
  3195. if (priorityLow == 1)
  3196. {
  3197. // 優先權較低 - 只要有回應即不會再詢問
  3198. if (_chargingData[_index]->Type == _Type_Chademo &&
  3199. ShmCHAdeMOData->evse[_chargingData[_index]->type_index].SelfTest_Comp != PASS)
  3200. {
  3201. GetFirmwareVersion(_index, _chargingData[_index]->Evboard_id);
  3202. GetHardwareVersion(_index, _chargingData[_index]->Evboard_id);
  3203. } else if (_chargingData[_index]->Type == _Type_CCS)
  3204. {
  3205. if (ShmCcsData->CommProtocol == 0x01&&
  3206. ShmCcsData->V2GMessage_DIN70121[_chargingData[_index]->type_index].SelfTest_Comp != PASS)
  3207. {
  3208. GetFirmwareVersion(_index, _chargingData[_index]->Evboard_id);
  3209. GetHardwareVersion(_index, _chargingData[_index]->Evboard_id);
  3210. }
  3211. }
  3212. // 固定要取得的資訊 : 1.槍鎖狀態, 2."Connector 1" 溫度, 3."Connector 2" 溫度, 4.Pilot Voltage
  3213. GetMiscellaneousInfo(_index, _chargingData[_index]->Evboard_id);
  3214. }
  3215. switch (_chargingData[_index]->SystemStatus)
  3216. {
  3217. case S_IDLE:
  3218. {
  3219. _chargingData[_index]->GroundFaultStatus = GFD_WAIT;
  3220. _chargingData[_index]->StopChargeFlag = NO;
  3221. chargingTime[_index] = 0;
  3222. if (_chargingData[_index]->Type == _Type_Chademo)
  3223. {
  3224. ClearAbnormalStatus_Chadmoe(_index);
  3225. }
  3226. else if (_chargingData[_index]->Type == _Type_CCS)
  3227. {
  3228. }
  3229. }
  3230. break;
  3231. case S_PREPARING_FOR_EV:
  3232. {
  3233. if (_chargingData[_index]->Type == _Type_Chademo)
  3234. {
  3235. // 開始確認車端是否同意開始充電 : 1.SOC, 2.Target Vol, 3.Target Cur, 4.Charging remaining time
  3236. GetOutputReq(_index, _chargingData[_index]->Evboard_id);
  3237. // 設定當前輸出
  3238. if (gun_count == 1)
  3239. SetPresentChargingOutputPower(_chargingData[0], _chargingData[0]);
  3240. else if (gun_count == 2)
  3241. SetPresentChargingOutputPower(_chargingData[0], _chargingData[1]);
  3242. if (priorityLow == 1)
  3243. {
  3244. SetChargingPermission(_index, START,
  3245. _chargingData[_index]->AvailableChargingPower,
  3246. 1200, 5000, _chargingData[_index]->Evboard_id);
  3247. // 取得車端電池資訊 : 1.AC or DC ? 2.Total battery cap, 3.Max battery vol, 4.Max battery cur
  3248. GetEvBatteryInfo(_index, _chargingData[_index]->Evboard_id);
  3249. }
  3250. } else if (_chargingData[_index]->Type == _Type_CCS)
  3251. {
  3252. // 開始確認車端是否同意開始充電 : 1.SOC, 2.Target Vol, 3.Target Cur, 4.Charging remaining time
  3253. GetOutputReq(_index, _chargingData[_index]->Evboard_id);
  3254. // 設定當前輸出
  3255. if (gun_count == 1)
  3256. SetPresentChargingOutputPower(_chargingData[0], _chargingData[0]);
  3257. else if (gun_count == 2)
  3258. SetPresentChargingOutputPower(_chargingData[0], _chargingData[1]);
  3259. if (priorityLow == 1)
  3260. {
  3261. // 樁端輸出能力
  3262. SetChargingPermission(_index, START,
  3263. _chargingData[_index]->AvailableChargingPower,
  3264. _chargingData[_index]->AvailableChargingCurrent,
  3265. _chargingData[_index]->MaximumChargingVoltage,
  3266. _chargingData[_index]->Evboard_id);
  3267. // 取得車端電池資訊 : 1.AC or DC ? 2.Total battery cap, 3.Max battery vol, 4.Max battery cur
  3268. GetEvBatteryInfo(_index, _chargingData[_index]->Evboard_id);
  3269. }
  3270. }
  3271. }
  3272. break;
  3273. case S_PREPARING_FOR_EVSE:
  3274. case S_CCS_PRECHARGE_ST0:
  3275. case S_CCS_PRECHARGE_ST1:
  3276. {
  3277. // 開始確認車端是否同意開始充電
  3278. GetOutputReq(_index, _chargingData[_index]->Evboard_id);
  3279. // 假裝從 Relay 量到的火線上電壓
  3280. _chargingData[_index]->PresentChargingCurrent = _chargingData[_index]->EvBatterytargetCurrent;
  3281. _chargingData[_index]->PresentChargingVoltage = _chargingData[_index]->EvBatterytargetVoltage;
  3282. // 設定當前輸出
  3283. if (gun_count == 1)
  3284. SetPresentChargingOutputPower(_chargingData[0], _chargingData[0]);
  3285. else if (gun_count == 2)
  3286. SetPresentChargingOutputPower(_chargingData[0], _chargingData[1]);
  3287. if (ShmSysConfigAndInfo->SysInfo.ReAssignedFlag != 0x00)
  3288. {
  3289. if (priorityLow % 5 == 1)
  3290. {
  3291. // 樁端輸出能力改變
  3292. if (gun_count == 1)
  3293. SetPresentChargingOutputCap(_chargingData[0], _chargingData[0]);
  3294. else if (gun_count == 2)
  3295. SetPresentChargingOutputCap(_chargingData[0], _chargingData[1]);
  3296. }
  3297. }
  3298. // 持續通知 Isolation 測試狀態
  3299. if (priorityLow == 1) {
  3300. // 拉 500 V 如果在一秒鐘內 GFD 都符合則 PASS
  3301. _chargingData[_index]->GroundFaultStatus = GFD_PASS;
  3302. if (_chargingData[_index]->GroundFaultStatus != GFD_WAIT)
  3303. {
  3304. SetIsolationStatus(_index,
  3305. _chargingData[_index]->GroundFaultStatus,
  3306. _chargingData[_index]->Evboard_id);
  3307. }
  3308. if (_chargingData[_index]->SystemStatus == S_CCS_PRECHARGE_ST1&&
  3309. _chargingData[_index]->PrechargeStatus == PRECHARGE_WAIT)
  3310. {
  3311. SetEvsePrechargeInfo(_index, PRECHARGE_PRERELAY_PASS, _chargingData[_index]->Evboard_id);
  3312. }
  3313. }
  3314. }
  3315. break;
  3316. case S_CHARGING:
  3317. {
  3318. // 假裝從 Relay 量到的火線上電壓電流
  3319. _chargingData[_index]->PresentChargingCurrent = _chargingData[_index]->EvBatterytargetCurrent;
  3320. _chargingData[_index]->PresentChargingVoltage = _chargingData[_index]->EvBatterytargetVoltage;
  3321. _chargingData[_index]->PresentChargingPower = ((float) ((_chargingData[_index]->PresentChargingVoltage / 10)
  3322. * (_chargingData[_index]->PresentChargingCurrent / 10)) / 1000);
  3323. if (chargingTime[_index] == 0)
  3324. {
  3325. chargingTime[_index] = _chargingData[_index]->RemainChargingDuration;
  3326. }
  3327. else
  3328. {
  3329. int passTime = _chargingData[_index]->RemainChargingDuration - chargingTime[_index];
  3330. if (passTime > 0)
  3331. {
  3332. _chargingData[_index]->PresentChargedEnergy += (_chargingData[_index]->PresentChargingPower) * passTime / 3600;
  3333. chargingTime[_index] = _chargingData[_index]->RemainChargingDuration;
  3334. }
  3335. }
  3336. // 開始確認車端是否同意開始充電
  3337. GetOutputReq(_index, _chargingData[_index]->Evboard_id);
  3338. // 設定當前輸出
  3339. if (gun_count == 1)
  3340. SetPresentChargingOutputPower(_chargingData[0], _chargingData[0]);
  3341. else if (gun_count == 2)
  3342. SetPresentChargingOutputPower(_chargingData[0], _chargingData[1]);
  3343. // for test end
  3344. if (ShmSysConfigAndInfo->SysInfo.ReAssignedFlag != 0x00)
  3345. {
  3346. if (priorityLow % 5 == 0)
  3347. {
  3348. // 樁端輸出能力改變
  3349. if (gun_count == 1)
  3350. SetPresentChargingOutputCap(_chargingData[0], _chargingData[0]);
  3351. else if (gun_count == 2)
  3352. SetPresentChargingOutputCap(_chargingData[0], _chargingData[1]);
  3353. }
  3354. }
  3355. // GFD 失敗再通知
  3356. if (priorityLow == 1)
  3357. {
  3358. if (_chargingData[_index]->GroundFaultStatus == GFD_FAIL)
  3359. {
  3360. SetIsolationStatus(_index,
  3361. _chargingData[_index]->GroundFaultStatus,
  3362. _chargingData[_index]->Evboard_id);
  3363. }
  3364. if (_chargingData[_index]->Type == _Type_CCS&&
  3365. _chargingData[_index]->PrechargeStatus == PRECHARGE_WAIT)
  3366. {
  3367. SetEvsePrechargeInfo(_index, PRECHARGE_CHARELAY_PASS,
  3368. _chargingData[_index]->Evboard_id);
  3369. }
  3370. }
  3371. }
  3372. break;
  3373. case S_TERMINATING:
  3374. {
  3375. // 設定當前輸出
  3376. if (gun_count == 1)
  3377. SetPresentChargingOutputPower(_chargingData[0], _chargingData[0]);
  3378. else if (gun_count == 2)
  3379. SetPresentChargingOutputPower(_chargingData[0], _chargingData[1]);
  3380. // 槍鎖還在,則代表是樁端要求的停止
  3381. if (_chargingData[_index]->GunLocked == START)
  3382. {
  3383. byte normalStop = 0x01;
  3384. byte stopReason[6] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
  3385. if (strlen((char *) ShmSysConfigAndInfo->SysStopChargingAlarmCode.StopCode[_index]) > 0)
  3386. {
  3387. normalStop = 0x02;
  3388. GetStopChargingReasonByEvse(_index, stopReason);
  3389. }
  3390. EvseStopChargingEvent(normalStop, stopReason, _chargingData[_index]->Evboard_id);
  3391. }
  3392. GetOutputReq(_index, _chargingData[_index]->Evboard_id);
  3393. }
  3394. break;
  3395. case S_COMPLETE:
  3396. {
  3397. if (priorityLow == 1)
  3398. {
  3399. SetChargingPermission(_index, STOP,
  3400. _chargingData[_index]->AvailableChargingPower,
  3401. _chargingData[_index]->AvailableChargingCurrent,
  3402. _chargingData[_index]->MaximumChargingVoltage,
  3403. _chargingData[_index]->Evboard_id);
  3404. }
  3405. }
  3406. break;
  3407. }
  3408. }
  3409. priorityLow >= 20 ? priorityLow = 1 : priorityLow++;
  3410. usleep(45000); //EV 小板通訊 (50 ms)
  3411. }
  3412. #endif
  3413. */
  3414. //DEBUG_INFO("Module_EvComm : Can-bus port = %d \n", CanFd);
  3415. return FAIL;
  3416. }