UUpwr_PsuCommObj.c 35 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325
  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, byte type)
  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. if (type == UU_MODULE_TEMP_ENV)
  332. data[1] = PSU_R_IN_TEMP;
  333. else if (type == UU_MODULE_TEMP_DD)
  334. data[1] = PSU_R_PFC_TEMP;
  335. SendCmdToPsu(PwrFrameMsg.PwrMessage, data, sizeof(data));
  336. }
  337. void GetInputVoltageL12(byte group)
  338. {
  339. byte data[8];
  340. PwrFrame PwrFrameMsg;
  341. PwrFrameMsg.PwrMessage = 0;
  342. PwrFrameMsg.UUBits.Protocol = 0x01;
  343. PwrFrameMsg.UUBits.MonitorAddress = PSU_MONITOR_DEFAULT;
  344. // module id
  345. if (group == SYSTEM_CMD)
  346. PwrFrameMsg.UUBits.ModuleAddress = PSU_MODULE_BROADCAST;
  347. else
  348. PwrFrameMsg.UUBits.ModuleAddress = group;
  349. memset(data, 0x00, ARRAY_SIZE(data));
  350. // Group
  351. if (group == SYSTEM_CMD)
  352. data[0] = 0x00;
  353. else
  354. data[0] = group + 1;
  355. // Message Type
  356. data[0] = data[0] << 4;
  357. data[0] |= PSU_MSG_CMD_READ_MSG;
  358. // Command Type
  359. data[1] = PSU_R_VIN_L12;
  360. SendCmdToPsu(PwrFrameMsg.PwrMessage, data, sizeof(data));
  361. }
  362. void GetInputVoltageL23(byte group)
  363. {
  364. byte data [8];
  365. PwrFrame PwrFrameMsg;
  366. PwrFrameMsg.PwrMessage = 0;
  367. PwrFrameMsg.UUBits.Protocol = 0x01;
  368. PwrFrameMsg.UUBits.MonitorAddress = PSU_MONITOR_DEFAULT;
  369. // module id
  370. if (group == SYSTEM_CMD)
  371. PwrFrameMsg.UUBits.ModuleAddress = PSU_MODULE_BROADCAST;
  372. else
  373. PwrFrameMsg.UUBits.ModuleAddress = group;
  374. memset ( data, 0x00, ARRAY_SIZE( data ) );
  375. // Group
  376. if (group == SYSTEM_CMD)
  377. data [0] = 0x00;
  378. else
  379. data [0] = group + 1;
  380. // Message Type
  381. data [0] = data [0] << 4;
  382. data [0] |= PSU_MSG_CMD_READ_MSG;
  383. // Command Type
  384. data [1] = PSU_R_VIN_L23;
  385. SendCmdToPsu ( PwrFrameMsg.PwrMessage, data, sizeof(data) );
  386. }
  387. void GetInputVoltageL31(byte group)
  388. {
  389. byte data [8];
  390. PwrFrame PwrFrameMsg;
  391. PwrFrameMsg.PwrMessage = 0;
  392. PwrFrameMsg.UUBits.Protocol = 0x01;
  393. PwrFrameMsg.UUBits.MonitorAddress = PSU_MONITOR_DEFAULT;
  394. // module id
  395. if (group == SYSTEM_CMD)
  396. PwrFrameMsg.UUBits.ModuleAddress = PSU_MODULE_BROADCAST;
  397. else
  398. PwrFrameMsg.UUBits.ModuleAddress = group;
  399. memset ( data, 0x00, ARRAY_SIZE( data ) );
  400. // Group
  401. if (group == SYSTEM_CMD)
  402. data [0] = 0x00;
  403. else
  404. data [0] = group + 1;
  405. // Message Type
  406. data [0] = data [0] << 4;
  407. data [0] |= PSU_MSG_CMD_READ_MSG;
  408. // Command Type
  409. data [1] = PSU_R_VIN_L31;
  410. SendCmdToPsu ( PwrFrameMsg.PwrMessage, data, sizeof(data) );
  411. }
  412. void GetDc2DcVersion(byte group)
  413. {
  414. byte data[8];
  415. PwrFrame PwrFrameMsg;
  416. PwrFrameMsg.PwrMessage = 0;
  417. PwrFrameMsg.UUBits.Protocol = 0x01;
  418. PwrFrameMsg.UUBits.MonitorAddress = PSU_MONITOR_DEFAULT;
  419. // module id
  420. //if (group == SYSTEM_CMD)
  421. PwrFrameMsg.UUBits.ModuleAddress = PSU_MODULE_BROADCAST;
  422. //else
  423. // PwrFrameMsg.UUBits.ModuleAddress = group;
  424. memset(data, 0x00, ARRAY_SIZE(data));
  425. // Group
  426. if (group == SYSTEM_CMD)
  427. data[0] = 0x00;
  428. else
  429. data[0] = group + 1;
  430. // Message Type
  431. data[0] = data[0] << 4;
  432. data[0] |= PSU_MSG_CMD_READ_MSG;
  433. // Command Type
  434. data[1] = PSU_R_DD_VERSION;
  435. SendCmdToPsu(PwrFrameMsg.PwrMessage, data, sizeof(data));
  436. }
  437. void GetPfcVersion(byte group)
  438. {
  439. byte data[8];
  440. PwrFrame PwrFrameMsg;
  441. PwrFrameMsg.PwrMessage = 0;
  442. PwrFrameMsg.UUBits.Protocol = 0x01;
  443. PwrFrameMsg.UUBits.MonitorAddress = PSU_MONITOR_DEFAULT;
  444. // module id
  445. //if (group == SYSTEM_CMD)
  446. PwrFrameMsg.UUBits.ModuleAddress = PSU_MODULE_BROADCAST;
  447. //else
  448. // PwrFrameMsg.UUBits.ModuleAddress = group;
  449. memset(data, 0x00, ARRAY_SIZE(data));
  450. // Group
  451. if (group == SYSTEM_CMD)
  452. data[0] = 0x00;
  453. else
  454. data[0] = group + 1;
  455. // Message Type
  456. data[0] = data[0] << 4;
  457. data[0] |= PSU_MSG_CMD_READ_MSG;
  458. // Command Type
  459. data[1] = PSU_R_PFC_VERSION;
  460. SendCmdToPsu(PwrFrameMsg.PwrMessage, data, sizeof(data));
  461. }
  462. //================================================
  463. // Receive data from CANBUS Function
  464. //================================================
  465. void SendCallback()
  466. {
  467. int _passTime = UU_GetTimeoutValue ( & ShmTimelineData._getCount_time );
  468. if (_passTime < 0)
  469. UU_GetTimespecFunc(&ShmTimelineData._getCount_time);
  470. else if (ShmTimelineData._getCountChk && _passTime > 200)
  471. {
  472. ShmUuPowerData.totalPsuCount = 0;
  473. for (byte i = 0; i < 2; i ++)
  474. {
  475. if (ShmUuPowerData.uu_pow_info [i].psuCount > 0)
  476. {
  477. return_module_count ( i, ShmUuPowerData.uu_pow_info [i].psuCount );
  478. ShmUuPowerData.totalPsuCount += ShmUuPowerData.uu_pow_info [i].psuCount;
  479. }
  480. }
  481. return_module_count (SYSTEM_CMD, ShmUuPowerData.totalPsuCount);
  482. ShmTimelineData._getCountChk = LIB_STOP;
  483. ShmUuPowerData._getCountIndexComp = LIB_START;
  484. }
  485. }
  486. void ReceiveDataFromCanBus()
  487. {
  488. int nbytes;
  489. struct can_frame frame;
  490. PwrFrame *PwrFrameMsg;
  491. byte group;
  492. memset(&ShmUuPowerData, 0, sizeof(struct UuPowerInformation));
  493. memset(&ShmTimelineData, 0, sizeof(struct TimelineInfor));
  494. while(1)
  495. {
  496. SendCallback();
  497. memset(&frame, 0, sizeof(struct can_frame));
  498. nbytes = read(CanFd, &frame, sizeof(struct can_frame));
  499. if (nbytes > 0)
  500. {
  501. PwrFrameMsg = (PwrFrame *)&frame.can_id;
  502. //byte protocol = PwrFrameMsg->UUBits.Protocol;
  503. byte moduleAddr = PwrFrameMsg->UUBits.ModuleAddress;
  504. //byte monitorAddr = PwrFrameMsg->UUBits.MonitorAddress;
  505. // Group 從0開始~ 但 UU 從 1 開始~
  506. group = ((frame.data[0] & 0xF0) >> 4) - 1;
  507. //printf("group = %d \n", group);
  508. //printf("moduleAddr = %d \n", moduleAddr);
  509. //printf("monitorAddr = %d \n", monitorAddr);
  510. // 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",
  511. // frame.data[0], frame.data[1], frame.data[2], frame.data[3],
  512. // frame.data[4], frame.data[5], frame.data[6], frame.data[7]);
  513. switch (frame.data[1])
  514. {
  515. case PSU_R_MODULE_COUNT:
  516. {
  517. //printf("----------PSU_R_GET_COUNT---------- \n");
  518. bool isFind = false;
  519. for (byte i = 0; i < ShmUuPowerData.uu_pow_info[group].psuCount; i++)
  520. {
  521. if (ShmUuPowerData.uu_pow_info[group].psuInfo[i].targetNumber == moduleAddr)
  522. isFind = true;
  523. }
  524. if (!isFind)
  525. {
  526. ShmUuPowerData.uu_pow_info[group].psuInfo[ShmUuPowerData.uu_pow_info[group].psuCount].targetNumber = moduleAddr;
  527. ShmUuPowerData.uu_pow_info[group].psuCount++;
  528. }
  529. if (ShmTimelineData._getCountChk == LIB_STOP)
  530. {
  531. ShmTimelineData._getCountChk = LIB_START;
  532. UU_GetTimespecFunc(&ShmTimelineData._getCount_time);
  533. }
  534. }
  535. break;
  536. }
  537. if (ShmUuPowerData._getCountIndexComp)
  538. {
  539. switch (frame.data[1])
  540. {
  541. case PSU_R_FAST_OUTPUT_VOL:
  542. {
  543. //printf("----------PSU_R_FAST_OUTPUT_VOL---------- \n");
  544. float _vol = 0, _cur = 0;
  545. for(byte count = 0; count < ShmUuPowerData.uu_pow_info[group].psuCount; count++)
  546. {
  547. if (ShmUuPowerData.uu_pow_info[group].psuInfo[count].targetNumber == moduleAddr)
  548. {
  549. ShmUuPowerData.uu_pow_info[group].psuInfo[count].outputVol =
  550. ((frame.data[4] << 24 | frame.data[5] << 16 | frame.data[6] << 8 | frame.data[7])) / 100;
  551. }
  552. if (ShmUuPowerData.uu_pow_info[group].psuInfo[count].outputVol > 0)
  553. {
  554. if (_vol == 0 || ShmUuPowerData.uu_pow_info[group].psuInfo[count].outputVol < _vol)
  555. _vol = ShmUuPowerData.uu_pow_info[group].psuInfo[count].outputVol;
  556. }
  557. _cur += ShmUuPowerData.uu_pow_info[group].psuInfo[count].outputCur;
  558. }
  559. ShmUuPowerData.uu_pow_info[group].presentVol = _vol;
  560. ShmUuPowerData.uu_pow_info[group].presentCur = _cur;
  561. return_get_output_float(group,
  562. ShmUuPowerData.uu_pow_info [group].presentVol,
  563. ShmUuPowerData.uu_pow_info [group].presentCur,
  564. PSU_PROTOCOL_TYPE );
  565. }
  566. break;
  567. case PSU_R_FAST_OUTPUT_CUR:
  568. {
  569. //printf("----------PSU_R_OUTPUT_CUR---------- \n");
  570. for(byte count = 0; count < ShmUuPowerData.uu_pow_info[group].psuCount; count++)
  571. {
  572. if (ShmUuPowerData.uu_pow_info[group].psuInfo[count].targetNumber == moduleAddr)
  573. {
  574. ShmUuPowerData.uu_pow_info[group].psuInfo[count].outputCur =
  575. ((frame.data[4] << 24 | frame.data[5] << 16 | frame.data[6] << 8 | frame.data[7])) / 100;
  576. break;
  577. }
  578. }
  579. //
  580. // ShmUuPowerData.uu_pow_info[group].presentCur = ((frame.data[4] << 24 | frame.data[5] << 16 | frame.data[6] << 8 | frame.data[7])) / 100;
  581. // return_get_output_float(group,
  582. // ShmUuPowerData.uu_pow_info[group].presentVol,
  583. // ShmUuPowerData.uu_pow_info[group].presentCur,
  584. // PSU_PROTOCOL_TYPE);
  585. }
  586. break;
  587. case PSU_R_DD_VERSION:
  588. {
  589. //printf("----------PSU_R_DD_VERSION---------- \n");
  590. for(byte count = 0; count < ShmUuPowerData.uu_pow_info[group].psuCount; count++)
  591. {
  592. if (ShmUuPowerData.uu_pow_info[group].psuInfo[count].targetNumber == moduleAddr)
  593. {
  594. ShmUuPowerData.uu_pow_info[group].psuInfo[count].dc2dcVersion =
  595. ((frame.data[6] << 8) + frame.data[7]);
  596. byte psuIndexAddr = moduleAddr;
  597. if (group > 0)
  598. {
  599. psuIndexAddr = moduleAddr + ShmUuPowerData.uu_pow_info[group - 1].psuCount;
  600. }
  601. return_fw_version(psuIndexAddr,
  602. ShmUuPowerData.uu_pow_info[group].psuInfo[count].dc2dcVersion,
  603. ShmUuPowerData.uu_pow_info[group].psuInfo[count].pfcVersion,
  604. LIB_UU_HW_VERSIION,
  605. PSU_PROTOCOL_TYPE);
  606. break;
  607. }
  608. }
  609. }
  610. break;
  611. case PSU_R_PFC_VERSION:
  612. {
  613. //printf("----------PSU_R_PFC_VERSION---------- \n");
  614. for(byte count = 0; count < ShmUuPowerData.uu_pow_info[group].psuCount; count++)
  615. {
  616. if (ShmUuPowerData.uu_pow_info[group].psuInfo[count].targetNumber == moduleAddr)
  617. {
  618. ShmUuPowerData.uu_pow_info[group].psuInfo[count].pfcVersion =
  619. ((frame.data[6] << 8) + frame.data[7]);
  620. byte psuIndexAddr = moduleAddr;
  621. if (group > 0)
  622. {
  623. psuIndexAddr = moduleAddr + ShmUuPowerData.uu_pow_info[group - 1].psuCount;
  624. }
  625. return_fw_version(psuIndexAddr,
  626. ShmUuPowerData.uu_pow_info[group].psuInfo[count].dc2dcVersion,
  627. ShmUuPowerData.uu_pow_info[group].psuInfo[count].pfcVersion,
  628. LIB_UU_HW_VERSIION,
  629. PSU_PROTOCOL_TYPE);
  630. break;
  631. }
  632. }
  633. }
  634. break;
  635. case PSU_R_IAVAILABLE:
  636. {
  637. //printf("----------PSU_R_IAVAILABLE---------- \n");
  638. // printf("Group = %d, moduleAddr = %d, data[4] = %d, data[5] = %d, data[6] = %d, data[7] = %d \n",
  639. // group, moduleAddr,
  640. // frame.data[4], frame.data[5], frame.data[6], frame.data[7]);
  641. for(byte count = 0; count < ShmUuPowerData.uu_pow_info[group].psuCount; count++)
  642. {
  643. if (ShmUuPowerData.uu_pow_info[group].psuInfo[count].targetNumber == moduleAddr)
  644. {
  645. byte psuIndexAddr = moduleAddr;
  646. if (group > 0)
  647. {
  648. psuIndexAddr = moduleAddr + ShmUuPowerData.uu_pow_info[group - 1].psuCount;
  649. }
  650. return_iavail_info(psuIndexAddr, ((frame.data[6] << 8) + frame.data[7]) / 1, LIB_NO_USE);
  651. break;
  652. }
  653. }
  654. }
  655. break;
  656. case PSU_W_OUTPUT_VOL:
  657. {
  658. printf("----------PSU_W_OUTPUT_VOL_CAP---------- \n");
  659. }
  660. break;
  661. case PSU_W_OUTPUT_CUR:
  662. {
  663. printf("----------PSU_W_OUTPUT_CUR_CAP---------- \n");
  664. }
  665. break;
  666. case PSU_R_SERIAL_NUM:
  667. {
  668. printf("----------PSU_R_SERIAL_NUM---------- \n");
  669. }
  670. break;
  671. case PSU_R_STATUS:
  672. {
  673. //printf("----------PSU_R_STATUS---------- \n");
  674. byte psuIndexAddr = moduleAddr;
  675. if (group > 0)
  676. {
  677. psuIndexAddr = moduleAddr + ShmUuPowerData.uu_pow_info[group - 1].psuCount;
  678. }
  679. return_status(group, psuIndexAddr, LIB_NO_USE, LIB_NO_USE, PSU_PROTOCOL_TYPE,
  680. frame.data[4], frame.data[5], frame.data[6], frame.data[7]);
  681. }
  682. break;
  683. case PSU_R_OUTPUT_POW_CAP:
  684. {
  685. int pow = (frame.data[4] << 24 | frame.data[5] << 16 | frame.data[6] << 8 | frame.data[7]) / 10000;
  686. if ((pow += 5) > 180)
  687. pow = 180;
  688. for(byte count = 0; count < ShmUuPowerData.uu_pow_info[group].psuCount; count++)
  689. {
  690. if (ShmUuPowerData.uu_pow_info[group].psuInfo[count].targetNumber == moduleAddr)
  691. {
  692. ShmUuPowerData.uu_pow_info[group].psuInfo[count].powerCap = pow;
  693. byte psuIndexAddr = moduleAddr;
  694. if (group > 0)
  695. {
  696. psuIndexAddr = moduleAddr + ShmUuPowerData.uu_pow_info[group - 1].psuCount;
  697. }
  698. return_available_cap(psuIndexAddr,
  699. LIB_PSU_MAX_VOL,
  700. LIB_PSU_MIN_VOL,
  701. LIB_PSU_MAX_CUR,
  702. ShmUuPowerData.uu_pow_info[group].psuInfo[count].powerCap);
  703. break;
  704. }
  705. }
  706. }
  707. break;
  708. case PSU_R_OUTPUT_CUR_CAP:
  709. {
  710. // 因為高低壓設定的問題~該指令無法正常指令
  711. int cur = (frame.data[4] << 24 | frame.data[5] << 16 | frame.data[6] << 8 | frame.data[7]) / 1000;
  712. for(byte count = 0; count < ShmUuPowerData.uu_pow_info[group].psuCount; count++)
  713. {
  714. if (ShmUuPowerData.uu_pow_info[group].psuInfo[count].targetNumber == moduleAddr)
  715. {
  716. ShmUuPowerData.uu_pow_info[group].psuInfo[count].currentCap = cur;
  717. break;
  718. }
  719. }
  720. }
  721. break;
  722. case PSU_R_MAX_VOL:
  723. {
  724. // 因為高低壓設定的問題~該指令無法正常指令
  725. int maxVol = ((frame.data[4] << 24 | frame.data[5] << 16 | frame.data[6] << 8 | frame.data[7]) / 100000) * 1000;
  726. for(byte count = 0; count < ShmUuPowerData.uu_pow_info[group].psuCount; count++)
  727. {
  728. if (ShmUuPowerData.uu_pow_info[group].psuInfo[count].targetNumber == moduleAddr)
  729. {
  730. ShmUuPowerData.uu_pow_info[group].psuInfo[count].maxVoltage = maxVol;
  731. break;
  732. }
  733. }
  734. }
  735. break;
  736. case PSU_R_VIN_L12:
  737. {
  738. //printf("----------PSU_R_VIN_L12---------- \n");
  739. for(byte count = 0; count < ShmUuPowerData.uu_pow_info[group].psuCount; count++)
  740. {
  741. if (ShmUuPowerData.uu_pow_info[group].psuInfo[count].targetNumber == moduleAddr)
  742. {
  743. ShmUuPowerData.uu_pow_info[group].psuInfo[count].inputVolL12 =
  744. ((frame.data[4] << 24 | frame.data[5] << 16 | frame.data[6] << 8 | frame.data[7])) / 1000;
  745. break;
  746. }
  747. }
  748. }
  749. break;
  750. case PSU_R_VIN_L23:
  751. {
  752. //printf("----------PSU_R_VIN_L23---------- \n");
  753. for(byte count = 0; count < ShmUuPowerData.uu_pow_info[group].psuCount; count++)
  754. {
  755. if (ShmUuPowerData.uu_pow_info[group].psuInfo[count].targetNumber == moduleAddr)
  756. {
  757. ShmUuPowerData.uu_pow_info[group].psuInfo[count].inputVolL23 =
  758. ((frame.data[4] << 24 | frame.data[5] << 16 | frame.data[6] << 8 | frame.data[7])) / 1000;
  759. break;
  760. }
  761. }
  762. }
  763. break;
  764. case PSU_R_VIN_L31:
  765. {
  766. //printf("----------PSU_R_VIN_L31---------- \n");
  767. for(byte count = 0; count < ShmUuPowerData.uu_pow_info[group].psuCount; count++)
  768. {
  769. if (ShmUuPowerData.uu_pow_info[group].psuInfo[count].targetNumber == moduleAddr)
  770. {
  771. ShmUuPowerData.uu_pow_info[group].psuInfo[count].inputVolL31 =
  772. ((frame.data[4] << 24 | frame.data[5] << 16 | frame.data[6] << 8 | frame.data[7])) / 1000;
  773. byte psuIndexAddr = moduleAddr;
  774. if (group > 0)
  775. {
  776. psuIndexAddr = moduleAddr + ShmUuPowerData.uu_pow_info[group - 1].psuCount;
  777. }
  778. return_input_vol(psuIndexAddr,
  779. ShmUuPowerData.uu_pow_info[group].psuInfo[count].inputVolL12,
  780. ShmUuPowerData.uu_pow_info[group].psuInfo[count].inputVolL23,
  781. ShmUuPowerData.uu_pow_info[group].psuInfo[count].inputVolL31);
  782. break;
  783. }
  784. }
  785. }
  786. break;
  787. case PSU_R_IN_TEMP:
  788. {
  789. byte psuIndexAddr = moduleAddr;
  790. unsigned char ReturnValue = ((frame.data[4] << 24 | frame.data[5] << 16 | frame.data[6] << 8 | frame.data[7])) / 1000;
  791. if (group > 0)
  792. {
  793. psuIndexAddr = moduleAddr + ShmUuPowerData.uu_pow_info[group - 1].psuCount;
  794. }
  795. // Env Temp
  796. return_output_temp(psuIndexAddr, LIB_NO_USE, LIB_NO_USE, LIB_NO_USE, ReturnValue, PSU_PROTOCOL_TYPE);
  797. }
  798. break;
  799. case PSU_R_PFC_TEMP:
  800. case PSU_R_DD2_TEMP:
  801. case PSU_R_DD3_TEMP:
  802. {
  803. byte psuIndexAddr = moduleAddr;
  804. float ReturnValue = ((frame.data[4] << 24 | frame.data[5] << 16 | frame.data[6] << 8 | frame.data[7])) / 1000;
  805. if (group > 0)
  806. {
  807. psuIndexAddr = moduleAddr + ShmUuPowerData.uu_pow_info[group - 1].psuCount;
  808. }
  809. // DD Temp
  810. return_mis_info(psuIndexAddr, ReturnValue, 2);
  811. //printf("temp = %02d \n", ((frame.data[4] << 24 | frame.data[5] << 16 | frame.data[6] << 8 | frame.data[7])) / 1000);
  812. }
  813. break;
  814. case PSU_RW_GROUP:
  815. {
  816. printf("PSU_RW_GROUP : address = %d, group = %d \n", moduleAddr, group);
  817. }
  818. break;
  819. case PSU_W_HIGH_LOW_VOL_MODE:
  820. {
  821. //printf("----------PSU_W_HIGH_LOW_VOL_MODE---------- \n");
  822. }
  823. break;
  824. case PSU_R_HIGH_LOW_VOL_MODE:
  825. {
  826. //printf("----------PSU_R_HIGH_LOW_VOL_MODE---------- \n");
  827. printf("PSU_R_HIGH_LOW_VOL_MODE : G : %d, value : %d \n", group, frame.data[7]);
  828. }
  829. break;
  830. }
  831. }
  832. }
  833. else
  834. usleep(10000);
  835. }
  836. }
  837. //================================================
  838. // Public Function
  839. //================================================
  840. bool InitialCommunication()
  841. {
  842. CanFd = InitCanBus();
  843. if(CanFd < 0)
  844. {
  845. printf("Init can bus fail.... \n");
  846. return false;
  847. }
  848. recFork = fork();
  849. if(recFork == 0)
  850. {
  851. ReceiveDataFromCanBus();
  852. }
  853. // callbackFunc = fork();
  854. // if (callbackFunc == 0)
  855. // {
  856. // SendCallback();
  857. // }
  858. return true;
  859. }
  860. /*
  861. * Data :
  862. * byte 0 =>
  863. 0 ~ 3 bit : MessageType
  864. 4 ~ 7 bit : Group Address (1 ~ 15)
  865. * byte 1 =>
  866. Command Type
  867. * byte 2、3 =>
  868. Reserved
  869. * byte 4 ~ 7 =>
  870. Command Data
  871. */
  872. /**********************************************************************************/
  873. /*** ***/
  874. /*** Get ***/
  875. /*** ***/
  876. /**********************************************************************************/
  877. void GetGroup(byte address)
  878. {
  879. byte data[8];
  880. PwrFrame PwrFrameMsg;
  881. PwrFrameMsg.PwrMessage = 0;
  882. PwrFrameMsg.UUBits.Protocol = 0x01;
  883. PwrFrameMsg.UUBits.MonitorAddress = PSU_MONITOR_DEFAULT;
  884. // module id
  885. PwrFrameMsg.UUBits.ModuleAddress = 0x04;
  886. memset(data, 0x00, ARRAY_SIZE(data));
  887. // Group
  888. data[0] = 0x01;
  889. // Message Type
  890. data[0] = data[0] << 4;
  891. data[0] |= PSU_MSG_CMD_READ_MSG;
  892. // Command Type
  893. data[1] = PSU_RW_GROUP;
  894. // Reserved
  895. data[2] = 0x00;
  896. data[3] = 0x00;
  897. // Command Data
  898. data[4] = 0x00;
  899. data[5] = 0x00;
  900. data[6] = 0x00;
  901. data[7] = 0x00;
  902. SendCmdToPsu(PwrFrameMsg.PwrMessage, data, sizeof(data));
  903. }
  904. void GetStatus(byte group, byte param)
  905. {
  906. if (param == LIB_NO_USE)
  907. return;
  908. byte data[8];
  909. PwrFrame PwrFrameMsg;
  910. PwrFrameMsg.PwrMessage = 0;
  911. PwrFrameMsg.UUBits.Protocol = 0x01;
  912. PwrFrameMsg.UUBits.MonitorAddress = PSU_MONITOR_DEFAULT;
  913. // module id - 不管哪一群~ 都是對該群做群發動做
  914. PwrFrameMsg.UUBits.ModuleAddress = PSU_MODULE_BROADCAST;
  915. memset(data, 0x00, ARRAY_SIZE(data));
  916. // Group
  917. if (group == SYSTEM_CMD)
  918. data[0] = 0x00;
  919. else
  920. data[0] = group + 1;
  921. // Message Type
  922. data[0] = data[0] << 4;
  923. data[0] |= PSU_MSG_CMD_READ_MSG;
  924. // Command Type
  925. data[1] = PSU_R_STATUS;
  926. SendCmdToPsu(PwrFrameMsg.PwrMessage, data, sizeof(data));
  927. }
  928. void GetModuleVoltageMode(byte group)
  929. {
  930. byte data[8];
  931. PwrFrame PwrFrameMsg;
  932. PwrFrameMsg.PwrMessage = 0;
  933. PwrFrameMsg.UUBits.Protocol = 0x01;
  934. PwrFrameMsg.UUBits.MonitorAddress = PSU_MONITOR_DEFAULT;
  935. // module id - 群發
  936. if (group == SYSTEM_CMD)
  937. PwrFrameMsg.UUBits.ModuleAddress = PSU_MODULE_BROADCAST;
  938. else
  939. PwrFrameMsg.UUBits.ModuleAddress = group;
  940. memset(data, 0x00, ARRAY_SIZE(data));
  941. // Group
  942. if (group == SYSTEM_CMD)
  943. data[0] = 0x00;
  944. else
  945. data[0] = group + 1;
  946. // Message Type
  947. data[0] = data[0] << 4;
  948. data[0] |= PSU_MSG_CMD_READ_MSG;
  949. // Command Type
  950. data[1] = PSU_R_HIGH_LOW_VOL_MODE;
  951. SendCmdToPsu(PwrFrameMsg.PwrMessage, data, sizeof(data));
  952. }
  953. /**********************************************************************************/
  954. /*** ***/
  955. /*** Set ***/
  956. /*** ***/
  957. /**********************************************************************************/
  958. void SetGroup(byte group, byte sourceAddr, byte targetAddr)
  959. {
  960. byte data[8];
  961. PwrFrame PwrFrameMsg;
  962. PwrFrameMsg.PwrMessage = 0;
  963. PwrFrameMsg.UUBits.Protocol = 0x01;
  964. PwrFrameMsg.UUBits.MonitorAddress = PSU_MONITOR_DEFAULT;
  965. // module id
  966. PwrFrameMsg.UUBits.ModuleAddress = sourceAddr;
  967. memset(data, 0x00, ARRAY_SIZE(data));
  968. // Group
  969. data[0] = group + 1;
  970. // Message Type
  971. data[0] = data[0] << 4;
  972. data[0] |= PSU_MSG_CMD_SET_PARAM;
  973. // Command Type
  974. data[1] = PSU_RW_GROUP;
  975. // Reserved
  976. data[2] = 0x00;
  977. data[3] = 0x00;
  978. // Command Data
  979. data[7] = targetAddr;
  980. SendCmdToPsu(PwrFrameMsg.PwrMessage, data, sizeof(data));
  981. }
  982. void SetModuleVoltageMode(byte group, byte value)
  983. {
  984. byte data[8];
  985. PwrFrame PwrFrameMsg;
  986. PwrFrameMsg.PwrMessage = 0;
  987. PwrFrameMsg.UUBits.Protocol = 0x01;
  988. PwrFrameMsg.UUBits.MonitorAddress = PSU_MONITOR_DEFAULT;
  989. // module id
  990. if (group == SYSTEM_CMD)
  991. PwrFrameMsg.UUBits.ModuleAddress = PSU_MODULE_BROADCAST;
  992. else
  993. PwrFrameMsg.UUBits.ModuleAddress = group;
  994. memset(data, 0x00, ARRAY_SIZE(data));
  995. // Group
  996. if (group == SYSTEM_CMD)
  997. data[0] = 0x00;
  998. else
  999. data[0] = group + 1;
  1000. // Message Type
  1001. data[0] = data[0] << 4;
  1002. data[0] |= PSU_MSG_CMD_SET_PARAM;
  1003. // Command Type
  1004. data[1] = PSU_W_HIGH_LOW_VOL_MODE;
  1005. // Command Data
  1006. data[4] = 0x00;
  1007. data[5] = 0x00;
  1008. data[6] = 0x00;
  1009. data[7] = value;
  1010. SendCmdToPsu(PwrFrameMsg.PwrMessage, data, sizeof(data));
  1011. }
  1012. /**********************************************************************************/
  1013. /*** ***/
  1014. /*** sdlu ***/
  1015. /*** ***/
  1016. /**********************************************************************************/
  1017. void SwitchPower(byte group, byte value)
  1018. {
  1019. byte data[8];
  1020. PwrFrame PwrFrameMsg;
  1021. PwrFrameMsg.PwrMessage = 0;
  1022. PwrFrameMsg.UUBits.Protocol = 0x01;
  1023. PwrFrameMsg.UUBits.MonitorAddress = PSU_MONITOR_DEFAULT;
  1024. // module id
  1025. if (group == SYSTEM_CMD)
  1026. PwrFrameMsg.UUBits.ModuleAddress = PSU_MODULE_BROADCAST;
  1027. else
  1028. PwrFrameMsg.UUBits.ModuleAddress = group;
  1029. memset(data, 0x00, ARRAY_SIZE(data));
  1030. // 1 : 關機
  1031. // 0 : 開機
  1032. // Group
  1033. if (group == SYSTEM_CMD)
  1034. data[0] = 0x00;
  1035. else
  1036. data[0] = group + 1;
  1037. // Message Type
  1038. data[0] = data[0] << 4;
  1039. data[0] |= PSU_MSG_CMD_SET_PARAM;
  1040. // Command Type
  1041. data[1] = PSU_W_SWITCH_POW;
  1042. // Command Data
  1043. data[4] = 0x00;
  1044. data[5] = 0x00;
  1045. data[6] = 0x00;
  1046. data[7] = value;
  1047. SendCmdToPsu(PwrFrameMsg.PwrMessage, data, sizeof(data));
  1048. }
  1049. void GetModuleCount(byte group)
  1050. {
  1051. byte data[8];
  1052. PwrFrame PwrFrameMsg;
  1053. PwrFrameMsg.PwrMessage = 0;
  1054. PwrFrameMsg.UUBits.Protocol = 0x01;
  1055. PwrFrameMsg.UUBits.MonitorAddress = PSU_MONITOR_DEFAULT;
  1056. // module id - 群發
  1057. if (group == SYSTEM_CMD)
  1058. PwrFrameMsg.UUBits.ModuleAddress = PSU_MODULE_BROADCAST;
  1059. else
  1060. {
  1061. PwrFrameMsg.UUBits.ModuleAddress = group;
  1062. }
  1063. memset(data, 0x00, ARRAY_SIZE(data));
  1064. if (group == SYSTEM_CMD)
  1065. {
  1066. // Group
  1067. data[0] = 0x01;
  1068. // Message Type
  1069. data[0] = data[0] << 4;
  1070. data[0] |= PSU_MSG_CMD_READ_MSG;
  1071. // Command Type
  1072. data[1] = PSU_R_MODULE_COUNT;
  1073. SendCmdToPsu(PwrFrameMsg.PwrMessage, data, sizeof(data));
  1074. // Group
  1075. data[0] = 0x02;
  1076. SendCmdToPsu(PwrFrameMsg.PwrMessage, data, sizeof(data));
  1077. }
  1078. else
  1079. {
  1080. // Group
  1081. data[0] = group + 1;
  1082. // Message Type
  1083. data[0] = data[0] << 4;
  1084. data[0] |= PSU_MSG_CMD_READ_MSG;
  1085. // Command Type
  1086. data[1] = PSU_R_MODULE_COUNT;
  1087. SendCmdToPsu(PwrFrameMsg.PwrMessage, data, sizeof(data));
  1088. }
  1089. }
  1090. void GetModuleCap(byte group)
  1091. {
  1092. GetOutputPowCap(group);
  1093. //GetOutputCurCap(group);
  1094. //GetPsuMaxVoltage(group);
  1095. }
  1096. void GetModuleIavailable(byte group)
  1097. {
  1098. byte data[8];
  1099. PwrFrame PwrFrameMsg;
  1100. PwrFrameMsg.PwrMessage = 0;
  1101. PwrFrameMsg.UUBits.Protocol = 0x01;
  1102. PwrFrameMsg.UUBits.MonitorAddress = PSU_MONITOR_DEFAULT;
  1103. // module id
  1104. //if (group == SYSTEM_CMD)
  1105. PwrFrameMsg.UUBits.ModuleAddress = PSU_MODULE_BROADCAST;
  1106. //else
  1107. // PwrFrameMsg.UUBits.ModuleAddress = group;
  1108. memset(data, 0x00, ARRAY_SIZE(data));
  1109. // Group
  1110. if (group == SYSTEM_CMD)
  1111. data[0] = 0x00;
  1112. else
  1113. data[0] = group + 1;
  1114. // Message Type
  1115. data[0] = data[0] << 4;
  1116. data[0] |= PSU_MSG_CMD_READ_MSG;
  1117. // Command Type
  1118. data[1] = PSU_R_IAVAILABLE;
  1119. SendCmdToPsu(PwrFrameMsg.PwrMessage, data, sizeof(data));
  1120. }
  1121. void GetModuleOutputF(byte group)
  1122. {
  1123. GetFastOutputVol(group);
  1124. GetFastOutputCur(group);
  1125. }
  1126. void GetDcTemperature(byte group)
  1127. {
  1128. GetTemperature(group, UU_MODULE_TEMP_ENV);
  1129. GetTemperature(group, UU_MODULE_TEMP_DD);
  1130. GetInputVoltageL12(group);
  1131. GetInputVoltageL23(group);
  1132. GetInputVoltageL31(group);
  1133. }
  1134. void PresentOutputVol(byte group, int voltage, int current, byte psuCount)
  1135. {
  1136. voltage *= 100;
  1137. SetOutputVoltage ( group, voltage );
  1138. current *= 100;
  1139. if (psuCount > 0)
  1140. current /= psuCount;
  1141. else
  1142. current = LIB_PSU_MIN_CUR;
  1143. SetOutputCurrent ( group, current );
  1144. if (current == 0 && voltage == 0)
  1145. SwitchPower(group, PSU_POWER_OFF);
  1146. }
  1147. void GetModuleVer(byte group)
  1148. {
  1149. GetDc2DcVersion(group);
  1150. GetPfcVersion(group);
  1151. }
  1152. void SetWalkInConfig(byte group, byte enable, byte sec)
  1153. {
  1154. // 這階段可以做模塊高低壓設定、初始化一些設定
  1155. ShmUuPowerData._getCountIndexComp = LIB_STOP;
  1156. SetModuleVoltageMode(group, PSU_VOLTAGE_LOW);
  1157. }
  1158. void FlashLed(byte group, byte value)
  1159. {
  1160. // none use
  1161. }
  1162. void SetDirModulePresentOutput(byte group, int voltage, int current, byte _switch, byte _interRelay)
  1163. {
  1164. // none use
  1165. }