Skip to content

Commit 5d88101

Browse files
committed
Calibration data for chart when spectrum loaded from file. Reset calibration labels yOffset to prevent overlapping.
1 parent eada301 commit 5d88101

File tree

4 files changed

+48
-26
lines changed

4 files changed

+48
-26
lines changed

app/build.gradle.kts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,8 @@ android {
1212
applicationId = "io.github.vikulin.opengammakit"
1313
minSdk = 24
1414
targetSdk = 35
15-
versionCode = 20
16-
versionName = "1.1.9"
15+
versionCode = 22
16+
versionName = "1.2.1"
1717
testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
1818
setProperty("archivesBaseName", "ogk-inspector-$versionName")
1919
}

app/src/main/kotlin/io/github/vikulin/opengammakit/SpectrumFragment.kt

Lines changed: 40 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@ import io.github.vikulin.opengammakit.model.EmissionSource
4747
import io.github.vikulin.opengammakit.model.Isotope
4848
import java.io.OutputStream
4949
import androidx.core.content.edit
50+
import androidx.core.net.toFile
5051
import androidx.lifecycle.lifecycleScope
5152
import io.github.vikulin.opengammakit.model.OpenGammaKitData
5253
import io.github.vikulin.opengammakit.view.CalibrationUpdateOrRemoveDialogFragment
@@ -229,6 +230,8 @@ class SpectrumFragment : SerialConnectionFragment(),
229230

230231
initChart(outState)
231232
setupChart()
233+
// find first matching calibration from local db and load it to chart
234+
spectrumDataSet.data.find { loadCalibrationData(it.deviceData.deviceId) }
232235
} catch (e: Exception) {
233236
e.printStackTrace()
234237
val errorDialog = ErrorDialogFragment.newInstance(e.message ?: "Unknown error")
@@ -452,7 +455,7 @@ class SpectrumFragment : SerialConnectionFragment(),
452455

453456
override fun onConnectionSuccess() {
454457
super.onConnectionSuccess()
455-
loadCalibrationData()
458+
loadCalibrationData(serialNumber)
456459
updateChartWithCombinedXAxis(selectedCalibrationMeasurementIndex)
457460
showCalibrationLimitLines()
458461
updateDetectedPeaks()
@@ -543,6 +546,16 @@ class SpectrumFragment : SerialConnectionFragment(),
543546
return entry.data[index].deviceData.deviceName +" ${entry.derivedSpectra[index]?.name} Ch $ch Ct $ct T $t"
544547
}
545548

549+
fun calculateYOffset(peakEnergy: Int): Float {
550+
val baseOffset = 25f
551+
// Define reset interval
552+
val resetInterval = 3300 / 6
553+
// Calculate adjusted energy level
554+
val adjustedEnergy = peakEnergy % resetInterval
555+
// Compute yOffset
556+
return baseOffset + adjustedEnergy.toFloat() / 15f
557+
}
558+
546559
private fun setupChart() {
547560
val primaryColor = resources.getColor(R.color.colorPrimaryText, null)
548561
//copy data to outputSpectrum
@@ -824,9 +837,13 @@ class SpectrumFragment : SerialConnectionFragment(),
824837
energySpectrum.numberOfChannels = spectrum.size
825838
energySpectrum.measurementTime =
826839
(SystemClock.elapsedRealtime() - measureTimer.base)/1000
840+
//mark spectrum with deviceId
841+
serialNumber?.let {
842+
spectrumDataSet.data[deviceSpectrumIndex].deviceData.deviceId = it
843+
}
844+
827845
// copy spectrum. TODO apply modifiers and peaks detection
828846
resetSpectrumData(spectrumDataSet)
829-
830847
updateChartSpectrumData()
831848
} catch (e: Exception) {
832849
Log.e("Test", "Failed to parse data: ${e.message}")
@@ -864,6 +881,10 @@ class SpectrumFragment : SerialConnectionFragment(),
864881
"Parsed scheduled spectrum number: ${openGammaKitData.data.size}"
865882
)
866883
spectrumDataSet.data[deviceSpectrumIndex] = openGammaKitData.data[deviceSpectrumIndex]
884+
//mark spectrum with deviceId
885+
serialNumber?.let {
886+
spectrumDataSet.data[deviceSpectrumIndex].deviceData.deviceId = it
887+
}
867888
// copy spectrum. TODO apply modifiers and peaks detection
868889
resetSpectrumData(spectrumDataSet)
869890
updateChartSpectrumData()
@@ -1040,8 +1061,7 @@ class SpectrumFragment : SerialConnectionFragment(),
10401061
lineWidth = 2f
10411062
enableDashedLine(3f, 3f, 0f)
10421063
labelPosition = LimitLine.LimitLabelPosition.RIGHT_BOTTOM
1043-
yOffset = 40.0f
1044-
1064+
yOffset = calculateYOffset(peakEnergy.toInt())
10451065
}
10461066
xAxis.addLimitLine(verticalCalibrationLine)
10471067
val emissionSource = if(peakIsotope != null){
@@ -1068,7 +1088,7 @@ class SpectrumFragment : SerialConnectionFragment(),
10681088
lineWidth = 2f
10691089
enableDashedLine(3f, 3f, 0f)
10701090
labelPosition = LimitLine.LimitLabelPosition.RIGHT_BOTTOM
1071-
yOffset = 40.0f
1091+
yOffset = calculateYOffset(peakEnergy.toInt())
10721092
}
10731093
xAxis.addLimitLine(verticalCalibrationLine)
10741094
val emissionSource = if(peakIsotope != null){
@@ -1270,43 +1290,44 @@ class SpectrumFragment : SerialConnectionFragment(),
12701290
}
12711291

