@@ -10,6 +10,8 @@ use critical_section::Mutex;
10
10
use embedded_svc:: wifi:: { AccessPointInfo , AuthMethod , SecondaryChannel } ;
11
11
use enumset:: EnumSet ;
12
12
use enumset:: EnumSetType ;
13
+ use esp_hal_common:: peripheral:: Peripheral ;
14
+ use esp_hal_common:: peripheral:: PeripheralRef ;
13
15
use esp_wifi_sys:: include:: esp_interface_t_ESP_IF_WIFI_AP;
14
16
use esp_wifi_sys:: include:: esp_wifi_disconnect;
15
17
use esp_wifi_sys:: include:: esp_wifi_get_mode;
@@ -682,52 +684,72 @@ pub fn wifi_start_scan(block: bool) -> i32 {
682
684
unsafe { esp_wifi_scan_start ( & scan_config, block) }
683
685
}
684
686
685
- pub fn new_with_config ( config : embedded_svc:: wifi:: Configuration ) -> ( WifiDevice , WifiController ) {
687
+ pub fn new_with_config < ' d > (
688
+ device : impl Peripheral < P = esp_hal_common:: radio:: Wifi > + ' d ,
689
+ config : embedded_svc:: wifi:: Configuration ,
690
+ ) -> ( WifiDevice < ' d > , WifiController < ' d > ) {
691
+ esp_hal_common:: into_ref!( device) ;
686
692
let mode = match config {
687
693
embedded_svc:: wifi:: Configuration :: None => panic ! ( ) ,
688
694
embedded_svc:: wifi:: Configuration :: Client ( _) => WifiMode :: Sta ,
689
695
embedded_svc:: wifi:: Configuration :: AccessPoint ( _) => WifiMode :: Ap ,
690
696
embedded_svc:: wifi:: Configuration :: Mixed ( _, _) => panic ! ( ) ,
691
697
} ;
692
698
(
693
- WifiDevice :: new ( mode) ,
694
- WifiController :: new_with_config ( config) ,
699
+ WifiDevice :: new ( unsafe { device. clone_unchecked ( ) } , mode) ,
700
+ WifiController :: new_with_config ( device, config) ,
701
+ )
702
+ }
703
+
704
+ pub fn new_with_mode < ' d > (
705
+ device : impl Peripheral < P = esp_hal_common:: radio:: Wifi > + ' d ,
706
+ mode : WifiMode ,
707
+ ) -> ( WifiDevice < ' d > , WifiController < ' d > ) {
708
+ new_with_config (
709
+ device,
710
+ match mode {
711
+ WifiMode :: Sta => embedded_svc:: wifi:: Configuration :: Client ( Default :: default ( ) ) ,
712
+ WifiMode :: Ap => embedded_svc:: wifi:: Configuration :: AccessPoint ( Default :: default ( ) ) ,
713
+ } ,
695
714
)
696
715
}
697
716
698
- pub fn new ( mode : WifiMode ) -> ( WifiDevice , WifiController ) {
699
- ( WifiDevice :: new ( mode) , WifiController :: new ( ) )
717
+ pub fn new < ' d > (
718
+ device : impl Peripheral < P = esp_hal_common:: radio:: Wifi > + ' d ,
719
+ ) -> ( WifiDevice < ' d > , WifiController < ' d > ) {
720
+ new_with_config ( device, Default :: default ( ) )
700
721
}
701
722
702
723
/// A wifi device implementing smoltcp's Device trait.
703
- pub struct WifiDevice {
704
- _private : ( ) ,
724
+ pub struct WifiDevice < ' d > {
725
+ _device : PeripheralRef < ' d , esp_hal_common :: radio :: Wifi > ,
705
726
706
727
// only used by embassy-net
707
728
#[ allow( unused) ]
708
729
mode : WifiMode ,
709
730
}
710
731
711
- impl WifiDevice {
712
- pub ( crate ) fn new ( mode : WifiMode ) -> WifiDevice {
713
- Self { _private : ( ) , mode }
732
+ impl < ' d > WifiDevice < ' d > {
733
+ pub ( crate ) fn new (
734
+ _device : PeripheralRef < ' d , esp_hal_common:: radio:: Wifi > ,
735
+ mode : WifiMode ,
736
+ ) -> WifiDevice {
737
+ Self { _device, mode }
714
738
}
715
739
}
716
740
717
741
/// A wifi controller implementing embedded_svc::Wifi traits
718
- pub struct WifiController {
742
+ pub struct WifiController < ' d > {
743
+ _device : PeripheralRef < ' d , esp_hal_common:: radio:: Wifi > ,
719
744
config : embedded_svc:: wifi:: Configuration ,
720
745
}
721
746
722
- impl WifiController {
723
- pub ( crate ) fn new_with_config ( config : embedded_svc:: wifi:: Configuration ) -> Self {
724
- Self { config }
725
- }
726
-
727
- pub ( crate ) fn new ( ) -> Self {
728
- Self {
729
- config : Default :: default ( ) ,
730
- }
747
+ impl < ' d > WifiController < ' d > {
748
+ pub ( crate ) fn new_with_config (
749
+ _device : PeripheralRef < ' d , esp_hal_common:: radio:: Wifi > ,
750
+ config : embedded_svc:: wifi:: Configuration ,
751
+ ) -> Self {
752
+ Self { _device, config }
731
753
}
732
754
733
755
fn is_sta_enabled ( & self ) -> Result < bool , WifiError > {
@@ -864,9 +886,9 @@ impl WifiController {
864
886
}
865
887
866
888
// see https://docs.rs/smoltcp/0.7.1/smoltcp/phy/index.html
867
- impl Device for WifiDevice {
868
- type RxToken < ' a > = WifiRxToken ;
869
- type TxToken < ' a > = WifiTxToken ;
889
+ impl < ' d > Device for WifiDevice < ' d > {
890
+ type RxToken < ' a > = WifiRxToken where Self : ' a ;
891
+ type TxToken < ' a > = WifiTxToken where Self : ' a ;
870
892
871
893
fn receive (
872
894
& mut self ,
@@ -989,7 +1011,7 @@ pub fn send_data_if_needed() {
989
1011
} ) ;
990
1012
}
991
1013
992
- impl embedded_svc:: wifi:: Wifi for WifiController {
1014
+ impl embedded_svc:: wifi:: Wifi for WifiController < ' _ > {
993
1015
type Error = WifiError ;
994
1016
995
1017
/// This currently only supports the `Client` and `AccessPoint` capability.
@@ -1290,7 +1312,7 @@ pub(crate) mod embassy {
1290
1312
}
1291
1313
}
1292
1314
1293
- impl Driver for WifiDevice {
1315
+ impl Driver for WifiDevice < ' _ > {
1294
1316
type RxToken < ' a > = WifiRxToken
1295
1317
where
1296
1318
Self : ' a ;
@@ -1381,7 +1403,7 @@ mod asynch {
1381
1403
use super :: * ;
1382
1404
1383
1405
// TODO assumes STA mode only
1384
- impl WifiController {
1406
+ impl < ' d > WifiController < ' d > {
1385
1407
/// Async version of [`embedded_svc::wifi::Wifi`]'s `scan_n` method
1386
1408
pub async fn scan_n < const N : usize > (
1387
1409
& mut self ,
0 commit comments