#pragma once
#include <string>
#include <algorithm>
#include <stdint.h>
#include <ctype.h>
#include <iostream>
#include "Logger.h"
struct GattUuid
{
static constexpr const char *kGattStandardUuidPart1Prefix = "0000";
static constexpr const char *kGattStandardUuidSuffix = "-0000-1000-8000-00805f9b34fb";
GattUuid(const char *strUuid)
{
*this = GattUuid(std::string(strUuid));
}
GattUuid(std::string strUuid)
{
strUuid = clean(strUuid);
bitCount = strUuid.length() * 4;
if (bitCount == 16)
{
strUuid = kGattStandardUuidPart1Prefix + strUuid + kGattStandardUuidSuffix;
}
else if (bitCount == 32)
{
strUuid += kGattStandardUuidSuffix;
}
else if (bitCount != 128)
{
bitCount = 0;
strUuid = "";
}
uuid = dashify(strUuid);
}
GattUuid(const uint16_t part)
{
bitCount = 16;
char partStr[5];
snprintf(partStr, sizeof(partStr), "%04x", part);
uuid = std::string(kGattStandardUuidPart1Prefix) + partStr + kGattStandardUuidSuffix;
}
GattUuid(const uint32_t part)
{
bitCount = 32;
char partStr[9];
snprintf(partStr, sizeof(partStr), "%04x", part);
uuid = std::string(partStr) + kGattStandardUuidSuffix;
}
GattUuid(const uint32_t part1, const uint16_t part2, const uint16_t part3, const uint16_t part4, const uint64_t part5)
{
bitCount = 128;
char partsStr[37];
uint32_t part5a = (part5 >> 4) & 0xffffffff;
uint32_t part5b = part5 & 0xffff;
snprintf(partsStr, sizeof(partsStr), "%08x-%04x-%04x-%04x-%08x%04x", part1, part2, part3, part4, part5a, part5b);
uuid = std::string(partsStr);
}
int getBitCount() const
{
return bitCount;
}
std::string toString16() const
{
if (uuid.empty()) { return uuid; }
return uuid.substr(4, 4);
}
std::string toString32() const
{
if (uuid.empty()) { return uuid; }
return uuid.substr(0, 8);
}
std::string toString128() const
{
return uuid;
}
std::string toString() const
{
if (bitCount == 16) return toString16();
if (bitCount == 32) return toString32();
return toString128();
}
static std::string clean(const std::string &strUuid)
{
if (strUuid.empty()) return strUuid;
std::string cleanStr = strUuid;
std::transform(cleanStr.begin(), cleanStr.end(), cleanStr.begin(), ::tolower);
cleanStr.erase
(
std::remove_if
(
cleanStr.begin(),
cleanStr.end(),
[](char c)
{
return !((c >= '0' && c <= '9') || (c >= 'a' && c <= 'f') || (c >= 'A' && c <= 'F'));
}
), cleanStr.end()
);
return cleanStr;
}
static std::string dashify(const std::string &str)
{
std::string dashed = clean(str);
if (dashed.length() > 8) { dashed.insert(8, 1, '-'); }
if (dashed.length() > 13) { dashed.insert(13, 1, '-'); }
if (dashed.length() > 18) { dashed.insert(18, 1, '-'); }
if (dashed.length() > 23) { dashed.insert(23, 1, '-'); }
return dashed;
}
private:
std::string uuid;
int bitCount;
};