xref: /aosp_15_r20/tools/netsim/src/hci/rust_device.h (revision cf78ab8cffb8fc9207af348f23af247fb04370a6)
1*cf78ab8cSAndroid Build Coastguard Worker // Copyright 2023 The Android Open Source Project
2*cf78ab8cSAndroid Build Coastguard Worker //
3*cf78ab8cSAndroid Build Coastguard Worker // Licensed under the Apache License, Version 2.0 (the "License");
4*cf78ab8cSAndroid Build Coastguard Worker // you may not use this file except in compliance with the License.
5*cf78ab8cSAndroid Build Coastguard Worker // You may obtain a copy of the License at
6*cf78ab8cSAndroid Build Coastguard Worker //
7*cf78ab8cSAndroid Build Coastguard Worker //      http://www.apache.org/licenses/LICENSE-2.0
8*cf78ab8cSAndroid Build Coastguard Worker //
9*cf78ab8cSAndroid Build Coastguard Worker // Unless required by applicable law or agreed to in writing, software
10*cf78ab8cSAndroid Build Coastguard Worker // distributed under the License is distributed on an "AS IS" BASIS,
11*cf78ab8cSAndroid Build Coastguard Worker // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12*cf78ab8cSAndroid Build Coastguard Worker // See the License for the specific language governing permissions and
13*cf78ab8cSAndroid Build Coastguard Worker // limitations under the License.
14*cf78ab8cSAndroid Build Coastguard Worker #pragma once
15*cf78ab8cSAndroid Build Coastguard Worker 
16*cf78ab8cSAndroid Build Coastguard Worker #include <cstdint>
17*cf78ab8cSAndroid Build Coastguard Worker #include <memory>
18*cf78ab8cSAndroid Build Coastguard Worker #include <string>
19*cf78ab8cSAndroid Build Coastguard Worker 
20*cf78ab8cSAndroid Build Coastguard Worker #include "model/devices/device.h"
21*cf78ab8cSAndroid Build Coastguard Worker #include "packets/link_layer_packets.h"
22*cf78ab8cSAndroid Build Coastguard Worker #include "phy.h"
23*cf78ab8cSAndroid Build Coastguard Worker #include "rust/cxx.h"
24*cf78ab8cSAndroid Build Coastguard Worker 
25*cf78ab8cSAndroid Build Coastguard Worker namespace netsim::hci::facade {
26*cf78ab8cSAndroid Build Coastguard Worker // Use forward declaration instead of including "netsim-cxx/src/lib.rs.h".
27*cf78ab8cSAndroid Build Coastguard Worker struct DynRustBluetoothChipCallbacks;
28*cf78ab8cSAndroid Build Coastguard Worker class RustBluetoothChip;
29*cf78ab8cSAndroid Build Coastguard Worker 
30*cf78ab8cSAndroid Build Coastguard Worker class RustDevice : public rootcanal::Device {
31*cf78ab8cSAndroid Build Coastguard Worker  public:
RustDevice(rust::Box<DynRustBluetoothChipCallbacks> callbacks,const std::string & type,const std::string & address)32*cf78ab8cSAndroid Build Coastguard Worker   RustDevice(rust::Box<DynRustBluetoothChipCallbacks> callbacks,
33*cf78ab8cSAndroid Build Coastguard Worker              const std::string &type, const std::string &address)
34*cf78ab8cSAndroid Build Coastguard Worker       : callbacks_(std::move(callbacks)), TYPE(type) {
35*cf78ab8cSAndroid Build Coastguard Worker     rootcanal::Address::FromString(address, address_);
36*cf78ab8cSAndroid Build Coastguard Worker     this->SetAddress(address_);
37*cf78ab8cSAndroid Build Coastguard Worker   }
38*cf78ab8cSAndroid Build Coastguard Worker 
39*cf78ab8cSAndroid Build Coastguard Worker   void Tick() override;
GetTypeString()40*cf78ab8cSAndroid Build Coastguard Worker   std::string GetTypeString() const override { return TYPE; }
ToString()41*cf78ab8cSAndroid Build Coastguard Worker   std::string ToString() const override { return TYPE; }
Close()42*cf78ab8cSAndroid Build Coastguard Worker   void Close() override {}
43*cf78ab8cSAndroid Build Coastguard Worker   void ReceiveLinkLayerPacket(::model::packets::LinkLayerPacketView packet,
44*cf78ab8cSAndroid Build Coastguard Worker                               rootcanal::Phy::Type type, int8_t rssi) override;
45*cf78ab8cSAndroid Build Coastguard Worker   void SetRustBluetoothChip(std::unique_ptr<RustBluetoothChip>);
46*cf78ab8cSAndroid Build Coastguard Worker 
47*cf78ab8cSAndroid Build Coastguard Worker  private:
48*cf78ab8cSAndroid Build Coastguard Worker   rust::Box<DynRustBluetoothChipCallbacks> callbacks_;
49*cf78ab8cSAndroid Build Coastguard Worker   const std::string TYPE;
50*cf78ab8cSAndroid Build Coastguard Worker };
51*cf78ab8cSAndroid Build Coastguard Worker 
52*cf78ab8cSAndroid Build Coastguard Worker /// Delegation class for RustDevice to be used in Rust.
53*cf78ab8cSAndroid Build Coastguard Worker class RustBluetoothChip {
54*cf78ab8cSAndroid Build Coastguard Worker  public:
RustBluetoothChip(std::shared_ptr<RustDevice> rust_device)55*cf78ab8cSAndroid Build Coastguard Worker   RustBluetoothChip(std::shared_ptr<RustDevice> rust_device)
56*cf78ab8cSAndroid Build Coastguard Worker       : rust_device(std::move(rust_device)) {}
57*cf78ab8cSAndroid Build Coastguard Worker 
58*cf78ab8cSAndroid Build Coastguard Worker   void SendLinkLayerLePacket(const rust::Slice<const uint8_t> packet,
59*cf78ab8cSAndroid Build Coastguard Worker                              int8_t tx_power) const;
60*cf78ab8cSAndroid Build Coastguard Worker 
61*cf78ab8cSAndroid Build Coastguard Worker  private:
62*cf78ab8cSAndroid Build Coastguard Worker   std::shared_ptr<RustDevice> rust_device;
63*cf78ab8cSAndroid Build Coastguard Worker };
64*cf78ab8cSAndroid Build Coastguard Worker }  // namespace netsim::hci::facade