Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
29 commits
Select commit Hold shift + click to select a range
7f0ac93
Split MTU exchange interface
XavierBernhardt-Philips Dec 4, 2025
5c4b38b
Fix test mocks for renamed AttMtuExchangeReceiver interface
XavierBernhardt-Philips Dec 4, 2025
6a6fca6
Merge branch 'main' into feature/split_AttMtuExchange_interface
XavierBernhardt-Philips Dec 4, 2025
c32b8fd
refactor: rename AttMtuExchangeReceiver to AttMtuExchange and update …
XavierBernhardt-Philips Dec 8, 2025
968097b
refactor: update AttMtuExchange references in ClaimingGattClientAdapt…
XavierBernhardt-Philips Dec 8, 2025
b66a609
work
XavierBernhardt-Philips Dec 8, 2025
4d40438
test
XavierBernhardt-Philips Dec 8, 2025
1c2af3a
small stuff
XavierBernhardt-Philips Dec 8, 2025
5301ff3
minor
XavierBernhardt-Philips Dec 8, 2025
d6f0d7d
Merge remote-tracking branch 'origin/main'
XavierBernhardt-Philips Dec 8, 2025
f37dc00
Merge remote-tracking branch 'origin/HEAD' into feature/split_AttMtuE…
XavierBernhardt-Philips Dec 8, 2025
2a14de6
changed discussed with oguz
XavierBernhardt-Philips Dec 11, 2025
bab5aa8
Merge remote-tracking branch 'origin/main' into feature/split_AttMtuE…
XavierBernhardt-Philips Dec 12, 2025
d8f7881
Merge branch 'main' into feature/split_AttMtuExchange_interface
XavierBernhardt-Philips Dec 16, 2025
cfe6d50
minor refactor
XavierBernhardt-Philips Dec 16, 2025
ed6bd00
Merge branch 'main' into feature/split_AttMtuExchange_interface
XavierBernhardt-Philips Dec 16, 2025
a9cef45
changes
XavierBernhardt-Philips Dec 16, 2025
619d64b
requisite changes
XavierBernhardt-Philips Dec 17, 2025
ae10263
coverage
XavierBernhardt-Philips Dec 17, 2025
1ed62fa
fix
XavierBernhardt-Philips Dec 17, 2025
b852a8b
removed gattclient from blefacade
XavierBernhardt-Philips Dec 17, 2025
0ccbf96
Add onDone to MtuExchange
oguzcanoguz Dec 18, 2025
8dbe0e6
Use EXPECT_THAT iso ASSERT_THAT
oguzcanoguz Dec 23, 2025
93647c5
Refactor AttMtu interfaces
oguzcanoguz Dec 23, 2025
c979670
Fix build errors
oguzcanoguz Dec 23, 2025
d522204
Merge branch 'main' into feature/split_AttMtuExchange_interface
XavierBernhardt-Philips Jan 5, 2026
fae292c
Merge branch 'main' into feature/split_AttMtuExchange_interface
XavierBernhardt-Philips Jan 8, 2026
d0bf013
Merge branch 'main' into feature/split_AttMtuExchange_interface
XavierBernhardt-Philips Jan 9, 2026
5e76a00
Merge branch 'main' into feature/split_AttMtuExchange_interface
XavierBernhardt-Philips Jan 12, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
19 changes: 11 additions & 8 deletions services/ble/ClaimingGattClientAdapter.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -178,16 +178,21 @@ namespace services
PerformDescriptorOperation();
}

uint16_t ClaimingGattClientAdapter::EffectiveMaxAttMtuSize() const
uint16_t ClaimingGattClientAdapter::EffectiveAttMtuSize() const
{
return AttMtuExchangeObserver::Subject().EffectiveMaxAttMtuSize();
return AttMtuExchangeObserver::Subject().EffectiveAttMtuSize();
}

