Add constants to app and add apk
All checks were successful
ci/woodpecker/push/woodpecker Pipeline was successful
All checks were successful
ci/woodpecker/push/woodpecker Pipeline was successful
Signed-off-by: Severin Kaderli <severin@kaderli.dev>
This commit is contained in:
parent
bb50116cbe
commit
c44341648d
3 changed files with 55 additions and 31 deletions
BIN
src/MagSend-Website/MagSend.apk
Normal file
BIN
src/MagSend-Website/MagSend.apk
Normal file
Binary file not shown.
|
@ -0,0 +1,9 @@
|
||||||
|
package dev.kaderli.magsend
|
||||||
|
|
||||||
|
object Constants {
|
||||||
|
const val HEADER_LENGTH: Int = 4
|
||||||
|
const val BYTE_LENGTH: Int = 8
|
||||||
|
const val CRC_LENGTH: Int = 8
|
||||||
|
const val SIGNAL_THRESHOLD: Int = 5
|
||||||
|
const val SIGNAL_SAMPLE_THRESHOLD: Int = 3
|
||||||
|
}
|
|
@ -4,12 +4,15 @@ import android.os.Bundle
|
||||||
import android.view.View
|
import android.view.View
|
||||||
import android.widget.TextView
|
import android.widget.TextView
|
||||||
import androidx.core.content.ContextCompat
|
import androidx.core.content.ContextCompat
|
||||||
|
import dev.kaderli.magsend.Constants
|
||||||
import dev.kaderli.magsend.R
|
import dev.kaderli.magsend.R
|
||||||
import dev.kaderli.magsend.Utility
|
import dev.kaderli.magsend.Utility
|
||||||
import dev.kaderli.magsend.model.Sample
|
import dev.kaderli.magsend.model.Sample
|
||||||
import dev.kaderli.magsend.model.Signal
|
import dev.kaderli.magsend.model.Signal
|
||||||
import java.lang.Integer.min
|
import java.lang.Integer.min
|
||||||
import java.util.stream.Collectors
|
import java.util.stream.Collectors
|
||||||
|
import kotlin.math.abs
|
||||||
|
import kotlin.math.pow
|
||||||
|
|
||||||
class ReceiveActivity : BaseSensorActivity() {
|
class ReceiveActivity : BaseSensorActivity() {
|
||||||
private lateinit var receiveDescription: TextView
|
private lateinit var receiveDescription: TextView
|
||||||
|
@ -33,6 +36,8 @@ class ReceiveActivity : BaseSensorActivity() {
|
||||||
*/
|
*/
|
||||||
private var preambleReceived = false
|
private var preambleReceived = false
|
||||||
|
|
||||||
|
private var payloadLength: Int? = null
|
||||||
|
|
||||||
private var receivingComplete = false
|
private var receivingComplete = false
|
||||||
|
|
||||||
override fun onCreate(savedInstanceState: Bundle?) {
|
override fun onCreate(savedInstanceState: Bundle?) {
|
||||||
|
@ -51,24 +56,24 @@ class ReceiveActivity : BaseSensorActivity() {
|
||||||
private fun getRangeOfData(): Float {
|
private fun getRangeOfData(): Float {
|
||||||
val maxValue = samples.maxByOrNull { it.value } ?: Sample(0f)
|
val maxValue = samples.maxByOrNull { it.value } ?: Sample(0f)
|
||||||
val minValue = samples.minByOrNull { it.value } ?: Sample(0f)
|
val minValue = samples.minByOrNull { it.value } ?: Sample(0f)
|
||||||
//Log.i(TAG, "Min: ${minValue}, Max: $maxValue")
|
|
||||||
return maxValue.value - minValue.value
|
return maxValue.value - minValue.value
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun getThresholdForHighSignals(): Float {
|
private fun getThresholdForHighSignals(): Float {
|
||||||
if (getRangeOfData() < 3) {
|
if (getRangeOfData() < Constants.SIGNAL_THRESHOLD) {
|
||||||
return getMidRangeOfData() + 3
|
return getMidRangeOfData() + Constants.SIGNAL_THRESHOLD
|
||||||
}
|
}
|
||||||
|
|
||||||
return getMidRangeOfData() + 2
|
return getMidRangeOfData() + Constants.SIGNAL_THRESHOLD
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun getThresholdForLowSignals(): Float {
|
private fun getThresholdForLowSignals(): Float {
|
||||||
if (getRangeOfData() < 3) {
|
if (getRangeOfData() < Constants.SIGNAL_THRESHOLD) {
|
||||||
return getMidRangeOfData() + 3
|
return getMidRangeOfData() + Constants.SIGNAL_THRESHOLD
|
||||||
}
|
}
|
||||||
|
|
||||||
return getMidRangeOfData() - 2
|
return getMidRangeOfData() - Constants.SIGNAL_THRESHOLD
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun getMidRangeOfData(): Float {
|
private fun getMidRangeOfData(): Float {
|
||||||
|
@ -151,9 +156,11 @@ class ReceiveActivity : BaseSensorActivity() {
|
||||||
nextIndex++
|
nextIndex++
|
||||||
}
|
}
|
||||||
|
|
||||||
elementCount > 3
|
elementCount >= Constants.SIGNAL_SAMPLE_THRESHOLD
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
return cleanSignal
|
return cleanSignal
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -246,39 +253,46 @@ class ReceiveActivity : BaseSensorActivity() {
|
||||||
val packet = analyzePacketSignal()
|
val packet = analyzePacketSignal()
|
||||||
|
|
||||||
// Get the payload length of in the data
|
// Get the payload length of in the data
|
||||||
var payloadLength = 0
|
if (payloadLength == null && packet.size >= Constants.HEADER_LENGTH) {
|
||||||
if (packet.size >= 4) {
|
payloadLength = listToInteger(packet.take(Constants.HEADER_LENGTH))
|
||||||
payloadLength = listToInteger(packet.take(4))
|
|
||||||
headerStatus.text = getString(R.string.payload_length, payloadLength)
|
headerStatus.text = getString(R.string.payload_length, payloadLength)
|
||||||
}
|
}
|
||||||
|
|
||||||
if (packet.size >= 4 + (8)) {
|
if(payloadLength == null) {
|
||||||
val numberOfAvailablePayloadBytes = min((packet.size - 4) / 8, payloadLength)
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
if (packet.size >= Constants.HEADER_LENGTH + Constants.BYTE_LENGTH) {
|
||||||
|
val numberOfAvailablePayloadBytes = min((packet.size - Constants.HEADER_LENGTH) / 8, payloadLength!!)
|
||||||
var payload = ""
|
var payload = ""
|
||||||
for (i in 1..numberOfAvailablePayloadBytes) {
|
for (i in 1..numberOfAvailablePayloadBytes) {
|
||||||
payload += listToInteger(packet.take(4 + (8 * i)).takeLast(8)).toChar().toString()
|
payload += listToInteger(
|
||||||
|
packet.take(Constants.HEADER_LENGTH + (Constants.BYTE_LENGTH * i)).takeLast(Constants.BYTE_LENGTH)
|
||||||
|
).toChar().toString()
|
||||||
}
|
}
|
||||||
receiveValue.text = payload
|
receiveValue.text = payload
|
||||||
|
}
|
||||||
|
|
||||||
|
if (packet.size >= Constants.HEADER_LENGTH + (Constants.BYTE_LENGTH * payloadLength!!) + Constants.CRC_LENGTH) {
|
||||||
|
// CRC Check
|
||||||
|
val receivedCrc = listToInteger(
|
||||||
|
packet.take(Constants.HEADER_LENGTH + (Constants.BYTE_LENGTH * payloadLength!!) + Constants.CRC_LENGTH)
|
||||||
|
.takeLast(Constants.CRC_LENGTH)
|
||||||
|
)
|
||||||
|
val calculatedCrc =
|
||||||
|
Utility.crc8Autosar(receiveValue.text.codePoints().boxed().collect(Collectors.toList()))
|
||||||
|
|
||||||
if (packet.size >= 4 + (8 * payloadLength) + 8) {
|
if (receivedCrc == calculatedCrc) {
|
||||||
// CRC Check
|
crcStatus.setText(R.string.crc_status_valid)
|
||||||
val receivedCrc = listToInteger(packet.take(4 + (8 * payloadLength) + 8).takeLast(8))
|
crcStatus.setTextColor(ContextCompat.getColor(this, R.color.success))
|
||||||
val calculatedCrc =
|
} else {
|
||||||
Utility.crc8Autosar(receiveValue.text.codePoints().boxed().collect(Collectors.toList()))
|
crcStatus.setText(R.string.crc_status_invalid)
|
||||||
|
crcStatus.setTextColor(ContextCompat.getColor(this, R.color.error))
|
||||||
if (receivedCrc == calculatedCrc) {
|
|
||||||
crcStatus.setText(R.string.crc_status_valid)
|
|
||||||
crcStatus.setTextColor(ContextCompat.getColor(this, R.color.success))
|
|
||||||
} else {
|
|
||||||
crcStatus.setText(R.string.crc_status_invalid)
|
|
||||||
crcStatus.setTextColor(ContextCompat.getColor(this, R.color.error))
|
|
||||||
}
|
|
||||||
|
|
||||||
// Mark receiving as complete
|
|
||||||
receiveDescription.setText(R.string.receive_description_complete)
|
|
||||||
receivingComplete = true
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Mark receiving as complete
|
||||||
|
receiveDescription.setText(R.string.receive_description_complete)
|
||||||
|
receivingComplete = true
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -296,6 +310,7 @@ class ReceiveActivity : BaseSensorActivity() {
|
||||||
|
|
||||||
fun restartReceiveProcess(view: View) {
|
fun restartReceiveProcess(view: View) {
|
||||||
preambleReceived = false
|
preambleReceived = false
|
||||||
|
payloadLength = null
|
||||||
receivingComplete = false
|
receivingComplete = false
|
||||||
|
|
||||||
receiveDescription.setText(R.string.receive_description)
|
receiveDescription.setText(R.string.receive_description)
|
||||||
|
|
Reference in a new issue