Ev_Comm.c 8.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313
  1. #include "Module_EvComm.h"
  2. #include "VCCU.h"
  3. #include <linux/can.h>
  4. #include <linux/can/raw.h>
  5. #include <string.h>
  6. #include <stdio.h> /*標準輸入輸出定義*/
  7. #include <stdlib.h> /*標準函數庫定義*/
  8. #include <unistd.h> /*Unix 標準函數定義*/
  9. #include <fcntl.h> /*檔控制定義*/
  10. #include <termios.h> /*PPSIX 終端控制定義*/
  11. #include <errno.h> /*錯誤號定義*/
  12. //================================================
  13. //================================================
  14. // CANBUS send cmd
  15. //================================================
  16. //================================================
  17. int PackageIdCmd(int cmd)
  18. {
  19. return cmd | 0x80000000;
  20. }
  21. void SendCmdToEvboard(int canfd, int cmd, byte *data, byte dataLen)
  22. {
  23. struct can_frame frame;
  24. frame.can_id = PackageIdCmd(cmd);//(0x00001000 + cmd) | 0x80000000;//(cmd | 0x80000000);
  25. frame.can_dlc = dataLen;
  26. memcpy(frame.data, data, sizeof(frame.data));
  27. write(canfd, &frame, sizeof(struct can_frame));
  28. }
  29. void SendCmdToEvboard2(int canfd, int cmd, byte *data, byte dataLen)
  30. {
  31. struct can_frame frame;
  32. frame.can_id = PackageIdCmd(cmd);//(0x00001000 + cmd) | 0x80000000;//(cmd | 0x80000000);
  33. frame.can_dlc = dataLen;
  34. memcpy(frame.data, data, sizeof(frame.data));
  35. write(canfd, &frame, sizeof(struct can_frame));
  36. //printf("%08X %08X ....................\n" , cmd, PackageIdCmd(cmd));
  37. //usleep(2000);
  38. }
  39. void setBootNotification1(){
  40. byte data[8];
  41. data[0] = 0x02;
  42. data[1] = 0x02;
  43. data[2] = 0x02;
  44. data[3] = 0x02;
  45. data[4] = 0x03;
  46. data[5] = 0x03;
  47. data[6] = 0x03;
  48. data[7] = 0x03;
  49. int id = PackageIdCmd(bn1);
  50. SendCmdToEvboard(CanFd2, id, data, sizeof(data));
  51. }
  52. void setBootNotification2(){
  53. byte data[8];
  54. data[0] = 0x04;
  55. data[1] = 0x04;
  56. data[2] = 0x04;
  57. data[3] = 0x04;
  58. data[4] = 0x05;
  59. data[5] = 0x05;
  60. data[6] = 0x05;
  61. data[7] = 0x05;
  62. int id = PackageIdCmd(bn2);
  63. SendCmdToEvboard(CanFd2, id, data, sizeof(data));
  64. }
  65. void setEVStatus1(byte evstatus){
  66. byte data[1];
  67. data[0] = evstatus;
  68. int id = PackageIdCmd(EVStatus1);
  69. SendCmdToEvboard(CanFd2, id, data, sizeof(data));
  70. }
  71. void setEVStatus2(byte evstatus){
  72. byte data[1];
  73. data[0] = evstatus;
  74. int id = PackageIdCmd(EVStatus2);
  75. SendCmdToEvboard(CanFd2, id, data, sizeof(data));
  76. }
  77. void GetFirmwareVersion(byte gun_index, byte toId)
  78. {
  79. int id = PackageIdCmd(Ev_Cmd.get_firmware_ver + toId);
  80. byte data[8];
  81. SendCmdToEvboard(CanFd, id, data, 0);
  82. }
  83. void GetHardwareVersion(byte gun_index, byte toId)
  84. {
  85. int id = PackageIdCmd(Ev_Cmd.get_hardware_ver + toId);
  86. byte data[8];
  87. SendCmdToEvboard(CanFd, id, data, 0);
  88. }
  89. void SetChargingPermission(byte gun_index, byte permissionStatus, short aOutputPw, short aOutputCur, short aOutputVol, byte toId)
  90. {
  91. int id = PackageIdCmd(Ev_Cmd.charging_permission + toId);
  92. byte data[8];
  93. data[0] = permissionStatus;
  94. data[1] = aOutputPw & 0xff;
  95. data[2] = (aOutputPw >> 8) & 0xff;
  96. data[3] = aOutputCur & 0xff;
  97. data[4] = (aOutputCur >> 8) & 0xff;
  98. data[5] = aOutputVol & 0xff;
  99. data[6] = (aOutputVol >> 8) & 0xff;
  100. data[7] = 0xff;
  101. //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] );
  102. SendCmdToEvboard(CanFd, id, data, sizeof(data));
  103. }
  104. void GetMiscellaneousInfo(byte gun_index, byte toId, short K1K2Status, short soc)
  105. {
  106. int id = PackageIdCmd(Ev_Cmd.get_miscellaneous_info + toId);
  107. byte data[8];
  108. data[0] = 0x01;
  109. data[1] = 0x02;
  110. data[2] = 0x03;
  111. data[3] = 0x04;
  112. data[4] = 0x05;
  113. data[5] = K1K2Status & 0xff;
  114. data[6] = soc & 0xff;
  115. data[7] = 0x08;
  116. //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] );
  117. /*
  118. data[1] = 0x0001;
  119. data[2] = 0x0001;
  120. data[3] = 0x10;
  121. data[4] = 0x10;
  122. */
  123. SendCmdToEvboard(CanFd, id, data, sizeof(data));
  124. }
  125. //TODO
  126. void setMisc(byte toId, float K1K2Status, float soc){
  127. /*
  128. float K1K2Status = 0;
  129. float soc = 0;
  130. K1K2Status = ShmSysConfigAndInfo->ate.chademo.id0D_req.K1K2Status;
  131. soc = ShmSysConfigAndInfo->ate.chademo.id0D_req.Soc;
  132. */
  133. GetMiscellaneousInfo(0, toId, K1K2Status, soc);
  134. }
  135. void SetPresentInputPower(short outputVol_b1, short outputCur_b1, byte toId)
  136. {
  137. int id = PackageIdCmd(Ev_Cmd.present_input_power + toId);
  138. byte data[8];
  139. data[0] = outputVol_b1 & 0xff;
  140. data[1] = (outputVol_b1 >> 8) & 0xff;
  141. data[2] = outputCur_b1 & 0xff;
  142. data[3] = (outputCur_b1 >> 8) & 0xff;
  143. /*
  144. data[4] = outputVol_b2 & 0xff;
  145. data[5] = (outputVol_b2 >> 8) & 0xff;
  146. data[6] = outputCur_b2 & 0xff;
  147. data[7] = (outputCur_b2 >> 8) & 0xff;
  148. */
  149. //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] );
  150. SendCmdToEvboard(CanFd, id, data, sizeof(data));
  151. }
  152. void SetPresentInputRequirement(short aOutputPw_b1, short aOutputCur_b1, short aOutputPw_b2, short aOutputCur_b2, byte toId)
  153. {
  154. int id = PackageIdCmd(Ev_Cmd.present_input_requirement + toId );
  155. byte data[8];
  156. data[0] = aOutputPw_b1 & 0xff;
  157. data[1] = (aOutputPw_b1 >> 8) & 0xff;
  158. data[2] = aOutputCur_b1 & 0xff;
  159. data[3] = (aOutputCur_b1 >> 8) & 0xff;
  160. data[4] = aOutputPw_b2 & 0xff;
  161. data[5] = (aOutputPw_b2 >> 8) & 0xff;
  162. data[6] = aOutputCur_b2 & 0xff;
  163. data[7] = 0x01;
  164. /*
  165. data[6] = aOutputCur_b2 & 0xff;
  166. data[7] = (aOutputCur_b2 >> 8) & 0xff;
  167. */
  168. //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] );
  169. SendCmdToEvboard(CanFd, id, data, sizeof(data));
  170. }
  171. void GetEvseOutputStatus(byte gun_index, byte toId)
  172. {
  173. int id = PackageIdCmd(Ev_Cmd.get_evse_output_status + toId);
  174. byte data[8];
  175. SendCmdToEvboard(CanFd, id, data, 0);
  176. }
  177. void GetEvseCapacityInfo(byte gun_index, byte toId)
  178. {
  179. int id = PackageIdCmd(Ev_Cmd.get_evse_capacity_info + toId);
  180. byte data[8];
  181. SendCmdToEvboard(CanFd, id, data, 0);
  182. }
  183. void EvseStopChargingEvent(byte stopResult, byte *stopReason, byte toId)
  184. {
  185. int id = PackageIdCmd(Ev_Cmd.evse_stop_charging + toId);
  186. byte data[8];
  187. data[0] = stopResult;
  188. data[1] = *stopReason;
  189. data[2] = *(stopReason + 1);
  190. data[3] = *(stopReason + 2);
  191. data[4] = *(stopReason + 3);
  192. data[5] = *(stopReason + 4);
  193. data[6] = *(stopReason + 5);
  194. SendCmdToEvboard(CanFd, id, data, sizeof(data));
  195. }
  196. void SetIsolationStatus(byte gun_index, byte result, byte toId)
  197. {
  198. int id = PackageIdCmd(Ev_Cmd.isolation_status + toId);
  199. byte data[8];
  200. data[0] = result;
  201. SendCmdToEvboard(CanFd, id, data, 1);
  202. }
  203. void SetEvsePrechargeInfo(byte gun_index, byte result, byte toId)
  204. {
  205. int id = PackageIdCmd(Ev_Cmd.evse_precharge_info + toId);
  206. byte data[8];
  207. data[0] = result;
  208. SendCmdToEvboard(CanFd, id, data, 1);
  209. }
  210. void SetTargetAddr(byte *target_number, byte index)
  211. {
  212. int id = PackageIdCmd(Ev_Cmd.address_assignment + index);
  213. //printf("intCmd = %x \n", cmd & CAN_EFF_MASK);
  214. //cmd = cmd & CAN_EFF_MASK;
  215. byte data[8];
  216. data[0] = *target_number;
  217. data[1] = *(target_number + 1);
  218. data[2] = *(target_number + 2);
  219. data[3] = *(target_number + 3);
  220. data[4] = index;
  221. SendCmdToEvboard(CanFd2, id, data, sizeof(data));
  222. }
  223. void setVCCU_Requests(byte *data, byte dataLen){
  224. SendCmdToEvboard(CanFd, VCCU_RequestsIds, data, dataLen);
  225. }
  226. void setVCCU_ChargeFromVehicle(byte *data, byte dataLen){
  227. SendCmdToEvboard(CanFd, VCCU_ChargeFromVehicleIds, data, dataLen);
  228. }
  229. void setVCCU_V2G_EVMaximumVoltageLimit(byte *data, byte dataLen){
  230. SendCmdToEvboard(CanFd, VCCU_V2G_EVMaximumVoltageLimitIds, data, dataLen);
  231. }
  232. void setVCCU_V2G_RemainingTimeToFullSO(byte *data, byte dataLen){
  233. SendCmdToEvboard(CanFd, VCCU_V2G_RemainingTimeToFullSOIds, data, dataLen);
  234. }
  235. void setVCCU_V2G_EVMaximumCurrentLimit(byte *data, byte dataLen){
  236. SendCmdToEvboard(CanFd, VCCU_V2G_EVMaximumCurrentLimitIds, data, dataLen);
  237. }
  238. void setVCCU_V2G_EVTargetVoltage(byte *data, byte dataLen){
  239. SendCmdToEvboard(CanFd, VCCU_V2G_EVTargetVoltageIds, data, dataLen);
  240. }
  241. void setVCCU_V2G_EVTargetCurrent(byte *data, byte dataLen){
  242. SendCmdToEvboard(CanFd, VCCU_V2G_EVTargetCurrentIds, data, dataLen);
  243. }
  244. void setVCCU_V2G_VehicleStatus(byte *data, byte dataLen){
  245. SendCmdToEvboard(CanFd, VCCU_V2G_VehicleStatusIds, data, dataLen);
  246. }
  247. void VCCU_TD(){
  248. byte data[8];
  249. data[0] = 0x00;
  250. data[1] = 0x00;
  251. data[2] = 0x01;
  252. data[3] = 0x01;
  253. data[4] = 0x00;
  254. data[5] = 0x00;
  255. data[6] = 0x42;
  256. data[7] = 0x66;
  257. SendCmdToEvboard(CanFd, TDId, data, sizeof(data));
  258. }