Skip to content

Commit f361dc2

Browse files
committed
Update SerialConnectionFactory.kt
1 parent 35b16d9 commit f361dc2

1 file changed

Lines changed: 27 additions & 17 deletions

File tree

Transmission/src/main/java/org/operatorfoundation/transmission/SerialConnectionFactory.kt

Lines changed: 27 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -6,12 +6,17 @@ import android.hardware.usb.UsbManager
66
import com.hoho.android.usbserial.driver.ProbeTable
77
import com.hoho.android.usbserial.driver.UsbSerialDriver
88
import com.hoho.android.usbserial.driver.UsbSerialProber
9+
import kotlinx.coroutines.CoroutineScope
10+
import kotlinx.coroutines.Dispatchers
11+
import kotlinx.coroutines.SupervisorJob
12+
import kotlinx.coroutines.cancel
913
import kotlinx.coroutines.flow.Flow
1014
import kotlinx.coroutines.flow.MutableStateFlow
1115
import kotlinx.coroutines.flow.StateFlow
1216
import kotlinx.coroutines.flow.asStateFlow
1317
import kotlinx.coroutines.flow.first
1418
import kotlinx.coroutines.launch
19+
import kotlinx.coroutines.withContext
1520
import timber.log.Timber
1621

1722
/**
@@ -42,7 +47,7 @@ class SerialConnectionFactory(context: Context)
4247

4348
private val usbManager = context.getSystemService(Context.USB_SERVICE) as UsbManager
4449
private val permissionManager = USBPermissionManager(context)
45-
50+
private val connectionScope = CoroutineScope(Dispatchers.Main + SupervisorJob())
4651
private val _connectionState = MutableStateFlow<ConnectionState>(ConnectionState.Disconnected)
4752
val connectionState: StateFlow<ConnectionState> = _connectionState.asStateFlow()
4853

@@ -67,45 +72,48 @@ class SerialConnectionFactory(context: Context)
6772
parity: Int = DEFAULT_PARITY
6873
)
6974
{
70-
// Prevent multiple simultaneous connection attempts
71-
if (_connectionState.value != ConnectionState.Disconnected)
75+
// Check current state
76+
val currentState = _connectionState.value
77+
if (currentState !is ConnectionState.Disconnected && currentState !is ConnectionState.Error)
7278
{
73-
Timber.w("Connection already in progress, ignoring new request")
79+
Timber.w("Connection already in progress (state: $currentState), ignoring new request")
7480
return
7581
}
7682

77-
// Start connection process
78-
kotlinx.coroutines.GlobalScope.launch {
83+
connectionScope.launch {
7984
try
8085
{
81-
Timber.d("Requesting USB permission for ${device.deviceName}")
86+
Timber.d("🔵 Requesting USB permission for ${device.deviceName}")
8287
_connectionState.value = ConnectionState.RequestingPermission
8388

84-
// Request permission and wait for result
85-
val permissionResult = permissionManager.requestPermissionFor(device).first()
89+
// Switch to IO for permission request
90+
val permissionResult = withContext(Dispatchers.IO) {
91+
permissionManager.requestPermissionFor(device).first()
92+
}
8693

87-
Timber.d("Permission result received: $permissionResult")
94+
Timber.d("🔵 Permission result: $permissionResult")
8895

8996
when (permissionResult)
9097
{
9198
is USBPermissionManager.PermissionResult.Granted -> {
92-
Timber.d("Permission granted, connecting to device...")
99+
Timber.d("🟢 Permission GRANTED, connecting...")
93100
_connectionState.value = ConnectionState.Connecting
94101

95-
// Create the serial connection
96-
val connection = createSerialConnection(device, baudRate, dataBits, stopBits, parity)
102+
val connection = withContext(Dispatchers.IO) {
103+
createSerialConnection(device, baudRate, dataBits, stopBits, parity)
104+
}
97105

98-
Timber.d("Serial connection established successfully")
106+
Timber.d("🟢 Serial connection established")
99107
_connectionState.value = ConnectionState.Connected(connection)
100108
}
101109

102110
is USBPermissionManager.PermissionResult.Denied -> {
103-
Timber.w("USB permission denied by user")
111+
Timber.w("🔴 USB permission DENIED")
104112
_connectionState.value = ConnectionState.Error("USB permission denied by user")
105113
}
106114

107115
is USBPermissionManager.PermissionResult.Error -> {
108-
Timber.e("Permission request failed: ${permissionResult.message}")
116+
Timber.e("🔴 Permission error: ${permissionResult.message}")
109117
_connectionState.value = ConnectionState.Error(
110118
"Permission request failed: ${permissionResult.message}"
111119
)
@@ -114,7 +122,7 @@ class SerialConnectionFactory(context: Context)
114122
}
115123
catch (e: Exception)
116124
{
117-
Timber.e(e, "Failed to create connection")
125+
Timber.e(e, "🔴 Connection failed")
118126
_connectionState.value = ConnectionState.Error(
119127
"Failed to create connection: ${e.message}",
120128
e
@@ -218,6 +226,8 @@ class SerialConnectionFactory(context: Context)
218226
{
219227
currentState.connection.close()
220228
}
229+
230+
connectionScope.cancel()
221231
_connectionState.value = ConnectionState.Disconnected
222232
}
223233

0 commit comments

Comments
 (0)