void ClaimingGattClientAdapter::MtuExchange()
void ClaimingGattClientAdapter::MtuExchange(const infra::Function<void(OperationStatus)>& onDone)
{
mtuExchangeOnDone = onDone;
attMtuExchangeClaimer.Claim([this]()
{
AttMtuExchangeObserver::Subject().MtuExchange();
GattClientObserver::Subject().MtuExchange([this](OperationStatus result)
{
attMtuExchangeClaimer.Release();
mtuExchangeOnDone(result);
});
});
}

Expand Down Expand Up @@ -222,14 +227,12 @@ namespace services
});
}

void ClaimingGattClientAdapter::ExchangedMaxAttMtuSize()
void ClaimingGattClientAdapter::ExchangedAttMtuSize()
{
infra::Subject<AttMtuExchangeObserver>::NotifyObservers([](auto& observer)
{
observer.ExchangedMaxAttMtuSize();
observer.ExchangedAttMtuSize();
});

attMtuExchangeClaimer.Release();
}

void ClaimingGattClientAdapter::DeviceDiscovered(const GapAdvertisingReport& deviceDiscovered)
Expand Down
14 changes: 10 additions & 4 deletions services/ble/ClaimingGattClientAdapter.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
#define SERVICES_GATT_CLIENT_DECORATOR_HPP

#include "infra/event/ClaimableResource.hpp"
#include "infra/util/AutoResetFunction.hpp"
#include "infra/util/Function.hpp"
#include "optional"
#include "services/ble/Gap.hpp"
Expand All @@ -17,6 +18,7 @@ namespace services
: public GattClientDiscovery
, public GattClientCharacteristicOperations
, public AttMtuExchange
, public GattClientMtuExchange
, private GattClientObserver
, private AttMtuExchangeObserver
, private GapCentralObserver
Expand All @@ -38,9 +40,11 @@ namespace services
void EnableIndication(AttAttribute::Handle handle, const infra::Function<void(OperationStatus)>& onDone) override;
void DisableIndication(AttAttribute::Handle handle, const infra::Function<void(OperationStatus)>& onDone) override;

// Implementation of GattClientMtuExchange
virtual void MtuExchange(const infra::Function<void(OperationStatus)>& onDone) override;

// Implementation of AttMtuExchange
uint16_t EffectiveMaxAttMtuSize() const override;
void MtuExchange() override;
uint16_t EffectiveAttMtuSize() const override;

private:
// Implementation of GattClientObserver
Expand All @@ -54,7 +58,7 @@ namespace services
void IndicationReceived(AttAttribute::Handle handle, infra::ConstByteRange data, const infra::Function<void()>& onDone) override;

// Implementation of AttMtuExchangeObserver
void ExchangedMaxAttMtuSize() override;
void ExchangedAttMtuSize() override;

// Implementation of GapCentralObserver
void DeviceDiscovered(const GapAdvertisingReport& deviceDiscovered) override;
Expand Down Expand Up @@ -115,14 +119,16 @@ namespace services

CharacteristicOperation(Operation operation, AttAttribute::Handle handle)
: operation(operation)
, handle(handle){};
, handle(handle)
{}

Operation operation;
AttAttribute::Handle handle;
};

std::optional<std::variant<DiscoveredService, DiscoveredCharacteristic, DiscoveredDescriptor, HandleRange>> discoveryContext;
std::optional<CharacteristicOperation> characteristicOperationContext;
infra::AutoResetFunction<void(OperationStatus)> mtuExchangeOnDone;

infra::ClaimableResource resource;
infra::ClaimableResource::Claimer characteristicOperationsClaimer{ resource };
Expand Down
10 changes: 10 additions & 0 deletions services/ble/Gatt.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -108,6 +108,16 @@ namespace services
{
return 0;
}

uint16_t AttMtuExchangeImpl::EffectiveAttMtuSize() const
{
return attMtu;
}

