#pragma once
#include <glib.h>
#include <gio/gio.h>
#include <string>
#include <list>
#include "Utils.h"
#include "TickEvent.h"
#include "GattInterface.h"
#include "HciAdapter.h"
namespace ggk {
struct GattCharacteristic;
struct GattDescriptor;
struct GattProperty;
struct GattService;
struct GattUuid;
struct DBusObject;
#define CHARACTERISTIC_UPDATED_VALUE_CALLBACK_LAMBDA [] \
( \
const GattCharacteristic &self, \
GDBusConnection *pConnection, \
void *pUserData \
) -> bool
#define CHARACTERISTIC_EVENT_CALLBACK_LAMBDA [] \
( \
const GattCharacteristic &self, \
const TickEvent &event, \
GDBusConnection *pConnection, \
void *pUserData \
)
#define CHARACTERISTIC_METHOD_CALLBACK_LAMBDA [] \
( \
const GattCharacteristic &self, \
GDBusConnection *pConnection, \
const std::string &methodName, \
GVariant *pParameters, \
GDBusMethodInvocation *pInvocation, \
void *pUserData \
)
struct GattCharacteristic : GattInterface
{
static constexpr const char *kInterfaceType = "GattCharacteristic";
typedef void (*MethodCallback)(const GattCharacteristic &self, GDBusConnection *pConnection, const std::string &methodName, GVariant *pParameters, GDBusMethodInvocation *pInvocation, void *pUserData);
typedef void (*EventCallback)(const GattCharacteristic &self, const TickEvent &event, GDBusConnection *pConnection, void *pUserData);
typedef bool (*UpdatedValueCallback)(const GattCharacteristic &self, GDBusConnection *pConnection, void *pUserData);
GattCharacteristic(DBusObject &owner, GattService &service, const std::string &name);
virtual ~GattCharacteristic() {}
virtual const std::string getInterfaceType() const { return GattCharacteristic::kInterfaceType; }
GattService &gattCharacteristicEnd();
virtual bool callMethod(const std::string &methodName, GDBusConnection *pConnection, GVariant *pParameters, GDBusMethodInvocation *pInvocation, gpointer pUserData) const;
GattCharacteristic &onEvent(int tickFrequency, void *pUserData, EventCallback callback);
virtual void tickEvents(GDBusConnection *pConnection, void *pUserData) const;
GattCharacteristic &onReadValue(MethodCallback callback);
GattCharacteristic &onWriteValue(MethodCallback callback);
GattCharacteristic &onUpdatedValue(UpdatedValueCallback callback);
bool callOnUpdatedValue(GDBusConnection *pConnection, void *pUserData) const;
GattDescriptor &gattDescriptorBegin(const std::string &pathElement, const GattUuid &uuid, const std::vector<const char *> &flags);
void sendChangeNotificationVariant(GDBusConnection *pBusConnection, GVariant *pNewValue) const;
template<typename T>
void sendChangeNotificationValue(GDBusConnection *pBusConnection, T value) const
{
if (HciAdapter::getInstance().getActiveConnectionCount() == 0)
{
return;
}
GVariant *pVariant = Utils::gvariantFromByteArray(value);
sendChangeNotificationVariant(pBusConnection, pVariant);
}
protected:
GattService &service;
UpdatedValueCallback pOnUpdatedValueFunc;
};
};