Skip to content

Commit

Permalink
fix: in GattClientSt, use ClaimableResource to control access over 2 …
Browse files Browse the repository at this point in the history
…different interfaces
  • Loading branch information
richardapeters committed Sep 25, 2024
1 parent 2402545 commit b445f8f
Show file tree
Hide file tree
Showing 2 changed files with 83 additions and 26 deletions.
102 changes: 77 additions & 25 deletions hal_st/middlewares/ble_middleware/GattClientSt.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -18,79 +18,125 @@ namespace hal

void GattClientSt::StartServiceDiscovery()
{
onDiscoveryCompletion = [](services::GattClientDiscoveryObserver& observer)
{
observer.ServiceDiscoveryComplete();
};
claimerDiscovery.Claim([this]()
{
onDiscoveryCompletion = [this]()
{
infra::Subject<services::GattClientDiscoveryObserver>::NotifyObservers([](auto& observer)
{
observer.ServiceDiscoveryComplete();
});

claimerDiscovery.Release();
};

aci_gatt_disc_all_primary_services(connectionHandle);
aci_gatt_disc_all_primary_services(connectionHandle);
});
}

void GattClientSt::StartCharacteristicDiscovery(services::AttAttribute::Handle handle, services::AttAttribute::Handle endHandle)
{
onDiscoveryCompletion = [](services::GattClientDiscoveryObserver& observer)
{
observer.CharacteristicDiscoveryComplete();
};
claimerDiscovery.Claim([this, handle, endHandle]()
{
onDiscoveryCompletion = [this]()
{
infra::Subject<services::GattClientDiscoveryObserver>::NotifyObservers([](auto& observer)
{
observer.CharacteristicDiscoveryComplete();
});

aci_gatt_disc_all_char_of_service(connectionHandle, handle, endHandle);
claimerDiscovery.Release();
};

aci_gatt_disc_all_char_of_service(connectionHandle, handle, endHandle);
});
}

void GattClientSt::StartDescriptorDiscovery(services::AttAttribute::Handle handle, services::AttAttribute::Handle endHandle)
{
onDiscoveryCompletion = [](services::GattClientDiscoveryObserver& observer)
{
observer.DescriptorDiscoveryComplete();
};
claimerDiscovery.Claim([this, handle, endHandle]()
{
onDiscoveryCompletion = [this]()
{
infra::Subject<services::GattClientDiscoveryObserver>::NotifyObservers([](auto& observer)
{
observer.DescriptorDiscoveryComplete();
});

claimerDiscovery.Release();
};

aci_gatt_disc_all_char_desc(connectionHandle, handle, endHandle);
aci_gatt_disc_all_char_desc(connectionHandle, handle, endHandle);
});
}

void GattClientSt::Read(const services::GattClientCharacteristicOperationsObserver& characteristic, const infra::Function<void(const infra::ConstByteRange&)>& onResponse)
{
this->onResponse = onResponse;

aci_gatt_read_char_value(connectionHandle, characteristic.CharacteristicValueHandle());
claimerCharacteristicOperations.Claim([this, &characteristic]()
{
aci_gatt_read_char_value(connectionHandle, characteristic.CharacteristicValueHandle());
});
}

void GattClientSt::Write(const services::GattClientCharacteristicOperationsObserver& characteristic, infra::ConstByteRange data, const infra::Function<void()>& onDone)
{
this->onDone = onDone;

aci_gatt_write_char_value(connectionHandle, characteristic.CharacteristicValueHandle(), data.size(), data.cbegin());
claimerCharacteristicOperations.Claim([this, &characteristic, data]()
{
aci_gatt_write_char_value(connectionHandle, characteristic.CharacteristicValueHandle(), data.size(), data.cbegin());
});
}

void GattClientSt::WriteWithoutResponse(const services::GattClientCharacteristicOperationsObserver& characteristic, infra::ConstByteRange data)
{
aci_gatt_write_without_resp(connectionHandle, characteristic.CharacteristicValueHandle(), data.size(), data.cbegin());
claimerCharacteristicOperations.Claim([this, &characteristic, data]()
{
aci_gatt_write_without_resp(connectionHandle, characteristic.CharacteristicValueHandle(), data.size(), data.cbegin());
claimerCharacteristicOperations.Release();
});
}

