kernel/hil/
ble_advertising.rs

1// Licensed under the Apache License, Version 2.0 or the MIT License.
2// SPDX-License-Identifier: Apache-2.0 OR MIT
3// Copyright Tock Contributors 2022.
4
5//! Bluetooth Low Energy HIL
6//!
7//! ```text
8//! Application
9//!
10//!           +------------------------------------------------+
11//!           | Applications                                   |
12//!           +------------------------------------------------+
13//!
14//! ```
15//!
16//! ```text
17//! Host
18//!
19//!           +------------------------------------------------+
20//!           | Generic Access Profile                         |
21//!           +------------------------------------------------+
22//!
23//!           +------------------------------------------------+
24//!           | Generic Attribute Profile                      |
25//!           +------------------------------------------------+
26//!
27//!           +--------------------+      +-------------------+
28//!           | Attribute Protocol |      | Security Manager  |
29//!           +--------------------+      +-------------------+
30//!
31//!           +-----------------------------------------------+
32//!           | Logical Link and Adaptation Protocol          |
33//!           +-----------------------------------------------+
34//!
35//! ```
36//!
37//! ```text
38//! Controller
39//!
40//!           +--------------------------------------------+
41//!           | Host Controller Interface                  |
42//!           +--------------------------------------------+
43//!
44//!           +------------------+      +------------------+
45//!           | Link Layer       |      | Direct Test Mode |
46//!           +------------------+      +------------------+
47//!
48//!           +--------------------------------------------+
49//!           | Physical Layer                             |
50//!           +--------------------------------------------+
51//!
52//! ```
53
54use crate::ErrorCode;
55
56pub trait BleAdvertisementDriver<'a> {
57    fn transmit_advertisement(&self, buf: &'static mut [u8], len: usize, channel: RadioChannel);
58    fn receive_advertisement(&self, channel: RadioChannel);
59    fn set_receive_client(&self, client: &'a dyn RxClient);
60    fn set_transmit_client(&self, client: &'a dyn TxClient);
61}
62
63pub trait BleConfig {
64    fn set_tx_power(&self, power: u8) -> Result<(), ErrorCode>;
65}
66
67pub trait RxClient {
68    fn receive_event(&self, buf: &'static mut [u8], len: u8, result: Result<(), ErrorCode>);
69}
70
71pub trait TxClient {
72    fn transmit_event(&self, buf: &'static mut [u8], result: Result<(), ErrorCode>);
73}
74
75// Bluetooth Core Specification:Vol. 6. Part B, section 1.4.1 Advertising and Data Channel Indices
76#[derive(PartialEq, Debug, Copy, Clone)]
77pub enum RadioChannel {
78    DataChannel0 = 4,
79    DataChannel1 = 6,
80    DataChannel2 = 8,
81    DataChannel3 = 10,
82    DataChannel4 = 12,
83    DataChannel5 = 14,
84    DataChannel6 = 16,
85    DataChannel7 = 18,
86    DataChannel8 = 20,
87    DataChannel9 = 22,
88    DataChannel10 = 24,
89    DataChannel11 = 28,
90    DataChannel12 = 30,
91    DataChannel13 = 32,
92    DataChannel14 = 34,
93    DataChannel15 = 36,
94    DataChannel16 = 38,
95    DataChannel17 = 40,
96    DataChannel18 = 42,
97    DataChannel19 = 44,
98    DataChannel20 = 46,
99    DataChannel21 = 48,
100    DataChannel22 = 50,
101    DataChannel23 = 52,
102    DataChannel24 = 54,
103    DataChannel25 = 56,
104    DataChannel26 = 58,
105    DataChannel27 = 60,
106    DataChannel28 = 62,
107    DataChannel29 = 64,
108    DataChannel30 = 66,
109    DataChannel31 = 68,
110    DataChannel32 = 70,
111    DataChannel33 = 72,
112    DataChannel34 = 74,
113    DataChannel35 = 76,
114    DataChannel36 = 78,
115    AdvertisingChannel37 = 2,
116    AdvertisingChannel38 = 26,
117    AdvertisingChannel39 = 80,
118}
119
120impl RadioChannel {
121    pub fn get_channel_index(&self) -> u32 {
122        match *self {
123            RadioChannel::DataChannel0 => 0,
124            RadioChannel::DataChannel1 => 1,
125            RadioChannel::DataChannel2 => 2,
126            RadioChannel::DataChannel3 => 3,
127            RadioChannel::DataChannel4 => 4,
128            RadioChannel::DataChannel5 => 5,
129            RadioChannel::DataChannel6 => 6,
130            RadioChannel::DataChannel7 => 7,
131            RadioChannel::DataChannel8 => 8,
132            RadioChannel::DataChannel9 => 9,
133            RadioChannel::DataChannel10 => 10,
134            RadioChannel::DataChannel11 => 11,
135            RadioChannel::DataChannel12 => 12,
136            RadioChannel::DataChannel13 => 13,
137            RadioChannel::DataChannel14 => 14,
138            RadioChannel::DataChannel15 => 15,
139            RadioChannel::DataChannel16 => 16,
140            RadioChannel::DataChannel17 => 17,
141            RadioChannel::DataChannel18 => 18,
142            RadioChannel::DataChannel19 => 19,
143            RadioChannel::DataChannel20 => 20,
144            RadioChannel::DataChannel21 => 21,
145            RadioChannel::DataChannel22 => 22,
146            RadioChannel::DataChannel23 => 23,
147            RadioChannel::DataChannel24 => 24,
148            RadioChannel::DataChannel25 => 25,
149            RadioChannel::DataChannel26 => 26,
150            RadioChannel::DataChannel27 => 27,
151            RadioChannel::DataChannel28 => 28,
152            RadioChannel::DataChannel29 => 29,
153            RadioChannel::DataChannel30 => 30,
154            RadioChannel::DataChannel31 => 31,
155            RadioChannel::DataChannel32 => 32,
156            RadioChannel::DataChannel33 => 33,
157            RadioChannel::DataChannel34 => 34,
158            RadioChannel::DataChannel35 => 35,
159            RadioChannel::DataChannel36 => 36,
160            RadioChannel::AdvertisingChannel37 => 37,
161            RadioChannel::AdvertisingChannel38 => 38,
162            RadioChannel::AdvertisingChannel39 => 39,
163        }
164    }
165}