Skip to content

Commit 9f0414d

Browse files
authored
Merge pull request #14 from vens8/axelero_plot
Axelero plot
2 parents 1fb0416 + 258875a commit 9f0414d

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

49 files changed

+1060
-65
lines changed

Assignment1/JourneyTrack/.idea/deploymentTargetDropDown.xml

+4-12
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Assignment2/.idea/deploymentTargetDropDown.xml

+6-6
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
Binary file not shown.

Assignment3/Axelero/app/src/main/java/com/example/axelero/HistoryActivity.kt

+18-1
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,11 @@
11
package com.example.axelero
22

3+
import android.app.Activity
34
import android.os.Bundle
45
import android.util.Log
56
import androidx.activity.ComponentActivity
67
import androidx.activity.compose.setContent
8+
import androidx.activity.result.contract.ActivityResultContracts
79
import androidx.compose.foundation.layout.fillMaxSize
810
import androidx.compose.material3.MaterialTheme
911
import androidx.compose.material3.Surface
@@ -12,21 +14,36 @@ import androidx.compose.runtime.Composable
1214
import androidx.compose.ui.Modifier
1315
import androidx.compose.ui.tooling.preview.Preview
1416
import androidx.lifecycle.ViewModelProvider
17+
import androidx.lifecycle.lifecycleScope
1518
import androidx.lifecycle.viewmodel.compose.viewModel
1619
import com.example.axelero.db.AppDatabase
1720
import com.example.axelero.repository.OrientationDataRepository
1821
import com.example.axelero.ui.HistoryContent
1922
import com.example.axelero.ui.theme.AxeleroTheme
23+
import kotlinx.coroutines.launch
2024

2125
class HistoryActivity : ComponentActivity() {
2226
private val orientationDataRepository by lazy {
2327
OrientationDataRepository.getInstance(this)
2428
}
29+
30+
private val createDocumentResult = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result ->
31+
if (result.resultCode == Activity.RESULT_OK) {
32+
result.data?.data?.also { uri ->
33+
lifecycleScope.launch {
34+
val orientationDataString = orientationDataRepository.getOrientationData().joinToString("\n") { "${it.xAngle}, ${it.yAngle}, ${it.zAngle}, ${it.timestamp}" }
35+
contentResolver.openOutputStream(uri)?.writer()?.use {
36+
it.write(orientationDataString)
37+
}
38+
}
39+
}
40+
}
41+
}
2542
override fun onCreate(savedInstanceState: Bundle?) {
2643
super.onCreate(savedInstanceState)
2744
Log.d("HistoryActivity: orientationDataRepository", orientationDataRepository.toString())
2845
setContent {
29-
HistoryContent(orientationDataRepository)
46+
HistoryContent(orientationDataRepository, createDocumentResult)
3047
}
3148
}
3249

Assignment3/Axelero/app/src/main/java/com/example/axelero/MainActivity.kt

