kotlin ble migration
This commit is contained in:
parent
c0e0aadc28
commit
e19338397d
|
|
@ -13,8 +13,8 @@ android {
|
||||||
applicationId "llc.arma.ble"
|
applicationId "llc.arma.ble"
|
||||||
minSdk 26
|
minSdk 26
|
||||||
targetSdk 34
|
targetSdk 34
|
||||||
versionCode 23
|
versionCode 25
|
||||||
versionName "1.3.3"
|
versionName "1.3.5"
|
||||||
|
|
||||||
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
|
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
|
||||||
vectorDrawables {
|
vectorDrawables {
|
||||||
|
|
@ -86,8 +86,8 @@ dependencies {
|
||||||
kapt('com.google.dagger:hilt-android-compiler:2.45')
|
kapt('com.google.dagger:hilt-android-compiler:2.45')
|
||||||
kapt("androidx.hilt:hilt-compiler:1.0.0")
|
kapt("androidx.hilt:hilt-compiler:1.0.0")
|
||||||
|
|
||||||
implementation 'no.nordicsemi.android.kotlin.ble:scanner:1.0.19'
|
implementation 'no.nordicsemi.android.kotlin.ble:scanner:1.0.14'
|
||||||
implementation 'no.nordicsemi.android.kotlin.ble:client:1.0.19'
|
implementation 'no.nordicsemi.android.kotlin.ble:client:1.0.14'
|
||||||
|
|
||||||
implementation "com.google.accompanist:accompanist-permissions:0.26.3-beta"
|
implementation "com.google.accompanist:accompanist-permissions:0.26.3-beta"
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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.ViewSideEffect
|
||||||
import llc.arma.ble.app.ui.common.ViewState
|
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.domain.model.Ble
|
import llc.arma.ble.domain.model.Ble
|
||||||
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
|
||||||
|
|
@ -24,6 +25,8 @@ class AccelerometerContract {
|
||||||
object OnShowAccelerometerHistory : Event()
|
object OnShowAccelerometerHistory : Event()
|
||||||
object OnHideAccelerometerHistory : Event()
|
object OnHideAccelerometerHistory : Event()
|
||||||
|
|
||||||
|
object OnRealtimeViewModeEdit : Event()
|
||||||
|
|
||||||
data class OnAccelViewModeEdit(
|
data class OnAccelViewModeEdit(
|
||||||
val next: Next
|
val next: Next
|
||||||
) : Event()
|
) : Event()
|
||||||
|
|
@ -56,6 +59,10 @@ class AccelerometerContract {
|
||||||
object OnSaveIntervalEdit : Event()
|
object OnSaveIntervalEdit : Event()
|
||||||
object OnHideHistoryEdit : Event()
|
object OnHideHistoryEdit : Event()
|
||||||
|
|
||||||
|
data class OnRealtimeViewModeChanged(
|
||||||
|
val mode: RealtimeViewMode
|
||||||
|
) : Event()
|
||||||
|
|
||||||
data class OnBleChanged(
|
data class OnBleChanged(
|
||||||
val ble: Ble.Accelerometer,
|
val ble: Ble.Accelerometer,
|
||||||
): Event()
|
): Event()
|
||||||
|
|
@ -111,6 +118,7 @@ class AccelerometerContract {
|
||||||
val accelerometer: BleView.Accelerometer,
|
val accelerometer: BleView.Accelerometer,
|
||||||
val writeState: WriteState?,
|
val writeState: WriteState?,
|
||||||
val accelViewMode: AccelViewMode,
|
val accelViewMode: AccelViewMode,
|
||||||
|
val accelRealtimeViewMode: RealtimeViewMode,
|
||||||
val accelScale: AccelScale,
|
val accelScale: AccelScale,
|
||||||
val fftViewMode: FftViewMode,
|
val fftViewMode: FftViewMode,
|
||||||
val fftAxis: FftAxis,
|
val fftAxis: FftAxis,
|
||||||
|
|
@ -139,6 +147,8 @@ class AccelerometerContract {
|
||||||
|
|
||||||
sealed class Effect : ViewSideEffect {
|
sealed class Effect : ViewSideEffect {
|
||||||
|
|
||||||
|
object ShowRealtimeViewModeEdit : Effect()
|
||||||
|
|
||||||
object ShowAccelerometerAccel : Effect()
|
object ShowAccelerometerAccel : Effect()
|
||||||
object ShowAccelerometerSpectre : Effect()
|
object ShowAccelerometerSpectre : Effect()
|
||||||
object ShowAccelerometerHistory : Effect()
|
object ShowAccelerometerHistory : Effect()
|
||||||
|
|
|
||||||
|
|
@ -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.AccelFftAxisEdit
|
||||||
import llc.arma.ble.app.ui.screen.inspection.accelerometer.view.AccelFftModeEdit
|
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.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.AccelSpectreEdit
|
||||||
import llc.arma.ble.app.ui.screen.inspection.accelerometer.view.AccelViewEdit
|
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.IntervalEdit
|
||||||
import llc.arma.ble.app.ui.screen.inspection.accelerometer.view.LoadingState
|
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.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.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, 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)
|
@OptIn(ExperimentalMaterialApi::class)
|
||||||
|
|
@ -93,15 +95,36 @@ fun AccelerometerScreen(
|
||||||
val currentState = viewModel.viewState.value
|
val currentState = viewModel.viewState.value
|
||||||
|
|
||||||
if (currentState is AccelerometerContract.State.Display) {
|
if (currentState is AccelerometerContract.State.Display) {
|
||||||
|
|
||||||
bottomDialog.show {
|
bottomDialog.show {
|
||||||
AccelerometerRealtime(
|
|
||||||
ble = currentState.accelerometer.info,
|
when(currentState.accelRealtimeViewMode){
|
||||||
accelMode = currentState.accelViewMode,
|
is RealtimeViewMode.Accel -> {
|
||||||
fftAxis = currentState.fftAxis,
|
|
||||||
fftMode = currentState.fftViewMode,
|
AccelerometerRealtime(
|
||||||
frequency = currentState.fftFrequency,
|
ble = currentState.accelerometer.info,
|
||||||
accelScale = currentState.accelScale
|
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 -> {
|
null -> {
|
||||||
bottomDialog.hide()
|
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
|
sheetPage = null
|
||||||
delay(100)
|
delay(100)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
AccelerometerContract.Effect.ShowRealtimeViewModeEdit -> {
|
||||||
|
sheetPage = null
|
||||||
|
delay(100)
|
||||||
|
sheetPage = SheetPage.ACCEL_REALTIME_EDIT
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}.launchIn(this)
|
}.launchIn(this)
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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.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.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
|
||||||
import llc.arma.ble.domain.usecase.AccelViewMode
|
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.OnAccelScaleChanged -> reduce(viewState.value, event)
|
||||||
is AccelerometerContract.Event.OnAccelScaleEdit -> reduce(viewState.value, event)
|
is AccelerometerContract.Event.OnAccelScaleEdit -> reduce(viewState.value, event)
|
||||||
is AccelerometerContract.Event.OnAccelEdit -> 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.OnHistoryEdit -> reduce(viewState.value, event)
|
||||||
is AccelerometerContract.Event.OnHistoryScaleChanged -> reduce(viewState.value, event)
|
is AccelerometerContract.Event.OnHistoryScaleChanged -> reduce(viewState.value, event)
|
||||||
is AccelerometerContract.Event.OnHistoryViewModeChanged -> 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(
|
private fun reduce(
|
||||||
state: AccelerometerContract.State,
|
state: AccelerometerContract.State,
|
||||||
event: AccelerometerContract.Event.OnSpectreEdit
|
event: AccelerometerContract.Event.OnSpectreEdit
|
||||||
|
|
@ -489,14 +522,18 @@ class AccelerometerViewModel @Inject constructor(
|
||||||
|
|
||||||
viewModelScope.launch {
|
viewModelScope.launch {
|
||||||
|
|
||||||
setEffect {
|
if(state is AccelerometerContract.State.Display){
|
||||||
AccelerometerContract.Effect.ShowAccelerometerAccel
|
|
||||||
|
setEffect {
|
||||||
|
|
||||||
|
AccelerometerContract.Effect.ShowAccelerometerAccel
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun reduce(
|
private fun reduce(
|
||||||
|
|
@ -521,6 +558,7 @@ class AccelerometerViewModel @Inject constructor(
|
||||||
accelerometer = bleMapper.map(event.ble) as BleView.Accelerometer,
|
accelerometer = bleMapper.map(event.ble) as BleView.Accelerometer,
|
||||||
writeState = null,
|
writeState = null,
|
||||||
accelViewMode = AccelViewMode.ACCELERATION,
|
accelViewMode = AccelViewMode.ACCELERATION,
|
||||||
|
accelRealtimeViewMode = RealtimeViewMode.Accel(AccelViewMode.ACCELERATION),
|
||||||
fftAxis = FftAxis.AUTO,
|
fftAxis = FftAxis.AUTO,
|
||||||
fftFrequency = FftFrequency.F_400,
|
fftFrequency = FftFrequency.F_400,
|
||||||
fftViewMode = FftViewMode.SPECTRE,
|
fftViewMode = FftViewMode.SPECTRE,
|
||||||
|
|
|
||||||
|
|
@ -24,13 +24,15 @@ 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
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@Composable
|
@Composable
|
||||||
fun AccelEdit(
|
fun AccelEdit(
|
||||||
state: AccelerometerContract.State.Display,
|
state: AccelerometerContract.State.Display,
|
||||||
onEvent: (AccelerometerContract.Event) -> Unit,
|
onEvent: (AccelerometerContract.Event) -> Unit,
|
||||||
){
|
){
|
||||||
|
|
||||||
val accelMode = state.accelViewMode
|
val accelMode = state.accelRealtimeViewMode
|
||||||
val fftMode = state.fftViewMode
|
val fftMode = state.fftViewMode
|
||||||
val fftAxis = state.fftAxis
|
val fftAxis = state.fftAxis
|
||||||
val fftFrequency = state.fftFrequency
|
val fftFrequency = state.fftFrequency
|
||||||
|
|
@ -42,7 +44,7 @@ fun AccelEdit(
|
||||||
|
|
||||||
Text(
|
Text(
|
||||||
modifier = Modifier.padding(horizontal = 12.dp),
|
modifier = Modifier.padding(horizontal = 12.dp),
|
||||||
text = "Ускорение",
|
text = "Параметры",
|
||||||
style = MaterialTheme.typography.titleLarge
|
style = MaterialTheme.typography.titleLarge
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
@ -64,11 +66,7 @@ fun AccelEdit(
|
||||||
modifier = Modifier
|
modifier = Modifier
|
||||||
.clip(RoundedCornerShape(16.dp))
|
.clip(RoundedCornerShape(16.dp))
|
||||||
.clickable {
|
.clickable {
|
||||||
onEvent(
|
onEvent(AccelerometerContract.Event.OnRealtimeViewModeEdit)
|
||||||
AccelerometerContract.Event.OnAccelViewModeEdit(
|
|
||||||
next = AccelerometerContract.Event.Next.ACCEL
|
|
||||||
)
|
|
||||||
)
|
|
||||||
}
|
}
|
||||||
.padding(8.dp)
|
.padding(8.dp)
|
||||||
) {
|
) {
|
||||||
|
|
@ -78,7 +76,7 @@ fun AccelEdit(
|
||||||
) {
|
) {
|
||||||
|
|
||||||
Text(
|
Text(
|
||||||
text = "Accel view mode"
|
text = "Измеряемый параметр"
|
||||||
)
|
)
|
||||||
Text(
|
Text(
|
||||||
color = MaterialTheme.colorScheme.secondary,
|
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(
|
Box(
|
||||||
modifier = Modifier.padding(
|
modifier = Modifier.padding(
|
||||||
vertical = 8.dp,
|
vertical = 8.dp,
|
||||||
|
|
@ -119,7 +242,7 @@ fun AccelEdit(
|
||||||
) {
|
) {
|
||||||
|
|
||||||
Text(
|
Text(
|
||||||
text = "Accel scale"
|
text = "Масштаб"
|
||||||
)
|
)
|
||||||
Text(
|
Text(
|
||||||
color = MaterialTheme.colorScheme.secondary,
|
color = MaterialTheme.colorScheme.secondary,
|
||||||
|
|
|
||||||
|
|
@ -78,7 +78,7 @@ fun AccelFftAxisEdit(
|
||||||
shape = CircleShape,
|
shape = CircleShape,
|
||||||
color = MaterialTheme.colorScheme.primaryContainer,
|
color = MaterialTheme.colorScheme.primaryContainer,
|
||||||
onClick = {
|
onClick = {
|
||||||
onEvent(AccelerometerContract.Event.OnSpectreEdit)
|
onEvent(AccelerometerContract.Event.OnAccelEdit)
|
||||||
}
|
}
|
||||||
) {
|
) {
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -78,7 +78,7 @@ fun AccelFftModeEdit(
|
||||||
shape = CircleShape,
|
shape = CircleShape,
|
||||||
color = MaterialTheme.colorScheme.primaryContainer,
|
color = MaterialTheme.colorScheme.primaryContainer,
|
||||||
onClick = {
|
onClick = {
|
||||||
onEvent(AccelerometerContract.Event.OnSpectreEdit)
|
onEvent(AccelerometerContract.Event.OnAccelEdit)
|
||||||
}
|
}
|
||||||
) {
|
) {
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -78,7 +78,7 @@ fun AccelFrequencyEdit(
|
||||||
shape = CircleShape,
|
shape = CircleShape,
|
||||||
color = MaterialTheme.colorScheme.primaryContainer,
|
color = MaterialTheme.colorScheme.primaryContainer,
|
||||||
onClick = {
|
onClick = {
|
||||||
onEvent(AccelerometerContract.Event.OnSpectreEdit)
|
onEvent(AccelerometerContract.Event.OnAccelEdit)
|
||||||
}
|
}
|
||||||
) {
|
) {
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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 = "Ок"
|
||||||
|
)
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
@ -28,10 +28,13 @@ import androidx.compose.material.icons.Icons
|
||||||
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
|
||||||
|
import com.patrykandpatrick.vico.compose.axis.axisGuidelineComponent
|
||||||
import com.patrykandpatrick.vico.compose.chart.column.columnChart
|
import com.patrykandpatrick.vico.compose.chart.column.columnChart
|
||||||
import com.patrykandpatrick.vico.compose.chart.scroll.rememberChartScrollState
|
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.AxisPosition
|
||||||
import com.patrykandpatrick.vico.core.axis.formatter.AxisValueFormatter
|
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.ChartEntry
|
||||||
import com.patrykandpatrick.vico.core.entry.FloatEntry
|
import com.patrykandpatrick.vico.core.entry.FloatEntry
|
||||||
import kotlinx.coroutines.Job
|
import kotlinx.coroutines.Job
|
||||||
|
|
@ -231,12 +234,24 @@ fun Display(
|
||||||
}
|
}
|
||||||
|
|
||||||
val lineChart = columnChart(
|
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 scrollState = rememberChartScrollState()
|
||||||
|
|
||||||
|
val marker = MarkerComponent(
|
||||||
|
label = textComponent(),
|
||||||
|
indicator = null,
|
||||||
|
guideline = axisGuidelineComponent()
|
||||||
|
)
|
||||||
|
|
||||||
Chart(
|
Chart(
|
||||||
|
marker = marker,
|
||||||
diffAnimationSpec = tween(0),
|
diffAnimationSpec = tween(0),
|
||||||
isZoomEnabled = true,
|
isZoomEnabled = true,
|
||||||
chartScrollState = scrollState,
|
chartScrollState = scrollState,
|
||||||
|
|
|
||||||
|
|
@ -27,11 +27,14 @@ 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
|
||||||
import androidx.compose.ui.text.style.TextAlign
|
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.axis.horizontal.bottomAxis
|
||||||
import com.patrykandpatrick.vico.compose.chart.line.lineChart
|
import com.patrykandpatrick.vico.compose.chart.line.lineChart
|
||||||
import com.patrykandpatrick.vico.compose.chart.scroll.rememberChartScrollSpec
|
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.decoration.ThresholdLine
|
||||||
import com.patrykandpatrick.vico.core.chart.scale.AutoScaleUp
|
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.entry.FloatEntry
|
||||||
import com.patrykandpatrick.vico.core.scroll.AutoScrollCondition
|
import com.patrykandpatrick.vico.core.scroll.AutoScrollCondition
|
||||||
import com.patrykandpatrick.vico.core.scroll.InitialScroll
|
import com.patrykandpatrick.vico.core.scroll.InitialScroll
|
||||||
|
|
@ -192,12 +195,22 @@ fun Display(
|
||||||
ThresholdLine(
|
ThresholdLine(
|
||||||
thresholdValue = 0f
|
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()
|
val lastMeasure = state.measureHistory.lastOrNull()
|
||||||
|
|
||||||
Log.d("mode", lastMeasure.toString())
|
|
||||||
|
|
||||||
when(lastMeasure){
|
when(lastMeasure){
|
||||||
is Ble.Accelerometer.RealtimePoint.Angle -> {
|
is Ble.Accelerometer.RealtimePoint.Angle -> {
|
||||||
|
|
@ -283,6 +296,7 @@ fun Display(
|
||||||
|
|
||||||
Text(text = "Ось Z:")
|
Text(text = "Ось Z:")
|
||||||
Chart(
|
Chart(
|
||||||
|
marker = marker,
|
||||||
chart = lineChart,
|
chart = lineChart,
|
||||||
chartModelProducer = zProducer,
|
chartModelProducer = zProducer,
|
||||||
startAxis = startAxis(),
|
startAxis = startAxis(),
|
||||||
|
|
@ -307,6 +321,7 @@ fun Display(
|
||||||
Text(text = "Вибрация:")
|
Text(text = "Вибрация:")
|
||||||
|
|
||||||
Chart(
|
Chart(
|
||||||
|
marker = marker,
|
||||||
chart = lineChart,
|
chart = lineChart,
|
||||||
chartModelProducer = xProducer,
|
chartModelProducer = xProducer,
|
||||||
startAxis = startAxis(),
|
startAxis = startAxis(),
|
||||||
|
|
@ -331,6 +346,7 @@ fun Display(
|
||||||
Text(text = "Ось X:")
|
Text(text = "Ось X:")
|
||||||
|
|
||||||
Chart(
|
Chart(
|
||||||
|
marker = marker,
|
||||||
chart = lineChart,
|
chart = lineChart,
|
||||||
chartModelProducer = xProducer,
|
chartModelProducer = xProducer,
|
||||||
startAxis = startAxis(),
|
startAxis = startAxis(),
|
||||||
|
|
@ -349,6 +365,7 @@ fun Display(
|
||||||
|
|
||||||
Text(text = "Ось Y:")
|
Text(text = "Ось Y:")
|
||||||
Chart(
|
Chart(
|
||||||
|
marker = marker,
|
||||||
chart = lineChart,
|
chart = lineChart,
|
||||||
chartModelProducer = yProducer,
|
chartModelProducer = yProducer,
|
||||||
startAxis = startAxis(),
|
startAxis = startAxis(),
|
||||||
|
|
@ -367,6 +384,7 @@ fun Display(
|
||||||
|
|
||||||
Text(text = "Ось Z:")
|
Text(text = "Ось Z:")
|
||||||
Chart(
|
Chart(
|
||||||
|
marker = marker,
|
||||||
chart = lineChart,
|
chart = lineChart,
|
||||||
chartModelProducer = zProducer,
|
chartModelProducer = zProducer,
|
||||||
startAxis = startAxis(),
|
startAxis = startAxis(),
|
||||||
|
|
|
||||||
|
|
@ -27,13 +27,17 @@ 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
|
||||||
import androidx.compose.ui.text.style.TextAlign
|
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.axis.horizontal.bottomAxis
|
||||||
import com.patrykandpatrick.vico.compose.chart.line.lineChart
|
import com.patrykandpatrick.vico.compose.chart.line.lineChart
|
||||||
import com.patrykandpatrick.vico.compose.chart.scroll.rememberChartScrollSpec
|
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.AxisPosition
|
||||||
import com.patrykandpatrick.vico.core.axis.formatter.AxisValueFormatter
|
import com.patrykandpatrick.vico.core.axis.formatter.AxisValueFormatter
|
||||||
import com.patrykandpatrick.vico.core.chart.decoration.ThresholdLine
|
import com.patrykandpatrick.vico.core.chart.decoration.ThresholdLine
|
||||||
import com.patrykandpatrick.vico.core.chart.scale.AutoScaleUp
|
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.ChartEntry
|
||||||
import com.patrykandpatrick.vico.core.entry.FloatEntry
|
import com.patrykandpatrick.vico.core.entry.FloatEntry
|
||||||
import com.patrykandpatrick.vico.core.scroll.AutoScrollCondition
|
import com.patrykandpatrick.vico.core.scroll.AutoScrollCondition
|
||||||
|
|
@ -99,12 +103,12 @@ fun AccelerometerHistory(
|
||||||
val title = when(state){
|
val title = when(state){
|
||||||
is AccelerometerHistoryContract.State.Display -> {
|
is AccelerometerHistoryContract.State.Display -> {
|
||||||
when (state.loadingHistoryState) {
|
when (state.loadingHistoryState) {
|
||||||
is ProgressState.Finished -> "График измерений (${state.loadingHistoryState.data.size})"
|
is ProgressState.Finished -> "${accelMode.localized} (${state.loadingHistoryState.data.size})"
|
||||||
is ProgressState.Indeterminate -> "График измерений"
|
is ProgressState.Indeterminate -> accelMode.localized
|
||||||
is ProgressState.Progress -> "График измерений"
|
is ProgressState.Progress -> accelMode.localized
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
AccelerometerHistoryContract.State.Exception -> "График измерений"
|
AccelerometerHistoryContract.State.Exception -> accelMode.localized
|
||||||
}
|
}
|
||||||
|
|
||||||
Text(
|
Text(
|
||||||
|
|
@ -258,6 +262,11 @@ fun Display(
|
||||||
})
|
})
|
||||||
|
|
||||||
val lineChart = lineChart(
|
val lineChart = lineChart(
|
||||||
|
persistentMarkers = mapOf(xProducer.getModel().maxX to MarkerComponent(
|
||||||
|
label = textComponent(),
|
||||||
|
indicator = null,
|
||||||
|
guideline = axisGuidelineComponent()
|
||||||
|
)),
|
||||||
decorations = listOf(
|
decorations = listOf(
|
||||||
ThresholdLine(
|
ThresholdLine(
|
||||||
thresholdValue = 0f
|
thresholdValue = 0f
|
||||||
|
|
@ -267,6 +276,12 @@ fun Display(
|
||||||
|
|
||||||
val lastMeasure = state.loadingHistoryState.data.lastOrNull()
|
val lastMeasure = state.loadingHistoryState.data.lastOrNull()
|
||||||
|
|
||||||
|
val marker = MarkerComponent(
|
||||||
|
label = textComponent(),
|
||||||
|
indicator = null,
|
||||||
|
guideline = axisGuidelineComponent()
|
||||||
|
)
|
||||||
|
|
||||||
when(lastMeasure){
|
when(lastMeasure){
|
||||||
is Ble.Accelerometer.HistoryPoint.Acceleration,
|
is Ble.Accelerometer.HistoryPoint.Acceleration,
|
||||||
is Ble.Accelerometer.HistoryPoint.Angle -> {
|
is Ble.Accelerometer.HistoryPoint.Angle -> {
|
||||||
|
|
@ -275,6 +290,7 @@ fun Display(
|
||||||
Text(text = "Ось X:")
|
Text(text = "Ось X:")
|
||||||
|
|
||||||
Chart(
|
Chart(
|
||||||
|
marker = marker,
|
||||||
chart = lineChart,
|
chart = lineChart,
|
||||||
chartModelProducer = xProducer,
|
chartModelProducer = xProducer,
|
||||||
startAxis = startAxis(),
|
startAxis = startAxis(),
|
||||||
|
|
@ -297,6 +313,7 @@ fun Display(
|
||||||
|
|
||||||
Text(text = "Ось Y:")
|
Text(text = "Ось Y:")
|
||||||
Chart(
|
Chart(
|
||||||
|
marker = marker,
|
||||||
chart = lineChart,
|
chart = lineChart,
|
||||||
chartModelProducer = yProducer,
|
chartModelProducer = yProducer,
|
||||||
startAxis = startAxis(),
|
startAxis = startAxis(),
|
||||||
|
|
@ -319,6 +336,7 @@ fun Display(
|
||||||
|
|
||||||
Text(text = "Ось Z:")
|
Text(text = "Ось Z:")
|
||||||
Chart(
|
Chart(
|
||||||
|
marker = marker,
|
||||||
chart = lineChart,
|
chart = lineChart,
|
||||||
chartModelProducer = zProducer,
|
chartModelProducer = zProducer,
|
||||||
startAxis = startAxis(),
|
startAxis = startAxis(),
|
||||||
|
|
@ -347,6 +365,7 @@ fun Display(
|
||||||
Text(text = "Обороты:")
|
Text(text = "Обороты:")
|
||||||
|
|
||||||
Chart(
|
Chart(
|
||||||
|
marker = marker,
|
||||||
chart = lineChart,
|
chart = lineChart,
|
||||||
chartModelProducer = xProducer,
|
chartModelProducer = xProducer,
|
||||||
startAxis = startAxis(),
|
startAxis = startAxis(),
|
||||||
|
|
@ -375,6 +394,7 @@ fun Display(
|
||||||
Text(text = "Вибрация:")
|
Text(text = "Вибрация:")
|
||||||
|
|
||||||
Chart(
|
Chart(
|
||||||
|
marker = marker,
|
||||||
chart = lineChart,
|
chart = lineChart,
|
||||||
chartModelProducer = xProducer,
|
chartModelProducer = xProducer,
|
||||||
startAxis = startAxis(),
|
startAxis = startAxis(),
|
||||||
|
|
|
||||||
|
|
@ -142,48 +142,55 @@ fun DisplayState(
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
Box(
|
if(ble.accelerometerState.saveHistory is Ble.Accelerometer.HistorySettings.Enabled) {
|
||||||
modifier = Modifier.padding(
|
|
||||||
vertical = 8.dp,
|
|
||||||
horizontal = 8.dp
|
|
||||||
)
|
|
||||||
) {
|
|
||||||
|
|
||||||
Row(
|
Box(
|
||||||
verticalAlignment = Alignment.CenterVertically,
|
modifier = Modifier.padding(
|
||||||
modifier = Modifier
|
vertical = 8.dp,
|
||||||
.clip(RoundedCornerShape(16.dp))
|
horizontal = 8.dp
|
||||||
.clickable {
|
)
|
||||||
onEvent(AccelerometerContract.Event.OnSaveIntervalEdit)
|
|
||||||
}
|
|
||||||
.padding(8.dp)
|
|
||||||
) {
|
) {
|
||||||
|
|
||||||
Column(
|
Row(
|
||||||
modifier = Modifier.weight(1f)
|
verticalAlignment = Alignment.CenterVertically,
|
||||||
|
modifier = Modifier
|
||||||
|
.clip(RoundedCornerShape(16.dp))
|
||||||
|
.clickable {
|
||||||
|
onEvent(AccelerometerContract.Event.OnSaveIntervalEdit)
|
||||||
|
}
|
||||||
|
.padding(8.dp)
|
||||||
) {
|
) {
|
||||||
|
|
||||||
Text(
|
Column(
|
||||||
text = "Интервал измерений"
|
modifier = Modifier.weight(1f)
|
||||||
)
|
) {
|
||||||
|
|
||||||
val hours = ble.accelerometerState.historyInterval / millisInHour
|
Text(
|
||||||
val minutes = (ble.accelerometerState.historyInterval - (hours * millisInHour)) / millisInMinute
|
text = "Интервал измерений"
|
||||||
val seconds = (ble.accelerometerState.historyInterval - (hours * millisInHour) - (minutes * millisInMinute)) / millisInSecond
|
)
|
||||||
|
|
||||||
Text(
|
val hours =
|
||||||
color = MaterialTheme.colorScheme.secondary,
|
ble.accelerometerState.historyInterval / millisInHour
|
||||||
style = MaterialTheme.typography.bodyMedium,
|
val minutes =
|
||||||
text = "$hours ч. $minutes мин. $seconds сек."
|
(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
|
modifier = Modifier
|
||||||
.clip(RoundedCornerShape(16.dp))
|
.clip(RoundedCornerShape(16.dp))
|
||||||
.clickable {
|
.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)
|
.padding(8.dp)
|
||||||
) {
|
) {
|
||||||
|
|
@ -213,75 +226,14 @@ fun DisplayState(
|
||||||
text = "График измерений"
|
text = "График измерений"
|
||||||
)
|
)
|
||||||
|
|
||||||
}
|
/*Text(
|
||||||
|
color = MaterialTheme.colorScheme.secondary,
|
||||||
Icon(
|
style = MaterialTheme.typography.bodyMedium,
|
||||||
imageVector = Icons.Rounded.KeyboardArrowRight,
|
text = when(origin.accelerometerState.saveHistorySettings){
|
||||||
contentDescription = null
|
Ble.Accelerometer.HistorySettings.Disabled -> "Текущие измерения"
|
||||||
)
|
is Ble.Accelerometer.HistorySettings.Enabled -> ""
|
||||||
|
}
|
||||||
}
|
)*/
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
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 = "Спектр"
|
|
||||||
)
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -2,6 +2,7 @@ package llc.arma.ble.data
|
||||||
|
|
||||||
import android.app.Application
|
import android.app.Application
|
||||||
import android.os.SystemClock
|
import android.os.SystemClock
|
||||||
|
import android.util.Log
|
||||||
import kotlinx.coroutines.CoroutineScope
|
import kotlinx.coroutines.CoroutineScope
|
||||||
import kotlinx.coroutines.Dispatchers
|
import kotlinx.coroutines.Dispatchers
|
||||||
import kotlinx.coroutines.channels.awaitClose
|
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.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
|
||||||
|
import no.nordicsemi.android.common.core.DataByteArray
|
||||||
import no.nordicsemi.android.kotlin.ble.client.main.callback.ClientBleGatt
|
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.BleNumOfMatches
|
||||||
import no.nordicsemi.android.kotlin.ble.core.scanner.BleScanMode
|
import no.nordicsemi.android.kotlin.ble.core.scanner.BleScanMode
|
||||||
import no.nordicsemi.android.kotlin.ble.core.scanner.BleScannerCallbackType
|
import no.nordicsemi.android.kotlin.ble.core.scanner.BleScannerCallbackType
|
||||||
|
|
@ -154,7 +155,7 @@ class BleRepositoryImpl @Inject constructor(
|
||||||
|
|
||||||
Ble.Accelerometer(
|
Ble.Accelerometer(
|
||||||
info = newResult.copy(
|
info = newResult.copy(
|
||||||
rssi = if((SystemClock.elapsedRealtimeNanos() - newResult.scanTime) > 15_000_000_000) {
|
rssi = if((SystemClock.elapsedRealtime() - newResult.scanTime) > 15_000) {
|
||||||
null
|
null
|
||||||
} else {
|
} else {
|
||||||
newResult.rssi
|
newResult.rssi
|
||||||
|
|
@ -195,7 +196,7 @@ class BleRepositoryImpl @Inject constructor(
|
||||||
|
|
||||||
Ble.Beacon(
|
Ble.Beacon(
|
||||||
info = newResult.copy(
|
info = newResult.copy(
|
||||||
rssi = if((SystemClock.elapsedRealtimeNanos() - newResult.scanTime) > 15_000_000_000) {
|
rssi = if((SystemClock.elapsedRealtime() - newResult.scanTime) > 15_000) {
|
||||||
null
|
null
|
||||||
} else {
|
} else {
|
||||||
newResult.rssi
|
newResult.rssi
|
||||||
|
|
@ -243,7 +244,7 @@ class BleRepositoryImpl @Inject constructor(
|
||||||
|
|
||||||
Ble.Thermometer(
|
Ble.Thermometer(
|
||||||
info = newResult.copy(
|
info = newResult.copy(
|
||||||
rssi = if((SystemClock.elapsedRealtimeNanos() - newResult.scanTime) > 15_000_000_000) {
|
rssi = if((SystemClock.elapsedRealtime() - newResult.scanTime) > 15_000) {
|
||||||
null
|
null
|
||||||
} else {
|
} else {
|
||||||
newResult.rssi
|
newResult.rssi
|
||||||
|
|
@ -495,6 +496,10 @@ class BleRepositoryImpl @Inject constructor(
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
service.findCharacteristic(flashWriteUUID)!!.write(
|
||||||
|
DataByteArray.from(9)
|
||||||
|
)
|
||||||
|
|
||||||
connection.close()
|
connection.close()
|
||||||
|
|
||||||
Result.success(Unit)
|
Result.success(Unit)
|
||||||
|
|
@ -537,6 +542,10 @@ class BleRepositoryImpl @Inject constructor(
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
connection.discoverServices().findService(serviceUUID)?.findCharacteristic(flashWriteUUID)!!.write(
|
||||||
|
DataByteArray.from(9)
|
||||||
|
)
|
||||||
|
|
||||||
connection.close()
|
connection.close()
|
||||||
|
|
||||||
Result.success(Unit)
|
Result.success(Unit)
|
||||||
|
|
@ -582,6 +591,8 @@ class BleRepositoryImpl @Inject constructor(
|
||||||
BleException.UnexpectedResponse
|
BleException.UnexpectedResponse
|
||||||
)
|
)
|
||||||
|
|
||||||
|
Log.d("write", request.toString())
|
||||||
|
|
||||||
request.tx?.let {
|
request.tx?.let {
|
||||||
service.findCharacteristic(txWriteUUID)!!.write(
|
service.findCharacteristic(txWriteUUID)!!.write(
|
||||||
DataByteArray.from(it.sendData)
|
DataByteArray.from(it.sendData)
|
||||||
|
|
@ -618,7 +629,9 @@ class BleRepositoryImpl @Inject constructor(
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
connection.close()
|
service.findCharacteristic(flashWriteUUID)!!.write(
|
||||||
|
DataByteArray.from(9)
|
||||||
|
)
|
||||||
|
|
||||||
Result.success(Unit)
|
Result.success(Unit)
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -17,8 +17,8 @@ import llc.arma.ble.domain.common.ProgressState
|
||||||
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
|
||||||
import llc.arma.ble.domain.usecase.AccelViewMode
|
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.client.main.callback.ClientBleGatt
|
||||||
import no.nordicsemi.android.kotlin.ble.core.data.util.DataByteArray
|
|
||||||
|
|
||||||
|
|
||||||
@OptIn(ExperimentalUnsignedTypes::class)
|
@OptIn(ExperimentalUnsignedTypes::class)
|
||||||
|
|
|
||||||
|
|
@ -18,8 +18,8 @@ import llc.arma.ble.domain.usecase.AccelViewMode.*
|
||||||
import llc.arma.ble.domain.usecase.FftAxis
|
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
|
||||||
|
import no.nordicsemi.android.common.core.DataByteArray
|
||||||
import no.nordicsemi.android.kotlin.ble.client.main.callback.ClientBleGatt
|
import no.nordicsemi.android.kotlin.ble.client.main.callback.ClientBleGatt
|
||||||
import no.nordicsemi.android.kotlin.ble.core.data.util.DataByteArray
|
|
||||||
|
|
||||||
fun getAccelerometerRealtimeData(
|
fun getAccelerometerRealtimeData(
|
||||||
app: Application,
|
app: Application,
|
||||||
|
|
|
||||||
|
|
@ -25,8 +25,8 @@ import llc.arma.ble.domain.usecase.AccelViewMode
|
||||||
import llc.arma.ble.domain.usecase.FftAxis
|
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
|
||||||
|
import no.nordicsemi.android.common.core.DataByteArray
|
||||||
import no.nordicsemi.android.kotlin.ble.client.main.callback.ClientBleGatt
|
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.ByteBuffer
|
||||||
import java.nio.ByteOrder.LITTLE_ENDIAN
|
import java.nio.ByteOrder.LITTLE_ENDIAN
|
||||||
import java.util.UUID
|
import java.util.UUID
|
||||||
|
|
@ -78,9 +78,7 @@ fun readAccelerometerSpectre(
|
||||||
))
|
))
|
||||||
)
|
)
|
||||||
|
|
||||||
val notifications = characteristic.getNotifications()
|
characteristic.getNotifications().collect {
|
||||||
|
|
||||||
notifications.collect {
|
|
||||||
|
|
||||||
var initialValue: Long? = null
|
var initialValue: Long? = null
|
||||||
var frequencyInterval: Long? = null
|
var frequencyInterval: Long? = null
|
||||||
|
|
|
||||||
|
|
@ -18,8 +18,8 @@ import llc.arma.ble.domain.Result
|
||||||
import llc.arma.ble.domain.common.BleException
|
import llc.arma.ble.domain.common.BleException
|
||||||
import llc.arma.ble.domain.common.ProgressState
|
import llc.arma.ble.domain.common.ProgressState
|
||||||
import llc.arma.ble.domain.model.Ble
|
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.client.main.callback.ClientBleGatt
|
||||||
import no.nordicsemi.android.kotlin.ble.core.data.util.DataByteArray
|
|
||||||
|
|
||||||
@OptIn(ExperimentalUnsignedTypes::class)
|
@OptIn(ExperimentalUnsignedTypes::class)
|
||||||
fun readThermometerHistory(
|
fun readThermometerHistory(
|
||||||
|
|
|
||||||
|
|
@ -18,7 +18,7 @@ val BleScanResult.info: BleInfo
|
||||||
rssi = data?.rssi,
|
rssi = data?.rssi,
|
||||||
type = type,
|
type = type,
|
||||||
scanTime = (data?.timestampNanos ?: 0) / 1_000_000,
|
scanTime = (data?.timestampNanos ?: 0) / 1_000_000,
|
||||||
tx = data?.txPower ?: 0,
|
tx = data?.scanRecord?.txPowerLevel ?: 0,
|
||||||
recordEnabled = timerEnabled
|
recordEnabled = timerEnabled
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue