From e44813dddbf5ba063d29ae1e40862e7a7cbb6f43 Mon Sep 17 00:00:00 2001
From: Trygve Laugstøl <trygvis@inamo.no>
Date: Fri, 20 Feb 2015 22:56:22 +0100
Subject: Reorganizing the source code: o Moving main to apps/ o Moving the
 library sources to ble/ o Creating cmake files for each piece.

---
 apps/CMakeLists.txt         |  22 +++++++++
 apps/ble-inspect-device.cpp |  72 +++++++++++++++++++++++++++
 apps/sm-get-value.cpp       |  75 ++++++++++++++++++++++++++++
 apps/soil-moisture.h        | 118 ++++++++++++++++++++++++++++++++++++++++++++
 4 files changed, 287 insertions(+)
 create mode 100644 apps/CMakeLists.txt
 create mode 100644 apps/ble-inspect-device.cpp
 create mode 100644 apps/sm-get-value.cpp
 create mode 100644 apps/soil-moisture.h

(limited to 'apps')

diff --git a/apps/CMakeLists.txt b/apps/CMakeLists.txt
new file mode 100644
index 0000000..a138336
--- /dev/null
+++ b/apps/CMakeLists.txt
@@ -0,0 +1,22 @@
+set(APPS sm-get-value ble-inspect-device)
+
+# Boost
+find_package(Boost COMPONENTS system log thread REQUIRED)
+
+# Bluez
+pkg_check_modules(BLUEZ bluez REQUIRED)
+
+# pthreads
+find_package(Threads REQUIRED)
+
+foreach(app ${APPS})
+    include_directories("${PROJECT_SOURCE_DIR}/ble")
+
+    add_executable(${app} ${app}.cpp)
+    add_dependencies(${app} ble)
+
+    target_link_libraries(${app} ble)
+    target_link_libraries(${app} ${Boost_LIBRARIES})
+    target_link_libraries(${app} ${BLUEZ_LIBRARIES})
+    target_link_libraries(${app} ${CMAKE_THREAD_LIBS_INIT})
+endforeach(app)
diff --git a/apps/ble-inspect-device.cpp b/apps/ble-inspect-device.cpp
new file mode 100644
index 0000000..361311c
--- /dev/null
+++ b/apps/ble-inspect-device.cpp
@@ -0,0 +1,72 @@
+#include <exception>
+#include <iostream>
+#include <vector>
+#include <boost/uuid/uuid_io.hpp>
+#include "Bluetooth.h"
+
+using namespace std;
+using namespace trygvis::bluetooth;
+
+Mac *targetMac;
+
+void scan_callback(BluetoothDevice &device) {
+    device.adapter().stopScan();
+
+    if (device.mac() != *targetMac) {
+        cout << "found device: " << device.mac().str() << ", but not the one we want " << targetMac->str() << endl;
+        return;
+    }
+
+    cout << "Connecting to device: " << device.mac().str() << endl;
+
+    device.connect();
+
+    device.discoverServices();
+
+    vector<BluetoothGattService *> services = device.getServices();
+    cout << "Device has " << services.size() << " services" << endl;
+    
+    for (auto &s: services) {
+        const vector<BluetoothGattCharacteristic *> characteristics = s->getCharacteristics();
+
+        cout << "Service: UUID: " << s->getUuid() << ", has " << characteristics.size() << " characteristics" << endl;
+
+        for (auto &c: characteristics) {
+            cout << "Characteristic: UUID: " << c->getUuid() << ", properties: " << (int) c->getProperties() << endl;
+        }
+    }
+
+    device.disconnect();
+}
+
+int main(int argc, char *argv[]) {
+    if (argc != 2) {
+        cerr << "usage: " << argv[0] << " [mac]" << endl;
+        return EXIT_FAILURE;
+    }
+
+    int e;
+//    try {
+    Mac mac = Mac::parseMac(argv[1]);
+    targetMac = &mac;
+
+    BluetoothAdapter &adapter = getAdapter(0);
+
+    BluetoothDevice &device = adapter.getDevice(mac);
+
+    scan_callback(device);
+
+//        adapter->runScan(scan_callback);
+
+    e = EXIT_SUCCESS;
+//    } catch (std::runtime_error ex) {
+//        W << "std::runtime_error: " << ex.what();
+//        e = EXIT_FAILURE;
+//    } catch (std::exception ex) {
+//        W << "std::exception: " << ex.what();
+//        e = EXIT_FAILURE;
+//    }
+
+    shutdown();
+    return e;
+}
diff --git a/apps/sm-get-value.cpp b/apps/sm-get-value.cpp
new file mode 100644
index 0000000..232c166
--- /dev/null
+++ b/apps/sm-get-value.cpp
@@ -0,0 +1,75 @@
+#include <exception>
+#include <iostream>
+#include <vector>
+#include <boost/uuid/uuid_io.hpp>
+#include <boost/optional.hpp>
+#include "Bluetooth.h"
+#include "soil-moisture.h"
+
+using namespace std;
+using namespace trygvis::bluetooth;
+
+Mac *targetMac;
+
+void scan_callback(BluetoothDevice &device) {
+    device.adapter().stopScan();
+
+    if (device.mac() != *targetMac) {
+        cout << "found device: " << device.mac().str() << ", but not the one we want " << targetMac->str() << endl;
+        return;
+    }
+
+    cout << "Connecting to device: " << device.mac().str() << endl;
+
+    device.connect();
+
+    device.discoverServices();
+
+    vector<BluetoothGattService *> services = device.getServices();
+    cout << "Device has " << services.size() << " services" << endl;
+    
+    for (auto &s: services) {
+        const vector<BluetoothGattCharacteristic *> characteristics = s->getCharacteristics();
+
+        cout << "Service: UUID: " << s->getUuid() << ", has " << characteristics.size() << " characteristics" << endl;
+
+        for (auto &c: characteristics) {
+            cout << "Characteristic: UUID: " << c->getUuid() << ", properties: " << (int) c->getProperties() << endl;
+        }
+    }
+
+    boost::uuids::uuid soil_moisture_service;
+    boost::optional<BluetoothGattService*> service = device.findService(soil_moisture_service);
+
+    device.disconnect();
+}
+
+int main(int argc, char *argv[]) {
+    if (argc != 2) {
+        cerr << "usage: " << argv[0] << " [mac]" << endl;
+        return EXIT_FAILURE;
+    }
+
+    int e;
+//    try {
+    Mac mac = Mac::parseMac(argv[1]);
+    targetMac = &mac;
+
+    BluetoothAdapter &adapter = getAdapter(0);
+
+    BluetoothDevice &device = adapter.getDevice(mac);
+
+    scan_callback(device);
+
+    e = EXIT_SUCCESS;
+//    } catch (std::runtime_error ex) {
+//        W << "std::runtime_error: " << ex.what();
+//        e = EXIT_FAILURE;
+//    } catch (std::exception ex) {
+//        W << "std::exception: " << ex.what();
+//        e = EXIT_FAILURE;
+//    }
+
+    shutdown();
+    return e;
+}
diff --git a/apps/soil-moisture.h b/apps/soil-moisture.h
new file mode 100644
index 0000000..4f19de1
--- /dev/null
+++ b/apps/soil-moisture.h
@@ -0,0 +1,118 @@
+#ifndef SOIL_MOISTURE_H
+#define SOIL_MOISTURE_H
+
+#define SENSOR_NAME_LEN 10
+
+enum sm_cmd_code {
+    SM_CMD_GET_SENSOR_COUNT = 1,
+    SM_CMD_GET_VALUE = 2,
+    SM_CMD_SET_WARNING_VALUE = 3,
+    SM_CMD_GET_WARNING_VALUE = 4,
+    SM_CMD_SET_SENSOR_NAME = 5,
+    SM_CMD_GET_SENSOR_NAME = 6,
+    SM_CMD_SET_UPDATE_INTERVAL = 7,
+    SM_CMD_FAIL = 255,
+};
+
+struct sm_get_sensor_count_req {
+} __attribute__((packed));
+
+struct sm_get_sensor_count_res {
+    uint8_t count;
+} __attribute__((packed));
+
+struct sm_get_value_req {
+    uint8_t sensor;
+} __attribute__((packed));
+
+struct sm_get_value_res {
+    uint16_t value;
+} __attribute__((packed));
+
+struct sm_set_warning_value_req {
+    uint8_t sensor;
+    uint16_t warning_value;
+} __attribute__((packed));
+
+struct sm_set_warning_value_res {
+} __attribute__((packed));
+
+struct sm_get_warning_value_req {
+    uint8_t sensor;
+} __attribute__((packed));
+
+struct sm_get_warning_value_res {
+    uint16_t warning_value;
+} __attribute__((packed));
+
+struct sm_set_sensor_name_req {
+    uint8_t sensor;
+    uint8_t length;
+    uint8_t name[SENSOR_NAME_LEN];
+} __attribute__((packed));
+
+struct sm_set_sensor_name_res {
+} __attribute__((packed));
+
+struct sm_get_sensor_name_req {
+    uint8_t sensor;
+} __attribute__((packed));
+
+struct sm_get_sensor_name_res {
+    uint8_t length;
+    uint8_t name[SENSOR_NAME_LEN];
+} __attribute__((packed));
+
+struct sm_set_update_interval_req {
+    uint8_t sensor;
+    uint8_t interval_in_seconds;
+} __attribute__((packed));
+
+struct sm_set_update_interval_res {
+} __attribute__((packed));
+
+struct sm_req {
+    uint8_t code;
+    union {
+        struct sm_get_sensor_count_req get_sensor_count;
+        struct sm_get_value_req get_value;
+        struct sm_set_warning_value_req set_warning_value;
+        struct sm_get_warning_value_req get_warning_value;
+        struct sm_set_sensor_name_req set_sensor_name;
+        struct sm_get_sensor_name_req get_sensor_name;
+        struct sm_set_update_interval_req set_update_interval;
+    } __attribute__((packed));
+} __attribute__((packed));
+
+// len + code
+#define SM_RES_HEADER_SIZE 1
+
+struct sm_res {
+    // header
+    uint8_t code;
+
+    // body
+    union {
+        struct sm_get_sensor_count_res get_sensor_count;
+        struct sm_get_value_res get_value;
+        struct sm_set_warning_value_res set_warning_value;
+        struct sm_get_warning_value_res get_warning_value;
+        struct sm_set_sensor_name_res set_sensor_name;
+        struct sm_get_sensor_name_res get_sensor_name;
+        struct sm_set_update_interval_res set_update_interval;
+    } __attribute__((packed));
+} __attribute__((packed));
+
+#ifndef SM_DEBUG
+#define SM_DEBUG 1
+#endif
+
+#if SM_DEBUG == 1
+
+void write_req(struct sm_req const &req);
+
+void write_res(struct sm_res const &res);
+
+#endif
+
+#endif
-- 
cgit v1.2.3