|
1 | | -use core::future::Future; |
2 | | - |
3 | 1 | use embedded_hal::digital::v2::OutputPin; |
4 | 2 | use embedded_hal_async::digital::Wait; |
5 | 3 | use embedded_hal_async::spi::*; |
@@ -88,101 +86,78 @@ where |
88 | 86 | { |
89 | 87 | type PhyError = Sx127xError; |
90 | 88 |
|
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> { |
| 89 | + async fn tx(&mut self, config: TxConfig, buf: &[u8]) -> Result<u32, Self::PhyError> { |
101 | 90 | trace!("TX START"); |
102 | | - async move { |
| 91 | + self.radio.set_mode(RadioMode::Stdby).await.ok().unwrap(); |
| 92 | + self.rfs.set_tx(); |
| 93 | + self.radio.set_tx_power(14, 0).await?; |
| 94 | + self.radio.set_frequency(config.rf.frequency).await?; |
| 95 | + // TODO: Modify radio to support other coding rates |
| 96 | + self.radio.set_coding_rate_4(5).await?; |
| 97 | + self.radio |
| 98 | + .set_signal_bandwidth(bandwidth_to_i64(config.rf.bandwidth)) |
| 99 | + .await?; |
| 100 | + self.radio |
| 101 | + .set_spreading_factor(spreading_factor_to_u8(config.rf.spreading_factor)) |
| 102 | + .await?; |
| 103 | + |
| 104 | + self.radio.set_preamble_length(8).await?; |
| 105 | + self.radio.set_lora_pa_ramp().await?; |
| 106 | + self.radio.set_lora_sync_word().await?; |
| 107 | + self.radio.set_invert_iq(false).await?; |
| 108 | + self.radio.set_crc(true).await?; |
| 109 | + |
| 110 | + self.radio.set_dio0_tx_done().await?; |
| 111 | + |
| 112 | + self.radio.transmit_start(buf).await?; |
| 113 | + |
| 114 | + loop { |
| 115 | + self.irq.wait_for_rising_edge().await.unwrap(); |
103 | 116 | 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 | | - } |
| 117 | + let irq = self.radio.clear_irq().await.ok().unwrap(); |
| 118 | + if (irq & IRQ::IrqTxDoneMask.addr()) != 0 { |
| 119 | + trace!("TX DONE"); |
| 120 | + return Ok(0); |
134 | 121 | } |
135 | 122 | } |
136 | 123 | } |
137 | 124 |
|
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 | | - } |
| 125 | + async fn rx(&mut self, config: RfConfig, buf: &mut [u8]) -> Result<(usize, RxQuality), Self::PhyError> { |
| 126 | + self.rfs.set_rx(); |
| 127 | + self.radio.reset_payload_length().await?; |
| 128 | + self.radio.set_frequency(config.frequency).await?; |
| 129 | + // TODO: Modify radio to support other coding rates |
| 130 | + self.radio.set_coding_rate_4(5).await?; |
| 131 | + self.radio |
| 132 | + .set_signal_bandwidth(bandwidth_to_i64(config.bandwidth)) |
| 133 | + .await?; |
| 134 | + self.radio |
| 135 | + .set_spreading_factor(spreading_factor_to_u8(config.spreading_factor)) |
| 136 | + .await?; |
| 137 | + |
| 138 | + self.radio.set_preamble_length(8).await?; |
| 139 | + self.radio.set_lora_sync_word().await?; |
| 140 | + self.radio.set_invert_iq(true).await?; |
| 141 | + self.radio.set_crc(true).await?; |
| 142 | + |
| 143 | + self.radio.set_dio0_rx_done().await?; |
| 144 | + self.radio.set_mode(RadioMode::RxContinuous).await?; |
| 145 | + |
| 146 | + loop { |
| 147 | + self.irq.wait_for_rising_edge().await.unwrap(); |
| 148 | + self.radio.set_mode(RadioMode::Stdby).await.ok().unwrap(); |
| 149 | + let irq = self.radio.clear_irq().await.ok().unwrap(); |
| 150 | + if (irq & IRQ::IrqRxDoneMask.addr()) != 0 { |
| 151 | + let rssi = self.radio.get_packet_rssi().await.unwrap_or(0) as i16; |
| 152 | + let snr = self.radio.get_packet_snr().await.unwrap_or(0.0) as i8; |
| 153 | + let response = if let Ok(size) = self.radio.read_packet_size().await { |
| 154 | + self.radio.read_packet(buf).await?; |
| 155 | + Ok((size, RxQuality::new(rssi, snr))) |
| 156 | + } else { |
| 157 | + Ok((0, RxQuality::new(rssi, snr))) |
| 158 | + }; |
| 159 | + trace!("RX DONE"); |
| 160 | + return response; |
186 | 161 | } |
187 | 162 | } |
188 | 163 | } |
|
0 commit comments