service.js 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126
  1. const storageAccessService = require('../storage-access/service.js')
  2. const transport = require('../../transport/ble-core.js')
  3. const {
  4. bytesToHex,
  5. stringToUtf8Bytes
  6. } = require('../../utils/binary-utils.js')
  7. const {
  8. parseHexBytes,
  9. validateHexText
  10. } = require('../../utils/validation.js')
  11. const {
  12. normalizeSerialState
  13. } = require('./view-model.js')
  14. async function sendSerialFrame(data = {}) {
  15. const serialInputText = String(data.serialInputText || '')
  16. const serialState = normalizeSerialState(data)
  17. const mode = serialState.serialMode
  18. if (!data.connectedDevice) {
  19. return {
  20. errorText: '请先连接蓝牙设备',
  21. ok: false
  22. }
  23. }
  24. if (serialState.serialErrorText) {
  25. return {
  26. errorText: serialState.serialErrorText,
  27. ok: false
  28. }
  29. }
  30. if (mode === 'hex') {
  31. const errorText = validateHexText(serialInputText)
  32. if (errorText) {
  33. return {
  34. errorText,
  35. ok: false
  36. }
  37. }
  38. const bytes = parseHexBytes(serialInputText)
  39. const previewHex = bytesToHex(bytes, ' ')
  40. const ok = await transport.sendRawFrameExact(new Uint8Array(bytes), 'SERIAL')
  41. return {
  42. bytes,
  43. ok,
  44. previewHex,
  45. serialState
  46. }
  47. }
  48. const bytes = stringToUtf8Bytes(serialInputText)
  49. if (!bytes.length) {
  50. return {
  51. errorText: '请输入要发送的文本',
  52. ok: false
  53. }
  54. }
  55. const ok = await transport.sendRawFrameExact(new Uint8Array(bytes), 'SERIAL')
  56. return {
  57. bytes,
  58. ok,
  59. previewHex: bytesToHex(bytes, ' '),
  60. serialState
  61. }
  62. }
  63. async function executeStorageAccessProtocol(data = {}) {
  64. if (!data.connectedDevice) {
  65. return {
  66. errorText: '请先连接蓝牙设备',
  67. ok: false
  68. }
  69. }
  70. try {
  71. return await storageAccessService.executeMemoryCommand(data, {
  72. maxPacketLength: data.parameterMaxPacketLength,
  73. showModal: true
  74. })
  75. } catch (error) {
  76. return {
  77. errorText: error.message || '存储访问命令无效',
  78. ok: false
  79. }
  80. }
  81. }
  82. async function executeStorageAccessSpecialCommand(command = {}, data = {}) {
  83. if (!data.connectedDevice) {
  84. return {
  85. errorText: '请先连接蓝牙设备',
  86. ok: false
  87. }
  88. }
  89. if (!command || !command.op) {
  90. return {
  91. errorText: '特殊指令无效',
  92. ok: false
  93. }
  94. }
  95. if (command.key === 'controlRef' && data.storageAccessControlRefErrorText) {
  96. return {
  97. errorText: data.storageAccessControlRefErrorText,
  98. ok: false
  99. }
  100. }
  101. return storageAccessService.executeControlCommand(command.key, data, {
  102. maxPacketLength: data.parameterMaxPacketLength,
  103. showModal: true
  104. })
  105. }
  106. module.exports = {
  107. executeStorageAccessProtocol,
  108. executeStorageAccessSpecialCommand,
  109. sendSerialFrame
  110. }