2
votes

I am currently writing an Android app in Android Studio for the Microsoft band that will record data from the GSR, HR, and Skin Temp.

I have the data for GSR and Skin Temp. currently reading on the application but the rate that it is updated is very slow, especially for the Skin Temp. I was wondering if there was a way to make these sensors send data more frequently because the data I have now has too long of intervals for the purpose I am using it for. Here is my MainPage.java file.

public class MainPage extends Activity {

    private BandClient client = null;
    TextView tvGSR;
    TextView tvHeartRate;
    TextView tvTemperature;

    Button updateTest;

    private BandGsrEventListener mGsrEventListener = new BandGsrEventListener() {
        @Override
        public void onBandGsrChanged(final BandGsrEvent event) {
            if (event != null) {
                appendGSRToUI(String.format("%d kΩ\n", event.getResistance()));
            }
        }
    };

    private BandSkinTemperatureEventListener tempEventListener = new BandSkinTemperatureEventListener() {
        @Override
        public void onBandSkinTemperatureChanged(final BandSkinTemperatureEvent event) {
            if (event != null) {
                appendTempToUI(String.format("%.2f ºF\n", event.getTemperature()*1.800 + 32.00));
            }
        }
    };

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main_page);

        tvGSR = (TextView) findViewById(R.id.tvGSR);
        tvTemperature = (TextView) findViewById(R.id.tvTemperature);

        updateTest = (Button) findViewById(R.id.updateTest);
        updateTest.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                tvGSR.setText("");
                tvTemperature.setText("");
                new GsrSubscriptionTask().execute(); // Put first (runs connection)
                new TempSubscriptionTask().execute();
            }
        });
    }

    @Override
    protected void onResume() {
        super.onResume();
        tvGSR.setText("");
        tvTemperature.setText("");
    }

    @Override
    protected void onPause() {
        super.onPause();
        if (client != null) {
            try {
                client.getSensorManager().unregisterGsrEventListener(mGsrEventListener);
                client.getSensorManager().unregisterSkinTemperatureEventListener(tempEventListener);
            } catch (BandIOException e) {
                appendGSRToUI(e.getMessage());
                appendTempToUI(e.getMessage());
            }
        }
    }

    @Override
    protected void onDestroy() {
        if (client != null) {
            try {
                client.disconnect().await();
            } catch (InterruptedException e) {
                // Do nothing as this is happening during destroy
            } catch (BandException e) {
                // Do nothing as this is happening during destroy
            }
        }
        super.onDestroy();
    }

        private class GsrSubscriptionTask extends AsyncTask<Void, Void, Void> {
        @Override
        protected Void doInBackground(Void... params) {
            try {
                if (getConnectedBandClient()) {
                    int hardwareVersion = Integer.parseInt(client.getHardwareVersion().await());
                    if (hardwareVersion >= 20) {
                        appendGSRToUI("Band is connected.\n");
                        client.getSensorManager().registerGsrEventListener(mGsrEventListener);
                    } else {
                        appendGSRToUI("The Gsr sensor is not supported with your Band version. Microsoft Band 2 is required.\n");
                    }
                } else {
                    appendGSRToUI("Band isn't connected. Check Bluetooth.\n");
                }
            } catch (BandException e) {
                String exceptionMessage="";
                switch (e.getErrorType()) {
                    case UNSUPPORTED_SDK_VERSION_ERROR:
                        exceptionMessage = "SDK Version Outdated.\n";
                        break;
                    case SERVICE_ERROR:
                        exceptionMessage = "GSR Not Supported\n";
                        break;
                    default:
                        exceptionMessage = "Unknown error occured: " + e.getMessage() + "\n";
                        break;
                }
                appendGSRToUI(exceptionMessage);

            } catch (Exception e) {
                appendGSRToUI(e.getMessage());
            }
            return null;
        }
    }

    private class TempSubscriptionTask extends AsyncTask<Void, Void, Void> {
        @Override
        protected Void doInBackground(Void... params) {
            try {
                if (true) {
                    int hardwareVersion = Integer.parseInt(client.getHardwareVersion().await());
                    if (hardwareVersion >= 20) {
                        appendTempToUI("Band is connected.\n");
                        client.getSensorManager().registerSkinTemperatureEventListener(tempEventListener);
                    } else {
                        appendTempToUI("Temperature Not Supported.\n");
                    }
                } else {
                    appendTempToUI("Band isn't connected. Check Bluetooth\n");
                }
            } catch (BandException e) {
                String exceptionMessage="";
                switch (e.getErrorType()) {
                    case UNSUPPORTED_SDK_VERSION_ERROR:
                        exceptionMessage = "SDK Version Outdated\n";
                        break;
                    case SERVICE_ERROR:
                        exceptionMessage = "Microsoft Health App Error\n";
                        break;
                    default:
                        exceptionMessage = "Unknown error occured: " + e.getMessage() + "\n";
                        break;
                }
                appendTempToUI(exceptionMessage);

            } catch (Exception e) {
                appendTempToUI(e.getMessage());
            }
            return null;
        }
    }

    private void appendGSRToUI(final String string) {
        this.runOnUiThread(new Runnable() {
            @Override
            public void run() {
                tvGSR.setText(string);
            }
        });
    }

    private void appendTempToUI(final String string) {
        this.runOnUiThread(new Runnable() {
            @Override
            public void run() {
                tvTemperature.setText(string);
            }
        });
    }

    private boolean getConnectedBandClient() throws InterruptedException, BandException {
        if (client == null) {
            BandInfo[] devices = BandClientManager.getInstance().getPairedBands();
            if (devices.length == 0) {
                appendGSRToUI("Band isn't paired with your phone.\n");
                return false;
            }
            client = BandClientManager.getInstance().create(getBaseContext(), devices[0]);
        } else if (ConnectionState.CONNECTED == client.getConnectionState()) {
            return true;
        }

        appendGSRToUI("Band is connecting...\n");
        return ConnectionState.CONNECTED == client.connect().await();
    }
}
1

1 Answers

1
votes

There is currently no way to get data at a faster rate than provided by the Microsoft Band SDK.

Also, depending on what you want the data for, the skin temperature data might not be useful for you. Looking at the sensors you want to subscribe to, it looks like your application might be health related. But the skin temperature data contains the raw values from one of several thermometers inside of the band. And the band itself will generate some heat internally, so the data is unlikely to represent the skin temperature of the wearer exactly.