Infypwr_PsuCommObj.c 34 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200
  1. /*
  2. * Infypwr_PsuCommObj.c
  3. *
  4. * Created on: 2019年11月26日
  5. * Author: 7564
  6. */
  7. #include "Infypwr_PsuCommObj.h"
  8. #define ARRAY_SIZE(A) (sizeof(A) / sizeof(A[0]))
  9. #define NO 0
  10. #define YES 1
  11. #define MODULE_MAX_VOL 1000
  12. #define DEBUG_LIB 1
  13. #define CHECK_PSU_NUM_COUNT 30
  14. void PRINTF_LIB_FUNC(char *string, ...);
  15. float IEEE_754_to_float(const byte raw[4]);
  16. void IEEE_754_to_bytes(float target, byte *bytes2);
  17. // 設備號 0x09 與 0x0C 似乎是模塊
  18. unsigned int filter[3] = { 0x87570000, 0x8E9B0000, 0x829B0000 };
  19. //================================================
  20. // Private function
  21. //================================================
  22. void PRINTF_LIB_FUNC(char *string, ...)
  23. {
  24. if (DEBUG_LIB)
  25. {
  26. va_list args;
  27. char buffer[4096];
  28. va_start(args, string);
  29. vsnprintf(buffer, sizeof(buffer), string, args);
  30. va_end(args);
  31. printf("%s \n", buffer);
  32. }
  33. }
  34. float IEEE_754_to_float(const byte raw[4])
  35. {
  36. float fValue = 0;
  37. byte *pbyte = (byte *)&fValue;
  38. *(pbyte + 0) = raw[3];
  39. *(pbyte + 1) = raw[2];
  40. *(pbyte + 2) = raw[1];
  41. *(pbyte + 3) = raw[0];
  42. return fValue;
  43. }
  44. void IEEE_754_to_bytes(float target, byte *bytes2)
  45. {
  46. int value2 = 0;
  47. number.f = target;
  48. int index = 31;
  49. value2 |= number.raw.sign << index;
  50. int k;
  51. for (k = 8 - 1; k >= 0; k--)
  52. {
  53. index--;
  54. if ((number.raw.exponent >> k) & 1)
  55. value2 |= 1 << index;
  56. }
  57. for (k = 23 - 1; k >= 0; k--)
  58. {
  59. index--;
  60. if ((number.raw.mantissa >> k) & 1)
  61. value2 |= 1 << index;
  62. }
  63. *(bytes2) = (value2 >> 24) & 0xFF;
  64. *(bytes2 + 1) = (value2 >> 16) & 0xFF;
  65. *(bytes2 + 2) = (value2 >> 8) & 0xFF;
  66. *(bytes2 + 3) = value2 & 0xFF;
  67. }
  68. //================================================
  69. // Callback function
  70. //================================================
  71. void RefreshStatus(void *func)
  72. {
  73. return_status = func;
  74. }
  75. void RefreshModuleCount(void *func)
  76. {
  77. return_module_count = func;
  78. }
  79. void RefreshAvailableCap(void *func)
  80. {
  81. return_available_cap = func;
  82. }
  83. void RefreshFwVersion(void *func)
  84. {
  85. return_fw_version = func;
  86. }
  87. void RefreshInputVol(void *func)
  88. {
  89. return_input_vol = func;
  90. }
  91. void RefreshGetOutput(void *func)
  92. {
  93. return_get_output = func;
  94. }
  95. void RefreshGetOutputF(void *func)
  96. {
  97. return_get_output_float = func;
  98. }
  99. void RefreshMisInfo(void *func)
  100. {
  101. return_mis_info = func;
  102. }
  103. void RefreshIavailable(void *func)
  104. {
  105. return_iavail_info = func;
  106. }
  107. void AutoMode_RefreshOutputAndTemp(void *func)
  108. {
  109. return_output_temp = func;
  110. }
  111. void AutoMode_RefreshModuleStatus(void *func)
  112. {
  113. return_module_status = func;
  114. }
  115. void AutoMode_RefreshModuleInput(void *func)
  116. {
  117. return_module_input = func;
  118. }
  119. //================================================
  120. // CANBUS initialization
  121. //================================================
  122. int InitCanBus()
  123. {
  124. int s0,nbytes;
  125. struct timeval tv;
  126. struct ifreq ifr0;
  127. struct sockaddr_can addr0;
  128. struct can_filter rfilter[2];
  129. system("/sbin/ip link set can1 down");
  130. system("/sbin/ip link set can1 type can bitrate 500000 restart-ms 100");
  131. system("/sbin/ip link set can1 up");
  132. s0 = socket(PF_CAN, SOCK_RAW, CAN_RAW);
  133. tv.tv_sec = 0;
  134. tv.tv_usec = 10000;
  135. if (setsockopt(s0, SOL_SOCKET, SO_RCVTIMEO, (char *)&tv, sizeof(struct timeval)) < 0)
  136. {
  137. #ifdef SystemLogMessage
  138. PRINTF_LIB_FUNC("Set SO_RCVTIMEO NG");
  139. #endif
  140. }
  141. nbytes=40960;
  142. if (setsockopt(s0, SOL_SOCKET, SO_RCVBUF, &nbytes, sizeof(int)) < 0)
  143. {
  144. #ifdef SystemLogMessage
  145. PRINTF_LIB_FUNC("Set SO_RCVBUF NG");
  146. #endif
  147. }
  148. nbytes=40960;
  149. if (setsockopt(s0, SOL_SOCKET, SO_SNDBUF, &nbytes, sizeof(int)) < 0)
  150. {
  151. #ifdef SystemLogMessage
  152. PRINTF_LIB_FUNC("Set SO_SNDBUF NG");
  153. #endif
  154. }
  155. nbytes=40960;
  156. //===================================CAN Filter===================================
  157. //Filter only allowed: Destination CSU 0xF0
  158. rfilter[0].can_id = 0xF000;
  159. rfilter[0].can_mask = 0xF000;
  160. //Filter only allowed: Destination Nexton 0xFF
  161. rfilter[1].can_id = 0xFF00;
  162. rfilter[1].can_mask = 0xFF00;
  163. if (setsockopt(s0, SOL_CAN_RAW, CAN_RAW_FILTER, &rfilter, sizeof(rfilter)) < 0)
  164. {
  165. #ifdef SystemLogMessage
  166. PRINTF_LIB_FUNC("Set SOL_CAN_RAW NG");
  167. #endif
  168. }
  169. strcpy(ifr0.ifr_name, "can1" );
  170. ioctl(s0, SIOCGIFINDEX, &ifr0); /* ifr.ifr_ifindex gets filled with that device's index */
  171. addr0.can_family = AF_CAN;
  172. addr0.can_ifindex = ifr0.ifr_ifindex;
  173. bind(s0, (struct sockaddr *)&addr0, sizeof(addr0));
  174. return s0;
  175. }
  176. //================================================
  177. // Receive Cmd from canbus
  178. //================================================
  179. byte isFilterValue(unsigned int value)
  180. {
  181. byte result = NO;
  182. for(byte i = 0; i < ARRAY_SIZE(filter); i++)
  183. {
  184. if (value == filter[i])
  185. {
  186. result = YES;
  187. break;
  188. }
  189. }
  190. return result;
  191. }
  192. bool GetRealIndexByGroup(byte *_address)
  193. {
  194. for (byte i = 0; i < 2; i++)
  195. {
  196. for (byte j = 0; j < infy_pow_info[i].psuCount; j++)
  197. {
  198. if (infy_pow_info[i].serialNumber[j] == *_address)
  199. {
  200. *_address = infy_pow_info[i].targetNumber[j];
  201. if (i > 0)
  202. *_address += infy_pow_info[0].psuCount;
  203. return true;
  204. }
  205. }
  206. }
  207. return false;
  208. }
  209. void ReceiveDataFromCanBus()
  210. {
  211. int nbytes;
  212. struct can_frame frame;
  213. PwrFrame *PwrFrameMsg;
  214. byte group, address;
  215. byte _totalModuleCount = 0;
  216. byte _totalModuleCountBuf = 0;
  217. byte checkTotalCount = 0;
  218. while(1)
  219. {
  220. memset(&frame, 0, sizeof(struct can_frame));
  221. nbytes = read(CanFd, &frame, sizeof(struct can_frame));
  222. if (nbytes > 0)
  223. {
  224. PwrFrameMsg = (PwrFrame *)&frame.can_id;
  225. address = PwrFrameMsg->InfyBits.SourceAddress;
  226. if(PwrFrameMsg->InfyBits.DestinationAddress != NEXTON_ADD)
  227. {
  228. if(PwrFrameMsg->InfyBits.DestinationAddress != INFY_ADD_CSU || PwrFrameMsg->InfyBits.Error != Infy_MsgErr_Normal)
  229. {
  230. continue;
  231. }
  232. switch (PwrFrameMsg->InfyBits.CmdValue)
  233. {
  234. case PSU_WCmd_ModuleWalkIn:
  235. {
  236. //address = frame.can_id & 0x000000FF;
  237. // printf("walk in response address = %d, [0] = %d, [1] = %d, [2] = %d, [3] = %d, [4] = %d, [5] = %d, [6] = %d, [7] = %d \n"
  238. // , address,
  239. // frame.data[0], frame.data[1],
  240. // frame.data[2], frame.data[3],
  241. // frame.data[4], frame.data[5],
  242. // frame.data[6], frame.data[7]);
  243. }
  244. break;
  245. case PSU_RCmd_ModuleStatus:
  246. {
  247. group = frame.data[2];
  248. byte SN = address;
  249. short temp = frame.data[4];
  250. int status = (frame.data[5] << 16) + (frame.data[6] << 8) + frame.data[7];
  251. return_status(group, SN, temp, status, PSU_PROTOCOL_TYPE, LIB_NO_USE, LIB_NO_USE, LIB_NO_USE, LIB_NO_USE);
  252. //PRINTF_LIB_FUNC("group = %d, address = %d, temp = %d \n", group, address, temp);
  253. }
  254. break;
  255. case PSU_RCmd_SysModuleCount:
  256. {
  257. // 回傳模組數量
  258. group = address;
  259. byte count = frame.data[2];
  260. if (group == SYSTEM_CMD && _totalModuleCount == 0 && count != 0)
  261. {
  262. if (_totalModuleCountBuf != count)
  263. {
  264. checkTotalCount = 0;
  265. _totalModuleCountBuf = count;
  266. }
  267. else
  268. {
  269. if (checkTotalCount >= CHECK_PSU_NUM_COUNT)
  270. {
  271. printf("***** Total Count = %d ***** \n", count);
  272. _totalModuleCount = count;
  273. }
  274. else
  275. checkTotalCount++;
  276. }
  277. }
  278. if (group == SYSTEM_CMD)
  279. return_module_count(group, _totalModuleCount);
  280. else
  281. return_module_count(group, count);
  282. }
  283. break;
  284. case PSU_RCmd_ModuleCapability:
  285. {
  286. // 回傳輸出能力 : 最大電壓,最小電壓,最大電流,額定功率
  287. short maxVol = ((frame.data[0] << 8) + frame.data[1]) * 10;
  288. short minVol = ((frame.data[2] << 8) + frame.data[3]) * 10;
  289. short maxCur = (frame.data[4] << 8) + frame.data[5];
  290. short totalPow = ((frame.data[6] << 8) + frame.data[7]) / 10;
  291. if (maxCur > MODULE_MAX_VOL)
  292. maxCur = MODULE_MAX_VOL;
  293. return_available_cap(address, maxVol, minVol, maxCur, totalPow);
  294. if (_totalModuleCount != 0)
  295. _totalModuleCount = 0;
  296. // printf("address = %d, maxVol = %d, minVol = %d, maxCur = %d, totalPow = %d \n",
  297. // address, maxVol, minVol, maxCur, totalPow);
  298. }
  299. break;
  300. case PSU_RCmd_SysOutputVolCur:
  301. {
  302. // 回傳當前輸出電壓電流
  303. int outputVol = ((frame.data[0] << 24) + (frame.data[1] << 16) + (frame.data[2] << 8) + frame.data[3]) / 100;
  304. int outputCur = ((frame.data[4] << 24) + (frame.data[5] << 16) + (frame.data[6] << 8) + frame.data[7]) / 100;
  305. return_get_output(address, outputVol, outputCur);
  306. //PRINTF_LIB_FUNC("address = %d, outputVol = %d, outputCur = %d \n", address, outputVol, outputCur);
  307. }
  308. break;
  309. case PSU_RCmd_SysOutputVolCur_F:
  310. {
  311. group = address;
  312. byte vol[4], cur[4];
  313. memcpy(vol, frame.data, 4);
  314. memcpy(cur, frame.data + 4, 4);
  315. float _Vol = IEEE_754_to_float(vol);
  316. float _Cur = IEEE_754_to_float(cur);
  317. return_get_output_float(group, _Vol, _Cur, PSU_PROTOCOL_TYPE);
  318. }
  319. break;
  320. case PSU_RCmd_ModuleIAvailable:
  321. {
  322. // 回傳降載後的電流
  323. address = frame.can_id & 0x000000FF;
  324. unsigned short vextVol = ((frame.data[0] << 8) + frame.data[1]);
  325. unsigned short iAvailCur = ((frame.data[2] << 8) + frame.data[3]);
  326. return_iavail_info(address, iAvailCur, vextVol);
  327. //PRINTF_LIB_FUNC("address = %d, iAvailCur = %d \n", address, iAvailCur);
  328. }
  329. break;
  330. case PSU_RCmd_ModuleMiscInfo:
  331. {
  332. address = frame.can_id & 0x000000FF;
  333. float ReturnValue;
  334. byte value[4];
  335. byte type;
  336. memcpy(value, frame.data + 4, sizeof(value));
  337. ReturnValue = IEEE_754_to_float(value);
  338. if (frame.data[0] == ((FAN_SPEED_CMD >> 8) & 0xFF) && frame.data[1] == (FAN_SPEED_CMD & 0xFF))
  339. {
  340. type = 1;
  341. return_mis_info(address, ReturnValue, type);
  342. }
  343. else if (frame.data[0] == ((TEMP_DC_CMD >> 8) & 0xFF) && frame.data[1] == (TEMP_DC_CMD & 0xFF))
  344. {
  345. type = 2;
  346. return_mis_info(address, ReturnValue, type);
  347. }
  348. else if (frame.data[0] == ((TEMP_DC_CMD >> 8) & 0xFF) && frame.data[1] == (TEMP_DC_CMD & 0xFF))
  349. {
  350. type = 3;
  351. return_mis_info(address, ReturnValue, type);
  352. }
  353. }
  354. break;
  355. case PSU_RCmd_ModuleVersion:
  356. {
  357. // 回傳版號 : 無系統回覆功能
  358. address = frame.can_id & 0x000000FF;
  359. short dcSwVer = ((frame.data[0] << 8) + frame.data[1]);
  360. short pfcSwVer = ((frame.data[2] << 8) + frame.data[3]);
  361. short hwVer = ((frame.data[4] << 8) + frame.data[5]);
  362. return_fw_version(address, dcSwVer, pfcSwVer, hwVer, PSU_PROTOCOL_TYPE);
  363. //PRINTF_LIB_FUNC("address = %d, DC %d, PFC %d, HW %d \n", address, dcSwVer, pfcSwVer, hwVer);
  364. }
  365. break;
  366. case PSU_RCmd_ModuleBarcode:
  367. {
  368. // 回傳BarCode
  369. }
  370. break;
  371. case PSU_RCmd_ModuleInputVoltage:
  372. {
  373. // 回傳三向輸入電壓
  374. address = frame.can_id & 0x000000FF;
  375. short abVol = ((frame.data[0] << 8) + frame.data[1]) / 10;
  376. short bcVol = ((frame.data[2] << 8) + frame.data[3]) / 10;
  377. short caVol = ((frame.data[4] << 8) + frame.data[5]) / 10;
  378. return_input_vol(address, abVol, bcVol, caVol);
  379. //PRINTF_LIB_FUNC("address = %d, abVol = %d, bcVol = %d, caVol = %d \n", address, abVol, bcVol, caVol);
  380. }
  381. break;
  382. case PSU_RCmd_ModuleOutputVolCur_F:
  383. {
  384. byte vol[4], cur[4];
  385. memcpy(vol, frame.data, 4);
  386. memcpy(cur, frame.data + 4, 4);
  387. float _Vol = IEEE_754_to_float(vol);
  388. float _Cur = IEEE_754_to_float(cur);
  389. return_get_output(address, _Vol, _Cur);
  390. }
  391. break;
  392. default:
  393. break;
  394. }
  395. }
  396. else
  397. {
  398. switch(PwrFrameMsg->NextonBits.CmdValue)
  399. {
  400. case Nexton_PSU_DcOutputValue:
  401. {
  402. /*Test mode used*/
  403. // 回傳輸出值與入風口溫度
  404. address = frame.can_id & 0x000000FF;
  405. short outputVol = ((frame.data[0] << 8) + frame.data[1]);
  406. short outputCur = ((frame.data[2] << 8) + frame.data[3]);
  407. short outputPow = ((frame.data[4] << 8) + frame.data[5]);
  408. byte temp = frame.data[6];
  409. return_output_temp(address, outputVol, outputCur, outputPow, temp, PSU_PROTOCOL_TYPE);
  410. //printf("address = %d, outputVol = %d \n", address, outputVol);
  411. }
  412. break;
  413. case Nexton_PSU_StatusEvent:
  414. {
  415. /*Test mode used*/
  416. // 回傳輸出值與入風口溫度
  417. address = frame.can_id & 0x000000FF;
  418. byte isErr = (frame.data[0] >> 0) & 0x01;
  419. byte status = (frame.data[0] >> 1) & 0x01;
  420. byte err1 = frame.data[2];
  421. byte err2 = frame.data[3];
  422. byte err3 = frame.data[4];
  423. byte err4 = frame.data[5];
  424. return_module_status(address, isErr, status, err1, err2, err3, err4);
  425. //PRINTF_LIB_FUNC("address = %d, abVol = %d, bcVol = %d, caVol = %d \n", address, abVol, bcVol, caVol);
  426. }
  427. break;
  428. case Nexton_PSU_AcInputValue:
  429. {
  430. /*Test mode used*/
  431. // 回傳輸出值與入風口溫度
  432. address = frame.can_id & 0x000000FF;
  433. short vR = ((frame.data[0] << 8) + frame.data[1]);
  434. short vS = ((frame.data[2] << 8) + frame.data[3]);
  435. short vT = ((frame.data[4] << 8) + frame.data[5]);
  436. return_module_input(address, vR, vS, vT);
  437. //PRINTF_LIB_FUNC("address = %d, abVol = %d, bcVol = %d, caVol = %d \n", address, abVol, bcVol, caVol);
  438. }
  439. break;
  440. default:
  441. break;
  442. }
  443. }
  444. }
  445. else
  446. usleep(10000);
  447. }
  448. }
  449. //================================================
  450. // Private Function
  451. //================================================
  452. void SendCmdToPsu(int cmd, byte *data, byte dataLen)
  453. {
  454. PwrFrame PwrFrameMsg;
  455. struct can_frame frame;
  456. //設定 CANBSU 2.0B 長封包
  457. PwrFrameMsg.PwrMessage = cmd | 0x80000000;
  458. frame.can_id = PwrFrameMsg.PwrMessage;
  459. frame.can_dlc = dataLen;
  460. memcpy(frame.data, data, dataLen);
  461. write(CanFd, &frame, sizeof(struct can_frame));
  462. // 群命令才 delay
  463. if (PwrFrameMsg.InfyBits.DestinationAddress == INFY_ADD_BROADCAST)
  464. usleep(CMD_DELAY_TIME);
  465. }
  466. bool InitialCommunication()
  467. {
  468. CanFd = InitCanBus();
  469. if(CanFd < 0)
  470. {
  471. PRINTF_LIB_FUNC("Init can bus fail.\n");
  472. return false;
  473. }
  474. recFork = fork();
  475. if(recFork == 0)
  476. {
  477. ReceiveDataFromCanBus();
  478. }
  479. return true;
  480. }
  481. //================================================
  482. // API Function
  483. //================================================
  484. void SwitchPower(byte group, byte value)
  485. {
  486. byte data[8];
  487. PwrFrame PwrFrameMsg;
  488. PwrFrameMsg.PwrMessage = 0;
  489. PwrFrameMsg.InfyBits.CmdValue = PSU_WCmd_ModulePowerOnOff;
  490. memset(data, 0x00, ARRAY_SIZE(data));
  491. // 1 : 關機
  492. // 0 : 開機
  493. data[0] = value;
  494. if (group == INFY_ADD_BROADCAST)
  495. {
  496. PwrFrameMsg.InfyBits.DeviceValue = DEVICE_NO_SINGLE_MODULE;
  497. }
  498. else
  499. {
  500. PwrFrameMsg.InfyBits.DeviceValue = DEVICE_NO_GROUP_MODULE;
  501. }
  502. PwrFrameMsg.InfyBits.DestinationAddress = group;
  503. PwrFrameMsg.InfyBits.SourceAddress = INFY_ADD_CSU;
  504. SendCmdToPsu(PwrFrameMsg.PwrMessage, data, sizeof(data));
  505. }
  506. void SleepMode(byte group, byte value)
  507. {
  508. byte data[8];
  509. PwrFrame PwrFrameMsg;
  510. PwrFrameMsg.PwrMessage = 0;
  511. PwrFrameMsg.InfyBits.CmdValue = PSU_WCmd_ModuleSleepMode;
  512. memset(data, 0x00, ARRAY_SIZE(data));
  513. // 1 : 休眠
  514. // 0 : 起床
  515. data[0] = value;
  516. if (group == INFY_ADD_BROADCAST)
  517. {
  518. PwrFrameMsg.InfyBits.DeviceValue = DEVICE_NO_SINGLE_MODULE;
  519. }
  520. else
  521. {
  522. PwrFrameMsg.InfyBits.DeviceValue = DEVICE_NO_GROUP_MODULE;
  523. }
  524. PwrFrameMsg.InfyBits.DestinationAddress = group;
  525. PwrFrameMsg.InfyBits.SourceAddress = INFY_ADD_CSU;
  526. SendCmdToPsu(PwrFrameMsg.PwrMessage, data, sizeof(data));
  527. }
  528. void FlashLed(byte group, byte value)
  529. {
  530. byte data[8];
  531. PwrFrame PwrFrameMsg;
  532. PwrFrameMsg.PwrMessage = 0;
  533. PwrFrameMsg.InfyBits.CmdValue = PSU_WCmd_ModuleFlashLed;
  534. memset(data, 0x00, ARRAY_SIZE(data));
  535. // 1 : 閃爍
  536. // 0 : 正常
  537. data[0] = value;
  538. if (group == INFY_ADD_BROADCAST)
  539. {
  540. PwrFrameMsg.InfyBits.DeviceValue = DEVICE_NO_SINGLE_MODULE;
  541. }
  542. else
  543. {
  544. PwrFrameMsg.InfyBits.DeviceValue = DEVICE_NO_GROUP_MODULE;
  545. }
  546. PwrFrameMsg.InfyBits.DestinationAddress = group;
  547. PwrFrameMsg.InfyBits.SourceAddress = INFY_ADD_CSU;
  548. SendCmdToPsu(PwrFrameMsg.PwrMessage, data, sizeof(data));
  549. }
  550. void PresentOutputVol(byte group, int voltage, int current, byte psuCount)
  551. {
  552. byte data[8];
  553. PwrFrame PwrFrameMsg;
  554. PwrFrameMsg.PwrMessage = 0;
  555. PwrFrameMsg.InfyBits.CmdValue = PSU_WCmd_SetOutput;
  556. int Vol = voltage * 100;
  557. int Cur = current * 100;
  558. memset(data, 0x00, ARRAY_SIZE(data));
  559. // 輸出電壓
  560. data[0] = (Vol >> 24) & 0xFF;
  561. data[1] = (Vol >> 16) & 0xFF;
  562. data[2] = (Vol >> 8) & 0xFF;
  563. data[3] = Vol & 0xFF;
  564. // 輸出電流
  565. data[4] = (Cur >> 24) & 0xFF;
  566. data[5] = (Cur >> 16) & 0xFF;
  567. data[6] = (Cur >> 8) & 0xFF;
  568. data[7] = Cur & 0xFF;
  569. if (group == INFY_ADD_BROADCAST)
  570. {
  571. PwrFrameMsg.InfyBits.DeviceValue = DEVICE_NO_SINGLE_MODULE;
  572. }
  573. else
  574. {
  575. PwrFrameMsg.InfyBits.DeviceValue = DEVICE_NO_GROUP_MODULE;
  576. }
  577. PwrFrameMsg.InfyBits.DestinationAddress = group;
  578. PwrFrameMsg.InfyBits.SourceAddress = INFY_ADD_CSU;
  579. SendCmdToPsu(PwrFrameMsg.PwrMessage, data, sizeof(data));
  580. }
  581. void FanNoiseInfo(byte group, byte value)
  582. {
  583. byte data[8];
  584. PwrFrame PwrFrameMsg;
  585. PwrFrameMsg.PwrMessage = 0;
  586. PwrFrameMsg.InfyBits.CmdValue = PSU_WCmd_ModuleSetMiscInfo;
  587. memset(data, 0x00, ARRAY_SIZE(data));
  588. // 風扇低噪音
  589. data[0] = ((SetMiscInfo_FanMode >> 8) & 0xFF);
  590. data[1] = (SetMiscInfo_FanMode & 0xFF);
  591. // 0xA0 power poriority mode
  592. // 0xA1 denoise mode
  593. // 0xA2 quiet mode
  594. data[7] = value;
  595. if (group == INFY_ADD_BROADCAST)
  596. {
  597. PwrFrameMsg.InfyBits.DeviceValue = DEVICE_NO_SINGLE_MODULE;
  598. }
  599. else
  600. {
  601. PwrFrameMsg.InfyBits.DeviceValue = DEVICE_NO_GROUP_MODULE;
  602. }
  603. PwrFrameMsg.InfyBits.DestinationAddress = group;
  604. PwrFrameMsg.InfyBits.SourceAddress = INFY_ADD_CSU;
  605. SendCmdToPsu(PwrFrameMsg.PwrMessage, data, sizeof(data));
  606. }
  607. void SetWalkInConfig(byte group, byte enable, byte sec)
  608. {
  609. byte data[8];
  610. PwrFrame PwrFrameMsg;
  611. PwrFrameMsg.PwrMessage = 0;
  612. PwrFrameMsg.InfyBits.CmdValue = PSU_WCmd_ModuleWalkIn;
  613. memset(data, 0x00, ARRAY_SIZE(data));
  614. unsigned short _Sec = sec * 100;
  615. // Walk-in mode enable
  616. data[0] = enable;
  617. // Walk-in time (default == 5s)
  618. data[6] = (_Sec >> 8) & 0xFF;
  619. data[7] = _Sec & 0xFF;
  620. if (group == INFY_ADD_BROADCAST)
  621. {
  622. PwrFrameMsg.InfyBits.DeviceValue = DEVICE_NO_SINGLE_MODULE;
  623. }
  624. else
  625. {
  626. PwrFrameMsg.InfyBits.DeviceValue = DEVICE_NO_GROUP_MODULE;
  627. }
  628. PwrFrameMsg.InfyBits.DestinationAddress = group;
  629. PwrFrameMsg.InfyBits.SourceAddress = INFY_ADD_CSU;
  630. //printf("walk in cmd = %x \n", cmd);
  631. SendCmdToPsu(PwrFrameMsg.PwrMessage, data, sizeof(data));
  632. }
  633. void SetDirModulePresentOutput(byte group, int voltage, int current, byte _switch, byte _interRelay)
  634. {
  635. byte data[8];
  636. uint cmd = TEST_PRESENT_OUT; //0x180100E5
  637. memset(data, 0x00, ARRAY_SIZE(data));
  638. // 輸出電壓
  639. data[0] = (voltage >> 8) & 0xFF;
  640. data[1] = voltage & 0xFF;
  641. // 輸出電流
  642. data[2] = (current >> 8) & 0xFF;
  643. data[3] = current & 0xFF;
  644. // 開 / 關
  645. data[4] = _switch;
  646. // Internal Relay
  647. data[5] = _interRelay;
  648. if (group == SYSTEM_CMD)
  649. cmd |= INFYPWR_BROADCAST;
  650. else
  651. cmd |= (group << 8);
  652. SendCmdToPsu(cmd, data, sizeof(data));
  653. }
  654. void SetDipSwitchMode()
  655. {
  656. byte data[8];
  657. PwrFrame PwrFrameMsg;
  658. PwrFrameMsg.PwrMessage = 0;
  659. PwrFrameMsg.InfyBits.CmdValue = PSU_WCmd_DipSwitchMode;
  660. memset(data, 0x00, ARRAY_SIZE(data));
  661. data[0] = 0x01;
  662. PwrFrameMsg.InfyBits.DeviceValue = DEVICE_NO_SINGLE_MODULE;
  663. PwrFrameMsg.InfyBits.DestinationAddress = INFY_ADD_BROADCAST;
  664. PwrFrameMsg.InfyBits.SourceAddress = INFY_ADD_CSU;
  665. SendCmdToPsu(PwrFrameMsg.PwrMessage, data, sizeof(data));
  666. }
  667. void PresentSingleOutput(byte moduleIndex, int voltage, int current)
  668. {
  669. byte data[8];
  670. PwrFrame PwrFrameMsg;
  671. PwrFrameMsg.PwrMessage = 0;
  672. PwrFrameMsg.InfyBits.CmdValue = PSU_WCmd_ModuleSetOutput;
  673. int Vol = voltage * 100;
  674. int Cur = current * 100;
  675. memset(data, 0x00, ARRAY_SIZE(data));
  676. // 輸出電壓
  677. data[0] = (Vol >> 24) & 0xFF;
  678. data[1] = (Vol >> 16) & 0xFF;
  679. data[2] = (Vol >> 8) & 0xFF;
  680. data[3] = Vol & 0xFF;
  681. // 輸出電流
  682. data[4] = (Cur >> 24) & 0xFF;
  683. data[5] = (Cur >> 16) & 0xFF;
  684. data[6] = (Cur >> 8) & 0xFF;
  685. data[7] = Cur & 0xFF;
  686. PwrFrameMsg.InfyBits.DeviceValue = DEVICE_NO_SINGLE_MODULE;
  687. PwrFrameMsg.InfyBits.DestinationAddress = moduleIndex;
  688. PwrFrameMsg.InfyBits.SourceAddress = INFY_ADD_CSU;
  689. SendCmdToPsu(PwrFrameMsg.PwrMessage, data, sizeof(data));
  690. }
  691. void SwitchSinglePower(byte moduleIndex, byte value)
  692. {
  693. byte data[8];
  694. PwrFrame PwrFrameMsg;
  695. PwrFrameMsg.PwrMessage = 0;
  696. PwrFrameMsg.InfyBits.CmdValue = PSU_WCmd_ModulePowerOnOff;
  697. memset(data, 0x00, ARRAY_SIZE(data));
  698. // 1 : 關機
  699. // 0 : 開機
  700. data[0] = value;
  701. PwrFrameMsg.InfyBits.DeviceValue = DEVICE_NO_SINGLE_MODULE;
  702. PwrFrameMsg.InfyBits.DestinationAddress = moduleIndex;
  703. PwrFrameMsg.InfyBits.SourceAddress = INFY_ADD_CSU;
  704. SendCmdToPsu(PwrFrameMsg.PwrMessage, data, sizeof(data));
  705. }
  706. void FlashSingleLed(byte moduleIndex, byte value)
  707. {
  708. byte data[8];
  709. PwrFrame PwrFrameMsg;
  710. PwrFrameMsg.PwrMessage = 0;
  711. PwrFrameMsg.InfyBits.CmdValue = PSU_WCmd_ModuleFlashLed;
  712. memset(data, 0x00, ARRAY_SIZE(data));
  713. // 1 : 閃爍
  714. // 0 : 正常
  715. data[0] = value;
  716. PwrFrameMsg.InfyBits.DeviceValue = DEVICE_NO_SINGLE_MODULE;
  717. PwrFrameMsg.InfyBits.DestinationAddress = moduleIndex;
  718. PwrFrameMsg.InfyBits.SourceAddress = INFY_ADD_CSU;
  719. SendCmdToPsu(PwrFrameMsg.PwrMessage, data, sizeof(data));
  720. }
  721. void GetSingleModuleOutputF(byte moduleIndex)
  722. {
  723. byte data[8];
  724. PwrFrame PwrFrameMsg;
  725. PwrFrameMsg.PwrMessage = 0;
  726. PwrFrameMsg.InfyBits.CmdValue = PSU_RCmd_ModuleOutputVolCur_F;
  727. memset(data, 0x00, ARRAY_SIZE(data));
  728. PwrFrameMsg.InfyBits.DeviceValue = DEVICE_NO_SINGLE_MODULE;
  729. PwrFrameMsg.InfyBits.DestinationAddress = moduleIndex;
  730. PwrFrameMsg.InfyBits.SourceAddress = INFY_ADD_CSU;
  731. SendCmdToPsu(PwrFrameMsg.PwrMessage, data, sizeof(data));
  732. }
  733. /**********************************************************************************/
  734. /*** ***/
  735. /*** Get ***/
  736. /*** ***/
  737. /**********************************************************************************/
  738. void GetStatus(byte group, byte param)
  739. {
  740. if (param == LIB_NO_USE)
  741. return;
  742. byte data[8];
  743. PwrFrame PwrFrameMsg;
  744. PwrFrameMsg.PwrMessage = 0;
  745. PwrFrameMsg.InfyBits.CmdValue = PSU_RCmd_ModuleStatus;
  746. memset(data, 0x00, ARRAY_SIZE(data));
  747. if (group == INFY_ADD_BROADCAST)
  748. {
  749. PwrFrameMsg.InfyBits.DeviceValue = DEVICE_NO_SINGLE_MODULE;
  750. }
  751. else
  752. {
  753. PwrFrameMsg.InfyBits.DeviceValue = DEVICE_NO_GROUP_MODULE;
  754. }
  755. PwrFrameMsg.InfyBits.DestinationAddress = group;
  756. PwrFrameMsg.InfyBits.SourceAddress = INFY_ADD_CSU;
  757. SendCmdToPsu(PwrFrameMsg.PwrMessage, data, sizeof(data));
  758. }
  759. void GetFanSpeed(byte group)
  760. {
  761. byte data[8];
  762. PwrFrame PwrFrameMsg;
  763. PwrFrameMsg.PwrMessage = 0;
  764. PwrFrameMsg.InfyBits.CmdValue = PSU_RCmd_ModuleMiscInfo;
  765. memset(data, 0x00, ARRAY_SIZE(data));
  766. data[0] = (FAN_SPEED_CMD >> 8) & 0xFF;
  767. data[1] = FAN_SPEED_CMD & 0xFF;
  768. if (group == INFY_ADD_BROADCAST)
  769. {
  770. PwrFrameMsg.InfyBits.DeviceValue = DEVICE_NO_SINGLE_MODULE;
  771. }
  772. else
  773. {
  774. PwrFrameMsg.InfyBits.DeviceValue = DEVICE_NO_GROUP_MODULE;
  775. }
  776. PwrFrameMsg.InfyBits.DestinationAddress = group;
  777. PwrFrameMsg.InfyBits.SourceAddress = INFY_ADD_CSU;
  778. SendCmdToPsu(PwrFrameMsg.PwrMessage, data, sizeof(data));
  779. }
  780. void GetDcTemperature(byte group)
  781. {
  782. byte data[8];
  783. PwrFrame PwrFrameMsg;
  784. PwrFrameMsg.PwrMessage = 0;
  785. PwrFrameMsg.InfyBits.CmdValue = PSU_RCmd_ModuleMiscInfo;
  786. memset(data, 0x00, ARRAY_SIZE(data));
  787. data[0] = (TEMP_DC_CMD >> 8) & 0xFF;
  788. data[1] = TEMP_DC_CMD & 0xFF;
  789. if (group == INFY_ADD_BROADCAST)
  790. {
  791. PwrFrameMsg.InfyBits.DeviceValue = DEVICE_NO_SINGLE_MODULE;
  792. }
  793. else
  794. {
  795. PwrFrameMsg.InfyBits.DeviceValue = DEVICE_NO_GROUP_MODULE;
  796. }
  797. PwrFrameMsg.InfyBits.DestinationAddress = group;
  798. PwrFrameMsg.InfyBits.SourceAddress = INFY_ADD_CSU;
  799. SendCmdToPsu(PwrFrameMsg.PwrMessage, data, sizeof(data));
  800. }
  801. void GetPfcTemperature(byte group)
  802. {
  803. byte data[8];
  804. PwrFrame PwrFrameMsg;
  805. PwrFrameMsg.PwrMessage = 0;
  806. PwrFrameMsg.InfyBits.CmdValue = PSU_RCmd_ModuleMiscInfo;
  807. memset(data, 0x00, ARRAY_SIZE(data));
  808. data[0] = (TEMP_PFC_CMD >> 8) & 0xFF;
  809. data[1] = TEMP_PFC_CMD & 0xFF;
  810. if (group == INFY_ADD_BROADCAST)
  811. {
  812. PwrFrameMsg.InfyBits.DeviceValue = DEVICE_NO_SINGLE_MODULE;
  813. }
  814. else
  815. {
  816. PwrFrameMsg.InfyBits.DeviceValue = DEVICE_NO_GROUP_MODULE;
  817. }
  818. PwrFrameMsg.InfyBits.DestinationAddress = group;
  819. PwrFrameMsg.InfyBits.SourceAddress = INFY_ADD_CSU;
  820. SendCmdToPsu(PwrFrameMsg.PwrMessage, data, sizeof(data));
  821. }
  822. void GetModuleCount(byte group)
  823. {
  824. byte data[8];
  825. PwrFrame PwrFrameMsg;
  826. PwrFrameMsg.PwrMessage = 0;
  827. PwrFrameMsg.InfyBits.CmdValue = PSU_RCmd_SysModuleCount;
  828. memset(data, 0x00, ARRAY_SIZE(data));
  829. if (group == INFY_ADD_BROADCAST)
  830. {
  831. PwrFrameMsg.InfyBits.DeviceValue = DEVICE_NO_SINGLE_MODULE;
  832. }
  833. else
  834. {
  835. PwrFrameMsg.InfyBits.DeviceValue = DEVICE_NO_GROUP_MODULE;
  836. }
  837. PwrFrameMsg.InfyBits.DestinationAddress = group;
  838. PwrFrameMsg.InfyBits.SourceAddress = INFY_ADD_CSU;
  839. SendCmdToPsu(PwrFrameMsg.PwrMessage, data, sizeof(data));
  840. }
  841. void GetModuleVer(byte group)
  842. {
  843. // 無系統廣播功能
  844. byte data[8];
  845. PwrFrame PwrFrameMsg;
  846. PwrFrameMsg.PwrMessage = 0;
  847. PwrFrameMsg.InfyBits.CmdValue = PSU_RCmd_ModuleVersion;
  848. memset(data, 0x00, ARRAY_SIZE(data));
  849. if (group == INFY_ADD_BROADCAST)
  850. {
  851. PwrFrameMsg.InfyBits.DeviceValue = DEVICE_NO_SINGLE_MODULE;
  852. }
  853. else
  854. {
  855. PwrFrameMsg.InfyBits.DeviceValue = DEVICE_NO_GROUP_MODULE;
  856. }
  857. PwrFrameMsg.InfyBits.DestinationAddress = group;
  858. PwrFrameMsg.InfyBits.SourceAddress = INFY_ADD_CSU;
  859. //PRINTF_LIB_FUNC("GetModuleVer cmd = %x\n", cmd);
  860. SendCmdToPsu(PwrFrameMsg.PwrMessage, data, sizeof(data));
  861. }
  862. void GetModuleCap(byte group)
  863. {
  864. byte data[8];
  865. PwrFrame PwrFrameMsg;
  866. PwrFrameMsg.PwrMessage = 0;
  867. PwrFrameMsg.InfyBits.CmdValue = PSU_RCmd_ModuleCapability;
  868. memset(data, 0x00, ARRAY_SIZE(data));
  869. if (group == INFY_ADD_BROADCAST)
  870. {
  871. PwrFrameMsg.InfyBits.DeviceValue = DEVICE_NO_SINGLE_MODULE;
  872. }
  873. else
  874. {
  875. PwrFrameMsg.InfyBits.DeviceValue = DEVICE_NO_GROUP_MODULE;
  876. }
  877. PwrFrameMsg.InfyBits.DestinationAddress = group;
  878. PwrFrameMsg.InfyBits.SourceAddress = INFY_ADD_CSU;
  879. //PRINTF_LIB_FUNC("GetModuleCap cmd = %x\n", cmd);
  880. SendCmdToPsu(PwrFrameMsg.PwrMessage, data, sizeof(data));
  881. }
  882. void GetModuleBarCode(byte group)
  883. {
  884. // 無系統廣播功能
  885. byte data[8];
  886. PwrFrame PwrFrameMsg;
  887. PwrFrameMsg.PwrMessage = 0;
  888. PwrFrameMsg.InfyBits.CmdValue = PSU_RCmd_ModuleBarcode;
  889. memset(data, 0x00, ARRAY_SIZE(data));
  890. if (group == INFY_ADD_BROADCAST)
  891. {
  892. PwrFrameMsg.InfyBits.DeviceValue = DEVICE_NO_SINGLE_MODULE;
  893. }
  894. else
  895. {
  896. PwrFrameMsg.InfyBits.DeviceValue = DEVICE_NO_GROUP_MODULE;
  897. }
  898. PwrFrameMsg.InfyBits.DestinationAddress = group;
  899. PwrFrameMsg.InfyBits.SourceAddress = INFY_ADD_CSU;
  900. SendCmdToPsu(PwrFrameMsg.PwrMessage, data, sizeof(data));
  901. }
  902. void GetModuleInput(byte group)
  903. {
  904. // 無系統廣播功能
  905. byte data[8];
  906. PwrFrame PwrFrameMsg;
  907. PwrFrameMsg.PwrMessage = 0;
  908. PwrFrameMsg.InfyBits.CmdValue = PSU_RCmd_ModuleInputVoltage;
  909. memset(data, 0x00, ARRAY_SIZE(data));
  910. if (group == INFY_ADD_BROADCAST)
  911. {
  912. PwrFrameMsg.InfyBits.DeviceValue = DEVICE_NO_SINGLE_MODULE;
  913. }
  914. else
  915. {
  916. PwrFrameMsg.InfyBits.DeviceValue = DEVICE_NO_GROUP_MODULE;
  917. }
  918. PwrFrameMsg.InfyBits.DestinationAddress = group;
  919. PwrFrameMsg.InfyBits.SourceAddress = INFY_ADD_CSU;
  920. SendCmdToPsu(PwrFrameMsg.PwrMessage, data, sizeof(data));
  921. }
  922. void GetModuleIavailable(byte group)
  923. {
  924. byte data[8];
  925. PwrFrame PwrFrameMsg;
  926. PwrFrameMsg.PwrMessage = 0;
  927. PwrFrameMsg.InfyBits.CmdValue = PSU_RCmd_ModuleIAvailable;
  928. memset(data, 0x00, ARRAY_SIZE(data));
  929. if (group == INFY_ADD_BROADCAST)
  930. {
  931. PwrFrameMsg.InfyBits.DeviceValue = DEVICE_NO_SINGLE_MODULE;
  932. }
  933. else
  934. {
  935. PwrFrameMsg.InfyBits.DeviceValue = DEVICE_NO_GROUP_MODULE;
  936. }
  937. PwrFrameMsg.InfyBits.DestinationAddress = group;
  938. PwrFrameMsg.InfyBits.SourceAddress = INFY_ADD_CSU;
  939. SendCmdToPsu(PwrFrameMsg.PwrMessage, data, sizeof(data));
  940. }
  941. void GetModuleOutput(byte group)
  942. {
  943. byte data[8];
  944. PwrFrame PwrFrameMsg;
  945. PwrFrameMsg.PwrMessage = 0;
  946. PwrFrameMsg.InfyBits.CmdValue = PSU_RCmd_SysOutputVolCur;
  947. memset(data, 0x00, ARRAY_SIZE(data));
  948. if (group == INFY_ADD_BROADCAST)
  949. {
  950. PwrFrameMsg.InfyBits.DeviceValue = DEVICE_NO_SINGLE_MODULE;
  951. }
  952. else
  953. {
  954. PwrFrameMsg.InfyBits.DeviceValue = DEVICE_NO_GROUP_MODULE;
  955. }
  956. PwrFrameMsg.InfyBits.DestinationAddress = group;
  957. PwrFrameMsg.InfyBits.SourceAddress = INFY_ADD_CSU;
  958. SendCmdToPsu(PwrFrameMsg.PwrMessage, data, sizeof(data));
  959. }
  960. void GetModuleOutputF(byte group)
  961. {
  962. byte data[8];
  963. PwrFrame PwrFrameMsg;
  964. PwrFrameMsg.PwrMessage = 0;
  965. PwrFrameMsg.InfyBits.CmdValue = PSU_RCmd_SysOutputVolCur_F;
  966. memset(data, 0x00, ARRAY_SIZE(data));
  967. if (group == INFY_ADD_BROADCAST)
  968. {
  969. PwrFrameMsg.InfyBits.DeviceValue = DEVICE_NO_SINGLE_MODULE;
  970. }
  971. else
  972. {
  973. PwrFrameMsg.InfyBits.DeviceValue = DEVICE_NO_GROUP_MODULE;
  974. }
  975. PwrFrameMsg.InfyBits.DestinationAddress = group;
  976. PwrFrameMsg.InfyBits.SourceAddress = INFY_ADD_CSU;
  977. SendCmdToPsu(PwrFrameMsg.PwrMessage, data, sizeof(data));
  978. }
  979. /**********************************************************************************/
  980. /*** ***/
  981. /*** Upgrate ***/
  982. /*** ***/
  983. /**********************************************************************************/
  984. void ChangePsuBaudrate(short baudrate)
  985. {
  986. byte data[8];
  987. uint cmd = CHANGE_BAUDRATE; //0x180100E5
  988. memset(data, 0x00, ARRAY_SIZE(data));
  989. data[0] = 0x11;
  990. data[1] = 0x26;
  991. if (baudrate == 125)
  992. data[7] = 0xA0;
  993. else if (baudrate == 250)
  994. data[7] = 0xA1;
  995. else if (baudrate == 500)
  996. data[7] = 0xA2;
  997. cmd |= INFYPWR_BROADCAST | INFYPWR_DEFAULT;
  998. SendCmdToPsu(cmd, data, sizeof(data));
  999. }