comparison trau-decode/parse-main.c @ 46:f977027774cb

trau-parse: add support for D144 decoding
author Mychaela Falconia <falcon@freecalypso.org>
date Tue, 24 Sep 2024 17:02:59 +0000
parents 59d1d15b6f7e
children 7119884f6afe
comparison
equal deleted inserted replaced
45:59d1d15b6f7e 46:f977027774cb
17 HUNT_FOR_0, 17 HUNT_FOR_0,
18 HUNT_FOUND_0, 18 HUNT_FOUND_0,
19 GOT_8_ZEROS, 19 GOT_8_ZEROS,
20 SYNCED 20 SYNCED
21 } state; 21 } state;
22 static enum {
23 NOT_D144,
24 D144_SYNC,
25 D144_EDATA,
26 } d144_state;
22 static unsigned hunt_for_0_count, frame_pos_count; 27 static unsigned hunt_for_0_count, frame_pos_count;
23 static uint8_t in_frame_2bit[160], frame_bits[320], d_bits[260]; 28 static uint8_t in_frame_2bit[160], frame_bits[320], d_bits[260];
24 29
25 static void 30 static void
26 unpack_dibits() 31 unpack_dibits()
163 fputs(" (HR data DL)", stdout); 168 fputs(" (HR data DL)", stdout);
164 break; 169 break;
165 case 0x14: 170 case 0x14:
166 fputs(" (D144 sync)", stdout); 171 fputs(" (D144 sync)", stdout);
167 break; 172 break;
173 case 0x1F:
174 fputs(" (E-TRAU)", stdout);
175 break;
168 } 176 }
169 putchar('\n'); 177 putchar('\n');
170 c6_11 = bits_to_num(frame_bits + 22, 6); 178 if (c1_5 == 0x14)
171 printf(" C6-C11: %u\n", c6_11); 179 d144_state = D144_SYNC;
172 printf(" C12=%u C13=%u C14=%u C15=%u\n", frame_bits[28], 180 else if (c1_5 == 0x1F &&
173 frame_bits[29], frame_bits[30], frame_bits[31]); 181 (d144_state == D144_SYNC || d144_state == D144_EDATA))
182 d144_state = D144_EDATA;
183 else
184 d144_state = NOT_D144;
174 switch (c1_5) { 185 switch (c1_5) {
175 case 0x02: 186 case 0x02:
176 case 0x1C: 187 case 0x1C:
188 case 0x1A:
189 c6_11 = bits_to_num(frame_bits + 22, 6);
190 printf(" C6-C11: %u\n", c6_11);
191 printf(" C12=%u C13=%u C14=%u C15=%u\n", frame_bits[28],
192 frame_bits[29], frame_bits[30], frame_bits[31]);
177 collect_d_bits(); 193 collect_d_bits();
178 print_fr_frame(d_bits);
179 break;
180 case 0x1A:
181 collect_d_bits();
182 check_efr_crc(d_bits);
183 print_efr_frame(d_bits);
184 break; 194 break;
185 case 0x08: 195 case 0x08:
186 case 0x09: 196 case 0x09:
187 case 0x16: 197 case 0x16:
188 case 0x17: 198 case 0x17:
189 case 0x14: 199 case 0x14:
200 printf(" C6-C15: %u%u%u%u%u%u%u%u%u%u\n", frame_bits[22],
201 frame_bits[23], frame_bits[24], frame_bits[25],
202 frame_bits[26], frame_bits[27], frame_bits[28],
203 frame_bits[29], frame_bits[30], frame_bits[31]);
190 print_data_frame(); 204 print_data_frame();
191 return; 205 return;
206 case 0x1F:
207 printf(" C6-C13: %u%u%u%u%u%u%u%u\n", frame_bits[22],
208 frame_bits[23], frame_bits[24], frame_bits[25],
209 frame_bits[26], frame_bits[27], frame_bits[28],
210 frame_bits[29]);
211 printf(" M1=%u M2=%u\n", frame_bits[30], frame_bits[31]);
212 return;
213 default:
214 printf(" C6-C15: %u%u%u%u%u%u%u%u%u%u\n", frame_bits[22],
215 frame_bits[23], frame_bits[24], frame_bits[25],
216 frame_bits[26], frame_bits[27], frame_bits[28],
217 frame_bits[29], frame_bits[30], frame_bits[31]);
218 }
219 switch (c1_5) {
220 case 0x02:
221 case 0x1C:
222 print_fr_frame(d_bits);
223 break;
224 case 0x1A:
225 check_efr_crc(d_bits);
226 print_efr_frame(d_bits);
227 break;
192 } 228 }
193 printf(" C16=%u C17=%u C18=%u C19=%u C20=%u C21=%u\n", 229 printf(" C16=%u C17=%u C18=%u C19=%u C20=%u C21=%u\n",
194 frame_bits[310], frame_bits[311], frame_bits[312], 230 frame_bits[310], frame_bits[311], frame_bits[312],
195 frame_bits[313], frame_bits[314], frame_bits[315]); 231 frame_bits[313], frame_bits[314], frame_bits[315]);
196 printf(" T1=%u T2=%u T3=%u T4=%u\n", frame_bits[316], frame_bits[317], 232 printf(" T1=%u T2=%u T3=%u T4=%u\n", frame_bits[316], frame_bits[317],
222 } 258 }
223 259
224 static void 260 static void
225 check_sync() 261 check_sync()
226 { 262 {
227 if (check_sync_zeros() && check_sync_ones()) 263 int sync_res;
264
265 if (d144_state == D144_EDATA)
266 sync_res = check_sync_zeros() && frame_bits[16];
267 else
268 sync_res = check_sync_zeros() && check_sync_ones();
269 if (sync_res)
228 return; 270 return;
229 printf("Bad frame sync, returning to hunt state\n"); 271 printf("Bad frame sync, returning to hunt state\n");
230 state = HUNT_FOR_0; 272 state = HUNT_FOR_0;
231 } 273 }
232 274
313 fprintf(stderr, "error: invalid subslot argument\n"); 355 fprintf(stderr, "error: invalid subslot argument\n");
314 exit(1); 356 exit(1);
315 } 357 }
316 right_shift = (3 - subslot) * 2; 358 right_shift = (3 - subslot) * 2;
317 state = HUNT_FOR_0; 359 state = HUNT_FOR_0;
360 d144_state = NOT_D144;
318 for (file_offset = 0; ; file_offset++) { 361 for (file_offset = 0; ; file_offset++) {
319 inb = getc(inf); 362 inb = getc(inf);
320 if (inb < 0) 363 if (inb < 0)
321 break; 364 break;
322 inb >>= right_shift; 365 inb >>= right_shift;