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.

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