Skip to content

Commit

Permalink
Working ACC and GYR real time plots
Browse files Browse the repository at this point in the history
  • Loading branch information
tainfante committed Dec 1, 2019
1 parent bc61db3 commit a532b3b
Show file tree
Hide file tree
Showing 17 changed files with 312 additions and 183 deletions.
2 changes: 1 addition & 1 deletion .idea/misc.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions app/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -41,4 +41,5 @@ dependencies {
implementation 'com.google.android.material:material:1.0.0'
implementation 'com.github.PhilJay:MPAndroidChart:v3.1.0'
implementation 'com.android.support:multidex:1.0.3'
implementation "com.androidplot:androidplot-core:1.5.7"
}
2 changes: 2 additions & 0 deletions app/proguard-rules.pro
Original file line number Diff line number Diff line change
Expand Up @@ -19,3 +19,5 @@
# If you keep the line number information, uncomment this to
# hide the original source file name.
#-renamesourcefileattribute SourceFile

-keep class com.androidplot.** { *; }
154 changes: 78 additions & 76 deletions app/src/main/java/com/example/rehabapp/AccFragment.kt
Original file line number Diff line number Diff line change
@@ -1,101 +1,103 @@
package com.example.rehabapp

import android.graphics.Color
import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.core.content.ContextCompat
import androidx.fragment.app.Fragment
import com.androidplot.Plot
import java.util.*
import android.graphics.Paint.Join
import com.androidplot.xy.*
import java.text.DecimalFormat