void GattClientSt::EnableNotification(const services::GattClientCharacteristicOperationsObserver& characteristic, const infra::Function<void()>& onDone)
{
this->onDone = onDone;

WriteCharacteristicDescriptor(characteristic, services::GattCharacteristic::PropertyFlags::notify, services::GattDescriptor::ClientCharacteristicConfiguration::CharacteristicValue::enableNotification);
claimerCharacteristicOperations.Claim([this, &characteristic]()
{
WriteCharacteristicDescriptor(characteristic, services::GattCharacteristic::PropertyFlags::notify, services::GattDescriptor::ClientCharacteristicConfiguration::CharacteristicValue::enableNotification);
});
}

void GattClientSt::DisableNotification(const services::GattClientCharacteristicOperationsObserver& characteristic, const infra::Function<void()>& onDone)
{
this->onDone = onDone;

WriteCharacteristicDescriptor(characteristic, services::GattCharacteristic::PropertyFlags::notify, services::GattDescriptor::ClientCharacteristicConfiguration::CharacteristicValue::disable);
claimerCharacteristicOperations.Claim([this, &characteristic]()
{
WriteCharacteristicDescriptor(characteristic, services::GattCharacteristic::PropertyFlags::notify, services::GattDescriptor::ClientCharacteristicConfiguration::CharacteristicValue::disable);
});
}

void GattClientSt::EnableIndication(const services::GattClientCharacteristicOperationsObserver& characteristic, const infra::Function<void()>& onDone)
{
this->onDone = onDone;

WriteCharacteristicDescriptor(characteristic, services::GattCharacteristic::PropertyFlags::indicate, services::GattDescriptor::ClientCharacteristicConfiguration::CharacteristicValue::enableIndication);
claimerCharacteristicOperations.Claim([this, &characteristic]()
{
WriteCharacteristicDescriptor(characteristic, services::GattCharacteristic::PropertyFlags::indicate, services::GattDescriptor::ClientCharacteristicConfiguration::CharacteristicValue::enableIndication);
});
}

void GattClientSt::DisableIndication(const services::GattClientCharacteristicOperationsObserver& characteristic, const infra::Function<void()>& onDone)
{
this->onDone = onDone;

WriteCharacteristicDescriptor(characteristic, services::GattCharacteristic::PropertyFlags::indicate, services::GattDescriptor::ClientCharacteristicConfiguration::CharacteristicValue::disable);
claimerCharacteristicOperations.Claim([this, &characteristic]()
{
WriteCharacteristicDescriptor(characteristic, services::GattCharacteristic::PropertyFlags::indicate, services::GattDescriptor::ClientCharacteristicConfiguration::CharacteristicValue::disable);
});
}

void GattClientSt::HciEvent(hci_event_pckt& event)
Expand Down Expand Up @@ -204,9 +250,12 @@ namespace hal
really_assert(gattProcedureEvent.Connection_Handle == connectionHandle);

if (onDiscoveryCompletion)
infra::Subject<services::GattClientDiscoveryObserver>::NotifyObservers(std::exchange(onDiscoveryCompletion, nullptr));
onDiscoveryCompletion();
else if (onDone)
std::exchange(onDone, nullptr)();
{
onDone();
claimerCharacteristicOperations.Release();
}
}
}

Expand Down Expand Up @@ -245,7 +294,10 @@ namespace hal
really_assert(attReadResponse.Connection_Handle == connectionHandle);

if (onResponse)
std::exchange(onResponse, nullptr)(data);
{
onResponse(data);
claimerCharacteristicOperations.Release();
}
}

void GattClientSt::HandleGattIndicationEvent(evt_blecore_aci* vendorEvent)
Expand Down
7 changes: 6 additions & 1 deletion hal_st/middlewares/ble_middleware/GattClientSt.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@

#include "ble/ble.h"
#include "hal_st/middlewares/ble_middleware/HciEventObserver.hpp"
#include "infra/event/ClaimableResource.hpp"
#include "infra/stream/ByteInputStream.hpp"
#include "infra/util/AutoResetFunction.hpp"
#include "infra/util/BoundedVector.hpp"
Expand Down Expand Up @@ -75,9 +76,13 @@ namespace hal

static constexpr uint16_t invalidConnection = 0xffff;

infra::Function<void(services::GattClientDiscoveryObserver&)> onDiscoveryCompletion;
infra::AutoResetFunction<void()> onDiscoveryCompletion;
infra::AutoResetFunction<void(const infra::ConstByteRange&)> onResponse;
infra::AutoResetFunction<void()> onDone;

infra::ClaimableResource resource;
infra::ClaimableResource::Claimer claimerDiscovery{ resource };
infra::ClaimableResource::Claimer::WithSize<2 * sizeof(services::GattClientDiscovery&) + sizeof(infra::ByteRange)> claimerCharacteristicOperations{ resource };
};
}

Expand Down

0 comments on commit b445f8f

Please sign in to comment.