6#include "dawn/proto/nimble/prph_aios.hxx"
12#include "dawn/io/common.hxx"
13#include "dawn/proto/nimble/gatt_runtime.hxx"
14#include "host/ble_hs_mbuf.h"
15#include "os/os_mbuf.h"
19#ifdef CONFIG_DAWN_PROTO_NIMBLE_EXTENDED_METADATA
20static ble_uuid_any_t *aiosMakeUuid16(uint16_t value)
22 ble_uuid_any_t *uuid =
new (std::nothrow) ble_uuid_any_t{};
28 uuid->u.type = BLE_UUID_TYPE_16;
29 uuid->u16.value = value;
33static void aiosFreeUuid(
const ble_uuid_t *uuid)
37 delete reinterpret_cast<const ble_uuid_any_t *
>(uuid);
51 if (io->
getDataSize() > CProtoNimblePrphAios::AIOS_RAW_DESCRIPTOR_MAX)
68#ifdef CONFIG_DAWN_IO_NOTIFY
69int CProtoNimblePrphAios::notifierCb(
void *priv,
io_ddata_t *data)
71 SPrphNotiferCb *ncb =
static_cast<SPrphNotiferCb *
>(priv);
75 DAWNERR(
"NULL ncb pointer\n");
83 DAWNERR(
"NULL io pointer\n");
89 std::memcpy(ncb->data->getDataPtr(), data->
getDataPtr(), ncb->data->getDataSize());
93 ble_gatts_chr_updated(ncb->handle);
99#ifdef CONFIG_DAWN_PROTO_NIMBLE_EXTENDED_METADATA
100int CProtoNimblePrphAios::descriptorCb(uint16_t conn_handle,
101 uint16_t attr_handle,
102 struct ble_gatt_access_ctxt *ctxt,
105 SAiosDscCb *dcb =
static_cast<SAiosDscCb *
>(arg);
111 if (dcb ==
nullptr || ctxt->op != BLE_GATT_ACCESS_OP_READ_DSC)
113 return BLE_ATT_ERR_UNLIKELY;
116# if defined(CONFIG_DAWN_PROTO_NIMBLE_AIOS_DESC_VALUE_TRIGGER_SETTING) || \
117 defined(CONFIG_DAWN_PROTO_NIMBLE_AIOS_DESC_TIME_TRIGGER_SETTING)
118 if (dcb->kind == AIOS_DESC_VALUE_TRIGGER_SETTING || dcb->kind == AIOS_DESC_TIME_TRIGGER_SETTING)
120 ret = aiosReadFieldRaw(dcb->field.io, dcb->field.data, dcb->data, &dcb->len);
123 DAWNERR(
"AIOS raw descriptor field read failed %d\n", ret);
124 return BLE_ATT_ERR_UNLIKELY;
129 ret = os_mbuf_append(ctxt->om, dcb->data, dcb->len);
132 DAWNERR(
"AIOS descriptor append failed %d\n", ret);
133 return BLE_ATT_ERR_UNLIKELY;
142int CProtoNimblePrphAios::callbackAnalog(uint16_t conn_handle,
143 uint16_t attr_handle,
144 struct ble_gatt_access_ctxt *ctxt,
147 SPrphNotiferCb *ncb =
static_cast<SPrphNotiferCb *
>(arg);
149 uint16_t uuid16 = ble_uuid_u16(ctxt->chr->uuid);
154 DAWNERR(
"AIOS analog UUID mismatch\n");
155 return BLE_ATT_ERR_UNLIKELY;
160 case BLE_GATT_ACCESS_OP_READ_CHR:
162 size_t size = std::min(ncb->data->getDataSize(),
sizeof(uint32_t));
165#ifdef CONFIG_DAWN_IO_NOTIFY
171 ret = io->
getData(*ncb->data, 1);
174 return BLE_ATT_ERR_UNLIKELY;
180 std::memcpy(&retval, &ncb->data->get<uint32_t>(0), size);
184 ret = os_mbuf_append(ctxt->om, &retval,
sizeof(uint32_t));
187 DAWNERR(
"os_mbuf_append failed %d\n", ret);
193 case BLE_GATT_ACCESS_OP_WRITE_CHR:
195 size_t size = std::min(ncb->data->getDataSize(),
sizeof(uint32_t));
201 ret = ble_hs_mbuf_to_flat(ctxt->om, &retval,
sizeof(uint32_t), &len);
204 return BLE_ATT_ERR_UNLIKELY;
209 std::memcpy(&ncb->data->get<uint32_t>(0), &retval, size);
216 return BLE_ATT_ERR_UNLIKELY;
224 DAWNERR(
"AIOS GATT operation not supported\n");
225 return BLE_ATT_ERR_UNLIKELY;
226 return BLE_ATT_ERR_UNLIKELY;
230 return BLE_ATT_ERR_UNLIKELY;
234int CProtoNimblePrphAios::callbackDigital(uint16_t conn_handle,
235 uint16_t attr_handle,
236 struct ble_gatt_access_ctxt *ctxt,
239 SPrphNotiferCb *ncb =
static_cast<SPrphNotiferCb *
>(arg);
241 uint16_t uuid16 = ble_uuid_u16(ctxt->chr->uuid);
246 DAWNERR(
"AIOS digital UUID mismatch\n");
247 return BLE_ATT_ERR_UNLIKELY;
252 case BLE_GATT_ACCESS_OP_READ_CHR:
254#ifdef CONFIG_DAWN_IO_NOTIFY
260 ret = io->
getData(*ncb->data, 1);
263 return BLE_ATT_ERR_UNLIKELY;
269 ret = os_mbuf_append(ctxt->om, &ncb->data->get<
bool>(0),
sizeof(
bool));
272 DAWNERR(
"os_mbuf_append failed %d\n", ret);
278 case BLE_GATT_ACCESS_OP_WRITE_CHR:
284 ret = ble_hs_mbuf_to_flat(ctxt->om, &ncb->data->get<
bool>(0),
sizeof(
bool), &len);
287 return BLE_ATT_ERR_UNLIKELY;
295 return BLE_ATT_ERR_UNLIKELY;
303 DAWNERR(
"AIOS GATT operation not supported\n");
304 return BLE_ATT_ERR_UNLIKELY;
305 return BLE_ATT_ERR_UNLIKELY;
309 return BLE_ATT_ERR_UNLIKELY;
312#ifdef CONFIG_DAWN_PROTO_NIMBLE_AIOS_AGGREGATE
313int CProtoNimblePrphAios::callbackAggregate(uint16_t conn_handle,
314 uint16_t attr_handle,
315 struct ble_gatt_access_ctxt *ctxt,
319 uint16_t uuid16 = ble_uuid_u16(ctxt->chr->uuid);
324 if (service ==
nullptr || ctxt->op != BLE_GATT_ACCESS_OP_READ_CHR ||
327 return BLE_ATT_ERR_UNLIKELY;
330 return service->appendAggregateValue(ctxt->om);
333int CProtoNimblePrphAios::appendAggregateValue(
struct os_mbuf *om)
337 for (
auto const objid :
vio)
340 SPrphNotiferCb *ncb = ioCbMap[objid];
341 uint8_t type = ioTypeMap[objid];
343 if (io ==
nullptr || ncb ==
nullptr || ncb->data ==
nullptr || !io->
isRead())
348# ifdef CONFIG_DAWN_IO_NOTIFY
352 ret = io->
getData(*ncb->data, 1);
355 return BLE_ATT_ERR_UNLIKELY;
362 std::memcpy(&value, ncb->data->getDataPtr(),
sizeof(value));
363 ret = os_mbuf_append(om, &value,
sizeof(value));
366 DAWNERR(
"AIOS aggregate digital append failed %d\n", ret);
367 return BLE_ATT_ERR_UNLIKELY;
372 size_t size = std::min(ncb->data->getDataSize(),
sizeof(uint32_t));
375 std::memcpy(&value, ncb->data->getDataPtr(), size);
376 ret = os_mbuf_append(om, &value,
sizeof(value));
379 DAWNERR(
"AIOS aggregate analog append failed %d\n", ret);
380 return BLE_ATT_ERR_UNLIKELY;
389int CProtoNimblePrphAios::allocAIOS()
393 svc.type = BLE_GATT_SVC_TYPE_PRIMARY;
395 svc.includes =
nullptr;
400#ifdef CONFIG_DAWN_PROTO_NIMBLE_AIOS_AGGREGATE
401 if (aggregateEnabled)
409 svc.characteristics =
new (std::nothrow) ble_gatt_chr_def[noChar]();
410 if (svc.characteristics ==
nullptr)
412 DAWNERR(
"Failed to allocate characteristics\n");
419int CProtoNimblePrphAios::createAIOS()
421 const uint32_t *char_uuid =
nullptr;
425 if (svc.characteristics ==
nullptr)
427 DAWNERR(
"Failed to allocate characteristics\n");
433 svc.type = BLE_GATT_SVC_TYPE_PRIMARY;
435 svc.includes =
nullptr;
437 for (
auto const objid :
vio)
445 struct ble_gatt_chr_def *chr =
const_cast<struct ble_gatt_chr_def *
>(&svc.characteristics[j]);
450 DAWNERR(
"AIOS IO not found\n");
458 DAWNERR(
"seekable IO not supported by AIOS"
459 " (objid=0x%08" PRIx32
")\n",
464 ncb = nimbleGattNotifierCreate(io);
467 DAWNERR(
"AIOS notifier allocation failed\n");
473 ioCbMap.insert_or_assign(objid, ncb);
477 nimbleGattChrInit(*chr, ncb);
482#ifdef CONFIG_DAWN_IO_NOTIFY
483 ret = nimbleGattChrNotifySet(*chr, *io, *ncb, notifierCb, objid);
486 DAWNERR(
"AIOS notifier setup failed\n");
490 nimbleGattChrAccessSet(*chr, *io);
494 switch (ioTypeMap[objid])
498 chr->access_cb = CProtoNimblePrphAios::callbackDigital;
505 chr->access_cb = CProtoNimblePrphAios::callbackAnalog;
512 DAWNERR(
"unknown AIOS type %d\n", ioTypeMap[objid]);
519 if (char_uuid ==
nullptr)
521 DAWNERR(
"No UUID for AIOS IO\n");
525 ret = nimbleGattChrUuid128Set(*chr, char_uuid);
528 DAWNERR(
"AIOS UUID allocation failed\n");
532 ret = configureDescriptors(chr, objid);
543#ifdef CONFIG_DAWN_PROTO_NIMBLE_AIOS_AGGREGATE
544 if (aggregateEnabled)
546 struct ble_gatt_chr_def *chr =
const_cast<struct ble_gatt_chr_def *
>(&svc.characteristics[j]);
548 nimbleGattChrInit(*chr,
this);
552 DAWNERR(
"AIOS aggregate UUID allocation failed\n");
556 chr->access_cb = CProtoNimblePrphAios::callbackAggregate;
557 chr->flags = BLE_GATT_CHR_F_READ;
565void CProtoNimblePrphAios::deleteAIOS()
570 if (svc.characteristics)
572 for (
size_t i = 0; i < noChar - 1; i++)
574 if (svc.characteristics[i].uuid)
578 nimbleGattChrUuidFree(
579 const_cast<struct ble_gatt_chr_def &
>(svc.characteristics[i]));
583 nimbleGattChrUuidFree(
const_cast<struct ble_gatt_chr_def &
>(svc.characteristics[i]));
586#ifdef CONFIG_DAWN_PROTO_NIMBLE_EXTENDED_METADATA
587 if (svc.characteristics[i].descriptors)
589 struct ble_gatt_dsc_def *dsc =
590 const_cast<struct ble_gatt_dsc_def *
>(svc.characteristics[i].descriptors);
592 for (
size_t j = 0; dsc[j].uuid !=
nullptr; j++)
594 SAiosDscCb *dcb =
static_cast<SAiosDscCb *
>(dsc[j].arg);
596 aiosFreeUuid(dsc[j].uuid);
599 delete dcb->field.data;
608 nimbleGattChrNotifierFree(
const_cast<struct ble_gatt_chr_def &
>(svc.characteristics[i]));
611 delete[]
const_cast<ble_gatt_chr_def *
>(svc.characteristics);
613 svc.characteristics =
nullptr;
620int CProtoNimblePrphAios::configureDescriptors(
struct ble_gatt_chr_def *chr,
623#ifndef CONFIG_DAWN_PROTO_NIMBLE_EXTENDED_METADATA
628 const auto metaIt = ioMetaMap.find(objid);
630 struct ble_gatt_dsc_def *dsc;
634 if (metaIt == ioMetaMap.end())
639 meta =
const_cast<SAiosMeta *
>(&metaIt->second);
641# ifndef CONFIG_DAWN_PROTO_NIMBLE_AIOS_DESC_USER_DESCRIPTION
642 meta->desc &= ~AIOS_DESC_USER_DESCRIPTION;
644 if (meta->desc & AIOS_DESC_USER_DESCRIPTION)
649# ifndef CONFIG_DAWN_PROTO_NIMBLE_AIOS_DESC_NUMBER_OF_DIGITALS
650 meta->desc &= ~AIOS_DESC_NUMBER_OF_DIGITALS;
652 if (meta->desc & AIOS_DESC_NUMBER_OF_DIGITALS)
657# ifndef CONFIG_DAWN_PROTO_NIMBLE_AIOS_DESC_VALUE_TRIGGER_SETTING
658 meta->desc &= ~AIOS_DESC_VALUE_TRIGGER_SETTING;
660 if (meta->desc & AIOS_DESC_VALUE_TRIGGER_SETTING)
665# ifndef CONFIG_DAWN_PROTO_NIMBLE_AIOS_DESC_TIME_TRIGGER_SETTING
666 meta->desc &= ~AIOS_DESC_TIME_TRIGGER_SETTING;
668 if (meta->desc & AIOS_DESC_TIME_TRIGGER_SETTING)
673# ifndef CONFIG_DAWN_PROTO_NIMBLE_AIOS_DESC_PRESENTATION_FORMAT
674 meta->desc &= ~AIOS_DESC_PRESENTATION_FORMAT;
676 if (meta->desc & AIOS_DESC_PRESENTATION_FORMAT)
681# ifndef CONFIG_DAWN_PROTO_NIMBLE_AIOS_DESC_EXTENDED_PROPERTIES
682 meta->desc &= ~AIOS_DESC_EXTENDED_PROPERTIES;
684 if (meta->desc & AIOS_DESC_EXTENDED_PROPERTIES)
694 dsc =
new (std::nothrow) ble_gatt_dsc_def[descCount + 1]();
701# ifdef CONFIG_DAWN_PROTO_NIMBLE_AIOS_DESC_USER_DESCRIPTION
702 if (meta->desc & AIOS_DESC_USER_DESCRIPTION)
704 SAiosDscCb *dcb =
new (std::nothrow) SAiosDscCb{};
705 ble_uuid_any_t *uuid = aiosMakeUuid16(UUID16_CHR_USER_DESCRIPTION);
706 if (dcb ==
nullptr || uuid ==
nullptr)
709 aiosFreeUuid(uuid ? &uuid->u : nullptr);
713 dcb->kind = AIOS_DESC_USER_DESCRIPTION;
715 while (dcb->len < AIOS_USER_DESCRIPTION_MAX && meta->userDescription[dcb->len] !=
'\0')
717 dcb->data[dcb->len] =
static_cast<uint8_t
>(meta->userDescription[dcb->len]);
721 dsc[idx].uuid = &uuid->u;
722 dsc[idx].att_flags = BLE_ATT_F_READ;
723 dsc[idx].access_cb = descriptorCb;
729# ifdef CONFIG_DAWN_PROTO_NIMBLE_AIOS_DESC_NUMBER_OF_DIGITALS
730 if (meta->desc & AIOS_DESC_NUMBER_OF_DIGITALS)
732 SAiosDscCb *dcb =
new (std::nothrow) SAiosDscCb{};
733 ble_uuid_any_t *uuid = aiosMakeUuid16(UUID16_NUMBER_OF_DIGITALS);
734 if (dcb ==
nullptr || uuid ==
nullptr)
737 aiosFreeUuid(uuid ? &uuid->u : nullptr);
741 dcb->kind = AIOS_DESC_NUMBER_OF_DIGITALS;
743 dcb->data[0] = meta->numberOfDigitals;
745 dsc[idx].uuid = &uuid->u;
746 dsc[idx].att_flags = BLE_ATT_F_READ;
747 dsc[idx].access_cb = descriptorCb;
753# ifdef CONFIG_DAWN_PROTO_NIMBLE_AIOS_DESC_EXTENDED_PROPERTIES
754 if (meta->desc & AIOS_DESC_EXTENDED_PROPERTIES)
756 SAiosDscCb *dcb =
new (std::nothrow) SAiosDscCb{};
757 ble_uuid_any_t *uuid = aiosMakeUuid16(UUID16_EXTENDED_PROPERTIES);
758 if (dcb ==
nullptr || uuid ==
nullptr)
761 aiosFreeUuid(uuid ? &uuid->u : nullptr);
765 dcb->kind = AIOS_DESC_EXTENDED_PROPERTIES;
766 dcb->len = AIOS_EXTENDED_PROPERTIES_SIZE;
767 dcb->data[0] =
static_cast<uint8_t
>(meta->extendedProperties & 0xff);
768 dcb->data[1] =
static_cast<uint8_t
>((meta->extendedProperties >> 8) & 0xff);
770 dsc[idx].uuid = &uuid->u;
771 dsc[idx].att_flags = BLE_ATT_F_READ;
772 dsc[idx].access_cb = descriptorCb;
778# ifdef CONFIG_DAWN_PROTO_NIMBLE_AIOS_DESC_PRESENTATION_FORMAT
779 if (meta->desc & AIOS_DESC_PRESENTATION_FORMAT)
781 SAiosDscCb *dcb =
new (std::nothrow) SAiosDscCb{};
782 ble_uuid_any_t *uuid = aiosMakeUuid16(UUID16_PRESENTATION_FORMAT);
783 if (dcb ==
nullptr || uuid ==
nullptr)
786 aiosFreeUuid(uuid ? &uuid->u : nullptr);
790 dcb->kind = AIOS_DESC_PRESENTATION_FORMAT;
791 dcb->len = AIOS_PRESENTATION_FORMAT_SIZE;
792 std::memcpy(dcb->data, meta->presentationFormat, dcb->len);
794 dsc[idx].uuid = &uuid->u;
795 dsc[idx].att_flags = BLE_ATT_F_READ;
796 dsc[idx].access_cb = descriptorCb;
802# ifdef CONFIG_DAWN_PROTO_NIMBLE_AIOS_DESC_VALUE_TRIGGER_SETTING
803 if (meta->desc & AIOS_DESC_VALUE_TRIGGER_SETTING)
805 SAiosDscCb *dcb =
new (std::nothrow) SAiosDscCb{};
806 ble_uuid_any_t *uuid = aiosMakeUuid16(UUID16_VALUE_TRIGGER_SETTING);
807 if (dcb ==
nullptr || uuid ==
nullptr)
810 aiosFreeUuid(uuid ? &uuid->u : nullptr);
814 dcb->kind = AIOS_DESC_VALUE_TRIGGER_SETTING;
815 dcb->field.io =
cb->
getObject(meta->valueTriggerSettingObjid);
816 if (dcb->field.io ==
nullptr)
819 aiosFreeUuid(&uuid->u);
823 dcb->field.data = dcb->field.io->ddata_alloc(1);
824 if (dcb->field.data ==
nullptr)
827 aiosFreeUuid(&uuid->u);
831 dsc[idx].uuid = &uuid->u;
832 dsc[idx].att_flags = BLE_ATT_F_READ;
833 dsc[idx].access_cb = descriptorCb;
839# ifdef CONFIG_DAWN_PROTO_NIMBLE_AIOS_DESC_TIME_TRIGGER_SETTING
840 if (meta->desc & AIOS_DESC_TIME_TRIGGER_SETTING)
842 SAiosDscCb *dcb =
new (std::nothrow) SAiosDscCb{};
843 ble_uuid_any_t *uuid = aiosMakeUuid16(UUID16_TIME_TRIGGER_SETTING);
844 if (dcb ==
nullptr || uuid ==
nullptr)
847 aiosFreeUuid(uuid ? &uuid->u : nullptr);
851 dcb->kind = AIOS_DESC_TIME_TRIGGER_SETTING;
852 dcb->field.io =
cb->
getObject(meta->timeTriggerSettingObjid);
853 if (dcb->field.io ==
nullptr)
856 aiosFreeUuid(&uuid->u);
860 dcb->field.data = dcb->field.io->ddata_alloc(1);
861 if (dcb->field.data ==
nullptr)
864 aiosFreeUuid(&uuid->u);
868 dsc[idx].uuid = &uuid->u;
869 dsc[idx].att_flags = BLE_ATT_F_READ;
870 dsc[idx].access_cb = descriptorCb;
876 chr->descriptors = dsc;
880 for (
size_t i = 0; i < idx; i++)
882 aiosFreeUuid(dsc[i].uuid);
883 SAiosDscCb *dcb =
static_cast<SAiosDscCb *
>(dsc[i].arg);
886 delete dcb->field.data;
896void CProtoNimblePrphAios::allocObject(
const SProtoNimblePrphIOBindAiosObjid &obj,
899 uint8_t type = cfgIdIOBindAiosCfgObjTypeGet(obj.cfg);
900#ifdef CONFIG_DAWN_PROTO_NIMBLE_EXTENDED_METADATA
904 DAWNINFO(
"AIOS allocate type=%d object 0x%" PRIx32
"\n", type, obj.objid.v);
908 DAWNERR(
"Invalid AIOS type %d for object 0x%" PRIx32
"\n", type, obj.objid.v);
914 ioTypeMap.insert_or_assign(obj.objid.v, type);
916#ifdef CONFIG_DAWN_PROTO_NIMBLE_EXTENDED_METADATA
917 for (uint32_t i = 0; i < obj.extCount; i++)
919 uint8_t kind = cfgIdIOBindAiosExtKindGet(ext[0]);
920 uint8_t size = cfgIdIOBindAiosExtSizeGet(ext[0]);
921 const uint32_t *data = &ext[1];
926# ifdef CONFIG_DAWN_PROTO_NIMBLE_AIOS_DESC_USER_DESCRIPTION
927 if (size == AIOS_USER_DESCRIPTION_MAX /
sizeof(uint32_t))
929 meta.desc |= AIOS_DESC_USER_DESCRIPTION;
930 std::memcpy(meta.userDescription, data,
sizeof(meta.userDescription));
936# ifdef CONFIG_DAWN_PROTO_NIMBLE_AIOS_DESC_NUMBER_OF_DIGITALS
939 meta.desc |= AIOS_DESC_NUMBER_OF_DIGITALS;
940 meta.numberOfDigitals =
static_cast<uint8_t
>(data[0]);
946# ifdef CONFIG_DAWN_PROTO_NIMBLE_AIOS_DESC_VALUE_TRIGGER_SETTING
949 meta.desc |= AIOS_DESC_VALUE_TRIGGER_SETTING;
950 meta.valueTriggerSettingObjid = data[0];
956# ifdef CONFIG_DAWN_PROTO_NIMBLE_AIOS_DESC_TIME_TRIGGER_SETTING
959 meta.desc |= AIOS_DESC_TIME_TRIGGER_SETTING;
960 meta.timeTriggerSettingObjid = data[0];
966# ifdef CONFIG_DAWN_PROTO_NIMBLE_AIOS_DESC_PRESENTATION_FORMAT
969 meta.desc |= AIOS_DESC_PRESENTATION_FORMAT;
970 meta.presentationFormat[0] =
static_cast<uint8_t
>(data[0] & 0xff);
971 meta.presentationFormat[1] =
static_cast<uint8_t
>((data[0] >> 8) & 0xff);
972 meta.presentationFormat[2] =
static_cast<uint8_t
>((data[0] >> 16) & 0xff);
973 meta.presentationFormat[3] =
static_cast<uint8_t
>((data[0] >> 24) & 0xff);
974 meta.presentationFormat[4] =
static_cast<uint8_t
>(data[1] & 0xff);
975 meta.presentationFormat[5] =
static_cast<uint8_t
>((data[1] >> 8) & 0xff);
976 meta.presentationFormat[6] =
static_cast<uint8_t
>((data[1] >> 16) & 0xff);
982# ifdef CONFIG_DAWN_PROTO_NIMBLE_AIOS_DESC_EXTENDED_PROPERTIES
985 meta.desc |= AIOS_DESC_EXTENDED_PROPERTIES;
986 meta.extendedProperties =
static_cast<uint16_t
>(data[0] & 0xffff);
1000 ioMetaMap.insert_or_assign(obj.objid.v, meta);
1007#ifdef CONFIG_DAWN_PROTO_NIMBLE_EXTENDED_METADATA
1008# ifdef CONFIG_DAWN_PROTO_NIMBLE_AIOS_DESC_VALUE_TRIGGER_SETTING
1009 if (meta.valueTriggerSettingObjid != 0)
1015# ifdef CONFIG_DAWN_PROTO_NIMBLE_AIOS_DESC_TIME_TRIGGER_SETTING
1016 if (meta.timeTriggerSettingObjid != 0)
1023 vio.push_back(obj.objid.v);
1034 const SProtoNimblePrphIOBindAios *tmp =
1035 reinterpret_cast<const SProtoNimblePrphIOBindAios *
>(&item->
data[k]);
1037 uint8_t size = cfgIdIOBindAiosCfg0SizeGet(tmp->cfg0);
1038#ifdef CONFIG_DAWN_PROTO_NIMBLE_AIOS_AGGREGATE
1039 aggregateEnabled = aggregateEnabled || cfgIdIOBindAiosCfg1AggregateGet(tmp->cfg1);
1042 size_t pos = k +
sizeof(SProtoNimblePrphIOBindAios) /
sizeof(uint32_t);
1043 for (
size_t i = 0; i < size; i++)
1045 const SProtoNimblePrphIOBindAiosObjid *obj =
1046 reinterpret_cast<const SProtoNimblePrphIOBindAiosObjid *
>(&item->
data[pos]);
1047 const uint32_t *ext =
1048 &item->
data[pos +
sizeof(SProtoNimblePrphIOBindAiosObjid) /
sizeof(uint32_t)];
1052 allocObject(*obj, ext);
1054 pos +=
sizeof(SProtoNimblePrphIOBindAiosObjid) /
sizeof(uint32_t);
1055 for (uint32_t e = 0; e < obj->extCount; e++)
1057 pos += 1 + cfgIdIOBindAiosExtSizeGet(item->
data[pos]);
1074 aggregateEnabled =
false;
1077CProtoNimblePrphAios::~CProtoNimblePrphAios()
1088 configureDesc(
desc);
1103 DAWNERR(
"AIOS service registration failed\n");
Base class for all I/O objects.
int setData(IODataCmn &data, size_t offset=0)
Set data for I/O (public interface with stats tracking).
int getData(IODataCmn &data, size_t len, size_t offset=0)
Get data from I/O (public interface with stats tracking).
virtual bool isNotify() const =0
Check if IO supports notifications.
virtual bool isSeekable() const
Check if IO supports partial (seekable) access.
virtual size_t getDataDim() const =0
Get data vector dimension.
virtual size_t getDataSize() const =0
Get data size in bytes.
virtual bool isRead() const =0
Check if IO supports read operations.
SObjectId::ObjectId getIdV() const
Get object identifier as raw 32-bit value.
Automation I/O Service (AIOS) for BLE Peripheral.
int deinit()
Deinitialize service.
@ PRPH_AIOS_TYPE_ANALOG
Analog I/O (ADC, DAC).
@ PRPH_AIOS_TYPE_DIGITAL
Digital I/O (GPIO, buttons, LEDs).
int start()
Start service.
int init()
Initialize service.
@ AIOS_EXT_VALUE_TRIGGER_SETTING
Value Trigger Setting descriptor.
@ AIOS_EXT_TIME_TRIGGER_SETTING
Time Trigger Setting descriptor.
@ AIOS_EXT_NUMBER_OF_DIGITALS
Number of Digitals descriptor.
@ AIOS_EXT_EXTENDED_PROPERTIES
Characteristic Extended Properties descriptor.
@ AIOS_EXT_USER_DESCRIPTION
Characteristic User Description descriptor.
@ AIOS_EXT_PRESENTATION_FORMAT
Characteristic Presentation Format descriptor.
Interface for BLE peripheral services with GATT characteristics.
virtual int startService(int id)=0
Start a specific service.
static uint16_t UUID16_AGGREGATE
16-bit UUID for Aggregate characteristic.
virtual size_t getObjectsLen()=0
Get count of registered I/O objects.
static uint32_t UUID_ANALOG[4]
Analog Characteristic UUID (0x2A58).
virtual CIOCommon * getObject(SObjectId::ObjectId id)=0
Get protocol object by ID.
static uint16_t UUID16_ANALOG
16-bit UUID for Analog characteristic.
static uint32_t UUID_DIGITAL[4]
Digital Characteristic UUID (0x2A56).
static uint32_t UUID_AGGREGATE[4]
Aggregate Characteristic UUID (0x2A5A).
virtual int serviceRegister(struct ble_gatt_svc_def *svc)=0
Register a GATT service with the peripheral.
static uint16_t UUID16_DIGITAL
16-bit UUID for Digital characteristic.
virtual void regObject(SObjectId::ObjectId id)=0
Register an I/O object for this service.
virtual int stopService(int id)=0
Stop a specific service.
static uint32_t UUID_AIOS[4]
Automation I/O Service UUID (0x1815).
Base interface for GATT services exposed by BLE peripheral.
std::vector< SObjectId::ObjectId > vio
Vector of I/O objects exposed by this service.
const SObjectCfg::SObjectCfgItem * desc
Configuration descriptor for this service.
IProtoNimblePrphCb * cb
Callback interface to peripheral.
Out-of-tree user-extension hooks for Dawn.
Single configuration item within object.
ObjectCfgData_t data[]
Configuration data array (flexible, size from cfgid.s.size).
UObjectCfgId cfgid
Configuration ID header (type, class, id, size, rw, dtype).
uint32_t ObjectId
ObjectID type - single 32-bit value.
Heap-allocated dynamic I/O data buffer.
void * getDataPtr(size_t batch=0)
Get pointer to data only (skips timestamp if present).
uint32_t size
Configuration data size in 32-bit words (bits 5-14, max 1023).
struct dawn::SObjectCfg::UObjectCfgId::@10 s
Bit-field structure for named member access.