Skip to content

Commit d7fb012

Browse files
authored
Merge pull request #3 from bpavuk/dev
v0.3
2 parents e4d3dd9 + 56ad6ae commit d7fb012

10 files changed

Lines changed: 60 additions & 50 deletions

File tree

app/build.gradle.kts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,8 @@ android {
1212
applicationId = "dev.bpavuk.touche"
1313
minSdk = 24
1414
targetSdk = 35
15-
versionCode = 3
16-
versionName = "0.2.1"
15+
versionCode = 4
16+
versionName = "0.3"
1717

1818
testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
1919
}

app/src/main/java/dev/bpavuk/touche/SurfaceActivity.kt

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -21,10 +21,10 @@ import androidx.core.view.WindowInsetsCompat
2121
import androidx.core.view.WindowInsetsControllerCompat
2222
import dev.bpavuk.touche.input.InputViewModel
2323
import dev.bpavuk.touche.input.StylusSurface
24-
import dev.bpavuk.touche.input.WatcherViewModel
24+
import dev.bpavuk.touche.connectivity.WatcherViewModel
2525
import dev.bpavuk.touche.ui.theme.ToucheTheme
26-
import dev.bpavuk.touche.usb.UsbConnection
27-
import dev.bpavuk.touche.usb.UsbDisconnectBroadcastReceiver
26+
import dev.bpavuk.touche.connectivity.usb.UsbConnection
27+
import dev.bpavuk.touche.connectivity.usb.UsbDisconnectBroadcastReceiver
2828

2929
const val TAG = "Surface"
3030

app/src/main/java/dev/bpavuk/touche/input/WatcherViewModel.kt renamed to app/src/main/java/dev/bpavuk/touche/connectivity/WatcherViewModel.kt

Lines changed: 26 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1,37 +1,43 @@
1-
package dev.bpavuk.touche.input
1+
package dev.bpavuk.touche.connectivity
22

33
import android.util.Log
44
import androidx.lifecycle.ViewModel
55
import androidx.lifecycle.viewModelScope
6-
import dev.bpavuk.touche.input.types.ToucheInput
7-
import dev.bpavuk.touche.input.types.ToucheScreenSize
8-
import dev.bpavuk.touche.usb.UsbConnection
9-
import kotlinx.coroutines.Dispatchers
6+
import dev.bpavuk.touche.connectivity.usb.UsbConnection
7+
import dev.bpavuk.touche.types.Opcode
8+
import dev.bpavuk.touche.types.ToucheInput
9+
import dev.bpavuk.touche.types.ToucheScreenSize
10+
import kotlinx.coroutines.currentCoroutineContext
1011
import kotlinx.coroutines.flow.MutableStateFlow
1112
import kotlinx.coroutines.flow.combine
1213
import kotlinx.coroutines.flow.flow
13-
import kotlinx.coroutines.flow.flowOn
14+
import kotlinx.coroutines.isActive
1415
import kotlinx.coroutines.launch
16+
import java.io.IOException
1517

1618
class WatcherViewModel(private val connection: UsbConnection) : ViewModel() {
1719
private val stateFlow = MutableStateFlow(WatcherState.initial)
1820
private val opcodeFlow = flow {
19-
while (true) emit(Opcode(connection.read()))
20-
}.flowOn(Dispatchers.IO)
21+
try {
22+
while (currentCoroutineContext().isActive) {
23+
emit(Opcode(connection.read()))
24+
}
25+
} catch (e: IOException) {
26+
Log.d("Watcher", "I/O exception. Details:\n$e")
27+
}
28+
}
2129

2230
private val dataFlow = combine(opcodeFlow, stateFlow) { it1, it2 -> it1 to it2 }
2331

