Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
24 commits
Select commit Hold shift + click to select a range
05a2533
added the data from the EDA sensor
ziaUbi May 15, 2024
b64d101
minor fix
ziaUbi May 15, 2024
9495cb7
minor fix
ziaUbi May 16, 2024
0e6356f
added foreground permission
ziaUbi May 16, 2024
16b4041
minor fix
ziaUbi May 16, 2024
ab0655a
fix counter
ziaUbi May 16, 2024
e8497d3
changed the sensor filter
ziaUbi May 17, 2024
c8f3c22
Merge branch 'main' into edaSensor
ziaUbi May 17, 2024
b61cd19
merge of main
ziaUbi May 17, 2024
773a808
Merge branch 'edaSensor' into finalTest
ziaUbi May 17, 2024
39e6660
Merge remote-tracking branch 'origin/main' into finalTest
ziaUbi May 17, 2024
36aa9dd
palette modified, now its like depressing contemporary mcdonald :D
MenchiniDev May 18, 2024
adf862b
Minor changes for dubugging
FrAle01 May 19, 2024
935087d
Merge remote-tracking branch 'origin/finalTest' into finalTest
FrAle01 May 19, 2024
a28bcfe
Solved bug in EEG data sender, increased sampling rate from mindrove
FrAle01 May 19, 2024
214bacf
some upgrades, changed the tipe of landrmarks from list to single dat…
MenchiniDev May 19, 2024
6f86e98
Centered buttons in login and data collection fragments
FrAle01 May 20, 2024
bceaf38
Unified color style
FrAle01 May 20, 2024
6d3c9dc
Solved face fragmet issues with null values
FrAle01 May 20, 2024
d49b2d5
Changed line color for graphs
FrAle01 May 20, 2024
edb92be
Solved minor bugs (EEG thread, BT connection)
FrAle01 May 20, 2024
e926fa7
Solved minor bugs related to EEG data in second tests
FrAle01 May 21, 2024
37ab792
Merge remote-tracking branch 'origin/main' into finalTest
FrAle01 May 21, 2024
d415155
Removed git CONFLIT tags from file
FrAle01 May 21, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions .idea/deploymentTargetSelector.xml

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

54 changes: 42 additions & 12 deletions app/src/main/java/com/mobile/narciso/CameraFragment.kt
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ import android.graphics.Canvas
import android.graphics.Color
import android.graphics.Matrix
import android.graphics.Paint
import android.graphics.PointF
import android.os.Bundle
import android.util.Log
import android.view.LayoutInflater
Expand Down Expand Up @@ -39,16 +40,28 @@ import java.util.concurrent.ExecutorService
import java.util.concurrent.Executors

data class FaceLandmarks(
val leftEye: FaceLandmark?,
val rightEye: FaceLandmark?,
val noseBase: FaceLandmark?,
val leftEar: FaceLandmark?,
val rightEar: FaceLandmark?,
val mouthLeft: FaceLandmark?,
val mouthRight: FaceLandmark?,
val mouthBottom: FaceLandmark?,
val leftCheek: FaceLandmark?,
val rightCheek: FaceLandmark?
var leftEye: FaceLandmark? = null,
var rightEye: FaceLandmark? = null,
var noseBase: FaceLandmark? = null,
var leftEar: FaceLandmark? = null,
var rightEar: FaceLandmark? = null,
var mouthLeft: FaceLandmark? = null,
var mouthRight: FaceLandmark? = null,
var mouthBottom: FaceLandmark? = null,
var leftCheek: FaceLandmark? = null,
var rightCheek: FaceLandmark? = null,
)
data class FaceLandmarkClean(
var leftEye: PointF? = PointF(0f, 0f),
var rightEye: PointF? = PointF(0f, 0f),
var noseBase: PointF? = PointF(0f, 0f),
var leftEar: PointF? = PointF(0f, 0f),
var rightEar: PointF? = PointF(0f, 0f),
var mouthLeft: PointF? = PointF(0f, 0f),
var mouthRight: PointF? = PointF(0f, 0f),
var mouthBottom: PointF? = PointF(0f, 0f),
var leftCheek: PointF? = PointF(0f, 0f),
var rightCheek: PointF? = PointF(0f, 0f),
)

