diff --git a/app/build.gradle b/app/build.gradle index 1544087..38b1aa9 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -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" } } diff --git a/app/src/main/java/llc/arma/ble/app/ui/MainActivity.kt b/app/src/main/java/llc/arma/ble/app/ui/MainActivity.kt index 2f757d1..38a7647 100644 --- a/app/src/main/java/llc/arma/ble/app/ui/MainActivity.kt +++ b/app/src/main/java/llc/arma/ble/app/ui/MainActivity.kt @@ -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 diff --git a/app/src/main/java/llc/arma/ble/app/ui/model/BleView.kt b/app/src/main/java/llc/arma/ble/app/ui/model/BleView.kt index e033468..70ba930 100644 --- a/app/src/main/java/llc/arma/ble/app/ui/model/BleView.kt +++ b/app/src/main/java/llc/arma/ble/app/ui/model/BleView.kt @@ -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 ) { 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 0c33eb7..c65b405 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,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(){ - - enum class Next { - ACCEL, SPECTRE - } + ) : Event() + enum class Next { + 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() 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 e58527b..deb3da6 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 @@ -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) } 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 fcba183..16a803f 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,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) } } 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 new file mode 100644 index 0000000..fb9f161 --- /dev/null +++ b/app/src/main/java/llc/arma/ble/app/ui/screen/inspection/accelerometer/view/AccelEdit.kt @@ -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 = "Продолжить" + ) + + } + + } + + } + +} \ No newline at end of file diff --git a/app/src/main/java/llc/arma/ble/app/ui/screen/inspection/accelerometer/view/AccelScaleEdit.kt b/app/src/main/java/llc/arma/ble/app/ui/screen/inspection/accelerometer/view/AccelScaleEdit.kt new file mode 100644 index 0000000..1402fc0 --- /dev/null +++ b/app/src/main/java/llc/arma/ble/app/ui/screen/inspection/accelerometer/view/AccelScaleEdit.kt @@ -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 = "Ок" + ) + + } + + } + + } + +} \ No newline at end of file diff --git a/app/src/main/java/llc/arma/ble/app/ui/screen/inspection/accelerometer/view/AccelSpectreEdit.kt b/app/src/main/java/llc/arma/ble/app/ui/screen/inspection/accelerometer/view/AccelSpectreEdit.kt index 7f86f83..a56b76e 100644 --- a/app/src/main/java/llc/arma/ble/app/ui/screen/inspection/accelerometer/view/AccelSpectreEdit.kt +++ b/app/src/main/java/llc/arma/ble/app/ui/screen/inspection/accelerometer/view/AccelSpectreEdit.kt @@ -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)) diff --git a/app/src/main/java/llc/arma/ble/app/ui/screen/inspection/accelerometer/view/AccelViewEdit.kt b/app/src/main/java/llc/arma/ble/app/ui/screen/inspection/accelerometer/view/AccelViewEdit.kt index d437536..624393a 100644 --- a/app/src/main/java/llc/arma/ble/app/ui/screen/inspection/accelerometer/view/AccelViewEdit.kt +++ b/app/src/main/java/llc/arma/ble/app/ui/screen/inspection/accelerometer/view/AccelViewEdit.kt @@ -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 = "Ок" ) } 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 76eb781..787f6d4 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 @@ -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) 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 ded9c76..c5b8669 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 @@ -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) 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 a1bbdbd..5fc7039 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 @@ -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) ) { diff --git a/app/src/main/java/llc/arma/ble/app/ui/screen/inspection/accelerometer/view/HistoryEdit.kt b/app/src/main/java/llc/arma/ble/app/ui/screen/inspection/accelerometer/view/HistoryEdit.kt new file mode 100644 index 0000000..9881057 --- /dev/null +++ b/app/src/main/java/llc/arma/ble/app/ui/screen/inspection/accelerometer/view/HistoryEdit.kt @@ -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 = "Ок" + ) + + } + + } + + } + +} \ No newline at end of file diff --git a/app/src/main/java/llc/arma/ble/app/ui/screen/inspection/accelerometer/view/Write.kt b/app/src/main/java/llc/arma/ble/app/ui/screen/inspection/accelerometer/view/Write.kt index 2d2e464..9687ee1 100644 --- a/app/src/main/java/llc/arma/ble/app/ui/screen/inspection/accelerometer/view/Write.kt +++ b/app/src/main/java/llc/arma/ble/app/ui/screen/inspection/accelerometer/view/Write.kt @@ -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 -> "Включено" + } ) } 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 11c630b..8bf7924 100644 --- a/app/src/main/java/llc/arma/ble/data/BleRepositoryImpl.kt +++ b/app/src/main/java/llc/arma/ble/data/BleRepositoryImpl.kt @@ -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,15 +742,55 @@ class BleRepositoryImpl @Inject constructor( return callbackFlow { - deviceCache[serial]?.device?.let { + deviceCache[serial]?.device?.let { device -> if (checkPermission()) { - gatt = it.connectGatt(app, false, ReadAccelerometerHistoryCallback(app) { - CoroutineScope(Dispatchers.IO).launch { - send(it) + 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 { @@ -706,8 +798,6 @@ class BleRepositoryImpl @Inject constructor( send(Result.failure(BleException.PermissionDenied)) } - return@callbackFlow - } } @@ -865,28 +955,39 @@ class BleRepositoryImpl @Inject constructor( var gatt: BluetoothGatt? = null - deviceCache[serial]?.let { + if(checkPermission()) { - gatt = it.device.connectGatt( - app, - false, - ReadAccelerometerCallback( - app = app, - accelScale = accelScale, - accelMode = accelMode, - fftAxis = fftAxis, - fftMode = fftMode, - frequency = frequency - ){ result -> - CoroutineScope(Dispatchers.IO).launch { - send(result) + deviceCache[serial]?.let { + + gatt = it.device.connectGatt( + app, + false, + ReadAccelerometerCallback( + app = app, + accelScale = accelScale, + accelMode = accelMode, + fftAxis = fftAxis, + fftMode = fftMode, + frequency = frequency + ) { result -> + CoroutineScope(Dispatchers.IO).launch { + send(result) + } } - } - ) + ) + + } + + awaitClose { + gatt?.close() + } + + } else { + CoroutineScope(Dispatchers.IO).launch { + + send(Result.failure(BleException.PermissionDenied)) + } - } - awaitClose { - gatt?.close() } } @@ -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{ + } 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,13 +1238,11 @@ class BleRepositoryImpl @Inject constructor( if (checkPermission()) { - gatt.close() - if(status == BluetoothGatt.GATT_SUCCESS) { it.resume(Result.success(Unit)) - }else{ + } else { it.resume(Result.failure(BleException.UnexpectedResponse)) @@ -1147,11 +1250,12 @@ class BleRepositoryImpl @Inject constructor( } else { - gatt.close() it.resume(Result.failure(BleException.PermissionDenied)) } + gatt.disconnect() + } } diff --git a/app/src/main/java/llc/arma/ble/data/ReadAccelerometerCallback.kt b/app/src/main/java/llc/arma/ble/data/ReadAccelerometerCallback.kt index d5b40d6..ed81774 100644 --- a/app/src/main/java/llc/arma/ble/data/ReadAccelerometerCallback.kt +++ b/app/src/main/java/llc/arma/ble/data/ReadAccelerometerCallback.kt @@ -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 { diff --git a/app/src/main/java/llc/arma/ble/data/ReadAccelerometerHistoryCallback.kt b/app/src/main/java/llc/arma/ble/data/ReadAccelerometerHistoryCallback.kt index 41ed797..6c52b68 100644 --- a/app/src/main/java/llc/arma/ble/data/ReadAccelerometerHistoryCallback.kt +++ b/app/src/main/java/llc/arma/ble/data/ReadAccelerometerHistoryCallback.kt @@ -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>, 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 ) } ) 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 0efb84f..5dc51b2 100644 --- a/app/src/main/java/llc/arma/ble/data/ReadAccelerometerSpectreCallback.kt +++ b/app/src/main/java/llc/arma/ble/data/ReadAccelerometerSpectreCallback.kt @@ -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 ) } ) diff --git a/app/src/main/java/llc/arma/ble/data/WriteAccelerometerCallback.kt b/app/src/main/java/llc/arma/ble/data/WriteAccelerometerCallback.kt index fa8bba4..69815af 100644 --- a/app/src/main/java/llc/arma/ble/data/WriteAccelerometerCallback.kt +++ b/app/src/main/java/llc/arma/ble/data/WriteAccelerometerCallback.kt @@ -96,7 +96,11 @@ class WriteAccelerometerCallback( Pair( saveEnabledWriteUUID, mutableListOf(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 diff --git a/app/src/main/java/llc/arma/ble/domain/model/Ble.kt b/app/src/main/java/llc/arma/ble/domain/model/Ble.kt index 9afce19..37d1b48 100644 --- a/app/src/main/java/llc/arma/ble/domain/model/Ble.kt +++ b/app/src/main/java/llc/arma/ble/domain/model/Ble.kt @@ -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 ) diff --git a/app/src/main/java/llc/arma/ble/domain/usecase/GetAccelerometerMeasureBySerialFlow.kt b/app/src/main/java/llc/arma/ble/domain/usecase/GetAccelerometerMeasureBySerialFlow.kt index be2ab71..fdcae88 100644 --- a/app/src/main/java/llc/arma/ble/domain/usecase/GetAccelerometerMeasureBySerialFlow.kt +++ b/app/src/main/java/llc/arma/ble/domain/usecase/GetAccelerometerMeasureBySerialFlow.kt @@ -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( diff --git a/build.gradle b/build.gradle index 40dc16d..dd43d6b 100644 --- a/build.gradle +++ b/build.gradle @@ -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 } \ No newline at end of file