diff --git a/CMakeLists.txt b/CMakeLists.txt index be61d140..11c3cf28 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -19,7 +19,7 @@ if (HALST_STANDALONE) FetchContent_Declare( emil GIT_REPOSITORY https://github.com/philips-software/amp-embedded-infra-lib.git - GIT_TAG 77eb4170285a16e31cae5aee6a96e792baea2aa7 # Unreleased + GIT_TAG 88a4689e8f08e2afe856170aa5b5036f69d1610c # Unreleased ) FetchContent_MakeAvailable(emil) diff --git a/hal_st/middlewares/ble_middleware/GapCentralSt.cpp b/hal_st/middlewares/ble_middleware/GapCentralSt.cpp index 24b94c02..ac302e22 100644 --- a/hal_st/middlewares/ble_middleware/GapCentralSt.cpp +++ b/hal_st/middlewares/ble_middleware/GapCentralSt.cpp @@ -1,4 +1,5 @@ #include "hal_st/middlewares/ble_middleware/GapCentralSt.hpp" +#include "ble_defs.h" #include "infra/event/EventDispatcherWithWeakPtr.hpp" #include "infra/stream/ByteInputStream.hpp" @@ -14,31 +15,6 @@ namespace hal namespace { - infra::ConstByteRange GetLocalNameFromAdvertising(infra::ConstByteRange advertisingIndication) - { - infra::ByteInputStream stream(advertisingIndication, infra::noFail); - - while (!stream.Empty()) - { - uint8_t length = 0; - uint8_t adType = 0; - - stream >> length; - - if (length > 0) - { - stream >> adType; - - if (adType == AD_TYPE_COMPLETE_LOCAL_NAME || adType == AD_TYPE_SHORTENED_LOCAL_NAME) - return stream.ContiguousRange(length - 1); - - stream.Consume(length - 1); - } - } - - return infra::ConstByteRange(); - } - services::GapAdvertisingEventType ToAdvertisingEventType(uint8_t eventType) { return static_cast(eventType); @@ -165,6 +141,19 @@ namespace hal } } + void GapCentralSt::HandleGattCompleteEvent(evt_blecore_aci* vendorEvent) + { + GapSt::HandleGattCompleteEvent(vendorEvent); + + auto gattCompleteEvent = *reinterpret_cast(vendorEvent->data); + + really_assert(gattCompleteEvent.Connection_Handle == connectionContext.connectionHandle); + really_assert(gattCompleteEvent.Error_Code == BLE_STATUS_SUCCESS); + + if (onConnection) + infra::Subject::NotifyObservers(std::exchange(onConnection, nullptr)); + } + void GapCentralSt::HandleL2capConnectionUpdateRequestEvent(evt_blecore_aci* vendorEvent) { GapSt::HandleL2capConnectionUpdateRequestEvent(vendorEvent); @@ -185,7 +174,44 @@ namespace hal void GapCentralSt::HandleGapDirectConnectionEstablishmentEvent() { - infra::EventDispatcherWithWeakPtr::Instance().Schedule([this]() { this->DataLengthUpdate(); }); + onConnection = [](services::GapCentralObserver& observer) + { + observer.StateChanged(services::GapState::connected); + }; + + SetPhy(); + SetDataLength(); + MtuExchange(); + } + + void GapCentralSt::SetPhy() + { + infra::EventDispatcherWithWeakPtr::Instance().Schedule([this]() + { + if (hci_le_set_phy(this->connectionContext.connectionHandle, GapSt::allPhys, GapSt::speed2Mbps, GapSt::speed2Mbps, 0) == commandDisallowed) + { + infra::EventDispatcherWithWeakPtr::Instance().Schedule([this]() + { + this->SetPhy(); + }); + } + }); + } + + void GapCentralSt::SetDataLength() const + { + infra::EventDispatcherWithWeakPtr::Instance().Schedule([this]() + { + hci_le_set_data_length(this->connectionContext.connectionHandle, services::GapConnectionParameters::connectionInitialMaxTxOctets, services::GapConnectionParameters::connectionInitialMaxTxTime); + }); + } + + void GapCentralSt::MtuExchange() const + { + infra::EventDispatcherWithWeakPtr::Instance().Schedule([this]() + { + aci_gatt_exchange_config(this->connectionContext.connectionHandle); + }); } void GapCentralSt::HandleAdvertisingReport(const Advertising_Report_t& advertisingReport) @@ -199,27 +225,21 @@ namespace hal auto advertisementData = reinterpret_cast(&advertisingReport.Length_Data) + 1; - discoveredDevice.data = GetLocalNameFromAdvertising(infra::MemoryRange(advertisementData, advertisementData + advertisingReport.Length_Data)); + discoveredDevice.data = infra::MemoryRange(advertisementData, advertisementData + advertisingReport.Length_Data); - infra::Subject::NotifyObservers([&discoveredDevice](auto& observer) { observer.DeviceDiscovered(discoveredDevice); }); + infra::Subject::NotifyObservers([&discoveredDevice](auto& observer) + { + observer.DeviceDiscovered(discoveredDevice); + }); } - void GapCentralSt::SetConnectionInterval(uint16_t connectionInterval, uint16_t slaveLatency, uint16_t timeoutMultiplier) + void GapCentralSt::SetConnectionInterval() const { aci_l2cap_connection_parameter_update_req(connectionContext.connectionHandle, connectionParameters.minConnIntMultiplier, connectionParameters.maxConnIntMultiplier, connectionParameters.slaveLatency, connectionParameters.supervisorTimeoutMs); } - void GapCentralSt::DataLengthUpdate() - { - [[maybe_unused]] auto status = hci_le_set_data_length(connectionContext.connectionHandle, transmissionOctets, transmissionTime); - - assert(status == BLE_STATUS_SUCCESS); - - infra::Subject::NotifyObservers([](auto& observer) { observer.StateChanged(services::GapState::connected); }); - } - void GapCentralSt::Initialize(const GapService& gapService) { uint16_t gapServiceHandle, gapDevNameCharHandle, gapAppearanceCharHandle; diff --git a/hal_st/middlewares/ble_middleware/GapCentralSt.hpp b/hal_st/middlewares/ble_middleware/GapCentralSt.hpp index 0209e94a..bbe167c1 100644 --- a/hal_st/middlewares/ble_middleware/GapCentralSt.hpp +++ b/hal_st/middlewares/ble_middleware/GapCentralSt.hpp @@ -7,6 +7,7 @@ #include "hci_tl.h" #include "infra/util/BoundedString.hpp" #include "infra/util/BoundedVector.hpp" +#include "infra/util/Function.hpp" #include "infra/util/ProxyCreator.hpp" #include "services/ble/BondStorageSynchronizer.hpp" #include "services/ble/Gap.hpp" @@ -36,6 +37,7 @@ namespace hal virtual void HandleHciLeDataLengthChangeEvent(evt_le_meta_event* metaEvent) override; virtual void HandleHciLePhyUpdateCompleteEvent(evt_le_meta_event* metaEvent) override; virtual void HandleGapProcedureCompleteEvent(evt_blecore_aci* vendorEvent) override; + virtual void HandleGattCompleteEvent(evt_blecore_aci* vendorEvent) override; virtual void HandleL2capConnectionUpdateRequestEvent(evt_blecore_aci* vendorEvent) override; private: @@ -43,16 +45,15 @@ namespace hal void HandleGapDirectConnectionEstablishmentEvent(); void HandleAdvertisingReport(const Advertising_Report_t& advertisingReport); - void SetConnectionInterval(uint16_t connectionInterval, uint16_t slaveLatency, uint16_t timeoutMultiplier); - void DataLengthUpdate(); + void SetConnectionInterval() const; + void SetPhy(); + void SetDataLength() const; + void MtuExchange() const; void Initialize(const GapService& gapService); private: static const services::GapConnectionParameters connectionUpdateParameters; - const uint16_t transmissionOctets = 251; - const uint16_t transmissionTime = 2120; - // Create connection parameters const uint16_t leScanInterval = 0x320; const uint16_t leScanWindow = 0x320; @@ -68,8 +69,12 @@ namespace hal const uint8_t filterDuplicatesEnabled = 1; const uint8_t acceptAllParameters = 1; + // HCI status + const uint8_t commandDisallowed = 0x0c; + bool discovering = false; services::GapConnectionParameters connectionParameters; + infra::Function onConnection; }; } diff --git a/hal_st/middlewares/ble_middleware/GapSt.cpp b/hal_st/middlewares/ble_middleware/GapSt.cpp index 4dbe13f9..7b58b230 100644 --- a/hal_st/middlewares/ble_middleware/GapSt.cpp +++ b/hal_st/middlewares/ble_middleware/GapSt.cpp @@ -93,7 +93,7 @@ namespace hal SVCCTL_Init(); - hci_le_write_suggested_default_data_length(services::GapPeripheral::connectionInitialMaxTxOctets, services::GapPeripheral::connectionInitialMaxTxTime); + hci_le_write_suggested_default_data_length(services::GapConnectionParameters::connectionInitialMaxTxOctets, services::GapConnectionParameters::connectionInitialMaxTxTime); hci_le_set_default_phy(allPhys, speed2Mbps, speed2Mbps); } @@ -137,8 +137,15 @@ namespace hal void GapSt::HandleMtuExchangeResponseEvent(evt_blecore_aci* vendorEvent) { - maxAttMtu = reinterpret_cast(vendorEvent->data)->Server_RX_MTU; - AttMtuExchange::NotifyObservers([](auto& observer) { observer.ExchangedMaxAttMtuSize(); }); + auto attExchangeMtuResponse = *reinterpret_cast(vendorEvent->data); + + really_assert(attExchangeMtuResponse.Connection_Handle == connectionContext.connectionHandle); + maxAttMtu = attExchangeMtuResponse.Server_RX_MTU; + + AttMtuExchange::NotifyObservers([](auto& observer) + { + observer.ExchangedMaxAttMtuSize(); + }); } void GapSt::SetAddress(const hal::MacAddress& address, services::GapDeviceAddressType addressType) @@ -211,6 +218,9 @@ namespace hal case ACI_GAP_PROC_COMPLETE_VSEVT_CODE: HandleGapProcedureCompleteEvent(vendorEvent); break; + case ACI_GATT_PROC_COMPLETE_VSEVT_CODE: + HandleGattCompleteEvent(vendorEvent); + break; case ACI_L2CAP_CONNECTION_UPDATE_REQ_VSEVT_CODE: HandleL2capConnectionUpdateRequestEvent(vendorEvent); break; diff --git a/hal_st/middlewares/ble_middleware/GapSt.hpp b/hal_st/middlewares/ble_middleware/GapSt.hpp index b12d2cc2..d5215a52 100644 --- a/hal_st/middlewares/ble_middleware/GapSt.hpp +++ b/hal_st/middlewares/ble_middleware/GapSt.hpp @@ -46,17 +46,18 @@ namespace hal virtual void HandleHciLePhyUpdateCompleteEvent(evt_le_meta_event* metaEvent) {}; virtual void HandleHciLeEnhancedConnectionCompleteEvent(evt_le_meta_event* metaEvent); - virtual void HandlePairingCompleteEvent(evt_blecore_aci* vendorEvent) {}; + virtual void HandlePairingCompleteEvent(evt_blecore_aci* vendorEvent){}; virtual void HandleBondLostEvent(evt_blecore_aci* vendorEvent); - virtual void HandleGapProcedureCompleteEvent(evt_blecore_aci* vendorEvent) {}; - virtual void HandleL2capConnectionUpdateRequestEvent(evt_blecore_aci* vendorEvent) {}; + virtual void HandleGapProcedureCompleteEvent(evt_blecore_aci* vendorEvent){}; + virtual void HandleGattCompleteEvent(evt_blecore_aci* vendorEvent){}; + virtual void HandleL2capConnectionUpdateRequestEvent(evt_blecore_aci* vendorEvent){}; virtual void HandleMtuExchangeResponseEvent(evt_blecore_aci* vendorEvent); void SetAddress(const hal::MacAddress& address, services::GapDeviceAddressType addressType); private: // Implementation of HciEventSink - virtual void HciEvent(hci_event_pckt& event); + void HciEvent(hci_event_pckt& event) override; void HandleHciLeMetaEvent(hci_event_pckt& eventPacket); void HandleHciVendorSpecificDebugEvent(hci_event_pckt& eventPacket); diff --git a/hal_st/middlewares/ble_middleware/GattClientSt.cpp b/hal_st/middlewares/ble_middleware/GattClientSt.cpp index 5339af06..151f7fcd 100644 --- a/hal_st/middlewares/ble_middleware/GattClientSt.cpp +++ b/hal_st/middlewares/ble_middleware/GattClientSt.cpp @@ -191,13 +191,15 @@ namespace hal { auto gattProcedureEvent = *reinterpret_cast(vendorEvent->data); - really_assert(gattProcedureEvent.Connection_Handle == connectionHandle); - really_assert(gattProcedureEvent.Error_Code == BLE_STATUS_SUCCESS); + if (gattProcedureEvent.Error_Code == BLE_STATUS_SUCCESS) + { + really_assert(gattProcedureEvent.Connection_Handle == connectionHandle); - if (onDiscoveryCompletion) - infra::Subject::NotifyObservers(std::exchange(onDiscoveryCompletion, nullptr)); - else if (onDone) - std::exchange(onDone, nullptr)(); + if (onDiscoveryCompletion) + infra::Subject::NotifyObservers(std::exchange(onDiscoveryCompletion, nullptr)); + else if (onDone) + std::exchange(onDone, nullptr)(); + } } void GattClientSt::HandleHciLeConnectionCompleteEvent(evt_le_meta_event* metaEvent) diff --git a/hal_st/middlewares/ble_middleware/GattClientSt.hpp b/hal_st/middlewares/ble_middleware/GattClientSt.hpp index df415f9c..00f057cd 100644 --- a/hal_st/middlewares/ble_middleware/GattClientSt.hpp +++ b/hal_st/middlewares/ble_middleware/GattClientSt.hpp @@ -13,7 +13,6 @@ namespace hal class GattClientSt : public services::GattClientDiscovery , public services::GattClientCharacteristicOperations - , public services::GattClientStackUpdate , public hal::HciEventSink { public: diff --git a/hal_st/middlewares/ble_middleware/TracingGapCentralSt.cpp b/hal_st/middlewares/ble_middleware/TracingGapCentralSt.cpp index ea32affb..00e14e02 100644 --- a/hal_st/middlewares/ble_middleware/TracingGapCentralSt.cpp +++ b/hal_st/middlewares/ble_middleware/TracingGapCentralSt.cpp @@ -1,18 +1,5 @@ #include "hal_st/middlewares/ble_middleware/TracingGapCentralSt.hpp" -namespace services -{ - infra::TextOutputStream& operator<<(infra::TextOutputStream& stream, const GapDeviceAddressType& addressType) - { - if (addressType == services::GapDeviceAddressType::publicAddress) - stream << "public"; - else - stream << "random"; - - return stream; - } -} - namespace hal { TracingGapCentralSt::TracingGapCentralSt(hal::HciEventSource& hciEventSource, hal::MacAddress address, const RootKeys& rootKeys, uint16_t maxAttMtuSize, uint8_t txPowerLevel, const GapService gapService, uint32_t* bleBondsStorage, services::Tracer& tracer) @@ -59,59 +46,79 @@ namespace hal void TracingGapCentralSt::HandleHciDisconnectEvent(hci_event_pckt& eventPacket) { const auto disconnectEvt = reinterpret_cast(eventPacket.data); - tracer.Trace() << "TracingGapCentralSt::HandleHciDisconnectEvent handle = 0x" << infra::hex << disconnectEvt->Connection_Handle; + + tracer.Trace() << "TracingGapCentralSt::HandleHciDisconnectEvent"; + tracer.Trace() << "\tConnection handle : 0x" << infra::hex << disconnectEvt->Connection_Handle; + tracer.Trace() << "\tReason : 0x" << infra::hex << disconnectEvt->Reason; + GapCentralSt::HandleHciDisconnectEvent(eventPacket); } void TracingGapCentralSt::HandleHciLeConnectionCompleteEvent(evt_le_meta_event* metaEvent) { const auto connectionCompleteEvt = reinterpret_cast(metaEvent->data); - tracer.Trace() << "TracingGapCentralSt::HandleHciLeConnectionCompleteEvent Handle - 0x" << infra::hex << connectionCompleteEvt->Connection_Handle; hal::MacAddress mac; - std::copy(std::begin(connectionCompleteEvt->Peer_Address), - std::end(connectionCompleteEvt->Peer_Address), std::begin(mac)); - tracer.Continue() << " Peer address - " << infra::AsMacAddress(mac) << " type - " << connectionCompleteEvt->Peer_Address_Type; + infra::Copy(infra::MakeRange(connectionCompleteEvt->Peer_Address), infra::MakeRange(mac)); + + tracer.Trace() << "TracingGapCentralSt::HandleHciLeConnectionCompleteEvent"; + tracer.Trace() << "\tConnection handle : 0x" << infra::hex << connectionCompleteEvt->Connection_Handle; + tracer.Trace() << "\tPeer address : " << infra::AsMacAddress(mac); + tracer.Trace() << "\tPeer address type : " << connectionCompleteEvt->Peer_Address_Type; + GapCentralSt::HandleHciLeConnectionCompleteEvent(metaEvent); } void TracingGapCentralSt::HandleHciLeConnectionUpdateCompleteEvent(evt_le_meta_event* metaEvent) { const auto evtConnectionUpdate = reinterpret_cast(metaEvent->data); + tracer.Trace() << "TracingGapCentralSt::HandleHciLeConnectionUpdateCompleteEvent"; + tracer.Trace() << "\tConnection handle : 0x" << infra::hex << evtConnectionUpdate->Connection_Handle; tracer.Trace() << "\tConnection Interval : " << evtConnectionUpdate->Conn_Interval; tracer.Trace() << "\tConnection Latency : " << evtConnectionUpdate->Conn_Latency; tracer.Trace() << "\tSupervision Timeout : " << evtConnectionUpdate->Supervision_Timeout; + GapCentralSt::HandleHciLeConnectionUpdateCompleteEvent(metaEvent); } void TracingGapCentralSt::HandleHciLeDataLengthChangeEvent(evt_le_meta_event* metaEvent) { const auto dataLengthChangeEvent = *reinterpret_cast(metaEvent->data); - tracer.Trace() << "TracingGapCentralSt::HandleHciLeDataLengthChangeEvent, Handle - 0x" << infra::hex << dataLengthChangeEvent.Connection_Handle; - tracer.Trace() << "\tMax TX octets : " << dataLengthChangeEvent.MaxTxOctets; - tracer.Trace() << "\tMax TX time : " << dataLengthChangeEvent.MaxTxTime; - tracer.Trace() << "\tMax RX octets : " << dataLengthChangeEvent.MaxRxOctets; - tracer.Trace() << "\tMax RX time : " << dataLengthChangeEvent.MaxRxTime; + + tracer.Trace() << "TracingGapCentralSt::HandleHciLeDataLengthChangeEvent"; + tracer.Trace() << "\tConnection handle : 0x" << infra::hex << dataLengthChangeEvent.Connection_Handle; + tracer.Trace() << "\tMax TX octets : " << dataLengthChangeEvent.MaxTxOctets; + tracer.Trace() << "\tMax TX time : " << dataLengthChangeEvent.MaxTxTime; + tracer.Trace() << "\tMax RX octets : " << dataLengthChangeEvent.MaxRxOctets; + tracer.Trace() << "\tMax RX time : " << dataLengthChangeEvent.MaxRxTime; + GapCentralSt::HandleHciLeDataLengthChangeEvent(metaEvent); } void TracingGapCentralSt::HandleHciLePhyUpdateCompleteEvent(evt_le_meta_event* metaEvent) { const auto evtLePhyUpdate = reinterpret_cast(metaEvent->data); - tracer.Trace() << "TracingGapCentralSt::HandleHciLePhyUpdateCompleteEvent " << evtLePhyUpdate->Status; + + tracer.Trace() << "TracingGapCentralSt::HandleHciLePhyUpdateCompleteEvent"; + tracer.Trace() << "\tConnection handle : 0x" << infra::hex << evtLePhyUpdate->Connection_Handle; + tracer.Trace() << "\tRX phy : " << evtLePhyUpdate->RX_PHY << " Mbps"; + tracer.Trace() << "\tTX phy : " << evtLePhyUpdate->TX_PHY << " Mbps"; + GapCentralSt::HandleHciLePhyUpdateCompleteEvent(metaEvent); } void TracingGapCentralSt::HandleHciLeEnhancedConnectionCompleteEvent(evt_le_meta_event* metaEvent) { const auto enhancedConnectionCompleteEvt = reinterpret_cast(metaEvent->data); + hal::MacAddress mac; + infra::Copy(infra::MakeRange(enhancedConnectionCompleteEvt->Peer_Address), infra::MakeRange(mac)); + tracer.Trace() << "TracingGapCentralSt::HandleHciLeEnhancedConnectionCompleteEvent Handle - 0x" << infra::hex << enhancedConnectionCompleteEvt->Connection_Handle; + tracer.Trace() << "\tConnection handle : 0x" << infra::hex << enhancedConnectionCompleteEvt->Connection_Handle; + tracer.Trace() << "\tPeer address : " << infra::AsMacAddress(mac); + tracer.Trace() << "\tPeer address type : " << enhancedConnectionCompleteEvt->Peer_Address_Type; - hal::MacAddress mac; - std::copy(std::begin(enhancedConnectionCompleteEvt->Peer_Address), - std::end(enhancedConnectionCompleteEvt->Peer_Address), std::begin(mac)); - tracer.Continue() << " Peer address - " << infra::AsMacAddress(mac) << " type - " << enhancedConnectionCompleteEvt->Peer_Address_Type; GapCentralSt::HandleHciLeEnhancedConnectionCompleteEvent(metaEvent); } @@ -143,7 +150,11 @@ namespace hal void TracingGapCentralSt::HandleMtuExchangeResponseEvent(evt_blecore_aci* vendorEvent) { const auto mtuExchangeEvent = reinterpret_cast(vendorEvent->data); - tracer.Trace() << "TracingGapCentralSt::HandleMtuExchangeResponseEvent Server_RX_MTU = " << mtuExchangeEvent->Server_RX_MTU; + + tracer.Trace() << "TracingGapCentralSt::HandleMtuExchangeResponseEvent"; + tracer.Trace() << "\tConnection handle : 0x" << infra::hex << mtuExchangeEvent->Connection_Handle; + tracer.Trace() << "\tServer TX MTU : " << mtuExchangeEvent->Server_RX_MTU; + GapCentralSt::HandleMtuExchangeResponseEvent(vendorEvent); } } diff --git a/hal_st/middlewares/ble_middleware/TracingGattClientSt.cpp b/hal_st/middlewares/ble_middleware/TracingGattClientSt.cpp index d0d13f58..5c92aa09 100644 --- a/hal_st/middlewares/ble_middleware/TracingGattClientSt.cpp +++ b/hal_st/middlewares/ble_middleware/TracingGattClientSt.cpp @@ -1,18 +1,4 @@ #include "hal_st/middlewares/ble_middleware/TracingGattClientSt.hpp" -#include "infra/stream/StringOutputStream.hpp" - -namespace infra -{ - TextOutputStream& operator<<(TextOutputStream& stream, const services::AttAttribute::Uuid& uuid) - { - if (uuid.Is()) - stream << "0x" << hex << uuid.Get(); - else - stream << "[" << AsHex(MakeByteRange(uuid.Get())) << "]"; - - return stream; - } -} namespace hal { @@ -104,4 +90,13 @@ namespace hal GattClientSt::HandleGattNotificationEvent(vendorEvent); } + + void TracingGattClientSt::HandleGattCompleteResponse(evt_blecore_aci* vendorEvent) + { + auto gattProcedureEvent = *reinterpret_cast(vendorEvent->data); + + tracer.Trace() << "TracingGattClientSt::GATT complete response, handle: 0x" << infra::hex << gattProcedureEvent.Connection_Handle << ", status: 0x" << gattProcedureEvent.Error_Code; + + GattClientSt::HandleGattCompleteResponse(vendorEvent); + } } diff --git a/hal_st/middlewares/ble_middleware/TracingGattClientSt.hpp b/hal_st/middlewares/ble_middleware/TracingGattClientSt.hpp index 884dcc20..0b0eb33d 100644 --- a/hal_st/middlewares/ble_middleware/TracingGattClientSt.hpp +++ b/hal_st/middlewares/ble_middleware/TracingGattClientSt.hpp @@ -30,6 +30,7 @@ namespace hal protected: virtual void HandleGattIndicationEvent(evt_blecore_aci* vendorEvent) override; virtual void HandleGattNotificationEvent(evt_blecore_aci* vendorEvent) override; + virtual void HandleGattCompleteResponse(evt_blecore_aci* vendorEvent) override; private: services::Tracer& tracer; diff --git a/hal_st/middlewares/ble_middleware/TracingGattServerSt.cpp b/hal_st/middlewares/ble_middleware/TracingGattServerSt.cpp index f1f003a0..11b03029 100644 --- a/hal_st/middlewares/ble_middleware/TracingGattServerSt.cpp +++ b/hal_st/middlewares/ble_middleware/TracingGattServerSt.cpp @@ -1,18 +1,4 @@ #include "hal_st/middlewares/ble_middleware/TracingGattServerSt.hpp" -#include "infra/stream/StringOutputStream.hpp" - -namespace infra -{ - TextOutputStream& operator<<(TextOutputStream& stream, const services::AttAttribute::Uuid& uuid) - { - if (uuid.Is()) - stream << "0x" << hex << uuid.Get(); - else - stream << "[" << AsHex(MakeByteRange(uuid.Get())) << "]"; - - return stream; - } -} namespace hal {