data.js 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733
  1. var PKT_TYPE=function(){
  2. var len = 0;
  3. return {
  4. PKT_TYPE_ACK:len++,
  5. PKT_TYPE_PARAS:len++,
  6. PKT_TYPE_POWER_CH:len++, //power_ch_t
  7. PKT_TYPE_POWER_TOTAL:len++, //power_total_t
  8. PKT_TYPE_SENSOR:len++,
  9. PKT_TYPE_BREAKER:len++,
  10. PKT_TYPE_STAT:len++,
  11. PKT_TYPE_MESG:len++,
  12. PKT_TYPE_FILE:len++,
  13. }
  14. }();
  15. ///////////////////////////////////////////////////////
  16. function array_to_string(data){
  17. var s = "";
  18. for(var i=0;i<data.length && data[i] !=0;i++){
  19. s +=String.fromCharCode(data[i]);
  20. }
  21. return s;
  22. }
  23. function string_to_array(data,attr){
  24. for(var i=0;i<data.length;i++){
  25. attr[i] = data.charCodeAt(i);
  26. }
  27. return attr;
  28. }
  29. function array_cat(a1,a2){
  30. var tlen=a1.byteLength+a2.byteLength;
  31. var buffer = new ArrayBuffer(tlen);
  32. var vw = new Uint8Array(buffer);
  33. var vw1 = new Uint8Array(a1);
  34. for(var i=0; i<a1.byteLength; i++) {
  35. vw[i] = vw1[i];
  36. }
  37. var vw2 = new Uint8Array(a2);
  38. for(var i=0; i<a2.byteLength; i++) {
  39. vw[i+a1.byteLength] = vw2[i];
  40. }
  41. return buffer;
  42. }
  43. ///////////////////////////////////////////////////
  44. function bin_to_hdr(bin) {
  45. var tmp, length=0;
  46. tmp = new DataView(bin, length);
  47. this.magic = tmp.getUint32(0,true);
  48. length += 4;
  49. tmp = new DataView(bin, length);
  50. this.type = tmp.getUint32(0,true);
  51. length += 4;
  52. tmp = new DataView(bin, length);
  53. this.nack = tmp.getUint32(0,true);
  54. length += 4;
  55. tmp = new DataView(bin, length);
  56. this.dlen = tmp.getUint32(0,true);
  57. length += 4;
  58. this.len = length;
  59. }
  60. function bin_to_info(bin) {
  61. var tmp, length=0;
  62. tmp = new DataView(bin, length);
  63. this.type = tmp.getUint8(0,true);
  64. length += 1;
  65. tmp = new DataView(bin, length);
  66. this.addr = tmp.getUint8(0,true);
  67. length += 1;
  68. tmp = new DataView(bin, length);
  69. this.ch = tmp.getUint8(0,true);
  70. length += 1;
  71. tmp = new DataView(bin, length);
  72. this.sch = tmp.getUint8(0,true);
  73. length += 1;
  74. tmp = new DataView(bin, length);
  75. this.pid = tmp.getUint8(0,true);
  76. length += 1;
  77. tmp = new DataView(bin, length);
  78. this.start_delay = tmp.getUint16(0,true);
  79. length += 2;
  80. tmp = new DataView(bin, length);
  81. this.stop_delay = tmp.getUint16(0,true);
  82. length += 2;
  83. this.len = length;
  84. }
  85. function bin_to_power(bin) {
  86. var tmp, length=0;
  87. tmp = new DataView(bin, length);
  88. this.voltage = tmp.getFloat32(0,true);
  89. length += 4;
  90. tmp = new DataView(bin, length);
  91. this.current = tmp.getFloat32(0,true);
  92. length += 4;
  93. tmp = new DataView(bin, length);
  94. this.power = tmp.getFloat32(0,true);
  95. length += 4;
  96. tmp = new DataView(bin, length);
  97. this.freq = tmp.getFloat32(0,true);
  98. length += 4;
  99. tmp = new DataView(bin, length);
  100. this.factor = tmp.getFloat32(0,true);
  101. length += 4;
  102. tmp = new DataView(bin, length);
  103. this.consump = tmp.getFloat32(0,true);
  104. length += 4;
  105. tmp = new DataView(bin, length);
  106. this.status = tmp.getUint8(0,true);
  107. length += 1;
  108. tmp = new DataView(bin, length);
  109. this.nwire = tmp.getUint8(0,true);
  110. length += 1;
  111. this.len = length;
  112. }
  113. function bin_to_alarm(bin) {
  114. var tmp, length=0;
  115. tmp = new DataView(bin, length);
  116. this.v_upper = tmp.getUint8(0,true);
  117. length += 1;
  118. tmp = new DataView(bin, length);
  119. this.v_lower = tmp.getUint8(0,true);
  120. length += 1;
  121. tmp = new DataView(bin, length);
  122. this.c_upper = tmp.getUint8(0,true);
  123. length += 1;
  124. tmp = new DataView(bin, length);
  125. this.p_upper = tmp.getUint8(0,true);
  126. length += 1;
  127. tmp = new DataView(bin, length);
  128. this.w_upper = tmp.getUint8(0,true);
  129. length += 1;
  130. tmp = new DataView(bin, length);
  131. this.ph_loss = tmp.getUint8(0,true);
  132. length += 1;
  133. this.len = length;
  134. }
  135. function bin_to_thrval(bin) {
  136. var tmp, length=0;
  137. tmp = new DataView(bin, length);
  138. this.en = tmp.getUint8(0,true);
  139. length += 1;
  140. tmp = new DataView(bin, length);
  141. this.val = tmp.getFloat32(0,true);
  142. length += 4;
  143. tmp = new DataView(bin, length);
  144. this.act = tmp.getUint8(0,true);
  145. length += 1;
  146. this.act_para = [];
  147. tmp = new DataView(bin, length);
  148. for(var i=0; i<14; i++) {
  149. this.act_para[i] = tmp.getUint8(i,true);
  150. }
  151. length += 14;
  152. this.len = length;
  153. }
  154. function bin_to_thr(bin) {
  155. var tmp, length=0;
  156. this.v_upper = new bin_to_thrval(bin.slice(length));
  157. length += this.v_upper.len;
  158. this.v_lower = new bin_to_thrval(bin.slice(length));
  159. length += this.v_lower.len;
  160. this.c_upper = new bin_to_thrval(bin.slice(length));
  161. length += this.c_upper.len;
  162. this.p_upper = new bin_to_thrval(bin.slice(length));
  163. length += this.p_upper.len;
  164. this.w_upper = new bin_to_thrval(bin.slice(length));
  165. length += this.w_upper.len;
  166. this.len = length;
  167. }
  168. function bin_to_powerc(bin) {
  169. var tmp, bin2, length=0;
  170. this.info = new bin_to_info(bin);
  171. length += this.info.len;
  172. this.power = [];
  173. for(var i=0; i<3; i++) {
  174. this.power[i] = new bin_to_power(bin.slice(length));
  175. length += this.power[i].len;
  176. }
  177. this.thr = new bin_to_thr(bin.slice(length));
  178. length += this.thr.len;
  179. this.alarm = new bin_to_alarm(bin.slice(length));
  180. length += this.alarm.len;
  181. tmp = new DataView(bin, length);
  182. this.time = tmp.getUint32(0,true);
  183. length += this.time.len;
  184. this.len = length;
  185. }
  186. function bin_to_total(bin) {
  187. var tmp, length=0;
  188. tmp = new DataView(bin, length);
  189. this.voltage = tmp.getFloat32 (0,true);
  190. length += 4;
  191. tmp = new DataView(bin, length);
  192. this.current = tmp.getFloat32(0,true);
  193. length += 4;
  194. tmp = new DataView(bin, length);
  195. this.power = tmp.getFloat32(0,true);
  196. length += 4;
  197. tmp = new DataView(bin, length);
  198. this.freq = tmp.getFloat32(0,true);
  199. length += 4;
  200. tmp = new DataView(bin, length);
  201. this.consump = tmp.getFloat32 (0,true);
  202. length += 4;
  203. tmp = new DataView(bin, length);
  204. this.active = tmp.getFloat32(0,true);
  205. length += 4;
  206. tmp = new DataView(bin, length);
  207. this.reactive = tmp.getFloat32(0,true);
  208. length += 4;
  209. tmp = new DataView(bin, length);
  210. this.apparent = tmp.getFloat32(0,true);
  211. length += 4;
  212. this.len = length;
  213. }
  214. function bin_to_powert(bin) {
  215. var tmp, length=0;
  216. tmp = new DataView(bin, length);
  217. this.type = tmp.getUint8(0,true);
  218. length += 1;
  219. this.total = [];
  220. for(var i=0; i<3; i++) {
  221. this.total[i] = new bin_to_total(bin.slice(length));
  222. length += this.total[i].len;
  223. }
  224. this.len = length;
  225. }
  226. ///////////////////////////////////////////////////
  227. function hdr_to_bin(js) {
  228. var tmp, length=0;
  229. var buffer = new ArrayBuffer(js.len);
  230. tmp = new DataView(buffer, length);
  231. tmp.setUint32(0,js.magic,true);
  232. length += 4;
  233. tmp = new DataView(buffer, length);
  234. tmp.setUint32(0,js.type,true);
  235. length += 4;
  236. tmp = new DataView(buffer, length);
  237. tmp.setUint32(0,js.nack,true);
  238. length += 4;
  239. tmp = new DataView(buffer, length);
  240. tmp.setUint32(0,js.dlen,true);
  241. length += 4;
  242. return buffer;
  243. }
  244. function info_to_bin(js) {
  245. var tmp, length=0;
  246. var buffer = new ArrayBuffer(js.len);
  247. tmp = new DataView(buffer, length);
  248. tmp.setUint8(0,js.type,true);
  249. length += 1;
  250. tmp = new DataView(buffer, length);
  251. tmp.setUint8(0,js.addr,true);
  252. length += 1;
  253. tmp = new DataView(buffer, length);
  254. tmp.setUint8(0,js.ch,true);
  255. length += 1;
  256. tmp = new DataView(buffer, length);
  257. tmp.setUint8(0,js.sch,true);
  258. length += 1;
  259. tmp = new DataView(buffer, length);
  260. tmp.setUint8(0,js.pid,true);
  261. length += 1;
  262. tmp = new DataView(buffer, length);
  263. tmp.setUint16(0,js.start_delay,true);
  264. length += 2;
  265. tmp = new DataView(buffer, length);
  266. tmp.setUint16(0,js.stop_delay,true);
  267. length += 2;
  268. return buffer;
  269. }
  270. function power_to_bin(js) {
  271. var tmp, length=0;
  272. var buffer = new ArrayBuffer(js.len);
  273. tmp = new DataView(buffer, length);
  274. tmp.setFloat32(0,js.voltage,true);
  275. length += 4;
  276. tmp = new DataView(buffer, length);
  277. tmp.setFloat32(0,js.current,true);
  278. length += 4;
  279. tmp = new DataView(buffer, length);
  280. tmp.setFloat32(0,js.power,true);
  281. length += 4;
  282. tmp = new DataView(buffer, length);
  283. tmp.setFloat32(0,js.freq,true);
  284. length += 4;
  285. tmp = new DataView(buffer, length);
  286. tmp.setFloat32(0,js.factor,true);
  287. length += 4;
  288. tmp = new DataView(buffer, length);
  289. tmp.setFloat32(0,js.consump,true);
  290. length += 4;
  291. tmp = new DataView(buffer, length);
  292. tmp.setUint8(0,js.status,true);
  293. length += 1;
  294. tmp = new DataView(buffer, length);
  295. tmp.setUint8(0,js.nwire,true);
  296. length += 1;
  297. return buffer;
  298. }
  299. function alarm_to_bin(js) {
  300. var tmp, length=0;
  301. var buffer = new ArrayBuffer(js.len);
  302. tmp = new DataView(buffer, length);
  303. tmp.setUint8(0,js.v_upper,true);
  304. length += 1;
  305. tmp = new DataView(buffer, length);
  306. tmp.setUint8(0,js.v_lower,true);
  307. length += 1;
  308. tmp = new DataView(buffer, length);
  309. tmp.setUint8(0,js.c_upper,true);
  310. length += 1;
  311. tmp = new DataView(buffer, length);
  312. tmp.setUint8(0,js.p_upper,true);
  313. length += 1;
  314. tmp = new DataView(buffer, length);
  315. tmp.setUint8(0,js.w_upper,true);
  316. length += 1;
  317. tmp = new DataView(buffer, length);
  318. tmp.setUint8(0,js.ph_loss,true);
  319. length += 1;
  320. return buffer;
  321. }
  322. function thrval_to_js(js) {
  323. var tmp, length=0;
  324. var buffer = new ArrayBuffer(js.len);
  325. tmp = new DataView(buffer, length);
  326. tmp.setUint8(0,js.en,true);
  327. length += 1;
  328. tmp = new DataView(buffer, length);
  329. tmp.setFloat32(0,js.val,true);
  330. length += 4;
  331. tmp = new DataView(buffer, length);
  332. tmp.getUint8(0,js.act,true);
  333. length += 1;
  334. tmp = new DataView(buffer, length);
  335. for(var i=0; i<14; i++) {
  336. tmp.setUint8(i,js.act_para[i],true);
  337. }
  338. length += 14;
  339. return buffer;
  340. }
  341. function thr_to_bin(js) {
  342. var bin,tmp, length=0;
  343. bin = thrval_to_js(js.v_upper);
  344. tmp = thrval_to_js(js.v_lower);
  345. bin = array_cat(bin, tmp);
  346. tmp = thrval_to_js(js.c_upper);
  347. bin = array_cat(bin, tmp);
  348. tmp = thrval_to_js(js.p_upper);
  349. bin = array_cat(bin, tmp);
  350. tmp = thrval_to_js(js.w_upper);
  351. bin = array_cat(bin, tmp);
  352. return bin;
  353. }
  354. function powerc_to_bin(js) {
  355. var bin,tmp, length=0;
  356. bin = info_to_bin(js.info);
  357. for(var i=0; i<3; i++) {
  358. tmp = power_to_bin(js.power[i]);
  359. bin = array_cat(bin, tmp);
  360. }
  361. tmp = thr_to_bin(js.thr);
  362. bin = array_cat(bin, tmp);
  363. tmp = alarm_to_bin(js.alarm);
  364. bin = array_cat(bin, tmp);
  365. var buf = new ArrayBuffer(4);
  366. tmp = new DataView(buf, 0);
  367. tmp.setUint32(0,js.time,true);
  368. bin = array_cat(bin, buf);
  369. return bin;
  370. }
  371. function total_to_bin(js) {
  372. var tmp, length=0;
  373. var buffer = new ArrayBuffer(js.len);
  374. tmp = new DataView(buffer, length);
  375. tmp.setFloat32(0,js.voltage,true);
  376. length += 4;
  377. tmp = new DataView(buffer, length);
  378. tmp.setFloat32(0,js.current,true);
  379. length += 4;
  380. tmp = new DataView(buffer, length);
  381. tmp.setFloat32(0,js.power,true);
  382. length += 4;
  383. tmp = new DataView(buffer, length);
  384. tmp.setFloat32(0,js.freq,true);
  385. length += 4;
  386. tmp = new DataView(buffer, length);
  387. tmp.setFloat32(0,js.consump,true);
  388. length += 4;
  389. ///
  390. tmp = new DataView(buffer, length);
  391. tmp.setFloat32(0,js.active,true);
  392. length += 4;
  393. tmp = new DataView(buffer, length);
  394. tmp.setFloat32(0,js.reactive,true);
  395. length += 4;
  396. tmp = new DataView(buffer, length);
  397. tmp.setFloat32(0,js.apparent,true);
  398. length += 4;
  399. return buffer;
  400. }
  401. function powert_to_bin(js) {
  402. var tmp,bin2,length=0;
  403. var bin = new ArrayBuffer(1);
  404. tmp = new DataView(bin, length);
  405. tmp.setUint8(0,js.type,true);
  406. length += 4;
  407. for(var i=0; i<3; i++) {
  408. bin2 = total_to_bin(js.total[i]);
  409. bin = array_cat(bin, bin2);
  410. }
  411. return bin;
  412. }
  413. //////////////////////////////////////////////////////////////
  414. var XXX ={};
  415. XXX.hdr = function() {
  416. this.j2b = function (js) {
  417. var tmp;
  418. var hdr = new hdr_to_bin(js);
  419. switch(js.type){
  420. case PKT_TYPE.PKT_TYPE_POWER_CH:
  421. tmp = BIN.powerc.j2b(js.powerc);
  422. break;
  423. case PKT_TYPE.PKT_TYPE_POWER_TOTAL:
  424. tmp = BIN.powert.j2b(js.powert);
  425. break;
  426. }
  427. return array_cat(hdr,tmp);
  428. };
  429. this.b2j = function (bin) {
  430. var tmp;
  431. var hdr = new bin_to_hdr(bin);
  432. if(hdr.nack == 1){
  433. //tmp = myBinary.ack.bin2js(bin,this.hdr.len,true);
  434. //myLog('log',tmp);
  435. //var data = tmp.data;
  436. }
  437. var data = bin.slice(hdr.len);
  438. switch(hdr.type) {
  439. case PKT_TYPE.PKT_TYPE_POWER_CH:
  440. hdr.powerc = BIN.powerc.b2j(data);
  441. break;
  442. case PKT_TYPE.PKT_TYPE_POWER_TOTAL:
  443. hdr.powert = BIN.powert.b2j(data);
  444. break;
  445. default :
  446. console.log("wrong hdr type: "+hdr.type);
  447. }
  448. return hdr;
  449. }
  450. };
  451. XXX.paras=function() {
  452. this.j2b = function (js) {
  453. }
  454. this.b2j = function (bin) {
  455. }
  456. };
  457. XXX.powerc=function() {
  458. this.j2b = function (js) {
  459. return new powerc_to_bin(js);
  460. }
  461. this.b2j = function (bin) {
  462. return new bin_to_powerc(bin);
  463. }
  464. };
  465. XXX.powert=function() {
  466. this.j2b = function (js) {
  467. return new powert_to_bin(js);
  468. }
  469. this.b2j = function (bin) {
  470. return new bin_to_powert(bin);
  471. }
  472. };
  473. var BIN=new function() {
  474. this.hdr = new XXX.hdr();
  475. this.paras = new XXX.paras();
  476. this.powerc = new XXX.powerc();
  477. this.powert = new XXX.powert();
  478. }();
  479. //////////////////////////////////////////
  480. function LOG(){
  481. var data = [];
  482. for(var i= 1,len=arguments.length;i<len;i++){
  483. data.push(arguments[i])
  484. }
  485. console.log(data);
  486. }
  487. var PKT_TYPE=function(){
  488. var len = 0;
  489. return {
  490. PKT_TYPE_ACK:len++,
  491. PKT_TYPE_PARAS:len++,
  492. PKT_TYPE_POWER_CH:len++, //power_ch_t
  493. PKT_TYPE_POWER_TOTAL:len++, //power_total_t
  494. PKT_TYPE_SENSOR:len++,
  495. PKT_TYPE_BREAKER:len++,
  496. PKT_TYPE_STAT:len++,
  497. PKT_TYPE_MESG:len++,
  498. PKT_TYPE_FILE:len++,
  499. }
  500. }();
  501. function WS(url,fn) {
  502. this.url = url;
  503. this.name = 'myWebs';
  504. this.open = _open;
  505. this.reopen = _reopen;
  506. this.close = _close;
  507. this.send = _send;
  508. this.state = _state;
  509. this.setcb = _setcb;
  510. this.closeCount = 0;
  511. this.maxConnect = 100;
  512. var his = this;
  513. this.open();
  514. function _open() {
  515. console.log("____ url: \n", his.url);
  516. his.ws = new WebSocket(his.url);
  517. his.ws.binaryType = 'arraybuffer';
  518. his.ws.onopen = _onopen;
  519. his.ws.onclose = _onclose;
  520. his.ws.onmessage = _onmsg;
  521. his.ws.onerror = _onerror;
  522. }
  523. function _reopen() {
  524. _close();
  525. _open(his.url);
  526. }
  527. function _close() {
  528. his.ws.close();
  529. }
  530. function _send(msg) {
  531. if (his.ws.readyState != WebSocket.OPEN)
  532. return;
  533. his.ws.send(msg);
  534. }
  535. function _state() {
  536. return his.ws.readyState;
  537. }
  538. function _setcb(tp, f) {
  539. switch (tp) {
  540. case "open":
  541. his.ws.onopen = f;
  542. break;
  543. case "close":
  544. his.ws.onclose = f;
  545. break;
  546. case "msg":
  547. his.ws.onmessage = f;
  548. break;
  549. case "err":
  550. his.ws.onerror = f;
  551. break;
  552. }
  553. }
  554. function _onopen(evt) {
  555. his.closeCount = 0;
  556. console.log("___ ws.onopen");
  557. }
  558. function _onclose(evt) {
  559. LOG("ws.onclose");
  560. setTimeout(_reopen, 3000);
  561. his.closeCount += 1;
  562. }
  563. function _onmsg(evt) {
  564. console.log("___ ws.onmsg");
  565. if (evt.data instanceof ArrayBuffer) {
  566. fn(evt.data);
  567. }
  568. }
  569. function _onerror(evt) {
  570. console.log("___ ws.onerror");
  571. //write_scr('<span style="color: red;">ERROR:</span> '+ evt.data);
  572. }
  573. }