void AttMtuExchangeImpl::SetAttMtu(uint16_t value)
{
attMtu = value;
}
}

namespace infra
Expand Down
26 changes: 20 additions & 6 deletions services/ble/Gatt.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
#include "infra/util/EnumCast.hpp"
#include "infra/util/Observer.hpp"
#include "services/ble/Att.hpp"
#include <cstdint>

namespace services
{
Expand Down Expand Up @@ -115,20 +116,33 @@ namespace services
: public infra::Observer<AttMtuExchangeObserver, AttMtuExchange>
{
public:
using infra::Observer<AttMtuExchangeObserver, AttMtuExchange>::Observer;
using Observer::Observer;

virtual void ExchangedMaxAttMtuSize() = 0;
virtual void ExchangedAttMtuSize() = 0;
};

class AttMtuExchange
: public infra::Subject<AttMtuExchangeObserver>
{
protected:
~AttMtuExchange() = default;

public:
virtual uint16_t EffectiveMaxAttMtuSize() const = 0;
virtual void MtuExchange() = 0;
virtual uint16_t EffectiveAttMtuSize() const = 0;
};

protected:
static constexpr uint16_t defaultMaxAttMtuSize = 23;
class AttMtuExchangeImpl
: public AttMtuExchange
{
public:
virtual ~AttMtuExchangeImpl() = default;
uint16_t EffectiveAttMtuSize() const override;
void SetAttMtu(uint16_t value);

static constexpr uint16_t defaultAttMtuSize = 23;

private:
uint16_t attMtu = defaultAttMtuSize;
};

inline GattCharacteristic::PropertyFlags operator|(GattCharacteristic::PropertyFlags lhs, GattCharacteristic::PropertyFlags rhs)
Expand Down
8 changes: 8 additions & 0 deletions services/ble/GattClient.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -129,6 +129,12 @@ namespace services
virtual void StartDescriptorDiscovery(AttAttribute::Handle handle, AttAttribute::Handle endHandle) = 0;
};

class GattClientMtuExchange
{
public:
virtual void MtuExchange(const infra::Function<void(OperationStatus)>& onDone) = 0;
};

class GattClient;

class GattClientObserver
Expand Down Expand Up @@ -163,6 +169,8 @@ namespace services
virtual void DisableNotification(AttAttribute::Handle handle, const infra::Function<void(OperationStatus)>& onDone) = 0;
virtual void EnableIndication(AttAttribute::Handle handle, const infra::Function<void(OperationStatus)>& onDone) = 0;
virtual void DisableIndication(AttAttribute::Handle handle, const infra::Function<void(OperationStatus)>& onDone) = 0;

virtual void MtuExchange(const infra::Function<void(OperationStatus)>& onDone) = 0;
};
}

Expand Down
27 changes: 14 additions & 13 deletions services/ble/test/TestClaimingGattClientAdapter.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -91,17 +91,21 @@ TEST_F(ClaimingGattClientAdapterTest, should_call_descriptor_discovered)

TEST_F(ClaimingGattClientAdapterTest, should_call_mtu_exchange)
{
EXPECT_CALL(attMtuExchange, EffectiveMaxAttMtuSize()).WillOnce(testing::Return(200));
EXPECT_EQ(200, adapter.EffectiveMaxAttMtuSize());
EXPECT_CALL(attMtuExchange, EffectiveAttMtuSize()).WillOnce(testing::Return(200));
EXPECT_EQ(200, adapter.EffectiveAttMtuSize());

EXPECT_CALL(attMtuExchange, MtuExchange());
adapter.MtuExchange();
infra::Function<void(services::OperationStatus)> storedOnDone;
EXPECT_CALL(gattClient, MtuExchange(testing::_)).WillOnce(testing::SaveArg<0>(&storedOnDone));

infra::VerifyingFunction<void(services::OperationStatus)> onDone{ services::OperationStatus::success };
adapter.MtuExchange(onDone);
ExecuteAllActions();
storedOnDone(services::OperationStatus::success);

EXPECT_CALL(attMtuExchangeObserver, ExchangedMaxAttMtuSize());
EXPECT_CALL(attMtuExchangeObserver, ExchangedAttMtuSize());
attMtuExchange.NotifyObservers([](auto& observer)
{
observer.ExchangedMaxAttMtuSize();
observer.ExchangedAttMtuSize();
});
}

