kopia lustrzana https://github.com/projecthorus/radiosonde_auto_rx
				
				
				
			
		
			
				
	
	
		
			98 wiersze
		
	
	
		
			2.8 KiB
		
	
	
	
		
			C
		
	
	
			
		
		
	
	
			98 wiersze
		
	
	
		
			2.8 KiB
		
	
	
	
		
			C
		
	
	
 | 
						|
/*
 | 
						|
 *  BCH / Reed-Solomon
 | 
						|
 *    encoder()
 | 
						|
 *    decoder()  (Euklid. Alg.)
 | 
						|
 *
 | 
						|
 *
 | 
						|
 * author: zilog80
 | 
						|
 *
 | 
						|
 *
 | 
						|
 */
 | 
						|
 | 
						|
#ifdef INCLUDESTATIC
 | 
						|
    #define INCSTAT static
 | 
						|
#else
 | 
						|
    typedef unsigned char  ui8_t;
 | 
						|
    typedef unsigned int  ui32_t;
 | 
						|
    #define INCSTAT
 | 
						|
#endif
 | 
						|
 | 
						|
 | 
						|
#define MAX_DEG 254  // max N-1
 | 
						|
 | 
						|
 | 
						|
typedef struct {
 | 
						|
    ui32_t f;
 | 
						|
    ui32_t ord;
 | 
						|
    ui8_t alpha;
 | 
						|
    ui8_t exp_a[256];
 | 
						|
    ui8_t log_a[256];
 | 
						|
} GF_t;
 | 
						|
 | 
						|
typedef struct {
 | 
						|
    ui8_t N;
 | 
						|
    ui8_t t;
 | 
						|
    ui8_t R;  // RS: R=2t, BCH: R<=mt
 | 
						|
    ui8_t K;  // K=N-R
 | 
						|
    ui8_t b;
 | 
						|
    ui8_t p; ui8_t ip; // p*ip = 1 mod N
 | 
						|
    ui8_t g[MAX_DEG+1];  // ohne g[] eventuell als init_return
 | 
						|
    GF_t GF;
 | 
						|
} RS_t;
 | 
						|
 | 
						|
 | 
						|
static GF_t GF256RS = { .f     = 0x11D,  // RS-GF(2^8): X^8 + X^4 + X^3 + X^2 + 1 : 0x11D
 | 
						|
                        .ord   = 256,    // 2^8
 | 
						|
                        .alpha = 0x02,   // generator: alpha = X
 | 
						|
                        .exp_a = {0},
 | 
						|
                        .log_a = {0} };
 | 
						|
 | 
						|
static GF_t GF256RSccsds = { .f     = 0x187,  // RS-GF(2^8): X^8 + X^7 + X^2 + X + 1 : 0x187
 | 
						|
                             .ord   = 256,    // 2^8
 | 
						|
                             .alpha = 0x02,   // generator: alpha = X
 | 
						|
                             .exp_a = {0},
 | 
						|
                             .log_a = {0} };
 | 
						|
 | 
						|
static GF_t GF64BCH = { .f     = 0x43,   // BCH-GF(2^6): X^6 + X + 1 : 0x43
 | 
						|
                        .ord   = 64,     // 2^6
 | 
						|
                        .alpha = 0x02,   // generator: alpha = X
 | 
						|
                        .exp_a = {0},
 | 
						|
                        .log_a = {0} };
 | 
						|
 | 
						|
static GF_t GF16RS = { .f     = 0x13,   // RS-GF(2^4): X^4 + X + 1 : 0x13
 | 
						|
                       .ord   = 16,     // 2^4
 | 
						|
                       .alpha = 0x02,   // generator: alpha = X
 | 
						|
                       .exp_a = {0},
 | 
						|
                       .log_a = {0} };
 | 
						|
 | 
						|
static GF_t GF256AES = { .f     = 0x11B,  // AES-GF(2^8): X^8 + X^4 + X^3 + X + 1 : 0x11B
 | 
						|
                         .ord   = 256,    // 2^8
 | 
						|
                         .alpha = 0x03,   // generator: alpha = X+1
 | 
						|
                         .exp_a = {0},
 | 
						|
                         .log_a = {0} };
 | 
						|
 | 
						|
 | 
						|
static RS_t RS256 = { 255, 12, 24, 231, 0, 1, 1, {0}, {0} };
 | 
						|
static RS_t RS256ccsds = { 255, 16, 32, 223, 112, 11, 116, {0}, {0} };
 | 
						|
static RS_t BCH64 = {  63,  2, 12,  51, 1, 1, 1, {0}, {0} };
 | 
						|
 | 
						|
// static RS_t RS16_0 = { 15, 3, 6,  9, 0, 1, 1, {0}, {0} };
 | 
						|
static RS_t RS16ccsds = { 15, 2, 4, 11, 6, 1, 1, {0}, {0} };
 | 
						|
 | 
						|
 | 
						|
#ifndef INCLUDESTATIC
 | 
						|
 | 
						|
int rs_init_RS255(RS_t *RS);
 | 
						|
int rs_init_RS255ccsds(RS_t *RS);
 | 
						|
int rs_init_RS15ccsds(RS_t *RS);
 | 
						|
int rs_init_BCH64(RS_t *RS);
 | 
						|
 | 
						|
int rs_encode(RS_t *RS, ui8_t cw[]);
 | 
						|
int rs_decode(RS_t *RS, ui8_t cw[], ui8_t *err_pos, ui8_t *err_val);
 | 
						|
int rs_decode_ErrEra(RS_t *RS, ui8_t cw[], int nera, ui8_t era_pos[], ui8_t *err_pos, ui8_t *err_val);
 | 
						|
int rs_decode_bch_gf2t2(RS_t *RS, ui8_t cw[], ui8_t *err_pos, ui8_t *err_val);
 | 
						|
 | 
						|
#endif
 | 
						|
 |