diff --git a/bsp/bsp.emProject b/bsp/bsp.emProject
index 1a4fd7e..ad68b0e 100644
--- a/bsp/bsp.emProject
+++ b/bsp/bsp.emProject
@@ -29,6 +29,7 @@
project_directory="."
project_type="Library" />
+
diff --git a/bsp/lh2.h b/bsp/lh2.h
index a2095c7..cb11bd5 100644
--- a/bsp/lh2.h
+++ b/bsp/lh2.h
@@ -23,7 +23,7 @@
//=========================== defines ==========================================
-#define LH2_BASESTATION_COUNT 4 ///< Number of supported concurrent basestations
+#define LH2_BASESTATION_COUNT 16 ///< Number of supported concurrent basestations
#define LH2_POLYNOMIAL_COUNT LH2_BASESTATION_COUNT * 2 ///< Number of supported LFSR polynomials, two per basestation
#define LH2_SWEEP_COUNT 2 ///< Number of laser sweeps per basestations rotation
diff --git a/bsp/lh2_checkpoints.h b/bsp/lh2_checkpoints.h
new file mode 100644
index 0000000..ae24365
--- /dev/null
+++ b/bsp/lh2_checkpoints.h
@@ -0,0 +1,4353 @@
+#ifndef __LH2_CHECKPOINTS_H_
+#define __LH2_CHECKPOINTS_H_
+
+/**
+ * @defgroup bsp_lh2_checkpoints LightHouse 2 decoder checkpoints
+ * @ingroup bsp_lh2
+ * @brief Precomputed checkpoints for the LFSR index search
+ *
+ * @{
+ * @file
+ * @author Said Alvarado-Marin
+ * @copyright Inria, 2025-present
+ * @}
+ */
+
+#include "lh2.h"
+
+//=========================== defines =========================================
+
+#define NUM_LSFR_COUNT_CHECKPOINTS 64 ///< How many lsfr checkpoints are per polynomial
+
+//=========================== variables ========================================
+
+static const uint32_t _polynomials[LH2_POLYNOMIAL_COUNT] = {
+ 0x0001D258,
+ 0x00017E04,
+ 0x0001FF6B,
+ 0x00013F67,
+ 0x0001B9EE,
+ 0x000198D1,
+ 0x000178C7,
+ 0x00018A55,
+ 0x00015777,
+ 0x0001D911,
+ 0x00015769,
+ 0x0001991F,
+ 0x00012BD0,
+ 0x0001CF73,
+ 0x0001365D,
+ 0x000197F5,
+ 0x000194A0,
+ 0x0001B279,
+ 0x00013A34,
+ 0x0001AE41,
+ 0x000180D4,
+ 0x00017891,
+ 0x00012E64,
+ 0x00017C72,
+ 0x00019C6D,
+ 0x00013F32,
+ 0x0001AE14,
+ 0x00014E76,
+ 0x00013C97,
+ 0x000130CB,
+ 0x00013750,
+ 0x0001CB8D,
+};
+
+static const uint32_t _lfsr_hash_table[LH2_POLYNOMIAL_COUNT][NUM_LSFR_COUNT_CHECKPOINTS] = {
+ {
+ // Polynomial: 0
+ 0b00000011000101111, // lfsr position: 104891
+ 0b00000111011010111, // lfsr position: 22375
+ 0b00001001000111101, // lfsr position: 89380
+ 0b00001101010111100, // lfsr position: 82546
+ 0b00010011100001100, // lfsr position: 72190
+ 0b00010111101101110, // lfsr position: 94537
+ 0b00011011000100100, // lfsr position: 17
+ 0b00011100110001011, // lfsr position: 12032
+ 0b00100001010001101, // lfsr position: 34419
+ 0b00100110010100011, // lfsr position: 56719
+ 0b00101010000111000, // lfsr position: 29233
+ 0b00101110100100001, // lfsr position: 17173
+ 0b00110011011101001, // lfsr position: 20667
+ 0b00110110010000010, // lfsr position: 77346
+ 0b00111001011011100, // lfsr position: 44727
+ 0b00111110100101011, // lfsr position: 3402
+ 0b01000001011100111, // lfsr position: 49868
+ 0b01000100100110101, // lfsr position: 10311
+ 0b01001011101110000, // lfsr position: 37782
+ 0b01001110010100111, // lfsr position: 18911
+ 0b01010000000101101, // lfsr position: 67022
+ 0b01010100110000100, // lfsr position: 73904
+ 0b01011000000001010, // lfsr position: 58419
+ 0b01011111011110110, // lfsr position: 103115
+ 0b01100010111011011, // lfsr position: 36092
+ 0b01100100100000101, // lfsr position: 65320
+ 0b01101011000110101, // lfsr position: 41248
+ 0b01101100110110011, // lfsr position: 32679
+ 0b01110001000100001, // lfsr position: 106588
+ 0b01110111101000100, // lfsr position: 1726
+ 0b01111000111000001, // lfsr position: 6841
+ 0b01111100100100001, // lfsr position: 75584
+ 0b10000001011110100, // lfsr position: 101425
+ 0b10000110111101010, // lfsr position: 24050
+ 0b10001000110011011, // lfsr position: 15502
+ 0b10001101100101011, // lfsr position: 42982
+ 0b10010010100110011, // lfsr position: 92856
+ 0b10010100011011111, // lfsr position: 5160
+ 0b10011000010011110, // lfsr position: 85898
+ 0b10011111111011110, // lfsr position: 84222
+ 0b10100000011111011, // lfsr position: 27537
+ 0b10100110100000110, // lfsr position: 91095
+ 0b10101001011100001, // lfsr position: 53274
+ 0b10101100111101111, // lfsr position: 70482
+ 0b10110000100100100, // lfsr position: 30938
+ 0b10110100111000111, // lfsr position: 8573
+ 0b10111000101011110, // lfsr position: 87677
+ 0b10111111100010010, // lfsr position: 68731
+ 0b11000001110100011, // lfsr position: 97961
+ 0b11000110011101001, // lfsr position: 55047
+ 0b11001000011000011, // lfsr position: 80804
+ 0b11001110101000001, // lfsr position: 39509
+ 0b11010010000000111, // lfsr position: 60154
+ 0b11010101110111100, // lfsr position: 25783
+ 0b11011011111001100, // lfsr position: 46401
+ 0b11011101101100101, // lfsr position: 61913
+ 0b11100000101000010, // lfsr position: 96262
+ 0b11100101010010101, // lfsr position: 13740
+ 0b11101001111110011, // lfsr position: 48081
+ 0b11101111010111100, // lfsr position: 79041
+ 0b11110001100100011, // lfsr position: 108275
+ 0b11110111000100100, // lfsr position: 63605
+ 0b11111001010110111, // lfsr position: 99663
+ 0b11111100101011100, // lfsr position: 51548
+ },
+ {
+ // Polynomial: 1
+ 0b00000000000001100, // lfsr position: 99695
+ 0b00000110100010001, // lfsr position: 10285
+ 0b00001001001000011, // lfsr position: 108302
+ 0b00001111101110101, // lfsr position: 51581
+ 0b00010011001001011, // lfsr position: 5167
+ 0b00010101011101011, // lfsr position: 82518
+ 0b00011000100010110, // lfsr position: 53274
+ 0b00011100000110100, // lfsr position: 80760
+ 0b00100001101011000, // lfsr position: 91102
+ 0b00100110110010101, // lfsr position: 49833
+ 0b00101010100011101, // lfsr position: 41
+ 0b00101111110010011, // lfsr position: 58429
+ 0b00110000110110111, // lfsr position: 68725
+ 0b00110100010010000, // lfsr position: 67025
+ 0b00111010110111110, // lfsr position: 72157
+ 0b00111100100001100, // lfsr position: 106524
+ 0b01000000110111100, // lfsr position: 36092
+ 0b01000111011000111, // lfsr position: 63595
+ 0b01001011010100011, // lfsr position: 1719
+ 0b01001101110111010, // lfsr position: 13769
+ 0b01010010110111100, // lfsr position: 18869
+ 0b01010100100101101, // lfsr position: 84200
+ 0b01011001111001001, // lfsr position: 42944
+ 0b01011110110111011, // lfsr position: 25773
+ 0b01100000100110011, // lfsr position: 15466
+ 0b01100111100000100, // lfsr position: 22348
+ 0b01101001101110111, // lfsr position: 34345
+ 0b01101101011000000, // lfsr position: 56689
+ 0b01110010110000101, // lfsr position: 32674
+ 0b01110101000010001, // lfsr position: 39529
+ 0b01111001101100110, // lfsr position: 6853
+ 0b01111111111111111, // lfsr position: 73877
+ 0b10000011011100101, // lfsr position: 87694
+ 0b10000111111110111, // lfsr position: 12013
+ 0b10001000010111110, // lfsr position: 94508
+ 0b10001111111011010, // lfsr position: 54972
+ 0b10010010111110011, // lfsr position: 92843
+ 0b10010110000111100, // lfsr position: 60156
+ 0b10011011111010100, // lfsr position: 46425
+ 0b10011101110001111, // lfsr position: 17190
+ 0b10100010010011101, // lfsr position: 103089
+ 0b10100101000110001, // lfsr position: 3455
+ 0b10101000011011111, // lfsr position: 77300
+ 0b10101111110001010, // lfsr position: 96231
+ 0b10110001011001010, // lfsr position: 29251
+ 0b10110101010010001, // lfsr position: 44677
+ 0b10111000111111011, // lfsr position: 37800
+ 0b10111100110000111, // lfsr position: 89396
+ 0b11000001110110101, // lfsr position: 104837
+ 0b11000110001100010, // lfsr position: 27502
+ 0b11001011100010100, // lfsr position: 61887
+ 0b11001100011100001, // lfsr position: 20629
+ 0b11010010001010010, // lfsr position: 70460
+ 0b11010100101010101, // lfsr position: 85904
+ 0b11011000100100011, // lfsr position: 41247
+ 0b11011111101011011, // lfsr position: 8572
+ 0b11100010111100100, // lfsr position: 65298
+ 0b11100110101100011, // lfsr position: 30916
+ 0b11101001011101010, // lfsr position: 101432
+ 0b11101110101001011, // lfsr position: 97989
+ 0b11110001100111110, // lfsr position: 24106
+ 0b11110110011011010, // lfsr position: 75617
+ 0b11111010110101001, // lfsr position: 48153
+ 0b11111100001011100, // lfsr position: 79078
+ },
+ {
+ // Polynomial: 2
+ 0b00000011110010010, // lfsr position: 82521
+ 0b00000111010111000, // lfsr position: 32691
+ 0b00001001100101101, // lfsr position: 97970
+ 0b00001110000100101, // lfsr position: 92766
+ 0b00010010101101111, // lfsr position: 39579
+ 0b00010111011000110, // lfsr position: 34363
+ 0b00011011010011101, // lfsr position: 25783
+ 0b00011111101101001, // lfsr position: 61876
+ 0b00100001100101100, // lfsr position: 108264
+ 0b00100110000101010, // lfsr position: 46413
+ 0b00101001100100100, // lfsr position: 30967
+ 0b00101101000001100, // lfsr position: 5154
+ 0b00110001101010111, // lfsr position: 10294
+ 0b00110110010101010, // lfsr position: 72232
+ 0b00111010000000111, // lfsr position: 73918
+ 0b00111110110100101, // lfsr position: 18905
+ 0b01000000001100000, // lfsr position: 3427
+ 0b01000110000010100, // lfsr position: 63593
+ 0b01001010001100101, // lfsr position: 91065
+ 0b01001100111101000, // lfsr position: 106528
+ 0b01010010101101000, // lfsr position: 67049
+ 0b01010110111011010, // lfsr position: 55029
+ 0b01011010011001101, // lfsr position: 85944
+ 0b01011101110011100, // lfsr position: 84219
+ 0b01100001110011101, // lfsr position: 13714
+ 0b01100111010001111, // lfsr position: 87659
+ 0b01101010101100101, // lfsr position: 94578
+ 0b01101110110100110, // lfsr position: 51540
+ 0b01110010001010110, // lfsr position: 43004
+ 0b01110110000110100, // lfsr position: 89371
+ 0b01111010101000101, // lfsr position: 49819
+ 0b01111101011101110, // lfsr position: 70447
+ 0b10000010101001101, // lfsr position: 60183
+ 0b10000100110001011, // lfsr position: 75646
+ 0b10001010101001000, // lfsr position: 79069
+ 0b10001101110111000, // lfsr position: 8579
+ 0b10010000110001000, // lfsr position: 101409
+ 0b10010110100100100, // lfsr position: 96245
+ 0b10011000101111111, // lfsr position: 1725
+ 0b10011110010101000, // lfsr position: 29219
+ 0b10100010000001001, // lfsr position: 37781
+ 0b10100100000001101, // lfsr position: 17
+ 0b10101001010000000, // lfsr position: 103108
+ 0b10101110000101110, // lfsr position: 68750
+ 0b10110001101110011, // lfsr position: 58473
+ 0b10110101111101110, // lfsr position: 24073
+ 0b10111010100001000, // lfsr position: 41259
+ 0b10111111001111001, // lfsr position: 36073
+ 0b11000011100110100, // lfsr position: 15458
+ 0b11000110111110010, // lfsr position: 53277
+ 0b11001000011000011, // lfsr position: 77355
+ 0b11001111011000001, // lfsr position: 44717
+ 0b11010001100010000, // lfsr position: 20596
+ 0b11010111110000001, // lfsr position: 99670
+ 0b11011000001001111, // lfsr position: 65279
+ 0b11011110101100100, // lfsr position: 104895
+ 0b11100001110000011, // lfsr position: 22362
+ 0b11100110000101010, // lfsr position: 56765
+ 0b11101011110110110, // lfsr position: 48136
+ 0b11101100001111100, // lfsr position: 27500
+ 0b11110001001010100, // lfsr position: 12050
+ 0b11110100011010001, // lfsr position: 6856
+ 0b11111010000010011, // lfsr position: 80759
+ 0b11111100100101110, // lfsr position: 17210
+ },
+ {
+ // Polynomial: 3
+ 0b00000000011001011, // lfsr position: 10313
+ 0b00000111000010100, // lfsr position: 72196
+ 0b00001011000011011, // lfsr position: 41232
+ 0b00001100011111101, // lfsr position: 42977
+ 0b00010010001111010, // lfsr position: 61847
+ 0b00010101000011001, // lfsr position: 65302
+ 0b00011010010000110, // lfsr position: 99687
+ 0b00011111001100010, // lfsr position: 24044
+ 0b00100001001100011, // lfsr position: 3424
+ 0b00100110110001101, // lfsr position: 101405
+ 0b00101011101000010, // lfsr position: 34377
+ 0b00101101000001100, // lfsr position: 46383
+ 0b00110011000011000, // lfsr position: 30951
+ 0b00110100001111011, // lfsr position: 106545
+ 0b00111010010000001, // lfsr position: 53273
+ 0b00111100101000010, // lfsr position: 22366
+ 0b01000010010100000, // lfsr position: 79090
+ 0b01000110101110111, // lfsr position: 67039
+ 0b01001010101001011, // lfsr position: 70469
+ 0b01001110101010000, // lfsr position: 58392
+ 0b01010011111000100, // lfsr position: 6897
+ 0b01010100101101011, // lfsr position: 97952
+ 0b01011011100110001, // lfsr position: 8588
+ 0b01011101011000101, // lfsr position: 1736
+ 0b01100000110001100, // lfsr position: 84227
+ 0b01100111101011110, // lfsr position: 20627
+ 0b01101000110000101, // lfsr position: 37851
+ 0b01101111010100001, // lfsr position: 56681
+ 0b01110010011001101, // lfsr position: 18937
+ 0b01110100110101100, // lfsr position: 55003
+ 0b01111010111010100, // lfsr position: 96285
+ 0b01111111110010101, // lfsr position: 60172
+ 0b10000010110010010, // lfsr position: 49830
+ 0b10000100110111111, // lfsr position: 13727
+ 0b10001011111100110, // lfsr position: 36098
+ 0b10001110001001001, // lfsr position: 89347
+ 0b10010011100000101, // lfsr position: 68751
+ 0b10010110111011101, // lfsr position: 27484
+ 0b10011010010111100, // lfsr position: 12008
+ 0b10011101100001101, // lfsr position: 15483
+ 0b10100010111110000, // lfsr position: 32660
+ 0b10100110110100100, // lfsr position: 85943
+ 0b10101011111101001, // lfsr position: 17214
+ 0b10101110000010101, // lfsr position: 30
+ 0b10110000110000001, // lfsr position: 44680
+ 0b10110101111100100, // lfsr position: 103141
+ 0b10111001100101110, // lfsr position: 51578
+ 0b10111110100000101, // lfsr position: 82487
+ 0b11000001011000110, // lfsr position: 25766
+ 0b11000100110101001, // lfsr position: 75584
+ 0b11001011010001101, // lfsr position: 29176
+ 0b11001110000100100, // lfsr position: 91099
+ 0b11010001011101010, // lfsr position: 73950
+ 0b11010111110001001, // lfsr position: 108267
+ 0b11011011101001111, // lfsr position: 104828
+ 0b11011111100001111, // lfsr position: 63578
+ 0b11100010010110001, // lfsr position: 87626
+ 0b11100111001110100, // lfsr position: 94575
+ 0b11101001110010101, // lfsr position: 39513
+ 0b11101101100101111, // lfsr position: 77318
+ 0b11110001101101001, // lfsr position: 92801
+ 0b11110110101110100, // lfsr position: 80787
+ 0b11111011001010001, // lfsr position: 5136
+ 0b11111110011110111, // lfsr position: 48135
+ },
+ {
+ // Polynomial: 4
+ 0b00000010011101011, // lfsr position: 60132
+ 0b00000100111000010, // lfsr position: 63614
+ 0b00001000100111001, // lfsr position: 48144
+ 0b00001100000010101, // lfsr position: 10318
+ 0b00010000110100000, // lfsr position: 36117
+ 0b00010110010001001, // lfsr position: 25779
+ 0b00011001110111111, // lfsr position: 99728
+ 0b00011101111010100, // lfsr position: 85904
+ 0b00100011110111000, // lfsr position: 18898
+ 0b00100101001101011, // lfsr position: 82502
+ 0b00101010001111010, // lfsr position: 61842
+ 0b00101101111101111, // lfsr position: 44657
+ 0b00110001000111110, // lfsr position: 3430
+ 0b00110110111110100, // lfsr position: 92799
+ 0b00111011111011111, // lfsr position: 68756
+ 0b00111111010010110, // lfsr position: 46408
+ 0b01000000000011001, // lfsr position: 89410
+ 0b01000100100000111, // lfsr position: 37799
+ 0b01001011100001110, // lfsr position: 73871
+ 0b01001111010000000, // lfsr position: 17213
+ 0b01010000000111110, // lfsr position: 87702
+ 0b01010110011101011, // lfsr position: 91091
+ 0b01011011000010010, // lfsr position: 5169
+ 0b01011101000101101, // lfsr position: 37
+ 0b01100001010001100, // lfsr position: 84238
+ 0b01100101100000111, // lfsr position: 13738
+ 0b01101011001001110, // lfsr position: 1710
+ 0b01101110110010010, // lfsr position: 42960
+ 0b01110010011010111, // lfsr position: 41228
+ 0b01110111111011010, // lfsr position: 108283
+ 0b01111001001111011, // lfsr position: 20628
+ 0b01111101001110100, // lfsr position: 6852
+ 0b10000011011000100, // lfsr position: 80746
+ 0b10000101110000010, // lfsr position: 103117
+ 0b10001010110001111, // lfsr position: 27463
+ 0b10001111101101010, // lfsr position: 94520
+ 0b10010010111010100, // lfsr position: 39518
+ 0b10010110101111010, // lfsr position: 8613
+ 0b10011000001101101, // lfsr position: 56739
+ 0b10011111100101000, // lfsr position: 75661
+ 0b10100011110111101, // lfsr position: 101370
+ 0b10100100110100111, // lfsr position: 29259
+ 0b10101011101000110, // lfsr position: 97967
+ 0b10101100011010000, // lfsr position: 54981
+ 0b10110011101110111, // lfsr position: 79037
+ 0b10110100001010111, // lfsr position: 34379
+ 0b10111001110111111, // lfsr position: 30963
+ 0b10111111000100011, // lfsr position: 12043
+ 0b11000010000000011, // lfsr position: 58477
+ 0b11000111010000110, // lfsr position: 22369
+ 0b11001011101101111, // lfsr position: 106581
+ 0b11001110000101011, // lfsr position: 67027
+ 0b11010010100101011, // lfsr position: 53256
+ 0b11010101101001111, // lfsr position: 15454
+ 0b11011001010010110, // lfsr position: 51547
+ 0b11011100000100000, // lfsr position: 24030
+ 0b11100000101101101, // lfsr position: 65317
+ 0b11100110111101010, // lfsr position: 77304
+ 0b11101011000100100, // lfsr position: 104849
+ 0b11101110010001110, // lfsr position: 32631
+ 0b11110010100011010, // lfsr position: 96250
+ 0b11110100011000100, // lfsr position: 49853
+ 0b11111011111101001, // lfsr position: 70472
+ 0b11111101000001101, // lfsr position: 72152
+ },
+ {
+ // Polynomial: 5
+ 0b00000000111011110, // lfsr position: 51571
+ 0b00000101110000010, // lfsr position: 20646
+ 0b00001011010001101, // lfsr position: 84217
+ 0b00001101000110001, // lfsr position: 70471
+ 0b00010010101100110, // lfsr position: 49890
+ 0b00010100000100100, // lfsr position: 99709
+ 0b00011001000000111, // lfsr position: 1678
+ 0b00011110010000001, // lfsr position: 73953
+ 0b00100000011000110, // lfsr position: 6907
+ 0b00100110000101100, // lfsr position: 34407
+ 0b00101011100100101, // lfsr position: 60157
+ 0b00101111011001100, // lfsr position: 92830
+ 0b00110000010000101, // lfsr position: 29264
+ 0b00110111011001010, // lfsr position: 67020
+ 0b00111011010111011, // lfsr position: 15466
+ 0b00111110010111000, // lfsr position: 85954
+ 0b01000010100110011, // lfsr position: 22360
+ 0b01000100001100010, // lfsr position: 108296
+ 0b01001001110011100, // lfsr position: 10312
+ 0b01001101111010111, // lfsr position: 18892
+ 0b01010001100001110, // lfsr position: 94547
+ 0b01010100010011011, // lfsr position: 27502
+ 0b01011001000100001, // lfsr position: 106567
+ 0b01011100010010100, // lfsr position: 5128
+ 0b01100000010000111, // lfsr position: 55031
+ 0b01100101110100110, // lfsr position: 41251
+ 0b01101000000000110, // lfsr position: 32646
+ 0b01101110000111100, // lfsr position: 97969
+ 0b01110001001010001, // lfsr position: 75626
+ 0b01110100000100011, // lfsr position: 101397
+ 0b01111000010111111, // lfsr position: 3430
+ 0b01111100000100111, // lfsr position: 37793
+ 0b10000011100011011, // lfsr position: 96211
+ 0b10000100111001001, // lfsr position: 87686
+ 0b10001011001111011, // lfsr position: 49
+ 0b10001101101000011, // lfsr position: 44683
+ 0b10010011011001011, // lfsr position: 36079
+ 0b10010111010100110, // lfsr position: 58479
+ 0b10011001011111010, // lfsr position: 68732
+ 0b10011110110100100, // lfsr position: 80743
+ 0b10100000011000001, // lfsr position: 103117
+ 0b10100111000101000, // lfsr position: 89377
+ 0b10101011011000011, // lfsr position: 63602
+ 0b10101100100101110, // lfsr position: 61876
+ 0b10110000111100000, // lfsr position: 39530
+ 0b10110111111000000, // lfsr position: 13763
+ 0b10111010101101010, // lfsr position: 104821
+ 0b10111100011000000, // lfsr position: 77381
+ 0b11000001101011111, // lfsr position: 8596
+ 0b11000100011000101, // lfsr position: 56716
+ 0b11001001110000110, // lfsr position: 65286
+ 0b11001111100000011, // lfsr position: 25822
+ 0b11010011110011011, // lfsr position: 79020
+ 0b11010110110011110, // lfsr position: 82512
+ 0b11011011101101111, // lfsr position: 24059
+ 0b11011110001110101, // lfsr position: 46385
+ 0b11100011100010110, // lfsr position: 17197
+ 0b11100101010100001, // lfsr position: 12028
+ 0b11101000001001101, // lfsr position: 72190
+ 0b11101111001100100, // lfsr position: 53306
+ 0b11110000110000000, // lfsr position: 91108
+ 0b11110111110010000, // lfsr position: 48097
+ 0b11111011110100111, // lfsr position: 30936
+ 0b11111100100011101, // lfsr position: 42957
+ },
+ {
+ // Polynomial: 6
+ 0b00000011111001010, // lfsr position: 42950
+ 0b00000111010110101, // lfsr position: 106575
+ 0b00001001010101000, // lfsr position: 82493
+ 0b00001110101111010, // lfsr position: 51550
+ 0b00010011011101111, // lfsr position: 17210
+ 0b00010111000110011, // lfsr position: 70452
+ 0b00011011110011111, // lfsr position: 99714
+ 0b00011111001011010, // lfsr position: 49834
+ 0b00100011010010111, // lfsr position: 84249
+ 0b00100110111110010, // lfsr position: 68762
+ 0b00101010111011111, // lfsr position: 46419
+ 0b00101110110100011, // lfsr position: 56717
+ 0b00110001001011010, // lfsr position: 25773
+ 0b00110101010001000, // lfsr position: 15463
+ 0b00111011011111001, // lfsr position: 8571
+ 0b00111110111011000, // lfsr position: 89332
+ 0b01000001001011001, // lfsr position: 48127
+ 0b01000100011011110, // lfsr position: 58445
+ 0b01001000010010110, // lfsr position: 12027
+ 0b01001111010101011, // lfsr position: 77365
+ 0b01010000010001000, // lfsr position: 60154
+ 0b01010111101100000, // lfsr position: 3409
+ 0b01011000111011010, // lfsr position: 20610
+ 0b01011110001111111, // lfsr position: 75635
+ 0b01100000010000011, // lfsr position: 53282
+ 0b01100101001010100, // lfsr position: 61871
+ 0b01101001111110101, // lfsr position: 34398
+ 0b01101101010011010, // lfsr position: 24073
+ 0b01110001011001110, // lfsr position: 36115
+ 0b01110100011111000, // lfsr position: 41248
+ 0b01111000110000011, // lfsr position: 27495
+ 0b01111110101110000, // lfsr position: 10334
+ 0b10000000111010001, // lfsr position: 91138
+ 0b10000110101101000, // lfsr position: 55010
+ 0b10001011011001101, // lfsr position: 96237
+ 0b10001101010010001, // lfsr position: 101412
+ 0b10010010111101010, // lfsr position: 85922
+ 0b10010110011101101, // lfsr position: 5114
+ 0b10011011100001101, // lfsr position: 44702
+ 0b10011110101110111, // lfsr position: 6914
+ 0b10100000011000000, // lfsr position: 1754
+ 0b10100100010101101, // lfsr position: 21
+ 0b10101010101110000, // lfsr position: 67047
+ 0b10101110010000100, // lfsr position: 13714
+ 0b10110011001101010, // lfsr position: 108303
+ 0b10110111110100110, // lfsr position: 18906
+ 0b10111011011101001, // lfsr position: 103127
+ 0b10111101000111001, // lfsr position: 29195
+ 0b11000011011000000, // lfsr position: 30944
+ 0b11000110101111101, // lfsr position: 63577
+ 0b11001011110001010, // lfsr position: 80788
+ 0b11001111001010011, // lfsr position: 92817
+ 0b11010011110011100, // lfsr position: 72176
+ 0b11010111011011101, // lfsr position: 104838
+ 0b11011001001001111, // lfsr position: 65346
+ 0b11011110001001111, // lfsr position: 39528
+ 0b11100001101111010, // lfsr position: 73906
+ 0b11100101001110001, // lfsr position: 97953
+ 0b11101000111111010, // lfsr position: 37814
+ 0b11101100100111011, // lfsr position: 79101
+ 0b11110001011011101, // lfsr position: 94532
+ 0b11110111111000110, // lfsr position: 22350
+ 0b11111011000100000, // lfsr position: 32617
+ 0b11111101110101001, // lfsr position: 87655
+ },
+ {
+ // Polynomial: 7
+ 0b00000010001011001, // lfsr position: 77297
+ 0b00000100110001010, // lfsr position: 17175
+ 0b00001010100010111, // lfsr position: 70460
+ 0b00001101101010100, // lfsr position: 27486
+ 0b00010001110001011, // lfsr position: 94515
+ 0b00010100010001110, // lfsr position: 108291
+ 0b00011011110111110, // lfsr position: 53278
+ 0b00011100100111111, // lfsr position: 61891
+ 0b00100010110000110, // lfsr position: 3431
+ 0b00100110001100011, // lfsr position: 11995
+ 0b00101010100100001, // lfsr position: 63596
+ 0b00101101011100011, // lfsr position: 37
+ 0b00110011000110010, // lfsr position: 99693
+ 0b00110111110110111, // lfsr position: 25761
+ 0b00111000110001011, // lfsr position: 84221
+ 0b00111101111101101, // lfsr position: 15474
+ 0b01000011001101101, // lfsr position: 96226
+ 0b01000110010101111, // lfsr position: 44713
+ 0b01001001111101100, // lfsr position: 67050
+ 0b01001100110010000, // lfsr position: 37786
+ 0b01010011101010010, // lfsr position: 91090
+ 0b01010110101001111, // lfsr position: 20643
+ 0b01011000111000001, // lfsr position: 58418
+ 0b01011111010000100, // lfsr position: 42943
+ 0b01100000000010111, // lfsr position: 85932
+ 0b01100100000111001, // lfsr position: 1700
+ 0b01101011000101111, // lfsr position: 103117
+ 0b01101110011110100, // lfsr position: 87609
+ 0b01110001000000111, // lfsr position: 65296
+ 0b01110101011100100, // lfsr position: 82454
+ 0b01111011110110010, // lfsr position: 5166
+ 0b01111110100111111, // lfsr position: 32662
+ 0b10000010100001101, // lfsr position: 92811
+ 0b10000111111011011, // lfsr position: 72203
+ 0b10001010011001010, // lfsr position: 8587
+ 0b10001111100100001, // lfsr position: 75596
+ 0b10010001000000000, // lfsr position: 24060
+ 0b10010101010001100, // lfsr position: 29223
+ 0b10011000101000001, // lfsr position: 22345
+ 0b10011100001011100, // lfsr position: 73921
+ 0b10100010000001100, // lfsr position: 104875
+ 0b10100101111010101, // lfsr position: 97995
+ 0b10101011000001010, // lfsr position: 48085
+ 0b10101101000110100, // lfsr position: 55006
+ 0b10110000110010010, // lfsr position: 41265
+ 0b10110111110011100, // lfsr position: 10269
+ 0b10111011001110010, // lfsr position: 60184
+ 0b10111110000010110, // lfsr position: 68783
+ 0b11000011110010100, // lfsr position: 30954
+ 0b11000110111000000, // lfsr position: 106561
+ 0b11001011000111000, // lfsr position: 36118
+ 0b11001100010110110, // lfsr position: 51554
+ 0b11010000111100110, // lfsr position: 56709
+ 0b11010100011011110, // lfsr position: 18898
+ 0b11011011001010011, // lfsr position: 89385
+ 0b11011100000010000, // lfsr position: 34405
+ 0b11100000110011101, // lfsr position: 6870
+ 0b11100110111100011, // lfsr position: 80808
+ 0b11101000101001101, // lfsr position: 49850
+ 0b11101100101101010, // lfsr position: 101427
+ 0b11110010110110100, // lfsr position: 13752
+ 0b11110111000000001, // lfsr position: 79038
+ 0b11111010010010011, // lfsr position: 39530
+ 0b11111101011110011, // lfsr position: 46385
+ },
+ {
+ // Polynomial: 8
+ 0b00000000000000001, // lfsr position: 0
+ 0b00000100110101110, // lfsr position: 94551
+ 0b00001010111101111, // lfsr position: 103154
+ 0b00001100000110110, // lfsr position: 77345
+ 0b00010010010011101, // lfsr position: 41253
+ 0b00010101100111010, // lfsr position: 13710
+ 0b00011011101000000, // lfsr position: 104810
+ 0b00011111010001110, // lfsr position: 67051
+ 0b00100000000111110, // lfsr position: 106585
+ 0b00100111011001000, // lfsr position: 58399
+ 0b00101011010101100, // lfsr position: 10302
+ 0b00101101001111101, // lfsr position: 82499
+ 0b00110000101010110, // lfsr position: 42979
+ 0b00110110101101100, // lfsr position: 25787
+ 0b00111000100001100, // lfsr position: 98004
+ 0b00111111101111011, // lfsr position: 92795
+ 0b01000001000001111, // lfsr position: 91104
+ 0b01000110011001011, // lfsr position: 12074
+ 0b01001011001011111, // lfsr position: 24060
+ 0b01001111000011001, // lfsr position: 72207
+ 0b01010011000000011, // lfsr position: 22345
+ 0b01010110001001101, // lfsr position: 101450
+ 0b01011010101010100, // lfsr position: 87663
+ 0b01011101011001011, // lfsr position: 39532
+ 0b01100010010100000, // lfsr position: 99647
+ 0b01100101110101111, // lfsr position: 73895
+ 0b01101011010101101, // lfsr position: 68768
+ 0b01101110111100110, // lfsr position: 70446
+ 0b01110000000000001, // lfsr position: 53290
+ 0b01110101101010101, // lfsr position: 46427
+ 0b01111011100011110, // lfsr position: 61905
+ 0b01111110011110101, // lfsr position: 3407
+ 0b10000011110111100, // lfsr position: 49819
+ 0b10000110100111001, // lfsr position: 63583
+ 0b10001011101000110, // lfsr position: 80740
+ 0b10001110000000000, // lfsr position: 65301
+ 0b10010001101001010, // lfsr position: 1684
+ 0b10010100100010011, // lfsr position: 6877
+ 0b10011011000111000, // lfsr position: 20629
+ 0b10011101111010011, // lfsr position: 75598
+ 0b10100001110100101, // lfsr position: 51575
+ 0b10100110110100000, // lfsr position: 108258
+ 0b10101001000111000, // lfsr position: 32626
+ 0b10101110011000010, // lfsr position: 79055
+ 0b10110001001101110, // lfsr position: 29196
+ 0b10110110011010111, // lfsr position: 36089
+ 0b10111011001100100, // lfsr position: 85908
+ 0b10111100000101110, // lfsr position: 84242
+ 0b11000010100001011, // lfsr position: 96278
+ 0b11000100111111111, // lfsr position: 60139
+ 0b11001010010010000, // lfsr position: 44661
+ 0b11001101110100100, // lfsr position: 17173
+ 0b11010000111101011, // lfsr position: 89379
+ 0b11010101011001110, // lfsr position: 30953
+ 0b11011001000001001, // lfsr position: 55044
+ 0b11011111111010111, // lfsr position: 5149
+ 0b11100001100010001, // lfsr position: 8599
+ 0b11100101101111000, // lfsr position: 56699
+ 0b11101001011010011, // lfsr position: 15505
+ 0b11101101101110101, // lfsr position: 18939
+ 0b11110001111111110, // lfsr position: 37811
+ 0b11110101110010101, // lfsr position: 34389
+ 0b11111010001100101, // lfsr position: 48104
+ 0b11111111101000110, // lfsr position: 27541
+ },
+ {
+ // Polynomial: 9
+ 0b00000010000100001, // lfsr position: 103076
+ 0b00000100100010101, // lfsr position: 12028
+ 0b00001011101000110, // lfsr position: 6907
+ 0b00001100110101011, // lfsr position: 18917
+ 0b00010011000101000, // lfsr position: 8592
+ 0b00010110100110001, // lfsr position: 27508
+ 0b00011001010100100, // lfsr position: 70488
+ 0b00011110011011101, // lfsr position: 84191
+ 0b00100011000011100, // lfsr position: 46431
+ 0b00100101011000111, // lfsr position: 58414
+ 0b00101010100110011, // lfsr position: 68715
+ 0b00101101101101101, // lfsr position: 10322
+ 0b00110000100010111, // lfsr position: 106544
+ 0b00110110001011110, // lfsr position: 30924
+ 0b00111011110000000, // lfsr position: 22342
+ 0b00111100011110110, // lfsr position: 72214
+ 0b01000010100110100, // lfsr position: 15507
+ 0b01000101111000011, // lfsr position: 80732
+ 0b01001010101010000, // lfsr position: 51601
+ 0b01001101101001011, // lfsr position: 97971
+ 0b01010011010100011, // lfsr position: 37827
+ 0b01010100010000100, // lfsr position: 85941
+ 0b01011000111011101, // lfsr position: 82519
+ 0b01011111110010000, // lfsr position: 79014
+ 0b01100010100010100, // lfsr position: 20646
+ 0b01100100001010011, // lfsr position: 94516
+ 0b01101000111111111, // lfsr position: 60144
+ 0b01101110100111011, // lfsr position: 48103
+ 0b01110000001111001, // lfsr position: 87646
+ 0b01110100111000011, // lfsr position: 13752
+ 0b01111010100100110, // lfsr position: 42942
+ 0b01111111001011110, // lfsr position: 89390
+ 0b10000001011000101, // lfsr position: 67051
+ 0b10000111111110110, // lfsr position: 1771
+ 0b10001011010100111, // lfsr position: 99701
+ 0b10001111101111001, // lfsr position: 75594
+ 0b10010011000100011, // lfsr position: 108283
+ 0b10010100100111001, // lfsr position: 5171
+ 0b10011010010110111, // lfsr position: 41
+ 0b10011111101101011, // lfsr position: 39516
+ 0b10100001101100111, // lfsr position: 32642
+ 0b10100101110001110, // lfsr position: 96200
+ 0b10101001010001111, // lfsr position: 3434
+ 0b10101110111110010, // lfsr position: 29262
+ 0b10110001000011000, // lfsr position: 56720
+ 0b10110110000010001, // lfsr position: 73906
+ 0b10111000111011000, // lfsr position: 77339
+ 0b10111101011011110, // lfsr position: 55001
+ 0b11000010110001011, // lfsr position: 41288
+ 0b11000100111011001, // lfsr position: 49852
+ 0b11001000001100111, // lfsr position: 44679
+ 0b11001101001111100, // lfsr position: 92845
+ 0b11010010010100111, // lfsr position: 101371
+ 0b11010101010011101, // lfsr position: 63593
+ 0b11011010110011000, // lfsr position: 34398
+ 0b11011111101001001, // lfsr position: 36101
+ 0b11100011111011011, // lfsr position: 24038
+ 0b11100101100101000, // lfsr position: 17191
+ 0b11101000001000111, // lfsr position: 91139
+ 0b11101110001010110, // lfsr position: 53287
+ 0b11110011111110101, // lfsr position: 25780
+ 0b11110110010110010, // lfsr position: 61908
+ 0b11111011100111011, // lfsr position: 104855
+ 0b11111100010100101, // lfsr position: 65327
+ },
+ {
+ // Polynomial: 10
+ 0b00000010001000001, // lfsr position: 68748
+ 0b00000111011000001, // lfsr position: 56727
+ 0b00001010011010110, // lfsr position: 60150
+ 0b00001110111111111, // lfsr position: 70458
+ 0b00010001011101111, // lfsr position: 29204
+ 0b00010100110000001, // lfsr position: 8607
+ 0b00011001001011101, // lfsr position: 79089
+ 0b00011111100100011, // lfsr position: 37802
+ 0b00100001100110101, // lfsr position: 46431
+ 0b00100110100111000, // lfsr position: 12059
+ 0b00101010011000110, // lfsr position: 20605
+ 0b00101100111010101, // lfsr position: 108252
+ 0b00110011101111011, // lfsr position: 27502
+ 0b00110110001111110, // lfsr position: 101441
+ 0b00111010110111000, // lfsr position: 42977
+ 0b00111101111010000, // lfsr position: 58435
+ 0b01000001111000101, // lfsr position: 103160
+ 0b01000101111110110, // lfsr position: 97965
+ 0b01001011101101111, // lfsr position: 51532
+ 0b01001100000011111, // lfsr position: 84214
+ 0b01010001010110001, // lfsr position: 1706
+ 0b01010100101100001, // lfsr position: 17191
+ 0b01011011011110000, // lfsr position: 65316
+ 0b01011110011100100, // lfsr position: 48147
+ 0b01100001000100000, // lfsr position: 55025
+ 0b01100110100001010, // lfsr position: 99706
+ 0b01101001110110011, // lfsr position: 32649
+ 0b01101100010010110, // lfsr position: 36113
+ 0b01110011111010001, // lfsr position: 77352
+ 0b01110100101010011, // lfsr position: 6876
+ 0b01111010100111110, // lfsr position: 73938
+ 0b01111101111101111, // lfsr position: 72191
+ 0b10000001100100111, // lfsr position: 3426
+ 0b10000111110110011, // lfsr position: 10357
+ 0b10001001000110111, // lfsr position: 18907
+ 0b10001110111100010, // lfsr position: 63621
+ 0b10010001101100010, // lfsr position: 22329
+ 0b10010101100011100, // lfsr position: 92765
+ 0b10011011000111110, // lfsr position: 61853
+ 0b10011110011101000, // lfsr position: 96256
+ 0b10100001100101001, // lfsr position: 104872
+ 0b10100101100001110, // lfsr position: 44690
+ 0b10101000111100110, // lfsr position: 39548
+ 0b10101110010011111, // lfsr position: 82502
+ 0b10110000000100011, // lfsr position: 80810
+ 0b10110100000111110, // lfsr position: 5145
+ 0b10111010011100101, // lfsr position: 41256
+ 0b10111111100010000, // lfsr position: 24069
+ 0b11000010010111000, // lfsr position: 53283
+ 0b11000101111110011, // lfsr position: 89377
+ 0b11001010111111101, // lfsr position: 67067
+ 0b11001110100001110, // lfsr position: 85936
+ 0b11010010110111011, // lfsr position: 106578
+ 0b11010110110110100, // lfsr position: 15481
+ 0b11011010100111110, // lfsr position: 13796
+ 0b11011100111011010, // lfsr position: 87680
+ 0b11100011110101111, // lfsr position: 49842
+ 0b11100111100001010, // lfsr position: 91097
+ 0b11101010111101110, // lfsr position: 43
+ 0b11101101111011101, // lfsr position: 94527
+ 0b11110001111111101, // lfsr position: 34359
+ 0b11110101011100111, // lfsr position: 30922
+ 0b11111000000011101, // lfsr position: 75621
+ 0b11111101101000011, // lfsr position: 25781
+ },
+ {
+ // Polynomial: 11
+ 0b00000010000100011, // lfsr position: 34336
+ 0b00000110011001010, // lfsr position: 36090
+ 0b00001000000010000, // lfsr position: 67048
+ 0b00001110001111101, // lfsr position: 70460
+ 0b00010001010000100, // lfsr position: 27521
+ 0b00010100000011001, // lfsr position: 56713
+ 0b00011001010011101, // lfsr position: 79065
+ 0b00011101011110110, // lfsr position: 49833
+ 0b00100001110100110, // lfsr position: 65307
+ 0b00100111101100001, // lfsr position: 75629
+ 0b00101010110011110, // lfsr position: 29190
+ 0b00101110001111010, // lfsr position: 82496
+ 0b00110010101001000, // lfsr position: 39513
+ 0b00110110101011001, // lfsr position: 61880
+ 0b00111000101011101, // lfsr position: 17167
+ 0b00111101010001011, // lfsr position: 20650
+ 0b01000000101111100, // lfsr position: 22365
+ 0b01000111000110101, // lfsr position: 72226
+ 0b01001001010110110, // lfsr position: 60167
+ 0b01001110110111010, // lfsr position: 99693
+ 0b01010000010100100, // lfsr position: 103134
+ 0b01010110110100101, // lfsr position: 24022
+ 0b01011011001011100, // lfsr position: 37794
+ 0b01011101011010101, // lfsr position: 80793
+ 0b01100000010010001, // lfsr position: 51533
+ 0b01100101111100011, // lfsr position: 1746
+ 0b01101000001111000, // lfsr position: 30936
+ 0b01101111100001110, // lfsr position: 5158
+ 0b01110000111111011, // lfsr position: 91089
+ 0b01110101110010010, // lfsr position: 97954
+ 0b01111000101000101, // lfsr position: 96246
+ 0b01111101111011100, // lfsr position: 6918
+ 0b10000001000110100, // lfsr position: 3449
+ 0b10000111110010100, // lfsr position: 55019
+ 0b10001000101001100, // lfsr position: 12053
+ 0b10001101111010000, // lfsr position: 42977
+ 0b10010001010110101, // lfsr position: 8627
+ 0b10010100111111100, // lfsr position: 87678
+ 0b10011001001111100, // lfsr position: 106558
+ 0b10011111100001000, // lfsr position: 41268
+ 0b10100011001011111, // lfsr position: 101396
+ 0b10100110000000001, // lfsr position: 108310
+ 0b10101000101101100, // lfsr position: 104869
+ 0b10101101000001000, // lfsr position: 48127
+ 0b10110011111010111, // lfsr position: 18909
+ 0b10110101010000100, // lfsr position: 32631
+ 0b10111011111000010, // lfsr position: 92789
+ 0b10111101001011110, // lfsr position: 73939
+ 0b11000011010100111, // lfsr position: 16
+ 0b11000111100010111, // lfsr position: 44694
+ 0b11001010010000101, // lfsr position: 53263
+ 0b11001110110110010, // lfsr position: 10269
+ 0b11010000111101110, // lfsr position: 68772
+ 0b11010101000011111, // lfsr position: 89357
+ 0b11011000000100001, // lfsr position: 63603
+ 0b11011101011111101, // lfsr position: 94517
+ 0b11100010110001100, // lfsr position: 77341
+ 0b11100100110100010, // lfsr position: 13749
+ 0b11101010011010110, // lfsr position: 84194
+ 0b11101101010000101, // lfsr position: 46392
+ 0b11110000000000110, // lfsr position: 15471
+ 0b11110110010001101, // lfsr position: 25791
+ 0b11111000100010101, // lfsr position: 85917
+ 0b11111101111111001, // lfsr position: 58450
+ },
+ {
+ // Polynomial: 12
+ 0b00000011001100010, // lfsr position: 82516
+ 0b00000101001001111, // lfsr position: 10311
+ 0b00001010010001010, // lfsr position: 63550
+ 0b00001101001110011, // lfsr position: 91083
+ 0b00010001011000100, // lfsr position: 24061
+ 0b00010111001010110, // lfsr position: 68795
+ 0b00011011110111010, // lfsr position: 27502
+ 0b00011100101101011, // lfsr position: 30919
+ 0b00100010111100011, // lfsr position: 49838
+ 0b00100110100001100, // lfsr position: 75649
+ 0b00101010000011000, // lfsr position: 34391
+ 0b00101111001110001, // lfsr position: 65285
+ 0b00110010101010000, // lfsr position: 79050
+ 0b00110110101000100, // lfsr position: 85922
+ 0b00111011111001001, // lfsr position: 60152
+ 0b00111100101100011, // lfsr position: 104838
+ 0b01000000110011011, // lfsr position: 15493
+ 0b01000100101110111, // lfsr position: 6862
+ 0b01001010011000101, // lfsr position: 8584
+ 0b01001110010111001, // lfsr position: 44704
+ 0b01010001000010010, // lfsr position: 49
+ 0b01010100110000110, // lfsr position: 20626
+ 0b01011010101101100, // lfsr position: 97968
+ 0b01011100010000101, // lfsr position: 1735
+ 0b01100001111110000, // lfsr position: 80788
+ 0b01100100101101011, // lfsr position: 3405
+ 0b01101011111111001, // lfsr position: 46415
+ 0b01101100101011110, // lfsr position: 89363
+ 0b01110010101000111, // lfsr position: 58452
+ 0b01110100100110110, // lfsr position: 77339
+ 0b01111000111000011, // lfsr position: 87656
+ 0b01111111110111100, // lfsr position: 56707
+ 0b10000000000011010, // lfsr position: 70460
+ 0b10000110110110100, // lfsr position: 73902
+ 0b10001010111100110, // lfsr position: 36047
+ 0b10001110111110010, // lfsr position: 67078
+ 0b10010011100110111, // lfsr position: 18929
+ 0b10010100011000111, // lfsr position: 53277
+ 0b10011011010110100, // lfsr position: 108275
+ 0b10011100011100010, // lfsr position: 101383
+ 0b10100000111001010, // lfsr position: 61885
+ 0b10100100100011000, // lfsr position: 43008
+ 0b10101000000000100, // lfsr position: 32651
+ 0b10101101010100001, // lfsr position: 48135
+ 0b10110011001001011, // lfsr position: 37829
+ 0b10110111101000110, // lfsr position: 13764
+ 0b10111000111001110, // lfsr position: 54955
+ 0b10111110110110010, // lfsr position: 106562
+ 0b11000010011110110, // lfsr position: 94563
+ 0b11000100011101111, // lfsr position: 92804
+ 0b11001011101001011, // lfsr position: 103096
+ 0b11001111101101101, // lfsr position: 5171
+ 0b11010000000100110, // lfsr position: 22373
+ 0b11010101100110001, // lfsr position: 51587
+ 0b11011011100001001, // lfsr position: 12013
+ 0b11011110001100101, // lfsr position: 99663
+ 0b11100010001001100, // lfsr position: 17153
+ 0b11100110000000000, // lfsr position: 25747
+ 0b11101010111100111, // lfsr position: 84216
+ 0b11101110011110101, // lfsr position: 29223
+ 0b11110001110011100, // lfsr position: 41245
+ 0b11110110011100100, // lfsr position: 39502
+ 0b11111010101000000, // lfsr position: 96247
+ 0b11111101011000010, // lfsr position: 72149
+ },
+ {
+ // Polynomial: 13
+ 0b00000011001111100, // lfsr position: 92847
+ 0b00000111100101011, // lfsr position: 82504
+ 0b00001010100111001, // lfsr position: 101392
+ 0b00001110001100110, // lfsr position: 36111
+ 0b00010010101000100, // lfsr position: 84221
+ 0b00010110010110110, // lfsr position: 89331
+ 0b00011010111100010, // lfsr position: 61902
+ 0b00011101111001011, // lfsr position: 1674
+ 0b00100011001111010, // lfsr position: 12027
+ 0b00100100001000011, // lfsr position: 30921
+ 0b00101011101101010, // lfsr position: 17196
+ 0b00101110110101101, // lfsr position: 65277
+ 0b00110011111000111, // lfsr position: 51521
+ 0b00110100011110011, // lfsr position: 6861
+ 0b00111010110011000, // lfsr position: 106606
+ 0b00111100110110111, // lfsr position: 5113
+ 0b01000010100010101, // lfsr position: 44680
+ 0b01000111111111110, // lfsr position: 94487
+ 0b01001011110100000, // lfsr position: 75638
+ 0b01001111010001010, // lfsr position: 8616
+ 0b01010010011011001, // lfsr position: 32645
+ 0b01010100110011101, // lfsr position: 34372
+ 0b01011011110011010, // lfsr position: 25819
+ 0b01011100000111101, // lfsr position: 68746
+ 0b01100010101011011, // lfsr position: 67033
+ 0b01100110101101001, // lfsr position: 3425
+ 0b01101001110011111, // lfsr position: 29226
+ 0b01101100011011100, // lfsr position: 63604
+ 0b01110011111110001, // lfsr position: 58419
+ 0b01110110111000101, // lfsr position: 39527
+ 0b01111010011011100, // lfsr position: 104838
+ 0b01111100100011000, // lfsr position: 103161
+ 0b10000010100111010, // lfsr position: 87692
+ 0b10000100110011110, // lfsr position: 56727
+ 0b10001011000011100, // lfsr position: 96246
+ 0b10001101000000100, // lfsr position: 97964
+ 0b10010000111010001, // lfsr position: 54982
+ 0b10010110110000010, // lfsr position: 24038
+ 0b10011001000111001, // lfsr position: 80780
+ 0b10011100111111111, // lfsr position: 13796
+ 0b10100010001000110, // lfsr position: 72203
+ 0b10100100011001110, // lfsr position: 77364
+ 0b10101010100100010, // lfsr position: 41275
+ 0b10101110110011110, // lfsr position: 73938
+ 0b10110001101001111, // lfsr position: 91062
+ 0b10110100011110100, // lfsr position: 99671
+ 0b10111011111000111, // lfsr position: 48116
+ 0b10111110110011100, // lfsr position: 79086
+ 0b11000000001100110, // lfsr position: 37788
+ 0b11000110000111010, // lfsr position: 42961
+ 0b11001010001001001, // lfsr position: 22347
+ 0b11001111010111011, // lfsr position: 60117
+ 0b11010010110101110, // lfsr position: 108291
+ 0b11010110010011010, // lfsr position: 18879
+ 0b11011011001110100, // lfsr position: 70474
+ 0b11011100100110000, // lfsr position: 27506
+ 0b11100011100110011, // lfsr position: 85945
+ 0b11100111101111011, // lfsr position: 24
+ 0b11101001001101111, // lfsr position: 10281
+ 0b11101111001110111, // lfsr position: 20628
+ 0b11110011101010000, // lfsr position: 46430
+ 0b11110101001111000, // lfsr position: 49833
+ 0b11111001010010000, // lfsr position: 15490
+ 0b11111101110001101, // lfsr position: 53272
+ },
+ {
+ // Polynomial: 14
+ 0b00000000101001111, // lfsr position: 80781
+ 0b00000100101011010, // lfsr position: 1744
+ 0b00001000000101101, // lfsr position: 106572
+ 0b00001101001001001, // lfsr position: 87684
+ 0b00010001111011110, // lfsr position: 91109
+ 0b00010101000100110, // lfsr position: 108243
+ 0b00011010011100100, // lfsr position: 3422
+ 0b00011100101000001, // lfsr position: 104857
+ 0b00100001101010011, // lfsr position: 32652
+ 0b00100111001010000, // lfsr position: 46398
+ 0b00101001110100011, // lfsr position: 96244
+ 0b00101110001000110, // lfsr position: 82544
+ 0b00110000100111101, // lfsr position: 53298
+ 0b00110101100100001, // lfsr position: 15515
+ 0b00111010010000000, // lfsr position: 6832
+ 0b00111101111001100, // lfsr position: 30911
+ 0b01000010101001010, // lfsr position: 41257
+ 0b01000110110000011, // lfsr position: 8588
+ 0b01001010101001110, // lfsr position: 42925
+ 0b01001111111111011, // lfsr position: 79066
+ 0b01010001000011101, // lfsr position: 84215
+ 0b01010101110011110, // lfsr position: 97970
+ 0b01011000001001111, // lfsr position: 73920
+ 0b01011101010100111, // lfsr position: 27479
+ 0b01100001011001101, // lfsr position: 49818
+ 0b01100111101100000, // lfsr position: 48113
+ 0b01101011001101100, // lfsr position: 29198
+ 0b01101100111011001, // lfsr position: 72159
+ 0b01110010110001111, // lfsr position: 75637
+ 0b01110100110011110, // lfsr position: 20612
+ 0b01111000111110000, // lfsr position: 103132
+ 0b01111101100000011, // lfsr position: 5118
+ 0b10000010111000011, // lfsr position: 10306
+ 0b10000100111000011, // lfsr position: 60167
+ 0b10001000101111011, // lfsr position: 89411
+ 0b10001111000001100, // lfsr position: 18882
+ 0b10010001010101110, // lfsr position: 36080
+ 0b10010100111101000, // lfsr position: 77342
+ 0b10011001000111100, // lfsr position: 55030
+ 0b10011111011001001, // lfsr position: 68741
+ 0b10100011001100100, // lfsr position: 34409
+ 0b10100100100000000, // lfsr position: 25828
+ 0b10101001110010000, // lfsr position: 65275
+ 0b10101111011001001, // lfsr position: 44701
+ 0b10110000100010010, // lfsr position: 101403
+ 0b10110110000100110, // lfsr position: 24061
+ 0b10111010110101101, // lfsr position: 58389
+ 0b10111111110010110, // lfsr position: 92832
+ 0b11000001001001111, // lfsr position: 85889
+ 0b11000111000000011, // lfsr position: 13735
+ 0b11001000110000000, // lfsr position: 23
+ 0b11001111011001101, // lfsr position: 17195
+ 0b11010000010010000, // lfsr position: 37824
+ 0b11010111110010011, // lfsr position: 12034
+ 0b11011000111101110, // lfsr position: 70490
+ 0b11011111010110001, // lfsr position: 66983
+ 0b11100010101000110, // lfsr position: 51564
+ 0b11100100110010011, // lfsr position: 63620
+ 0b11101001011110000, // lfsr position: 56727
+ 0b11101111011111010, // lfsr position: 94566
+ 0b11110000010100110, // lfsr position: 61870
+ 0b11110110001110110, // lfsr position: 99646
+ 0b11111000110001110, // lfsr position: 22316
+ 0b11111111110101001, // lfsr position: 39544
+ },
+ {
+ // Polynomial: 15
+ 0b00000011000110001, // lfsr position: 101404
+ 0b00000100001011010, // lfsr position: 12041
+ 0b00001010010110011, // lfsr position: 15452
+ 0b00001101110111111, // lfsr position: 103132
+ 0b00010000101111100, // lfsr position: 106583
+ 0b00010100111010000, // lfsr position: 92764
+ 0b00011010110111010, // lfsr position: 29212
+ 0b00011100100000101, // lfsr position: 18933
+ 0b00100010011111111, // lfsr position: 79082
+ 0b00100111100011010, // lfsr position: 104834
+ 0b00101011101101110, // lfsr position: 80792
+ 0b00101111000110010, // lfsr position: 84232
+ 0b00110001110001010, // lfsr position: 27537
+ 0b00110111111100110, // lfsr position: 63641
+ 0b00111011001100100, // lfsr position: 8580
+ 0b00111101110101110, // lfsr position: 72180
+ 0b01000000100101011, // lfsr position: 22340
+ 0b01000100101001001, // lfsr position: 99695
+ 0b01001000101100101, // lfsr position: 46419
+ 0b01001110010100100, // lfsr position: 56705
+ 0b01010010111100010, // lfsr position: 13721
+ 0b01010111101001111, // lfsr position: 89364
+ 0b01011010000011100, // lfsr position: 44694
+ 0b01011110101111011, // lfsr position: 65333
+ 0b01100000110110010, // lfsr position: 61858
+ 0b01100111010101010, // lfsr position: 98011
+ 0b01101010111001001, // lfsr position: 58418
+ 0b01101110111001111, // lfsr position: 34381
+ 0b01110011101001011, // lfsr position: 68708
+ 0b01110110001110010, // lfsr position: 87629
+ 0b01111001101111010, // lfsr position: 94527
+ 0b01111110000111011, // lfsr position: 77351
+ 0b10000001110111111, // lfsr position: 51571
+ 0b10000111000010110, // lfsr position: 48131
+ 0b10001010000011000, // lfsr position: 6850
+ 0b10001101010011011, // lfsr position: 41262
+ 0b10010000110001000, // lfsr position: 66994
+ 0b10010111000000100, // lfsr position: 17171
+ 0b10011010010111110, // lfsr position: 39522
+ 0b10011101000001000, // lfsr position: 55004
+ 0b10100011101011110, // lfsr position: 25752
+ 0b10100110100010110, // lfsr position: 30933
+ 0b10101011010001101, // lfsr position: 60157
+ 0b10101101101000010, // lfsr position: 85910
+ 0b10110000101111100, // lfsr position: 24051
+ 0b10110100100010110, // lfsr position: 1736
+ 0b10111011100101011, // lfsr position: 42984
+ 0b10111110000010000, // lfsr position: 108283
+ 0b11000011101011110, // lfsr position: 75631
+ 0b11000101101001001, // lfsr position: 73938
+ 0b11001010101110100, // lfsr position: 36045
+ 0b11001100001000111, // lfsr position: 3454
+ 0b11010000100100100, // lfsr position: 32630
+ 0b11010111110111100, // lfsr position: 49831
+ 0b11011010001000010, // lfsr position: 10328
+ 0b11011111001101001, // lfsr position: 17
+ 0b11100011101000000, // lfsr position: 5142
+ 0b11100100011101111, // lfsr position: 53319
+ 0b11101011101101110, // lfsr position: 96265
+ 0b11101110100111010, // lfsr position: 91089
+ 0b11110010001110100, // lfsr position: 20644
+ 0b11110101101111010, // lfsr position: 70510
+ 0b11111000110000010, // lfsr position: 37821
+ 0b11111110110001110, // lfsr position: 82534
+ },
+ {
+ // Polynomial: 16
+ 0b00000011100101100, // lfsr position: 82518
+ 0b00000110101000011, // lfsr position: 72225
+ 0b00001011100000110, // lfsr position: 56727
+ 0b00001110111110011, // lfsr position: 85951
+ 0b00010001110001101, // lfsr position: 27520
+ 0b00010110010111110, // lfsr position: 51593
+ 0b00011000111000110, // lfsr position: 34380
+ 0b00011111011100111, // lfsr position: 15500
+ 0b00100010000001010, // lfsr position: 48143
+ 0b00100100000001100, // lfsr position: 73898
+ 0b00101010010101011, // lfsr position: 22355
+ 0b00101111010010101, // lfsr position: 94512
+ 0b00110010011111111, // lfsr position: 101408
+ 0b00110110001000011, // lfsr position: 36062
+ 0b00111001010100100, // lfsr position: 8579
+ 0b00111111011111111, // lfsr position: 3483
+ 0b01000001011001001, // lfsr position: 53308
+ 0b01000110100001001, // lfsr position: 17170
+ 0b01001011100001000, // lfsr position: 35
+ 0b01001101010010111, // lfsr position: 39535
+ 0b01010010011100010, // lfsr position: 29193
+ 0b01010110100000010, // lfsr position: 91056
+ 0b01011001001100000, // lfsr position: 24089
+ 0b01011101100000001, // lfsr position: 32671
+ 0b01100010110000001, // lfsr position: 43005
+ 0b01100111111001100, // lfsr position: 6896
+ 0b01101001010111111, // lfsr position: 96258
+ 0b01101110100110010, // lfsr position: 104846
+ 0b01110011010011001, // lfsr position: 44665
+ 0b01110101001111111, // lfsr position: 58406
+ 0b01111000011100110, // lfsr position: 108263
+ 0b01111111000011101, // lfsr position: 10344
+ 0b10000011000111111, // lfsr position: 92790
+ 0b10000100111111011, // lfsr position: 20666
+ 0b10001001010100111, // lfsr position: 89394
+ 0b10001110010010111, // lfsr position: 66985
+ 0b10010011001011011, // lfsr position: 54981
+ 0b10010101100101101, // lfsr position: 5187
+ 0b10011000111111110, // lfsr position: 75606
+ 0b10011110001010100, // lfsr position: 46395
+ 0b10100000000111111, // lfsr position: 60184
+ 0b10100100001001101, // lfsr position: 12002
+ 0b10101000100001111, // lfsr position: 103084
+ 0b10101111111111001, // lfsr position: 25775
+ 0b10110011100101111, // lfsr position: 1691
+ 0b10110110110111010, // lfsr position: 68756
+ 0b10111010000011110, // lfsr position: 49869
+ 0b10111100100011011, // lfsr position: 13755
+ 0b11000001001110100, // lfsr position: 37809
+ 0b11000111010101000, // lfsr position: 77384
+ 0b11001010110100001, // lfsr position: 99660
+ 0b11001101011100000, // lfsr position: 30914
+ 0b11010010010010000, // lfsr position: 63619
+ 0b11010101011000000, // lfsr position: 65305
+ 0b11011011110000110, // lfsr position: 41286
+ 0b11011110100101101, // lfsr position: 106545
+ 0b11100000110000010, // lfsr position: 79052
+ 0b11100110100010000, // lfsr position: 70499
+ 0b11101010110111000, // lfsr position: 87653
+ 0b11101110010101011, // lfsr position: 97952
+ 0b11110010011001100, // lfsr position: 61896
+ 0b11110101000111010, // lfsr position: 84194
+ 0b11111011110010000, // lfsr position: 80742
+ 0b11111101110101000, // lfsr position: 18909
+ },
+ {
+ // Polynomial: 17
+ 0b00000000111110001, // lfsr position: 51596
+ 0b00000100011101100, // lfsr position: 3447
+ 0b00001010000100101, // lfsr position: 25814
+ 0b00001100110100011, // lfsr position: 6879
+ 0b00010010000000111, // lfsr position: 36102
+ 0b00010100111100100, // lfsr position: 61878
+ 0b00011001000011000, // lfsr position: 18938
+ 0b00011111011111010, // lfsr position: 91056
+ 0b00100010010111111, // lfsr position: 20622
+ 0b00100110001010101, // lfsr position: 96238
+ 0b00101011010010001, // lfsr position: 73878
+ 0b00101100000111111, // lfsr position: 44690
+ 0b00110010101000001, // lfsr position: 99658
+ 0b00110111101100111, // lfsr position: 77350
+ 0b00111000100101100, // lfsr position: 89366
+ 0b00111110001100101, // lfsr position: 5128
+ 0b01000001110010011, // lfsr position: 24064
+ 0b01000100000000000, // lfsr position: 85902
+ 0b01001000001101011, // lfsr position: 37841
+ 0b01001100111001100, // lfsr position: 54984
+ 0b01010010100101011, // lfsr position: 80828
+ 0b01010111001110111, // lfsr position: 63589
+ 0b01011001001101000, // lfsr position: 41257
+ 0b01011111101001001, // lfsr position: 104851
+ 0b01100011111110100, // lfsr position: 87688
+ 0b01100111000001000, // lfsr position: 8584
+ 0b01101011011001110, // lfsr position: 53293
+ 0b01101101000101000, // lfsr position: 22332
+ 0b01110011010011100, // lfsr position: 56723
+ 0b01110110010001011, // lfsr position: 1759
+ 0b01111011101010111, // lfsr position: 32628
+ 0b01111101101011101, // lfsr position: 92828
+ 0b10000010111100010, // lfsr position: 65315
+ 0b10000110101001001, // lfsr position: 39524
+ 0b10001011100111100, // lfsr position: 10321
+ 0b10001100011000100, // lfsr position: 17200
+ 0b10010001101101110, // lfsr position: 60172
+ 0b10010111001000101, // lfsr position: 23
+ 0b10011010111101000, // lfsr position: 29246
+ 0b10011111101101000, // lfsr position: 34386
+ 0b10100000000011100, // lfsr position: 97946
+ 0b10100111000010111, // lfsr position: 48124
+ 0b10101001011010111, // lfsr position: 11988
+ 0b10101110000000101, // lfsr position: 42948
+ 0b10110010101001001, // lfsr position: 79104
+ 0b10110110000010101, // lfsr position: 94511
+ 0b10111000010110101, // lfsr position: 13793
+ 0b10111101010001111, // lfsr position: 68795
+ 0b11000001111000101, // lfsr position: 27503
+ 0b11000101000101100, // lfsr position: 15480
+ 0b11001000011010110, // lfsr position: 70451
+ 0b11001101001110011, // lfsr position: 49870
+ 0b11010011110110010, // lfsr position: 46416
+ 0b11010111100010011, // lfsr position: 67043
+ 0b11011010111000111, // lfsr position: 75631
+ 0b11011100101110100, // lfsr position: 108285
+ 0b11100010001100110, // lfsr position: 72224
+ 0b11100110000001011, // lfsr position: 106577
+ 0b11101000010101001, // lfsr position: 84205
+ 0b11101111111110000, // lfsr position: 103110
+ 0b11110001010100001, // lfsr position: 101386
+ 0b11110110010001011, // lfsr position: 58467
+ 0b11111000011000101, // lfsr position: 30956
+ 0b11111101110100001, // lfsr position: 82468
+ },
+ {
+ // Polynomial: 18
+ 0b00000001100000101, // lfsr position: 79075
+ 0b00000111011100100, // lfsr position: 42928
+ 0b00001010111011101, // lfsr position: 39485
+ 0b00001101110011011, // lfsr position: 36107
+ 0b00010010000101100, // lfsr position: 60146
+ 0b00010111111000011, // lfsr position: 68788
+ 0b00011010011001110, // lfsr position: 87661
+ 0b00011100111011110, // lfsr position: 13790
+ 0b00100010000111011, // lfsr position: 56720
+ 0b00100111100010111, // lfsr position: 106514
+ 0b00101000111011100, // lfsr position: 58472
+ 0b00101110001011001, // lfsr position: 30943
+ 0b00110011011011011, // lfsr position: 51565
+ 0b00110101000101011, // lfsr position: 108281
+ 0b00111011101011100, // lfsr position: 96243
+ 0b00111111010101111, // lfsr position: 6886
+ 0b01000001101001010, // lfsr position: 43
+ 0b01000110001101010, // lfsr position: 3483
+ 0b01001010111001100, // lfsr position: 15439
+ 0b01001111010111001, // lfsr position: 63573
+ 0b01010001000100011, // lfsr position: 91124
+ 0b01010101011000000, // lfsr position: 65314
+ 0b01011010000000001, // lfsr position: 99695
+ 0b01011110000011111, // lfsr position: 104874
+ 0b01100011110101000, // lfsr position: 97948
+ 0b01100101101011000, // lfsr position: 37847
+ 0b01101011100001010, // lfsr position: 89345
+ 0b01101100100001101, // lfsr position: 17182
+ 0b01110000001110111, // lfsr position: 1744
+ 0b01110101101001111, // lfsr position: 27469
+ 0b01111010011011011, // lfsr position: 41236
+ 0b01111110101000110, // lfsr position: 61857
+ 0b10000001111110011, // lfsr position: 92795
+ 0b10000100010111010, // lfsr position: 34378
+ 0b10001001100001011, // lfsr position: 46424
+ 0b10001110101000101, // lfsr position: 18938
+ 0b10010001011110101, // lfsr position: 101397
+ 0b10010110000111100, // lfsr position: 94549
+ 0b10011010001011001, // lfsr position: 67036
+ 0b10011100010000011, // lfsr position: 82514
+ 0b10100000001001001, // lfsr position: 32635
+ 0b10100110011111100, // lfsr position: 22309
+ 0b10101001001011010, // lfsr position: 12054
+ 0b10101100011000101, // lfsr position: 103115
+ 0b10110000100110011, // lfsr position: 72142
+ 0b10110110011010101, // lfsr position: 49837
+ 0b10111001101000001, // lfsr position: 48147
+ 0b10111101100100000, // lfsr position: 10321
+ 0b11000010100100010, // lfsr position: 84192
+ 0b11000110000011111, // lfsr position: 44691
+ 0b11001010101110110, // lfsr position: 73908
+ 0b11001101101111010, // lfsr position: 8555
+ 0b11010000110100010, // lfsr position: 20626
+ 0b11010110010000100, // lfsr position: 85987
+ 0b11011000010100101, // lfsr position: 75631
+ 0b11011110000100101, // lfsr position: 5149
+ 0b11100010111000110, // lfsr position: 77358
+ 0b11100101001101000, // lfsr position: 80768
+ 0b11101000110100001, // lfsr position: 55004
+ 0b11101111011001101, // lfsr position: 25791
+ 0b11110010011101011, // lfsr position: 53244
+ 0b11110101001001111, // lfsr position: 70440
+ 0b11111000101101100, // lfsr position: 29180
+ 0b11111101001101101, // lfsr position: 24021
+ },
+ {
+ // Polynomial: 19
+ 0b00000010111111011, // lfsr position: 46364
+ 0b00000110111111010, // lfsr position: 8586
+ 0b00001011110101101, // lfsr position: 55013
+ 0b00001111111010011, // lfsr position: 12
+ 0b00010001111101010, // lfsr position: 53239
+ 0b00010110101111001, // lfsr position: 37816
+ 0b00011010100101110, // lfsr position: 44654
+ 0b00011100011010011, // lfsr position: 3468
+ 0b00100001011010001, // lfsr position: 70458
+ 0b00100101110111101, // lfsr position: 89360
+ 0b00101011001101000, // lfsr position: 92851
+ 0b00101101101001110, // lfsr position: 36063
+ 0b00110011110100111, // lfsr position: 22353
+ 0b00110101110100010, // lfsr position: 30922
+ 0b00111001000010001, // lfsr position: 80741
+ 0b00111110000000010, // lfsr position: 91096
+ 0b01000010010011110, // lfsr position: 103112
+ 0b01000100111001101, // lfsr position: 67001
+ 0b01001010111111110, // lfsr position: 1686
+ 0b01001101011101010, // lfsr position: 34337
+ 0b01010010110110011, // lfsr position: 32672
+ 0b01010101111000100, // lfsr position: 48144
+ 0b01011010101000111, // lfsr position: 27478
+ 0b01011111010001101, // lfsr position: 68743
+ 0b01100010101110011, // lfsr position: 73866
+ 0b01100101101011101, // lfsr position: 84182
+ 0b01101000000111101, // lfsr position: 42959
+ 0b01101111001111100, // lfsr position: 41287
+ 0b01110011101101111, // lfsr position: 97942
+ 0b01110110111011011, // lfsr position: 24073
+ 0b01111011101000010, // lfsr position: 101435
+ 0b01111100100101010, // lfsr position: 96244
+ 0b10000011110001111, // lfsr position: 12025
+ 0b10000101011001101, // lfsr position: 65325
+ 0b10001000010110100, // lfsr position: 18916
+ 0b10001111011001010, // lfsr position: 60178
+ 0b10010001100010011, // lfsr position: 51583
+ 0b10010100101001101, // lfsr position: 39533
+ 0b10011001100100011, // lfsr position: 61896
+ 0b10011101011110111, // lfsr position: 99682
+ 0b10100000011001110, // lfsr position: 5144
+ 0b10100111010011101, // lfsr position: 58441
+ 0b10101011100001000, // lfsr position: 106596
+ 0b10101100001111000, // lfsr position: 72188
+ 0b10110000111010101, // lfsr position: 20635
+ 0b10110110010001101, // lfsr position: 82509
+ 0b10111010111010011, // lfsr position: 87663
+ 0b10111101001100001, // lfsr position: 63605
+ 0b11000001101110011, // lfsr position: 17219
+ 0b11000110110101001, // lfsr position: 29185
+ 0b11001000110001100, // lfsr position: 49818
+ 0b11001101000110000, // lfsr position: 25779
+ 0b11010001100110010, // lfsr position: 15463
+ 0b11010101001111101, // lfsr position: 13728
+ 0b11011000110111101, // lfsr position: 10324
+ 0b11011101010100010, // lfsr position: 108305
+ 0b11100001000100110, // lfsr position: 75616
+ 0b11100110011110001, // lfsr position: 104877
+ 0b11101011011011100, // lfsr position: 85903
+ 0b11101100011000010, // lfsr position: 6883
+ 0b11110011010100010, // lfsr position: 79059
+ 0b11110101011010101, // lfsr position: 56706
+ 0b11111001001010111, // lfsr position: 94499
+ 0b11111101000011000, // lfsr position: 77371
+ },
+ {
+ // Polynomial: 20
+ 0b00000010110111001, // lfsr position: 25804
+ 0b00000110011011000, // lfsr position: 101376
+ 0b00001001100011100, // lfsr position: 84232
+ 0b00001111000011110, // lfsr position: 39547
+ 0b00010000101111001, // lfsr position: 46418
+ 0b00010110011001100, // lfsr position: 5130
+ 0b00011011011101010, // lfsr position: 6895
+ 0b00011111101011010, // lfsr position: 32666
+ 0b00100001101101000, // lfsr position: 79073
+ 0b00100110001011000, // lfsr position: 1735
+ 0b00101000110100100, // lfsr position: 67017
+ 0b00101110100011001, // lfsr position: 80768
+ 0b00110000001111111, // lfsr position: 97980
+ 0b00110100101100100, // lfsr position: 12004
+ 0b00111000000101101, // lfsr position: 3447
+ 0b00111111011100100, // lfsr position: 77298
+ 0b01000001000110101, // lfsr position: 91096
+ 0b01000100001001011, // lfsr position: 56703
+ 0b01001001110111100, // lfsr position: 96223
+ 0b01001100000101101, // lfsr position: 61843
+ 0b01010000001110111, // lfsr position: 36112
+ 0b01010110000100111, // lfsr position: 41225
+ 0b01011011011111100, // lfsr position: 73862
+ 0b01011110011001111, // lfsr position: 37809
+ 0b01100011001010011, // lfsr position: 48125
+ 0b01100100010001111, // lfsr position: 36
+ 0b01101000011000010, // lfsr position: 87675
+ 0b01101110011101000, // lfsr position: 103123
+ 0b01110001101010100, // lfsr position: 60191
+ 0b01110111001000000, // lfsr position: 49825
+ 0b01111000110100111, // lfsr position: 104850
+ 0b01111110011100100, // lfsr position: 18926
+ 0b10000010011100110, // lfsr position: 58417
+ 0b10000101111100000, // lfsr position: 22325
+ 0b10001010101011101, // lfsr position: 53277
+ 0b10001111001110110, // lfsr position: 44674
+ 0b10010000100110001, // lfsr position: 29217
+ 0b10010111011110101, // lfsr position: 85965
+ 0b10011001000101010, // lfsr position: 27515
+ 0b10011101100001101, // lfsr position: 68719
+ 0b10100011000110010, // lfsr position: 63562
+ 0b10100101001011111, // lfsr position: 108325
+ 0b10101000101110111, // lfsr position: 70459
+ 0b10101111000000111, // lfsr position: 42923
+ 0b10110010011010011, // lfsr position: 92816
+ 0b10110111000000111, // lfsr position: 8585
+ 0b10111001100011000, // lfsr position: 13752
+ 0b10111111111000100, // lfsr position: 82524
+ 0b11000000101011001, // lfsr position: 89402
+ 0b11000111011111001, // lfsr position: 24096
+ 0b11001011100000001, // lfsr position: 99699
+ 0b11001111011110010, // lfsr position: 30934
+ 0b11010001011100011, // lfsr position: 65324
+ 0b11010101000111110, // lfsr position: 17193
+ 0b11011001010001111, // lfsr position: 72181
+ 0b11011101101010000, // lfsr position: 75598
+ 0b11100011101101101, // lfsr position: 51551
+ 0b11100100011010001, // lfsr position: 20614
+ 0b11101011111001101, // lfsr position: 94501
+ 0b11101110000101000, // lfsr position: 10309
+ 0b11110010010111110, // lfsr position: 15446
+ 0b11110111000001000, // lfsr position: 106541
+ 0b11111011110111011, // lfsr position: 34391
+ 0b11111100100110110, // lfsr position: 55000
+ },
+ {
+ // Polynomial: 21
+ 0b00000011110100001, // lfsr position: 10341
+ 0b00000110010100101, // lfsr position: 87613
+ 0b00001000011011100, // lfsr position: 97984
+ 0b00001110011110101, // lfsr position: 39534
+ 0b00010000101100111, // lfsr position: 92810
+ 0b00010100111101011, // lfsr position: 13732
+ 0b00011010001000111, // lfsr position: 37776
+ 0b00011111101111010, // lfsr position: 46370
+ 0b00100001110101110, // lfsr position: 25777
+ 0b00100100110101010, // lfsr position: 103139
+ 0b00101001100110111, // lfsr position: 18897
+ 0b00101110100000000, // lfsr position: 60170
+ 0b00110011101010001, // lfsr position: 72171
+ 0b00110111000010001, // lfsr position: 75660
+ 0b00111010000010101, // lfsr position: 12051
+ 0b00111101101001010, // lfsr position: 84246
+ 0b01000011110011101, // lfsr position: 49843
+ 0b01000111111000101, // lfsr position: 65326
+ 0b01001011110111011, // lfsr position: 27500
+ 0b01001111100111010, // lfsr position: 58424
+ 0b01010000101011111, // lfsr position: 44666
+ 0b01010111000101110, // lfsr position: 101423
+ 0b01011010100010011, // lfsr position: 67016
+ 0b01011100101110011, // lfsr position: 85943
+ 0b01100000100101000, // lfsr position: 8571
+ 0b01100101001011001, // lfsr position: 96249
+ 0b01101001001011101, // lfsr position: 3408
+ 0b01101110001101000, // lfsr position: 30956
+ 0b01110000101010010, // lfsr position: 20613
+ 0b01110110110100000, // lfsr position: 51568
+ 0b01111011101100000, // lfsr position: 6875
+ 0b01111111000010100, // lfsr position: 41266
+ 0b10000010111110000, // lfsr position: 17209
+ 0b10000111110000100, // lfsr position: 104874
+ 0b10001011111110000, // lfsr position: 77353
+ 0b10001111010110110, // lfsr position: 79039
+ 0b10010001010100000, // lfsr position: 70429
+ 0b10010100110111110, // lfsr position: 22358
+ 0b10011001110100100, // lfsr position: 108264
+ 0b10011101111110111, // lfsr position: 82522
+ 0b10100011001111101, // lfsr position: 63582
+ 0b10100110110110111, // lfsr position: 36100
+ 0b10101000011110110, // lfsr position: 29188
+ 0b10101111100110010, // lfsr position: 73931
+ 0b10110000101001000, // lfsr position: 34367
+ 0b10110100110100101, // lfsr position: 1717
+ 0b10111000110111010, // lfsr position: 56754
+ 0b10111111011010100, // lfsr position: 15466
+ 0b11000011011111000, // lfsr position: 42990
+ 0b11000110010101010, // lfsr position: 32636
+ 0b11001001101110000, // lfsr position: 91062
+ 0b11001100100010110, // lfsr position: 94525
+ 0b11010001111101001, // lfsr position: 19
+ 0b11010100100011111, // lfsr position: 48132
+ 0b11011011010010011, // lfsr position: 5207
+ 0b11011100000110010, // lfsr position: 89351
+ 0b11100000101001101, // lfsr position: 106550
+ 0b11100101010100011, // lfsr position: 24053
+ 0b11101001001011100, // lfsr position: 80788
+ 0b11101100101101011, // lfsr position: 54980
+ 0b11110011110111100, // lfsr position: 68768
+ 0b11110100110011100, // lfsr position: 53320
+ 0b11111010111100010, // lfsr position: 61925
+ 0b11111110011100100, // lfsr position: 99688
+ },
+ {
+ // Polynomial: 22
+ 0b00000001110101011, // lfsr position: 82509
+ 0b00000100100100100, // lfsr position: 15477
+ 0b00001000100010111, // lfsr position: 103090
+ 0b00001110011011000, // lfsr position: 92774
+ 0b00010010101000101, // lfsr position: 61849
+ 0b00010111111101110, // lfsr position: 6907
+ 0b00011010011100010, // lfsr position: 29225
+ 0b00011111001110110, // lfsr position: 8573
+ 0b00100011101010000, // lfsr position: 79096
+ 0b00100100010111010, // lfsr position: 14
+ 0b00101010100001011, // lfsr position: 97948
+ 0b00101110000010000, // lfsr position: 94517
+ 0b00110000111110111, // lfsr position: 56681
+ 0b00110101010001010, // lfsr position: 67049
+ 0b00111010001111110, // lfsr position: 80774
+ 0b00111101011010110, // lfsr position: 85979
+ 0b01000011111101001, // lfsr position: 12036
+ 0b01000111001100100, // lfsr position: 77318
+ 0b01001000000110110, // lfsr position: 58436
+ 0b01001100011110001, // lfsr position: 75624
+ 0b01010001010000010, // lfsr position: 68772
+ 0b01010100001111101, // lfsr position: 63608
+ 0b01011001000001000, // lfsr position: 36087
+ 0b01011110110010100, // lfsr position: 72207
+ 0b01100001000010100, // lfsr position: 91083
+ 0b01100100001011001, // lfsr position: 17230
+ 0b01101010110011011, // lfsr position: 27492
+ 0b01101111011101101, // lfsr position: 99688
+ 0b01110001011110001, // lfsr position: 34361
+ 0b01110111100011100, // lfsr position: 5186
+ 0b01111011001010101, // lfsr position: 32696
+ 0b01111110011110101, // lfsr position: 70444
+ 0b10000000110100010, // lfsr position: 44690
+ 0b10000110000011111, // lfsr position: 20622
+ 0b10001001101011100, // lfsr position: 49852
+ 0b10001101001000010, // lfsr position: 106515
+ 0b10010011001111011, // lfsr position: 18944
+ 0b10010101111010101, // lfsr position: 46427
+ 0b10011011010110111, // lfsr position: 1696
+ 0b10011111010111010, // lfsr position: 39567
+ 0b10100011100111101, // lfsr position: 51534
+ 0b10100111111011001, // lfsr position: 22301
+ 0b10101001000001111, // lfsr position: 10307
+ 0b10101110000001000, // lfsr position: 65326
+ 0b10110010110110100, // lfsr position: 60108
+ 0b10110101000111010, // lfsr position: 30938
+ 0b10111001000010001, // lfsr position: 53267
+ 0b10111100001011010, // lfsr position: 89334
+ 0b11000001011111011, // lfsr position: 25783
+ 0b11000100011000010, // lfsr position: 24058
+ 0b11001001101110001, // lfsr position: 48136
+ 0b11001101011011100, // lfsr position: 3414
+ 0b11010011001101001, // lfsr position: 73909
+ 0b11010101011001010, // lfsr position: 87639
+ 0b11011010010001101, // lfsr position: 43008
+ 0b11011110011100010, // lfsr position: 84233
+ 0b11100000110000001, // lfsr position: 108258
+ 0b11100111100000011, // lfsr position: 41275
+ 0b11101000111110000, // lfsr position: 96227
+ 0b11101111101111000, // lfsr position: 54999
+ 0b11110010100101100, // lfsr position: 101417
+ 0b11110101101100110, // lfsr position: 13766
+ 0b11111010010010000, // lfsr position: 104835
+ 0b11111100101010000, // lfsr position: 37799
+ },
+ {
+ // Polynomial: 23
+ 0b00000011011111100, // lfsr position: 58414
+ 0b00000101011111100, // lfsr position: 70453
+ 0b00001010011001000, // lfsr position: 108296
+ 0b00001110001100111, // lfsr position: 24048
+ 0b00010000100100001, // lfsr position: 49876
+ 0b00010101101101110, // lfsr position: 85902
+ 0b00011000111111001, // lfsr position: 32633
+ 0b00011110101001000, // lfsr position: 39519
+ 0b00100000101111000, // lfsr position: 41208
+ 0b00100110100000001, // lfsr position: 77326
+ 0b00101010110111100, // lfsr position: 92795
+ 0b00101100001000110, // lfsr position: 18926
+ 0b00110001111000001, // lfsr position: 22354
+ 0b00110100010100010, // lfsr position: 89368
+ 0b00111001011010101, // lfsr position: 94522
+ 0b00111111001110011, // lfsr position: 1729
+ 0b01000010100110011, // lfsr position: 96250
+ 0b01000110000010001, // lfsr position: 63606
+ 0b01001011111010001, // lfsr position: 61899
+ 0b01001100110111010, // lfsr position: 54975
+ 0b01010001111110010, // lfsr position: 99676
+ 0b01010110101111011, // lfsr position: 80772
+ 0b01011011110001001, // lfsr position: 17
+ 0b01011110000011001, // lfsr position: 53237
+ 0b01100000010000111, // lfsr position: 15454
+ 0b01100111000100110, // lfsr position: 65304
+ 0b01101001111000011, // lfsr position: 10304
+ 0b01101111000111110, // lfsr position: 25795
+ 0b01110010111100010, // lfsr position: 101385
+ 0b01110101010101101, // lfsr position: 75595
+ 0b01111000011100000, // lfsr position: 48079
+ 0b01111111010001001, // lfsr position: 44689
+ 0b10000010110111011, // lfsr position: 82508
+ 0b10000111111101101, // lfsr position: 34394
+ 0b10001000011110010, // lfsr position: 87656
+ 0b10001101100100100, // lfsr position: 29189
+ 0b10010011110100110, // lfsr position: 84200
+ 0b10010101110111101, // lfsr position: 12031
+ 0b10011010110010101, // lfsr position: 17186
+ 0b10011100011101011, // lfsr position: 72232
+ 0b10100010100011000, // lfsr position: 3461
+ 0b10100101101100001, // lfsr position: 30896
+ 0b10101000011100010, // lfsr position: 13751
+ 0b10101111000001011, // lfsr position: 46408
+ 0b10110000111110110, // lfsr position: 8589
+ 0b10110111101011010, // lfsr position: 106596
+ 0b10111010000101101, // lfsr position: 79079
+ 0b10111100010111000, // lfsr position: 36088
+ 0b11000010100111010, // lfsr position: 56754
+ 0b11000110100100001, // lfsr position: 51607
+ 0b11001011010111001, // lfsr position: 42977
+ 0b11001110111011011, // lfsr position: 104823
+ 0b11010001101011010, // lfsr position: 68771
+ 0b11010100000110110, // lfsr position: 73894
+ 0b11011010101101000, // lfsr position: 66992
+ 0b11011111011011010, // lfsr position: 103153
+ 0b11100000001010011, // lfsr position: 5166
+ 0b11100110111110000, // lfsr position: 91071
+ 0b11101000101100010, // lfsr position: 60145
+ 0b11101100001101010, // lfsr position: 6888
+ 0b11110011111011100, // lfsr position: 37812
+ 0b11110101110111100, // lfsr position: 97942
+ 0b11111010010011001, // lfsr position: 20627
+ 0b11111100010110100, // lfsr position: 27485
+ },
+ {
+ // Polynomial: 24
+ 0b00000000010101110, // lfsr position: 94577
+ 0b00000111000000110, // lfsr position: 11
+ 0b00001011111001001, // lfsr position: 44702
+ 0b00001111001100010, // lfsr position: 17189
+ 0b00010010000110111, // lfsr position: 91089
+ 0b00010111111011011, // lfsr position: 58442
+ 0b00011011010001000, // lfsr position: 67054
+ 0b00011100001110011, // lfsr position: 96282
+ 0b00100010010001111, // lfsr position: 34380
+ 0b00100111110010101, // lfsr position: 12005
+ 0b00101010011101010, // lfsr position: 53265
+ 0b00101101011011101, // lfsr position: 39544
+ 0b00110010100100010, // lfsr position: 61894
+ 0b00110100111000101, // lfsr position: 20624
+ 0b00111010111111000, // lfsr position: 103132
+ 0b00111111101110110, // lfsr position: 48101
+ 0b01000011101000010, // lfsr position: 85935
+ 0b01000101010000111, // lfsr position: 79022
+ 0b01001000000010000, // lfsr position: 108270
+ 0b01001111001011011, // lfsr position: 3408
+ 0b01010000100110111, // lfsr position: 32666
+ 0b01010101011111110, // lfsr position: 42971
+ 0b01011010001101111, // lfsr position: 106553
+ 0b01011101110000101, // lfsr position: 10344
+ 0b01100000011001000, // lfsr position: 37772
+ 0b01100100011100110, // lfsr position: 6874
+ 0b01101011001110110, // lfsr position: 104885
+ 0b01101111110000001, // lfsr position: 8587
+ 0b01110010111010000, // lfsr position: 97983
+ 0b01110111101100011, // lfsr position: 80774
+ 0b01111011000001011, // lfsr position: 49821
+ 0b01111101100110000, // lfsr position: 46390
+ 0b10000001110111100, // lfsr position: 77342
+ 0b10000111010011000, // lfsr position: 51538
+ 0b10001001010111110, // lfsr position: 29220
+ 0b10001101101100101, // lfsr position: 101409
+ 0b10010001010101010, // lfsr position: 68779
+ 0b10010100000000110, // lfsr position: 13713
+ 0b10011010011011011, // lfsr position: 75627
+ 0b10011101111000010, // lfsr position: 15471
+ 0b10100000100000100, // lfsr position: 70424
+ 0b10100111110101110, // lfsr position: 1725
+ 0b10101000100110000, // lfsr position: 41240
+ 0b10101111001101110, // lfsr position: 87646
+ 0b10110001110111111, // lfsr position: 18913
+ 0b10110110011111111, // lfsr position: 82511
+ 0b10111001001010110, // lfsr position: 27535
+ 0b10111110011100100, // lfsr position: 99668
+ 0b11000000110110011, // lfsr position: 89386
+ 0b11000100110000001, // lfsr position: 73904
+ 0b11001000010000010, // lfsr position: 25781
+ 0b11001101101111101, // lfsr position: 60153
+ 0b11010001100001000, // lfsr position: 92807
+ 0b11010101111011101, // lfsr position: 72179
+ 0b11011011110010011, // lfsr position: 30935
+ 0b11011110101100010, // lfsr position: 36062
+ 0b11100001100001101, // lfsr position: 5156
+ 0b11100100001110000, // lfsr position: 22333
+ 0b11101011001110111, // lfsr position: 55019
+ 0b11101100001110001, // lfsr position: 56716
+ 0b11110011000001100, // lfsr position: 65281
+ 0b11110100110010001, // lfsr position: 63631
+ 0b11111000100010011, // lfsr position: 24058
+ 0b11111100111110101, // lfsr position: 84221
+ },
+ {
+ // Polynomial: 25
+ 0b00000001010110110, // lfsr position: 30946
+ 0b00000100001001001, // lfsr position: 103087
+ 0b00001001101000110, // lfsr position: 106578
+ 0b00001100100101101, // lfsr position: 36084
+ 0b00010000001011100, // lfsr position: 92818
+ 0b00010110101110111, // lfsr position: 1704
+ 0b00011011111001111, // lfsr position: 48127
+ 0b00011111000010011, // lfsr position: 67021
+ 0b00100010001000101, // lfsr position: 72206
+ 0b00100100101111011, // lfsr position: 97986
+ 0b00101011001001011, // lfsr position: 14
+ 0b00101110110001110, // lfsr position: 101389
+ 0b00110011100101010, // lfsr position: 12033
+ 0b00110111101110100, // lfsr position: 24079
+ 0b00111010011000001, // lfsr position: 44700
+ 0b00111101010011000, // lfsr position: 18898
+ 0b01000011101011001, // lfsr position: 91082
+ 0b01000101011001111, // lfsr position: 77315
+ 0b01001011111100100, // lfsr position: 51600
+ 0b01001111001011111, // lfsr position: 108269
+ 0b01010000110000000, // lfsr position: 82477
+ 0b01010111110001010, // lfsr position: 80793
+ 0b01011000100111010, // lfsr position: 8608
+ 0b01011110010101101, // lfsr position: 46370
+ 0b01100011111101000, // lfsr position: 25744
+ 0b01100110100101001, // lfsr position: 70503
+ 0b01101000100011001, // lfsr position: 75607
+ 0b01101100100001100, // lfsr position: 15492
+ 0b01110010110110001, // lfsr position: 53253
+ 0b01110101110001011, // lfsr position: 39566
+ 0b01111001110011100, // lfsr position: 58438
+ 0b01111101111010111, // lfsr position: 85934
+ 0b10000001000111101, // lfsr position: 94540
+ 0b10000101001100100, // lfsr position: 65317
+ 0b10001000000001010, // lfsr position: 22333
+ 0b10001111000011010, // lfsr position: 61903
+ 0b10010001010111101, // lfsr position: 17171
+ 0b10010100000110001, // lfsr position: 13740
+ 0b10011001001111010, // lfsr position: 87648
+ 0b10011100111000101, // lfsr position: 49863
+ 0b10100001101100011, // lfsr position: 10311
+ 0b10100100010011010, // lfsr position: 63567
+ 0b10101000011110101, // lfsr position: 20660
+ 0b10101111000010000, // lfsr position: 32677
+ 0b10110010100001000, // lfsr position: 29226
+ 0b10110111101001100, // lfsr position: 68752
+ 0b10111010000101001, // lfsr position: 73915
+ 0b10111111011011011, // lfsr position: 42982
+ 0b11000000100101011, // lfsr position: 99692
+ 0b11000100100101011, // lfsr position: 27477
+ 0b11001010110001110, // lfsr position: 37807
+ 0b11001101101001000, // lfsr position: 41245
+ 0b11010000000100101, // lfsr position: 104878
+ 0b11010101001000110, // lfsr position: 6869
+ 0b11011000001110010, // lfsr position: 60155
+ 0b11011110110110011, // lfsr position: 5131
+ 0b11100001010100001, // lfsr position: 79053
+ 0b11100101100111010, // lfsr position: 56721
+ 0b11101011111100111, // lfsr position: 96248
+ 0b11101100101011111, // lfsr position: 84259
+ 0b11110010101001100, // lfsr position: 89417
+ 0b11110110110101100, // lfsr position: 34385
+ 0b11111000011011011, // lfsr position: 3452
+ 0b11111101111101100, // lfsr position: 55011
+ },
+ {
+ // Polynomial: 26
+ 0b00000001100000011, // lfsr position: 92853
+ 0b00000110101001011, // lfsr position: 96241
+ 0b00001010010100001, // lfsr position: 10298
+ 0b00001101110000000, // lfsr position: 13775
+ 0b00010011000111111, // lfsr position: 37820
+ 0b00010101110010110, // lfsr position: 17226
+ 0b00011000001100100, // lfsr position: 108323
+ 0b00011101101010111, // lfsr position: 103135
+ 0b00100010111110110, // lfsr position: 48105
+ 0b00100101100100011, // lfsr position: 14
+ 0b00101000100111100, // lfsr position: 63610
+ 0b00101110101001110, // lfsr position: 79065
+ 0b00110001000011010, // lfsr position: 54973
+ 0b00110101011010000, // lfsr position: 70451
+ 0b00111000001001011, // lfsr position: 41272
+ 0b00111100100000001, // lfsr position: 49816
+ 0b01000000101001110, // lfsr position: 3390
+ 0b01000101100101001, // lfsr position: 42936
+ 0b01001011100111101, // lfsr position: 91143
+ 0b01001111111000110, // lfsr position: 56742
+ 0b01010011010010010, // lfsr position: 24064
+ 0b01010100111000101, // lfsr position: 12078
+ 0b01011001101011000, // lfsr position: 60193
+ 0b01011111100010110, // lfsr position: 5110
+ 0b01100000111100101, // lfsr position: 30954
+ 0b01100101010111111, // lfsr position: 46393
+ 0b01101000101011000, // lfsr position: 80741
+ 0b01101110100100100, // lfsr position: 27459
+ 0b01110001110000001, // lfsr position: 34374
+ 0b01110110010100011, // lfsr position: 15466
+ 0b01111000101011010, // lfsr position: 61853
+ 0b01111111101001101, // lfsr position: 89369
+ 0b10000000100011101, // lfsr position: 8633
+ 0b10000111110101000, // lfsr position: 51535
+ 0b10001001010010110, // lfsr position: 101372
+ 0b10001110110100000, // lfsr position: 85918
+ 0b10010000111010100, // lfsr position: 36072
+ 0b10010111010110101, // lfsr position: 84210
+ 0b10011000110111010, // lfsr position: 6864
+ 0b10011110010001101, // lfsr position: 44708
+ 0b10100010111010101, // lfsr position: 99695
+ 0b10100111111011111, // lfsr position: 32654
+ 0b10101001101101001, // lfsr position: 72206
+ 0b10101111000101100, // lfsr position: 18880
+ 0b10110011110111101, // lfsr position: 73862
+ 0b10110110111101111, // lfsr position: 75624
+ 0b10111000111010110, // lfsr position: 25786
+ 0b10111101000101011, // lfsr position: 67049
+ 0b11000000111110000, // lfsr position: 22391
+ 0b11000110101101100, // lfsr position: 29197
+ 0b11001011011010111, // lfsr position: 53265
+ 0b11001101001011010, // lfsr position: 1713
+ 0b11010011011011110, // lfsr position: 65319
+ 0b11010111101000010, // lfsr position: 77366
+ 0b11011011111110000, // lfsr position: 68753
+ 0b11011111010001110, // lfsr position: 39501
+ 0b11100010010010000, // lfsr position: 94532
+ 0b11100101010001011, // lfsr position: 58457
+ 0b11101010111000000, // lfsr position: 104802
+ 0b11101110111010010, // lfsr position: 82537
+ 0b11110001101100101, // lfsr position: 97991
+ 0b11110100111001100, // lfsr position: 106599
+ 0b11111001101011000, // lfsr position: 87643
+ 0b11111101001111100, // lfsr position: 20622
+ },
+ {
+ // Polynomial: 27
+ 0b00000010000011110, // lfsr position: 60151
+ 0b00000110111011000, // lfsr position: 41273
+ 0b00001011110111001, // lfsr position: 25766
+ 0b00001110000011111, // lfsr position: 58435
+ 0b00010000111000011, // lfsr position: 70479
+ 0b00010111110000001, // lfsr position: 13
+ 0b00011011000010010, // lfsr position: 73918
+ 0b00011111001010010, // lfsr position: 68778
+ 0b00100011111111011, // lfsr position: 82522
+ 0b00100101101010001, // lfsr position: 49870
+ 0b00101011010110111, // lfsr position: 84213
+ 0b00101101011011011, // lfsr position: 36098
+ 0b00110001001111100, // lfsr position: 85912
+ 0b00110110001100110, // lfsr position: 13755
+ 0b00111000010000101, // lfsr position: 65294
+ 0b00111111100111011, // lfsr position: 29214
+ 0b01000000100111011, // lfsr position: 108285
+ 0b01000111011110100, // lfsr position: 24055
+ 0b01001000000010101, // lfsr position: 79088
+ 0b01001110011111100, // lfsr position: 106571
+ 0b01010010011001100, // lfsr position: 54999
+ 0b01010100110011110, // lfsr position: 77360
+ 0b01011011100010100, // lfsr position: 5190
+ 0b01011111000000101, // lfsr position: 63576
+ 0b01100001110010111, // lfsr position: 61874
+ 0b01100101100001110, // lfsr position: 1711
+ 0b01101000111111010, // lfsr position: 103112
+ 0b01101100110100110, // lfsr position: 104879
+ 0b01110000011011001, // lfsr position: 15513
+ 0b01110110100110110, // lfsr position: 96237
+ 0b01111001001110101, // lfsr position: 91085
+ 0b01111110111010001, // lfsr position: 34361
+ 0b10000011000111011, // lfsr position: 6849
+ 0b10000101011001110, // lfsr position: 20618
+ 0b10001010000010011, // lfsr position: 97968
+ 0b10001101100001001, // lfsr position: 30973
+ 0b10010010110010000, // lfsr position: 53300
+ 0b10010110101100010, // lfsr position: 46408
+ 0b10011010011100011, // lfsr position: 10316
+ 0b10011110010000001, // lfsr position: 27469
+ 0b10100000100000111, // lfsr position: 22360
+ 0b10100111001101101, // lfsr position: 80776
+ 0b10101000000001110, // lfsr position: 3430
+ 0b10101111111011000, // lfsr position: 32665
+ 0b10110010011100110, // lfsr position: 12019
+ 0b10110101010001110, // lfsr position: 37769
+ 0b10111011001001111, // lfsr position: 56724
+ 0b10111100101000001, // lfsr position: 51548
+ 0b11000001010001011, // lfsr position: 92781
+ 0b11000110011000001, // lfsr position: 44721
+ 0b11001011011111110, // lfsr position: 101414
+ 0b11001111011110110, // lfsr position: 94541
+ 0b11010000001011101, // lfsr position: 89372
+ 0b11010111110111011, // lfsr position: 87652
+ 0b11011010010011010, // lfsr position: 17170
+ 0b11011111100010011, // lfsr position: 42970
+ 0b11100000101100010, // lfsr position: 99705
+ 0b11100111110011000, // lfsr position: 18907
+ 0b11101010100001101, // lfsr position: 75625
+ 0b11101110001011001, // lfsr position: 67020
+ 0b11110011000100100, // lfsr position: 8597
+ 0b11110110100011010, // lfsr position: 48171
+ 0b11111011000000001, // lfsr position: 39532
+ 0b11111101100000000, // lfsr position: 72153
+ },
+ {
+ // Polynomial: 28
+ 0b00000011101101101, // lfsr position: 15434
+ 0b00000111110001010, // lfsr position: 103095
+ 0b00001001100000101, // lfsr position: 39544
+ 0b00001111100001000, // lfsr position: 12019
+ 0b00010011111100000, // lfsr position: 68773
+ 0b00010101000111100, // lfsr position: 27501
+ 0b00011010100001111, // lfsr position: 94495
+ 0b00011111011101000, // lfsr position: 46372
+ 0b00100000011111000, // lfsr position: 10307
+ 0b00100110100010101, // lfsr position: 72209
+ 0b00101011001111100, // lfsr position: 29210
+ 0b00101111011101101, // lfsr position: 65309
+ 0b00110011110000100, // lfsr position: 87633
+ 0b00110101010111010, // lfsr position: 20612
+ 0b00111001111100010, // lfsr position: 34380
+ 0b00111101011101100, // lfsr position: 24096
+ 0b01000011110000010, // lfsr position: 6847
+ 0b01000110110110101, // lfsr position: 32635
+ 0b01001010110111100, // lfsr position: 48134
+ 0b01001100100101100, // lfsr position: 80810
+ 0b01010011010100011, // lfsr position: 104870
+ 0b01010111101111100, // lfsr position: 82513
+ 0b01011001001100101, // lfsr position: 13763
+ 0b01011111011001101, // lfsr position: 70477
+ 0b01100010111111110, // lfsr position: 99695
+ 0b01100100010111000, // lfsr position: 53263
+ 0b01101011111001011, // lfsr position: 44721
+ 0b01101111110001100, // lfsr position: 63637
+ 0b01110010111111110, // lfsr position: 60124
+ 0b01110101000011101, // lfsr position: 27
+ 0b01111001010011101, // lfsr position: 25769
+ 0b01111111001000010, // lfsr position: 67038
+ 0b10000001110001111, // lfsr position: 75585
+ 0b10000111110111011, // lfsr position: 89350
+ 0b10001001101110110, // lfsr position: 56679
+ 0b10001100111111110, // lfsr position: 84206
+ 0b10010000001001101, // lfsr position: 92811
+ 0b10010111001111011, // lfsr position: 42960
+ 0b10011000010110110, // lfsr position: 3465
+ 0b10011100001001011, // lfsr position: 108250
+ 0b10100000000000101, // lfsr position: 5152
+ 0b10100110111001000, // lfsr position: 98010
+ 0b10101011111001111, // lfsr position: 30893
+ 0b10101110101010011, // lfsr position: 73885
+ 0b10110000010010011, // lfsr position: 96217
+ 0b10110111100011111, // lfsr position: 1699
+ 0b10111000111101111, // lfsr position: 36062
+ 0b10111110001000010, // lfsr position: 91063
+ 0b11000010111111000, // lfsr position: 77378
+ 0b11000101111101001, // lfsr position: 79053
+ 0b11001000100101110, // lfsr position: 101423
+ 0b11001100000100111, // lfsr position: 58452
+ 0b11010010000111100, // lfsr position: 37796
+ 0b11010100010001000, // lfsr position: 18913
+ 0b11011010011110100, // lfsr position: 106543
+ 0b11011101001111101, // lfsr position: 85903
+ 0b11100011010111010, // lfsr position: 8598
+ 0b11100101010100000, // lfsr position: 22353
+ 0b11101000100110010, // lfsr position: 55047
+ 0b11101101111001100, // lfsr position: 17159
+ 0b11110010100110000, // lfsr position: 41262
+ 0b11110110001111001, // lfsr position: 61912
+ 0b11111001101100010, // lfsr position: 51539
+ 0b11111100010111000, // lfsr position: 49808
+ },
+ {
+ // Polynomial: 29
+ 0b00000010000111000, // lfsr position: 82506
+ 0b00000100111010001, // lfsr position: 96232
+ 0b00001010011010001, // lfsr position: 36083
+ 0b00001100111001101, // lfsr position: 20661
+ 0b00010001011000101, // lfsr position: 15465
+ 0b00010111010001100, // lfsr position: 43
+ 0b00011011000000111, // lfsr position: 89388
+ 0b00011110011011010, // lfsr position: 70459
+ 0b00100011101100100, // lfsr position: 99722
+ 0b00100110101010011, // lfsr position: 87637
+ 0b00101010011101110, // lfsr position: 79022
+ 0b00101111000100011, // lfsr position: 6888
+ 0b00110000000111110, // lfsr position: 103079
+ 0b00110100111100100, // lfsr position: 13704
+ 0b00111011111010000, // lfsr position: 37808
+ 0b00111100011101101, // lfsr position: 29259
+ 0b01000000111110100, // lfsr position: 32655
+ 0b01000111111011011, // lfsr position: 80796
+ 0b01001011111111011, // lfsr position: 46445
+ 0b01001100011101011, // lfsr position: 18863
+ 0b01010001001010011, // lfsr position: 60187
+ 0b01010110101100001, // lfsr position: 73913
+ 0b01011001011110000, // lfsr position: 77348
+ 0b01011110110001111, // lfsr position: 44718
+ 0b01100011101110001, // lfsr position: 24043
+ 0b01100111101011110, // lfsr position: 53264
+ 0b01101011001011011, // lfsr position: 5170
+ 0b01101100110101000, // lfsr position: 56714
+ 0b01110001000101010, // lfsr position: 58428
+ 0b01110101001100000, // lfsr position: 61904
+ 0b01111011001001101, // lfsr position: 27522
+ 0b01111111010101111, // lfsr position: 92795
+ 0b10000011111110010, // lfsr position: 48114
+ 0b10000111011010001, // lfsr position: 94542
+ 0b10001001111101101, // lfsr position: 63592
+ 0b10001101000010000, // lfsr position: 42954
+ 0b10010010001111110, // lfsr position: 75668
+ 0b10010111100100101, // lfsr position: 104842
+ 0b10011000010110111, // lfsr position: 106529
+ 0b10011100101010001, // lfsr position: 10318
+ 0b10100000111101110, // lfsr position: 17161
+ 0b10100101001000100, // lfsr position: 84221
+ 0b10101001001000001, // lfsr position: 11991
+ 0b10101111100100000, // lfsr position: 108285
+ 0b10110001011111011, // lfsr position: 30927
+ 0b10110111000101000, // lfsr position: 91052
+ 0b10111011001011010, // lfsr position: 97996
+ 0b10111101001110011, // lfsr position: 25793
+ 0b11000010100101000, // lfsr position: 49824
+ 0b11000111111010000, // lfsr position: 22301
+ 0b11001000001110110, // lfsr position: 3469
+ 0b11001101001000111, // lfsr position: 39544
+ 0b11010010101100011, // lfsr position: 8612
+ 0b11010100101101111, // lfsr position: 67015
+ 0b11011001000010111, // lfsr position: 34335
+ 0b11011111111100001, // lfsr position: 41233
+ 0b11100010000110000, // lfsr position: 55011
+ 0b11100101110001110, // lfsr position: 65336
+ 0b11101000000111110, // lfsr position: 101392
+ 0b11101111110101110, // lfsr position: 72201
+ 0b11110000000100111, // lfsr position: 51524
+ 0b11110110101111110, // lfsr position: 85939
+ 0b11111000000011010, // lfsr position: 1731
+ 0b11111101001001100, // lfsr position: 68731
+ },
+ {
+ // Polynomial: 30
+ 0b00000011100011111, // lfsr position: 22385
+ 0b00000100001010101, // lfsr position: 11
+ 0b00001001101011101, // lfsr position: 106601
+ 0b00001101101000011, // lfsr position: 27537
+ 0b00010010001011010, // lfsr position: 36101
+ 0b00010101101000011, // lfsr position: 97930
+ 0b00011010001101110, // lfsr position: 30961
+ 0b00011111110111100, // lfsr position: 1708
+ 0b00100010111110101, // lfsr position: 72232
+ 0b00100111100011010, // lfsr position: 48142
+ 0b00101010010010010, // lfsr position: 10306
+ 0b00101101000111011, // lfsr position: 17230
+ 0b00110001110100000, // lfsr position: 67034
+ 0b00110100111110011, // lfsr position: 3444
+ 0b00111011110010010, // lfsr position: 101398
+ 0b00111100010100000, // lfsr position: 96221
+ 0b01000011010100101, // lfsr position: 103155
+ 0b01000111110101000, // lfsr position: 49868
+ 0b01001000111000011, // lfsr position: 61891
+ 0b01001101001110111, // lfsr position: 92855
+ 0b01010010111101111, // lfsr position: 75670
+ 0b01010111100110000, // lfsr position: 70462
+ 0b01011001110101110, // lfsr position: 68751
+ 0b01011100101100000, // lfsr position: 41211
+ 0b01100011101001101, // lfsr position: 65326
+ 0b01100100001010110, // lfsr position: 39522
+ 0b01101001110101111, // lfsr position: 58428
+ 0b01101110100010011, // lfsr position: 51588
+ 0b01110001001111001, // lfsr position: 8634
+ 0b01110110000010111, // lfsr position: 46357
+ 0b01111010000101110, // lfsr position: 94517
+ 0b01111110001110000, // lfsr position: 63558
+ 0b10000010011101011, // lfsr position: 37805
+ 0b10000111110000001, // lfsr position: 73921
+ 0b10001000111000101, // lfsr position: 15477
+ 0b10001100110100111, // lfsr position: 87660
+ 0b10010001111111101, // lfsr position: 12021
+ 0b10010110110001100, // lfsr position: 56684
+ 0b10011001110110100, // lfsr position: 42990
+ 0b10011100010000111, // lfsr position: 44661
+ 0b10100011000010010, // lfsr position: 32661
+ 0b10100100010100011, // lfsr position: 25762
+ 0b10101001111000010, // lfsr position: 84205
+ 0b10101110010001011, // lfsr position: 85968
+ 0b10110011100101001, // lfsr position: 99697
+ 0b10110100101111100, // lfsr position: 6908
+ 0b10111000100010011, // lfsr position: 108262
+ 0b10111110001110000, // lfsr position: 89337
+ 0b11000000000011011, // lfsr position: 20598
+ 0b11000110010100011, // lfsr position: 5175
+ 0b11001001001001001, // lfsr position: 60183
+ 0b11001101110101101, // lfsr position: 24022
+ 0b11010000101001000, // lfsr position: 79043
+ 0b11010101010011100, // lfsr position: 82504
+ 0b11011011011101011, // lfsr position: 80786
+ 0b11011100011010010, // lfsr position: 55031
+ 0b11100000001001000, // lfsr position: 18932
+ 0b11100111010101010, // lfsr position: 29242
+ 0b11101000100111001, // lfsr position: 104876
+ 0b11101110011100010, // lfsr position: 13735
+ 0b11110001111010100, // lfsr position: 91066
+ 0b11110110101010100, // lfsr position: 53279
+ 0b11111011001001011, // lfsr position: 34406
+ 0b11111100111001001, // lfsr position: 77335
+ },
+ {
+ // Polynomial: 31
+ 0b00000010101101100, // lfsr position: 72162
+ 0b00000101010111100, // lfsr position: 22338
+ 0b00001001101011101, // lfsr position: 49849
+ 0b00001110010001010, // lfsr position: 25776
+ 0b00010000111100100, // lfsr position: 82504
+ 0b00010100101000101, // lfsr position: 42968
+ 0b00011000011010010, // lfsr position: 60180
+ 0b00011111101001110, // lfsr position: 39526
+ 0b00100001101101000, // lfsr position: 70436
+ 0b00100111111101100, // lfsr position: 3444
+ 0b00101000011100011, // lfsr position: 30925
+ 0b00101101011010100, // lfsr position: 56741
+ 0b00110000111110011, // lfsr position: 8591
+ 0b00110111010101000, // lfsr position: 101402
+ 0b00111000010101010, // lfsr position: 103151
+ 0b00111110111011111, // lfsr position: 5135
+ 0b01000001000111010, // lfsr position: 32660
+ 0b01000110111000010, // lfsr position: 36113
+ 0b01001011001101011, // lfsr position: 65295
+ 0b01001111100010000, // lfsr position: 1714
+ 0b01010000100010110, // lfsr position: 67026
+ 0b01010110001100110, // lfsr position: 106559
+ 0b01011001101100001, // lfsr position: 80787
+ 0b01011100110001110, // lfsr position: 104873
+ 0b01100011001001010, // lfsr position: 68762
+ 0b01100110110100011, // lfsr position: 43
+ 0b01101011001000110, // lfsr position: 51552
+ 0b01101110010001011, // lfsr position: 92826
+ 0b01110011110100000, // lfsr position: 63577
+ 0b01110101111111001, // lfsr position: 44645
+ 0b01111000101110100, // lfsr position: 108245
+ 0b01111101100010010, // lfsr position: 27486
+ 0b10000010011011100, // lfsr position: 89379
+ 0b10000101101111100, // lfsr position: 18907
+ 0b10001000110001010, // lfsr position: 46407
+ 0b10001110000000110, // lfsr position: 17204
+ 0b10010010111110001, // lfsr position: 12036
+ 0b10010110100111110, // lfsr position: 97960
+ 0b10011001011001000, // lfsr position: 61863
+ 0b10011110110010001, // lfsr position: 6863
+ 0b10100000100100101, // lfsr position: 85948
+ 0b10100100111010000, // lfsr position: 29221
+ 0b10101001100000001, // lfsr position: 91094
+ 0b10101111001010100, // lfsr position: 10302
+ 0b10110010011111100, // lfsr position: 34388
+ 0b10110110001011111, // lfsr position: 96267
+ 0b10111011001001100, // lfsr position: 48140
+ 0b10111111100110101, // lfsr position: 84224
+ 0b11000000010100011, // lfsr position: 58470
+ 0b11000100011001001, // lfsr position: 54969
+ 0b11001000011001011, // lfsr position: 73927
+ 0b11001101110111010, // lfsr position: 75637
+ 0b11010011110011000, // lfsr position: 37812
+ 0b11010100101100001, // lfsr position: 79060
+ 0b11011000000000100, // lfsr position: 77330
+ 0b11011110010110101, // lfsr position: 15453
+ 0b11100010001000101, // lfsr position: 13780
+ 0b11100100100000111, // lfsr position: 94529
+ 0b11101010110011110, // lfsr position: 20634
+ 0b11101111101111111, // lfsr position: 87695
+ 0b11110010000011101, // lfsr position: 24035
+ 0b11110111001010001, // lfsr position: 53307
+ 0b11111010000011011, // lfsr position: 99680
+ 0b11111100111011101, // lfsr position: 41223
+ },
+};
+
+static const uint32_t _lfsr_index_table[LH2_POLYNOMIAL_COUNT][NUM_LSFR_COUNT_CHECKPOINTS] = {
+ {
+ // Polynomial: 0
+ 104891, // lfsr bits: 0b00000011000101111
+ 22375, // lfsr bits: 0b00000111011010111
+ 89380, // lfsr bits: 0b00001001000111101
+ 82546, // lfsr bits: 0b00001101010111100
+ 72190, // lfsr bits: 0b00010011100001100
+ 94537, // lfsr bits: 0b00010111101101110
+ 17, // lfsr bits: 0b00011011000100100
+ 12032, // lfsr bits: 0b00011100110001011
+ 34419, // lfsr bits: 0b00100001010001101
+ 56719, // lfsr bits: 0b00100110010100011
+ 29233, // lfsr bits: 0b00101010000111000
+ 17173, // lfsr bits: 0b00101110100100001
+ 20667, // lfsr bits: 0b00110011011101001
+ 77346, // lfsr bits: 0b00110110010000010
+ 44727, // lfsr bits: 0b00111001011011100
+ 3402, // lfsr bits: 0b00111110100101011
+ 49868, // lfsr bits: 0b01000001011100111
+ 10311, // lfsr bits: 0b01000100100110101
+ 37782, // lfsr bits: 0b01001011101110000
+ 18911, // lfsr bits: 0b01001110010100111
+ 67022, // lfsr bits: 0b01010000000101101
+ 73904, // lfsr bits: 0b01010100110000100
+ 58419, // lfsr bits: 0b01011000000001010
+ 103115, // lfsr bits: 0b01011111011110110
+ 36092, // lfsr bits: 0b01100010111011011
+ 65320, // lfsr bits: 0b01100100100000101
+ 41248, // lfsr bits: 0b01101011000110101
+ 32679, // lfsr bits: 0b01101100110110011
+ 106588, // lfsr bits: 0b01110001000100001
+ 1726, // lfsr bits: 0b01110111101000100
+ 6841, // lfsr bits: 0b01111000111000001
+ 75584, // lfsr bits: 0b01111100100100001
+ 101425, // lfsr bits: 0b10000001011110100
+ 24050, // lfsr bits: 0b10000110111101010
+ 15502, // lfsr bits: 0b10001000110011011
+ 42982, // lfsr bits: 0b10001101100101011
+ 92856, // lfsr bits: 0b10010010100110011
+ 5160, // lfsr bits: 0b10010100011011111
+ 85898, // lfsr bits: 0b10011000010011110
+ 84222, // lfsr bits: 0b10011111111011110
+ 27537, // lfsr bits: 0b10100000011111011
+ 91095, // lfsr bits: 0b10100110100000110
+ 53274, // lfsr bits: 0b10101001011100001
+ 70482, // lfsr bits: 0b10101100111101111
+ 30938, // lfsr bits: 0b10110000100100100
+ 8573, // lfsr bits: 0b10110100111000111
+ 87677, // lfsr bits: 0b10111000101011110
+ 68731, // lfsr bits: 0b10111111100010010
+ 97961, // lfsr bits: 0b11000001110100011
+ 55047, // lfsr bits: 0b11000110011101001
+ 80804, // lfsr bits: 0b11001000011000011
+ 39509, // lfsr bits: 0b11001110101000001
+ 60154, // lfsr bits: 0b11010010000000111
+ 25783, // lfsr bits: 0b11010101110111100
+ 46401, // lfsr bits: 0b11011011111001100
+ 61913, // lfsr bits: 0b11011101101100101
+ 96262, // lfsr bits: 0b11100000101000010
+ 13740, // lfsr bits: 0b11100101010010101
+ 48081, // lfsr bits: 0b11101001111110011
+ 79041, // lfsr bits: 0b11101111010111100
+ 108275, // lfsr bits: 0b11110001100100011
+ 63605, // lfsr bits: 0b11110111000100100
+ 99663, // lfsr bits: 0b11111001010110111
+ 51548, // lfsr bits: 0b11111100101011100
+ },
+ {
+ // Polynomial: 1
+ 99695, // lfsr bits: 0b00000000000001100
+ 10285, // lfsr bits: 0b00000110100010001
+ 108302, // lfsr bits: 0b00001001001000011
+ 51581, // lfsr bits: 0b00001111101110101
+ 5167, // lfsr bits: 0b00010011001001011
+ 82518, // lfsr bits: 0b00010101011101011
+ 53274, // lfsr bits: 0b00011000100010110
+ 80760, // lfsr bits: 0b00011100000110100
+ 91102, // lfsr bits: 0b00100001101011000
+ 49833, // lfsr bits: 0b00100110110010101
+ 41, // lfsr bits: 0b00101010100011101
+ 58429, // lfsr bits: 0b00101111110010011
+ 68725, // lfsr bits: 0b00110000110110111
+ 67025, // lfsr bits: 0b00110100010010000
+ 72157, // lfsr bits: 0b00111010110111110
+ 106524, // lfsr bits: 0b00111100100001100
+ 36092, // lfsr bits: 0b01000000110111100
+ 63595, // lfsr bits: 0b01000111011000111
+ 1719, // lfsr bits: 0b01001011010100011
+ 13769, // lfsr bits: 0b01001101110111010
+ 18869, // lfsr bits: 0b01010010110111100
+ 84200, // lfsr bits: 0b01010100100101101
+ 42944, // lfsr bits: 0b01011001111001001
+ 25773, // lfsr bits: 0b01011110110111011
+ 15466, // lfsr bits: 0b01100000100110011
+ 22348, // lfsr bits: 0b01100111100000100
+ 34345, // lfsr bits: 0b01101001101110111
+ 56689, // lfsr bits: 0b01101101011000000
+ 32674, // lfsr bits: 0b01110010110000101
+ 39529, // lfsr bits: 0b01110101000010001
+ 6853, // lfsr bits: 0b01111001101100110
+ 73877, // lfsr bits: 0b01111111111111111
+ 87694, // lfsr bits: 0b10000011011100101
+ 12013, // lfsr bits: 0b10000111111110111
+ 94508, // lfsr bits: 0b10001000010111110
+ 54972, // lfsr bits: 0b10001111111011010
+ 92843, // lfsr bits: 0b10010010111110011
+ 60156, // lfsr bits: 0b10010110000111100
+ 46425, // lfsr bits: 0b10011011111010100
+ 17190, // lfsr bits: 0b10011101110001111
+ 103089, // lfsr bits: 0b10100010010011101
+ 3455, // lfsr bits: 0b10100101000110001
+ 77300, // lfsr bits: 0b10101000011011111
+ 96231, // lfsr bits: 0b10101111110001010
+ 29251, // lfsr bits: 0b10110001011001010
+ 44677, // lfsr bits: 0b10110101010010001
+ 37800, // lfsr bits: 0b10111000111111011
+ 89396, // lfsr bits: 0b10111100110000111
+ 104837, // lfsr bits: 0b11000001110110101
+ 27502, // lfsr bits: 0b11000110001100010
+ 61887, // lfsr bits: 0b11001011100010100
+ 20629, // lfsr bits: 0b11001100011100001
+ 70460, // lfsr bits: 0b11010010001010010
+ 85904, // lfsr bits: 0b11010100101010101
+ 41247, // lfsr bits: 0b11011000100100011
+ 8572, // lfsr bits: 0b11011111101011011
+ 65298, // lfsr bits: 0b11100010111100100
+ 30916, // lfsr bits: 0b11100110101100011
+ 101432, // lfsr bits: 0b11101001011101010
+ 97989, // lfsr bits: 0b11101110101001011
+ 24106, // lfsr bits: 0b11110001100111110
+ 75617, // lfsr bits: 0b11110110011011010
+ 48153, // lfsr bits: 0b11111010110101001
+ 79078, // lfsr bits: 0b11111100001011100
+ },
+ {
+ // Polynomial: 2
+ 82521, // lfsr bits: 0b00000011110010010
+ 32691, // lfsr bits: 0b00000111010111000
+ 97970, // lfsr bits: 0b00001001100101101
+ 92766, // lfsr bits: 0b00001110000100101
+ 39579, // lfsr bits: 0b00010010101101111
+ 34363, // lfsr bits: 0b00010111011000110
+ 25783, // lfsr bits: 0b00011011010011101
+ 61876, // lfsr bits: 0b00011111101101001
+ 108264, // lfsr bits: 0b00100001100101100
+ 46413, // lfsr bits: 0b00100110000101010
+ 30967, // lfsr bits: 0b00101001100100100
+ 5154, // lfsr bits: 0b00101101000001100
+ 10294, // lfsr bits: 0b00110001101010111
+ 72232, // lfsr bits: 0b00110110010101010
+ 73918, // lfsr bits: 0b00111010000000111
+ 18905, // lfsr bits: 0b00111110110100101
+ 3427, // lfsr bits: 0b01000000001100000
+ 63593, // lfsr bits: 0b01000110000010100
+ 91065, // lfsr bits: 0b01001010001100101
+ 106528, // lfsr bits: 0b01001100111101000
+ 67049, // lfsr bits: 0b01010010101101000
+ 55029, // lfsr bits: 0b01010110111011010
+ 85944, // lfsr bits: 0b01011010011001101
+ 84219, // lfsr bits: 0b01011101110011100
+ 13714, // lfsr bits: 0b01100001110011101
+ 87659, // lfsr bits: 0b01100111010001111
+ 94578, // lfsr bits: 0b01101010101100101
+ 51540, // lfsr bits: 0b01101110110100110
+ 43004, // lfsr bits: 0b01110010001010110
+ 89371, // lfsr bits: 0b01110110000110100
+ 49819, // lfsr bits: 0b01111010101000101
+ 70447, // lfsr bits: 0b01111101011101110
+ 60183, // lfsr bits: 0b10000010101001101
+ 75646, // lfsr bits: 0b10000100110001011
+ 79069, // lfsr bits: 0b10001010101001000
+ 8579, // lfsr bits: 0b10001101110111000
+ 101409, // lfsr bits: 0b10010000110001000
+ 96245, // lfsr bits: 0b10010110100100100
+ 1725, // lfsr bits: 0b10011000101111111
+ 29219, // lfsr bits: 0b10011110010101000
+ 37781, // lfsr bits: 0b10100010000001001
+ 17, // lfsr bits: 0b10100100000001101
+ 103108, // lfsr bits: 0b10101001010000000
+ 68750, // lfsr bits: 0b10101110000101110
+ 58473, // lfsr bits: 0b10110001101110011
+ 24073, // lfsr bits: 0b10110101111101110
+ 41259, // lfsr bits: 0b10111010100001000
+ 36073, // lfsr bits: 0b10111111001111001
+ 15458, // lfsr bits: 0b11000011100110100
+ 53277, // lfsr bits: 0b11000110111110010
+ 77355, // lfsr bits: 0b11001000011000011
+ 44717, // lfsr bits: 0b11001111011000001
+ 20596, // lfsr bits: 0b11010001100010000
+ 99670, // lfsr bits: 0b11010111110000001
+ 65279, // lfsr bits: 0b11011000001001111
+ 104895, // lfsr bits: 0b11011110101100100
+ 22362, // lfsr bits: 0b11100001110000011
+ 56765, // lfsr bits: 0b11100110000101010
+ 48136, // lfsr bits: 0b11101011110110110
+ 27500, // lfsr bits: 0b11101100001111100
+ 12050, // lfsr bits: 0b11110001001010100
+ 6856, // lfsr bits: 0b11110100011010001
+ 80759, // lfsr bits: 0b11111010000010011
+ 17210, // lfsr bits: 0b11111100100101110
+ },
+ {
+ // Polynomial: 3
+ 10313, // lfsr bits: 0b00000000011001011
+ 72196, // lfsr bits: 0b00000111000010100
+ 41232, // lfsr bits: 0b00001011000011011
+ 42977, // lfsr bits: 0b00001100011111101
+ 61847, // lfsr bits: 0b00010010001111010
+ 65302, // lfsr bits: 0b00010101000011001
+ 99687, // lfsr bits: 0b00011010010000110
+ 24044, // lfsr bits: 0b00011111001100010
+ 3424, // lfsr bits: 0b00100001001100011
+ 101405, // lfsr bits: 0b00100110110001101
+ 34377, // lfsr bits: 0b00101011101000010
+ 46383, // lfsr bits: 0b00101101000001100
+ 30951, // lfsr bits: 0b00110011000011000
+ 106545, // lfsr bits: 0b00110100001111011
+ 53273, // lfsr bits: 0b00111010010000001
+ 22366, // lfsr bits: 0b00111100101000010
+ 79090, // lfsr bits: 0b01000010010100000
+ 67039, // lfsr bits: 0b01000110101110111
+ 70469, // lfsr bits: 0b01001010101001011
+ 58392, // lfsr bits: 0b01001110101010000
+ 6897, // lfsr bits: 0b01010011111000100
+ 97952, // lfsr bits: 0b01010100101101011
+ 8588, // lfsr bits: 0b01011011100110001
+ 1736, // lfsr bits: 0b01011101011000101
+ 84227, // lfsr bits: 0b01100000110001100
+ 20627, // lfsr bits: 0b01100111101011110
+ 37851, // lfsr bits: 0b01101000110000101
+ 56681, // lfsr bits: 0b01101111010100001
+ 18937, // lfsr bits: 0b01110010011001101
+ 55003, // lfsr bits: 0b01110100110101100
+ 96285, // lfsr bits: 0b01111010111010100
+ 60172, // lfsr bits: 0b01111111110010101
+ 49830, // lfsr bits: 0b10000010110010010
+ 13727, // lfsr bits: 0b10000100110111111
+ 36098, // lfsr bits: 0b10001011111100110
+ 89347, // lfsr bits: 0b10001110001001001
+ 68751, // lfsr bits: 0b10010011100000101
+ 27484, // lfsr bits: 0b10010110111011101
+ 12008, // lfsr bits: 0b10011010010111100
+ 15483, // lfsr bits: 0b10011101100001101
+ 32660, // lfsr bits: 0b10100010111110000
+ 85943, // lfsr bits: 0b10100110110100100
+ 17214, // lfsr bits: 0b10101011111101001
+ 30, // lfsr bits: 0b10101110000010101
+ 44680, // lfsr bits: 0b10110000110000001
+ 103141, // lfsr bits: 0b10110101111100100
+ 51578, // lfsr bits: 0b10111001100101110
+ 82487, // lfsr bits: 0b10111110100000101
+ 25766, // lfsr bits: 0b11000001011000110
+ 75584, // lfsr bits: 0b11000100110101001
+ 29176, // lfsr bits: 0b11001011010001101
+ 91099, // lfsr bits: 0b11001110000100100
+ 73950, // lfsr bits: 0b11010001011101010
+ 108267, // lfsr bits: 0b11010111110001001
+ 104828, // lfsr bits: 0b11011011101001111
+ 63578, // lfsr bits: 0b11011111100001111
+ 87626, // lfsr bits: 0b11100010010110001
+ 94575, // lfsr bits: 0b11100111001110100
+ 39513, // lfsr bits: 0b11101001110010101
+ 77318, // lfsr bits: 0b11101101100101111
+ 92801, // lfsr bits: 0b11110001101101001
+ 80787, // lfsr bits: 0b11110110101110100
+ 5136, // lfsr bits: 0b11111011001010001
+ 48135, // lfsr bits: 0b11111110011110111
+ },
+ {
+ // Polynomial: 4
+ 60132, // lfsr bits: 0b00000010011101011
+ 63614, // lfsr bits: 0b00000100111000010
+ 48144, // lfsr bits: 0b00001000100111001
+ 10318, // lfsr bits: 0b00001100000010101
+ 36117, // lfsr bits: 0b00010000110100000
+ 25779, // lfsr bits: 0b00010110010001001
+ 99728, // lfsr bits: 0b00011001110111111
+ 85904, // lfsr bits: 0b00011101111010100
+ 18898, // lfsr bits: 0b00100011110111000
+ 82502, // lfsr bits: 0b00100101001101011
+ 61842, // lfsr bits: 0b00101010001111010
+ 44657, // lfsr bits: 0b00101101111101111
+ 3430, // lfsr bits: 0b00110001000111110
+ 92799, // lfsr bits: 0b00110110111110100
+ 68756, // lfsr bits: 0b00111011111011111
+ 46408, // lfsr bits: 0b00111111010010110
+ 89410, // lfsr bits: 0b01000000000011001
+ 37799, // lfsr bits: 0b01000100100000111
+ 73871, // lfsr bits: 0b01001011100001110
+ 17213, // lfsr bits: 0b01001111010000000
+ 87702, // lfsr bits: 0b01010000000111110
+ 91091, // lfsr bits: 0b01010110011101011
+ 5169, // lfsr bits: 0b01011011000010010
+ 37, // lfsr bits: 0b01011101000101101
+ 84238, // lfsr bits: 0b01100001010001100
+ 13738, // lfsr bits: 0b01100101100000111
+ 1710, // lfsr bits: 0b01101011001001110
+ 42960, // lfsr bits: 0b01101110110010010
+ 41228, // lfsr bits: 0b01110010011010111
+ 108283, // lfsr bits: 0b01110111111011010
+ 20628, // lfsr bits: 0b01111001001111011
+ 6852, // lfsr bits: 0b01111101001110100
+ 80746, // lfsr bits: 0b10000011011000100
+ 103117, // lfsr bits: 0b10000101110000010
+ 27463, // lfsr bits: 0b10001010110001111
+ 94520, // lfsr bits: 0b10001111101101010
+ 39518, // lfsr bits: 0b10010010111010100
+ 8613, // lfsr bits: 0b10010110101111010
+ 56739, // lfsr bits: 0b10011000001101101
+ 75661, // lfsr bits: 0b10011111100101000
+ 101370, // lfsr bits: 0b10100011110111101
+ 29259, // lfsr bits: 0b10100100110100111
+ 97967, // lfsr bits: 0b10101011101000110
+ 54981, // lfsr bits: 0b10101100011010000
+ 79037, // lfsr bits: 0b10110011101110111
+ 34379, // lfsr bits: 0b10110100001010111
+ 30963, // lfsr bits: 0b10111001110111111
+ 12043, // lfsr bits: 0b10111111000100011
+ 58477, // lfsr bits: 0b11000010000000011
+ 22369, // lfsr bits: 0b11000111010000110
+ 106581, // lfsr bits: 0b11001011101101111
+ 67027, // lfsr bits: 0b11001110000101011
+ 53256, // lfsr bits: 0b11010010100101011
+ 15454, // lfsr bits: 0b11010101101001111
+ 51547, // lfsr bits: 0b11011001010010110
+ 24030, // lfsr bits: 0b11011100000100000
+ 65317, // lfsr bits: 0b11100000101101101
+ 77304, // lfsr bits: 0b11100110111101010
+ 104849, // lfsr bits: 0b11101011000100100
+ 32631, // lfsr bits: 0b11101110010001110
+ 96250, // lfsr bits: 0b11110010100011010
+ 49853, // lfsr bits: 0b11110100011000100
+ 70472, // lfsr bits: 0b11111011111101001
+ 72152, // lfsr bits: 0b11111101000001101
+ },
+ {
+ // Polynomial: 5
+ 51571, // lfsr bits: 0b00000000111011110
+ 20646, // lfsr bits: 0b00000101110000010
+ 84217, // lfsr bits: 0b00001011010001101
+ 70471, // lfsr bits: 0b00001101000110001
+ 49890, // lfsr bits: 0b00010010101100110
+ 99709, // lfsr bits: 0b00010100000100100
+ 1678, // lfsr bits: 0b00011001000000111
+ 73953, // lfsr bits: 0b00011110010000001
+ 6907, // lfsr bits: 0b00100000011000110
+ 34407, // lfsr bits: 0b00100110000101100
+ 60157, // lfsr bits: 0b00101011100100101
+ 92830, // lfsr bits: 0b00101111011001100
+ 29264, // lfsr bits: 0b00110000010000101
+ 67020, // lfsr bits: 0b00110111011001010
+ 15466, // lfsr bits: 0b00111011010111011
+ 85954, // lfsr bits: 0b00111110010111000
+ 22360, // lfsr bits: 0b01000010100110011
+ 108296, // lfsr bits: 0b01000100001100010
+ 10312, // lfsr bits: 0b01001001110011100
+ 18892, // lfsr bits: 0b01001101111010111
+ 94547, // lfsr bits: 0b01010001100001110
+ 27502, // lfsr bits: 0b01010100010011011
+ 106567, // lfsr bits: 0b01011001000100001
+ 5128, // lfsr bits: 0b01011100010010100
+ 55031, // lfsr bits: 0b01100000010000111
+ 41251, // lfsr bits: 0b01100101110100110
+ 32646, // lfsr bits: 0b01101000000000110
+ 97969, // lfsr bits: 0b01101110000111100
+ 75626, // lfsr bits: 0b01110001001010001
+ 101397, // lfsr bits: 0b01110100000100011
+ 3430, // lfsr bits: 0b01111000010111111
+ 37793, // lfsr bits: 0b01111100000100111
+ 96211, // lfsr bits: 0b10000011100011011
+ 87686, // lfsr bits: 0b10000100111001001
+ 49, // lfsr bits: 0b10001011001111011
+ 44683, // lfsr bits: 0b10001101101000011
+ 36079, // lfsr bits: 0b10010011011001011
+ 58479, // lfsr bits: 0b10010111010100110
+ 68732, // lfsr bits: 0b10011001011111010
+ 80743, // lfsr bits: 0b10011110110100100
+ 103117, // lfsr bits: 0b10100000011000001
+ 89377, // lfsr bits: 0b10100111000101000
+ 63602, // lfsr bits: 0b10101011011000011
+ 61876, // lfsr bits: 0b10101100100101110
+ 39530, // lfsr bits: 0b10110000111100000
+ 13763, // lfsr bits: 0b10110111111000000
+ 104821, // lfsr bits: 0b10111010101101010
+ 77381, // lfsr bits: 0b10111100011000000
+ 8596, // lfsr bits: 0b11000001101011111
+ 56716, // lfsr bits: 0b11000100011000101
+ 65286, // lfsr bits: 0b11001001110000110
+ 25822, // lfsr bits: 0b11001111100000011
+ 79020, // lfsr bits: 0b11010011110011011
+ 82512, // lfsr bits: 0b11010110110011110
+ 24059, // lfsr bits: 0b11011011101101111
+ 46385, // lfsr bits: 0b11011110001110101
+ 17197, // lfsr bits: 0b11100011100010110
+ 12028, // lfsr bits: 0b11100101010100001
+ 72190, // lfsr bits: 0b11101000001001101
+ 53306, // lfsr bits: 0b11101111001100100
+ 91108, // lfsr bits: 0b11110000110000000
+ 48097, // lfsr bits: 0b11110111110010000
+ 30936, // lfsr bits: 0b11111011110100111
+ 42957, // lfsr bits: 0b11111100100011101
+ },
+ {
+ // Polynomial: 6
+ 42950, // lfsr bits: 0b00000011111001010
+ 106575, // lfsr bits: 0b00000111010110101
+ 82493, // lfsr bits: 0b00001001010101000
+ 51550, // lfsr bits: 0b00001110101111010
+ 17210, // lfsr bits: 0b00010011011101111
+ 70452, // lfsr bits: 0b00010111000110011
+ 99714, // lfsr bits: 0b00011011110011111
+ 49834, // lfsr bits: 0b00011111001011010
+ 84249, // lfsr bits: 0b00100011010010111
+ 68762, // lfsr bits: 0b00100110111110010
+ 46419, // lfsr bits: 0b00101010111011111
+ 56717, // lfsr bits: 0b00101110110100011
+ 25773, // lfsr bits: 0b00110001001011010
+ 15463, // lfsr bits: 0b00110101010001000
+ 8571, // lfsr bits: 0b00111011011111001
+ 89332, // lfsr bits: 0b00111110111011000
+ 48127, // lfsr bits: 0b01000001001011001
+ 58445, // lfsr bits: 0b01000100011011110
+ 12027, // lfsr bits: 0b01001000010010110
+ 77365, // lfsr bits: 0b01001111010101011
+ 60154, // lfsr bits: 0b01010000010001000
+ 3409, // lfsr bits: 0b01010111101100000
+ 20610, // lfsr bits: 0b01011000111011010
+ 75635, // lfsr bits: 0b01011110001111111
+ 53282, // lfsr bits: 0b01100000010000011
+ 61871, // lfsr bits: 0b01100101001010100
+ 34398, // lfsr bits: 0b01101001111110101
+ 24073, // lfsr bits: 0b01101101010011010
+ 36115, // lfsr bits: 0b01110001011001110
+ 41248, // lfsr bits: 0b01110100011111000
+ 27495, // lfsr bits: 0b01111000110000011
+ 10334, // lfsr bits: 0b01111110101110000
+ 91138, // lfsr bits: 0b10000000111010001
+ 55010, // lfsr bits: 0b10000110101101000
+ 96237, // lfsr bits: 0b10001011011001101
+ 101412, // lfsr bits: 0b10001101010010001
+ 85922, // lfsr bits: 0b10010010111101010
+ 5114, // lfsr bits: 0b10010110011101101
+ 44702, // lfsr bits: 0b10011011100001101
+ 6914, // lfsr bits: 0b10011110101110111
+ 1754, // lfsr bits: 0b10100000011000000
+ 21, // lfsr bits: 0b10100100010101101
+ 67047, // lfsr bits: 0b10101010101110000
+ 13714, // lfsr bits: 0b10101110010000100
+ 108303, // lfsr bits: 0b10110011001101010
+ 18906, // lfsr bits: 0b10110111110100110
+ 103127, // lfsr bits: 0b10111011011101001
+ 29195, // lfsr bits: 0b10111101000111001
+ 30944, // lfsr bits: 0b11000011011000000
+ 63577, // lfsr bits: 0b11000110101111101
+ 80788, // lfsr bits: 0b11001011110001010
+ 92817, // lfsr bits: 0b11001111001010011
+ 72176, // lfsr bits: 0b11010011110011100
+ 104838, // lfsr bits: 0b11010111011011101
+ 65346, // lfsr bits: 0b11011001001001111
+ 39528, // lfsr bits: 0b11011110001001111
+ 73906, // lfsr bits: 0b11100001101111010
+ 97953, // lfsr bits: 0b11100101001110001
+ 37814, // lfsr bits: 0b11101000111111010
+ 79101, // lfsr bits: 0b11101100100111011
+ 94532, // lfsr bits: 0b11110001011011101
+ 22350, // lfsr bits: 0b11110111111000110
+ 32617, // lfsr bits: 0b11111011000100000
+ 87655, // lfsr bits: 0b11111101110101001
+ },
+ {
+ // Polynomial: 7
+ 77297, // lfsr bits: 0b00000010001011001
+ 17175, // lfsr bits: 0b00000100110001010
+ 70460, // lfsr bits: 0b00001010100010111
+ 27486, // lfsr bits: 0b00001101101010100
+ 94515, // lfsr bits: 0b00010001110001011
+ 108291, // lfsr bits: 0b00010100010001110
+ 53278, // lfsr bits: 0b00011011110111110
+ 61891, // lfsr bits: 0b00011100100111111
+ 3431, // lfsr bits: 0b00100010110000110
+ 11995, // lfsr bits: 0b00100110001100011
+ 63596, // lfsr bits: 0b00101010100100001
+ 37, // lfsr bits: 0b00101101011100011
+ 99693, // lfsr bits: 0b00110011000110010
+ 25761, // lfsr bits: 0b00110111110110111
+ 84221, // lfsr bits: 0b00111000110001011
+ 15474, // lfsr bits: 0b00111101111101101
+ 96226, // lfsr bits: 0b01000011001101101
+ 44713, // lfsr bits: 0b01000110010101111
+ 67050, // lfsr bits: 0b01001001111101100
+ 37786, // lfsr bits: 0b01001100110010000
+ 91090, // lfsr bits: 0b01010011101010010
+ 20643, // lfsr bits: 0b01010110101001111
+ 58418, // lfsr bits: 0b01011000111000001
+ 42943, // lfsr bits: 0b01011111010000100
+ 85932, // lfsr bits: 0b01100000000010111
+ 1700, // lfsr bits: 0b01100100000111001
+ 103117, // lfsr bits: 0b01101011000101111
+ 87609, // lfsr bits: 0b01101110011110100
+ 65296, // lfsr bits: 0b01110001000000111
+ 82454, // lfsr bits: 0b01110101011100100
+ 5166, // lfsr bits: 0b01111011110110010
+ 32662, // lfsr bits: 0b01111110100111111
+ 92811, // lfsr bits: 0b10000010100001101
+ 72203, // lfsr bits: 0b10000111111011011
+ 8587, // lfsr bits: 0b10001010011001010
+ 75596, // lfsr bits: 0b10001111100100001
+ 24060, // lfsr bits: 0b10010001000000000
+ 29223, // lfsr bits: 0b10010101010001100
+ 22345, // lfsr bits: 0b10011000101000001
+ 73921, // lfsr bits: 0b10011100001011100
+ 104875, // lfsr bits: 0b10100010000001100
+ 97995, // lfsr bits: 0b10100101111010101
+ 48085, // lfsr bits: 0b10101011000001010
+ 55006, // lfsr bits: 0b10101101000110100
+ 41265, // lfsr bits: 0b10110000110010010
+ 10269, // lfsr bits: 0b10110111110011100
+ 60184, // lfsr bits: 0b10111011001110010
+ 68783, // lfsr bits: 0b10111110000010110
+ 30954, // lfsr bits: 0b11000011110010100
+ 106561, // lfsr bits: 0b11000110111000000
+ 36118, // lfsr bits: 0b11001011000111000
+ 51554, // lfsr bits: 0b11001100010110110
+ 56709, // lfsr bits: 0b11010000111100110
+ 18898, // lfsr bits: 0b11010100011011110
+ 89385, // lfsr bits: 0b11011011001010011
+ 34405, // lfsr bits: 0b11011100000010000
+ 6870, // lfsr bits: 0b11100000110011101
+ 80808, // lfsr bits: 0b11100110111100011
+ 49850, // lfsr bits: 0b11101000101001101
+ 101427, // lfsr bits: 0b11101100101101010
+ 13752, // lfsr bits: 0b11110010110110100
+ 79038, // lfsr bits: 0b11110111000000001
+ 39530, // lfsr bits: 0b11111010010010011
+ 46385, // lfsr bits: 0b11111101011110011
+ },
+ {
+ // Polynomial: 8
+ 0, // lfsr bits: 0b00000000000000001
+ 94551, // lfsr bits: 0b00000100110101110
+ 103154, // lfsr bits: 0b00001010111101111
+ 77345, // lfsr bits: 0b00001100000110110
+ 41253, // lfsr bits: 0b00010010010011101
+ 13710, // lfsr bits: 0b00010101100111010
+ 104810, // lfsr bits: 0b00011011101000000
+ 67051, // lfsr bits: 0b00011111010001110
+ 106585, // lfsr bits: 0b00100000000111110
+ 58399, // lfsr bits: 0b00100111011001000
+ 10302, // lfsr bits: 0b00101011010101100
+ 82499, // lfsr bits: 0b00101101001111101
+ 42979, // lfsr bits: 0b00110000101010110
+ 25787, // lfsr bits: 0b00110110101101100
+ 98004, // lfsr bits: 0b00111000100001100
+ 92795, // lfsr bits: 0b00111111101111011
+ 91104, // lfsr bits: 0b01000001000001111
+ 12074, // lfsr bits: 0b01000110011001011
+ 24060, // lfsr bits: 0b01001011001011111
+ 72207, // lfsr bits: 0b01001111000011001
+ 22345, // lfsr bits: 0b01010011000000011
+ 101450, // lfsr bits: 0b01010110001001101
+ 87663, // lfsr bits: 0b01011010101010100
+ 39532, // lfsr bits: 0b01011101011001011
+ 99647, // lfsr bits: 0b01100010010100000
+ 73895, // lfsr bits: 0b01100101110101111
+ 68768, // lfsr bits: 0b01101011010101101
+ 70446, // lfsr bits: 0b01101110111100110
+ 53290, // lfsr bits: 0b01110000000000001
+ 46427, // lfsr bits: 0b01110101101010101
+ 61905, // lfsr bits: 0b01111011100011110
+ 3407, // lfsr bits: 0b01111110011110101
+ 49819, // lfsr bits: 0b10000011110111100
+ 63583, // lfsr bits: 0b10000110100111001
+ 80740, // lfsr bits: 0b10001011101000110
+ 65301, // lfsr bits: 0b10001110000000000
+ 1684, // lfsr bits: 0b10010001101001010
+ 6877, // lfsr bits: 0b10010100100010011
+ 20629, // lfsr bits: 0b10011011000111000
+ 75598, // lfsr bits: 0b10011101111010011
+ 51575, // lfsr bits: 0b10100001110100101
+ 108258, // lfsr bits: 0b10100110110100000
+ 32626, // lfsr bits: 0b10101001000111000
+ 79055, // lfsr bits: 0b10101110011000010
+ 29196, // lfsr bits: 0b10110001001101110
+ 36089, // lfsr bits: 0b10110110011010111
+ 85908, // lfsr bits: 0b10111011001100100
+ 84242, // lfsr bits: 0b10111100000101110
+ 96278, // lfsr bits: 0b11000010100001011
+ 60139, // lfsr bits: 0b11000100111111111
+ 44661, // lfsr bits: 0b11001010010010000
+ 17173, // lfsr bits: 0b11001101110100100
+ 89379, // lfsr bits: 0b11010000111101011
+ 30953, // lfsr bits: 0b11010101011001110
+ 55044, // lfsr bits: 0b11011001000001001
+ 5149, // lfsr bits: 0b11011111111010111
+ 8599, // lfsr bits: 0b11100001100010001
+ 56699, // lfsr bits: 0b11100101101111000
+ 15505, // lfsr bits: 0b11101001011010011
+ 18939, // lfsr bits: 0b11101101101110101
+ 37811, // lfsr bits: 0b11110001111111110
+ 34389, // lfsr bits: 0b11110101110010101
+ 48104, // lfsr bits: 0b11111010001100101
+ 27541, // lfsr bits: 0b11111111101000110
+ },
+ {
+ // Polynomial: 9
+ 103076, // lfsr bits: 0b00000010000100001
+ 12028, // lfsr bits: 0b00000100100010101
+ 6907, // lfsr bits: 0b00001011101000110
+ 18917, // lfsr bits: 0b00001100110101011
+ 8592, // lfsr bits: 0b00010011000101000
+ 27508, // lfsr bits: 0b00010110100110001
+ 70488, // lfsr bits: 0b00011001010100100
+ 84191, // lfsr bits: 0b00011110011011101
+ 46431, // lfsr bits: 0b00100011000011100
+ 58414, // lfsr bits: 0b00100101011000111
+ 68715, // lfsr bits: 0b00101010100110011
+ 10322, // lfsr bits: 0b00101101101101101
+ 106544, // lfsr bits: 0b00110000100010111
+ 30924, // lfsr bits: 0b00110110001011110
+ 22342, // lfsr bits: 0b00111011110000000
+ 72214, // lfsr bits: 0b00111100011110110
+ 15507, // lfsr bits: 0b01000010100110100
+ 80732, // lfsr bits: 0b01000101111000011
+ 51601, // lfsr bits: 0b01001010101010000
+ 97971, // lfsr bits: 0b01001101101001011
+ 37827, // lfsr bits: 0b01010011010100011
+ 85941, // lfsr bits: 0b01010100010000100
+ 82519, // lfsr bits: 0b01011000111011101
+ 79014, // lfsr bits: 0b01011111110010000
+ 20646, // lfsr bits: 0b01100010100010100
+ 94516, // lfsr bits: 0b01100100001010011
+ 60144, // lfsr bits: 0b01101000111111111
+ 48103, // lfsr bits: 0b01101110100111011
+ 87646, // lfsr bits: 0b01110000001111001
+ 13752, // lfsr bits: 0b01110100111000011
+ 42942, // lfsr bits: 0b01111010100100110
+ 89390, // lfsr bits: 0b01111111001011110
+ 67051, // lfsr bits: 0b10000001011000101
+ 1771, // lfsr bits: 0b10000111111110110
+ 99701, // lfsr bits: 0b10001011010100111
+ 75594, // lfsr bits: 0b10001111101111001
+ 108283, // lfsr bits: 0b10010011000100011
+ 5171, // lfsr bits: 0b10010100100111001
+ 41, // lfsr bits: 0b10011010010110111
+ 39516, // lfsr bits: 0b10011111101101011
+ 32642, // lfsr bits: 0b10100001101100111
+ 96200, // lfsr bits: 0b10100101110001110
+ 3434, // lfsr bits: 0b10101001010001111
+ 29262, // lfsr bits: 0b10101110111110010
+ 56720, // lfsr bits: 0b10110001000011000
+ 73906, // lfsr bits: 0b10110110000010001
+ 77339, // lfsr bits: 0b10111000111011000
+ 55001, // lfsr bits: 0b10111101011011110
+ 41288, // lfsr bits: 0b11000010110001011
+ 49852, // lfsr bits: 0b11000100111011001
+ 44679, // lfsr bits: 0b11001000001100111
+ 92845, // lfsr bits: 0b11001101001111100
+ 101371, // lfsr bits: 0b11010010010100111
+ 63593, // lfsr bits: 0b11010101010011101
+ 34398, // lfsr bits: 0b11011010110011000
+ 36101, // lfsr bits: 0b11011111101001001
+ 24038, // lfsr bits: 0b11100011111011011
+ 17191, // lfsr bits: 0b11100101100101000
+ 91139, // lfsr bits: 0b11101000001000111
+ 53287, // lfsr bits: 0b11101110001010110
+ 25780, // lfsr bits: 0b11110011111110101
+ 61908, // lfsr bits: 0b11110110010110010
+ 104855, // lfsr bits: 0b11111011100111011
+ 65327, // lfsr bits: 0b11111100010100101
+ },
+ {
+ // Polynomial: 10
+ 68748, // lfsr bits: 0b00000010001000001
+ 56727, // lfsr bits: 0b00000111011000001
+ 60150, // lfsr bits: 0b00001010011010110
+ 70458, // lfsr bits: 0b00001110111111111
+ 29204, // lfsr bits: 0b00010001011101111
+ 8607, // lfsr bits: 0b00010100110000001
+ 79089, // lfsr bits: 0b00011001001011101
+ 37802, // lfsr bits: 0b00011111100100011
+ 46431, // lfsr bits: 0b00100001100110101
+ 12059, // lfsr bits: 0b00100110100111000
+ 20605, // lfsr bits: 0b00101010011000110
+ 108252, // lfsr bits: 0b00101100111010101
+ 27502, // lfsr bits: 0b00110011101111011
+ 101441, // lfsr bits: 0b00110110001111110
+ 42977, // lfsr bits: 0b00111010110111000
+ 58435, // lfsr bits: 0b00111101111010000
+ 103160, // lfsr bits: 0b01000001111000101
+ 97965, // lfsr bits: 0b01000101111110110
+ 51532, // lfsr bits: 0b01001011101101111
+ 84214, // lfsr bits: 0b01001100000011111
+ 1706, // lfsr bits: 0b01010001010110001
+ 17191, // lfsr bits: 0b01010100101100001
+ 65316, // lfsr bits: 0b01011011011110000
+ 48147, // lfsr bits: 0b01011110011100100
+ 55025, // lfsr bits: 0b01100001000100000
+ 99706, // lfsr bits: 0b01100110100001010
+ 32649, // lfsr bits: 0b01101001110110011
+ 36113, // lfsr bits: 0b01101100010010110
+ 77352, // lfsr bits: 0b01110011111010001
+ 6876, // lfsr bits: 0b01110100101010011
+ 73938, // lfsr bits: 0b01111010100111110
+ 72191, // lfsr bits: 0b01111101111101111
+ 3426, // lfsr bits: 0b10000001100100111
+ 10357, // lfsr bits: 0b10000111110110011
+ 18907, // lfsr bits: 0b10001001000110111
+ 63621, // lfsr bits: 0b10001110111100010
+ 22329, // lfsr bits: 0b10010001101100010
+ 92765, // lfsr bits: 0b10010101100011100
+ 61853, // lfsr bits: 0b10011011000111110
+ 96256, // lfsr bits: 0b10011110011101000
+ 104872, // lfsr bits: 0b10100001100101001
+ 44690, // lfsr bits: 0b10100101100001110
+ 39548, // lfsr bits: 0b10101000111100110
+ 82502, // lfsr bits: 0b10101110010011111
+ 80810, // lfsr bits: 0b10110000000100011
+ 5145, // lfsr bits: 0b10110100000111110
+ 41256, // lfsr bits: 0b10111010011100101
+ 24069, // lfsr bits: 0b10111111100010000
+ 53283, // lfsr bits: 0b11000010010111000
+ 89377, // lfsr bits: 0b11000101111110011
+ 67067, // lfsr bits: 0b11001010111111101
+ 85936, // lfsr bits: 0b11001110100001110
+ 106578, // lfsr bits: 0b11010010110111011
+ 15481, // lfsr bits: 0b11010110110110100
+ 13796, // lfsr bits: 0b11011010100111110
+ 87680, // lfsr bits: 0b11011100111011010
+ 49842, // lfsr bits: 0b11100011110101111
+ 91097, // lfsr bits: 0b11100111100001010
+ 43, // lfsr bits: 0b11101010111101110
+ 94527, // lfsr bits: 0b11101101111011101
+ 34359, // lfsr bits: 0b11110001111111101
+ 30922, // lfsr bits: 0b11110101011100111
+ 75621, // lfsr bits: 0b11111000000011101
+ 25781, // lfsr bits: 0b11111101101000011
+ },
+ {
+ // Polynomial: 11
+ 34336, // lfsr bits: 0b00000010000100011
+ 36090, // lfsr bits: 0b00000110011001010
+ 67048, // lfsr bits: 0b00001000000010000
+ 70460, // lfsr bits: 0b00001110001111101
+ 27521, // lfsr bits: 0b00010001010000100
+ 56713, // lfsr bits: 0b00010100000011001
+ 79065, // lfsr bits: 0b00011001010011101
+ 49833, // lfsr bits: 0b00011101011110110
+ 65307, // lfsr bits: 0b00100001110100110
+ 75629, // lfsr bits: 0b00100111101100001
+ 29190, // lfsr bits: 0b00101010110011110
+ 82496, // lfsr bits: 0b00101110001111010
+ 39513, // lfsr bits: 0b00110010101001000
+ 61880, // lfsr bits: 0b00110110101011001
+ 17167, // lfsr bits: 0b00111000101011101
+ 20650, // lfsr bits: 0b00111101010001011
+ 22365, // lfsr bits: 0b01000000101111100
+ 72226, // lfsr bits: 0b01000111000110101
+ 60167, // lfsr bits: 0b01001001010110110
+ 99693, // lfsr bits: 0b01001110110111010
+ 103134, // lfsr bits: 0b01010000010100100
+ 24022, // lfsr bits: 0b01010110110100101
+ 37794, // lfsr bits: 0b01011011001011100
+ 80793, // lfsr bits: 0b01011101011010101
+ 51533, // lfsr bits: 0b01100000010010001
+ 1746, // lfsr bits: 0b01100101111100011
+ 30936, // lfsr bits: 0b01101000001111000
+ 5158, // lfsr bits: 0b01101111100001110
+ 91089, // lfsr bits: 0b01110000111111011
+ 97954, // lfsr bits: 0b01110101110010010
+ 96246, // lfsr bits: 0b01111000101000101
+ 6918, // lfsr bits: 0b01111101111011100
+ 3449, // lfsr bits: 0b10000001000110100
+ 55019, // lfsr bits: 0b10000111110010100
+ 12053, // lfsr bits: 0b10001000101001100
+ 42977, // lfsr bits: 0b10001101111010000
+ 8627, // lfsr bits: 0b10010001010110101
+ 87678, // lfsr bits: 0b10010100111111100
+ 106558, // lfsr bits: 0b10011001001111100
+ 41268, // lfsr bits: 0b10011111100001000
+ 101396, // lfsr bits: 0b10100011001011111
+ 108310, // lfsr bits: 0b10100110000000001
+ 104869, // lfsr bits: 0b10101000101101100
+ 48127, // lfsr bits: 0b10101101000001000
+ 18909, // lfsr bits: 0b10110011111010111
+ 32631, // lfsr bits: 0b10110101010000100
+ 92789, // lfsr bits: 0b10111011111000010
+ 73939, // lfsr bits: 0b10111101001011110
+ 16, // lfsr bits: 0b11000011010100111
+ 44694, // lfsr bits: 0b11000111100010111
+ 53263, // lfsr bits: 0b11001010010000101
+ 10269, // lfsr bits: 0b11001110110110010
+ 68772, // lfsr bits: 0b11010000111101110
+ 89357, // lfsr bits: 0b11010101000011111
+ 63603, // lfsr bits: 0b11011000000100001
+ 94517, // lfsr bits: 0b11011101011111101
+ 77341, // lfsr bits: 0b11100010110001100
+ 13749, // lfsr bits: 0b11100100110100010
+ 84194, // lfsr bits: 0b11101010011010110
+ 46392, // lfsr bits: 0b11101101010000101
+ 15471, // lfsr bits: 0b11110000000000110
+ 25791, // lfsr bits: 0b11110110010001101
+ 85917, // lfsr bits: 0b11111000100010101
+ 58450, // lfsr bits: 0b11111101111111001
+ },
+ {
+ // Polynomial: 12
+ 82516, // lfsr bits: 0b00000011001100010
+ 10311, // lfsr bits: 0b00000101001001111
+ 63550, // lfsr bits: 0b00001010010001010
+ 91083, // lfsr bits: 0b00001101001110011
+ 24061, // lfsr bits: 0b00010001011000100
+ 68795, // lfsr bits: 0b00010111001010110
+ 27502, // lfsr bits: 0b00011011110111010
+ 30919, // lfsr bits: 0b00011100101101011
+ 49838, // lfsr bits: 0b00100010111100011
+ 75649, // lfsr bits: 0b00100110100001100
+ 34391, // lfsr bits: 0b00101010000011000
+ 65285, // lfsr bits: 0b00101111001110001
+ 79050, // lfsr bits: 0b00110010101010000
+ 85922, // lfsr bits: 0b00110110101000100
+ 60152, // lfsr bits: 0b00111011111001001
+ 104838, // lfsr bits: 0b00111100101100011
+ 15493, // lfsr bits: 0b01000000110011011
+ 6862, // lfsr bits: 0b01000100101110111
+ 8584, // lfsr bits: 0b01001010011000101
+ 44704, // lfsr bits: 0b01001110010111001
+ 49, // lfsr bits: 0b01010001000010010
+ 20626, // lfsr bits: 0b01010100110000110
+ 97968, // lfsr bits: 0b01011010101101100
+ 1735, // lfsr bits: 0b01011100010000101
+ 80788, // lfsr bits: 0b01100001111110000
+ 3405, // lfsr bits: 0b01100100101101011
+ 46415, // lfsr bits: 0b01101011111111001
+ 89363, // lfsr bits: 0b01101100101011110
+ 58452, // lfsr bits: 0b01110010101000111
+ 77339, // lfsr bits: 0b01110100100110110
+ 87656, // lfsr bits: 0b01111000111000011
+ 56707, // lfsr bits: 0b01111111110111100
+ 70460, // lfsr bits: 0b10000000000011010
+ 73902, // lfsr bits: 0b10000110110110100
+ 36047, // lfsr bits: 0b10001010111100110
+ 67078, // lfsr bits: 0b10001110111110010
+ 18929, // lfsr bits: 0b10010011100110111
+ 53277, // lfsr bits: 0b10010100011000111
+ 108275, // lfsr bits: 0b10011011010110100
+ 101383, // lfsr bits: 0b10011100011100010
+ 61885, // lfsr bits: 0b10100000111001010
+ 43008, // lfsr bits: 0b10100100100011000
+ 32651, // lfsr bits: 0b10101000000000100
+ 48135, // lfsr bits: 0b10101101010100001
+ 37829, // lfsr bits: 0b10110011001001011
+ 13764, // lfsr bits: 0b10110111101000110
+ 54955, // lfsr bits: 0b10111000111001110
+ 106562, // lfsr bits: 0b10111110110110010
+ 94563, // lfsr bits: 0b11000010011110110
+ 92804, // lfsr bits: 0b11000100011101111
+ 103096, // lfsr bits: 0b11001011101001011
+ 5171, // lfsr bits: 0b11001111101101101
+ 22373, // lfsr bits: 0b11010000000100110
+ 51587, // lfsr bits: 0b11010101100110001
+ 12013, // lfsr bits: 0b11011011100001001
+ 99663, // lfsr bits: 0b11011110001100101
+ 17153, // lfsr bits: 0b11100010001001100
+ 25747, // lfsr bits: 0b11100110000000000
+ 84216, // lfsr bits: 0b11101010111100111
+ 29223, // lfsr bits: 0b11101110011110101
+ 41245, // lfsr bits: 0b11110001110011100
+ 39502, // lfsr bits: 0b11110110011100100
+ 96247, // lfsr bits: 0b11111010101000000
+ 72149, // lfsr bits: 0b11111101011000010
+ },
+ {
+ // Polynomial: 13
+ 92847, // lfsr bits: 0b00000011001111100
+ 82504, // lfsr bits: 0b00000111100101011
+ 101392, // lfsr bits: 0b00001010100111001
+ 36111, // lfsr bits: 0b00001110001100110
+ 84221, // lfsr bits: 0b00010010101000100
+ 89331, // lfsr bits: 0b00010110010110110
+ 61902, // lfsr bits: 0b00011010111100010
+ 1674, // lfsr bits: 0b00011101111001011
+ 12027, // lfsr bits: 0b00100011001111010
+ 30921, // lfsr bits: 0b00100100001000011
+ 17196, // lfsr bits: 0b00101011101101010
+ 65277, // lfsr bits: 0b00101110110101101
+ 51521, // lfsr bits: 0b00110011111000111
+ 6861, // lfsr bits: 0b00110100011110011
+ 106606, // lfsr bits: 0b00111010110011000
+ 5113, // lfsr bits: 0b00111100110110111
+ 44680, // lfsr bits: 0b01000010100010101
+ 94487, // lfsr bits: 0b01000111111111110
+ 75638, // lfsr bits: 0b01001011110100000
+ 8616, // lfsr bits: 0b01001111010001010
+ 32645, // lfsr bits: 0b01010010011011001
+ 34372, // lfsr bits: 0b01010100110011101
+ 25819, // lfsr bits: 0b01011011110011010
+ 68746, // lfsr bits: 0b01011100000111101
+ 67033, // lfsr bits: 0b01100010101011011
+ 3425, // lfsr bits: 0b01100110101101001
+ 29226, // lfsr bits: 0b01101001110011111
+ 63604, // lfsr bits: 0b01101100011011100
+ 58419, // lfsr bits: 0b01110011111110001
+ 39527, // lfsr bits: 0b01110110111000101
+ 104838, // lfsr bits: 0b01111010011011100
+ 103161, // lfsr bits: 0b01111100100011000
+ 87692, // lfsr bits: 0b10000010100111010
+ 56727, // lfsr bits: 0b10000100110011110
+ 96246, // lfsr bits: 0b10001011000011100
+ 97964, // lfsr bits: 0b10001101000000100
+ 54982, // lfsr bits: 0b10010000111010001
+ 24038, // lfsr bits: 0b10010110110000010
+ 80780, // lfsr bits: 0b10011001000111001
+ 13796, // lfsr bits: 0b10011100111111111
+ 72203, // lfsr bits: 0b10100010001000110
+ 77364, // lfsr bits: 0b10100100011001110
+ 41275, // lfsr bits: 0b10101010100100010
+ 73938, // lfsr bits: 0b10101110110011110
+ 91062, // lfsr bits: 0b10110001101001111
+ 99671, // lfsr bits: 0b10110100011110100
+ 48116, // lfsr bits: 0b10111011111000111
+ 79086, // lfsr bits: 0b10111110110011100
+ 37788, // lfsr bits: 0b11000000001100110
+ 42961, // lfsr bits: 0b11000110000111010
+ 22347, // lfsr bits: 0b11001010001001001
+ 60117, // lfsr bits: 0b11001111010111011
+ 108291, // lfsr bits: 0b11010010110101110
+ 18879, // lfsr bits: 0b11010110010011010
+ 70474, // lfsr bits: 0b11011011001110100
+ 27506, // lfsr bits: 0b11011100100110000
+ 85945, // lfsr bits: 0b11100011100110011
+ 24, // lfsr bits: 0b11100111101111011
+ 10281, // lfsr bits: 0b11101001001101111
+ 20628, // lfsr bits: 0b11101111001110111
+ 46430, // lfsr bits: 0b11110011101010000
+ 49833, // lfsr bits: 0b11110101001111000
+ 15490, // lfsr bits: 0b11111001010010000
+ 53272, // lfsr bits: 0b11111101110001101
+ },
+ {
+ // Polynomial: 14
+ 80781, // lfsr bits: 0b00000000101001111
+ 1744, // lfsr bits: 0b00000100101011010
+ 106572, // lfsr bits: 0b00001000000101101
+ 87684, // lfsr bits: 0b00001101001001001
+ 91109, // lfsr bits: 0b00010001111011110
+ 108243, // lfsr bits: 0b00010101000100110
+ 3422, // lfsr bits: 0b00011010011100100
+ 104857, // lfsr bits: 0b00011100101000001
+ 32652, // lfsr bits: 0b00100001101010011
+ 46398, // lfsr bits: 0b00100111001010000
+ 96244, // lfsr bits: 0b00101001110100011
+ 82544, // lfsr bits: 0b00101110001000110
+ 53298, // lfsr bits: 0b00110000100111101
+ 15515, // lfsr bits: 0b00110101100100001
+ 6832, // lfsr bits: 0b00111010010000000
+ 30911, // lfsr bits: 0b00111101111001100
+ 41257, // lfsr bits: 0b01000010101001010
+ 8588, // lfsr bits: 0b01000110110000011
+ 42925, // lfsr bits: 0b01001010101001110
+ 79066, // lfsr bits: 0b01001111111111011
+ 84215, // lfsr bits: 0b01010001000011101
+ 97970, // lfsr bits: 0b01010101110011110
+ 73920, // lfsr bits: 0b01011000001001111
+ 27479, // lfsr bits: 0b01011101010100111
+ 49818, // lfsr bits: 0b01100001011001101
+ 48113, // lfsr bits: 0b01100111101100000
+ 29198, // lfsr bits: 0b01101011001101100
+ 72159, // lfsr bits: 0b01101100111011001
+ 75637, // lfsr bits: 0b01110010110001111
+ 20612, // lfsr bits: 0b01110100110011110
+ 103132, // lfsr bits: 0b01111000111110000
+ 5118, // lfsr bits: 0b01111101100000011
+ 10306, // lfsr bits: 0b10000010111000011
+ 60167, // lfsr bits: 0b10000100111000011
+ 89411, // lfsr bits: 0b10001000101111011
+ 18882, // lfsr bits: 0b10001111000001100
+ 36080, // lfsr bits: 0b10010001010101110
+ 77342, // lfsr bits: 0b10010100111101000
+ 55030, // lfsr bits: 0b10011001000111100
+ 68741, // lfsr bits: 0b10011111011001001
+ 34409, // lfsr bits: 0b10100011001100100
+ 25828, // lfsr bits: 0b10100100100000000
+ 65275, // lfsr bits: 0b10101001110010000
+ 44701, // lfsr bits: 0b10101111011001001
+ 101403, // lfsr bits: 0b10110000100010010
+ 24061, // lfsr bits: 0b10110110000100110
+ 58389, // lfsr bits: 0b10111010110101101
+ 92832, // lfsr bits: 0b10111111110010110
+ 85889, // lfsr bits: 0b11000001001001111
+ 13735, // lfsr bits: 0b11000111000000011
+ 23, // lfsr bits: 0b11001000110000000
+ 17195, // lfsr bits: 0b11001111011001101
+ 37824, // lfsr bits: 0b11010000010010000
+ 12034, // lfsr bits: 0b11010111110010011
+ 70490, // lfsr bits: 0b11011000111101110
+ 66983, // lfsr bits: 0b11011111010110001
+ 51564, // lfsr bits: 0b11100010101000110
+ 63620, // lfsr bits: 0b11100100110010011
+ 56727, // lfsr bits: 0b11101001011110000
+ 94566, // lfsr bits: 0b11101111011111010
+ 61870, // lfsr bits: 0b11110000010100110
+ 99646, // lfsr bits: 0b11110110001110110
+ 22316, // lfsr bits: 0b11111000110001110
+ 39544, // lfsr bits: 0b11111111110101001
+ },
+ {
+ // Polynomial: 15
+ 101404, // lfsr bits: 0b00000011000110001
+ 12041, // lfsr bits: 0b00000100001011010
+ 15452, // lfsr bits: 0b00001010010110011
+ 103132, // lfsr bits: 0b00001101110111111
+ 106583, // lfsr bits: 0b00010000101111100
+ 92764, // lfsr bits: 0b00010100111010000
+ 29212, // lfsr bits: 0b00011010110111010
+ 18933, // lfsr bits: 0b00011100100000101
+ 79082, // lfsr bits: 0b00100010011111111
+ 104834, // lfsr bits: 0b00100111100011010
+ 80792, // lfsr bits: 0b00101011101101110
+ 84232, // lfsr bits: 0b00101111000110010
+ 27537, // lfsr bits: 0b00110001110001010
+ 63641, // lfsr bits: 0b00110111111100110
+ 8580, // lfsr bits: 0b00111011001100100
+ 72180, // lfsr bits: 0b00111101110101110
+ 22340, // lfsr bits: 0b01000000100101011
+ 99695, // lfsr bits: 0b01000100101001001
+ 46419, // lfsr bits: 0b01001000101100101
+ 56705, // lfsr bits: 0b01001110010100100
+ 13721, // lfsr bits: 0b01010010111100010
+ 89364, // lfsr bits: 0b01010111101001111
+ 44694, // lfsr bits: 0b01011010000011100
+ 65333, // lfsr bits: 0b01011110101111011
+ 61858, // lfsr bits: 0b01100000110110010
+ 98011, // lfsr bits: 0b01100111010101010
+ 58418, // lfsr bits: 0b01101010111001001
+ 34381, // lfsr bits: 0b01101110111001111
+ 68708, // lfsr bits: 0b01110011101001011
+ 87629, // lfsr bits: 0b01110110001110010
+ 94527, // lfsr bits: 0b01111001101111010
+ 77351, // lfsr bits: 0b01111110000111011
+ 51571, // lfsr bits: 0b10000001110111111
+ 48131, // lfsr bits: 0b10000111000010110
+ 6850, // lfsr bits: 0b10001010000011000
+ 41262, // lfsr bits: 0b10001101010011011
+ 66994, // lfsr bits: 0b10010000110001000
+ 17171, // lfsr bits: 0b10010111000000100
+ 39522, // lfsr bits: 0b10011010010111110
+ 55004, // lfsr bits: 0b10011101000001000
+ 25752, // lfsr bits: 0b10100011101011110
+ 30933, // lfsr bits: 0b10100110100010110
+ 60157, // lfsr bits: 0b10101011010001101
+ 85910, // lfsr bits: 0b10101101101000010
+ 24051, // lfsr bits: 0b10110000101111100
+ 1736, // lfsr bits: 0b10110100100010110
+ 42984, // lfsr bits: 0b10111011100101011
+ 108283, // lfsr bits: 0b10111110000010000
+ 75631, // lfsr bits: 0b11000011101011110
+ 73938, // lfsr bits: 0b11000101101001001
+ 36045, // lfsr bits: 0b11001010101110100
+ 3454, // lfsr bits: 0b11001100001000111
+ 32630, // lfsr bits: 0b11010000100100100
+ 49831, // lfsr bits: 0b11010111110111100
+ 10328, // lfsr bits: 0b11011010001000010
+ 17, // lfsr bits: 0b11011111001101001
+ 5142, // lfsr bits: 0b11100011101000000
+ 53319, // lfsr bits: 0b11100100011101111
+ 96265, // lfsr bits: 0b11101011101101110
+ 91089, // lfsr bits: 0b11101110100111010
+ 20644, // lfsr bits: 0b11110010001110100
+ 70510, // lfsr bits: 0b11110101101111010
+ 37821, // lfsr bits: 0b11111000110000010
+ 82534, // lfsr bits: 0b11111110110001110
+ },
+ {
+ // Polynomial: 16
+ 82518, // lfsr bits: 0b00000011100101100
+ 72225, // lfsr bits: 0b00000110101000011
+ 56727, // lfsr bits: 0b00001011100000110
+ 85951, // lfsr bits: 0b00001110111110011
+ 27520, // lfsr bits: 0b00010001110001101
+ 51593, // lfsr bits: 0b00010110010111110
+ 34380, // lfsr bits: 0b00011000111000110
+ 15500, // lfsr bits: 0b00011111011100111
+ 48143, // lfsr bits: 0b00100010000001010
+ 73898, // lfsr bits: 0b00100100000001100
+ 22355, // lfsr bits: 0b00101010010101011
+ 94512, // lfsr bits: 0b00101111010010101
+ 101408, // lfsr bits: 0b00110010011111111
+ 36062, // lfsr bits: 0b00110110001000011
+ 8579, // lfsr bits: 0b00111001010100100
+ 3483, // lfsr bits: 0b00111111011111111
+ 53308, // lfsr bits: 0b01000001011001001
+ 17170, // lfsr bits: 0b01000110100001001
+ 35, // lfsr bits: 0b01001011100001000
+ 39535, // lfsr bits: 0b01001101010010111
+ 29193, // lfsr bits: 0b01010010011100010
+ 91056, // lfsr bits: 0b01010110100000010
+ 24089, // lfsr bits: 0b01011001001100000
+ 32671, // lfsr bits: 0b01011101100000001
+ 43005, // lfsr bits: 0b01100010110000001
+ 6896, // lfsr bits: 0b01100111111001100
+ 96258, // lfsr bits: 0b01101001010111111
+ 104846, // lfsr bits: 0b01101110100110010
+ 44665, // lfsr bits: 0b01110011010011001
+ 58406, // lfsr bits: 0b01110101001111111
+ 108263, // lfsr bits: 0b01111000011100110
+ 10344, // lfsr bits: 0b01111111000011101
+ 92790, // lfsr bits: 0b10000011000111111
+ 20666, // lfsr bits: 0b10000100111111011
+ 89394, // lfsr bits: 0b10001001010100111
+ 66985, // lfsr bits: 0b10001110010010111
+ 54981, // lfsr bits: 0b10010011001011011
+ 5187, // lfsr bits: 0b10010101100101101
+ 75606, // lfsr bits: 0b10011000111111110
+ 46395, // lfsr bits: 0b10011110001010100
+ 60184, // lfsr bits: 0b10100000000111111
+ 12002, // lfsr bits: 0b10100100001001101
+ 103084, // lfsr bits: 0b10101000100001111
+ 25775, // lfsr bits: 0b10101111111111001
+ 1691, // lfsr bits: 0b10110011100101111
+ 68756, // lfsr bits: 0b10110110110111010
+ 49869, // lfsr bits: 0b10111010000011110
+ 13755, // lfsr bits: 0b10111100100011011
+ 37809, // lfsr bits: 0b11000001001110100
+ 77384, // lfsr bits: 0b11000111010101000
+ 99660, // lfsr bits: 0b11001010110100001
+ 30914, // lfsr bits: 0b11001101011100000
+ 63619, // lfsr bits: 0b11010010010010000
+ 65305, // lfsr bits: 0b11010101011000000
+ 41286, // lfsr bits: 0b11011011110000110
+ 106545, // lfsr bits: 0b11011110100101101
+ 79052, // lfsr bits: 0b11100000110000010
+ 70499, // lfsr bits: 0b11100110100010000
+ 87653, // lfsr bits: 0b11101010110111000
+ 97952, // lfsr bits: 0b11101110010101011
+ 61896, // lfsr bits: 0b11110010011001100
+ 84194, // lfsr bits: 0b11110101000111010
+ 80742, // lfsr bits: 0b11111011110010000
+ 18909, // lfsr bits: 0b11111101110101000
+ },
+ {
+ // Polynomial: 17
+ 51596, // lfsr bits: 0b00000000111110001
+ 3447, // lfsr bits: 0b00000100011101100
+ 25814, // lfsr bits: 0b00001010000100101
+ 6879, // lfsr bits: 0b00001100110100011
+ 36102, // lfsr bits: 0b00010010000000111
+ 61878, // lfsr bits: 0b00010100111100100
+ 18938, // lfsr bits: 0b00011001000011000
+ 91056, // lfsr bits: 0b00011111011111010
+ 20622, // lfsr bits: 0b00100010010111111
+ 96238, // lfsr bits: 0b00100110001010101
+ 73878, // lfsr bits: 0b00101011010010001
+ 44690, // lfsr bits: 0b00101100000111111
+ 99658, // lfsr bits: 0b00110010101000001
+ 77350, // lfsr bits: 0b00110111101100111
+ 89366, // lfsr bits: 0b00111000100101100
+ 5128, // lfsr bits: 0b00111110001100101
+ 24064, // lfsr bits: 0b01000001110010011
+ 85902, // lfsr bits: 0b01000100000000000
+ 37841, // lfsr bits: 0b01001000001101011
+ 54984, // lfsr bits: 0b01001100111001100
+ 80828, // lfsr bits: 0b01010010100101011
+ 63589, // lfsr bits: 0b01010111001110111
+ 41257, // lfsr bits: 0b01011001001101000
+ 104851, // lfsr bits: 0b01011111101001001
+ 87688, // lfsr bits: 0b01100011111110100
+ 8584, // lfsr bits: 0b01100111000001000
+ 53293, // lfsr bits: 0b01101011011001110
+ 22332, // lfsr bits: 0b01101101000101000
+ 56723, // lfsr bits: 0b01110011010011100
+ 1759, // lfsr bits: 0b01110110010001011
+ 32628, // lfsr bits: 0b01111011101010111
+ 92828, // lfsr bits: 0b01111101101011101
+ 65315, // lfsr bits: 0b10000010111100010
+ 39524, // lfsr bits: 0b10000110101001001
+ 10321, // lfsr bits: 0b10001011100111100
+ 17200, // lfsr bits: 0b10001100011000100
+ 60172, // lfsr bits: 0b10010001101101110
+ 23, // lfsr bits: 0b10010111001000101
+ 29246, // lfsr bits: 0b10011010111101000
+ 34386, // lfsr bits: 0b10011111101101000
+ 97946, // lfsr bits: 0b10100000000011100
+ 48124, // lfsr bits: 0b10100111000010111
+ 11988, // lfsr bits: 0b10101001011010111
+ 42948, // lfsr bits: 0b10101110000000101
+ 79104, // lfsr bits: 0b10110010101001001
+ 94511, // lfsr bits: 0b10110110000010101
+ 13793, // lfsr bits: 0b10111000010110101
+ 68795, // lfsr bits: 0b10111101010001111
+ 27503, // lfsr bits: 0b11000001111000101
+ 15480, // lfsr bits: 0b11000101000101100
+ 70451, // lfsr bits: 0b11001000011010110
+ 49870, // lfsr bits: 0b11001101001110011
+ 46416, // lfsr bits: 0b11010011110110010
+ 67043, // lfsr bits: 0b11010111100010011
+ 75631, // lfsr bits: 0b11011010111000111
+ 108285, // lfsr bits: 0b11011100101110100
+ 72224, // lfsr bits: 0b11100010001100110
+ 106577, // lfsr bits: 0b11100110000001011
+ 84205, // lfsr bits: 0b11101000010101001
+ 103110, // lfsr bits: 0b11101111111110000
+ 101386, // lfsr bits: 0b11110001010100001
+ 58467, // lfsr bits: 0b11110110010001011
+ 30956, // lfsr bits: 0b11111000011000101
+ 82468, // lfsr bits: 0b11111101110100001
+ },
+ {
+ // Polynomial: 18
+ 79075, // lfsr bits: 0b00000001100000101
+ 42928, // lfsr bits: 0b00000111011100100
+ 39485, // lfsr bits: 0b00001010111011101
+ 36107, // lfsr bits: 0b00001101110011011
+ 60146, // lfsr bits: 0b00010010000101100
+ 68788, // lfsr bits: 0b00010111111000011
+ 87661, // lfsr bits: 0b00011010011001110
+ 13790, // lfsr bits: 0b00011100111011110
+ 56720, // lfsr bits: 0b00100010000111011
+ 106514, // lfsr bits: 0b00100111100010111
+ 58472, // lfsr bits: 0b00101000111011100
+ 30943, // lfsr bits: 0b00101110001011001
+ 51565, // lfsr bits: 0b00110011011011011
+ 108281, // lfsr bits: 0b00110101000101011
+ 96243, // lfsr bits: 0b00111011101011100
+ 6886, // lfsr bits: 0b00111111010101111
+ 43, // lfsr bits: 0b01000001101001010
+ 3483, // lfsr bits: 0b01000110001101010
+ 15439, // lfsr bits: 0b01001010111001100
+ 63573, // lfsr bits: 0b01001111010111001
+ 91124, // lfsr bits: 0b01010001000100011
+ 65314, // lfsr bits: 0b01010101011000000
+ 99695, // lfsr bits: 0b01011010000000001
+ 104874, // lfsr bits: 0b01011110000011111
+ 97948, // lfsr bits: 0b01100011110101000
+ 37847, // lfsr bits: 0b01100101101011000
+ 89345, // lfsr bits: 0b01101011100001010
+ 17182, // lfsr bits: 0b01101100100001101
+ 1744, // lfsr bits: 0b01110000001110111
+ 27469, // lfsr bits: 0b01110101101001111
+ 41236, // lfsr bits: 0b01111010011011011
+ 61857, // lfsr bits: 0b01111110101000110
+ 92795, // lfsr bits: 0b10000001111110011
+ 34378, // lfsr bits: 0b10000100010111010
+ 46424, // lfsr bits: 0b10001001100001011
+ 18938, // lfsr bits: 0b10001110101000101
+ 101397, // lfsr bits: 0b10010001011110101
+ 94549, // lfsr bits: 0b10010110000111100
+ 67036, // lfsr bits: 0b10011010001011001
+ 82514, // lfsr bits: 0b10011100010000011
+ 32635, // lfsr bits: 0b10100000001001001
+ 22309, // lfsr bits: 0b10100110011111100
+ 12054, // lfsr bits: 0b10101001001011010
+ 103115, // lfsr bits: 0b10101100011000101
+ 72142, // lfsr bits: 0b10110000100110011
+ 49837, // lfsr bits: 0b10110110011010101
+ 48147, // lfsr bits: 0b10111001101000001
+ 10321, // lfsr bits: 0b10111101100100000
+ 84192, // lfsr bits: 0b11000010100100010
+ 44691, // lfsr bits: 0b11000110000011111
+ 73908, // lfsr bits: 0b11001010101110110
+ 8555, // lfsr bits: 0b11001101101111010
+ 20626, // lfsr bits: 0b11010000110100010
+ 85987, // lfsr bits: 0b11010110010000100
+ 75631, // lfsr bits: 0b11011000010100101
+ 5149, // lfsr bits: 0b11011110000100101
+ 77358, // lfsr bits: 0b11100010111000110
+ 80768, // lfsr bits: 0b11100101001101000
+ 55004, // lfsr bits: 0b11101000110100001
+ 25791, // lfsr bits: 0b11101111011001101
+ 53244, // lfsr bits: 0b11110010011101011
+ 70440, // lfsr bits: 0b11110101001001111
+ 29180, // lfsr bits: 0b11111000101101100
+ 24021, // lfsr bits: 0b11111101001101101
+ },
+ {
+ // Polynomial: 19
+ 46364, // lfsr bits: 0b00000010111111011
+ 8586, // lfsr bits: 0b00000110111111010
+ 55013, // lfsr bits: 0b00001011110101101
+ 12, // lfsr bits: 0b00001111111010011
+ 53239, // lfsr bits: 0b00010001111101010
+ 37816, // lfsr bits: 0b00010110101111001
+ 44654, // lfsr bits: 0b00011010100101110
+ 3468, // lfsr bits: 0b00011100011010011
+ 70458, // lfsr bits: 0b00100001011010001
+ 89360, // lfsr bits: 0b00100101110111101
+ 92851, // lfsr bits: 0b00101011001101000
+ 36063, // lfsr bits: 0b00101101101001110
+ 22353, // lfsr bits: 0b00110011110100111
+ 30922, // lfsr bits: 0b00110101110100010
+ 80741, // lfsr bits: 0b00111001000010001
+ 91096, // lfsr bits: 0b00111110000000010
+ 103112, // lfsr bits: 0b01000010010011110
+ 67001, // lfsr bits: 0b01000100111001101
+ 1686, // lfsr bits: 0b01001010111111110
+ 34337, // lfsr bits: 0b01001101011101010
+ 32672, // lfsr bits: 0b01010010110110011
+ 48144, // lfsr bits: 0b01010101111000100
+ 27478, // lfsr bits: 0b01011010101000111
+ 68743, // lfsr bits: 0b01011111010001101
+ 73866, // lfsr bits: 0b01100010101110011
+ 84182, // lfsr bits: 0b01100101101011101
+ 42959, // lfsr bits: 0b01101000000111101
+ 41287, // lfsr bits: 0b01101111001111100
+ 97942, // lfsr bits: 0b01110011101101111
+ 24073, // lfsr bits: 0b01110110111011011
+ 101435, // lfsr bits: 0b01111011101000010
+ 96244, // lfsr bits: 0b01111100100101010
+ 12025, // lfsr bits: 0b10000011110001111
+ 65325, // lfsr bits: 0b10000101011001101
+ 18916, // lfsr bits: 0b10001000010110100
+ 60178, // lfsr bits: 0b10001111011001010
+ 51583, // lfsr bits: 0b10010001100010011
+ 39533, // lfsr bits: 0b10010100101001101
+ 61896, // lfsr bits: 0b10011001100100011
+ 99682, // lfsr bits: 0b10011101011110111
+ 5144, // lfsr bits: 0b10100000011001110
+ 58441, // lfsr bits: 0b10100111010011101
+ 106596, // lfsr bits: 0b10101011100001000
+ 72188, // lfsr bits: 0b10101100001111000
+ 20635, // lfsr bits: 0b10110000111010101
+ 82509, // lfsr bits: 0b10110110010001101
+ 87663, // lfsr bits: 0b10111010111010011
+ 63605, // lfsr bits: 0b10111101001100001
+ 17219, // lfsr bits: 0b11000001101110011
+ 29185, // lfsr bits: 0b11000110110101001
+ 49818, // lfsr bits: 0b11001000110001100
+ 25779, // lfsr bits: 0b11001101000110000
+ 15463, // lfsr bits: 0b11010001100110010
+ 13728, // lfsr bits: 0b11010101001111101
+ 10324, // lfsr bits: 0b11011000110111101
+ 108305, // lfsr bits: 0b11011101010100010
+ 75616, // lfsr bits: 0b11100001000100110
+ 104877, // lfsr bits: 0b11100110011110001
+ 85903, // lfsr bits: 0b11101011011011100
+ 6883, // lfsr bits: 0b11101100011000010
+ 79059, // lfsr bits: 0b11110011010100010
+ 56706, // lfsr bits: 0b11110101011010101
+ 94499, // lfsr bits: 0b11111001001010111
+ 77371, // lfsr bits: 0b11111101000011000
+ },
+ {
+ // Polynomial: 20
+ 25804, // lfsr bits: 0b00000010110111001
+ 101376, // lfsr bits: 0b00000110011011000
+ 84232, // lfsr bits: 0b00001001100011100
+ 39547, // lfsr bits: 0b00001111000011110
+ 46418, // lfsr bits: 0b00010000101111001
+ 5130, // lfsr bits: 0b00010110011001100
+ 6895, // lfsr bits: 0b00011011011101010
+ 32666, // lfsr bits: 0b00011111101011010
+ 79073, // lfsr bits: 0b00100001101101000
+ 1735, // lfsr bits: 0b00100110001011000
+ 67017, // lfsr bits: 0b00101000110100100
+ 80768, // lfsr bits: 0b00101110100011001
+ 97980, // lfsr bits: 0b00110000001111111
+ 12004, // lfsr bits: 0b00110100101100100
+ 3447, // lfsr bits: 0b00111000000101101
+ 77298, // lfsr bits: 0b00111111011100100
+ 91096, // lfsr bits: 0b01000001000110101
+ 56703, // lfsr bits: 0b01000100001001011
+ 96223, // lfsr bits: 0b01001001110111100
+ 61843, // lfsr bits: 0b01001100000101101
+ 36112, // lfsr bits: 0b01010000001110111
+ 41225, // lfsr bits: 0b01010110000100111
+ 73862, // lfsr bits: 0b01011011011111100
+ 37809, // lfsr bits: 0b01011110011001111
+ 48125, // lfsr bits: 0b01100011001010011
+ 36, // lfsr bits: 0b01100100010001111
+ 87675, // lfsr bits: 0b01101000011000010
+ 103123, // lfsr bits: 0b01101110011101000
+ 60191, // lfsr bits: 0b01110001101010100
+ 49825, // lfsr bits: 0b01110111001000000
+ 104850, // lfsr bits: 0b01111000110100111
+ 18926, // lfsr bits: 0b01111110011100100
+ 58417, // lfsr bits: 0b10000010011100110
+ 22325, // lfsr bits: 0b10000101111100000
+ 53277, // lfsr bits: 0b10001010101011101
+ 44674, // lfsr bits: 0b10001111001110110
+ 29217, // lfsr bits: 0b10010000100110001
+ 85965, // lfsr bits: 0b10010111011110101
+ 27515, // lfsr bits: 0b10011001000101010
+ 68719, // lfsr bits: 0b10011101100001101
+ 63562, // lfsr bits: 0b10100011000110010
+ 108325, // lfsr bits: 0b10100101001011111
+ 70459, // lfsr bits: 0b10101000101110111
+ 42923, // lfsr bits: 0b10101111000000111
+ 92816, // lfsr bits: 0b10110010011010011
+ 8585, // lfsr bits: 0b10110111000000111
+ 13752, // lfsr bits: 0b10111001100011000
+ 82524, // lfsr bits: 0b10111111111000100
+ 89402, // lfsr bits: 0b11000000101011001
+ 24096, // lfsr bits: 0b11000111011111001
+ 99699, // lfsr bits: 0b11001011100000001
+ 30934, // lfsr bits: 0b11001111011110010
+ 65324, // lfsr bits: 0b11010001011100011
+ 17193, // lfsr bits: 0b11010101000111110
+ 72181, // lfsr bits: 0b11011001010001111
+ 75598, // lfsr bits: 0b11011101101010000
+ 51551, // lfsr bits: 0b11100011101101101
+ 20614, // lfsr bits: 0b11100100011010001
+ 94501, // lfsr bits: 0b11101011111001101
+ 10309, // lfsr bits: 0b11101110000101000
+ 15446, // lfsr bits: 0b11110010010111110
+ 106541, // lfsr bits: 0b11110111000001000
+ 34391, // lfsr bits: 0b11111011110111011
+ 55000, // lfsr bits: 0b11111100100110110
+ },
+ {
+ // Polynomial: 21
+ 10341, // lfsr bits: 0b00000011110100001
+ 87613, // lfsr bits: 0b00000110010100101
+ 97984, // lfsr bits: 0b00001000011011100
+ 39534, // lfsr bits: 0b00001110011110101
+ 92810, // lfsr bits: 0b00010000101100111
+ 13732, // lfsr bits: 0b00010100111101011
+ 37776, // lfsr bits: 0b00011010001000111
+ 46370, // lfsr bits: 0b00011111101111010
+ 25777, // lfsr bits: 0b00100001110101110
+ 103139, // lfsr bits: 0b00100100110101010
+ 18897, // lfsr bits: 0b00101001100110111
+ 60170, // lfsr bits: 0b00101110100000000
+ 72171, // lfsr bits: 0b00110011101010001
+ 75660, // lfsr bits: 0b00110111000010001
+ 12051, // lfsr bits: 0b00111010000010101
+ 84246, // lfsr bits: 0b00111101101001010
+ 49843, // lfsr bits: 0b01000011110011101
+ 65326, // lfsr bits: 0b01000111111000101
+ 27500, // lfsr bits: 0b01001011110111011
+ 58424, // lfsr bits: 0b01001111100111010
+ 44666, // lfsr bits: 0b01010000101011111
+ 101423, // lfsr bits: 0b01010111000101110
+ 67016, // lfsr bits: 0b01011010100010011
+ 85943, // lfsr bits: 0b01011100101110011
+ 8571, // lfsr bits: 0b01100000100101000
+ 96249, // lfsr bits: 0b01100101001011001
+ 3408, // lfsr bits: 0b01101001001011101
+ 30956, // lfsr bits: 0b01101110001101000
+ 20613, // lfsr bits: 0b01110000101010010
+ 51568, // lfsr bits: 0b01110110110100000
+ 6875, // lfsr bits: 0b01111011101100000
+ 41266, // lfsr bits: 0b01111111000010100
+ 17209, // lfsr bits: 0b10000010111110000
+ 104874, // lfsr bits: 0b10000111110000100
+ 77353, // lfsr bits: 0b10001011111110000
+ 79039, // lfsr bits: 0b10001111010110110
+ 70429, // lfsr bits: 0b10010001010100000
+ 22358, // lfsr bits: 0b10010100110111110
+ 108264, // lfsr bits: 0b10011001110100100
+ 82522, // lfsr bits: 0b10011101111110111
+ 63582, // lfsr bits: 0b10100011001111101
+ 36100, // lfsr bits: 0b10100110110110111
+ 29188, // lfsr bits: 0b10101000011110110
+ 73931, // lfsr bits: 0b10101111100110010
+ 34367, // lfsr bits: 0b10110000101001000
+ 1717, // lfsr bits: 0b10110100110100101
+ 56754, // lfsr bits: 0b10111000110111010
+ 15466, // lfsr bits: 0b10111111011010100
+ 42990, // lfsr bits: 0b11000011011111000
+ 32636, // lfsr bits: 0b11000110010101010
+ 91062, // lfsr bits: 0b11001001101110000
+ 94525, // lfsr bits: 0b11001100100010110
+ 19, // lfsr bits: 0b11010001111101001
+ 48132, // lfsr bits: 0b11010100100011111
+ 5207, // lfsr bits: 0b11011011010010011
+ 89351, // lfsr bits: 0b11011100000110010
+ 106550, // lfsr bits: 0b11100000101001101
+ 24053, // lfsr bits: 0b11100101010100011
+ 80788, // lfsr bits: 0b11101001001011100
+ 54980, // lfsr bits: 0b11101100101101011
+ 68768, // lfsr bits: 0b11110011110111100
+ 53320, // lfsr bits: 0b11110100110011100
+ 61925, // lfsr bits: 0b11111010111100010
+ 99688, // lfsr bits: 0b11111110011100100
+ },
+ {
+ // Polynomial: 22
+ 82509, // lfsr bits: 0b00000001110101011
+ 15477, // lfsr bits: 0b00000100100100100
+ 103090, // lfsr bits: 0b00001000100010111
+ 92774, // lfsr bits: 0b00001110011011000
+ 61849, // lfsr bits: 0b00010010101000101
+ 6907, // lfsr bits: 0b00010111111101110
+ 29225, // lfsr bits: 0b00011010011100010
+ 8573, // lfsr bits: 0b00011111001110110
+ 79096, // lfsr bits: 0b00100011101010000
+ 14, // lfsr bits: 0b00100100010111010
+ 97948, // lfsr bits: 0b00101010100001011
+ 94517, // lfsr bits: 0b00101110000010000
+ 56681, // lfsr bits: 0b00110000111110111
+ 67049, // lfsr bits: 0b00110101010001010
+ 80774, // lfsr bits: 0b00111010001111110
+ 85979, // lfsr bits: 0b00111101011010110
+ 12036, // lfsr bits: 0b01000011111101001
+ 77318, // lfsr bits: 0b01000111001100100
+ 58436, // lfsr bits: 0b01001000000110110
+ 75624, // lfsr bits: 0b01001100011110001
+ 68772, // lfsr bits: 0b01010001010000010
+ 63608, // lfsr bits: 0b01010100001111101
+ 36087, // lfsr bits: 0b01011001000001000
+ 72207, // lfsr bits: 0b01011110110010100
+ 91083, // lfsr bits: 0b01100001000010100
+ 17230, // lfsr bits: 0b01100100001011001
+ 27492, // lfsr bits: 0b01101010110011011
+ 99688, // lfsr bits: 0b01101111011101101
+ 34361, // lfsr bits: 0b01110001011110001
+ 5186, // lfsr bits: 0b01110111100011100
+ 32696, // lfsr bits: 0b01111011001010101
+ 70444, // lfsr bits: 0b01111110011110101
+ 44690, // lfsr bits: 0b10000000110100010
+ 20622, // lfsr bits: 0b10000110000011111
+ 49852, // lfsr bits: 0b10001001101011100
+ 106515, // lfsr bits: 0b10001101001000010
+ 18944, // lfsr bits: 0b10010011001111011
+ 46427, // lfsr bits: 0b10010101111010101
+ 1696, // lfsr bits: 0b10011011010110111
+ 39567, // lfsr bits: 0b10011111010111010
+ 51534, // lfsr bits: 0b10100011100111101
+ 22301, // lfsr bits: 0b10100111111011001
+ 10307, // lfsr bits: 0b10101001000001111
+ 65326, // lfsr bits: 0b10101110000001000
+ 60108, // lfsr bits: 0b10110010110110100
+ 30938, // lfsr bits: 0b10110101000111010
+ 53267, // lfsr bits: 0b10111001000010001
+ 89334, // lfsr bits: 0b10111100001011010
+ 25783, // lfsr bits: 0b11000001011111011
+ 24058, // lfsr bits: 0b11000100011000010
+ 48136, // lfsr bits: 0b11001001101110001
+ 3414, // lfsr bits: 0b11001101011011100
+ 73909, // lfsr bits: 0b11010011001101001
+ 87639, // lfsr bits: 0b11010101011001010
+ 43008, // lfsr bits: 0b11011010010001101
+ 84233, // lfsr bits: 0b11011110011100010
+ 108258, // lfsr bits: 0b11100000110000001
+ 41275, // lfsr bits: 0b11100111100000011
+ 96227, // lfsr bits: 0b11101000111110000
+ 54999, // lfsr bits: 0b11101111101111000
+ 101417, // lfsr bits: 0b11110010100101100
+ 13766, // lfsr bits: 0b11110101101100110
+ 104835, // lfsr bits: 0b11111010010010000
+ 37799, // lfsr bits: 0b11111100101010000
+ },
+ {
+ // Polynomial: 23
+ 58414, // lfsr bits: 0b00000011011111100
+ 70453, // lfsr bits: 0b00000101011111100
+ 108296, // lfsr bits: 0b00001010011001000
+ 24048, // lfsr bits: 0b00001110001100111
+ 49876, // lfsr bits: 0b00010000100100001
+ 85902, // lfsr bits: 0b00010101101101110
+ 32633, // lfsr bits: 0b00011000111111001
+ 39519, // lfsr bits: 0b00011110101001000
+ 41208, // lfsr bits: 0b00100000101111000
+ 77326, // lfsr bits: 0b00100110100000001
+ 92795, // lfsr bits: 0b00101010110111100
+ 18926, // lfsr bits: 0b00101100001000110
+ 22354, // lfsr bits: 0b00110001111000001
+ 89368, // lfsr bits: 0b00110100010100010
+ 94522, // lfsr bits: 0b00111001011010101
+ 1729, // lfsr bits: 0b00111111001110011
+ 96250, // lfsr bits: 0b01000010100110011
+ 63606, // lfsr bits: 0b01000110000010001
+ 61899, // lfsr bits: 0b01001011111010001
+ 54975, // lfsr bits: 0b01001100110111010
+ 99676, // lfsr bits: 0b01010001111110010
+ 80772, // lfsr bits: 0b01010110101111011
+ 17, // lfsr bits: 0b01011011110001001
+ 53237, // lfsr bits: 0b01011110000011001
+ 15454, // lfsr bits: 0b01100000010000111
+ 65304, // lfsr bits: 0b01100111000100110
+ 10304, // lfsr bits: 0b01101001111000011
+ 25795, // lfsr bits: 0b01101111000111110
+ 101385, // lfsr bits: 0b01110010111100010
+ 75595, // lfsr bits: 0b01110101010101101
+ 48079, // lfsr bits: 0b01111000011100000
+ 44689, // lfsr bits: 0b01111111010001001
+ 82508, // lfsr bits: 0b10000010110111011
+ 34394, // lfsr bits: 0b10000111111101101
+ 87656, // lfsr bits: 0b10001000011110010
+ 29189, // lfsr bits: 0b10001101100100100
+ 84200, // lfsr bits: 0b10010011110100110
+ 12031, // lfsr bits: 0b10010101110111101
+ 17186, // lfsr bits: 0b10011010110010101
+ 72232, // lfsr bits: 0b10011100011101011
+ 3461, // lfsr bits: 0b10100010100011000
+ 30896, // lfsr bits: 0b10100101101100001
+ 13751, // lfsr bits: 0b10101000011100010
+ 46408, // lfsr bits: 0b10101111000001011
+ 8589, // lfsr bits: 0b10110000111110110
+ 106596, // lfsr bits: 0b10110111101011010
+ 79079, // lfsr bits: 0b10111010000101101
+ 36088, // lfsr bits: 0b10111100010111000
+ 56754, // lfsr bits: 0b11000010100111010
+ 51607, // lfsr bits: 0b11000110100100001
+ 42977, // lfsr bits: 0b11001011010111001
+ 104823, // lfsr bits: 0b11001110111011011
+ 68771, // lfsr bits: 0b11010001101011010
+ 73894, // lfsr bits: 0b11010100000110110
+ 66992, // lfsr bits: 0b11011010101101000
+ 103153, // lfsr bits: 0b11011111011011010
+ 5166, // lfsr bits: 0b11100000001010011
+ 91071, // lfsr bits: 0b11100110111110000
+ 60145, // lfsr bits: 0b11101000101100010
+ 6888, // lfsr bits: 0b11101100001101010
+ 37812, // lfsr bits: 0b11110011111011100
+ 97942, // lfsr bits: 0b11110101110111100
+ 20627, // lfsr bits: 0b11111010010011001
+ 27485, // lfsr bits: 0b11111100010110100
+ },
+ {
+ // Polynomial: 24
+ 94577, // lfsr bits: 0b00000000010101110
+ 11, // lfsr bits: 0b00000111000000110
+ 44702, // lfsr bits: 0b00001011111001001
+ 17189, // lfsr bits: 0b00001111001100010
+ 91089, // lfsr bits: 0b00010010000110111
+ 58442, // lfsr bits: 0b00010111111011011
+ 67054, // lfsr bits: 0b00011011010001000
+ 96282, // lfsr bits: 0b00011100001110011
+ 34380, // lfsr bits: 0b00100010010001111
+ 12005, // lfsr bits: 0b00100111110010101
+ 53265, // lfsr bits: 0b00101010011101010
+ 39544, // lfsr bits: 0b00101101011011101
+ 61894, // lfsr bits: 0b00110010100100010
+ 20624, // lfsr bits: 0b00110100111000101
+ 103132, // lfsr bits: 0b00111010111111000
+ 48101, // lfsr bits: 0b00111111101110110
+ 85935, // lfsr bits: 0b01000011101000010
+ 79022, // lfsr bits: 0b01000101010000111
+ 108270, // lfsr bits: 0b01001000000010000
+ 3408, // lfsr bits: 0b01001111001011011
+ 32666, // lfsr bits: 0b01010000100110111
+ 42971, // lfsr bits: 0b01010101011111110
+ 106553, // lfsr bits: 0b01011010001101111
+ 10344, // lfsr bits: 0b01011101110000101
+ 37772, // lfsr bits: 0b01100000011001000
+ 6874, // lfsr bits: 0b01100100011100110
+ 104885, // lfsr bits: 0b01101011001110110
+ 8587, // lfsr bits: 0b01101111110000001
+ 97983, // lfsr bits: 0b01110010111010000
+ 80774, // lfsr bits: 0b01110111101100011
+ 49821, // lfsr bits: 0b01111011000001011
+ 46390, // lfsr bits: 0b01111101100110000
+ 77342, // lfsr bits: 0b10000001110111100
+ 51538, // lfsr bits: 0b10000111010011000
+ 29220, // lfsr bits: 0b10001001010111110
+ 101409, // lfsr bits: 0b10001101101100101
+ 68779, // lfsr bits: 0b10010001010101010
+ 13713, // lfsr bits: 0b10010100000000110
+ 75627, // lfsr bits: 0b10011010011011011
+ 15471, // lfsr bits: 0b10011101111000010
+ 70424, // lfsr bits: 0b10100000100000100
+ 1725, // lfsr bits: 0b10100111110101110
+ 41240, // lfsr bits: 0b10101000100110000
+ 87646, // lfsr bits: 0b10101111001101110
+ 18913, // lfsr bits: 0b10110001110111111
+ 82511, // lfsr bits: 0b10110110011111111
+ 27535, // lfsr bits: 0b10111001001010110
+ 99668, // lfsr bits: 0b10111110011100100
+ 89386, // lfsr bits: 0b11000000110110011
+ 73904, // lfsr bits: 0b11000100110000001
+ 25781, // lfsr bits: 0b11001000010000010
+ 60153, // lfsr bits: 0b11001101101111101
+ 92807, // lfsr bits: 0b11010001100001000
+ 72179, // lfsr bits: 0b11010101111011101
+ 30935, // lfsr bits: 0b11011011110010011
+ 36062, // lfsr bits: 0b11011110101100010
+ 5156, // lfsr bits: 0b11100001100001101
+ 22333, // lfsr bits: 0b11100100001110000
+ 55019, // lfsr bits: 0b11101011001110111
+ 56716, // lfsr bits: 0b11101100001110001
+ 65281, // lfsr bits: 0b11110011000001100
+ 63631, // lfsr bits: 0b11110100110010001
+ 24058, // lfsr bits: 0b11111000100010011
+ 84221, // lfsr bits: 0b11111100111110101
+ },
+ {
+ // Polynomial: 25
+ 30946, // lfsr bits: 0b00000001010110110
+ 103087, // lfsr bits: 0b00000100001001001
+ 106578, // lfsr bits: 0b00001001101000110
+ 36084, // lfsr bits: 0b00001100100101101
+ 92818, // lfsr bits: 0b00010000001011100
+ 1704, // lfsr bits: 0b00010110101110111
+ 48127, // lfsr bits: 0b00011011111001111
+ 67021, // lfsr bits: 0b00011111000010011
+ 72206, // lfsr bits: 0b00100010001000101
+ 97986, // lfsr bits: 0b00100100101111011
+ 14, // lfsr bits: 0b00101011001001011
+ 101389, // lfsr bits: 0b00101110110001110
+ 12033, // lfsr bits: 0b00110011100101010
+ 24079, // lfsr bits: 0b00110111101110100
+ 44700, // lfsr bits: 0b00111010011000001
+ 18898, // lfsr bits: 0b00111101010011000
+ 91082, // lfsr bits: 0b01000011101011001
+ 77315, // lfsr bits: 0b01000101011001111
+ 51600, // lfsr bits: 0b01001011111100100
+ 108269, // lfsr bits: 0b01001111001011111
+ 82477, // lfsr bits: 0b01010000110000000
+ 80793, // lfsr bits: 0b01010111110001010
+ 8608, // lfsr bits: 0b01011000100111010
+ 46370, // lfsr bits: 0b01011110010101101
+ 25744, // lfsr bits: 0b01100011111101000
+ 70503, // lfsr bits: 0b01100110100101001
+ 75607, // lfsr bits: 0b01101000100011001
+ 15492, // lfsr bits: 0b01101100100001100
+ 53253, // lfsr bits: 0b01110010110110001
+ 39566, // lfsr bits: 0b01110101110001011
+ 58438, // lfsr bits: 0b01111001110011100
+ 85934, // lfsr bits: 0b01111101111010111
+ 94540, // lfsr bits: 0b10000001000111101
+ 65317, // lfsr bits: 0b10000101001100100
+ 22333, // lfsr bits: 0b10001000000001010
+ 61903, // lfsr bits: 0b10001111000011010
+ 17171, // lfsr bits: 0b10010001010111101
+ 13740, // lfsr bits: 0b10010100000110001
+ 87648, // lfsr bits: 0b10011001001111010
+ 49863, // lfsr bits: 0b10011100111000101
+ 10311, // lfsr bits: 0b10100001101100011
+ 63567, // lfsr bits: 0b10100100010011010
+ 20660, // lfsr bits: 0b10101000011110101
+ 32677, // lfsr bits: 0b10101111000010000
+ 29226, // lfsr bits: 0b10110010100001000
+ 68752, // lfsr bits: 0b10110111101001100
+ 73915, // lfsr bits: 0b10111010000101001
+ 42982, // lfsr bits: 0b10111111011011011
+ 99692, // lfsr bits: 0b11000000100101011
+ 27477, // lfsr bits: 0b11000100100101011
+ 37807, // lfsr bits: 0b11001010110001110
+ 41245, // lfsr bits: 0b11001101101001000
+ 104878, // lfsr bits: 0b11010000000100101
+ 6869, // lfsr bits: 0b11010101001000110
+ 60155, // lfsr bits: 0b11011000001110010
+ 5131, // lfsr bits: 0b11011110110110011
+ 79053, // lfsr bits: 0b11100001010100001
+ 56721, // lfsr bits: 0b11100101100111010
+ 96248, // lfsr bits: 0b11101011111100111
+ 84259, // lfsr bits: 0b11101100101011111
+ 89417, // lfsr bits: 0b11110010101001100
+ 34385, // lfsr bits: 0b11110110110101100
+ 3452, // lfsr bits: 0b11111000011011011
+ 55011, // lfsr bits: 0b11111101111101100
+ },
+ {
+ // Polynomial: 26
+ 92853, // lfsr bits: 0b00000001100000011
+ 96241, // lfsr bits: 0b00000110101001011
+ 10298, // lfsr bits: 0b00001010010100001
+ 13775, // lfsr bits: 0b00001101110000000
+ 37820, // lfsr bits: 0b00010011000111111
+ 17226, // lfsr bits: 0b00010101110010110
+ 108323, // lfsr bits: 0b00011000001100100
+ 103135, // lfsr bits: 0b00011101101010111
+ 48105, // lfsr bits: 0b00100010111110110
+ 14, // lfsr bits: 0b00100101100100011
+ 63610, // lfsr bits: 0b00101000100111100
+ 79065, // lfsr bits: 0b00101110101001110
+ 54973, // lfsr bits: 0b00110001000011010
+ 70451, // lfsr bits: 0b00110101011010000
+ 41272, // lfsr bits: 0b00111000001001011
+ 49816, // lfsr bits: 0b00111100100000001
+ 3390, // lfsr bits: 0b01000000101001110
+ 42936, // lfsr bits: 0b01000101100101001
+ 91143, // lfsr bits: 0b01001011100111101
+ 56742, // lfsr bits: 0b01001111111000110
+ 24064, // lfsr bits: 0b01010011010010010
+ 12078, // lfsr bits: 0b01010100111000101
+ 60193, // lfsr bits: 0b01011001101011000
+ 5110, // lfsr bits: 0b01011111100010110
+ 30954, // lfsr bits: 0b01100000111100101
+ 46393, // lfsr bits: 0b01100101010111111
+ 80741, // lfsr bits: 0b01101000101011000
+ 27459, // lfsr bits: 0b01101110100100100
+ 34374, // lfsr bits: 0b01110001110000001
+ 15466, // lfsr bits: 0b01110110010100011
+ 61853, // lfsr bits: 0b01111000101011010
+ 89369, // lfsr bits: 0b01111111101001101
+ 8633, // lfsr bits: 0b10000000100011101
+ 51535, // lfsr bits: 0b10000111110101000
+ 101372, // lfsr bits: 0b10001001010010110
+ 85918, // lfsr bits: 0b10001110110100000
+ 36072, // lfsr bits: 0b10010000111010100
+ 84210, // lfsr bits: 0b10010111010110101
+ 6864, // lfsr bits: 0b10011000110111010
+ 44708, // lfsr bits: 0b10011110010001101
+ 99695, // lfsr bits: 0b10100010111010101
+ 32654, // lfsr bits: 0b10100111111011111
+ 72206, // lfsr bits: 0b10101001101101001
+ 18880, // lfsr bits: 0b10101111000101100
+ 73862, // lfsr bits: 0b10110011110111101
+ 75624, // lfsr bits: 0b10110110111101111
+ 25786, // lfsr bits: 0b10111000111010110
+ 67049, // lfsr bits: 0b10111101000101011
+ 22391, // lfsr bits: 0b11000000111110000
+ 29197, // lfsr bits: 0b11000110101101100
+ 53265, // lfsr bits: 0b11001011011010111
+ 1713, // lfsr bits: 0b11001101001011010
+ 65319, // lfsr bits: 0b11010011011011110
+ 77366, // lfsr bits: 0b11010111101000010
+ 68753, // lfsr bits: 0b11011011111110000
+ 39501, // lfsr bits: 0b11011111010001110
+ 94532, // lfsr bits: 0b11100010010010000
+ 58457, // lfsr bits: 0b11100101010001011
+ 104802, // lfsr bits: 0b11101010111000000
+ 82537, // lfsr bits: 0b11101110111010010
+ 97991, // lfsr bits: 0b11110001101100101
+ 106599, // lfsr bits: 0b11110100111001100
+ 87643, // lfsr bits: 0b11111001101011000
+ 20622, // lfsr bits: 0b11111101001111100
+ },
+ {
+ // Polynomial: 27
+ 60151, // lfsr bits: 0b00000010000011110
+ 41273, // lfsr bits: 0b00000110111011000
+ 25766, // lfsr bits: 0b00001011110111001
+ 58435, // lfsr bits: 0b00001110000011111
+ 70479, // lfsr bits: 0b00010000111000011
+ 13, // lfsr bits: 0b00010111110000001
+ 73918, // lfsr bits: 0b00011011000010010
+ 68778, // lfsr bits: 0b00011111001010010
+ 82522, // lfsr bits: 0b00100011111111011
+ 49870, // lfsr bits: 0b00100101101010001
+ 84213, // lfsr bits: 0b00101011010110111
+ 36098, // lfsr bits: 0b00101101011011011
+ 85912, // lfsr bits: 0b00110001001111100
+ 13755, // lfsr bits: 0b00110110001100110
+ 65294, // lfsr bits: 0b00111000010000101
+ 29214, // lfsr bits: 0b00111111100111011
+ 108285, // lfsr bits: 0b01000000100111011
+ 24055, // lfsr bits: 0b01000111011110100
+ 79088, // lfsr bits: 0b01001000000010101
+ 106571, // lfsr bits: 0b01001110011111100
+ 54999, // lfsr bits: 0b01010010011001100
+ 77360, // lfsr bits: 0b01010100110011110
+ 5190, // lfsr bits: 0b01011011100010100
+ 63576, // lfsr bits: 0b01011111000000101
+ 61874, // lfsr bits: 0b01100001110010111
+ 1711, // lfsr bits: 0b01100101100001110
+ 103112, // lfsr bits: 0b01101000111111010
+ 104879, // lfsr bits: 0b01101100110100110
+ 15513, // lfsr bits: 0b01110000011011001
+ 96237, // lfsr bits: 0b01110110100110110
+ 91085, // lfsr bits: 0b01111001001110101
+ 34361, // lfsr bits: 0b01111110111010001
+ 6849, // lfsr bits: 0b10000011000111011
+ 20618, // lfsr bits: 0b10000101011001110
+ 97968, // lfsr bits: 0b10001010000010011
+ 30973, // lfsr bits: 0b10001101100001001
+ 53300, // lfsr bits: 0b10010010110010000
+ 46408, // lfsr bits: 0b10010110101100010
+ 10316, // lfsr bits: 0b10011010011100011
+ 27469, // lfsr bits: 0b10011110010000001
+ 22360, // lfsr bits: 0b10100000100000111
+ 80776, // lfsr bits: 0b10100111001101101
+ 3430, // lfsr bits: 0b10101000000001110
+ 32665, // lfsr bits: 0b10101111111011000
+ 12019, // lfsr bits: 0b10110010011100110
+ 37769, // lfsr bits: 0b10110101010001110
+ 56724, // lfsr bits: 0b10111011001001111
+ 51548, // lfsr bits: 0b10111100101000001
+ 92781, // lfsr bits: 0b11000001010001011
+ 44721, // lfsr bits: 0b11000110011000001
+ 101414, // lfsr bits: 0b11001011011111110
+ 94541, // lfsr bits: 0b11001111011110110
+ 89372, // lfsr bits: 0b11010000001011101
+ 87652, // lfsr bits: 0b11010111110111011
+ 17170, // lfsr bits: 0b11011010010011010
+ 42970, // lfsr bits: 0b11011111100010011
+ 99705, // lfsr bits: 0b11100000101100010
+ 18907, // lfsr bits: 0b11100111110011000
+ 75625, // lfsr bits: 0b11101010100001101
+ 67020, // lfsr bits: 0b11101110001011001
+ 8597, // lfsr bits: 0b11110011000100100
+ 48171, // lfsr bits: 0b11110110100011010
+ 39532, // lfsr bits: 0b11111011000000001
+ 72153, // lfsr bits: 0b11111101100000000
+ },
+ {
+ // Polynomial: 28
+ 15434, // lfsr bits: 0b00000011101101101
+ 103095, // lfsr bits: 0b00000111110001010
+ 39544, // lfsr bits: 0b00001001100000101
+ 12019, // lfsr bits: 0b00001111100001000
+ 68773, // lfsr bits: 0b00010011111100000
+ 27501, // lfsr bits: 0b00010101000111100
+ 94495, // lfsr bits: 0b00011010100001111
+ 46372, // lfsr bits: 0b00011111011101000
+ 10307, // lfsr bits: 0b00100000011111000
+ 72209, // lfsr bits: 0b00100110100010101
+ 29210, // lfsr bits: 0b00101011001111100
+ 65309, // lfsr bits: 0b00101111011101101
+ 87633, // lfsr bits: 0b00110011110000100
+ 20612, // lfsr bits: 0b00110101010111010
+ 34380, // lfsr bits: 0b00111001111100010
+ 24096, // lfsr bits: 0b00111101011101100
+ 6847, // lfsr bits: 0b01000011110000010
+ 32635, // lfsr bits: 0b01000110110110101
+ 48134, // lfsr bits: 0b01001010110111100
+ 80810, // lfsr bits: 0b01001100100101100
+ 104870, // lfsr bits: 0b01010011010100011
+ 82513, // lfsr bits: 0b01010111101111100
+ 13763, // lfsr bits: 0b01011001001100101
+ 70477, // lfsr bits: 0b01011111011001101
+ 99695, // lfsr bits: 0b01100010111111110
+ 53263, // lfsr bits: 0b01100100010111000
+ 44721, // lfsr bits: 0b01101011111001011
+ 63637, // lfsr bits: 0b01101111110001100
+ 60124, // lfsr bits: 0b01110010111111110
+ 27, // lfsr bits: 0b01110101000011101
+ 25769, // lfsr bits: 0b01111001010011101
+ 67038, // lfsr bits: 0b01111111001000010
+ 75585, // lfsr bits: 0b10000001110001111
+ 89350, // lfsr bits: 0b10000111110111011
+ 56679, // lfsr bits: 0b10001001101110110
+ 84206, // lfsr bits: 0b10001100111111110
+ 92811, // lfsr bits: 0b10010000001001101
+ 42960, // lfsr bits: 0b10010111001111011
+ 3465, // lfsr bits: 0b10011000010110110
+ 108250, // lfsr bits: 0b10011100001001011
+ 5152, // lfsr bits: 0b10100000000000101
+ 98010, // lfsr bits: 0b10100110111001000
+ 30893, // lfsr bits: 0b10101011111001111
+ 73885, // lfsr bits: 0b10101110101010011
+ 96217, // lfsr bits: 0b10110000010010011
+ 1699, // lfsr bits: 0b10110111100011111
+ 36062, // lfsr bits: 0b10111000111101111
+ 91063, // lfsr bits: 0b10111110001000010
+ 77378, // lfsr bits: 0b11000010111111000
+ 79053, // lfsr bits: 0b11000101111101001
+ 101423, // lfsr bits: 0b11001000100101110
+ 58452, // lfsr bits: 0b11001100000100111
+ 37796, // lfsr bits: 0b11010010000111100
+ 18913, // lfsr bits: 0b11010100010001000
+ 106543, // lfsr bits: 0b11011010011110100
+ 85903, // lfsr bits: 0b11011101001111101
+ 8598, // lfsr bits: 0b11100011010111010
+ 22353, // lfsr bits: 0b11100101010100000
+ 55047, // lfsr bits: 0b11101000100110010
+ 17159, // lfsr bits: 0b11101101111001100
+ 41262, // lfsr bits: 0b11110010100110000
+ 61912, // lfsr bits: 0b11110110001111001
+ 51539, // lfsr bits: 0b11111001101100010
+ 49808, // lfsr bits: 0b11111100010111000
+ },
+ {
+ // Polynomial: 29
+ 82506, // lfsr bits: 0b00000010000111000
+ 96232, // lfsr bits: 0b00000100111010001
+ 36083, // lfsr bits: 0b00001010011010001
+ 20661, // lfsr bits: 0b00001100111001101
+ 15465, // lfsr bits: 0b00010001011000101
+ 43, // lfsr bits: 0b00010111010001100
+ 89388, // lfsr bits: 0b00011011000000111
+ 70459, // lfsr bits: 0b00011110011011010
+ 99722, // lfsr bits: 0b00100011101100100
+ 87637, // lfsr bits: 0b00100110101010011
+ 79022, // lfsr bits: 0b00101010011101110
+ 6888, // lfsr bits: 0b00101111000100011
+ 103079, // lfsr bits: 0b00110000000111110
+ 13704, // lfsr bits: 0b00110100111100100
+ 37808, // lfsr bits: 0b00111011111010000
+ 29259, // lfsr bits: 0b00111100011101101
+ 32655, // lfsr bits: 0b01000000111110100
+ 80796, // lfsr bits: 0b01000111111011011
+ 46445, // lfsr bits: 0b01001011111111011
+ 18863, // lfsr bits: 0b01001100011101011
+ 60187, // lfsr bits: 0b01010001001010011
+ 73913, // lfsr bits: 0b01010110101100001
+ 77348, // lfsr bits: 0b01011001011110000
+ 44718, // lfsr bits: 0b01011110110001111
+ 24043, // lfsr bits: 0b01100011101110001
+ 53264, // lfsr bits: 0b01100111101011110
+ 5170, // lfsr bits: 0b01101011001011011
+ 56714, // lfsr bits: 0b01101100110101000
+ 58428, // lfsr bits: 0b01110001000101010
+ 61904, // lfsr bits: 0b01110101001100000
+ 27522, // lfsr bits: 0b01111011001001101
+ 92795, // lfsr bits: 0b01111111010101111
+ 48114, // lfsr bits: 0b10000011111110010
+ 94542, // lfsr bits: 0b10000111011010001
+ 63592, // lfsr bits: 0b10001001111101101
+ 42954, // lfsr bits: 0b10001101000010000
+ 75668, // lfsr bits: 0b10010010001111110
+ 104842, // lfsr bits: 0b10010111100100101
+ 106529, // lfsr bits: 0b10011000010110111
+ 10318, // lfsr bits: 0b10011100101010001
+ 17161, // lfsr bits: 0b10100000111101110
+ 84221, // lfsr bits: 0b10100101001000100
+ 11991, // lfsr bits: 0b10101001001000001
+ 108285, // lfsr bits: 0b10101111100100000
+ 30927, // lfsr bits: 0b10110001011111011
+ 91052, // lfsr bits: 0b10110111000101000
+ 97996, // lfsr bits: 0b10111011001011010
+ 25793, // lfsr bits: 0b10111101001110011
+ 49824, // lfsr bits: 0b11000010100101000
+ 22301, // lfsr bits: 0b11000111111010000
+ 3469, // lfsr bits: 0b11001000001110110
+ 39544, // lfsr bits: 0b11001101001000111
+ 8612, // lfsr bits: 0b11010010101100011
+ 67015, // lfsr bits: 0b11010100101101111
+ 34335, // lfsr bits: 0b11011001000010111
+ 41233, // lfsr bits: 0b11011111111100001
+ 55011, // lfsr bits: 0b11100010000110000
+ 65336, // lfsr bits: 0b11100101110001110
+ 101392, // lfsr bits: 0b11101000000111110
+ 72201, // lfsr bits: 0b11101111110101110
+ 51524, // lfsr bits: 0b11110000000100111
+ 85939, // lfsr bits: 0b11110110101111110
+ 1731, // lfsr bits: 0b11111000000011010
+ 68731, // lfsr bits: 0b11111101001001100
+ },
+ {
+ // Polynomial: 30
+ 22385, // lfsr bits: 0b00000011100011111
+ 11, // lfsr bits: 0b00000100001010101
+ 106601, // lfsr bits: 0b00001001101011101
+ 27537, // lfsr bits: 0b00001101101000011
+ 36101, // lfsr bits: 0b00010010001011010
+ 97930, // lfsr bits: 0b00010101101000011
+ 30961, // lfsr bits: 0b00011010001101110
+ 1708, // lfsr bits: 0b00011111110111100
+ 72232, // lfsr bits: 0b00100010111110101
+ 48142, // lfsr bits: 0b00100111100011010
+ 10306, // lfsr bits: 0b00101010010010010
+ 17230, // lfsr bits: 0b00101101000111011
+ 67034, // lfsr bits: 0b00110001110100000
+ 3444, // lfsr bits: 0b00110100111110011
+ 101398, // lfsr bits: 0b00111011110010010
+ 96221, // lfsr bits: 0b00111100010100000
+ 103155, // lfsr bits: 0b01000011010100101
+ 49868, // lfsr bits: 0b01000111110101000
+ 61891, // lfsr bits: 0b01001000111000011
+ 92855, // lfsr bits: 0b01001101001110111
+ 75670, // lfsr bits: 0b01010010111101111
+ 70462, // lfsr bits: 0b01010111100110000
+ 68751, // lfsr bits: 0b01011001110101110
+ 41211, // lfsr bits: 0b01011100101100000
+ 65326, // lfsr bits: 0b01100011101001101
+ 39522, // lfsr bits: 0b01100100001010110
+ 58428, // lfsr bits: 0b01101001110101111
+ 51588, // lfsr bits: 0b01101110100010011
+ 8634, // lfsr bits: 0b01110001001111001
+ 46357, // lfsr bits: 0b01110110000010111
+ 94517, // lfsr bits: 0b01111010000101110
+ 63558, // lfsr bits: 0b01111110001110000
+ 37805, // lfsr bits: 0b10000010011101011
+ 73921, // lfsr bits: 0b10000111110000001
+ 15477, // lfsr bits: 0b10001000111000101
+ 87660, // lfsr bits: 0b10001100110100111
+ 12021, // lfsr bits: 0b10010001111111101
+ 56684, // lfsr bits: 0b10010110110001100
+ 42990, // lfsr bits: 0b10011001110110100
+ 44661, // lfsr bits: 0b10011100010000111
+ 32661, // lfsr bits: 0b10100011000010010
+ 25762, // lfsr bits: 0b10100100010100011
+ 84205, // lfsr bits: 0b10101001111000010
+ 85968, // lfsr bits: 0b10101110010001011
+ 99697, // lfsr bits: 0b10110011100101001
+ 6908, // lfsr bits: 0b10110100101111100
+ 108262, // lfsr bits: 0b10111000100010011
+ 89337, // lfsr bits: 0b10111110001110000
+ 20598, // lfsr bits: 0b11000000000011011
+ 5175, // lfsr bits: 0b11000110010100011
+ 60183, // lfsr bits: 0b11001001001001001
+ 24022, // lfsr bits: 0b11001101110101101
+ 79043, // lfsr bits: 0b11010000101001000
+ 82504, // lfsr bits: 0b11010101010011100
+ 80786, // lfsr bits: 0b11011011011101011
+ 55031, // lfsr bits: 0b11011100011010010
+ 18932, // lfsr bits: 0b11100000001001000
+ 29242, // lfsr bits: 0b11100111010101010
+ 104876, // lfsr bits: 0b11101000100111001
+ 13735, // lfsr bits: 0b11101110011100010
+ 91066, // lfsr bits: 0b11110001111010100
+ 53279, // lfsr bits: 0b11110110101010100
+ 34406, // lfsr bits: 0b11111011001001011
+ 77335, // lfsr bits: 0b11111100111001001
+ },
+ {
+ // Polynomial: 31
+ 72162, // lfsr bits: 0b00000010101101100
+ 22338, // lfsr bits: 0b00000101010111100
+ 49849, // lfsr bits: 0b00001001101011101
+ 25776, // lfsr bits: 0b00001110010001010
+ 82504, // lfsr bits: 0b00010000111100100
+ 42968, // lfsr bits: 0b00010100101000101
+ 60180, // lfsr bits: 0b00011000011010010
+ 39526, // lfsr bits: 0b00011111101001110
+ 70436, // lfsr bits: 0b00100001101101000
+ 3444, // lfsr bits: 0b00100111111101100
+ 30925, // lfsr bits: 0b00101000011100011
+ 56741, // lfsr bits: 0b00101101011010100
+ 8591, // lfsr bits: 0b00110000111110011
+ 101402, // lfsr bits: 0b00110111010101000
+ 103151, // lfsr bits: 0b00111000010101010
+ 5135, // lfsr bits: 0b00111110111011111
+ 32660, // lfsr bits: 0b01000001000111010
+ 36113, // lfsr bits: 0b01000110111000010
+ 65295, // lfsr bits: 0b01001011001101011
+ 1714, // lfsr bits: 0b01001111100010000
+ 67026, // lfsr bits: 0b01010000100010110
+ 106559, // lfsr bits: 0b01010110001100110
+ 80787, // lfsr bits: 0b01011001101100001
+ 104873, // lfsr bits: 0b01011100110001110
+ 68762, // lfsr bits: 0b01100011001001010
+ 43, // lfsr bits: 0b01100110110100011
+ 51552, // lfsr bits: 0b01101011001000110
+ 92826, // lfsr bits: 0b01101110010001011
+ 63577, // lfsr bits: 0b01110011110100000
+ 44645, // lfsr bits: 0b01110101111111001
+ 108245, // lfsr bits: 0b01111000101110100
+ 27486, // lfsr bits: 0b01111101100010010
+ 89379, // lfsr bits: 0b10000010011011100
+ 18907, // lfsr bits: 0b10000101101111100
+ 46407, // lfsr bits: 0b10001000110001010
+ 17204, // lfsr bits: 0b10001110000000110
+ 12036, // lfsr bits: 0b10010010111110001
+ 97960, // lfsr bits: 0b10010110100111110
+ 61863, // lfsr bits: 0b10011001011001000
+ 6863, // lfsr bits: 0b10011110110010001
+ 85948, // lfsr bits: 0b10100000100100101
+ 29221, // lfsr bits: 0b10100100111010000
+ 91094, // lfsr bits: 0b10101001100000001
+ 10302, // lfsr bits: 0b10101111001010100
+ 34388, // lfsr bits: 0b10110010011111100
+ 96267, // lfsr bits: 0b10110110001011111
+ 48140, // lfsr bits: 0b10111011001001100
+ 84224, // lfsr bits: 0b10111111100110101
+ 58470, // lfsr bits: 0b11000000010100011
+ 54969, // lfsr bits: 0b11000100011001001
+ 73927, // lfsr bits: 0b11001000011001011
+ 75637, // lfsr bits: 0b11001101110111010
+ 37812, // lfsr bits: 0b11010011110011000
+ 79060, // lfsr bits: 0b11010100101100001
+ 77330, // lfsr bits: 0b11011000000000100
+ 15453, // lfsr bits: 0b11011110010110101
+ 13780, // lfsr bits: 0b11100010001000101
+ 94529, // lfsr bits: 0b11100100100000111
+ 20634, // lfsr bits: 0b11101010110011110
+ 87695, // lfsr bits: 0b11101111101111111
+ 24035, // lfsr bits: 0b11110010000011101
+ 53307, // lfsr bits: 0b11110111001010001
+ 99680, // lfsr bits: 0b11111010000011011
+ 41223, // lfsr bits: 0b11111100111011101
+ },
+};
+
+#endif /* __LH2_CHECKPOINTS_H_ */
diff --git a/bsp/lh2_decoder.h b/bsp/lh2_decoder.h
new file mode 100644
index 0000000..07a606e
--- /dev/null
+++ b/bsp/lh2_decoder.h
@@ -0,0 +1,92 @@
+#ifndef __LH2_DECODER_H_
+#define __LH2_DECODER_H_
+
+/**
+ * @defgroup bsp_lh2_decoder LightHouse 2 decoder algorithms
+ * @ingroup bsp_lh2
+ * @brief Algorithm to decode the lighthouse pulses, no hardware dependencies.
+ *
+ * @{
+ * @file
+ * @author Said Alvarado-Marin
+ * @copyright Inria, 2025-present
+ * @}
+ */
+
+#include
+#include
+#include "lh2.h"
+
+//=========================== defines ==========================================
+
+#define LH2_POLYNOMIAL_ERROR_INDICATOR 0xFF ///< indicate the polynomial index is invalid
+#define LH2_LFSR_SEARCH_ERROR_INDICATOR 0xFFFFFFFF ///< indicate the polynomial index is invalid
+// Un-comment the following line if you want to enable the Anti-Mocap fiter
+#define LH2_MOCAP_FILTER 1 ///< Defined when the LH2 needs to coexits with a Qualysis Mocap system. It enables harsher anti-outlier filters
+
+// Dynamic checkpoints for the lsfr index search
+typedef struct {
+ uint32_t bits[LH2_POLYNOMIAL_COUNT][LH2_SWEEP_COUNT]; ///< lfsr pseudo-random bits of the checkpoints
+ uint32_t count[LH2_POLYNOMIAL_COUNT][LH2_SWEEP_COUNT]; ///< corresponding lfsr index of the checkpoints
+} _lfsr_checkpoint_t;
+
+//=========================== public ===========================================
+/**
+ * @brief
+ * @param[in] sample_buffer: SPI samples loaded into a local buffer
+ * @return chipsH: 64-bits of demodulated data
+ */
+uint64_t _demodulate_light(uint8_t *sample_buffer);
+
+/**
+ * @brief from a 17-bit sequence and a polynomial, generate up to 64-17=47 bits as if the LFSR specified by poly were run forwards for numbits cycles, all little endian
+ *
+ * @param[in] poly: 17-bit polynomial
+ * @param[in] bits: starting seed
+ * @param[in] numbits: number of bits
+ *
+ * @return sequence of bits resulting from running the LFSR forward
+ */
+uint64_t _poly_check(uint32_t poly, uint32_t bits, uint8_t numbits);
+
+/**
+ * @brief find out which LFSR polynomial the bit sequence is a member of
+ *
+ * @param[in] chipsH1: input sequences of bits from demodulation
+ * @param[in] start_val: number of bits between the envelope falling edge and the beginning of the sequence where valid data has been found
+ *
+ * @return polynomial, indicating which polynomial was found, or FF for error (polynomial not found).
+ */
+uint8_t _determine_polynomial(uint64_t chipsH1, int8_t *start_val);
+
+/**
+ * @brief counts the number of 1s in a 64-bit
+ *
+ * @param[in] bits_in: arbitrary bits
+ *
+ * @return cumulative number of 1s inside of bits_in
+ */
+uint64_t _hamming_weight(uint64_t bits_in);
+
+/**
+ * @brief finds the position of a 17-bit sequence (bits) in the sequence generated by polynomial3 with initial seed 1
+ *
+ * @param[in] checkpoints: structure with dynamic checkpoints
+ * @param[in] index: index of polynomial
+ * @param[in] bits: 17-bit sequence
+ *
+ * @return count: location of the sequence
+ */
+uint32_t _lfsr_index_search(_lfsr_checkpoint_t *checkpoints, uint8_t index, uint32_t bits);
+
+/**
+ * @brief checks an SPI capture for signs of Qualysis Mocap pulses interference.
+ * returns true if interference is found, returns false otherwise
+ *
+ * @param[in] arr: pointer to the array with the SPI capture to check
+ * @param[in] size: size of the buffer array to check
+ * @return True if interference is found, False otherwise
+ */
+bool _check_mocap_interference(uint8_t *arr, uint8_t size);
+
+#endif /* __LH2_DECODER_H_ */
diff --git a/bsp/nrf/lh2_decoder.c b/bsp/nrf/lh2_decoder.c
new file mode 100644
index 0000000..0d59824
--- /dev/null
+++ b/bsp/nrf/lh2_decoder.c
@@ -0,0 +1,621 @@
+/**
+ * @file
+ * @ingroup bsp_lh2
+ *
+ * @brief RP2040-specific definition of the "lh2" bsp module.
+ *
+ * @author Filip Maksimovic
+ * @author Said Alvarado-Marin
+ * @author Alexandre Abadie
+ *
+ * @copyright Inria, 2022
+ */
+#include
+#include
+#include
+#include
+#include
+
+#include "lh2.h"
+#include "lh2_decoder.h"
+#include "lh2_checkpoints.h"
+
+//=========================== defines =========================================
+
+#define FUZZY_CHIP 0xFF ///< not sure what this is about
+#define POLYNOMIAL_BIT_ERROR_INITIAL_THRESHOLD 0 ///< tolerate no errors in received data
+// #define POLYNOMIAL_BIT_ERROR_INITIAL_THRESHOLD 4 ///< initial threshold of polynomial error
+#define HASH_TABLE_BITS 6 ///< How many bits will be used for the hashtable for the _end_buffers
+#define HASH_TABLE_MASK ((1 << HASH_TABLE_BITS) - 1) ///< Mask selecting the HAS_TABLE_BITS least significant bits
+
+// Define variables useful for debuging
+typedef uint32_t lfsr_17bits_t;
+
+//=========================== public ===========================================
+
+uint64_t _demodulate_light(uint8_t *sample_buffer) { // bad input variable name!!
+ // TODO: rename sample_buffer
+ // TODO: make it a void and have chips be a modified pointer thingie
+ // FIXME: there is an edge case where I throw away an initial "1" and do not count it in the bit-shift offset, resulting in an incorrect error of 1 in the LFSR location
+ uint8_t chip_index;
+ uint8_t local_buffer[128];
+ uint8_t zccs_1[128];
+ uint8_t chips1[128]; // TODO: give this a better name.
+ uint8_t temp_byte_N; // TODO: bad variable name "temp byte"
+ uint8_t temp_byte_M; // TODO: bad variable name "temp byte"
+
+ // initialize loop variables
+ uint8_t ii = 0x00;
+ int jj = 0;
+ int kk = 0;
+ uint64_t gg = 0;
+
+ // initialize temporary "ones counter" variable that counts consecutive ones
+ int ones_counter = 0;
+
+ // initialize result:
+ uint64_t chipsH1 = 0;
+
+ // FIND ZERO CROSSINGS
+ chip_index = 0;
+ zccs_1[chip_index] = 0x01;
+
+ memcpy(local_buffer, sample_buffer, 128);
+
+ // for loop over bytes of the SPI buffer (jj), nested with a for loop over bits in each byte (ii)
+ for (jj = 0; jj < 128; jj++) {
+ // edge case - check if last bit (LSB) of previous byte is the same as first bit (MSB) of current byte
+ // if it is not, increment chip_index and reset count
+ if (jj != 0) {
+ temp_byte_M = (local_buffer[jj - 1]) & (0x01); // previous byte's LSB
+ temp_byte_N = (local_buffer[jj] >> 7) & (0x01); // current byte's MSB
+ if (temp_byte_M != temp_byte_N) {
+ chip_index++;
+ zccs_1[chip_index] = 1;
+ } else {
+ zccs_1[chip_index] += 1;
+ }
+ }
+ // look at one byte at a time
+ for (ii = 7; ii > 0; ii--) {
+ temp_byte_M = ((local_buffer[jj]) >> (ii)) & (0x01); // bit shift by ii and mask
+ temp_byte_N = ((local_buffer[jj]) >> (ii - 1)) & (0x01); // bit shift by ii-1 and mask
+ if (temp_byte_M == temp_byte_N) {
+ zccs_1[chip_index] += 1;
+ } else {
+ chip_index++;
+ zccs_1[chip_index] = 1;
+ }
+ }
+ }
+
+ // threshold the zero crossings into: likely one chip, likely two zero chips, or fuzzy
+ for (jj = 0; jj < 128; jj++) {
+ // not memory efficient, but ok for readability, turn ZCCS into chips by thresholding
+ if (zccs_1[jj] >= 5) {
+ chips1[jj] = 0; // it's a very likely zero
+ } else if (zccs_1[jj] <= 3) {
+ chips1[jj] = 1; // it's a very likely one
+ } else {
+ chips1[jj] = FUZZY_CHIP; // fuzzy
+ }
+ }
+ // final bit is bugged, make it fuzzy:
+ // chips1[127] = 0xFF;
+
+ // DEMODULATION:
+ // basic principles, in descending order of importance:
+ // 1) an odd number of ones in a row is not allowed - this must be avoided at all costs
+ // 2) finding a solution to #1 given a set of data is quite cumbersome without certain assumptions
+ // a) a fuzzy before an odd run of 1s is almost always a 1
+ // b) a fuzzy between two even runs of 1s is almost always a 0
+ // c) a fuzzy after an even run of 1s is usually a a 0
+ // 3) a detected 1 is rarely wrong, but detected 0s can be, this is especially common in low-SNR readings
+ // exception: if the first bit is a 1 it is NOT reliable because the capture is asynchronous
+ // 4) this is not perfect, but the earlier the chip, the more likely that it is correct. Polynomials can be used to fix bit errors later in the reading
+ // known bugs/issues:
+ // 1) if there are many ones at the very beginning of the reading, the algorithm will mess it up
+ // 2) in some instances, the count value will be off by approximately 5, the origin of this bug is unknown at the moment
+ // DEMODULATE PACKET:
+
+ // reset variables:
+ kk = 0;
+ ones_counter = 0;
+ jj = 0;
+ for (jj = 0; jj < 128;) { // TODO: 128 is such an easy magic number to get rid of...
+ gg = 0; // TODO: this is not used here?
+ if (chips1[jj] == 0x00) { // zero, keep going, reset state
+ jj++;
+ ones_counter = 0;
+ }
+ if (chips1[jj] == 0x01) { // one, keep going, keep track of the # of ones
+ // k_msleep(10);
+ if (jj == 0) { // edge case - first chip = 1 is unreliable, do not increment 1s counter
+ jj++;
+ } else {
+ jj = jj + 1;
+ ones_counter = ones_counter + 1;
+ }
+ }
+
+ if ((jj == 127) & (chips1[jj] == FUZZY_CHIP)) {
+ chips1[jj] = 0x00;
+ } else if ((chips1[jj] == FUZZY_CHIP) & (ones_counter == 0)) { // fuzz after a zero
+ // k_msleep(10);
+ if (chips1[jj + 1] == 0) { // zero then fuzz then zero -> fuzz is a zero
+ jj++;
+ chips1[jj - 1] = 0;
+ } else if (chips1[jj + 1] == FUZZY_CHIP) { // zero then fuzz then fuzz -> just move on, you're probably screwed
+ // k_msleep(10);
+ jj += 2;
+ } else if (chips1[jj + 1] == 1) { // zero then fuzz then one -> investigate
+ kk = 1;
+ ones_counter = 0;
+ while (chips1[jj + kk] == 1) {
+ ones_counter++;
+ kk++;
+ }
+ if (ones_counter % 2 == 1) { // fuzz -> odd ones, the fuzz is a 1
+ jj++;
+ chips1[jj - 1] = 1;
+ ones_counter = 1;
+ } else if (ones_counter % 2 == 0) { // fuzz -> even ones, move on for now, it's indeterminate
+ jj++;
+ ones_counter = 0; // temporarily treat as a 0 for counting purposes
+ } else { // catch statement
+ jj++;
+ }
+ }
+ } else if ((chips1[jj] == FUZZY_CHIP) & (ones_counter != 0)) { // ones then fuzz
+ // k_msleep(10);
+ if ((ones_counter % 2 == 0) & (chips1[jj + 1] == 0)) { // even ones then fuzz then zero, fuzz is a zero
+ jj++;
+ chips1[jj - 1] = 0;
+ ones_counter = 0;
+ }
+ if ((ones_counter % 2 == 0) & (chips1[jj + 1] != 0)) { // even ones then fuzz then not zero - investigate
+ if (chips1[jj + 1] == 1) { // subsequent bit is a 1
+ kk = 1;
+ while (chips1[jj + kk] == 1) {
+ ones_counter++;
+ kk++;
+ }
+ if (ones_counter % 2 == 1) { // indicates an odd # of 1s, so the fuzzy has to be a 1
+ jj++;
+ chips1[jj - 1] = 1;
+ ones_counter = 1; // not actually 1, but it's ok for modulo purposes
+ } else if (ones_counter % 2 == 0) { // even ones -> fuzz -> even ones, indeterminate
+ jj++;
+ ones_counter = 0;
+ }
+ } else if (chips1[jj + 1] == FUZZY_CHIP) { // subsequent bit is a fuzzy - skip for now...
+ jj++;
+ }
+ } else if ((ones_counter % 2 == 1) & (chips1[jj + 1] == FUZZY_CHIP)) { // odd ones then fuzz then fuzz, fuzz is 1 then 0
+ jj += 2;
+ chips1[jj - 1] = 0;
+ chips1[jj - 2] = 1;
+ ones_counter = 0;
+ } else if ((ones_counter % 2 == 1) & (chips1[jj + 1] != 0)) { // odd ones then fuzz then not zero - the fuzzy has to be a 1
+ jj++;
+ ones_counter++;
+ chips1[jj - 1] = 1;
+ } else { // catch statement
+ jj++;
+ }
+ }
+ }
+ // finish up demodulation, pick off straggling fuzzies and odd runs of 1s
+ for (jj = 0; jj < 128;) {
+ if (chips1[jj] == 0x00) { // zero, keep going, reset state
+ if (ones_counter % 2 == 1) { // implies an odd # of 1s
+ chips1[jj - ones_counter - 1] = 1; // change the bit before the run of 1s to a 1 to make it even
+ }
+ jj++;
+ ones_counter = 0;
+ } else if (chips1[jj] == 0x01) { // one, keep going, keep track of the # of ones
+ if (jj == 0) { // edge case - first chip = 1 is unreliable, do not increment 1s counter
+ jj++;
+ } else {
+ jj = jj + 1;
+ ones_counter = ones_counter + 1;
+ }
+ } else if (chips1[jj] == FUZZY_CHIP) {
+ // if (ones_counter==0) { // fuzz after zeros, if the next chip is a 1, make it a 1, else make it a zero
+ // if (chips1[jj+1]==1) {
+ // jj+1;
+ // chips1[jj-1] = 1;
+ // ones_counter++;
+ // }
+ // else {
+ // jj++;
+ // }
+ // } <---- this is commented out because this is a VERY rare edge case and seems to be causing occasional problems w/ otherwise clean packets
+ if ((ones_counter != 0) & (ones_counter % 2 == 0)) { // fuzz after even ones - at this point this is almost always a 0
+ jj++;
+ chips1[jj - 1] = 0;
+ ones_counter = 0;
+ } else if (ones_counter % 2 == 1) { // fuzz after odd ones - exceedingly uncommon at this point, make it a 1
+ jj++;
+ chips1[jj - 1] = 1;
+ ones_counter++;
+ } else { // catch statement
+ jj++;
+ }
+ } else { // catch statement
+ jj++;
+ }
+ }
+
+ // next step in demodulation: take the resulting array of 1 and 0 chips and put them into a single 64-bit unsigned int
+ // this is primarily for easy manipulation for polynomial searching
+ chip_index = 0; // TODO: rename "chip index" it's not descriptive
+ chipsH1 = 0;
+ gg = 0; // looping/while break indicating variable, reset to 0
+ while (gg < 64) { // very last one - make all remaining fuzzies 0 and load it into two 64-bit longs
+ if (chip_index > 127) {
+ gg = 65; // break
+ }
+ if ((chip_index == 0) & (chips1[chip_index] == 0x01)) { // first bit is a 1 - ignore it
+ chip_index = chip_index + 1;
+ } else if ((chip_index == 0) & (chips1[chip_index] == FUZZY_CHIP)) { // first bit is fuzzy - ignore it
+ chip_index = chip_index + 1;
+ } else if (gg == 63) { // load the final bit
+ if (chips1[chip_index] == 0) {
+ chipsH1 &= 0xFFFFFFFFFFFFFFFE;
+ gg = gg + 1;
+ chip_index = chip_index + 1;
+ } else if (chips1[chip_index] == FUZZY_CHIP) {
+ chipsH1 &= 0xFFFFFFFFFFFFFFFE;
+ gg = gg + 1;
+ chip_index = chip_index + 1;
+ } else if (chips1[chip_index] == 0x01) {
+ chipsH1 |= 0x0000000000000001;
+ gg = gg + 1;
+ chip_index = chip_index + 2;
+ }
+ } else { // load the bit in!!
+ if (chips1[chip_index] == 0) {
+ chipsH1 &= 0xFFFFFFFFFFFFFFFE;
+ chipsH1 = chipsH1 << 1;
+ gg = gg + 1;
+ chip_index = chip_index + 1;
+ } else if (chips1[chip_index] == FUZZY_CHIP) {
+ chipsH1 &= 0xFFFFFFFFFFFFFFFE;
+ chipsH1 = chipsH1 << 1;
+ gg = gg + 1;
+ chip_index = chip_index + 1;
+ } else if (chips1[chip_index] == 0x01) {
+ chipsH1 |= 0x0000000000000001;
+ chipsH1 = chipsH1 << 1;
+ gg = gg + 1;
+ chip_index = chip_index + 2;
+ }
+ }
+ }
+ return chipsH1;
+}
+
+uint64_t _poly_check(uint32_t poly, uint32_t bits, uint8_t numbits) {
+ uint64_t bits_out = 0;
+ uint8_t shift_counter = 1;
+ uint8_t b1 = 0;
+ uint32_t buffer = bits; // mask to prevent bit overflow
+ poly &= 0x00001FFFF; // mask to prevent silliness
+ bits_out |= buffer; // initialize 17 LSBs of result
+ bits_out &= 0x00000000FFFFFFFF; // mask because I didn't want to re-cast the buffer
+
+ while (shift_counter <= numbits) {
+ bits_out = bits_out << 1; // shift left (forward in time) by 1
+
+ b1 = __builtin_popcount(buffer & poly) & 0x01; // mask the buffer w/ the selected polynomial
+ buffer = ((buffer << 1) | b1) & (0x0001FFFF);
+
+ bits_out |= ((b1) & (0x01)); // put result of the XOR operation into the new bit
+ shift_counter++;
+ }
+ return bits_out;
+}
+
+uint8_t _determine_polynomial(uint64_t chipsH1, int8_t *start_val) {
+ // check which polynomial the bit sequence is part of
+ // TODO: make function a void and modify memory directly
+ // TODO: rename chipsH1 to something relevant... like bits?
+
+ // Handle the edgecase of a full zero input
+ if (chipsH1 == 0x00) {
+ return LH2_POLYNOMIAL_ERROR_INDICATOR;
+ }
+
+ *start_val = 8; // TODO: remove this? possible that I modify start value during the demodulation process
+
+ int32_t bits_N_for_comp = 47 - *start_val;
+ uint32_t bit_buffer1 = (uint32_t)(((0xFFFF800000000000) & chipsH1) >> 47);
+ uint64_t bits_from_poly[LH2_POLYNOMIAL_COUNT] = { 0 };
+ uint8_t weights[LH2_POLYNOMIAL_COUNT] = { 0xFF };
+ uint8_t selected_poly = LH2_POLYNOMIAL_ERROR_INDICATOR; // initialize to error condition
+ uint8_t min_weight_idx = LH2_POLYNOMIAL_ERROR_INDICATOR;
+ uint64_t min_weight = LH2_POLYNOMIAL_ERROR_INDICATOR;
+ uint64_t bits_to_compare = 0;
+ int32_t threshold = POLYNOMIAL_BIT_ERROR_INITIAL_THRESHOLD;
+
+#if defined(LH2_MOCAP_FILTER)
+ // tighten threshold if we expect MoCap interference
+ threshold = 0;
+#endif
+
+ // try polynomial vs. first buffer bits
+ // this search takes 17-bit sequences and runs them forwards through the polynomial LFSRs.
+ // if the remaining detected bits fit well with the chosen 17-bit sequence and a given polynomial, it is treated as "correct"
+ // in case of bit errors at the beginning of the capture, the 17-bit sequence is shifted (to a max of 8 bits)
+ // in case of bit errors at the end of the capture, the ending bits are removed (to a max of
+ // removing bits reduces the threshold correspondingly, as incorrect packet detection will cause a significant delay in location estimate
+
+ // run polynomial search on the first capture
+ while (1) {
+
+ // TODO: do this math stuff in multiple operations to: (a) make it readable (b) ensure order-of-execution
+ bit_buffer1 = (uint32_t)(((0xFFFF800000000000 >> (*start_val)) & chipsH1) >> (64 - 17 - (*start_val)));
+ bits_to_compare = (chipsH1 & (0xFFFFFFFFFFFFFFFF << (64 - 17 - (*start_val) - bits_N_for_comp)));
+ // reset the minimum polynomial match found
+ min_weight_idx = LH2_POLYNOMIAL_ERROR_INDICATOR;
+ min_weight = LH2_POLYNOMIAL_ERROR_INDICATOR;
+ // Check against all the known polynomials
+ for (uint8_t i = 0; i < LH2_POLYNOMIAL_COUNT; i++) {
+ bits_from_poly[i] = (((_poly_check(_polynomials[i], bit_buffer1, bits_N_for_comp)) << (64 - 17 - (*start_val) - bits_N_for_comp)) | (chipsH1 & (0xFFFFFFFFFFFFFFFF << (64 - (*start_val)))));
+ weights[i] = __builtin_popcount(bits_from_poly[i] ^ bits_to_compare);
+ // Keep track of the minimum weight value and which polinimial generated it.
+ if (weights[i] < min_weight) {
+ min_weight_idx = i;
+ min_weight = weights[i];
+ }
+ }
+
+ // If you found a sufficiently good value, then return which polinomial generated it
+ if (min_weight <= (uint64_t)threshold) {
+ selected_poly = min_weight_idx;
+ break;
+ // match failed, try again removing bits from the end
+ } else if (*start_val > 8) {
+ *start_val = 8;
+ bits_N_for_comp = bits_N_for_comp - 9;
+ if (threshold > 2) {
+ threshold = threshold - 1;
+ } else if (threshold == 2) { // keep threshold at ones, but you're probably screwed with an unlucky bit error
+ threshold = 2;
+ }
+ } else {
+ *start_val = *start_val + 1;
+ bits_N_for_comp -= 1;
+ }
+
+ // too few bits to reliably compare, give up
+ if (bits_N_for_comp < 19) {
+ selected_poly = LH2_POLYNOMIAL_ERROR_INDICATOR; // mark the poly as "wrong"
+ break;
+ }
+ }
+ return selected_poly;
+}
+
+// uint8_t _determine_polynomial_2(uint64_t input_bits, int8_t *start_val) {
+// // check which polynomial the bit sequence is part of
+// // TODO: make function a void and modify memory directly
+
+// // Handle the edgecase of a full zero input
+// if (input_bits == 0x00) {
+// return LH2_POLYNOMIAL_ERROR_INDICATOR;
+// }
+
+// *start_val = 8; // how many bits to ignore from the START of the sequence (MSB)
+// uint8_t end_val = 0; // how many bits to ignore from the END of the sequence (LSB)
+// int32_t bits_N_for_comp = 64 - 17 - *start_val - end_val; // How many bits will be used to comparison. 64bit - start and end offset - 17bit from the sequence extended.
+// uint64_t bits_to_compare = 0; // input bit sub-sequence used for the comparison.
+// uint32_t lfsr_buffer = 0; // 17 bits sequence that will be extended using the known polynomials
+// uint64_t predicted_bits[LH2_POLYNOMIAL_COUNT] = { 0 }; // bits predicted using the known polynomials, based on the input
+// uint8_t weights[LH2_POLYNOMIAL_COUNT] = { 0xFF }; // score of how well each polynomial matches the input bits (lower the better, 0 is a perfect match)
+// uint8_t selected_poly = LH2_POLYNOMIAL_ERROR_INDICATOR; // initialize to error condition
+// uint8_t min_weight_idx = LH2_POLYNOMIAL_ERROR_INDICATOR;
+// uint64_t min_weight = LH2_POLYNOMIAL_ERROR_INDICATOR;
+// int32_t threshold = 0; // we don't tolerate a single bit error between the input bits and the predicted data.
+
+// // try polynomial vs. first buffer bits
+// // this search takes 17-bit sequences and runs them forwards through the polynomial LFSRs.
+// // if the remaining detected bits fit well with the chosen 17-bit sequence and a given polynomial, it is treated as "correct"
+// // in case of bit errors at the beginning of the capture, the 17-bit sequence is shifted (to a max of 8 bits)
+// // in case of bit errors at the end of the capture, the ending bits are removed (to a max of
+// // removing bits reduces the threshold correspondingly, as incorrect packet detection will cause a significant delay in location estimate
+
+// // run polynomial search on the first capture
+// while (1) {
+
+// // Select which 17bit sequence will be used to predict the rest of the sequence
+// uint64_t mask_lfsr_buffer = 0xFFFF800000000000 >> (*start_val); // create a mask in the proper place
+// mask_lfsr_buffer = mask_lfsr_buffer & input_bits; // apply the mask
+// lfsr_buffer = (uint32_t)(mask_lfsr_buffer >> (64 - 17 - (*start_val))); // Move the masked bit to the right (right justify-them)
+
+// // TODO: do this math stuff in multiple operations to: (a) make it readable (b) ensure order-of-execution
+// bits_to_compare = (input_bits & (0xFFFFFFFFFFFFFFFF << (64 - 17 - (*start_val) - bits_N_for_comp)));
+// // reset the minimum polynomial match found
+// min_weight_idx = LH2_POLYNOMIAL_ERROR_INDICATOR;
+// min_weight = LH2_POLYNOMIAL_ERROR_INDICATOR;
+// // Check against all the known polynomials
+// for (uint8_t i = 0; i < LH2_POLYNOMIAL_COUNT; i++) {
+// predicted_bits[i] = (((_poly_check(_polynomials[i], bit_buffer1, bits_N_for_comp)) << (64 - 17 - (*start_val) - bits_N_for_comp)) | (chipsH1 & (0xFFFFFFFFFFFFFFFF << (64 - (*start_val)))));
+// weights[i] = __builtin_popcount(predicted_bits[i] ^ bits_to_compare);
+// // Keep track of the minimum weight value and which polinimial generated it.
+// if (weights[i] < min_weight) {
+// min_weight_idx = i;
+// min_weight = weights[i];
+// }
+// }
+
+// // If you found a sufficiently good value, then return which polinomial generated it
+// if (min_weight <= (uint64_t)threshold) {
+// selected_poly = min_weight_idx;
+// break;
+// // match failed, try again removing bits from the end
+// } else if (*start_val > 8) {
+// *start_val = 8;
+// bits_N_for_comp = bits_N_for_comp - 9;
+// if (threshold > 2) {
+// threshold = threshold - 1;
+// } else if (threshold == 2) { // keep threshold at ones, but you're probably screwed with an unlucky bit error
+// threshold = 2;
+// }
+// } else {
+// *start_val = *start_val + 1;
+// bits_N_for_comp -= 1;
+// }
+
+// // too few bits to reliably compare, give up
+// if (bits_N_for_comp < 19) {
+// selected_poly = LH2_POLYNOMIAL_ERROR_INDICATOR; // mark the poly as "wrong"
+// break;
+// }
+// }
+// return selected_poly;
+// }
+
+uint64_t _hamming_weight(uint64_t bits_in) { // TODO: bad name for function? or is it, it might be a good name for a function, because it describes exactly what it does
+ uint64_t weight = bits_in;
+ weight = weight - ((weight >> 1) & 0x5555555555555555); // find # of 1s in every 2-bit block
+ weight = (weight & 0x3333333333333333) + ((weight >> 2) & 0x3333333333333333); // find # of 1s in every 4-bit block
+ weight = (weight + (weight >> 4)) & 0x0F0F0F0F0F0F0F0F; // find # of 1s in every 8-bit block
+ weight = (weight + (weight >> 8)) & 0x00FF00FF00FF00FF; // find # of 1s in every 16-bit block
+ weight = (weight + (weight >> 16)) & 0x0000FFFF0000FFFF; // find # of 1s in every 32-bit block
+ weight = (weight + (weight >> 32)); // add the two 32-bit block results together
+ weight = weight & 0x000000000000007F; // mask final result, max value of 64, 0'b01000000
+ return weight;
+}
+
+uint32_t _lfsr_index_search(_lfsr_checkpoint_t *checkpoint, uint8_t index, uint32_t bits) {
+
+ lfsr_17bits_t bits_local = bits & 0x0001FFFF; // initialize buffer to initial bits, masked
+ lfsr_17bits_t buffer_down = bits_local;
+ lfsr_17bits_t buffer_up = bits_local;
+
+ uint32_t count_down = 0;
+ uint32_t count_up = 0;
+ int32_t count_final = 0; // There is a chance for overflow near the roll-over point of the lfsr sequence (sequence very high (>120k), hitting a very low check point (~20))
+ uint32_t b17 = 0;
+ uint32_t b1 = 0;
+ uint32_t masked_buff = 0;
+ uint8_t hash_down = 0;
+ uint8_t hash_up = 0;
+ bool success = false; // True if the LFSR search produced a valid result
+
+ // Copy const variables (Flash) into local variables (RAM) to speed up execution.
+ uint32_t _lfsr_hash_table_local[NUM_LSFR_COUNT_CHECKPOINTS] = { 0 };
+ uint32_t _lfsr_index_table_local[NUM_LSFR_COUNT_CHECKPOINTS] = { 0 };
+ uint32_t polynomials_local = _polynomials[index];
+ for (size_t i = 0; i < NUM_LSFR_COUNT_CHECKPOINTS; i++) {
+ _lfsr_hash_table_local[i] = _lfsr_hash_table[index][i];
+ _lfsr_index_table_local[i] = _lfsr_index_table[index][i];
+ }
+
+ // Start the iterative search
+ while (buffer_up != 0x00 && buffer_down != 0x00) { // Check that the count has not fallen into an invalid state {
+
+ //
+ // CHECKPOINT CHECKING
+ //
+
+ // Check lfsr backward count against precomputed checkpoints
+ hash_down = (buffer_down >> 11) & HASH_TABLE_MASK;
+ if (buffer_down == _lfsr_hash_table_local[hash_down]) {
+ count_final = count_down + _lfsr_index_table_local[hash_down];
+ success = true; // mark the success of the search
+ break;
+ }
+
+ // Check lfsr forward count against precomputed checkpoints
+ hash_up = (buffer_up >> 11) & HASH_TABLE_MASK;
+ if (buffer_up == _lfsr_hash_table_local[hash_up]) {
+ count_final = _lfsr_index_table_local[hash_up] - count_up;
+ success = true; // mark the success of the search
+ break;
+ }
+
+ // Check the dynamical checkpoints, backward
+ // Sweep 0
+ if (buffer_down == checkpoint->bits[index][0]) {
+ count_final = count_down + checkpoint->count[index][0];
+ success = true; // mark the success of the search
+ break;
+ }
+ // Sweep 1
+ if (buffer_down == checkpoint->bits[index][1]) {
+ count_final = count_down + checkpoint->count[index][1];
+ success = true; // mark the success of the search
+ break;
+ }
+
+ // Check the dynamical checkpoints, forward
+ // Sweep 0
+ if (buffer_up == checkpoint->bits[index][0]) {
+ count_final = checkpoint->count[index][0] - count_up;
+ success = true; // mark the success of the search
+ break;
+ }
+ // Sweep 1
+ if (buffer_up == checkpoint->bits[index][1]) {
+ count_final = checkpoint->count[index][1] - count_up;
+ success = true; // mark the success of the search
+ break;
+ }
+
+ //
+ // LSFR UPDATE
+ //
+
+ // LSFR backward update
+ b17 = buffer_down & 0x00000001; // save the "newest" bit of the buffer
+ buffer_down = (buffer_down & (0x0001FFFE)) >> 1; // shift the buffer right, backwards in time
+ masked_buff = (buffer_down) & (polynomials_local); // mask the buffer w/ the selected polynomial
+ buffer_down = buffer_down | (((__builtin_popcount(masked_buff) ^ b17) & 0x00000001) << 16); // This weird line propagates the LSFR one bit into the past
+ count_down++;
+
+ // LSFR forward update
+ b1 = __builtin_popcount(buffer_up & polynomials_local) & 0x01; // mask the buffer w/ the selected polynomial
+ buffer_up = ((buffer_up << 1) | b1) & (0x0001FFFF);
+ count_up++;
+ }
+
+ // Return the found lfsr value
+ if (success) {
+ // Handle overflows
+ if (count_final < 0) {
+ // wrap around the number
+ count_final += 131071; // 2^17 -1 (the full lenght of the sequence)
+ }
+ // Turn result back to unsigned before returning
+ return (uint32_t)count_final;
+ } else {
+ return LH2_LFSR_SEARCH_ERROR_INDICATOR;
+ }
+}
+
+bool _check_mocap_interference(uint8_t *arr, uint8_t size) {
+
+ // Qualysis Mocap cameras pulse IR light modulated with a regular square wave at 1Mhz.
+ // At the 32Mhz speed we sample the SPI, that corresponds to an alternating 0xFF,0xFF,0xFF,0x00,0x00,0x00 pattern
+
+ // Check only the bottom half of the array, that should be enough to catch an error.
+ for (int i = 0; i < size / 2; i++) {
+ // Check for 3 consecutive 0xFF
+ if (arr[i] == 0xFF && arr[i + 1] == 0xFF && arr[i + 2] == 0xFF) {
+ return true; // Error for 3 consecutive 0xFF
+ }
+
+ // Check for 3 consecutive 0x00
+ if (arr[i] == 0x00 && arr[i + 1] == 0x00 && arr[i + 2] == 0x00) {
+ return true; // Error for 3 consecutive 0x00
+ }
+ }
+ return false; // No error found
+}
+
+//=========================== private ==========================================
+
+//=========================== interrupts =======================================
diff --git a/bsp/nrf/lh2_default.c b/bsp/nrf/lh2_default.c
index 2fe8075..e508739 100644
--- a/bsp/nrf/lh2_default.c
+++ b/bsp/nrf/lh2_default.c
@@ -19,6 +19,8 @@
#include "gpio.h"
#include "lh2.h"
+#include "lh2_decoder.h"
+#include "lh2_checkpoints.h"
#include "timer_hf.h"
#include "board_config.h"
@@ -83,569 +85,52 @@ typedef struct {
uint8_t count; // Number of arrays in buffer
} lh2_ring_buffer_t;
-typedef struct {
- uint8_t spi_rx_buffer[SPI_BUFFER_SIZE]; ///< buffer where data coming from SPI are stored
- lh2_ring_buffer_t data; ///< array containing demodulation data of each locations
-} lh2_vars_t;
-
-//=========================== variables ========================================
-
-static const uint32_t _polynomials[LH2_POLYNOMIAL_COUNT] = {
- 0x0001D258,
- 0x00017E04,
- 0x0001FF6B,
- 0x00013F67,
- 0x0001B9EE,
- 0x000198D1,
- 0x000178C7,
- 0x00018A55,
+///< List of rotational periods (in microseconds) of the lighthouse basestation in all its 16 modes.
+static const uint16_t _lh2_sweep_period_us[LH2_BASESTATION_COUNT] = {
+ 19979,
+ 19938,
+ 19854,
+ 19771,
+ 19729,
+ 19646,
+ 19604,
+ 19563,
+ 19521,
+ 19354,
+ 19146,
+ 18979,
+ 18896,
+ 18771,
+ 18604,
+ 18479,
};
static const uint32_t _periods[LH2_BASESTATION_COUNT] = {
959000,
957000,
953000,
- 951000,
+ 949000,
+ 947000,
+ 943000,
+ 941000,
+ 939000,
+ 937000,
+ 929000,
+ 919000,
+ 911000,
+ 907000,
+ 901900,
+ 893000,
+ 887000,
};
-static const uint32_t _end_buffers[LH2_POLYNOMIAL_COUNT][NUM_LSFR_COUNT_CHECKPOINTS] = {
- {
- // p0
- 0x00000000000000001, // [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1] starting seed, little endian
- 0b10000000000011010,
- 0b10000001010110001,
- 0b10111000000110000,
- 0b10101010110011101,
- 0b10100001010111011,
- 0b01011000111100110,
- 0b00011011100000011,
- 0b10001010101011010,
- 0b01001010001111101,
- 0b00010010100011000,
- 0b00000100111000011,
- 0b11001100100000010,
- 0b00111111101111011,
- 0b10110010010110001,
- 0b01110001000110111,
- 0b01100101100011111,
- 0b11010001101010100,
- 0b00011011101110011,
- 0b10001110100000011,
- 0b10010001101011110,
- 0b11011011010100011,
- 0b11011111100110001,
- 0b00010100010110011,
- 0b10100011001011111,
- 0b00111110110000100,
- 0b10001100001010011,
- 0b11100011011100000,
- 0b11110001010110001,
- 0b11101000000111110,
- 0b00011010010010011,
- 0b10101010010100101,
- 0b10111000110011011,
- 0b10111111000001001,
- 0b00101101110010101,
- 0b10100100100011100,
- 0b10100110100011110,
- 0b11001000101110010,
- 0b11100111100101101,
- 0b00111101010100010,
- 0b11001101100010000,
- 0b00001001001100101,
- 0b10001010111010001,
- 0b01000111000001001,
- 0b01000101110011111,
- 0b00111100011000011,
- 0b11111111000001001,
- 0b11101101110000010,
- 0b11100101011110101,
- 0b01000010100110110,
- 0b10110111000100001,
- 0b10010110011001011,
- 0b01001001110110111,
- 0b01011011110010010,
- 0b01000110110010010,
- 0b01100101110010010,
- 0b11011100110011101,
- 0b01000011010111101,
- 0b10010110101000000,
- 0b01011111011001111,
- 0b10000110101101011,
- 0b00101100111011001,
- 0b10010101110100110,
- 0b00001110011011111,
- },
- {
- // p1
- 0x00000000000000001, // [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1] starting seed, little endian
- 0b00000001111100000,
- 0b11111111000111010,
- 0b10111000111011000,
- 0b11010000110111110,
- 0b10001100001111010,
- 0b10010111100011101,
- 0b10011100011010010,
- 0b10110111100111100,
- 0b11101101100100000,
- 0b11110110110010101,
- 0b01110110111101110,
- 0b11000010101101111,
- 0b01101111000011101,
- 0b01000000000111001,
- 0b01010101101000101,
- 0b00101110001101110,
- 0b11010000111010000,
- 0b00001100001001010,
- 0b11011100001000011,
- 0b01000011000110100,
- 0b00001101001011100,
- 0b11010100111100011,
- 0b10100011000111100,
- 0b00010001010011110,
- 0b01011011010101010,
- 0b10101110010010010,
- 0b10100001010111011,
- 0b10100101111010001,
- 0b01010111100110110,
- 0b11110110001100000,
- 0b10000101000110111,
- 0b10011000000100001,
- 0b00110001110110000,
- 0b10100001010001101,
- 0b11100111111101000,
- 0b01110011011010110,
- 0b11010000101111011,
- 0b10101001001000100,
- 0b00010000111001111,
- 0b00100011101000011,
- 0b00110110001000011,
- 0b11110011101001111,
- 0b10100101011110000,
- 0b10111011010000101,
- 0b11001010000111101,
- 0b11101011111010011,
- 0b00000001110111100,
- 0b00110010100110110,
- 0b00101111010110001,
- 0b11101110010000001,
- 0b10011100010011101,
- 0b01000111111100110,
- 0b01100111101100011,
- 0b10100100000010011,
- 0b11011100110100101,
- 0b10001101000111011,
- 0b01001010000111000,
- 0b11100110011110111,
- 0b11111000000100100,
- 0b00111100110011100,
- 0b11011000110000110,
- 0b00011011111011000,
- 0b10011000101010001,
- },
- {
- // p2
- 0x00000000000000001, // [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1] starting seed, little endian
- 0b11001110010011010,
- 0b00111011100000111,
- 0b10011010101111011,
- 0b00011011011000100,
- 0b01100001111001001,
- 0b00100011000101100,
- 0b01110100001110110,
- 0b01011101010010110,
- 0b00011111001011100,
- 0b11111101101001011,
- 0b00110100010100010,
- 0b11001011001101010,
- 0b01100110111001010,
- 0b01000010000110001,
- 0b00011011111101001,
- 0b01110001111011010,
- 0b01011010100110111,
- 0b10010110101101111,
- 0b01001001010111011,
- 0b10110110011111010,
- 0b10010001010110000,
- 0b11001011000000110,
- 0b00001011000001000,
- 0b10110001110000001,
- 0b11111010001101100,
- 0b01110110010001010,
- 0b00100000010110111,
- 0b10001001011101001,
- 0b00100101110000111,
- 0b10001100100001100,
- 0b10000011101111100,
- 0b00000010011101011,
- 0b01010000011010001,
- 0b01011110000100010,
- 0b00100100000010110,
- 0b01100010101111011,
- 0b01101010010110001,
- 0b00110111001111111,
- 0b11010110101011110,
- 0b00111000001101111,
- 0b01000010110010001,
- 0b01010110110011001,
- 0b00110011110100111,
- 0b10101011100111000,
- 0b11010010001000100,
- 0b11001011111100111,
- 0b01001000000110001,
- 0b01111110101111111,
- 0b01111000110111110,
- 0b11101100001001001,
- 0b00011010000000010,
- 0b01000011110101010,
- 0b11111111111010011,
- 0b10001011001010010,
- 0b00100100100111000,
- 0b01001011100000011,
- 0b11111101110110110,
- 0b10111111010001011,
- 0b10101111001100000,
- 0b00010110111101110,
- 0b10100010011011000,
- 0b01111001011100111,
- 0b10000110110011101,
- },
- {
- // p3
- 0x00000000000000001, // [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1] starting seed, little endian
- 0b00101100000100010,
- 0b10001100001111000,
- 0b10001110100110011,
- 0b11011011110010110,
- 0b00010010100101011,
- 0b01001100111011111,
- 0b00110011010010101,
- 0b11000100000001101,
- 0b01010011010101100,
- 0b01111100110100001,
- 0b10011011011110001,
- 0b11100011000010110,
- 0b00010000010000010,
- 0b10110110011111000,
- 0b00110111011100001,
- 0b00011111010001100,
- 0b00000101100001100,
- 0b01011000011110010,
- 0b10111011011111111,
- 0b11000001011110011,
- 0b11011000000000011,
- 0b00011011000101100,
- 0b10100101100010011,
- 0b10011101110001010,
- 0b11110010001000101,
- 0b10001011101110001,
- 0b01010010000000110,
- 0b00001011001111000,
- 0b10000000110111001,
- 0b00010001010100001,
- 0b10100111110001010,
- 0b00111100010000101,
- 0b11001101011101111,
- 0b11000010010010010,
- 0b01100010001001001,
- 0b01001111001010100,
- 0b10000000010000100,
- 0b11010011011101100,
- 0b01000111000101000,
- 0b01011010010110011,
- 0b10100000101001111,
- 0b10101110100001100,
- 0b00010101100111011,
- 0b11111101010001100,
- 0b01100000101101000,
- 0b10001011110011100,
- 0b10001100100101101,
- 0b00110101011011111,
- 0b11010110000110010,
- 0b11101011101110000,
- 0b00010111001011011,
- 0b01110110010101011,
- 0b00111001000001010,
- 0b10111101110100011,
- 0b11001111000000011,
- 0b00010000110100010,
- 0b01111110100101011,
- 0b00011001010001101,
- 0b11111001111101101,
- 0b00010111110101110,
- 0b10011101110100010,
- 0b10011100001001111,
- 0b00101011101001101,
- },
- {
- // p4
- 0x00000000000000001, // [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1] starting seed, little endian
- 0b00111101010111100,
- 0b01010011100100100,
- 0b01100001100011000,
- 0b11000011111110101,
- 0b00100100011111011,
- 0b00010000110000011,
- 0b10001000111100101,
- 0b01111110000100101,
- 0b11010110111101011,
- 0b01110001000011100,
- 0b10101100100110100,
- 0b01011100011111100,
- 0b11001111011011111,
- 0b00100101010010110,
- 0b00010011000100100,
- 0b11001000111100000,
- 0b10110111000100001,
- 0b00110000001111000,
- 0b10101100001001111,
- 0b00010001010010110,
- 0b01001001110100010,
- 0b01010001110000110,
- 0b00101110010101101,
- 0b00100010100111011,
- 0b01000010110100110,
- 0b01110110111010010,
- 0b10101110001110110,
- 0b10111101100101000,
- 0b01000010111011011,
- 0b11010100011001110,
- 0b01010011110010111,
- 0b01000101010111010,
- 0b11110110100000001,
- 0b01101011000100010,
- 0b01101101111000101,
- 0b10111101100011011,
- 0b10011110001001000,
- 0b00110101110101111,
- 0b10011111101011101,
- 0b11110100111101000,
- 0b10110000011111110,
- 0b00001100010101110,
- 0b11100011111011001,
- 0b11100010000111100,
- 0b11001001011110111,
- 0b10000011010010101,
- 0b01010001101001001,
- 0b11010010101101010,
- 0b01001101001100111,
- 0b00110110011011100,
- 0b00111000010100101,
- 0b01101100110010010,
- 0b01000010000010001,
- 0b01001000111110101,
- 0b10101110010001100,
- 0b11111000100010000,
- 0b10111001000011000,
- 0b00100101111101011,
- 0b00111011000100010,
- 0b00111011101100011,
- 0b10001010110100100,
- 0b10011010101100001,
- 0b10111100101010110,
- },
- {
- // p5
- 0x00000000000000001, // [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1] starting seed, little endian
- 0b10000110010011101,
- 0b10010100110011101,
- 0b11101111001011001,
- 0b11001000010011110,
- 0b01111111110111110,
- 0b00100011010001111,
- 0b01011101110101000,
- 0b10011010101100010,
- 0b00111101111110011,
- 0b00110010000110101,
- 0b10100111011001111,
- 0b01100111010001011,
- 0b00100010110011110,
- 0b00011010000101110,
- 0b11001001101001100,
- 0b11011011100110100,
- 0b00000010111000100,
- 0b11111011010010001,
- 0b00100100000011000,
- 0b01001000001001100,
- 0b10111011101111001,
- 0b00111001100101000,
- 0b00111011000011100,
- 0b11000001001111010,
- 0b10010010011100111,
- 0b11000001101100001,
- 0b11010010110000101,
- 0b11001000010010000,
- 0b00010111101011110,
- 0b01000110001101000,
- 0b01110001010000100,
- 0b10001110110110000,
- 0b00111111101100011,
- 0b01000000111011101,
- 0b11000001100011101,
- 0b11111001001100101,
- 0b10000110101001011,
- 0b01011111100010011,
- 0b11110001000101010,
- 0b01100001010010111,
- 0b01101011100011111,
- 0b01101110000100100,
- 0b00101101001000111,
- 0b01000110101100010,
- 0b10010000010110000,
- 0b01111011100011110,
- 0b00110011110101011,
- 0b11010011000101000,
- 0b01011110110001100,
- 0b00101011110111001,
- 0b00010100001111011,
- 0b01011001111000111,
- 0b00010100011100111,
- 0b11011110010111101,
- 0b11111000111011101,
- 0b10011010110011010,
- 0b01101010000110010,
- 0b10101111110000010,
- 0b00110111001010101,
- 0b00001001000001110,
- 0b00000010110111000,
- 0b11010000101110001,
- 0b01101010111000011,
- },
- {
- // p6
- 0x00000000000000001, // [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1] starting seed, little endian
- 0b00010010000111001,
- 0b01001101111111100,
- 0b00010100111011111,
- 0b01110110101110110,
- 0b01010101000001110,
- 0b00111001110010110,
- 0b00011000111001010,
- 0b00111111000100011,
- 0b00111010001001001,
- 0b10010001101110110,
- 0b10011110001110100,
- 0b10011010110110011,
- 0b11110010100110101,
- 0b11100001000101111,
- 0b11010000111111101,
- 0b11110001001110000,
- 0b10010001111000110,
- 0b10100011001000001,
- 0b10001000011101000,
- 0b10001101001000111,
- 0b11100111010110100,
- 0b00001010100010001,
- 0b01110010010010001,
- 0b01001000110110000,
- 0b01011010000010000,
- 0b01100110100001100,
- 0b10111001000100001,
- 0b01000011100101101,
- 0b10111010001110010,
- 0b11011001111000001,
- 0b10110000010001111,
- 0b00100110001001001,
- 0b11000011000110001,
- 0b11110011100010110,
- 0b01011101101010000,
- 0b11001011101000100,
- 0b11100001011010110,
- 0b11111111100000101,
- 0b10000100111001101,
- 0b11001011011100111,
- 0b11101110011001010,
- 0b11001100100001001,
- 0b10001001000101101,
- 0b11001101100101000,
- 0b01011001111000100,
- 0b01111010110011010,
- 0b00110011110100011,
- 0b00100011001101100,
- 0b11101010000001011,
- 0b11110100100010110,
- 0b11011011000111000,
- 0b01011101001100000,
- 0b11000100010110001,
- 0b10000111011101111,
- 0b10010001111111101,
- 0b11111001011001111,
- 0b11101011111101111,
- 0b00100101001100010,
- 0b10100000011000110,
- 0b01001101000100110,
- 0b11000110110101010,
- 0b01101010101001110,
- 0b00010101100100011,
- },
- {
- // p7
- 0x00000000000000001, // [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1] starting seed, little endian
- 0b11111111111001011,
- 0b10101101101100110,
- 0b00100101101010000,
- 0b01000010111001111,
- 0b10010001000110001,
- 0b10010100011110001,
- 0b10010110111000011,
- 0b00011111000011111,
- 0b00011000111000111,
- 0b01101000010001001,
- 0b00001010011011000,
- 0b00100101010100111,
- 0b01110010111010110,
- 0b00101101000111111,
- 0b11111010001011001,
- 0b10001110011000110,
- 0b10010110011101110,
- 0b11001101111111010,
- 0b01001101110010110,
- 0b01000011011111110,
- 0b11101100100011100,
- 0b10000101011010011,
- 0b11111111100101101,
- 0b01001001000001101,
- 0b11001101110001101,
- 0b01000000110011101,
- 0b11000001101011011,
- 0b01110011110100100,
- 0b01110011011101110,
- 0b01010001111111000,
- 0b01011101100100000,
- 0b10010000110101010,
- 0b11111001001110010,
- 0b10000001100101101,
- 0b10000001000010111,
- 0b01010001101010011,
- 0b10110010100011000,
- 0b11001101110101011,
- 0b01000101000110100,
- 0b00011011000110101,
- 0b10101100110101110,
- 0b10010110011010111,
- 0b00110100110001110,
- 0b11001100101110100,
- 0b11110100100010010,
- 0b11011011001101110,
- 0b10100101000101111,
- 0b10011000101101111,
- 0b10000111001010110,
- 0b01001100000100100,
- 0b00101010011110001,
- 0b10100001000111100,
- 0b11010101101110010,
- 0b11111000011101010,
- 0b11000101010011110,
- 0b11110100001010000,
- 0b00000111000000100,
- 0b01000100101100001,
- 0b01101001011000111,
- 0b01010010010011110,
- 0b10001111110000100,
- 0b11100110010111101,
- 0b10000101011010000,
- },
-};
+typedef struct {
+ uint8_t spi_rx_buffer[SPI_BUFFER_SIZE]; ///< buffer where data coming from SPI are stored
+ lh2_ring_buffer_t data; ///< array containing demodulation data of each locations
+ _lfsr_checkpoint_t checkpoint; ///< Dynamic checkpoints for the lsfr index search
+} lh2_vars_t;
+
+//=========================== variables ========================================
static uint16_t _end_buffers_hashtable[HASH_TABLE_SIZE] = { 0 };
@@ -684,43 +169,6 @@ static lh2_vars_t _lh2_vars; ///< local data of the LH2 driver
*/
bool _initialize_ts4231(const gpio_t *gpio_d, const gpio_t *gpio_e);
-/**
- * @brief
- * @param[in] sample_buffer: SPI samples loaded into a local buffer
- * @return chipsH: 64-bits of demodulated data
- */
-uint64_t _demodulate_light(uint8_t *sample_buffer);
-
-/**
- * @brief from a 17-bit sequence and a polynomial, generate up to 64-17=47 bits as if the LFSR specified by poly were run forwards for numbits cycles, all little endian
- *
- * @param[in] poly: 17-bit polynomial
- * @param[in] bits: starting seed
- * @param[in] numbits: number of bits
- *
- * @return sequence of bits resulting from running the LFSR forward
- */
-uint64_t _poly_check(uint32_t poly, uint32_t bits, uint8_t numbits);
-
-/**
- * @brief find out which LFSR polynomial the bit sequence is a member of
- *
- * @param[in] chipsH1: input sequences of bits from demodulation
- * @param[in] start_val: number of bits between the envelope falling edge and the beginning of the sequence where valid data has been found
- *
- * @return polynomial, indicating which polynomial was found, or FF for error (polynomial not found).
- */
-uint8_t _determine_polynomial(uint64_t chipsH1, int8_t *start_val);
-
-/**
- * @brief counts the number of 1s in a 64-bit
- *
- * @param[in] bits_in: arbitrary bits
- *
- * @return cumulative number of 1s inside of bits_in
- */
-uint64_t _hamming_weight(uint64_t bits_in);
-
/**
* @brief finds the position of a 17-bit sequence (bits) in the sequence generated by polynomial3 with initial seed 1
*
@@ -780,13 +228,6 @@ void _add_to_spi_ring_buffer(lh2_ring_buffer_t *cb, uint8_t *data, uint32_t time
*/
bool _get_from_spi_ring_buffer(lh2_ring_buffer_t *cb, uint8_t *data, uint32_t *timestamp);
-/**
- * @brief generates a hashtable from the LSFR checpoints and stores it in an array.
- *
- * @param[in] hash_table pointer to the array where the hashtable will be stored
- */
-void _fill_hash_table(uint16_t *hash_table);
-
/**
* @brief Accesses the global tables _lfsr_checkpoint_hashtable & _lfsr_checkpoint_count
* and updates them with the last found polynomial count
@@ -794,8 +235,9 @@ void _fill_hash_table(uint16_t *hash_table);
* @param[in] polynomial: index of polynomial
* @param[in] bits: 17-bit sequence
* @param[in] count: position of the received laser sweep in the LSFR sequence
+ * @param[in] sweep: index of the sweep (0 or 1)
*/
-void _update_lfsr_checkpoints(uint8_t polynomial, uint32_t bits, uint32_t count);
+void _update_lfsr_checkpoints(uint8_t polynomial, uint32_t bits, uint32_t count, uint8_t sweep);
/**
* @brief LH2 sweeps come with an almost perfect 20ms difference.
@@ -808,14 +250,6 @@ void _update_lfsr_checkpoints(uint8_t polynomial, uint32_t bits, uint32_t count)
*/
uint8_t _select_sweep(db_lh2_t *lh2, uint8_t polynomial, uint32_t timestamp);
-/**
- * @brief checks an SPI capture for signs of Qualysis Mocap pulses interference.
- * returns true if interference is found, returns false otherwise
- *
- * @param[in] arr: pointer to the array with the SPI capture to check
- * @return True if interference is found, False otherwise
- */
-bool _check_mocap_interference(uint8_t *arr);
//=========================== public ===========================================
bool db_lh2_init(db_lh2_t *lh2, const gpio_t *gpio_d, const gpio_t *gpio_e) {
@@ -856,9 +290,6 @@ bool db_lh2_init(db_lh2_t *lh2, const gpio_t *gpio_d, const gpio_t *gpio_e) {
}
memset(_lh2_vars.data.buffer[0], 0, LH2_BUFFER_SIZE);
- // Initialize the hash table for the lsfr checkpoints
- _fill_hash_table(_end_buffers_hashtable);
-
// initialize GPIOTEs
_gpiote_setup(gpio_e);
@@ -892,6 +323,7 @@ void db_lh2_reset(db_lh2_t *lh2) {
}
void db_lh2_process_location(db_lh2_t *lh2) {
+ // There is no TS4231 data to process, return early.
if (_lh2_vars.data.count == 0) {
return;
}
@@ -912,18 +344,18 @@ void db_lh2_process_location(db_lh2_t *lh2) {
return;
}
- // Check if Qualysis Mocap data is interfering with the SPI capture
+// Check if Qualysis Mocap data is interfering with the SPI capture
#if defined(LH2_MOCAP_FILTER)
- if (_check_mocap_interference(temp_spi_bits)) {
+ if (_check_mocap_interference(temp_spi_bits, SPI_BUFFER_SIZE)) {
return; // if a qualysis pulse caused a false spi trigger, leave the function.
}
#endif
- // perform the demodulation + poly search on the received packets
- // convert the SPI reading to bits via zero-crossing counter demodulation and differential/biphasic manchester decoding
+ // perform the demodulation received packets
+ // convert the SPI reading to bits via zero-crossing counter demodulation and differential/biphasic manchester decoding.
uint64_t temp_bits_sweep = _demodulate_light(temp_spi_bits);
- // figure out which polynomial each one of the two samples come from.
+ // figure out which polynomial the data belongs to
int8_t temp_bit_offset = 0; // default offset
uint8_t temp_selected_polynomial = _determine_polynomial(temp_bits_sweep, &temp_bit_offset);
@@ -932,29 +364,43 @@ void db_lh2_process_location(db_lh2_t *lh2) {
return;
}
- // Figure in which of the two sweep slots we should save the new data.
+ // Figure out in which of the two sweep slots we should save the new data.
uint8_t sweep = _select_sweep(lh2, temp_selected_polynomial, temp_timestamp);
- // Put the newly read polynomials in the data structure (polynomial 0,1 must map to LH0, 2,3 to LH1. This can be accomplish by integer-dividing the selected poly in 2, a shift >> accomplishes this.)
- // This structur always holds the two most recent sweeps from any lighthouse
+ // Compute which basestation the sweep came from (polynomial 0,1 must map to LH0, 2,3 to LH1, etc... This can be accomplish by integer-dividing the selected poly in 2, a shift >> accomplishes this.)
uint8_t basestation = temp_selected_polynomial >> 1;
//*********************************************************************************//
- // Compute Polynomial Count //
+ // Compute LFSR Position //
//*********************************************************************************//
+ // Select the valid bits of the lfsr by applying the offset (he first few bits might be invalid, as detected by _determine_polynomial())
+ uint32_t temp_lfsr_bits = temp_bits_sweep >> (47 - temp_bit_offset);
+
// Sanity check, make sure you don't start the LFSR search with a bit-sequence full of zeros.
- if ((temp_bits_sweep >> (47 - temp_bit_offset)) == 0x000000) {
+ if (temp_lfsr_bits == 0x000000) {
// Mark the data as wrong and keep going
lh2->data_ready[sweep][basestation] = DB_LH2_NO_NEW_DATA;
return;
}
- // Compute and save the lsfr count.
- uint32_t temp_lfsr_counts = _reverse_count_p(
- temp_selected_polynomial,
- temp_bits_sweep >> (47 - temp_bit_offset)) -
- temp_bit_offset;
+ // Compute the lfsr location.
+ uint32_t temp_lfsr_loc = _lfsr_index_search(&_lh2_vars.checkpoint,
+ temp_selected_polynomial,
+ temp_lfsr_bits);
+
+ // Check that the count didn't fall on an illegal value
+ if (temp_lfsr_loc != LH2_LFSR_SEARCH_ERROR_INDICATOR) {
+ // Save a new dynamic checkpoint
+ _update_lfsr_checkpoints(temp_selected_polynomial, temp_lfsr_bits, temp_lfsr_loc, sweep);
+ } else {
+ // Mark the data as wrong and keep going
+ lh2->data_ready[sweep][basestation] = DB_LH2_NO_NEW_DATA;
+ return;
+ }
+
+ // Undo the bit offset introduced above, to get the LFSR position of the first bit that hit the sensor.
+ temp_lfsr_loc -= temp_bit_offset;
//*********************************************************************************//
// Store results //
@@ -963,7 +409,7 @@ void db_lh2_process_location(db_lh2_t *lh2) {
// Save raw data information
lh2->timestamps[sweep][basestation] = temp_timestamp;
// Save processed location information
- lh2->locations[sweep][basestation].lfsr_counts = temp_lfsr_counts;
+ lh2->locations[sweep][basestation].lfsr_counts = temp_lfsr_loc;
lh2->locations[sweep][basestation].selected_polynomial = temp_selected_polynomial;
// Mark the data point as processed
lh2->data_ready[sweep][basestation] = DB_LH2_PROCESSED_DATA_AVAILABLE;
@@ -1143,480 +589,6 @@ bool _initialize_ts4231(const gpio_t *gpio_d, const gpio_t *gpio_e) {
return true;
}
-uint64_t _demodulate_light(uint8_t *sample_buffer) { // bad input variable name!!
- // TODO: rename sample_buffer
- // TODO: make it a void and have chips be a modified pointer thingie
- // FIXME: there is an edge case where I throw away an initial "1" and do not count it in the bit-shift offset, resulting in an incorrect error of 1 in the LFSR location
- uint8_t chip_index;
- uint8_t local_buffer[128];
- uint8_t zccs_1[128];
- uint8_t chips1[128]; // TODO: give this a better name.
- uint8_t temp_byte_N; // TODO: bad variable name "temp byte"
- uint8_t temp_byte_M; // TODO: bad variable name "temp byte"
-
- // initialize loop variables
- uint8_t ii = 0x00;
- int jj = 0;
- int kk = 0;
- uint64_t gg = 0;
-
- // initialize temporary "ones counter" variable that counts consecutive ones
- int ones_counter = 0;
-
- // initialize result:
- uint64_t chipsH1 = 0;
-
- // FIND ZERO CROSSINGS
- chip_index = 0;
- zccs_1[chip_index] = 0x01;
-
- memcpy(local_buffer, sample_buffer, 128);
-
- // for loop over bytes of the SPI buffer (jj), nested with a for loop over bits in each byte (ii)
- for (jj = 0; jj < 128; jj++) {
- // edge case - check if last bit (LSB) of previous byte is the same as first bit (MSB) of current byte
- // if it is not, increment chip_index and reset count
- if (jj != 0) {
- temp_byte_M = (local_buffer[jj - 1]) & (0x01); // previous byte's LSB
- temp_byte_N = (local_buffer[jj] >> 7) & (0x01); // current byte's MSB
- if (temp_byte_M != temp_byte_N) {
- chip_index++;
- zccs_1[chip_index] = 1;
- } else {
- zccs_1[chip_index] += 1;
- }
- }
- // look at one byte at a time
- for (ii = 7; ii > 0; ii--) {
- temp_byte_M = ((local_buffer[jj]) >> (ii)) & (0x01); // bit shift by ii and mask
- temp_byte_N = ((local_buffer[jj]) >> (ii - 1)) & (0x01); // bit shift by ii-1 and mask
- if (temp_byte_M == temp_byte_N) {
- zccs_1[chip_index] += 1;
- } else {
- chip_index++;
- zccs_1[chip_index] = 1;
- }
- }
- }
-
- // threshold the zero crossings into: likely one chip, likely two zero chips, or fuzzy
- for (jj = 0; jj < 128; jj++) {
- // not memory efficient, but ok for readability, turn ZCCS into chips by thresholding
- if (zccs_1[jj] >= 5) {
- chips1[jj] = 0; // it's a very likely zero
- } else if (zccs_1[jj] <= 3) {
- chips1[jj] = 1; // it's a very likely one
- } else {
- chips1[jj] = FUZZY_CHIP; // fuzzy
- }
- }
- // final bit is bugged, make it fuzzy:
- // chips1[127] = 0xFF;
-
- // DEMODULATION:
- // basic principles, in descending order of importance:
- // 1) an odd number of ones in a row is not allowed - this must be avoided at all costs
- // 2) finding a solution to #1 given a set of data is quite cumbersome without certain assumptions
- // a) a fuzzy before an odd run of 1s is almost always a 1
- // b) a fuzzy between two even runs of 1s is almost always a 0
- // c) a fuzzy after an even run of 1s is usually a a 0
- // 3) a detected 1 is rarely wrong, but detected 0s can be, this is especially common in low-SNR readings
- // exception: if the first bit is a 1 it is NOT reliable because the capture is asynchronous
- // 4) this is not perfect, but the earlier the chip, the more likely that it is correct. Polynomials can be used to fix bit errors later in the reading
- // known bugs/issues:
- // 1) if there are many ones at the very beginning of the reading, the algorithm will mess it up
- // 2) in some instances, the count value will be off by approximately 5, the origin of this bug is unknown at the moment
- // DEMODULATE PACKET:
-
- // reset variables:
- kk = 0;
- ones_counter = 0;
- jj = 0;
- for (jj = 0; jj < 128;) { // TODO: 128 is such an easy magic number to get rid of...
- gg = 0; // TODO: this is not used here?
- if (chips1[jj] == 0x00) { // zero, keep going, reset state
- jj++;
- ones_counter = 0;
- }
- if (chips1[jj] == 0x01) { // one, keep going, keep track of the # of ones
- // k_msleep(10);
- if (jj == 0) { // edge case - first chip = 1 is unreliable, do not increment 1s counter
- jj++;
- } else {
- jj = jj + 1;
- ones_counter = ones_counter + 1;
- }
- }
-
- if ((jj == 127) & (chips1[jj] == FUZZY_CHIP)) {
- chips1[jj] = 0x00;
- } else if ((chips1[jj] == FUZZY_CHIP) & (ones_counter == 0)) { // fuzz after a zero
- // k_msleep(10);
- if (chips1[jj + 1] == 0) { // zero then fuzz then zero -> fuzz is a zero
- jj++;
- chips1[jj - 1] = 0;
- } else if (chips1[jj + 1] == FUZZY_CHIP) { // zero then fuzz then fuzz -> just move on, you're probably screwed
- // k_msleep(10);
- jj += 2;
- } else if (chips1[jj + 1] == 1) { // zero then fuzz then one -> investigate
- kk = 1;
- ones_counter = 0;
- while (chips1[jj + kk] == 1) {
- ones_counter++;
- kk++;
- }
- if (ones_counter % 2 == 1) { // fuzz -> odd ones, the fuzz is a 1
- jj++;
- chips1[jj - 1] = 1;
- ones_counter = 1;
- } else if (ones_counter % 2 == 0) { // fuzz -> even ones, move on for now, it's indeterminate
- jj++;
- ones_counter = 0; // temporarily treat as a 0 for counting purposes
- } else { // catch statement
- jj++;
- }
- }
- } else if ((chips1[jj] == FUZZY_CHIP) & (ones_counter != 0)) { // ones then fuzz
- // k_msleep(10);
- if ((ones_counter % 2 == 0) & (chips1[jj + 1] == 0)) { // even ones then fuzz then zero, fuzz is a zero
- jj++;
- chips1[jj - 1] = 0;
- ones_counter = 0;
- }
- if ((ones_counter % 2 == 0) & (chips1[jj + 1] != 0)) { // even ones then fuzz then not zero - investigate
- if (chips1[jj + 1] == 1) { // subsequent bit is a 1
- kk = 1;
- while (chips1[jj + kk] == 1) {
- ones_counter++;
- kk++;
- }
- if (ones_counter % 2 == 1) { // indicates an odd # of 1s, so the fuzzy has to be a 1
- jj++;
- chips1[jj - 1] = 1;
- ones_counter = 1; // not actually 1, but it's ok for modulo purposes
- } else if (ones_counter % 2 == 0) { // even ones -> fuzz -> even ones, indeterminate
- jj++;
- ones_counter = 0;
- }
- } else if (chips1[jj + 1] == FUZZY_CHIP) { // subsequent bit is a fuzzy - skip for now...
- jj++;
- }
- } else if ((ones_counter % 2 == 1) & (chips1[jj + 1] == FUZZY_CHIP)) { // odd ones then fuzz then fuzz, fuzz is 1 then 0
- jj += 2;
- chips1[jj - 1] = 0;
- chips1[jj - 2] = 1;
- ones_counter = 0;
- } else if ((ones_counter % 2 == 1) & (chips1[jj + 1] != 0)) { // odd ones then fuzz then not zero - the fuzzy has to be a 1
- jj++;
- ones_counter++;
- chips1[jj - 1] = 1;
- } else { // catch statement
- jj++;
- }
- }
- }
- // finish up demodulation, pick off straggling fuzzies and odd runs of 1s
- for (jj = 0; jj < 128;) {
- if (chips1[jj] == 0x00) { // zero, keep going, reset state
- if (ones_counter % 2 == 1) { // implies an odd # of 1s
- chips1[jj - ones_counter - 1] = 1; // change the bit before the run of 1s to a 1 to make it even
- }
- jj++;
- ones_counter = 0;
- } else if (chips1[jj] == 0x01) { // one, keep going, keep track of the # of ones
- if (jj == 0) { // edge case - first chip = 1 is unreliable, do not increment 1s counter
- jj++;
- } else {
- jj = jj + 1;
- ones_counter = ones_counter + 1;
- }
- } else if (chips1[jj] == FUZZY_CHIP) {
- // if (ones_counter==0) { // fuzz after zeros, if the next chip is a 1, make it a 1, else make it a zero
- // if (chips1[jj+1]==1) {
- // jj+1;
- // chips1[jj-1] = 1;
- // ones_counter++;
- // }
- // else {
- // jj++;
- // }
- // } <---- this is commented out because this is a VERY rare edge case and seems to be causing occasional problems w/ otherwise clean packets
- if ((ones_counter != 0) & (ones_counter % 2 == 0)) { // fuzz after even ones - at this point this is almost always a 0
- jj++;
- chips1[jj - 1] = 0;
- ones_counter = 0;
- } else if (ones_counter % 2 == 1) { // fuzz after odd ones - exceedingly uncommon at this point, make it a 1
- jj++;
- chips1[jj - 1] = 1;
- ones_counter++;
- } else { // catch statement
- jj++;
- }
- } else { // catch statement
- jj++;
- }
- }
-
- // next step in demodulation: take the resulting array of 1 and 0 chips and put them into a single 64-bit unsigned int
- // this is primarily for easy manipulation for polynomial searching
- chip_index = 0; // TODO: rename "chip index" it's not descriptive
- chipsH1 = 0;
- gg = 0; // looping/while break indicating variable, reset to 0
- while (gg < 64) { // very last one - make all remaining fuzzies 0 and load it into two 64-bit longs
- if (chip_index > 127) {
- gg = 65; // break
- }
- if ((chip_index == 0) & (chips1[chip_index] == 0x01)) { // first bit is a 1 - ignore it
- chip_index = chip_index + 1;
- } else if ((chip_index == 0) & (chips1[chip_index] == FUZZY_CHIP)) { // first bit is fuzzy - ignore it
- chip_index = chip_index + 1;
- } else if (gg == 63) { // load the final bit
- if (chips1[chip_index] == 0) {
- chipsH1 &= 0xFFFFFFFFFFFFFFFE;
- gg = gg + 1;
- chip_index = chip_index + 1;
- } else if (chips1[chip_index] == FUZZY_CHIP) {
- chipsH1 &= 0xFFFFFFFFFFFFFFFE;
- gg = gg + 1;
- chip_index = chip_index + 1;
- } else if (chips1[chip_index] == 0x01) {
- chipsH1 |= 0x0000000000000001;
- gg = gg + 1;
- chip_index = chip_index + 2;
- }
- } else { // load the bit in!!
- if (chips1[chip_index] == 0) {
- chipsH1 &= 0xFFFFFFFFFFFFFFFE;
- chipsH1 = chipsH1 << 1;
- gg = gg + 1;
- chip_index = chip_index + 1;
- } else if (chips1[chip_index] == FUZZY_CHIP) {
- chipsH1 &= 0xFFFFFFFFFFFFFFFE;
- chipsH1 = chipsH1 << 1;
- gg = gg + 1;
- chip_index = chip_index + 1;
- } else if (chips1[chip_index] == 0x01) {
- chipsH1 |= 0x0000000000000001;
- chipsH1 = chipsH1 << 1;
- gg = gg + 1;
- chip_index = chip_index + 2;
- }
- }
- }
- return chipsH1;
-}
-
-uint64_t _poly_check(uint32_t poly, uint32_t bits, uint8_t numbits) {
- uint64_t bits_out = 0;
- uint8_t shift_counter = 1;
- uint8_t b1 = 0;
- uint32_t buffer = bits; // mask to prevent bit overflow
- poly &= 0x00001FFFF; // mask to prevent silliness
- bits_out |= buffer; // initialize 17 LSBs of result
- bits_out &= 0x00000000FFFFFFFF; // mask because I didn't want to re-cast the buffer
-
- while (shift_counter <= numbits) {
- bits_out = bits_out << 1; // shift left (forward in time) by 1
-
- b1 = __builtin_popcount(buffer & poly) & 0x01; // mask the buffer w/ the selected polynomial
- buffer = ((buffer << 1) | b1) & (0x0001FFFF);
-
- bits_out |= ((b1) & (0x01)); // put result of the XOR operation into the new bit
- shift_counter++;
- }
- return bits_out;
-}
-
-uint8_t _determine_polynomial(uint64_t chipsH1, int8_t *start_val) {
- // check which polynomial the bit sequence is part of
- // TODO: make function a void and modify memory directly
- // TODO: rename chipsH1 to something relevant... like bits?
-
- *start_val = 8; // TODO: remove this? possible that I modify start value during the demodulation process
-
- int32_t bits_N_for_comp = 47 - *start_val;
- uint32_t bit_buffer1 = (uint32_t)(((0xFFFF800000000000) & chipsH1) >> 47);
- uint64_t bits_from_poly[LH2_POLYNOMIAL_COUNT] = { 0 };
- uint64_t weights[LH2_POLYNOMIAL_COUNT] = { 0xFFFFFFFFFFFFFFFF };
- uint8_t selected_poly = LH2_POLYNOMIAL_ERROR_INDICATOR; // initialize to error condition
- uint8_t min_weight_idx = LH2_POLYNOMIAL_ERROR_INDICATOR;
- uint64_t min_weight = LH2_POLYNOMIAL_ERROR_INDICATOR;
- uint64_t bits_to_compare = 0;
- int32_t threshold = POLYNOMIAL_BIT_ERROR_INITIAL_THRESHOLD;
-
-#if defined(LH2_MOCAP_FILTER)
- threshold = 0;
-#endif
-
- // try polynomial vs. first buffer bits
- // this search takes 17-bit sequences and runs them forwards through the polynomial LFSRs.
- // if the remaining detected bits fit well with the chosen 17-bit sequence and a given polynomial, it is treated as "correct"
- // in case of bit errors at the beginning of the capture, the 17-bit sequence is shifted (to a max of 8 bits)
- // in case of bit errors at the end of the capture, the ending bits are removed (to a max of
- // removing bits reduces the threshold correspondingly, as incorrect packet detection will cause a significant delay in location estimate
-
- // run polynomial search on the first capture
- while (1) {
-
- // TODO: do this math stuff in multiple operations to: (a) make it readable (b) ensure order-of-execution
- bit_buffer1 = (uint32_t)(((0xFFFF800000000000 >> (*start_val)) & chipsH1) >> (64 - 17 - (*start_val)));
- bits_to_compare = (chipsH1 & (0xFFFFFFFFFFFFFFFF << (64 - 17 - (*start_val) - bits_N_for_comp)));
- // reset the minimum polynomial match found
- min_weight_idx = LH2_POLYNOMIAL_ERROR_INDICATOR;
- min_weight = LH2_POLYNOMIAL_ERROR_INDICATOR;
- // Check against all the known polynomials
- for (uint8_t i = 0; i < LH2_POLYNOMIAL_COUNT; i++) {
- bits_from_poly[i] = (((_poly_check(_polynomials[i], bit_buffer1, bits_N_for_comp)) << (64 - 17 - (*start_val) - bits_N_for_comp)) | (chipsH1 & (0xFFFFFFFFFFFFFFFF << (64 - (*start_val)))));
- // weights[i] = _hamming_weight(bits_from_poly[i] ^ bits_to_compare);
- weights[i] = __builtin_popcount(bits_from_poly[i] ^ bits_to_compare);
- // Keep track of the minimum weight value and which polinimial generated it.
- if (weights[i] < min_weight) {
- min_weight_idx = i;
- min_weight = weights[i];
- }
- }
-
- // If you found a sufficiently good value, then return which polinomial generated it
- if (min_weight <= (uint64_t)threshold) {
- selected_poly = min_weight_idx;
- break;
- // match failed, try again removing bits from the end
- } else if (*start_val > 8) {
- *start_val = 8;
- bits_N_for_comp = bits_N_for_comp - 9;
- if (threshold > 2) {
- threshold = threshold - 1;
- } else if (threshold == 2) { // keep threshold at ones, but you're probably screwed with an unlucky bit error
- threshold = 2;
- }
- } else {
- *start_val = *start_val + 1;
- bits_N_for_comp -= 1;
- }
-
- // too few bits to reliably compare, give up
- if (bits_N_for_comp < 19) {
- selected_poly = LH2_POLYNOMIAL_ERROR_INDICATOR; // mark the poly as "wrong"
- break;
- }
- }
- return selected_poly;
-}
-
-uint64_t _hamming_weight(uint64_t bits_in) { // TODO: bad name for function? or is it, it might be a good name for a function, because it describes exactly what it does
- uint64_t weight = bits_in;
- weight = weight - ((weight >> 1) & 0x5555555555555555); // find # of 1s in every 2-bit block
- weight = (weight & 0x3333333333333333) + ((weight >> 2) & 0x3333333333333333); // find # of 1s in every 4-bit block
- weight = (weight + (weight >> 4)) & 0x0F0F0F0F0F0F0F0F; // find # of 1s in every 8-bit block
- weight = (weight + (weight >> 8)) & 0x00FF00FF00FF00FF; // find # of 1s in every 16-bit block
- weight = (weight + (weight >> 16)) & 0x0000FFFF0000FFFF; // find # of 1s in every 32-bit block
- weight = (weight + (weight >> 32)); // add the two 32-bit block results together
- weight = weight & 0x000000000000007F; // mask final result, max value of 64, 0'b01000000
- return weight;
-}
-
-uint32_t _reverse_count_p(uint8_t index, uint32_t bits) {
-
- bits = bits & 0x0001FFFF; // initialize buffer to initial bits, masked
- uint32_t buffer_down = bits;
- uint32_t buffer_up = bits;
-
- uint32_t count_down = 0;
- uint32_t count_up = 0;
- uint32_t b17 = 0;
- uint32_t b1 = 0;
- uint32_t masked_buff = 0;
- uint8_t hash_index_down = 0;
- uint8_t hash_index_up = 0;
-
- // Copy const variables (Flash) into local variables (RAM) to speed up execution.
- uint32_t _end_buffers_local[NUM_LSFR_COUNT_CHECKPOINTS] = { 0 };
- uint32_t polynomials_local = _polynomials[index];
- for (size_t i = 0; i < NUM_LSFR_COUNT_CHECKPOINTS; i++) {
- _end_buffers_local[i] = _end_buffers[index][i];
- }
-
- while (buffer_up != _end_buffers_local[0]) // do until buffer reaches one of the saved states
- {
-
- //
- // CHECKPOINT CHECKING
- //
-
- // Check end_buffer backward count
- // Lower hash option in the hash table
- hash_index_down = _end_buffers_hashtable[(buffer_down >> 2) & HASH_TABLE_MASK] & CHECKPOINT_TABLE_MASK_LOW;
- if (buffer_down == _end_buffers_local[hash_index_down]) {
- count_down = count_down + 2048 * hash_index_down - 1;
- _update_lfsr_checkpoints(index, bits, count_down);
- return count_down;
- }
- // Upper hash option in the hash table
- hash_index_down = (_end_buffers_hashtable[(buffer_down >> 2) & HASH_TABLE_MASK] & CHECKPOINT_TABLE_MASK_HIGH) >> CHECKPOINT_TABLE_BITS;
- if (buffer_down == _end_buffers_local[hash_index_down]) {
- count_down = count_down + 2048 * hash_index_down - 1;
- _update_lfsr_checkpoints(index, bits, count_down);
- return count_down;
- }
-
- // Check end_buffer forward count
- // Lower hash option in the hash table
- hash_index_up = _end_buffers_hashtable[(buffer_up >> 2) & HASH_TABLE_MASK] & CHECKPOINT_TABLE_MASK_LOW;
- if (buffer_up == _end_buffers_local[hash_index_up]) {
- count_up = 2048 * hash_index_up - count_up - 1;
- _update_lfsr_checkpoints(index, bits, count_up);
- return count_up;
- }
- // Upper hash option in the hash table
- hash_index_up = (_end_buffers_hashtable[(buffer_up >> 2) & HASH_TABLE_MASK] & CHECKPOINT_TABLE_MASK_HIGH) >> CHECKPOINT_TABLE_BITS;
- if (buffer_up == _end_buffers_local[hash_index_up]) {
- count_up = 2048 * hash_index_up - count_up - 1;
- _update_lfsr_checkpoints(index, bits, count_up);
- return count_up;
- }
-
- // Check the dynamical checkpoints, backward
- if (buffer_down == _lfsr_checkpoint_bits[index][0]) {
- count_down = count_down + _lfsr_checkpoint_count[index][0];
- _update_lfsr_checkpoints(index, bits, count_down);
- return count_down;
- }
- if (buffer_down == _lfsr_checkpoint_bits[index][1]) {
- count_down = count_down + _lfsr_checkpoint_count[index][1];
- _update_lfsr_checkpoints(index, bits, count_down);
- return count_down;
- }
-
- // Check the dynamical checkpoints, forward
- if (buffer_up == _lfsr_checkpoint_bits[index][0]) {
- count_up = _lfsr_checkpoint_count[index][0] - count_up;
- _update_lfsr_checkpoints(index, bits, count_up);
- return count_up;
- }
- if (buffer_up == _lfsr_checkpoint_bits[index][1]) {
- count_up = _lfsr_checkpoint_count[index][1] - count_up;
- _update_lfsr_checkpoints(index, bits, count_up);
- return count_up;
- }
-
- //
- // LSFR UPDATE
- //
- // LSFR backward update
- b17 = buffer_down & 0x00000001; // save the "newest" bit of the buffer
- buffer_down = (buffer_down & (0x0001FFFE)) >> 1; // shift the buffer right, backwards in time
- masked_buff = (buffer_down) & (polynomials_local); // mask the buffer w/ the selected polynomial
- buffer_down = buffer_down | (((__builtin_popcount(masked_buff) ^ b17) & 0x00000001) << 16); // This weird line propagates the LSFR one bit into the past
- count_down++;
-
- // LSFR forward update
- b1 = __builtin_popcount(buffer_up & polynomials_local) & 0x01; // mask the buffer w/ the selected polynomial
- buffer_up = ((buffer_up << 1) | b1) & (0x0001FFFF);
- count_up++;
- }
- return count_up;
-}
-
void _lh2_pin_set_input(const gpio_t *gpio) {
// Configure Data pin as INPUT, with no pullup or pull down.
nrf_port[gpio->port]->PIN_CNF[gpio->pin] = (GPIO_PIN_CNF_DIR_Input << GPIO_PIN_CNF_DIR_Pos) |
@@ -1737,41 +709,20 @@ bool _get_from_spi_ring_buffer(lh2_ring_buffer_t *cb, uint8_t *data, uint32_t *t
return true;
}
-
-void _fill_hash_table(uint16_t *hash_table) {
-
- // Iterate over all the checkpoints and save the HASH_TABLE_BITS 11 bits as a a index for the hashtable
- for (size_t poly = 0; poly < LH2_POLYNOMIAL_COUNT; poly++) {
- for (size_t checkpoint = 1; checkpoint < NUM_LSFR_COUNT_CHECKPOINTS; checkpoint++) {
- if (hash_table[(_end_buffers[poly][checkpoint] >> 2) & HASH_TABLE_MASK] == 0) { // We shift by 2 to the right because we precomputed that that hash has the least amount of collisions in the hash table
-
- hash_table[(_end_buffers[poly][checkpoint] >> 2) & HASH_TABLE_MASK] = checkpoint & CHECKPOINT_TABLE_MASK_LOW; // that element of the hash table is empty, copy the checkpoint into the lower 6 bits
- } else {
- hash_table[(_end_buffers[poly][checkpoint] >> 2) & HASH_TABLE_MASK] |= (checkpoint << CHECKPOINT_TABLE_BITS) & CHECKPOINT_TABLE_MASK_HIGH; // If the element is already occupied, use the upper 6 bits
- }
- }
- }
-}
-
-void _update_lfsr_checkpoints(uint8_t polynomial, uint32_t bits, uint32_t count) {
-
- // Update the current running weighted sum. 75% of old value +25% of new value
- _lsfr_checkpoint_average = (((_lsfr_checkpoint_average * 3) >> 2) + (count >> 2));
-
- // Is the new count higher or lower than the current running average.
- uint8_t index = count <= _lsfr_checkpoint_average ? 0 : 1;
+void _update_lfsr_checkpoints(uint8_t polynomial, uint32_t bits, uint32_t count, uint8_t sweep) {
// Save the new count in the correct place in the checkpoint array
- _lfsr_checkpoint_bits[polynomial][index] = bits;
- _lfsr_checkpoint_count[polynomial][index] = count;
+ _lh2_vars.checkpoint.bits[polynomial][sweep] = bits;
+ _lh2_vars.checkpoint.count[polynomial][sweep] = count;
}
uint8_t _select_sweep(db_lh2_t *lh2, uint8_t polynomial, uint32_t timestamp) {
// TODO: check the exact, per-mode period of each polynomial instead of using a blanket 20ms
- uint8_t basestation = polynomial >> 1; ///< each base station uses 2 polynomials. integer dividing by 2 maps the polynomial number to the basestation number.
- uint32_t now = db_timer_hf_now(LH2_TIMER_DEV);
- // check that current data stored is not too old.
+ uint8_t basestation = polynomial >> 1; ///< each base station uses 2 polynomials. integer dividing by 2 maps the polynomial number to the basestation number.
+ uint16_t sweep_period = _lh2_sweep_period_us[basestation];
+ uint32_t now = db_timer_hf_now(LH2_TIMER_DEV);
+
for (size_t sweep = 0; sweep < 2; sweep++) {
if (now - lh2->timestamps[0][basestation] > LH2_MAX_DATA_VALID_TIME_US) {
// Remove data that is too old.
@@ -1798,8 +749,8 @@ uint8_t _select_sweep(db_lh2_t *lh2, uint8_t polynomial, uint32_t timestamp) {
case LH2_SWEEP_FIRST_SLOT_EMPTY:
{
// check that the filled slot is not a perfect 20ms match to the new data.
- uint32_t diff = (timestamp - lh2->timestamps[1][basestation]) % LH2_SWEEP_PERIOD_US;
- diff = diff < LH2_SWEEP_PERIOD_US - diff ? diff : LH2_SWEEP_PERIOD_US - diff;
+ uint32_t diff = (timestamp - lh2->timestamps[1][basestation]) % sweep_period;
+ diff = diff < sweep_period - diff ? diff : sweep_period - diff;
if (diff < LH2_SWEEP_PERIOD_THRESHOLD_US) {
// match: use filled slot
@@ -1814,8 +765,8 @@ uint8_t _select_sweep(db_lh2_t *lh2, uint8_t polynomial, uint32_t timestamp) {
case LH2_SWEEP_SECOND_SLOT_EMPTY:
{
// check that the filled slot is not a perfect 20ms match to the new data.
- uint32_t diff = (timestamp - lh2->timestamps[0][basestation]) % LH2_SWEEP_PERIOD_US;
- diff = diff < LH2_SWEEP_PERIOD_US - diff ? diff : LH2_SWEEP_PERIOD_US - diff;
+ uint32_t diff = (timestamp - lh2->timestamps[0][basestation]) % sweep_period;
+ diff = diff < sweep_period - diff ? diff : sweep_period - diff;
if (diff < LH2_SWEEP_PERIOD_THRESHOLD_US) {
// match: use filled slot
@@ -1830,10 +781,10 @@ uint8_t _select_sweep(db_lh2_t *lh2, uint8_t polynomial, uint32_t timestamp) {
case LH2_SWEEP_BOTH_SLOTS_FULL:
{
// How far away is this new pulse from the already stored data
- uint32_t diff_0 = (timestamp - lh2->timestamps[0][basestation]) % LH2_SWEEP_PERIOD_US;
- diff_0 = diff_0 < LH2_SWEEP_PERIOD_US - diff_0 ? diff_0 : LH2_SWEEP_PERIOD_US - diff_0;
- uint32_t diff_1 = (timestamp - lh2->timestamps[1][basestation]) % LH2_SWEEP_PERIOD_US;
- diff_1 = diff_1 < LH2_SWEEP_PERIOD_US - diff_1 ? diff_1 : LH2_SWEEP_PERIOD_US - diff_1;
+ int64_t diff_0 = ((timestamp - lh2->timestamps[0][basestation]) % sweep_period);
+ diff_0 = diff_0 < sweep_period - diff_0 ? diff_0 : sweep_period - diff_0;
+ int64_t diff_1 = ((timestamp - lh2->timestamps[1][basestation]) % sweep_period);
+ diff_1 = diff_1 < sweep_period - diff_1 ? diff_1 : sweep_period - diff_1;
// Use the one that is closest to 20ms
if (diff_0 <= diff_1) {
@@ -1855,25 +806,6 @@ uint8_t _select_sweep(db_lh2_t *lh2, uint8_t polynomial, uint32_t timestamp) {
return selected_sweep;
}
-bool _check_mocap_interference(uint8_t *arr) {
-
- // Qualysis Mocap cameras pulse IR light modulated with a regular square wave at 1Mhz.
- // At the 32Mhz speed we sample the SPI, that corresponds to an alternating 0xFF,0xFF,0xFF,0x00,0x00,0x00 pattern
-
- // Check only the bottom half of the array, that should be enough to catch an error.
- for (int i = 0; i < SPI_BUFFER_SIZE / 2; i++) {
- // Check for 3 consecutive 0xFF
- if (arr[i] == 0xFF && arr[i + 1] == 0xFF && arr[i + 2] == 0xFF) {
- return true; // Error for 3 consecutive 0xFF
- }
- // Check for 3 consecutive 0x00
- if (arr[i] == 0x00 && arr[i + 1] == 0x00 && arr[i + 2] == 0x00) {
- return true; // Error for 3 consecutive 0x00
- }
- }
- return false; // No error found
-}
-
void db_lh2_handle_isr(void) {
// Reenable the PPI channel
db_lh2_start();
diff --git a/doc/sphinx/bsp.md b/doc/sphinx/bsp.md
index fbc0bac..8a14d84 100644
--- a/doc/sphinx/bsp.md
+++ b/doc/sphinx/bsp.md
@@ -16,6 +16,8 @@ _api/bsp_gpio
_api/bsp_i2c
_api/bsp_ipc
_api/bsp_lh2
+_api/bsp_lh2_decoder
+_api/bsp_lh2_checkpoints
_api/bsp_nvmc
_api/bsp_partition
_api/bsp_pwm