From 725880317b02a8bd5e5baa3ecab3b9a35c349b21 Mon Sep 17 00:00:00 2001 From: Yann Locatelli Date: Mon, 22 Jan 2024 11:34:12 +0100 Subject: [PATCH 1/4] :sparkles: (BLEKit): Add temperature characteristic --- libs/BLEKit/include/BLEServiceMonitoring.h | 17 +++++++++++++++-- .../include/internal/ServicesCharacteristics.h | 1 + .../BLEKit/tests/BLEServiceMonitoring_test.cpp | 18 ++++++++++++++++++ 3 files changed, 34 insertions(+), 2 deletions(-) diff --git a/libs/BLEKit/include/BLEServiceMonitoring.h b/libs/BLEKit/include/BLEServiceMonitoring.h index e1244f1aa2..32baabaa87 100644 --- a/libs/BLEKit/include/BLEServiceMonitoring.h +++ b/libs/BLEKit/include/BLEServiceMonitoring.h @@ -43,6 +43,14 @@ class BLEServiceMonitoring : public interface::BLEService sendData(data); } + void setTemperature(float value) + { + std::memcpy(temperature.data(), &value, 4); + + auto data = std::make_tuple(_temperature_characteristic.getValueHandle(), temperature); + sendData(data); + } + auto isScreensaverEnable() const -> bool { return _screensaver_enable; } void onDataReceived(const data_received_handle_t ¶ms) final @@ -79,6 +87,11 @@ class BLEServiceMonitoring : public interface::BLEService GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_NOTIFY, }; + std::array temperature {}; + ReadOnlyArrayGattCharacteristic _temperature_characteristic { + service::monitoring::characteristic::temperature, temperature.begin(), + GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_NOTIFY}; + bool _screensaver_enable {true}; WriteOnlyGattCharacteristic _screensaver_enable_characteristic { service::monitoring::characteristic::screensaver_enable, @@ -106,9 +119,9 @@ class BLEServiceMonitoring : public interface::BLEService GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_NOTIFY, }; - std::array _characteristic_table { + std::array _characteristic_table { &_charging_status_characteristic, &_screensaver_enable_characteristic, &_soft_reboot_characteristic, - &_hard_reboot_characteristic, &_negotiated_mtu_characteristic, + &_hard_reboot_characteristic, &_negotiated_mtu_characteristic, &_temperature_characteristic, }; }; diff --git a/libs/BLEKit/include/internal/ServicesCharacteristics.h b/libs/BLEKit/include/internal/ServicesCharacteristics.h index 13611a664b..5535aef2f8 100644 --- a/libs/BLEKit/include/internal/ServicesCharacteristics.h +++ b/libs/BLEKit/include/internal/ServicesCharacteristics.h @@ -42,6 +42,7 @@ namespace monitoring { inline constexpr uint16_t soft_reboot = 0x8382; inline constexpr uint16_t hard_reboot = 0x7282; inline constexpr UUID::LongUUIDBytes_t negotiated_mtu = {"NEGOTIATED_MTU"}; + inline constexpr UUID::LongUUIDBytes_t temperature = {"TEMPERATURE"}; } // namespace characteristic } // namespace monitoring diff --git a/libs/BLEKit/tests/BLEServiceMonitoring_test.cpp b/libs/BLEKit/tests/BLEServiceMonitoring_test.cpp index 4313915412..71ee1b10c6 100644 --- a/libs/BLEKit/tests/BLEServiceMonitoring_test.cpp +++ b/libs/BLEKit/tests/BLEServiceMonitoring_test.cpp @@ -54,6 +54,24 @@ TEST_F(BLEServiceMonitoringTest, setChargingStatus) EXPECT_FALSE(actual_charging_status); } +TEST_F(BLEServiceMonitoringTest, setTemperature) +{ + std::array actual_temperature {}; + std::array expected_temperature {}; + + auto spy_callback = [&actual_temperature](const BLEServiceMonitoring::data_to_send_handle_t &handle) { + for (auto i = 0; i < std::size(actual_temperature); i++) { + actual_temperature.at(i) = std::get<1>(handle)[i]; + } + }; + + service_monitoring.onDataReadyToSend(spy_callback); + + service_monitoring.setTemperature(31.4159); + expected_temperature = {0xC3, 0x53, 0xFB, 0x41}; // 31.4159, little-endian as in Swift + EXPECT_EQ(actual_temperature, expected_temperature); +} + TEST_F(BLEServiceMonitoringTest, isScreensaverEnableDefault) { auto actual_is_screensaver_enable = service_monitoring.isScreensaverEnable(); From a5a9a3bf51300fe44a9f5accee79310e75ec462b Mon Sep 17 00:00:00 2001 From: Yann Locatelli Date: Mon, 22 Jan 2024 12:54:45 +0100 Subject: [PATCH 2/4] :sparkles: (BLEKit): Add onTemperatureRequested --- libs/BLEKit/include/BLEServiceMonitoring.h | 11 ++++++- .../tests/BLEServiceMonitoring_test.cpp | 29 +++++++++++++++++++ 2 files changed, 39 insertions(+), 1 deletion(-) diff --git a/libs/BLEKit/include/BLEServiceMonitoring.h b/libs/BLEKit/include/BLEServiceMonitoring.h index 32baabaa87..3aa04ce19c 100644 --- a/libs/BLEKit/include/BLEServiceMonitoring.h +++ b/libs/BLEKit/include/BLEServiceMonitoring.h @@ -53,6 +53,11 @@ class BLEServiceMonitoring : public interface::BLEService auto isScreensaverEnable() const -> bool { return _screensaver_enable; } + void onTemperatureRequested(const std::function &callback) + { + _on_temperature_requested_callback = callback; + } + void onDataReceived(const data_received_handle_t ¶ms) final { if (params.handle == _screensaver_enable_characteristic.getValueHandle()) { @@ -76,7 +81,10 @@ class BLEServiceMonitoring : public interface::BLEService void onDataRequested(const data_requested_handle_t ¶ms) final { - // do nothing + if (params.handle == _temperature_characteristic.getValueHandle() && + _on_temperature_requested_callback != nullptr) { + _on_temperature_requested_callback(); + } } private: @@ -91,6 +99,7 @@ class BLEServiceMonitoring : public interface::BLEService ReadOnlyArrayGattCharacteristic _temperature_characteristic { service::monitoring::characteristic::temperature, temperature.begin(), GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_NOTIFY}; + std::function _on_temperature_requested_callback {}; bool _screensaver_enable {true}; WriteOnlyGattCharacteristic _screensaver_enable_characteristic { diff --git a/libs/BLEKit/tests/BLEServiceMonitoring_test.cpp b/libs/BLEKit/tests/BLEServiceMonitoring_test.cpp index 71ee1b10c6..d0cd9b96ef 100644 --- a/libs/BLEKit/tests/BLEServiceMonitoring_test.cpp +++ b/libs/BLEKit/tests/BLEServiceMonitoring_test.cpp @@ -72,6 +72,35 @@ TEST_F(BLEServiceMonitoringTest, setTemperature) EXPECT_EQ(actual_temperature, expected_temperature); } +TEST_F(BLEServiceMonitoringTest, onTemperatureRequested) +{ + testing::MockFunction mock_callback {}; + service_monitoring.onTemperatureRequested(mock_callback.AsStdFunction()); + + EXPECT_CALL(mock_callback, Call).Times(1); + + service_monitoring.onDataRequested(data_requested_handle); +} + +TEST_F(BLEServiceMonitoringTest, onTemperatureRequestedNotSameHandle) +{ + testing::MockFunction mock_callback {}; + service_monitoring.onTemperatureRequested(mock_callback.AsStdFunction()); + + data_requested_handle.handle = 0xFFFF; + + EXPECT_CALL(mock_callback, Call).Times(0); + + service_monitoring.onDataRequested(data_requested_handle); +} + +TEST_F(BLEServiceMonitoringTest, onTemperatureRequestedtUnset) +{ + service_monitoring.onTemperatureRequested(nullptr); + + service_monitoring.onDataRequested(data_requested_handle); +} + TEST_F(BLEServiceMonitoringTest, isScreensaverEnableDefault) { auto actual_is_screensaver_enable = service_monitoring.isScreensaverEnable(); From 31483b9142a2f16dd27eeab25846af52b36a0ebb Mon Sep 17 00:00:00 2001 From: Yann Locatelli Date: Mon, 22 Jan 2024 13:18:55 +0100 Subject: [PATCH 3/4] :sparkles: (BLEKit): Add humidity characteristic --- libs/BLEKit/include/BLEServiceMonitoring.h | 16 +++++++++++++++- .../include/internal/ServicesCharacteristics.h | 1 + .../BLEKit/tests/BLEServiceMonitoring_test.cpp | 18 ++++++++++++++++++ 3 files changed, 34 insertions(+), 1 deletion(-) diff --git a/libs/BLEKit/include/BLEServiceMonitoring.h b/libs/BLEKit/include/BLEServiceMonitoring.h index 3aa04ce19c..0c951ef880 100644 --- a/libs/BLEKit/include/BLEServiceMonitoring.h +++ b/libs/BLEKit/include/BLEServiceMonitoring.h @@ -51,6 +51,14 @@ class BLEServiceMonitoring : public interface::BLEService sendData(data); } + void setHumidity(float value) + { + std::memcpy(humidity.data(), &value, 4); + + auto data = std::make_tuple(_humidity_characteristic.getValueHandle(), humidity); + sendData(data); + } + auto isScreensaverEnable() const -> bool { return _screensaver_enable; } void onTemperatureRequested(const std::function &callback) @@ -101,6 +109,11 @@ class BLEServiceMonitoring : public interface::BLEService GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_NOTIFY}; std::function _on_temperature_requested_callback {}; + std::array humidity {}; + ReadOnlyArrayGattCharacteristic _humidity_characteristic { + service::monitoring::characteristic::humidity, humidity.begin(), + GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_NOTIFY}; + bool _screensaver_enable {true}; WriteOnlyGattCharacteristic _screensaver_enable_characteristic { service::monitoring::characteristic::screensaver_enable, @@ -128,9 +141,10 @@ class BLEServiceMonitoring : public interface::BLEService GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_NOTIFY, }; - std::array _characteristic_table { + std::array _characteristic_table { &_charging_status_characteristic, &_screensaver_enable_characteristic, &_soft_reboot_characteristic, &_hard_reboot_characteristic, &_negotiated_mtu_characteristic, &_temperature_characteristic, + &_humidity_characteristic, }; }; diff --git a/libs/BLEKit/include/internal/ServicesCharacteristics.h b/libs/BLEKit/include/internal/ServicesCharacteristics.h index 5535aef2f8..6c0716ff8d 100644 --- a/libs/BLEKit/include/internal/ServicesCharacteristics.h +++ b/libs/BLEKit/include/internal/ServicesCharacteristics.h @@ -43,6 +43,7 @@ namespace monitoring { inline constexpr uint16_t hard_reboot = 0x7282; inline constexpr UUID::LongUUIDBytes_t negotiated_mtu = {"NEGOTIATED_MTU"}; inline constexpr UUID::LongUUIDBytes_t temperature = {"TEMPERATURE"}; + inline constexpr UUID::LongUUIDBytes_t humidity = {"HUMIDITY"}; } // namespace characteristic } // namespace monitoring diff --git a/libs/BLEKit/tests/BLEServiceMonitoring_test.cpp b/libs/BLEKit/tests/BLEServiceMonitoring_test.cpp index d0cd9b96ef..b08a5240b7 100644 --- a/libs/BLEKit/tests/BLEServiceMonitoring_test.cpp +++ b/libs/BLEKit/tests/BLEServiceMonitoring_test.cpp @@ -72,6 +72,24 @@ TEST_F(BLEServiceMonitoringTest, setTemperature) EXPECT_EQ(actual_temperature, expected_temperature); } +TEST_F(BLEServiceMonitoringTest, setHumidity) +{ + std::array actual_humidity {}; + std::array expected_humidity {}; + + auto spy_callback = [&actual_humidity](const BLEServiceMonitoring::data_to_send_handle_t &handle) { + for (auto i = 0; i < std::size(actual_humidity); i++) { + actual_humidity.at(i) = std::get<1>(handle)[i]; + } + }; + + service_monitoring.onDataReadyToSend(spy_callback); + + service_monitoring.setHumidity(51.24); + expected_humidity = {0xC3, 0xF5, 0x4C, 0x42}; // 51.24 little-endian as in Swift + EXPECT_EQ(actual_humidity, expected_humidity); +} + TEST_F(BLEServiceMonitoringTest, onTemperatureRequested) { testing::MockFunction mock_callback {}; From 32550be57b6b32a2eccb58ff0eafd22a00d3bb69 Mon Sep 17 00:00:00 2001 From: Yann Locatelli Date: Mon, 22 Jan 2024 13:22:10 +0100 Subject: [PATCH 4/4] :recycle: (BLEKit): Add onHumidityRequested agglomerate with onTemperatureRequested --- libs/BLEKit/include/BLEServiceMonitoring.h | 14 ++++++++------ libs/BLEKit/tests/BLEServiceMonitoring_test.cpp | 12 ++++++------ 2 files changed, 14 insertions(+), 12 deletions(-) diff --git a/libs/BLEKit/include/BLEServiceMonitoring.h b/libs/BLEKit/include/BLEServiceMonitoring.h index 0c951ef880..5e46e24b5e 100644 --- a/libs/BLEKit/include/BLEServiceMonitoring.h +++ b/libs/BLEKit/include/BLEServiceMonitoring.h @@ -61,9 +61,9 @@ class BLEServiceMonitoring : public interface::BLEService auto isScreensaverEnable() const -> bool { return _screensaver_enable; } - void onTemperatureRequested(const std::function &callback) + void onTemperatureHumidityRequested(const std::function &callback) { - _on_temperature_requested_callback = callback; + _on_temperature_humidity_requested_callback = callback; } void onDataReceived(const data_received_handle_t ¶ms) final @@ -89,9 +89,10 @@ class BLEServiceMonitoring : public interface::BLEService void onDataRequested(const data_requested_handle_t ¶ms) final { - if (params.handle == _temperature_characteristic.getValueHandle() && - _on_temperature_requested_callback != nullptr) { - _on_temperature_requested_callback(); + if ((params.handle == _temperature_characteristic.getValueHandle() || + params.handle == _humidity_characteristic.getValueHandle()) && + _on_temperature_humidity_requested_callback != nullptr) { + _on_temperature_humidity_requested_callback(); } } @@ -107,13 +108,14 @@ class BLEServiceMonitoring : public interface::BLEService ReadOnlyArrayGattCharacteristic _temperature_characteristic { service::monitoring::characteristic::temperature, temperature.begin(), GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_NOTIFY}; - std::function _on_temperature_requested_callback {}; std::array humidity {}; ReadOnlyArrayGattCharacteristic _humidity_characteristic { service::monitoring::characteristic::humidity, humidity.begin(), GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_NOTIFY}; + std::function _on_temperature_humidity_requested_callback {}; + bool _screensaver_enable {true}; WriteOnlyGattCharacteristic _screensaver_enable_characteristic { service::monitoring::characteristic::screensaver_enable, diff --git a/libs/BLEKit/tests/BLEServiceMonitoring_test.cpp b/libs/BLEKit/tests/BLEServiceMonitoring_test.cpp index b08a5240b7..b9d3833db1 100644 --- a/libs/BLEKit/tests/BLEServiceMonitoring_test.cpp +++ b/libs/BLEKit/tests/BLEServiceMonitoring_test.cpp @@ -90,20 +90,20 @@ TEST_F(BLEServiceMonitoringTest, setHumidity) EXPECT_EQ(actual_humidity, expected_humidity); } -TEST_F(BLEServiceMonitoringTest, onTemperatureRequested) +TEST_F(BLEServiceMonitoringTest, onTemperatureHumidityRequested) { testing::MockFunction mock_callback {}; - service_monitoring.onTemperatureRequested(mock_callback.AsStdFunction()); + service_monitoring.onTemperatureHumidityRequested(mock_callback.AsStdFunction()); EXPECT_CALL(mock_callback, Call).Times(1); service_monitoring.onDataRequested(data_requested_handle); } -TEST_F(BLEServiceMonitoringTest, onTemperatureRequestedNotSameHandle) +TEST_F(BLEServiceMonitoringTest, onTemperatureHumidityRequestedNotSameHandle) { testing::MockFunction mock_callback {}; - service_monitoring.onTemperatureRequested(mock_callback.AsStdFunction()); + service_monitoring.onTemperatureHumidityRequested(mock_callback.AsStdFunction()); data_requested_handle.handle = 0xFFFF; @@ -112,9 +112,9 @@ TEST_F(BLEServiceMonitoringTest, onTemperatureRequestedNotSameHandle) service_monitoring.onDataRequested(data_requested_handle); } -TEST_F(BLEServiceMonitoringTest, onTemperatureRequestedtUnset) +TEST_F(BLEServiceMonitoringTest, onTemperatureHumidityRequestedtUnset) { - service_monitoring.onTemperatureRequested(nullptr); + service_monitoring.onTemperatureHumidityRequested(nullptr); service_monitoring.onDataRequested(data_requested_handle); }