Expand Down Expand Up @@ -158,17 +162,14 @@ TEST_F(ClaimingGattClientAdapterTest, can_write_without_response_while_awaiting_

TEST_F(ClaimingGattClientAdapterTest, should_release_claimer_when_disconnected)
{
EXPECT_CALL(attMtuExchange, EffectiveMaxAttMtuSize()).WillOnce(testing::Return(200));
EXPECT_EQ(200, adapter.EffectiveMaxAttMtuSize());

EXPECT_CALL(attMtuExchange, MtuExchange());
adapter.MtuExchange();
EXPECT_CALL(gattClient, MtuExchange(testing::_));
adapter.MtuExchange([](auto) {});
ExecuteAllActions();

gapCentral.ChangeState(services::GapState::standby);

EXPECT_CALL(attMtuExchange, MtuExchange());
adapter.MtuExchange();
EXPECT_CALL(gattClient, MtuExchange(testing::_));
adapter.MtuExchange([](auto) {});
ExecuteAllActions();
}

Expand Down
11 changes: 10 additions & 1 deletion services/ble/test/TestGatt.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -108,4 +108,13 @@ TEST(GattInsertionOperatorUuidTest, uuid_overload_operator)
stream << "Uuid16: " << services::AttAttribute::Uuid(uuid16) << ", Uuid128: " << services::AttAttribute::Uuid(uuid128);

EXPECT_EQ("Uuid16: [42], Uuid128: [100f0e0d0c0b0a090807060504030201]", stream.Storage());
}
}

TEST(GattTest, UpdateAttMtuExchangeTest)
{
services::AttMtuExchangeImpl exchange{};

EXPECT_THAT(exchange.EffectiveAttMtuSize(), testing::Eq(services::AttMtuExchangeImpl::defaultAttMtuSize));
exchange.SetAttMtu(0);
EXPECT_THAT(exchange.EffectiveAttMtuSize(), testing::Eq(0));
}
1 change: 1 addition & 0 deletions services/ble/test_doubles/GattClientMock.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -96,6 +96,7 @@ namespace services
MOCK_METHOD(void, DisableNotification, (AttAttribute::Handle handle, const infra::Function<void(OperationStatus)>& onDone), (override));
MOCK_METHOD(void, EnableIndication, (AttAttribute::Handle handle, const infra::Function<void(OperationStatus)>& onDone), (override));
MOCK_METHOD(void, DisableIndication, (AttAttribute::Handle handle, const infra::Function<void(OperationStatus)>& onDone), (override));
MOCK_METHOD(void, MtuExchange, (const infra::Function<void(OperationStatus)>& onDone), (override));
};
}

Expand Down
5 changes: 2 additions & 3 deletions services/ble/test_doubles/GattMock.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -10,8 +10,7 @@ namespace services
: public AttMtuExchange
{
public:
MOCK_METHOD(uint16_t, EffectiveMaxAttMtuSize, (), (const override));
MOCK_METHOD(void, MtuExchange, (), (override));
MOCK_METHOD(uint16_t, EffectiveAttMtuSize, (), (const override));
};

class AttMtuExchangeObserverMock
Expand All @@ -20,7 +19,7 @@ namespace services
public:
using AttMtuExchangeObserver::AttMtuExchangeObserver;

MOCK_METHOD(void, ExchangedMaxAttMtuSize, (), (override));
MOCK_METHOD(void, ExchangedAttMtuSize, (), (override));
};
}

Expand Down
Loading