@@ -47,6 +47,7 @@ import io.github.vikulin.opengammakit.model.EmissionSource
4747import io.github.vikulin.opengammakit.model.Isotope
4848import java.io.OutputStream
4949import androidx.core.content.edit
50+ import androidx.core.net.toFile
5051import androidx.lifecycle.lifecycleScope
5152import io.github.vikulin.opengammakit.model.OpenGammaKitData
5253import 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 (
0 commit comments