websocket快速操作工具
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

1153 lines
37 KiB

2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8" />
  5. <meta http-equiv="X-UA-Compatible" content="IE=edge" />
  6. <meta name="viewport" content="width=device-width, initial-scale=1.0" />
  7. <script src="
  8. https://cdn.jsdelivr.net/npm/json-formatter-js@2.3.4/dist/json-formatter.umd.min.js
  9. "></script>
  10. <title>Document</title>
  11. <style>
  12. *,
  13. html,
  14. body {
  15. margin: 0;
  16. padding: 0;
  17. box-sizing: border-box;
  18. }
  19. li {
  20. list-style: none;
  21. }
  22. .container {
  23. display: flex;
  24. width: 100vw;
  25. align-items: center;
  26. box-sizing: border-box;
  27. justify-content: space-between;
  28. }
  29. .left_chat {
  30. border: solid 1px #000;
  31. height: 100vh;
  32. display: flex;
  33. box-sizing: border-box;
  34. flex-direction: column;
  35. padding: 24px;
  36. overflow: scroll;
  37. width: 500px;
  38. min-width: 500px;
  39. }
  40. .right_message {
  41. height: 100vh;
  42. box-sizing: border-box;
  43. flex: 1;
  44. max-width: calc(100vw - 500px);
  45. }
  46. .btn {
  47. padding: 36px;
  48. font-size: 24px;
  49. margin-top: 24px;
  50. width: 100%;
  51. }
  52. .right_message {
  53. padding: 24px;
  54. border: solid 1px #000;
  55. display: flex;
  56. flex-direction: column;
  57. }
  58. .message_wrap {
  59. flex: 1;
  60. border: solid 1px #ddd;
  61. overflow: scroll;
  62. }
  63. .message {
  64. padding: 6px 8px;
  65. border-bottom: solid 1px #ddd;
  66. }
  67. .input_wrap {
  68. display: flex;
  69. align-items: center;
  70. /* margin-bottom: 20px; */
  71. }
  72. .input_wrap .ws_connnect {
  73. flex: 2;
  74. padding: 4px 0;
  75. margin-right: 20px;
  76. }
  77. .input_wrap .connect {
  78. flex: 1;
  79. }
  80. .order {
  81. display: grid;
  82. grid-template-columns: repeat(1, 1fr);
  83. column-gap: 20px;
  84. row-gap: 10px;
  85. margin-bottom: 20px;
  86. }
  87. .status {
  88. padding: 4px 0;
  89. border-bottom: solid 2px #ddd;
  90. margin-bottom: 10px;
  91. }
  92. .tabs {
  93. margin: 20px 0;
  94. }
  95. .tab-bar {
  96. display: flex;
  97. }
  98. .tab {
  99. padding: 10px 20px;
  100. border: 1px solid #ccc;
  101. border-bottom: none;
  102. cursor: pointer;
  103. }
  104. /* .active {
  105. border-bottom: 2px solid blue;
  106. } */
  107. .tab-panel {
  108. display: none;
  109. padding: 20px;
  110. border: 1px solid #ccc;
  111. }
  112. .active {
  113. display: block;
  114. }
  115. .common_order_input {
  116. display: flex;
  117. align-items: center;
  118. justify-content: space-evenly;
  119. padding: 0 20px;
  120. margin-bottom: 10px;
  121. }
  122. .common_order_input .single {
  123. display: flex;
  124. flex-direction: column;
  125. align-items: center;
  126. }
  127. .single .input {
  128. width: 100%;
  129. text-align: center;
  130. padding: 4px;
  131. }
  132. .common_btns {
  133. width: 100%;
  134. }
  135. .btn_c {
  136. width: 100%;
  137. padding: 4px 0;
  138. margin-bottom: 10px;
  139. }
  140. .report_c {
  141. border: solid 1px #ddd;
  142. padding: 10px;
  143. }
  144. .form_line {
  145. display: flex;
  146. align-items: center;
  147. width: 100%;
  148. margin-bottom: 10px;
  149. }
  150. .form_line .tit {
  151. margin-right: 6px;
  152. white-space: nowrap;
  153. }
  154. .form_line .info {
  155. width: 100%;
  156. text-align: center;
  157. padding: 4px 0;
  158. }
  159. .report_c .title {
  160. border-bottom: solid 1px #ddd;
  161. margin-bottom: 10px;
  162. }
  163. .mod-tab .tab_top {
  164. float: left;
  165. padding: 5px 20px;
  166. border-top: 1px solid #ccc;
  167. border-left: 1px solid #ccc;
  168. background-color: #ddd;
  169. }
  170. .header .tab_top:last-child {
  171. border-right: 1px solid #ccc;
  172. }
  173. .content {
  174. border: 1px solid #ccc;
  175. width: 100%;
  176. height: 100%;
  177. }
  178. .header::after {
  179. content: "";
  180. display: block;
  181. clear: both;
  182. }
  183. .mod-tab .header .active {
  184. background-color: #fff;
  185. }
  186. .mod-tab .content .panel {
  187. display: none;
  188. }
  189. .mod-tab .content .active {
  190. display: block;
  191. }
  192. .card_container {
  193. padding: 0 10px;
  194. }
  195. .card_container .title {
  196. margin-bottom: 10px;
  197. border-bottom: solid 1px #ddd;
  198. }
  199. .card_container .form {
  200. display: flex;
  201. margin-bottom: 10px;
  202. align-items: center;
  203. justify-content: space-between;
  204. }
  205. .card_container .form .label {
  206. white-space: nowrap;
  207. margin-right: 10px;
  208. }
  209. .card_container .form .input {
  210. flex: 1;
  211. padding: 4px 0;
  212. text-align: center;
  213. }
  214. .card_container .form .btn {
  215. padding: 0;
  216. margin: 0;
  217. width: 40px;
  218. margin-left: 10px;
  219. }
  220. .card_container .form .input_config {
  221. width: 60px;
  222. padding: 4px 0;
  223. text-align: center;
  224. }
  225. </style>
  226. </head>
  227. <body>
  228. <div class="container">
  229. <div class="left_chat">
  230. <div class="input_wrap">
  231. <input type="text" class="ws_connnect" id="ws_connnect_input" />
  232. <button class="connect" onclick="connectWs()">连接</button>
  233. </div>
  234. <p class="status" id="status">当前状态: 未连接</p>
  235. <div class="mod-tab">
  236. <div class="header">
  237. <button class="tab_top active button1">基本控制</button>
  238. <button class="tab_top button2">舵机控制</button>
  239. <button class="tab_top button3">电机控制</button>
  240. </div>
  241. <div class="content">
  242. <div class="panel active">
  243. <div class="report_c">
  244. <p class="title">上报解析</p>
  245. <div class="form_line">
  246. <p class="tit">ADDRESS:</p>
  247. <input
  248. type="text"
  249. class="info"
  250. disabled
  251. id="report_address"
  252. />
  253. </div>
  254. <div class="form_line">
  255. <p class="tit">VALUE:</p>
  256. <input type="text" class="info" disabled id="report_val" />
  257. </div>
  258. </div>
  259. <div class="report_c">
  260. <p class="title">回执解析</p>
  261. <div class="form_line">
  262. <p class="tit">ADDRESS:</p>
  263. <input
  264. type="text"
  265. class="info"
  266. disabled
  267. id="receipt_address"
  268. />
  269. </div>
  270. <div class="form_line">
  271. <p class="tit">VALUE:</p>
  272. <input type="text" class="info" disabled id="receipt_val" />
  273. </div>
  274. <div class="form_line">
  275. <p class="tit">结果:</p>
  276. <input
  277. type="text"
  278. class="info"
  279. value="无"
  280. disabled
  281. id="receipt_message"
  282. />
  283. </div>
  284. </div>
  285. <div class="tabs">
  286. <ul class="tab-bar">
  287. <li class="tab active">通用指令</li>
  288. <li class="tab">指令列表</li>
  289. </ul>
  290. <div class="tab-content">
  291. <div class="tab-panel active">
  292. <div class="common_order_input">
  293. <div class="single">
  294. <p>ID</p>
  295. <input type="text" class="input" id="common_id" />
  296. </div>
  297. <div
  298. class="single"
  299. style="margin-left: 10px; margin-right: 5px"
  300. >
  301. <p>BASE</p>
  302. <input type="text" class="input" id="common_base" />
  303. </div>
  304. <div
  305. class="single"
  306. style="margin-left: 5px; margin-right: 10px"
  307. >
  308. <p>OFFSET</p>
  309. <input type="text" class="input" id="common_off" />
  310. </div>
  311. <div class="single">
  312. <p>VALUE</p>
  313. <input type="text" class="input" id="common_value" />
  314. </div>
  315. </div>
  316. <div class="common_btns">
  317. <button class="btn_c" onclick="writeFun()"></button>
  318. <button class="btn_c" onclick="read()"></button>
  319. <button class="btn_c" onclick="autoReport()">
  320. 使能自动上报
  321. </button>
  322. <button class="btn_c" onclick="reportCycle()">
  323. 设置上报周期
  324. </button>
  325. </div>
  326. </div>
  327. <div class="tab-panel">
  328. <div class="order" id="order"></div>
  329. </div>
  330. </div>
  331. </div>
  332. </div>
  333. <div class="panel">
  334. <div
  335. class="common_order_input"
  336. style="border-bottom: solid 2px #ddd; padding-bottom: 10px"
  337. >
  338. <div class="single">
  339. <p>ID</p>
  340. <input type="text" class="input" id="duoji_id" />
  341. </div>
  342. <div
  343. class="single"
  344. style="margin-left: 10px; margin-right: 5px"
  345. >
  346. <p>BASE</p>
  347. <input type="text" class="input" id="duoji_base" />
  348. </div>
  349. <div
  350. class="single"
  351. style="margin-left: 5px; margin-right: 10px"
  352. >
  353. <p>OFFSET</p>
  354. <input type="text" class="input" id="duoji_offset" />
  355. </div>
  356. </div>
  357. <div class="card_container">
  358. <h3 class="title">状态</h3>
  359. <div class="form">
  360. <p class="label">异常</p>
  361. <input type="text" class="input" id="duoji_exception" />
  362. <button
  363. class="btn"
  364. onclick="readValue('#duoji_exception', 'read')"
  365. >
  366. </button>
  367. </div>
  368. <div class="form">
  369. <p class="label">状态</p>
  370. <input type="text" class="input" id="duoji_status" />
  371. <button
  372. class="btn"
  373. onclick="readValue('#duoji_status', 'read')"
  374. >
  375. </button>
  376. </div>
  377. <div class="form">
  378. <p class="label">位置</p>
  379. <input type="text" class="input" id="duoji_position" />
  380. <button
  381. class="btn"
  382. onclick="readValue('#duoji_position', 'read')"
  383. >
  384. </button>
  385. </div>
  386. </div>
  387. <div class="card_container">
  388. <h3 class="title">配置</h3>
  389. <div class="form">
  390. <p class="label">反复运动启始位置</p>
  391. <input type="text" id="duoji_config_1" class="input_config" />
  392. <button
  393. class="btn"
  394. onclick="readValue('#duoji_config_1', 'read')"
  395. >
  396. </button>
  397. <button
  398. class="btn"
  399. onclick="readValue('#duoji_config_1', 'write')"
  400. >
  401. </button>
  402. </div>
  403. <div class="form">
  404. <p class="label">反复运动终止位置</p>
  405. <input type="text" class="input_config" id="duoji_config_2" />
  406. <button
  407. class="btn"
  408. onclick="readValue('#duoji_config_2', 'read')"
  409. >
  410. </button>
  411. <button
  412. class="btn"
  413. onclick="readValue('#duoji_config_2', 'write')"
  414. >
  415. </button>
  416. </div>
  417. <div class="form">
  418. <p class="label">运行时速度配置</p>
  419. <input type="text" class="input_config" id="duoji_config_3" />
  420. <button
  421. class="btn"
  422. onclick="readValue('#duoji_config_3', 'read')"
  423. >
  424. </button>
  425. <button
  426. class="btn"
  427. onclick="readValue('#duoji_config_3', 'write')"
  428. >
  429. </button>
  430. </div>
  431. </div>
  432. <div class="card_container">
  433. <h3 class="title">动作</h3>
  434. <div class="form">
  435. <p class="label">舵机移动到角度</p>
  436. <input type="text" class="input" id="duoji_move_1" />
  437. <button
  438. class="btn"
  439. onclick="readValue('#duoji_move_1', 'write')"
  440. >
  441. </button>
  442. </div>
  443. <div class="form">
  444. <p class="label">舵机停止</p>
  445. <input type="text" class="input" id="duoji_move_2" />
  446. <button
  447. class="btn"
  448. onclick="readValue('#duoji_move_2', 'write')"
  449. >
  450. </button>
  451. </div>
  452. <div class="form">
  453. <p class="label">清除异常</p>
  454. <input type="text" class="input" id="duoji_move_3" />
  455. <button
  456. class="btn"
  457. onclick="readValue('#duoji_move_3', 'write')"
  458. >
  459. </button>
  460. </div>
  461. <div class="form">
  462. <p class="label">反复运动</p>
  463. <input type="text" class="input" id="duoji_move_4" />
  464. <button
  465. class="btn"
  466. onclick="readValue('#duoji_move_4', 'write')"
  467. >
  468. </button>
  469. </div>
  470. </div>
  471. </div>
  472. <div class="panel">
  473. <div
  474. class="common_order_input"
  475. style="border-bottom: solid 2px #ddd; padding-bottom: 10px"
  476. >
  477. <div class="single">
  478. <p>ID</p>
  479. <input type="text" class="input" id="dianji_id" />
  480. </div>
  481. <div
  482. class="single"
  483. style="margin-left: 10px; margin-right: 5px"
  484. >
  485. <p>BASE</p>
  486. <input type="text" class="input" id="dianji_base" />
  487. </div>
  488. <div
  489. class="single"
  490. style="margin-left: 5px; margin-right: 10px"
  491. >
  492. <p>OFFSET</p>
  493. <input type="text" class="input" id="dianji_offset" />
  494. </div>
  495. </div>
  496. <div class="card_container">
  497. <h3 class="title">状态</h3>
  498. <div class="form">
  499. <p class="label">设备状态</p>
  500. <input type="text" class="input" id="dianji_status_1" />
  501. <button
  502. class="btn"
  503. onclick="readValueD('#dianji_status_1', 'read')"
  504. >
  505. </button>
  506. </div>
  507. <div class="form">
  508. <p class="label">异常状态</p>
  509. <input type="text" class="input" id="dianji_status_2" />
  510. <button
  511. class="btn"
  512. onclick="readValueD('#dianji_status_2', 'read')"
  513. >
  514. </button>
  515. </div>
  516. <div class="form">
  517. <p class="label">当前转速</p>
  518. <input type="text" class="input" id="dianji_status_3" />
  519. <button
  520. class="btn"
  521. onclick="readValueD('#dianji_status_3', 'read')"
  522. >
  523. </button>
  524. </div>
  525. <div class="form">
  526. <p class="label">当前位置</p>
  527. <input type="text" class="input" id="dianji_status_4" />
  528. <button
  529. class="btn"
  530. onclick="readValueD('#dianji_status_4', 'read')"
  531. >
  532. </button>
  533. </div>
  534. </div>
  535. <div class="card_container">
  536. <h3 class="title">配置</h3>
  537. <div class="form">
  538. <p class="label">加速度</p>
  539. <input
  540. type="text"
  541. class="input_config"
  542. id="dianji_config_1"
  543. />
  544. <button
  545. class="btn"
  546. onclick="readValueD('#dianji_config_1', 'read')"
  547. >
  548. </button>
  549. <button
  550. class="btn"
  551. onclick="readValueD('#dianji_config_1', 'write')"
  552. >
  553. </button>
  554. </div>
  555. <div class="form">
  556. <p class="label">减速度</p>
  557. <input
  558. type="text"
  559. class="input_config"
  560. id="dianji_config_2"
  561. />
  562. <button
  563. class="btn"
  564. onclick="readValueD('#dianji_config_2', 'read')"
  565. >
  566. </button>
  567. <button
  568. class="btn"
  569. onclick="readValueD('#dianji_config_2', 'write')"
  570. >
  571. </button>
  572. </div>
  573. <div class="form">
  574. <p class="label">速度</p>
  575. <input
  576. type="text"
  577. class="input_config"
  578. id="dianji_config_3"
  579. />
  580. <button
  581. class="btn"
  582. onclick="readValueD('#dianji_config_3', 'read')"
  583. >
  584. </button>
  585. <button
  586. class="btn"
  587. onclick="readValueD('#dianji_config_3', 'write')"
  588. >
  589. </button>
  590. </div>
  591. <div class="form">
  592. <p class="label">零点偏移</p>
  593. <input
  594. type="text"
  595. class="input_config"
  596. id="dianji_config_4"
  597. />
  598. <button
  599. class="btn"
  600. onclick="readValueD('#dianji_config_4', 'read')"
  601. >
  602. </button>
  603. <button
  604. class="btn"
  605. onclick="readValueD('#dianji_config_4', 'write')"
  606. >
  607. </button>
  608. </div>
  609. <div class="form">
  610. <p class="label">归零速度</p>
  611. <input
  612. type="text"
  613. class="input_config"
  614. id="dianji_config_5"
  615. />
  616. <button
  617. class="btn"
  618. onclick="readValueD('#dianji_config_5', 'read')"
  619. >
  620. </button>
  621. <button
  622. class="btn"
  623. onclick="readValueD('#dianji_config_5', 'write')"
  624. >
  625. </button>
  626. </div>
  627. <div class="form">
  628. <p class="label">归零减速度</p>
  629. <input
  630. type="text"
  631. class="input_config"
  632. id="dianji_config_6"
  633. />
  634. <button
  635. class="btn"
  636. onclick="readValueD('#dianji_config_6', 'read')"
  637. >
  638. </button>
  639. <button
  640. class="btn"
  641. onclick="readValueD('#dianji_config_6', 'write')"
  642. >
  643. </button>
  644. </div>
  645. <div class="form">
  646. <p class="label">归零最大位移</p>
  647. <input
  648. type="text"
  649. class="input_config"
  650. id="dianji_config_7"
  651. />
  652. <button
  653. class="btn"
  654. onclick="readValueD('#dianji_config_7', 'read')"
  655. >
  656. </button>
  657. <button
  658. class="btn"
  659. onclick="readValueD('#dianji_config_7', 'write')"
  660. >
  661. </button>
  662. </div>
  663. <div class="form">
  664. <p class="label">归零第一阶段移动距离</p>
  665. <input
  666. type="text"
  667. class="input_config"
  668. id="dianji_config_8"
  669. />
  670. <button
  671. class="btn"
  672. onclick="readValueD('#dianji_config_8', 'read')"
  673. >
  674. </button>
  675. <button
  676. class="btn"
  677. onclick="readValueD('#dianji_config_8', 'write')"
  678. >
  679. </button>
  680. </div>
  681. </div>
  682. <div class="card_container">
  683. <h3 class="title">动作</h3>
  684. <div class="form">
  685. <p class="label">速度模式控制</p>
  686. <input type="text" class="input" id="dianji_move_1" />
  687. <button
  688. class="btn"
  689. onclick="readValueD('#dianji_move_1', 'write')"
  690. >
  691. </button>
  692. </div>
  693. <div class="form">
  694. <p class="label">位置模式控制</p>
  695. <input type="text" class="input" id="dianji_move_2" />
  696. <button
  697. class="btn"
  698. onclick="readValueD('#dianji_move_2', 'write')"
  699. >
  700. </button>
  701. </div>
  702. <div class="form">
  703. <p class="label">位置模式相对位置</p>
  704. <input type="text" class="input" id="dianji_move_3" />
  705. <button
  706. class="btn"
  707. onclick="readValueD('#dianji_move_3', 'write')"
  708. >
  709. </button>
  710. </div>
  711. <div class="form">
  712. <p class="label">归零</p>
  713. <input type="text" class="input" id="dianji_move_4" />
  714. <button
  715. class="btn"
  716. onclick="readValueD('#dianji_move_4', 'write')"
  717. >
  718. </button>
  719. </div>
  720. <div class="form">
  721. <p class="label">零位校准</p>
  722. <input type="text" class="input" id="dianji_move_5" />
  723. <button
  724. class="btn"
  725. onclick="readValueD('#dianji_move_5', 'write')"
  726. >
  727. </button>
  728. </div>
  729. <div class="form">
  730. <p class="label">停止</p>
  731. <input type="text" class="input" id="dianji_move_6" />
  732. <button
  733. class="btn"
  734. onclick="readValueD('#dianji_move_6', 'write')"
  735. >
  736. </button>
  737. </div>
  738. <div class="form">
  739. <p class="label">清空异常</p>
  740. <input type="text" class="input" id="dianji_move_7" />
  741. <button
  742. class="btn"
  743. onclick="readValueD('#dianji_move_7', 'write')"
  744. >
  745. </button>
  746. </div>
  747. </div>
  748. </div>
  749. </div>
  750. </div>
  751. </div>
  752. <div class="right_message">
  753. <div class="message_wrap" id="message_wrap"></div>
  754. <div style="display: flex; align-items: center; margin-top: 10px">
  755. <textarea style="flex: 1" name="bio" rows="15" cols="40"></textarea>
  756. <div style="display: flex; flex-direction: column; height: 100%">
  757. <button style="flex: 1" onclick="sendMessage()">发送</button>
  758. <button style="flex: 1" onclick="clearTextArea()">清空</button>
  759. </div>
  760. </div>
  761. </div>
  762. </div>
  763. </body>
  764. <script src="./config.js"></script>
  765. <script>
  766. window.onload = () => {
  767. const commonI = document.querySelector("#common_id");
  768. const commonB = document.querySelector("#common_base");
  769. const dianI = document.querySelector("#dianji_id");
  770. const dianB = document.querySelector("#dianji_base");
  771. const duoI = document.querySelector("#duoji_id");
  772. const duoB = document.querySelector("#duoji_base");
  773. commonI.value = localStorage.getItem("id");
  774. commonB.value = localStorage.getItem("base");
  775. dianI.value = localStorage.getItem("d_id");
  776. dianB.value = localStorage.getItem("d_base");
  777. duoI.value = localStorage.getItem("du_id");
  778. duoB.value = localStorage.getItem("du_base");
  779. };
  780. var ws = null;
  781. const websocketInput = document.querySelector("#ws_connnect_input");
  782. websocketInput.value = websocketAddress;
  783. // 先向order下动态添加指令集合
  784. const order = document.querySelector("#order");
  785. for (let key in config) {
  786. const button = document.createElement("button");
  787. button.textContent = key;
  788. button.className = "order_btn";
  789. button.setAttribute("v", key);
  790. order?.appendChild(button);
  791. }
  792. order.addEventListener("click", (e) => {
  793. const item = e.target;
  794. if (item && item.getAttribute("v")) {
  795. const key = item.getAttribute("v");
  796. sendOrder(config[key]);
  797. }
  798. });
  799. const commonI = document.querySelector("#common_id");
  800. const commonB = document.querySelector("#common_base");
  801. const dianI = document.querySelector("#dianji_id");
  802. const dianB = document.querySelector("#dianji_base");
  803. const duoI = document.querySelector("#duoji_id");
  804. const duoB = document.querySelector("#duoji_base");
  805. commonI.addEventListener("input", (e) => {
  806. localStorage.setItem("id", e.target.value);
  807. });
  808. commonB.addEventListener("input", (e) => {
  809. localStorage.setItem("base", e.target.value);
  810. });
  811. dianI.addEventListener("input", (e) => {
  812. localStorage.setItem("d_id", e.target.value);
  813. });
  814. dianB.addEventListener("input", (e) => {
  815. localStorage.setItem("d_base", e.target.value);
  816. });
  817. duoI.addEventListener("input", (e) => {
  818. localStorage.setItem("du_id", e.target.value);
  819. });
  820. duoB.addEventListener("input", (e) => {
  821. localStorage.setItem("du_base", e.target.value);
  822. });
  823. const tabs = document.querySelector(".tabs");
  824. const tabBars = document.querySelectorAll(".tab-bar .tab");
  825. const tabPanels = document.querySelectorAll(".tab-content .tab-panel");
  826. for (let i = 0; i < tabBars.length; i++) {
  827. tabBars[i].onclick = function () {
  828. removeActive();
  829. this.classList.add("active");
  830. tabPanels[i].classList.add("active");
  831. };
  832. }
  833. function removeActive() {
  834. for (let i = 0; i < tabBars.length; i++) {
  835. tabBars[i].classList.remove("active");
  836. tabPanels[i].classList.remove("active");
  837. }
  838. }
  839. const clearMessage = () => {
  840. const messageWrap = document.querySelector("#message_wrap");
  841. messageWrap.innerHTML = "";
  842. };
  843. const clearTextArea = () => {
  844. const textArea = document.querySelector("textarea");
  845. textArea.value = "";
  846. clearMessage();
  847. };
  848. const sendMessage = () => {
  849. if (ws) {
  850. const textArea = document.querySelector("textarea");
  851. const messageVal = textArea.value;
  852. ws.send(messageVal);
  853. const messageWrap = document.querySelector("#message_wrap");
  854. const div = document.createElement("div");
  855. div.classList = ["message"];
  856. div.textContent = `Tx: ${messageVal}`;
  857. messageWrap.appendChild(div);
  858. messageWrap.scrollTop =
  859. messageWrap.scrollHeight - messageWrap.clientHeight;
  860. } else {
  861. }
  862. };
  863. const transValToName = (val) => {
  864. switch (val) {
  865. case 0x00:
  866. return "kSuccess";
  867. case 2:
  868. return "kRegNotFound";
  869. case 3:
  870. return "kRegNotWritable";
  871. case 4:
  872. return "kRegNotReadable";
  873. case 5:
  874. return "kIllegalValue";
  875. case 6:
  876. return "kDeviceBusy";
  877. case 7:
  878. return "kDeviceException";
  879. case 8:
  880. return "kChannelDeviceException";
  881. case 9:
  882. return "kParameterError";
  883. case 10:
  884. return "kOvertime";
  885. case 11:
  886. return "kOperationInvalid";
  887. case 12:
  888. return "kunsupportOperation";
  889. case 13:
  890. return "kIllegalOperation";
  891. case 14:
  892. return "kPermissionDenied";
  893. case 15:
  894. return "koutOfRange";
  895. case 16:
  896. return "kmotorNotRunToHome";
  897. case 17:
  898. return "kParameterOutOfLimit";
  899. }
  900. };
  901. const connectWs = () => {
  902. console.log(123);
  903. const input = document.querySelector("#ws_connnect_input");
  904. const status = document.querySelector("#status");
  905. const address = input.value;
  906. try {
  907. ws = new WebSocket(address);
  908. ws.onopen = function () {
  909. console.log("Connected to WebSocket server.");
  910. // 改变状态
  911. status.innerHTML = `当前状态: 已连接${address}`;
  912. };
  913. ws.onmessage = function (evt) {
  914. const messageWrap = document.querySelector("#message_wrap");
  915. const div = document.createElement("div");
  916. div.classList = ["message"];
  917. const formatter = new JSONFormatter(JSON.parse(evt.data), 2);
  918. const formatted = formatter.render();
  919. // div.textContent = `Rx: ${evt.data}`;
  920. const p = document.createElement("p");
  921. p.innerHTML = `Rx:`;
  922. p.style.background = "#ddd";
  923. messageWrap.appendChild(p);
  924. messageWrap.appendChild(formatted);
  925. messageWrap.scrollTop =
  926. messageWrap.scrollHeight - messageWrap.clientHeight;
  927. // 对消息进行处理
  928. try {
  929. const { message: messageBody } = JSON.parse(evt.data);
  930. const { type, ctrlPointAddr, ctrlPointVal } = messageBody;
  931. const receiptMessage = document.querySelector("#receipt_message");
  932. const receiptAddress = document.querySelector("#receipt_address");
  933. const receiptVal = document.querySelector("#receipt_val");
  934. const reportAddress = document.querySelector("#report_address");
  935. const reportVal = document.querySelector("#report_val");
  936. if (type == "receipt") {
  937. receiptMessage.value = "正确";
  938. receiptAddress.value = ctrlPointAddr;
  939. receiptVal.value = ctrlPointVal;
  940. }
  941. if (type == "error_receipt") {
  942. receiptMessage.value = "错误";
  943. receiptAddress.value = ctrlPointAddr;
  944. // 错误回执需要吧值和英文进行对应
  945. receiptVal.value = transValToName(ctrlPointVal);
  946. }
  947. if (type == "report") {
  948. reportAddress.value = ctrlPointAddr;
  949. reportVal.value = ctrlPointVal;
  950. }
  951. } catch (error) {
  952. console.log(error);
  953. }
  954. };
  955. ws.onclose = function () {
  956. status.innerHTML = `当前状态: 已关闭`;
  957. };
  958. } catch (error) {
  959. status.innerHTML = `当前状态: 连接错误`;
  960. }
  961. };
  962. const sendOrder = (msg) => {
  963. if (ws) {
  964. ws.send(msg);
  965. const messageWrap = document.querySelector("#message_wrap");
  966. const div = document.createElement("div");
  967. div.classList = ["message"];
  968. const formatter = new JSONFormatter(JSON.parse(msg), 2);
  969. const formatted = formatter.render();
  970. const p = document.createElement("p");
  971. p.innerHTML = `Tx:`;
  972. p.style.background = "#ddd";
  973. messageWrap.appendChild(p);
  974. messageWrap.appendChild(formatted);
  975. messageWrap.scrollTop =
  976. messageWrap.scrollHeight - messageWrap.clientHeight;
  977. }
  978. };
  979. const getCommonOrderInput = (type) => {
  980. const id = document.querySelector("#common_id");
  981. const base = document.querySelector("#common_base");
  982. const off = document.querySelector("#common_off");
  983. const value = document.querySelector("#common_value");
  984. const { protocol, message } = commonMessage;
  985. return JSON.stringify({
  986. protocol,
  987. message: {
  988. ...message,
  989. targetId: parseInt(id.value),
  990. ctrlPointAddr: parseInt(base.value) + parseInt(off.value),
  991. ctrlPointVal: parseInt(value.value),
  992. type,
  993. },
  994. });
  995. };
  996. const writeFun = () => {
  997. const msg = getCommonOrderInput("write");
  998. sendOrder(msg);
  999. };
  1000. const read = () => {
  1001. const msg = getCommonOrderInput("read");
  1002. sendOrder(msg);
  1003. };
  1004. const autoReport = () => {
  1005. const msg = getCommonOrderInput("set_auto_report_enable_flag");
  1006. sendOrder(msg);
  1007. };
  1008. const reportCycle = () => {
  1009. const msg = getCommonOrderInput("set_auto_report_period");
  1010. sendOrder(msg);
  1011. };
  1012. document.querySelectorAll(".tab_top").forEach(function (node) {
  1013. node.addEventListener("click", function () {
  1014. var index;
  1015. this.parentElement
  1016. .querySelectorAll(".tab_top")
  1017. .forEach(function (e, inx) {
  1018. //e.style.display='none' 跳转的时候隐藏按钮
  1019. e.classList.remove("active");
  1020. if (node === e) {
  1021. index = inx;
  1022. }
  1023. });
  1024. this.classList.add("active");
  1025. this.parentElement.nextElementSibling
  1026. .querySelectorAll(".panel")
  1027. .forEach(function (panel) {
  1028. panel.classList.remove("active");
  1029. });
  1030. this.parentElement.nextElementSibling
  1031. .querySelectorAll(".panel")
  1032. [index].classList.add("active");
  1033. });
  1034. });
  1035. </script>
  1036. <script>
  1037. // 舵机封装读写方法
  1038. const readValue = (id, type) => {
  1039. const duoId = document.querySelector("#duoji_id");
  1040. const duoBase = document.querySelector("#duoji_base");
  1041. const duoOff = document.querySelector("#duoji_offset");
  1042. const ele = document.querySelector(id);
  1043. const { protocol, message } = commonMessage;
  1044. let addr = 0;
  1045. if (duoBase.value && duoOff.value) {
  1046. addr = parseInt(duoBase.value) + parseInt(duoOff.value);
  1047. } else {
  1048. addr = parseInt(duoBase.value);
  1049. }
  1050. const msg = JSON.stringify({
  1051. protocol,
  1052. message: {
  1053. ...message,
  1054. targetId: parseInt(duoId.value),
  1055. ctrlPointAddr: addr,
  1056. ctrlPointVal: parseInt(ele.value),
  1057. type,
  1058. },
  1059. });
  1060. sendOrder(msg);
  1061. };
  1062. </script>
  1063. <script>
  1064. // 电机js
  1065. const readValueD = (id, type) => {
  1066. const duoId = document.querySelector("#dianji_id");
  1067. const duoBase = document.querySelector("#dianji_base");
  1068. const duoOff = document.querySelector("#dianji_offset");
  1069. const ele = document.querySelector(id);
  1070. const { protocol, message } = commonMessage;
  1071. let addr = null;
  1072. if (duoBase.value && duoOff.value) {
  1073. addr = parseInt(duoBase.value) + parseInt(duoOff.value);
  1074. } else {
  1075. addr = parseInt(duoBase.value);
  1076. }
  1077. console.log(addr);
  1078. const msg = JSON.stringify({
  1079. protocol,
  1080. message: {
  1081. ...message,
  1082. targetId: parseInt(duoId.value),
  1083. ctrlPointAddr: addr,
  1084. ctrlPointVal: parseInt(ele.value),
  1085. type,
  1086. },
  1087. });
  1088. sendOrder(msg);
  1089. };
  1090. </script>
  1091. </html>