import com.example.rehabapp.ValuesToLoad.Companion.accXEntries
import com.example.rehabapp.ValuesToLoad.Companion.accYEntries
import com.example.rehabapp.ValuesToLoad.Companion.accZEntries
class AccFragment(private val queueHandOuter: QueueHandOuter) : Fragment() {

import com.example.rehabapp.ValuesToLoad.Companion.gyrXEntries
import com.example.rehabapp.ValuesToLoad.Companion.gyrYEntries
import com.example.rehabapp.ValuesToLoad.Companion.gyrZEntries
import com.github.mikephil.charting.charts.LineChart
import com.github.mikephil.charting.data.Entry
import com.github.mikephil.charting.data.LineData
import com.github.mikephil.charting.data.LineDataSet
import com.github.mikephil.charting.interfaces.datasets.ILineDataSet
lateinit var accChart: XYPlot
lateinit var gyrChart: XYPlot
lateinit var data: RealTimeXYDatasource
lateinit var myThread: Thread


class AccFragment : Fragment() {

lateinit var accChart: LineChart
lateinit var gyrChart: LineChart

override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View {
var view: View =inflater.inflate(R.layout.acc_layout, container, false)

var color1 = ContextCompat.getColor((activity as MainActivity).applicationContext, R.color.colorblue)
var color2 = ContextCompat.getColor((activity as MainActivity).applicationContext, R.color.colorpink)
var color3 = ContextCompat.getColor((activity as MainActivity).applicationContext, R.color.colorgreen)
val view: View =inflater.inflate(R.layout.acc_layout, container, false)

accChart=view.findViewById(R.id.accChart)

val accXDataSet=LineDataSet(accXEntries, "X")
accXDataSet.lineWidth = 0.4f
accXDataSet.setDrawCircles(false)
accXDataSet.color = color1

val accYDataSet=LineDataSet(accYEntries, "Y")
accYDataSet.lineWidth = 0.4f
accYDataSet.setDrawCircles(false)
accYDataSet.color = color2

val accZDataSet=LineDataSet(accZEntries, "Z")
accZDataSet.lineWidth = 0.4f
accZDataSet.setDrawCircles(false)
accZDataSet.color = color3

var accDataSets = ArrayList<ILineDataSet>()
accDataSets.add(accXDataSet)
accDataSets.add(accYDataSet)
accDataSets.add(accZDataSet)

val accLineData= LineData(accDataSets)
accChart.data = accLineData
accChart.axisLeft.axisMinimum = 0.0F
accChart.axisLeft.axisMaximum = 65535.0F
accChart.axisRight.isEnabled = false
accChart.invalidate()

gyrChart=view.findViewById(R.id.gyrChart)

val gyrXDataSet=LineDataSet(gyrXEntries, "X")
gyrXDataSet.lineWidth = 0.4f
gyrXDataSet.setDrawCircles(false)
gyrXDataSet.color = color1

val gyrYDataSet=LineDataSet(gyrYEntries, "Y")
gyrYDataSet.lineWidth = 0.4f
gyrYDataSet.setDrawCircles(false)
gyrYDataSet.color = color2

val gyrZDataSet=LineDataSet(gyrZEntries, "Z")
gyrZDataSet.lineWidth = 0.4f
gyrZDataSet.setDrawCircles(false)
gyrZDataSet.color=color3

var gyrDataSets = ArrayList<ILineDataSet>()
gyrDataSets.add(gyrXDataSet)
gyrDataSets.add(gyrYDataSet)
gyrDataSets.add(gyrZDataSet)

val gyrLineData= LineData(gyrDataSets)
gyrChart.data = gyrLineData
gyrChart.axisLeft.axisMinimum = 0.0F
gyrChart.axisLeft.axisMaximum = 65535.0F
gyrChart.axisRight.isEnabled = false
gyrChart.invalidate()
val plotUpdater=MyPlotUpdater(accChart, gyrChart)
accChart.graph.getLineLabelStyle(XYGraphWidget.Edge.BOTTOM).format = DecimalFormat("0")
accChart.domainStepMode = StepMode.INCREMENT_BY_VAL
accChart.domainStepValue = 400.0
accChart.rangeStepMode = StepMode.INCREMENT_BY_VAL
accChart.rangeStepValue = 10000.0
accChart.graph.getLineLabelStyle(XYGraphWidget.Edge.LEFT).format = DecimalFormat("0")

gyrChart.graph.getLineLabelStyle(XYGraphWidget.Edge.BOTTOM).format = DecimalFormat("0")
gyrChart.domainStepMode = StepMode.INCREMENT_BY_VAL
gyrChart.domainStepValue = 400.0
gyrChart.rangeStepMode = StepMode.INCREMENT_BY_VAL
gyrChart.rangeStepValue = 10000.0
gyrChart.graph.getLineLabelStyle(XYGraphWidget.Edge.LEFT).format = DecimalFormat("0")

accChart.setRangeBoundaries(0,65536, BoundaryMode.FIXED)
gyrChart.setRangeBoundaries(0,65536, BoundaryMode.FIXED)

data = RealTimeXYDatasource(this.queueHandOuter)

val accXseries = RealTimeSeries(data, 0, "ACC X")
val accYseries = RealTimeSeries(data, 1, "ACC Y")
val accZseries = RealTimeSeries(data, 2, "ACC Z")

val gyrXseries = RealTimeSeries(data, 3, "GYR X")
val gyrYseries = RealTimeSeries(data, 4, "GYR Y")
val gyrZseries = RealTimeSeries(data, 5, "GYR Z")

val formatter1 = LineAndPointFormatter(Color.rgb(0, 200, 0), null, null, null)
formatter1.linePaint.strokeJoin = Join.ROUND
formatter1.linePaint.strokeWidth = 10f
accChart.addSeries(accXseries,formatter1)
gyrChart.addSeries(gyrXseries, formatter1)

val formatter2 = LineAndPointFormatter(Color.rgb(0, 0, 200), null, null, null)
formatter1.linePaint.strokeJoin = Join.ROUND
formatter1.linePaint.strokeWidth = 10f
accChart.addSeries(accYseries,formatter2)
gyrChart.addSeries(gyrYseries, formatter2)

val formatter3 = LineAndPointFormatter(Color.rgb(200, 0, 0), null, null, null)
formatter1.linePaint.strokeJoin = Join.ROUND
formatter1.linePaint.strokeWidth = 10f
accChart.addSeries(accZseries,formatter3)
gyrChart.addSeries(gyrZseries, formatter3)

data.addObserver(plotUpdater)

return view
}

override fun onResume() {
myThread = Thread(data)
myThread.start()
super.onResume()
}

override fun onPause() {
data.stopThread()
super.onPause()
}

inner class MyPlotUpdater(private var accplot: Plot<*, *, *, *, *>, private var gyrplot: Plot<*, *, *, *, *> ) : Observer {

override fun update(o: Observable?, arg: Any?) {
accplot.redraw()
gyrplot.redraw()
}

}
}
36 changes: 18 additions & 18 deletions app/src/main/java/com/example/rehabapp/AccFrame.kt
Original file line number Diff line number Diff line change
Expand Up @@ -3,44 +3,44 @@ package com.example.rehabapp
class AccFrame(dataArray: UByteArray) {

private var dataArray = UByteArray(12)
private var accX: Float = 0.0F
private var accY: Float = 0.0F
private var accZ: Float = 0.0F
private var gyrX: Float = 0.0F
private var gyrY: Float = 0.0F
private var gyrZ: Float = 0.0F
private var accX: Int = 0
private var accY: Int = 0
private var accZ: Int = 0
private var gyrX: Int = 0
private var gyrY: Int = 0
private var gyrZ: Int = 0

init{
this.dataArray=dataArray
accX = ((dataArray[0].toInt() shl 8) or dataArray[1].toInt()).toFloat()
accY = ((dataArray[2].toInt() shl 8) or dataArray[3].toInt()).toFloat()
accZ = ((dataArray[4].toInt() shl 8) or dataArray[5].toInt()).toFloat()
gyrX = ((dataArray[6].toInt() shl 8) or dataArray[7].toInt()).toFloat()
gyrY = ((dataArray[8].toInt() shl 8) or dataArray[9].toInt()).toFloat()
gyrZ = ((dataArray[10].toInt() shl 8) or dataArray[11].toInt()).toFloat()
accX = (dataArray[0].toInt() shl 8) or dataArray[1].toInt()
accY = (dataArray[2].toInt() shl 8) or dataArray[3].toInt()
accZ = (dataArray[4].toInt() shl 8) or dataArray[5].toInt()
gyrX = (dataArray[6].toInt() shl 8) or dataArray[7].toInt()
gyrY = (dataArray[8].toInt() shl 8) or dataArray[9].toInt()
gyrZ = (dataArray[10].toInt() shl 8) or dataArray[11].toInt()
}

fun getAccX(): Float {
fun getAccX(): Int {
return accX
}

fun getAccY(): Float {
fun getAccY(): Int {
return accY
}

fun getAccZ(): Float {
fun getAccZ(): Int {
return accZ
}

fun getGyrX(): Float {
fun getGyrX(): Int {
return gyrX
}

fun getGyrY(): Float {
fun getGyrY(): Int {
return gyrY
}

fun getGyrZ(): Float {
fun getGyrZ(): Int {
return gyrZ
}

Expand Down
6 changes: 4 additions & 2 deletions app/src/main/java/com/example/rehabapp/ConnectDevice.kt
Original file line number Diff line number Diff line change
Expand Up @@ -50,12 +50,12 @@ class ConnectDevice(isReady: IsReadyForTransmition, queueHandOuter: QueueHandOut
override fun onPostExecute(result: String?) {
super.onPostExecute(result)
if (!connectSuccess) {
connectResult = "Error in connection"
connectResult = "Error in connection\n"
isReady?.isDeviceReady(false)

} else {
isConnected = true
connectResult = "Successfully connected"
connectResult = "Successfully connected\n"
isReady?.isDeviceReady(true)
}
}
Expand Down Expand Up @@ -99,10 +99,12 @@ class ConnectDevice(isReady: IsReadyForTransmition, queueHandOuter: QueueHandOut
if(emg==1&&acc==0){
val frame = decodeEmgFrame(readEmgBuffer.copyOfRange(0, readBufferPosition))
queueHandOuter!!.giveMeTheEmgQueue().add(frame)
queueHandOuter!!.giveMeTheEmgQueuetoPlot().add(frame)
emg=0
} else if(emg==0&&acc==1){
val frame = decodeAccFrame(readAccBuffer.copyOfRange(0, readBufferPosition))
queueHandOuter!!.giveMeTheAccQueue().add(frame)
if(queueHandOuter!!.ifEnable())queueHandOuter!!.giveMeTheAccQueuetoPlot().add(frame)
acc = 0
}
readBufferPosition=0
Expand Down
42 changes: 3 additions & 39 deletions app/src/main/java/com/example/rehabapp/EmgFragment.kt
Original file line number Diff line number Diff line change
Expand Up @@ -9,21 +9,13 @@ import android.view.ViewGroup
import androidx.annotation.RequiresApi
import androidx.core.content.ContextCompat
import androidx.fragment.app.Fragment
import com.example.rehabapp.ValuesToLoad.Companion.rawEmgEntries
import com.example.rehabapp.ValuesToLoad.Companion.fftEntries
import com.example.rehabapp.ValuesToLoad.Companion.filtredEmgEntries
import com.github.mikephil.charting.charts.LineChart
import com.github.mikephil.charting.data.DataSet
import com.github.mikephil.charting.data.Entry
import com.github.mikephil.charting.data.LineData
import com.github.mikephil.charting.data.LineDataSet
import com.github.mikephil.charting.interfaces.datasets.ILineDataSet
import com.androidplot.xy.XYPlot



class EmgFragment : Fragment() {

lateinit var emgChart: LineChart
lateinit var fftChart: LineChart
lateinit var emgChart: XYPlot

@RequiresApi(Build.VERSION_CODES.P)
override fun onCreateView(
Expand All @@ -38,34 +30,6 @@ class EmgFragment : Fragment() {

emgChart=view.findViewById(R.id.emgChart)

val emgDataSet=LineDataSet(rawEmgEntries, "Raw EMG")
emgDataSet.lineWidth = 0.4f
emgDataSet.setDrawCircles(false)
emgDataSet.color = color1

val filtredEmgDataSet=LineDataSet(filtredEmgEntries, "Filtred EMG")
filtredEmgDataSet.lineWidth=0.4f
filtredEmgDataSet.setDrawCircles(false)
filtredEmgDataSet.color = color2

var emgDataSets = ArrayList<ILineDataSet>()
emgDataSets.add(emgDataSet)
emgDataSets.add(filtredEmgDataSet)

val emgLineData= LineData(emgDataSets)
emgChart.data = emgLineData
emgChart.axisLeft.axisMinimum = 0.0F
emgChart.axisLeft.axisMaximum = 4095.0F
emgChart.axisRight.isEnabled = false
emgChart.invalidate()

fftChart=view.findViewById(R.id.fftChart)

val fftDataSet=LineDataSet(fftEntries, "Random")

val fftLineData= LineData(fftDataSet)
fftChart.data = fftLineData
fftChart.invalidate()


return view
Expand Down
12 changes: 6 additions & 6 deletions app/src/main/java/com/example/rehabapp/EmgFrame.kt
Original file line number Diff line number Diff line change
Expand Up @@ -3,20 +3,20 @@ package com.example.rehabapp
class EmgFrame(dataArray: UByteArray) {

private var dataArray = UByteArray(4)
private var rawEmg: Float = 0.0F
private var filtredEmg: Float = 0.0F
private var rawEmg: Int = 0
private var filtredEmg: Int = 0

init {
this.dataArray=dataArray
rawEmg = ((dataArray[0].toInt() shl 8) or dataArray[1].toInt()).toFloat()
filtredEmg = ((dataArray[2].toInt() shl 8) or dataArray[3].toInt()).toFloat()
rawEmg = (dataArray[0].toInt() shl 8) or dataArray[1].toInt()
filtredEmg = (dataArray[2].toInt() shl 8) or dataArray[3].toInt()
}

fun getRawEmg(): Float{
fun getRawEmg(): Int{
return rawEmg
}

fun getFiltredEmg(): Float{
fun getFiltredEmg(): Int{
return filtredEmg
}

Expand Down
Loading

0 comments on commit a532b3b

Please sign in to comment.