@rhinosw/react-native-usb-serial 0.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +20 -0
- package/README.md +477 -0
- package/android/build.gradle +69 -0
- package/android/src/main/AndroidManifest.xml +2 -0
- package/android/src/main/java/com/usbserial/UsbSerialModule.kt +301 -0
- package/android/src/main/java/com/usbserial/UsbSerialPackage.kt +31 -0
- package/lib/module/NativeUsbSerial.js +8 -0
- package/lib/module/NativeUsbSerial.js.map +1 -0
- package/lib/module/index.js +107 -0
- package/lib/module/index.js.map +1 -0
- package/lib/module/package.json +1 -0
- package/lib/typescript/package.json +1 -0
- package/lib/typescript/src/NativeUsbSerial.d.ts +93 -0
- package/lib/typescript/src/NativeUsbSerial.d.ts.map +1 -0
- package/lib/typescript/src/index.d.ts +60 -0
- package/lib/typescript/src/index.d.ts.map +1 -0
- package/package.json +176 -0
- package/src/NativeUsbSerial.ts +120 -0
- package/src/index.tsx +121 -0
|
@@ -0,0 +1,301 @@
|
|
|
1
|
+
package com.usbserial
|
|
2
|
+
|
|
3
|
+
import android.hardware.usb.UsbDevice
|
|
4
|
+
import com.facebook.react.bridge.ReactApplicationContext
|
|
5
|
+
import com.facebook.react.module.annotations.ReactModule
|
|
6
|
+
import com.facebook.react.bridge.Arguments
|
|
7
|
+
import com.facebook.react.bridge.WritableArray
|
|
8
|
+
import com.facebook.react.bridge.WritableMap
|
|
9
|
+
import com.facebook.react.bridge.ReadableMap
|
|
10
|
+
import com.rezaul.usbserial.UsbManager
|
|
11
|
+
import com.facebook.react.modules.core.DeviceEventManagerModule
|
|
12
|
+
import com.rezaul.usbserial.RawReadConfig
|
|
13
|
+
import com.rezaul.usbserial.SoilSensorConfig
|
|
14
|
+
import com.facebook.react.bridge.Promise
|
|
15
|
+
|
|
16
|
+
@ReactModule(name = UsbSerialModule.NAME)
|
|
17
|
+
class UsbSerialModule(reactContext: ReactApplicationContext) :
|
|
18
|
+
NativeUsbSerialSpec(reactContext) {
|
|
19
|
+
|
|
20
|
+
private val usbManager = UsbManager(reactContext)
|
|
21
|
+
|
|
22
|
+
override fun multiply(a: Double, b: Double): Double {
|
|
23
|
+
return a * b
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
private fun sendEvent(eventName: String, data: Any?) {
|
|
27
|
+
reactApplicationContext
|
|
28
|
+
.getJSModule(DeviceEventManagerModule.RCTDeviceEventEmitter::class.java)
|
|
29
|
+
.emit(eventName, data)
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
private fun readableMapToUsbDevice(map: ReadableMap): UsbDevice? {
|
|
33
|
+
val devices = usbManager.getDeviceList()
|
|
34
|
+
val vendorId = map.getInt("vendorId")
|
|
35
|
+
val productId = map.getInt("productId")
|
|
36
|
+
|
|
37
|
+
for (device in devices) {
|
|
38
|
+
if (device.vendorId == vendorId && device.productId == productId) {
|
|
39
|
+
return device
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
return null
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
private fun usbDeviceToMap(device: UsbDevice): WritableMap {
|
|
46
|
+
val map = Arguments.createMap()
|
|
47
|
+
map.putInt("vendorId", device.vendorId)
|
|
48
|
+
map.putInt("productId", device.productId)
|
|
49
|
+
map.putString("manufacturer", device.manufacturerName)
|
|
50
|
+
return map
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
/**
|
|
54
|
+
* Returns all connected USB devices
|
|
55
|
+
*/
|
|
56
|
+
override fun getDeviceList(): WritableArray {
|
|
57
|
+
val result: WritableArray = Arguments.createArray()
|
|
58
|
+
val devices: List<UsbDevice> = usbManager.getDeviceList()
|
|
59
|
+
|
|
60
|
+
for (device in devices) {
|
|
61
|
+
result.pushMap(usbDeviceToMap(device))
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
return result
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
/**
|
|
68
|
+
* Check if app has permission for a specific device
|
|
69
|
+
*/
|
|
70
|
+
override fun hasPermission(device: ReadableMap, promise: Promise) {
|
|
71
|
+
try {
|
|
72
|
+
val usbDevice = readableMapToUsbDevice(device)
|
|
73
|
+
if (usbDevice == null) {
|
|
74
|
+
promise.reject("DEVICE_NOT_FOUND", "USB device not found")
|
|
75
|
+
return
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
val hasPermission = usbManager.hasPermission(usbDevice)
|
|
79
|
+
promise.resolve(hasPermission)
|
|
80
|
+
} catch (e: Exception) {
|
|
81
|
+
promise.reject("ERROR", e.message)
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
/**
|
|
86
|
+
* Request USB permission for a specific device
|
|
87
|
+
*/
|
|
88
|
+
override fun requestUsbPermission(device: ReadableMap, promise: Promise) {
|
|
89
|
+
try {
|
|
90
|
+
val usbDevice = readableMapToUsbDevice(device)
|
|
91
|
+
if (usbDevice == null) {
|
|
92
|
+
promise.reject("DEVICE_NOT_FOUND", "USB device not found")
|
|
93
|
+
return
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
usbManager.requestUsbPermission(usbDevice) { granted ->
|
|
97
|
+
promise.resolve(granted)
|
|
98
|
+
}
|
|
99
|
+
} catch (e: Exception) {
|
|
100
|
+
promise.reject("ERROR", e.message)
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
/**
|
|
105
|
+
* Connect to a specific USB device with optional baud rate
|
|
106
|
+
*/
|
|
107
|
+
override fun connect(device: ReadableMap, baudRate: Double?, promise: Promise) {
|
|
108
|
+
try {
|
|
109
|
+
val usbDevice = readableMapToUsbDevice(device)
|
|
110
|
+
if (usbDevice == null) {
|
|
111
|
+
promise.reject("DEVICE_NOT_FOUND", "USB device not found")
|
|
112
|
+
return
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
val baud = baudRate?.toInt() ?: 9600
|
|
116
|
+
val connected = usbManager.connect(usbDevice, baud)
|
|
117
|
+
promise.resolve(connected)
|
|
118
|
+
} catch (e: Exception) {
|
|
119
|
+
promise.reject("ERROR", e.message)
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
/**
|
|
124
|
+
* Check if serial connection is active
|
|
125
|
+
*/
|
|
126
|
+
override fun isConnected(promise: Promise) {
|
|
127
|
+
try {
|
|
128
|
+
val connected = usbManager.isConnected()
|
|
129
|
+
promise.resolve(connected)
|
|
130
|
+
} catch (e: Exception) {
|
|
131
|
+
promise.reject("ERROR", e.message)
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
/**
|
|
136
|
+
* Disconnect the current serial device
|
|
137
|
+
*/
|
|
138
|
+
override fun disconnect(promise: Promise) {
|
|
139
|
+
try {
|
|
140
|
+
usbManager.disconnect()
|
|
141
|
+
promise.resolve(null)
|
|
142
|
+
} catch (e: Exception) {
|
|
143
|
+
promise.reject("ERROR", e.message)
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
/**
|
|
148
|
+
* Write data to the serial port
|
|
149
|
+
*/
|
|
150
|
+
override fun write(data: String, promise: Promise) {
|
|
151
|
+
try {
|
|
152
|
+
usbManager.write(data.toByteArray())
|
|
153
|
+
promise.resolve(null)
|
|
154
|
+
} catch (e: Exception) {
|
|
155
|
+
promise.reject("ERROR", e.message)
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
/**
|
|
160
|
+
* Read data from the serial port
|
|
161
|
+
*/
|
|
162
|
+
override fun read(bufferSize: Double?, timeout: Double?, promise: Promise) {
|
|
163
|
+
try {
|
|
164
|
+
val buffer = bufferSize?.toInt() ?: 1024
|
|
165
|
+
val timeoutVal = timeout?.toInt() ?: 1000
|
|
166
|
+
val data = usbManager.read(buffer, timeoutVal)
|
|
167
|
+
promise.resolve(String(data))
|
|
168
|
+
} catch (e: Exception) {
|
|
169
|
+
promise.reject("ERROR", e.message)
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
/**
|
|
174
|
+
* Start listening for raw serial data at specified interval
|
|
175
|
+
*/
|
|
176
|
+
override fun onReadInterval(intervalMs: Double, config: ReadableMap?, promise: Promise) {
|
|
177
|
+
try {
|
|
178
|
+
val bufferSize = config?.getInt("bufferSize") ?: 1024
|
|
179
|
+
val timeout = config?.getInt("timeout") ?: 1000
|
|
180
|
+
val readConfig = RawReadConfig(bufferSize, timeout)
|
|
181
|
+
|
|
182
|
+
usbManager.onReadInterval(
|
|
183
|
+
intervalMs = intervalMs.toLong(),
|
|
184
|
+
onDataReceived = { bytes: ByteArray ->
|
|
185
|
+
val map = Arguments.createMap()
|
|
186
|
+
map.putString("data", String(bytes))
|
|
187
|
+
sendEvent("USB_SERIAL_DATA", map)
|
|
188
|
+
},
|
|
189
|
+
config = readConfig
|
|
190
|
+
)
|
|
191
|
+
promise.resolve(null)
|
|
192
|
+
} catch (e: Exception) {
|
|
193
|
+
promise.reject("ERROR", e.message)
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
/**
|
|
198
|
+
* Stop listening for raw serial data
|
|
199
|
+
*/
|
|
200
|
+
override fun offReadInterval(promise: Promise) {
|
|
201
|
+
try {
|
|
202
|
+
usbManager.offReadInterval()
|
|
203
|
+
promise.resolve(null)
|
|
204
|
+
} catch (e: Exception) {
|
|
205
|
+
promise.reject("ERROR", e.message)
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
/**
|
|
210
|
+
* Get currently connected device
|
|
211
|
+
*/
|
|
212
|
+
override fun getConnectedDevice(promise: Promise) {
|
|
213
|
+
try {
|
|
214
|
+
val device = usbManager.getConnectedDevice()
|
|
215
|
+
if (device == null) {
|
|
216
|
+
promise.resolve(null)
|
|
217
|
+
} else {
|
|
218
|
+
promise.resolve(usbDeviceToMap(device))
|
|
219
|
+
}
|
|
220
|
+
} catch (e: Exception) {
|
|
221
|
+
promise.reject("ERROR", e.message)
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
/**
|
|
226
|
+
* Read soil sensor data once
|
|
227
|
+
*/
|
|
228
|
+
override fun readSoilData(config: ReadableMap?, promise: Promise) {
|
|
229
|
+
try {
|
|
230
|
+
val slaveId = config?.getInt("slaveId") ?: 1
|
|
231
|
+
val startAddress = config?.getInt("startAddress") ?: 0x0000
|
|
232
|
+
val registerCount = config?.getInt("registerCount") ?: 8
|
|
233
|
+
val responseDelayMs = config?.getInt("responseDelayMs") ?: 300
|
|
234
|
+
|
|
235
|
+
val data = usbManager.utils.readSoilData(slaveId, startAddress, registerCount, responseDelayMs)
|
|
236
|
+
if (data == null) {
|
|
237
|
+
promise.resolve(null)
|
|
238
|
+
return
|
|
239
|
+
}
|
|
240
|
+
|
|
241
|
+
val map: WritableMap = Arguments.createMap()
|
|
242
|
+
data.forEach { (key: String, value: Double?) ->
|
|
243
|
+
if (value != null) {
|
|
244
|
+
map.putDouble(key, value)
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
|
|
248
|
+
promise.resolve(map)
|
|
249
|
+
} catch (e: Exception) {
|
|
250
|
+
promise.reject("ERROR", e.message)
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
|
|
254
|
+
/**
|
|
255
|
+
* Start listening for soil sensor data at specified interval
|
|
256
|
+
*/
|
|
257
|
+
override fun onReadSoilDataInterval(intervalMs: Double, config: ReadableMap?, promise: Promise) {
|
|
258
|
+
try {
|
|
259
|
+
val slaveId = config?.getInt("slaveId") ?: 1
|
|
260
|
+
val startAddress = config?.getInt("startAddress") ?: 0x0000
|
|
261
|
+
val registerCount = config?.getInt("registerCount") ?: 8
|
|
262
|
+
val responseDelayMs = config?.getInt("responseDelayMs") ?: 300
|
|
263
|
+
val soilConfig = SoilSensorConfig(slaveId, startAddress, registerCount, responseDelayMs)
|
|
264
|
+
|
|
265
|
+
usbManager.utils.onReadSoilDataInterval(
|
|
266
|
+
intervalMs = intervalMs.toLong(),
|
|
267
|
+
onDataReceived = { soilData: Map<String, Double?> ->
|
|
268
|
+
val map = Arguments.createMap()
|
|
269
|
+
|
|
270
|
+
soilData.forEach { (key: String, value: Double?) ->
|
|
271
|
+
if (value != null) {
|
|
272
|
+
map.putDouble(key, value)
|
|
273
|
+
}
|
|
274
|
+
}
|
|
275
|
+
|
|
276
|
+
sendEvent("USB_SOIL_DATA", map)
|
|
277
|
+
},
|
|
278
|
+
config = soilConfig
|
|
279
|
+
)
|
|
280
|
+
promise.resolve(null)
|
|
281
|
+
} catch (e: Exception) {
|
|
282
|
+
promise.reject("ERROR", e.message)
|
|
283
|
+
}
|
|
284
|
+
}
|
|
285
|
+
|
|
286
|
+
/**
|
|
287
|
+
* Stop listening for soil sensor data
|
|
288
|
+
*/
|
|
289
|
+
override fun offReadSoilDataInterval(promise: Promise) {
|
|
290
|
+
try {
|
|
291
|
+
usbManager.utils.offReadSoilDataInterval()
|
|
292
|
+
promise.resolve(null)
|
|
293
|
+
} catch (e: Exception) {
|
|
294
|
+
promise.reject("ERROR", e.message)
|
|
295
|
+
}
|
|
296
|
+
}
|
|
297
|
+
|
|
298
|
+
companion object {
|
|
299
|
+
const val NAME = NativeUsbSerialSpec.NAME
|
|
300
|
+
}
|
|
301
|
+
}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
package com.usbserial
|
|
2
|
+
|
|
3
|
+
import com.facebook.react.BaseReactPackage
|
|
4
|
+
import com.facebook.react.bridge.NativeModule
|
|
5
|
+
import com.facebook.react.bridge.ReactApplicationContext
|
|
6
|
+
import com.facebook.react.module.model.ReactModuleInfo
|
|
7
|
+
import com.facebook.react.module.model.ReactModuleInfoProvider
|
|
8
|
+
import java.util.HashMap
|
|
9
|
+
|
|
10
|
+
class UsbSerialPackage : BaseReactPackage() {
|
|
11
|
+
override fun getModule(name: String, reactContext: ReactApplicationContext): NativeModule? {
|
|
12
|
+
return if (name == UsbSerialModule.NAME) {
|
|
13
|
+
UsbSerialModule(reactContext)
|
|
14
|
+
} else {
|
|
15
|
+
null
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
override fun getReactModuleInfoProvider() = ReactModuleInfoProvider {
|
|
20
|
+
mapOf(
|
|
21
|
+
UsbSerialModule.NAME to ReactModuleInfo(
|
|
22
|
+
name = UsbSerialModule.NAME,
|
|
23
|
+
className = UsbSerialModule.NAME,
|
|
24
|
+
canOverrideExistingModule = false,
|
|
25
|
+
needsEagerInit = false,
|
|
26
|
+
isCxxModule = false,
|
|
27
|
+
isTurboModule = true
|
|
28
|
+
)
|
|
29
|
+
)
|
|
30
|
+
}
|
|
31
|
+
}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
import { TurboModuleRegistry, Platform } from 'react-native';
|
|
4
|
+
function getModule() {
|
|
5
|
+
return Platform.OS === 'android' ? TurboModuleRegistry.getEnforcing('UsbSerial') : {};
|
|
6
|
+
}
|
|
7
|
+
export default getModule();
|
|
8
|
+
//# sourceMappingURL=NativeUsbSerial.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["TurboModuleRegistry","Platform","getModule","OS","getEnforcing"],"sourceRoot":"..\\..\\src","sources":["NativeUsbSerial.ts"],"mappings":";;AAAA,SAASA,mBAAmB,EAAqBC,QAAQ,QAAO,cAAc;AAmH9E,SAASC,SAASA,CAAA,EAAS;EAC1B,OAAOD,QAAQ,CAACE,EAAE,KAAK,SAAS,GAAGH,mBAAmB,CAACI,YAAY,CAAO,WAAW,CAAC,GAAG,CAAC,CAAS;AACpG;AAEA,eAAeF,SAAS,CAAC,CAAC","ignoreList":[]}
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
import UsbSerial from "./NativeUsbSerial.js";
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Get list of all connected USB devices
|
|
7
|
+
*/
|
|
8
|
+
export function getDeviceList() {
|
|
9
|
+
return UsbSerial.getDeviceList();
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* Check if app has permission for a device
|
|
14
|
+
*/
|
|
15
|
+
export function hasPermission(device) {
|
|
16
|
+
return UsbSerial.hasPermission(device);
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* Request USB permission for a device
|
|
21
|
+
*/
|
|
22
|
+
export function requestUsbPermission(device) {
|
|
23
|
+
return UsbSerial.requestUsbPermission(device);
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
/**
|
|
27
|
+
* Connect to a USB device
|
|
28
|
+
*/
|
|
29
|
+
export function connect(device, baudRate) {
|
|
30
|
+
return UsbSerial.connect(device, baudRate);
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
/**
|
|
34
|
+
* Check if currently connected
|
|
35
|
+
*/
|
|
36
|
+
export function isConnected() {
|
|
37
|
+
return UsbSerial.isConnected();
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
/**
|
|
41
|
+
* Disconnect from device
|
|
42
|
+
*/
|
|
43
|
+
export function disconnect() {
|
|
44
|
+
return UsbSerial.disconnect();
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
/**
|
|
48
|
+
* Write data to serial port
|
|
49
|
+
*/
|
|
50
|
+
export function write(data) {
|
|
51
|
+
return UsbSerial.write(data);
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
/**
|
|
55
|
+
* Read data from serial port
|
|
56
|
+
*/
|
|
57
|
+
export function read(bufferSize, timeout) {
|
|
58
|
+
return UsbSerial.read(bufferSize, timeout);
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
/**
|
|
62
|
+
* Start listening for raw serial data
|
|
63
|
+
*/
|
|
64
|
+
export function onReadInterval(intervalMs, config) {
|
|
65
|
+
return UsbSerial.onReadInterval(intervalMs, config);
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
/**
|
|
69
|
+
* Stop listening for raw serial data
|
|
70
|
+
*/
|
|
71
|
+
export function offReadInterval() {
|
|
72
|
+
return UsbSerial.offReadInterval();
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
/**
|
|
76
|
+
* Get currently connected device
|
|
77
|
+
*/
|
|
78
|
+
export function getConnectedDevice() {
|
|
79
|
+
return UsbSerial.getConnectedDevice();
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
/**
|
|
83
|
+
* Read soil sensor data once
|
|
84
|
+
*/
|
|
85
|
+
export function readSoilData(config) {
|
|
86
|
+
return UsbSerial.readSoilData(config);
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
/**
|
|
90
|
+
* Start listening for soil sensor data
|
|
91
|
+
*/
|
|
92
|
+
export function onReadSoilDataInterval(intervalMs, config) {
|
|
93
|
+
return UsbSerial.onReadSoilDataInterval(intervalMs, config);
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
/**
|
|
97
|
+
* Stop listening for soil sensor data
|
|
98
|
+
*/
|
|
99
|
+
export function offReadSoilDataInterval() {
|
|
100
|
+
return UsbSerial.offReadSoilDataInterval();
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
// Export types
|
|
104
|
+
|
|
105
|
+
// Export native module
|
|
106
|
+
export default UsbSerial;
|
|
107
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["UsbSerial","getDeviceList","hasPermission","device","requestUsbPermission","connect","baudRate","isConnected","disconnect","write","data","read","bufferSize","timeout","onReadInterval","intervalMs","config","offReadInterval","getConnectedDevice","readSoilData","onReadSoilDataInterval","offReadSoilDataInterval"],"sourceRoot":"..\\..\\src","sources":["index.tsx"],"mappings":";;AAAA,OAAOA,SAAS,MAKT,sBAAmB;;AAE1B;AACA;AACA;AACA,OAAO,SAASC,aAAaA,CAAA,EAAgB;EAC3C,OAAOD,SAAS,CAACC,aAAa,CAAC,CAAC;AAClC;;AAEA;AACA;AACA;AACA,OAAO,SAASC,aAAaA,CAACC,MAAiB,EAAoB;EACjE,OAAOH,SAAS,CAACE,aAAa,CAACC,MAAM,CAAC;AACxC;;AAEA;AACA;AACA;AACA,OAAO,SAASC,oBAAoBA,CAACD,MAAiB,EAAoB;EACxE,OAAOH,SAAS,CAACI,oBAAoB,CAACD,MAAM,CAAC;AAC/C;;AAEA;AACA;AACA;AACA,OAAO,SAASE,OAAOA,CACrBF,MAAiB,EACjBG,QAAiB,EACC;EAClB,OAAON,SAAS,CAACK,OAAO,CAACF,MAAM,EAAEG,QAAQ,CAAC;AAC5C;;AAEA;AACA;AACA;AACA,OAAO,SAASC,WAAWA,CAAA,EAAqB;EAC9C,OAAOP,SAAS,CAACO,WAAW,CAAC,CAAC;AAChC;;AAEA;AACA;AACA;AACA,OAAO,SAASC,UAAUA,CAAA,EAAkB;EAC1C,OAAOR,SAAS,CAACQ,UAAU,CAAC,CAAC;AAC/B;;AAEA;AACA;AACA;AACA,OAAO,SAASC,KAAKA,CAACC,IAAY,EAAiB;EACjD,OAAOV,SAAS,CAACS,KAAK,CAACC,IAAI,CAAC;AAC9B;;AAEA;AACA;AACA;AACA,OAAO,SAASC,IAAIA,CAACC,UAAmB,EAAEC,OAAgB,EAAmB;EAC3E,OAAOb,SAAS,CAACW,IAAI,CAACC,UAAU,EAAEC,OAAO,CAAC;AAC5C;;AAEA;AACA;AACA;AACA,OAAO,SAASC,cAAcA,CAC5BC,UAAkB,EAClBC,MAAsB,EACP;EACf,OAAOhB,SAAS,CAACc,cAAc,CAACC,UAAU,EAAEC,MAAM,CAAC;AACrD;;AAEA;AACA;AACA;AACA,OAAO,SAASC,eAAeA,CAAA,EAAkB;EAC/C,OAAOjB,SAAS,CAACiB,eAAe,CAAC,CAAC;AACpC;;AAEA;AACA;AACA;AACA,OAAO,SAASC,kBAAkBA,CAAA,EAA8B;EAC9D,OAAOlB,SAAS,CAACkB,kBAAkB,CAAC,CAAC;AACvC;;AAEA;AACA;AACA;AACA,OAAO,SAASC,YAAYA,CAC1BH,MAAyB,EACC;EAC1B,OAAOhB,SAAS,CAACmB,YAAY,CAACH,MAAM,CAAC;AACvC;;AAEA;AACA;AACA;AACA,OAAO,SAASI,sBAAsBA,CACpCL,UAAkB,EAClBC,MAAyB,EACV;EACf,OAAOhB,SAAS,CAACoB,sBAAsB,CAACL,UAAU,EAAEC,MAAM,CAAC;AAC7D;;AAEA;AACA;AACA;AACA,OAAO,SAASK,uBAAuBA,CAAA,EAAkB;EACvD,OAAOrB,SAAS,CAACqB,uBAAuB,CAAC,CAAC;AAC5C;;AAEA;;AAGA;AACA,eAAerB,SAAS","ignoreList":[]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"type":"module"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"type":"module"}
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
import { type TurboModule } from 'react-native';
|
|
2
|
+
export type UsbDevice = {
|
|
3
|
+
deviceName: string;
|
|
4
|
+
vendorId: number;
|
|
5
|
+
productId: number;
|
|
6
|
+
manufacturer?: string | null;
|
|
7
|
+
productName?: string | null;
|
|
8
|
+
serialNumber?: string | null;
|
|
9
|
+
};
|
|
10
|
+
export type SoilData = {
|
|
11
|
+
[key: string]: number;
|
|
12
|
+
};
|
|
13
|
+
export type RawReadConfig = {
|
|
14
|
+
bufferSize?: number;
|
|
15
|
+
timeout?: number;
|
|
16
|
+
};
|
|
17
|
+
export type SoilSensorConfig = {
|
|
18
|
+
slaveId?: number;
|
|
19
|
+
startAddress?: number;
|
|
20
|
+
registerCount?: number;
|
|
21
|
+
responseDelayMs?: number;
|
|
22
|
+
};
|
|
23
|
+
export interface Spec extends TurboModule {
|
|
24
|
+
/**
|
|
25
|
+
* Multiply two numbers
|
|
26
|
+
*/
|
|
27
|
+
multiply(a: number, b: number): number;
|
|
28
|
+
/**
|
|
29
|
+
* Returns all connected USB devices
|
|
30
|
+
*/
|
|
31
|
+
getDeviceList(): UsbDevice[];
|
|
32
|
+
/**
|
|
33
|
+
* Check if app has permission for a specific device
|
|
34
|
+
*/
|
|
35
|
+
hasPermission(device: UsbDevice): Promise<boolean>;
|
|
36
|
+
/**
|
|
37
|
+
* Request USB permission for a specific device
|
|
38
|
+
*/
|
|
39
|
+
requestUsbPermission(device: UsbDevice): Promise<boolean>;
|
|
40
|
+
/**
|
|
41
|
+
* Connect to a specific USB device with optional baud rate
|
|
42
|
+
*/
|
|
43
|
+
connect(device: UsbDevice, baudRate?: number): Promise<boolean>;
|
|
44
|
+
/**
|
|
45
|
+
* Check if serial connection is active
|
|
46
|
+
*/
|
|
47
|
+
isConnected(): Promise<boolean>;
|
|
48
|
+
/**
|
|
49
|
+
* Disconnect the current serial device
|
|
50
|
+
*/
|
|
51
|
+
disconnect(): Promise<void>;
|
|
52
|
+
/**
|
|
53
|
+
* Write data to the serial port
|
|
54
|
+
*/
|
|
55
|
+
write(data: string): Promise<void>;
|
|
56
|
+
/**
|
|
57
|
+
* Read data from the serial port
|
|
58
|
+
*/
|
|
59
|
+
read(bufferSize?: number, timeout?: number): Promise<string>;
|
|
60
|
+
/**
|
|
61
|
+
* Start listening for raw serial data at specified interval
|
|
62
|
+
*/
|
|
63
|
+
onReadInterval(intervalMs: number, config?: RawReadConfig): Promise<void>;
|
|
64
|
+
/**
|
|
65
|
+
* Stop listening for raw serial data
|
|
66
|
+
*/
|
|
67
|
+
offReadInterval(): Promise<void>;
|
|
68
|
+
/**
|
|
69
|
+
* Get currently connected device
|
|
70
|
+
*/
|
|
71
|
+
getConnectedDevice(): Promise<UsbDevice | null>;
|
|
72
|
+
/**
|
|
73
|
+
* Read soil sensor data once
|
|
74
|
+
*/
|
|
75
|
+
readSoilData(config?: SoilSensorConfig): Promise<SoilData | null>;
|
|
76
|
+
/**
|
|
77
|
+
* Start listening for soil sensor data at specified interval
|
|
78
|
+
*/
|
|
79
|
+
onReadSoilDataInterval(intervalMs: number, config?: SoilSensorConfig): Promise<void>;
|
|
80
|
+
/**
|
|
81
|
+
* Stop listening for soil sensor data
|
|
82
|
+
*/
|
|
83
|
+
offReadSoilDataInterval(): Promise<void>;
|
|
84
|
+
}
|
|
85
|
+
export type UsbSerialEvent = {
|
|
86
|
+
data: string;
|
|
87
|
+
};
|
|
88
|
+
export type UsbSoilEvent = {
|
|
89
|
+
[key: string]: number;
|
|
90
|
+
};
|
|
91
|
+
declare const _default: Spec;
|
|
92
|
+
export default _default;
|
|
93
|
+
//# sourceMappingURL=NativeUsbSerial.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"NativeUsbSerial.d.ts","sourceRoot":"","sources":["../../../src/NativeUsbSerial.ts"],"names":[],"mappings":"AAAA,OAAO,EAAuB,KAAK,WAAW,EAAY,MAAM,cAAc,CAAC;AAE/E,MAAM,MAAM,SAAS,GAAG;IACtB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC9B,CAAC;AAEF,MAAM,MAAM,QAAQ,GAAG;IACrB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAAC;CACvB,CAAC;AAEF,MAAM,MAAM,aAAa,GAAG;IAC1B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB,CAAC;AAEF,MAAM,MAAM,gBAAgB,GAAG;IAC7B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B,CAAC;AAEF,MAAM,WAAW,IAAK,SAAQ,WAAW;IACvC;;OAEG;IACH,QAAQ,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IAEvC;;OAEG;IACH,aAAa,IAAI,SAAS,EAAE,CAAC;IAE7B;;OAEG;IACH,aAAa,CAAC,MAAM,EAAE,SAAS,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAEnD;;OAEG;IACH,oBAAoB,CAAC,MAAM,EAAE,SAAS,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAE1D;;OAEG;IACH,OAAO,CAAC,MAAM,EAAE,SAAS,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAEhE;;OAEG;IACH,WAAW,IAAI,OAAO,CAAC,OAAO,CAAC,CAAC;IAEhC;;OAEG;IACH,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAE5B;;OAEG;IACH,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAEnC;;OAEG;IACH,IAAI,CAAC,UAAU,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IAE7D;;OAEG;IACH,cAAc,CAAC,UAAU,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAE1E;;OAEG;IACH,eAAe,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAEjC;;OAEG;IACH,kBAAkB,IAAI,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC,CAAC;IAEhD;;OAEG;IACH,YAAY,CAAC,MAAM,CAAC,EAAE,gBAAgB,GAAG,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC,CAAC;IAElE;;OAEG;IACH,sBAAsB,CACpB,UAAU,EAAE,MAAM,EAClB,MAAM,CAAC,EAAE,gBAAgB,GACxB,OAAO,CAAC,IAAI,CAAC,CAAC;IAEjB;;OAEG;IACH,uBAAuB,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CAC1C;AAED,MAAM,MAAM,cAAc,GAAG;IAC3B,IAAI,EAAE,MAAM,CAAC;CACd,CAAC;AAEF,MAAM,MAAM,YAAY,GAAG;IACzB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAAC;CACvB,CAAC;;AAMF,wBAA2B"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import UsbSerial, { type UsbDevice, type SoilData, type RawReadConfig, type SoilSensorConfig } from './NativeUsbSerial';
|
|
2
|
+
/**
|
|
3
|
+
* Get list of all connected USB devices
|
|
4
|
+
*/
|
|
5
|
+
export declare function getDeviceList(): UsbDevice[];
|
|
6
|
+
/**
|
|
7
|
+
* Check if app has permission for a device
|
|
8
|
+
*/
|
|
9
|
+
export declare function hasPermission(device: UsbDevice): Promise<boolean>;
|
|
10
|
+
/**
|
|
11
|
+
* Request USB permission for a device
|
|
12
|
+
*/
|
|
13
|
+
export declare function requestUsbPermission(device: UsbDevice): Promise<boolean>;
|
|
14
|
+
/**
|
|
15
|
+
* Connect to a USB device
|
|
16
|
+
*/
|
|
17
|
+
export declare function connect(device: UsbDevice, baudRate?: number): Promise<boolean>;
|
|
18
|
+
/**
|
|
19
|
+
* Check if currently connected
|
|
20
|
+
*/
|
|
21
|
+
export declare function isConnected(): Promise<boolean>;
|
|
22
|
+
/**
|
|
23
|
+
* Disconnect from device
|
|
24
|
+
*/
|
|
25
|
+
export declare function disconnect(): Promise<void>;
|
|
26
|
+
/**
|
|
27
|
+
* Write data to serial port
|
|
28
|
+
*/
|
|
29
|
+
export declare function write(data: string): Promise<void>;
|
|
30
|
+
/**
|
|
31
|
+
* Read data from serial port
|
|
32
|
+
*/
|
|
33
|
+
export declare function read(bufferSize?: number, timeout?: number): Promise<string>;
|
|
34
|
+
/**
|
|
35
|
+
* Start listening for raw serial data
|
|
36
|
+
*/
|
|
37
|
+
export declare function onReadInterval(intervalMs: number, config?: RawReadConfig): Promise<void>;
|
|
38
|
+
/**
|
|
39
|
+
* Stop listening for raw serial data
|
|
40
|
+
*/
|
|
41
|
+
export declare function offReadInterval(): Promise<void>;
|
|
42
|
+
/**
|
|
43
|
+
* Get currently connected device
|
|
44
|
+
*/
|
|
45
|
+
export declare function getConnectedDevice(): Promise<UsbDevice | null>;
|
|
46
|
+
/**
|
|
47
|
+
* Read soil sensor data once
|
|
48
|
+
*/
|
|
49
|
+
export declare function readSoilData(config?: SoilSensorConfig): Promise<SoilData | null>;
|
|
50
|
+
/**
|
|
51
|
+
* Start listening for soil sensor data
|
|
52
|
+
*/
|
|
53
|
+
export declare function onReadSoilDataInterval(intervalMs: number, config?: SoilSensorConfig): Promise<void>;
|
|
54
|
+
/**
|
|
55
|
+
* Stop listening for soil sensor data
|
|
56
|
+
*/
|
|
57
|
+
export declare function offReadSoilDataInterval(): Promise<void>;
|
|
58
|
+
export type { UsbDevice, SoilData, RawReadConfig, SoilSensorConfig };
|
|
59
|
+
export default UsbSerial;
|
|
60
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/index.tsx"],"names":[],"mappings":"AAAA,OAAO,SAAS,EAAE,EAChB,KAAK,SAAS,EACd,KAAK,QAAQ,EACb,KAAK,aAAa,EAClB,KAAK,gBAAgB,EACtB,MAAM,mBAAmB,CAAC;AAE3B;;GAEG;AACH,wBAAgB,aAAa,IAAI,SAAS,EAAE,CAE3C;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,MAAM,EAAE,SAAS,GAAG,OAAO,CAAC,OAAO,CAAC,CAEjE;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,SAAS,GAAG,OAAO,CAAC,OAAO,CAAC,CAExE;AAED;;GAEG;AACH,wBAAgB,OAAO,CACrB,MAAM,EAAE,SAAS,EACjB,QAAQ,CAAC,EAAE,MAAM,GAChB,OAAO,CAAC,OAAO,CAAC,CAElB;AAED;;GAEG;AACH,wBAAgB,WAAW,IAAI,OAAO,CAAC,OAAO,CAAC,CAE9C;AAED;;GAEG;AACH,wBAAgB,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC,CAE1C;AAED;;GAEG;AACH,wBAAgB,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAEjD;AAED;;GAEG;AACH,wBAAgB,IAAI,CAAC,UAAU,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAE3E;AAED;;GAEG;AACH,wBAAgB,cAAc,CAC5B,UAAU,EAAE,MAAM,EAClB,MAAM,CAAC,EAAE,aAAa,GACrB,OAAO,CAAC,IAAI,CAAC,CAEf;AAED;;GAEG;AACH,wBAAgB,eAAe,IAAI,OAAO,CAAC,IAAI,CAAC,CAE/C;AAED;;GAEG;AACH,wBAAgB,kBAAkB,IAAI,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC,CAE9D;AAED;;GAEG;AACH,wBAAgB,YAAY,CAC1B,MAAM,CAAC,EAAE,gBAAgB,GACxB,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC,CAE1B;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CACpC,UAAU,EAAE,MAAM,EAClB,MAAM,CAAC,EAAE,gBAAgB,GACxB,OAAO,CAAC,IAAI,CAAC,CAEf;AAED;;GAEG;AACH,wBAAgB,uBAAuB,IAAI,OAAO,CAAC,IAAI,CAAC,CAEvD;AAGD,YAAY,EAAE,SAAS,EAAE,QAAQ,EAAE,aAAa,EAAE,gBAAgB,EAAE,CAAC;AAGrE,eAAe,SAAS,CAAC"}
|