public void run() {
    synchronized (syncObject) {
      while (true) {
        try {
          try {

            if ((state == PAUSED) || (state == STOPPED)) {
              if (state == PAUSED) {
                syncObject.wait(pauseTime);
              } else if (state == STOPPED) {
                syncObject.wait();
              }
              state = RUNNING;
              continue;
            }

            // SENSE
            // sense() is a blocking call and returns when
            // the sensing is complete, the sensorConfig object
            // will have the sampling window, cycle information
            if (GlobalConfig.shouldLog()) {
              Log.d(
                  getLogTag(),
                  "Pulling from: " + SensorUtils.getSensorName(sensor.getSensorType()));
            }

            SensorData sensorData = getCurrentSensorData(false);
            // publish sensed data
            publishData(sensorData);

            // SLEEP
            long samplingInterval =
                (Long) sensor.getSensorConfig(PullSensorConfig.POST_SENSE_SLEEP_LENGTH_MILLIS);
            syncObject.wait(samplingInterval);
          } catch (InterruptedException exp) {
            // ignore
          }
        } catch (ESException e) {
          e.printStackTrace();
          try {
            Thread.sleep(30000);
          } catch (Exception exp) {
            exp.printStackTrace();
          }
        }
      }
    }
  }
  private BluetoothSensor(Context context) {
    super(context);
    btDevices = new ArrayList<ESBluetoothDevice>();
    bluetooth = BluetoothAdapter.getDefaultAdapter();
    if (bluetooth == null) {
      if (GlobalConfig.shouldLog()) {
        Log.d(TAG, "Device does not support Bluetooth");
      }
      return;
    }

    // Create a BroadcastReceiver for ACTION_FOUND, sent when a device is
    // discovered
    receiver =
        new BroadcastReceiver() {

          public void onReceive(Context context, Intent intent) {
            String action = intent.getAction();
            // When discovery finds a device
            if (BluetoothDevice.ACTION_FOUND.equals(action)) {
              // Get the BluetoothDevice object from the Intent
              String deviceAddr =
                  ((BluetoothDevice) intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE))
                      .getAddress();
              String deviceName =
                  ((BluetoothDevice) intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE))
                      .getName();
              int rssi = (int) intent.getShortExtra(BluetoothDevice.EXTRA_RSSI, Short.MIN_VALUE);

              ESBluetoothDevice esBluetoothDevice =
                  new ESBluetoothDevice(System.currentTimeMillis(), deviceAddr, deviceName, rssi);

              if (!(btDevices.contains(esBluetoothDevice))) {
                btDevices.add(esBluetoothDevice);
              }
            } else if (BluetoothAdapter.ACTION_DISCOVERY_FINISHED.equals(action)) {
              cyclesRemaining -= 1;
              if (cyclesRemaining > 0) {
                bluetooth.startDiscovery();
              } else {
                notifySenseCyclesComplete();
              }
            }
          }
        };
  }