aboutsummaryrefslogtreecommitdiff
path: root/apps/sm-get-value.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'apps/sm-get-value.cpp')
-rw-r--r--apps/sm-get-value.cpp120
1 files changed, 5 insertions, 115 deletions
diff --git a/apps/sm-get-value.cpp b/apps/sm-get-value.cpp
index e4ddc16..46177f2 100644
--- a/apps/sm-get-value.cpp
+++ b/apps/sm-get-value.cpp
@@ -2,100 +2,22 @@
#include <boost/uuid/uuid_io.hpp>
#include <boost/optional.hpp>
#include "ble/Bluetooth.h"
-#include "soil-moisture.h"
+#include "SoilMoisture.h"
using namespace std;
using namespace trygvis::bluetooth;
-
-#define BLUETOOTH_UUID_INITIALIZER \
- { \
- 0x00, 0x00, 0x00, 0x00, \
- 0x00, 0x00, \
- 0x10, 0x00, \
- 0x80, 0x00, \
- 0x00, 0x80, 0x5f, 0x9b, 0x34, 0xfb \
- };
-
-auto trygvis_io_base_uuid = boost::uuids::uuid {
- 0x32, 0xd0, 0x00, 0x00,
- 0x03, 0x5d,
- 0x59, 0xc5,
- 0x70, 0xd3,
- 0xbc, 0x8e, 0x4a, 0x1f, 0xd8, 0x3f};
-
-auto soil_moisture_service = makeUuid(trygvis_io_base_uuid, 0x00, 0x10);
-auto soil_moisture_characteristic = makeUuid(trygvis_io_base_uuid, 0x00, 0x11);
-
-ByteBuffer &operator<<(ByteBuffer &bytes, const sm_req &req);
+using namespace trygvis::soil_moisture;
bool loop = true;
-ByteBuffer writeAndRead(BluetoothGatt &gatt, const BluetoothGattCharacteristic &c, const ByteBuffer &requestBytes) {
- uint8_t expectedCode = requestBytes.get8(0);
-
- gatt.writeValue(c, requestBytes);
-
- auto responseBytes = gatt.readValue(c);
-
- if (responseBytes.getSize() < 1) {
- throw runtime_error("Unexpected number of bytes read: " + to_string(requestBytes.getSize()));
- }
-
- uint8_t actualCode = responseBytes.read8();
- if (actualCode != expectedCode) {
- throw runtime_error("Unexpected response code: " + to_string(actualCode) + ", expected " + to_string(expectedCode));
- }
-
- return responseBytes;
-}
-
-uint8_t getSensorCount(BluetoothGatt &gatt, BluetoothGattCharacteristic &c) {
- sm_req req = {
- .code = SM_CMD_GET_SENSOR_COUNT,
- };
-
- auto requestBytes = ByteBuffer::alloc(sizeof(struct sm_req));
- requestBytes << req;
- requestBytes.setCursor(0);
-
- return writeAndRead(gatt, c, requestBytes).read8();
-}
-
-uint16_t getValue(BluetoothGatt &gatt, BluetoothGattCharacteristic &c, uint8_t sensor) {
- sm_req req = {
- .code = SM_CMD_GET_VALUE,
- };
- req.get_value = {
- .sensor = sensor,
- };
-
- auto requestBytes = ByteBuffer::alloc(sizeof(struct sm_req));
- requestBytes << req;
- requestBytes.setCursor(0);
-
- return writeAndRead(gatt, c, requestBytes).read16le();
-}
-
void withConnection(BluetoothGatt &gatt) {
- gatt.discoverServices();
+ SoilMoisture soilMoisture = SoilMoisture::create(gatt);
- auto service = gatt.findService(soil_moisture_service);
-
- if (!service) {
- throw runtime_error("The device is missing the soil moisture service");
- }
-
- auto c = service->findCharacteristic(soil_moisture_characteristic);
-
- if (!c) {
- throw runtime_error("The device is missing the soil moisture characteristic");
- }
-
- int sensorCount = getSensorCount(gatt, *c);
+ int sensorCount = soilMoisture.getSensorCount();
while (loop) {
for (uint8_t i = 0; i < sensorCount; i++) {
- uint16_t value = getValue(gatt, *c, i);
+ uint16_t value = soilMoisture.getValue(i);
cout << "sensor=" << to_string(i) << ", value=" << (int) value << endl;
}
@@ -141,35 +63,3 @@ int main(int argc, char *argv[]) {
return EXIT_FAILURE;
}
}
-
-ByteBuffer &operator<<(ByteBuffer &bytes, const sm_req &req) {
- bytes.write8(req.code);
- switch (req.code) {
- case SM_CMD_GET_SENSOR_COUNT:
- return bytes;
- case SM_CMD_GET_VALUE:
- return bytes.
- write8(req.get_value.sensor);
- case SM_CMD_SET_WARNING_VALUE:
- return bytes.
- write8(req.set_warning_value.sensor).
- write16le(req.set_warning_value.warning_value);
- case SM_CMD_GET_WARNING_VALUE:
- return bytes.
- write8(req.set_warning_value.sensor);
- case SM_CMD_SET_SENSOR_NAME:
- return bytes.
- write8(req.set_sensor_name.sensor).
- write8(req.set_sensor_name.length).
- write(req.set_sensor_name.name, req.set_sensor_name.length);
- case SM_CMD_GET_SENSOR_NAME:
- return bytes.
- write8(req.get_sensor_name.sensor);
- case SM_CMD_SET_UPDATE_INTERVAL:
- return bytes.
- write8(req.set_update_interval.sensor).
- write8(req.set_update_interval.interval_in_seconds);
- default:
- throw runtime_error("Unknown code: " + to_string(req.code));
- }
-}