Autore Topic: Accelerometro rileva due cadute nello stesso momento  (Letto 1468 volte)

Offline EmanueleRiso

  • Nuovo arrivato
  • *
  • Post: 1
  • Respect: 0
    • Mostra profilo
Accelerometro rileva due cadute nello stesso momento
« il: 15 Ottobre 2015, 15:34:35 CEST »
0
Buongiorno a tutti. Sto sviluppando un'app per la rilevazione delle cadute tramite accelerometro. Purtroppo sto rilevando un problema nell'uso di questo sensore: quando muovo il telefono per rilevare una caduta il sensore dell'accelerometro, a volte, mi rileva due cadute, anche se fisicamente e' avvenuta una sola. Ho cercato di risolvere il problema disregistrando e riregistrando il listener dopo 5 secondi, purtroppo quello che succede e' che dopo 5 secondi mi rileva una caduta che non e' avvenuta, cioe il sensore rileva due cadute, mi visualizza la prima e poi dopo 5 secondi mi visualizza la seconda.Che cosa sbaglio ? la SDK del progetto e' 16, cosi' come quella del telefono.  questo e' il mio codice:

Codice (Java): [Seleziona]
package it.unipd.dei.rilevatoredicadute;

import android.app.Service;
import android.content.Context;
import android.content.Intent;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.util.Log;
import android.widget.Toast;
//import it.unipd.dei.rilevatoredicadute.ServiceCronometro.MyBinder;



import java.io.DataOutputStream;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.GregorianCalendar;

import android.os.IBinder;
import android.os.Binder;
import android.os.Bundle;
import android.os.CountDownTimer;
//import android.os.Vibrator;

public class FindFall extends Service implements SensorEventListener, LocationListener{
        long it = 0;
        private float xVal;
        private float yVal;
        private float zVal;
        private float xValLast;
        private float yValLast;
        private float zValLast;
        Intent mReceiver = null;
        Intent thActivity = null;
        private float alpha=(float)15;
        String sessione;
        public static final String BROADCAST = "it.unipd.dei.rilevatoredicadute.android.action.broadcast";
        public static final String TEXTVIEW = "Gestione Textview";
        MyDBManager dbF;
        GregorianCalendar calendar;
        //double lat,lon;
        IBinder mBinder = new MyBinderText();
        private SensorManager mysm = null;
        private LocationManager locMg = null;
        private Sensor accel = null;
        private ArrayList<AccelData> acData = new ArrayList<AccelData>(15000); 
        DataOutputStream f = null;
        FileOutputStream fo = null;            
        File file;
        String lastFileName = "null";
        CountDownTimer cdSaveSC = null;
        CountDownTimer cdViewSC = null;
        CountDownTimer cdRitardoSC = null;
        boolean rec, vis = true;
        boolean ritardo = true;
        private double latitude, longitude;
        float[] DatiAccelerometro = new float[3];
        float [] gravity = new float[3];
        int year;
        int month;
        int day;
        String date;
        int k, i, j;
        Location l;
       
        final float delta = 0.8f;
        double ACCELERATION;
       
        public FindFall() {
                super();
        }
       
        @Override
        public void onCreate(){
                super.onCreate();
               
                cdSaveSC = new CountDownTimer(3000L, 500L) {                                   
                        @Override
                        public void onTick(long millisUntilFinished) {
                                // TODO Auto-generated method stub                             
                        }                                      
                        @Override
                        public void onFinish() {
                                rec = true;                                                                    
                        }
                };                     
                cdViewSC = new CountDownTimer(5000L, 500L) {                                   
                        @Override
                        public void onTick(long millisUntilFinished) {
                        // TODO Auto-generated method stub                     
                        }                                      
                        @Override
                        public void onFinish() {
                                vis = true;                                    
                        }
                };
                cdRitardoSC = new CountDownTimer(5000L,500L){
                        @Override
                        public void onTick(long millisUntilFinished) {
                                // TODO Auto-generated method stub     
                                //Log.v("VERIFICA ESECUZIONE COUNTDOWN----->","RITARDO");
                        }                                      
                        @Override
                        public void onFinish() {
                                //ritardo = true;
                                //mysm.registerListener((SensorEventListener) this, accel,  SensorManager.SENSOR_DELAY_NORMAL);
                                registraSensorListener();
                        }
                };
               
                dbF=new MyDBManager(this);
                start();
        }
       
