GNU Radio's SATNOGS Package
amsat_duv_decoder.h
Go to the documentation of this file.
1 /* -*- c++ -*- */
2 /*
3  * gr-satnogs: SatNOGS GNU Radio Out-Of-Tree Module
4  *
5  * Copyright (C) 2019, Libre Space Foundation <http://libre.space>
6  *
7  * This program is free software: you can redistribute it and/or modify
8  * it under the terms of the GNU General Public License as published by
9  * the Free Software Foundation, either version 3 of the License, or
10  * (at your option) any later version.
11  *
12  * This program is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15  * GNU General Public License for more details.
16  *
17  * You should have received a copy of the GNU General Public License
18  * along with this program. If not, see <http://www.gnu.org/licenses/>.
19  */
20 
21 #ifndef INCLUDED_SATNOGS_AMSAT_DUV_DECODER_H
22 #define INCLUDED_SATNOGS_AMSAT_DUV_DECODER_H
23 
24 #include <satnogs/api.h>
25 #include <satnogs/decoder.h>
26 #include <string>
27 #include <deque>
28 
29 namespace gr {
30 namespace satnogs {
31 
32 /*!
33  * \brief AMSAT 8b10b + CCSDS RS DUV decoder
34  *
35  */
37 public:
38 
39  static const size_t
41 
42  static const uint8_t
43  amsat_fox_spacecraft_id[];
44 
45  static decoder::decoder_sptr
46  make(const std::string &control_symbol, size_t max_frame_len = 96);
47 
48  amsat_duv_decoder(const std::string &control_symbol, size_t max_frame_len);
50 
52  decode(const void *in, int len);
53 
54  void
55  reset();
56 
57 private:
58  typedef enum {
59  SEARCH_SYNC, DECODING
60  } d_state_t;
61 
62  size_t d_erasure_cnt;
63  uint16_t d_control_symbol_pos;
64  uint16_t d_control_symbol_neg;
65  uint16_t d_data_reg;
66  uint16_t d_wrong_bits;
67  uint16_t d_wrong_bits_neg;
68  uint8_t d_nwrong;
69  uint8_t d_nwrong_neg;
70  size_t d_word_cnt;
71 
72  uint8_t *d_8b_words;
73  int *d_erasures_indexes;
74  d_state_t d_state;
75  size_t d_bitstream_idx;
76  std::deque<uint8_t> d_bitstream;
77 
78  bool
79  set_access_code(const std::string &control_symbol);
80 
81  void
82  process_10b(uint16_t word, size_t write_pos);
83 
84  inline uint16_t
85  pack_10b_word(size_t idx);
86 
87  int d_lookup_8b10b[2][256] = {
88  // RD = -1 cases
89  {
90  /* 00 */0x274,
91  /* 01 */0x1d4,
92  /* 02 */0x2d4,
93  /* 03 */0x71b,
94  /* 04 */0x354,
95  /* 05 */0x69b,
96  /* 06 */0x59b,
97  /* 07 */0x78b,
98  /* 08 */0x394,
99  /* 09 */0x65b,
100  /* 0a */0x55b,
101  /* 0b */0x74b,
102  /* 0c */0x4db,
103  /* 0d */0x6cb,
104  /* 0e */0x5cb,
105  /* 0f */0x174,
106  /* 10 */0x1b4,
107  /* 11 */0x63b,
108  /* 12 */0x53b,
109  /* 13 */0x72b,
110  /* 14 */0x4bb,
111  /* 15 */0x6ab,
112  /* 16 */0x5ab,
113  /* 17 */0x3a4,
114  /* 18 */0x334,
115  /* 19 */0x66b,
116  /* 1a */0x56b,
117  /* 1b */0x364,
118  /* 1c */0x4eb,
119  /* 1d */0x2e4,
120  /* 1e */0x1e4,
121  /* 1f */0x2b4,
122  /* 20 */0x679,
123  /* 21 */0x5d9,
124  /* 22 */0x6d9,
125  /* 23 */0x319,
126  /* 24 */0x759,
127  /* 25 */0x299,
128  /* 26 */0x199,
129  /* 27 */0x389,
130  /* 28 */0x799,
131  /* 29 */0x259,
132  /* 2a */0x159,
133  /* 2b */0x349,
134  /* 2c */0x0d9,
135  /* 2d */0x2c9,
136  /* 2e */0x1c9,
137  /* 2f */0x579,
138  /* 30 */0x5b9,
139  /* 31 */0x239,
140  /* 32 */0x139,
141  /* 33 */0x329,
142  /* 34 */0x0b9,
143  /* 35 */0x2a9,
144  /* 36 */0x1a9,
145  /* 37 */0x7a9,
146  /* 38 */0x739,
147  /* 39 */0x269,
148  /* 3a */0x169,
149  /* 3b */0x769,
150  /* 3c */0x0e9,
151  /* 3d */0x6e9,
152  /* 3e */0x5e9,
153  /* 3f */0x6b9,
154  /* 40 */0x675,
155  /* 41 */0x5d5,
156  /* 42 */0x6d5,
157  /* 43 */0x315,
158  /* 44 */0x755,
159  /* 45 */0x295,
160  /* 46 */0x195,
161  /* 47 */0x385,
162  /* 48 */0x795,
163  /* 49 */0x255,
164  /* 4a */0x155,
165  /* 4b */0x345,
166  /* 4c */0x0d5,
167  /* 4d */0x2c5,
168  /* 4e */0x1c5,
169  /* 4f */0x575,
170  /* 50 */0x5b5,
171  /* 51 */0x235,
172  /* 52 */0x135,
173  /* 53 */0x325,
174  /* 54 */0x0b5,
175  /* 55 */0x2a5,
176  /* 56 */0x1a5,
177  /* 57 */0x7a5,
178  /* 58 */0x735,
179  /* 59 */0x265,
180  /* 5a */0x165,
181  /* 5b */0x765,
182  /* 5c */0x0e5,
183  /* 5d */0x6e5,
184  /* 5e */0x5e5,
185  /* 5f */0x6b5,
186  /* 60 */0x673,
187  /* 61 */0x5d3,
188  /* 62 */0x6d3,
189  /* 63 */0x31c,
190  /* 64 */0x753,
191  /* 65 */0x29c,
192  /* 66 */0x19c,
193  /* 67 */0x38c,
194  /* 68 */0x793,
195  /* 69 */0x25c,
196  /* 6a */0x15c,
197  /* 6b */0x34c,
198  /* 6c */0x0dc,
199  /* 6d */0x2cc,
200  /* 6e */0x1cc,
201  /* 6f */0x573,
202  /* 70 */0x5b3,
203  /* 71 */0x23c,
204  /* 72 */0x13c,
205  /* 73 */0x32c,
206  /* 74 */0x0bc,
207  /* 75 */0x2ac,
208  /* 76 */0x1ac,
209  /* 77 */0x7a3,
210  /* 78 */0x733,
211  /* 79 */0x26c,
212  /* 7a */0x16c,
213  /* 7b */0x763,
214  /* 7c */0x0ec,
215  /* 7d */0x6e3,
216  /* 7e */0x5e3,
217  /* 7f */0x6b3,
218  /* 80 */0x272,
219  /* 81 */0x1d2,
220  /* 82 */0x2d2,
221  /* 83 */0x71d,
222  /* 84 */0x352,
223  /* 85 */0x69d,
224  /* 86 */0x59d,
225  /* 87 */0x78d,
226  /* 88 */0x392,
227  /* 89 */0x65d,
228  /* 8a */0x55d,
229  /* 8b */0x74d,
230  /* 8c */0x4dd,
231  /* 8d */0x6cd,
232  /* 8e */0x5cd,
233  /* 8f */0x172,
234  /* 90 */0x1b2,
235  /* 91 */0x63d,
236  /* 92 */0x53d,
237  /* 93 */0x72d,
238  /* 94 */0x4bd,
239  /* 95 */0x6ad,
240  /* 96 */0x5ad,
241  /* 97 */0x3a2,
242  /* 98 */0x332,
243  /* 99 */0x66d,
244  /* 9a */0x56d,
245  /* 9b */0x362,
246  /* 9c */0x4ed,
247  /* 9d */0x2e2,
248  /* 9e */0x1e2,
249  /* 9f */0x2b2,
250  /* a0 */0x67a,
251  /* a1 */0x5da,
252  /* a2 */0x6da,
253  /* a3 */0x31a,
254  /* a4 */0x75a,
255  /* a5 */0x29a,
256  /* a6 */0x19a,
257  /* a7 */0x38a,
258  /* a8 */0x79a,
259  /* a9 */0x25a,
260  /* aa */0x15a,
261  /* ab */0x34a,
262  /* ac */0x0da,
263  /* ad */0x2ca,
264  /* ae */0x1ca,
265  /* af */0x57a,
266  /* b0 */0x5ba,
267  /* b1 */0x23a,
268  /* b2 */0x13a,
269  /* b3 */0x32a,
270  /* b4 */0x0ba,
271  /* b5 */0x2aa,
272  /* b6 */0x1aa,
273  /* b7 */0x7aa,
274  /* b8 */0x73a,
275  /* b9 */0x26a,
276  /* ba */0x16a,
277  /* bb */0x76a,
278  /* bc */0x0ea,
279  /* bd */0x6ea,
280  /* be */0x5ea,
281  /* bf */0x6ba,
282  /* c0 */0x676,
283  /* c1 */0x5d6,
284  /* c2 */0x6d6,
285  /* c3 */0x316,
286  /* c4 */0x756,
287  /* c5 */0x296,
288  /* c6 */0x196,
289  /* c7 */0x386,
290  /* c8 */0x796,
291  /* c9 */0x256,
292  /* ca */0x156,
293  /* cb */0x346,
294  /* cc */0x0d6,
295  /* cd */0x2c6,
296  /* ce */0x1c6,
297  /* cf */0x576,
298  /* d0 */0x5b6,
299  /* d1 */0x236,
300  /* d2 */0x136,
301  /* d3 */0x326,
302  /* d4 */0x0b6,
303  /* d5 */0x2a6,
304  /* d6 */0x1a6,
305  /* d7 */0x7a6,
306  /* d8 */0x736,
307  /* d9 */0x266,
308  /* da */0x166,
309  /* db */0x766,
310  /* dc */0x0e6,
311  /* dd */0x6e6,
312  /* de */0x5e6,
313  /* df */0x6b6,
314  /* e0 */0x271,
315  /* e1 */0x1d1,
316  /* e2 */0x2d1,
317  /* e3 */0x71e,
318  /* e4 */0x351,
319  /* e5 */0x69e,
320  /* e6 */0x59e,
321  /* e7 */0x78e,
322  /* e8 */0x391,
323  /* e9 */0x65e,
324  /* ea */0x55e,
325  /* eb */0x74e,
326  /* ec */0x4de,
327  /* ed */0x6ce,
328  /* ee */0x5ce,
329  /* ef */0x171,
330  /* f0 */0x1b1,
331  /* f1 */0x637,
332  /* f2 */0x537,
333  /* f3 */0x72e,
334  /* f4 */0x4b7,
335  /* f5 */0x6ae,
336  /* f6 */0x5ae,
337  /* f7 */0x3a1,
338  /* f8 */0x331,
339  /* f9 */0x66e,
340  /* fa */0x56e,
341  /* fb */0x361,
342  /* fc */0x4ee,
343  /* fd */0x2e1,
344  /* fe */0x1e1,
345  /* ff */0x2b1,
346  }, // RD = +1 cases
347  {
348  /* 00 */0x58b,
349  /* 01 */0x62b,
350  /* 02 */0x52b,
351  /* 03 */0x314,
352  /* 04 */0x4ab,
353  /* 05 */0x294,
354  /* 06 */0x194,
355  /* 07 */0x074,
356  /* 08 */0x46b,
357  /* 09 */0x254,
358  /* 0a */0x154,
359  /* 0b */0x344,
360  /* 0c */0x0d4,
361  /* 0d */0x2c4,
362  /* 0e */0x1c4,
363  /* 0f */0x68b,
364  /* 10 */0x64b,
365  /* 11 */0x234,
366  /* 12 */0x134,
367  /* 13 */0x324,
368  /* 14 */0x0b4,
369  /* 15 */0x2a4,
370  /* 16 */0x1a4,
371  /* 17 */0x45b,
372  /* 18 */0x4cb,
373  /* 19 */0x264,
374  /* 1a */0x164,
375  /* 1b */0x49b,
376  /* 1c */0x0e4,
377  /* 1d */0x51b,
378  /* 1e */0x61b,
379  /* 1f */0x54b,
380  /* 20 */0x189,
381  /* 21 */0x229,
382  /* 22 */0x129,
383  /* 23 */0x719,
384  /* 24 */0x0a9,
385  /* 25 */0x699,
386  /* 26 */0x599,
387  /* 27 */0x479,
388  /* 28 */0x069,
389  /* 29 */0x659,
390  /* 2a */0x559,
391  /* 2b */0x749,
392  /* 2c */0x4d9,
393  /* 2d */0x6c9,
394  /* 2e */0x5c9,
395  /* 2f */0x289,
396  /* 30 */0x249,
397  /* 31 */0x639,
398  /* 32 */0x539,
399  /* 33 */0x729,
400  /* 34 */0x4b9,
401  /* 35 */0x6a9,
402  /* 36 */0x5a9,
403  /* 37 */0x059,
404  /* 38 */0x0c9,
405  /* 39 */0x669,
406  /* 3a */0x569,
407  /* 3b */0x099,
408  /* 3c */0x4e9,
409  /* 3d */0x119,
410  /* 3e */0x219,
411  /* 3f */0x149,
412  /* 40 */0x185,
413  /* 41 */0x225,
414  /* 42 */0x125,
415  /* 43 */0x715,
416  /* 44 */0x0a5,
417  /* 45 */0x695,
418  /* 46 */0x595,
419  /* 47 */0x475,
420  /* 48 */0x065,
421  /* 49 */0x655,
422  /* 4a */0x555,
423  /* 4b */0x745,
424  /* 4c */0x4d5,
425  /* 4d */0x6c5,
426  /* 4e */0x5c5,
427  /* 4f */0x285,
428  /* 50 */0x245,
429  /* 51 */0x635,
430  /* 52 */0x535,
431  /* 53 */0x725,
432  /* 54 */0x4b5,
433  /* 55 */0x6a5,
434  /* 56 */0x5a5,
435  /* 57 */0x055,
436  /* 58 */0x0c5,
437  /* 59 */0x665,
438  /* 5a */0x565,
439  /* 5b */0x095,
440  /* 5c */0x4e5,
441  /* 5d */0x115,
442  /* 5e */0x215,
443  /* 5f */0x145,
444  /* 60 */0x18c,
445  /* 61 */0x22c,
446  /* 62 */0x12c,
447  /* 63 */0x713,
448  /* 64 */0x0ac,
449  /* 65 */0x693,
450  /* 66 */0x593,
451  /* 67 */0x473,
452  /* 68 */0x06c,
453  /* 69 */0x653,
454  /* 6a */0x553,
455  /* 6b */0x743,
456  /* 6c */0x4d3,
457  /* 6d */0x6c3,
458  /* 6e */0x5c3,
459  /* 6f */0x28c,
460  /* 70 */0x24c,
461  /* 71 */0x633,
462  /* 72 */0x533,
463  /* 73 */0x723,
464  /* 74 */0x4b3,
465  /* 75 */0x6a3,
466  /* 76 */0x5a3,
467  /* 77 */0x05c,
468  /* 78 */0x0cc,
469  /* 79 */0x663,
470  /* 7a */0x563,
471  /* 7b */0x09c,
472  /* 7c */0x4e3,
473  /* 7d */0x11c,
474  /* 7e */0x21c,
475  /* 7f */0x14c,
476  /* 80 */0x58d,
477  /* 81 */0x62d,
478  /* 82 */0x52d,
479  /* 83 */0x312,
480  /* 84 */0x4ad,
481  /* 85 */0x292,
482  /* 86 */0x192,
483  /* 87 */0x072,
484  /* 88 */0x46d,
485  /* 89 */0x252,
486  /* 8a */0x152,
487  /* 8b */0x342,
488  /* 8c */0x0d2,
489  /* 8d */0x2c2,
490  /* 8e */0x1c2,
491  /* 8f */0x68d,
492  /* 90 */0x64d,
493  /* 91 */0x232,
494  /* 92 */0x132,
495  /* 93 */0x322,
496  /* 94 */0x0b2,
497  /* 95 */0x2a2,
498  /* 96 */0x1a2,
499  /* 97 */0x45d,
500  /* 98 */0x4cd,
501  /* 99 */0x262,
502  /* 9a */0x162,
503  /* 9b */0x49d,
504  /* 9c */0x0e2,
505  /* 9d */0x51d,
506  /* 9e */0x61d,
507  /* 9f */0x54d,
508  /* a0 */0x18a,
509  /* a1 */0x22a,
510  /* a2 */0x12a,
511  /* a3 */0x71a,
512  /* a4 */0x0aa,
513  /* a5 */0x69a,
514  /* a6 */0x59a,
515  /* a7 */0x47a,
516  /* a8 */0x06a,
517  /* a9 */0x65a,
518  /* aa */0x55a,
519  /* ab */0x74a,
520  /* ac */0x4da,
521  /* ad */0x6ca,
522  /* ae */0x5ca,
523  /* af */0x28a,
524  /* b0 */0x24a,
525  /* b1 */0x63a,
526  /* b2 */0x53a,
527  /* b3 */0x72a,
528  /* b4 */0x4ba,
529  /* b5 */0x6aa,
530  /* b6 */0x5aa,
531  /* b7 */0x05a,
532  /* b8 */0x0ca,
533  /* b9 */0x66a,
534  /* ba */0x56a,
535  /* bb */0x09a,
536  /* bc */0x4ea,
537  /* bd */0x11a,
538  /* be */0x21a,
539  /* bf */0x14a,
540  /* c0 */0x186,
541  /* c1 */0x226,
542  /* c2 */0x126,
543  /* c3 */0x716,
544  /* c4 */0x0a6,
545  /* c5 */0x696,
546  /* c6 */0x596,
547  /* c7 */0x476,
548  /* c8 */0x066,
549  /* c9 */0x656,
550  /* ca */0x556,
551  /* cb */0x746,
552  /* cc */0x4d6,
553  /* cd */0x6c6,
554  /* ce */0x5c6,
555  /* cf */0x286,
556  /* d0 */0x246,
557  /* d1 */0x636,
558  /* d2 */0x536,
559  /* d3 */0x726,
560  /* d4 */0x4b6,
561  /* d5 */0x6a6,
562  /* d6 */0x5a6,
563  /* d7 */0x056,
564  /* d8 */0x0c6,
565  /* d9 */0x666,
566  /* da */0x566,
567  /* db */0x096,
568  /* dc */0x4e6,
569  /* dd */0x116,
570  /* de */0x216,
571  /* df */0x146,
572  /* e0 */0x58e,
573  /* e1 */0x62e,
574  /* e2 */0x52e,
575  /* e3 */0x311,
576  /* e4 */0x4ae,
577  /* e5 */0x291,
578  /* e6 */0x191,
579  /* e7 */0x071,
580  /* e8 */0x46e,
581  /* e9 */0x251,
582  /* ea */0x151,
583  /* eb */0x348,
584  /* ec */0x0d1,
585  /* ed */0x2c8,
586  /* ee */0x1c8,
587  /* ef */0x68e,
588  /* f0 */0x64e,
589  /* f1 */0x231,
590  /* f2 */0x131,
591  /* f3 */0x321,
592  /* f4 */0x0b1,
593  /* f5 */0x2a1,
594  /* f6 */0x1a1,
595  /* f7 */0x45e,
596  /* f8 */0x4ce,
597  /* f9 */0x261,
598  /* fa */0x161,
599  /* fb */0x49e,
600  /* fc */0x0e1,
601  /* fd */0x51e,
602  /* fe */0x61e,
603  /* ff */0x54e,
604  }
605  };
606 };
607 
608 } // namespace satnogs
609 } // namespace gr
610 
611 #endif /* INCLUDED_SATNOGS_AMSAT_DUV_DECODER_H */
612 
Abstract class that provided the API for the c decoders.
Definition: decoder.h:69
AMSAT 8b10b + CCSDS RS DUV decoder.
Definition: amsat_duv_decoder.h:36
Definition: amsat_duv_decoder.h:29
class decoder_status decoder_status_t
Definition: decoder.h:55
static const size_t amsat_fox_duv_frame_size
Definition: amsat_duv_decoder.h:40
#define SATNOGS_API
Definition: api.h:30