2432
fun watch() {
2533
viewModelScope.launch {
2634
dataFlow.collect { (opcode, state) ->
27-
Log.d("Watcher", "data flow collected")
28-
if (opcode.consumed || state.consumed || state == WatcherState.initial) {
35+
if (state.consumed || state == WatcherState.initial) {
2936
return@collect
3037
}
3138

3239
val encodedState = state.encode(opcode) ?: return@collect
3340
connection.write(encodedState)
34-
opcode.consume()
3541
}
3642
}
3743
}
@@ -70,7 +76,7 @@ private data class WatcherState(
7076
}
7177

7278
2 -> {
73-
screen.encode()
79+
screen.encode().encodeToByteArray()
7480
}
7581

7682
else -> throw InvalidOpcodeException(opcode)
@@ -80,17 +86,14 @@ private data class WatcherState(
8086
fun consume() {
8187
consumed = true
8288
}
83-
}
8489

85-
private fun List<ToucheInput>.encode(): ByteArray? =
86-
map { it.encode() }.reduceOrNull { acc, toucheInput ->
87-
acc + "\n".encodeToByteArray() + toucheInput
90+
private fun List<ToucheInput>.encode(): ByteArray? {
91+
val data1 = map {
92+
it.encode()
93+
}
94+
if (data1.isEmpty()) return null
95+
val data = data1.joinToString("\n")
96+
return data.encodeToByteArray()
8897
}
98+
}
8999

90-
data class Opcode(
91-
val value: Int, var consumed: Boolean = false
92-
) {
93-
fun consume() {
94-
consumed = true
95-
}
96-
}

app/src/main/java/dev/bpavuk/touche/usb/USB.kt renamed to app/src/main/java/dev/bpavuk/touche/connectivity/usb/USB.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package dev.bpavuk.touche.usb
1+
package dev.bpavuk.touche.connectivity.usb
22

33
import android.content.BroadcastReceiver
44
import android.content.Context

app/src/main/java/dev/bpavuk/touche/input/InputViewModel.kt

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,9 @@ import androidx.compose.ui.unit.IntSize
66
import androidx.compose.ui.unit.toSize
77
import androidx.lifecycle.ViewModel
88
import androidx.lifecycle.viewModelScope
9-
import dev.bpavuk.touche.input.types.ToucheScreenSize
10-
import dev.bpavuk.touche.input.types.ToucheInput
9+
import dev.bpavuk.touche.connectivity.WatcherViewModel
10+
import dev.bpavuk.touche.types.ToucheScreenSize
11+
import dev.bpavuk.touche.types.ToucheInput
1112
import kotlinx.coroutines.launch
1213

1314

@@ -21,8 +22,9 @@ class InputViewModel(
2122
fun pass(inputChange: List<PointerInputChange>) {
2223
viewModelScope.launch {
2324
watcher.pass(inputChange.map {
25+
val input = it.toToucheInput()
2426
it.consume()
25-
it.toToucheInput()
27+
input
2628
})
2729
}
2830
}

app/src/main/java/dev/bpavuk/touche/input/types/ToucheData.kt

Lines changed: 0 additions & 5 deletions
This file was deleted.
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
package dev.bpavuk.touche.types
2+
3+
data class Opcode(val value: Int)
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
package dev.bpavuk.touche.types
2+
3+
interface ToucheData {
4+
fun encode(): String
5+
}

app/src/main/java/dev/bpavuk/touche/input/types/ToucheInput.kt renamed to app/src/main/java/dev/bpavuk/touche/types/ToucheInput.kt

Lines changed: 12 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package dev.bpavuk.touche.input.types
1+
package dev.bpavuk.touche.types
22

33
import androidx.compose.ui.geometry.Offset
44
import androidx.compose.ui.input.pointer.PointerId
@@ -11,25 +11,27 @@ sealed interface ToucheInput : ToucheData {
1111
val pressed: Boolean,
1212
val pressure: Float,
1313
) : ToucheInput {
14-
override fun encode(): ByteArray = buildString {
14+
override fun encode(): String = buildString {
1515
append("S\t")
1616
append("${offset.x}\t")
1717
append("${offset.y}\t")
1818
append(if (pressed) "1\t${pressure}" else "0")
19-
}.encodeToByteArray()
19+
}
2020
}
2121

2222
data class Finger(
2323
override val offset: Offset,
2424
val pressed: Boolean,
2525
val id: PointerId
2626
) : ToucheInput {
27-
override fun encode(): ByteArray = buildString {
28-
append("F\t")
29-
append("${offset.x}\t")
30-
append("${offset.y}\t")
31-
append(if (pressed) "1\t" else "0\t")
32-
append(id.value)
33-
}.encodeToByteArray()
27+
override fun encode(): String {
28+
return buildString {
29+
append("F\t")
30+
append("${offset.x}\t")
31+
append("${offset.y}\t")
32+
append(if (pressed) "1\t" else "0\t")
33+
append(id.value)
34+
}
35+
}
3436
}
3537
}

app/src/main/java/dev/bpavuk/touche/input/types/ToucheScreenSize.kt renamed to app/src/main/java/dev/bpavuk/touche/types/ToucheScreenSize.kt

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
1-
package dev.bpavuk.touche.input.types
1+
package dev.bpavuk.touche.types
22

33
data class ToucheScreenSize(val x: Int, val y: Int) : ToucheData {
4-
override fun encode(): ByteArray = buildString {
4+
override fun encode(): String = buildString {
55
append("X\t")
66
append("$x\t")
77
append(y)
8-
}.encodeToByteArray()
8+
}
99
}

0 commit comments

Comments
 (0)