diff --git a/app/build.gradle b/app/build.gradle index 626d22b..ac39721 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -13,8 +13,8 @@ android { applicationId "llc.arma.ble" minSdk 26 targetSdk 34 - versionCode 23 - versionName "1.3.3" + versionCode 25 + versionName "1.3.5" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" vectorDrawables { @@ -86,8 +86,8 @@ dependencies { kapt('com.google.dagger:hilt-android-compiler:2.45') kapt("androidx.hilt:hilt-compiler:1.0.0") - implementation 'no.nordicsemi.android.kotlin.ble:scanner:1.0.19' - implementation 'no.nordicsemi.android.kotlin.ble:client:1.0.19' + implementation 'no.nordicsemi.android.kotlin.ble:scanner:1.0.14' + implementation 'no.nordicsemi.android.kotlin.ble:client:1.0.14' implementation "com.google.accompanist:accompanist-permissions:0.26.3-beta" diff --git a/app/src/main/java/llc/arma/ble/app/ui/screen/inspection/accelerometer/AccelerometerContract.kt b/app/src/main/java/llc/arma/ble/app/ui/screen/inspection/accelerometer/AccelerometerContract.kt index 9d76190..c4491b8 100644 --- a/app/src/main/java/llc/arma/ble/app/ui/screen/inspection/accelerometer/AccelerometerContract.kt +++ b/app/src/main/java/llc/arma/ble/app/ui/screen/inspection/accelerometer/AccelerometerContract.kt @@ -4,6 +4,7 @@ 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.accelerometer.view.RealtimeViewMode import llc.arma.ble.domain.model.Ble import llc.arma.ble.domain.usecase.AccelScale import llc.arma.ble.domain.usecase.AccelViewMode @@ -24,6 +25,8 @@ class AccelerometerContract { object OnShowAccelerometerHistory : Event() object OnHideAccelerometerHistory : Event() + object OnRealtimeViewModeEdit : Event() + data class OnAccelViewModeEdit( val next: Next ) : Event() @@ -56,6 +59,10 @@ class AccelerometerContract { object OnSaveIntervalEdit : Event() object OnHideHistoryEdit : Event() + data class OnRealtimeViewModeChanged( + val mode: RealtimeViewMode + ) : Event() + data class OnBleChanged( val ble: Ble.Accelerometer, ): Event() @@ -111,6 +118,7 @@ class AccelerometerContract { val accelerometer: BleView.Accelerometer, val writeState: WriteState?, val accelViewMode: AccelViewMode, + val accelRealtimeViewMode: RealtimeViewMode, val accelScale: AccelScale, val fftViewMode: FftViewMode, val fftAxis: FftAxis, @@ -139,6 +147,8 @@ class AccelerometerContract { sealed class Effect : ViewSideEffect { + object ShowRealtimeViewModeEdit : Effect() + object ShowAccelerometerAccel : Effect() object ShowAccelerometerSpectre : Effect() object ShowAccelerometerHistory : Effect() diff --git a/app/src/main/java/llc/arma/ble/app/ui/screen/inspection/accelerometer/AccelerometerScreen.kt b/app/src/main/java/llc/arma/ble/app/ui/screen/inspection/accelerometer/AccelerometerScreen.kt index 592ef9e..4185a9e 100644 --- a/app/src/main/java/llc/arma/ble/app/ui/screen/inspection/accelerometer/AccelerometerScreen.kt +++ b/app/src/main/java/llc/arma/ble/app/ui/screen/inspection/accelerometer/AccelerometerScreen.kt @@ -21,6 +21,7 @@ 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.AccelRealtimeViewEdit 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 @@ -32,11 +33,12 @@ 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 +import llc.arma.ble.app.ui.screen.inspection.accelerometer.view.RealtimeViewMode import llc.arma.ble.app.ui.screen.inspection.accelerometer.view.Write import llc.arma.ble.domain.model.Ble enum class SheetPage { - 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 + 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 } @OptIn(ExperimentalMaterialApi::class) @@ -93,15 +95,36 @@ fun AccelerometerScreen( val currentState = viewModel.viewState.value if (currentState is AccelerometerContract.State.Display) { + bottomDialog.show { - AccelerometerRealtime( - ble = currentState.accelerometer.info, - accelMode = currentState.accelViewMode, - fftAxis = currentState.fftAxis, - fftMode = currentState.fftViewMode, - frequency = currentState.fftFrequency, - accelScale = currentState.accelScale - ) + + 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 + ) + + } + } + } } } @@ -345,6 +368,21 @@ fun AccelerometerScreen( null -> { bottomDialog.hide() } + + SheetPage.ACCEL_REALTIME_EDIT -> bottomDialog.show { + + val currentState = viewModel.viewState.value + + if(currentState is AccelerometerContract.State.Display) { + AccelRealtimeViewEdit( + state = currentState, + onEvent = { + viewModel.setEvent(it) + } + ) + } + + } } } @@ -456,6 +494,12 @@ fun AccelerometerScreen( sheetPage = null delay(100) } + + AccelerometerContract.Effect.ShowRealtimeViewModeEdit -> { + sheetPage = null + delay(100) + sheetPage = SheetPage.ACCEL_REALTIME_EDIT + } } }.launchIn(this) } diff --git a/app/src/main/java/llc/arma/ble/app/ui/screen/inspection/accelerometer/AccelerometerViewModel.kt b/app/src/main/java/llc/arma/ble/app/ui/screen/inspection/accelerometer/AccelerometerViewModel.kt index d248f72..cf42b30 100644 --- a/app/src/main/java/llc/arma/ble/app/ui/screen/inspection/accelerometer/AccelerometerViewModel.kt +++ b/app/src/main/java/llc/arma/ble/app/ui/screen/inspection/accelerometer/AccelerometerViewModel.kt @@ -7,6 +7,7 @@ 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.accelerometer.view.RealtimeViewMode import llc.arma.ble.domain.model.Ble import llc.arma.ble.domain.usecase.AccelScale import llc.arma.ble.domain.usecase.AccelViewMode @@ -55,6 +56,8 @@ class AccelerometerViewModel @Inject constructor( 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.OnRealtimeViewModeEdit -> reduce(viewState.value, event) + is AccelerometerContract.Event.OnRealtimeViewModeChanged -> 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) @@ -314,6 +317,36 @@ class AccelerometerViewModel @Inject constructor( } + private fun reduce( + state: AccelerometerContract.State, + event: AccelerometerContract.Event.OnRealtimeViewModeEdit + ) { + + setEffect { + AccelerometerContract.Effect.ShowRealtimeViewModeEdit + } + + } + + private fun reduce( + state: AccelerometerContract.State, + event: AccelerometerContract.Event.OnRealtimeViewModeChanged + ) { + + if(state is AccelerometerContract.State.Display){ + + setState { + + state.copy( + accelRealtimeViewMode = event.mode + ) + + } + + } + + } + private fun reduce( state: AccelerometerContract.State, event: AccelerometerContract.Event.OnSpectreEdit @@ -489,14 +522,18 @@ class AccelerometerViewModel @Inject constructor( viewModelScope.launch { - setEffect { - AccelerometerContract.Effect.ShowAccelerometerAccel + if(state is AccelerometerContract.State.Display){ + + setEffect { + + AccelerometerContract.Effect.ShowAccelerometerAccel + + } + } } - - } private fun reduce( @@ -521,6 +558,7 @@ class AccelerometerViewModel @Inject constructor( accelerometer = bleMapper.map(event.ble) as BleView.Accelerometer, writeState = null, accelViewMode = AccelViewMode.ACCELERATION, + accelRealtimeViewMode = RealtimeViewMode.Accel(AccelViewMode.ACCELERATION), fftAxis = FftAxis.AUTO, fftFrequency = FftFrequency.F_400, fftViewMode = FftViewMode.SPECTRE, diff --git a/app/src/main/java/llc/arma/ble/app/ui/screen/inspection/accelerometer/view/AccelEdit.kt b/app/src/main/java/llc/arma/ble/app/ui/screen/inspection/accelerometer/view/AccelEdit.kt index fb9f161..2cf8f48 100644 --- a/app/src/main/java/llc/arma/ble/app/ui/screen/inspection/accelerometer/view/AccelEdit.kt +++ b/app/src/main/java/llc/arma/ble/app/ui/screen/inspection/accelerometer/view/AccelEdit.kt @@ -24,13 +24,15 @@ 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 accelMode = state.accelRealtimeViewMode val fftMode = state.fftViewMode val fftAxis = state.fftAxis val fftFrequency = state.fftFrequency @@ -42,7 +44,7 @@ fun AccelEdit( Text( modifier = Modifier.padding(horizontal = 12.dp), - text = "Ускорение", + text = "Параметры", style = MaterialTheme.typography.titleLarge ) @@ -64,11 +66,7 @@ fun AccelEdit( modifier = Modifier .clip(RoundedCornerShape(16.dp)) .clickable { - onEvent( - AccelerometerContract.Event.OnAccelViewModeEdit( - next = AccelerometerContract.Event.Next.ACCEL - ) - ) + onEvent(AccelerometerContract.Event.OnRealtimeViewModeEdit) } .padding(8.dp) ) { @@ -78,7 +76,7 @@ fun AccelEdit( ) { Text( - text = "Accel view mode" + text = "Измеряемый параметр" ) Text( color = MaterialTheme.colorScheme.secondary, @@ -97,6 +95,131 @@ fun AccelEdit( } + if(accelMode is RealtimeViewMode.Spectre){ + + 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 = "Режим просмотра" + ) + 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 = "Ось" + ) + 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 = "Частота дистретизации" + ) + 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, @@ -119,7 +242,7 @@ fun AccelEdit( ) { Text( - text = "Accel scale" + text = "Масштаб" ) Text( color = MaterialTheme.colorScheme.secondary, diff --git a/app/src/main/java/llc/arma/ble/app/ui/screen/inspection/accelerometer/view/AccelFftAxisEdit.kt b/app/src/main/java/llc/arma/ble/app/ui/screen/inspection/accelerometer/view/AccelFftAxisEdit.kt index 785444b..2addb55 100644 --- a/app/src/main/java/llc/arma/ble/app/ui/screen/inspection/accelerometer/view/AccelFftAxisEdit.kt +++ b/app/src/main/java/llc/arma/ble/app/ui/screen/inspection/accelerometer/view/AccelFftAxisEdit.kt @@ -78,7 +78,7 @@ fun AccelFftAxisEdit( shape = CircleShape, color = MaterialTheme.colorScheme.primaryContainer, onClick = { - onEvent(AccelerometerContract.Event.OnSpectreEdit) + onEvent(AccelerometerContract.Event.OnAccelEdit) } ) { diff --git a/app/src/main/java/llc/arma/ble/app/ui/screen/inspection/accelerometer/view/AccelFftModeEdit.kt b/app/src/main/java/llc/arma/ble/app/ui/screen/inspection/accelerometer/view/AccelFftModeEdit.kt index 4636676..003e172 100644 --- a/app/src/main/java/llc/arma/ble/app/ui/screen/inspection/accelerometer/view/AccelFftModeEdit.kt +++ b/app/src/main/java/llc/arma/ble/app/ui/screen/inspection/accelerometer/view/AccelFftModeEdit.kt @@ -78,7 +78,7 @@ fun AccelFftModeEdit( shape = CircleShape, color = MaterialTheme.colorScheme.primaryContainer, onClick = { - onEvent(AccelerometerContract.Event.OnSpectreEdit) + onEvent(AccelerometerContract.Event.OnAccelEdit) } ) { diff --git a/app/src/main/java/llc/arma/ble/app/ui/screen/inspection/accelerometer/view/AccelFrequencyEdit.kt b/app/src/main/java/llc/arma/ble/app/ui/screen/inspection/accelerometer/view/AccelFrequencyEdit.kt index 7102b2e..2234faa 100644 --- a/app/src/main/java/llc/arma/ble/app/ui/screen/inspection/accelerometer/view/AccelFrequencyEdit.kt +++ b/app/src/main/java/llc/arma/ble/app/ui/screen/inspection/accelerometer/view/AccelFrequencyEdit.kt @@ -78,7 +78,7 @@ fun AccelFrequencyEdit( shape = CircleShape, color = MaterialTheme.colorScheme.primaryContainer, onClick = { - onEvent(AccelerometerContract.Event.OnSpectreEdit) + onEvent(AccelerometerContract.Event.OnAccelEdit) } ) { diff --git a/app/src/main/java/llc/arma/ble/app/ui/screen/inspection/accelerometer/view/AccelRealtimeViewEdit.kt b/app/src/main/java/llc/arma/ble/app/ui/screen/inspection/accelerometer/view/AccelRealtimeViewEdit.kt new file mode 100644 index 0000000..e67609f --- /dev/null +++ b/app/src/main/java/llc/arma/ble/app/ui/screen/inspection/accelerometer/view/AccelRealtimeViewEdit.kt @@ -0,0 +1,136 @@ +package llc.arma.ble.app.ui.screen.inspection.accelerometer.view + +import androidx.compose.foundation.clickable +import androidx.compose.foundation.layout.* +import androidx.compose.foundation.shape.CircleShape +import androidx.compose.foundation.shape.RoundedCornerShape +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.AccelViewMode +import llc.arma.ble.domain.usecase.AccelViewMode.* + +val RealtimeViewMode.localized: String + get() { + return when(this){ + is RealtimeViewMode.Accel -> this.accelViewMode.localized + RealtimeViewMode.Spectre -> "Спектр" + } + } + +sealed class RealtimeViewMode { + + data class Accel( + val accelViewMode: AccelViewMode + ): RealtimeViewMode() + + object Spectre : RealtimeViewMode() + +} + +@Composable +fun AccelRealtimeViewEdit( + state: AccelerometerContract.State.Display, + onEvent: (AccelerometerContract.Event) -> Unit, +){ + + var value by remember(state.accelRealtimeViewMode) { + mutableStateOf(state.accelRealtimeViewMode) + } + + Column( + modifier = Modifier + ) { + + Text( + modifier = Modifier.padding(horizontal = 12.dp), + text = "Accel view mode", + style = MaterialTheme.typography.titleLarge + ) + + Spacer(modifier = Modifier.height(16.dp)) + + values().forEach { + + Row( + verticalAlignment = Alignment.CenterVertically, + modifier = Modifier + .fillMaxWidth() + .clip(RoundedCornerShape(8.dp)) + .clickable { value = RealtimeViewMode.Accel(it) } + .padding(4.dp) + ) { + + RadioButton( + selected = value is RealtimeViewMode.Accel && it == (value as RealtimeViewMode.Accel).accelViewMode, + onClick = { + value = RealtimeViewMode.Accel(it) + + } + ) + + Text(text = it.localized) + + } + + } + + Row( + verticalAlignment = Alignment.CenterVertically, + modifier = Modifier + .fillMaxWidth() + .clip(RoundedCornerShape(8.dp)) + .clickable { value = RealtimeViewMode.Spectre } + .padding(4.dp) + ) { + + RadioButton( + selected = value is RealtimeViewMode.Spectre, + onClick = { + value = RealtimeViewMode.Spectre + } + ) + + Text(text = RealtimeViewMode.Spectre.localized) + + } + + 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.OnRealtimeViewModeChanged(value)) + onEvent(AccelerometerContract.Event.OnAccelEdit) + + } + ) { + + Box(modifier = Modifier.fillMaxSize()) { + + Text( + modifier = Modifier.align(Alignment.Center), + color = MaterialTheme.colorScheme.background, + style = MaterialTheme.typography.labelLarge, + text = "Ок" + ) + + } + + } + + } + +} \ No newline at end of file diff --git a/app/src/main/java/llc/arma/ble/app/ui/screen/inspection/accelerometer/view/AccelerometerSpectre.kt b/app/src/main/java/llc/arma/ble/app/ui/screen/inspection/accelerometer/view/AccelerometerSpectre.kt index 2c9821d..3f9d56f 100644 --- a/app/src/main/java/llc/arma/ble/app/ui/screen/inspection/accelerometer/view/AccelerometerSpectre.kt +++ b/app/src/main/java/llc/arma/ble/app/ui/screen/inspection/accelerometer/view/AccelerometerSpectre.kt @@ -28,10 +28,13 @@ import androidx.compose.material.icons.Icons import androidx.compose.material.icons.rounded.Refresh import androidx.compose.ui.graphics.StrokeCap import androidx.compose.ui.text.style.TextAlign +import com.patrykandpatrick.vico.compose.axis.axisGuidelineComponent import com.patrykandpatrick.vico.compose.chart.column.columnChart import com.patrykandpatrick.vico.compose.chart.scroll.rememberChartScrollState +import com.patrykandpatrick.vico.compose.component.textComponent import com.patrykandpatrick.vico.core.axis.AxisPosition import com.patrykandpatrick.vico.core.axis.formatter.AxisValueFormatter +import com.patrykandpatrick.vico.core.component.marker.MarkerComponent import com.patrykandpatrick.vico.core.entry.ChartEntry import com.patrykandpatrick.vico.core.entry.FloatEntry import kotlinx.coroutines.Job @@ -231,12 +234,24 @@ fun Display( } val lineChart = columnChart( - spacing = 1.5.dp + spacing = 1.5.dp, + persistentMarkers = mapOf(producer.getModel().maxX to MarkerComponent( + label = textComponent(), + indicator = null, + guideline = axisGuidelineComponent() + )), ) val scrollState = rememberChartScrollState() + val marker = MarkerComponent( + label = textComponent(), + indicator = null, + guideline = axisGuidelineComponent() + ) + Chart( + marker = marker, diffAnimationSpec = tween(0), isZoomEnabled = true, chartScrollState = scrollState, diff --git a/app/src/main/java/llc/arma/ble/app/ui/screen/inspection/accelerometer/view/AcceleromterAccel.kt b/app/src/main/java/llc/arma/ble/app/ui/screen/inspection/accelerometer/view/AcceleromterAccel.kt index 24d0d2c..6c84ef3 100644 --- a/app/src/main/java/llc/arma/ble/app/ui/screen/inspection/accelerometer/view/AcceleromterAccel.kt +++ b/app/src/main/java/llc/arma/ble/app/ui/screen/inspection/accelerometer/view/AcceleromterAccel.kt @@ -27,11 +27,14 @@ import androidx.compose.material.icons.rounded.Refresh import androidx.compose.ui.draw.rotate import androidx.compose.ui.graphics.StrokeCap import androidx.compose.ui.text.style.TextAlign +import com.patrykandpatrick.vico.compose.axis.axisGuidelineComponent import com.patrykandpatrick.vico.compose.axis.horizontal.bottomAxis import com.patrykandpatrick.vico.compose.chart.line.lineChart import com.patrykandpatrick.vico.compose.chart.scroll.rememberChartScrollSpec +import com.patrykandpatrick.vico.compose.component.textComponent import com.patrykandpatrick.vico.core.chart.decoration.ThresholdLine import com.patrykandpatrick.vico.core.chart.scale.AutoScaleUp +import com.patrykandpatrick.vico.core.component.marker.MarkerComponent import com.patrykandpatrick.vico.core.entry.FloatEntry import com.patrykandpatrick.vico.core.scroll.AutoScrollCondition import com.patrykandpatrick.vico.core.scroll.InitialScroll @@ -192,12 +195,22 @@ fun Display( ThresholdLine( thresholdValue = 0f ) - ) + ), + persistentMarkers = mapOf(xProducer.getModel().maxX to MarkerComponent( + label = textComponent(), + indicator = null, + guideline = axisGuidelineComponent() + )), + ) + + val marker = MarkerComponent( + label = textComponent(), + indicator = null, + guideline = axisGuidelineComponent() ) val lastMeasure = state.measureHistory.lastOrNull() - Log.d("mode", lastMeasure.toString()) when(lastMeasure){ is Ble.Accelerometer.RealtimePoint.Angle -> { @@ -283,6 +296,7 @@ fun Display( Text(text = "Ось Z:") Chart( + marker = marker, chart = lineChart, chartModelProducer = zProducer, startAxis = startAxis(), @@ -307,6 +321,7 @@ fun Display( Text(text = "Вибрация:") Chart( + marker = marker, chart = lineChart, chartModelProducer = xProducer, startAxis = startAxis(), @@ -331,6 +346,7 @@ fun Display( Text(text = "Ось X:") Chart( + marker = marker, chart = lineChart, chartModelProducer = xProducer, startAxis = startAxis(), @@ -349,6 +365,7 @@ fun Display( Text(text = "Ось Y:") Chart( + marker = marker, chart = lineChart, chartModelProducer = yProducer, startAxis = startAxis(), @@ -367,6 +384,7 @@ fun Display( Text(text = "Ось Z:") Chart( + marker = marker, chart = lineChart, chartModelProducer = zProducer, startAxis = startAxis(), diff --git a/app/src/main/java/llc/arma/ble/app/ui/screen/inspection/accelerometer/view/AcceleromterHistory.kt b/app/src/main/java/llc/arma/ble/app/ui/screen/inspection/accelerometer/view/AcceleromterHistory.kt index 8533c72..f0ff989 100644 --- a/app/src/main/java/llc/arma/ble/app/ui/screen/inspection/accelerometer/view/AcceleromterHistory.kt +++ b/app/src/main/java/llc/arma/ble/app/ui/screen/inspection/accelerometer/view/AcceleromterHistory.kt @@ -27,13 +27,17 @@ import androidx.compose.material.icons.rounded.CloudUpload import androidx.compose.material.icons.rounded.Refresh import androidx.compose.ui.graphics.StrokeCap import androidx.compose.ui.text.style.TextAlign +import com.patrykandpatrick.vico.compose.axis.axisGuidelineComponent import com.patrykandpatrick.vico.compose.axis.horizontal.bottomAxis import com.patrykandpatrick.vico.compose.chart.line.lineChart import com.patrykandpatrick.vico.compose.chart.scroll.rememberChartScrollSpec +import com.patrykandpatrick.vico.compose.component.textComponent import com.patrykandpatrick.vico.core.axis.AxisPosition import com.patrykandpatrick.vico.core.axis.formatter.AxisValueFormatter import com.patrykandpatrick.vico.core.chart.decoration.ThresholdLine import com.patrykandpatrick.vico.core.chart.scale.AutoScaleUp +import com.patrykandpatrick.vico.core.component.marker.MarkerComponent +import com.patrykandpatrick.vico.core.component.text.TextComponent import com.patrykandpatrick.vico.core.entry.ChartEntry import com.patrykandpatrick.vico.core.entry.FloatEntry import com.patrykandpatrick.vico.core.scroll.AutoScrollCondition @@ -99,12 +103,12 @@ fun AccelerometerHistory( val title = when(state){ is AccelerometerHistoryContract.State.Display -> { when (state.loadingHistoryState) { - is ProgressState.Finished -> "График измерений (${state.loadingHistoryState.data.size})" - is ProgressState.Indeterminate -> "График измерений" - is ProgressState.Progress -> "График измерений" + is ProgressState.Finished -> "${accelMode.localized} (${state.loadingHistoryState.data.size})" + is ProgressState.Indeterminate -> accelMode.localized + is ProgressState.Progress -> accelMode.localized } } - AccelerometerHistoryContract.State.Exception -> "График измерений" + AccelerometerHistoryContract.State.Exception -> accelMode.localized } Text( @@ -258,6 +262,11 @@ fun Display( }) val lineChart = lineChart( + persistentMarkers = mapOf(xProducer.getModel().maxX to MarkerComponent( + label = textComponent(), + indicator = null, + guideline = axisGuidelineComponent() + )), decorations = listOf( ThresholdLine( thresholdValue = 0f @@ -267,6 +276,12 @@ fun Display( val lastMeasure = state.loadingHistoryState.data.lastOrNull() + val marker = MarkerComponent( + label = textComponent(), + indicator = null, + guideline = axisGuidelineComponent() + ) + when(lastMeasure){ is Ble.Accelerometer.HistoryPoint.Acceleration, is Ble.Accelerometer.HistoryPoint.Angle -> { @@ -275,6 +290,7 @@ fun Display( Text(text = "Ось X:") Chart( + marker = marker, chart = lineChart, chartModelProducer = xProducer, startAxis = startAxis(), @@ -297,6 +313,7 @@ fun Display( Text(text = "Ось Y:") Chart( + marker = marker, chart = lineChart, chartModelProducer = yProducer, startAxis = startAxis(), @@ -319,6 +336,7 @@ fun Display( Text(text = "Ось Z:") Chart( + marker = marker, chart = lineChart, chartModelProducer = zProducer, startAxis = startAxis(), @@ -347,6 +365,7 @@ fun Display( Text(text = "Обороты:") Chart( + marker = marker, chart = lineChart, chartModelProducer = xProducer, startAxis = startAxis(), @@ -375,6 +394,7 @@ fun Display( Text(text = "Вибрация:") Chart( + marker = marker, chart = lineChart, chartModelProducer = xProducer, startAxis = startAxis(), diff --git a/app/src/main/java/llc/arma/ble/app/ui/screen/inspection/accelerometer/view/DisplayState.kt b/app/src/main/java/llc/arma/ble/app/ui/screen/inspection/accelerometer/view/DisplayState.kt index 776a7a3..dc1f45e 100644 --- a/app/src/main/java/llc/arma/ble/app/ui/screen/inspection/accelerometer/view/DisplayState.kt +++ b/app/src/main/java/llc/arma/ble/app/ui/screen/inspection/accelerometer/view/DisplayState.kt @@ -142,48 +142,55 @@ fun DisplayState( } - Box( - modifier = Modifier.padding( - vertical = 8.dp, - horizontal = 8.dp - ) - ) { + if(ble.accelerometerState.saveHistory is Ble.Accelerometer.HistorySettings.Enabled) { - Row( - verticalAlignment = Alignment.CenterVertically, - modifier = Modifier - .clip(RoundedCornerShape(16.dp)) - .clickable { - onEvent(AccelerometerContract.Event.OnSaveIntervalEdit) - } - .padding(8.dp) + Box( + modifier = Modifier.padding( + vertical = 8.dp, + horizontal = 8.dp + ) ) { - Column( - modifier = Modifier.weight(1f) + Row( + verticalAlignment = Alignment.CenterVertically, + modifier = Modifier + .clip(RoundedCornerShape(16.dp)) + .clickable { + onEvent(AccelerometerContract.Event.OnSaveIntervalEdit) + } + .padding(8.dp) ) { - Text( - text = "Интервал измерений" - ) + Column( + modifier = Modifier.weight(1f) + ) { - val hours = ble.accelerometerState.historyInterval / millisInHour - val minutes = (ble.accelerometerState.historyInterval - (hours * millisInHour)) / millisInMinute - val seconds = (ble.accelerometerState.historyInterval - (hours * millisInHour) - (minutes * millisInMinute)) / millisInSecond + Text( + text = "Интервал измерений" + ) - Text( - color = MaterialTheme.colorScheme.secondary, - style = MaterialTheme.typography.bodyMedium, - text = "$hours ч. $minutes мин. $seconds сек." + val hours = + ble.accelerometerState.historyInterval / millisInHour + val minutes = + (ble.accelerometerState.historyInterval - (hours * millisInHour)) / millisInMinute + val seconds = + (ble.accelerometerState.historyInterval - (hours * millisInHour) - (minutes * millisInMinute)) / millisInSecond + + Text( + color = MaterialTheme.colorScheme.secondary, + style = MaterialTheme.typography.bodyMedium, + text = "$hours ч. $minutes мин. $seconds сек." + ) + + } + + Icon( + imageVector = Icons.Rounded.KeyboardArrowDown, + contentDescription = null ) } - Icon( - imageVector = Icons.Rounded.KeyboardArrowDown, - contentDescription = null - ) - } } @@ -200,7 +207,13 @@ fun DisplayState( modifier = Modifier .clip(RoundedCornerShape(16.dp)) .clickable { - onEvent(AccelerometerContract.Event.OnShowAccelerometerHistory) + + when(origin.accelerometerState.saveHistorySettings){ + is Ble.Accelerometer.HistorySettings.Disabled -> + onEvent(AccelerometerContract.Event.OnAccelEdit) + is Ble.Accelerometer.HistorySettings.Enabled -> + onEvent(AccelerometerContract.Event.OnShowAccelerometerHistory) + } } .padding(8.dp) ) { @@ -213,75 +226,14 @@ fun DisplayState( text = "График измерений" ) - } - - Icon( - imageVector = Icons.Rounded.KeyboardArrowRight, - 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.OnAccelEdit) } - .padding(8.dp) - ) { - - Column( - modifier = Modifier.weight(1f) - ) { - - Text( - text = "Ускорение" - ) - - } - - Icon( - imageVector = Icons.Rounded.KeyboardArrowRight, - 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.OnSpectreEdit) - } - .padding(8.dp) - ) { - - Column( - modifier = Modifier.weight(1f) - ) { - - Text( - text = "Спектр" - ) + /*Text( + color = MaterialTheme.colorScheme.secondary, + style = MaterialTheme.typography.bodyMedium, + text = when(origin.accelerometerState.saveHistorySettings){ + Ble.Accelerometer.HistorySettings.Disabled -> "Текущие измерения" + is Ble.Accelerometer.HistorySettings.Enabled -> "" + } + )*/ } diff --git a/app/src/main/java/llc/arma/ble/data/BleRepositoryImpl.kt b/app/src/main/java/llc/arma/ble/data/BleRepositoryImpl.kt index 444ecbc..45d90cf 100644 --- a/app/src/main/java/llc/arma/ble/data/BleRepositoryImpl.kt +++ b/app/src/main/java/llc/arma/ble/data/BleRepositoryImpl.kt @@ -2,6 +2,7 @@ package llc.arma.ble.data import android.app.Application import android.os.SystemClock +import android.util.Log import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.channels.awaitClose @@ -30,8 +31,8 @@ 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 no.nordicsemi.android.common.core.DataByteArray import no.nordicsemi.android.kotlin.ble.client.main.callback.ClientBleGatt -import no.nordicsemi.android.kotlin.ble.core.data.util.DataByteArray import no.nordicsemi.android.kotlin.ble.core.scanner.BleNumOfMatches import no.nordicsemi.android.kotlin.ble.core.scanner.BleScanMode import no.nordicsemi.android.kotlin.ble.core.scanner.BleScannerCallbackType @@ -154,7 +155,7 @@ class BleRepositoryImpl @Inject constructor( Ble.Accelerometer( info = newResult.copy( - rssi = if((SystemClock.elapsedRealtimeNanos() - newResult.scanTime) > 15_000_000_000) { + rssi = if((SystemClock.elapsedRealtime() - newResult.scanTime) > 15_000) { null } else { newResult.rssi @@ -195,7 +196,7 @@ class BleRepositoryImpl @Inject constructor( Ble.Beacon( info = newResult.copy( - rssi = if((SystemClock.elapsedRealtimeNanos() - newResult.scanTime) > 15_000_000_000) { + rssi = if((SystemClock.elapsedRealtime() - newResult.scanTime) > 15_000) { null } else { newResult.rssi @@ -243,7 +244,7 @@ class BleRepositoryImpl @Inject constructor( Ble.Thermometer( info = newResult.copy( - rssi = if((SystemClock.elapsedRealtimeNanos() - newResult.scanTime) > 15_000_000_000) { + rssi = if((SystemClock.elapsedRealtime() - newResult.scanTime) > 15_000) { null } else { newResult.rssi @@ -495,6 +496,10 @@ class BleRepositoryImpl @Inject constructor( } + service.findCharacteristic(flashWriteUUID)!!.write( + DataByteArray.from(9) + ) + connection.close() Result.success(Unit) @@ -537,6 +542,10 @@ class BleRepositoryImpl @Inject constructor( } + connection.discoverServices().findService(serviceUUID)?.findCharacteristic(flashWriteUUID)!!.write( + DataByteArray.from(9) + ) + connection.close() Result.success(Unit) @@ -582,6 +591,8 @@ class BleRepositoryImpl @Inject constructor( BleException.UnexpectedResponse ) + Log.d("write", request.toString()) + request.tx?.let { service.findCharacteristic(txWriteUUID)!!.write( DataByteArray.from(it.sendData) @@ -618,7 +629,9 @@ class BleRepositoryImpl @Inject constructor( } - connection.close() + service.findCharacteristic(flashWriteUUID)!!.write( + DataByteArray.from(9) + ) Result.success(Unit) diff --git a/app/src/main/java/llc/arma/ble/data/GetAccelerometerHistory.kt b/app/src/main/java/llc/arma/ble/data/GetAccelerometerHistory.kt index cb891ad..0599025 100644 --- a/app/src/main/java/llc/arma/ble/data/GetAccelerometerHistory.kt +++ b/app/src/main/java/llc/arma/ble/data/GetAccelerometerHistory.kt @@ -17,8 +17,8 @@ import llc.arma.ble.domain.common.ProgressState import llc.arma.ble.domain.model.Ble import llc.arma.ble.domain.usecase.AccelScale import llc.arma.ble.domain.usecase.AccelViewMode +import no.nordicsemi.android.common.core.DataByteArray import no.nordicsemi.android.kotlin.ble.client.main.callback.ClientBleGatt -import no.nordicsemi.android.kotlin.ble.core.data.util.DataByteArray @OptIn(ExperimentalUnsignedTypes::class) diff --git a/app/src/main/java/llc/arma/ble/data/GetAccelerometerRealtimeData.kt b/app/src/main/java/llc/arma/ble/data/GetAccelerometerRealtimeData.kt index 8062a65..0e0ca8c 100644 --- a/app/src/main/java/llc/arma/ble/data/GetAccelerometerRealtimeData.kt +++ b/app/src/main/java/llc/arma/ble/data/GetAccelerometerRealtimeData.kt @@ -18,8 +18,8 @@ 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 no.nordicsemi.android.common.core.DataByteArray import no.nordicsemi.android.kotlin.ble.client.main.callback.ClientBleGatt -import no.nordicsemi.android.kotlin.ble.core.data.util.DataByteArray fun getAccelerometerRealtimeData( app: Application, diff --git a/app/src/main/java/llc/arma/ble/data/ReadAccelerometerSpectreCallback.kt b/app/src/main/java/llc/arma/ble/data/ReadAccelerometerSpectreCallback.kt index 8acc858..4047aa8 100644 --- a/app/src/main/java/llc/arma/ble/data/ReadAccelerometerSpectreCallback.kt +++ b/app/src/main/java/llc/arma/ble/data/ReadAccelerometerSpectreCallback.kt @@ -25,8 +25,8 @@ 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 no.nordicsemi.android.common.core.DataByteArray import no.nordicsemi.android.kotlin.ble.client.main.callback.ClientBleGatt -import no.nordicsemi.android.kotlin.ble.core.data.util.DataByteArray import java.nio.ByteBuffer import java.nio.ByteOrder.LITTLE_ENDIAN import java.util.UUID @@ -78,9 +78,7 @@ fun readAccelerometerSpectre( )) ) - val notifications = characteristic.getNotifications() - - notifications.collect { + characteristic.getNotifications().collect { var initialValue: Long? = null var frequencyInterval: Long? = null diff --git a/app/src/main/java/llc/arma/ble/data/ReadTemperatureHistoryCallback.kt b/app/src/main/java/llc/arma/ble/data/ReadTemperatureHistoryCallback.kt index 625b47c..e712436 100644 --- a/app/src/main/java/llc/arma/ble/data/ReadTemperatureHistoryCallback.kt +++ b/app/src/main/java/llc/arma/ble/data/ReadTemperatureHistoryCallback.kt @@ -18,8 +18,8 @@ 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 no.nordicsemi.android.common.core.DataByteArray import no.nordicsemi.android.kotlin.ble.client.main.callback.ClientBleGatt -import no.nordicsemi.android.kotlin.ble.core.data.util.DataByteArray @OptIn(ExperimentalUnsignedTypes::class) fun readThermometerHistory( diff --git a/app/src/main/java/llc/arma/ble/data/extensions/BleScanResultExtensions.kt b/app/src/main/java/llc/arma/ble/data/extensions/BleScanResultExtensions.kt index 5d7bdf3..75053bd 100644 --- a/app/src/main/java/llc/arma/ble/data/extensions/BleScanResultExtensions.kt +++ b/app/src/main/java/llc/arma/ble/data/extensions/BleScanResultExtensions.kt @@ -18,7 +18,7 @@ val BleScanResult.info: BleInfo rssi = data?.rssi, type = type, scanTime = (data?.timestampNanos ?: 0) / 1_000_000, - tx = data?.txPower ?: 0, + tx = data?.scanRecord?.txPowerLevel ?: 0, recordEnabled = timerEnabled ) }