Infypwr_PsuCommObj.c 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634
  1. /*
  2. * Infypwr_PsuCommObj.c
  3. *
  4. * Created on: 2019年11月26日
  5. * Author: 7564
  6. */
  7. #include "Infypwr_PsuCommObj.h"
  8. struct Current_cmd_Proc Psu_cmd={
  9. 0,
  10. 0x02000200,
  11. 0x01000300,
  12. 0x01000400,
  13. 0x01000500,
  14. 0x01000600,
  15. 0x01000700,
  16. 0x01000800,
  17. 0x01000900,
  18. 0x02000A00,
  19. 0x02000B00,
  20. 0x01000C00,
  21. 0x02000F00,
  22. 0x02001000,
  23. 0x02001100,
  24. 0x02001200,
  25. 0x01001300,
  26. 0x02001400,
  27. 0x01001500,
  28. 0x01001600,
  29. 0x02001700,
  30. 0x01001800,
  31. 0x01001900,
  32. 0x01001A00,
  33. 0x02001B00,
  34. 0x0E001C00,
  35. };
  36. //================================================
  37. // Callback function
  38. //================================================
  39. void GetPsuAddressReq(void *func)
  40. {
  41. get_psu_addr_req = func;
  42. }
  43. void RefreshStatus(void *func)
  44. {
  45. return_status = func;
  46. }
  47. void RefreshInputVol(void *func)
  48. {
  49. return_input_vol = func;
  50. }
  51. void RefreshGetOutput(void *func)
  52. {
  53. return_get_output = func;
  54. }
  55. void RefreshHWVersion(void *func)
  56. {
  57. //return_hw_version = func;
  58. }
  59. void RefreshAvailableCap(void *func)
  60. {
  61. return_available_cap = func;
  62. }
  63. void RefreshOutputPowerSwitch(void *func)
  64. {
  65. return_output_pow_switch = func;
  66. }
  67. //================================================
  68. // CANBUS initialization
  69. //================================================
  70. int InitCanBus()
  71. {
  72. int s0,nbytes;
  73. struct timeval tv;
  74. struct ifreq ifr0;
  75. struct sockaddr_can addr0;
  76. system("/sbin/ip link set can1 down");
  77. system("/sbin/ip link set can1 type can bitrate 125000 restart-ms 100");
  78. system("/sbin/ip link set can1 up");
  79. s0 = socket(PF_CAN, SOCK_RAW, CAN_RAW);
  80. tv.tv_sec = 0;
  81. tv.tv_usec = 10000;
  82. if (setsockopt(s0, SOL_SOCKET, SO_RCVTIMEO, (char *)&tv, sizeof(struct timeval)) < 0)
  83. {
  84. #ifdef SystemLogMessage
  85. DEBUG_ERROR("Set SO_RCVTIMEO NG");
  86. #endif
  87. }
  88. nbytes=40960;
  89. if (setsockopt(s0, SOL_SOCKET, SO_RCVBUF, &nbytes, sizeof(int)) < 0)
  90. {
  91. #ifdef SystemLogMessage
  92. DEBUG_ERROR("Set SO_RCVBUF NG");
  93. #endif
  94. }
  95. nbytes=40960;
  96. if (setsockopt(s0, SOL_SOCKET, SO_SNDBUF, &nbytes, sizeof(int)) < 0)
  97. {
  98. #ifdef SystemLogMessage
  99. DEBUG_ERROR("Set SO_SNDBUF NG");
  100. #endif
  101. }
  102. strcpy(ifr0.ifr_name, "can1" );
  103. ioctl(s0, SIOCGIFINDEX, &ifr0); /* ifr.ifr_ifindex gets filled with that device's index */
  104. addr0.can_family = AF_CAN;
  105. addr0.can_ifindex = ifr0.ifr_ifindex;
  106. bind(s0, (struct sockaddr *)&addr0, sizeof(addr0));
  107. return s0;
  108. }
  109. //================================================
  110. // Receive Cmd from canbus
  111. //================================================
  112. void ReceiveDataFromCanBus()
  113. {
  114. int nbytes;
  115. struct can_frame frame;
  116. int intCmd;
  117. byte target, group, address;
  118. while(1)
  119. {
  120. memset(&frame, 0, sizeof(struct can_frame));
  121. nbytes = read(CanFd, &frame, sizeof(struct can_frame));
  122. if (nbytes > 0)
  123. {
  124. frame.can_id = frame.can_id & CAN_EFF_MASK;
  125. intCmd = (uint) (frame.can_id & 0x003F0000);
  126. target = (byte) ((frame.can_id & 0x0000FF00)>>8);
  127. group = (word) ((frame.can_id & 0x03C00000)>>22);
  128. address = (byte) (frame.can_id & 0xFF);
  129. //if master id
  130. if(target == 0xF0)
  131. {
  132. //printf("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]);
  133. //printf("Get-INFYPWR-Msg : %08x cmd:%08x target:%02x group:%02x address:%02x\n", frame.can_id, intCmd, target, group, address);
  134. switch (intCmd)
  135. {
  136. case INFYPWR_GET_TOTAL_MOULE_MSG:
  137. {
  138. byte Quantity;
  139. char sn[7];
  140. Quantity = frame.data[2];
  141. for (byte index = 0; index < Quantity; index++)
  142. {
  143. memcpy(sn, (char *)"INFY00", 6);
  144. sn[7] = index + 48; //sacii
  145. get_psu_addr_req((index), sn);
  146. }
  147. }
  148. break;
  149. case ACK_ADDRESS_ASSINGMENT:
  150. { }
  151. break;
  152. case INFYPWR_GET_STATUS_MSG:
  153. {
  154. //英飛源狀態 (如果是使用 Group 命令發問模組會使用 Group 命令回覆)
  155. if(group == 0x0B)
  156. {
  157. //data[2] = group
  158. //data[4] = temp
  159. //data[5,6,7] = alarm
  160. return_status(frame.data[2], address,frame.data[4],
  161. (((int) frame.data[5] << 16) + ((int) frame.data[6] << 8) + (int) frame.data[7]) & 0x00ffffff);
  162. }
  163. }
  164. break;
  165. case INFYPWR_GET_PRESENT_INPUT_VOLTAGE_MSG:
  166. {
  167. return_input_vol(address,
  168. ((word) frame.data[0] * 256 ) + (word) frame.data[1],
  169. ((word) frame.data[2] * 256 ) + (word) frame.data[3],
  170. ((word) frame.data[4] * 256 ) + (word) frame.data[5]);
  171. }
  172. break;
  173. case INFYPWR_GET_PRESENT_OUTPUT_MSG:
  174. {
  175. //英飛源狀態 (如果是使用 Group 命令發問模組會使用 Group 命令回覆)
  176. //電壓值及電流值 = 4byte 精度 0.001位(高位在byte0)(轉為CSU使用 0.1位)
  177. //if(group == 0x0B)
  178. //{
  179. //uint vol = (((unit) frame.data[0] << 24) + ((unit) frame.data[1] << 16) + ((unit) frame.data[2] << 8) + (unit) frame.data[3])/100);
  180. //uint cur = (((unit) frame.data[4] << 24) + ((unit) frame.data[5] << 16) + ((unit) frame.data[6] << 8) + (unit) frame.data[7])/100);
  181. //vol = vol / 100;
  182. //cur = cur / 100;
  183. return_get_output(address,
  184. (word)((((unit) frame.data[0] << 24) + ((unit) frame.data[1] << 16) + ((unit) frame.data[2] << 8) + (unit) frame.data[3])/100),
  185. (word)((((unit) frame.data[4] << 24) + ((unit) frame.data[5] << 16) + ((unit) frame.data[6] << 8) + (unit) frame.data[7])/100));
  186. //}
  187. }
  188. break;
  189. case INFYPWR_GET_AVAILABLE_CAP_MSG:
  190. {
  191. //英飛源狀態 (如果是使用 Group 命令發問模組會使用 Group 命令回覆)
  192. if(group == 0x0B)
  193. {
  194. //英飛源單位
  195. //最大電壓 1:1 (CSU使用是0.1位所以 X 10)
  196. //最小電壓 1:1 (CSU使用是0.1位所以 X 10)
  197. //電流 0.1位 (CSU使用是0.1位單位一樣)
  198. //功率 0.01位 (CSU使用是0.1位所以再除 10)
  199. return_available_cap(address,
  200. ((((word) frame.data[0] * 256) + (word) frame.data[1]) * 10),
  201. ((((word) frame.data[2] * 256) + (word) frame.data[3]) * 10),
  202. (((word) frame.data[4] * 256) + (word) frame.data[5]),
  203. ((((word) frame.data[6] * 256) + (word) frame.data[7]))/10);
  204. }
  205. }
  206. break;
  207. case INFYPWR_SET_POWER_SWITCH_MSG:
  208. {
  209. return_output_pow_switch(address, frame.data[0]);
  210. }
  211. break;
  212. case ACK_SET_PRESENT_OUTPUT:
  213. {
  214. }
  215. break;
  216. }
  217. }
  218. }
  219. else
  220. {
  221. }
  222. usleep(10000);
  223. }
  224. }
  225. //================================================
  226. // Private Function
  227. //================================================
  228. void SendCmdToPsu(int cmd, byte *data, byte dataLen)
  229. {
  230. struct can_frame frame;
  231. //設定 CANBSU 2.0B 長封包
  232. cmd = cmd | 0x80000000;
  233. frame.can_id = cmd;
  234. frame.can_dlc = dataLen;
  235. memcpy(frame.data, data, dataLen);
  236. write(CanFd, &frame, sizeof(struct can_frame));
  237. }
  238. //================================================
  239. // API Function
  240. //================================================
  241. bool InitialCommunication()
  242. {
  243. CanFd = InitCanBus();
  244. if(CanFd < 0)
  245. {
  246. printf("Init can bus fail.\n");
  247. return false;
  248. }
  249. recFork = fork();
  250. if(recFork > 0)
  251. {
  252. ReceiveDataFromCanBus();
  253. }
  254. else if(recFork > 0)
  255. {
  256. printf("fork fail\n");
  257. }
  258. return true;
  259. }
  260. void RequestModuleTotalMumbert(void)
  261. {
  262. uint cmd = INFYPWR_MODULE_CMD | INFYPWR_GET_TOTAL_MOULE_MSG | (INFYPWR_BROADCAST_ID << 8) | INFYPWR_MASTER_TXID;
  263. byte data[8];
  264. memset(data, 0x00, ARRAY_SIZE(data));
  265. SendCmdToPsu(cmd, data, sizeof(data));
  266. }
  267. //void PsuAddressAssignment(byte phy_addr, char *serial_number, byte real_addr, byte group)
  268. void PsuAddressAssignment(byte phy_addr, byte group)
  269. {
  270. uint cmd = INFYPWR_MODULE_CMD | INFYPWR_SET_GROUP_ASSINGMENT_MSG | (phy_addr << 8) | INFYPWR_MASTER_TXID;
  271. byte data[8];
  272. memset(data, 0x00, ARRAY_SIZE(data));
  273. data[0] = group;
  274. SendCmdToPsu(cmd, data, sizeof(data));
  275. }
  276. void GetStatus(byte group, byte address)
  277. {
  278. //如果用 group 發送 (該 group 內的模組會自動依序回應)
  279. //printf("PSU_C_DLL : GetStatus. group = %x, address = %x \n", group, address);
  280. uint cmd;
  281. byte data[8];
  282. //如果是群組命令
  283. if(group == SET_GROUP_CMD)
  284. {
  285. cmd = INFYPWR_GROUP_CMD | INFYPWR_GET_STATUS_MSG | (address << 8) | INFYPWR_MASTER_TXID;
  286. }
  287. //如果是模組命令則找出模組對應到 (英飛源的ID)
  288. else
  289. {
  290. cmd = INFYPWR_MODULE_CMD | INFYPWR_GET_STATUS_MSG | (address << 8) | INFYPWR_MASTER_TXID;
  291. }
  292. memset(data, 0x00, ARRAY_SIZE(data));
  293. SendCmdToPsu(cmd, data, sizeof(data));
  294. }
  295. void GetFwVersion(byte group, byte address, byte type)
  296. {
  297. }
  298. void GetSerialNumber(byte group, byte address)
  299. {
  300. }
  301. void GetAvailableCap(byte group, byte address, short _outputVol)
  302. {
  303. //如果用 group 發送 (該 group 內的模組會自動依序回應)
  304. uint cmd;
  305. byte data[8];
  306. //如果是群組命令
  307. if(group == SET_GROUP_CMD)
  308. {
  309. cmd = INFYPWR_GROUP_CMD | INFYPWR_GET_AVAILABLE_CAP_MSG | (address << 8) | INFYPWR_MASTER_TXID;
  310. }
  311. //如果是模組命令則找出模組對應到 (英飛源的ID)
  312. else
  313. {
  314. cmd = INFYPWR_MODULE_CMD | INFYPWR_GET_AVAILABLE_CAP_MSG | (address << 8) | INFYPWR_MASTER_TXID;
  315. }
  316. memset(data, 0x00, ARRAY_SIZE(data));
  317. SendCmdToPsu(cmd, data, sizeof(data));
  318. }
  319. void GetPresentInputVol(byte group, byte address)
  320. {
  321. //printf("PSU_C_DLL : GetPresentInputVol. group = %x, address = %x \n", group, address);
  322. //如果用 group 發送 (該 group 內的模組會自動依序回應)
  323. uint cmd;
  324. byte data[8];
  325. //如果是群組命令
  326. if(group == SET_GROUP_CMD)
  327. {
  328. cmd = INFYPWR_GROUP_CMD | INFYPWR_GET_PRESENT_INPUT_VOLTAGE_MSG | (address << 8) | INFYPWR_MASTER_TXID;
  329. }
  330. //如果是模組命令則找出模組對應到 (英飛源的ID)
  331. else
  332. {
  333. cmd = INFYPWR_MODULE_CMD | INFYPWR_GET_PRESENT_INPUT_VOLTAGE_MSG | (address << 8) | INFYPWR_MASTER_TXID;
  334. };
  335. memset(data, 0x00, ARRAY_SIZE(data));
  336. SendCmdToPsu(cmd, data, sizeof(data));
  337. }
  338. void GetPresentOutput(byte group, byte address)
  339. {
  340. //printf("PSU_C_DLL : GetPresentOutput. group = %x, address = %x \n", group, address);
  341. int cmd;
  342. byte data[8];
  343. //如果是群組命令
  344. if(group == SET_GROUP_CMD)
  345. {
  346. cmd = INFYPWR_GROUP_CMD | INFYPWR_GET_PRESENT_OUTPUT_MSG | (address << 8) | INFYPWR_MASTER_TXID;
  347. }
  348. //如果是模組命令則找出模組對應到 (英飛源的ID)
  349. else
  350. {
  351. cmd = INFYPWR_MODULE_CMD | INFYPWR_GET_PRESENT_OUTPUT_MSG | (address << 8) | INFYPWR_MASTER_TXID;
  352. }
  353. memset(data, 0x00, ARRAY_SIZE(data));
  354. SendCmdToPsu(cmd, data, sizeof(data));
  355. }
  356. void SetPresentOutput(byte group, byte address, float vol, float cur, float AvailableCur)
  357. {
  358. uint cmd;
  359. byte data[8];
  360. //bool isSearch = false;
  361. //if (cur >= AvailableCur)
  362. //cur = AvailableCur;
  363. //if(vol == 0 && cur == 0)printf("output v=0 a =0 \n");
  364. printf("group = %d, address = %d, vol = %f, cur = %f \n", group, address, vol, cur);
  365. //英飛源使用 0.001 精度
  366. uint vol2 = vol * 100;
  367. uint cur2 = cur * 100;
  368. printf("vol = %f, cur = %f, vol2 = %d, cur2 = %d \n", vol, cur, vol2, cur2);
  369. // 電壓
  370. data[0] = (vol2 >> 24) & 0xff;
  371. data[1] = (vol2 >> 16) & 0xff;
  372. data[2] = (vol2 >> 8) & 0xff;
  373. data[3] = vol2 & 0xff;
  374. // 電壓
  375. data[4] = (cur2 >> 24) & 0xff;
  376. data[5] = (cur2 >> 16) & 0xff;
  377. data[6] = (cur2 >> 8) & 0xff;
  378. data[7] = cur2 & 0xff;
  379. //如果是群組命令
  380. if(group == SET_GROUP_CMD)
  381. {
  382. cmd = INFYPWR_GROUP_CMD | INFYPWR_SET_GROUP_PERSENT_OUTPUT_MSG | (address << 8) | INFYPWR_MASTER_TXID;
  383. //printf("setout(G) :%08x /n",cmd);
  384. }
  385. //如果是模組命令則找出模組對應到 (英飛源的ID)
  386. else
  387. {
  388. //search group
  389. /*
  390. for (byte groupIndex = 0; groupIndex < ShmPsuData->GroupCount; groupIndex++)
  391. {
  392. for (byte index = 0; index < ShmPsuData->PsuGroup[groupIndex].GroupPresentPsuQuantity; index++)
  393. {
  394. //search id
  395. if (ShmPsuData->PsuGroup[groupIndex].PsuModule[index].Address == address)
  396. {
  397. //修改英飛為 id
  398. address = ShmPsuData->PsuGroup[groupIndex].PsuModule[index].PhysicalID;
  399. isSearch = true;
  400. break;
  401. }
  402. }
  403. if(isSearch) break;
  404. }
  405. */
  406. cmd = INFYPWR_MODULE_CMD | INFYPWR_SET_MODULE_PERSENT_OUTPUT_MSG | (address << 8) | INFYPWR_MASTER_TXID;
  407. //printf("setout(M) :%08x /n",cmd);
  408. }
  409. printf("typecmd = %02x, addr = %02x ,vol = %d, tot_Amp = %f, need_cur = %d, \n", group, address, vol2, AvailableCur, cur2);
  410. SendCmdToPsu(cmd, data, sizeof(data));
  411. }
  412. void EnableGreenLedFlash(byte group, byte address, byte value)
  413. {
  414. int cmd;
  415. byte data[8];
  416. if(value){
  417. //pwr off
  418. data[0] = 0x01;
  419. }else{
  420. //pwr on
  421. data[0] = 0x00;
  422. }
  423. //如果是群組命令
  424. if(group == SET_GROUP_CMD)
  425. {
  426. cmd = INFYPWR_GROUP_CMD | INFYPWR_SET_GREEN_KED_FLASH_MSG | (address << 8) | INFYPWR_MASTER_TXID;
  427. //printf("Green Led Flash(g) :%08x - %d - %d \n",cmd, data[0],address);
  428. }
  429. //如果是模組命令則找出模組對應到 (英飛源的ID)
  430. else
  431. {
  432. cmd = INFYPWR_MODULE_CMD | INFYPWR_SET_GREEN_KED_FLASH_MSG | (address << 8) | INFYPWR_MASTER_TXID;
  433. //printf("Green Led Flash(M) :%08x - %d - %d \n",cmd, data[0],address);
  434. }
  435. SendCmdToPsu(cmd, data, sizeof(data));
  436. }
  437. void EnableWalkInMode(byte group, byte address, byte value)
  438. {
  439. int cmd;
  440. byte data[8];
  441. if(value){
  442. //pwr off
  443. data[0] = 0x01;
  444. }else{
  445. //pwr on
  446. data[0] = 0x00;
  447. }
  448. //如果是群組命令
  449. if(group == SET_GROUP_CMD)
  450. {
  451. cmd = INFYPWR_GROUP_CMD | INFYPWR_SET_WALKIN_MODE_MSG | (address << 8) | INFYPWR_MASTER_TXID;
  452. //printf("WalkIn(g) :%08x - %d - %d \n",cmd, data[0],address);
  453. }
  454. //如果是模組命令則找出模組對應到 (英飛源的ID)
  455. else
  456. {
  457. cmd = INFYPWR_MODULE_CMD | INFYPWR_SET_WALKIN_MODE_MSG | (address << 8) | INFYPWR_MASTER_TXID;
  458. // printf("WalkIn(M) :%08x - %d - %d \n",cmd, data[0],address);
  459. }
  460. SendCmdToPsu(cmd, data, sizeof(data));
  461. }
  462. void EnableSleepMode(byte group, byte address, byte value)
  463. {
  464. int cmd;
  465. byte data[8];
  466. if(value){
  467. //pwr off
  468. data[0] = 0x01;
  469. }else{
  470. //pwr on
  471. data[0] = 0x00;
  472. }
  473. //如果是群組命令
  474. if(group == SET_GROUP_CMD)
  475. {
  476. cmd = INFYPWR_GROUP_CMD | INFYPWR_SET_SLEEP_MODE_MSG | (address << 8) | INFYPWR_MASTER_TXID;
  477. //printf("SleepMode(g) :%08x - %d - %d \n",cmd, data[0],address);
  478. }
  479. //如果是模組命令則找出模組對應到 (英飛源的ID)
  480. else
  481. {
  482. cmd = INFYPWR_MODULE_CMD | INFYPWR_SET_SLEEP_MODE_MSG | (address << 8) | INFYPWR_MASTER_TXID;
  483. //printf("SleepMode(M) :%08x - %d - %d \n",cmd, data[0],address);
  484. }
  485. SendCmdToPsu(cmd, data, sizeof(data));
  486. }
  487. void EnableDipAddrMode(byte group, byte address, byte value)
  488. {
  489. int cmd;
  490. byte data[8];
  491. if(value){
  492. //pwr off
  493. data[0] = 0x01;
  494. }else{
  495. //pwr on
  496. data[0] = 0x00;
  497. }
  498. //如果是群組命令
  499. if(group == SET_GROUP_CMD)
  500. {
  501. cmd = INFYPWR_GROUP_CMD | INFYPWR_SET_ADDRESS_MODE_MSG | (address << 8) | INFYPWR_MASTER_TXID;
  502. //printf("DipAddrMode(g) :%08x - %d - %d \n",cmd, data[0],address);
  503. }
  504. //如果是模組命令則找出模組對應到 (英飛源的ID)
  505. else
  506. {
  507. cmd = INFYPWR_MODULE_CMD | INFYPWR_SET_ADDRESS_MODE_MSG | (address << 8) | INFYPWR_MASTER_TXID;
  508. // printf("DipAddrMode(M) :%08x - %d - %d \n",cmd, data[0],address);
  509. }
  510. SendCmdToPsu(cmd, data, sizeof(data));
  511. }
  512. void EnableOutputPower(byte group, byte address, byte value)
  513. {
  514. int cmd;
  515. byte data[8];
  516. //printf("cmd = %x \n", cmd);
  517. memset(data, 0x00, ARRAY_SIZE(data));
  518. if(value == 0){
  519. //pwr off
  520. data[0] = 0x01;
  521. }else{
  522. //pwr on
  523. data[0] = 0x00;
  524. }
  525. //如果是群組命令
  526. if(group == SET_GROUP_CMD)
  527. {
  528. cmd = INFYPWR_GROUP_CMD | INFYPWR_SET_POWER_SWITCH_MSG | (address << 8) | INFYPWR_MASTER_TXID;
  529. //printf("Module-onoff(g) :%08x - %d - %d \n",cmd, data[0],address);
  530. }
  531. //如果是模組命令則找出模組對應到 (英飛源的ID)
  532. else
  533. {
  534. cmd = INFYPWR_MODULE_CMD | INFYPWR_SET_POWER_SWITCH_MSG | (address << 8) | INFYPWR_MASTER_TXID;
  535. // printf("Modele-onoff(M) :%08x - %d - %d \n",cmd, data[0],address);
  536. }
  537. SendCmdToPsu(cmd, data, sizeof(data));
  538. }