From cea60ead2bd12f6034b6948221aa2b737e52e513 Mon Sep 17 00:00:00 2001 From: Zilog80 Date: Sun, 9 Sep 2018 20:08:09 +0200 Subject: [PATCH] LMS6-ECC: FRAME 300 / RS-BLOCK (255+5) --- lms6/lms6.txt | 25 ++++++++++++++++++++++--- lms6/lms6ecc.c | 17 ++++++++++------- 2 files changed, 32 insertions(+), 10 deletions(-) diff --git a/lms6/lms6.txt b/lms6/lms6.txt index 34360d8..3dee373 100644 --- a/lms6/lms6.txt +++ b/lms6/lms6.txt @@ -2,6 +2,7 @@ Lockheed Martin Sippican LMS6 (403 MHz) + FSK 4800 baud NRZ-S, convolutional code R=1/2 K=8: 0x95: pA = x^7+x^4+x^2+1 = (x+1)(x^6+x^5+x^4+x+1) = (x+1)qA @@ -12,11 +13,29 @@ NRZ-S, convolutional code R=1/2 bits: little endian bytes: big endian -Reed-Solomon RS(223,32)-CCSDS -(msg[223],par[32]): 223+32 byte vor 5-byte-Block [00 58 f3 3f b8] (ring-buffer!) +4800 bit/s: rate=1/2: 300 byte/s + +Reed-Solomon RS(223,32)-CCSDS blocks +block format: SYNC (5 byte) + RS-codeword (255 byte) (-> block size: 260 byte) +SYNC: 0x0058f33fb8 +RS-codeword: RS-MSG (223 byte) + RS-PAR (32 byte) + +260:300 = 13:15 - every 13 sec block-position repeats, +full-frame length 13 sec (data-frames): 13*300 byte = 15 blocks + +1 data-frame per sec: 223 DATA bytes ( + fill) +DATA = 221 byte + 2 byte CRC16 +DATA: 24 54 00 00 .. (len=221+2) CRC16: poly 0x1021 -crc-frame: 24 54 00 00 00 .. (len=221) + +synchronisation: +a) (24)54 00 00 .. (DATA-frame) +b) (00)58 f3 3f b8 (RS-block) + +every 6/7 sec: DATA=RS-MSG | SYNC | ... + + sync/header: diff --git a/lms6/lms6ecc.c b/lms6/lms6ecc.c index 766885d..4abad53 100644 --- a/lms6/lms6ecc.c +++ b/lms6/lms6ecc.c @@ -4,7 +4,7 @@ (403 MHz) gcc lms6ecc.c -lm -o lms6ecc - ./lms6ecc -v -b --ecc + ./lms6ecc -v -b --ecc2 */ #include @@ -228,6 +228,12 @@ ui8_t *frame_bytes = frame+OFS; // { 0x00, 0x7A, ... } ui8_t *p_frame = frame; +// RS-SYNC +// (00) 58 f3 3f b8 +// ................ 0000001011110011 1110110100100011 0110100000001011 0101110001011110 +ui8_t rs_sync[] = { 0x00, 0x58, 0xf3, 0x3f, 0xb8}; + + char buf[HEADLEN]; int bufpos = -1; @@ -748,16 +754,13 @@ int get_GPSvel24() { #define rs_K 223 #define rs_R (rs_N-rs_K) // 32 ui8_t rs_cw[rs_N]; -int eccnt = 0; - -ui8_t rs_ecc32end[] = { 0x00, 0x58, 0xf3, 0x3f, 0xb8}; - -ui8_t frm_bytes[FRAME_LEN+OVERLAP +8]; #define ECCBUF_LEN (3*FRAME_LEN+32) ui8_t ecc_buf[ECCBUF_LEN]; int bufidx = 0; +ui8_t frm_bytes[FRAME_LEN+OVERLAP +8]; + typedef struct { int pos; ui8_t bytes[FRAME_LEN+OVERLAP+5 +8]; @@ -890,7 +893,7 @@ void proc_frame(int len) { pos = 0; for (n = 0; n < flen-rs_R-5; n++) { int bf = 0; - for (j = 0; j < 5; j++) bf += (frm_bytes[n+rs_R+j] == rs_ecc32end[j]); + for (j = 0; j < 5; j++) bf += (frm_bytes[n+rs_R+j] == rs_sync[j]); if (bf == 5) { if (k < kMAX) { rsbf[k].epos = rs_R + n;