Skip to content

Commit e0ea8a8

Browse files
committed
feat: Add ability to reset device
1 parent 7b8a3a2 commit e0ea8a8

File tree

3 files changed

+62
-1
lines changed

3 files changed

+62
-1
lines changed

react-native-mcu-manager/android/src/main/java/uk/co/playerdata/reactnativemcumanager/ReactNativeMcuManagerModule.kt

Lines changed: 31 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,9 +11,12 @@ import expo.modules.kotlin.modules.Module
1111
import expo.modules.kotlin.modules.ModuleDefinition
1212
import expo.modules.kotlin.records.Field
1313
import expo.modules.kotlin.records.Record
14+
import io.runtime.mcumgr.McuMgrCallback
1415
import io.runtime.mcumgr.ble.McuMgrBleTransport
1516
import io.runtime.mcumgr.exception.McuMgrException
17+
import io.runtime.mcumgr.managers.DefaultManager
1618
import io.runtime.mcumgr.managers.ImageManager
19+
import io.runtime.mcumgr.response.dflt.McuMgrOsResponse
1720

1821
private const val MODULE_NAME = "ReactNativeMcuManager"
1922
private val TAG = "McuManagerModule"
@@ -41,7 +44,7 @@ class ReactNativeMcuManagerModule : Module() {
4144
try {
4245
val device: BluetoothDevice = bluetoothAdapter.getRemoteDevice(macAddress)
4346

44-
var transport = McuMgrBleTransport(context, device)
47+
val transport = McuMgrBleTransport(context, device)
4548
transport.connect(device).timeout(60000).await()
4649

4750
val imageManager = ImageManager(transport)
@@ -123,5 +126,32 @@ class ReactNativeMcuManagerModule : Module() {
123126
upgrade.cancel()
124127
upgrades.remove(id)
125128
}
129+
130+
AsyncFunction("resetDevice") { macAddress: String, promise: Promise ->
131+
if (this@ReactNativeMcuManagerModule.bluetoothAdapter == null) {
132+
throw Exception("No bluetooth adapter")
133+
}
134+
135+
val device: BluetoothDevice = bluetoothAdapter.getRemoteDevice(macAddress)
136+
137+
val transport = McuMgrBleTransport(context, device)
138+
transport.connect(device).timeout(60000).await()
139+
140+
val manager = DefaultManager(transport)
141+
142+
val callback = object: McuMgrCallback<McuMgrOsResponse> {
143+
override fun onResponse(response: McuMgrOsResponse) {
144+
transport.release()
145+
promise.resolve()
146+
}
147+
148+
override fun onError(error: McuMgrException) {
149+
transport.release()
150+
promise.reject(CodedException("RESET_DEVICE_FAILED", "Failed to reset device", error))
151+
}
152+
}
153+
154+
manager.reset(callback)
155+
}
126156
}
127157
}

react-native-mcu-manager/ios/ReactNativeMcuManagerModule.swift

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -94,5 +94,32 @@ public class ReactNativeMcuManagerModule: Module {
9494
upgrade.cancel()
9595
self.upgrades[id] = nil
9696
}
97+
98+
AsyncFunction("resetDevice") { (bleId: String, promise: Promise) in
99+
guard let bleUuid = UUID(uuidString: bleId) else {
100+
promise.reject(Exception(name: "UUIDParseError", description: "Failed to parse UUID"))
101+
return
102+
}
103+
104+
let bleTransport = McuMgrBleTransport(bleUuid)
105+
let manager = DefaultManager(transport: bleTransport)
106+
107+
manager.reset { (response: McuMgrResponse?, err: Error?) in
108+
bleTransport.close()
109+
110+
if err != nil {
111+
promise.reject(Exception(name: "ResetError", description: err!.localizedDescription))
112+
return
113+
}
114+
115+
let smpErr = response?.getError()
116+
if (smpErr != nil) {
117+
promise.reject(Exception(name: "ResetError", description: smpErr!.localizedDescription))
118+
return
119+
}
120+
121+
promise.resolve()
122+
}
123+
}
97124
}
98125
}

react-native-mcu-manager/src/index.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,5 +6,9 @@ export const eraseImage = McuManagerModule?.eraseImage as (
66
bleId: string
77
) => Promise<void>;
88

9+
export const resetDevice = McuManagerModule?.resetDevice as (
10+
bleId: string
11+
) => Promise<void>;
12+
913
export { Upgrade, UpgradeMode, UpgradeFileType };
1014
export type { FirmwareUpgradeState, UpgradeOptions };

0 commit comments

Comments
 (0)