TTSDK.js 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911
  1. const event = require('./event');
  2. const penDataHandle = require('./penDataHandle');
  3. const utils = require('./utils');
  4. class TTSDK {
  5. constructor() {
  6. // 离线接收进行量
  7. this.gofflineDataProgress = 0
  8. // 离线数据量
  9. this.offlineDataNum = 0
  10. // 进度
  11. this.gefflineCounter = 0
  12. // 已连接蓝牙deviceId
  13. this.connectDeviceId = null
  14. // 已连接serviceid
  15. this.connectServiceId = null
  16. // 已连接characteristicId
  17. this.connectCharacteristicId = null
  18. this.finishFlag = false
  19. this.allDevices = {}
  20. this.allDevices.foundDevices = []
  21. this.blueToothOn = false
  22. }
  23. // 监听本地蓝牙状态
  24. listenBlueState(blueToothON) {
  25. tt.onBluetoothAdapterStateChange(res => {
  26. if (res.available) {
  27. tt.offBluetoothAdapterStateChange()
  28. if (blueToothOn) {
  29. blueToothON();
  30. }
  31. }
  32. })
  33. }
  34. // 初始化蓝牙
  35. initBlueTooth(success, fail) {
  36. tt.openBluetoothAdapter({
  37. success: (res) => {
  38. if (success) {
  39. success()
  40. }
  41. },
  42. fail: (res) => {
  43. if (fail) {
  44. fail()
  45. }
  46. }
  47. })
  48. }
  49. // 读取本地蓝牙适配器状态信息
  50. getLocalBlueToothState() {
  51. return tt.getBluetoothAdapterState({
  52. success: (res) => {
  53. return {
  54. isDiscovering: res.discovering,
  55. isAvailable: res.available
  56. }
  57. },
  58. })
  59. }
  60. // 监听连接的蓝牙设备断开
  61. listenBlueConnection() {
  62. tt.onBLEConnectionStateChange((result) => {
  63. if (this.connectDeviceId === result.deviceId && !result.connected) {
  64. event.emit('unConnect', true)
  65. }
  66. })
  67. }
  68. // 搜索附近的蓝牙设备
  69. searchBlueTooth(success, fail) {
  70. tt.startBluetoothDevicesDiscovery({
  71. allowDuplicatesKey: true,
  72. success: (res) => {
  73. if (success) {
  74. success();
  75. }
  76. },
  77. fail: () => {
  78. if (fail) {
  79. fail()
  80. }
  81. }
  82. })
  83. }
  84. // 查找到的设备列表
  85. showBlueToothList(that) {
  86. let flag = true
  87. tt.onBluetoothDeviceFound(res => {
  88. res.devices.forEach(device => {
  89. let penCheck = ab2hex(device.advertisData)
  90. if (penCheck.length < 10) {
  91. return
  92. }
  93. if (penCheck.slice(0, 4).join(':').toUpperCase() !== '31:32:33:34') {
  94. return
  95. }
  96. device.macAddress = penCheck.slice(4, 10).reverse().join(':').toUpperCase();
  97. if (this.allDevices.foundDevices.length !== 0) {
  98. flag = this.allDevices.foundDevices.every((item, index) => {
  99. return item.deviceId !== device.deviceId
  100. })
  101. }
  102. if (flag) {
  103. this.allDevices.foundDevices.push(device)
  104. }
  105. })
  106. // console.log(penData)
  107. that.setData({
  108. blueToothList: this.allDevices
  109. })
  110. })
  111. }
  112. // 停止蓝牙搜索
  113. stopBlueToothSearch(success, fail) {
  114. tt.stopBluetoothDevicesDiscovery({
  115. success: (res) => {
  116. if (success) {
  117. success()
  118. }
  119. },
  120. fail: () => {
  121. if (fail) {
  122. fail()
  123. }
  124. }
  125. })
  126. }
  127. //释放蓝牙
  128. closeBlueTooth(success, fail) {
  129. tt.closeBluetoothAdapter({
  130. success: () => {
  131. if (success) {
  132. success()
  133. }
  134. },
  135. fail: () => {
  136. if (fail) {
  137. fail()
  138. }
  139. }
  140. })
  141. }
  142. // 创建蓝牙连接
  143. createBlueToothConnection(deviceId, success, fail) {
  144. tt.connectBLEDevice({
  145. deviceId,
  146. success: () => {
  147. tt.stopBluetoothDevicesDiscovery({
  148. success: (res) => {
  149. console.log('stop')
  150. },
  151. })
  152. if (success) {
  153. success();
  154. }
  155. },
  156. fail: () => {
  157. if (fail) {
  158. fail();
  159. }
  160. }
  161. });
  162. };
  163. // 断开蓝牙设备
  164. unConnectBlueTooth(deviceId, success, fail) {
  165. tt.disconnectBLEDevice({
  166. deviceId,
  167. success: () => {
  168. if (success) {
  169. success();
  170. }
  171. },
  172. fail: () => {
  173. if (fail) {
  174. fail();
  175. }
  176. }
  177. })
  178. }
  179. // 获取蓝牙色设备服务
  180. getBlueToothService(deviceId, success, fail) {
  181. tt.getBLEDeviceServices({
  182. deviceId,
  183. success: (res) => {
  184. if (success) {
  185. success()
  186. }
  187. },
  188. fail: () => {
  189. if (fail) {
  190. fail()
  191. }
  192. }
  193. })
  194. }
  195. // 获取蓝牙设备某个服务的所有特征值
  196. getBlueToothCharaceristics(deviceId, serviceId) {
  197. tt.getBLEDeviceCharacteristics({
  198. deviceId,
  199. serviceId,
  200. success: (res) => {
  201. res.characteristics.forEach((item) => {
  202. if (item.properties.notify || item.properties.indicate) {
  203. tt.notifyBLECharacteristicValueChange({
  204. state: true,
  205. deviceId,
  206. serviceId,
  207. characteristicId: item.uuid,
  208. success: () => {
  209. console.log('notifyBLECharacteristicValueChange success------: ' + res.errMsg)
  210. }
  211. })
  212. }
  213. // 向蓝牙写数据
  214. if (item.properties.write && item.uuid == '0000F102-0000-1000-8000-00805F9B34FB') {
  215. this.connectDeviceId = deviceId
  216. this.connectServiceId = serviceId
  217. this.connectCharacteristicId = item.uuid
  218. }
  219. })
  220. this.getPenModal();
  221. this.setRTCTime(new Date().getTime())
  222. },
  223. fail: () => {
  224. }
  225. })
  226. // 监听 第一时间获取数据
  227. tt.onBLECharacteristicValueChange((res) => {
  228. switch (res.characteristicId) {
  229. // 实时数据
  230. case "0000FFF1-0000-1000-8000-00805F9B34FB":
  231. var dataArr = ab2hex(characteristic.value)
  232. let dataLength = dataArr.length / 10
  233. for (let i = 0; i < dataLength; i++) {
  234. penDataHandle.splitData(hex2Bytes(dataArr.slice(i * 10, (i + 1) * 10)))
  235. }
  236. break;
  237. // 离线数据
  238. case '0000F202-0000-1000-8000-00805F9B34FB':
  239. let dataArray = ab2hex(res.value)
  240. let dataLength1 = dataArray.length / 10
  241. for (let i = 0; i < dataLength1; i++) {
  242. let newArr = dataArray.slice(i * 10, (i + 1) * 10)
  243. let arr = hex2Bytes(newArr)
  244. penDataHandle.splitData(arr, false)
  245. }
  246. break;
  247. case "0000F101-0000-1000-8000-00805F9B34FB":
  248. let dataArr1 = ab2hex(res.value)
  249. let arr = hex2Bytes(dataArr1);
  250. getDataInfo(arr, this);
  251. break;
  252. default:
  253. break;
  254. }
  255. })
  256. }
  257. // 写入总封装
  258. dealData(index, arrData, success, fail) {
  259. let buffer = new ArrayBuffer(index)
  260. let bufferView = new DataView(buffer)
  261. for (let i = 0; i < index; i++) {
  262. bufferView.setUint8(i, arrData[i])
  263. }
  264. tt.writeBLECharacteristicValue({
  265. characteristicId: this.connectCharacteristicId,
  266. serviceId: this.connectServiceId,
  267. deviceId: this.connectDeviceId,
  268. value: buffer,
  269. success: () => {
  270. if (success) {
  271. success();
  272. }
  273. },
  274. fail: () => {
  275. if (fail) {
  276. fail()
  277. }
  278. }
  279. })
  280. }
  281. // 写入笔名
  282. setPenName(penName, success, fail) {
  283. let strBytesArr = strToUtf8(penName);
  284. let byteLength = strBytesArr.length;
  285. let offLineBuffer = new ArrayBuffer(byteLength + 2);
  286. let DataViews = new DataView(offLineBuffer);
  287. DataViews.setUint8(0, 0xA2);
  288. DataViews.setUint8(1, byteLength);
  289. for (let i = 0; i < byteLength; i++) {
  290. DataViews.setUint8(i + 2, strBytesArr[i])
  291. }
  292. tt.writeBLECharacteristicValue({
  293. characteristicId: this.connectCharacteristicId,
  294. serviceId: this.connectServiceId,
  295. deviceId: this.connectDeviceId,
  296. value: buffer,
  297. success: () => {
  298. if (success) {
  299. success();
  300. }
  301. },
  302. fail: () => {
  303. if (fail) {
  304. fail()
  305. }
  306. }
  307. })
  308. }
  309. // 请求笔名
  310. getPenName(success, fail) {
  311. this.dealData(3, [0xa0, 0x01, 0xff], success, fail)
  312. }
  313. // 获取MAC地址
  314. getMACAddress(success, fail) {
  315. this.dealData(3, [164, 1, 255], success, fail)
  316. }
  317. // 获取蓝牙固件版本
  318. getPenFirmWare(success, fail) {
  319. this.dealData(3, [0xa6, 0x01, 0xff], success, fail)
  320. }
  321. // 获取剩余电量
  322. getPenBattery(success, fail) {
  323. this.dealData(3, [0xa8, 0x01, 0xff], success, fail)
  324. }
  325. // 写入rtc时间
  326. // 传入时间为想改写时间的时间戳
  327. setRTCTime(RTCTime, success, fail) {
  328. let timeStamp = (RTCTime - 1262275200000) / 1000;
  329. console.log(timeStamp, 'timestamp')
  330. this.dealData(6, [0xac, 0x04, timeStamp & 0xff, (timeStamp >> 8) & 0xff, (timeStamp >> 16) & 0xff, (timeStamp >> 24) & 0xff], success, fail);
  331. }
  332. // 请求rtc时间
  333. getRTCTime(success, fail) {
  334. this.dealData(3, [0xaa, 0x01, 0xff], success, fail)
  335. }
  336. // 写入自动关机时间
  337. setPenAutoOff(offTime, success, fail) {
  338. if (offTime > 120 || offTime < 0) {
  339. return console.error('自动关机时间的范围为0~120')
  340. }
  341. this.dealData(4, [0xb2, 0x02, offTime % 256, offTime / 256], success, fail)
  342. }
  343. // 请求自动关机时间
  344. getPenAutoOff(success, fail) {
  345. this.dealData(3, [0xb0, 0x01, 0xff], success, fail)
  346. }
  347. // 获取已使用内存
  348. getPenMemory(success, fail) {
  349. this.dealData(3, [0xb6, 0x01, 0xff], success, fail)
  350. }
  351. // 获取是否点笔开机
  352. getPenClickMode(success, fail) {
  353. this.dealData(3, [0xb8, 0x01, 0xff], success, fail)
  354. }
  355. // 设置点笔开机
  356. setPenClickMode(isClick, success, fail) {
  357. this.dealData(3, [0xba, 0x01, isClick ? 0x01 : 0x00], success, fail)
  358. }
  359. // 设置是否蜂鸣
  360. setPenBeep(isOn, success, fail) {
  361. this.dealData(3, [0xbe, 0x01, isOn ? 0x01 : 0x00], success, fail)
  362. }
  363. // 获取是否蜂鸣
  364. getPenBeep(success, fail) {
  365. this.dealData(3, [0xbc, 0x01, 0xff], success, fail)
  366. }
  367. // 恢复出厂设置
  368. restoreFactory(success, fail) {
  369. this.dealData(3, [0xb4, 0x01, 0xff, success, fail])
  370. }
  371. // 写入压力敏感度
  372. setPenSensor(level, success, fail) {
  373. this.dealData(3, [0xd2, 0x01, level], success, fail)
  374. }
  375. // 获取压力敏感度
  376. getPenSensor(success, fail) {
  377. this.dealData(3, [0xd0, 0x01, 0xff], success, fail)
  378. }
  379. // 设置LED灯颜色
  380. setPenLedColor(color, success, fail) {
  381. this.dealData(3, [0xd6, 0x01, color], success, fail)
  382. }
  383. // 获取led颜色
  384. getPenLedColor(success, fail) {
  385. this.dealData(3, [0xd4, 0x01, 0xff], success, fail)
  386. }
  387. // 获取压力校正值
  388. getPenSensorRegulate(success, fail) {
  389. this.dealData(3, [0xd8, 0x01, 0xff], success, fail)
  390. }
  391. // 获取mcu固件版本
  392. getMCUVersion(success, fail) {
  393. this.dealData(3, [0xda, 0x01, 0xff], success, fail)
  394. }
  395. // 获取笔的类型
  396. getPenModal(success, fail) {
  397. this.dealData(3, [0xe4, 0x01, 0xff], success, fail)
  398. }
  399. // 获取点码类型
  400. getPenPointType(success, fail) {
  401. this.dealData(3, [0xe6, 0x01, 0xff], success, fail)
  402. }
  403. // led设置开关
  404. setLedConfig(isOn, success, fail) {
  405. this.dealData(3, [0xee, 0x01, isOn ? 0x01 : 0x00], success, fail)
  406. }
  407. // 获取led是够可以设置的结果
  408. getLedConfig(success, fail) {
  409. this.dealData(3, [0xec, 0x01, 0xff], success, fail)
  410. }
  411. // 获取离线数据量大小
  412. getPenOfflineDataSize(success, fail) {
  413. this.dealData(3, [0xc0, 0x01, 0xff], success, fail)
  414. }
  415. // 开始获得离线数据
  416. startGetOfflineData(success, fail) {
  417. this.dealData(3, [0xc2, 0x01, 0x00], success, fail)
  418. }
  419. // 停止获得离线数据
  420. stopGetOfflineData(success, fail) {
  421. this.dealData(3, [0xc2, 0x01, 0x01], success, fail)
  422. }
  423. // 暂停获得离线数据
  424. pauseGetOfflineData(success, fail) {
  425. this.dealData(3, [0xcb, 0x01, 0x00], success, fail)
  426. }
  427. // 继续获得离线数据
  428. continueGetOfflineData(success, fail) {
  429. this.dealData(3, [0xcb, 0x01, 0x01], success, fail)
  430. }
  431. // 删除离线数据
  432. deleteOfflineData(success, fail) {
  433. this.dealData(3, [0xc8, 0x01, 0xff], success, fail)
  434. }
  435. // 确认离线数据已经接受完毕
  436. confirmOfflineDataDone(success, fail) {
  437. this.dealData(3, [0xc6, 0x01, this.finishFlag ? 0x00 : 0x01], success, fail)
  438. }
  439. }
  440. // arrayBuffer转16进制字符串数组
  441. const ab2hex = (buffer) => {
  442. return Array.prototype.map.call(new Uint8Array(buffer), x => ('00' + x.toString(16)).slice(-2))
  443. }
  444. // hex to bytes
  445. const hex2Bytes = (arr) => {
  446. return arr.map((item) => {
  447. return parseInt(item, 16)
  448. })
  449. }
  450. const getDataInfo = (lpData, doneFlag) => {
  451. // console.log(doneFlag)
  452. const data = {};
  453. let len = 0;
  454. let val = lpData.slice(2, len + 2);
  455. switch (lpData[0]) {
  456. case 0xa1:
  457. len = lpData[1] & 0xff;
  458. val = byteToString(lpData.slice(2, len + 2));
  459. emitData({
  460. data: val,
  461. cmd: 'getPenName'
  462. })
  463. break;
  464. case 0xa3:
  465. if (lpData[2] === 0x00) {
  466. emitData({
  467. cmd: 'setPenName',
  468. data: true
  469. })
  470. } else {
  471. emitData({
  472. cmd: 'setPenName',
  473. data: false
  474. })
  475. }
  476. break
  477. case 0xa5:
  478. let macAddress = lpData.slice(2, lpData.length).map((item) => {
  479. return MAC(item)
  480. }).join(':')
  481. emitData({
  482. cmd: 'getMacAddress',
  483. data: macAddress
  484. })
  485. break;
  486. case 0xa7:
  487. let res = byteToString(lpData.slice(2, lpData.length))
  488. emitData({
  489. cmd: 'getBlueToothVersion',
  490. data: res
  491. })
  492. break;
  493. case 0xa9:
  494. let penBattery = lpData[2] & 0xff;
  495. let penIsCharging = lpData[3] === 0x01;
  496. emitData({
  497. cmd: 'getPenBattery',
  498. data: {
  499. penBattery: `${penBattery}%`,
  500. penIsCharging
  501. }
  502. })
  503. break;
  504. // 获取笔的rtc时间
  505. case 0xab:
  506. const startTime = 1262275200000;
  507. let currentTime = (new Date()).getTime();
  508. let mPen_time = (lpData[2] & 0xff) | ((lpData[3] << 8) & 0xff00) | ((lpData[4] << 16) & 0xff0000) | ((lpData[5] << 24) & 0xff000000);
  509. let timeOffset = (currentTime - startTime) / 1000
  510. let offTimeoff = timeOffset - mPen_time
  511. console.log(offTimeoff, '时间差')
  512. penDataHandle.changeOffset(offTimeoff);
  513. emitData({
  514. cmd: "getRTCtime",
  515. data: (mPen_time * 1000 + startTime)
  516. })
  517. break;
  518. case 0xad:
  519. emitData({
  520. cmd: 'setRTCtime',
  521. data: lpData[2] === 0x00
  522. })
  523. break;
  524. case 0xb1:
  525. val = lpData.slice(2, 4);
  526. let penAutoShutDown = (val[0] & 0xff) | ((val[1] << 8) & 0xff00)
  527. emitData({
  528. cmd: 'getPenAutoShutDownTime',
  529. data: penAutoShutDown
  530. })
  531. break;
  532. case 0xb3:
  533. emitData({
  534. cmd: 'setPenAutoOff',
  535. data: lpData[2] === 0x00
  536. })
  537. break
  538. case 0xb5:
  539. emitData({
  540. cmd: 'RestoreFactorySettings',
  541. data: lpData[2] === 0x00
  542. })
  543. break
  544. case 0xb7:
  545. console.log(lpData[2] & 0xff)
  546. emitData({
  547. cmd: 'getUsedMemory',
  548. data: lpData[2] & 0xff + '%'
  549. })
  550. break;
  551. case 0xb9:
  552. emitData({
  553. cmd: 'getPenClickMode',
  554. data: lpData[2] === 0x01
  555. })
  556. break
  557. case 0xbb:
  558. emitData({
  559. cmd: 'setPenClickMode',
  560. data: lpData[2] === 0x00
  561. })
  562. break
  563. case 0xbd:
  564. emitData({
  565. cmd: 'getPenBeep',
  566. data: lpData[2] === 0x01
  567. })
  568. break
  569. case 0xbf:
  570. emitData({
  571. cmd: 'setPenBeep',
  572. data: lpData[2] === 0x00
  573. })
  574. break
  575. case 0xd1:
  576. emitData({
  577. cmd: 'getPenSensor',
  578. data: lpData[2] & 0xff
  579. })
  580. break
  581. case 0xd3:
  582. emitData({
  583. cmd: "setPenSensor",
  584. data: lpData[2] === 0x00
  585. })
  586. break
  587. case 0xd5:
  588. emitData({
  589. cmd: 'getLEDColor',
  590. data: lpData[2] & 0xff
  591. })
  592. break
  593. // case 0xd7:
  594. // emitData({
  595. // cmd: "setPenSensor",
  596. // data: lpData[2] === 0x00
  597. // })
  598. // break
  599. case 0xd9:
  600. var sensitivityCorrection = "20g:" + (((lpData[3] << 8) & 0xff00) + (lpData[2] & 0xff)) + "300g:" + (((lpData[5] << 8) & 0xff00) + (lpData[4] & 0xff));
  601. emitData({
  602. cmd: "getSensitivityCorrection",
  603. data: sensitivityCorrection
  604. })
  605. break;
  606. case 0xdb:
  607. len = lpData[1] & 0xff;
  608. val = lpData.slice(2, len + 2);
  609. var isR = lpData[2] & 0xff;
  610. var mcu_firmware = "";
  611. if (isR) {
  612. mcu_firmware = "MCUF_" + "R" + (lpData[4] & 0xff * 10) + (lpData[5] & 0xff) + (data[6] & 0xff);
  613. } else {
  614. mcu_firmware = "MCUF_" + "B" + (lpData[4] & 0xff) + (lpData[5] & 0xff) + (lpData[6] & 0xff);
  615. }
  616. emitData({
  617. cmd: 'getMCUVersion',
  618. data: mcu_firmware
  619. })
  620. break;
  621. case 0xe1:
  622. let oid4CodeValue = 0
  623. let oidFlag = (lpData[2] >> 7 & 0x01);
  624. if (oidFlag == 1) { // oid4 high-coder
  625. let oid_a = (lpData[8] << 40);
  626. let oid_b = (lpData[9] << 32);
  627. oid4CodeValue = (oid_a & 0x3f0000000000) + (oid_b & 0xff00000000) + ((lpData[10] << 24) & 0xff000000) + ((lpData[11] << 16) & 0xf0000) + ((lpData[12] << 8) & 0xff00) + (lpData[13] & 0xff);
  628. } else if (oidFlag == 0) { // oid3 high-coder
  629. oid4CodeValue = ((lpData[10] & 0xff) << 24) | (lpData[11] << 16) | (lpData[12] << 8) | (lpData[13]);
  630. } else {
  631. // console.log("The oidFlag state is : " + oidFlag);
  632. }
  633. if (oid4CodeValue == 0) {
  634. return;
  635. }
  636. if ((lpData[2] & 0x10) != 0) {
  637. return;
  638. }
  639. emitData({
  640. cmd: 'getOID4CodeValue',
  641. data: oid4CodeValue
  642. })
  643. break;
  644. case 0xf0:
  645. let penColor = lpData.slice(2, lpData.length);
  646. emitData({
  647. cmd: 'penColor',
  648. data: penColor
  649. })
  650. break;
  651. // 读取笔的类型
  652. case 0xe5:
  653. // console.log(lpData[2])
  654. switch (lpData[2]) {
  655. case 0x00:
  656. utils.changeDistanceAndAngle(3.3641, 17)
  657. break
  658. case 0x01:
  659. utils.changeDistanceAndAngle(2.9431, 180);
  660. break;
  661. case 0x02:
  662. utils.changeDistanceAndAngle(2.9431, 180);
  663. break
  664. case 0x03:
  665. utils.changeDistanceAndAngle(4.3841, 17);
  666. break;
  667. case 0x08:
  668. event.emit('130', true)
  669. utils.changeDistanceAndAngle(2.8, 180);
  670. break;
  671. case 0x09:
  672. event.emit('130', true)
  673. utils.changeDistanceAndAngle(2.8, 180)
  674. break
  675. case 0x10:
  676. event.emit('130', true)
  677. utils.changeDistanceAndAngle(2.5, 180);
  678. break
  679. default:
  680. break
  681. }
  682. break
  683. case 0xeb:
  684. var mPen_CurrentCodePointType = "";
  685. switch (lpData[2]) {
  686. case 0:
  687. mPen_CurrentCodePointType = "OID3";
  688. break;
  689. case 1:
  690. mPen_CurrentCodePointType = "OID4";
  691. break;
  692. default:
  693. break;
  694. }
  695. emitData({
  696. cmd: 'getCodePointType',
  697. data: mPen_CurrentCodePointType
  698. })
  699. break;
  700. // 获取离线数据量
  701. case 0xc1:
  702. let offlineDataSize = lpData.slice(2, lpData.length);
  703. console.log(lpData, 'lpdata')
  704. let offlineDataNum = parseInt((((offlineDataSize[3] << 24) & 0xff000000) | ((offlineDataSize[2] << 16) & 0xff0000) | ((offlineDataSize[1] << 8) & 0xff00) | (offlineDataSize[0] & 0xff)) / 10);
  705. emitData({
  706. cmd: "getOfflineDataNum",
  707. data: offlineDataNum
  708. })
  709. break;
  710. // 开始获取离线数据
  711. case 0xc3:
  712. if (lpData[2] === 0x00) {
  713. emitData({
  714. cmd: 'startGetOffline',
  715. data: true
  716. })
  717. } else {
  718. emitData({
  719. cmd: "startGetOffline",
  720. data: false
  721. })
  722. }
  723. break
  724. case 0xc4:
  725. doneFlag.gofflineDataProgress = 0
  726. console.log(doneFlag)
  727. emitData({
  728. cmd: 'offLineProgressStop',
  729. data: lpData[2] === 0x00
  730. })
  731. break
  732. case 0xcc:
  733. emitData({
  734. cmd: "offLineProgressPause",
  735. data: lpData[2] === 0x00
  736. })
  737. break
  738. case 0xcd:
  739. emitData({
  740. cmd: 'offLineProgressContinue',
  741. data: lpData[2] === 0x00
  742. })
  743. break
  744. case 0xc5:
  745. doneFlag.finishFlag = lpData[2] === 0x00
  746. // console.log(doneFlag)
  747. doneFlag.gofflineDataProgress = 0
  748. // console.log(doneFlag)
  749. setTimeout(() => {
  750. emitData({
  751. cmd: 'offLineProgressFinish',
  752. data: lpData[2] === 0x00 ? '100%' : false
  753. })
  754. event.emit('finish', true)
  755. }, 1000)
  756. break
  757. case 0xc7:
  758. emitData({
  759. cmd: 'offLineDataConfirm',
  760. data: lpData[2] === 0x00
  761. })
  762. break
  763. case 0xc9:
  764. emitData({
  765. cmd: 'offLineDataDelete',
  766. data: lpData[2] === 0x00
  767. })
  768. break
  769. }
  770. }
  771. // byte数组转字符串
  772. const byteToString = (arr) => {
  773. if (typeof arr === 'string') {
  774. return arr;
  775. }
  776. var str = '',
  777. _arr = arr;
  778. for (var i = 0; i < _arr.length; i++) {
  779. var one = _arr[i].toString(2),
  780. v = one.match(/^1+?(?=0)/);
  781. if (v && one.length == 8) {
  782. var bytesLength = v[0].length;
  783. var store = _arr[i].toString(2).slice(7 - bytesLength);
  784. for (var st = 1; st < bytesLength; st++) {
  785. store += _arr[st + i].toString(2).slice(2);
  786. }
  787. str += String.fromCharCode(parseInt(store, 2));
  788. i += bytesLength - 1;
  789. } else {
  790. str += String.fromCharCode(_arr[i]);
  791. }
  792. }
  793. return str;
  794. }
  795. const emitData = (val) => {
  796. event.emit('penData', val);
  797. }
  798. // 字符串转utf-8
  799. const strToUtf8 = (str) => {
  800. const utf8 = [];
  801. for (let ii = 0; ii < str.length; ii++) {
  802. let charCode = str.charCodeAt(ii);
  803. if (charCode < 0x80) utf8.push(charCode);
  804. else if (charCode < 0x800) {
  805. utf8.push(0xc0 | (charCode >> 6), 0x80 | (charCode & 0x3f));
  806. } else if (charCode < 0xd800 || charCode >= 0xe000) {
  807. utf8.push(0xe0 | (charCode >> 12), 0x80 | ((charCode >> 6) & 0x3f), 0x80 | (charCode & 0x3f));
  808. } else {
  809. ii++;
  810. charCode = 0x10000 + (((charCode & 0x3ff) << 10) | (str.charCodeAt(ii) & 0x3ff));
  811. utf8.push(
  812. 0xf0 | (charCode >> 18),
  813. 0x80 | ((charCode >> 12) & 0x3f),
  814. 0x80 | ((charCode >> 6) & 0x3f),
  815. 0x80 | (charCode & 0x3f),
  816. );
  817. }
  818. }
  819. //兼容汉字,ASCII码表最大的值为127,大于127的值为特殊字符
  820. for (let jj = 0; jj < utf8.length; jj++) {
  821. var code = utf8[jj];
  822. if (code > 127) {
  823. utf8[jj] = code - 256;
  824. }
  825. }
  826. return utf8;
  827. }
  828. const MAC = (num) => {
  829. let num1 = changeData(Math.floor(num / 16));
  830. let num2 = changeData(num % 16);
  831. return num1 + num2
  832. }
  833. function changeData(num) {
  834. let nums = null
  835. if (num >= 10) {
  836. switch (num) {
  837. case 10:
  838. nums = 'A';
  839. break;
  840. case 11:
  841. nums = 'B'
  842. break;
  843. case 12:
  844. nums = 'C';
  845. break;
  846. case 13:
  847. nums = 'D'
  848. break
  849. case 14:
  850. nums = 'E';
  851. break
  852. case 15:
  853. nums = 'F'
  854. break
  855. default:
  856. break
  857. }
  858. } else {
  859. nums = num + ''
  860. }
  861. return nums;
  862. }
  863. class Queue {
  864. constructor() {
  865. this.dataStore = []
  866. }
  867. enqueue(item) {
  868. this.dataStore.push(item)
  869. }
  870. dequeue() {
  871. return this.dataStore.shift()
  872. }
  873. front() {
  874. return this.dataStore[0]
  875. }
  876. back() {
  877. return this.dataStore[this.dataStore.length - 1]
  878. }
  879. getLength() {
  880. return this.dataStore.length
  881. }
  882. empty() {
  883. return this.dataStore.length === 0
  884. }
  885. toString() {
  886. let retStr = ''
  887. this.dataStore.forEach((item) => {
  888. retStr += item + '\n'
  889. })
  890. return retStr
  891. }
  892. }
  893. // hex字符串转typedArray
  894. const hex2TypeArray = (hex) => {
  895. return new Uint8Array(hex.match(/[\da-f]{2}/gi).map(function (h) {
  896. return parseInt(h, 16)
  897. })).buffer
  898. }
  899. export {
  900. TTSDK
  901. }