static boolean CheckCRC16(byte[] data, int start, int size) { long crc = computeCRC16(data, start, size); return crc == ((data[start+1]& 0xFF) * 256 + (data[start] & 0xff)); }
public static boolean verify(byte[] data) { if(data.length < 344) { Log.e(TAG, "Must have at least 344 bytes for libre data"); return false; } boolean checksum_ok = CheckCRC16(data, 0 ,24); checksum_ok &= CheckCRC16(data, 24 ,296); checksum_ok &= CheckCRC16(data, 320 ,24); return checksum_ok; }
public static String decodeSerialNumberKey(byte[] input) { byte[] serialBuffer = new byte[3+8]; System.arraycopy(input,0, serialBuffer, 3, 8); return decodeSerialNumber( serialBuffer); }
public static boolean HandleGoodReading(String tagId, byte[] data1, final long CaptureDateTime, boolean allowUpload ) { final boolean checksum_ok = LibreUtils.verify(data1); if (!checksum_ok) { return false; if(!LibreUtils.isSensorReady(data1[4])) { Log.e(TAG, "Sensor is not ready, Ignoring reading!"); return true;
String SensorSn = LibreUtils.decodeSerialNumber(buffer); if (LibreUtils.isSensorReady(buffer[POSITION_OF_SENSOR_STATUS_BYTE])) { currentCommand = ACK_ON_WAKEUP_ANSWER; Log.i(TAG, "Send ACK");
static void AreWeDone() { if(s_recviedEnoughData) { // This reading already ended return; } if(s_acumulatedSize < 344 + TOMATO_HEADER_LENGTH + 1) { return; } byte[] data = Arrays.copyOfRange(s_full_data, TOMATO_HEADER_LENGTH, TOMATO_HEADER_LENGTH+344); s_recviedEnoughData = true; long now = JoH.tsl(); // Important note, the actual serial number is 8 bytes long and starts at addresses 5. String SensorSn = LibreUtils.decodeSerialNumberKey(Arrays.copyOfRange(s_full_data, 5, 13)); boolean checksum_ok = NFCReaderX.HandleGoodReading(SensorSn, data, now, true); Log.e(TAG, "We have all the data that we need " + s_acumulatedSize + " checksum_ok = " + checksum_ok + HexDump.dumpHexString(data)); if(!checksum_ok) { throw new RuntimeException(CHECKSUM_FAILED); } PersistentStore.setString("Tomatobattery", Integer.toString(s_full_data[13])); Pref.setInt("bridge_battery", s_full_data[13]); PersistentStore.setString("TomatoHArdware",HexDump.toHexString(s_full_data,16,2)); PersistentStore.setString("TomatoFirmware",HexDump.toHexString(s_full_data,14,2)); PersistentStore.setString("LibreSN", SensorSn); }
boolean ChecksumOk = LibreUtils.verify(libreBlockEntry.blockbytes); if(!ChecksumOk) { Log.e(TAG, "Not uploading packet with badchecksum");
public static boolean HandleGoodReading(String tagId, byte[] data1, final long CaptureDateTime, boolean allowUpload ) { final boolean checksum_ok = LibreUtils.verify(data1); if (!checksum_ok) { return false; if(!LibreUtils.isSensorReady(data1[4])) { Log.e(TAG, "Sensor is not ready, Ignoring reading!"); return true;
String SensorSn = LibreUtils.decodeSerialNumber(buffer); if (LibreUtils.isSensorReady(buffer[POSITION_OF_SENSOR_STATUS_BYTE])) { currentCommand = ACK_ON_WAKEUP_ANSWER; Log.i(TAG, "Send ACK");
static void AreWeDone() { if(s_recviedEnoughData) { // This reading already ended return; } if(s_acumulatedSize < 344 + TOMATO_HEADER_LENGTH + 1) { return; } byte[] data = Arrays.copyOfRange(s_full_data, TOMATO_HEADER_LENGTH, TOMATO_HEADER_LENGTH+344); s_recviedEnoughData = true; long now = JoH.tsl(); // Important note, the actual serial number is 8 bytes long and starts at addresses 5. String SensorSn = LibreUtils.decodeSerialNumberKey(Arrays.copyOfRange(s_full_data, 5, 13)); boolean checksum_ok = NFCReaderX.HandleGoodReading(SensorSn, data, now, true); Log.e(TAG, "We have all the data that we need " + s_acumulatedSize + " checksum_ok = " + checksum_ok + HexDump.dumpHexString(data)); if(!checksum_ok) { throw new RuntimeException(CHECKSUM_FAILED); } PersistentStore.setString("Tomatobattery", Integer.toString(s_full_data[13])); Pref.setInt("bridge_battery", s_full_data[13]); PersistentStore.setString("TomatoHArdware",HexDump.toHexString(s_full_data,16,2)); PersistentStore.setString("TomatoFirmware",HexDump.toHexString(s_full_data,14,2)); PersistentStore.setString("LibreSN", SensorSn); }
boolean ChecksumOk = LibreUtils.verify(libreBlockEntry.blockbytes); if(!ChecksumOk) { Log.e(TAG, "Not uploading packet with badchecksum");
static boolean CheckCRC16(byte[] data, int start, int size) { long crc = computeCRC16(data, start, size); return crc == ((data[start+1]& 0xFF) * 256 + (data[start] & 0xff)); }
public static boolean HandleGoodReading(String tagId, byte[] data1, final long CaptureDateTime, boolean allowUpload ) { final boolean checksum_ok = LibreUtils.verify(data1); if (!checksum_ok) { return false; if(!LibreUtils.isSensorReady(data1[4])) { Log.e(TAG, "Sensor is not ready, Ignoring reading!"); return true;
String SensorSn = LibreUtils.decodeSerialNumber(buffer); if (LibreUtils.isSensorReady(buffer[POSITION_OF_SENSOR_STATUS_BYTE])) { currentCommand = ACK_ON_WAKEUP_ANSWER; Log.i(TAG, "Send ACK");
static void AreWeDone() { if(s_recviedEnoughData) { // This reading already ended return; } if(s_acumulatedSize < 344 + TOMATO_HEADER_LENGTH + 1) { return; } byte[] data = Arrays.copyOfRange(s_full_data, TOMATO_HEADER_LENGTH, TOMATO_HEADER_LENGTH+344); s_recviedEnoughData = true; long now = JoH.tsl(); // Important note, the actual serial number is 8 bytes long and starts at addresses 5. String SensorSn = LibreUtils.decodeSerialNumberKey(Arrays.copyOfRange(s_full_data, 5, 13)); boolean checksum_ok = NFCReaderX.HandleGoodReading(SensorSn, data, now, true); Log.e(TAG, "We have all the data that we need " + s_acumulatedSize + " checksum_ok = " + checksum_ok + HexDump.dumpHexString(data)); if(!checksum_ok) { throw new RuntimeException(CHECKSUM_FAILED); } PersistentStore.setString("Tomatobattery", Integer.toString(s_full_data[13])); Pref.setInt("bridge_battery", s_full_data[13]); PersistentStore.setString("TomatoHArdware",HexDump.toHexString(s_full_data,16,2)); PersistentStore.setString("TomatoFirmware",HexDump.toHexString(s_full_data,14,2)); PersistentStore.setString("LibreSN", SensorSn); }
public static String decodeSerialNumberKey(byte[] input) { byte[] serialBuffer = new byte[3+8]; System.arraycopy(input,0, serialBuffer, 3, 8); return decodeSerialNumber( serialBuffer); }
public static boolean verify(byte[] data) { if(data.length < 344) { Log.e(TAG, "Must have at least 344 bytes for libre data"); return false; } boolean checksum_ok = CheckCRC16(data, 0 ,24); checksum_ok &= CheckCRC16(data, 24 ,296); checksum_ok &= CheckCRC16(data, 320 ,24); return checksum_ok; }
static boolean CheckCRC16(byte[] data, int start, int size) { long crc = computeCRC16(data, start, size); return crc == ((data[start+1]& 0xFF) * 256 + (data[start] & 0xff)); }
@Override protected void onPostExecute(Tag tag) { Log.d(TAG, "onPostExecute called"); try { if (tag == null) return; if (!NFCReaderX.useNFC()) return; if (succeeded) { long now = JoH.tsl(); String SensorSn = LibreUtils.decodeSerialNumberKey(tag.getId()); boolean checksum_ok = HandleGoodReading(SensorSn, data, now); if(checksum_ok == false) { Log.e(TAG, "Read data but checksum is wrong"); } PersistentStore.setString("LibreSN", SensorSn); } else { Log.d(TAG, "Scan did not succeed so ignoring buffer"); } Home.startHomeWithExtra(context, null, null); } catch (IllegalStateException e) { Log.e(TAG, "Illegal state exception in postExecute: " + e); } finally { tag_discovered = false; // right place? Home.staticBlockUI(context, false); } }
public static String decodeSerialNumberKey(byte[] input) { byte[] serialBuffer = new byte[3+8]; System.arraycopy(input,0, serialBuffer, 3, 8); return decodeSerialNumber( serialBuffer); }