        @Override
        public int onStartCommand (Intent intent, int flags, int startId) {            
                Log.v("findFall", "inizio onStartCommand");    
                sessione = intent.getStringExtra("nome sessione");
                //Log.v("nomesessione service", ""+sessione);
                mReceiver = new Intent(this, MyReceiver.class);                
                if ( !locMg.isProviderEnabled( LocationManager.GPS_PROVIDER ) ) {
                        Toast.makeText(getApplicationContext(), "PER FAVORE, ATTIVARE IL GPS O IL WIFI PER RILEVARE LA POSIZIONE", Toast.LENGTH_SHORT).show();
                        Intent ISetting = new Intent(android.provider.Settings.ACTION_LOCATION_SOURCE_SETTINGS);                       
                        ISetting.addFlags(Intent.FLAG_ACTIVITY_MULTIPLE_TASK);                 
                        ISetting.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);                      
                        ISetting.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_MULTIPLE_TASK);
                        startActivity(ISetting);
                }
                //while (l == null ){
                        //ReSettingGPS();
                //}
                if (l == null){
                         locMg.requestLocationUpdates(LocationManager.NETWORK_PROVIDER,5000,5, this);
                         if (locMg != null) {
                 l = locMg.getLastKnownLocation(LocationManager.NETWORK_PROVIDER);
                 if (l != null) {
                         Log.v("RILEVA POSIZIONE TRAMITE NETWORK","NETWORK "+l.getLatitude()+"-----"+l.getLongitude()+"");
                     latitude = l.getLatitude();
                     longitude = l.getLongitude();
                 }
             }
                }
                cdSaveSC.start();
                cdViewSC.start();
                return START_STICKY;           
        }
       
        @Override
        public void onSensorChanged(SensorEvent event) {
                synchronized (this) {
                        //if(l != null){
                        if(event.sensor.getType() == Sensor.TYPE_ACCELEROMETER){                               
                                if(rec){
                                        gravity[0] = delta * gravity[0] + (1 - delta) * event.values[0];
                                        gravity[1] = delta * gravity[1] + (1 - delta) * event.values[1];
                                        gravity[2] = delta * gravity[2] + (1 - delta) * event.values[2];
                                        //float x = (((int)(event.values[0] * 1000))/100f);
                                        float x = event.values[0] - gravity[0];
                                        float y = event.values[1] - gravity[1];
                                        float z = event.values[2] - gravity[2];
                                        /*float y = event.values[1];
                                        float z = event.values[2];*/

                                        //float y = (((int)(event.values[1] * 1000))/1000f);
                                        //float z = (((int)(event.values[2] * 1000))/1000f)- 9.81f;
                                        long time = System.currentTimeMillis()-it;                                     
                                        if(acData.size() >= 1){                                                                                        
                                                xVal = x;
                                                yVal = y;
                                                zVal = z;
                                                xValLast = acData.get(k).getX();
                                                yValLast = acData.get(k).getY();
                                                zValLast = acData.get(k).getZ();
                                                //if(ritardo)
                                                        caduta();
                                                k++;                                           
                                        }                                      
                                        acData.add(new AccelData(time, x, y, z));
                                        //Log.v("dimensione array accelerometro",""+acData.size()+"");
                                        cdSaveSC.start();
                                }
                               
                                if(vis && !acData.isEmpty() && j<acData.size()){
                                        //xAccViewS.setText("" + acData.get(j).getX());
                                        //yAccViewS.setText("" + acData.get(j).getY());
                                        //zAccViewS.setText("" + acData.get(j).getZ());
                                        //float[] DatiAccelerometro = new float[3];
                                        DatiAccelerometro[0] = acData.get(j).getX();
                                        DatiAccelerometro[1] = acData.get(j).getY();
                                        DatiAccelerometro[2] = acData.get(j).getZ();
                                        thActivity = new Intent();
                                        thActivity.setAction(TEXTVIEW);
                                        thActivity.putExtra("textview", DatiAccelerometro);
                                        sendBroadcast(thActivity);
                                        j+=4;
                                        vis = false;
                                    cdViewSC.start();
                                }
                        }                      
                }
        }

        @Override
        public void onAccuracyChanged(Sensor sensor, int accuracy) {
                //Log.d("Accelerometro", "onAccurancyChanged: " + sensor + ", accuracy: " + accuracy);         
        }      
       
        @Override
        public void onLocationChanged(Location location) {
                        // TODO Auto-generated method stub
                //longitude = l.getLongitude();
                //latitude = l.getLatitude();                  
        }
       
        @Override
        public void onStatusChanged(String provider, int status, Bundle extras) {
                        // TODO Auto-generated method stub                     
        }
       
        @Override
        public void onProviderEnabled(String provider) {
                        // TODO Auto-generated method stub                     
        }
       
        @Override
        public void onProviderDisabled(String provider) {
                        // TODO Auto-generated method stub                     
        }
       
        private void caduta(){
                float x=java.lang.Math.abs(xVal)- java.lang.Math.abs(xValLast);
                float y=java.lang.Math.abs(yVal)- java.lang.Math.abs(yValLast);
                float z=java.lang.Math.abs(zVal)- java.lang.Math.abs(zValLast);                        
               
                ACCELERATION = java.lang.Math.sqrt((java.lang.Math.pow(x, 2))+(java.lang.Math.pow(y, 2))+(java.lang.Math.pow(z, 2)));          
            //if(((java.lang.Math.abs(x))>= alpha) || ((java.lang.Math.abs(y))>= alpha) || ((java.lang.Math.abs(z))>= alpha)){
                if(ACCELERATION >4.0f){
                       
                //Location l = locMg.getLastKnownLocation(LocationManager.GPS_PROVIDER);
                        //double ACCELERATION = java.lang.Math.sqrt((java.lang.Math.pow(x, 2))+(java.lang.Math.pow(y, 2))+(java.lang.Math.pow(z, 2)));
                        Log.v("RADICE QUADRATA ACCELERAZIONE CADUTA","-------- "+ACCELERATION+"------");
                        if(l != null){ 
                                longitude = l.getLongitude();
                                latitude = l.getLatitude();
                                Log.v("longitudine NEWTHIRD",""+longitude+"");
                                Log.v("latitudine       NEWTHIRD",""+latitude+"");
                        }                      
                        mReceiver.putExtra("fall", true);                      
                        mReceiver.putExtra("lat", latitude);
                        mReceiver.putExtra("long", longitude);
                        calendar=new GregorianCalendar();
                       
                        thActivity.setAction(BROADCAST);                       
                        thActivity.putExtra("fall", true);
                       
                        String data = ""+calendar.get(GregorianCalendar.YEAR)+ "/" + (calendar.get(GregorianCalendar.MONTH)+1)+ "/" +calendar.get(GregorianCalendar.DATE);
                        String ora = ""+calendar.get(GregorianCalendar.HOUR_OF_DAY)+ ":" + calendar.get(GregorianCalendar.MINUTE)+ ":" +calendar.get(GregorianCalendar.SECOND);
                        if(dbF.notFallSameHour(sessione, ora)){
                                //Log.v("FIND FALL", "NESSUNA CADUTA CON LA STESSA DATA");
                                dbF.addCaduta(data,ora,Double.toString(latitude),Double.toString(longitude),sessione);                         
                                Log.v("sessione in cui e' avvenuta la caduta",""+sessione);    
                                sendBroadcast(mReceiver);
                                sendBroadcast(thActivity);                                                     
                                if(mysm != null){
                                        mysm.unregisterListener(this);                                 
                                }
                                cdRitardoSC.start();   
                                Log.v("verifica metodo trova ultima caduta","  "+dbF.OraUltimaCaduta(sessione)+"");
                        }
                        //else
                                //Log.v("FIND FALL", "GIA' PRESENTE CADUTA");
                }
        }
       
        private void registraSensorListener(){
                mysm.registerListener((SensorEventListener) this, accel,  SensorManager.SENSOR_DELAY_NORMAL);
        }
       
