kotlin ble migration

This commit is contained in:
Vineyro 2024-06-19 11:44:02 +07:00
parent 57c1d331d6
commit 55b6807081
19 changed files with 489 additions and 549 deletions

View File

@ -3,6 +3,7 @@ plugins {
id 'org.jetbrains.kotlin.android' id 'org.jetbrains.kotlin.android'
id 'kotlin-kapt' id 'kotlin-kapt'
id 'dagger.hilt.android.plugin' id 'dagger.hilt.android.plugin'
id("kotlin-parcelize")
} }
android { android {
@ -13,8 +14,8 @@ android {
applicationId "llc.arma.ble" applicationId "llc.arma.ble"
minSdk 26 minSdk 26
targetSdk 34 targetSdk 34
versionCode 25 versionCode 27
versionName "1.3.5" versionName "1.3.7"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
vectorDrawables { vectorDrawables {

Binary file not shown.

View File

@ -1,20 +0,0 @@
{
"version": 3,
"artifactType": {
"type": "APK",
"kind": "Directory"
},
"applicationId": "llc.arma.ble",
"variantName": "release",
"elements": [
{
"type": "SINGLE",
"filters": [],
"attributes": [],
"versionCode": 21,
"versionName": "1.3.1",
"outputFile": "Arma BLE v1.3.1.apk"
}
],
"elementType": "File"
}

View File

@ -1,5 +1,7 @@
package llc.arma.ble.app.ui.screen.connection package llc.arma.ble.app.ui.screen.connection
import android.os.Parcelable
import kotlinx.parcelize.Parcelize
import llc.arma.ble.app.ui.common.ViewEvent import llc.arma.ble.app.ui.common.ViewEvent
import llc.arma.ble.app.ui.common.ViewSideEffect import llc.arma.ble.app.ui.common.ViewSideEffect
import llc.arma.ble.app.ui.common.ViewState import llc.arma.ble.app.ui.common.ViewState
@ -9,6 +11,12 @@ import llc.arma.ble.app.ui.screen.inspection.beacon.BeaconContract
import llc.arma.ble.app.ui.screen.inspection.thermometer.ThermometerContract import llc.arma.ble.app.ui.screen.inspection.thermometer.ThermometerContract
import llc.arma.ble.domain.common.BleException import llc.arma.ble.domain.common.BleException
import llc.arma.ble.domain.model.Ble 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
import llc.arma.ble.domain.usecase.FftAxis
import llc.arma.ble.domain.usecase.FftFrequency
import llc.arma.ble.domain.usecase.FftViewMode
import llc.arma.ble.domain.usecase.GetBleBySerial import llc.arma.ble.domain.usecase.GetBleBySerial
class ConnectionContract { class ConnectionContract {
@ -60,6 +68,40 @@ class ConnectionContract {
} }
sealed class InnerNavigation : Effect() {
@Parcelize
data class NavigateToAccelHistory(
val ble: BleInfo,
val accelScale: AccelScale,
val accelMode: AccelViewMode,
val fftAxis: FftAxis,
val fftMode: FftViewMode,
val frequency: FftFrequency
) : InnerNavigation(), Parcelable
@Parcelize
data class NavigateToAccelRealtime(
val ble: BleInfo,
val accelScale: AccelScale,
val accelMode: AccelViewMode,
val fftAxis: FftAxis,
val fftMode: FftViewMode,
val frequency: FftFrequency
) : InnerNavigation(), Parcelable
@Parcelize
data class NavigateToAccelSpectre(
val ble: BleInfo,
val accelScale: AccelScale,
val accelMode: AccelViewMode,
val fftAxis: FftAxis,
val fftMode: FftViewMode,
val frequency: FftFrequency
) : InnerNavigation(), Parcelable
}
} }
} }

View File

@ -1,5 +1,6 @@
package llc.arma.ble.app.ui.screen.connection package llc.arma.ble.app.ui.screen.connection
import androidx.activity.compose.BackHandler
import androidx.compose.animation.* import androidx.compose.animation.*
import androidx.compose.foundation.layout.* import androidx.compose.foundation.layout.*
import androidx.compose.foundation.rememberScrollState import androidx.compose.foundation.rememberScrollState
@ -10,6 +11,11 @@ import androidx.compose.material.icons.rounded.ArrowBack
import androidx.compose.material3.* import androidx.compose.material3.*
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.runtime.saveable.rememberSaveable
import androidx.compose.runtime.setValue
import androidx.compose.ui.Alignment import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.StrokeCap import androidx.compose.ui.graphics.StrokeCap
@ -22,6 +28,9 @@ import llc.arma.ble.app.ui.model.BleView
import llc.arma.ble.app.ui.screen.BleInfoView import llc.arma.ble.app.ui.screen.BleInfoView
import llc.arma.ble.app.ui.screen.inspection.accelerometer.AccelerometerContract import llc.arma.ble.app.ui.screen.inspection.accelerometer.AccelerometerContract
import llc.arma.ble.app.ui.screen.inspection.accelerometer.AccelerometerScreen import llc.arma.ble.app.ui.screen.inspection.accelerometer.AccelerometerScreen
import llc.arma.ble.app.ui.screen.inspection.accelerometer.view.AccelerometerHistory
import llc.arma.ble.app.ui.screen.inspection.accelerometer.view.AccelerometerRealtime
import llc.arma.ble.app.ui.screen.inspection.accelerometer.view.AccelerometerSpectre
import llc.arma.ble.app.ui.screen.inspection.beacon.BeaconScreen import llc.arma.ble.app.ui.screen.inspection.beacon.BeaconScreen
import llc.arma.ble.app.ui.screen.password.ChangePasswordContract import llc.arma.ble.app.ui.screen.password.ChangePasswordContract
import llc.arma.ble.app.ui.screen.inspection.thermometer.ThermometerContract import llc.arma.ble.app.ui.screen.inspection.thermometer.ThermometerContract
@ -38,21 +47,38 @@ fun ConnectionScreen(
val viewModel = hiltViewModel<ConnectionViewModel>() val viewModel = hiltViewModel<ConnectionViewModel>()
val state = viewModel.viewState.value val state = viewModel.viewState.value
var innerScreen by rememberSaveable {
mutableStateOf<ConnectionContract.Effect.InnerNavigation?>(null)
}
BackHandler(innerScreen != null) {
innerScreen = null
}
LaunchedEffect("effect"){ LaunchedEffect("effect"){
viewModel.effect.onEach { viewModel.effect.onEach {
when(it){ when(it){
is ConnectionContract.Effect.Navigation -> onNavigationEvent(it) is ConnectionContract.Effect.Navigation -> onNavigationEvent(it)
is ConnectionContract.Effect.InnerNavigation -> {
innerScreen = it
}
} }
}.launchIn(this) }.launchIn(this)
} }
Box {
Column { Column {
CenterAlignedTopAppBar( CenterAlignedTopAppBar(
navigationIcon = { navigationIcon = {
IconButton( IconButton(
onClick = { onClick = {
if(innerScreen != null) {
innerScreen = null
} else {
viewModel.setEvent(ConnectionContract.Event.OnNavigateUp) viewModel.setEvent(ConnectionContract.Event.OnNavigateUp)
}
}, },
content = { content = {
Icon( Icon(
@ -91,15 +117,21 @@ fun ConnectionScreen(
viewModel.setEvent(it) viewModel.setEvent(it)
} }
) )
is ConnectionContract.State.Loading -> LoadingState() is ConnectionContract.State.Loading -> LoadingState()
is ConnectionContract.State.Display -> { is ConnectionContract.State.Display -> {
when (state.ble) { when (state.ble) {
is Ble.Beacon -> BeaconScreen( is Ble.Beacon -> BeaconScreen(
ble = state.ble, ble = state.ble,
onNavigationEvent = { onNavigationEvent = {
viewModel.setEvent(ConnectionContract.Event.OnBeaconNavigationEvent(it)) viewModel.setEvent(
ConnectionContract.Event.OnBeaconNavigationEvent(
it
)
)
} }
) )
is Ble.Thermometer -> { is Ble.Thermometer -> {
Column(modifier = Modifier.weight(1f)) { Column(modifier = Modifier.weight(1f)) {
@ -131,6 +163,66 @@ fun ConnectionScreen(
} }
innerScreen?.let {
Surface(
modifier = Modifier
.fillMaxSize()
.statusBarsPadding()
) {
when(it){
is ConnectionContract.Effect.InnerNavigation.NavigateToAccelHistory -> {
AccelerometerHistory(
ble = it.ble,
accelMode = it.accelMode,
fftAxis = it.fftAxis,
fftMode = it.fftMode,
frequency = it.frequency,
accelScale = it.accelScale,
onDismiss = {
innerScreen = null
}
)
}
is ConnectionContract.Effect.InnerNavigation.NavigateToAccelRealtime -> {
AccelerometerRealtime(
ble = it.ble,
accelMode = it.accelMode,
fftAxis = it.fftAxis,
fftMode = it.fftMode,
frequency = it.frequency,
accelScale = it.accelScale,
onDismiss = {
innerScreen = null
}
)
}
is ConnectionContract.Effect.InnerNavigation.NavigateToAccelSpectre -> {
AccelerometerSpectre(
ble = it.ble,
accelMode = it.accelMode,
fftAxis = it.fftAxis,
fftMode = it.fftMode,
frequency = it.frequency,
accelScale = it.accelScale,
onDismiss = {
innerScreen = null
}
)
}
}
}
}
}
} }

View File

@ -86,6 +86,44 @@ class ConnectionViewModel @Inject constructor(
ConnectionContract.Effect.Navigation.NavigateToChangePassword(savedStateHandle.get<String>("serial")!!) ConnectionContract.Effect.Navigation.NavigateToChangePassword(savedStateHandle.get<String>("serial")!!)
} }
} }
is AccelerometerContract.Effect.Navigation.NavigateToAccelHistory -> {
setEffect {
ConnectionContract.Effect.InnerNavigation.NavigateToAccelHistory(
event.event.ble,
event.event.accelScale,
event.event.accelMode,
event.event.fftAxis,
event.event.fftMode,
event.event.frequency
)
}
}
is AccelerometerContract.Effect.Navigation.NavigateToAccelRealtime -> {
setEffect {
ConnectionContract.Effect.InnerNavigation.NavigateToAccelRealtime(
event.event.ble,
event.event.accelScale,
event.event.accelMode,
event.event.fftAxis,
event.event.fftMode,
event.event.frequency
)
}
}
is AccelerometerContract.Effect.Navigation.NavigateToAccelSpectre -> {
setEffect {
ConnectionContract.Effect.InnerNavigation.NavigateToAccelSpectre(
event.event.ble,
event.event.accelScale,
event.event.accelMode,
event.event.fftAxis,
event.event.fftMode,
event.event.frequency
)
}
}
} }
} }

View File

@ -6,6 +6,7 @@ import llc.arma.ble.app.ui.common.ViewState
import llc.arma.ble.app.ui.model.BleView import llc.arma.ble.app.ui.model.BleView
import llc.arma.ble.app.ui.screen.inspection.accelerometer.view.RealtimeViewMode import llc.arma.ble.app.ui.screen.inspection.accelerometer.view.RealtimeViewMode
import llc.arma.ble.domain.model.Ble 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.AccelScale
import llc.arma.ble.domain.usecase.AccelViewMode import llc.arma.ble.domain.usecase.AccelViewMode
import llc.arma.ble.domain.usecase.FftAxis import llc.arma.ble.domain.usecase.FftAxis
@ -19,7 +20,6 @@ class AccelerometerContract {
object OnShowAccelerometerAccel : Event() object OnShowAccelerometerAccel : Event()
object OnHideAccelerometerAccel : Event() object OnHideAccelerometerAccel : Event()
object OnShowAccelerometerSpectre : Event()
object OnHideAccelerometerSpectre : Event() object OnHideAccelerometerSpectre : Event()
object OnShowAccelerometerHistory : Event() object OnShowAccelerometerHistory : Event()
@ -32,7 +32,7 @@ class AccelerometerContract {
) : Event() ) : Event()
enum class Next { enum class Next {
ACCEL, SPECTRE, HISTORY ACCEL, HISTORY
} }
data class OnAccelScaleEdit( data class OnAccelScaleEdit(
@ -40,7 +40,7 @@ class AccelerometerContract {
) : Event() ) : Event()
object OnAccelEdit : Event() object OnAccelEdit : Event()
object OnSpectreEdit : Event()
object OnHistoryEdit : Event() object OnHistoryEdit : Event()
object OnFftFrequencyEdit : Event() object OnFftFrequencyEdit : Event()
@ -149,10 +149,6 @@ class AccelerometerContract {
object ShowRealtimeViewModeEdit : Effect() object ShowRealtimeViewModeEdit : Effect()
object ShowAccelerometerAccel : Effect()
object ShowAccelerometerSpectre : Effect()
object ShowAccelerometerHistory : Effect()
object ShowPowerPicker : Effect() object ShowPowerPicker : Effect()
object HidePowerPicker : Effect() object HidePowerPicker : Effect()
@ -170,7 +166,8 @@ class AccelerometerContract {
) : Effect() ) : Effect()
object ShowAccelEdit : Effect() object ShowAccelEdit : Effect()
object ShowSpectreEdit : Effect() object HideAccelEdit : Effect()
object ShowFftFrequencyEdit : Effect() object ShowFftFrequencyEdit : Effect()
object ShowFftAxisEdit : Effect() object ShowFftAxisEdit : Effect()
object ShowFftModeEdit : Effect() object ShowFftModeEdit : Effect()
@ -185,6 +182,33 @@ class AccelerometerContract {
object NavigateToChangePassword : Navigation() object NavigateToChangePassword : Navigation()
data class NavigateToAccelHistory(
val ble: BleInfo,
val accelScale: AccelScale,
val accelMode: AccelViewMode,
val fftAxis: FftAxis,
val fftMode: FftViewMode,
val frequency: FftFrequency
) : Navigation()
data class NavigateToAccelRealtime(
val ble: BleInfo,
val accelScale: AccelScale,
val accelMode: AccelViewMode,
val fftAxis: FftAxis,
val fftMode: FftViewMode,
val frequency: FftFrequency
) : Navigation()
data class NavigateToAccelSpectre(
val ble: BleInfo,
val accelScale: AccelScale,
val accelMode: AccelViewMode,
val fftAxis: FftAxis,
val fftMode: FftViewMode,
val frequency: FftFrequency
) : Navigation()
} }
} }

View File

@ -23,7 +23,6 @@ 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.AccelFrequencyEdit
import llc.arma.ble.app.ui.screen.inspection.accelerometer.view.AccelRealtimeViewEdit import llc.arma.ble.app.ui.screen.inspection.accelerometer.view.AccelRealtimeViewEdit
import llc.arma.ble.app.ui.screen.inspection.accelerometer.view.AccelScaleEdit 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.AccelViewEdit
import llc.arma.ble.app.ui.screen.inspection.accelerometer.view.AccelerometerSpectre import llc.arma.ble.app.ui.screen.inspection.accelerometer.view.AccelerometerSpectre
import llc.arma.ble.app.ui.screen.inspection.accelerometer.view.AccelerometerRealtime import llc.arma.ble.app.ui.screen.inspection.accelerometer.view.AccelerometerRealtime
@ -38,7 +37,7 @@ import llc.arma.ble.app.ui.screen.inspection.accelerometer.view.Write
import llc.arma.ble.domain.model.Ble import llc.arma.ble.domain.model.Ble
enum class SheetPage { enum class SheetPage {
HISTORY, ACCEL_SCALE, SPECTRE_SCALE, HISTORY_MODE_EDIT, HISTORY_SCALE, HISTORY_EDIT, ACCEL_EDIT, ACCEL_REALTIME_EDIT, ACCEL, POWER, WRITE, SPECTRE, ACCEL_MODE_EDIT, SPECTRE_MODE_EDIT, SPECTRE_EDIT, FREQUENCY_EDIT, AXIS_EDIT, FFT_MODE_EDIT, INTERVAL_EDIT ACCEL_SCALE, SPECTRE_SCALE, HISTORY_MODE_EDIT, HISTORY_SCALE, HISTORY_EDIT, ACCEL_EDIT, ACCEL_REALTIME_EDIT, POWER, WRITE, ACCEL_MODE_EDIT, SPECTRE_MODE_EDIT, FREQUENCY_EDIT, AXIS_EDIT, FFT_MODE_EDIT, INTERVAL_EDIT
} }
@OptIn(ExperimentalMaterialApi::class) @OptIn(ExperimentalMaterialApi::class)
@ -75,75 +74,6 @@ fun AccelerometerScreen(
LaunchedEffect(sheetPage) { LaunchedEffect(sheetPage) {
when (sheetPage) { when (sheetPage) {
SheetPage.HISTORY -> launch {
val currentState = viewModel.viewState.value
if (currentState is AccelerometerContract.State.Display) {
bottomDialog.show {
AccelerometerHistory(
ble = currentState.accelerometer.info,
accelMode = currentState.accelViewMode,
fftAxis = currentState.fftAxis,
fftMode = currentState.fftViewMode,
frequency = currentState.fftFrequency,
accelScale = currentState.accelScale
)
}
}
}
SheetPage.ACCEL -> launch {
val currentState = viewModel.viewState.value
if (currentState is AccelerometerContract.State.Display) {
bottomDialog.show {
when(currentState.accelRealtimeViewMode){
is RealtimeViewMode.Accel -> {
AccelerometerRealtime(
ble = currentState.accelerometer.info,
accelMode = currentState.accelRealtimeViewMode.accelViewMode,
fftAxis = currentState.fftAxis,
fftMode = currentState.fftViewMode,
frequency = currentState.fftFrequency,
accelScale = currentState.accelScale
)
}
RealtimeViewMode.Spectre -> {
AccelerometerSpectre(
ble = currentState.accelerometer.info,
accelMode = currentState.accelViewMode,
fftAxis = currentState.fftAxis,
fftMode = currentState.fftViewMode,
frequency = currentState.fftFrequency,
accelScale = currentState.accelScale
)
}
}
}
}
}
SheetPage.SPECTRE -> launch {
val currentState = viewModel.viewState.value
if (currentState is AccelerometerContract.State.Display) {
bottomDialog.show {
AccelerometerSpectre(
ble = currentState.accelerometer.info,
accelMode = currentState.accelViewMode,
fftAxis = currentState.fftAxis,
fftMode = currentState.fftViewMode,
frequency = currentState.fftFrequency,
accelScale = currentState.accelScale
)
}
}
}
SheetPage.POWER -> bottomDialog.show { SheetPage.POWER -> bottomDialog.show {
val currentState = viewModel.viewState.value val currentState = viewModel.viewState.value
@ -198,7 +128,7 @@ fun AccelerometerScreen(
if(currentState is AccelerometerContract.State.Display) { if(currentState is AccelerometerContract.State.Display) {
AccelViewEdit( AccelViewEdit(
next = AccelerometerContract.Event.Next.SPECTRE, next = AccelerometerContract.Event.Next.ACCEL,
state = currentState, state = currentState,
onEvent = { onEvent = {
viewModel.setEvent(it) viewModel.setEvent(it)
@ -221,20 +151,6 @@ fun AccelerometerScreen(
) )
} }
}
SheetPage.SPECTRE_EDIT -> bottomDialog.show {
val currentState = viewModel.viewState.value
if(currentState is AccelerometerContract.State.Display) {
AccelSpectreEdit(
state = currentState,
onEvent = {
viewModel.setEvent(it)
}
)
}
} }
SheetPage.FREQUENCY_EDIT -> bottomDialog.show { SheetPage.FREQUENCY_EDIT -> bottomDialog.show {
@ -313,7 +229,7 @@ fun AccelerometerScreen(
if(currentState is AccelerometerContract.State.Display) { if(currentState is AccelerometerContract.State.Display) {
AccelScaleEdit( AccelScaleEdit(
next = AccelerometerContract.Event.Next.SPECTRE, next = AccelerometerContract.Event.Next.ACCEL,
state = currentState, state = currentState,
onEvent = { onEvent = {
viewModel.setEvent(it) viewModel.setEvent(it)
@ -397,11 +313,6 @@ fun AccelerometerScreen(
LaunchedEffect("effect"){ LaunchedEffect("effect"){
viewModel.effect.onEach { viewModel.effect.onEach {
when(it){ when(it){
is AccelerometerContract.Effect.ShowAccelerometerAccel -> launch {
sheetPage = null
delay(100)
sheetPage = SheetPage.ACCEL
}
is AccelerometerContract.Effect.HidePowerPicker -> launch { is AccelerometerContract.Effect.HidePowerPicker -> launch {
sheetPage = null sheetPage = null
delay(100) delay(100)
@ -420,25 +331,14 @@ fun AccelerometerScreen(
delay(100) delay(100)
sheetPage = SheetPage.WRITE sheetPage = SheetPage.WRITE
} }
is AccelerometerContract.Effect.ShowAccelerometerSpectre -> launch {
sheetPage = null
delay(100)
sheetPage = SheetPage.SPECTRE
}
is AccelerometerContract.Effect.ShowAccelViewEdit -> launch { is AccelerometerContract.Effect.ShowAccelViewEdit -> launch {
sheetPage = null sheetPage = null
delay(100) delay(100)
sheetPage = when(it.next){ sheetPage = when(it.next){
AccelerometerContract.Event.Next.ACCEL -> SheetPage.ACCEL_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 AccelerometerContract.Event.Next.HISTORY -> SheetPage.HISTORY_MODE_EDIT
} }
} }
is AccelerometerContract.Effect.ShowSpectreEdit -> launch {
sheetPage = null
delay(100)
sheetPage = SheetPage.SPECTRE_EDIT
}
is AccelerometerContract.Effect.ShowFftFrequencyEdit -> launch { is AccelerometerContract.Effect.ShowFftFrequencyEdit -> launch {
sheetPage = null sheetPage = null
delay(100) delay(100)
@ -454,11 +354,6 @@ fun AccelerometerScreen(
delay(100) delay(100)
sheetPage = SheetPage.FFT_MODE_EDIT sheetPage = SheetPage.FFT_MODE_EDIT
} }
is AccelerometerContract.Effect.ShowAccelerometerHistory -> launch {
sheetPage = null
delay(100)
sheetPage = SheetPage.HISTORY
}
is AccelerometerContract.Effect.HideIntervalPicker -> { is AccelerometerContract.Effect.HideIntervalPicker -> {
sheetPage = null sheetPage = null
delay(100) delay(100)
@ -473,7 +368,6 @@ fun AccelerometerScreen(
delay(100) delay(100)
sheetPage = when(it.next){ sheetPage = when(it.next){
AccelerometerContract.Event.Next.ACCEL -> SheetPage.ACCEL_SCALE AccelerometerContract.Event.Next.ACCEL -> SheetPage.ACCEL_SCALE
AccelerometerContract.Event.Next.SPECTRE -> SheetPage.SPECTRE_SCALE
AccelerometerContract.Event.Next.HISTORY -> SheetPage.HISTORY_SCALE AccelerometerContract.Event.Next.HISTORY -> SheetPage.HISTORY_SCALE
} }
} }
@ -500,6 +394,11 @@ fun AccelerometerScreen(
delay(100) delay(100)
sheetPage = SheetPage.ACCEL_REALTIME_EDIT sheetPage = SheetPage.ACCEL_REALTIME_EDIT
} }
AccelerometerContract.Effect.HideAccelEdit -> {
sheetPage = null
delay(100)
}
} }
}.launchIn(this) }.launchIn(this)
} }

View File

@ -7,6 +7,9 @@ import llc.arma.ble.app.ui.common.BaseViewModel
import llc.arma.ble.app.ui.mapper.BleMapper import llc.arma.ble.app.ui.mapper.BleMapper
import llc.arma.ble.app.ui.mapper.BleViewMapper import llc.arma.ble.app.ui.mapper.BleViewMapper
import llc.arma.ble.app.ui.model.BleView import llc.arma.ble.app.ui.model.BleView
import llc.arma.ble.app.ui.screen.inspection.accelerometer.view.AccelerometerHistory
import llc.arma.ble.app.ui.screen.inspection.accelerometer.view.AccelerometerRealtime
import llc.arma.ble.app.ui.screen.inspection.accelerometer.view.AccelerometerSpectre
import llc.arma.ble.app.ui.screen.inspection.accelerometer.view.RealtimeViewMode import llc.arma.ble.app.ui.screen.inspection.accelerometer.view.RealtimeViewMode
import llc.arma.ble.domain.model.Ble import llc.arma.ble.domain.model.Ble
import llc.arma.ble.domain.usecase.AccelScale import llc.arma.ble.domain.usecase.AccelScale
@ -37,10 +40,8 @@ class AccelerometerViewModel @Inject constructor(
is AccelerometerContract.Event.OnHideWriteBlePreview -> reduce(viewState.value, event) is AccelerometerContract.Event.OnHideWriteBlePreview -> reduce(viewState.value, event)
is AccelerometerContract.Event.OnWriteBle -> reduce(viewState.value, event) is AccelerometerContract.Event.OnWriteBle -> reduce(viewState.value, event)
is AccelerometerContract.Event.OnHideAccelerometerSpectre -> reduce(viewState.value, event) is AccelerometerContract.Event.OnHideAccelerometerSpectre -> reduce(viewState.value, event)
is AccelerometerContract.Event.OnShowAccelerometerSpectre -> reduce(viewState.value, event)
is AccelerometerContract.Event.OnAccelViewModeEdit -> reduce(viewState.value, event) is AccelerometerContract.Event.OnAccelViewModeEdit -> reduce(viewState.value, event)
is AccelerometerContract.Event.OnAccelViewModelChanged -> reduce(viewState.value, event) is AccelerometerContract.Event.OnAccelViewModelChanged -> reduce(viewState.value, event)
is AccelerometerContract.Event.OnSpectreEdit -> reduce(viewState.value, event)
is AccelerometerContract.Event.OnFftFrequencyEdit -> reduce(viewState.value, event) is AccelerometerContract.Event.OnFftFrequencyEdit -> reduce(viewState.value, event)
is AccelerometerContract.Event.OnFftAxisChanged -> reduce(viewState.value, event) is AccelerometerContract.Event.OnFftAxisChanged -> reduce(viewState.value, event)
is AccelerometerContract.Event.OnFftFrequencyChanged -> reduce(viewState.value, event) is AccelerometerContract.Event.OnFftFrequencyChanged -> reduce(viewState.value, event)
@ -347,28 +348,6 @@ class AccelerometerViewModel @Inject constructor(
} }
private fun reduce(
state: AccelerometerContract.State,
event: AccelerometerContract.Event.OnSpectreEdit
) {
setEffect {
AccelerometerContract.Effect.ShowSpectreEdit
}
}
private fun reduce(
state: AccelerometerContract.State,
event: AccelerometerContract.Event.OnShowAccelerometerSpectre
) {
setEffect {
AccelerometerContract.Effect.ShowAccelerometerSpectre
}
}
private fun reduce( private fun reduce(
state: AccelerometerContract.State, state: AccelerometerContract.State,
event: AccelerometerContract.Event.OnHideAccelerometerSpectre event: AccelerometerContract.Event.OnHideAccelerometerSpectre
@ -383,8 +362,26 @@ class AccelerometerViewModel @Inject constructor(
event: AccelerometerContract.Event.OnShowAccelerometerHistory event: AccelerometerContract.Event.OnShowAccelerometerHistory
) { ) {
setEffect { /*setEffect {
AccelerometerContract.Effect.ShowAccelerometerHistory AccelerometerContract.Effect.ShowAccelerometerHistory
}*/
if (state is AccelerometerContract.State.Display &&
state.origin.accelerometerState.saveHistorySettings is Ble.Accelerometer.HistorySettings.Enabled
) {
setEffect {
AccelerometerContract.Effect.Navigation.NavigateToAccelHistory(
ble = state.accelerometer.info,
accelMode = state.origin.accelerometerState.saveHistorySettings.mode,
fftAxis = state.fftAxis,
fftMode = state.fftViewMode,
frequency = state.fftFrequency,
accelScale = state.accelScale
)
}
} }
} }
@ -524,10 +521,48 @@ class AccelerometerViewModel @Inject constructor(
if(state is AccelerometerContract.State.Display){ if(state is AccelerometerContract.State.Display){
setEffect { /*setEffect {
AccelerometerContract.Effect.ShowAccelerometerAccel AccelerometerContract.Effect.ShowAccelerometerAccel
}*/
setEffect {
AccelerometerContract.Effect.HideAccelEdit
}
setEffect {
when (state.accelRealtimeViewMode) {
is RealtimeViewMode.Accel -> {
AccelerometerContract.Effect.Navigation.NavigateToAccelRealtime(
ble = state.accelerometer.info,
accelMode = state.accelRealtimeViewMode.accelViewMode,
fftAxis = state.fftAxis,
fftMode = state.fftViewMode,
frequency = state.fftFrequency,
accelScale = state.accelScale
)
}
is RealtimeViewMode.Spectre -> {
AccelerometerContract.Effect.Navigation.NavigateToAccelSpectre(
ble = state.accelerometer.info,
accelMode = state.accelViewMode,
fftAxis = state.fftAxis,
fftMode = state.fftViewMode,
frequency = state.fftFrequency,
accelScale = state.accelScale
)
}
}
} }
} }

View File

@ -24,7 +24,51 @@ import llc.arma.ble.domain.usecase.FftAxis
import llc.arma.ble.domain.usecase.FftFrequency import llc.arma.ble.domain.usecase.FftFrequency
import llc.arma.ble.domain.usecase.FftViewMode import llc.arma.ble.domain.usecase.FftViewMode
val FftFrequency.localized: String
get() {
return when(this){
FftFrequency.OFF -> "откл"
FftFrequency.F_1 -> "1 Гц"
FftFrequency.F_10 -> "10 Гц"
FftFrequency.F_25 -> "25 Гц"
FftFrequency.F_50 -> "50 Гц"
FftFrequency.F_100 -> "100 Гц"
FftFrequency.F_200 -> "200 Гц"
FftFrequency.F_400 -> "400 Гц"
FftFrequency.F_1620 -> "1620 Гц"
FftFrequency.F_1344 -> "1344 Гц"
}
}
val FftAxis.localized: String
get() {
return when(this){
FftAxis.AUTO -> "Авто"
FftAxis.X -> "Ось X"
FftAxis.Y -> "Ось Y"
FftAxis.Z -> "Ось Z"
}
}
val FftViewMode.localized: String
get() {
return when(this){
FftViewMode.SPECTRE -> "Спектр"
FftViewMode.X -> "Ось X"
FftViewMode.Y -> "Ось Y"
FftViewMode.Z -> "Ось Z"
}
}
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 @Composable
fun AccelEdit( fun AccelEdit(

View File

@ -25,8 +25,7 @@ fun AccelScaleEdit(
){ ){
var fftMode = when(next){ var fftMode = when(next){
AccelerometerContract.Event.Next.ACCEL, AccelerometerContract.Event.Next.ACCEL ->
AccelerometerContract.Event.Next.SPECTRE ->
state.accelScale state.accelScale
AccelerometerContract.Event.Next.HISTORY -> { AccelerometerContract.Event.Next.HISTORY -> {
val history = state.accelerometer.accelerometerState.saveHistory val history = state.accelerometer.accelerometerState.saveHistory
@ -59,8 +58,7 @@ fun AccelScaleEdit(
.clip(RoundedCornerShape(8.dp)) .clip(RoundedCornerShape(8.dp))
.clickable { .clickable {
when(next){ when(next){
AccelerometerContract.Event.Next.ACCEL, AccelerometerContract.Event.Next.ACCEL ->
AccelerometerContract.Event.Next.SPECTRE ->
onEvent(AccelerometerContract.Event.OnAccelScaleChanged(it)) onEvent(AccelerometerContract.Event.OnAccelScaleChanged(it))
AccelerometerContract.Event.Next.HISTORY -> AccelerometerContract.Event.Next.HISTORY ->
onEvent(AccelerometerContract.Event.OnHistoryScaleChanged(it)) onEvent(AccelerometerContract.Event.OnHistoryScaleChanged(it))
@ -73,8 +71,7 @@ fun AccelScaleEdit(
selected = it == fftMode, selected = it == fftMode,
onClick = { onClick = {
when(next){ when(next){
AccelerometerContract.Event.Next.ACCEL, AccelerometerContract.Event.Next.ACCEL ->
AccelerometerContract.Event.Next.SPECTRE ->
onEvent(AccelerometerContract.Event.OnAccelScaleChanged(it)) onEvent(AccelerometerContract.Event.OnAccelScaleChanged(it))
AccelerometerContract.Event.Next.HISTORY -> AccelerometerContract.Event.Next.HISTORY ->
onEvent(AccelerometerContract.Event.OnHistoryScaleChanged(it)) onEvent(AccelerometerContract.Event.OnHistoryScaleChanged(it))
@ -102,8 +99,6 @@ fun AccelScaleEdit(
when(next){ when(next){
AccelerometerContract.Event.Next.ACCEL -> AccelerometerContract.Event.Next.ACCEL ->
onEvent(AccelerometerContract.Event.OnAccelEdit) onEvent(AccelerometerContract.Event.OnAccelEdit)
AccelerometerContract.Event.Next.SPECTRE ->
onEvent(AccelerometerContract.Event.OnSpectreEdit)
AccelerometerContract.Event.Next.HISTORY -> AccelerometerContract.Event.Next.HISTORY ->
onEvent(AccelerometerContract.Event.OnHistoryEdit) onEvent(AccelerometerContract.Event.OnHistoryEdit)
} }

View File

@ -1,294 +0,0 @@
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
val FftFrequency.localized: String
get() {
return when(this){
FftFrequency.OFF -> "откл"
FftFrequency.F_1 -> "1 Гц"
FftFrequency.F_10 -> "10 Гц"
FftFrequency.F_25 -> "25 Гц"
FftFrequency.F_50 -> "50 Гц"
FftFrequency.F_100 -> "100 Гц"
FftFrequency.F_200 -> "200 Гц"
FftFrequency.F_400 -> "400 Гц"
FftFrequency.F_1620 -> "1620 Гц"
FftFrequency.F_1344 -> "1344 Гц"
}
}
val FftAxis.localized: String
get() {
return when(this){
FftAxis.AUTO -> "Авто"
FftAxis.X -> "Ось X"
FftAxis.Y -> "Ось Y"
FftAxis.Z -> "Ось Z"
}
}
val FftViewMode.localized: String
get() {
return when(this){
FftViewMode.SPECTRE -> "Спектр"
FftViewMode.X -> "Ось X"
FftViewMode.Y -> "Ось Y"
FftViewMode.Z -> "Ось Z"
}
}
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,
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.OnFftModeEdit)
}
.padding(8.dp)
) {
Column(
modifier = Modifier.weight(1f)
) {
Text(
text = "Fft view mode"
)
Text(
color = MaterialTheme.colorScheme.secondary,
style = MaterialTheme.typography.bodyMedium,
text = fftMode.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.OnFftAxisEdit) }
.padding(8.dp)
) {
Column(
modifier = Modifier.weight(1f)
) {
Text(
text = "Fft axis"
)
Text(
color = MaterialTheme.colorScheme.secondary,
style = MaterialTheme.typography.bodyMedium,
text = fftAxis.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.OnFftFrequencyEdit)
}
.padding(8.dp)
) {
Column(
modifier = Modifier.weight(1f)
) {
Text(
text = "Fft frequency"
)
Text(
color = MaterialTheme.colorScheme.secondary,
style = MaterialTheme.typography.bodyMedium,
text = fftFrequency.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.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))
Surface(
modifier = Modifier
.fillMaxWidth()
.padding(8.dp)
.height(50.dp),
shape = CircleShape,
color = MaterialTheme.colorScheme.primaryContainer,
onClick = {
onEvent(AccelerometerContract.Event.OnShowAccelerometerSpectre)
}
) {
Box(modifier = Modifier.fillMaxSize()) {
Text(
modifier = Modifier.align(Alignment.Center),
color = MaterialTheme.colorScheme.background,
style = MaterialTheme.typography.labelLarge,
text = "Продолжить"
)
}
}
}
}

View File

@ -93,10 +93,6 @@ fun AccelViewEdit(
onEvent(AccelerometerContract.Event.OnAccelViewModelChanged(value)) onEvent(AccelerometerContract.Event.OnAccelViewModelChanged(value))
onEvent(AccelerometerContract.Event.OnAccelEdit) onEvent(AccelerometerContract.Event.OnAccelEdit)
} }
AccelerometerContract.Event.Next.SPECTRE -> {
onEvent(AccelerometerContract.Event.OnAccelViewModelChanged(value))
onEvent(AccelerometerContract.Event.OnSpectreEdit)
}
AccelerometerContract.Event.Next.HISTORY -> { AccelerometerContract.Event.Next.HISTORY -> {
onEvent(AccelerometerContract.Event.OnHistoryViewModeChanged(value)) onEvent(AccelerometerContract.Event.OnHistoryViewModeChanged(value))

View File

@ -25,6 +25,7 @@ import llc.arma.ble.app.ui.common.ViewState
import llc.arma.ble.domain.model.BleInfo import llc.arma.ble.domain.model.BleInfo
import javax.inject.Inject import javax.inject.Inject
import androidx.compose.material.icons.Icons import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.rounded.ArrowBack
import androidx.compose.material.icons.rounded.Refresh import androidx.compose.material.icons.rounded.Refresh
import androidx.compose.ui.graphics.StrokeCap import androidx.compose.ui.graphics.StrokeCap
import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.text.style.TextAlign
@ -66,7 +67,8 @@ fun AccelerometerSpectre(
fftAxis: FftAxis, fftAxis: FftAxis,
fftMode: FftViewMode, fftMode: FftViewMode,
frequency: FftFrequency, frequency: FftFrequency,
accelScale: AccelScale accelScale: AccelScale,
onDismiss: (() -> Unit)? = null
) { ) {
val viewModel = hiltViewModel<AccelerometerSpectreViewModel>() val viewModel = hiltViewModel<AccelerometerSpectreViewModel>()
@ -93,6 +95,17 @@ fun AccelerometerSpectre(
verticalAlignment = Alignment.CenterVertically verticalAlignment = Alignment.CenterVertically
) { ) {
onDismiss?.let {
IconButton(onClick = it) {
Icon(
imageVector = Icons.Rounded.ArrowBack,
contentDescription = null
)
}
}
val title = when(state){ val title = when(state){
is AccelerometerSpectreContract.State.Display -> { is AccelerometerSpectreContract.State.Display -> {
if (state.previousHistory !== null) { if (state.previousHistory !== null) {

View File

@ -23,6 +23,7 @@ import llc.arma.ble.app.ui.common.ViewState
import llc.arma.ble.domain.model.BleInfo import llc.arma.ble.domain.model.BleInfo
import javax.inject.Inject import javax.inject.Inject
import androidx.compose.material.icons.Icons import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.rounded.ArrowBack
import androidx.compose.material.icons.rounded.Refresh import androidx.compose.material.icons.rounded.Refresh
import androidx.compose.ui.draw.rotate import androidx.compose.ui.draw.rotate
import androidx.compose.ui.graphics.StrokeCap import androidx.compose.ui.graphics.StrokeCap
@ -57,7 +58,8 @@ fun AccelerometerRealtime(
accelMode: AccelViewMode, accelMode: AccelViewMode,
fftAxis: FftAxis, fftAxis: FftAxis,
fftMode: FftViewMode, fftMode: FftViewMode,
frequency: FftFrequency frequency: FftFrequency,
onDismiss: (() -> Unit)? = null
) { ) {
val viewModel = hiltViewModel<AccelerometerAccelViewModel>() val viewModel = hiltViewModel<AccelerometerAccelViewModel>()
@ -82,6 +84,17 @@ fun AccelerometerRealtime(
verticalAlignment = Alignment.CenterVertically verticalAlignment = Alignment.CenterVertically
) { ) {
onDismiss?.let {
IconButton(onClick = it) {
Icon(
imageVector = Icons.Rounded.ArrowBack,
contentDescription = null
)
}
}
Text( Text(
modifier = Modifier.weight(1f), modifier = Modifier.weight(1f),
text = accelMode.localized, text = accelMode.localized,
@ -275,15 +288,12 @@ fun Display(
horizontalAlignment = Alignment.CenterHorizontally horizontalAlignment = Alignment.CenterHorizontally
) { ) {
Text(text = "Ось Y: ${lastMeasure.tmp}")
Column( Column(
modifier = Modifier.weight(1f), modifier = Modifier.weight(1f),
horizontalAlignment = Alignment.CenterHorizontally horizontalAlignment = Alignment.CenterHorizontally
) { ) {
Text(text = "Ось X: ${lastMeasure.angle}") Text(text = "Положение: ${lastMeasure.angle}")
Spacer(modifier = Modifier.height(8.dp)) Spacer(modifier = Modifier.height(8.dp))
@ -294,7 +304,26 @@ fun Display(
} }
Text(text = "Ось Z:") Text(text = "Скорость:")
Chart(
marker = marker,
chart = lineChart,
chartModelProducer = yProducer,
startAxis = startAxis(),
bottomAxis = bottomAxis(),
modifier = Modifier
.fillMaxWidth()
.weight(1f),
autoScaleUp = AutoScaleUp.None,
diffAnimationSpec = tween(0),
chartScrollSpec = rememberChartScrollSpec(
initialScroll = InitialScroll.End,
autoScrollCondition = AutoScrollCondition.OnModelSizeIncreased,
autoScrollAnimationSpec = tween(0)
)
)
Text(text = "Обороты:")
Chart( Chart(
marker = marker, marker = marker,
chart = lineChart, chart = lineChart,

View File

@ -23,6 +23,7 @@ import llc.arma.ble.app.ui.common.ViewState
import llc.arma.ble.domain.model.BleInfo import llc.arma.ble.domain.model.BleInfo
import javax.inject.Inject import javax.inject.Inject
import androidx.compose.material.icons.Icons import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.rounded.ArrowBack
import androidx.compose.material.icons.rounded.CloudUpload import androidx.compose.material.icons.rounded.CloudUpload
import androidx.compose.material.icons.rounded.Refresh import androidx.compose.material.icons.rounded.Refresh
import androidx.compose.ui.graphics.StrokeCap import androidx.compose.ui.graphics.StrokeCap
@ -56,7 +57,9 @@ import llc.arma.ble.domain.usecase.FftFrequency
import llc.arma.ble.domain.usecase.FftViewMode import llc.arma.ble.domain.usecase.FftViewMode
import llc.arma.ble.domain.usecase.GetAccelerometerHistoryBySerial import llc.arma.ble.domain.usecase.GetAccelerometerHistoryBySerial
import llc.arma.ble.domain.usecase.GetBleBySerial import llc.arma.ble.domain.usecase.GetBleBySerial
import java.text.SimpleDateFormat
import java.util.Date import java.util.Date
import java.util.Locale
class AccelEntry( class AccelEntry(
val localDate: Long, val localDate: Long,
@ -75,7 +78,8 @@ fun AccelerometerHistory(
accelMode: AccelViewMode, accelMode: AccelViewMode,
fftAxis: FftAxis, fftAxis: FftAxis,
fftMode: FftViewMode, fftMode: FftViewMode,
frequency: FftFrequency frequency: FftFrequency,
onDismiss: (() -> Unit)? = null
) { ) {
val viewModel = hiltViewModel<AccelerometerHistoryViewModel>() val viewModel = hiltViewModel<AccelerometerHistoryViewModel>()
@ -100,6 +104,17 @@ fun AccelerometerHistory(
verticalAlignment = Alignment.CenterVertically verticalAlignment = Alignment.CenterVertically
) { ) {
onDismiss?.let {
IconButton(onClick = it) {
Icon(
imageVector = Icons.Rounded.ArrowBack,
contentDescription = null
)
}
}
val title = when(state){ val title = when(state){
is AccelerometerHistoryContract.State.Display -> { is AccelerometerHistoryContract.State.Display -> {
when (state.loadingHistoryState) { when (state.loadingHistoryState) {
@ -164,6 +179,10 @@ fun AccelerometerHistory(
} }
val dayFormatter = SimpleDateFormat("dd", Locale.getDefault())
val dateFormatter = SimpleDateFormat("dd.MM", Locale.getDefault())
val timeFormatter = SimpleDateFormat("HH:mm", Locale.getDefault())
@Composable @Composable
fun Display( fun Display(
@ -190,11 +209,33 @@ fun Display(
val axisValueFormatter = val axisValueFormatter =
AxisValueFormatter<AxisPosition.Horizontal.Bottom> { value, chartValues -> AxisValueFormatter<AxisPosition.Horizontal.Bottom> { value, chartValues ->
(chartValues.chartEntryModel.entries.firstOrNull() val first = (chartValues.chartEntryModel.entries.firstOrNull()?.firstOrNull() as? AccelEntry)
val last = (chartValues.chartEntryModel.entries.firstOrNull()?.lastOrNull() as? AccelEntry)
val previous = (chartValues.chartEntryModel.entries.firstOrNull()?.getOrNull(value.toInt() - 1) as? AccelEntry)
val current = (chartValues.chartEntryModel.entries.firstOrNull()?.getOrNull(value.toInt()) as? AccelEntry)
if(current != null) {
if (first == current || last == current) {
dateFormatter.format(Date(current.localDate))
} else {
if(previous != null && dayFormatter.format(previous.localDate) != dayFormatter.format(current.localDate)){
dateFormatter.format(Date(current.localDate))
}else{
timeFormatter.format(Date(current.localDate))
}
}.orEmpty()
} else {
" "
}
/*(chartValues.chartEntryModel.entries.firstOrNull()
?.getOrNull(value.toInt()) as? AccelEntry) ?.getOrNull(value.toInt()) as? AccelEntry)
?.localDate ?.localDate
?.let { formatter.format(Date(it)) } ?.let {
.orEmpty() if(first)
formatter.format(Date(it))
}
.orEmpty()*/
} }
val xProducer = remember { val xProducer = remember {
@ -288,7 +329,6 @@ fun Display(
Column { Column {
Text(text = "Ось X:") Text(text = "Ось X:")
Chart( Chart(
marker = marker, marker = marker,
chart = lineChart, chart = lineChart,

View File

@ -51,7 +51,9 @@ class TemperatureEntry(
} }
val formatter = SimpleDateFormat("dd.MM.yy HH:mm", Locale.getDefault())
val formatter = SimpleDateFormat("dd.MM HH:mm", Locale.getDefault())
@Composable @Composable
fun TemperatureHistory( fun TemperatureHistory(

View File

@ -1,5 +1,9 @@
package llc.arma.ble.domain.model package llc.arma.ble.domain.model
import android.os.Parcelable
import kotlinx.parcelize.Parcelize
@Parcelize
data class BleInfo( data class BleInfo(
val name: String, val name: String,
val serial: String, val serial: String,
@ -9,7 +13,7 @@ data class BleInfo(
val scanTime: Long, val scanTime: Long,
val tx: Int, val tx: Int,
val recordEnabled: Boolean val recordEnabled: Boolean
){ ) : Parcelable {
enum class Type { enum class Type {
BEACON, THERMOMETER, ACCELEROMETER BEACON, THERMOMETER, ACCELEROMETER