|
|
@ -1,29 +1,47 @@
|
|
|
|
package com.unicod.uarttest
|
|
|
|
package com.unicod.uarttest
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
import android.annotation.SuppressLint
|
|
|
|
|
|
|
|
import android.app.Application
|
|
|
|
|
|
|
|
import android.content.Context
|
|
|
|
import android.os.Bundle
|
|
|
|
import android.os.Bundle
|
|
|
|
import androidx.activity.ComponentActivity
|
|
|
|
import androidx.activity.ComponentActivity
|
|
|
|
import androidx.activity.compose.setContent
|
|
|
|
import androidx.activity.compose.setContent
|
|
|
|
import androidx.activity.enableEdgeToEdge
|
|
|
|
import androidx.activity.enableEdgeToEdge
|
|
|
|
|
|
|
|
import androidx.activity.viewModels
|
|
|
|
|
|
|
|
import androidx.compose.foundation.layout.Column
|
|
|
|
import androidx.compose.foundation.layout.fillMaxSize
|
|
|
|
import androidx.compose.foundation.layout.fillMaxSize
|
|
|
|
import androidx.compose.foundation.layout.padding
|
|
|
|
import androidx.compose.foundation.layout.padding
|
|
|
|
|
|
|
|
import androidx.compose.foundation.lazy.LazyColumn
|
|
|
|
|
|
|
|
import androidx.compose.material3.Button
|
|
|
|
import androidx.compose.material3.Scaffold
|
|
|
|
import androidx.compose.material3.Scaffold
|
|
|
|
import androidx.compose.material3.Text
|
|
|
|
import androidx.compose.material3.Text
|
|
|
|
import androidx.compose.runtime.Composable
|
|
|
|
import androidx.compose.runtime.Composable
|
|
|
|
|
|
|
|
import androidx.compose.runtime.mutableStateListOf
|
|
|
|
import androidx.compose.ui.Modifier
|
|
|
|
import androidx.compose.ui.Modifier
|
|
|
|
import androidx.compose.ui.tooling.preview.Preview
|
|
|
|
import androidx.compose.ui.tooling.preview.Preview
|
|
|
|
|
|
|
|
import androidx.lifecycle.AndroidViewModel
|
|
|
|
|
|
|
|
import com.hoho.android.usbserial.driver.UsbSerialDriver
|
|
|
|
|
|
|
|
import com.hoho.android.usbserial.driver.UsbSerialProber
|
|
|
|
import com.unicod.uarttest.ui.theme.UartTestTheme
|
|
|
|
import com.unicod.uarttest.ui.theme.UartTestTheme
|
|
|
|
|
|
|
|
import android.hardware.usb.UsbManager
|
|
|
|
|
|
|
|
import androidx.compose.foundation.layout.WindowInsets
|
|
|
|
|
|
|
|
import androidx.compose.foundation.layout.asPaddingValues
|
|
|
|
|
|
|
|
import androidx.compose.foundation.layout.statusBars
|
|
|
|
|
|
|
|
import androidx.compose.foundation.lazy.items
|
|
|
|
|
|
|
|
import androidx.compose.material3.Card
|
|
|
|
|
|
|
|
import androidx.compose.ui.unit.dp
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class MainActivity : ComponentActivity() {
|
|
|
|
class MainActivity : ComponentActivity() {
|
|
|
|
|
|
|
|
private val viewModel: UsbViewModel by viewModels()
|
|
|
|
|
|
|
|
|
|
|
|
override fun onCreate(savedInstanceState: Bundle?) {
|
|
|
|
override fun onCreate(savedInstanceState: Bundle?) {
|
|
|
|
super.onCreate(savedInstanceState)
|
|
|
|
super.onCreate(savedInstanceState)
|
|
|
|
enableEdgeToEdge()
|
|
|
|
enableEdgeToEdge()
|
|
|
|
setContent {
|
|
|
|
setContent {
|
|
|
|
UartTestTheme {
|
|
|
|
UartTestTheme {
|
|
|
|
Scaffold(modifier = Modifier.fillMaxSize()) { innerPadding ->
|
|
|
|
Scaffold(modifier = Modifier.fillMaxSize()) { innerPadding ->
|
|
|
|
Greeting(
|
|
|
|
UsbDeviceList(viewModel)
|
|
|
|
name = "Android",
|
|
|
|
|
|
|
|
modifier = Modifier.padding(innerPadding)
|
|
|
|
|
|
|
|
)
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
@ -44,4 +62,53 @@ fun GreetingPreview() {
|
|
|
|
UartTestTheme {
|
|
|
|
UartTestTheme {
|
|
|
|
Greeting("Android")
|
|
|
|
Greeting("Android")
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
fun findUsbSerialDevices(context: Context): List<UsbSerialDriver> {
|
|
|
|
|
|
|
|
val usbManager = context.getSystemService(Context.USB_SERVICE) as UsbManager
|
|
|
|
|
|
|
|
return UsbSerialProber.getDefaultProber().findAllDrivers(usbManager)
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class UsbViewModel(application: Application) : AndroidViewModel(application) {
|
|
|
|
|
|
|
|
private val _devices = mutableStateListOf<UsbSerialDriver>()
|
|
|
|
|
|
|
|
val devices: List<UsbSerialDriver> get() = _devices
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
fun scanUsbDevices() {
|
|
|
|
|
|
|
|
val found = findUsbSerialDevices(getApplication())
|
|
|
|
|
|
|
|
_devices.clear()
|
|
|
|
|
|
|
|
_devices.addAll(found)
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@Composable
|
|
|
|
|
|
|
|
fun UsbDeviceList(viewModel: UsbViewModel) {
|
|
|
|
|
|
|
|
val devices = viewModel.devices
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Column (
|
|
|
|
|
|
|
|
modifier = Modifier
|
|
|
|
|
|
|
|
.fillMaxSize()
|
|
|
|
|
|
|
|
.padding(WindowInsets.statusBars.asPaddingValues())
|
|
|
|
|
|
|
|
) {
|
|
|
|
|
|
|
|
Button(onClick = { viewModel.scanUsbDevices() }) {
|
|
|
|
|
|
|
|
Text("Scan USB Devices")
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
LazyColumn {
|
|
|
|
|
|
|
|
items(viewModel.devices) { driver ->
|
|
|
|
|
|
|
|
Card() {
|
|
|
|
|
|
|
|
Column(modifier = Modifier.padding(8.dp)) {
|
|
|
|
|
|
|
|
Text("Device: ${driver.device.deviceName}")
|
|
|
|
|
|
|
|
Text("Vendor ID: ${driver.device.vendorId}, Product ID: ${driver.device.productId}")
|
|
|
|
|
|
|
|
Text("Ports: ${driver.ports.size}")
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
driver.ports.forEachIndexed { index, port ->
|
|
|
|
|
|
|
|
Text("↳ Port #$index", modifier = Modifier.padding(start = 16.dp))
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|