+1-1
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ class MainActivity : ComponentActivity() {
2020
override fun onCreate(savedInstanceState: Bundle?) {
2121
super.onCreate(savedInstanceState)
2222
setContent {
23-
MainContent(xAngle, yAngle, zAngle)
23+
MainContent(xAngle, yAngle, zAngle, orientationDataRepository)
2424
}
2525
}
2626

Assignment3/Axelero/app/src/main/java/com/example/axelero/db/OrientationDataDao.kt

+3
Original file line numberDiff line numberDiff line change
@@ -11,4 +11,7 @@ interface OrientationDataDao {
1111

1212
@Query("SELECT * FROM orientation_data")
1313
suspend fun getAllOrientationData(): List<OrientationData>
14+
15+
@Query("DELETE FROM orientation_data")
16+
suspend fun deleteAll()
1417
}

Assignment3/Axelero/app/src/main/java/com/example/axelero/repository/OrientationDataRepository.kt

+8-1
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,8 @@ class OrientationDataRepository private constructor(
3838
private var accelerometer: Sensor? = null
3939
private var sensorEventListener: SensorEventListener? = null
4040
private var lastUpdate: Long = 0
41-
41+
var sensingInterval: Int = SensorManager.SENSOR_DELAY_NORMAL
42+
private set
4243

4344
init {
4445
Log.d("OrientationDataRepository", "Initializing OrientationDataRepository")
@@ -113,6 +114,10 @@ class OrientationDataRepository private constructor(
113114
orientationDataDao.insert(orientationData)
114115
}
115116

117+
suspend fun clearOrientationData() {
118+
orientationDataDao.deleteAll()
119+
}
120+
116121
fun changeSensingInterval(interval: Int) {
117122
sensorEventListener?.let {
118123
sensorManager.unregisterListener(it)
@@ -122,6 +127,8 @@ class OrientationDataRepository private constructor(
122127
interval
123128
)
124129
}
130+
// Update the sensing interval whenever it's changed
131+
sensingInterval = interval
125132
}
126133

127134
suspend fun getOrientationData(): List<OrientationData> {

Assignment3/Axelero/app/src/main/java/com/example/axelero/ui/HistoryContent.kt

+25-27
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,11 @@
11
package com.example.axelero.ui
22

3+
import android.app.Activity
4+
import android.content.Intent
35
import android.hardware.SensorManager
6+
import android.os.Bundle
47
import android.os.Environment
8+
import androidx.activity.result.ActivityResultLauncher
59
import androidx.compose.foundation.layout.Arrangement
610
import androidx.compose.foundation.layout.Column
711
import androidx.compose.foundation.layout.Spacer
@@ -20,15 +24,19 @@ import androidx.compose.runtime.setValue
2024
import androidx.compose.ui.Alignment
2125
import androidx.compose.ui.Modifier
2226
import androidx.compose.ui.unit.dp
27+
import androidx.core.app.ActivityCompat.startActivityForResult
2328
import com.example.axelero.db.OrientationData
2429
import com.example.axelero.repository.OrientationDataRepository
2530
import com.example.axelero.ui.components.LineChart
2631
import com.example.axelero.ui.components.SensorDelayDropdownMenu
2732
import com.patrykandpatrick.vico.core.model.CartesianChartModelProducer
33+
import kotlinx.coroutines.CoroutineScope
34+
import kotlinx.coroutines.Dispatchers
35+
import kotlinx.coroutines.launch
2836
import java.io.File
2937

3038
@Composable
31-
fun HistoryContent(orientationDataRepository: OrientationDataRepository) {
39+
fun HistoryContent(orientationDataRepository: OrientationDataRepository, createDocumentResult: ActivityResultLauncher<Intent>) {
3240
val orientationData = produceState<List<OrientationData>>(initialValue = emptyList()) {
3341
value = orientationDataRepository.getOrientationData()
3442
}
@@ -37,8 +45,6 @@ fun HistoryContent(orientationDataRepository: OrientationDataRepository) {
3745
val modelProducer2 = remember { CartesianChartModelProducer.build() }
3846
val modelProducer3 = remember { CartesianChartModelProducer.build() }
3947

40-
var selectedInterval by remember { mutableIntStateOf(SensorManager.SENSOR_DELAY_NORMAL) }
41-
4248
Column(
4349
modifier = Modifier.fillMaxSize(),
4450
verticalArrangement = Arrangement.Center,
@@ -69,38 +75,30 @@ fun HistoryContent(orientationDataRepository: OrientationDataRepository) {
6975
Spacer(modifier = Modifier.height(16.dp))
7076
Button(
7177
onClick = {
72-
// Export the orientation data to a text file
73-
exportOrientationData(orientationData)
78+
// Save the orientation data to a text file on the device
79+
val intent = Intent(Intent.ACTION_CREATE_DOCUMENT).apply {
80+
addCategory(Intent.CATEGORY_OPENABLE)
81+
type = "text/plain"
82+
putExtra(Intent.EXTRA_TITLE, "orientation_data_" + {orientationDataRepository.sensingInterval.toString()} + ".txt")
83+
}
84+
createDocumentResult.launch(intent)
7485
}
7586
) {
7687
Text("Export Data")
7788
}
7889
Spacer(modifier = Modifier.height(16.dp))
79-
// Allow the user to change the sensing interval
80-
SensorDelayDropdownMenu(
81-
orientationData = orientationData.value,
82-
orientationDataRepository = orientationDataRepository,
83-
onIntervalChanged = { interval ->
84-
selectedInterval = interval
85-
// Repeat the prediction process with the new interval
86-
// val (newPredictedXAngles, newPredictedYAngles, newPredictedZAngles) =
87-
// predictOrientationData(orientationData.value)
88-
// Update your predicted angles here
90+
Button(
91+
onClick = {
92+
// Reset the orientation data in the database
93+
CoroutineScope(Dispatchers.IO).launch {
94+
orientationDataRepository.clearOrientationData()
95+
}
8996
}
90-
)
97+
) {
98+
Text("Reset Data")
99+
}
91100
}
92101
}
93102

94-
private fun exportOrientationData(orientationData: State<List<OrientationData>>) {
95-
val externalStorageDir = Environment.getExternalStorageDirectory()
96-
val file = File(externalStorageDir, "orientation_data.txt")
97103

98-
// Convert the orientation data to a string format
99-
val dataString = orientationData.value.joinToString("\n") { "${it.xAngle}, ${it.yAngle}, ${it.zAngle}, ${it.timestamp}" }
100104

101-
// Write the data to the text file
102-
file.writeText(dataString)
103-
104-
// Display a success message or perform any other necessary actions
105-
// ...
106-
}

Assignment3/Axelero/app/src/main/java/com/example/axelero/ui/MainContent.kt

+18-1
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,10 @@
11
package com.example.axelero.ui
22

33
import android.content.Intent
4+
import android.hardware.SensorManager
45
import android.os.Bundle
56
import android.util.Log
7+
import android.widget.Toast
68
import androidx.compose.foundation.layout.Arrangement
79
import androidx.compose.foundation.layout.Column
810
import androidx.compose.foundation.layout.Row
@@ -12,16 +14,23 @@ import androidx.compose.foundation.layout.height
1214
import androidx.compose.material3.Button
1315
import androidx.compose.material3.Text
1416
import androidx.compose.runtime.Composable
17+
import androidx.compose.runtime.getValue
18+
import androidx.compose.runtime.mutableIntStateOf
19+
import androidx.compose.runtime.mutableStateOf
20+
import androidx.compose.runtime.remember
21+
import androidx.compose.runtime.setValue
1522
import androidx.compose.ui.Alignment
1623
import androidx.compose.ui.Modifier
1724
import androidx.compose.ui.platform.LocalContext
1825
import androidx.compose.ui.unit.dp
1926
import com.example.axelero.HistoryActivity
2027
import com.example.axelero.repository.OrientationDataRepository
28+
import com.example.axelero.ui.components.SensorDelayDropdownMenu
2129

2230
@Composable
23-
fun MainContent(xAngle: Float, yAngle: Float, zAngle: Float) {
31+
fun MainContent(xAngle: Float, yAngle: Float, zAngle: Float, orientationDataRepository: OrientationDataRepository) {
2432
val context = LocalContext.current
33+
var selectedInterval by remember { mutableIntStateOf(SensorManager.SENSOR_DELAY_NORMAL) }
2534
Column(
2635
modifier = Modifier.fillMaxSize(),
2736
verticalArrangement = Arrangement.Center,
@@ -44,6 +53,14 @@ fun MainContent(xAngle: Float, yAngle: Float, zAngle: Float) {
4453
Text("$zAngle")
4554
}
4655
Spacer(modifier = Modifier.height(16.dp))
56+
SensorDelayDropdownMenu(
57+
orientationDataRepository = orientationDataRepository,
58+
onIntervalChanged = { interval ->
59+
selectedInterval = interval
60+
Toast.makeText(context, "Sensor delay set to $interval", Toast.LENGTH_SHORT).show()
61+
}
62+
)
63+
Spacer(modifier = Modifier.height(16.dp))
4764
Button(
4865
onClick = {
4966
// Create an Intent to start HistoryActivity

Assignment3/Axelero/app/src/main/java/com/example/axelero/ui/components/SensorDelayDropdownMenu.kt

+11-16
Original file line numberDiff line numberDiff line change
@@ -19,23 +19,24 @@ import com.example.axelero.repository.OrientationDataRepository
1919

2020
@Composable
2121
fun SensorDelayDropdownMenu(
22-
orientationData: List<OrientationData>,
2322
orientationDataRepository: OrientationDataRepository,
2423
onIntervalChanged: (Int) -> Unit
2524
) {
2625
var expanded by remember { mutableStateOf(false) }
2726
val items = listOf(
2827
SensorManager.SENSOR_DELAY_NORMAL,
29-
SensorManager.SENSOR_DELAY_UI,
30-
SensorManager.SENSOR_DELAY_GAME,
31-
SensorManager.SENSOR_DELAY_FASTEST
28+
10,
29+
20,
30+
30
3231
)
3332
var selectedInterval by remember { mutableIntStateOf(items[0]) }
3433

3534
Box(modifier = Modifier.fillMaxWidth()) {
3635
Text(
3736
text = selectedInterval.toString(),
38-
modifier = Modifier.fillMaxWidth().clickable(onClick = { expanded = true })
37+
modifier = Modifier
38+
.fillMaxWidth()
39+
.clickable(onClick = { expanded = true })
3940
)
4041
DropdownMenu(
4142
expanded = expanded,
@@ -48,17 +49,11 @@ fun SensorDelayDropdownMenu(
4849
Text(text = interval.toString())
4950
},
5051
onClick = {
51-
selectedInterval = interval
52-
expanded = false
53-
orientationDataRepository.changeSensingInterval(interval)
54-
onIntervalChanged(interval)
55-
// // Repeat the prediction process with the new interval
56-
// val (newPredictedXAngles, newPredictedYAngles, newPredictedZAngles) =
57-
// predictOrientationData(orientationData)
58-
// predictedXAngles = newPredictedXAngles
59-
// predictedYAngles = newPredictedYAngles
60-
// predictedZAngles = newPredictedZAngles
61-
})
52+
selectedInterval = interval
53+
expanded = false
54+
orientationDataRepository.changeSensingInterval(interval)
55+
onIntervalChanged(interval)
56+
})
6257
}
6358
}
6459
}

Assignment3/NNN/.gitignore

+15
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
*.iml
2+
.gradle
3+
/local.properties
4+
/.idea/caches
5+
/.idea/libraries
6+
/.idea/modules.xml
7+
/.idea/workspace.xml
8+
/.idea/navEditor.xml
9+
/.idea/assetWizardSettings.xml
10+
.DS_Store
11+
/build
12+
/captures
13+
.externalNativeBuild
14+
.cxx
15+
local.properties

Assignment3/NNN/.idea/.gitignore

+5
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Assignment3/NNN/app/.gitignore

+1
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
/build

0 commit comments

Comments
 (0)