package com.eveningoutpost.dexdrip.Models; import android.provider.BaseColumns; import android.util.Log; import com.activeandroid.Model; import com.activeandroid.annotation.Column; import com.activeandroid.annotation.Table; import com.activeandroid.query.Select; import java.util.Date; import java.util.UUID; /** * Created by stephenblack on 11/6/14. */ @Table(name = "TransmitterData", id = BaseColumns._ID) public class TransmitterData extends Model { private final static String TAG = BgReading.class.getSimpleName(); @Column(name = "timestamp", index = true) public long timestamp; @Column(name = "raw_data") public double raw_data; // // @Column(name = "filtered_data") // public double filtered_data; @Column(name = "sensor_battery_level") public int sensor_battery_level; @Column(name = "uuid", index = true) public String uuid; public static TransmitterData create(byte[] buffer, int len, Long timestamp) { StringBuilder data_string = new StringBuilder(); if (len < 6) { return null; }; for (int i = 0; i < len; ++i) { data_string.append((char) buffer[i]); } String[] data = data_string.toString().split("\\s+"); randomDelay(100, 2000); TransmitterData lastTransmitterData = TransmitterData.last(); if (lastTransmitterData != null && lastTransmitterData.raw_data == Integer.parseInt(data[0]) && Math.abs(lastTransmitterData.timestamp - timestamp) < (10000)) { //Stop allowing duplicate data, its bad! return null; } TransmitterData transmitterData = new TransmitterData(); if(data.length > 1) { transmitterData.sensor_battery_level = Integer.parseInt(data[1]); } if (Integer.parseInt(data[0]) < 1000) { return null; } // Sometimes the HM10 sends the battery level and readings in separate transmissions, filter out these incomplete packets! transmitterData.raw_data = Integer.parseInt(data[0]); transmitterData.timestamp = timestamp; transmitterData.uuid = UUID.randomUUID().toString(); transmitterData.save(); return transmitterData; } public static TransmitterData create(int raw_data ,int sensor_battery_level, long timestamp) { randomDelay(100, 2000); TransmitterData lastTransmitterData = TransmitterData.last(); if (lastTransmitterData != null && lastTransmitterData.raw_data == raw_data && Math.abs(lastTransmitterData.timestamp - new Date().getTime()) < (10000)) { //Stop allowing duplicate data, its bad! return null; } TransmitterData transmitterData = new TransmitterData(); transmitterData.sensor_battery_level = sensor_battery_level; transmitterData.raw_data = raw_data ; transmitterData.timestamp = timestamp; transmitterData.uuid = UUID.randomUUID().toString(); transmitterData.save(); return transmitterData; } public static TransmitterData last() { return new Select() .from(TransmitterData.class) .orderBy("_ID desc") .executeSingle(); } public static void randomDelay(float min, float max){ int random = (int)(max * Math.random() + min); try { Log.d("Sleeping ", "for " + random + "ms"); Thread.sleep(random); } catch (InterruptedException e) { Log.e("Random Delay ", "INTERUPTED"); } } }