kotlin ble migration

This commit is contained in:
Vineyro 2024-06-18 13:16:49 +07:00
parent c0e0aadc28
commit e19338397d
19 changed files with 517 additions and 150 deletions

View File

@ -13,8 +13,8 @@ android {
applicationId "llc.arma.ble"
minSdk 26
targetSdk 34
versionCode 23
versionName "1.3.3"
versionCode 25
versionName "1.3.5"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
vectorDrawables {
@ -86,8 +86,8 @@ dependencies {
kapt('com.google.dagger:hilt-android-compiler:2.45')
kapt("androidx.hilt:hilt-compiler:1.0.0")
implementation 'no.nordicsemi.android.kotlin.ble:scanner:1.0.19'
implementation 'no.nordicsemi.android.kotlin.ble:client:1.0.19'
implementation 'no.nordicsemi.android.kotlin.ble:scanner:1.0.14'
implementation 'no.nordicsemi.android.kotlin.ble:client:1.0.14'
implementation "com.google.accompanist:accompanist-permissions:0.26.3-beta"

View File

@ -4,6 +4,7 @@ import llc.arma.ble.app.ui.common.ViewEvent
import llc.arma.ble.app.ui.common.ViewSideEffect
import llc.arma.ble.app.ui.common.ViewState
import llc.arma.ble.app.ui.model.BleView
import llc.arma.ble.app.ui.screen.inspection.accelerometer.view.RealtimeViewMode
import llc.arma.ble.domain.model.Ble
import llc.arma.ble.domain.usecase.AccelScale
import llc.arma.ble.domain.usecase.AccelViewMode
@ -24,6 +25,8 @@ class AccelerometerContract {
object OnShowAccelerometerHistory : Event()
object OnHideAccelerometerHistory : Event()
object OnRealtimeViewModeEdit : Event()
data class OnAccelViewModeEdit(
val next: Next
) : Event()
@ -56,6 +59,10 @@ class AccelerometerContract {
object OnSaveIntervalEdit : Event()
object OnHideHistoryEdit : Event()
data class OnRealtimeViewModeChanged(
val mode: RealtimeViewMode
) : Event()
data class OnBleChanged(
val ble: Ble.Accelerometer,
): Event()
@ -111,6 +118,7 @@ class AccelerometerContract {
val accelerometer: BleView.Accelerometer,
val writeState: WriteState?,
val accelViewMode: AccelViewMode,
val accelRealtimeViewMode: RealtimeViewMode,
val accelScale: AccelScale,
val fftViewMode: FftViewMode,
val fftAxis: FftAxis,
@ -139,6 +147,8 @@ class AccelerometerContract {
sealed class Effect : ViewSideEffect {
object ShowRealtimeViewModeEdit : Effect()
object ShowAccelerometerAccel : Effect()
object ShowAccelerometerSpectre : Effect()
object ShowAccelerometerHistory : Effect()

View File

@ -21,6 +21,7 @@ import llc.arma.ble.app.ui.screen.inspection.accelerometer.view.AccelEdit
import llc.arma.ble.app.ui.screen.inspection.accelerometer.view.AccelFftAxisEdit
import llc.arma.ble.app.ui.screen.inspection.accelerometer.view.AccelFftModeEdit
import llc.arma.ble.app.ui.screen.inspection.accelerometer.view.AccelFrequencyEdit
import llc.arma.ble.app.ui.screen.inspection.accelerometer.view.AccelRealtimeViewEdit
import llc.arma.ble.app.ui.screen.inspection.accelerometer.view.AccelScaleEdit
import llc.arma.ble.app.ui.screen.inspection.accelerometer.view.AccelSpectreEdit
import llc.arma.ble.app.ui.screen.inspection.accelerometer.view.AccelViewEdit
@ -32,11 +33,12 @@ import llc.arma.ble.app.ui.screen.inspection.accelerometer.view.HistoryEdit
import llc.arma.ble.app.ui.screen.inspection.accelerometer.view.IntervalEdit
import llc.arma.ble.app.ui.screen.inspection.accelerometer.view.LoadingState
import llc.arma.ble.app.ui.screen.inspection.accelerometer.view.PowerEdit
import llc.arma.ble.app.ui.screen.inspection.accelerometer.view.RealtimeViewMode
import llc.arma.ble.app.ui.screen.inspection.accelerometer.view.Write
import llc.arma.ble.domain.model.Ble
enum class SheetPage {
HISTORY, ACCEL_SCALE, SPECTRE_SCALE, HISTORY_MODE_EDIT, HISTORY_SCALE, HISTORY_EDIT, ACCEL_EDIT, ACCEL, POWER, WRITE, SPECTRE, ACCEL_MODE_EDIT, SPECTRE_MODE_EDIT, SPECTRE_EDIT, FREQUENCY_EDIT, AXIS_EDIT, FFT_MODE_EDIT, INTERVAL_EDIT
HISTORY, ACCEL_SCALE, SPECTRE_SCALE, HISTORY_MODE_EDIT, HISTORY_SCALE, HISTORY_EDIT, ACCEL_EDIT, ACCEL_REALTIME_EDIT, ACCEL, POWER, WRITE, SPECTRE, ACCEL_MODE_EDIT, SPECTRE_MODE_EDIT, SPECTRE_EDIT, FREQUENCY_EDIT, AXIS_EDIT, FFT_MODE_EDIT, INTERVAL_EDIT
}
@OptIn(ExperimentalMaterialApi::class)
@ -93,8 +95,25 @@ fun AccelerometerScreen(
val currentState = viewModel.viewState.value
if (currentState is AccelerometerContract.State.Display) {
bottomDialog.show {
when(currentState.accelRealtimeViewMode){
is RealtimeViewMode.Accel -> {
AccelerometerRealtime(
ble = currentState.accelerometer.info,
accelMode = currentState.accelRealtimeViewMode.accelViewMode,
fftAxis = currentState.fftAxis,
fftMode = currentState.fftViewMode,
frequency = currentState.fftFrequency,
accelScale = currentState.accelScale
)
}
RealtimeViewMode.Spectre -> {
AccelerometerSpectre(
ble = currentState.accelerometer.info,
accelMode = currentState.accelViewMode,
fftAxis = currentState.fftAxis,
@ -102,6 +121,10 @@ fun AccelerometerScreen(
frequency = currentState.fftFrequency,
accelScale = currentState.accelScale
)
}
}
}
}
}
@ -345,6 +368,21 @@ fun AccelerometerScreen(
null -> {
bottomDialog.hide()
}
SheetPage.ACCEL_REALTIME_EDIT -> bottomDialog.show {
val currentState = viewModel.viewState.value
if(currentState is AccelerometerContract.State.Display) {
AccelRealtimeViewEdit(
state = currentState,
onEvent = {
viewModel.setEvent(it)
}
)
}
}
}
}
@ -456,6 +494,12 @@ fun AccelerometerScreen(
sheetPage = null
delay(100)
}
AccelerometerContract.Effect.ShowRealtimeViewModeEdit -> {
sheetPage = null
delay(100)
sheetPage = SheetPage.ACCEL_REALTIME_EDIT
}
}
}.launchIn(this)
}

View File

@ -7,6 +7,7 @@ import llc.arma.ble.app.ui.common.BaseViewModel
import llc.arma.ble.app.ui.mapper.BleMapper
import llc.arma.ble.app.ui.mapper.BleViewMapper
import llc.arma.ble.app.ui.model.BleView
import llc.arma.ble.app.ui.screen.inspection.accelerometer.view.RealtimeViewMode
import llc.arma.ble.domain.model.Ble
import llc.arma.ble.domain.usecase.AccelScale
import llc.arma.ble.domain.usecase.AccelViewMode
@ -55,6 +56,8 @@ class AccelerometerViewModel @Inject constructor(
is AccelerometerContract.Event.OnAccelScaleChanged -> reduce(viewState.value, event)
is AccelerometerContract.Event.OnAccelScaleEdit -> reduce(viewState.value, event)
is AccelerometerContract.Event.OnAccelEdit -> reduce(viewState.value, event)
is AccelerometerContract.Event.OnRealtimeViewModeEdit -> reduce(viewState.value, event)
is AccelerometerContract.Event.OnRealtimeViewModeChanged -> reduce(viewState.value, event)
is AccelerometerContract.Event.OnHistoryEdit -> reduce(viewState.value, event)
is AccelerometerContract.Event.OnHistoryScaleChanged -> reduce(viewState.value, event)
is AccelerometerContract.Event.OnHistoryViewModeChanged -> reduce(viewState.value, event)
@ -314,6 +317,36 @@ class AccelerometerViewModel @Inject constructor(
}
private fun reduce(
state: AccelerometerContract.State,
event: AccelerometerContract.Event.OnRealtimeViewModeEdit
) {
setEffect {
AccelerometerContract.Effect.ShowRealtimeViewModeEdit
}
}
private fun reduce(
state: AccelerometerContract.State,
event: AccelerometerContract.Event.OnRealtimeViewModeChanged
) {
if(state is AccelerometerContract.State.Display){
setState {
state.copy(
accelRealtimeViewMode = event.mode
)
}
}
}
private fun reduce(
state: AccelerometerContract.State,
event: AccelerometerContract.Event.OnSpectreEdit
@ -489,13 +522,17 @@ class AccelerometerViewModel @Inject constructor(
viewModelScope.launch {
if(state is AccelerometerContract.State.Display){
setEffect {
AccelerometerContract.Effect.ShowAccelerometerAccel
}
}
}
}
}
@ -521,6 +558,7 @@ class AccelerometerViewModel @Inject constructor(
accelerometer = bleMapper.map(event.ble) as BleView.Accelerometer,
writeState = null,
accelViewMode = AccelViewMode.ACCELERATION,
accelRealtimeViewMode = RealtimeViewMode.Accel(AccelViewMode.ACCELERATION),
fftAxis = FftAxis.AUTO,
fftFrequency = FftFrequency.F_400,
fftViewMode = FftViewMode.SPECTRE,

View File

@ -24,13 +24,15 @@ import llc.arma.ble.domain.usecase.FftAxis
import llc.arma.ble.domain.usecase.FftFrequency
import llc.arma.ble.domain.usecase.FftViewMode
@Composable
fun AccelEdit(
state: AccelerometerContract.State.Display,
onEvent: (AccelerometerContract.Event) -> Unit,
){
val accelMode = state.accelViewMode
val accelMode = state.accelRealtimeViewMode
val fftMode = state.fftViewMode
val fftAxis = state.fftAxis
val fftFrequency = state.fftFrequency
@ -42,7 +44,7 @@ fun AccelEdit(
Text(
modifier = Modifier.padding(horizontal = 12.dp),
text = "Ускорение",
text = "Параметры",
style = MaterialTheme.typography.titleLarge
)
@ -64,11 +66,7 @@ fun AccelEdit(
modifier = Modifier
.clip(RoundedCornerShape(16.dp))
.clickable {
onEvent(
AccelerometerContract.Event.OnAccelViewModeEdit(
next = AccelerometerContract.Event.Next.ACCEL
)
)
onEvent(AccelerometerContract.Event.OnRealtimeViewModeEdit)
}
.padding(8.dp)
) {
@ -78,7 +76,7 @@ fun AccelEdit(
) {
Text(
text = "Accel view mode"
text = "Измеряемый параметр"
)
Text(
color = MaterialTheme.colorScheme.secondary,
@ -97,6 +95,131 @@ fun AccelEdit(
}
if(accelMode is RealtimeViewMode.Spectre){
Box(
modifier = Modifier.padding(
vertical = 8.dp,
horizontal = 8.dp
)
) {
Row(
verticalAlignment = Alignment.CenterVertically,
modifier = Modifier
.clip(RoundedCornerShape(16.dp))
.clickable {
onEvent(AccelerometerContract.Event.OnFftModeEdit)
}
.padding(8.dp)
) {
Column(
modifier = Modifier.weight(1f)
) {
Text(
text = "Режим просмотра"
)
Text(
color = MaterialTheme.colorScheme.secondary,
style = MaterialTheme.typography.bodyMedium,
text = fftMode.localized
)
}
Icon(
imageVector = Icons.Rounded.KeyboardArrowDown,
contentDescription = null
)
}
}
Box(
modifier = Modifier.padding(
vertical = 8.dp,
horizontal = 8.dp
)
) {
Row(
verticalAlignment = Alignment.CenterVertically,
modifier = Modifier
.clip(RoundedCornerShape(16.dp))
.clickable { onEvent(AccelerometerContract.Event.OnFftAxisEdit) }
.padding(8.dp)
) {
Column(
modifier = Modifier.weight(1f)
) {
Text(
text = "Ось"
)
Text(
color = MaterialTheme.colorScheme.secondary,
style = MaterialTheme.typography.bodyMedium,
text = fftAxis.localized
)
}
Icon(
imageVector = Icons.Rounded.KeyboardArrowDown,
contentDescription = null
)
}
}
Box(
modifier = Modifier.padding(
vertical = 8.dp,
horizontal = 8.dp
)
) {
Row(
verticalAlignment = Alignment.CenterVertically,
modifier = Modifier
.clip(RoundedCornerShape(16.dp))
.clickable {
onEvent(AccelerometerContract.Event.OnFftFrequencyEdit)
}
.padding(8.dp)
) {
Column(
modifier = Modifier.weight(1f)
) {
Text(
text = "Частота дистретизации"
)
Text(
color = MaterialTheme.colorScheme.secondary,
style = MaterialTheme.typography.bodyMedium,
text = fftFrequency.localized
)
}
Icon(
imageVector = Icons.Rounded.KeyboardArrowDown,
contentDescription = null
)
}
}
}
Box(
modifier = Modifier.padding(
vertical = 8.dp,
@ -119,7 +242,7 @@ fun AccelEdit(
) {
Text(
text = "Accel scale"
text = "Масштаб"
)
Text(
color = MaterialTheme.colorScheme.secondary,

View File

@ -78,7 +78,7 @@ fun AccelFftAxisEdit(
shape = CircleShape,
color = MaterialTheme.colorScheme.primaryContainer,
onClick = {
onEvent(AccelerometerContract.Event.OnSpectreEdit)
onEvent(AccelerometerContract.Event.OnAccelEdit)
}
) {

View File

@ -78,7 +78,7 @@ fun AccelFftModeEdit(
shape = CircleShape,
color = MaterialTheme.colorScheme.primaryContainer,
onClick = {
onEvent(AccelerometerContract.Event.OnSpectreEdit)
onEvent(AccelerometerContract.Event.OnAccelEdit)
}
) {

View File

@ -78,7 +78,7 @@ fun AccelFrequencyEdit(
shape = CircleShape,
color = MaterialTheme.colorScheme.primaryContainer,
onClick = {
onEvent(AccelerometerContract.Event.OnSpectreEdit)
onEvent(AccelerometerContract.Event.OnAccelEdit)
}
) {

View File

@ -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 = "Ок"
)
}
}
}
}

View File

@ -28,10 +28,13 @@ import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.rounded.Refresh
import androidx.compose.ui.graphics.StrokeCap
import androidx.compose.ui.text.style.TextAlign
import com.patrykandpatrick.vico.compose.axis.axisGuidelineComponent
import com.patrykandpatrick.vico.compose.chart.column.columnChart
import com.patrykandpatrick.vico.compose.chart.scroll.rememberChartScrollState
import com.patrykandpatrick.vico.compose.component.textComponent
import com.patrykandpatrick.vico.core.axis.AxisPosition
import com.patrykandpatrick.vico.core.axis.formatter.AxisValueFormatter
import com.patrykandpatrick.vico.core.component.marker.MarkerComponent
import com.patrykandpatrick.vico.core.entry.ChartEntry
import com.patrykandpatrick.vico.core.entry.FloatEntry
import kotlinx.coroutines.Job
@ -231,12 +234,24 @@ fun Display(
}
val lineChart = columnChart(
spacing = 1.5.dp
spacing = 1.5.dp,
persistentMarkers = mapOf(producer.getModel().maxX to MarkerComponent(
label = textComponent(),
indicator = null,
guideline = axisGuidelineComponent()
)),
)
val scrollState = rememberChartScrollState()
val marker = MarkerComponent(
label = textComponent(),
indicator = null,
guideline = axisGuidelineComponent()
)
Chart(
marker = marker,
diffAnimationSpec = tween(0),
isZoomEnabled = true,
chartScrollState = scrollState,

View File

@ -27,11 +27,14 @@ import androidx.compose.material.icons.rounded.Refresh
import androidx.compose.ui.draw.rotate
import androidx.compose.ui.graphics.StrokeCap
import androidx.compose.ui.text.style.TextAlign
import com.patrykandpatrick.vico.compose.axis.axisGuidelineComponent
import com.patrykandpatrick.vico.compose.axis.horizontal.bottomAxis
import com.patrykandpatrick.vico.compose.chart.line.lineChart
import com.patrykandpatrick.vico.compose.chart.scroll.rememberChartScrollSpec
import com.patrykandpatrick.vico.compose.component.textComponent
import com.patrykandpatrick.vico.core.chart.decoration.ThresholdLine
import com.patrykandpatrick.vico.core.chart.scale.AutoScaleUp
import com.patrykandpatrick.vico.core.component.marker.MarkerComponent
import com.patrykandpatrick.vico.core.entry.FloatEntry
import com.patrykandpatrick.vico.core.scroll.AutoScrollCondition
import com.patrykandpatrick.vico.core.scroll.InitialScroll
@ -192,12 +195,22 @@ fun Display(
ThresholdLine(
thresholdValue = 0f
)
),
persistentMarkers = mapOf(xProducer.getModel().maxX to MarkerComponent(
label = textComponent(),
indicator = null,
guideline = axisGuidelineComponent()
)),
)
val marker = MarkerComponent(
label = textComponent(),
indicator = null,
guideline = axisGuidelineComponent()
)
val lastMeasure = state.measureHistory.lastOrNull()
Log.d("mode", lastMeasure.toString())
when(lastMeasure){
is Ble.Accelerometer.RealtimePoint.Angle -> {
@ -283,6 +296,7 @@ fun Display(
Text(text = "Ось Z:")
Chart(
marker = marker,
chart = lineChart,
chartModelProducer = zProducer,
startAxis = startAxis(),
@ -307,6 +321,7 @@ fun Display(
Text(text = "Вибрация:")
Chart(
marker = marker,
chart = lineChart,
chartModelProducer = xProducer,
startAxis = startAxis(),
@ -331,6 +346,7 @@ fun Display(
Text(text = "Ось X:")
Chart(
marker = marker,
chart = lineChart,
chartModelProducer = xProducer,
startAxis = startAxis(),
@ -349,6 +365,7 @@ fun Display(
Text(text = "Ось Y:")
Chart(
marker = marker,
chart = lineChart,
chartModelProducer = yProducer,
startAxis = startAxis(),
@ -367,6 +384,7 @@ fun Display(
Text(text = "Ось Z:")
Chart(
marker = marker,
chart = lineChart,
chartModelProducer = zProducer,
startAxis = startAxis(),

View File

@ -27,13 +27,17 @@ import androidx.compose.material.icons.rounded.CloudUpload
import androidx.compose.material.icons.rounded.Refresh
import androidx.compose.ui.graphics.StrokeCap
import androidx.compose.ui.text.style.TextAlign
import com.patrykandpatrick.vico.compose.axis.axisGuidelineComponent
import com.patrykandpatrick.vico.compose.axis.horizontal.bottomAxis
import com.patrykandpatrick.vico.compose.chart.line.lineChart
import com.patrykandpatrick.vico.compose.chart.scroll.rememberChartScrollSpec
import com.patrykandpatrick.vico.compose.component.textComponent
import com.patrykandpatrick.vico.core.axis.AxisPosition
import com.patrykandpatrick.vico.core.axis.formatter.AxisValueFormatter
import com.patrykandpatrick.vico.core.chart.decoration.ThresholdLine
import com.patrykandpatrick.vico.core.chart.scale.AutoScaleUp
import com.patrykandpatrick.vico.core.component.marker.MarkerComponent
import com.patrykandpatrick.vico.core.component.text.TextComponent
import com.patrykandpatrick.vico.core.entry.ChartEntry
import com.patrykandpatrick.vico.core.entry.FloatEntry
import com.patrykandpatrick.vico.core.scroll.AutoScrollCondition
@ -99,12 +103,12 @@ fun AccelerometerHistory(
val title = when(state){
is AccelerometerHistoryContract.State.Display -> {
when (state.loadingHistoryState) {
is ProgressState.Finished -> "График измерений (${state.loadingHistoryState.data.size})"
is ProgressState.Indeterminate -> "График измерений"
is ProgressState.Progress -> "График измерений"
is ProgressState.Finished -> "${accelMode.localized} (${state.loadingHistoryState.data.size})"
is ProgressState.Indeterminate -> accelMode.localized
is ProgressState.Progress -> accelMode.localized
}
}
AccelerometerHistoryContract.State.Exception -> "График измерений"
AccelerometerHistoryContract.State.Exception -> accelMode.localized
}
Text(
@ -258,6 +262,11 @@ fun Display(
})
val lineChart = lineChart(
persistentMarkers = mapOf(xProducer.getModel().maxX to MarkerComponent(
label = textComponent(),
indicator = null,
guideline = axisGuidelineComponent()
)),
decorations = listOf(
ThresholdLine(
thresholdValue = 0f
@ -267,6 +276,12 @@ fun Display(
val lastMeasure = state.loadingHistoryState.data.lastOrNull()
val marker = MarkerComponent(
label = textComponent(),
indicator = null,
guideline = axisGuidelineComponent()
)
when(lastMeasure){
is Ble.Accelerometer.HistoryPoint.Acceleration,
is Ble.Accelerometer.HistoryPoint.Angle -> {
@ -275,6 +290,7 @@ fun Display(
Text(text = "Ось X:")
Chart(
marker = marker,
chart = lineChart,
chartModelProducer = xProducer,
startAxis = startAxis(),
@ -297,6 +313,7 @@ fun Display(
Text(text = "Ось Y:")
Chart(
marker = marker,
chart = lineChart,
chartModelProducer = yProducer,
startAxis = startAxis(),
@ -319,6 +336,7 @@ fun Display(
Text(text = "Ось Z:")
Chart(
marker = marker,
chart = lineChart,
chartModelProducer = zProducer,
startAxis = startAxis(),
@ -347,6 +365,7 @@ fun Display(
Text(text = "Обороты:")
Chart(
marker = marker,
chart = lineChart,
chartModelProducer = xProducer,
startAxis = startAxis(),
@ -375,6 +394,7 @@ fun Display(
Text(text = "Вибрация:")
Chart(
marker = marker,
chart = lineChart,
chartModelProducer = xProducer,
startAxis = startAxis(),

View File

@ -142,6 +142,8 @@ fun DisplayState(
}
if(ble.accelerometerState.saveHistory is Ble.Accelerometer.HistorySettings.Enabled) {
Box(
modifier = Modifier.padding(
vertical = 8.dp,
@ -167,9 +169,12 @@ fun DisplayState(
text = "Интервал измерений"
)
val hours = ble.accelerometerState.historyInterval / millisInHour
val minutes = (ble.accelerometerState.historyInterval - (hours * millisInHour)) / millisInMinute
val seconds = (ble.accelerometerState.historyInterval - (hours * millisInHour) - (minutes * millisInMinute)) / millisInSecond
val hours =
ble.accelerometerState.historyInterval / millisInHour
val minutes =
(ble.accelerometerState.historyInterval - (hours * millisInHour)) / millisInMinute
val seconds =
(ble.accelerometerState.historyInterval - (hours * millisInHour) - (minutes * millisInMinute)) / millisInSecond
Text(
color = MaterialTheme.colorScheme.secondary,
@ -188,6 +193,8 @@ fun DisplayState(
}
}
Box(
modifier = Modifier.padding(
vertical = 8.dp,
@ -200,8 +207,14 @@ fun DisplayState(
modifier = Modifier
.clip(RoundedCornerShape(16.dp))
.clickable {
when(origin.accelerometerState.saveHistorySettings){
is Ble.Accelerometer.HistorySettings.Disabled ->
onEvent(AccelerometerContract.Event.OnAccelEdit)
is Ble.Accelerometer.HistorySettings.Enabled ->
onEvent(AccelerometerContract.Event.OnShowAccelerometerHistory)
}
}
.padding(8.dp)
) {
@ -213,75 +226,14 @@ fun DisplayState(
text = "График измерений"
)
/*Text(
color = MaterialTheme.colorScheme.secondary,
style = MaterialTheme.typography.bodyMedium,
text = when(origin.accelerometerState.saveHistorySettings){
Ble.Accelerometer.HistorySettings.Disabled -> "Текущие измерения"
is Ble.Accelerometer.HistorySettings.Enabled -> ""
}
Icon(
imageVector = Icons.Rounded.KeyboardArrowRight,
contentDescription = null
)
}
}
Box(
modifier = Modifier.padding(
vertical = 8.dp,
horizontal = 8.dp
)
) {
Row(
verticalAlignment = Alignment.CenterVertically,
modifier = Modifier
.clip(RoundedCornerShape(16.dp))
.clickable { onEvent(AccelerometerContract.Event.OnAccelEdit) }
.padding(8.dp)
) {
Column(
modifier = Modifier.weight(1f)
) {
Text(
text = "Ускорение"
)
}
Icon(
imageVector = Icons.Rounded.KeyboardArrowRight,
contentDescription = null
)
}
}
Box(
modifier = Modifier.padding(
vertical = 8.dp,
horizontal = 8.dp
)
) {
Row(
verticalAlignment = Alignment.CenterVertically,
modifier = Modifier
.clip(RoundedCornerShape(16.dp))
.clickable {
onEvent(AccelerometerContract.Event.OnSpectreEdit)
}
.padding(8.dp)
) {
Column(
modifier = Modifier.weight(1f)
) {
Text(
text = "Спектр"
)
)*/
}

View File

@ -2,6 +2,7 @@ package llc.arma.ble.data
import android.app.Application
import android.os.SystemClock
import android.util.Log
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.channels.awaitClose
@ -30,8 +31,8 @@ import llc.arma.ble.domain.usecase.AccelViewMode
import llc.arma.ble.domain.usecase.FftAxis
import llc.arma.ble.domain.usecase.FftFrequency
import llc.arma.ble.domain.usecase.FftViewMode
import no.nordicsemi.android.common.core.DataByteArray
import no.nordicsemi.android.kotlin.ble.client.main.callback.ClientBleGatt
import no.nordicsemi.android.kotlin.ble.core.data.util.DataByteArray
import no.nordicsemi.android.kotlin.ble.core.scanner.BleNumOfMatches
import no.nordicsemi.android.kotlin.ble.core.scanner.BleScanMode
import no.nordicsemi.android.kotlin.ble.core.scanner.BleScannerCallbackType
@ -154,7 +155,7 @@ class BleRepositoryImpl @Inject constructor(
Ble.Accelerometer(
info = newResult.copy(
rssi = if((SystemClock.elapsedRealtimeNanos() - newResult.scanTime) > 15_000_000_000) {
rssi = if((SystemClock.elapsedRealtime() - newResult.scanTime) > 15_000) {
null
} else {
newResult.rssi
@ -195,7 +196,7 @@ class BleRepositoryImpl @Inject constructor(
Ble.Beacon(
info = newResult.copy(
rssi = if((SystemClock.elapsedRealtimeNanos() - newResult.scanTime) > 15_000_000_000) {
rssi = if((SystemClock.elapsedRealtime() - newResult.scanTime) > 15_000) {
null
} else {
newResult.rssi
@ -243,7 +244,7 @@ class BleRepositoryImpl @Inject constructor(
Ble.Thermometer(
info = newResult.copy(
rssi = if((SystemClock.elapsedRealtimeNanos() - newResult.scanTime) > 15_000_000_000) {
rssi = if((SystemClock.elapsedRealtime() - newResult.scanTime) > 15_000) {
null
} else {
newResult.rssi
@ -495,6 +496,10 @@ class BleRepositoryImpl @Inject constructor(
}
service.findCharacteristic(flashWriteUUID)!!.write(
DataByteArray.from(9)
)
connection.close()
Result.success(Unit)
@ -537,6 +542,10 @@ class BleRepositoryImpl @Inject constructor(
}
connection.discoverServices().findService(serviceUUID)?.findCharacteristic(flashWriteUUID)!!.write(
DataByteArray.from(9)
)
connection.close()
Result.success(Unit)
@ -582,6 +591,8 @@ class BleRepositoryImpl @Inject constructor(
BleException.UnexpectedResponse
)
Log.d("write", request.toString())
request.tx?.let {
service.findCharacteristic(txWriteUUID)!!.write(
DataByteArray.from(it.sendData)
@ -618,7 +629,9 @@ class BleRepositoryImpl @Inject constructor(
}
connection.close()
service.findCharacteristic(flashWriteUUID)!!.write(
DataByteArray.from(9)
)
Result.success(Unit)

View File

@ -17,8 +17,8 @@ import llc.arma.ble.domain.common.ProgressState
import llc.arma.ble.domain.model.Ble
import llc.arma.ble.domain.usecase.AccelScale
import llc.arma.ble.domain.usecase.AccelViewMode
import no.nordicsemi.android.common.core.DataByteArray
import no.nordicsemi.android.kotlin.ble.client.main.callback.ClientBleGatt
import no.nordicsemi.android.kotlin.ble.core.data.util.DataByteArray
@OptIn(ExperimentalUnsignedTypes::class)

View File

@ -18,8 +18,8 @@ import llc.arma.ble.domain.usecase.AccelViewMode.*
import llc.arma.ble.domain.usecase.FftAxis
import llc.arma.ble.domain.usecase.FftFrequency
import llc.arma.ble.domain.usecase.FftViewMode
import no.nordicsemi.android.common.core.DataByteArray
import no.nordicsemi.android.kotlin.ble.client.main.callback.ClientBleGatt
import no.nordicsemi.android.kotlin.ble.core.data.util.DataByteArray
fun getAccelerometerRealtimeData(
app: Application,

View File

@ -25,8 +25,8 @@ import llc.arma.ble.domain.usecase.AccelViewMode
import llc.arma.ble.domain.usecase.FftAxis
import llc.arma.ble.domain.usecase.FftFrequency
import llc.arma.ble.domain.usecase.FftViewMode
import no.nordicsemi.android.common.core.DataByteArray
import no.nordicsemi.android.kotlin.ble.client.main.callback.ClientBleGatt
import no.nordicsemi.android.kotlin.ble.core.data.util.DataByteArray
import java.nio.ByteBuffer
import java.nio.ByteOrder.LITTLE_ENDIAN
import java.util.UUID
@ -78,9 +78,7 @@ fun readAccelerometerSpectre(
))
)
val notifications = characteristic.getNotifications()
notifications.collect {
characteristic.getNotifications().collect {
var initialValue: Long? = null
var frequencyInterval: Long? = null

View File

@ -18,8 +18,8 @@ import llc.arma.ble.domain.Result
import llc.arma.ble.domain.common.BleException
import llc.arma.ble.domain.common.ProgressState
import llc.arma.ble.domain.model.Ble
import no.nordicsemi.android.common.core.DataByteArray
import no.nordicsemi.android.kotlin.ble.client.main.callback.ClientBleGatt
import no.nordicsemi.android.kotlin.ble.core.data.util.DataByteArray
@OptIn(ExperimentalUnsignedTypes::class)
fun readThermometerHistory(

View File

@ -18,7 +18,7 @@ val BleScanResult.info: BleInfo
rssi = data?.rssi,
type = type,
scanTime = (data?.timestampNanos ?: 0) / 1_000_000,
tx = data?.txPower ?: 0,
tx = data?.scanRecord?.txPowerLevel ?: 0,
recordEnabled = timerEnabled
)
}