Example #1
0
  public void parseResponse(byte[] rd, BluetoothGattCharacteristic characteristic) {
    Log.d(LOGTAG, "parseResponse: " + Simple.getHexBytesToString(rd));

    if ((rd[0] == (byte) 0xff) && (rd.length == 1)) {
      Log.d(LOGTAG, "parseResponse: Invalid command");

      return;
    }

    try {
      JSONObject sensordata = new JSONObject();

      if (rd.length == 11) {
        //
        // Todays data.
        //

        sensordata.put("type", "TodaysData");

        Calendar calendar = Calendar.getInstance();

        calendar.setTime(new Date());
        calendar.set(Calendar.HOUR_OF_DAY, 0);
        calendar.set(Calendar.MINUTE, 0);
        calendar.set(Calendar.SECOND, 0);

        long targetday = calendar.getTimeInMillis();

        sensordata.put("dts", Simple.timeStampAsISO(targetday));

        byte[] data = new byte[4];

        data[0] = 0;
        data[1] = rd[2];
        data[2] = rd[1];
        data[3] = rd[0];

        sensordata.put("stp", BlueTooth.convertBytesToInt(data));

        data[0] = 0;
        data[1] = 0;
        data[2] = rd[7];
        data[3] = rd[6];

        sensordata.put("sle", BlueTooth.convertBytesToInt(data));

        //
        // Store data.
        //

        JSONObject record = Json.clone(sensordata);
        Json.remove(record, "type");

        HealthData.addRecord("sensor", record);
      }

      if (rd.length == 17) {
        //
        // Step history data.
        //

        sensordata.put("type", "StepHistoryData");

        int day = rd[0];

        Calendar calendar = Calendar.getInstance();

        calendar.setTime(new Date());
        calendar.set(Calendar.HOUR_OF_DAY, 0);
        calendar.set(Calendar.MINUTE, 0);
        calendar.set(Calendar.SECOND, 0);

        long targetday = calendar.getTimeInMillis();

        targetday /= 1000L;
        targetday -= (day + 1) * 86400;
        targetday *= 1000L;

        sensordata.put("dts", Simple.timeStampAsISO(targetday));

        byte[] data = new byte[4];

        data[0] = 0;
        data[1] = rd[3];
        data[2] = rd[2];
        data[3] = rd[1];

        sensordata.put("stp", BlueTooth.convertBytesToInt(data));

        data[0] = 0;
        data[1] = 0;
        data[2] = rd[5];
        data[3] = rd[4];

        sensordata.put("ext", BlueTooth.convertBytesToInt(data));

        data[0] = 0;
        data[1] = (byte) (rd[8] & 0x7f);
        data[2] = rd[7];
        data[3] = rd[6];

        sensordata.put("goa", BlueTooth.convertBytesToInt(data));
        sensordata.put("gou", ((rd[8] & 0x80) == 0) ? 0 : 1);

        data[0] = 0;
        data[1] = 0;
        data[2] = rd[10];
        data[3] = rd[9];

        sensordata.put("std", BlueTooth.convertBytesToInt(data) / 100f);
        sensordata.put("diu", ((rd[13] & 0x80) == 0) ? 0 : 1);

        data[0] = 0;
        data[1] = (byte) (rd[13] & 0x7f);
        data[2] = rd[12];
        data[3] = rd[11];

        sensordata.put("cps", BlueTooth.convertBytesToInt(data) / 100f);

        data[0] = 0;
        data[1] = rd[16];
        data[2] = rd[15];
        data[3] = rd[14];

        sensordata.put("BMR", BlueTooth.convertBytesToInt(data) / 100f);

        //
        // Store data.
        //

        JSONObject record = Json.clone(sensordata);
        Json.remove(record, "type");

        HealthData.addRecord("sensor", record);

        String lastSavedDay = Simple.timeStampAsISO(targetday);

        Json.put(syncStatus, "lastSavedDay", lastSavedDay);

        HealthData.putStatus("sensor", syncStatus);
      }

      if (rd.length == 20) {
        //
        // Sleep history data.
        //

        sensordata.put("type", "SleepHistoryData");

        int position = (rd[0] & 0x7f) + (rd[1] << 7);

        long tenminutes = 10 * 60;
        long postime = ((new Date().getTime() / 1000L) / tenminutes) * tenminutes;
        postime -= position * tenminutes;
        postime *= 1000L;

        sensordata.put("dts", Simple.timeStampAsISO(postime));

        byte[] sd = new byte[18];

        int cnt = 0;
        for (int inx = rd.length - 1; inx >= 2; inx--) sd[cnt++] = rd[inx];

        sensordata.put("sda", Simple.getHexBytesToString(sd));

        //
        // Store data.
        //

        JSONObject record = Json.clone(sensordata);
        Json.remove(record, "type");

        HealthData.addRecord("sensor", record);

        String lastSavedAct = Simple.timeStampAsISO(postime);

        Json.put(syncStatus, "lastSavedAct", lastSavedAct);

        HealthData.putStatus("sensor", syncStatus);
      }

      JSONObject data = new JSONObject();
      data.put("sensor", sensordata);

      if (parent.dataCallback != null)
        parent.dataCallback.onBluetoothReceivedData(parent.deviceName, data);
    } catch (JSONException ex) {
      OopsService.log(LOGTAG, ex);
    }
  }