Module_ATEVCCU.c 120 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439244024412442244324442445244624472448244924502451245224532454245524562457245824592460246124622463246424652466246724682469247024712472247324742475247624772478247924802481248224832484248524862487248824892490249124922493249424952496249724982499250025012502250325042505250625072508250925102511251225132514251525162517251825192520252125222523252425252526252725282529253025312532253325342535253625372538253925402541254225432544254525462547254825492550255125522553255425552556255725582559256025612562256325642565256625672568256925702571257225732574257525762577257825792580258125822583258425852586258725882589259025912592259325942595259625972598259926002601260226032604260526062607260826092610261126122613261426152616261726182619262026212622262326242625262626272628262926302631263226332634263526362637263826392640264126422643264426452646264726482649265026512652265326542655265626572658265926602661266226632664266526662667266826692670267126722673267426752676267726782679268026812682268326842685268626872688268926902691269226932694269526962697269826992700270127022703270427052706270727082709271027112712271327142715271627172718271927202721272227232724272527262727272827292730273127322733273427352736273727382739274027412742274327442745274627472748274927502751275227532754275527562757275827592760276127622763276427652766276727682769277027712772277327742775277627772778277927802781278227832784278527862787278827892790279127922793279427952796279727982799280028012802280328042805280628072808280928102811281228132814281528162817281828192820282128222823282428252826282728282829283028312832283328342835283628372838283928402841284228432844284528462847284828492850285128522853285428552856285728582859286028612862286328642865286628672868286928702871287228732874287528762877287828792880288128822883288428852886288728882889289028912892289328942895289628972898289929002901290229032904290529062907290829092910291129122913291429152916291729182919292029212922292329242925292629272928292929302931293229332934293529362937293829392940294129422943294429452946294729482949295029512952295329542955295629572958295929602961296229632964296529662967296829692970297129722973297429752976297729782979298029812982298329842985298629872988298929902991299229932994299529962997299829993000300130023003300430053006300730083009301030113012301330143015301630173018301930203021302230233024302530263027302830293030303130323033303430353036303730383039304030413042304330443045304630473048304930503051305230533054305530563057305830593060306130623063306430653066306730683069307030713072307330743075307630773078307930803081308230833084308530863087308830893090309130923093309430953096309730983099310031013102310331043105310631073108310931103111311231133114311531163117311831193120312131223123312431253126312731283129313031313132313331343135313631373138313931403141314231433144314531463147314831493150315131523153315431553156315731583159316031613162316331643165316631673168316931703171317231733174317531763177317831793180318131823183318431853186318731883189319031913192319331943195319631973198319932003201320232033204320532063207320832093210321132123213321432153216321732183219322032213222322332243225322632273228322932303231323232333234323532363237323832393240324132423243324432453246324732483249325032513252325332543255325632573258325932603261326232633264326532663267326832693270327132723273327432753276327732783279328032813282328332843285328632873288328932903291329232933294329532963297329832993300330133023303330433053306330733083309331033113312331333143315331633173318331933203321332233233324332533263327332833293330333133323333333433353336333733383339334033413342334333443345334633473348334933503351335233533354335533563357335833593360336133623363336433653366336733683369337033713372337333743375337633773378337933803381338233833384338533863387338833893390339133923393339433953396339733983399340034013402340334043405340634073408340934103411341234133414341534163417341834193420342134223423342434253426342734283429343034313432343334343435343634373438343934403441344234433444344534463447344834493450345134523453345434553456345734583459346034613462346334643465346634673468346934703471347234733474347534763477347834793480348134823483348434853486348734883489349034913492349334943495349634973498349935003501350235033504350535063507350835093510351135123513351435153516351735183519352035213522352335243525352635273528352935303531353235333534353535363537353835393540354135423543354435453546354735483549355035513552355335543555355635573558355935603561356235633564356535663567356835693570357135723573357435753576357735783579
  1. #include <sys/types.h>
  2. #include <sys/stat.h>
  3. #include <sys/time.h>
  4. #include <sys/timeb.h>
  5. #include <sys/ioctl.h>
  6. #include <sys/socket.h>
  7. #include <sys/ipc.h>
  8. #include <sys/shm.h>
  9. #include <sys/mman.h>
  10. #include <linux/wireless.h>
  11. #include <arpa/inet.h>
  12. #include <netinet/in.h>
  13. #include <unistd.h>
  14. #include <stdarg.h>
  15. #include <stdio.h> /*標準輸入輸出定義*/
  16. #include <stdlib.h> /*標準函數庫定義*/
  17. #include <unistd.h> /*Unix 標準函數定義*/
  18. #include <fcntl.h> /*檔控制定義*/
  19. #include <termios.h> /*PPSIX 終端控制定義*/
  20. #include <errno.h> /*錯誤號定義*/
  21. #include <errno.h>
  22. #include <string.h>
  23. #include <time.h>
  24. #include <ctype.h>
  25. #include <ifaddrs.h>
  26. #include <math.h>
  27. #include "Config.h"
  28. #include <stdbool.h>
  29. #include "../../define.h"
  30. #include <dirent.h>
  31. #include "VCCU.h"
  32. #include "timeout.h"
  33. #include "internalComm.h"
  34. #include "IOComm.h"
  35. #include <unistd.h> //write, close, usleep, read
  36. #include <sys/time.h>
  37. #include <sys/timeb.h>
  38. #include <sys/types.h>
  39. #include <sys/stat.h>
  40. #include <sys/types.h>
  41. #include <sys/ioctl.h>
  42. #include <sys/socket.h>
  43. #include <sys/ipc.h>
  44. #include <sys/shm.h>
  45. #include <sys/shm.h>
  46. #include <sys/mman.h>
  47. #include <linux/wireless.h>
  48. #include <arpa/inet.h>
  49. #include <netinet/in.h>
  50. #include <unistd.h>
  51. #include <stdarg.h>
  52. #include <stdio.h> /*標準輸入輸出定義*/
  53. #include <stdlib.h> /*標準函數庫定義*/
  54. #include <unistd.h> /*Unix 標準函數定義*/
  55. #include <fcntl.h> /*檔控制定義*/
  56. #include <termios.h> /*PPSIX 終端控制定義*/
  57. #include <errno.h> /*錯誤號定義*/
  58. #include <errno.h>
  59. #include <string.h>
  60. #include <time.h>
  61. #include <ctype.h>
  62. #include <ifaddrs.h>
  63. #include <math.h>
  64. #include "Module_EvComm.h"
  65. #include <stdlib.h>
  66. #include <stdio.h>
  67. #include <unistd.h> //write, close, usleep, read
  68. #include <fcntl.h> //uart
  69. #define Debug
  70. #define ARRAY_SIZE(A) (sizeof(A) / sizeof(A[0]))
  71. #define PASS 1
  72. #define FAIL -1
  73. #define START 1
  74. #define STOP 0
  75. #define BUFFER_SIZE 128
  76. #define YES 1
  77. #define NO 0
  78. #define NORMAL 0
  79. #define ABNORMAL 1
  80. #define EQUAL 0
  81. #define BTN_RELEASE 0
  82. #define BTN_PRESS 1
  83. #define MAX_BUF 64
  84. #define SYSFS_GPIO_DIR "/sys/class/gpio"
  85. #define SendDirection 0x08000000
  86. #define FAIL -1
  87. struct SysConfigAndInfo *ShmSysConfigAndInfo;
  88. struct StatusCodeData *ShmStatusCodeData;
  89. struct CHAdeMOData *ShmCHAdeMOData;
  90. struct CcsData *ShmCcsData;
  91. struct RelayModuleData *ShmRelayModuleData;
  92. //struct ATE *ate;
  93. struct ChargingInfoData *chargingInfo[CHAdeMO_QUANTITY + CCS_QUANTITY + GB_QUANTITY];
  94. struct timeb startChargingTime[CHAdeMO_QUANTITY + CCS_QUANTITY + GB_QUANTITY];
  95. struct timeb endChargingTime[CHAdeMO_QUANTITY + CCS_QUANTITY + GB_QUANTITY];
  96. struct timeb startPlugPresentStatusTime[CHAdeMO_QUANTITY + CCS_QUANTITY + GB_QUANTITY];
  97. struct timeb startDutyCyclTime[CHAdeMO_QUANTITY + CCS_QUANTITY + GB_QUANTITY];
  98. struct timeb endPlugPresentStatusTime[CHAdeMO_QUANTITY + CCS_QUANTITY + GB_QUANTITY];
  99. struct timeb endDutyCyclTime[CHAdeMO_QUANTITY + CCS_QUANTITY + GB_QUANTITY];
  100. //VCCU_ChargeFromVehicle_DATA chargeFromVehicle;
  101. pid_t CANReceiverPid;
  102. int CanFd;
  103. int CanFd2;
  104. #define VIN_MAX_VOLTAGE 250 // 大於該值 : OVP
  105. #define VIN_MIN_VOLTAGE 170 // 小於該值 : UVP
  106. #define VIN_DROP_VOLTAGE 150 // 小於該值 : ac drop
  107. #define SYSFS_GPIO_DIR "/sys/class/gpio"
  108. byte gunCount = CHAdeMO_QUANTITY + CCS_QUANTITY + GB_QUANTITY;
  109. // for initial index to check EV board type is correct
  110. Ver ver;
  111. PresentInputVoltage inputVoltage;
  112. PresentOutputVoltage outputVoltage;
  113. Relay outputRelay;
  114. Relay regRelay;
  115. int Uart5Fd;
  116. int Uart1Fd;
  117. Gpio_in gpio_in;
  118. char *relayRs485PortName = "/dev/ttyS5";
  119. char* pPortName = "/dev/ttyS3";
  120. char *priPortName = "/dev/ttyS1";
  121. #define btoa(x) ((x)?"true":"false")
  122. long hexToDec(char *source);
  123. int getIndexOfSigns(char ch);
  124. int whileLoopTime = 500000;//500ms//10000; // 10 ms
  125. int targetCurrent_Value = 60;//2;
  126. int targetVoltage_Value = 400;
  127. int maximumCurrent_value = 200;//10;
  128. int maximumVoltage_value = 500;
  129. int linkVoltage = 500;
  130. int contactorVoltage = 0;
  131. int _port;
  132. #define YES 1
  133. #define NO 0
  134. byte flash = NO;
  135. //=================================
  136. // Create all share memory
  137. //=================================
  138. struct Address Addr={0x01,0x02,0x03,0x04,0xFF};
  139. struct Command Cmd={0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0a,0x81,0x85,0x86,0xe0,0xe1,0xe2,0xe3};
  140. byte normalStop = 0x01;
  141. byte stopReason[6] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
  142. byte evstaus[5] = { 0x01, 0x02, 0x03, 0x04, 0x05 };
  143. struct Ev_Board_Cmd Ev_Cmd={
  144. 0,
  145. 0x00000200,
  146. 0x00000400,
  147. 0x00000500,
  148. 0x00000600,
  149. 0x00000700,
  150. 0x00000800,
  151. 0x00000900,
  152. 0x00000A00,
  153. 0x00000C00,
  154. 0x00000D00,
  155. 0x00000E00,
  156. 0x00000F00,
  157. 0x00001000,
  158. 0x00001100,
  159. 0x00001200,
  160. 0x00001500,
  161. };
  162. unsigned long GetTimeoutValue(struct timeval _sour_time);
  163. unsigned long GetTimeoutValue(struct timeval _sour_time)
  164. {
  165. struct timeval _end_time;
  166. gettimeofday(&_end_time, NULL);
  167. return 1000000 * (_end_time.tv_sec - _sour_time.tv_sec) + _end_time.tv_usec - _sour_time.tv_usec;
  168. }
  169. int tranceive(int fd, unsigned char* cmd, unsigned char cmd_len, unsigned char* rx)
  170. {
  171. int len;
  172. //sleep(2); //required to make flush work, for some reason
  173. tcflush(fd,TCIOFLUSH);
  174. if(write(fd, cmd, cmd_len) >= cmd_len)
  175. {
  176. usleep(5000);
  177. len = read(fd, rx, 512);
  178. }
  179. else
  180. {
  181. #ifdef SystemLogMessage
  182. //DEBUG_ERROR("Serial command %s response fail.\n", cmd);
  183. #endif
  184. }
  185. return len;
  186. }
  187. unsigned char Query_FW_Ver(unsigned char fd, unsigned char targetAddr, Ver *Ret_Buf)
  188. {
  189. unsigned char result = FAIL;
  190. unsigned char tx[7] = {0xaa, 0x00, targetAddr, Cmd.query_FW_Ver, 0x00, 0x00, 0x00};
  191. unsigned char rx[512];
  192. unsigned char chksum = 0x00;
  193. unsigned char len = tranceive(fd, tx, sizeof(tx), rx);
  194. if(len > 6)
  195. {
  196. if (len < 6+(rx[4] | rx[5]<<8))
  197. return result;
  198. for(int idx = 0;idx<(rx[4] | rx[5]<<8);idx++)
  199. {
  200. chksum ^= rx[6+idx];
  201. }
  202. if((chksum == rx[6+(rx[4] | rx[5]<<8)]) &&
  203. (rx[2] == tx[1]) &&
  204. (rx[1] == tx[2]) &&
  205. (rx[3] == tx[3]))
  206. {
  207. memcpy(Ret_Buf->Version_FW, (char *)rx+6, (rx[4] | rx[5]<<8));
  208. *(Ret_Buf->Version_FW + 8) = 0x00;
  209. result = PASS;
  210. }
  211. }
  212. return result;
  213. }
  214. unsigned char Query_HW_Ver(unsigned char fd, unsigned char targetAddr, Ver *Ret_Buf)
  215. {
  216. unsigned char result = FAIL;
  217. unsigned char tx[7] = {0xaa, 0x00, targetAddr, Cmd.query_HW_Ver, 0x00, 0x00, 0x00};
  218. unsigned char rx[512];
  219. unsigned char chksum = 0x00;
  220. unsigned char len = tranceive(fd, tx, sizeof(tx), rx);
  221. if(len > 6)
  222. {
  223. if (len < 6+(rx[4] | rx[5]<<8))
  224. return result;
  225. for(int idx = 0;idx<(rx[4] | rx[5]<<8);idx++)
  226. {
  227. chksum ^= rx[6+idx];
  228. }
  229. if((chksum == rx[6+(rx[4] | rx[5]<<8)]) &&
  230. (rx[2] == tx[1]) &&
  231. (rx[1] == tx[2]) &&
  232. (rx[3] == tx[3]))
  233. {
  234. memcpy(Ret_Buf->Version_HW, (char *)rx+6, (rx[4] | rx[5]<<8));
  235. *(Ret_Buf->Version_HW + 8) = 0x00;
  236. result = PASS;
  237. }
  238. }
  239. return result;
  240. }
  241. unsigned char Query_Present_InputVoltage(unsigned char fd, unsigned char targetAddr, PresentInputVoltage *Ret_Buf)
  242. {
  243. unsigned char result = FAIL;
  244. unsigned char tx[7] = {0xaa, 0x00, targetAddr, Cmd.query_Present_InputVoltage, 0x00, 0x00, 0x00};
  245. unsigned char rx[512];
  246. unsigned char chksum = 0x00;
  247. unsigned char len = tranceive(fd, tx, sizeof(tx), rx);
  248. if(len > 6)
  249. {
  250. if (len < 6+(rx[4] | rx[5]<<8))
  251. return result;
  252. for(int idx = 0;idx<(rx[4] | rx[5]<<8);idx++)
  253. {
  254. chksum ^= rx[6+idx];
  255. }
  256. if((chksum == rx[6+(rx[4] | rx[5]<<8)]) &&
  257. (rx[2] == tx[1]) &&
  258. (rx[1] == tx[2]) &&
  259. (rx[3] == tx[3]))
  260. {
  261. Ret_Buf->inputType = rx[6];
  262. Ret_Buf->L1N_L12 =(rx[7] | (rx[8]<<8))/10.0;
  263. Ret_Buf->L2N_L23 =(rx[9] | (rx[10]<<8))/10.0;
  264. Ret_Buf->L3N_L31 =(rx[11] | (rx[12]<<8))/10.0;
  265. result = PASS;
  266. }
  267. }
  268. return result;
  269. }
  270. unsigned char Query_Present_OutputVoltage(unsigned char fd, unsigned char targetAddr, PresentOutputVoltage *Ret_Buf)
  271. {
  272. unsigned char result = FAIL;
  273. unsigned char tx[7] = {0xaa, 0x00, targetAddr, Cmd.query_Present_OutputVoltage, 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. Ret_Buf->behindFuse_Voltage_C1 =(rx[6] | (rx[7]<<8));
  291. Ret_Buf->behindRelay_Voltage_C1 =(rx[8] | (rx[9]<<8));
  292. if((rx[4] | rx[5]<<8) > 4)
  293. {
  294. Ret_Buf->behindFuse_Voltage_C2 =(rx[10] | (rx[11]<<8));
  295. Ret_Buf->behindRelay_Voltage_C2 =(rx[12] | (rx[13]<<8));
  296. }
  297. result = PASS;
  298. }
  299. }
  300. return result;
  301. }
  302. unsigned char Query_Fan_Speed(unsigned char fd, unsigned char targetAddr, FanSpeed *Ret_Buf)
  303. {
  304. unsigned char result = FAIL;
  305. unsigned char tx[7] = {0xaa, 0x00, targetAddr, Cmd.query_Fan_Speed, 0x00, 0x00, 0x00};
  306. unsigned char rx[512];
  307. unsigned char chksum = 0x00;
  308. unsigned char len = tranceive(fd, tx, sizeof(tx), rx);
  309. if(len > 6)
  310. {
  311. if (len < 6+(rx[4] | rx[5]<<8))
  312. return result;
  313. for(int idx = 0;idx<(rx[4] | rx[5]<<8);idx++)
  314. {
  315. chksum ^= rx[6+idx];
  316. }
  317. if((chksum == rx[6+(rx[4] | rx[5]<<8)]) &&
  318. (rx[2] == tx[1]) &&
  319. (rx[1] == tx[2]) &&
  320. (rx[3] == tx[3]))
  321. {
  322. for(int idx=0;idx < 4;idx++)
  323. Ret_Buf->speed[idx] = (rx[6+(2*idx)] | (rx[6+(2*idx)+1]<<8));
  324. result = PASS;
  325. }
  326. }
  327. return result;
  328. }
  329. unsigned char Query_Temperature(unsigned char fd, unsigned char targetAddr, Temperature *Ret_Buf)
  330. {
  331. unsigned char result = FAIL;
  332. unsigned char tx[7] = {0xaa, 0x00, targetAddr, Cmd.query_Temperature, 0x00, 0x00, 0x00};
  333. unsigned char rx[512];
  334. unsigned char chksum = 0x00;
  335. unsigned char len = tranceive(fd, tx, sizeof(tx), rx);
  336. if(len > 6)
  337. {
  338. if (len < 6+(rx[4] | rx[5]<<8))
  339. return result;
  340. for(int idx = 0;idx<(rx[4] | rx[5]<<8);idx++)
  341. {
  342. chksum ^= rx[6+idx];
  343. }
  344. if((chksum == rx[6+(rx[4] | rx[5]<<8)]) &&
  345. (rx[2] == tx[1]) &&
  346. (rx[1] == tx[2]) &&
  347. (rx[3] == tx[3]))
  348. {
  349. for(int idx=0;idx < 4;idx++)
  350. Ret_Buf->temperature[idx] = rx[6+idx] - 60;
  351. result = PASS;
  352. }
  353. }
  354. return result;
  355. }
  356. unsigned char Query_Aux_PowerVoltage(unsigned char fd, unsigned char targetAddr, AuxPower *Ret_Buf)
  357. {
  358. unsigned char result = FAIL;
  359. unsigned char tx[7] = {0xaa, 0x00, targetAddr, Cmd.query_Aux_PowerVoltage, 0x00, 0x00, 0x00};
  360. unsigned char rx[512];
  361. unsigned char chksum = 0x00;
  362. unsigned char len = tranceive(fd, tx, sizeof(tx), rx);
  363. if(len > 6)
  364. {
  365. if (len < 6+(rx[4] | rx[5]<<8))
  366. return result;
  367. for(int idx = 0;idx<(rx[4] | rx[5]<<8);idx++)
  368. {
  369. chksum ^= rx[6+idx];
  370. }
  371. if((chksum == rx[6+(rx[4] | rx[5]<<8)]) &&
  372. (rx[2] == tx[1]) &&
  373. (rx[1] == tx[2]) &&
  374. (rx[3] == tx[3]))
  375. {
  376. for(int idx=0;idx<(rx[4] | rx[5]<<8);idx++)
  377. Ret_Buf->voltage[idx] = rx[6+idx];
  378. result = PASS;
  379. }
  380. }
  381. return result;
  382. }
  383. unsigned char Query_Relay_Output(unsigned char fd, unsigned char targetAddr, Relay *Ret_Buf)
  384. {
  385. unsigned char result = FAIL;
  386. unsigned char tx[7] = {0xaa, 0x00, targetAddr, Cmd.query_Relay_Output, 0x00, 0x00, 0x00};
  387. unsigned char rx[512];
  388. unsigned char chksum = 0x00;
  389. unsigned char len = tranceive(fd, tx, sizeof(tx), rx);
  390. if(len > 6)
  391. {
  392. if (len < 6+(rx[4] | rx[5]<<8))
  393. return result;
  394. for(int idx = 0;idx<(rx[4] | rx[5]<<8);idx++)
  395. {
  396. chksum ^= rx[6+idx];
  397. }
  398. if((chksum == rx[6+(rx[4] | rx[5]<<8)]) &&
  399. (rx[2] == tx[1]) &&
  400. (rx[1] == tx[2]) &&
  401. (rx[3] == tx[3]))
  402. {
  403. Ret_Buf->relay_event.bits.AC_Contactor = (rx[6] >> 0) & 0x01;
  404. Ret_Buf->relay_event.bits.CCS_Precharge = (rx[6] >> 1) & 0x01;
  405. Ret_Buf->relay_event.bits.Gun1_N = (rx[7] >> 0) & 0x01;
  406. Ret_Buf->relay_event.bits.Gun1_P = (rx[7] >> 1) & 0x01;
  407. Ret_Buf->relay_event.bits.Gun1_Parallel_N = (rx[7] >> 2) & 0x01;
  408. Ret_Buf->relay_event.bits.Gun1_Parallel_P = (rx[7] >> 3) & 0x01;
  409. Ret_Buf->relay_event.bits.Gun2_N = (rx[8] >> 0) & 0x01;
  410. Ret_Buf->relay_event.bits.Gun2_P = (rx[8] >> 1) & 0x01;
  411. result = PASS;
  412. }
  413. }
  414. return result;
  415. }
  416. unsigned char Query_Gfd_Adc(unsigned char fd, unsigned char targetAddr, Gfd *Ret_Buf)
  417. {
  418. unsigned char result = FAIL;
  419. unsigned char tx[7] = {0xaa, 0x00, targetAddr, Cmd.query_Gfd_Adc, 0x00, 0x00, 0x00};
  420. unsigned char rx[512];
  421. unsigned char chksum = 0x00;
  422. unsigned char len = tranceive(fd, tx, sizeof(tx), rx);
  423. if(len > 6)
  424. {
  425. if (len < 6+(rx[4] | rx[5]<<8))
  426. return result;
  427. for(int idx = 0;idx<(rx[4] | rx[5]<<8);idx++)
  428. {
  429. chksum ^= rx[6+idx];
  430. }
  431. printf("chksum = %d \n", chksum);
  432. printf("rx[2] == %d tx[1] = %d \n", rx[2], tx[1]);
  433. printf("rx[1] == %d tx[2] = %d \n", rx[1], tx[2]);
  434. printf("rx[3] == %d tx[3] = %d \n", rx[3], tx[3]);
  435. printf("chksum = %d \n", chksum);
  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. if(
  441. (rx[2] == tx[1]) &&
  442. (rx[1] == tx[2]) &&
  443. (rx[3] == tx[3]))
  444. {
  445. Ret_Buf->Resister = (rx[6] | (rx[7]<<8) | (rx[8]<<16) | (rx[9]<<24));
  446. Ret_Buf->voltage = rx[10] | (rx[11]<<8);
  447. Ret_Buf->result = rx[12];
  448. result = PASS;
  449. }
  450. }
  451. return result;
  452. }
  453. unsigned char Query_Gpio_Input(unsigned char fd, unsigned char targetAddr, Gpio_in *Ret_Buf)
  454. {
  455. unsigned char result = FAIL;
  456. unsigned char tx[7] = {0xaa, 0x00, targetAddr, Cmd.query_Gpio_In, 0x00, 0x00, 0x00};
  457. unsigned char rx[512];
  458. unsigned char chksum = 0x00;
  459. unsigned char len = tranceive(fd, tx, sizeof(tx), rx);
  460. if(len > 6)
  461. {
  462. if (len < 6+(rx[4] | rx[5]<<8))
  463. return result;
  464. for(int idx = 0;idx<(rx[4] | rx[5]<<8);idx++)
  465. {
  466. chksum ^= rx[6+idx];
  467. }
  468. if((chksum == rx[6+(rx[4] | rx[5]<<8)]) &&
  469. (rx[2] == tx[1]) &&
  470. (rx[1] == tx[2]) &&
  471. (rx[3] == tx[3]))
  472. {
  473. Ret_Buf->AC_Connector = (rx[6] >> 0) & 0x01;
  474. Ret_Buf->AC_MainBreaker = (rx[6] >> 1) & 0x01;
  475. Ret_Buf->SPD = (rx[6] >> 2) & 0x01;
  476. Ret_Buf->Door_Open = (rx[6] >> 3) & 0x01;
  477. Ret_Buf->GFD[0] = (rx[6] >> 4) & 0x01;
  478. Ret_Buf->GFD[1] = (rx[6] >> 5) & 0x01;
  479. Ret_Buf->AC_Drop = (rx[6] >> 6) & 0x01;
  480. Ret_Buf->Emergency_IO = (rx[7] >> 0) & 0x01;
  481. Ret_Buf->Button_Emergency_Press = (rx[8] >> 0) & 0x01;
  482. Ret_Buf->Button_On_Press = (rx[8] >> 1) & 0x01;
  483. Ret_Buf->Button_Off_Press = (rx[8] >> 2) & 0x01;
  484. Ret_Buf->Key_1_Press = (rx[8] >> 3) & 0x01;
  485. Ret_Buf->Key_2_Press = (rx[8] >> 4) & 0x01;
  486. Ret_Buf->Key_3_Press = (rx[8] >> 5) & 0x01;
  487. Ret_Buf->Key_4_Press = (rx[8] >> 6) & 0x01;
  488. result = PASS;
  489. }
  490. }
  491. return result;
  492. }
  493. unsigned char Config_Fan_Speed(unsigned char fd, unsigned char targetAddr, FanSpeed *Set_Buf)
  494. {
  495. unsigned char result = FAIL;
  496. unsigned char tx[9] = {0xaa, 0x00, targetAddr, Cmd.config_Fan_Speed, 0x02, 0x00, Set_Buf->speed[0], Set_Buf->speed[1]};
  497. unsigned char rx[512];
  498. unsigned char chksum = 0x00;
  499. for(int idx = 0;idx<(tx[4] | tx[5]<<8);idx++)
  500. chksum ^= tx[6+idx];
  501. tx[9] = chksum;
  502. unsigned char len = tranceive(fd, tx, sizeof(tx), rx);
  503. if(len > 6)
  504. {
  505. if (len < 6+(rx[4] | rx[5]<<8))
  506. return result;
  507. chksum = 0x00;
  508. for(int idx = 0;idx<(rx[4] | rx[5]<<8);idx++)
  509. {
  510. chksum ^= rx[6+idx];
  511. }
  512. if((chksum == rx[6+(rx[4] | rx[5]<<8)]) &&
  513. (rx[2] == tx[1]) &&
  514. (rx[1] == tx[2]) &&
  515. (rx[3] == tx[3]))
  516. {
  517. result = PASS;
  518. }
  519. }
  520. return result;
  521. }
  522. unsigned char Config_Relay_Output(unsigned char fd, unsigned char targetAddr, Relay *Set_Buf)
  523. {
  524. unsigned char result = FAIL;
  525. 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]};
  526. unsigned char rx[512];
  527. unsigned char chksum = 0x00;
  528. for(int idx = 0;idx<(tx[4] | tx[5]<<8);idx++)
  529. chksum ^= tx[6 + idx];
  530. tx[9] = chksum;
  531. unsigned char len = tranceive(fd, tx, sizeof(tx), rx);
  532. if(len > 6)
  533. {
  534. if (len < 6+(rx[4] | rx[5]<<8))
  535. return result;
  536. // for (int i = 0; i < len; i++)
  537. // printf("set relay cmd : rx = %x \n", rx[i]);
  538. chksum = 0x00;
  539. for(int idx = 0;idx<(rx[4] | rx[5]<<8);idx++)
  540. {
  541. chksum ^= rx[6+idx];
  542. }
  543. if((chksum == rx[6+(rx[4] | rx[5]<<8)]) &&
  544. (rx[2] == tx[1]) &&
  545. (rx[1] == tx[2]) &&
  546. (rx[3] == tx[3]) &&
  547. rx[6] == PASS)
  548. {
  549. result = PASS;
  550. }
  551. }
  552. return result;
  553. }
  554. unsigned char Config_Gfd_Value(unsigned char fd, unsigned char targetAddr, Gfd_config *Set_Buf)
  555. {
  556. unsigned char result = FAIL;
  557. unsigned char tx[11] = {0xaa, 0x00, targetAddr, Cmd.config_Gfd_Value, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00};
  558. unsigned char rx[512];
  559. unsigned char chksum = 0x00;
  560. tx[6] = (unsigned char)(Set_Buf->reqVol) & 0xff;
  561. tx[7] = ((unsigned char)(Set_Buf->reqVol) >> 8) & 0xff;
  562. tx[8] = (unsigned char)(Set_Buf->resister) & 0xff;
  563. tx[9] = ((unsigned char)(Set_Buf->resister) >> 8) & 0xff;
  564. for(int idx = 0;idx<(tx[4] | tx[5]<<8);idx++)
  565. chksum ^= tx[6+idx];
  566. tx[10] = chksum;
  567. unsigned char len = tranceive(fd, tx, sizeof(tx), rx);
  568. if(len > 6)
  569. {
  570. if (len < 6+(rx[4] | rx[5]<<8))
  571. return result;
  572. chksum = 0x00;
  573. for(int idx = 0;idx<(rx[4] | rx[5]<<8);idx++)
  574. {
  575. chksum ^= rx[6+idx];
  576. }
  577. if((chksum == rx[6+(rx[4] | rx[5]<<8)]) &&
  578. (rx[2] == tx[1]) &&
  579. (rx[1] == tx[2]) &&
  580. (rx[3] == tx[3]) &&
  581. (rx[6] == tx[6]))
  582. {
  583. result = PASS;
  584. }
  585. }
  586. return result;
  587. }
  588. unsigned char Update_Start(unsigned char fd, unsigned char targetAddr, unsigned int crc32)
  589. {
  590. unsigned char result = FAIL;
  591. 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};
  592. unsigned char rx[512];
  593. unsigned char chksum = 0x00;
  594. for(int idx = 0;idx<(tx[4] | tx[5]<<8);idx++)
  595. chksum ^= tx[6+idx];
  596. tx[10] = chksum;
  597. unsigned char len = tranceive(fd, tx, sizeof(tx), rx);
  598. if(len > 6)
  599. {
  600. if (len < 6+(rx[4] | rx[5]<<8))
  601. return result;
  602. chksum = 0x00;
  603. for(int idx = 0;idx<(rx[4] | rx[5]<<8);idx++)
  604. {
  605. chksum ^= rx[6+idx];
  606. }
  607. if((chksum == rx[6+(rx[4] | rx[5]<<8)]) &&
  608. (rx[2] == tx[1]) &&
  609. (rx[1] == tx[2]) &&
  610. (rx[3] == tx[3]) &&
  611. (rx[6] == 0x00))
  612. {
  613. result = PASS;
  614. }
  615. }
  616. return result;
  617. }
  618. unsigned char Update_Abord(unsigned char fd, unsigned char targetAddr)
  619. {
  620. unsigned char result = FAIL;
  621. unsigned char tx[7] = {0xaa, 0x00, targetAddr, Cmd.update_Start, 0x04, 0x00, 0x00};
  622. unsigned char rx[512];
  623. unsigned char chksum = 0x00;
  624. unsigned char len = tranceive(fd, tx, sizeof(tx), rx);
  625. if(len > 6)
  626. {
  627. if (len < 6+(rx[4] | rx[5]<<8))
  628. return result;
  629. for(int idx = 0;idx<(rx[4] | rx[5]<<8);idx++)
  630. {
  631. chksum ^= rx[6+idx];
  632. }
  633. if((chksum == rx[6+(rx[4] | rx[5]<<8)]) &&
  634. (rx[2] == tx[1]) &&
  635. (rx[1] == tx[2]) &&
  636. (rx[3] == tx[3]) &&
  637. (rx[6] == 0x00))
  638. {
  639. result = PASS;
  640. }
  641. }
  642. return result;
  643. }
  644. unsigned char Update_Transfer(unsigned char fd, unsigned char targetAddr, unsigned int startAddr, unsigned char *data, unsigned short int length)
  645. {
  646. unsigned char result = FAIL;
  647. unsigned char tx[11 + length];
  648. unsigned char rx[512];
  649. unsigned char chksum = 0x00;
  650. tx[0] = 0xaa;
  651. tx[1] = 0x00;
  652. tx[2] = targetAddr;
  653. tx[3] = Cmd.update_Transfer;
  654. tx[4] = (4 + length) & 0xff;
  655. tx[5] = ((4 + length)>>8) & 0xff;
  656. tx[6] = (startAddr>>0) & 0xff;
  657. tx[7] = (startAddr>>8) & 0xff;
  658. tx[8] = (startAddr>>16) & 0xff;
  659. tx[9] = (startAddr>>24) & 0xff;
  660. memcpy(tx+10, data, length);
  661. for(int idx = 0;idx<(tx[4] | tx[5]<<8);idx++)
  662. chksum ^= tx[6+idx];
  663. tx[sizeof(tx)-1] = chksum;
  664. unsigned char len = tranceive(fd, tx, sizeof(tx), rx);
  665. if(len > 6)
  666. {
  667. if (len < 6+(rx[4] | rx[5]<<8))
  668. return result;
  669. for(int idx = 0;idx<(rx[4] | rx[5]<<8);idx++)
  670. {
  671. chksum ^= rx[6+idx];
  672. }
  673. if((chksum == rx[6+(rx[4] | rx[5]<<8)]) &&
  674. (rx[2] == tx[1]) &&
  675. (rx[1] == tx[2]) &&
  676. (rx[3] == tx[3]) &&
  677. (rx[6] == 0x00))
  678. {
  679. result = PASS;
  680. }
  681. }
  682. return result;
  683. }
  684. unsigned char Update_Finish(unsigned char fd, unsigned char targetAddr)
  685. {
  686. unsigned char result = FAIL;
  687. unsigned char tx[7] = {0xaa, 0x00, targetAddr, Cmd.update_Finish, 0x04, 0x00, 0x00};
  688. unsigned char rx[512];
  689. unsigned char chksum = 0x00;
  690. unsigned char len = tranceive(fd, tx, sizeof(tx), rx);
  691. if(len > 6)
  692. {
  693. if (len < 6+(rx[4] | rx[5]<<8))
  694. return result;
  695. for(int idx = 0;idx<(rx[4] | rx[5]<<8);idx++)
  696. {
  697. chksum ^= rx[6+idx];
  698. }
  699. if((chksum == rx[6+(rx[4] | rx[5]<<8)]) &&
  700. (rx[2] == tx[1]) &&
  701. (rx[1] == tx[2]) &&
  702. (rx[3] == tx[3]) &&
  703. (rx[6] == 0x00))
  704. {
  705. result = PASS;
  706. }
  707. }
  708. return result;
  709. }
  710. const int System_GPIO_Pin_Table[SYS_GPIO_NUM] =
  711. {
  712. 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,
  713. 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
  714. };
  715. void gpio_export(int pin)
  716. {
  717. char buffer[64];
  718. snprintf(buffer, sizeof(buffer), "echo %d > /sys/class/gpio/export", pin);
  719. system(buffer);
  720. }
  721. void gpio_unexport(int pin)
  722. {
  723. char buffer[64];
  724. snprintf(buffer, sizeof(buffer), "echo %d > /sys/class/gpio/unexport", pin);
  725. system(buffer);
  726. }
  727. void gpio_set_direction(int pin, unsigned char dir)
  728. {
  729. /*
  730. char buffer[64];
  731. snprintf(buffer, sizeof(buffer), "echo %s > /sys/class/gpio/gpio%d/direction", dir == GPIO_DIR_INPUT ? "in" : "out", pin);
  732. system(buffer);
  733. */
  734. int fd;
  735. char buffer[64];
  736. snprintf(buffer, sizeof(buffer), "/sys/class/gpio/gpio%d/direction", pin);
  737. fd = open(buffer, O_WRONLY);
  738. if (fd < 0)
  739. {
  740. gpio_export(pin);
  741. fd = open(buffer, O_WRONLY);
  742. if(fd < 0)
  743. {
  744. printf("\r\nFailed to open gpio%d direction for writing!", pin);
  745. return;
  746. }
  747. }
  748. write(fd, dir == GPIO_DIR_INPUT ? "in" : "out", dir == GPIO_DIR_INPUT ? 2 : 3);
  749. close(fd);
  750. }
  751. void gpio_write(int pin, unsigned char value)
  752. {
  753. char buffer[64];
  754. snprintf(buffer, sizeof(buffer), "echo %d > /sys/class/gpio/gpio%d/value", value > 0 ? 1 : 0, pin);
  755. system(buffer);
  756. }
  757. int gpio_read(int pin)
  758. {
  759. int fd, value = 0;
  760. char ch;
  761. char buffer[64];
  762. snprintf(buffer, sizeof(buffer), "/sys/class/gpio/gpio%d/value", pin);
  763. fd = open(buffer, O_RDONLY);
  764. if (fd < 0)
  765. {
  766. return -1;
  767. }
  768. if (read(fd, &ch, 4) < 0)
  769. {
  770. return -1;
  771. }
  772. value = atoi(&ch);
  773. close(fd);
  774. return value;
  775. }
  776. int adc_read(int adc_port)
  777. {
  778. int fd, value = 0;
  779. char ch[5];
  780. char buffer[64];
  781. snprintf(buffer,sizeof(buffer), "/sys/bus/iio/devices/iio:device0/in_voltage%d_raw", adc_port);
  782. fd = open(buffer, O_RDONLY);
  783. if(fd < 0)
  784. {
  785. return -1;
  786. }
  787. if(read(fd, ch, 4) < 0)
  788. {
  789. return -1;
  790. }
  791. value = atoi(ch);
  792. close(fd);
  793. return value;
  794. }
  795. void InitIO(void)
  796. {
  797. /* GPMC_AD8 => GPIO0_22 *//*ID BD1_1*/
  798. gpio_set_direction(PIN_ID_BD1_1, GPIO_DIR_INPUT);
  799. /* GPMC_AD9 => GPIO0_23 *//*ID BD1_2*/
  800. gpio_set_direction(PIN_ID_BD1_2, GPIO_DIR_INPUT);
  801. /* GPMC_AD10 => GPIO0_26 *//*IO BD1_1*/
  802. gpio_set_direction(PIN_IO_BD1_1, GPIO_DIR_OUTPUT);
  803. gpio_write(PIN_IO_BD1_1, 0);
  804. /* GPMC_AD11 => GPIO0_27 *//*IO BD1_2*/
  805. gpio_set_direction(PIN_IO_BD1_2, GPIO_DIR_OUTPUT);
  806. gpio_write(PIN_IO_BD1_2, 0);
  807. /*XDMA_EVENT_INTR0 => GPIO0_19 *//*AM_RFID_RST*/
  808. gpio_set_direction(PIN_AM_RFID_RST, GPIO_DIR_OUTPUT);
  809. gpio_write(PIN_AM_RFID_RST, 0);
  810. /*XDMA_EVENT_INTR1 => GPIO0_20 *//*AM_RFID_ICC*/
  811. gpio_set_direction(PIN_AM_RFID_ICC, GPIO_DIR_OUTPUT);
  812. gpio_write(PIN_AM_RFID_ICC, 0);
  813. /* GPMC_AD12 => GPIO1_12 *//*ID BD2_1*/
  814. gpio_set_direction(PIN_ID_BD2_1, GPIO_DIR_INPUT);
  815. /* GPMC_AD13 => GPIO1_13 *//*ID BD2_2*/
  816. gpio_set_direction(PIN_ID_BD2_2, GPIO_DIR_INPUT);
  817. /* GPMC_AD14 => GPIO1_14 *//*IO BD2_1*/
  818. gpio_set_direction(PIN_IO_BD2_1, GPIO_DIR_OUTPUT);
  819. gpio_write(PIN_IO_BD2_1, 0);
  820. /* GPMC_AD15 => GPIO1_15 *//*IO BD2_2*/
  821. gpio_set_direction(PIN_IO_BD2_2, GPIO_DIR_OUTPUT);
  822. gpio_write(PIN_IO_BD2_2, 0);
  823. /* MCASP0_AXR0 => GPIO3_16 *//*CSU board function OK indicator.*/
  824. gpio_set_direction(PIN_AM_OK_FLAG, GPIO_DIR_OUTPUT);
  825. gpio_write(PIN_AM_OK_FLAG, 0);
  826. gpio_set_direction(PIN_BOARD1_PROXIMITY, GPIO_DIR_INPUT);
  827. gpio_set_direction(PIN_BOARD2_PROXIMITY, GPIO_DIR_INPUT);
  828. }
  829. void DeInitIO(void)
  830. {
  831. gpio_unexport(PIN_ID_BD1_1);
  832. gpio_unexport(PIN_ID_BD1_2);
  833. gpio_unexport(PIN_IO_BD1_1);
  834. gpio_unexport(PIN_IO_BD1_2);
  835. gpio_unexport(PIN_AM_RFID_RST);
  836. gpio_unexport(PIN_AM_RFID_ICC);
  837. gpio_unexport(PIN_ID_BD2_1);
  838. gpio_unexport(PIN_ID_BD2_2);
  839. gpio_unexport(PIN_IO_BD2_1);
  840. gpio_unexport(PIN_IO_BD2_2);
  841. gpio_unexport(PIN_AM_OK_FLAG);
  842. }
  843. void DoIOTest(void)
  844. {
  845. InitIO();
  846. gpio_write(PIN_IO_BD1_1, 1);
  847. if(gpio_read(PIN_ID_BD1_1) == 1)
  848. {
  849. gpio_write(PIN_IO_BD1_1, 0);
  850. if(gpio_read(PIN_ID_BD1_1) == 0)
  851. {
  852. printf("\r\nID_BD1_1 Test OK");
  853. }
  854. else
  855. {
  856. printf("\r\nID_BD1_1 Low Test Fail");
  857. return;
  858. }
  859. }
  860. else
  861. {
  862. printf("\r\nID_BD1_1 High Test Fail");
  863. return;
  864. }
  865. gpio_write(PIN_IO_BD1_2, 1);
  866. if(gpio_read(PIN_ID_BD1_2) == 1)
  867. {
  868. gpio_write(PIN_IO_BD1_2, 0);
  869. if(gpio_read(PIN_ID_BD1_2) == 0)
  870. {
  871. printf("\r\nID_BD1_2 Test OK");
  872. }
  873. else
  874. {
  875. printf("\r\nID_BD1_2 Low Test Fail");
  876. return;
  877. }
  878. }
  879. else
  880. {
  881. printf("\r\nID_BD1_2 High Test Fail");
  882. return;
  883. }
  884. gpio_write(PIN_IO_BD2_1, 1);
  885. if(gpio_read(PIN_ID_BD2_1) == 1)
  886. {
  887. gpio_write(PIN_IO_BD2_1, 0);
  888. if(gpio_read(PIN_ID_BD2_1) == 0)
  889. {
  890. printf("\r\nID_BD2_1 Test OK");
  891. }
  892. else
  893. {
  894. printf("\r\nID_BD2_1 Low Test Fail");
  895. return;
  896. }
  897. }
  898. else
  899. {
  900. printf("\r\nID_BD2_1 High Test Fail");
  901. return;
  902. }
  903. gpio_write(PIN_IO_BD2_2, 1);
  904. if(gpio_read(PIN_ID_BD2_2) == 1)
  905. {
  906. gpio_write(PIN_IO_BD2_2, 0);
  907. if(gpio_read(PIN_ID_BD2_2) == 0)
  908. {
  909. printf("\r\nID_BD2_2 Test OK");
  910. }
  911. else
  912. {
  913. printf("\r\nID_BD2_2 Low Test Fail");
  914. return;
  915. }
  916. }
  917. else
  918. {
  919. printf("\r\nID_BD2_2 High Test Fail");
  920. return;
  921. }
  922. gpio_write(PIN_AM_RFID_RST, 1);
  923. if(gpio_read(PIN_BOARD1_PROXIMITY) == 1 && gpio_read(PIN_BOARD2_PROXIMITY) == 1)
  924. {
  925. gpio_write(PIN_AM_RFID_RST, 0);
  926. if(gpio_read(PIN_BOARD1_PROXIMITY) == 0 && gpio_read(PIN_BOARD2_PROXIMITY) == 0)
  927. {
  928. printf("\r\nBoard1 & Board2 Proximity Test OK");
  929. }
  930. else
  931. {
  932. printf("\r\nBoard1 & Board2 Proximity Low Test Fail");
  933. return;
  934. }
  935. }
  936. else
  937. {
  938. printf("\r\nBoard1 & Board2 Proximity High Test Fail");
  939. return;
  940. }
  941. gpio_write(PIN_AM_RFID_ICC, 1);
  942. usleep(100000);
  943. if(adc_read(ADC_AIN0) < 100 && adc_read(ADC_AIN1) < 100 && adc_read(ADC_AIN2) < 100 && adc_read(ADC_AIN3) < 100)
  944. {
  945. gpio_write(PIN_AM_RFID_ICC, 0);
  946. usleep(100000);
  947. if(adc_read(ADC_AIN0) > 4000 && adc_read(ADC_AIN1) > 4000 && adc_read(ADC_AIN2) > 4000 && adc_read(ADC_AIN3) > 4000)
  948. {
  949. printf("\r\nAIN0, AIN1, AIN2, AIN3 Test OK");
  950. }
  951. else
  952. {
  953. printf("\r\nAIN0, AIN1, AIN2, AIN3 High Test Fail");
  954. return;
  955. }
  956. }
  957. else
  958. {
  959. printf("\r\nAIN0, AIN1, AIN2, AIN3 Low Test Fail");
  960. return;
  961. }
  962. gpio_write(PIN_AM_OK_FLAG, 1);
  963. printf("\r\nIO Test Done!");
  964. printf("\r\nSuccess!\r\n");
  965. }
  966. int CreatShareMemory()
  967. {
  968. int MeterSMId;
  969. //creat ShmSysConfigAndInfo
  970. if ((MeterSMId = shmget(ShmSysConfigAndInfoKey, sizeof(struct SysConfigAndInfo), IPC_CREAT | 0777)) < 0)
  971. {
  972. #ifdef SystemLogMessage
  973. //StoreLogMsg("[main]CreatShareMemory:shmget ShmSysConfigAndInfo NG \n");
  974. #endif
  975. return 0;
  976. }
  977. else if ((ShmSysConfigAndInfo = shmat(MeterSMId, NULL, 0)) == (void *) -1)
  978. {
  979. #ifdef SystemLogMessage
  980. //StoreLogMsg("[main]CreatShareMemory:shmat ShmSysConfigAndInfo NG \n");
  981. #endif
  982. return 0;
  983. }
  984. memset(ShmSysConfigAndInfo, 0, sizeof(struct SysConfigAndInfo));
  985. /*
  986. if ((MeterSMId = shmget(ShmATEKey, sizeof(struct ATE), IPC_CREAT | 0777)) < 0)
  987. {
  988. #ifdef SystemLogMessage
  989. //StoreLogMsg("[main]CreatShareMemory:shmget ShmPrimaryMcuData NG \n");
  990. #endif
  991. return 0;
  992. }
  993. else if ((ate = shmat(MeterSMId, NULL, 0)) == (void *) -1)
  994. {
  995. #ifdef SystemLogMessage
  996. //StoreLogMsg("[main]CreatShareMemory:shmat ShmPrimaryMcuData NG \n");
  997. #endif
  998. return 0;
  999. }
  1000. memset(ate, 0, sizeof(struct ATE));
  1001. */
  1002. //creat ShmCcsData
  1003. if ((MeterSMId = shmget(ShmCcsCommKey, sizeof(struct CcsData), IPC_CREAT | 0777)) < 0){
  1004. #ifdef SystemLogMessage
  1005. //StoreLogMsg("[main]CreatShareMemory:shmget ShmCcsData NG \n");
  1006. #endif
  1007. return 0;
  1008. }
  1009. else if ((ShmCcsData = shmat(MeterSMId, NULL, 0)) == (void *) -1){
  1010. #ifdef SystemLogMessage
  1011. //StoreLogMsg("[main]CreatShareMemory:shmat ShmCcsData NG \n");
  1012. #endif
  1013. return 0;
  1014. }
  1015. memset(ShmCcsData, 0, sizeof(struct CcsData));
  1016. //creat ShmRelayModuleData
  1017. if ((MeterSMId = shmget(ShmRelayBdKey, sizeof(struct RelayModuleData), IPC_CREAT | 0777)) < 0)
  1018. {
  1019. #ifdef SystemLogMessage
  1020. //StoreLogMsg("shmget ShmRelayModuleData NG\n");
  1021. #endif
  1022. return 0;
  1023. }
  1024. else if ((ShmRelayModuleData = shmat(MeterSMId, NULL, 0)) == (void *) -1)
  1025. {
  1026. #ifdef SystemLogMessage
  1027. //StoreLogMsg("shmat ShmRelayModuleData NG\n");
  1028. #endif
  1029. return 0;
  1030. }
  1031. memset(ShmRelayModuleData, 0, sizeof(struct RelayModuleData));
  1032. return 1;
  1033. }
  1034. int InitCanBus()
  1035. {
  1036. int s0, nbytes;
  1037. struct timeval tv;
  1038. struct ifreq ifr0;
  1039. struct sockaddr_can addr0;
  1040. /*
  1041. //can0
  1042. system("/sbin/ip link set can0 down");//先將interface disable
  1043. system("/sbin/ip link set can0 type can bitrate 500000 restart-ms 100");
  1044. system("/sbin/ip link set can0 up");
  1045. */
  1046. //can1
  1047. system("/sbin/ip link set can0 down");//先將interface disable
  1048. system("/sbin/ip link set can0 type can bitrate 250000 restart-ms 100");
  1049. system("/sbin/ip link set can0 up");
  1050. s0 = socket(PF_CAN, SOCK_RAW, CAN_RAW);
  1051. tv.tv_sec = 0;
  1052. tv.tv_usec = 10000;
  1053. if(setsockopt(s0, SOL_SOCKET, SO_RCVTIMEO, (char *)&tv, sizeof(struct timeval)) < 0)
  1054. {
  1055. #ifdef SystemLogMessage
  1056. //StoreLogMsg("[CsuComm]InitCanBus:Set SO_RCVTIMEO NG");
  1057. #endif
  1058. }
  1059. nbytes = 40960;
  1060. if(setsockopt(s0, SOL_SOCKET, SO_RCVBUF, &nbytes, sizeof(int)) < 0)
  1061. {
  1062. #ifdef SystemLogMessage
  1063. //StoreLogMsg("[CsuComm]InitCanBus:Set SO_RCVBUF NG");
  1064. #endif
  1065. }
  1066. nbytes = 40960;
  1067. if(setsockopt(s0, SOL_SOCKET, SO_SNDBUF, &nbytes, sizeof(int)) < 0)
  1068. {
  1069. #ifdef SystemLogMessage
  1070. //StoreLogMsg("[CsuComm]InitCanBus:Set SO_SNDBUF NG");
  1071. #endif
  1072. }
  1073. //strcpy(ifr0.ifr_name, "can0" );
  1074. strcpy(ifr0.ifr_name, "can0" );
  1075. ioctl(s0, SIOCGIFINDEX, &ifr0); /* ifr.ifr_ifindex gets filled with that device's index */
  1076. addr0.can_family = AF_CAN;
  1077. addr0.can_ifindex = ifr0.ifr_ifindex;
  1078. bind(s0, (struct sockaddr *)&addr0, sizeof(addr0));
  1079. return s0;
  1080. }
  1081. int CHROMAInitCanBus()
  1082. {
  1083. int s0,nbytes;
  1084. struct timeval tv;
  1085. struct ifreq ifr0;
  1086. struct sockaddr_can addr0;
  1087. system("/sbin/ip link set can1 down");
  1088. system("/sbin/ip link set can1 type can bitrate 500000 restart-ms 100");
  1089. system("/sbin/ip link set can1 up");
  1090. s0 = socket(PF_CAN, SOCK_RAW, CAN_RAW);
  1091. tv.tv_sec = 0;
  1092. tv.tv_usec = 10000;
  1093. if (setsockopt(s0, SOL_SOCKET, SO_RCVTIMEO, (char *)&tv, sizeof(struct timeval)) < 0)
  1094. {
  1095. #ifdef SystemLogMessage
  1096. //DEBUG_ERROR("Set SO_RCVTIMEO NG");
  1097. #endif
  1098. }
  1099. nbytes=40960;
  1100. if (setsockopt(s0, SOL_SOCKET, SO_RCVBUF, &nbytes, sizeof(int)) < 0)
  1101. {
  1102. #ifdef SystemLogMessage
  1103. //DEBUG_ERROR("Set SO_RCVBUF NG");
  1104. #endif
  1105. }
  1106. nbytes=40960;
  1107. if (setsockopt(s0, SOL_SOCKET, SO_SNDBUF, &nbytes, sizeof(int)) < 0)
  1108. {
  1109. #ifdef SystemLogMessage
  1110. //DEBUG_ERROR("Set SO_SNDBUF NG");
  1111. #endif
  1112. }
  1113. strcpy(ifr0.ifr_name, "can1" );
  1114. ioctl(s0, SIOCGIFINDEX, &ifr0); /* ifr.ifr_ifindex gets filled with that device's index */
  1115. addr0.can_family = AF_CAN;
  1116. addr0.can_ifindex = ifr0.ifr_ifindex;
  1117. bind(s0, (struct sockaddr *)&addr0, sizeof(addr0));
  1118. return s0;
  1119. }
  1120. int DiffTimeb(struct timeb ST, struct timeb ET)
  1121. {
  1122. //return milli-second
  1123. unsigned int StartTime,StopTime;
  1124. StartTime=(unsigned int)ST.time;
  1125. StopTime=(unsigned int)ET.time;
  1126. //return (StopTime-StartTime)*1000+ET.millitm-ST.millitm;
  1127. return (StopTime-StartTime);
  1128. }
  1129. unsigned short MaxValue(unsigned short value1, unsigned short value2)
  1130. {
  1131. return value1 >= value2 ? value1 : value2;
  1132. }
  1133. unsigned char isATEChange(unsigned char gun_index)
  1134. {
  1135. unsigned char result = NO;
  1136. if(chargingInfo[gun_index]->SystemStatus != chargingInfo[gun_index]->PreviousSystemStatus)
  1137. {
  1138. result = YES;
  1139. chargingInfo[gun_index]->PreviousSystemStatus = chargingInfo[gun_index]->SystemStatus;
  1140. }
  1141. return result;
  1142. }
  1143. unsigned char isATEChange(unsigned char gun_index)
  1144. {
  1145. unsigned char result = NO;
  1146. if(chargingInfo[gun_index]->ATEState != chargingInfo[gun_index]->PreviousATEState)
  1147. {
  1148. result = YES;
  1149. chargingInfo[gun_index]->PreviousATEState = chargingInfo[gun_index]->ATEState;
  1150. }
  1151. return result;
  1152. }
  1153. unsigned char isModeChange(unsigned char gun_index)
  1154. {
  1155. unsigned char result = NO;
  1156. if(chargingInfo[gun_index]->SystemStatus != chargingInfo[gun_index]->PreviousSystemStatus)
  1157. {
  1158. result = YES;
  1159. chargingInfo[gun_index]->PreviousSystemStatus = chargingInfo[gun_index]->SystemStatus;
  1160. }
  1161. return result;
  1162. }
  1163. unsigned char checkMode(byte gun_index, byte mode)
  1164. {
  1165. unsigned char result = NO;
  1166. if(chargingInfo[gun_index]->SystemStatus != mode)
  1167. {
  1168. result = YES;
  1169. }
  1170. return result;
  1171. }
  1172. void setChargerMode(byte gun_index, byte mode)
  1173. {
  1174. chargingInfo[gun_index]->SystemStatus = mode;
  1175. }
  1176. void setATEMode(byte gun_index, byte mode)
  1177. {
  1178. chargingInfo[gun_index]->ATEState = mode;
  1179. }
  1180. void setStatusMode(byte gun_index, byte mode)
  1181. {
  1182. chargingInfo[gun_index]->ATEStatus = mode;
  1183. }
  1184. unsigned char isStatusChange(unsigned char gun_index)
  1185. {
  1186. unsigned char result = NO;
  1187. if(chargingInfo[gun_index]->ATEStatus != chargingInfo[gun_index]->PreviousATEStatus)
  1188. {
  1189. result = YES;
  1190. chargingInfo[gun_index]->PreviousATEStatus = chargingInfo[gun_index]->ATEStatus;
  1191. }
  1192. return result;
  1193. }
  1194. // AC 三相輸入電壓
  1195. void GetPresentInputVol()
  1196. {
  1197. if (Query_Present_InputVoltage(Uart5Fd, Addr.Relay, &inputVoltage) == PASS)
  1198. {
  1199. // resolution : 0.1
  1200. // printf("InputVoltageR = %f \n", inputVoltage.L1N_L12);
  1201. // printf("InputVoltageS = %f \n", inputVoltage.L2N_L23);
  1202. // printf("InputVoltageT = %f \n", inputVoltage.L3N_L31);
  1203. ShmRelayModuleData->InputL1Volt = inputVoltage.L1N_L12;
  1204. ShmRelayModuleData->InputL2Volt = inputVoltage.L2N_L23;
  1205. ShmRelayModuleData->InputL3Volt = inputVoltage.L3N_L31;
  1206. //********************************************************************************************************//
  1207. // VIN < 170
  1208. if (inputVoltage.L1N_L12 < VIN_MIN_VOLTAGE)
  1209. {
  1210. ShmStatusCodeData->AlarmCode.AlarmEvents.bits.SystemL1InputUVP = 0x01;
  1211. }
  1212. if (inputVoltage.L2N_L23 < VIN_MIN_VOLTAGE)
  1213. {
  1214. ShmStatusCodeData->AlarmCode.AlarmEvents.bits.SystemL2InputUVP = 0x01;
  1215. }
  1216. if (inputVoltage.L3N_L31 < VIN_MIN_VOLTAGE)
  1217. {
  1218. ShmStatusCodeData->AlarmCode.AlarmEvents.bits.SystemL3InputUVP = 0x01;
  1219. }
  1220. //********************************************************************************************************//
  1221. // VIN > 250
  1222. if (inputVoltage.L1N_L12 > VIN_MAX_VOLTAGE)
  1223. {
  1224. ShmStatusCodeData->AlarmCode.AlarmEvents.bits.SystemL1InputOVP = 0x01;
  1225. }
  1226. if (inputVoltage.L2N_L23 > VIN_MAX_VOLTAGE)
  1227. {
  1228. ShmStatusCodeData->AlarmCode.AlarmEvents.bits.SystemL2InputOVP = 0x01;
  1229. }
  1230. if (inputVoltage.L3N_L31 > VIN_MAX_VOLTAGE)
  1231. {
  1232. ShmStatusCodeData->AlarmCode.AlarmEvents.bits.SystemL3InputOVP = 0x01;
  1233. }
  1234. //********************************************************************************************************//
  1235. // VIN < 150
  1236. if (inputVoltage.L1N_L12 < VIN_DROP_VOLTAGE)
  1237. {
  1238. ShmStatusCodeData->AlarmCode.AlarmEvents.bits.SystemL1InputDrop = 0x01;
  1239. }
  1240. if (inputVoltage.L2N_L23 < VIN_DROP_VOLTAGE)
  1241. {
  1242. ShmStatusCodeData->AlarmCode.AlarmEvents.bits.SystemL2InputDrop = 0x01;
  1243. }
  1244. if (inputVoltage.L3N_L31 < VIN_DROP_VOLTAGE)
  1245. {
  1246. ShmStatusCodeData->AlarmCode.AlarmEvents.bits.SystemL3InputDrop = 0x01;
  1247. }
  1248. }
  1249. }
  1250. // 左右槍的 Relay 前後的輸出電壓
  1251. void GetPersentOutputVol()
  1252. {
  1253. if (Query_Present_OutputVoltage(Uart5Fd, Addr.Relay, &outputVoltage) == PASS)
  1254. {
  1255. printf("Conn1 fuse 1 = %f \n", outputVoltage.behindFuse_Voltage_C1);
  1256. printf("Conn1 relay 1 = %f \n", outputVoltage.behindRelay_Voltage_C1);
  1257. printf("Conn2 fuse 2 = %f \n", outputVoltage.behindFuse_Voltage_C2);
  1258. printf("Conn2 relay 2 = %f \n", outputVoltage.behindRelay_Voltage_C2);
  1259. ShmRelayModuleData->Gun1FuseOutputVolt = outputVoltage.behindFuse_Voltage_C1;
  1260. ShmRelayModuleData->Gun1RelayOutputVolt = outputVoltage.behindRelay_Voltage_C1;
  1261. ShmRelayModuleData->Gun2FuseOutputVolt = outputVoltage.behindFuse_Voltage_C2;
  1262. ShmRelayModuleData->Gun2RelayOutputVolt = outputVoltage.behindRelay_Voltage_C2;
  1263. printf("FuseChargingVoltage 1 = %d \n", ShmRelayModuleData->Gun1FuseOutputVolt);
  1264. printf("FuseChargingVoltage 2 = %d \n", ShmRelayModuleData->Gun1RelayOutputVolt);
  1265. printf("FuseChargingVoltage 1 = %d \n", ShmRelayModuleData->Gun2FuseOutputVolt);
  1266. printf("FuseChargingVoltage 2 = %d \n", ShmRelayModuleData->Gun2RelayOutputVolt);
  1267. /*
  1268. for (int index = 0; index < gunCount; index++)
  1269. {
  1270. if (index == 0)
  1271. {
  1272. if (chargingInfo[index]->Evboard_id == 0x01)
  1273. {
  1274. chargingInfo[index]->FuseChargingVoltage = ShmRelayModuleData->Gun1FuseOutputVolt;
  1275. chargingInfo[index]->FireChargingVoltage = ShmRelayModuleData->Gun1RelayOutputVolt;
  1276. }
  1277. else if (chargingInfo[index]->Evboard_id == 0x02)
  1278. {
  1279. chargingInfo[index]->FuseChargingVoltage = ShmRelayModuleData->Gun2FuseOutputVolt;
  1280. chargingInfo[index]->FireChargingVoltage = ShmRelayModuleData->Gun2RelayOutputVolt;
  1281. }
  1282. }
  1283. else if (index == 1)
  1284. {
  1285. chargingInfo[index]->FuseChargingVoltage = ShmRelayModuleData->Gun2FuseOutputVolt;
  1286. chargingInfo[index]->FireChargingVoltage = ShmRelayModuleData->Gun2RelayOutputVolt;
  1287. }*/
  1288. /*
  1289. unsigned short Ovp = 0;
  1290. unsigned short Ocp = 0;
  1291. //Ovp = MIN [VOUT_MAX_VOLTAGE, EV_BATTERY_VOLTAGE] // 最大輸出電壓與電池電壓最大值
  1292. //Ocp = MIN [IOUT_MAX_CURRENT, EV_CURRENT_REQ] // 最大輸出電流與需求電流最小值
  1293. if (chargingInfo[index]->Type == _Type_Chademo)
  1294. {
  1295. Ovp = MaxValue(chargingInfo[index]->MaximumChargingVoltage, chargingInfo[index]->EvBatteryMaxVoltage);
  1296. Ocp = MaxValue(chargingInfo[index]->PresentChargingCurrent, ShmCHAdeMOData->ev[chargingInfo[index]->type_index].ChargingCurrentRequest);
  1297. if (chargingInfo[index]->FireChargingVoltage >= Ovp)
  1298. {
  1299. //ShmStatusCodeData->AlarmCode.AlarmEvents.bits.SystemChademoOutputOVP = 0x01;
  1300. }
  1301. if (chargingInfo[index]->PresentChargingCurrent >= Ocp)
  1302. {
  1303. //ShmStatusCodeData->AlarmCode.AlarmEvents.bits.SystemChademoOutputOCP = 0x01;
  1304. }
  1305. }
  1306. else if (chargingInfo[index]->Type == _Type_CCS)
  1307. {
  1308. }
  1309. */
  1310. //}
  1311. }
  1312. }
  1313. bool FindChargingInfoData(byte target, struct ChargingInfoData **chargingData)
  1314. {
  1315. for (byte index = 0; index < CHAdeMO_QUANTITY; index++)
  1316. {
  1317. if (ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].Index == target)
  1318. {
  1319. chargingData[target] = &ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index];
  1320. return true;
  1321. }
  1322. }
  1323. for (byte index = 0; index < CCS_QUANTITY; index++)
  1324. {
  1325. if (ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].Index == target)
  1326. {
  1327. chargingData[target] = &ShmSysConfigAndInfo->SysInfo.CcsChargingData[index];
  1328. return true;
  1329. }
  1330. }
  1331. for (byte index = 0; index < GB_QUANTITY; index++)
  1332. {
  1333. if (ShmSysConfigAndInfo->SysInfo.GbChargingData[index].Index == target)
  1334. {
  1335. chargingData[target] = &ShmSysConfigAndInfo->SysInfo.GbChargingData[index];
  1336. return true;
  1337. }
  1338. }
  1339. return false;
  1340. }
  1341. // relay 的狀態
  1342. void CheckRelayOutput(byte index)
  1343. {
  1344. if (index == 0)
  1345. {
  1346. //printf("=====%d\n",chargingInfo[index]->Evboard_id);
  1347. if (chargingInfo[index]->Evboard_id == 0x01)
  1348. {
  1349. if (regRelay.relay_event.bits.Gun1_N == YES && regRelay.relay_event.bits.Gun1_P == YES)
  1350. chargingInfo[0]->RelayK1K2Status = YES;
  1351. else
  1352. chargingInfo[0]->RelayK1K2Status = NO;
  1353. if (regRelay.relay_event.bits.Gun1_N == YES && regRelay.relay_event.bits.CCS_Precharge == YES)
  1354. chargingInfo[0]->RelayKPK2Status = YES;
  1355. else
  1356. chargingInfo[0]->RelayKPK2Status = NO;
  1357. }
  1358. else if (chargingInfo[index]->Evboard_id == 0x02)
  1359. {
  1360. if (regRelay.relay_event.bits.Gun2_N == YES && regRelay.relay_event.bits.Gun2_P == YES)
  1361. chargingInfo[0]->RelayK1K2Status = YES;
  1362. else
  1363. chargingInfo[0]->RelayK1K2Status = NO;
  1364. if (regRelay.relay_event.bits.Gun2_N == YES && regRelay.relay_event.bits.CCS_Precharge == YES)
  1365. chargingInfo[0]->RelayKPK2Status = YES;
  1366. else
  1367. chargingInfo[0]->RelayKPK2Status = NO;
  1368. }
  1369. }
  1370. else if (index == 1)
  1371. {
  1372. if (regRelay.relay_event.bits.Gun2_N == YES && regRelay.relay_event.bits.Gun2_P == YES)
  1373. chargingInfo[1]->RelayK1K2Status = YES;
  1374. else
  1375. chargingInfo[1]->RelayK1K2Status = NO;
  1376. if (regRelay.relay_event.bits.Gun2_N == YES && regRelay.relay_event.bits.CCS_Precharge == YES)
  1377. chargingInfo[1]->RelayKPK2Status = YES;
  1378. else
  1379. chargingInfo[1]->RelayKPK2Status = NO;
  1380. }
  1381. }
  1382. void SetOutputGpio(byte flash)
  1383. {
  1384. Gpio_out gpio;
  1385. gpio.Button_LED[0] = 0x00;
  1386. gpio.Button_LED[1] = 0x00;
  1387. gpio.System_LED[0] = flash;
  1388. gpio.System_LED[1] = 0x00;
  1389. gpio.System_LED[2] = 0x00;
  1390. gpio.System_LED[3] = flash;
  1391. gpio.AC_Connector = 0x00;
  1392. gpio.AC_Breaker = 0x00;
  1393. if (Config_Gpio_Output(Uart1Fd, Addr.IoExtend, &gpio) == PASS)
  1394. {
  1395. //PRINTF_FUNC("SetOutputGpio sucessfully. %d \n", flash);
  1396. }
  1397. else
  1398. {
  1399. //PRINTF_FUNC("SetOutputGpio fail. \n");
  1400. }
  1401. }
  1402. //==========================================
  1403. // Common Function
  1404. //==========================================
  1405. void SetEvContactorRelayStatus(byte index)
  1406. {
  1407. // 為安全起見~ 切換該槍 relay 的條件一是 relay 前後電壓須都要小於 10V
  1408. // 除了做完 CCS 端的 Precharge,因為在做完 Precharge後,車端會直接直接準備拉載,輸出並不會降低
  1409. // 另一個是 Complete 狀態,因為火線上的電壓有可能是來自車端電池電壓,導致火線上的電壓並不會降下來
  1410. // 於此同時,只要判斷火線上的電流低於 1A 來判斷 Relay 可鬆開
  1411. /*
  1412. if (chargingInfo[index]->SystemStatus != V_ISOLATION &&
  1413. chargingInfo[index]->SystemStatus != S_COMPLETE )
  1414. {
  1415. if (index == 0 && (ShmRelayModuleData->Gun1FuseOutputVolt > 600 || ShmRelayModuleData->Gun1RelayOutputVolt > 600))
  1416. {
  1417. return;
  1418. }
  1419. }
  1420. */
  1421. if(ShmSysConfigAndInfo->ate.ATEState == 1){
  1422. if(chargingInfo[index]->SystemStatus >= V_ISOLATION){
  1423. if(chargingInfo[index]->Evboard_id == 0x01)
  1424. {
  1425. // 先搭 D-
  1426. if (outputRelay.relay_event.bits.Gun1_N == 0x00)
  1427. outputRelay.relay_event.bits.Gun1_N = 0x01;
  1428. else
  1429. outputRelay.relay_event.bits.Gun1_P = 0x01;
  1430. if (outputRelay.relay_event.bits.Gun2_N == 0x00)
  1431. outputRelay.relay_event.bits.Gun2_N = 0x01;
  1432. else
  1433. outputRelay.relay_event.bits.Gun2_P = 0x01;
  1434. flash = YES;
  1435. SetOutputGpio(flash);
  1436. }
  1437. }else{
  1438. if (chargingInfo[index]->Evboard_id == 0x01)
  1439. {
  1440. // 先釋放 D+
  1441. if (outputRelay.relay_event.bits.Gun1_P == 0x01)
  1442. outputRelay.relay_event.bits.Gun1_P = 0x00;
  1443. else
  1444. outputRelay.relay_event.bits.Gun1_N = 0x00;
  1445. if (outputRelay.relay_event.bits.Gun2_P == 0x01)
  1446. outputRelay.relay_event.bits.Gun2_P = 0x00;
  1447. else
  1448. outputRelay.relay_event.bits.Gun2_N = 0x00;
  1449. flash = NO;
  1450. SetOutputGpio(flash);
  1451. }
  1452. }
  1453. }else if(ShmSysConfigAndInfo->ate.ATEState == 2){
  1454. if(ShmSysConfigAndInfo->ate.chademo.id0D_req.K1K2Status == 1){
  1455. if(chargingInfo[index]->Evboard_id == 0x01){
  1456. if (outputRelay.relay_event.bits.Gun1_Parallel_N == 0x00)
  1457. outputRelay.relay_event.bits.Gun1_Parallel_N = 0x01;
  1458. else
  1459. outputRelay.relay_event.bits.Gun1_Parallel_P = 0x01;
  1460. flash = YES;
  1461. SetOutputGpio(flash);
  1462. }
  1463. }else{
  1464. if (chargingInfo[index]->Evboard_id == 0x01){
  1465. if (outputRelay.relay_event.bits.Gun1_Parallel_P == 0x01)
  1466. outputRelay.relay_event.bits.Gun1_Parallel_P = 0x00;
  1467. else
  1468. outputRelay.relay_event.bits.Gun1_Parallel_N = 0x00;
  1469. flash = NO;
  1470. SetOutputGpio(flash);
  1471. }
  1472. }
  1473. }
  1474. }
  1475. int PackageIdCmd(int cmd)
  1476. {
  1477. return cmd | 0x80000000;
  1478. }
  1479. void SendCmdToEvboard(int canfd, int cmd, byte *data, byte dataLen)
  1480. {
  1481. struct can_frame frame;
  1482. frame.can_id = PackageIdCmd(cmd);//(0x00001000 + cmd) | 0x80000000;//(cmd | 0x80000000);
  1483. frame.can_dlc = dataLen;
  1484. memcpy(frame.data, data, sizeof(frame.data));
  1485. write(canfd, &frame, sizeof(struct can_frame));
  1486. usleep(2000);
  1487. }
  1488. void setBootNotification1(){
  1489. byte data[8];
  1490. data[0] = 0x02;
  1491. data[1] = 0x02;
  1492. data[2] = 0x02;
  1493. data[3] = 0x02;
  1494. data[4] = 0x03;
  1495. data[5] = 0x03;
  1496. data[6] = 0x03;
  1497. data[7] = 0x03;
  1498. SendCmdToEvboard(CanFd2, bn1, data, sizeof(data));
  1499. }
  1500. void setBootNotification2(){
  1501. byte data[8];
  1502. data[0] = 0x04;
  1503. data[1] = 0x04;
  1504. data[2] = 0x04;
  1505. data[3] = 0x04;
  1506. data[4] = 0x05;
  1507. data[5] = 0x05;
  1508. data[6] = 0x05;
  1509. data[7] = 0x05;
  1510. SendCmdToEvboard(CanFd2, bn2, data, sizeof(data));
  1511. }
  1512. void setEVStatus1(byte evstatus){
  1513. byte data[1];
  1514. data[0] = evstatus;
  1515. SendCmdToEvboard(CanFd2, EVStatus1, data, sizeof(data));
  1516. }
  1517. void setEVStatus2(){
  1518. byte data[1];
  1519. data[0] = 0x02;
  1520. SendCmdToEvboard(CanFd2, EVStatus2, data, sizeof(data));
  1521. }
  1522. void GetFirmwareVersion(byte gun_index, byte toId)
  1523. {
  1524. int id = PackageIdCmd(Ev_Cmd.get_firmware_ver + toId);
  1525. byte data[8];
  1526. SendCmdToEvboard(CanFd, id, data, 0);
  1527. }
  1528. void GetHardwareVersion(byte gun_index, byte toId)
  1529. {
  1530. int id = PackageIdCmd(Ev_Cmd.get_hardware_ver + toId);
  1531. byte data[8];
  1532. SendCmdToEvboard(CanFd, id, data, 0);
  1533. }
  1534. void SetChargingPermission(byte gun_index, byte permissionStatus, short aOutputPw, short aOutputCur, short aOutputVol, byte toId)
  1535. {
  1536. int id = PackageIdCmd(Ev_Cmd.charging_permission + toId);
  1537. byte data[8];
  1538. data[0] = permissionStatus;
  1539. data[1] = aOutputPw & 0xff;
  1540. data[2] = (aOutputPw >> 8) & 0xff;
  1541. data[3] = aOutputCur & 0xff;
  1542. data[4] = (aOutputCur >> 8) & 0xff;
  1543. data[5] = aOutputVol & 0xff;
  1544. data[6] = (aOutputVol >> 8) & 0xff;
  1545. data[7] = 0xff;
  1546. //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] );
  1547. SendCmdToEvboard(CanFd, id, data, sizeof(data));
  1548. }
  1549. void GetMiscellaneousInfo(byte gun_index, byte toId, short K1K2Status, short soc)
  1550. {
  1551. int id = PackageIdCmd(Ev_Cmd.get_miscellaneous_info + toId);
  1552. byte data[8];
  1553. data[0] = 0x01;
  1554. data[1] = 0x02;
  1555. data[2] = 0x03;
  1556. data[3] = 0x04;
  1557. data[4] = 0x05;
  1558. data[5] = K1K2Status & 0xff;
  1559. data[6] = soc & 0xff;
  1560. data[7] = 0x08;
  1561. //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] );
  1562. /*
  1563. data[1] = 0x0001;
  1564. data[2] = 0x0001;
  1565. data[3] = 0x10;
  1566. data[4] = 0x10;
  1567. */
  1568. SendCmdToEvboard(CanFd, id, data, sizeof(data));
  1569. }
  1570. void setMisc(byte toId){
  1571. float K1K2Status = 0;
  1572. float soc = 0;
  1573. K1K2Status = ShmSysConfigAndInfo->ate.chademo.id0D_req.K1K2Status;
  1574. soc = ShmSysConfigAndInfo->ate.chademo.id0D_req.Soc;
  1575. GetMiscellaneousInfo(0, toId, K1K2Status, soc);
  1576. }
  1577. void SetPresentInputPower(short outputVol_b1, short outputCur_b1, byte toId)
  1578. {
  1579. int id = PackageIdCmd(Ev_Cmd.present_input_power + toId);
  1580. byte data[8];
  1581. data[0] = outputVol_b1 & 0xff;
  1582. data[1] = (outputVol_b1 >> 8) & 0xff;
  1583. data[2] = outputCur_b1 & 0xff;
  1584. data[3] = (outputCur_b1 >> 8) & 0xff;
  1585. /*
  1586. data[4] = outputVol_b2 & 0xff;
  1587. data[5] = (outputVol_b2 >> 8) & 0xff;
  1588. data[6] = outputCur_b2 & 0xff;
  1589. data[7] = (outputCur_b2 >> 8) & 0xff;
  1590. */
  1591. //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] );
  1592. SendCmdToEvboard(CanFd, id, data, sizeof(data));
  1593. }
  1594. void SetPresentInputRequirement(short aOutputPw_b1, short aOutputCur_b1, short aOutputPw_b2, short aOutputCur_b2, byte toId)
  1595. {
  1596. int id = PackageIdCmd(Ev_Cmd.present_input_requirement + toId );
  1597. byte data[8];
  1598. data[0] = aOutputPw_b1 & 0xff;
  1599. data[1] = (aOutputPw_b1 >> 8) & 0xff;
  1600. data[2] = aOutputCur_b1 & 0xff;
  1601. data[3] = (aOutputCur_b1 >> 8) & 0xff;
  1602. data[4] = aOutputPw_b2 & 0xff;
  1603. data[5] = (aOutputPw_b2 >> 8) & 0xff;
  1604. data[6] = aOutputCur_b2 & 0xff;
  1605. data[7] = 0x01;
  1606. /*
  1607. data[6] = aOutputCur_b2 & 0xff;
  1608. data[7] = (aOutputCur_b2 >> 8) & 0xff;
  1609. */
  1610. //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] );
  1611. SendCmdToEvboard(CanFd, id, data, sizeof(data));
  1612. }
  1613. void GetEvseOutputStatus(byte gun_index, byte toId)
  1614. {
  1615. int id = PackageIdCmd(Ev_Cmd.get_evse_output_status + toId);
  1616. byte data[8];
  1617. SendCmdToEvboard(CanFd, id, data, 0);
  1618. }
  1619. void GetEvseCapacityInfo(byte gun_index, byte toId)
  1620. {
  1621. int id = PackageIdCmd(Ev_Cmd.get_evse_capacity_info + toId);
  1622. byte data[8];
  1623. SendCmdToEvboard(CanFd, id, data, 0);
  1624. }
  1625. void EvseStopChargingEvent(byte stopResult, byte *stopReason, byte toId)
  1626. {
  1627. int id = PackageIdCmd(Ev_Cmd.evse_stop_charging + toId);
  1628. byte data[8];
  1629. data[0] = stopResult;
  1630. data[1] = *stopReason;
  1631. data[2] = *(stopReason + 1);
  1632. data[3] = *(stopReason + 2);
  1633. data[4] = *(stopReason + 3);
  1634. data[5] = *(stopReason + 4);
  1635. data[6] = *(stopReason + 5);
  1636. SendCmdToEvboard(CanFd, id, data, sizeof(data));
  1637. }
  1638. void SetIsolationStatus(byte gun_index, byte result, byte toId)
  1639. {
  1640. int id = PackageIdCmd(Ev_Cmd.isolation_status + toId);
  1641. byte data[8];
  1642. data[0] = result;
  1643. SendCmdToEvboard(CanFd, id, data, 1);
  1644. }
  1645. void SetEvsePrechargeInfo(byte gun_index, byte result, byte toId)
  1646. {
  1647. int id = PackageIdCmd(Ev_Cmd.evse_precharge_info + toId);
  1648. byte data[8];
  1649. data[0] = result;
  1650. SendCmdToEvboard(CanFd, id, data, 1);
  1651. }
  1652. void handleEmulatorFaultStatus(){
  1653. setEVStatus2(evstaus[4]);
  1654. ShmSysConfigAndInfo->ate.Permission = STOP;
  1655. setStatusMode(CCS_QUANTITY, ShmSysConfigAndInfo->ate.Permission);
  1656. ShmSysConfigAndInfo->ate.ATEStatus = 0x00;
  1657. EvseStopChargingEvent(normalStop, stopReason, 1);
  1658. SetChargingPermission(CCS_QUANTITY, ShmSysConfigAndInfo->ate.Permission, ShmSysConfigAndInfo->ate.TotalBatteryCap,
  1659. ShmSysConfigAndInfo->ate.MaxBatteryCurrent, ShmSysConfigAndInfo->ate.MaxBatteryVoltage, 1);
  1660. }
  1661. int SpawnTask()
  1662. {
  1663. system("/root/Module_VCCU &");
  1664. return PASS;
  1665. }
  1666. void KillTask()
  1667. {
  1668. system("killall Module_VCCU");
  1669. }
  1670. int bitExtracted(byte number, int k, int p)
  1671. {
  1672. return (((1 << k) - 1) & (number >> (p - 1)));
  1673. }
  1674. unsigned short bitextract(unsigned short value, int begin, int end)
  1675. {
  1676. unsigned short mask = (1 << (end - begin)) - 1;
  1677. return (value >> begin) & mask;
  1678. }
  1679. //接收can
  1680. void CANReceiver()
  1681. {
  1682. pid_t canRecPid;
  1683. canRecPid = fork();
  1684. if(canRecPid > 0){
  1685. int nbytes;
  1686. struct can_frame frame;
  1687. int intCmd;
  1688. while (1){
  1689. //清空 canbus recever buf
  1690. memset(&frame, 0, sizeof(struct can_frame));
  1691. //讀取 canbus 是否有接收到封包
  1692. nbytes = read(CanFd, &frame, sizeof(struct can_frame));
  1693. //如果有收到 canbus 封包
  1694. if (nbytes > 0){
  1695. intCmd = (int) (frame.can_id & CAN_EFF_MASK);//extended frame format
  1696. #ifdef Debug
  1697. //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] );
  1698. //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] );
  1699. #endif
  1700. //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] );
  1701. //printf("Ack none defined. intCmd = %08x \n", intCmd);
  1702. switch (intCmd){
  1703. case VCCU_ChargeFromVehicleId:{
  1704. //memcpy(&ShmSysConfigAndInfo->ate.vccu.chargeFromVehicle, &frame.data, frame.can_dlc);
  1705. ShmSysConfigAndInfo->ate.vccu.chargeFromVehicle.VCCU_Vehicle_ContactorVoltage = ((short) frame.data[1] << 8) + (short) frame.data[0];
  1706. ShmSysConfigAndInfo->ate.vccu.chargeFromVehicle.VCCU_Vehicle_LinkVoltage = ((short) frame.data[3] << 8) + (short) frame.data[2];
  1707. ShmSysConfigAndInfo->ate.vccu.chargeFromVehicle.DATA.bits.VCCU_Vehicle_IsolationMeasurem = bitextract(frame.data[4],0, 2);//((short) frame.data[4] >> 0)+((short) frame.data[4] >> 1);//((short) frame.data[4] << 2);
  1708. ShmSysConfigAndInfo->ate.vccu.chargeFromVehicle.DATA.bits.VCCU_Vehicle_PlugLockPermissio = bitextract(frame.data[4],2, 4);//((short) frame.data[4] >> 2)+((short) frame.data[4] >> 3);
  1709. ShmSysConfigAndInfo->ate.vccu.chargeFromVehicle.DATA.bits.VCCU_Vehicle_PlugUnlockPermiss = bitextract(frame.data[4],4, 6);//((short) frame.data[4] >> 4)+((short) frame.data[4] >> 5);
  1710. ShmSysConfigAndInfo->ate.vccu.chargeFromVehicle.DATA.bits.VCCU_Vehicle_ChargePermission = bitextract(frame.data[4],6, 8);//((short) frame.data[4] >> 6)+((short) frame.data[4] >> 7);
  1711. ShmSysConfigAndInfo->ate.vccu.chargeFromVehicle.bits.VCCU_Vehicle_ContactorStatus = bitextract(frame.data[5],0, 2);
  1712. //memset(&ShmSysConfigAndInfo->ate.vccu.chargeFromVehicle,*frame.data, frame.can_dlc);
  1713. //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] );
  1714. break;
  1715. }
  1716. case VCCU_ControlPilotStatusId:{
  1717. //memcpy(&ShmSysConfigAndInfo->ate.vccu.controlPilotStatus, &frame.data, frame.can_dlc);
  1718. ShmSysConfigAndInfo->ate.vccu.controlPilotStatus.ControlPilot_Frequency.bits.VCCU_ControlPilot_Frequency = ((short) frame.data[1] << 8) + (short) frame.data[0];
  1719. ShmSysConfigAndInfo->ate.vccu.controlPilotStatus.ControlPilot_DutyCycle.bits.value = ((short) frame.data[2] ) ;
  1720. ShmSysConfigAndInfo->ate.vccu.controlPilotStatus.ControlPilot_Voltage.bits.value = ((short) frame.data[3] << 8) + (short) frame.data[4];
  1721. ShmSysConfigAndInfo->ate.vccu.controlPilotStatus.DATA.bits.VCCU_ControlPilot_Wakeup = bitextract(((short) (frame.data[5])), 0, 2);
  1722. ShmSysConfigAndInfo->ate.vccu.controlPilotStatus.DATA.bits.VCCU_ChargeUnit_Mode = bitextract(frame.data[5],2, 5);
  1723. ShmSysConfigAndInfo->ate.vccu.controlPilotStatus.DATA.bits.VCCU_ChargeUnit_State = bitextract(((short) (frame.data[5])), 5, 8);
  1724. ShmSysConfigAndInfo->ate.vccu.controlPilotStatus.ChargeUnit_MaxCurrent = ((short) frame.data[6] );
  1725. //memset(&ShmSysConfigAndInfo->ate.vccu.controlPilotStatus.ControlPilot_Voltage,frame.data[5], frame.can_dlc);
  1726. //printf("VCCU_ControlPilotStatus Get-INFYPWR-Msg : %08x - %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] );
  1727. break;
  1728. }
  1729. case VCCU_V2G_StateMId:{
  1730. //memcpy(&ShmSysConfigAndInfo->ate.vccu.v2g_StateM, &frame.data, frame.can_dlc);
  1731. ShmSysConfigAndInfo->ate.vccu.v2g_StateM.VCCU_V2G_StateM_EnergyTransfer = (short) frame.data[0];
  1732. ShmSysConfigAndInfo->ate.vccu.v2g_StateM.VCCU_V2G_StateM_StateMachineEr = (short) frame.data[1];
  1733. ShmSysConfigAndInfo->ate.vccu.v2g_StateM.VCCU_V2G_StateM_StateMachineMe = (short) frame.data[2];
  1734. ShmSysConfigAndInfo->ate.vccu.v2g_StateM.VCCU_V2G_StateM_StateMachineSt = (short) frame.data[3];
  1735. ShmSysConfigAndInfo->ate.vccu.v2g_StateM.DATA.bits.VCCU_V2G_StateM_InternetAvaila = bitextract(frame.data[4],0, 1);
  1736. ShmSysConfigAndInfo->ate.vccu.v2g_StateM.DATA.bits.VCCU_V2G_Appl_SccChargeModeReq = bitextract(frame.data[4],1, 4);
  1737. ShmSysConfigAndInfo->ate.vccu.v2g_StateM.DATA.bits.VCCU_V2G_Appl_SccFuncModeReq = bitextract(frame.data[4],4, 6);
  1738. //memset(&ShmSysConfigAndInfo->ate.vccu.v2g_StateM.VCCU_V2G_StateM_StateMachineSt,*frame.data, frame.can_dlc);
  1739. //printf("VCCU_ControlPilotStatus 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] );
  1740. break;
  1741. }
  1742. case VCCU_InletStatusId:{
  1743. //memcpy(&ShmSysConfigAndInfo->ate.vccu.inletStatus, &frame.data, frame.can_dlc);
  1744. ShmSysConfigAndInfo->ate.vccu.inletStatus.VCCU_POSFeedback_Voltage = ((short) frame.data[1] << 8) + (short) frame.data[0];
  1745. ShmSysConfigAndInfo->ate.vccu.inletStatus.DATA2.VCCU_PlugPresent_SelfDiagnosti = bitextract(frame.data[2],0, 3);
  1746. ShmSysConfigAndInfo->ate.vccu.inletStatus.DATA2.VCCU_PlugPresent_Resistance = bitextract(frame.data[2],3, 6);
  1747. ShmSysConfigAndInfo->ate.vccu.inletStatus.DATA2.VCCU_PlugPresent_Status = bitextract(frame.data[2],6, 8);
  1748. ShmSysConfigAndInfo->ate.vccu.inletStatus.DATA3.VCCU_PlugPresent_Wakeup = bitextract(frame.data[3],0, 2);
  1749. ShmSysConfigAndInfo->ate.vccu.inletStatus.DATA3.VCCU_POSFeedback_SelfDiagnosti = bitextract(frame.data[3],2, 5);
  1750. ShmSysConfigAndInfo->ate.vccu.inletStatus.DATA3.VCCU_PlugLock_MotorStatus = bitextract(frame.data[3],5, 8);
  1751. ShmSysConfigAndInfo->ate.vccu.inletStatus.DATA4.VCCU_PlugLock_Output0_SelfDiag = bitextract(frame.data[4],0, 3);
  1752. ShmSysConfigAndInfo->ate.vccu.inletStatus.DATA4.VCCU_PlugLock_Output1_SelfDiag = bitextract(frame.data[4],3, 6);
  1753. ShmSysConfigAndInfo->ate.vccu.inletStatus.DATA4.VCCU_Inlet_HWVariant = bitextract(frame.data[4],6, 8);
  1754. ShmSysConfigAndInfo->ate.vccu.inletStatus.DATA5.bits.VCCU_DigitalInput_Status = bitextract(frame.data[5],0, 2);
  1755. ShmSysConfigAndInfo->ate.vccu.inletStatus.DATA5.bits.VCCU_DigitalInput_Wakeup = bitextract(frame.data[5],2, 4);
  1756. ShmSysConfigAndInfo->ate.vccu.inletStatus.DATA5.bits.VCCU_Inlet_MotorStatus = bitextract(frame.data[5],4, 7);
  1757. ShmSysConfigAndInfo->ate.vccu.inletStatus.VCCU_Inlet_MaxCurrent = (short) frame.data[6];
  1758. ShmSysConfigAndInfo->ate.vccu.inletStatus.DATA7.bits.VCCU_DigitalInput_DebouncedSta = bitextract(frame.data[7],0, 2);
  1759. ShmSysConfigAndInfo->ate.vccu.inletStatus.DATA7.bits.VCCU_Inlet_ConnectionStatus = bitextract(frame.data[7],2, 4);
  1760. ShmSysConfigAndInfo->ate.vccu.inletStatus.DATA7.bits.VCCU_S3Switch_Status = bitextract(frame.data[7],4, 6);
  1761. ShmSysConfigAndInfo->ate.vccu.inletStatus.DATA7.bits.VCCU_S3Switch_DebouncedStatus = bitextract(frame.data[7],6, 8);
  1762. //memset(&ShmSysConfigAndInfo->ate.vccu.inletStatus,*frame.data, frame.can_dlc);
  1763. //printf("VCCU_ControlPilotStatus 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] );
  1764. break;
  1765. }
  1766. case VCCU_ChargeToVehicleId:{
  1767. //memcpy(&ShmSysConfigAndInfo->ate.vccu.chargeToVehicle, &frame.data, frame.can_dlc);
  1768. //ShmSysConfigAndInfo->ate.vccu.chargeToVehicle.Data.bits.VCCU_Vehicle_IsolationMea_0000 = bitextract(frame.data[0],0, 2);
  1769. ShmSysConfigAndInfo->ate.vccu.chargeToVehicle.bits.VCCU_Vehicle_IsolationMea_0000 = bitextract(frame.data[0],0, 2);
  1770. ShmSysConfigAndInfo->ate.vccu.chargeToVehicle.bits.VCCU_Vehicle_ContactorRequest = bitextract(frame.data[0],2, 4);
  1771. //memset(&ShmSysConfigAndInfo->ate.vccu.chargeToVehicle,*frame.data, frame.can_dlc);
  1772. //printf("VCCU_ControlPilotStatus 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] );
  1773. break;
  1774. }
  1775. case VCCU_V2G_EVMaximumVoltageLimitId:{
  1776. //memcpy(&ShmSysConfigAndInfo->ate.vccu.v2g_EVMaximumVoltageLimit, &frame.data, frame.can_dlc);
  1777. //memset(&ShmSysConfigAndInfo->ate.vccu.v2g_EVMaximumVoltageLimit,*frame.data, frame.can_dlc);
  1778. break;
  1779. }
  1780. case VCCU_V2G_EVMaximumCurrentLimitId:{
  1781. //memcpy(&ShmSysConfigAndInfo->ate.vccu.v2g_EVMaximumCurrentLimit, &frame.data, frame.can_dlc);
  1782. //memset(&ShmSysConfigAndInfo->ate.vccu.v2g_EVMaximumCurrentLimit,*frame.data, frame.can_dlc);
  1783. break;
  1784. }
  1785. case VCCU_V2G_EVTargetCurrentId:{
  1786. //memcpy(&ShmSysConfigAndInfo->ate.vccu.v2g_EVTargetCurrent, &frame.data, frame.can_dlc);
  1787. //memset(&ShmSysConfigAndInfo->ate.vccu.v2g_EVTargetCurrent,*frame.data, frame.can_dlc);
  1788. break;
  1789. }
  1790. case VCCU_V2G_EVTargetVoltageId:{
  1791. //memcpy(&ShmSysConfigAndInfo->ate.vccu.v2g_EVTargetVoltage, &frame.data, frame.can_dlc);
  1792. //memset(&ShmSysConfigAndInfo->ate.vccu.v2g_EVTargetVoltage,*frame.data, frame.can_dlc);
  1793. break;
  1794. }case EV_BOARD_STATUS_NOTIFICATION:
  1795. {
  1796. ShmSysConfigAndInfo->ate.chademo.id03.ProximitySignal = frame.data[2];
  1797. ShmSysConfigAndInfo->ate.chademo.id03.state = frame.data[3];
  1798. break;
  1799. }
  1800. case ACK_EV_FW_VERSION:
  1801. {
  1802. break;
  1803. }
  1804. case ACK_EV_HW_VERSION:
  1805. {
  1806. printf("Get EV HW = %s \n", frame.data);
  1807. break;
  1808. }
  1809. case ACK__GET_EVSE_OUTPUT_STATUS:
  1810. {
  1811. //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] );
  1812. ShmSysConfigAndInfo->ate.chademo.id09_ack.DcEvState = frame.data[0];//EV模擬器
  1813. ShmSysConfigAndInfo->ate.chademo.id09_ack.ChargingMode = frame.data[1];
  1814. ShmSysConfigAndInfo->ate.chademo.id09_ack.EvsePresentOutputVoltage = ((short) frame.data[3] << 8) + (short) frame.data[2];//充電樁輸出電壓
  1815. ShmSysConfigAndInfo->ate.chademo.id09_ack.EvsePresentOutputCurrent = ((short) frame.data[5] << 8) + (short) frame.data[4];//充電樁輸出電流
  1816. ShmSysConfigAndInfo->ate.chademo.id09_ack.RemainingTimeSec = ((short) frame.data[7] << 8) + (short) frame.data[6];//剩餘時間
  1817. break;
  1818. }
  1819. case ACK_GET_EVSE_Capacity_INFO:
  1820. {
  1821. //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] );
  1822. ShmSysConfigAndInfo->ate.chademo.id0A_ack.EvseMaxChargeVoltage = ((short) frame.data[1] << 8) + (short) frame.data[0];//樁的最大電壓
  1823. ShmSysConfigAndInfo->ate.chademo.id0A_ack.EvseMaxChargeCurrent = ((short) frame.data[3] << 8) + (short) frame.data[2];//樁的最大電流
  1824. ShmSysConfigAndInfo->ate.chademo.id0A_ack.EvseMinChargeVoltage = ((short) frame.data[5] << 8) + (short) frame.data[4];
  1825. ShmSysConfigAndInfo->ate.chademo.id0A_ack.EvseMinChargeCurrent = ((short) frame.data[7] << 8) + (short) frame.data[6];
  1826. break;
  1827. }
  1828. case ACK_GET_MISCELLANEOUS_INFO:
  1829. {
  1830. ShmSysConfigAndInfo->ate.chademo.id0D_ack.K1K2OnOff = frame.data[5];
  1831. if(ShmSysConfigAndInfo->ate.chademo.relaystatus == 0){
  1832. ShmSysConfigAndInfo->ate.chademo.id0D_req.K1K2Status = ShmSysConfigAndInfo->ate.chademo.id0D_ack.K1K2OnOff;
  1833. }
  1834. break;
  1835. }
  1836. case ACK_EVSE_ISOLATION_STATUS: { break;}
  1837. case ACK_EVSE_PRECHAGE_INFO:
  1838. {
  1839. //_chargingData[targetGun]->PrechargeStatus = frame.data[0];
  1840. break;
  1841. }
  1842. case NOTIFICATION_EV_STOP:
  1843. {
  1844. ShmSysConfigAndInfo->ate.chademo.id0B.EvStopReason = frame.data[0];
  1845. ShmSysConfigAndInfo->ate.chademo.id0B.AlarmCode1 = frame.data[1];
  1846. ShmSysConfigAndInfo->ate.chademo.id0B.AlarmCode2 = frame.data[2];
  1847. ShmSysConfigAndInfo->ate.chademo.id0B.AlarmCode3 = frame.data[3];
  1848. ShmSysConfigAndInfo->ate.chademo.id0B.AlarmCode4 = frame.data[4];
  1849. ShmSysConfigAndInfo->ate.chademo.id0B.AlarmCode5 = frame.data[5];
  1850. ShmSysConfigAndInfo->ate.chademo.id0B.AlarmCode6 = frame.data[6];
  1851. setEVStatus2(evstaus[4]);
  1852. ShmSysConfigAndInfo->ate.Permission = STOP;
  1853. setStatusMode(CCS_QUANTITY, ShmSysConfigAndInfo->ate.Permission);
  1854. ShmSysConfigAndInfo->ate.ATEStatus = 0x00;
  1855. SetChargingPermission(CCS_QUANTITY, ShmSysConfigAndInfo->ate.Permission, ShmSysConfigAndInfo->ate.TotalBatteryCap, ShmSysConfigAndInfo->ate.MaxBatteryCurrent, ShmSysConfigAndInfo->ate.MaxBatteryVoltage, 1);
  1856. EvseStopChargingEvent(normalStop, stopReason, 1);
  1857. break;
  1858. }
  1859. default:
  1860. break;
  1861. }
  1862. }
  1863. usleep(2000);
  1864. //usleep(100000);
  1865. }
  1866. }
  1867. }
  1868. int Init407ComPort()
  1869. {
  1870. int fd;
  1871. struct termios tios;
  1872. fd = open(priPortName, O_RDWR);
  1873. if(fd<=0)
  1874. {
  1875. #ifdef SystemLogMessage
  1876. //DEBUG_ERROR("open 407 Communication port NG \n");
  1877. #endif
  1878. return -1;
  1879. }
  1880. ioctl (fd, TCGETS, &tios);
  1881. tios.c_cflag = B115200| CS8 | CLOCAL | CREAD;
  1882. tios.c_lflag = 0;
  1883. tios.c_iflag = 0;
  1884. tios.c_oflag = 0;
  1885. tios.c_cc[VMIN]=0;
  1886. tios.c_cc[VTIME]=(unsigned char)1;
  1887. tios.c_lflag=0;
  1888. tcflush(fd, TCIFLUSH);
  1889. ioctl (fd, TCSETS, &tios);
  1890. return fd;
  1891. }
  1892. //接收can
  1893. void CHROMACANReceiver()
  1894. {
  1895. pid_t canRecPid;
  1896. canRecPid = fork();
  1897. if(canRecPid > 0){
  1898. int nbytes;
  1899. struct can_frame frame;
  1900. int intCmd;
  1901. while (1){
  1902. //清空 canbus recever buf
  1903. memset(&frame, 0, sizeof(struct can_frame));
  1904. //讀取 canbus 是否有接收到封包
  1905. nbytes = read(CanFd2, &frame, sizeof(struct can_frame));
  1906. //如果有收到 canbus 封包
  1907. if (nbytes > 0){
  1908. intCmd = (int) (frame.can_id & CAN_EFF_MASK);//extended frame format
  1909. #ifdef Debug
  1910. //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] );
  1911. //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] );
  1912. #endif
  1913. //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] );
  1914. //printf("Ack none defined. intCmd = %08x \n", intCmd);
  1915. switch (intCmd){
  1916. case bn_res1:{
  1917. ShmSysConfigAndInfo->ate.ATEState = (short) frame.data[0];
  1918. setATEMode(CCS_QUANTITY, ShmSysConfigAndInfo->ate.ATEState);
  1919. //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] );
  1920. break;
  1921. }
  1922. case bn_res2:{
  1923. //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] );
  1924. break;
  1925. }
  1926. case ATE_Connector2:{
  1927. /*
  1928. ShmSysConfigAndInfo->ate.chroma.ate_Connector_2.TargetVoltage = ((short) frame.data[1] << 8) + (short) frame.data[0];//
  1929. ShmSysConfigAndInfo->ate.chroma.ate_Connector_2.TargetCurrent = ((short) frame.data[3] << 8) + (short) frame.data[2];//
  1930. ShmSysConfigAndInfo->ate.chroma.ate_Connector_2.PresentVoltage = ((short) frame.data[5] << 8) + (short) frame.data[4];
  1931. ShmSysConfigAndInfo->ate.chroma.ate_Connector_2.PresentCurrent = ((short) frame.data[7] << 8) + (short) frame.data[6];
  1932. //ShmSysConfigAndInfo->ate.linkVoltage = ShmSysConfigAndInfo->ate.chroma.ate_Connector_2.PresentVoltage;
  1933. ShmSysConfigAndInfo->ate.targetVoltage_Value = ((short) frame.data[1] << 8) + (short) frame.data[0];
  1934. ShmSysConfigAndInfo->ate.targetCurrent_Value = ((short) frame.data[3] << 8) + (short) frame.data[2];
  1935. //ShmSysConfigAndInfo->ate.maximumVoltage_value = ShmSysConfigAndInfo->ate.targetVoltage_Value+(ShmSysConfigAndInfo->ate.targetVoltage_Value*0.1);
  1936. ShmSysConfigAndInfo->ate.maximumVoltage_value = ShmSysConfigAndInfo->ate.targetVoltage_Value+10;
  1937. ShmSysConfigAndInfo->ate.linkVoltage = ShmSysConfigAndInfo->ate.targetVoltage_Value;
  1938. */
  1939. //printf("targetVoltage_Value= %d targetCurrent_Value =%d maximumVoltage_value = %d linkVoltage = %d \n",ShmSysConfigAndInfo->ate.targetVoltage_Value, ShmSysConfigAndInfo->ate.targetCurrent_Value, ShmSysConfigAndInfo->ate.maximumVoltage_value, ShmSysConfigAndInfo->ate.linkVoltage);
  1940. //printf("ATE_Connector2 Get-Msg : %08X - %02x %02x %02x %02x %02x %02x %02x %02x %d %d %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, ShmSysConfigAndInfo->ate.targetVoltage_Value, ShmSysConfigAndInfo->ate.targetCurrent_Value);
  1941. break;
  1942. }
  1943. case ATE_Connector1:{
  1944. if(ShmSysConfigAndInfo->ate.ATEState == 1){
  1945. ShmSysConfigAndInfo->ate.chroma.ate_Connector_1.TargetVoltage = ((short) frame.data[1] << 8) + (short) frame.data[0];//
  1946. ShmSysConfigAndInfo->ate.chroma.ate_Connector_1.TargetCurrent = ((short) frame.data[3] << 8) + (short) frame.data[2];//
  1947. ShmSysConfigAndInfo->ate.chroma.ate_Connector_1.PresentVoltage = ((short) frame.data[5] << 8) + (short) frame.data[4];
  1948. ShmSysConfigAndInfo->ate.chroma.ate_Connector_1.PresentCurrent = ((short) frame.data[7] << 8) + (short) frame.data[6];
  1949. //ShmSysConfigAndInfo->ate.linkVoltage = ShmSysConfigAndInfo->ate.chroma.ate_Connector_1.PresentVoltage;
  1950. ShmSysConfigAndInfo->ate.targetVoltage_Value = ((short) frame.data[1] << 8) + (short) frame.data[0];
  1951. ShmSysConfigAndInfo->ate.targetCurrent_Value = ((short) frame.data[3] << 8) + (short) frame.data[2];
  1952. //ShmSysConfigAndInfo->ate.maximumVoltage_value = ShmSysConfigAndInfo->ate.targetVoltage_Value+(ShmSysConfigAndInfo->ate.targetVoltage_Value*0.1);
  1953. ShmSysConfigAndInfo->ate.maximumVoltage_value = ShmSysConfigAndInfo->ate.targetVoltage_Value+10;
  1954. ShmSysConfigAndInfo->ate.linkVoltage = ShmSysConfigAndInfo->ate.targetVoltage_Value;
  1955. }else if (ShmSysConfigAndInfo->ate.ATEState == 2){
  1956. }
  1957. //printf("targetVoltage_Value= %d targetCurrent_Value =%d maximumVoltage_value = %d linkVoltage = %d \n",ShmSysConfigAndInfo->ate.targetVoltage_Value, ShmSysConfigAndInfo->ate.targetCurrent_Value, ShmSysConfigAndInfo->ate.maximumVoltage_value, ShmSysConfigAndInfo->ate.linkVoltage);
  1958. //printf("ATE_Connector1 Get-Msg : %08X - %02x %02x %02x %02x %02x %02x %02x %02x %d %d %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, ShmSysConfigAndInfo->ate.targetVoltage_Value, ShmSysConfigAndInfo->ate.targetCurrent_Value );
  1959. break;
  1960. }
  1961. default:
  1962. break;
  1963. }
  1964. }
  1965. usleep(2000);
  1966. //usleep(100000);
  1967. }
  1968. }
  1969. }
  1970. void VCCU_TD(){
  1971. byte data[8];
  1972. data[0] = 0x00;
  1973. data[1] = 0x00;
  1974. data[2] = 0x01;
  1975. data[3] = 0x01;
  1976. data[4] = 0x00;
  1977. data[5] = 0x00;
  1978. data[6] = 0x42;
  1979. data[7] = 0x66;
  1980. SendCmdToEvboard(CanFd, TDId, data, sizeof(data));
  1981. }
  1982. void VCCU_ChargeFromVehicle(int canfd, int linkVoltage, int contactorVoltage,
  1983. int chargePermission, int isolationMeasurem,
  1984. int plugLockPermissio, int plugUnlockPermiss, int contactorStatus){
  1985. struct VCCU_ChargeFromVehicle obj;
  1986. obj.VCCU_Vehicle_LinkVoltage= linkVoltage;//500
  1987. obj.VCCU_Vehicle_ContactorVoltage = contactorVoltage;//0
  1988. obj.DATA.bits.VCCU_Vehicle_ChargePermission = chargePermission;//Not_allowed
  1989. obj.DATA.bits.VCCU_Vehicle_IsolationMeasurem = isolationMeasurem;//Active
  1990. obj.DATA.bits.VCCU_Vehicle_PlugLockPermissio = plugLockPermissio;//Allowed//Not_allowed;
  1991. obj.DATA.bits.VCCU_Vehicle_PlugUnlockPermiss = plugUnlockPermiss;//Not_allowed
  1992. obj.bits.VCCU_Vehicle_ContactorStatus = contactorStatus;//Open
  1993. obj.bits.VCCU_Vehicle_StopCharge = 0;//Open
  1994. obj.bits.VCCU_Vehicle_ChargeSelection = 0;//Open
  1995. byte* data1;
  1996. data1 = (byte*) &(*((UWORD *) &obj.VCCU_Vehicle_ContactorVoltage));
  1997. byte* data2;
  1998. data2 = (byte*) &(*((UWORD *) &obj.VCCU_Vehicle_LinkVoltage));
  1999. byte data[6];
  2000. data[0] = data1[0];
  2001. data[1] = data1[1];
  2002. data[2] = data2[0];
  2003. data[3] = data2[1];
  2004. data[4] = *((UBYTE *) &obj.DATA);
  2005. data[5] = *((UBYTE *) &obj.bits);
  2006. //printf("%02x %02x %02x %02x %02x %02x \n", data[0], data[1], data[2], data[3], data[4], data[5] );
  2007. SendCmdToEvboard(canfd, VCCU_ChargeFromVehicleIds, data, sizeof(data));
  2008. }
  2009. //0x18FF3082
  2010. void VCCU_V2G_VehicleStatus(int canfd, int EnergyTra, int EVErrorCode,
  2011. int EVPowerDeliveryParame, int EVRESSSOC,
  2012. int EVRESSConditioningFla, int EVRESSConditionin, int EVReady,
  2013. int BulkChargingCompleteF, int EVCabinConditioningFl, int EVCabinConditioning,
  2014. int ChargingComplete, int FullSOCFlag, int FullSOC,
  2015. int BulkSOCFlag, int BulkSOC, int BulkChargingComplete,
  2016. int BulkChargingCompleteFValue){
  2017. struct VCCU_V2G_VehicleStatus obj;
  2018. obj.DATA4.VCCU_V2G_StateM_EnergyTra_0000 = EnergyTra;//VCCU_V2G_StateM_EnergyTra_0000_DC_DC_extended;
  2019. obj.DATA1.VCCU_V2G_EVErrorCode = EVErrorCode;//0;
  2020. obj.DATA4.VCCU_V2G_EVPowerDeliveryParame = EVPowerDeliveryParame;//3;
  2021. obj.VCCU_V2G_EVRESSSOC.value = EVRESSSOC;//0;
  2022. obj.DATA3.VCCU_V2G_EVRESSConditioningFla = EVRESSConditioningFla;//3;
  2023. obj.DATA3.VCCU_V2G_EVRESSConditioning = EVRESSConditionin;//3;
  2024. obj.DATA3.VCCU_V2G_EVReady = EVReady;//3;
  2025. obj.DATA1.VCCU_V2G_BulkChargingCompleteF = BulkChargingCompleteF;//3;
  2026. obj.DATA3.VCCU_V2G_EVCabinConditioningFl = EVCabinConditioningFl;//3;
  2027. obj.DATA2.VCCU_V2G_EVCabinConditioning = EVCabinConditioning;//3;
  2028. obj.DATA2.VCCU_V2G_ChargingComplete = ChargingComplete;//3;
  2029. obj.DATA2.VCCU_V2G_FullSOCFlag = FullSOCFlag;//0;
  2030. obj.VCCU_V2G_FullSOC.value = FullSOC;//3;
  2031. obj.DATA2.VCCU_V2G_BulkSOCFlag = BulkSOCFlag;//3;
  2032. obj.VCCU_V2G_BulkSOC.value = BulkSOC;//0;
  2033. obj.DATA1.VCCU_V2G_BulkChargingComplete = BulkChargingComplete;//3;
  2034. obj.DATA1.VCCU_V2G_BulkChargingCompleteF = BulkChargingCompleteFValue;//3;
  2035. byte data[7];
  2036. data[0] = *((UBYTE *) &obj.DATA1);
  2037. data[1] = *((UBYTE *) &obj.DATA2);
  2038. data[2] = *((UBYTE *) &obj.DATA3);
  2039. data[3] = *((UBYTE *) &obj.DATA4);
  2040. data[4] = *((UBYTE *) &obj.VCCU_V2G_BulkSOC);
  2041. data[5] = *((UBYTE *) &obj.VCCU_V2G_FullSOC);
  2042. data[6] = *((UBYTE *) &obj.VCCU_V2G_EVRESSSOC);
  2043. //printf("%02x %02x %02x %02x %02x %02x %02x \n", data[0], data[1], data[2], data[3], data[4], data[5] , data[6]);
  2044. SendCmdToEvboard(canfd, VCCU_V2G_VehicleStatusIds, data, sizeof(data));
  2045. }
  2046. void VCCU_V2G_EVMaximumVoltageLimit(int VMaximumVoltageLimit,
  2047. int EVMaximumVoltage_0002,
  2048. int EVMaximumVoltage_0000,
  2049. int EVMaximumVoltage_0001,
  2050. int EVMaximumVoltage_0003){
  2051. struct VCCU_V2G_EVMaximumVoltageLimit obj;
  2052. obj.DATA1.VCCU_V2G_EVMaximumVoltageLimit = VMaximumVoltageLimit;//1
  2053. obj.DATA1.VCCU_V2G_EVMaximumVoltage_0002 = EVMaximumVoltage_0002;//5
  2054. obj.VCCU_V2G_EVMaximumVoltage_0000.value = EVMaximumVoltage_0000;//520
  2055. obj.VCCU_V2G_EVMaximumVoltage_0001.value = EVMaximumVoltage_0001;//1
  2056. obj.VCCU_V2G_EVMaximumVoltage_0003.value = EVMaximumVoltage_0003;//0
  2057. byte* data1;
  2058. data1 = (byte*) &(*((UWORD *) &obj.VCCU_V2G_EVMaximumVoltage_0000));
  2059. byte data[5];
  2060. data[0] = *((UBYTE *) &obj.DATA1);
  2061. data[1] = *((UBYTE *) &obj.VCCU_V2G_EVMaximumVoltage_0003);
  2062. data[2] = data1[0];
  2063. data[3] = data1[1];
  2064. data[4] = *((UBYTE *) &obj.VCCU_V2G_EVMaximumVoltage_0001);
  2065. //printf("%02x %02x %02x %02x %02x \n", data[0], data[1], data[2], data[3], data[4]);
  2066. SendCmdToEvboard(CanFd, VCCU_V2G_EVMaximumVoltageLimitIds, data, sizeof(data));
  2067. }
  2068. void VCCU_V2G_EVMaximumCurrentLimit(int EVMaximumCurrentLimit,
  2069. int EVMaximumCurrent_0000,
  2070. int EVMaximumCurrent_0001,
  2071. int EVMaximumCurrent_0002,
  2072. int EVMaximumCurrent_0003){
  2073. struct VCCU_V2G_EVMaximumCurrentLimit obj;
  2074. obj.DATA1.VCCU_V2G_EVMaximumCurrentLimit = EVMaximumCurrentLimit;//1
  2075. obj.DATA1.VCCU_V2G_EVMaximumCurrent_0000 = EVMaximumCurrent_0000;//3
  2076. obj.VCCU_V2G_EVMaximumCurrent_0001.value = EVMaximumCurrent_0001;//1
  2077. obj.VCCU_V2G_EVMaximumCurrent_0002.value = EVMaximumCurrent_0002;//0
  2078. obj.VCCU_V2G_EVMaximumCurrent_0003.value = EVMaximumCurrent_0003;//10
  2079. byte* data1;
  2080. data1 = (byte*) &(*((UWORD *) &obj.VCCU_V2G_EVMaximumCurrent_0003));
  2081. byte data[5];
  2082. data[0] = *((UBYTE *) &obj.DATA1);
  2083. data[1] = *((UBYTE *) &obj.VCCU_V2G_EVMaximumCurrent_0002);
  2084. data[2] = data1[0];
  2085. data[3] = data1[1];
  2086. data[4] = *((UBYTE *) &obj.VCCU_V2G_EVMaximumCurrent_0001);
  2087. //printf("%02x %02x %02x %02x %02x \n", data[0], data[1], data[2], data[3], data[4]);
  2088. SendCmdToEvboard(CanFd, VCCU_V2G_EVMaximumCurrentLimitIds, data, sizeof(data));
  2089. }
  2090. void VCCU_V2G_EVTargetCurrent(int EVTargetCurrent_Unit,
  2091. int EVTargetCurrent_Value,
  2092. int EVTargetCurrent_UnitF,
  2093. int EVTargetCurrent_Multi){//05 00 00 01 03
  2094. struct VCCU_V2G_EVTargetCurrent obj;
  2095. obj.VCCU_V2G_EVTargetCurrent_Unit.value = EVTargetCurrent_Unit;//3
  2096. obj.VCCU_V2G_EVTargetCurrent_Value.value = EVTargetCurrent_Value;//5
  2097. obj.VCCU_V2G_EVTargetCurrent_UnitF.value = EVTargetCurrent_UnitF;//1
  2098. obj.VCCU_V2G_EVTargetCurrent_Multi.value = EVTargetCurrent_Multi;//0
  2099. byte* data1;
  2100. data1 = (byte*) &(*((UWORD *) &obj.VCCU_V2G_EVTargetCurrent_Value));
  2101. byte data[5];
  2102. data[0] = data1[0];
  2103. data[1] = data1[1];
  2104. data[2] = *((UBYTE *) &obj.VCCU_V2G_EVTargetCurrent_Multi);
  2105. data[3] = *((UBYTE *) &obj.VCCU_V2G_EVTargetCurrent_UnitF);
  2106. data[4] = *((UBYTE *) &obj.VCCU_V2G_EVTargetCurrent_Unit);
  2107. //printf("%02x %02x %02x %02x %02x \n", data[0], data[1], data[2], data[3], data[4]);
  2108. SendCmdToEvboard(CanFd, VCCU_V2G_EVTargetCurrentIds, data, sizeof(data));
  2109. }
  2110. void VCCU_V2G_EVTargetVoltage(int EVTargetVoltage_Value,
  2111. int EVTargetVoltage_Unit,
  2112. int EVTargetVoltage_UnitF,
  2113. int EVTargetVoltage_Multi){//C2 01 00 01 05
  2114. struct VCCU_V2G_EVTargetVoltage obj;
  2115. obj.VCCU_V2G_EVTargetVoltage_Value.value = EVTargetVoltage_Value;//450
  2116. obj.VCCU_V2G_EVTargetVoltage_Unit.value = EVTargetVoltage_Unit;//5
  2117. obj.VCCU_V2G_EVTargetVoltage_UnitF.value = EVTargetVoltage_UnitF;//1
  2118. obj.VCCU_V2G_EVTargetVoltage_Multi.value = EVTargetVoltage_Multi;//0
  2119. byte* data1;
  2120. data1 = (byte*) &(*((UWORD *) &obj.VCCU_V2G_EVTargetVoltage_Value));
  2121. byte data[5];
  2122. data[0] = data1[0];
  2123. data[1] = data1[1];
  2124. data[2] = *((UBYTE *) &obj.VCCU_V2G_EVTargetVoltage_Multi);
  2125. data[3] = *((UBYTE *) &obj.VCCU_V2G_EVTargetVoltage_UnitF);
  2126. data[4] = *((UBYTE *) &obj.VCCU_V2G_EVTargetVoltage_Unit);
  2127. //printf("%d %02x %02x \n",obj.VCCU_V2G_EVTargetVoltage_Value.value, data[0], data[1]);
  2128. //printf("%02x %02x %02x %02x %02x \n", data[0], data[1], data[2], data[3], data[4]);
  2129. SendCmdToEvboard(CanFd, VCCU_V2G_EVTargetVoltageIds, data, sizeof(data));
  2130. }
  2131. void VCCU_Requests(int LED0, int LED1, int LED2,
  2132. int HighSideOut0, int HighSideOut1, int HighSideOut2, int HighSideOut3,
  2133. int HighSideOut4, int RTC, int PlugLock,
  2134. int ControlPilot, int ChargeUnit, int Inlet){
  2135. struct VCCU_Requests obj;
  2136. obj.VCCU_LED0_Request.value = LED0;
  2137. obj.VCCU_LED1_Request.value = LED1;
  2138. obj.VCCU_LED2_Request.value = LED2;
  2139. obj.DATA4.VCCU_HighSideOut0_Request = HighSideOut0;
  2140. obj.DATA4.VCCU_HighSideOut1_Request = HighSideOut1;
  2141. obj.DATA4.VCCU_HighSideOut2_Request = HighSideOut2;
  2142. obj.DATA4.VCCU_HighSideOut3_Request = HighSideOut3;
  2143. obj.DATA5.VCCU_HighSideOut4_Request = HighSideOut4;
  2144. obj.DATA5.VCCU_RTC_TimerRequest = RTC;
  2145. obj.DATA5.VCCU_PlugLock_MotorRequest = PlugLock;
  2146. obj.DATA7.VCCU_ControlPilot_ChargeModeRe = ControlPilot;
  2147. obj.DATA7.VCCU_ChargeUnit_Request = ChargeUnit;
  2148. obj.DATA7.VCCU_Inlet_MotorRequest = Inlet;
  2149. byte data[7];
  2150. data[0] = *((UBYTE *) &obj.VCCU_LED0_Request);
  2151. data[1] = *((UBYTE *) &obj.VCCU_LED1_Request);
  2152. data[2] = *((UBYTE *) &obj.VCCU_LED2_Request);
  2153. data[3] = *((UBYTE *) &obj.DATA4);
  2154. data[4] = *((UBYTE *) &obj.DATA5);
  2155. data[5] = *((UBYTE *) &obj.VCCU_RTC_TimerValue);
  2156. data[6] = *((UBYTE *) &obj.DATA7);
  2157. printf("%02x %02x %02x %02x %02x %02x %02x \n", data[0], data[1], data[2], data[3], data[4], data[5] , data[6]);
  2158. //SendCmdToEvboard(CanFd, VCCU_RequestsIds, data, sizeof(data));
  2159. }
  2160. bool MatedPlugInletUnlocked_Status(){
  2161. return (ShmSysConfigAndInfo->ate.vccu.inletStatus.DATA2.VCCU_PlugPresent_Status == VCCU_InletStatus_Connected &&
  2162. ShmSysConfigAndInfo->ate.vccu.inletStatus.DATA7.bits.VCCU_Inlet_ConnectionStatus == VCCU_InletStatus_Connected &&
  2163. //ShmSysConfigAndInfo->ate.vccu.inletStatus.DATA5.bits.VCCU_Inlet_MotorStatus == Unlocked &&
  2164. ShmSysConfigAndInfo->ate.vccu.controlPilotStatus.DATA.bits.VCCU_ChargeUnit_State == EVSEStateB2 &&
  2165. ShmSysConfigAndInfo->ate.vccu.controlPilotStatus.DATA.bits.VCCU_ChargeUnit_Mode == ChargeV2G
  2166. //&& ShmSysConfigAndInfo->ate.vccu.controlPilotStatus.VCCU_ControlPilot_Voltage - 32000 == 9
  2167. );
  2168. }
  2169. bool PreCharge_Statue(){
  2170. return ((ShmSysConfigAndInfo->ate.vccu.v2g_StateM.VCCU_V2G_StateM_StateMachineSt == PreCharge ) &&
  2171. ShmSysConfigAndInfo->ate.vccu.controlPilotStatus.DATA.bits.VCCU_ChargeUnit_State == EVSEStateC &&
  2172. //(ShmSysConfigAndInfo->ate.vccu.controlPilotStatus.ControlPilot_Voltage.bits.value / 2) == 6 &&
  2173. ShmSysConfigAndInfo->ate.vccu.chargeToVehicle.bits.VCCU_Vehicle_IsolationMea_0000 == Not_requested);
  2174. }
  2175. bool status1(){
  2176. bool result = false;
  2177. result = (ShmSysConfigAndInfo->ate.vccu.chargeFromVehicle.DATA.bits.VCCU_Vehicle_PlugLockPermissio == Allowed
  2178. && ShmSysConfigAndInfo->ate.vccu.inletStatus.DATA5.bits.VCCU_Inlet_MotorStatus == VCCU_Unlocked &&
  2179. ((chargingInfo[CCS_QUANTITY]->PlugPresentStatusDuration >= 2) && chargingInfo[CCS_QUANTITY]->DutyCycleDuration >= 2));
  2180. return result;
  2181. }
  2182. bool status2(){
  2183. bool result = false;
  2184. result = ((ShmSysConfigAndInfo->ate.vccu.controlPilotStatus.ControlPilot_DutyCycle.bits.value >= 5
  2185. && ShmSysConfigAndInfo->ate.vccu.controlPilotStatus.ControlPilot_DutyCycle.bits.value <= 7)
  2186. && ShmSysConfigAndInfo->ate.vccu.inletStatus.DATA5.bits.VCCU_Inlet_MotorStatus == Locked
  2187. && ShmSysConfigAndInfo->ate.vccu.controlPilotStatus.DATA.bits.VCCU_ChargeUnit_Mode == EVSEStateB2
  2188. && ShmSysConfigAndInfo->ate.vccu.inletStatus.DATA5.bits.VCCU_DigitalInput_Status == Not_pressed
  2189. && ShmSysConfigAndInfo->ate.vccu.inletStatus.DATA7.bits.VCCU_S3Switch_Status == Not_pressed);
  2190. return result;
  2191. }
  2192. bool UnmatedPlug(){
  2193. bool result = false;
  2194. /*
  2195. printf("VCCU_V2G_StateM_StateMachineSt = %d VCCU_ChargeUnit_State = %d VCCU_ChargeUnit_Mode = %d VCCU_Vehicle_ContactorRequest = %d VCCU_Vehicle_IsolationMea_0000 = %d \n", ShmSysConfigAndInfo->ate.vccu.v2g_StateM.VCCU_V2G_StateM_StateMachineSt,
  2196. ShmSysConfigAndInfo->ate.vccu.controlPilotStatus.DATA.bits.VCCU_ChargeUnit_State,
  2197. ShmSysConfigAndInfo->ate.vccu.controlPilotStatus.DATA.bits.VCCU_ChargeUnit_Mode,
  2198. ShmSysConfigAndInfo->ate.vccu.chargeToVehicle.Data.bits.VCCU_Vehicle_ContactorRequest,
  2199. ShmSysConfigAndInfo->ate.vccu.chargeToVehicle.Data.bits.VCCU_Vehicle_IsolationMea_0000);
  2200. */
  2201. if(ShmSysConfigAndInfo->ate.vccu.v2g_StateM.VCCU_V2G_StateM_StateMachineSt == StateM_Initialized &&
  2202. //ShmSysConfigAndInfo->ate.vccu.inletStatus.DATA2.VCCU_PlugPresent_Status == VCCU_InletStatus_Not_connected &&
  2203. //ShmSysConfigAndInfo->ate.vccu.inletStatus.DATA7.bits.VCCU_Inlet_ConnectionStatus == VCCU_InletStatus_Not_connected &&
  2204. //ShmSysConfigAndInfo->ate.vccu.inletStatus.DATA5.bits.VCCU_Inlet_MotorStatus == Unlocked &&
  2205. (ShmSysConfigAndInfo->ate.vccu.controlPilotStatus.DATA.bits.VCCU_ChargeUnit_State == EVSEStateA ||
  2206. ShmSysConfigAndInfo->ate.vccu.controlPilotStatus.DATA.bits.VCCU_ChargeUnit_State == EVSEStateE ||
  2207. ShmSysConfigAndInfo->ate.vccu.controlPilotStatus.DATA.bits.VCCU_ChargeUnit_State == EVSEStateB1) &&
  2208. ShmSysConfigAndInfo->ate.vccu.controlPilotStatus.DATA.bits.VCCU_ChargeUnit_Mode == VCCU_ChargeUnit_Mode_SNA &&
  2209. //ShmSysConfigAndInfo->ate.vccu.controlPilotStatus.VCCU_ControlPilot_Voltage == 0 &&
  2210. ShmSysConfigAndInfo->ate.vccu.chargeToVehicle.bits.VCCU_Vehicle_ContactorRequest == ForceOpen &&
  2211. ShmSysConfigAndInfo->ate.vccu.chargeToVehicle.bits.VCCU_Vehicle_IsolationMea_0000 == Requested ){
  2212. //TODO
  2213. result = true;
  2214. //printf("CCS DC01....................\n");
  2215. //VCCU_ChargeFromVehicle(CanFd, 500, 0, Not_allowed, Active, Not_allowed, Not_allowed, Opened);
  2216. setChargerMode(CCS_QUANTITY, V_UNMATEDPLUG);
  2217. }
  2218. return result;
  2219. }
  2220. bool MatedPlugInletUnlocked(){
  2221. bool result = false;
  2222. if(MatedPlugInletUnlocked_Status() && chargingInfo[CCS_QUANTITY]->SystemStatus == V_IDLE){//(DC02) Mated Plug - Inlet Unlocked
  2223. //TODO
  2224. result = true;
  2225. //VCCU_ChargeFromVehicle(CanFd, 500, 0, Not_allowed, Active, Allowed, Not_allowed, Opened);
  2226. setChargerMode(CCS_QUANTITY, V_MATED_PLUG_INLET_UNLOCKED);
  2227. }
  2228. return result;
  2229. }
  2230. bool InletLocking(){
  2231. bool result = false;
  2232. if(//ShmSysConfigAndInfo->ate.vccu.controlPilotStatus.DATA.bits.VCCU_ChargeUnit_State == EVSEStateB2
  2233. status1() &&
  2234. ShmSysConfigAndInfo->ate.vccu.inletStatus.DATA5.bits.VCCU_Inlet_MotorStatus == VCCU_Inlet_MotorStatus_Moving
  2235. ){//(DC03) Inlet Locking
  2236. result = true;
  2237. //printf("CCS DC03....................\n");
  2238. /*
  2239. if(ShmSysConfigAndInfo->ate.vccu.chargeFromVehicle.DATA.bits.VCCU_Vehicle_PlugLockPermissio == Allowed &&
  2240. ShmSysConfigAndInfo->ate.vccu.inletStatus.DATA2.VCCU_PlugPresent_Status == VCCU_InletStatus_Connected &&//PlugPresent_Status == Connected for >=2s
  2241. //ShmSysConfigAndInfo->ate.vccu.controlPilotStatus.VCCU_ControlPilot_DutyCycle && //ControlPilot_DutyCycle == valid for >= 2s
  2242. ShmSysConfigAndInfo->ate.vccu.inletStatus.DATA5.bits.VCCU_Inlet_MotorStatus == Unlocked){
  2243. }*/
  2244. setChargerMode(CCS_QUANTITY, V_INLETLOCKING);
  2245. }
  2246. return result;
  2247. }
  2248. bool InletLocked(){
  2249. bool result = false;
  2250. if(MatedPlugInletUnlocked_Status() && ShmSysConfigAndInfo->ate.vccu.inletStatus.DATA5.bits.VCCU_Inlet_MotorStatus == Locked){//DC04) Inlet Locked
  2251. result = true;
  2252. /*
  2253. if(ShmSysConfigAndInfo->ate.vccu.inletStatus.DATA5.bits.VCCU_Inlet_MotorStatus == VCCU_Inlet_MotorStatus_Moving){
  2254. }*/
  2255. setChargerMode(CCS_QUANTITY, V_INLETLOCKED);
  2256. }
  2257. return result;
  2258. }
  2259. bool DC05_Status(){
  2260. return (status1() && status2() && (ShmSysConfigAndInfo->ate.vccu.v2g_StateM.VCCU_V2G_StateM_StateMachineSt == SLAC || ShmSysConfigAndInfo->ate.vccu.v2g_StateM.VCCU_V2G_StateM_StateMachineSt == WaitForIP ||
  2261. ShmSysConfigAndInfo->ate.vccu.v2g_StateM.VCCU_V2G_StateM_StateMachineSt == SECCDiscoveryProtocol || ShmSysConfigAndInfo->ate.vccu.v2g_StateM.VCCU_V2G_StateM_StateMachineSt == TLConnection ||
  2262. ShmSysConfigAndInfo->ate.vccu.v2g_StateM.VCCU_V2G_StateM_StateMachineSt == SupportedAppProtocol || ShmSysConfigAndInfo->ate.vccu.v2g_StateM.VCCU_V2G_StateM_StateMachineSt == SessionSetup ||
  2263. ShmSysConfigAndInfo->ate.vccu.v2g_StateM.VCCU_V2G_StateM_StateMachineSt == ServiceDiscovery || ShmSysConfigAndInfo->ate.vccu.v2g_StateM.VCCU_V2G_StateM_StateMachineSt == ServiceDetails ||
  2264. ShmSysConfigAndInfo->ate.vccu.v2g_StateM.VCCU_V2G_StateM_StateMachineSt == PaymentServiceSelection || ShmSysConfigAndInfo->ate.vccu.v2g_StateM.VCCU_V2G_StateM_StateMachineSt == CertificateInstallation ||
  2265. ShmSysConfigAndInfo->ate.vccu.v2g_StateM.VCCU_V2G_StateM_StateMachineSt == CertificateUpdate || ShmSysConfigAndInfo->ate.vccu.v2g_StateM.VCCU_V2G_StateM_StateMachineSt == PaymentDetails ||
  2266. ShmSysConfigAndInfo->ate.vccu.v2g_StateM.VCCU_V2G_StateM_StateMachineSt == PaymentDetails || ShmSysConfigAndInfo->ate.vccu.v2g_StateM.VCCU_V2G_StateM_StateMachineSt == Authorization )
  2267. && ShmSysConfigAndInfo->ate.vccu.chargeToVehicle.bits.VCCU_Vehicle_ContactorRequest == Open);
  2268. }
  2269. bool S_SLAC(){
  2270. bool result = false;
  2271. if(MatedPlugInletUnlocked_Status() && DC05_Status()){
  2272. result = true;
  2273. /*
  2274. if(ShmSysConfigAndInfo->ate.vccu.inletStatus.DATA5.bits.VCCU_Inlet_MotorStatus == Locked &&
  2275. (ShmSysConfigAndInfo->ate.vccu.controlPilotStatus.VCCU_ControlPilot_DutyCycle >= 5 || ShmSysConfigAndInfo->ate.vccu.controlPilotStatus.VCCU_ControlPilot_DutyCycle <= 7) &&
  2276. ShmSysConfigAndInfo->ate.vccu.controlPilotStatus.DATA.bits.VCCU_ChargeUnit_State == EVSEStateB2 &&
  2277. ShmSysConfigAndInfo->ate.vccu.inletStatus.DATA5.bits.VCCU_DigitalInput_Status == Not_pressed &&
  2278. ShmSysConfigAndInfo->ate.vccu.inletStatus.DATA7.bits.VCCU_S3Switch_Status == Not_pressed&&
  2279. ShmSysConfigAndInfo->ate.vccu.ptc1.VCCU_PTC1_Temperature < 90){
  2280. }*/
  2281. setChargerMode(CCS_QUANTITY, V_SLAC);
  2282. }
  2283. return result;
  2284. }
  2285. bool Definition(){
  2286. bool result = false;
  2287. if(MatedPlugInletUnlocked_Status() && (ShmSysConfigAndInfo->ate.vccu.v2g_StateM.VCCU_V2G_StateM_StateMachineSt == ChargeParameterDiscovery ) &&
  2288. ShmSysConfigAndInfo->ate.vccu.chargeToVehicle.bits.VCCU_Vehicle_ContactorRequest == Open){
  2289. result = true;
  2290. /*
  2291. VCCU_V2G_VehicleStatus(CanFd, VCCU_V2G_StateM_EnergyTra_0000_DC_DC_extended, 0,
  2292. 3, 0,
  2293. 3, 3, TRUE,
  2294. 3, 3, 3,
  2295. 3, 3, 0,
  2296. 3, 0, 3,
  2297. 3);
  2298. VCCU_V2G_EVMaximumVoltageLimit(TRUE, U_V, 520, TRUE, 0);
  2299. VCCU_V2G_EVMaximumCurrentLimit(TRUE, U_A, TRUE, 0, 10);
  2300. */
  2301. setChargerMode(CCS_QUANTITY, V_DEFINITION);
  2302. }
  2303. return result;
  2304. }
  2305. bool S_CableCheck(){
  2306. bool result = false;
  2307. if(MatedPlugInletUnlocked_Status() && (ShmSysConfigAndInfo->ate.vccu.v2g_StateM.VCCU_V2G_StateM_StateMachineSt == CableCheck )){
  2308. result = true;
  2309. //VCCU_ChargeFromVehicle(CanFd, 500, 0, Allowed, Active, Allowed, Not_allowed, Opened);
  2310. setChargerMode(CCS_QUANTITY, V_CABLECHECK);
  2311. }
  2312. return result;
  2313. }
  2314. bool Isolation(){
  2315. bool result = false;
  2316. if(MatedPlugInletUnlocked_Status() && PreCharge_Statue()){
  2317. result = true;
  2318. //VCCU_ChargeFromVehicle(CanFd, 500, 0, Allowed, Not_Active, Allowed, Not_allowed, Opened);
  2319. setChargerMode(CCS_QUANTITY, V_ISOLATION);
  2320. }
  2321. return result;
  2322. }
  2323. bool S_PreCharge(){
  2324. bool result = false;
  2325. if(PreCharge_Statue()){
  2326. //VCCU_ChargeFromVehicle(CanFd, 500, 500, Allowed, Not_Active, Allowed, Not_allowed, Opened);
  2327. //VCCU_V2G_EVTargetCurrent(U_A, 5, TRUE, 0);
  2328. setChargerMode(CCS_QUANTITY, V_VOLTAGEDIFFERENCE);
  2329. }
  2330. return result;
  2331. }
  2332. bool Contactors(){
  2333. bool result = false;
  2334. if( PreCharge_Statue() && ShmSysConfigAndInfo->ate.vccu.chargeToVehicle.bits.VCCU_Vehicle_ContactorRequest == Close){
  2335. result = true;
  2336. //VCCU_ChargeFromVehicle(CanFd, 500, 500, Allowed, Not_Active, Allowed, Not_allowed, Closed);
  2337. setChargerMode(CCS_QUANTITY, V_CONTACTORSCLOSED);
  2338. }
  2339. return result;
  2340. }
  2341. bool S_PowerDelivery(){
  2342. bool result = false;
  2343. if(PreCharge_Statue() && ShmSysConfigAndInfo->ate.vccu.v2g_StateM.VCCU_V2G_StateM_StateMachineSt == PowerDelivery
  2344. && ShmSysConfigAndInfo->ate.vccu.chargeToVehicle.bits.VCCU_Vehicle_ContactorRequest == Close
  2345. ){
  2346. result = true;
  2347. //VCCU_V2G_EVTargetVoltage(450, U_V, TRUE, 0);
  2348. setChargerMode(CCS_QUANTITY, V_POWERDELIVERY);
  2349. }
  2350. return result;
  2351. }
  2352. bool S_CurrentDemand(){
  2353. bool result = false;
  2354. if(ShmSysConfigAndInfo->ate.vccu.v2g_StateM.VCCU_V2G_StateM_StateMachineSt == CurrentDemand){//(DC12) Current Demand
  2355. result = true;
  2356. //TODO stop
  2357. setChargerMode(CCS_QUANTITY, V_CURRENTDEMAND);
  2358. }
  2359. return result;
  2360. }
  2361. bool PowerDeliveryFalse(){
  2362. bool result = false;
  2363. if(ShmSysConfigAndInfo->ate.vccu.v2g_StateM.VCCU_V2G_StateM_StateMachineSt == PowerDelivery
  2364. && ShmSysConfigAndInfo->ate.vccu.chargeToVehicle.bits.VCCU_Vehicle_ContactorRequest == Open
  2365. ){//(DC13) PowerDelivery
  2366. result = true;
  2367. setChargerMode(CCS_QUANTITY, V_POWERDELIVERYFALSE);
  2368. }
  2369. return result;
  2370. }
  2371. bool S_WeldingDetection(){
  2372. bool result = false;
  2373. if(ShmSysConfigAndInfo->ate.vccu.v2g_StateM.VCCU_V2G_StateM_StateMachineSt == WeldingDetection){//(DC14) Welding Detection
  2374. result = true;
  2375. setChargerMode(CCS_QUANTITY, V_DETECTION);
  2376. }
  2377. return result;
  2378. }
  2379. bool SessionStop(){
  2380. bool result = false;
  2381. if(ShmSysConfigAndInfo->ate.vccu.v2g_StateM.VCCU_V2G_StateM_StateMachineSt == StateM_SessionStop &&
  2382. ShmSysConfigAndInfo->ate.vccu.chargeToVehicle.bits.VCCU_Vehicle_IsolationMea_0000 == Requested){//Session Stop
  2383. result = true;
  2384. setChargerMode(CCS_QUANTITY, V_SESSION_STOP);
  2385. }
  2386. return result;
  2387. }
  2388. bool StopCommunicationSession(){
  2389. bool result = false;
  2390. if(ShmSysConfigAndInfo->ate.vccu.v2g_StateM.VCCU_V2G_StateM_StateMachineSt == StateM_StopCommunicationSession ){//Stop Communication Session
  2391. result = true;
  2392. setChargerMode(CCS_QUANTITY, V_STOP_COMMUNICATION_SESSION);
  2393. }
  2394. return result;
  2395. }
  2396. bool DCFinished(){
  2397. bool result = false;
  2398. if(ShmSysConfigAndInfo->ate.vccu.v2g_StateM.VCCU_V2G_StateM_StateMachineSt == StateM_Finished ){//Finished
  2399. result = true;
  2400. setChargerMode(CCS_QUANTITY, V_FINISHED);
  2401. }
  2402. return result;
  2403. }
  2404. bool statusCheck(){
  2405. bool result = false;
  2406. VCCU_TD();
  2407. UnmatedPlug();
  2408. MatedPlugInletUnlocked();
  2409. InletLocking();
  2410. InletLocked();
  2411. S_SLAC();
  2412. Definition();
  2413. S_CableCheck();
  2414. Isolation();
  2415. S_PreCharge();
  2416. Contactors();
  2417. S_PowerDelivery();
  2418. S_CurrentDemand();
  2419. PowerDeliveryFalse();
  2420. S_WeldingDetection();
  2421. SessionStop();
  2422. StopCommunicationSession();
  2423. DCFinished();
  2424. return result;
  2425. }
  2426. //===============================================
  2427. // 確認 GPIO 狀態
  2428. //===============================================
  2429. int gpio_get_value(unsigned int gpio, unsigned int *value)
  2430. {
  2431. int fd;
  2432. char buf[MAX_BUF];
  2433. char ch;
  2434. snprintf(buf, sizeof(buf), SYSFS_GPIO_DIR "/gpio%d/value", gpio);
  2435. fd = open(buf, O_RDONLY);
  2436. if (fd < 0) {
  2437. perror("gpio/get-value");
  2438. return fd;
  2439. }
  2440. read(fd, &ch, 1);
  2441. if (ch != '0') {
  2442. *value = 1;
  2443. } else {
  2444. *value = 0;
  2445. }
  2446. close(fd);
  2447. return 0;
  2448. }
  2449. void SelfTestRun()
  2450. {
  2451. }
  2452. long hexToDec(char *source)
  2453. {
  2454. long sum = 0;
  2455. long t = 1;
  2456. int i, len;
  2457. len = strlen(source);
  2458. for(i=len-1; i>=0; i--)
  2459. {
  2460. sum += t * getIndexOfSigns(*(source + i));
  2461. t *= 16;
  2462. }
  2463. return sum;
  2464. }
  2465. int getIndexOfSigns(char ch)
  2466. {
  2467. if(ch >= '0' && ch <= '9')
  2468. {
  2469. return ch - '0';
  2470. }
  2471. if(ch >= 'A' && ch <='F')
  2472. {
  2473. return ch - 'A' + 10;
  2474. }
  2475. if(ch >= 'a' && ch <= 'f')
  2476. {
  2477. return ch - 'a' + 10;
  2478. }
  2479. return -1;
  2480. }
  2481. int InitComPort()
  2482. {
  2483. int fd;
  2484. struct termios tios;
  2485. fd = open(relayRs485PortName, O_RDWR);
  2486. if(fd <= 0)
  2487. {
  2488. #ifdef SystemLogMessage
  2489. //DEBUG_ERROR("Module_InternalComm. InitComPort NG\n");
  2490. #endif
  2491. if(ShmStatusCodeData!=NULL)
  2492. {
  2493. ShmStatusCodeData->AlarmCode.AlarmEvents.bits.CsuInitFailed=1;
  2494. }
  2495. sleep(5);
  2496. return -1;
  2497. }
  2498. ioctl(fd, TCGETS, &tios);
  2499. tios.c_cflag = B115200 | CS8 | CLOCAL | CREAD;
  2500. tios.c_lflag = 0;
  2501. tios.c_iflag = 0;
  2502. tios.c_oflag = 0;
  2503. tios.c_cc[VMIN] = 0;
  2504. tios.c_cc[VTIME]=(byte)0; // timeout 0.5 second
  2505. //tios.c_cc[VTIME] = (unsigned char) 5;
  2506. tios.c_lflag=0;
  2507. tcflush(fd, TCIFLUSH);
  2508. ioctl(fd, TCSETS, &tios);
  2509. return fd;
  2510. }
  2511. unsigned char Config_Gpio_Output(unsigned char fd, unsigned char targetAddr, Gpio_out *Set_Buf)
  2512. {
  2513. unsigned char result = FAIL;
  2514. unsigned char tx[9] = {0xaa, 0x00, targetAddr, Cmd.config_Gpio_Output, 0x01, 0x00, 0x00, 0x00};
  2515. unsigned char rx[512];
  2516. unsigned char chksum = 0x00;
  2517. for (int idx = 0; idx < 2; idx++)
  2518. tx[6] |= (Set_Buf->Button_LED[idx] ? 0x01:0x00) << (0+idx);
  2519. for (int idx = 0; idx < 4; idx++)
  2520. tx[6] |= (Set_Buf->System_LED[idx] ? 0x01:0x00) << (2+idx);
  2521. tx[6] |= (Set_Buf->AC_Connector ? 0x01:0x00) << 6;
  2522. tx[6] |= (Set_Buf->AC_Breaker ? 0x01:0x00) << 7;
  2523. for (int idx = 0; idx < (tx[4] | tx[5] << 8); idx++)
  2524. chksum ^= tx[6+idx];
  2525. tx[7] = chksum;
  2526. if (tranceive(fd, tx, sizeof(tx), rx) > 0)
  2527. {
  2528. chksum = 0x00;
  2529. for(int idx=0;idx<(rx[4] | rx[5]<<8);idx++)
  2530. {
  2531. chksum ^= rx[6+idx];
  2532. }
  2533. if((chksum == rx[6+(rx[4] | rx[5]<<8)]) &&
  2534. (rx[2] == tx[1]) &&
  2535. (rx[1] == tx[2]) &&
  2536. (rx[3] == tx[3]) &&
  2537. (rx[6] == tx[6]))
  2538. {
  2539. result = PASS;
  2540. }
  2541. }
  2542. return result;
  2543. }
  2544. int Initialization(){
  2545. char *moduleName = "DMYZ30100J01P0";
  2546. memcpy(&ShmSysConfigAndInfo->SysConfig.ModelName, moduleName, strlen(moduleName));
  2547. //printf("%s \n", ShmSysConfigAndInfo->SysConfig.ModelName);
  2548. ShmSysConfigAndInfo->SysInfo.CcsChargingData[CCS_QUANTITY].Index = CCS_QUANTITY;
  2549. ShmSysConfigAndInfo->SysInfo.CcsChargingData[CCS_QUANTITY].slotsIndex = 1;
  2550. chargingInfo[CCS_QUANTITY] = &ShmSysConfigAndInfo->SysInfo.CcsChargingData[CCS_QUANTITY];
  2551. chargingInfo[CCS_QUANTITY]->SystemStatus = V_IDLE;
  2552. chargingInfo[CCS_QUANTITY]->Type = _Type_CCS;
  2553. chargingInfo[CCS_QUANTITY]->type_index = CCS_QUANTITY;
  2554. chargingInfo[CCS_QUANTITY]->Evboard_id = 0x01;
  2555. ShmSysConfigAndInfo->ate.ATEStatus = 0;
  2556. // 現階段預設為走 DIN70121
  2557. ShmCcsData->CommProtocol = 0x01;
  2558. return PASS;
  2559. }
  2560. bool IsNoneMatchRelayStatus()
  2561. {
  2562. bool result = false;
  2563. if ((regRelay.relay_event.bits.AC_Contactor != outputRelay.relay_event.bits.AC_Contactor) ||
  2564. (regRelay.relay_event.bits.CCS_Precharge != outputRelay.relay_event.bits.CCS_Precharge) ||
  2565. (regRelay.relay_event.bits.Gun1_P != outputRelay.relay_event.bits.Gun1_P) ||
  2566. (regRelay.relay_event.bits.Gun1_N != outputRelay.relay_event.bits.Gun1_N) ||
  2567. (regRelay.relay_event.bits.Gun2_P != outputRelay.relay_event.bits.Gun2_P) ||
  2568. (regRelay.relay_event.bits.Gun2_N != outputRelay.relay_event.bits.Gun2_N))
  2569. {
  2570. result = true;
  2571. }
  2572. return result;
  2573. }
  2574. void MatchRelayStatus()
  2575. {
  2576. // 因為 AC Contactor 沒有 Feedback,所以暫時先這樣處理
  2577. //regRelay.relay_event.bits.AC_Contactor = outputRelay.relay_event.bits.AC_Contactor;
  2578. ShmSysConfigAndInfo->SysInfo.AcContactorStatus = regRelay.relay_event.bits.AC_Contactor = outputRelay.relay_event.bits.AC_Contactor;
  2579. regRelay.relay_event.bits.CCS_Precharge = outputRelay.relay_event.bits.CCS_Precharge;
  2580. regRelay.relay_event.bits.Gun1_P = outputRelay.relay_event.bits.Gun1_P;
  2581. regRelay.relay_event.bits.Gun1_N = outputRelay.relay_event.bits.Gun1_N;
  2582. regRelay.relay_event.bits.Gun2_P = outputRelay.relay_event.bits.Gun2_P;
  2583. regRelay.relay_event.bits.Gun2_N = outputRelay.relay_event.bits.Gun2_N;
  2584. }
  2585. bool CheckConnectorTypeStatus()
  2586. {
  2587. bool result = true;
  2588. return result;
  2589. }
  2590. void CloseInternalCommPort()
  2591. {
  2592. close(Uart5Fd);
  2593. }
  2594. void InitRS485DirectionIO(void)
  2595. {
  2596. //LCD_AC_BIAS_EN => GPIO2_25*//*RS-485 for module DE control
  2597. gpio_set_direction(PIN_AM_DE_1, GPIO_DIR_OUTPUT);
  2598. gpio_write(PIN_AM_DE_1, 1);
  2599. //system("echo 89 > /sys/class/gpio/export");
  2600. //system("echo \"out\" > /sys/class/gpio/gpio89/direction");
  2601. //system("echo 1 > /sys/class/gpio/gpio89/value");
  2602. //LCD_HSYNC => GPIO2_23*//*RS-485 for module RE control
  2603. gpio_set_direction(PIN_AM_RE_1, GPIO_DIR_OUTPUT);
  2604. gpio_write(PIN_AM_RE_1, 0);
  2605. //system("echo 87 > /sys/class/gpio/export");
  2606. //system("echo \"out\" > /sys/class/gpio/gpio87/direction");
  2607. //system("echo 0 > /sys/class/gpio/gpio87/value");
  2608. }
  2609. void InitGPIO()
  2610. {
  2611. }
  2612. int main(void){
  2613. //Create all share memory
  2614. //printf("=====Initializing. \n");
  2615. //ate = malloc( sizeof(ate) );
  2616. if(CreatShareMemory()==0){
  2617. #ifdef SystemLogMessage
  2618. //DEBUG_ERROR("CreatShareMemory NG \n");
  2619. #endif
  2620. if(ShmStatusCodeData!=NULL)
  2621. {
  2622. //ShmStatusCodeData->AlarmCode.AlarmEvents.bits.FailToCreateShareMemory=1;
  2623. }
  2624. return 0;
  2625. sleep(5);
  2626. system("reboot -f");
  2627. }
  2628. /*
  2629. int a=2;
  2630. int *b;
  2631. b = &a;
  2632. printf("%p\n", &a);
  2633. printf("%d\n", *b);
  2634. printf("%p\n", b);
  2635. printf("%p\n", &b);
  2636. *//*
  2637. int a = 2;
  2638. int b = 3;
  2639. a = a^b;
  2640. b = a^b;
  2641. a = a^b;
  2642. printf("%d %d", a, b);
  2643. const char *SystemId="0101";
  2644. printf("%c %p =====\n", *SystemId, &SystemId);
  2645. strcpy((char *)&ShmSysConfigAndInfo->SysConfig.SystemId,SystemId);
  2646. char *SystemIdStr = (char *)&ShmSysConfigAndInfo->SysConfig.SystemId;
  2647. printf("%s =====\n", SystemIdStr);*/
  2648. //SpawnTask();
  2649. //KillTask();
  2650. CanFd = InitCanBus();
  2651. CanFd2 = CHROMAInitCanBus();
  2652. CANReceiver();
  2653. CHROMACANReceiver();
  2654. printf ("vccu 1===== CanFd2:%d. \n", CanFd2);
  2655. //setChargerMode(CCS_QUANTITY, V_IDLE);
  2656. /*
  2657. struct timeb tp;
  2658. unsigned int StartTime,StopTime;
  2659. //ftime(&tp);
  2660. ftime(&startChargingTime[CCS_QUANTITY]);
  2661. //
  2662. StartTime = (int)startChargingTime[CCS_QUANTITY].time;
  2663. printf("%u\n", StartTime);
  2664. sleep(2);
  2665. ftime(&tp);
  2666. ftime(&endChargingTime[CCS_QUANTITY]);
  2667. StopTime = (int)endChargingTime[CCS_QUANTITY].time;
  2668. printf("%u\n", StopTime);
  2669. */
  2670. /*
  2671. gpio_set_direction(1, GPIO_DIR_INPUT);
  2672. gpio_set_direction(2, GPIO_DIR_INPUT);
  2673. gpio_set_direction(3, GPIO_DIR_INPUT);
  2674. gpio_write(1, 0);
  2675. gpio_write(3, 0);
  2676. gpio_write(3, 1);
  2677. gpio_write(3, 1);
  2678. */
  2679. /*
  2680. int pinIn[2] = { 1, 3 };
  2681. system("echo 1 > /sys/class/gpio/export");
  2682. system("echo \"out\" > /sys/class/gpio/gpio1/direction");
  2683. system("echo 1 > /sys/class/gpio/gpio1/value");
  2684. system("echo 3 > /sys/class/gpio/export");
  2685. system("echo \"out\" > /sys/class/gpio/gpio3/direction");
  2686. system("echo 1 > /sys/class/gpio/gpio3/value");
  2687. gpio_set_direction(1, GPIO_DIR_OUTPUT);
  2688. gpio_set_direction(4, GPIO_DIR_OUTPUT);
  2689. gpio_write(1, 0);
  2690. gpio_write(4, 0);
  2691. for (int i = 0; i < ARRAY_SIZE(pinIn); i++)
  2692. {
  2693. }*/
  2694. Uart1Fd = Init407ComPort();
  2695. //printf("407 Port id = %d \n", Uart1Fd);
  2696. //int led = gpio_read(3);
  2697. //printf("led === %d \n", led);
  2698. //printf("%d %d %d %d %d %d \n", ShmSysConfigAndInfo->ate.targetCurrent_Value, ShmSysConfigAndInfo->ate.targetVoltage_Value, ShmSysConfigAndInfo->ate.maximumCurrent_value, ShmSysConfigAndInfo->ate.maximumVoltage_value, ShmSysConfigAndInfo->ate.linkVoltage, ShmSysConfigAndInfo->ate.contactorVoltage);
  2699. Initialization();
  2700. InitRS485DirectionIO();
  2701. // Open Uart5 for RB
  2702. Uart5Fd = InitComPort();
  2703. for (byte index = 0; index < ARRAY_SIZE(outputRelay.relay_event.relay_status); index++)
  2704. {
  2705. outputRelay.relay_event.relay_status[index] = 0x00;
  2706. }
  2707. memset(&regRelay, 0xFF,sizeof(Relay));
  2708. outputRelay.relay_event.bits.AC_Contactor = 0x00;
  2709. outputRelay.relay_event.bits.CCS_Precharge = 0x00;
  2710. outputRelay.relay_event.bits.Gun1_P = 0x00;
  2711. outputRelay.relay_event.bits.Gun1_N = 0x00;
  2712. outputRelay.relay_event.bits.Gun2_P = 0x00;
  2713. outputRelay.relay_event.bits.Gun2_N = 0x00;
  2714. //outputRelay.relay_event.bits.Gun1_Parallel_N = 0x00;
  2715. //outputRelay.relay_event.bits.Gun1_Parallel_P = 0x01;
  2716. Config_Relay_Output(Uart5Fd, Addr.Relay, &outputRelay);
  2717. /*
  2718. VCCU_Requests(90, 90, 90,
  2719. 3, 3, 3, 3,
  2720. 3, 0, 7,
  2721. 7, 3, 3);*/
  2722. sleep(1);
  2723. if(Uart5Fd < 0){
  2724. printf ("open port error. \n");
  2725. return 0;
  2726. }
  2727. //usleep(300000);
  2728. //outputRelay.relay_event.bits.Gun1_N = 0x00;
  2729. //outputRelay.relay_event.bits.Gun1_P = 0x00;
  2730. // outputRelay.relay_event.bits.Gun2_N = 0x00;
  2731. // outputRelay.relay_event.bits.Gun2_P = 0x00;
  2732. // Config_Relay_Output(Uart5Fd, Addr.Relay, &outputRelay);
  2733. // flash = NO;
  2734. // SetOutputGpio(flash);
  2735. // return 0;
  2736. ShmSysConfigAndInfo->ate.chademo.id0D_req.K1K2Status=0x00;
  2737. ShmSysConfigAndInfo->ate.chademo.id0D_req.Soc = 50;
  2738. ShmSysConfigAndInfo->ate.ateMode = 0;
  2739. ShmSysConfigAndInfo->ate.ATEState = 1;
  2740. //byte priorityLow = 1;
  2741. /**/
  2742. //byte normalStop = 0x01;
  2743. //byte stopReason[6] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
  2744. byte evstaus[5] = { 0x01, 0x02, 0x03, 0x04, 0x05 };
  2745. //PresentInputRequirement
  2746. /*
  2747. typedef enum
  2748. {
  2749. ESIdle = 0x01;
  2750. ESPreparing = 0x02;
  2751. ESCharging = 0x03;
  2752. ESChargingTerminating = 0x04;
  2753. ESFault = 0x05;
  2754. }EmulatorStatus;
  2755. */
  2756. //setStatusMode(CCS_QUANTITY, STOP);
  2757. //CCS
  2758. ShmSysConfigAndInfo->ate.targetCurrent_Value = targetCurrent_Value;
  2759. ShmSysConfigAndInfo->ate.targetVoltage_Value = targetVoltage_Value;
  2760. ShmSysConfigAndInfo->ate.maximumCurrent_value = maximumCurrent_value;
  2761. ShmSysConfigAndInfo->ate.maximumVoltage_value = maximumVoltage_value;
  2762. ShmSysConfigAndInfo->ate.linkVoltage = linkVoltage;
  2763. ShmSysConfigAndInfo->ate.contactorVoltage = contactorVoltage;//contactorVoltage;
  2764. //GB
  2765. ShmSysConfigAndInfo->ate.PresentBattVoltage = 4700;
  2766. ShmSysConfigAndInfo->ate.MinimumChargeCurrent = 20;
  2767. ShmSysConfigAndInfo->ate.RequireVoltage = 3800;
  2768. //ShmSysConfigAndInfo->ate.RequireVoltage = 4700;
  2769. ShmSysConfigAndInfo->ate.RequireCurrent = 600;
  2770. ShmSysConfigAndInfo->ate.chademoTargetVoltage_Value = 4800;
  2771. ShmSysConfigAndInfo->ate.chademoTargetCurrent_Value = 30;
  2772. //ShmSysConfigAndInfo->ate.targetCurrent_Value = 1200;
  2773. ShmSysConfigAndInfo->ate.Permission = STOP;
  2774. ShmSysConfigAndInfo->ate.TotalBatteryCap = 1000; //0.1
  2775. ShmSysConfigAndInfo->ate.MaxBatteryCurrent = 1200; //0.1
  2776. ShmSysConfigAndInfo->ate.MaxBatteryVoltage = 5000; //0.1
  2777. ShmSysConfigAndInfo->ate.status = 0;
  2778. ShmSysConfigAndInfo->ate.chademo.id03.state = 0;
  2779. ShmSysConfigAndInfo->ate.ATEStatus = 0x00;
  2780. ShmSysConfigAndInfo->ate.cstatus = 0;
  2781. ShmSysConfigAndInfo->ate.chademo.PresentChargedDuration = 0;
  2782. ShmSysConfigAndInfo->ate.chademo.RemainChargingDuration = 0;
  2783. setStatusMode(CCS_QUANTITY, STOP);
  2784. if(ShmSysConfigAndInfo->ate.ATEState == 1){
  2785. }else if(ShmSysConfigAndInfo->ate.ATEState == 2){
  2786. }
  2787. setATEMode(CCS_QUANTITY, ShmSysConfigAndInfo->ate.ATEState);
  2788. while(CanFd){
  2789. //ShmSysConfigAndInfo->ate.ATEState
  2790. if(ShmSysConfigAndInfo->ate.ATEState == 1){//VCCU
  2791. //TODO
  2792. //ShmSysConfigAndInfo->ate.ateMode = 0;
  2793. }else if(ShmSysConfigAndInfo->ate.ATEState == 2){//GB
  2794. //TODO
  2795. //ShmSysConfigAndInfo->ate.ateMode = 0;
  2796. }else{//none
  2797. // init
  2798. }
  2799. int state = isATEChange(CCS_QUANTITY);
  2800. if(state){
  2801. //TODO
  2802. }
  2803. if(ShmSysConfigAndInfo->ate.ATEState == 1){//VCCU
  2804. /*
  2805. VCCU_Requests(0, 0, 0,
  2806. 3, 3, 3, 3,
  2807. 3, 3, 3,
  2808. 7, 3, 3);
  2809. */
  2810. setBootNotification1();
  2811. // 輸出電壓
  2812. //測試value
  2813. //GetPersentOutputVol();
  2814. // 三相輸入電壓
  2815. //GetPresentInputVol();
  2816. statusCheck();
  2817. // Relay
  2818. CheckRelayOutput(CCS_QUANTITY);
  2819. //依據當前各槍的狀態選擇 搭上/放開 Relay
  2820. SetEvContactorRelayStatus(CCS_QUANTITY);
  2821. int status = isModeChange(CCS_QUANTITY);/**/
  2822. // 搭上/鬆開 Relay
  2823. // 放開 Relay 之前要先確認輸出的電壓電流是否已經降到某個值
  2824. if(IsNoneMatchRelayStatus())
  2825. {
  2826. if (Config_Relay_Output(Uart5Fd, Addr.Relay, &outputRelay))
  2827. {
  2828. printf("Match Relay............................ \n");
  2829. MatchRelayStatus();
  2830. printf("reg relay, AC = %x, g1_p = %x, g1_n = %x, g2_p = %x, g2_n = %x, pre = %x \n",
  2831. regRelay.relay_event.bits.AC_Contactor,
  2832. regRelay.relay_event.bits.Gun1_P,
  2833. regRelay.relay_event.bits.Gun1_N,
  2834. regRelay.relay_event.bits.Gun2_P,
  2835. regRelay.relay_event.bits.Gun2_N,
  2836. regRelay.relay_event.bits.CCS_Precharge);
  2837. }
  2838. }
  2839. switch(chargingInfo[CCS_QUANTITY]->SystemStatus){
  2840. case V_IDLE:{
  2841. if (status){
  2842. printf("CCS IDLE Processing 1....................\n");
  2843. }
  2844. setEVStatus1(evstaus[0]);
  2845. break;
  2846. }
  2847. case V_UNMATEDPLUG:{
  2848. if (status){
  2849. printf("CCS UNMATEDPLUG Processing 2....................\n");
  2850. }
  2851. setEVStatus1(evstaus[0]);
  2852. VCCU_ChargeFromVehicle(CanFd, ShmSysConfigAndInfo->ate.linkVoltage, 0, Not_allowed, Active, Not_allowed, Not_allowed, Opened);
  2853. break;
  2854. }
  2855. case V_MATED_PLUG_INLET_UNLOCKED:{
  2856. if (status){
  2857. if(ShmSysConfigAndInfo->ate.vccu.inletStatus.DATA2.VCCU_PlugPresent_Status == VCCU_InletStatus_Connected){
  2858. }
  2859. printf("CCS MATED_PLUG_INLET_UNLOCKED Processing 3....................\n");
  2860. }
  2861. setEVStatus1(evstaus[0]);
  2862. VCCU_ChargeFromVehicle(CanFd, ShmSysConfigAndInfo->ate.linkVoltage, 0, Not_allowed, Active, Allowed, Not_allowed, Opened);
  2863. break;
  2864. }
  2865. case V_INLETLOCKING:{
  2866. if (status){
  2867. printf("CCS INLETLOCKING Processing 4....................\n");
  2868. }
  2869. setEVStatus1(evstaus[0]);
  2870. break;
  2871. }
  2872. case V_INLETLOCKED:{
  2873. if (status){
  2874. printf("CCS INLETLOCKED Processing 5....................\n");
  2875. }
  2876. setEVStatus1(evstaus[1]);
  2877. VCCU_ChargeFromVehicle(CanFd, ShmSysConfigAndInfo->ate.linkVoltage, 0, Not_allowed, Active, Allowed, Not_allowed, Opened);
  2878. break;
  2879. }
  2880. case V_SLAC:{
  2881. if (status){
  2882. printf("CCS SLAC Processing 6....................\n");
  2883. }
  2884. setEVStatus1(evstaus[1]);
  2885. VCCU_ChargeFromVehicle(CanFd, ShmSysConfigAndInfo->ate.linkVoltage, 0, Not_allowed, Active, Allowed, Not_allowed, Opened);
  2886. break;
  2887. }
  2888. case V_DEFINITION:{
  2889. if (status){
  2890. printf("CCS DEFINITION Processing 7....................\n");
  2891. }
  2892. setEVStatus1(evstaus[1]);
  2893. VCCU_V2G_VehicleStatus(CanFd, VCCU_V2G_StateM_EnergyTra_0000_DC_DC_extended, 0, 3, 0,
  2894. 3, 3, TRUE, 3, 3, 3, 3, 3, 0, 3, 0, 3, 3);
  2895. /*
  2896. VCCU_V2G_EVMaximumVoltageLimit(TRUE, U_V, 500, TRUE, 0);
  2897. VCCU_V2G_EVMaximumCurrentLimit(TRUE, U_A, TRUE, 0, 10);
  2898. */
  2899. VCCU_V2G_EVMaximumVoltageLimit(TRUE, U_V, ShmSysConfigAndInfo->ate.maximumVoltage_value, TRUE, 0);
  2900. VCCU_V2G_EVMaximumCurrentLimit(TRUE, U_A, TRUE, 0, ShmSysConfigAndInfo->ate.maximumCurrent_value);
  2901. break;
  2902. }
  2903. case V_CABLECHECK:{
  2904. if (status){
  2905. printf("CCS CABLECHECK Processing 8....................\n");
  2906. }
  2907. setEVStatus1(evstaus[1]);
  2908. VCCU_ChargeFromVehicle(CanFd, ShmSysConfigAndInfo->ate.linkVoltage, 0, Allowed, Active, Allowed, Not_allowed, Opened);
  2909. break;
  2910. }
  2911. case V_ISOLATION:{
  2912. if (status){
  2913. printf("CCS ISOLATION Processing 9....................\n");
  2914. }
  2915. setEVStatus1(evstaus[1]);
  2916. VCCU_ChargeFromVehicle(CanFd, ShmSysConfigAndInfo->ate.linkVoltage, 0, Allowed, Not_Active, Allowed, Not_allowed, Opened);
  2917. break;
  2918. }
  2919. case V_VOLTAGEDIFFERENCE:{
  2920. if (status){
  2921. printf("CCS VOLTAGEDIFFERENCE Processing 10....................\n");
  2922. }
  2923. setEVStatus1(evstaus[1]);
  2924. VCCU_ChargeFromVehicle(CanFd, ShmSysConfigAndInfo->ate.linkVoltage, ShmSysConfigAndInfo->ate.linkVoltage, Allowed, Not_Active, Allowed, Not_allowed, Opened);
  2925. VCCU_V2G_EVTargetCurrent(U_A, ShmSysConfigAndInfo->ate.targetCurrent_Value, TRUE, 0);
  2926. break;
  2927. }
  2928. case V_CONTACTORSCLOSED:{
  2929. if (status){
  2930. printf("CCS CONTACTORSCLOSED Processing 11....................\n");
  2931. }
  2932. setEVStatus1(evstaus[1]);
  2933. VCCU_ChargeFromVehicle(CanFd, ShmSysConfigAndInfo->ate.linkVoltage, ShmSysConfigAndInfo->ate.linkVoltage, Allowed, Not_Active, Allowed, Not_allowed, Closed);
  2934. break;
  2935. }
  2936. case V_POWERDELIVERY:{
  2937. if (status){
  2938. printf("CCS POWERDELIVERY Processing 12....................\n");
  2939. }
  2940. VCCU_ChargeFromVehicle(CanFd, ShmSysConfigAndInfo->ate.linkVoltage, ShmSysConfigAndInfo->ate.linkVoltage, Allowed, Not_Active, Allowed, Not_allowed, Closed);
  2941. if(ShmSysConfigAndInfo->ate.ATEStatus == 0){
  2942. VCCU_ChargeFromVehicle(CanFd, ShmSysConfigAndInfo->ate.linkVoltage, ShmSysConfigAndInfo->ate.linkVoltage, Allowed, Not_Active, Allowed, Not_allowed, Closed);
  2943. }else{
  2944. VCCU_ChargeFromVehicle(CanFd, ShmSysConfigAndInfo->ate.linkVoltage, ShmSysConfigAndInfo->ate.linkVoltage, Not_allowed, Not_Active, Allowed, Not_allowed, Opened);
  2945. }
  2946. //VCCU_V2G_EVTargetVoltage(400, U_V, TRUE, 0);
  2947. setEVStatus1(evstaus[1]);
  2948. break;
  2949. }
  2950. case V_CURRENTDEMAND:{
  2951. if (status){
  2952. printf("CCS CURRENTDEMAND Processing 13....................\n");
  2953. }
  2954. setEVStatus1(evstaus[2]);
  2955. VCCU_V2G_VehicleStatus(CanFd, VCCU_V2G_StateM_EnergyTra_0000_DC_DC_extended, 0,
  2956. 3, 0,
  2957. 3, 3, TRUE,
  2958. 3, 3, 3,
  2959. 3, 3, 0,
  2960. 3, 0, 3,
  2961. 3);
  2962. //printf("targetVoltage_Value= %d targetCurrent_Value =%d maximumVoltage_value = %d maximumCurrent_value = %d linkVoltage = %d \n",ShmSysConfigAndInfo->ate.targetVoltage_Value, ShmSysConfigAndInfo->ate.targetCurrent_Value, ShmSysConfigAndInfo->ate.maximumVoltage_value, ShmSysConfigAndInfo->ate.maximumCurrent_value, ShmSysConfigAndInfo->ate.linkVoltage);
  2963. /*
  2964. VCCU_V2G_EVMaximumVoltageLimit(TRUE, U_V, 500, TRUE, 0);
  2965. VCCU_V2G_EVMaximumCurrentLimit(TRUE, U_A, TRUE, 0, 10);
  2966. VCCU_V2G_EVTargetVoltage(400, U_V, TRUE, 0);
  2967. VCCU_V2G_EVTargetCurrent(U_A, 2, TRUE, 0);
  2968. VCCU_ChargeFromVehicle(CanFd, 500, 500, Allowed, Not_Active, Allowed, Not_allowed, Closed);
  2969. */
  2970. VCCU_V2G_EVMaximumVoltageLimit(TRUE, U_V, ShmSysConfigAndInfo->ate.maximumVoltage_value, TRUE, 0);
  2971. VCCU_V2G_EVMaximumCurrentLimit(TRUE, U_A, TRUE, 0, ShmSysConfigAndInfo->ate.maximumCurrent_value);
  2972. VCCU_V2G_EVTargetVoltage(ShmSysConfigAndInfo->ate.targetVoltage_Value, U_V, TRUE, 0);
  2973. VCCU_V2G_EVTargetCurrent(U_A, ShmSysConfigAndInfo->ate.targetCurrent_Value, TRUE, 0);
  2974. //VCCU_ChargeFromVehicle(CanFd, ShmSysConfigAndInfo->ate.linkVoltage, ShmSysConfigAndInfo->ate.linkVoltage, Allowed, Not_Active, Allowed, Not_allowed, Closed);
  2975. if(ShmSysConfigAndInfo->ate.ATEStatus == 0){
  2976. //VCCU_ChargeFromVehicle(CanFd, 500, 500, Allowed, Not_Active, Allowed, Not_allowed, Closed);
  2977. VCCU_ChargeFromVehicle(CanFd, ShmSysConfigAndInfo->ate.linkVoltage, ShmSysConfigAndInfo->ate.linkVoltage, Allowed, Not_Active, Allowed, Not_allowed, Closed);
  2978. }else{
  2979. //VCCU_ChargeFromVehicle(CanFd, 500, 500, Not_allowed, Not_Active, Allowed, Not_allowed, Closed);
  2980. VCCU_ChargeFromVehicle(CanFd, ShmSysConfigAndInfo->ate.linkVoltage, ShmSysConfigAndInfo->ate.linkVoltage, Not_allowed, Not_Active, Allowed, Not_allowed, Closed);
  2981. }
  2982. break;
  2983. }
  2984. case V_POWERDELIVERYFALSE:{
  2985. if (status){
  2986. printf("CCS POWERDELIVERYFALSE Processing 14....................\n");
  2987. }
  2988. setEVStatus1(evstaus[3]);
  2989. VCCU_ChargeFromVehicle(CanFd, ShmSysConfigAndInfo->ate.linkVoltage, ShmSysConfigAndInfo->ate.linkVoltage, Not_allowed, Not_Active, Allowed, Not_allowed, Opened);
  2990. break;
  2991. }
  2992. case V_DETECTION:{
  2993. if (status){
  2994. printf("CCS DETECTION Processing 15....................\n");
  2995. }
  2996. setEVStatus1(evstaus[3]);
  2997. VCCU_ChargeFromVehicle(CanFd, ShmSysConfigAndInfo->ate.linkVoltage, 0, Not_allowed, Active, Allowed, Not_allowed, Opened);
  2998. break;
  2999. }
  3000. case V_SESSION_STOP:{
  3001. if (status){
  3002. printf("CCS SESSION_STOP Processing 16....................\n");
  3003. }
  3004. setEVStatus1(evstaus[3]);
  3005. VCCU_ChargeFromVehicle(CanFd, ShmSysConfigAndInfo->ate.linkVoltage, 0, Not_allowed, Active, Allowed, Not_allowed, Opened);
  3006. break;
  3007. }
  3008. case V_STOP_COMMUNICATION_SESSION:{
  3009. if (status){
  3010. printf("CCS STOP_COMMUNICATION_SESSION Processing 17....................\n");
  3011. }
  3012. setEVStatus1(evstaus[3]);
  3013. VCCU_ChargeFromVehicle(CanFd, ShmSysConfigAndInfo->ate.linkVoltage, 0, Not_allowed, Active, Allowed, Not_allowed, Opened);
  3014. break;
  3015. }
  3016. case V_FINISHED:{
  3017. if (status){
  3018. printf("CCS FINISHED Processing 18....................\n");
  3019. }
  3020. setEVStatus1(evstaus[3]);
  3021. VCCU_ChargeFromVehicle(CanFd, ShmSysConfigAndInfo->ate.linkVoltage, 0, Not_allowed, Active, Allowed, Not_allowed, Opened);
  3022. break;
  3023. }
  3024. default:{
  3025. break;
  3026. }
  3027. }
  3028. //usleep(100000);
  3029. usleep(whileLoopTime);
  3030. }else if(ShmSysConfigAndInfo->ate.ATEState == 2){//GB
  3031. if(ShmSysConfigAndInfo->ate.status == 0){
  3032. int status = isStatusChange(CCS_QUANTITY);
  3033. // 輸出電壓
  3034. //GetPersentOutputVol();
  3035. // Relay
  3036. CheckRelayOutput(CCS_QUANTITY);
  3037. //依據當前各槍的狀態選擇 搭上/放開 Relay
  3038. SetEvContactorRelayStatus(CCS_QUANTITY);
  3039. // 搭上/鬆開 Relay
  3040. // 放開 Relay 之前要先確認輸出的電壓電流是否已經降到某個值
  3041. if(IsNoneMatchRelayStatus())
  3042. {
  3043. if (Config_Relay_Output(Uart5Fd, Addr.Relay, &outputRelay))
  3044. {
  3045. //printf("Match Relay............................ \n");
  3046. MatchRelayStatus();
  3047. printf("reg relay, AC = %x, g1_p = %x, g1_n = %x, g2_p = %x, g2_n = %x, pn = %x, pp = %x \n",
  3048. regRelay.relay_event.bits.AC_Contactor,
  3049. regRelay.relay_event.bits.Gun1_P,
  3050. regRelay.relay_event.bits.Gun1_N,
  3051. regRelay.relay_event.bits.Gun2_P,
  3052. regRelay.relay_event.bits.Gun2_N,
  3053. regRelay.relay_event.bits.Gun1_Parallel_N,
  3054. regRelay.relay_event.bits.Gun1_Parallel_P);
  3055. //
  3056. //ftime(&startChargingTime[CCS_QUANTITY]);
  3057. }
  3058. }
  3059. usleep(1000);
  3060. setMisc(1);
  3061. if(ShmSysConfigAndInfo->ate.ATEStatus == 1){
  3062. ShmSysConfigAndInfo->ate.Permission = START;
  3063. setStatusMode(CCS_QUANTITY, ShmSysConfigAndInfo->ate.Permission);
  3064. //printf("ATEStatus == 1 %d \n",ShmSysConfigAndInfo->ate.ATEStatus);
  3065. }else if(ShmSysConfigAndInfo->ate.ATEStatus == 2){
  3066. ShmSysConfigAndInfo->ate.Permission = STOP;
  3067. setStatusMode(CCS_QUANTITY, ShmSysConfigAndInfo->ate.Permission);
  3068. //printf("ATEStatus == 2 %d \n",ShmSysConfigAndInfo->ate.ATEStatus);
  3069. ShmSysConfigAndInfo->ate.ATEStatus = 0;
  3070. }else if(ShmSysConfigAndInfo->ate.ATEStatus == 3){
  3071. setEVStatus2(evstaus[4]);
  3072. ShmSysConfigAndInfo->ate.Permission = STOP;
  3073. setStatusMode(CCS_QUANTITY, ShmSysConfigAndInfo->ate.Permission);
  3074. ShmSysConfigAndInfo->ate.ATEStatus = 0x00;
  3075. SetChargingPermission(CCS_QUANTITY, ShmSysConfigAndInfo->ate.Permission, ShmSysConfigAndInfo->ate.TotalBatteryCap, ShmSysConfigAndInfo->ate.MaxBatteryCurrent, ShmSysConfigAndInfo->ate.MaxBatteryVoltage, 1);
  3076. EvseStopChargingEvent(normalStop, stopReason, 1);
  3077. }else{
  3078. }
  3079. if(ShmSysConfigAndInfo->ate.chademo.id03.state == 0 || ShmSysConfigAndInfo->ate.Permission == 0){
  3080. //SetChargingPermission(CCS_QUANTITY, START, 1000, 1200, 6000, 1);
  3081. //setChargerMode(CCS_QUANTITY, ShmSysConfigAndInfo->ate.Permission);
  3082. ShmSysConfigAndInfo->ate.Permission = START;
  3083. setStatusMode(CCS_QUANTITY, ShmSysConfigAndInfo->ate.Permission);
  3084. SetChargingPermission(CCS_QUANTITY, ShmSysConfigAndInfo->ate.Permission, ShmSysConfigAndInfo->ate.TotalBatteryCap, ShmSysConfigAndInfo->ate.MaxBatteryCurrent, ShmSysConfigAndInfo->ate.MaxBatteryVoltage, 1);
  3085. }else if(ShmSysConfigAndInfo->ate.chademo.id03.state ==1){
  3086. ShmSysConfigAndInfo->ate.Permission = STOP;
  3087. }else if(ShmSysConfigAndInfo->ate.chademo.id03.state ==2){
  3088. ShmSysConfigAndInfo->ate.Permission = STOP;
  3089. }else if(ShmSysConfigAndInfo->ate.chademo.id03.state ==3){
  3090. ShmSysConfigAndInfo->ate.Permission = STOP;
  3091. }else if(ShmSysConfigAndInfo->ate.chademo.id03.state ==4){
  3092. ShmSysConfigAndInfo->ate.Permission = STOP;
  3093. }else if(ShmSysConfigAndInfo->ate.chademo.id03.state == 5){
  3094. ShmSysConfigAndInfo->ate.Permission = STOP;
  3095. setEVStatus2(evstaus[1]);
  3096. }else if(ShmSysConfigAndInfo->ate.chademo.id03.state == 6){
  3097. ShmSysConfigAndInfo->ate.Permission = STOP;
  3098. setEVStatus2(evstaus[1]);
  3099. }else if(ShmSysConfigAndInfo->ate.chademo.id03.state == 7){
  3100. ShmSysConfigAndInfo->ate.Permission = STOP;
  3101. setEVStatus2(evstaus[2]);
  3102. //setEVStatus2(evstaus[2]);
  3103. }else if(ShmSysConfigAndInfo->ate.chademo.id03.state == 8){
  3104. ShmSysConfigAndInfo->ate.Permission = STOP;
  3105. setEVStatus2(evstaus[2]);
  3106. //setEVStatus2(evstaus[2]);
  3107. }//else if(ShmSysConfigAndInfo->ate.chademo.id03.state == 16 ){
  3108. else if(ShmSysConfigAndInfo->ate.chademo.id03.state >= 13 ){
  3109. handleEmulatorFaultStatus();
  3110. }else if(ShmSysConfigAndInfo->ate.chademo.id03.state == 14 ){
  3111. handleEmulatorFaultStatus();
  3112. }else if(ShmSysConfigAndInfo->ate.chademo.id03.state == 9 || ShmSysConfigAndInfo->ate.chademo.id03.state == 10
  3113. || ShmSysConfigAndInfo->ate.chademo.id03.state == 11 || ShmSysConfigAndInfo->ate.chademo.id03.state == 12
  3114. //|| ShmSysConfigAndInfo->ate.chademo.id03.state == 13
  3115. //|| ShmSysConfigAndInfo->ate.chademo.id03.state == 15
  3116. ){
  3117. ShmSysConfigAndInfo->ate.Permission = STOP;
  3118. //setEVStatus2(evstaus[3]);
  3119. setEVStatus2(evstaus[3]);
  3120. }else{
  3121. setEVStatus2(evstaus[0]);
  3122. //printf("4 %d %d\n",ShmSysConfigAndInfo->ate.chademo.id03.state,ShmSysConfigAndInfo->ate.chademo.id0D_req.K1K2Status);
  3123. }
  3124. if(ShmSysConfigAndInfo->ate.chademo.id03.ProximitySignal == 0){
  3125. //printf("1 %d ===== \n", ShmSysConfigAndInfo->ate.chademo.id03.ProximitySignal);
  3126. setEVStatus2(evstaus[3]);
  3127. }else if(ShmSysConfigAndInfo->ate.chademo.id03.ProximitySignal == 1 && ShmSysConfigAndInfo->ate.chademo.id03.state != 7 &&
  3128. ShmSysConfigAndInfo->ate.chademo.id03.state != 9 && ShmSysConfigAndInfo->ate.chademo.id03.state != 10
  3129. && ShmSysConfigAndInfo->ate.chademo.id03.state != 11 && ShmSysConfigAndInfo->ate.chademo.id03.state != 12
  3130. && ShmSysConfigAndInfo->ate.chademo.id03.state != 13
  3131. && ShmSysConfigAndInfo->ate.chademo.id03.state != 15){
  3132. //printf("2 %d ===== \n", ShmSysConfigAndInfo->ate.chademo.id03.ProximitySignal);
  3133. setEVStatus2(evstaus[1]);
  3134. }
  3135. if(status){
  3136. //printf("status change1 %d ===== \n", status);
  3137. SetChargingPermission(CCS_QUANTITY, ShmSysConfigAndInfo->ate.Permission, ShmSysConfigAndInfo->ate.TotalBatteryCap, ShmSysConfigAndInfo->ate.MaxBatteryCurrent, ShmSysConfigAndInfo->ate.MaxBatteryVoltage, 1);
  3138. }else{
  3139. if(ShmSysConfigAndInfo->ate.Permission == STOP ){
  3140. if(ShmSysConfigAndInfo->ate.chademo.id03.state == 0){
  3141. //printf("status change0 %d ===== \n", status);
  3142. //SetChargingPermission(CCS_QUANTITY, ShmSysConfigAndInfo->ate.Permission, ShmSysConfigAndInfo->ate.TotalBatteryCap, ShmSysConfigAndInfo->ate.MaxBatteryCurrent, ShmSysConfigAndInfo->ate.MaxBatteryVoltage, 1);
  3143. SetChargingPermission(CCS_QUANTITY, ShmSysConfigAndInfo->ate.Permission, ShmSysConfigAndInfo->ate.TotalBatteryCap, ShmSysConfigAndInfo->ate.MaxBatteryCurrent, ShmSysConfigAndInfo->ate.MaxBatteryVoltage, 1);
  3144. }
  3145. }
  3146. }
  3147. //SetChargingPermission(CCS_QUANTITY, ShmSysConfigAndInfo->ate.Permission, ShmSysConfigAndInfo->ate.TotalBatteryCap, ShmSysConfigAndInfo->ate.MaxBatteryCurrent, ShmSysConfigAndInfo->ate.MaxBatteryVoltage, 1);
  3148. //SetChargingPermission(CCS_QUANTITY, START, 1000, 1200, 6000, 1);
  3149. usleep(1000);
  3150. //給火線電壓
  3151. SetPresentInputPower(ShmSysConfigAndInfo->ate.chademoTargetVoltage_Value, ShmSysConfigAndInfo->ate.chademoTargetCurrent_Value, 1);
  3152. usleep(1000);
  3153. //SetPresentInputRequirement(4800, 6000, 1920, 20);
  3154. SetPresentInputRequirement(ShmSysConfigAndInfo->ate.RequireVoltage, ShmSysConfigAndInfo->ate.RequireCurrent, ShmSysConfigAndInfo->ate.PresentBattVoltage, ShmSysConfigAndInfo->ate.MinimumChargeCurrent, 1);
  3155. }
  3156. }
  3157. }
  3158. printf("End. \n");
  3159. return FAIL;
  3160. }