class Faces {
Expand Down Expand Up @@ -76,6 +89,7 @@ class CameraFragment : Fragment() {
private val faceDetector = FaceDetection.getClient(options)
var imageRotation: Int = 0
val faceFinded = Faces()
val landmarkTSaved = FaceLandmarkClean()

override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
Expand Down Expand Up @@ -255,6 +269,8 @@ class CameraFragment : Fragment() {
//Create cropped image to get only the face
val faceCropImage = Bitmap.createBitmap(rotatedBitmap, startingPointLeft, startingPointTop,
width, height)

Log.d("CAMERAFRAGMENT", "Face detected")
faceFinded.faceLandmarks = faces.map { detectedFace ->
FaceLandmarks(
leftEye = detectedFace.getLandmark(FaceLandmark.LEFT_EYE),
Expand All @@ -269,15 +285,29 @@ class CameraFragment : Fragment() {
rightCheek = detectedFace.getLandmark(FaceLandmark.RIGHT_CHEEK)
)
}
landmarkTSaved.leftEye = faceFinded.faceLandmarks?.get(0)?.leftEye?.position
landmarkTSaved.rightEye = faceFinded.faceLandmarks?.get(0)?.rightEye?.position
landmarkTSaved.noseBase = faceFinded.faceLandmarks?.get(0)?.noseBase?.position
landmarkTSaved.leftEar = faceFinded.faceLandmarks?.get(0)?.leftEar?.position
landmarkTSaved.rightEar = faceFinded.faceLandmarks?.get(0)?.rightEar?.position
landmarkTSaved.mouthLeft = faceFinded.faceLandmarks?.get(0)?.mouthLeft?.position
landmarkTSaved.mouthRight = faceFinded.faceLandmarks?.get(0)?.mouthRight?.position
landmarkTSaved.mouthBottom = faceFinded.faceLandmarks?.get(0)?.mouthBottom?.position
landmarkTSaved.leftCheek = faceFinded.faceLandmarks?.get(0)?.leftCheek?.position
landmarkTSaved.rightCheek = faceFinded.faceLandmarks?.get(0)?.rightCheek?.position


Log.d("CAMERAFRAGMENT FaceLandmarks", landmarkTSaved.leftEye.toString())

drawLandmarks(faceCropImage, faceFinded.faceLandmarks!!)
}
}
.addOnFailureListener { e ->
Log.e("Exception:", e.toString())
}
}
fun getFaceLandmarks(): List<FaceLandmarks>? {
return faceFinded.faceLandmarks
fun getFaceLandmarks(): FaceLandmarkClean {
return landmarkTSaved
}

fun drawLandmarks(bitmap: Bitmap, faceLandmarks: List<FaceLandmarks>) {
Expand Down
103 changes: 73 additions & 30 deletions app/src/main/java/com/mobile/narciso/DataCollection.kt
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.ImageView
import android.widget.Toast
import androidx.core.app.ActivityCompat
import androidx.core.content.ContextCompat
import androidx.fragment.app.Fragment
Expand Down Expand Up @@ -51,7 +52,10 @@ class DataCollection : Fragment() {

//array of array of facelandmarks: the first iterator moves throug different data
//the second selects the single face's parts of a single istance of data
private var FaceLandmarksList: ArrayList<List<FaceLandmarks>> = ArrayList()
private var FaceLandmarksList: ArrayList<FaceLandmarks> = ArrayList()

private val firebaseDataHelp = FirestoreDataDAO()


private var imgUsed: ArrayList<String> = ArrayList()

Expand All @@ -62,7 +66,6 @@ class DataCollection : Fragment() {
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View {
MainActivity.serverManager.start()

// create a list of random image names to display
val imageNames = (1..479).map { String.format("a%03d", it) }.shuffled()
Expand All @@ -74,14 +77,24 @@ class DataCollection : Fragment() {
if(count < 11){
imgUsed.add(imageName)
count++
Log.d("Image list", "${imageName}")
}
images.add(imageId)
}
Log.d("Data coll image", "${imgUsed[imagesSeen]}")
MainActivity.currentImageIndex = imgUsed[imagesSeen]
Log.d("Main activity image", "${MainActivity.currentImageIndex}")

try{
MainActivity.serverManager.start()
}catch (e: Exception){
Log.w("EEG Thread", "serverManager thread already active: $e")
}



// add the camera fragment to the fragment container
val cameraFragment = CameraFragment() // Crea una nuova istanza del tuo CameraFragment
// val cameraFragment = CameraFragment() // Crea una nuova istanza del tuo CameraFragment
childFragmentManager.beginTransaction().apply {
replace(R.id.child_fragment_container, cameraFragment)
commit()
Expand All @@ -102,9 +115,13 @@ class DataCollection : Fragment() {
private fun changeImage() {
currentImageIndex = (currentImageIndex + 1) % images.size
binding.viewPager.currentItem = currentImageIndex
Log.d("New image", "$currentImageIndex")

//saving current id on the data from the helmet
MainActivity.currentImageIndex = imgUsed[imagesSeen]
Log.d("Data coll new image", "${imgUsed[imagesSeen]}")
Log.d("Main activity new image", "${MainActivity.currentImageIndex}")

}

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
Expand Down Expand Up @@ -148,19 +165,42 @@ class DataCollection : Fragment() {
//saving the current vote in the list of helmet's data
MainActivity.currentVote = DONTLIKEVALUE
takeDatafromCamWatch(DONTLIKEVALUE, cameraFragment.getFaceLandmarks())
Log.d("DATA COLLECTION", "${cameraFragment.getFaceLandmarks().rightEye.toString()}")
checkCounter()
}

//invio i dati al fragment Datatesting (Result)
binding.goToDataTesting.setOnClickListener {


MainActivity.serverManager.stop()

val firebaseDataHelp = FirestoreDataDAO()
val sessionUser = SessionManager(requireContext()).username
firebaseDataHelp.sendData(sessionUser!!, sensorsData, MainActivity.EEGsensordataList)
Log.d("SIZES", "sensor data size: ${sensorsData.size}")
Log.d("SIZES", "hr data size: ${HRsensorDataList.size}")
Log.d("SIZES", "ppg data size: ${PPGsensorDataList.size}")
Log.d("SIZES", "eda data size: ${EDAsensorDataList.size}")

if (HRsensorDataList.isNotEmpty() && PPGsensorDataList.isNotEmpty() && EDAsensorDataList.isNotEmpty()){
var count = 0
while(count < sensorsData.size){
try{
sensorsData[count] = sensorsData[count].copy(HearthRate = HRsensorDataList[count])
sensorsData[count] = sensorsData[count].copy(PPG = PPGsensorDataList[count])
sensorsData[count] = sensorsData[count].copy(EDA = EDAsensorDataList[count])
}catch (e: Exception){
Log.w("Watch sensors", "NOT all data got from watch, $e")
}
count++
}
}

try{
MainActivity.serverManager.stop()
}catch (e: Exception){
Log.d("EEG thread", "EEG thread is not active $e")
}
firebaseDataHelp.sendData(sessionUser!!, sensorsData, MainActivity.EEGsensordataList)
if(!MainActivity.newTestToken){
MainActivity.newTestToken= true
}
//string conversion is mandatory, Bundle doesn't accept float data
val HRsensorDataListString = HRsensorDataList.map { it.toString() } as ArrayList<String>
val PPGsensorDataListString = PPGsensorDataList.map { it.toString() } as ArrayList<String>
Expand All @@ -186,6 +226,7 @@ class DataCollection : Fragment() {
val sessionUser = SessionManager(requireContext()).username

if (imagesSeen == 10) {
Toast.makeText(requireContext(), "Change wifi connection to send data on cloud!", Toast.LENGTH_SHORT).show()

binding.Beauty.visibility = View.GONE
binding.NoBeauty.visibility = View.GONE
Expand All @@ -205,52 +246,54 @@ class DataCollection : Fragment() {
private val sensorDataReceiver = object : BroadcastReceiver() {
override fun onReceive(context: Context, intent: Intent) {
HRsensorDataList.add(intent.getFloatExtra("HRsensorData", 0.0f))
singleTestData = singleTestData.copy( HearthRate = intent.getFloatExtra("HRsensorData", 0.0f))
Log.d("Check data", "HR: ${singleTestData?.HearthRate}")
// singleTestData = singleTestData.copy( HearthRate = intent.getFloatExtra("HRsensorData", 0.0f))
Log.d("Check data", "HR: ${HRsensorDataList}")

PPGsensorDataList.add(intent.getFloatExtra("PPGsensorData", 0.0f))
singleTestData = singleTestData.copy( PPG = intent.getFloatExtra("PPGsensorData", 0.0f))
Log.d("Check data", "PPG: ${singleTestData?.PPG}")
// singleTestData = singleTestData.copy( PPG = intent.getFloatExtra("PPGsensorData", 0.0f))
Log.d("Check data", "PPG: ${PPGsensorDataList}")

EDAsensorDataList.add(intent.getFloatExtra("EDAsensorData", 0.0f))
singleTestData = singleTestData.copy( EDA = intent.getFloatExtra("EDAsensorData", 0.0f))
Log.d("Check data", "EDA: ${singleTestData?.EDA}")
// singleTestData = singleTestData.copy( EDA = intent.getFloatExtra("EDAsensorData", 0.0f))
Log.d("Check data", "EDA: ${EDAsensorDataList}")


}
}

fun takeDatafromCamWatch(Beauty: Int, faceLandmarks: List<FaceLandmarks>?): Boolean {
fun takeDatafromCamWatch(Beauty: Int, faceLandmarks: FaceLandmarkClean): Boolean {
//taking sensor data and storing in a List that will be sento to cloud and DataTesting
val intent = Intent(requireContext(), RequestSensors::class.java)
requireContext().startService(intent)
//Toast.makeText(requireContext(), "SEND DATA: DATI RICEVUTI!", Toast.LENGTH_SHORT).show()
faceLandmarks?.forEach { faceLandmarks ->
Log.d("left eye","Left Eye: ${faceLandmarks.leftEye}")
Log.d("right eye","Right Eye: ${faceLandmarks.rightEye}")
Log.d("nose base","Nose Base: ${faceLandmarks.noseBase}")
Log.d("left ear","Left Ear: ${faceLandmarks.leftEar}")
Log.d("right ear","Right Ear: ${faceLandmarks.rightEar}")
Log.d("mouth left","Mouth Left: ${faceLandmarks.mouthLeft}")
Log.d("mouth right","Mouth Right: ${faceLandmarks.mouthRight}")
Log.d("mouth bottom","Mouth Bottom: ${faceLandmarks.mouthBottom}")
Log.d("left cheek","Left Cheek: ${faceLandmarks.leftCheek}")
Log.d("right cheek","Right Cheek: ${faceLandmarks.rightCheek}")
}
Log.d("Face data", "rightEye: ${faceLandmarks.rightEye}")
Log.d("Face data", "leftEye: ${faceLandmarks.leftEye}")
Log.d("Face data", "rightEar: ${faceLandmarks.rightEar}")
Log.d("Face data", "leftEar: ${faceLandmarks.leftEar}")
Log.d("Face data", "noseBase: ${faceLandmarks.noseBase}")
Log.d("Face data", "leftCheek: ${faceLandmarks.leftCheek}")
Log.d("Face data", "rightCheek: ${faceLandmarks.rightCheek}")
Log.d("Face data", "mouthLeft: ${faceLandmarks.mouthLeft}")
Log.d("Face data", "mouthRight: ${faceLandmarks.mouthRight}")
Log.d("Face data", "mouthBottom: ${faceLandmarks.mouthBottom}")

//adding single landmarks group to the list
if (faceLandmarks != null) {
FaceLandmarksList.add(faceLandmarks)
Log.d("Face data check", "Got in IF case")
singleTestData = singleTestData.copy( faceData = faceLandmarks)
Log.d("Face data collected", "${singleTestData.faceData}")
Log.d("leftear", faceLandmarks.leftEar.toString())
}else{
Log.d("Face data check", "Face is null")
}
singleTestData = singleTestData.copy( imageID = imgUsed[imagesSeen])
singleTestData = singleTestData.copy( imageID = imgUsed[imagesSeen-1]) // imagesSeen already updated
singleTestData = singleTestData.copy( likability = Beauty)


return true
}
override fun onDestroyView() {
super.onDestroyView()

requireActivity().unregisterReceiver(sensorDataReceiver)
_binding = null
}
Expand Down
7 changes: 5 additions & 2 deletions app/src/main/java/com/mobile/narciso/DataTesting.kt
Original file line number Diff line number Diff line change
Expand Up @@ -94,7 +94,7 @@ class DataTesting : Fragment() {
//TODO display all plots of data collected during dataCollection session


createGraph(lineGraphView1,HRsensorDataList, "Hear Rate")
createGraph(lineGraphView1,HRsensorDataList, "Hearth Rate")
createGraph(lineGraphView2,PPGsensorDataList, "PPG value")
createGraph(lineGraphView3,EDAsensorDataList, "EDA value")

Expand Down Expand Up @@ -130,9 +130,12 @@ class DataTesting : Fragment() {
lineGraphView.viewport.setScrollableY(true)

// on below line we are setting color for series.
series.color = binding.root.resources.getColor(R.color.colorPrimary2)
series.color = binding.root.resources.getColor(R.color.colorPrimary)
val gridLabelRenderer = lineGraphView.gridLabelRenderer
gridLabelRenderer.gridColor = binding.root.resources.getColor(R.color.screen_background_color2)

lineGraphView.title = s
lineGraphView.titleColor = binding.root.resources.getColor(R.color.screen_background_color2)

lineGraphView.addSeries(series)
}
Expand Down
Loading