tqlSDK.js 24 KB

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