12721292
// Function to load calibration data
1273-
private fun loadCalibrationData() {
1274-
1293+
private fun loadCalibrationData(serialNumber: String?): Boolean {
1294+
if(serialNumber == null) {
1295+
return false
1296+
}
12751297
// the calibration data has been already loaded from savedInstanceState
12761298
if(verticalCalibrationLineList.isNotEmpty()){
1277-
return
1299+
return true
12781300
}
12791301

1280-
val serializedData = sharedPreferences.getString(calibrationPreferencesKey+serialNumber, null) ?: return
1302+
val serializedData = sharedPreferences.getString(calibrationPreferencesKey+serialNumber, null) ?: return false
12811303

12821304
// Deserialize the JSON back into the calibration list using kotlinx.serialization
12831305
val calibrationDataList: List<CalibrationData> = Json.decodeFromString(serializedData)
12841306

1285-
calibrationDataList.forEach {
1307+
calibrationDataList.forEachIndexed { index, it ->
12861308
val limitLine = LimitLine(it.limitLineValue, it.limitLineLabel)
1309+
val emissionSource = it.emissionSource
12871310
limitLine.apply {
12881311
labelPosition = LimitLine.LimitLabelPosition.RIGHT_BOTTOM
1289-
yOffset = 40.0f
1290-
1312+
yOffset = calculateYOffset(emissionSource.energy.toInt())
12911313
}
1292-
val emissionSource = it.emissionSource
12931314
verticalCalibrationLineList.add(Pair(limitLine, Pair(it.channel, emissionSource)))
12941315
}
1316+
return verticalCalibrationLineList.isNotEmpty()
12951317
}
12961318

12971319
private fun showCalibrationLimitLines() {
12981320
val xAxis = spectrumChart.xAxis
12991321
xAxis.removeAllLimitLines()
13001322
// Add all calibration limit lines back to the xAxis
1301-
verticalCalibrationLineList.forEach { pair ->
1323+
verticalCalibrationLineList.forEachIndexed { index, pair ->
13021324
val limitLine = LimitLine(pair.first.limit, pair.first.label).apply {
13031325
lineColor = Color.MAGENTA
13041326
textColor = resources.getColor(R.color.colorPrimaryText, null)
13051327
lineWidth = 2f
13061328
enableDashedLine(3f, 3f, 0f)
13071329
labelPosition = LimitLine.LimitLabelPosition.RIGHT_BOTTOM
1308-
yOffset = 40.0f
1309-
1330+
yOffset = calculateYOffset(pair.second.second.energy.toInt())
13101331
}
13111332
xAxis.addLimitLine(limitLine)
13121333
}
@@ -1569,7 +1590,7 @@ class SpectrumFragment : SerialConnectionFragment(),
15691590
val modified = SpectrumModifier.applySavitzkyGolayFilter(inputSpectrum)
15701591

15711592
val derivedEntry = DerivedSpectrumEntry(
1572-
name = "${entry.deviceData.deviceName} - SavitzkyGolay",
1593+
name = "SavitzkyGolay",
15731594
resultSpectrum = modified,
15741595
modifiers = mutableListOf(
15751596
ModifierInfo(
@@ -1614,7 +1635,7 @@ class SpectrumFragment : SerialConnectionFragment(),
16141635
val modified = SpectrumModifier.applySavitzkyGolayFilter(inputSpectrum)
16151636

16161637
val derivedEntry = DerivedSpectrumEntry(
1617-
name = "${entry.deviceData.deviceName} - SavitzkyGolay",
1638+
name = "SavitzkyGolay",
16181639
resultSpectrum = modified,
16191640
modifiers = mutableListOf(
16201641
ModifierInfo(
@@ -1679,7 +1700,7 @@ class SpectrumFragment : SerialConnectionFragment(),
16791700
}
16801701

16811702
val derivedEntry = DerivedSpectrumEntry(
1682-
name = "${entry.deviceData.deviceName} - LogScale",
1703+
name = "LogScale",
16831704
resultSpectrum = logScaled,
16841705
modifiers = mutableListOf(
16851706
ModifierInfo(

app/src/main/kotlin/io/github/vikulin/opengammakit/model/OpenGammaKitData.kt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,8 @@ data class GammaKitEntry(
4141
@Serializable
4242
data class DeviceData(
4343
val softwareName: String,
44-
val deviceName: String
44+
val deviceName: String,
45+
var deviceId: String? = null
4546
) : JavaSerializable
4647

4748
@Serializable

app/src/main/kotlin/io/github/vikulin/opengammakit/view/SaveSpectrumDataIntoFileDialogFragment.kt

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -57,9 +57,12 @@ class SaveSpectrumDataIntoFileDialogFragment : DialogFragment() {
5757
val selectLocationButton = view.findViewById<ImageButton>(R.id.selectLocationButton)
5858
selectedLocationText = view.findViewById<TextView>(R.id.selectedLocationText)
5959
val saveButton = view.findViewById<Button>(R.id.saveButton)
60+
val spectrumData = arguments?.getSerializable(SPECTRUM_DATA) as? OpenGammaKitData
61+
?: return view
62+
val prefix = spectrumData.derivedSpectra.entries.first().value.name
6063
val formatter = SimpleDateFormat("yyyyMMdd_HHmmss", Locale.getDefault())
6164
val timestamp = formatter.format(Date())
62-
val fileName = "spectrum_$timestamp.json"
65+
val fileName = prefix+"_$timestamp.json"
6366
fileNameEditText.text = fileName
6467
selectedLocationText.text = "Documents/OpenGammaKit/"
6568
selectLocationButton.setOnClickListener {
@@ -70,9 +73,6 @@ class SaveSpectrumDataIntoFileDialogFragment : DialogFragment() {
7073
createDocumentLauncher.launch(name)
7174
}
7275
}
73-
74-
val spectrumData = arguments?.getSerializable(SPECTRUM_DATA) as? OpenGammaKitData
75-
?: return view
7676
saveButton.setOnClickListener {
7777
val fileName = fileNameEditText.text.toString().trim()
7878
val uri = selectedLocationText.text

0 commit comments

Comments
 (0)