UUpwr_PsuCommObj.c 35 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303
  1. /*
  2. * UUpwr_PsuCommObj.c
  3. *
  4. * Created on: 2022年3月30日
  5. * Author: 7564
  6. */
  7. #include "UUpwr_PsuCommObj.h"
  8. //================================================
  9. // Callback function
  10. //================================================
  11. void RefreshStatus(void *func)
  12. {
  13. return_status = func;
  14. }
  15. void RefreshModuleCount(void *func)
  16. {
  17. return_module_count = func;
  18. }
  19. void RefreshAvailableCap(void *func)
  20. {
  21. return_available_cap = func;
  22. }
  23. void RefreshFwVersion(void *func)
  24. {
  25. return_fw_version = func;
  26. }
  27. void RefreshInputVol(void *func)
  28. {
  29. return_input_vol = func;
  30. }
  31. void RefreshGetOutput(void *func)
  32. {
  33. return_get_output = func;
  34. }
  35. void RefreshGetOutputF(void *func)
  36. {
  37. return_get_output_float = func;
  38. }
  39. void RefreshMisInfo(void *func)
  40. {
  41. return_mis_info = func;
  42. }
  43. void RefreshIavailable(void *func)
  44. {
  45. return_iavail_info = func;
  46. }
  47. void AutoMode_RefreshOutputAndTemp(void *func)
  48. {
  49. return_output_temp = func;
  50. }
  51. void AutoMode_RefreshModuleStatus(void *func)
  52. {
  53. return_module_status = func;
  54. }
  55. void AutoMode_RefreshModuleInput(void *func)
  56. {
  57. return_module_input = func;
  58. }
  59. //================================================
  60. // Private Function
  61. //================================================
  62. int UU_GetTimeoutValue(struct timespec *startTime)
  63. {
  64. struct timespec endTime;
  65. clock_gettime(CLOCK_MONOTONIC_COARSE, &endTime);
  66. return (endTime.tv_nsec - startTime->tv_nsec) / 1000000;
  67. }
  68. void UU_GetTimespecFunc(struct timespec *time)
  69. {
  70. clock_gettime(CLOCK_MONOTONIC_COARSE, time);
  71. }
  72. void SendCmdToPsu(int cmd, byte *data, byte dataLen)
  73. {
  74. PwrFrame PwrFrameMsg;
  75. struct can_frame frame;
  76. //設定 CANBSU 2.0B 長封包
  77. PwrFrameMsg.PwrMessage = cmd | 0x80000000;
  78. frame.can_id = PwrFrameMsg.PwrMessage;
  79. frame.can_dlc = dataLen;
  80. memcpy(frame.data, data, dataLen);
  81. write(CanFd, &frame, sizeof(struct can_frame));
  82. }
  83. int InitCanBus()
  84. {
  85. int s0,nbytes;
  86. struct timeval tv;
  87. struct ifreq ifr0;
  88. struct sockaddr_can addr0;
  89. //struct can_filter rfilter[2];
  90. system("/sbin/ip link set can1 down");
  91. system("/sbin/ip link set can1 type can bitrate 500000 restart-ms 100");
  92. system("/sbin/ip link set can1 up");
  93. s0 = socket(PF_CAN, SOCK_RAW, CAN_RAW);
  94. tv.tv_sec = 0;
  95. tv.tv_usec = 10000;
  96. if (setsockopt(s0, SOL_SOCKET, SO_RCVTIMEO, (char *)&tv, sizeof(struct timeval)) < 0)
  97. {
  98. #ifdef SystemLogMessage
  99. PRINTF_LIB_FUNC("Set SO_RCVTIMEO NG");
  100. #endif
  101. }
  102. nbytes=40960;
  103. if (setsockopt(s0, SOL_SOCKET, SO_RCVBUF, &nbytes, sizeof(int)) < 0)
  104. {
  105. #ifdef SystemLogMessage
  106. PRINTF_LIB_FUNC("Set SO_RCVBUF NG");
  107. #endif
  108. }
  109. nbytes=40960;
  110. if (setsockopt(s0, SOL_SOCKET, SO_SNDBUF, &nbytes, sizeof(int)) < 0)
  111. {
  112. #ifdef SystemLogMessage
  113. PRINTF_LIB_FUNC("Set SO_SNDBUF NG");
  114. #endif
  115. }
  116. nbytes=40960;
  117. strcpy(ifr0.ifr_name, "can1" );
  118. ioctl(s0, SIOCGIFINDEX, &ifr0); /* ifr.ifr_ifindex gets filled with that device's index */
  119. addr0.can_family = AF_CAN;
  120. addr0.can_ifindex = ifr0.ifr_ifindex;
  121. bind(s0, (struct sockaddr *)&addr0, sizeof(addr0));
  122. return s0;
  123. }
  124. void SetOutputVoltage(byte group, int voltage)
  125. {
  126. byte data[8];
  127. PwrFrame PwrFrameMsg;
  128. PwrFrameMsg.PwrMessage = 0;
  129. PwrFrameMsg.UUBits.Protocol = 0x01;
  130. PwrFrameMsg.UUBits.MonitorAddress = PSU_MONITOR_DEFAULT;
  131. // module id
  132. if (group == SYSTEM_CMD)
  133. PwrFrameMsg.UUBits.ModuleAddress = PSU_MODULE_BROADCAST;
  134. else
  135. PwrFrameMsg.UUBits.ModuleAddress = group;
  136. memset(data, 0x00, ARRAY_SIZE(data));
  137. // Group
  138. if (group == SYSTEM_CMD)
  139. data[0] = 0x00;
  140. else
  141. data[0] = group + 1;
  142. // Message Type
  143. data[0] = data[0] << 4;
  144. data[0] |= PSU_MSG_CMD_SET_PARAM;
  145. // Command Type
  146. data[1] = PSU_W_OUTPUT_VOL;
  147. // Command Data
  148. data[4] = (voltage >> 24) & 0xFF;
  149. data[5] = (voltage >> 16) & 0xFF;
  150. data[6] = (voltage >> 8) & 0xFF;
  151. data[7] = voltage & 0xFF;
  152. SendCmdToPsu(PwrFrameMsg.PwrMessage, data, sizeof(data));
  153. }
  154. void SetOutputCurrent(byte group, int current)
  155. {
  156. byte data[8];
  157. PwrFrame PwrFrameMsg;
  158. PwrFrameMsg.PwrMessage = 0;
  159. PwrFrameMsg.UUBits.Protocol = 0x01;
  160. PwrFrameMsg.UUBits.MonitorAddress = PSU_MONITOR_DEFAULT;
  161. // module id
  162. if (group == SYSTEM_CMD)
  163. PwrFrameMsg.UUBits.ModuleAddress = PSU_MODULE_BROADCAST;
  164. else
  165. PwrFrameMsg.UUBits.ModuleAddress = group;
  166. memset(data, 0x00, ARRAY_SIZE(data));
  167. // Group
  168. if (group == SYSTEM_CMD)
  169. data[0] = 0x00;
  170. else
  171. data[0] = group + 1;
  172. // Message Type
  173. data[0] = data[0] << 4;
  174. data[0] |= PSU_MSG_CMD_SET_PARAM;
  175. // Command Type
  176. data[1] = PSU_W_OUTPUT_CUR;
  177. // Command Data
  178. data[4] = (current >> 24) & 0xFF;
  179. data[5] = (current >> 16) & 0xFF;
  180. data[6] = (current >> 8) & 0xFF;
  181. data[7] = current & 0xFF;
  182. SendCmdToPsu(PwrFrameMsg.PwrMessage, data, sizeof(data));
  183. }
  184. void GetFastOutputVol(byte group)
  185. {
  186. byte data[8];
  187. PwrFrame PwrFrameMsg;
  188. PwrFrameMsg.PwrMessage = 0;
  189. PwrFrameMsg.UUBits.Protocol = 0x01;
  190. PwrFrameMsg.UUBits.MonitorAddress = PSU_MONITOR_DEFAULT;
  191. // module id
  192. //if (group == SYSTEM_CMD)
  193. PwrFrameMsg.UUBits.ModuleAddress = PSU_MODULE_BROADCAST;
  194. //else
  195. // PwrFrameMsg.UUBits.ModuleAddress = group;
  196. memset(data, 0x00, ARRAY_SIZE(data));
  197. // Group
  198. if (group == SYSTEM_CMD)
  199. data[0] = 0x00;
  200. else
  201. data[0] = group + 1;
  202. // Message Type
  203. data[0] = data[0] << 4;
  204. data[0] |= PSU_MSG_CMD_READ_MSG;
  205. // Command Type
  206. data[1] = PSU_R_FAST_OUTPUT_VOL;
  207. SendCmdToPsu(PwrFrameMsg.PwrMessage, data, sizeof(data));
  208. }
  209. void GetFastOutputCur(byte group)
  210. {
  211. byte data[8];
  212. PwrFrame PwrFrameMsg;
  213. PwrFrameMsg.PwrMessage = 0;
  214. PwrFrameMsg.UUBits.Protocol = 0x01;
  215. PwrFrameMsg.UUBits.MonitorAddress = PSU_MONITOR_DEFAULT;
  216. // module id
  217. //if (group == SYSTEM_CMD)
  218. PwrFrameMsg.UUBits.ModuleAddress = PSU_MODULE_BROADCAST;
  219. //else
  220. // PwrFrameMsg.UUBits.ModuleAddress = group;
  221. memset(data, 0x00, ARRAY_SIZE(data));
  222. // Group
  223. if (group == SYSTEM_CMD)
  224. data[0] = 0x00;
  225. else
  226. data[0] = group + 1;
  227. // Message Type
  228. data[0] = data[0] << 4;
  229. data[0] |= PSU_MSG_CMD_READ_MSG;
  230. // Command Type
  231. data[1] = PSU_R_FAST_OUTPUT_CUR;
  232. SendCmdToPsu(PwrFrameMsg.PwrMessage, data, sizeof(data));
  233. }
  234. void GetOutputPowCap(byte group)
  235. {
  236. byte data[8];
  237. PwrFrame PwrFrameMsg;
  238. PwrFrameMsg.PwrMessage = 0;
  239. PwrFrameMsg.UUBits.Protocol = 0x01;
  240. PwrFrameMsg.UUBits.MonitorAddress = PSU_MONITOR_DEFAULT;
  241. // module id
  242. //if (group == SYSTEM_CMD)
  243. PwrFrameMsg.UUBits.ModuleAddress = PSU_MODULE_BROADCAST;
  244. //else
  245. // PwrFrameMsg.UUBits.ModuleAddress = group;
  246. memset(data, 0x00, ARRAY_SIZE(data));
  247. // Group
  248. if (group == SYSTEM_CMD)
  249. data[0] = 0x00;
  250. else
  251. data[0] = group + 1;
  252. // Message Type
  253. data[0] = data[0] << 4;
  254. data[0] |= PSU_MSG_CMD_READ_MSG;
  255. // Command Type
  256. data[1] = PSU_R_OUTPUT_POW_CAP;
  257. SendCmdToPsu(PwrFrameMsg.PwrMessage, data, sizeof(data));
  258. }
  259. void GetOutputCurCap(byte group)
  260. {
  261. byte data[8];
  262. PwrFrame PwrFrameMsg;
  263. PwrFrameMsg.PwrMessage = 0;
  264. PwrFrameMsg.UUBits.Protocol = 0x01;
  265. PwrFrameMsg.UUBits.MonitorAddress = PSU_MONITOR_DEFAULT;
  266. // module id
  267. if (group == SYSTEM_CMD)
  268. PwrFrameMsg.UUBits.ModuleAddress = PSU_MODULE_BROADCAST;
  269. else
  270. PwrFrameMsg.UUBits.ModuleAddress = group;
  271. memset(data, 0x00, ARRAY_SIZE(data));
  272. // Group
  273. if (group == SYSTEM_CMD)
  274. data[0] = 0x00;
  275. else
  276. data[0] = group + 1;
  277. // Message Type
  278. data[0] = data[0] << 4;
  279. data[0] |= PSU_MSG_CMD_READ_MSG;
  280. // Command Type
  281. data[1] = PSU_R_OUTPUT_CUR_CAP;
  282. SendCmdToPsu(PwrFrameMsg.PwrMessage, data, sizeof(data));
  283. }
  284. void GetPsuMaxVoltage(byte group)
  285. {
  286. byte data[8];
  287. PwrFrame PwrFrameMsg;
  288. PwrFrameMsg.PwrMessage = 0;
  289. PwrFrameMsg.UUBits.Protocol = 0x01;
  290. PwrFrameMsg.UUBits.MonitorAddress = PSU_MONITOR_DEFAULT;
  291. // module id
  292. //if (group == SYSTEM_CMD)
  293. PwrFrameMsg.UUBits.ModuleAddress = PSU_MODULE_BROADCAST;
  294. //else
  295. // PwrFrameMsg.UUBits.ModuleAddress = group;
  296. memset(data, 0x00, ARRAY_SIZE(data));
  297. // Group
  298. if (group == SYSTEM_CMD)
  299. data[0] = 0x00;
  300. else
  301. data[0] = group + 1;
  302. // Message Type
  303. data[0] = data[0] << 4;
  304. data[0] |= PSU_MSG_CMD_READ_MSG;
  305. // Command Type
  306. data[1] = PSU_R_MAX_VOL;
  307. SendCmdToPsu(PwrFrameMsg.PwrMessage, data, sizeof(data));
  308. }
  309. void GetTemperature(byte group)
  310. {
  311. byte data[8];
  312. PwrFrame PwrFrameMsg;
  313. PwrFrameMsg.PwrMessage = 0;
  314. PwrFrameMsg.UUBits.Protocol = 0x01;
  315. PwrFrameMsg.UUBits.MonitorAddress = PSU_MONITOR_DEFAULT;
  316. // module id
  317. if (group == SYSTEM_CMD)
  318. PwrFrameMsg.UUBits.ModuleAddress = PSU_MODULE_BROADCAST;
  319. else
  320. PwrFrameMsg.UUBits.ModuleAddress = group;
  321. memset(data, 0x00, ARRAY_SIZE(data));
  322. // Group
  323. if (group == SYSTEM_CMD)
  324. data[0] = 0x00;
  325. else
  326. data[0] = group + 1;
  327. // Message Type
  328. data[0] = data[0] << 4;
  329. data[0] |= PSU_MSG_CMD_READ_MSG;
  330. // Command Type
  331. data[1] = PSU_R_TEMP;
  332. SendCmdToPsu(PwrFrameMsg.PwrMessage, data, sizeof(data));
  333. }
  334. void GetInputVoltageL12(byte group)
  335. {
  336. byte data[8];
  337. PwrFrame PwrFrameMsg;
  338. PwrFrameMsg.PwrMessage = 0;
  339. PwrFrameMsg.UUBits.Protocol = 0x01;
  340. PwrFrameMsg.UUBits.MonitorAddress = PSU_MONITOR_DEFAULT;
  341. // module id
  342. if (group == SYSTEM_CMD)
  343. PwrFrameMsg.UUBits.ModuleAddress = PSU_MODULE_BROADCAST;
  344. else
  345. PwrFrameMsg.UUBits.ModuleAddress = group;
  346. memset(data, 0x00, ARRAY_SIZE(data));
  347. // Group
  348. if (group == SYSTEM_CMD)
  349. data[0] = 0x00;
  350. else
  351. data[0] = group + 1;
  352. // Message Type
  353. data[0] = data[0] << 4;
  354. data[0] |= PSU_MSG_CMD_READ_MSG;
  355. // Command Type
  356. data[1] = PSU_R_VIN_L12;
  357. SendCmdToPsu(PwrFrameMsg.PwrMessage, data, sizeof(data));
  358. }
  359. void GetInputVoltageL23(byte group)
  360. {
  361. byte data [8];
  362. PwrFrame PwrFrameMsg;
  363. PwrFrameMsg.PwrMessage = 0;
  364. PwrFrameMsg.UUBits.Protocol = 0x01;
  365. PwrFrameMsg.UUBits.MonitorAddress = PSU_MONITOR_DEFAULT;
  366. // module id
  367. if (group == SYSTEM_CMD)
  368. PwrFrameMsg.UUBits.ModuleAddress = PSU_MODULE_BROADCAST;
  369. else
  370. PwrFrameMsg.UUBits.ModuleAddress = group;
  371. memset ( data, 0x00, ARRAY_SIZE( data ) );
  372. // Group
  373. if (group == SYSTEM_CMD)
  374. data [0] = 0x00;
  375. else
  376. data [0] = group + 1;
  377. // Message Type
  378. data [0] = data [0] << 4;
  379. data [0] |= PSU_MSG_CMD_READ_MSG;
  380. // Command Type
  381. data [1] = PSU_R_VIN_L23;
  382. SendCmdToPsu ( PwrFrameMsg.PwrMessage, data, sizeof(data) );
  383. }
  384. void GetInputVoltageL31(byte group)
  385. {
  386. byte data [8];
  387. PwrFrame PwrFrameMsg;
  388. PwrFrameMsg.PwrMessage = 0;
  389. PwrFrameMsg.UUBits.Protocol = 0x01;
  390. PwrFrameMsg.UUBits.MonitorAddress = PSU_MONITOR_DEFAULT;
  391. // module id
  392. if (group == SYSTEM_CMD)
  393. PwrFrameMsg.UUBits.ModuleAddress = PSU_MODULE_BROADCAST;
  394. else
  395. PwrFrameMsg.UUBits.ModuleAddress = group;
  396. memset ( data, 0x00, ARRAY_SIZE( data ) );
  397. // Group
  398. if (group == SYSTEM_CMD)
  399. data [0] = 0x00;
  400. else
  401. data [0] = group + 1;
  402. // Message Type
  403. data [0] = data [0] << 4;
  404. data [0] |= PSU_MSG_CMD_READ_MSG;
  405. // Command Type
  406. data [1] = PSU_R_VIN_L31;
  407. SendCmdToPsu ( PwrFrameMsg.PwrMessage, data, sizeof(data) );
  408. }
  409. void GetDc2DcVersion(byte group)
  410. {
  411. byte data[8];
  412. PwrFrame PwrFrameMsg;
  413. PwrFrameMsg.PwrMessage = 0;
  414. PwrFrameMsg.UUBits.Protocol = 0x01;
  415. PwrFrameMsg.UUBits.MonitorAddress = PSU_MONITOR_DEFAULT;
  416. // module id
  417. //if (group == SYSTEM_CMD)
  418. PwrFrameMsg.UUBits.ModuleAddress = PSU_MODULE_BROADCAST;
  419. //else
  420. // PwrFrameMsg.UUBits.ModuleAddress = group;
  421. memset(data, 0x00, ARRAY_SIZE(data));
  422. // Group
  423. if (group == SYSTEM_CMD)
  424. data[0] = 0x00;
  425. else
  426. data[0] = group + 1;
  427. // Message Type
  428. data[0] = data[0] << 4;
  429. data[0] |= PSU_MSG_CMD_READ_MSG;
  430. // Command Type
  431. data[1] = PSU_R_DD_VERSION;
  432. SendCmdToPsu(PwrFrameMsg.PwrMessage, data, sizeof(data));
  433. }
  434. void GetPfcVersion(byte group)
  435. {
  436. byte data[8];
  437. PwrFrame PwrFrameMsg;
  438. PwrFrameMsg.PwrMessage = 0;
  439. PwrFrameMsg.UUBits.Protocol = 0x01;
  440. PwrFrameMsg.UUBits.MonitorAddress = PSU_MONITOR_DEFAULT;
  441. // module id
  442. //if (group == SYSTEM_CMD)
  443. PwrFrameMsg.UUBits.ModuleAddress = PSU_MODULE_BROADCAST;
  444. //else
  445. // PwrFrameMsg.UUBits.ModuleAddress = group;
  446. memset(data, 0x00, ARRAY_SIZE(data));
  447. // Group
  448. if (group == SYSTEM_CMD)
  449. data[0] = 0x00;
  450. else
  451. data[0] = group + 1;
  452. // Message Type
  453. data[0] = data[0] << 4;
  454. data[0] |= PSU_MSG_CMD_READ_MSG;
  455. // Command Type
  456. data[1] = PSU_R_PFC_VERSION;
  457. SendCmdToPsu(PwrFrameMsg.PwrMessage, data, sizeof(data));
  458. }
  459. //================================================
  460. // Receive data from CANBUS Function
  461. //================================================
  462. void SendCallback()
  463. {
  464. int _passTime = UU_GetTimeoutValue ( & ShmTimelineData._getCount_time );
  465. if (_passTime < 0)
  466. UU_GetTimespecFunc(&ShmTimelineData._getCount_time);
  467. else if (ShmTimelineData._getCountChk && _passTime > 200)
  468. {
  469. ShmUuPowerData.totalPsuCount = 0;
  470. for (byte i = 0; i < 2; i ++)
  471. {
  472. if (ShmUuPowerData.uu_pow_info [i].psuCount > 0)
  473. {
  474. return_module_count ( i, ShmUuPowerData.uu_pow_info [i].psuCount );
  475. ShmUuPowerData.totalPsuCount += ShmUuPowerData.uu_pow_info [i].psuCount;
  476. }
  477. }
  478. return_module_count (SYSTEM_CMD, ShmUuPowerData.totalPsuCount);
  479. ShmTimelineData._getCountChk = LIB_STOP;
  480. ShmUuPowerData._getCountIndexComp = LIB_START;
  481. }
  482. }
  483. void ReceiveDataFromCanBus()
  484. {
  485. int nbytes;
  486. struct can_frame frame;
  487. PwrFrame *PwrFrameMsg;
  488. byte group;
  489. memset(&ShmUuPowerData, 0, sizeof(struct UuPowerInformation));
  490. memset(&ShmTimelineData, 0, sizeof(struct TimelineInfor));
  491. while(1)
  492. {
  493. SendCallback();
  494. memset(&frame, 0, sizeof(struct can_frame));
  495. nbytes = read(CanFd, &frame, sizeof(struct can_frame));
  496. if (nbytes > 0)
  497. {
  498. PwrFrameMsg = (PwrFrame *)&frame.can_id;
  499. //byte protocol = PwrFrameMsg->UUBits.Protocol;
  500. byte moduleAddr = PwrFrameMsg->UUBits.ModuleAddress;
  501. //byte monitorAddr = PwrFrameMsg->UUBits.MonitorAddress;
  502. // Group 從0開始~ 但 UU 從 1 開始~
  503. group = ((frame.data[0] & 0xF0) >> 4) - 1;
  504. //printf("group = %d \n", group);
  505. //printf("moduleAddr = %d \n", moduleAddr);
  506. //printf("monitorAddr = %d \n", monitorAddr);
  507. // printf("data[0] = %d, data[1] = %d, data[2] = %d, data[3] = %d, data[4] = %d, data[5] = %d, data[6] = %d, data[7] = %d \n",
  508. // frame.data[0], frame.data[1], frame.data[2], frame.data[3],
  509. // frame.data[4], frame.data[5], frame.data[6], frame.data[7]);
  510. switch (frame.data[1])
  511. {
  512. case PSU_R_MODULE_COUNT:
  513. {
  514. //printf("----------PSU_R_GET_COUNT---------- \n");
  515. bool isFind = false;
  516. for (byte i = 0; i < ShmUuPowerData.uu_pow_info[group].psuCount; i++)
  517. {
  518. if (ShmUuPowerData.uu_pow_info[group].psuInfo[i].targetNumber == moduleAddr)
  519. isFind = true;
  520. }
  521. if (!isFind)
  522. {
  523. ShmUuPowerData.uu_pow_info[group].psuInfo[ShmUuPowerData.uu_pow_info[group].psuCount].targetNumber = moduleAddr;
  524. ShmUuPowerData.uu_pow_info[group].psuCount++;
  525. }
  526. if (ShmTimelineData._getCountChk == LIB_STOP)
  527. {
  528. ShmTimelineData._getCountChk = LIB_START;
  529. UU_GetTimespecFunc(&ShmTimelineData._getCount_time);
  530. }
  531. }
  532. break;
  533. }
  534. if (ShmUuPowerData._getCountIndexComp)
  535. {
  536. switch (frame.data[1])
  537. {
  538. case PSU_R_FAST_OUTPUT_VOL:
  539. {
  540. //printf("----------PSU_R_FAST_OUTPUT_VOL---------- \n");
  541. float _vol = 0, _cur = 0;
  542. for(byte count = 0; count < ShmUuPowerData.uu_pow_info[group].psuCount; count++)
  543. {
  544. if (ShmUuPowerData.uu_pow_info[group].psuInfo[count].targetNumber == moduleAddr)
  545. {
  546. ShmUuPowerData.uu_pow_info[group].psuInfo[count].outputVol =
  547. ((frame.data[4] << 24 | frame.data[5] << 16 | frame.data[6] << 8 | frame.data[7])) / 100;
  548. }
  549. if (ShmUuPowerData.uu_pow_info[group].psuInfo[count].outputVol > 0)
  550. {
  551. if (_vol == 0 || ShmUuPowerData.uu_pow_info[group].psuInfo[count].outputVol < _vol)
  552. _vol = ShmUuPowerData.uu_pow_info[group].psuInfo[count].outputVol;
  553. }
  554. _cur += ShmUuPowerData.uu_pow_info[group].psuInfo[count].outputCur;
  555. }
  556. ShmUuPowerData.uu_pow_info[group].presentVol = _vol;
  557. ShmUuPowerData.uu_pow_info[group].presentCur = _cur;
  558. return_get_output_float(group,
  559. ShmUuPowerData.uu_pow_info [group].presentVol,
  560. ShmUuPowerData.uu_pow_info [group].presentCur,
  561. PSU_PROTOCOL_TYPE );
  562. }
  563. break;
  564. case PSU_R_FAST_OUTPUT_CUR:
  565. {
  566. //printf("----------PSU_R_OUTPUT_CUR---------- \n");
  567. for(byte count = 0; count < ShmUuPowerData.uu_pow_info[group].psuCount; count++)
  568. {
  569. if (ShmUuPowerData.uu_pow_info[group].psuInfo[count].targetNumber == moduleAddr)
  570. {
  571. ShmUuPowerData.uu_pow_info[group].psuInfo[count].outputCur =
  572. ((frame.data[4] << 24 | frame.data[5] << 16 | frame.data[6] << 8 | frame.data[7])) / 100;
  573. break;
  574. }
  575. }
  576. //
  577. // ShmUuPowerData.uu_pow_info[group].presentCur = ((frame.data[4] << 24 | frame.data[5] << 16 | frame.data[6] << 8 | frame.data[7])) / 100;
  578. // return_get_output_float(group,
  579. // ShmUuPowerData.uu_pow_info[group].presentVol,
  580. // ShmUuPowerData.uu_pow_info[group].presentCur,
  581. // PSU_PROTOCOL_TYPE);
  582. }
  583. break;
  584. case PSU_R_DD_VERSION:
  585. {
  586. //printf("----------PSU_R_DD_VERSION---------- \n");
  587. for(byte count = 0; count < ShmUuPowerData.uu_pow_info[group].psuCount; count++)
  588. {
  589. if (ShmUuPowerData.uu_pow_info[group].psuInfo[count].targetNumber == moduleAddr)
  590. {
  591. ShmUuPowerData.uu_pow_info[group].psuInfo[count].dc2dcVersion =
  592. ((frame.data[6] << 8) + frame.data[7]);
  593. byte psuIndexAddr = moduleAddr;
  594. if (group > 0)
  595. {
  596. psuIndexAddr = moduleAddr + ShmUuPowerData.uu_pow_info[group - 1].psuCount;
  597. }
  598. return_fw_version(psuIndexAddr,
  599. ShmUuPowerData.uu_pow_info[group].psuInfo[count].dc2dcVersion,
  600. ShmUuPowerData.uu_pow_info[group].psuInfo[count].pfcVersion,
  601. LIB_UU_HW_VERSIION,
  602. PSU_PROTOCOL_TYPE);
  603. break;
  604. }
  605. }
  606. }
  607. break;
  608. case PSU_R_PFC_VERSION:
  609. {
  610. //printf("----------PSU_R_PFC_VERSION---------- \n");
  611. for(byte count = 0; count < ShmUuPowerData.uu_pow_info[group].psuCount; count++)
  612. {
  613. if (ShmUuPowerData.uu_pow_info[group].psuInfo[count].targetNumber == moduleAddr)
  614. {
  615. ShmUuPowerData.uu_pow_info[group].psuInfo[count].pfcVersion =
  616. ((frame.data[6] << 8) + frame.data[7]);
  617. byte psuIndexAddr = moduleAddr;
  618. if (group > 0)
  619. {
  620. psuIndexAddr = moduleAddr + ShmUuPowerData.uu_pow_info[group - 1].psuCount;
  621. }
  622. return_fw_version(psuIndexAddr,
  623. ShmUuPowerData.uu_pow_info[group].psuInfo[count].dc2dcVersion,
  624. ShmUuPowerData.uu_pow_info[group].psuInfo[count].pfcVersion,
  625. LIB_UU_HW_VERSIION,
  626. PSU_PROTOCOL_TYPE);
  627. break;
  628. }
  629. }
  630. }
  631. break;
  632. case PSU_R_IAVAILABLE:
  633. {
  634. //printf("----------PSU_R_IAVAILABLE---------- \n");
  635. // printf("Group = %d, moduleAddr = %d, data[4] = %d, data[5] = %d, data[6] = %d, data[7] = %d \n",
  636. // group, moduleAddr,
  637. // frame.data[4], frame.data[5], frame.data[6], frame.data[7]);
  638. for(byte count = 0; count < ShmUuPowerData.uu_pow_info[group].psuCount; count++)
  639. {
  640. if (ShmUuPowerData.uu_pow_info[group].psuInfo[count].targetNumber == moduleAddr)
  641. {
  642. byte psuIndexAddr = moduleAddr;
  643. if (group > 0)
  644. {
  645. psuIndexAddr = moduleAddr + ShmUuPowerData.uu_pow_info[group - 1].psuCount;
  646. }
  647. return_iavail_info(psuIndexAddr, ((frame.data[6] << 8) + frame.data[7]) / 1, LIB_NO_USE);
  648. break;
  649. }
  650. }
  651. }
  652. break;
  653. case PSU_W_OUTPUT_VOL:
  654. {
  655. printf("----------PSU_W_OUTPUT_VOL_CAP---------- \n");
  656. }
  657. break;
  658. case PSU_W_OUTPUT_CUR:
  659. {
  660. printf("----------PSU_W_OUTPUT_CUR_CAP---------- \n");
  661. }
  662. break;
  663. case PSU_R_SERIAL_NUM:
  664. {
  665. printf("----------PSU_R_SERIAL_NUM---------- \n");
  666. }
  667. break;
  668. case PSU_R_STATUS:
  669. {
  670. //printf("----------PSU_R_STATUS---------- \n");
  671. byte psuIndexAddr = moduleAddr;
  672. if (group > 0)
  673. {
  674. psuIndexAddr = moduleAddr + ShmUuPowerData.uu_pow_info[group - 1].psuCount;
  675. }
  676. return_status(group, psuIndexAddr, LIB_NO_USE, LIB_NO_USE, PSU_PROTOCOL_TYPE,
  677. frame.data[4], frame.data[5], frame.data[6], frame.data[7]);
  678. }
  679. break;
  680. case PSU_R_OUTPUT_POW_CAP:
  681. {
  682. int pow = (frame.data[4] << 24 | frame.data[5] << 16 | frame.data[6] << 8 | frame.data[7]) / 10000;
  683. if ((pow += 5) > 180)
  684. pow = 180;
  685. for(byte count = 0; count < ShmUuPowerData.uu_pow_info[group].psuCount; count++)
  686. {
  687. if (ShmUuPowerData.uu_pow_info[group].psuInfo[count].targetNumber == moduleAddr)
  688. {
  689. ShmUuPowerData.uu_pow_info[group].psuInfo[count].powerCap = pow;
  690. byte psuIndexAddr = moduleAddr;
  691. if (group > 0)
  692. {
  693. psuIndexAddr = moduleAddr + ShmUuPowerData.uu_pow_info[group - 1].psuCount;
  694. }
  695. return_available_cap(psuIndexAddr,
  696. LIB_PSU_MAX_VOL,
  697. LIB_PSU_MIN_VOL,
  698. LIB_PSU_MAX_CUR,
  699. ShmUuPowerData.uu_pow_info[group].psuInfo[count].powerCap);
  700. break;
  701. }
  702. }
  703. }
  704. break;
  705. case PSU_R_OUTPUT_CUR_CAP:
  706. {
  707. // 因為高低壓設定的問題~該指令無法正常指令
  708. int cur = (frame.data[4] << 24 | frame.data[5] << 16 | frame.data[6] << 8 | frame.data[7]) / 1000;
  709. for(byte count = 0; count < ShmUuPowerData.uu_pow_info[group].psuCount; count++)
  710. {
  711. if (ShmUuPowerData.uu_pow_info[group].psuInfo[count].targetNumber == moduleAddr)
  712. {
  713. ShmUuPowerData.uu_pow_info[group].psuInfo[count].currentCap = cur;
  714. break;
  715. }
  716. }
  717. }
  718. break;
  719. case PSU_R_MAX_VOL:
  720. {
  721. // 因為高低壓設定的問題~該指令無法正常指令
  722. int maxVol = ((frame.data[4] << 24 | frame.data[5] << 16 | frame.data[6] << 8 | frame.data[7]) / 100000) * 1000;
  723. for(byte count = 0; count < ShmUuPowerData.uu_pow_info[group].psuCount; count++)
  724. {
  725. if (ShmUuPowerData.uu_pow_info[group].psuInfo[count].targetNumber == moduleAddr)
  726. {
  727. ShmUuPowerData.uu_pow_info[group].psuInfo[count].maxVoltage = maxVol;
  728. break;
  729. }
  730. }
  731. }
  732. break;
  733. case PSU_R_VIN_L12:
  734. {
  735. //printf("----------PSU_R_VIN_L12---------- \n");
  736. for(byte count = 0; count < ShmUuPowerData.uu_pow_info[group].psuCount; count++)
  737. {
  738. if (ShmUuPowerData.uu_pow_info[group].psuInfo[count].targetNumber == moduleAddr)
  739. {
  740. ShmUuPowerData.uu_pow_info[group].psuInfo[count].inputVolL12 =
  741. ((frame.data[4] << 24 | frame.data[5] << 16 | frame.data[6] << 8 | frame.data[7])) / 1000;
  742. break;
  743. }
  744. }
  745. }
  746. break;
  747. case PSU_R_VIN_L23:
  748. {
  749. //printf("----------PSU_R_VIN_L23---------- \n");
  750. for(byte count = 0; count < ShmUuPowerData.uu_pow_info[group].psuCount; count++)
  751. {
  752. if (ShmUuPowerData.uu_pow_info[group].psuInfo[count].targetNumber == moduleAddr)
  753. {
  754. ShmUuPowerData.uu_pow_info[group].psuInfo[count].inputVolL23 =
  755. ((frame.data[4] << 24 | frame.data[5] << 16 | frame.data[6] << 8 | frame.data[7])) / 1000;
  756. break;
  757. }
  758. }
  759. }
  760. break;
  761. case PSU_R_VIN_L31:
  762. {
  763. //printf("----------PSU_R_VIN_L31---------- \n");
  764. for(byte count = 0; count < ShmUuPowerData.uu_pow_info[group].psuCount; count++)
  765. {
  766. if (ShmUuPowerData.uu_pow_info[group].psuInfo[count].targetNumber == moduleAddr)
  767. {
  768. ShmUuPowerData.uu_pow_info[group].psuInfo[count].inputVolL31 =
  769. ((frame.data[4] << 24 | frame.data[5] << 16 | frame.data[6] << 8 | frame.data[7])) / 1000;
  770. byte psuIndexAddr = moduleAddr;
  771. if (group > 0)
  772. {
  773. psuIndexAddr = moduleAddr + ShmUuPowerData.uu_pow_info[group - 1].psuCount;
  774. }
  775. return_input_vol(psuIndexAddr,
  776. ShmUuPowerData.uu_pow_info[group].psuInfo[count].inputVolL12,
  777. ShmUuPowerData.uu_pow_info[group].psuInfo[count].inputVolL23,
  778. ShmUuPowerData.uu_pow_info[group].psuInfo[count].inputVolL31);
  779. break;
  780. }
  781. }
  782. }
  783. break;
  784. case PSU_R_TEMP:
  785. {
  786. //printf("----------PSU_R_TEMP---------- \n");
  787. byte psuIndexAddr = moduleAddr;
  788. if (group > 0)
  789. {
  790. psuIndexAddr = moduleAddr + ShmUuPowerData.uu_pow_info[group - 1].psuCount;
  791. }
  792. return_output_temp(psuIndexAddr, LIB_NO_USE, LIB_NO_USE, LIB_NO_USE, ((frame.data[6] << 8 | frame.data[7])) / 1000, PSU_PROTOCOL_TYPE);
  793. //printf("temp = %02d \n", ((frame.data[6] << 8 | frame.data[7])) / 1000);
  794. }
  795. break;
  796. case PSU_RW_GROUP:
  797. {
  798. printf("PSU_RW_GROUP : address = %d, group = %d \n", moduleAddr, group);
  799. }
  800. break;
  801. case PSU_W_HIGH_LOW_VOL_MODE:
  802. {
  803. //printf("----------PSU_W_HIGH_LOW_VOL_MODE---------- \n");
  804. }
  805. break;
  806. case PSU_R_HIGH_LOW_VOL_MODE:
  807. {
  808. //printf("----------PSU_R_HIGH_LOW_VOL_MODE---------- \n");
  809. printf("PSU_R_HIGH_LOW_VOL_MODE : G : %d, value : %d \n", group, frame.data[7]);
  810. }
  811. break;
  812. }
  813. }
  814. }
  815. else
  816. usleep(10000);
  817. }
  818. }
  819. //================================================
  820. // Public Function
  821. //================================================
  822. bool InitialCommunication()
  823. {
  824. CanFd = InitCanBus();
  825. if(CanFd < 0)
  826. {
  827. printf("Init can bus fail.... \n");
  828. return false;
  829. }
  830. recFork = fork();
  831. if(recFork == 0)
  832. {
  833. ReceiveDataFromCanBus();
  834. }
  835. // callbackFunc = fork();
  836. // if (callbackFunc == 0)
  837. // {
  838. // SendCallback();
  839. // }
  840. return true;
  841. }
  842. /*
  843. * Data :
  844. * byte 0 =>
  845. 0 ~ 3 bit : MessageType
  846. 4 ~ 7 bit : Group Address (1 ~ 15)
  847. * byte 1 =>
  848. Command Type
  849. * byte 2、3 =>
  850. Reserved
  851. * byte 4 ~ 7 =>
  852. Command Data
  853. */
  854. /**********************************************************************************/
  855. /*** ***/
  856. /*** Get ***/
  857. /*** ***/
  858. /**********************************************************************************/
  859. void GetGroup(byte address)
  860. {
  861. byte data[8];
  862. PwrFrame PwrFrameMsg;
  863. PwrFrameMsg.PwrMessage = 0;
  864. PwrFrameMsg.UUBits.Protocol = 0x01;
  865. PwrFrameMsg.UUBits.MonitorAddress = PSU_MONITOR_DEFAULT;
  866. // module id
  867. PwrFrameMsg.UUBits.ModuleAddress = 0x04;
  868. memset(data, 0x00, ARRAY_SIZE(data));
  869. // Group
  870. data[0] = 0x01;
  871. // Message Type
  872. data[0] = data[0] << 4;
  873. data[0] |= PSU_MSG_CMD_READ_MSG;
  874. // Command Type
  875. data[1] = PSU_RW_GROUP;
  876. // Reserved
  877. data[2] = 0x00;
  878. data[3] = 0x00;
  879. // Command Data
  880. data[4] = 0x00;
  881. data[5] = 0x00;
  882. data[6] = 0x00;
  883. data[7] = 0x00;
  884. SendCmdToPsu(PwrFrameMsg.PwrMessage, data, sizeof(data));
  885. }
  886. void GetStatus(byte group, byte param)
  887. {
  888. if (param == LIB_NO_USE)
  889. return;
  890. byte data[8];
  891. PwrFrame PwrFrameMsg;
  892. PwrFrameMsg.PwrMessage = 0;
  893. PwrFrameMsg.UUBits.Protocol = 0x01;
  894. PwrFrameMsg.UUBits.MonitorAddress = PSU_MONITOR_DEFAULT;
  895. // module id - 不管哪一群~ 都是對該群做群發動做
  896. PwrFrameMsg.UUBits.ModuleAddress = PSU_MODULE_BROADCAST;
  897. memset(data, 0x00, ARRAY_SIZE(data));
  898. // Group
  899. if (group == SYSTEM_CMD)
  900. data[0] = 0x00;
  901. else
  902. data[0] = group + 1;
  903. // Message Type
  904. data[0] = data[0] << 4;
  905. data[0] |= PSU_MSG_CMD_READ_MSG;
  906. // Command Type
  907. data[1] = PSU_R_STATUS;
  908. SendCmdToPsu(PwrFrameMsg.PwrMessage, data, sizeof(data));
  909. }
  910. void GetModuleVoltageMode(byte group)
  911. {
  912. byte data[8];
  913. PwrFrame PwrFrameMsg;
  914. PwrFrameMsg.PwrMessage = 0;
  915. PwrFrameMsg.UUBits.Protocol = 0x01;
  916. PwrFrameMsg.UUBits.MonitorAddress = PSU_MONITOR_DEFAULT;
  917. // module id - 群發
  918. if (group == SYSTEM_CMD)
  919. PwrFrameMsg.UUBits.ModuleAddress = PSU_MODULE_BROADCAST;
  920. else
  921. PwrFrameMsg.UUBits.ModuleAddress = group;
  922. memset(data, 0x00, ARRAY_SIZE(data));
  923. // Group
  924. if (group == SYSTEM_CMD)
  925. data[0] = 0x00;
  926. else
  927. data[0] = group + 1;
  928. // Message Type
  929. data[0] = data[0] << 4;
  930. data[0] |= PSU_MSG_CMD_READ_MSG;
  931. // Command Type
  932. data[1] = PSU_R_HIGH_LOW_VOL_MODE;
  933. SendCmdToPsu(PwrFrameMsg.PwrMessage, data, sizeof(data));
  934. }
  935. /**********************************************************************************/
  936. /*** ***/
  937. /*** Set ***/
  938. /*** ***/
  939. /**********************************************************************************/
  940. void SetGroup(byte group, byte sourceAddr, byte targetAddr)
  941. {
  942. byte data[8];
  943. PwrFrame PwrFrameMsg;
  944. PwrFrameMsg.PwrMessage = 0;
  945. PwrFrameMsg.UUBits.Protocol = 0x01;
  946. PwrFrameMsg.UUBits.MonitorAddress = PSU_MONITOR_DEFAULT;
  947. // module id
  948. PwrFrameMsg.UUBits.ModuleAddress = sourceAddr;
  949. memset(data, 0x00, ARRAY_SIZE(data));
  950. // Group
  951. data[0] = group + 1;
  952. // Message Type
  953. data[0] = data[0] << 4;
  954. data[0] |= PSU_MSG_CMD_SET_PARAM;
  955. // Command Type
  956. data[1] = PSU_RW_GROUP;
  957. // Reserved
  958. data[2] = 0x00;
  959. data[3] = 0x00;
  960. // Command Data
  961. data[7] = targetAddr;
  962. SendCmdToPsu(PwrFrameMsg.PwrMessage, data, sizeof(data));
  963. }
  964. void SetModuleVoltageMode(byte group, byte value)
  965. {
  966. byte data[8];
  967. PwrFrame PwrFrameMsg;
  968. PwrFrameMsg.PwrMessage = 0;
  969. PwrFrameMsg.UUBits.Protocol = 0x01;
  970. PwrFrameMsg.UUBits.MonitorAddress = PSU_MONITOR_DEFAULT;
  971. // module id
  972. if (group == SYSTEM_CMD)
  973. PwrFrameMsg.UUBits.ModuleAddress = PSU_MODULE_BROADCAST;
  974. else
  975. PwrFrameMsg.UUBits.ModuleAddress = group;
  976. memset(data, 0x00, ARRAY_SIZE(data));
  977. // Group
  978. if (group == SYSTEM_CMD)
  979. data[0] = 0x00;
  980. else
  981. data[0] = group + 1;
  982. // Message Type
  983. data[0] = data[0] << 4;
  984. data[0] |= PSU_MSG_CMD_SET_PARAM;
  985. // Command Type
  986. data[1] = PSU_W_HIGH_LOW_VOL_MODE;
  987. // Command Data
  988. data[4] = 0x00;
  989. data[5] = 0x00;
  990. data[6] = 0x00;
  991. data[7] = value;
  992. SendCmdToPsu(PwrFrameMsg.PwrMessage, data, sizeof(data));
  993. }
  994. /**********************************************************************************/
  995. /*** ***/
  996. /*** sdlu ***/
  997. /*** ***/
  998. /**********************************************************************************/
  999. void SwitchPower(byte group, byte value)
  1000. {
  1001. byte data[8];
  1002. PwrFrame PwrFrameMsg;
  1003. PwrFrameMsg.PwrMessage = 0;
  1004. PwrFrameMsg.UUBits.Protocol = 0x01;
  1005. PwrFrameMsg.UUBits.MonitorAddress = PSU_MONITOR_DEFAULT;
  1006. // module id
  1007. if (group == SYSTEM_CMD)
  1008. PwrFrameMsg.UUBits.ModuleAddress = PSU_MODULE_BROADCAST;
  1009. else
  1010. PwrFrameMsg.UUBits.ModuleAddress = group;
  1011. memset(data, 0x00, ARRAY_SIZE(data));
  1012. // 1 : 關機
  1013. // 0 : 開機
  1014. // Group
  1015. if (group == SYSTEM_CMD)
  1016. data[0] = 0x00;
  1017. else
  1018. data[0] = group + 1;
  1019. // Message Type
  1020. data[0] = data[0] << 4;
  1021. data[0] |= PSU_MSG_CMD_SET_PARAM;
  1022. // Command Type
  1023. data[1] = PSU_W_SWITCH_POW;
  1024. // Command Data
  1025. data[4] = 0x00;
  1026. data[5] = 0x00;
  1027. data[6] = 0x00;
  1028. data[7] = value;
  1029. SendCmdToPsu(PwrFrameMsg.PwrMessage, data, sizeof(data));
  1030. }
  1031. void GetModuleCount(byte group)
  1032. {
  1033. byte data[8];
  1034. PwrFrame PwrFrameMsg;
  1035. PwrFrameMsg.PwrMessage = 0;
  1036. PwrFrameMsg.UUBits.Protocol = 0x01;
  1037. PwrFrameMsg.UUBits.MonitorAddress = PSU_MONITOR_DEFAULT;
  1038. // module id - 群發
  1039. if (group == SYSTEM_CMD)
  1040. PwrFrameMsg.UUBits.ModuleAddress = PSU_MODULE_BROADCAST;
  1041. else
  1042. {
  1043. PwrFrameMsg.UUBits.ModuleAddress = group;
  1044. }
  1045. memset(data, 0x00, ARRAY_SIZE(data));
  1046. if (group == SYSTEM_CMD)
  1047. {
  1048. // Group
  1049. data[0] = 0x01;
  1050. // Message Type
  1051. data[0] = data[0] << 4;
  1052. data[0] |= PSU_MSG_CMD_READ_MSG;
  1053. // Command Type
  1054. data[1] = PSU_R_MODULE_COUNT;
  1055. SendCmdToPsu(PwrFrameMsg.PwrMessage, data, sizeof(data));
  1056. // Group
  1057. data[0] = 0x02;
  1058. SendCmdToPsu(PwrFrameMsg.PwrMessage, data, sizeof(data));
  1059. }
  1060. else
  1061. {
  1062. // Group
  1063. data[0] = group + 1;
  1064. // Message Type
  1065. data[0] = data[0] << 4;
  1066. data[0] |= PSU_MSG_CMD_READ_MSG;
  1067. // Command Type
  1068. data[1] = PSU_R_MODULE_COUNT;
  1069. SendCmdToPsu(PwrFrameMsg.PwrMessage, data, sizeof(data));
  1070. }
  1071. }
  1072. void GetModuleCap(byte group)
  1073. {
  1074. GetOutputPowCap(group);
  1075. //GetOutputCurCap(group);
  1076. //GetPsuMaxVoltage(group);
  1077. }
  1078. void GetModuleIavailable(byte group)
  1079. {
  1080. byte data[8];
  1081. PwrFrame PwrFrameMsg;
  1082. PwrFrameMsg.PwrMessage = 0;
  1083. PwrFrameMsg.UUBits.Protocol = 0x01;
  1084. PwrFrameMsg.UUBits.MonitorAddress = PSU_MONITOR_DEFAULT;
  1085. // module id
  1086. //if (group == SYSTEM_CMD)
  1087. PwrFrameMsg.UUBits.ModuleAddress = PSU_MODULE_BROADCAST;
  1088. //else
  1089. // PwrFrameMsg.UUBits.ModuleAddress = group;
  1090. memset(data, 0x00, ARRAY_SIZE(data));
  1091. // Group
  1092. if (group == SYSTEM_CMD)
  1093. data[0] = 0x00;
  1094. else
  1095. data[0] = group + 1;
  1096. // Message Type
  1097. data[0] = data[0] << 4;
  1098. data[0] |= PSU_MSG_CMD_READ_MSG;
  1099. // Command Type
  1100. data[1] = PSU_R_IAVAILABLE;
  1101. SendCmdToPsu(PwrFrameMsg.PwrMessage, data, sizeof(data));
  1102. }
  1103. void GetModuleOutputF(byte group)
  1104. {
  1105. GetFastOutputVol(group);
  1106. GetFastOutputCur(group);
  1107. }
  1108. void GetDcTemperature(byte group)
  1109. {
  1110. GetTemperature(group);
  1111. GetInputVoltageL12(group);
  1112. GetInputVoltageL23(group);
  1113. GetInputVoltageL31(group);
  1114. }
  1115. void PresentOutputVol(byte group, int voltage, int current, byte psuCount)
  1116. {
  1117. voltage *= 100;
  1118. SetOutputVoltage ( group, voltage );
  1119. current *= 100;
  1120. if (psuCount > 0)
  1121. current /= psuCount;
  1122. else
  1123. current = LIB_PSU_MIN_CUR;
  1124. SetOutputCurrent ( group, current );
  1125. if (current == 0 && voltage == 0)
  1126. SwitchPower(group, PSU_POWER_OFF);
  1127. }
  1128. void GetModuleVer(byte group)
  1129. {
  1130. GetDc2DcVersion(group);
  1131. GetPfcVersion(group);
  1132. }
  1133. void SetWalkInConfig(byte group, byte enable, byte sec)
  1134. {
  1135. // 這階段可以做模塊高低壓設定、初始化一些設定
  1136. ShmUuPowerData._getCountIndexComp = LIB_STOP;
  1137. SetModuleVoltageMode(group, PSU_VOLTAGE_LOW);
  1138. }
  1139. void FlashLed(byte group, byte value)
  1140. {
  1141. // none use
  1142. }
  1143. void SetDirModulePresentOutput(byte group, int voltage, int current, byte _switch, byte _interRelay)
  1144. {
  1145. // none use
  1146. }