| 1152 | } |
| 1153 | |
| 1154 | let mut md = 0u64; |
| 1155 | for i in 0..55 { |
| 1156 | md |= if get_be_bit(&self.data, i) { 1 << i } else { 0 }; |
| 1157 | } |
| 1158 | let mut cs = 0; |
| 1159 | for i in 0..16 { |
| 1160 | cs |= if get_be_bit(&self.data, i + 55) { |
| 1161 | 1 << i |
| 1162 | } else { |
| 1163 | 0 |
| 1164 | }; |
| 1165 | } |
| 1166 | |
| 1167 | if Self::CRC.checksum(&(md << 9).to_le_bytes()) != cs { |
| 1168 | return DecoderResult::Fail; |
| 1169 | } |
| 1170 | |
| 1171 | self.staged_mode = (md & 0xff).into(); |
| 1172 | self.staged_call = md >> 8; |
| 1173 | |
| 1174 | if self.staged_mode == OperationMode::Null |
| 1175 | && self.staged_call != 0 |
| 1176 | && self.staged_call < 129961739795077 |
| 1177 | { |
| 1178 | return DecoderResult::Ping; |
| 1179 | } |
| 1180 | |
| 1181 | if self.staged_call == 0 || self.staged_call >= 129961739795077 { |
| 1182 | self.staged_call = 0; |
| 1183 | return DecoderResult::Nope; |
| 1184 | } |
| 1185 | |
| 1186 | DecoderResult::Okay |
| 1187 | } |
| 1188 | |
| 1189 | pub fn staged(&self, cfo: &mut f32, mode: &mut OperationMode, call: &mut [u8]) { |
| 1190 | *cfo = self.staged_cfo_rad * (Self::RATE as f32 / std::f32::consts::TAU); |
| 1191 | *mode = self.staged_mode; |
| 1192 | Self::base37(call, self.staged_call, 9); |
| 1193 | } |
| 1194 | |
| 1195 | pub fn fetch(&mut self, payload: &mut [u8]) -> i32 { |
| 1196 | let (data_bits, frozen_bits) = match self.operation_mode { |
| 1197 | OperationMode::Null => return -1, |
| 1198 | OperationMode::Mode14 => (1360, &FROZEN_2048_1392), |
| 1199 | OperationMode::Mode15 => (1024, &FROZEN_2048_1056), |
| 1200 | OperationMode::Mode16 => (680, &FROZEN_2048_712), |
| 1201 | }; |
| 1202 | let result = self |
| 1203 | .polar |
| 1204 | .decode(payload, &self.code, frozen_bits, data_bits); |
| 1205 | let mut scrambler = Xorshift32::new(); |
| 1206 | for i in 0..data_bits / 8 { |
| 1207 | payload[i] ^= scrambler.next() as u8; |
| 1208 | } |
| 1209 | for i in data_bits / 8..170 { |
| 1210 | payload[i] = 0; |
| 1211 | } |