@@ -88,101 +88,78 @@ where
8888{
8989 type PhyError = Sx127xError ;
9090
91- type TxFuture < ' m > = impl Future < Output = Result < u32 , Self :: PhyError > > + ' m
92- where
93- SPI : ' m ,
94- CS : ' m ,
95- RESET : ' m ,
96- E : ' m ,
97- I : ' m ,
98- RFS : ' m ;
99-
100- fn tx < ' m > ( & ' m mut self , config : TxConfig , buf : & ' m [ u8 ] ) -> Self :: TxFuture < ' m > {
91+ async fn tx ( & mut self , config : TxConfig , buf : & [ u8 ] ) -> Result < u32 , Self :: PhyError > {
10192 trace ! ( "TX START" ) ;
102- async move {
93+ self . radio . set_mode ( RadioMode :: Stdby ) . await . ok ( ) . unwrap ( ) ;
94+ self . rfs . set_tx ( ) ;
95+ self . radio . set_tx_power ( 14 , 0 ) . await ?;
96+ self . radio . set_frequency ( config. rf . frequency ) . await ?;
97+ // TODO: Modify radio to support other coding rates
98+ self . radio . set_coding_rate_4 ( 5 ) . await ?;
99+ self . radio
100+ . set_signal_bandwidth ( bandwidth_to_i64 ( config. rf . bandwidth ) )
101+ . await ?;
102+ self . radio
103+ . set_spreading_factor ( spreading_factor_to_u8 ( config. rf . spreading_factor ) )
104+ . await ?;
105+
106+ self . radio . set_preamble_length ( 8 ) . await ?;
107+ self . radio . set_lora_pa_ramp ( ) . await ?;
108+ self . radio . set_lora_sync_word ( ) . await ?;
109+ self . radio . set_invert_iq ( false ) . await ?;
110+ self . radio . set_crc ( true ) . await ?;
111+
112+ self . radio . set_dio0_tx_done ( ) . await ?;
113+
114+ self . radio . transmit_start ( buf) . await ?;
115+
116+ loop {
117+ self . irq . wait_for_rising_edge ( ) . await . unwrap ( ) ;
103118 self . radio . set_mode ( RadioMode :: Stdby ) . await . ok ( ) . unwrap ( ) ;
104- self . rfs . set_tx ( ) ;
105- self . radio . set_tx_power ( 14 , 0 ) . await ?;
106- self . radio . set_frequency ( config. rf . frequency ) . await ?;
107- // TODO: Modify radio to support other coding rates
108- self . radio . set_coding_rate_4 ( 5 ) . await ?;
109- self . radio
110- . set_signal_bandwidth ( bandwidth_to_i64 ( config. rf . bandwidth ) )
111- . await ?;
112- self . radio
113- . set_spreading_factor ( spreading_factor_to_u8 ( config. rf . spreading_factor ) )
114- . await ?;
115-
116- self . radio . set_preamble_length ( 8 ) . await ?;
117- self . radio . set_lora_pa_ramp ( ) . await ?;
118- self . radio . set_lora_sync_word ( ) . await ?;
119- self . radio . set_invert_iq ( false ) . await ?;
120- self . radio . set_crc ( true ) . await ?;
121-
122- self . radio . set_dio0_tx_done ( ) . await ?;
123-
124- self . radio . transmit_start ( buf) . await ?;
125-
126- loop {
127- self . irq . wait_for_rising_edge ( ) . await . unwrap ( ) ;
128- self . radio . set_mode ( RadioMode :: Stdby ) . await . ok ( ) . unwrap ( ) ;
129- let irq = self . radio . clear_irq ( ) . await . ok ( ) . unwrap ( ) ;
130- if ( irq & IRQ :: IrqTxDoneMask . addr ( ) ) != 0 {
131- trace ! ( "TX DONE" ) ;
132- return Ok ( 0 ) ;
133- }
119+ let irq = self . radio . clear_irq ( ) . await . ok ( ) . unwrap ( ) ;
120+ if ( irq & IRQ :: IrqTxDoneMask . addr ( ) ) != 0 {
121+ trace ! ( "TX DONE" ) ;
122+ return Ok ( 0 ) ;
134123 }
135124 }
136125 }
137126
138- type RxFuture < ' m > = impl Future < Output = Result < ( usize , RxQuality ) , Self :: PhyError > > + ' m
139- where
140- SPI : ' m ,
141- CS : ' m ,
142- RESET : ' m ,
143- E : ' m ,
144- I : ' m ,
145- RFS : ' m ;
146-
147- fn rx < ' m > ( & ' m mut self , config : RfConfig , buf : & ' m mut [ u8 ] ) -> Self :: RxFuture < ' m > {
148- trace ! ( "RX START" ) ;
149- async move {
150- self . rfs . set_rx ( ) ;
151- self . radio . reset_payload_length ( ) . await ?;
152- self . radio . set_frequency ( config. frequency ) . await ?;
153- // TODO: Modify radio to support other coding rates
154- self . radio . set_coding_rate_4 ( 5 ) . await ?;
155- self . radio
156- . set_signal_bandwidth ( bandwidth_to_i64 ( config. bandwidth ) )
157- . await ?;
158- self . radio
159- . set_spreading_factor ( spreading_factor_to_u8 ( config. spreading_factor ) )
160- . await ?;
161-
162- self . radio . set_preamble_length ( 8 ) . await ?;
163- self . radio . set_lora_sync_word ( ) . await ?;
164- self . radio . set_invert_iq ( true ) . await ?;
165- self . radio . set_crc ( true ) . await ?;
166-
167- self . radio . set_dio0_rx_done ( ) . await ?;
168- self . radio . set_mode ( RadioMode :: RxContinuous ) . await ?;
169-
170- loop {
171- self . irq . wait_for_rising_edge ( ) . await . unwrap ( ) ;
172- self . radio . set_mode ( RadioMode :: Stdby ) . await . ok ( ) . unwrap ( ) ;
173- let irq = self . radio . clear_irq ( ) . await . ok ( ) . unwrap ( ) ;
174- if ( irq & IRQ :: IrqRxDoneMask . addr ( ) ) != 0 {
175- let rssi = self . radio . get_packet_rssi ( ) . await . unwrap_or ( 0 ) as i16 ;
176- let snr = self . radio . get_packet_snr ( ) . await . unwrap_or ( 0.0 ) as i8 ;
177- let response = if let Ok ( size) = self . radio . read_packet_size ( ) . await {
178- self . radio . read_packet ( buf) . await ?;
179- Ok ( ( size, RxQuality :: new ( rssi, snr) ) )
180- } else {
181- Ok ( ( 0 , RxQuality :: new ( rssi, snr) ) )
182- } ;
183- trace ! ( "RX DONE" ) ;
184- return response;
185- }
127+ async fn rx ( & mut self , config : RfConfig , buf : & mut [ u8 ] ) -> Result < ( usize , RxQuality ) , Self :: PhyError > {
128+ self . rfs . set_rx ( ) ;
129+ self . radio . reset_payload_length ( ) . await ?;
130+ self . radio . set_frequency ( config. frequency ) . await ?;
131+ // TODO: Modify radio to support other coding rates
132+ self . radio . set_coding_rate_4 ( 5 ) . await ?;
133+ self . radio
134+ . set_signal_bandwidth ( bandwidth_to_i64 ( config. bandwidth ) )
135+ . await ?;
136+ self . radio
137+ . set_spreading_factor ( spreading_factor_to_u8 ( config. spreading_factor ) )
138+ . await ?;
139+
140+ self . radio . set_preamble_length ( 8 ) . await ?;
141+ self . radio . set_lora_sync_word ( ) . await ?;
142+ self . radio . set_invert_iq ( true ) . await ?;
143+ self . radio . set_crc ( true ) . await ?;
144+
145+ self . radio . set_dio0_rx_done ( ) . await ?;
146+ self . radio . set_mode ( RadioMode :: RxContinuous ) . await ?;
147+
148+ loop {
149+ self . irq . wait_for_rising_edge ( ) . await . unwrap ( ) ;
150+ self . radio . set_mode ( RadioMode :: Stdby ) . await . ok ( ) . unwrap ( ) ;
151+ let irq = self . radio . clear_irq ( ) . await . ok ( ) . unwrap ( ) ;
152+ if ( irq & IRQ :: IrqRxDoneMask . addr ( ) ) != 0 {
153+ let rssi = self . radio . get_packet_rssi ( ) . await . unwrap_or ( 0 ) as i16 ;
154+ let snr = self . radio . get_packet_snr ( ) . await . unwrap_or ( 0.0 ) as i8 ;
155+ let response = if let Ok ( size) = self . radio . read_packet_size ( ) . await {
156+ self . radio . read_packet ( buf) . await ?;
157+ Ok ( ( size, RxQuality :: new ( rssi, snr) ) )
158+ } else {
159+ Ok ( ( 0 , RxQuality :: new ( rssi, snr) ) )
160+ } ;
161+ trace ! ( "RX DONE" ) ;
162+ return response;
186163 }
187164 }
188165 }
0 commit comments