aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--apps/SoilMoisture.cpp12
-rw-r--r--apps/SoilMoisture.h2
-rw-r--r--apps/sm-get-value.h100
-rw-r--r--ble/LinuxBluetooth.cpp4
-rw-r--r--include/ble/Bluetooth.h5
-rw-r--r--sensor/include/trygvis/sensor.h3
6 files changed, 84 insertions, 42 deletions
diff --git a/apps/SoilMoisture.cpp b/apps/SoilMoisture.cpp
index d1d8b7c..5edba0e 100644
--- a/apps/SoilMoisture.cpp
+++ b/apps/SoilMoisture.cpp
@@ -116,5 +116,17 @@ uint16_t SoilMoisture::getValue(uint8_t sensor) {
return writeAndRead(req).read16le();
}
+
+string SoilMoisture::getName(uint8_t sensor) {
+ auto req = createGetSensorName(sensor);
+
+ auto buffer = writeAndRead(req);
+ size_t bytesLeft = buffer.getBytesLeft();
+ uint8_t bytes[bytesLeft];
+ buffer.copy(bytes, bytesLeft);
+
+ return string((char *) bytes, (unsigned long) bytesLeft);
+}
+
}
}
diff --git a/apps/SoilMoisture.h b/apps/SoilMoisture.h
index 938da07..45ba5d4 100644
--- a/apps/SoilMoisture.h
+++ b/apps/SoilMoisture.h
@@ -30,6 +30,8 @@ public:
uint16_t getValue(uint8_t sensor);
+ string getName(uint8_t sensor);
+
private:
SoilMoisture(shared_ptr<BluetoothGatt> gatt, BluetoothGattService &s, BluetoothGattCharacteristic &c);
diff --git a/apps/sm-get-value.h b/apps/sm-get-value.h
index 4083f8e..0073d7f 100644
--- a/apps/sm-get-value.h
+++ b/apps/sm-get-value.h
@@ -18,7 +18,6 @@ using namespace trygvis::apps;
using namespace trygvis::bluetooth;
using namespace trygvis::sensor;
using namespace trygvis::sensor::io;
-using json = nlohmann::json;
class sm_get_value : public app {
@@ -31,7 +30,16 @@ public:
bool loop;
sample_format_type format;
unsigned int sleepTime;
- vector<unsigned int> sensors;
+ vector<unsigned int> sensorIndexes;
+ vector<pair<unsigned int, string>> sensors;
+
+ KeyDictionary dict;
+ SampleKey* hostname_key = dict.indexOf("hostname");
+ SampleKey* device_key = dict.indexOf("device");
+ SampleKey* sensor_key = dict.indexOf("sensor");
+ SampleKey* sensor_name_key = dict.indexOf("sensor_name");
+ SampleKey* timestamp_key = dict.indexOf("timestamp");
+ SampleKey* value_key = dict.indexOf("value");
void add_options(po::options_description_easy_init &options) override {
auto default_sleep = po::value<>(&sleepTime)->default_value(0);
@@ -39,7 +47,7 @@ public:
options
("device", po::value<string>()->required(), "MAC of device to poll")
- ("sensor", po::value<vector<unsigned int>>(&sensors)->multitoken(), "Sensor to poll, defaults to all")
+ ("sensor", po::value<vector<unsigned int>>(&sensorIndexes)->multitoken(), "Sensor to poll, defaults to all")
("sleep", default_sleep,
"How long to sleep in seconds between each poll. If not given, it will exit after first poll")
("format", default_format, "Output format");
@@ -97,6 +105,31 @@ public:
}
}
+ void read_sensors(SoilMoisture &soilMoisture, string mac) {
+ auto epoch = system_clock::now().time_since_epoch();
+ auto timestamp = duration_cast<seconds>(epoch).count();
+ auto unique_output_stream = open_sample_output_stream(shared_ptr<ostream>(&cout, noop_deleter),
+ dict, format);
+ shared_ptr<SampleOutputStream> output_stream{std::move(unique_output_stream)};
+
+ for (auto s : sensors) {
+ auto sensor = s.first;
+ auto name = s.second;
+
+ uint16_t value = soilMoisture.getValue((uint8_t) sensor);
+
+ auto sample = SampleRecord(dict)
+ .set(hostname_key, get_hostname())
+ .set(device_key, mac)
+ .set(sensor_key, std::to_string(sensor))
+ .set(sensor_name_key, name)
+ .set(timestamp_key, std::to_string(timestamp))
+ .set(value_key, std::to_string(value));
+
+ output_stream->write(sample);
+ }
+ }
+
void withConnection(sample_format_type format, shared_ptr<BluetoothGatt> gatt) {
SoilMoisture soilMoisture = SoilMoisture::create(gatt);
@@ -109,54 +142,37 @@ public:
// If the user didn't specify any sensors, add all.
if (sensors.size() == 0) {
for (unsigned int i = 0; i < sensorCount; i++) {
- sensors.push_back(i);
+ sensorIndexes.push_back(i);
}
}
- auto mac = gatt->getDevice().getMac();
-
- KeyDictionary dict;
- auto hostname_key = dict.indexOf("hostname");
- auto device_key = dict.indexOf("device");
- auto sensor_key = dict.indexOf("sensor");
- auto timestamp_key = dict.indexOf("timestamp");
- auto value_key = dict.indexOf("value");
-
- time_point<system_clock> targetTime;
- targetTime = system_clock::now();
-
- do {
- auto unique_output_stream = open_sample_output_stream(shared_ptr<ostream>(&cout, noop_deleter), dict,
- format);
- shared_ptr<SampleOutputStream> output_stream{std::move(unique_output_stream)};
+ for_each(begin(sensorIndexes), end(sensorIndexes), [&](auto i) {
+ if (i >= sensorCount) {
+ // Ignore invalid sensors
+ return;
+ }
- auto epoch = system_clock::now().time_since_epoch();
- auto timestamp = duration_cast<seconds>(epoch).count();
+ sensors.push_back(make_pair(i, soilMoisture.getName(i)));
+ });
- for (auto sensor : sensors) {
- if (sensor >= sensorCount) {
- // Ignore invalid sensors
- continue;
- }
+ auto mac = gatt->getDevice().getMac().str();
- uint16_t value = soilMoisture.getValue((uint8_t) sensor);
-
- auto sample = SampleRecord(dict)
- .set(hostname_key, get_hostname())
- .set(device_key, mac.str())
- .set(sensor_key, std::to_string(sensor))
- .set(timestamp_key, std::to_string(timestamp))
- .set(value_key, std::to_string(value));
-
- output_stream->write(sample);
- }
+ if (!loop) {
+ read_sensors(soilMoisture, mac);
+ } else {
+ time_point<system_clock> targetTime;
+ targetTime = system_clock::now();
do {
- targetTime = targetTime + seconds(sleepTime);
- } while (targetTime < system_clock::now());
+ read_sensors(soilMoisture, mac);
+
+ do {
+ targetTime = targetTime + seconds(sleepTime);
+ } while (targetTime < system_clock::now());
- this_thread::sleep_until(targetTime);
- } while (loop);
+ this_thread::sleep_until(targetTime);
+ } while (loop);
+ }
}
};
diff --git a/ble/LinuxBluetooth.cpp b/ble/LinuxBluetooth.cpp
index 6e3c9da..c96d145 100644
--- a/ble/LinuxBluetooth.cpp
+++ b/ble/LinuxBluetooth.cpp
@@ -68,6 +68,10 @@ public:
~LinuxBluetoothGatt();
+ LinuxBluetoothGatt(const LinuxBluetoothGatt&) = delete;
+
+ LinuxBluetoothGatt& operator=(const LinuxBluetoothGatt&) = delete;
+
bool isConnected() const override;
void discoverServices() override;
diff --git a/include/ble/Bluetooth.h b/include/ble/Bluetooth.h
index 80729af..97e7cfe 100644
--- a/include/ble/Bluetooth.h
+++ b/include/ble/Bluetooth.h
@@ -122,6 +122,11 @@ public:
virtual ~BluetoothGatt();
+ // No copying
+ BluetoothGatt(const BluetoothGatt&) = delete;
+
+ BluetoothGatt& operator=(const BluetoothGatt&) = delete;
+
virtual BluetoothDevice &getDevice() const = 0;
virtual bool isConnected() const = 0;
diff --git a/sensor/include/trygvis/sensor.h b/sensor/include/trygvis/sensor.h
index 48fb509..b5199e2 100644
--- a/sensor/include/trygvis/sensor.h
+++ b/sensor/include/trygvis/sensor.h
@@ -82,8 +82,11 @@ public:
~KeyDictionary() {
std::for_each(keys.begin(), keys.end(), std::default_delete<SampleKey>());
}
+
KeyDictionary(KeyDictionary& that) = delete;
+ KeyDictionary& operator=(const KeyDictionary&) = delete;
+
SampleKey *indexOf(const string &key) {
SampleKeyIndex i = 0;
for (auto ptr = keys.cbegin(); ptr != keys.cend(); ptr++, i++) {