From 2ca532122d60cff4dbdc7f24fbc5783bcc5ad68d Mon Sep 17 00:00:00 2001 From: Trygve Laugstøl Date: Tue, 12 Apr 2016 20:06:47 +0200 Subject: Soil Moisture: Adding support for controlling lights. Bluetooth: refectorying, trying to be more c++ idiomatic and modern. SM/Diller: adding bluetooth to Diller bridge. --- apps/SoilMoisture.cpp | 50 +++++++++++++++++++++++++++++++++++--------------- 1 file changed, 35 insertions(+), 15 deletions(-) (limited to 'apps/SoilMoisture.cpp') diff --git a/apps/SoilMoisture.cpp b/apps/SoilMoisture.cpp index 13578f6..4b9dfe5 100644 --- a/apps/SoilMoisture.cpp +++ b/apps/SoilMoisture.cpp @@ -16,6 +16,7 @@ auto bluetooth_base_uuid = const boost::uuids::uuid soil_moisture_service = makeUuid(trygvis_io_base_uuid, 0x00, 0x10); const boost::uuids::uuid soil_moisture_characteristic = makeUuid(trygvis_io_base_uuid, 0x00, 0x11); const boost::uuids::uuid temperature_characteristic = makeUuid(bluetooth_base_uuid, 0x2a, 0x1e); +const boost::uuids::uuid light_characteristic = makeUuid(trygvis_io_base_uuid, 0x00, 0x12); using namespace trygvis::bluetooth; @@ -64,13 +65,15 @@ ByteBuffer createSetUpdateInterval(uint8_t sensor, uint8_t interval_in_seconds) SoilMoisture SoilMoisture::create(shared_ptr gatt) { gatt->discoverServices(); - auto service = gatt->findService(soil_moisture_service); + o> s = gatt->findService(soil_moisture_service); - if (!service) { + if (!s) { throw runtime_error("The device is missing the soil moisture service"); } - auto c = service->findCharacteristic(soil_moisture_characteristic); + shared_ptr &service = *s; + + o> c = service->findCharacteristic(soil_moisture_characteristic); if (!c) { throw runtime_error("The device is missing the soil moisture characteristic"); @@ -78,16 +81,20 @@ SoilMoisture SoilMoisture::create(shared_ptr gatt) { auto temperature = service->findCharacteristic(temperature_characteristic); - return SoilMoisture(gatt, *service, c.get(), temperature); + auto light = service->findCharacteristic(light_characteristic); + + return SoilMoisture(gatt, service, c.operator*(), temperature, light); } -SoilMoisture::SoilMoisture(const shared_ptr &gatt, BluetoothGattService &s, - const BluetoothGattCharacteristic &soilMoistureCharacteristic, - const o temperatureCharacteristic) +SoilMoisture::SoilMoisture(const shared_ptr &gatt, + const shared_ptr &s, + const BluetoothGattCharacteristicPtr &soilMoistureCharacteristic, + const o temperatureCharacteristic, + const o lightCharacteristic) : gatt(gatt), s(s), soilMoistureCharacteristic(soilMoistureCharacteristic), - temperatureCharacteristic(temperatureCharacteristic) {} + temperatureCharacteristic(temperatureCharacteristic), lightCharacteristic(lightCharacteristic) { } -ByteBuffer SoilMoisture::writeAndRead(const BluetoothGattCharacteristic &c, ByteBuffer &requestBytes) { +ByteBuffer SoilMoisture::writeAndRead(const BluetoothGattCharacteristicPtr &c, ByteBuffer &requestBytes) { requestBytes.setCursor(0); uint8_t expectedCode = requestBytes.get8(0); @@ -131,14 +138,15 @@ string SoilMoisture::getName(uint8_t sensor) { buffer.copy(bytes, bytesLeft); if (bytesLeft == 0 || bytesLeft < (bytes[0] + 1)) { - throw runtime_error("Bad response from device. buffer size: " + to_string(bytesLeft) + ", buffer[0]=" + to_string((int)bytes[0])); + throw runtime_error("Bad response from device. buffer size: " + to_string(bytesLeft) + ", buffer[0]=" + + to_string((int) bytes[0])); } - return string((const char *)&bytes[1], bytes[0]); + return string((const char *) &bytes[1], bytes[0]); } bool SoilMoisture::hasTemperatureSensor() { - return temperatureCharacteristic.is_initialized(); + return (bool) temperatureCharacteristic; } /** @@ -149,9 +157,7 @@ o SoilMoisture::readTemperature() { return o(); } - auto &c = temperatureCharacteristic.get(); - - auto responseBytes = gatt->readValue(c); + auto responseBytes = gatt->readValue(*temperatureCharacteristic); if (responseBytes.getSize() < 2) { throw runtime_error("Unexpected number of bytes read: " + to_string(responseBytes.getSize())); @@ -168,5 +174,19 @@ o SoilMoisture::readTemperature() { return o(temperature); } +void SoilMoisture::setLight(uint8_t light, uint8_t value) { + if (!lightCharacteristic) { + return; + } + + auto responseBytes = gatt->readValue(*lightCharacteristic); + + if (responseBytes.getSize() < 2) { + throw runtime_error("Unexpected number of bytes read: " + to_string(responseBytes.getSize())); + } + + bitset<8> b0 = responseBytes.read8(); +} + } } -- cgit v1.2.3