/*
 * Copyright (C) 2015 Jared Boone, ShareBrained Technology, Inc.
 * Copyright (C) 2016 Furrtek
 *
 * This file is part of PortaPack.
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 2, or (at your option)
 * any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; see the file COPYING.  If not, write to
 * the Free Software Foundation, Inc., 51 Franklin Street,
 * Boston, MA 02110-1301, USA.
 */

#include "dcs.hpp"

namespace dcs {

const uint16_t dcs_parity[DCS_CODES_NB] = {
    0b11000111010,  // 0
    0b01001001111,  // 1
    0b01010100101,  // 2
    0b11011010000,  // 3
    0b01101110001,  // 4
    0b11100000100,  // 5
    0b11111101110,  // 6
    0b01110011011,  // 7
    0b00011011001,  // 8
    0b10010101100,  // 9
    0b10001000110,  // 10
    0b00000110011,  // 11
    0b10110010010,  // 12
    0b00111100111,  // 13
    0b00100001101,  // 14
    0b10101111000,  // 15
    0b11110001001,  // 16
    0b01111111100,  // 17
    0b01100010110,  // 18
    0b11101100011,  // 19
    0b01011000010,  // 20
    0b11010110111,  // 21
    0b11001011101,  // 22
    0b01000101000,  // 23
    0b00101101010,  // 24
    0b10100011111,  // 25
    0b10111110101,  // 26
    0b00110000000,  // 27
    0b10000100001,  // 28
    0b00001010100,  // 29
    0b00010111110,  // 30
    0b10011001011,  // 31
    0b10101011100,  // 32
    0b00100101001,  // 33
    0b00111000011,  // 34
    0b10110110110,  // 35
    0b00000010111,  // 36
    0b10001100010,  // 37
    0b10010001000,  // 38
    0b00011111101,  // 39
    0b01110111111,  // 40
    0b11111001010,  // 41
    0b11100100000,  // 42
    0b01101010101,  // 43
    0b11011110100,  // 44
    0b01010000001,  // 45
    0b01001101011,  // 46
    0b11000011110,  // 47
    0b10011101111,  // 48
    0b00010011010,  // 49
    0b00001110000,  // 50
    0b10000000101,  // 51
    0b00110100100,  // 52
    0b10111010001,  // 53
    0b10100111011,  // 54
    0b00101001110,  // 55
    0b01000001100,  // 56
    0b11001111001,  // 57
    0b11010010011,  // 58
    0b01011100110,  // 59
    0b11101000111,  // 60
    0b01100110010,  // 61
    0b01111011000,  // 62
    0b11110101101,  // 63
    0b00011110110,  // 64
    0b10010000011,  // 65
    0b10001101001,  // 66
    0b00000011100,  // 67
    0b10110111101,  // 68
    0b00111001000,  // 69
    0b00100100010,  // 70
    0b10101010111,  // 71
    0b11000010101,  // 72
    0b01001100000,  // 73
    0b01010001010,  // 74
    0b11011111111,  // 75
    0b01101011110,  // 76
    0b11100101011,  // 77
    0b11111000001,  // 78
    0b01110110100,  // 79
    0b00101000101,  // 80
    0b10100110000,  // 81
    0b10111011010,  // 82
    0b00110101111,  // 83
    0b10000001110,  // 84
    0b00001111011,  // 85
    0b00010010001,  // 86
    0b10011100100,  // 87
    0b11110100110,  // 88
    0b01111010011,  // 89
    0b01100111001,  // 90
    0b11101001100,  // 91
    0b01011101101,  // 92
    0b11010011000,  // 93
    0b11001110010,  // 94
    0b01000000111,  // 95
    0b01110010000,  // 96
    0b11111100101,  // 97
    0b11100001111,  // 98
    0b01101111010,  // 99
    0b11011011011,  // 100
    0b01010101110,  // 101
    0b01001000100,  // 102
    0b11000110001,  // 103
    0b10101110011,  // 104
    0b00100000110,  // 105
    0b00111101100,  // 106
    0b10110011001,  // 107
    0b00000111000,  // 108
    0b10001001101,  // 109
    0b10010100111,  // 110
    0b00011010010,  // 111
    0b01000100011,  // 112
    0b11001010110,  // 113
    0b11010111100,  // 114
    0b01011001001,  // 115
    0b11101101000,  // 116
    0b01100011101,  // 117
    0b01111110111,  // 118
    0b11110000010,  // 119
    0b10011000000,  // 120
    0b00010110101,  // 121
    0b00001011111,  // 122
    0b10000101010,  // 123
    0b00110001011,  // 124
    0b10111111110,  // 125
    0b10100010100,  // 126
    0b00101100001,  // 127
    0b11111010111,  // 128
    0b01110100010,  // 129
    0b01101001000,  // 130
    0b11100111101,  // 131
    0b01010011100,  // 132
    0b11011101001,  // 133
    0b11000000011,  // 134
    0b01001110110,  // 135
    0b00100110100,  // 136
    0b10101000001,  // 137
    0b10110101011,  // 138
    0b00111011110,  // 139
    0b10001111111,  // 140
    0b00000001010,  // 141
    0b00011100000,  // 142
    0b10010010101,  // 143
    0b11001100100,  // 144
    0b01000010001,  // 145
    0b01011111011,  // 146
    0b11010001110,  // 147
    0b01100101111,  // 148
    0b11101011010,  // 149
    0b11110110000,  // 150
    0b01111000101,  // 151
    0b00010000111,  // 152
    0b10011110010,  // 153
    0b10000011000,  // 154
    0b00001101101,  // 155
    0b10111001100,  // 156
    0b00110111001,  // 157
    0b00101010011,  // 158
    0b10100100110,  // 159
    0b10010110001,  // 160
    0b00011000100,  // 161
    0b00000101110,  // 162
    0b10001011011,  // 163
    0b00111111010,  // 164
    0b10110001111,  // 165
    0b10101100101,  // 166
    0b00100010000,  // 167
    0b01001010010,  // 168
    0b11000100111,  // 169
    0b11011001101,  // 170
    0b01010111000,  // 171
    0b11100011001,  // 172
    0b01101101100,  // 173
    0b01110000110,  // 174
    0b11111110011,  // 175
    0b10100000010,  // 176
    0b00101110111,  // 177
    0b00110011101,  // 178
    0b10111101000,  // 179
    0b00001001001,  // 180
    0b10000111100,  // 181
    0b10011010110,  // 182
    0b00010100011,  // 183
    0b01111100001,  // 184
    0b11110010100,  // 185
    0b11101111110,  // 186
    0b01100001011,  // 187
    0b11010101010,  // 188
    0b01011011111,  // 189
    0b01000110101,  // 190
    0b11001000000,  // 191
    0b00100011011,  // 192
    0b10101101110,  // 193
    0b10110000100,  // 194
    0b00111110001,  // 195
    0b10001010000,  // 196
    0b00000100101,  // 197
    0b00011001111,  // 198
    0b10010111010,  // 199
    0b11111111000,  // 200
    0b01110001101,  // 201
    0b01101100111,  // 202
    0b11100010010,  // 203
    0b01010110011,  // 204
    0b11011000110,  // 205
    0b11000101100,  // 206
    0b01001011001,  // 207
    0b00010101000,  // 208
    0b10011011101,  // 209
    0b10000110111,  // 210
    0b00001000010,  // 211
    0b10111100011,  // 212
    0b00110010110,  // 213
    0b00101111100,  // 214
    0b10100001001,  // 215
    0b11001001011,  // 216
    0b01000111110,  // 217
    0b01011010100,  // 218
    0b11010100001,  // 219
    0b01100000000,  // 220
    0b11101110101,  // 221
    0b11110011111,  // 222
    0b01111101010,  // 223
    0b01001111101,  // 224
    0b11000001000,  // 225
    0b11011100010,  // 226
    0b01010010111,  // 227
    0b11100110110,  // 228
    0b01101000011,  // 229
    0b01110101001,  // 230
    0b11111011100,  // 231
    0b10010011110,  // 232
    0b00011101011,  // 233
    0b00000000001,  // 234
    0b10001110100,  // 235
    0b00111010101,  // 236
    0b10110100000,  // 237
    0b10101001010,  // 238
    0b00100111111,  // 239
    0b01111001110,  // 240
    0b11110111011,  // 241
    0b11101010001,  // 242
    0b01100100100,  // 243
    0b11010000101,  // 244
    0b01011110000,  // 245
    0b01000011010,  // 246
    0b11001101111,  // 247
    0b10100101101,  // 248
    0b00101011000,  // 249
    0b00110110010,  // 250
    0b10111000111,  // 251
    0b00001100110,  // 252
    0b10000010011,  // 253
    0b10011111001,  // 254
    0b00010001100,  // 255
    0b10111100000,  // 256
    0b00110010101,  // 257
    0b00101111111,  // 258
    0b10100001010,  // 259
    0b00010101011,  // 260
    0b10011011110,  // 261
    0b10000110100,  // 262
    0b00001000001,  // 263
    0b01100000011,  // 264
    0b11101110110,  // 265
    0b11110011100,  // 266
    0b01111101001,  // 267
    0b11001001000,  // 268
    0b01000111101,  // 269
    0b01011010111,  // 270
    0b11010100010,  // 271
    0b10001010011,  // 272
    0b00000100110,  // 273
    0b00011001100,  // 274
    0b10010111001,  // 275
    0b00100011000,  // 276
    0b10101101101,  // 277
    0b10110000111,  // 278
    0b00111110010,  // 279
    0b01010110000,  // 280
    0b11011000101,  // 281
    0b11000101111,  // 282
    0b01001011010,  // 283
    0b11111111011,  // 284
    0b01110001110,  // 285
    0b01101100100,  // 286
    0b11100010001,  // 287
    0b11010000110,  // 288
    0b01011110011,  // 289
    0b01000011001,  // 290
    0b11001101100,  // 291
    0b01111001101,  // 292
    0b11110111000,  // 293
    0b11101010010,  // 294
    0b01100100111,  // 295
    0b00001100101,  // 296
    0b10000010000,  // 297
    0b10011111010,  // 298
    0b00010001111,  // 299
    0b10100101110,  // 300
    0b00101011011,  // 301
    0b00110110001,  // 302
    0b10111000100,  // 303
    0b11100110101,  // 304
    0b01101000000,  // 305
    0b01110101010,  // 306
    0b11111011111,  // 307
    0b01001111110,  // 308
    0b11000001011,  // 309
    0b11011100001,  // 310
    0b01010010100,  // 311
    0b00111010110,  // 312
    0b10110100011,  // 313
    0b10101001001,  // 314
    0b00100111100,  // 315
    0b10010011101,  // 316
    0b00011101000,  // 317
    0b00000000010,  // 318
    0b10001110111,  // 319
    0b01100101100,  // 320
    0b11101011001,  // 321
    0b11110110011,  // 322
    0b01111000110,  // 323
    0b11001100111,  // 324
    0b01000010010,  // 325
    0b01011111000,  // 326
    0b11010001101,  // 327
    0b10111001111,  // 328
    0b00110111010,  // 329
    0b00101010000,  // 330
    0b10100100101,  // 331
    0b00010000100,  // 332
    0b10011110001,  // 333
    0b10000011011,  // 334
    0b00001101110,  // 335
    0b01010011111,  // 336
    0b11011101010,  // 337
    0b11000000000,  // 338
    0b01001110101,  // 339
    0b11111010100,  // 340
    0b01110100001,  // 341
    0b01101001011,  // 342
    0b11100111110,  // 343
    0b10001111100,  // 344
    0b00000001001,  // 345
    0b00011100011,  // 346
    0b10010010110,  // 347
    0b00100110111,  // 348
    0b10101000010,  // 349
    0b10110101000,  // 350
    0b00111011101,  // 351
    0b00001001010,  // 352
    0b10000111111,  // 353
    0b10011010101,  // 354
    0b00010100000,  // 355
    0b10100000001,  // 356
    0b00101110100,  // 357
    0b00110011110,  // 358
    0b10111101011,  // 359
    0b11010101001,  // 360
    0b01011011100,  // 361
    0b01000110110,  // 362
    0b11001000011,  // 363
    0b01111100010,  // 364
    0b11110010111,  // 365
    0b11101111101,  // 366
    0b01100001000,  // 367
    0b00111111001,  // 368
    0b10110001100,  // 369
    0b10101100110,  // 370
    0b00100010011,  // 371
    0b10010110010,  // 372
    0b00011000111,  // 373
    0b00000101101,  // 374
    0b10001011000,  // 375
    0b11100011010,  // 376
    0b01101101111,  // 377
    0b01110000101,  // 378
    0b11111110000,  // 379
    0b01001010001,  // 380
    0b11000100100,  // 381
    0b11011001110,  // 382
    0b01010111011,  // 383
    0b10000001101,  // 384
    0b00001111000,  // 385
    0b00010010010,  // 386
    0b10011100111,  // 387
    0b00101000110,  // 388
    0b10100110011,  // 389
    0b10111011001,  // 390
    0b00110101100,  // 391
    0b01011101110,  // 392
    0b11010011011,  // 393
    0b11001110001,  // 394
    0b01000000100,  // 395
    0b11110100101,  // 396
    0b01111010000,  // 397
    0b01100111010,  // 398
    0b11101001111,  // 399
    0b10110111110,  // 400
    0b00111001011,  // 401
    0b00100100001,  // 402
    0b10101010100,  // 403
    0b00011110101,  // 404
    0b10010000000,  // 405
    0b10001101010,  // 406
    0b00000011111,  // 407
    0b01101011101,  // 408
    0b11100101000,  // 409
    0b11111000010,  // 410
    0b01110110111,  // 411
    0b11000010110,  // 412
    0b01001100011,  // 413
    0b01010001001,  // 414
    0b11011111100,  // 415
    0b11101101011,  // 416
    0b01100011110,  // 417
    0b01111110100,  // 418
    0b11110000001,  // 419
    0b01000100000,  // 420
    0b11001010101,  // 421
    0b11010111111,  // 422
    0b01011001010,  // 423
    0b00110001000,  // 424
    0b10111111101,  // 425
    0b10100010111,  // 426
    0b00101100010,  // 427
    0b10011000011,  // 428
    0b00010110110,  // 429
    0b00001011100,  // 430
    0b10000101001,  // 431
    0b11011011000,  // 432
    0b01010101101,  // 433
    0b01001000111,  // 434
    0b11000110010,  // 435
    0b01110010011,  // 436
    0b11111100110,  // 437
    0b11100001100,  // 438
    0b01101111001,  // 439
    0b00000111011,  // 440
    0b10001001110,  // 441
    0b10010100100,  // 442
    0b00011010001,  // 443
    0b10101110000,  // 444
    0b00100000101,  // 445
    0b00111101111,  // 446
    0b10110011010,  // 447
    0b01011000001,  // 448
    0b11010110100,  // 449
    0b11001011110,  // 450
    0b01000101011,  // 451
    0b11110001010,  // 452
    0b01111111111,  // 453
    0b01100010101,  // 454
    0b11101100000,  // 455
    0b10000100010,  // 456
    0b00001010111,  // 457
    0b00010111101,  // 458
    0b10011001000,  // 459
    0b00101101001,  // 460
    0b10100011100,  // 461
    0b10111110110,  // 462
    0b00110000011,  // 463
    0b01101110010,  // 464
    0b11100000111,  // 465
    0b11111101101,  // 466
    0b01110011000,  // 467
    0b11000111001,  // 468
    0b01001001100,  // 469
    0b01010100110,  // 470
    0b11011010011,  // 471
    0b10110010001,  // 472
    0b00111100100,  // 473
    0b00100001110,  // 474
    0b10101111011,  // 475
    0b00011011010,  // 476
    0b10010101111,  // 477
    0b10001000101,  // 478
    0b00000110000,  // 479
    0b00110100111,  // 480
    0b10111010010,  // 481
    0b10100111000,  // 482
    0b00101001101,  // 483
    0b10011101100,  // 484
    0b00010011001,  // 485
    0b00001110011,  // 486
    0b10000000110,  // 487
    0b11101000100,  // 488
    0b01100110001,  // 489
    0b01111011011,  // 490
    0b11110101110,  // 491
    0b01000001111,  // 492
    0b11001111010,  // 493
    0b11010010000,  // 494
    0b01011100101,  // 495
    0b00000010100,  // 496
    0b10001100001,  // 497
    0b10010001011,  // 498
    0b00011111110,  // 499
    0b10101011111,  // 500
    0b00100101010,  // 501
    0b00111000000,  // 502
    0b10110110101,  // 503
    0b11011110111,  // 504
    0b01010000010,  // 505
    0b01001101000,  // 506
    0b11000011101,  // 507
    0b01110111100,  // 508
    0b11111001001,  // 509
    0b11100100011,  // 510
    0b01101010110   // 511
};

uint32_t dcs_word(uint32_t code) {
    code &= 511;
    return (dcs_parity[code] << 12) | (0b100 << 9) | code;
}

}  // namespace dcs