aboutsummaryrefslogtreecommitdiff
path: root/Bluetooth.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'Bluetooth.cpp')
-rw-r--r--Bluetooth.cpp227
1 files changed, 129 insertions, 98 deletions
diff --git a/Bluetooth.cpp b/Bluetooth.cpp
index f589d1f..ebdd527 100644
--- a/Bluetooth.cpp
+++ b/Bluetooth.cpp
@@ -1,144 +1,175 @@
#include "Bluetooth.h"
+#include "BluetoothImpl.h"
#include <sstream>
#include <iomanip>
#include <string.h>
namespace trygvis {
- using namespace std;
+namespace bluetooth {
+using namespace std;
- // -----------------------------------------------------------------------
- // Mac
- // -----------------------------------------------------------------------
+// -----------------------------------------------------------------------
+// Mac
+// -----------------------------------------------------------------------
- string Mac::str() const {
- std::ostringstream buf;
+string Mac::str() const {
+ std::ostringstream buf;
- buf
- << setw(2) << hex << setfill('0') << (int) bytes[0] << ":"
- << setw(2) << hex << setfill('0') << (int) bytes[1] << ":"
- << setw(2) << hex << setfill('0') << (int) bytes[2] << ":"
- << setw(2) << hex << setfill('0') << (int) bytes[3] << ":"
- << setw(2) << hex << setfill('0') << (int) bytes[4] << ":"
- << setw(2) << hex << setfill('0') << (int) bytes[5];
+ buf
+ << setw(2) << hex << setfill('0') << (int) bytes[0] << ":"
+ << setw(2) << hex << setfill('0') << (int) bytes[1] << ":"
+ << setw(2) << hex << setfill('0') << (int) bytes[2] << ":"
+ << setw(2) << hex << setfill('0') << (int) bytes[3] << ":"
+ << setw(2) << hex << setfill('0') << (int) bytes[4] << ":"
+ << setw(2) << hex << setfill('0') << (int) bytes[5];
- return buf.str();
- }
+ return buf.str();
+}
- bool Mac::operator==(Mac &other) const {
- const uint8_t* b = bytes;
- return memcmp(b, other.bytes, sizeof(bytes)) == 0;
- }
+bool Mac::operator==(Mac &other) const {
+ const uint8_t *b = bytes;
+ return memcmp(b, other.bytes, sizeof(bytes)) == 0;
+}
- bool Mac::operator!=(Mac &other) const {
- return !operator==(other);
- }
+bool Mac::operator!=(Mac &other) const {
+ return !operator==(other);
+}
- bool operator<(const Mac &a, const Mac &b) {
- return memcmp(a.bytes, b.bytes, sizeof(a.bytes)) < 0;
- }
+bool operator<(const Mac &a, const Mac &b) {
+ return memcmp(a.bytes, b.bytes, sizeof(a.bytes)) < 0;
+}
+
+void Mac::copy(uint8_t &_0, uint8_t &_1, uint8_t &_2, uint8_t &_3, uint8_t &_4, uint8_t &_5) const {
+ _0 = bytes[0];
+ _1 = bytes[1];
+ _2 = bytes[2];
+ _3 = bytes[3];
+ _4 = bytes[4];
+ _5 = bytes[5];
+}
- void Mac::copy(uint8_t &_0, uint8_t &_1, uint8_t &_2, uint8_t &_3, uint8_t &_4, uint8_t &_5) const {
- _0 = bytes[0];
- _1 = bytes[1];
- _2 = bytes[2];
- _3 = bytes[3];
- _4 = bytes[4];
- _5 = bytes[5];
+Mac Mac::parseMac(string s) throw(BluetoothException) {
+ unsigned int bytes[6];
+ int count = sscanf(s.c_str(), "%02x:%02x:%02x:%02x:%02x:%02x",
+ &bytes[0], &bytes[1], &bytes[2], &bytes[3], &bytes[4], &bytes[5]);
+
+ if (count != 6) {
+ throw BluetoothException("Unable to parse mac: " + s);
}
- Mac *Mac::parseMac(string s) throw(BluetoothException) {
- unsigned int bytes[6];
- int count = sscanf(s.c_str(), "%02x:%02x:%02x:%02x:%02x:%02x",
- &bytes[0], &bytes[1], &bytes[2], &bytes[3], &bytes[4], &bytes[5]);
+ return Mac((uint8_t) bytes[0], (uint8_t) bytes[1], (uint8_t) bytes[2], (uint8_t) bytes[3], (uint8_t) bytes[4], (uint8_t) bytes[5]);
+}
- if (count != 6) {
- throw BluetoothException("Unable to parse mac: " + s);
- }
+AttPdu::AttPdu(ByteBuffer &bytes) : bytes(bytes) {
+}
- return new Mac((uint8_t) bytes[0], (uint8_t) bytes[1], (uint8_t) bytes[2], (uint8_t) bytes[3], (uint8_t) bytes[4], (uint8_t) bytes[5]);
- }
+AttPdu::AttPdu(ByteBuffer &bytes, AttPduType type) : bytes(bytes) {
+ bytes.add8(type);
+}
- AttPdu::AttPdu(ByteBuffer &bytes) : bytes(bytes) {
- }
+AttPduType AttPdu::getType() {
+ return (AttPduType) bytes.get8(0);
+}
+
+void AttPdu::makeReadByGroupType(ByteBuffer &bytes, uint16_t startHandle, uint16_t endHandle, uint16_t uuid) {
+ bytes.setCursor(0);
+ bytes.add8(AttPduType::READ_BY_GROUP_TYPE_REQ);
+ bytes.add16le(startHandle);
+ bytes.add16le(endHandle);
+ bytes.add16le(uuid);
+}
- AttPdu::AttPdu(ByteBuffer &bytes, AttPduType type) : bytes(bytes) {
- bytes.add8(type);
+void AttPdu::checkType(ByteBuffer &bytes, AttPduType type) {
+ if (bytes.getSize() == 0) {
+ throw BluetoothException("PDU is too small");
}
- AttPduType AttPdu::getType() {
- return (AttPduType) bytes.get8(0);
+ bytes.setCursor(0);
+ AttPduType t = (AttPduType) bytes.get8();
+
+ if (t != type) {
+ throw BluetoothException("Unexpected type: " + to_string(t));
}
+}
+
+vector<AttributeData> AttPdu::parseReadByGroupType(ByteBuffer &bytes) {
+ DF << "bytes: " << bytes.toString();
+
+ checkType(bytes, READ_BY_GROUP_TYPE_RES);
- void AttPdu::makeReadByGroupType(ByteBuffer &bytes, uint16_t startHandle, uint16_t endHandle, uint16_t uuid) {
- bytes.setCursor(0);
- bytes.add8(AttPduType::READ_BY_GROUP_TYPE_REQ);
- bytes.add16le(startHandle);
- bytes.add16le(endHandle);
- bytes.add16le(uuid);
+ if (bytes.getSize() < 4) {
+ throw BluetoothException("Bad READ_BY_GROUP_TYPE_RES packet, expected at least 4 octets, got " + to_string(bytes.getSize()));
}
- void AttPdu::checkType(ByteBuffer &bytes, AttPduType type) {
- if (bytes.getSize() == 0) {
- throw BluetoothException("PDU is too small");
- }
+ uint8_t length = bytes.get8();
+ D << "length=" << (int) length;
- bytes.setCursor(0);
- AttPduType t = (AttPduType) bytes.get8();
+ size_t count = (bytes.getSize() - 2) / length;
+ D << "count=" << count;
- if (t != type) {
- throw BluetoothException("Unexpected type: " + to_string(t));
- }
+ vector<AttributeData> values;
+ for (int i = 0; i < count; i++) {
+ auto data = bytes.view(length);
+ D << "data, size=" << data.getSize() << ", bytes=" << data.toString();
+ bytes.skip(length);
+ values.push_back(AttributeData::fromByteBuffer(data));
}
- vector<AttributeData> AttPdu::parseReadByGroupType(ByteBuffer &bytes) {
- DF;
+ return values;
+}
- checkType(bytes, READ_BY_GROUP_TYPE_RES);
+// -----------------------------------------------------------------------
+// AttributeData
+// -----------------------------------------------------------------------
- if (bytes.getSize() < 4) {
- throw BluetoothException("Bad READ_BY_GROUP_TYPE_RES packet, expected at least 4 octets, got " + to_string(bytes.getSize()));
- }
+AttributeData AttributeData::fromByteBuffer(ByteBuffer &bytes) {
+ uint16_t handle = bytes.get16le();
+ uint16_t groupEndHandle = bytes.get16le();
- uint8_t length = bytes.get8();
- D << "length=" << (int) length;
+ return AttributeData(handle, groupEndHandle, bytes.view());
+}
- size_t count = (bytes.getSize() - 2) / length;
- D << "count=" << count;
+AttributeData::AttributeData(uint16_t handle, uint16_t groupEndHandle, ByteBuffer value) :
+ handle(handle), groupEndHandle(groupEndHandle), value(value) {
+}
- vector<AttributeData> values;
- for (int i = 0; i < count; i++) {
- auto data = bytes.view(length);
- D << "data, size=" << data.getSize() << ", bytes=" << data.toString();
- bytes.skip(length);
- values.push_back(AttributeData::fromByteBuffer(data));
- }
+AttributeData::~AttributeData() {
+}
- return values;
- }
+// -----------------------------------------------------------------------
+// Adapter
+// -----------------------------------------------------------------------
- // -----------------------------------------------------------------------
- // AttributeData
- // -----------------------------------------------------------------------
+BluetoothAdapter::BluetoothAdapter() {
+}
- AttributeData AttributeData::fromByteBuffer(ByteBuffer &bytes) {
- uint16_t handle = bytes.get16le();
- uint16_t groupEndHandle = bytes.get16le();
+BluetoothAdapter::~BluetoothAdapter() {
+}
- return AttributeData(handle, groupEndHandle, bytes.view());
- }
+/*
+map<int, LinuxBluetoothAdapter *> adapters;
- AttributeData::AttributeData(uint16_t handle, uint16_t groupEndHandle, ByteBuffer value) :
- handle(handle), groupEndHandle(groupEndHandle), value(value) {
- }
+BluetoothAdapter &getAdapter(int hciDevice) {
+ map<int, LinuxBluetoothAdapter *>::iterator it = adapters.find(hciDevice);
- AttributeData::~AttributeData() {
+ if (it == adapters.end()) {
+ LinuxBluetoothAdapter *adapter = new LinuxBluetoothAdapter(hciDevice);
+ adapters[hciDevice] = adapter;
+ return *adapter;
}
- // -----------------------------------------------------------------------
- // Adapter
- // -----------------------------------------------------------------------
+ return *it->second;
+}
+*/
- BluetoothAdapter::~BluetoothAdapter() {
- }
+BluetoothAdapter &getAdapter(int hciDevice) {
+ return getAdapterImpl(hciDevice);
+}
+
+void shutdown() {
+ shutdownImpl();
+}
+
+}
};