private void start(){                  
                Log.v("GESTIONE FILE","METODO START");
                it = System.currentTimeMillis();               
                locMg = (LocationManager)getSystemService(Context.LOCATION_SERVICE);
                locMg.requestLocationUpdates(LocationManager.GPS_PROVIDER, 5000, 5, this);             
                l = locMg.getLastKnownLocation(LocationManager.GPS_PROVIDER);
                mysm = (SensorManager) getSystemService(Context.SENSOR_SERVICE);                                       
                accel = mysm.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
                if(mysm.getDefaultSensor(Sensor.TYPE_ACCELEROMETER) != null){
                        mysm.registerListener((SensorEventListener) this, accel,  SensorManager.SENSOR_DELAY_NORMAL);                                          
                        Log.v("SENSORE ACCELEROMETRO----->","ACCELEROMETRO REGISTRATO");                       
                }
}

private void stop(){
        Log.v("GESTIONE FILE","METODO STOP");
        if(mysm != null){
                mysm.unregisterListener(this);         
                Log.v("SENSORE ACCELEROMETRO----->","ACCELEROMETRO STOPPATO");         
        }
        if(locMg != null){
                locMg.removeUpdates(this);
        }      
        if(!(lastFileName.equals(sessione))){
                lastFileName = sessione;                               
                }
               
        try {
                fo = openFileOutput(lastFileName, Context.MODE_PRIVATE);
                fo.close();
        } catch (FileNotFoundException e) {
                Log.e("Impossibile trovare il file ", date, e);
                Toast.makeText( this, "Errore openFileOutput", Toast.LENGTH_LONG).show();
        }catch (IOException e) {
                Log.e("Impossibile chiudere il file", date, e);
                Toast.makeText( this, "Errore chiusura", Toast.LENGTH_LONG).show();
        }              
        if(i < acData.size()){
                try {
                        fo = openFileOutput(sessione, Context.MODE_APPEND);// lastFileName?????
                        while(i < acData.size()){
                                fo.write(("" + acData.get(i).getT() + " " + acData.get(i).getX() + " " + acData.get(i).getY() + " " + acData.get(i).getZ() + '\n').getBytes());
                                i++;
                        }
                } catch (FileNotFoundException e) {
                        Log.e("Impossibile trovare il file ", date, e);
                        Toast.makeText( this, "Errore openFileOutput", Toast.LENGTH_LONG).show();
                }catch (IOException e) {
                        Log.e("Impossibile scrivere sul file", date, e);
                        Toast.makeText( this, "Errore scrittura", Toast.LENGTH_LONG).show();
                }
                try {
                        fo.close();
                } catch (IOException e) {
                        Log.e("Impossibile chiudere il file", date, e);
                        Toast.makeText( this, "Errore chiusura", Toast.LENGTH_LONG).show();
                }
        }
        acData.clear();
        i = j = 0;             
        accel = null;  
}
        @Override
        public IBinder onBind(Intent intent){
                return mBinder;
        }
       
         @Override
         public void onRebind(Intent intent) {   
         super.onRebind(intent);
         }
         
         @Override
         public boolean onUnbind(Intent intent) {
         return true;
         }             
       
 public class MyBinderText extends Binder {
         FindFall getService() {
                 return FindFall.this;
         }
 }
 
        public void onDestroy(){
                super.onDestroy();     
                stop();
                dbF.close();
                cdSaveSC.cancel();
                cdViewSC.cancel();
        }
}

Grazie mille per la vostra disponibilita'