Масштаб графиков
This commit is contained in:
parent
c59c929f35
commit
f97811ed9e
|
|
@ -14,7 +14,7 @@ android {
|
|||
minSdk 24
|
||||
targetSdk 33
|
||||
versionCode 5
|
||||
versionName "1.2.3"
|
||||
versionName "1.2.5"
|
||||
|
||||
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
|
||||
vectorDrawables {
|
||||
|
|
@ -24,7 +24,7 @@ android {
|
|||
|
||||
buildTypes {
|
||||
release {
|
||||
minifyEnabled false
|
||||
minifyEnabled true
|
||||
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
|
||||
}
|
||||
}
|
||||
|
|
@ -47,8 +47,8 @@ android {
|
|||
}
|
||||
}
|
||||
|
||||
applicationVariants.all { variant ->
|
||||
variant.outputs.all {
|
||||
applicationVariants.configureEach { variant ->
|
||||
variant.outputs.configureEach {
|
||||
outputFileName = "Arma BLE v${defaultConfig.versionName}.apk"
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,7 +1,6 @@
|
|||
package llc.arma.ble.app.ui
|
||||
|
||||
import android.Manifest
|
||||
import android.annotation.SuppressLint
|
||||
import android.content.BroadcastReceiver
|
||||
import android.content.Context
|
||||
import android.content.Intent
|
||||
|
|
|
|||
|
|
@ -3,7 +3,10 @@ package llc.arma.ble.app.ui.model
|
|||
import androidx.compose.runtime.getValue
|
||||
import androidx.compose.runtime.mutableStateOf
|
||||
import androidx.compose.runtime.setValue
|
||||
import llc.arma.ble.domain.model.Ble
|
||||
import llc.arma.ble.domain.model.BleInfo
|
||||
import llc.arma.ble.domain.usecase.AccelScale
|
||||
import llc.arma.ble.domain.usecase.AccelViewMode
|
||||
|
||||
sealed class BleView(
|
||||
val info: BleInfo
|
||||
|
|
@ -16,7 +19,7 @@ sealed class BleView(
|
|||
) : BleView(info) {
|
||||
|
||||
class AccelerometerState(
|
||||
saveHistory: Boolean,
|
||||
saveHistory: Ble.Accelerometer.History,
|
||||
historyInterval: Long
|
||||
) {
|
||||
|
||||
|
|
|
|||
|
|
@ -4,7 +4,6 @@ import llc.arma.ble.app.ui.common.ViewEvent
|
|||
import llc.arma.ble.app.ui.common.ViewSideEffect
|
||||
import llc.arma.ble.app.ui.common.ViewState
|
||||
import llc.arma.ble.app.ui.model.BleView
|
||||
import llc.arma.ble.app.ui.screen.inspection.beacon.BeaconContract
|
||||
import llc.arma.ble.domain.model.Ble
|
||||
import llc.arma.ble.domain.usecase.AccelScale
|
||||
import llc.arma.ble.domain.usecase.AccelViewMode
|
||||
|
|
@ -27,16 +26,21 @@ class AccelerometerContract {
|
|||
|
||||
data class OnAccelViewModeEdit(
|
||||
val next: Next
|
||||
) : Event(){
|
||||
) : Event()
|
||||
|
||||
enum class Next {
|
||||
ACCEL, SPECTRE
|
||||
ACCEL, SPECTRE, HISTORY
|
||||
}
|
||||
|
||||
}
|
||||
data class OnAccelScaleEdit(
|
||||
val next: Next
|
||||
) : Event()
|
||||
|
||||
object OnAccelEdit : Event()
|
||||
object OnSpectreEdit : Event()
|
||||
object OnHistoryEdit : Event()
|
||||
object OnFftFrequencyEdit : Event()
|
||||
|
||||
object OnFftAxisEdit : Event()
|
||||
object OnFftModeEdit : Event()
|
||||
|
||||
|
|
@ -50,6 +54,7 @@ class AccelerometerContract {
|
|||
|
||||
object OnChangePassword : Event()
|
||||
object OnSaveIntervalEdit : Event()
|
||||
object OnHideHistoryEdit : Event()
|
||||
|
||||
data class OnBleChanged(
|
||||
val ble: Ble.Accelerometer,
|
||||
|
|
@ -63,6 +68,10 @@ class AccelerometerContract {
|
|||
val mode: AccelViewMode
|
||||
) : Event()
|
||||
|
||||
data class OnHistoryViewModeChanged(
|
||||
val mode: AccelViewMode
|
||||
) : Event()
|
||||
|
||||
data class OnFftFrequencyChanged(
|
||||
val frequency: FftFrequency
|
||||
) : Event()
|
||||
|
|
@ -75,6 +84,14 @@ class AccelerometerContract {
|
|||
val mode: FftViewMode
|
||||
) : Event()
|
||||
|
||||
data class OnAccelScaleChanged(
|
||||
val scale: AccelScale
|
||||
) : Event()
|
||||
|
||||
data class OnHistoryScaleChanged(
|
||||
val scale: AccelScale
|
||||
) : Event()
|
||||
|
||||
data class OnSaveHistoryChanged(
|
||||
val save: Boolean
|
||||
) : Event()
|
||||
|
|
@ -132,18 +149,28 @@ class AccelerometerContract {
|
|||
object ShowWriteBle : Effect()
|
||||
object HideWriteBle : Effect()
|
||||
|
||||
data class ShowAccelEdit(
|
||||
val next: Event.OnAccelViewModeEdit.Next
|
||||
object HideHistoryEdit : Effect()
|
||||
|
||||
data class ShowAccelViewEdit(
|
||||
val next: Event.Next
|
||||
) : Effect()
|
||||
|
||||
data class ShowAccelScaleEdit(
|
||||
val next: Event.Next
|
||||
) : Effect()
|
||||
|
||||
object ShowAccelEdit : Effect()
|
||||
object ShowSpectreEdit : Effect()
|
||||
object ShowFftFrequencyEdit : Effect()
|
||||
object ShowFftAxisEdit : Effect()
|
||||
object ShowFftModeEdit : Effect()
|
||||
|
||||
|
||||
object HideIntervalPicker : Effect()
|
||||
object ShowIntervalPicker : Effect()
|
||||
|
||||
object ShowHistoryEdit : Effect()
|
||||
|
||||
sealed class Navigation : Effect() {
|
||||
|
||||
object NavigateToChangePassword : Navigation()
|
||||
|
|
|
|||
|
|
@ -17,15 +17,18 @@ import kotlinx.coroutines.flow.launchIn
|
|||
import kotlinx.coroutines.flow.onEach
|
||||
import kotlinx.coroutines.launch
|
||||
import llc.arma.ble.app.ui.common.rememberBottomDialogState
|
||||
import llc.arma.ble.app.ui.screen.inspection.accelerometer.view.AccelEdit
|
||||
import llc.arma.ble.app.ui.screen.inspection.accelerometer.view.AccelFftAxisEdit
|
||||
import llc.arma.ble.app.ui.screen.inspection.accelerometer.view.AccelFftModeEdit
|
||||
import llc.arma.ble.app.ui.screen.inspection.accelerometer.view.AccelFrequencyEdit
|
||||
import llc.arma.ble.app.ui.screen.inspection.accelerometer.view.AccelScaleEdit
|
||||
import llc.arma.ble.app.ui.screen.inspection.accelerometer.view.AccelSpectreEdit
|
||||
import llc.arma.ble.app.ui.screen.inspection.accelerometer.view.AccelViewEdit
|
||||
import llc.arma.ble.app.ui.screen.inspection.accelerometer.view.AccelerometerSpectre
|
||||
import llc.arma.ble.app.ui.screen.inspection.accelerometer.view.AccelerometerAccel
|
||||
import llc.arma.ble.app.ui.screen.inspection.accelerometer.view.AccelerometerHistory
|
||||
import llc.arma.ble.app.ui.screen.inspection.accelerometer.view.DisplayState
|
||||
import llc.arma.ble.app.ui.screen.inspection.accelerometer.view.HistoryEdit
|
||||
import llc.arma.ble.app.ui.screen.inspection.accelerometer.view.IntervalEdit
|
||||
import llc.arma.ble.app.ui.screen.inspection.accelerometer.view.LoadingState
|
||||
import llc.arma.ble.app.ui.screen.inspection.accelerometer.view.PowerEdit
|
||||
|
|
@ -33,7 +36,7 @@ import llc.arma.ble.app.ui.screen.inspection.accelerometer.view.Write
|
|||
import llc.arma.ble.domain.model.Ble
|
||||
|
||||
enum class SheetPage {
|
||||
HISTORY, ACCEL, POWER, WRITE, SPECTRE, ACCEL_MODE_EDIT, SPECTRE_MODE_EDIT, SPECTRE_EDIT, FREQUENCY_EDIT, AXIS_EDIT, FFT_MODE_EDIT, INTERVAL_EDIT
|
||||
HISTORY, ACCEL_SCALE, SPECTRE_SCALE, HISTORY_MODE_EDIT, HISTORY_SCALE, HISTORY_EDIT, ACCEL_EDIT, ACCEL, POWER, WRITE, SPECTRE, ACCEL_MODE_EDIT, SPECTRE_MODE_EDIT, SPECTRE_EDIT, FREQUENCY_EDIT, AXIS_EDIT, FFT_MODE_EDIT, INTERVAL_EDIT
|
||||
}
|
||||
|
||||
@OptIn(ExperimentalMaterialApi::class)
|
||||
|
|
@ -157,7 +160,7 @@ fun AccelerometerScreen(
|
|||
|
||||
if(currentState is AccelerometerContract.State.Display) {
|
||||
AccelViewEdit(
|
||||
next = AccelerometerContract.Event.OnAccelViewModeEdit.Next.ACCEL,
|
||||
next = AccelerometerContract.Event.Next.ACCEL,
|
||||
state = currentState,
|
||||
onEvent = {
|
||||
viewModel.setEvent(it)
|
||||
|
|
@ -172,7 +175,22 @@ fun AccelerometerScreen(
|
|||
|
||||
if(currentState is AccelerometerContract.State.Display) {
|
||||
AccelViewEdit(
|
||||
next = AccelerometerContract.Event.OnAccelViewModeEdit.Next.SPECTRE,
|
||||
next = AccelerometerContract.Event.Next.SPECTRE,
|
||||
state = currentState,
|
||||
onEvent = {
|
||||
viewModel.setEvent(it)
|
||||
}
|
||||
)
|
||||
}
|
||||
|
||||
}
|
||||
SheetPage.HISTORY_MODE_EDIT -> bottomDialog.show {
|
||||
|
||||
val currentState = viewModel.viewState.value
|
||||
|
||||
if(currentState is AccelerometerContract.State.Display) {
|
||||
AccelViewEdit(
|
||||
next = AccelerometerContract.Event.Next.HISTORY,
|
||||
state = currentState,
|
||||
onEvent = {
|
||||
viewModel.setEvent(it)
|
||||
|
|
@ -237,7 +255,6 @@ fun AccelerometerScreen(
|
|||
}
|
||||
|
||||
}
|
||||
|
||||
SheetPage.INTERVAL_EDIT -> bottomDialog.show {
|
||||
|
||||
val currentState = viewModel.viewState.value
|
||||
|
|
@ -252,12 +269,82 @@ fun AccelerometerScreen(
|
|||
}
|
||||
|
||||
}
|
||||
SheetPage.ACCEL_SCALE -> bottomDialog.show {
|
||||
|
||||
val currentState = viewModel.viewState.value
|
||||
|
||||
if(currentState is AccelerometerContract.State.Display) {
|
||||
AccelScaleEdit(
|
||||
next = AccelerometerContract.Event.Next.ACCEL,
|
||||
state = currentState,
|
||||
onEvent = {
|
||||
viewModel.setEvent(it)
|
||||
}
|
||||
)
|
||||
}
|
||||
|
||||
}
|
||||
SheetPage.SPECTRE_SCALE -> bottomDialog.show {
|
||||
|
||||
val currentState = viewModel.viewState.value
|
||||
|
||||
if(currentState is AccelerometerContract.State.Display) {
|
||||
AccelScaleEdit(
|
||||
next = AccelerometerContract.Event.Next.SPECTRE,
|
||||
state = currentState,
|
||||
onEvent = {
|
||||
viewModel.setEvent(it)
|
||||
}
|
||||
)
|
||||
}
|
||||
|
||||
}
|
||||
SheetPage.HISTORY_SCALE -> bottomDialog.show {
|
||||
|
||||
val currentState = viewModel.viewState.value
|
||||
|
||||
if(currentState is AccelerometerContract.State.Display) {
|
||||
AccelScaleEdit(
|
||||
next = AccelerometerContract.Event.Next.HISTORY,
|
||||
state = currentState,
|
||||
onEvent = {
|
||||
viewModel.setEvent(it)
|
||||
}
|
||||
)
|
||||
}
|
||||
|
||||
}
|
||||
SheetPage.ACCEL_EDIT -> bottomDialog.show {
|
||||
|
||||
val currentState = viewModel.viewState.value
|
||||
|
||||
if(currentState is AccelerometerContract.State.Display) {
|
||||
AccelEdit(
|
||||
state = currentState,
|
||||
onEvent = {
|
||||
viewModel.setEvent(it)
|
||||
}
|
||||
)
|
||||
}
|
||||
|
||||
}
|
||||
SheetPage.HISTORY_EDIT -> bottomDialog.show {
|
||||
|
||||
val currentState = viewModel.viewState.value
|
||||
|
||||
if(currentState is AccelerometerContract.State.Display) {
|
||||
HistoryEdit(
|
||||
state = currentState,
|
||||
onEvent = {
|
||||
viewModel.setEvent(it)
|
||||
}
|
||||
)
|
||||
}
|
||||
|
||||
}
|
||||
null -> {
|
||||
bottomDialog.hide()
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -300,12 +387,13 @@ fun AccelerometerScreen(
|
|||
delay(100)
|
||||
sheetPage = SheetPage.SPECTRE
|
||||
}
|
||||
is AccelerometerContract.Effect.ShowAccelEdit -> launch {
|
||||
is AccelerometerContract.Effect.ShowAccelViewEdit -> launch {
|
||||
sheetPage = null
|
||||
delay(100)
|
||||
sheetPage = when(it.next){
|
||||
AccelerometerContract.Event.OnAccelViewModeEdit.Next.ACCEL -> SheetPage.ACCEL_MODE_EDIT
|
||||
AccelerometerContract.Event.OnAccelViewModeEdit.Next.SPECTRE -> SheetPage.SPECTRE_MODE_EDIT
|
||||
AccelerometerContract.Event.Next.ACCEL -> SheetPage.ACCEL_MODE_EDIT
|
||||
AccelerometerContract.Event.Next.SPECTRE -> SheetPage.SPECTRE_MODE_EDIT
|
||||
AccelerometerContract.Event.Next.HISTORY -> SheetPage.HISTORY_MODE_EDIT
|
||||
}
|
||||
}
|
||||
is AccelerometerContract.Effect.ShowSpectreEdit -> launch {
|
||||
|
|
@ -328,25 +416,46 @@ fun AccelerometerScreen(
|
|||
delay(100)
|
||||
sheetPage = SheetPage.FFT_MODE_EDIT
|
||||
}
|
||||
|
||||
AccelerometerContract.Effect.ShowAccelerometerHistory -> launch {
|
||||
is AccelerometerContract.Effect.ShowAccelerometerHistory -> launch {
|
||||
sheetPage = null
|
||||
delay(100)
|
||||
sheetPage = SheetPage.HISTORY
|
||||
}
|
||||
|
||||
AccelerometerContract.Effect.HideIntervalPicker -> {
|
||||
is AccelerometerContract.Effect.HideIntervalPicker -> {
|
||||
sheetPage = null
|
||||
delay(100)
|
||||
}
|
||||
AccelerometerContract.Effect.ShowIntervalPicker -> {
|
||||
is AccelerometerContract.Effect.ShowIntervalPicker -> {
|
||||
sheetPage = null
|
||||
delay(100)
|
||||
sheetPage = SheetPage.INTERVAL_EDIT
|
||||
}
|
||||
is AccelerometerContract.Effect.ShowAccelScaleEdit -> {
|
||||
sheetPage = null
|
||||
delay(100)
|
||||
sheetPage = when(it.next){
|
||||
AccelerometerContract.Event.Next.ACCEL -> SheetPage.ACCEL_SCALE
|
||||
AccelerometerContract.Event.Next.SPECTRE -> SheetPage.SPECTRE_SCALE
|
||||
AccelerometerContract.Event.Next.HISTORY -> SheetPage.HISTORY_SCALE
|
||||
}
|
||||
}
|
||||
is AccelerometerContract.Effect.ShowAccelEdit -> {
|
||||
sheetPage = null
|
||||
delay(100)
|
||||
sheetPage = SheetPage.ACCEL_EDIT
|
||||
}
|
||||
is AccelerometerContract.Effect.Navigation -> {
|
||||
onEvent(it)
|
||||
}
|
||||
is AccelerometerContract.Effect.ShowHistoryEdit -> {
|
||||
sheetPage = null
|
||||
delay(100)
|
||||
sheetPage = SheetPage.HISTORY_EDIT
|
||||
}
|
||||
is AccelerometerContract.Effect.HideHistoryEdit -> {
|
||||
sheetPage = null
|
||||
delay(100)
|
||||
}
|
||||
}
|
||||
}.launchIn(this)
|
||||
}
|
||||
|
|
|
|||
|
|
@ -7,8 +7,6 @@ import llc.arma.ble.app.ui.common.BaseViewModel
|
|||
import llc.arma.ble.app.ui.mapper.BleMapper
|
||||
import llc.arma.ble.app.ui.mapper.BleViewMapper
|
||||
import llc.arma.ble.app.ui.model.BleView
|
||||
import llc.arma.ble.app.ui.screen.inspection.beacon.BeaconContract
|
||||
import llc.arma.ble.app.ui.screen.inspection.thermometer.ThermometerContract
|
||||
import llc.arma.ble.domain.model.Ble
|
||||
import llc.arma.ble.domain.usecase.AccelScale
|
||||
import llc.arma.ble.domain.usecase.AccelViewMode
|
||||
|
|
@ -54,6 +52,106 @@ class AccelerometerViewModel @Inject constructor(
|
|||
is AccelerometerContract.Event.OnChangePassword -> reduce(viewState.value, event)
|
||||
is AccelerometerContract.Event.OnSaveIntervalChanged -> reduce(viewState.value, event)
|
||||
is AccelerometerContract.Event.OnSaveIntervalEdit -> reduce(viewState.value, event)
|
||||
is AccelerometerContract.Event.OnAccelScaleChanged -> reduce(viewState.value, event)
|
||||
is AccelerometerContract.Event.OnAccelScaleEdit -> reduce(viewState.value, event)
|
||||
is AccelerometerContract.Event.OnAccelEdit -> reduce(viewState.value, event)
|
||||
is AccelerometerContract.Event.OnHistoryEdit -> reduce(viewState.value, event)
|
||||
is AccelerometerContract.Event.OnHistoryScaleChanged -> reduce(viewState.value, event)
|
||||
is AccelerometerContract.Event.OnHistoryViewModeChanged -> reduce(viewState.value, event)
|
||||
is AccelerometerContract.Event.OnHideHistoryEdit -> reduce(viewState.value, event)
|
||||
}
|
||||
}
|
||||
|
||||
private fun reduce(
|
||||
state: AccelerometerContract.State,
|
||||
event: AccelerometerContract.Event.OnHideHistoryEdit
|
||||
) {
|
||||
|
||||
setEffect {
|
||||
AccelerometerContract.Effect.HideHistoryEdit
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
private fun reduce(
|
||||
state: AccelerometerContract.State,
|
||||
event: AccelerometerContract.Event.OnHistoryViewModeChanged
|
||||
) {
|
||||
|
||||
if(state is AccelerometerContract.State.Display){
|
||||
|
||||
var saveHistory = state.accelerometer.accelerometerState.saveHistory
|
||||
|
||||
if(saveHistory is Ble.Accelerometer.History.Enabled){
|
||||
saveHistory = Ble.Accelerometer.History.Enabled(
|
||||
mode = event.mode,
|
||||
scale = saveHistory.scale
|
||||
)
|
||||
}
|
||||
|
||||
state.accelerometer.accelerometerState.saveHistory = saveHistory
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
private fun reduce(
|
||||
state: AccelerometerContract.State,
|
||||
event: AccelerometerContract.Event.OnHistoryScaleChanged
|
||||
) {
|
||||
|
||||
if(state is AccelerometerContract.State.Display){
|
||||
|
||||
var saveHistory = state.accelerometer.accelerometerState.saveHistory
|
||||
|
||||
if(saveHistory is Ble.Accelerometer.History.Enabled){
|
||||
saveHistory = saveHistory.copy(scale = event.scale)
|
||||
}
|
||||
|
||||
|
||||
state.accelerometer.accelerometerState.saveHistory = saveHistory
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
private fun reduce(
|
||||
state: AccelerometerContract.State,
|
||||
event: AccelerometerContract.Event.OnHistoryEdit
|
||||
) {
|
||||
|
||||
setEffect {
|
||||
AccelerometerContract.Effect.ShowHistoryEdit
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
private fun reduce(
|
||||
state: AccelerometerContract.State,
|
||||
event: AccelerometerContract.Event.OnAccelScaleChanged
|
||||
) {
|
||||
|
||||
if(state is AccelerometerContract.State.Display){
|
||||
|
||||
setState {
|
||||
state.copy(
|
||||
accelScale = event.scale
|
||||
)
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
private fun reduce(
|
||||
state: AccelerometerContract.State,
|
||||
event: AccelerometerContract.Event.OnAccelScaleEdit
|
||||
) {
|
||||
setEffect {
|
||||
AccelerometerContract.Effect.ShowAccelScaleEdit(
|
||||
event.next
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -98,7 +196,22 @@ class AccelerometerViewModel @Inject constructor(
|
|||
|
||||
if(state is AccelerometerContract.State.Display) {
|
||||
|
||||
state.accelerometer.accelerometerState.saveHistory = event.save
|
||||
if(event.save){
|
||||
|
||||
state.accelerometer.accelerometerState.saveHistory = Ble.Accelerometer.History.Enabled(
|
||||
scale = AccelScale.S_2,
|
||||
mode = AccelViewMode.ACCELERATION
|
||||
)
|
||||
|
||||
setEffect {
|
||||
AccelerometerContract.Effect.ShowHistoryEdit
|
||||
}
|
||||
|
||||
} else {
|
||||
|
||||
state.accelerometer.accelerometerState.saveHistory = Ble.Accelerometer.History.Disabled
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
|
@ -188,6 +301,17 @@ class AccelerometerViewModel @Inject constructor(
|
|||
|
||||
}
|
||||
|
||||
private fun reduce(
|
||||
state: AccelerometerContract.State,
|
||||
event: AccelerometerContract.Event.OnAccelEdit
|
||||
) {
|
||||
|
||||
setEffect {
|
||||
AccelerometerContract.Effect.ShowAccelEdit
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
private fun reduce(
|
||||
state: AccelerometerContract.State,
|
||||
event: AccelerometerContract.Event.OnSpectreEdit
|
||||
|
|
@ -343,7 +467,7 @@ class AccelerometerViewModel @Inject constructor(
|
|||
event: AccelerometerContract.Event.OnAccelViewModeEdit
|
||||
) {
|
||||
setEffect {
|
||||
AccelerometerContract.Effect.ShowAccelEdit(event.next)
|
||||
AccelerometerContract.Effect.ShowAccelViewEdit(event.next)
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -0,0 +1,172 @@
|
|||
package llc.arma.ble.app.ui.screen.inspection.accelerometer.view
|
||||
|
||||
import androidx.compose.foundation.clickable
|
||||
import androidx.compose.foundation.layout.*
|
||||
import androidx.compose.foundation.rememberScrollState
|
||||
import androidx.compose.foundation.shape.CircleShape
|
||||
import androidx.compose.foundation.shape.RoundedCornerShape
|
||||
import androidx.compose.foundation.verticalScroll
|
||||
import androidx.compose.material.icons.Icons
|
||||
import androidx.compose.material.icons.rounded.KeyboardArrowDown
|
||||
import androidx.compose.material3.Icon
|
||||
import androidx.compose.material3.MaterialTheme
|
||||
import androidx.compose.material3.RadioButton
|
||||
import androidx.compose.material3.Surface
|
||||
import androidx.compose.material3.Text
|
||||
import androidx.compose.runtime.*
|
||||
import androidx.compose.ui.Alignment
|
||||
import androidx.compose.ui.Modifier
|
||||
import androidx.compose.ui.draw.clip
|
||||
import androidx.compose.ui.unit.dp
|
||||
import llc.arma.ble.app.ui.screen.inspection.accelerometer.AccelerometerContract
|
||||
import llc.arma.ble.domain.usecase.AccelScale
|
||||
import llc.arma.ble.domain.usecase.FftAxis
|
||||
import llc.arma.ble.domain.usecase.FftFrequency
|
||||
import llc.arma.ble.domain.usecase.FftViewMode
|
||||
|
||||
@Composable
|
||||
fun AccelEdit(
|
||||
state: AccelerometerContract.State.Display,
|
||||
onEvent: (AccelerometerContract.Event) -> Unit,
|
||||
){
|
||||
|
||||
val accelMode = state.accelViewMode
|
||||
val fftMode = state.fftViewMode
|
||||
val fftAxis = state.fftAxis
|
||||
val fftFrequency = state.fftFrequency
|
||||
val accelScale = state.accelScale
|
||||
|
||||
Column(
|
||||
modifier = Modifier
|
||||
) {
|
||||
|
||||
Text(
|
||||
modifier = Modifier.padding(horizontal = 12.dp),
|
||||
text = "Ускорение",
|
||||
style = MaterialTheme.typography.titleLarge
|
||||
)
|
||||
|
||||
Spacer(modifier = Modifier.height(16.dp))
|
||||
|
||||
Column(
|
||||
modifier = Modifier
|
||||
) {
|
||||
|
||||
Box(
|
||||
modifier = Modifier.padding(
|
||||
vertical = 8.dp,
|
||||
horizontal = 8.dp
|
||||
)
|
||||
) {
|
||||
|
||||
Row(
|
||||
verticalAlignment = Alignment.CenterVertically,
|
||||
modifier = Modifier
|
||||
.clip(RoundedCornerShape(16.dp))
|
||||
.clickable {
|
||||
onEvent(
|
||||
AccelerometerContract.Event.OnAccelViewModeEdit(
|
||||
next = AccelerometerContract.Event.Next.ACCEL
|
||||
)
|
||||
)
|
||||
}
|
||||
.padding(8.dp)
|
||||
) {
|
||||
|
||||
Column(
|
||||
modifier = Modifier.weight(1f)
|
||||
) {
|
||||
|
||||
Text(
|
||||
text = "Accel view mode"
|
||||
)
|
||||
Text(
|
||||
color = MaterialTheme.colorScheme.secondary,
|
||||
style = MaterialTheme.typography.bodyMedium,
|
||||
text = accelMode.localized
|
||||
)
|
||||
|
||||
}
|
||||
|
||||
Icon(
|
||||
imageVector = Icons.Rounded.KeyboardArrowDown,
|
||||
contentDescription = null
|
||||
)
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
Box(
|
||||
modifier = Modifier.padding(
|
||||
vertical = 8.dp,
|
||||
horizontal = 8.dp
|
||||
)
|
||||
) {
|
||||
|
||||
Row(
|
||||
verticalAlignment = Alignment.CenterVertically,
|
||||
modifier = Modifier
|
||||
.clip(RoundedCornerShape(16.dp))
|
||||
.clickable {
|
||||
onEvent(AccelerometerContract.Event.OnAccelScaleEdit(next = AccelerometerContract.Event.Next.ACCEL))
|
||||
}
|
||||
.padding(8.dp)
|
||||
) {
|
||||
|
||||
Column(
|
||||
modifier = Modifier.weight(1f)
|
||||
) {
|
||||
|
||||
Text(
|
||||
text = "Accel scale"
|
||||
)
|
||||
Text(
|
||||
color = MaterialTheme.colorScheme.secondary,
|
||||
style = MaterialTheme.typography.bodyMedium,
|
||||
text = accelScale.localized
|
||||
)
|
||||
|
||||
}
|
||||
|
||||
Icon(
|
||||
imageVector = Icons.Rounded.KeyboardArrowDown,
|
||||
contentDescription = null
|
||||
)
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
Spacer(modifier = Modifier.height(16.dp))
|
||||
|
||||
Surface(
|
||||
modifier = Modifier
|
||||
.fillMaxWidth()
|
||||
.padding(8.dp)
|
||||
.height(50.dp),
|
||||
shape = CircleShape,
|
||||
color = MaterialTheme.colorScheme.primaryContainer,
|
||||
onClick = {
|
||||
onEvent(AccelerometerContract.Event.OnShowAccelerometerAccel)
|
||||
}
|
||||
) {
|
||||
|
||||
Box(modifier = Modifier.fillMaxSize()) {
|
||||
|
||||
Text(
|
||||
modifier = Modifier.align(Alignment.Center),
|
||||
color = MaterialTheme.colorScheme.background,
|
||||
style = MaterialTheme.typography.labelLarge,
|
||||
text = "Продолжить"
|
||||
)
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -0,0 +1,138 @@
|
|||
package llc.arma.ble.app.ui.screen.inspection.accelerometer.view
|
||||
|
||||
import androidx.compose.foundation.clickable
|
||||
import androidx.compose.foundation.layout.*
|
||||
import androidx.compose.foundation.rememberScrollState
|
||||
import androidx.compose.foundation.shape.CircleShape
|
||||
import androidx.compose.foundation.shape.RoundedCornerShape
|
||||
import androidx.compose.foundation.verticalScroll
|
||||
import androidx.compose.material.icons.Icons
|
||||
import androidx.compose.material.icons.rounded.KeyboardArrowDown
|
||||
import androidx.compose.material3.Icon
|
||||
import androidx.compose.material3.MaterialTheme
|
||||
import androidx.compose.material3.RadioButton
|
||||
import androidx.compose.material3.Surface
|
||||
import androidx.compose.material3.Text
|
||||
import androidx.compose.runtime.*
|
||||
import androidx.compose.ui.Alignment
|
||||
import androidx.compose.ui.Modifier
|
||||
import androidx.compose.ui.draw.clip
|
||||
import androidx.compose.ui.unit.dp
|
||||
import llc.arma.ble.app.ui.screen.inspection.accelerometer.AccelerometerContract
|
||||
import llc.arma.ble.domain.model.Ble
|
||||
import llc.arma.ble.domain.usecase.AccelScale
|
||||
import llc.arma.ble.domain.usecase.AccelViewMode
|
||||
import llc.arma.ble.domain.usecase.FftAxis
|
||||
import llc.arma.ble.domain.usecase.FftFrequency
|
||||
import llc.arma.ble.domain.usecase.FftViewMode
|
||||
|
||||
@Composable
|
||||
fun AccelScaleEdit(
|
||||
next: AccelerometerContract.Event.Next,
|
||||
state: AccelerometerContract.State.Display,
|
||||
onEvent: (AccelerometerContract.Event) -> Unit,
|
||||
){
|
||||
|
||||
var fftMode = when(next){
|
||||
AccelerometerContract.Event.Next.ACCEL,
|
||||
AccelerometerContract.Event.Next.SPECTRE ->
|
||||
state.accelScale
|
||||
AccelerometerContract.Event.Next.HISTORY -> {
|
||||
val history = state.accelerometer.accelerometerState.saveHistory
|
||||
if (history is Ble.Accelerometer.History.Enabled)
|
||||
history.scale
|
||||
else {
|
||||
state.accelScale
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Column(
|
||||
modifier = Modifier
|
||||
) {
|
||||
|
||||
Text(
|
||||
modifier = Modifier.padding(horizontal = 12.dp),
|
||||
text = "Accel scale",
|
||||
style = MaterialTheme.typography.titleLarge
|
||||
)
|
||||
|
||||
Spacer(modifier = Modifier.height(16.dp))
|
||||
|
||||
AccelScale.values().forEach {
|
||||
|
||||
Row(
|
||||
verticalAlignment = Alignment.CenterVertically,
|
||||
modifier = Modifier
|
||||
.fillMaxWidth()
|
||||
.clip(RoundedCornerShape(8.dp))
|
||||
.clickable {
|
||||
when(next){
|
||||
AccelerometerContract.Event.Next.ACCEL,
|
||||
AccelerometerContract.Event.Next.SPECTRE ->
|
||||
onEvent(AccelerometerContract.Event.OnAccelScaleChanged(it))
|
||||
AccelerometerContract.Event.Next.HISTORY ->
|
||||
onEvent(AccelerometerContract.Event.OnHistoryScaleChanged(it))
|
||||
}
|
||||
}
|
||||
.padding(4.dp)
|
||||
) {
|
||||
|
||||
RadioButton(
|
||||
selected = it == fftMode,
|
||||
onClick = {
|
||||
when(next){
|
||||
AccelerometerContract.Event.Next.ACCEL,
|
||||
AccelerometerContract.Event.Next.SPECTRE ->
|
||||
onEvent(AccelerometerContract.Event.OnAccelScaleChanged(it))
|
||||
AccelerometerContract.Event.Next.HISTORY ->
|
||||
onEvent(AccelerometerContract.Event.OnHistoryScaleChanged(it))
|
||||
}
|
||||
|
||||
}
|
||||
)
|
||||
|
||||
Text(text = it.localized)
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
Spacer(modifier = Modifier.height(16.dp))
|
||||
|
||||
Surface(
|
||||
modifier = Modifier
|
||||
.fillMaxWidth()
|
||||
.padding(8.dp)
|
||||
.height(50.dp),
|
||||
shape = CircleShape,
|
||||
color = MaterialTheme.colorScheme.primaryContainer,
|
||||
onClick = {
|
||||
when(next){
|
||||
AccelerometerContract.Event.Next.ACCEL ->
|
||||
onEvent(AccelerometerContract.Event.OnAccelEdit)
|
||||
AccelerometerContract.Event.Next.SPECTRE ->
|
||||
onEvent(AccelerometerContract.Event.OnSpectreEdit)
|
||||
AccelerometerContract.Event.Next.HISTORY ->
|
||||
onEvent(AccelerometerContract.Event.OnHistoryEdit)
|
||||
}
|
||||
|
||||
}
|
||||
) {
|
||||
|
||||
Box(modifier = Modifier.fillMaxSize()) {
|
||||
|
||||
Text(
|
||||
modifier = Modifier.align(Alignment.Center),
|
||||
color = MaterialTheme.colorScheme.background,
|
||||
style = MaterialTheme.typography.labelLarge,
|
||||
text = "Ок"
|
||||
)
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -19,6 +19,7 @@ import androidx.compose.ui.Modifier
|
|||
import androidx.compose.ui.draw.clip
|
||||
import androidx.compose.ui.unit.dp
|
||||
import llc.arma.ble.app.ui.screen.inspection.accelerometer.AccelerometerContract
|
||||
import llc.arma.ble.domain.usecase.AccelScale
|
||||
import llc.arma.ble.domain.usecase.FftAxis
|
||||
import llc.arma.ble.domain.usecase.FftFrequency
|
||||
import llc.arma.ble.domain.usecase.FftViewMode
|
||||
|
|
@ -59,6 +60,16 @@ val FftViewMode.localized: String
|
|||
}
|
||||
}
|
||||
|
||||
val AccelScale.localized: String
|
||||
get() {
|
||||
return when(this){
|
||||
AccelScale.S_2 -> "2g"
|
||||
AccelScale.S_4 -> "4g"
|
||||
AccelScale.S_8 -> "8g"
|
||||
AccelScale.S_16 -> "16g"
|
||||
}
|
||||
}
|
||||
|
||||
@Composable
|
||||
fun AccelSpectreEdit(
|
||||
state: AccelerometerContract.State.Display,
|
||||
|
|
@ -69,6 +80,7 @@ fun AccelSpectreEdit(
|
|||
val fftMode = state.fftViewMode
|
||||
val fftAxis = state.fftAxis
|
||||
val fftFrequency = state.fftFrequency
|
||||
val accelScale = state.accelScale
|
||||
|
||||
Column(
|
||||
modifier = Modifier
|
||||
|
|
@ -207,6 +219,47 @@ fun AccelSpectreEdit(
|
|||
|
||||
}
|
||||
|
||||
Box(
|
||||
modifier = Modifier.padding(
|
||||
vertical = 8.dp,
|
||||
horizontal = 8.dp
|
||||
)
|
||||
) {
|
||||
|
||||
Row(
|
||||
verticalAlignment = Alignment.CenterVertically,
|
||||
modifier = Modifier
|
||||
.clip(RoundedCornerShape(16.dp))
|
||||
.clickable {
|
||||
onEvent(AccelerometerContract.Event.OnAccelScaleEdit(next = AccelerometerContract.Event.Next.SPECTRE))
|
||||
}
|
||||
.padding(8.dp)
|
||||
) {
|
||||
|
||||
Column(
|
||||
modifier = Modifier.weight(1f)
|
||||
) {
|
||||
|
||||
Text(
|
||||
text = "Accel scale"
|
||||
)
|
||||
Text(
|
||||
color = MaterialTheme.colorScheme.secondary,
|
||||
style = MaterialTheme.typography.bodyMedium,
|
||||
text = accelScale.localized
|
||||
)
|
||||
|
||||
}
|
||||
|
||||
Icon(
|
||||
imageVector = Icons.Rounded.KeyboardArrowDown,
|
||||
contentDescription = null
|
||||
)
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
Spacer(modifier = Modifier.height(16.dp))
|
||||
|
|
|
|||
|
|
@ -29,7 +29,7 @@ val AccelViewMode.localized: String
|
|||
|
||||
@Composable
|
||||
fun AccelViewEdit(
|
||||
next: AccelerometerContract.Event.OnAccelViewModeEdit.Next,
|
||||
next: AccelerometerContract.Event.Next,
|
||||
state: AccelerometerContract.State.Display,
|
||||
onEvent: (AccelerometerContract.Event) -> Unit,
|
||||
){
|
||||
|
|
@ -85,14 +85,21 @@ fun AccelViewEdit(
|
|||
shape = CircleShape,
|
||||
color = MaterialTheme.colorScheme.primaryContainer,
|
||||
onClick = {
|
||||
onEvent(AccelerometerContract.Event.OnAccelViewModelChanged(value))
|
||||
|
||||
when(next){
|
||||
AccelerometerContract.Event.OnAccelViewModeEdit.Next.ACCEL -> {
|
||||
onEvent(AccelerometerContract.Event.OnShowAccelerometerAccel)
|
||||
AccelerometerContract.Event.Next.ACCEL -> {
|
||||
onEvent(AccelerometerContract.Event.OnAccelViewModelChanged(value))
|
||||
onEvent(AccelerometerContract.Event.OnAccelEdit)
|
||||
}
|
||||
AccelerometerContract.Event.OnAccelViewModeEdit.Next.SPECTRE -> {
|
||||
AccelerometerContract.Event.Next.SPECTRE -> {
|
||||
onEvent(AccelerometerContract.Event.OnAccelViewModelChanged(value))
|
||||
onEvent(AccelerometerContract.Event.OnSpectreEdit)
|
||||
}
|
||||
|
||||
AccelerometerContract.Event.Next.HISTORY -> {
|
||||
onEvent(AccelerometerContract.Event.OnHistoryViewModeChanged(value))
|
||||
onEvent(AccelerometerContract.Event.OnHistoryEdit)
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -104,7 +111,7 @@ fun AccelViewEdit(
|
|||
modifier = Modifier.align(Alignment.Center),
|
||||
color = MaterialTheme.colorScheme.background,
|
||||
style = MaterialTheme.typography.labelLarge,
|
||||
text = "Продолжить"
|
||||
text = "Ок"
|
||||
)
|
||||
|
||||
}
|
||||
|
|
|
|||
|
|
@ -373,9 +373,12 @@ class AccelerometerAccelViewModel @Inject constructor(
|
|||
val dataList = this.measureHistory.toMutableList().apply {
|
||||
add(
|
||||
Accelerate(
|
||||
x = ((9806.65f / (Short.MAX_VALUE / 2)) * it.x) * (accelScale.k / 2),
|
||||
y = ((9806.65f / (Short.MAX_VALUE / 2)) * it.y) * (accelScale.k / 2),
|
||||
z = ((9806.65f / (Short.MAX_VALUE / 2)) * it.z) * (accelScale.k / 2)
|
||||
//x = ((9806.65f / (Short.MAX_VALUE / 2)) * it.x) * (accelScale.k / 2),
|
||||
//y = ((9806.65f / (Short.MAX_VALUE / 2)) * it.y) * (accelScale.k / 2),
|
||||
//z = ((9806.65f / (Short.MAX_VALUE / 2)) * it.z) * (accelScale.k / 2)
|
||||
x = it.x,
|
||||
y = it.y,
|
||||
z = it.z
|
||||
)
|
||||
)
|
||||
}.takeLast(10)
|
||||
|
|
|
|||
|
|
@ -84,11 +84,11 @@ fun AccelerometerHistory(
|
|||
viewModel.setEvent(AccelerometerHistoryContract.Event.OnStart(ble.serial, accelScale, accelMode, fftAxis, fftMode, frequency))
|
||||
}
|
||||
|
||||
DisposableEffect("ble") {
|
||||
/*DisposableEffect("ble") {
|
||||
onDispose {
|
||||
viewModel.setEvent(AccelerometerHistoryContract.Event.StopMeasure)
|
||||
}
|
||||
}
|
||||
}*/
|
||||
|
||||
Column(
|
||||
modifier = Modifier.fillMaxHeight(0.9f)
|
||||
|
|
|
|||
|
|
@ -113,10 +113,27 @@ fun DisplayState(
|
|||
text = "Сохранять историю измерений"
|
||||
)
|
||||
|
||||
val history = ble.accelerometerState.saveHistory
|
||||
|
||||
if(history is Ble.Accelerometer.History.Enabled){
|
||||
Text(
|
||||
color = MaterialTheme.colorScheme.secondary,
|
||||
style = MaterialTheme.typography.bodyMedium,
|
||||
text = "View mode ${history.mode.localized}"
|
||||
)
|
||||
|
||||
Text(
|
||||
color = MaterialTheme.colorScheme.secondary,
|
||||
style = MaterialTheme.typography.bodyMedium,
|
||||
text = "Scale: ${history.scale.localized}"
|
||||
)
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
Switch(
|
||||
checked = ble.accelerometerState.saveHistory,
|
||||
checked = ble.accelerometerState.saveHistory is Ble.Accelerometer.History.Enabled,
|
||||
onCheckedChange = {
|
||||
onEvent(AccelerometerContract.Event.OnSaveHistoryChanged(it))
|
||||
}
|
||||
|
|
@ -218,7 +235,7 @@ fun DisplayState(
|
|||
verticalAlignment = Alignment.CenterVertically,
|
||||
modifier = Modifier
|
||||
.clip(RoundedCornerShape(16.dp))
|
||||
.clickable { onEvent(AccelerometerContract.Event.OnAccelViewModeEdit(next = AccelerometerContract.Event.OnAccelViewModeEdit.Next.ACCEL)) }
|
||||
.clickable { onEvent(AccelerometerContract.Event.OnAccelEdit) }
|
||||
.padding(8.dp)
|
||||
) {
|
||||
|
||||
|
|
|
|||
|
|
@ -0,0 +1,172 @@
|
|||
package llc.arma.ble.app.ui.screen.inspection.accelerometer.view
|
||||
|
||||
import androidx.compose.foundation.clickable
|
||||
import androidx.compose.foundation.layout.*
|
||||
import androidx.compose.foundation.rememberScrollState
|
||||
import androidx.compose.foundation.shape.CircleShape
|
||||
import androidx.compose.foundation.shape.RoundedCornerShape
|
||||
import androidx.compose.foundation.verticalScroll
|
||||
import androidx.compose.material.icons.Icons
|
||||
import androidx.compose.material.icons.rounded.KeyboardArrowDown
|
||||
import androidx.compose.material3.Icon
|
||||
import androidx.compose.material3.MaterialTheme
|
||||
import androidx.compose.material3.RadioButton
|
||||
import androidx.compose.material3.Surface
|
||||
import androidx.compose.material3.Text
|
||||
import androidx.compose.runtime.*
|
||||
import androidx.compose.ui.Alignment
|
||||
import androidx.compose.ui.Modifier
|
||||
import androidx.compose.ui.draw.clip
|
||||
import androidx.compose.ui.unit.dp
|
||||
import llc.arma.ble.app.ui.screen.inspection.accelerometer.AccelerometerContract
|
||||
import llc.arma.ble.domain.model.Ble
|
||||
import llc.arma.ble.domain.usecase.AccelScale
|
||||
import llc.arma.ble.domain.usecase.FftAxis
|
||||
import llc.arma.ble.domain.usecase.FftFrequency
|
||||
import llc.arma.ble.domain.usecase.FftViewMode
|
||||
|
||||
@Composable
|
||||
fun HistoryEdit(
|
||||
state: AccelerometerContract.State.Display,
|
||||
onEvent: (AccelerometerContract.Event) -> Unit,
|
||||
){
|
||||
|
||||
val history = state.accelerometer.accelerometerState.saveHistory
|
||||
|
||||
val accelMode = if (history is Ble.Accelerometer.History.Enabled) history.mode else state.accelViewMode
|
||||
val accelScale = if (history is Ble.Accelerometer.History.Enabled) history.scale else state.accelScale
|
||||
|
||||
Column(
|
||||
modifier = Modifier
|
||||
) {
|
||||
|
||||
Text(
|
||||
modifier = Modifier.padding(horizontal = 12.dp),
|
||||
text = "История измерений",
|
||||
style = MaterialTheme.typography.titleLarge
|
||||
)
|
||||
|
||||
Spacer(modifier = Modifier.height(16.dp))
|
||||
|
||||
Column(
|
||||
modifier = Modifier
|
||||
) {
|
||||
|
||||
Box(
|
||||
modifier = Modifier.padding(
|
||||
vertical = 8.dp,
|
||||
horizontal = 8.dp
|
||||
)
|
||||
) {
|
||||
|
||||
Row(
|
||||
verticalAlignment = Alignment.CenterVertically,
|
||||
modifier = Modifier
|
||||
.clip(RoundedCornerShape(16.dp))
|
||||
.clickable {
|
||||
onEvent(
|
||||
AccelerometerContract.Event.OnAccelViewModeEdit(
|
||||
next = AccelerometerContract.Event.Next.HISTORY
|
||||
)
|
||||
)
|
||||
}
|
||||
.padding(8.dp)
|
||||
) {
|
||||
|
||||
Column(
|
||||
modifier = Modifier.weight(1f)
|
||||
) {
|
||||
|
||||
Text(
|
||||
text = "Accel view mode"
|
||||
)
|
||||
Text(
|
||||
color = MaterialTheme.colorScheme.secondary,
|
||||
style = MaterialTheme.typography.bodyMedium,
|
||||
text = accelMode.localized
|
||||
)
|
||||
|
||||
}
|
||||
|
||||
Icon(
|
||||
imageVector = Icons.Rounded.KeyboardArrowDown,
|
||||
contentDescription = null
|
||||
)
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
Box(
|
||||
modifier = Modifier.padding(
|
||||
vertical = 8.dp,
|
||||
horizontal = 8.dp
|
||||
)
|
||||
) {
|
||||
|
||||
Row(
|
||||
verticalAlignment = Alignment.CenterVertically,
|
||||
modifier = Modifier
|
||||
.clip(RoundedCornerShape(16.dp))
|
||||
.clickable {
|
||||
onEvent(AccelerometerContract.Event.OnAccelScaleEdit(next = AccelerometerContract.Event.Next.HISTORY))
|
||||
}
|
||||
.padding(8.dp)
|
||||
) {
|
||||
|
||||
Column(
|
||||
modifier = Modifier.weight(1f)
|
||||
) {
|
||||
|
||||
Text(
|
||||
text = "Accel scale"
|
||||
)
|
||||
Text(
|
||||
color = MaterialTheme.colorScheme.secondary,
|
||||
style = MaterialTheme.typography.bodyMedium,
|
||||
text = accelScale.localized
|
||||
)
|
||||
|
||||
}
|
||||
|
||||
Icon(
|
||||
imageVector = Icons.Rounded.KeyboardArrowDown,
|
||||
contentDescription = null
|
||||
)
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
Spacer(modifier = Modifier.height(16.dp))
|
||||
|
||||
Surface(
|
||||
modifier = Modifier
|
||||
.fillMaxWidth()
|
||||
.padding(8.dp)
|
||||
.height(50.dp),
|
||||
shape = CircleShape,
|
||||
color = MaterialTheme.colorScheme.primaryContainer,
|
||||
onClick = {
|
||||
onEvent(AccelerometerContract.Event.OnHideHistoryEdit)
|
||||
}
|
||||
) {
|
||||
|
||||
Box(modifier = Modifier.fillMaxSize()) {
|
||||
|
||||
Text(
|
||||
modifier = Modifier.align(Alignment.Center),
|
||||
color = MaterialTheme.colorScheme.background,
|
||||
style = MaterialTheme.typography.labelLarge,
|
||||
text = "Ок"
|
||||
)
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -22,6 +22,7 @@ import llc.arma.ble.R
|
|||
import llc.arma.ble.app.ui.screen.inspection.accelerometer.AccelerometerContract
|
||||
import llc.arma.ble.app.ui.screen.inspection.thermometer.ThermometerContract
|
||||
import llc.arma.ble.app.ui.screen.inspection.thermometer.localizedName
|
||||
import llc.arma.ble.domain.model.Ble
|
||||
|
||||
@Composable
|
||||
fun Write(
|
||||
|
|
@ -107,7 +108,10 @@ fun Write(
|
|||
Text(
|
||||
color = MaterialTheme.colorScheme.secondary,
|
||||
style = MaterialTheme.typography.bodyMedium,
|
||||
text = it.localizedName
|
||||
text = when(it){
|
||||
Ble.Accelerometer.History.Disabled -> "Выключено"
|
||||
is Ble.Accelerometer.History.Enabled -> "Включено"
|
||||
}
|
||||
)
|
||||
|
||||
}
|
||||
|
|
|
|||
|
|
@ -524,9 +524,61 @@ class BleRepositoryImpl @Inject constructor(
|
|||
onSuccess = { return@fold it }
|
||||
)
|
||||
|
||||
val historyParams = when(record.timerEnabled){
|
||||
true -> {
|
||||
|
||||
writeCharacteristic(
|
||||
device = record.device,
|
||||
serviceId = serviceUUID,
|
||||
characteristicId = accelerometerReadUUID,
|
||||
writeData = byteArrayOf(4)
|
||||
).onFailure {
|
||||
return Result.failure(BleException.UnexpectedResponse)
|
||||
}
|
||||
|
||||
readCharacteristic(
|
||||
device = record.device,
|
||||
serviceId = serviceUUID,
|
||||
characteristicId = accelerometerReadUUID,
|
||||
).fold(
|
||||
|
||||
onSuccess = {
|
||||
Log.d("history", it.joinToString { it.toString() })
|
||||
val scale = when(it[1].toInt()){
|
||||
0 -> AccelScale.S_2
|
||||
1 -> AccelScale.S_4
|
||||
2 -> AccelScale.S_8
|
||||
3 -> AccelScale.S_16
|
||||
else -> {
|
||||
return Result.failure(BleException.UnexpectedResponse)
|
||||
}
|
||||
}
|
||||
val mode = when(it[0].toInt()){
|
||||
0 -> AccelViewMode.ACCELERATION
|
||||
1 -> AccelViewMode.PEAK_ACCELERATION
|
||||
2 -> AccelViewMode.RMS
|
||||
3 -> AccelViewMode.ANGLE
|
||||
else -> {
|
||||
return Result.failure(BleException.UnexpectedResponse)
|
||||
}
|
||||
}
|
||||
Ble.Accelerometer.History.Enabled(
|
||||
scale = scale,
|
||||
mode = mode
|
||||
)
|
||||
},
|
||||
onFailure = {
|
||||
return Result.failure(BleException.UnexpectedResponse)
|
||||
}
|
||||
|
||||
)
|
||||
}
|
||||
false -> Ble.Accelerometer.History.Disabled
|
||||
}
|
||||
|
||||
return Result.success(
|
||||
Ble.Accelerometer.AccelerometerState(
|
||||
saveHistory = record.timerEnabled,
|
||||
saveHistory = historyParams,
|
||||
historyInterval = history
|
||||
)
|
||||
)
|
||||
|
|
@ -690,24 +742,62 @@ class BleRepositoryImpl @Inject constructor(
|
|||
|
||||
return callbackFlow {
|
||||
|
||||
deviceCache[serial]?.device?.let {
|
||||
deviceCache[serial]?.device?.let { device ->
|
||||
|
||||
if (checkPermission()) {
|
||||
|
||||
gatt = it.connectGatt(app, false, ReadAccelerometerHistoryCallback(app) {
|
||||
val scale = writeCharacteristic(
|
||||
device = device,
|
||||
serviceId = serviceUUID,
|
||||
characteristicId = accelerometerReadUUID,
|
||||
writeData = byteArrayOf(4)
|
||||
).fold(
|
||||
onSuccess = {
|
||||
readCharacteristic(
|
||||
device = device,
|
||||
serviceId = serviceUUID,
|
||||
characteristicId = accelerometerReadUUID,
|
||||
).fold(
|
||||
onSuccess = {
|
||||
when(it[1].toInt()){
|
||||
0 -> AccelScale.S_2
|
||||
1 -> AccelScale.S_4
|
||||
2 -> AccelScale.S_8
|
||||
3 -> AccelScale.S_16
|
||||
else -> null
|
||||
}
|
||||
},
|
||||
onFailure = { null }
|
||||
)
|
||||
},
|
||||
onFailure = {
|
||||
null
|
||||
}
|
||||
)
|
||||
|
||||
if(scale != null) {
|
||||
|
||||
gatt = device.connectGatt(
|
||||
app,
|
||||
false,
|
||||
ReadAccelerometerHistoryCallback(scale, app) {
|
||||
CoroutineScope(Dispatchers.IO).launch {
|
||||
send(it)
|
||||
}
|
||||
})
|
||||
|
||||
} else {
|
||||
CoroutineScope(Dispatchers.IO).launch {
|
||||
send(Result.failure(BleException.UnexpectedResponse))
|
||||
}
|
||||
}
|
||||
|
||||
} else {
|
||||
|
||||
CoroutineScope(Dispatchers.IO).launch {
|
||||
send(Result.failure(BleException.PermissionDenied))
|
||||
}
|
||||
|
||||
return@callbackFlow
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -865,6 +955,8 @@ class BleRepositoryImpl @Inject constructor(
|
|||
|
||||
var gatt: BluetoothGatt? = null
|
||||
|
||||
if(checkPermission()) {
|
||||
|
||||
deviceCache[serial]?.let {
|
||||
|
||||
gatt = it.device.connectGatt(
|
||||
|
|
@ -885,10 +977,19 @@ class BleRepositoryImpl @Inject constructor(
|
|||
)
|
||||
|
||||
}
|
||||
|
||||
awaitClose {
|
||||
gatt?.close()
|
||||
}
|
||||
|
||||
} else {
|
||||
CoroutineScope(Dispatchers.IO).launch {
|
||||
|
||||
send(Result.failure(BleException.PermissionDenied))
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
|
@ -919,16 +1020,18 @@ class BleRepositoryImpl @Inject constructor(
|
|||
gatt.discoverServices()
|
||||
|
||||
} else {
|
||||
|
||||
it.resume(Result.failure(BleException.PermissionDenied))
|
||||
|
||||
gatt.disconnect()
|
||||
}
|
||||
|
||||
} else {
|
||||
gatt.close()
|
||||
}
|
||||
|
||||
} else {
|
||||
|
||||
it.resume(Result.failure(BleException.PermissionDenied))
|
||||
gatt.disconnect()
|
||||
|
||||
}
|
||||
|
||||
|
|
@ -954,6 +1057,7 @@ class BleRepositoryImpl @Inject constructor(
|
|||
|
||||
} else {
|
||||
|
||||
gatt.disconnect()
|
||||
it.resume(Result.failure(BleException.PermissionDenied))
|
||||
|
||||
}
|
||||
|
|
@ -962,10 +1066,14 @@ class BleRepositoryImpl @Inject constructor(
|
|||
|
||||
}
|
||||
|
||||
gatt.disconnect()
|
||||
it.resume(Result.failure(BleException.UnexpectedResponse))
|
||||
|
||||
} else {
|
||||
|
||||
gatt.disconnect()
|
||||
it.resume(Result.failure(BleException.UnexpectedResponse))
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -1005,8 +1113,6 @@ class BleRepositoryImpl @Inject constructor(
|
|||
if(status == BluetoothGatt.GATT_SUCCESS) {
|
||||
|
||||
if (checkPermission()) {
|
||||
|
||||
gatt.close()
|
||||
result = value
|
||||
it.resume(Result.success(result!!))
|
||||
|
||||
|
|
@ -1014,11 +1120,11 @@ class BleRepositoryImpl @Inject constructor(
|
|||
it.resume(Result.failure(BleException.PermissionDenied))
|
||||
|
||||
}
|
||||
|
||||
gatt.disconnect()
|
||||
} else {
|
||||
|
||||
it.resume(Result.failure(BleException.UnexpectedResponse))
|
||||
|
||||
gatt.disconnect()
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -1060,7 +1166,7 @@ class BleRepositoryImpl @Inject constructor(
|
|||
|
||||
} else {
|
||||
|
||||
bleGatt?.close()
|
||||
bleGatt?.disconnect()
|
||||
it.resume(Result.failure(BleException.PermissionDenied))
|
||||
|
||||
}
|
||||
|
|
@ -1068,13 +1174,12 @@ class BleRepositoryImpl @Inject constructor(
|
|||
} else {
|
||||
|
||||
bleGatt?.close()
|
||||
it.resume(Result.success(Unit))
|
||||
|
||||
}
|
||||
|
||||
} else {
|
||||
|
||||
bleGatt?.close()
|
||||
bleGatt?.disconnect()
|
||||
it.resume(Result.failure(BleException.UnexpectedResponse))
|
||||
|
||||
}
|
||||
|
|
@ -1101,7 +1206,7 @@ class BleRepositoryImpl @Inject constructor(
|
|||
|
||||
} else {
|
||||
|
||||
bleGatt?.close()
|
||||
bleGatt?.disconnect()
|
||||
it.resume(Result.failure(BleException.PermissionDenied))
|
||||
|
||||
}
|
||||
|
|
@ -1112,12 +1217,12 @@ class BleRepositoryImpl @Inject constructor(
|
|||
|
||||
Log.d("write", "service not found")
|
||||
|
||||
bleGatt?.close()
|
||||
bleGatt?.disconnect()
|
||||
it.resume(Result.failure(BleException.UnexpectedResponse))
|
||||
|
||||
} else {
|
||||
|
||||
bleGatt?.close()
|
||||
bleGatt?.disconnect()
|
||||
it.resume(Result.failure(BleException.UnexpectedResponse))
|
||||
|
||||
}
|
||||
|
|
@ -1133,8 +1238,6 @@ class BleRepositoryImpl @Inject constructor(
|
|||
|
||||
if (checkPermission()) {
|
||||
|
||||
gatt.close()
|
||||
|
||||
if(status == BluetoothGatt.GATT_SUCCESS) {
|
||||
|
||||
it.resume(Result.success(Unit))
|
||||
|
|
@ -1147,11 +1250,12 @@ class BleRepositoryImpl @Inject constructor(
|
|||
|
||||
} else {
|
||||
|
||||
gatt.close()
|
||||
it.resume(Result.failure(BleException.PermissionDenied))
|
||||
|
||||
}
|
||||
|
||||
gatt.disconnect()
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
|||
|
|
@ -162,22 +162,22 @@ class ReadAccelerometerCallback(
|
|||
value: ByteArray,
|
||||
){
|
||||
|
||||
Log.d("accel", "notification")
|
||||
|
||||
val data = value.toList().chunked(2).map {
|
||||
it.toByteArray().get2byteShortAt()
|
||||
}
|
||||
|
||||
onResult(
|
||||
Result.success(
|
||||
Accelerate(
|
||||
x = data[0].toFloat(),
|
||||
y = data[1].toFloat(),
|
||||
z = data[2].toFloat()
|
||||
)
|
||||
)
|
||||
Log.d("accel", "${Short.MAX_VALUE} ${data[0].toFloat() * accelScale.k} ${(data[0].toFloat() * accelScale.k) / Short.MAX_VALUE} ${data[0].toFloat()} ${data[1].toFloat()} ${data[2].toFloat()}")
|
||||
|
||||
val state = Accelerate(
|
||||
x = (data[0].toFloat() * accelScale.k) / Short.MAX_VALUE,
|
||||
y = (data[1].toFloat() * accelScale.k) / Short.MAX_VALUE,
|
||||
z = (data[2].toFloat() * accelScale.k) / Short.MAX_VALUE
|
||||
)
|
||||
|
||||
Log.d("accel", state.x.toString())
|
||||
|
||||
onResult(Result.success(state))
|
||||
|
||||
}
|
||||
|
||||
private fun checkPermission(): Boolean {
|
||||
|
|
|
|||
|
|
@ -13,8 +13,10 @@ import llc.arma.ble.domain.Result
|
|||
import llc.arma.ble.domain.common.BleException
|
||||
import llc.arma.ble.domain.common.ProgressState
|
||||
import llc.arma.ble.domain.model.Ble
|
||||
import llc.arma.ble.domain.usecase.AccelScale
|
||||
|
||||
class ReadAccelerometerHistoryCallback(
|
||||
private val scale: AccelScale,
|
||||
private val app: Application,
|
||||
private val onResult: (Result<ProgressState<List<Ble.Accelerometer.MeasurePoint>>, BleException>) -> Unit
|
||||
) : BluetoothGattCallback() {
|
||||
|
|
@ -36,6 +38,7 @@ class ReadAccelerometerHistoryCallback(
|
|||
private var readProperty: Property? = null
|
||||
|
||||
init {
|
||||
Log.d("history", scale.name)
|
||||
onResult(Result.success(ProgressState.Indeterminate))
|
||||
}
|
||||
|
||||
|
|
@ -172,6 +175,7 @@ class ReadAccelerometerHistoryCallback(
|
|||
|
||||
lastMeasureSystemTime = System.currentTimeMillis() - ((bleRealTime!! - bleLastMeasureTime!!) * 1_000)
|
||||
|
||||
val nextPackageDataCount = value.get2byteUIntAt(2)
|
||||
val temperatureDataArray = value.toUByteArray().asList().subList(16, value.size)
|
||||
|
||||
resultTemperaturePackage.addAll(
|
||||
|
|
@ -180,7 +184,6 @@ class ReadAccelerometerHistoryCallback(
|
|||
}.toMutableList()
|
||||
)
|
||||
|
||||
val nextPackageDataCount = value.get2byteUIntAt(2)
|
||||
expectedDataSize = nextPackageDataCount.toInt() + resultTemperaturePackage.size
|
||||
|
||||
onResult(Result.success(ProgressState.Progress(0f / expectedDataSize!!.toFloat())))
|
||||
|
|
@ -207,7 +210,7 @@ class ReadAccelerometerHistoryCallback(
|
|||
resultTemperaturePackage.withIndex().map {
|
||||
Ble.Accelerometer.MeasurePoint(
|
||||
frequency = lastMeasureSystemTime!! - (((resultTemperaturePackage.size - 1) - it.index) * bleMeasureInterval!!),
|
||||
value = it.value
|
||||
value = (it.value * scale.k) / Short.MAX_VALUE
|
||||
)
|
||||
}
|
||||
)
|
||||
|
|
@ -245,7 +248,7 @@ class ReadAccelerometerHistoryCallback(
|
|||
resultTemperaturePackage.withIndex().map {
|
||||
Ble.Accelerometer.MeasurePoint(
|
||||
frequency = lastMeasureSystemTime!! - (((resultTemperaturePackage.size - 1) - it.index) * bleMeasureInterval!!),
|
||||
value = it.value
|
||||
value = (it.value * scale.k) / Short.MAX_VALUE
|
||||
)
|
||||
}
|
||||
)
|
||||
|
|
|
|||
|
|
@ -280,7 +280,7 @@ class ReadAccelerometerSpectreCallback(
|
|||
resultAccelerometerPackage.withIndex().map {
|
||||
Ble.Accelerometer.MeasurePoint(
|
||||
frequency = frequencyInterval!! * it.index + initialValue!!,
|
||||
value = it.value
|
||||
value = (it.value * accelScale.k) / Short.MAX_VALUE
|
||||
)
|
||||
}
|
||||
)
|
||||
|
|
@ -320,8 +320,8 @@ class ReadAccelerometerSpectreCallback(
|
|||
ProgressState.Finished(
|
||||
resultAccelerometerPackage.withIndex().map {
|
||||
Ble.Accelerometer.MeasurePoint(
|
||||
frequency = frequencyInterval!! * it.index + initialValue!!,
|
||||
value = it.value
|
||||
frequency = ((frequencyInterval!! * it.index + initialValue!!) * accelScale.k) / Short.MAX_VALUE,
|
||||
value = (it.value * accelScale.k) / Short.MAX_VALUE
|
||||
)
|
||||
}
|
||||
)
|
||||
|
|
|
|||
|
|
@ -96,7 +96,11 @@ class WriteAccelerometerCallback(
|
|||
Pair(
|
||||
saveEnabledWriteUUID,
|
||||
mutableListOf<Byte>(4).apply {
|
||||
add(if (it) 1 else 0)
|
||||
add(if (it is Ble.Accelerometer.History.Enabled) 1 else 0)
|
||||
if(it is Ble.Accelerometer.History.Enabled) {
|
||||
add(it.mode.sendData)
|
||||
add(it.scale.sendData)
|
||||
}
|
||||
}.toByteArray()
|
||||
)
|
||||
} ?: uuid
|
||||
|
|
|
|||
|
|
@ -1,5 +1,8 @@
|
|||
package llc.arma.ble.domain.model
|
||||
|
||||
import llc.arma.ble.domain.usecase.AccelScale
|
||||
import llc.arma.ble.domain.usecase.AccelViewMode
|
||||
|
||||
sealed class Ble(
|
||||
val info: BleInfo
|
||||
) {
|
||||
|
|
@ -10,9 +13,20 @@ sealed class Ble(
|
|||
val accelerometerState: AccelerometerState
|
||||
): Ble(info) {
|
||||
|
||||
sealed class History {
|
||||
|
||||
data class Enabled(
|
||||
val scale: AccelScale,
|
||||
val mode: AccelViewMode
|
||||
) : History()
|
||||
|
||||
object Disabled : History()
|
||||
|
||||
}
|
||||
|
||||
data class WriteRequest(
|
||||
val tx: BleState.TX?,
|
||||
val saveHistory: Boolean?,
|
||||
val saveHistory: History?,
|
||||
val historyInterval: Long?
|
||||
)
|
||||
|
||||
|
|
@ -21,8 +35,15 @@ sealed class Ble(
|
|||
val value: Float
|
||||
)
|
||||
|
||||
class HistoryPoint (
|
||||
val time: Long,
|
||||
val x: Float,
|
||||
val y: Float,
|
||||
val z: Float
|
||||
)
|
||||
|
||||
data class AccelerometerState(
|
||||
val saveHistory: Boolean,
|
||||
val saveHistory: History,
|
||||
val historyInterval: Long
|
||||
)
|
||||
|
||||
|
|
|
|||
|
|
@ -30,7 +30,7 @@ enum class AccelViewMode {
|
|||
}
|
||||
|
||||
enum class AccelScale(val k: Int) {
|
||||
S_2(2), S_4(4), S_8(8), S_16(16)
|
||||
S_2(2_000), S_4(4_000), S_8(8_000), S_16(16_000)
|
||||
}
|
||||
|
||||
data class Accelerate(
|
||||
|
|
|
|||
|
|
@ -14,7 +14,7 @@ buildscript {
|
|||
|
||||
}// Top-level build file where you can add configuration options common to all sub-projects/modules.
|
||||
plugins {
|
||||
id 'com.android.application' version '8.0.2' apply false
|
||||
id 'com.android.library' version '8.0.2' apply false
|
||||
id 'com.android.application' version '8.1.1' apply false
|
||||
id 'com.android.library' version '8.1.1' apply false
|
||||
id 'org.jetbrains.kotlin.android' version '1.7.0' apply false
|
||||
}
|
||||
Loading…
Reference in New Issue