/* * Copyright 2022 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at: * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #pragma once #include #include #include #include #include #include #include #include "common/strings.h" #include "hci/address.h" #include "os/metrics.h" namespace bluetooth { namespace metrics { using android::bluetooth::le::LeAclConnectionState; using android::bluetooth::le::LeConnectionOriginType; using android::bluetooth::le::LeConnectionState; using android::bluetooth::le::LeConnectionType; using ClockTimePoint = std::chrono::time_point; const static ClockTimePoint kInvalidTimePoint{}; inline int64_t get_timedelta_nanos(const ClockTimePoint& t1, const ClockTimePoint& t2) { if (t1 == kInvalidTimePoint || t2 == kInvalidTimePoint) { return -1; } return std::abs(std::chrono::duration_cast(t2 - t1).count()); } class BaseMetricsLoggerModule { public: BaseMetricsLoggerModule() {} virtual void LogMetricBluetoothLESession(os::LEConnectionSessionOptions session_options) = 0; virtual ~BaseMetricsLoggerModule() {} }; class MetricsLoggerModule : public BaseMetricsLoggerModule { public: MetricsLoggerModule() {} void LogMetricBluetoothLESession(os::LEConnectionSessionOptions session_options); virtual ~MetricsLoggerModule() {} }; class LEConnectionMetricState { public: hci::Address address; LEConnectionMetricState(const hci::Address address) : address(address) {} LeConnectionState state; LeAclConnectionState acl_state; LeConnectionType input_connection_type = LeConnectionType::CONNECTION_TYPE_UNSPECIFIED; android::bluetooth::hci::StatusEnum acl_status_code; ClockTimePoint start_timepoint = kInvalidTimePoint; ClockTimePoint end_timepoint = kInvalidTimePoint; bool is_cancelled = false; LeConnectionOriginType connection_origin_type = LeConnectionOriginType::ORIGIN_UNSPECIFIED; bool IsStarted(); bool IsEnded(); bool IsCancelled(); void AddStateChangedEvent( LeConnectionOriginType origin_type, LeConnectionType connection_type, LeConnectionState transaction_state, std::vector> argument_list); }; class LEConnectionMetricsRemoteDevice { public: LEConnectionMetricsRemoteDevice(); LEConnectionMetricsRemoteDevice(BaseMetricsLoggerModule* baseMetricsLoggerModule); void AddStateChangedEvent( const hci::Address& address, LeConnectionOriginType origin_type, LeConnectionType connection_type, LeConnectionState transaction_state, std::vector> argument_list); void UploadLEConnectionSession(const hci::Address& address); private: mutable std::mutex le_connection_metrics_remote_device_guard; std::vector> device_metrics; std::unordered_map opened_devices; BaseMetricsLoggerModule* metrics_logger_module; }; class MetricsCollector { public: // getting the LE Connection Metrics Collector static LEConnectionMetricsRemoteDevice* GetLEConnectionMetricsCollector(); private: static LEConnectionMetricsRemoteDevice* le_connection_metrics_remote_device; }; } // namespace metrics } // namespace bluetooth