Infypwr_PsuCommObj.c 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800
  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. #define DEBUG_LIB 0
  37. void PRINTF_LIB_FUNC(char *string, ...);
  38. void PRINTF_LIB_FUNC(char *string, ...)
  39. {
  40. if (DEBUG_LIB)
  41. {
  42. va_list args;
  43. char buffer[4096];
  44. va_start(args, string);
  45. vsnprintf(buffer, sizeof(buffer), string, args);
  46. va_end(args);
  47. printf("%s \n", buffer);
  48. }
  49. }
  50. //================================================
  51. // Callback function
  52. //================================================
  53. void GetPsuAddressReq(void *func)
  54. {
  55. get_psu_addr_req = func;
  56. }
  57. void RefreshSerialNumber(void *func)
  58. {
  59. return_serial_number = func;
  60. }
  61. void RefreshVextAndIavail(void *func)
  62. {
  63. return_vext_and_iavail = func;
  64. }
  65. void RefreshMiscInfo(void *func)
  66. {
  67. return_misc_info = func;
  68. }
  69. void RefreshStatus(void *func)
  70. {
  71. return_status = func;
  72. }
  73. void RefreshInputVol(void *func)
  74. {
  75. return_input_vol = func;
  76. }
  77. void RefreshGetOutput(void *func)
  78. {
  79. return_get_output = func;
  80. }
  81. void RefreshHWVersion(void *func)
  82. {
  83. //return_hw_version = func;
  84. }
  85. void RefreshAvailableCap(void *func)
  86. {
  87. return_available_cap = func;
  88. }
  89. void RefreshOutputPowerSwitch(void *func)
  90. {
  91. return_output_pow_switch = func;
  92. }
  93. //================================================
  94. // CANBUS initialization
  95. //================================================
  96. int InitCanBus()
  97. {
  98. int s0,nbytes;
  99. struct timeval tv;
  100. struct ifreq ifr0;
  101. struct sockaddr_can addr0;
  102. system("/sbin/ip link set can1 down");
  103. system("/sbin/ip link set can1 type can bitrate 500000 restart-ms 100");
  104. system("/sbin/ip link set can1 up");
  105. s0 = socket(PF_CAN, SOCK_RAW, CAN_RAW);
  106. tv.tv_sec = 0;
  107. tv.tv_usec = 10000;
  108. if (setsockopt(s0, SOL_SOCKET, SO_RCVTIMEO, (char *)&tv, sizeof(struct timeval)) < 0)
  109. {
  110. #ifdef SystemLogMessage
  111. PRINTF_LIB_FUNC("Set SO_RCVTIMEO NG");
  112. #endif
  113. }
  114. nbytes=40960;
  115. if (setsockopt(s0, SOL_SOCKET, SO_RCVBUF, &nbytes, sizeof(int)) < 0)
  116. {
  117. #ifdef SystemLogMessage
  118. PRINTF_LIB_FUNC("Set SO_RCVBUF NG");
  119. #endif
  120. }
  121. nbytes=40960;
  122. if (setsockopt(s0, SOL_SOCKET, SO_SNDBUF, &nbytes, sizeof(int)) < 0)
  123. {
  124. #ifdef SystemLogMessage
  125. PRINTF_LIB_FUNC("Set SO_SNDBUF NG");
  126. #endif
  127. }
  128. strcpy(ifr0.ifr_name, "can1" );
  129. ioctl(s0, SIOCGIFINDEX, &ifr0); /* ifr.ifr_ifindex gets filled with that device's index */
  130. addr0.can_family = AF_CAN;
  131. addr0.can_ifindex = ifr0.ifr_ifindex;
  132. bind(s0, (struct sockaddr *)&addr0, sizeof(addr0));
  133. return s0;
  134. }
  135. //================================================
  136. // Receive Cmd from canbus
  137. //================================================
  138. void ReceiveDataFromCanBus()
  139. {
  140. int nbytes;
  141. struct can_frame frame;
  142. int intCmd;
  143. byte target, group, address;
  144. while(1)
  145. {
  146. memset(&frame, 0, sizeof(struct can_frame));
  147. nbytes = read(CanFd, &frame, sizeof(struct can_frame));
  148. if (nbytes > 0)
  149. {
  150. frame.can_id = frame.can_id & CAN_EFF_MASK;
  151. intCmd = (uint) (frame.can_id & 0x003F0000);
  152. target = (byte) ((frame.can_id & 0x0000FF00)>>8);
  153. group = (word) ((frame.can_id & 0x03C00000)>>22);
  154. address = (byte) (frame.can_id & 0xFF);
  155. //if master id
  156. if(target == 0xF0)
  157. {
  158. //PRINTF_LIB_FUNC("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]);
  159. //PRINTF_LIB_FUNC("Get-INFYPWR-Msg : %08x cmd:%08x target:%02x group:%02x address:%02x\n", frame.can_id, intCmd, target, group, address);
  160. switch (intCmd)
  161. {
  162. case INFYPWR_GET_TOTAL_MOULE_MSG:
  163. {
  164. byte Quantity;
  165. char sn[7];
  166. Quantity = frame.data[2];
  167. //get_psu_count_first(Quantity);
  168. //
  169. for (byte index = 0; index < Quantity; index++)
  170. {
  171. sn[0] = sn[1] = sn[2] = sn[3] = sn[4] = sn[5] = sn[6] = index;
  172. get_psu_addr_req(index, sn);
  173. }
  174. }
  175. break;
  176. case ACK_ADDRESS_ASSINGMENT:
  177. { }
  178. break;
  179. case INFYPWR_GET_STATUS_MSG:
  180. {
  181. //英飛源狀態 (如果是使用 Group 命令發問模組會使用 Group 命令回覆)
  182. //data[2] = group
  183. //data[4] = temp
  184. //data[5,6,7] = alarm
  185. //if (statusPassID == FEEDBACK_ID)
  186. return_status(frame.data[2], address, frame.data[4],
  187. (((int) frame.data[5] << 16) + ((int) frame.data[6] << 8) + (int) frame.data[7]) & 0x00ffffff);
  188. }
  189. break;
  190. case INFYPWR_GET_BARCODE_MSG:
  191. {
  192. //英飛源狀態 (如果是使用 Group 命令發問模組會使用 Group 命令回覆)
  193. if(group == 0x0B)
  194. {
  195. char sn[6];
  196. memcpy(sn, &frame.data[0], 6);
  197. return_serial_number(address, sn , ((word) frame.data[6] * 256 ) + (word) frame.data[7]);
  198. }
  199. }
  200. break;
  201. case INFYPWR_GET_VEXT_IAVAIL_MSG:
  202. {
  203. return_vext_and_iavail(address,
  204. ((word) frame.data[0] * 256 ) + (word) frame.data[1],
  205. ((word) frame.data[2] * 256 ) + (word) frame.data[3]);
  206. }
  207. //PRINTF_LIB_FUNC("INFYPWR_GET_VEXT_IAVAIL_MSG \n");
  208. break;
  209. case INFYPWR_GET_MISC_INFO_MSG:
  210. {
  211. //0,1 = type
  212. //5,6,7,8 = msg
  213. return_misc_info(address,
  214. ((word) frame.data[0] * 256 ) + (word) frame.data[1],
  215. (((int) frame.data[4] << 24) + ((int) frame.data[5] << 16) + ((int) frame.data[6] << 8) + (int) frame.data[7]) & 0x00ffffff);
  216. }
  217. //PRINTF_LIB_FUNC("INFYPWR_GET_MISC_INFO_MSG \n");
  218. break;
  219. case INFYPWR_GET_PRESENT_INPUT_VOLTAGE_MSG:
  220. {
  221. return_input_vol(address,
  222. ((word) frame.data[0] * 256 ) + (word) frame.data[1],
  223. ((word) frame.data[2] * 256 ) + (word) frame.data[3],
  224. ((word) frame.data[4] * 256 ) + (word) frame.data[5]);
  225. }
  226. break;
  227. case INFYPWR_GET_PRESENT_OUTPUT_MSG:
  228. {
  229. //英飛源狀態 (如果是使用 Group 命令發問模組會使用 Group 命令回覆)
  230. //電壓值及電流值 = 4byte 精度 0.001位(高位在byte0)(轉為CSU使用 0.1位)
  231. //if(group == 0x0B)
  232. //{
  233. //uint vol = (((unit) frame.data[0] << 24) + ((unit) frame.data[1] << 16) + ((unit) frame.data[2] << 8) + (unit) frame.data[3])/100);
  234. //uint cur = (((unit) frame.data[4] << 24) + ((unit) frame.data[5] << 16) + ((unit) frame.data[6] << 8) + (unit) frame.data[7])/100);
  235. //vol = vol / 100;
  236. //cur = cur / 100;
  237. return_get_output(address,
  238. (word)((((unit) frame.data[0] << 24) + ((unit) frame.data[1] << 16) + ((unit) frame.data[2] << 8) + (unit) frame.data[3])/100),
  239. (word)((((unit) frame.data[4] << 24) + ((unit) frame.data[5] << 16) + ((unit) frame.data[6] << 8) + (unit) frame.data[7])/100));
  240. //}
  241. }
  242. break;
  243. case INFYPWR_GET_AVAILABLE_CAP_MSG:
  244. {
  245. //英飛源狀態 (如果是使用 Group 命令發問模組會使用 Group 命令回覆)
  246. if(group == 0x0B)
  247. {
  248. //英飛源單位
  249. //最大電壓 1:1 (CSU使用是0.1位所以 X 10)
  250. //最小電壓 1:1 (CSU使用是0.1位所以 X 10)
  251. //電流 0.1位 (CSU使用是0.1位單位一樣)
  252. //功率 0.01位 (CSU使用是0.1位所以再除 10)
  253. return_available_cap(address,
  254. ((((word) frame.data[0] * 256) + (word) frame.data[1]) * 10),
  255. ((((word) frame.data[2] * 256) + (word) frame.data[3]) * 10),
  256. (((word) frame.data[4] * 256) + (word) frame.data[5]),
  257. ((((word) frame.data[6] * 256) + (word) frame.data[7]))/10);
  258. }
  259. }
  260. break;
  261. case INFYPWR_SET_POWER_SWITCH_MSG:
  262. {
  263. return_output_pow_switch(address, frame.data[0]);
  264. }
  265. break;
  266. case ACK_SET_PRESENT_OUTPUT:
  267. {
  268. }
  269. break;
  270. }
  271. }
  272. }
  273. else
  274. {
  275. }
  276. usleep(10000);
  277. }
  278. }
  279. //================================================
  280. // Private Function
  281. //================================================
  282. void SendCmdToPsu(int cmd, byte *data, byte dataLen)
  283. {
  284. struct can_frame frame;
  285. //設定 CANBSU 2.0B 長封包
  286. cmd = cmd | 0x80000000;
  287. frame.can_id = cmd;
  288. frame.can_dlc = dataLen;
  289. memcpy(frame.data, data, dataLen);
  290. write(CanFd, &frame, sizeof(struct can_frame));
  291. }
  292. //================================================
  293. // API Function
  294. //================================================
  295. bool InitialCommunication()
  296. {
  297. CanFd = InitCanBus();
  298. if(CanFd < 0)
  299. {
  300. PRINTF_LIB_FUNC("Init can bus fail.\n");
  301. return false;
  302. }
  303. recFork = fork();
  304. if(recFork > 0)
  305. {
  306. ReceiveDataFromCanBus();
  307. }
  308. else if(recFork > 0)
  309. {
  310. PRINTF_LIB_FUNC("fork fail\n");
  311. }
  312. return true;
  313. }
  314. void RequestModuleTotalMumbert(void)
  315. {
  316. uint cmd = INFYPWR_MODULE_CMD | INFYPWR_GET_TOTAL_MOULE_MSG | (INFYPWR_BROADCAST_ID << 8) | INFYPWR_MASTER_TXID;
  317. byte data[8];
  318. memset(data, 0x00, ARRAY_SIZE(data));
  319. SendCmdToPsu(cmd, data, sizeof(data));
  320. }
  321. //void PsuAddressAssignment(byte phy_addr, char *serial_number, byte real_addr, byte group)
  322. void PsuAddressAssignment(byte phy_addr, byte group)
  323. {
  324. PRINTF_LIB_FUNC("phy_addr = %d, group = %d \n", phy_addr, group);
  325. uint cmd = INFYPWR_MODULE_CMD | INFYPWR_SET_GROUP_ASSINGMENT_MSG | (phy_addr << 8) | INFYPWR_MASTER_TXID;
  326. byte data[8];
  327. memset(data, 0x00, ARRAY_SIZE(data));
  328. data[0] = group;
  329. SendCmdToPsu(cmd, data, sizeof(data));
  330. }
  331. void GetStatus(byte group, byte address)
  332. {
  333. //如果用 group 發送 (該 group 內的模組會自動依序回應)
  334. //PRINTF_LIB_FUNC("PSU_C_DLL : GetStatus. group = %x, address = %x \n", group, address);
  335. uint cmd;
  336. byte data[8];
  337. cmd = INFYPWR_GROUP_CMD | INFYPWR_GET_STATUS_MSG | (group << 8) | INFYPWR_MASTER_TXID;
  338. // if(group == SET_GROUP_CMD)
  339. // {
  340. // cmd = INFYPWR_GROUP_CMD | INFYPWR_GET_STATUS_MSG | (group << 8) | INFYPWR_MASTER_TXID;
  341. // }
  342. // //如果是模組命令則找出模組對應到 (英飛源的ID)
  343. // else
  344. // {
  345. // cmd = INFYPWR_MODULE_CMD | INFYPWR_GET_STATUS_MSG | (address << 8) | INFYPWR_MASTER_TXID;
  346. // }
  347. memset(data, 0x00, ARRAY_SIZE(data));
  348. SendCmdToPsu(cmd, data, sizeof(data));
  349. }
  350. void GetFwVersion(byte group, byte address, byte type)
  351. {
  352. }
  353. void GetSerialNumber(byte group, byte address)
  354. {
  355. //如果用 group 發送 (該 group 內的模組會自動依序回應)
  356. uint cmd;
  357. byte data[8];
  358. //如果是群組命令
  359. if(group == SET_GROUP_CMD)
  360. {
  361. cmd = INFYPWR_GROUP_CMD | INFYPWR_GET_BARCODE_MSG | (address << 8) | INFYPWR_MASTER_TXID;
  362. }
  363. //如果是模組命令則找出模組對應到 (英飛源的ID)
  364. else
  365. {
  366. cmd = INFYPWR_MODULE_CMD | INFYPWR_GET_BARCODE_MSG | (address << 8) | INFYPWR_MASTER_TXID;
  367. }
  368. memset(data, 0x00, ARRAY_SIZE(data));
  369. SendCmdToPsu(cmd, data, sizeof(data));
  370. }
  371. void GetVextAndIavail(byte group, byte address)
  372. {
  373. //如果用 group 發送 (該 group 內的模組會自動依序回應)
  374. uint cmd;
  375. byte data[8];
  376. //如果是群組命令
  377. if(group == SET_GROUP_CMD)
  378. {
  379. cmd = INFYPWR_GROUP_CMD | INFYPWR_GET_VEXT_IAVAIL_MSG | (address << 8) | INFYPWR_MASTER_TXID;
  380. }
  381. //如果是模組命令則找出模組對應到 (英飛源的ID)
  382. else
  383. {
  384. cmd = INFYPWR_MODULE_CMD | INFYPWR_GET_VEXT_IAVAIL_MSG | (address << 8) | INFYPWR_MASTER_TXID;
  385. }
  386. memset(data, 0x00, ARRAY_SIZE(data));
  387. SendCmdToPsu(cmd, data, sizeof(data));
  388. }
  389. void GetMiscInfo(byte group, byte address, unsigned short CmdType)
  390. {
  391. //如果用 group 發送 (該 group 內的模組會自動依序回應)
  392. uint cmd;
  393. byte data[8];
  394. cmd = INFYPWR_GROUP_CMD | INFYPWR_GET_MISC_INFO_MSG | (group << 8) | INFYPWR_MASTER_TXID;
  395. //如果是群組命令
  396. // if(group == SET_GROUP_CMD)
  397. // {
  398. // cmd = INFYPWR_GROUP_CMD | INFYPWR_GET_MISC_INFO_MSG | (address << 8) | INFYPWR_MASTER_TXID;
  399. // }
  400. // //如果是模組命令則找出模組對應到 (英飛源的ID)
  401. // else
  402. // {
  403. // cmd = INFYPWR_MODULE_CMD | INFYPWR_GET_MISC_INFO_MSG | (address << 8) | INFYPWR_MASTER_TXID;
  404. // }
  405. memset(data, 0x00, ARRAY_SIZE(data));
  406. data[0] = (CmdType >> 8) & 0xFF;
  407. data[1] = (CmdType) & 0xFF;
  408. SendCmdToPsu(cmd, data, sizeof(data));
  409. }
  410. void SetMiscInfo(byte group, byte address, unsigned short CmdType, unsigned int value)
  411. {
  412. int cmd;
  413. byte data[8];
  414. //PRINTF_LIB_FUNC("cmd = %x \n", cmd);
  415. memset(data, 0x00, ARRAY_SIZE(data));
  416. data[0] = (CmdType >> 8) & 0xFF;
  417. data[1] = (CmdType) & 0xFF;
  418. if(CmdType == MISC_SETCMD_FAN_DENOISE_MODE){
  419. data[7] = (byte)value;
  420. }else{
  421. data[4] = (value >> 24) & 0xff;
  422. data[5] = (value >> 16) & 0xff;
  423. data[6] = (value >> 8) & 0xff;
  424. data[7] = value & 0xff;
  425. }
  426. //如果是群組命令
  427. if(group == SET_GROUP_CMD)
  428. {
  429. cmd = INFYPWR_GROUP_CMD | INFYPWR_SET_MISC_INFO_MSG | (address << 8) | INFYPWR_MASTER_TXID;
  430. //PRINTF_LIB_FUNC("Module-onoff(g) :%08x - %d - %d \n",cmd, data[0],address);
  431. }
  432. //如果是模組命令則找出模組對應到 (英飛源的ID)
  433. else
  434. {
  435. cmd = INFYPWR_MODULE_CMD | INFYPWR_SET_MISC_INFO_MSG | (address << 8) | INFYPWR_MASTER_TXID;
  436. // PRINTF_LIB_FUNC("Modele-onoff(M) :%08x - %d - %d \n",cmd, data[0],address);
  437. }
  438. SendCmdToPsu(cmd, data, sizeof(data));
  439. }
  440. void GetPresentInputVol(byte group, byte address)
  441. {
  442. //PRINTF_LIB_FUNC("PSU_C_DLL : GetPresentInputVol. group = %x, address = %x \n", group, address);
  443. //如果用 group 發送 (該 group 內的模組會自動依序回應)
  444. uint cmd;
  445. byte data[8];
  446. //如果是群組命令
  447. if(group == SET_GROUP_CMD)
  448. {
  449. cmd = INFYPWR_GROUP_CMD | INFYPWR_GET_PRESENT_INPUT_VOLTAGE_MSG | (address << 8) | INFYPWR_MASTER_TXID;
  450. }
  451. //如果是模組命令則找出模組對應到 (英飛源的ID)
  452. else
  453. {
  454. cmd = INFYPWR_MODULE_CMD | INFYPWR_GET_PRESENT_INPUT_VOLTAGE_MSG | (address << 8) | INFYPWR_MASTER_TXID;
  455. };
  456. memset(data, 0x00, ARRAY_SIZE(data));
  457. SendCmdToPsu(cmd, data, sizeof(data));
  458. }
  459. void GetAvailableCap(byte group, byte address, short _outputVol)
  460. {
  461. //如果用 group 發送 (該 group 內的模組會自動依序回應)
  462. uint cmd;
  463. byte data[8];
  464. cmd = INFYPWR_GROUP_CMD | INFYPWR_GET_AVAILABLE_CAP_MSG | (group << 8) | INFYPWR_MASTER_TXID;
  465. // if(group == SET_GROUP_CMD)
  466. // {
  467. // cmd = INFYPWR_GROUP_CMD | INFYPWR_GET_AVAILABLE_CAP_MSG | (address << 8) | INFYPWR_MASTER_TXID;
  468. // }
  469. // //如果是模組命令則找出模組對應到 (英飛源的ID)
  470. // else
  471. // {
  472. // cmd = INFYPWR_MODULE_CMD | INFYPWR_GET_AVAILABLE_CAP_MSG | (address << 8) | INFYPWR_MASTER_TXID;
  473. // }
  474. memset(data, 0x00, ARRAY_SIZE(data));
  475. SendCmdToPsu(cmd, data, sizeof(data));
  476. }
  477. void GetPresentOutput(byte group, byte address)
  478. {
  479. //PRINTF_LIB_FUNC("PSU_C_DLL : GetPresentOutput. group = %x, address = %x \n", group, address);
  480. int cmd;
  481. byte data[8];
  482. cmd = INFYPWR_GROUP_CMD | INFYPWR_GET_PRESENT_OUTPUT_MSG | (group << 8) | INFYPWR_MASTER_TXID;
  483. // if(group == SET_GROUP_CMD)
  484. // {
  485. // cmd = INFYPWR_GROUP_CMD | INFYPWR_GET_PRESENT_OUTPUT_MSG | (address << 8) | INFYPWR_MASTER_TXID;
  486. // }
  487. // //如果是模組命令則找出模組對應到 (英飛源的ID)
  488. // else
  489. // {
  490. // cmd = INFYPWR_MODULE_CMD | INFYPWR_GET_PRESENT_OUTPUT_MSG | (address << 8) | INFYPWR_MASTER_TXID;
  491. // }
  492. memset(data, 0x00, ARRAY_SIZE(data));
  493. SendCmdToPsu(cmd, data, sizeof(data));
  494. }
  495. void SetPresentOutput(byte group, byte address, float vol, float cur, float AvailableCur)
  496. {
  497. uint cmd;
  498. byte data[8];
  499. //bool isSearch = false;
  500. //if (cur >= AvailableCur)
  501. //cur = AvailableCur;
  502. //if(vol == 0 && cur == 0)PRINTF_LIB_FUNC("output v=0 a =0 \n");
  503. //PRINTF_LIB_FUNC("group = %d, address = %d, vol = %f, cur = %f \n", group, address, vol, cur);
  504. //英飛源使用 0.001 精度
  505. uint vol2 = vol * 100;
  506. uint cur2 = cur * 100;
  507. //PRINTF_LIB_FUNC("vol = %f, cur = %f, vol2 = %d, cur2 = %d \n", vol, cur, vol2, cur2);
  508. // 電壓
  509. data[0] = (vol2 >> 24) & 0xff;
  510. data[1] = (vol2 >> 16) & 0xff;
  511. data[2] = (vol2 >> 8) & 0xff;
  512. data[3] = vol2 & 0xff;
  513. // 電壓
  514. data[4] = (cur2 >> 24) & 0xff;
  515. data[5] = (cur2 >> 16) & 0xff;
  516. data[6] = (cur2 >> 8) & 0xff;
  517. data[7] = cur2 & 0xff;
  518. cmd = INFYPWR_GROUP_CMD | INFYPWR_SET_GROUP_PERSENT_OUTPUT_MSG | (group << 8) | INFYPWR_MASTER_TXID;
  519. // if(group == SET_GROUP_CMD)
  520. // {
  521. // cmd = INFYPWR_GROUP_CMD | INFYPWR_SET_GROUP_PERSENT_OUTPUT_MSG | (address << 8) | INFYPWR_MASTER_TXID;
  522. // //PRINTF_LIB_FUNC("setout(G) :%08x /n",cmd);
  523. // }
  524. // //如果是模組命令則找出模組對應到 (英飛源的ID)
  525. // else
  526. // {
  527. //
  528. // //search group
  529. // /*
  530. // for (byte groupIndex = 0; groupIndex < ShmPsuData->GroupCount; groupIndex++)
  531. // {
  532. // for (byte index = 0; index < ShmPsuData->PsuGroup[groupIndex].GroupPresentPsuQuantity; index++)
  533. // {
  534. // //search id
  535. // if (ShmPsuData->PsuGroup[groupIndex].PsuModule[index].Address == address)
  536. // {
  537. // //修改英飛為 id
  538. // address = ShmPsuData->PsuGroup[groupIndex].PsuModule[index].PhysicalID;
  539. // isSearch = true;
  540. // break;
  541. // }
  542. // }
  543. // if(isSearch) break;
  544. // }
  545. // */
  546. // cmd = INFYPWR_MODULE_CMD | INFYPWR_SET_MODULE_PERSENT_OUTPUT_MSG | (address << 8) | INFYPWR_MASTER_TXID;
  547. // //PRINTF_LIB_FUNC("setout(M) :%08x /n",cmd);
  548. // }
  549. PRINTF_LIB_FUNC("typecmd = %02x, addr = %02x ,vol = %d, tot_Amp = %f, need_cur = %d, \n",
  550. group, address, vol2, AvailableCur, cur2);
  551. SendCmdToPsu(cmd, data, sizeof(data));
  552. }
  553. void EnableGreenLedFlash(byte group, byte address, byte value)
  554. {
  555. int cmd;
  556. byte data[8];
  557. if(value){
  558. //pwr off
  559. data[0] = 0x01;
  560. }else{
  561. //pwr on
  562. data[0] = 0x00;
  563. }
  564. cmd = INFYPWR_GROUP_CMD | INFYPWR_SET_GREEN_KED_FLASH_MSG | (group << 8) | INFYPWR_MASTER_TXID;
  565. // if(group == SET_GROUP_CMD)
  566. // {
  567. // cmd = INFYPWR_GROUP_CMD | INFYPWR_SET_GREEN_KED_FLASH_MSG | (address << 8) | INFYPWR_MASTER_TXID;
  568. // //PRINTF_LIB_FUNC("Green Led Flash(g) :%08x - %d - %d \n",cmd, data[0],address);
  569. // }
  570. // //如果是模組命令則找出模組對應到 (英飛源的ID)
  571. // else
  572. // {
  573. // cmd = INFYPWR_MODULE_CMD | INFYPWR_SET_GREEN_KED_FLASH_MSG | (address << 8) | INFYPWR_MASTER_TXID;
  574. // //PRINTF_LIB_FUNC("Green Led Flash(M) :%08x - %d - %d \n",cmd, data[0],address);
  575. // }
  576. SendCmdToPsu(cmd, data, sizeof(data));
  577. }
  578. void EnableWalkInMode(byte group, byte address, byte value)
  579. {
  580. int cmd;
  581. byte data[8];
  582. if(value){
  583. //pwr off
  584. data[0] = 0x01;
  585. }else{
  586. //pwr on
  587. data[0] = 0x00;
  588. }
  589. //如果是群組命令
  590. if(group == SET_GROUP_CMD)
  591. {
  592. cmd = INFYPWR_GROUP_CMD | INFYPWR_SET_WALKIN_MODE_MSG | (address << 8) | INFYPWR_MASTER_TXID;
  593. //PRINTF_LIB_FUNC("WalkIn(g) :%08x - %d - %d \n",cmd, data[0],address);
  594. }
  595. //如果是模組命令則找出模組對應到 (英飛源的ID)
  596. else
  597. {
  598. cmd = INFYPWR_MODULE_CMD | INFYPWR_SET_WALKIN_MODE_MSG | (address << 8) | INFYPWR_MASTER_TXID;
  599. // PRINTF_LIB_FUNC("WalkIn(M) :%08x - %d - %d \n",cmd, data[0],address);
  600. }
  601. SendCmdToPsu(cmd, data, sizeof(data));
  602. }
  603. void EnableSleepMode(byte group, byte address, byte value)
  604. {
  605. int cmd;
  606. byte data[8];
  607. if(value){
  608. //pwr off
  609. data[0] = 0x01;
  610. }else{
  611. //pwr on
  612. data[0] = 0x00;
  613. }
  614. //如果是群組命令
  615. if(group == SET_GROUP_CMD)
  616. {
  617. cmd = INFYPWR_GROUP_CMD | INFYPWR_SET_SLEEP_MODE_MSG | (address << 8) | INFYPWR_MASTER_TXID;
  618. //PRINTF_LIB_FUNC("SleepMode(g) :%08x - %d - %d \n",cmd, data[0],address);
  619. }
  620. //如果是模組命令則找出模組對應到 (英飛源的ID)
  621. else
  622. {
  623. cmd = INFYPWR_MODULE_CMD | INFYPWR_SET_SLEEP_MODE_MSG | (address << 8) | INFYPWR_MASTER_TXID;
  624. //PRINTF_LIB_FUNC("SleepMode(M) :%08x - %d - %d \n",cmd, data[0],address);
  625. }
  626. SendCmdToPsu(cmd, data, sizeof(data));
  627. }
  628. void EnableDipAddrMode(void)
  629. {
  630. uint cmd = INFYPWR_MODULE_CMD | INFYPWR_SET_ADDRESS_MODE_MSG | (INFYPWR_BROADCAST_ID << 8) | INFYPWR_MASTER_TXID;
  631. byte data[8];
  632. memset(data, 0x00, ARRAY_SIZE(data));
  633. data[0] = 0x01;
  634. SendCmdToPsu(cmd, data, sizeof(data));
  635. }
  636. void DisableDipAddrMode(void)
  637. {
  638. uint cmd = INFYPWR_MODULE_CMD | INFYPWR_SET_ADDRESS_MODE_MSG | (INFYPWR_BROADCAST_ID << 8) | INFYPWR_MASTER_TXID;
  639. byte data[8];
  640. memset(data, 0x00, ARRAY_SIZE(data));
  641. data[0] = 0x00;
  642. SendCmdToPsu(cmd, data, sizeof(data));
  643. }
  644. void EnableOutputPower(byte group, byte address, byte value)
  645. {
  646. int cmd;
  647. byte data[8];
  648. //PRINTF_LIB_FUNC("cmd = %x \n", cmd);
  649. memset(data, 0x00, ARRAY_SIZE(data));
  650. if(value == 0){
  651. //pwr off
  652. data[0] = 0x01;
  653. }else{
  654. //pwr on
  655. data[0] = 0x00;
  656. }
  657. cmd = INFYPWR_GROUP_CMD | INFYPWR_SET_POWER_SWITCH_MSG | (group << 8) | INFYPWR_MASTER_TXID;
  658. // if(group == SET_GROUP_CMD)
  659. // {
  660. // cmd = INFYPWR_GROUP_CMD | INFYPWR_SET_POWER_SWITCH_MSG | (address << 8) | INFYPWR_MASTER_TXID;
  661. // //PRINTF_LIB_FUNC("Module-onoff(g) :%08x - %d - %d \n",cmd, data[0],address);
  662. // }
  663. // //如果是模組命令則找出模組對應到 (英飛源的ID)
  664. // else
  665. // {
  666. // cmd = INFYPWR_MODULE_CMD | INFYPWR_SET_POWER_SWITCH_MSG | (address << 8) | INFYPWR_MASTER_TXID;
  667. // // PRINTF_LIB_FUNC("Modele-onoff(M) :%08x - %d - %d \n",cmd, data[0],address);
  668. // }
  669. SendCmdToPsu(cmd, data, sizeof(data));
  670. }