From a437ba38a5111e4f25503ba4c494b859268f8ab6 Mon Sep 17 00:00:00 2001 From: Nikolay Viguro Date: Wed, 19 Nov 2014 12:28:42 +0300 Subject: [PATCH] =?UTF-8?q?=D0=9A=D0=BE=D0=BC=D0=B0=D0=BD=D0=B4=D0=B0=20bi?= =?UTF-8?q?nd=20=D1=82=D0=B0=D0=BA=20=D0=B6=D0=B5=20=D0=BF=D1=80=D0=B8?= =?UTF-8?q?=D0=BD=D0=B8=D0=BC=D0=B0=D0=B5=D1=82=20=D1=82=D0=B8=D0=BF=20?= =?UTF-8?q?=D0=B4=D0=B0=D1=82=D1=87=D0=B8=D0=BA=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ru/iris/noolite4j/receiver/RX2164.java | 88 ++++++++++--------- 1 file changed, 46 insertions(+), 42 deletions(-) diff --git a/src/main/java/ru/iris/noolite4j/receiver/RX2164.java b/src/main/java/ru/iris/noolite4j/receiver/RX2164.java index 7c91cfc..e41ed33 100644 --- a/src/main/java/ru/iris/noolite4j/receiver/RX2164.java +++ b/src/main/java/ru/iris/noolite4j/receiver/RX2164.java @@ -225,7 +225,16 @@ else if (dataFormat == DataFormat.FOUR_BYTE.ordinal()) { break; case BIND: notification.setType(CommandType.BIND); - addTempHumiData(notification, buf); + + /** + * Если привязывается датчик, то он передает дополнительно свой тип + */ + if(notification.getDataFormat() == DataFormat.ONE_BYTE) + { + // Тип сенсора + notification.addData("sensortype", SensorType.values()[(buf.get(4) & 0xff)]); + } + watcher.onNotification(notification); break; case UNBIND: @@ -254,7 +263,42 @@ else if (dataFormat == DataFormat.FOUR_BYTE.ordinal()) { break; case TEMP_HUMI: notification.setType(CommandType.TEMP_HUMI); - notification = addTempHumiData(notification, buf); + + /** + * Информация о температуре, типе датчика и состоянии батареи + * размазана по 2 байтам + */ + + int intTemp = ((buf.get(5) & 0x0f) << 8) + (buf.get(4) & 0xff); + + if (intTemp >= 0x800) + { + intTemp = intTemp - 0x1000; + } + + // Приводим к градусам Цельсия + double temp = (double)intTemp / 10; + + // Состояни батареи + notification.addData("battery", BatteryState.values()[(buf.get(5) >> 7) & 1]); + + // Температура + notification.addData("temp", temp); + + // Тип сенсора + notification.addData("sensortype", SensorType.values()[((buf.get(5) >> 4) & 7)]); + + /** + * В третьем байте данных хранится влажность + */ + notification.addData("humi", buf.get(6) & 0xff); + + /** + * В четвертом байте данных хранятся данные о состоянии аналогового датчика + * По умолчанию - unsigned byte (255) + */ + notification.addData("analog", buf.get(7) & 0xff); + watcher.onNotification(notification); break; @@ -279,44 +323,4 @@ else if (dataFormat == DataFormat.FOUR_BYTE.ordinal()) { } }).start(); } - - private Notification addTempHumiData(Notification notification, ByteBuffer buf) { - - /** - * Информация о температуре, типе датчика и состоянии батареи - * размазана по 2 байтам - */ - - int intTemp = ((buf.get(5) & 0x0f) << 8) + (buf.get(4) & 0xff); - - if (intTemp >= 0x800) - { - intTemp = intTemp - 0x1000; - } - - // Приводим к градусам Цельсия - double temp = (double)intTemp / 10; - - // Состояни батареи - notification.addData("battery", BatteryState.values()[(buf.get(5) >> 7) & 1]); - - // Температура - notification.addData("temp", temp); - - // Тип сенсора - notification.addData("sensortype", SensorType.values()[((buf.get(5) >> 4) & 7)]); - - /** - * В третьем байте данных хранится влажность - */ - notification.addData("humi", buf.get(6) & 0xff); - - /** - * В четвертом байте данных хранятся данные о состоянии аналогового датчика - * По умолчанию - unsigned byte (255) - */ - notification.addData("analog", buf.get(7) & 0xff); - - return notification; - } }