Chief Delphi

Chief Delphi (http://www.chiefdelphi.com/forums/index.php)
-   FIRST Tech Challenge (http://www.chiefdelphi.com/forums/forumdisplay.php?f=146)
-   -   [FTC]: [FTC]: Using Android's Built in Sensors (http://www.chiefdelphi.com/forums/showthread.php?t=152320)

jkgjur 16-11-2016 00:12

[FTC]: [FTC]: Using Android's Built in Sensors
 
I have been playing around with getting the built in sensors in the ZTE phones to return some values for me. Currently, I just want it to return the different sensors available on the phone. I have written code that will do this, but as soon as I initialized the robot, it gave off this error:

Code:

Can't create handler inside thread that has not called Looper.prepare()
I looked up the error and I tried using the methods that were given. I wrote some more code that could have possibly fixed it, but the same error was returned. This is the current code that I am testing:

My Sensors class
Code:

package org.firstinspires.ftc.robotcontroller.internal.sensor;

import android.app.Activity;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.os.Handler;
import android.os.Looper;

import java.util.List;

public class Sensors extends Activity implements SensorEventListener {

    private final SensorManager sensorManager;

    public Sensors() {
        sensorManager = (SensorManager)getSystemService(SENSOR_SERVICE);
    }

    protected void onResume() {
        super.onResume();
    }

    protected void onPause() {
        super.onPause();
        sensorManager.unregisterListener(this);
    }

    public void onAccuracyChanged(Sensor sensor, int accuracy) {
    }

    public void onSensorChanged(SensorEvent event) {
    }

    public String listAvailableSensors() {
        List<Sensor> sensorList = sensorManager.getSensorList(Sensor.TYPE_ALL); // gets list of all sensors available on the phone
        return sensorList.toString();
    }



}

My TestPhoneSensor class
Code:

package org.firstinspires.ftc.robotcontroller.internal.sensor;

import android.hardware.SensorManager;
import android.os.Handler;
import android.os.Looper;
import android.os.Message;

import com.qualcomm.robotcore.eventloop.opmode.OpMode;

public class TestPhoneSensor extends OpMode {

    Sensors sensor;

    @Override
    public void init() {
        sensor = new Sensors();
    }

    @Override
    public void init_loop() {

    }


    class LooperThread extends Thread { // code block that was supposed to "fix" it
        public Handler mHandler;

        public void run() {
            Looper.prepare();

            mHandler = new Handler() {
                public void handleMessage(Message msg) {

                }
            };

            Looper.loop();
        }
    }



    @Override
    public void loop() {
        new Thread() { // other code block that was supposed to "fix" it
            public void run() {
                new Sensors().runOnUiThread(new Runnable(){

                    @Override
                    public void run(){
                        try {
                            telemetry.addData("Sensor List:", sensor.listAvailableSensors());//Edit,integrate this on the runOnUiThread
                        } catch (Exception e) {
                            telemetry.addData("Error:", e.getStackTrace());
                        }
                    }
                });
            }
        }.start();

    }




}

Any help is appreciated.

batteriesinblac 19-11-2016 21:31

Re: [FTC]: [FTC]: Using Android's Built in Sensors
 
You want the code structured similar to the snippet below

Code:

        // get sensorManager and initialise sensor listeners
                mSensorManager = (SensorManager) hardwareMap.appContext.getSystemService(Context.SENSOR_SERVICE);
                if (mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER) == null ||
                                mSensorManager.getDefaultSensor(Sensor.TYPE_GYROSCOPE) == null ||
                                mSensorManager.getDefaultSensor(Sensor.TYPE_LINEAR_ACCELERATION) == null ||
                                mSensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD) == null) {
                        DbgLog.msg("FTC4855 - For this OpMode a phone with Gyro / Accelerometer / Magnetometer is required");
                        bInitialized = false;
                }
                else {
                        bInitialized = true;

                        initListeners();

                        // wait for one second until gyroscope and magnetometer/accelerometer
                        // data is initialised then scedule the complementary filter task
                        fuseTimer.scheduleAtFixedRate(new calculateFusedOrientationTask(),
                                        1000, TIME_CONSTANT);
                }

...

        // This function registers sensor listeners for the accelerometer, magnetometer and gyroscope.
        private void initListeners(){
                mSensorManager.registerListener(this,
                                mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER),
                                SensorManager.SENSOR_DELAY_FASTEST);

                mSensorManager.registerListener(this,
                                mSensorManager.getDefaultSensor(Sensor.TYPE_GYROSCOPE),
                                SensorManager.SENSOR_DELAY_FASTEST);

                mSensorManager.registerListener(this,
                                mSensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD),
                                SensorManager.SENSOR_DELAY_FASTEST);

                mSensorManager.registerListener(this,
                                mSensorManager.getDefaultSensor(Sensor.TYPE_LINEAR_ACCELERATION),
                                SensorManager.SENSOR_DELAY_FASTEST);
        }



All times are GMT -5. The time now is 17:04.

Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2017, Jelsoft Enterprises Ltd.
Copyright © Chief Delphi