rs41: ecc2 2-pass error correction

pull/5/head
Zilog80 2018-01-22 22:27:17 +01:00
rodzic ee90c7125e
commit 034c6a00c3
3 zmienionych plików z 117 dodań i 30 usunięć

Wyświetl plik

@ -869,6 +869,20 @@ int get_Calconf(int out) {
return 0;
}
/*
frame[pos_FRAME-1] == 0x0F: len == NDATA_LEN(320)
frame[pos_FRAME-1] == 0xF0: len == FRAME_LEN(518)
*/
int frametype() { // -4..+4: 0xF0 -> -4 , 0x0F -> +4
int i;
ui8_t b = frame[pos_FRAME-1];
int ft = 0;
for (i = 0; i < 4; i++) {
ft += ((b>>i)&1) - ((b>>(i+4))&1);
}
return ft;
}
/* ------------------------------------------------------------------------------------ */
/*
(uses fec-lib by KA9Q)
@ -921,6 +935,22 @@ int rs41_ecc(int frmlen) {
errors2 = rs_decode(cw2, err_pos2, err_val2);
if (option_ecc == 2 && (errors1 < 0 || errors2 < 0)) {
frame[pos_FRAME] = (pck_FRAME>>8)&0xFF; frame[pos_FRAME+1] = pck_FRAME&0xFF;
frame[pos_PTU] = (pck_PTU >>8)&0xFF; frame[pos_PTU +1] = pck_PTU &0xFF;
frame[pos_GPS1] = (pck_GPS1 >>8)&0xFF; frame[pos_GPS1 +1] = pck_GPS1 &0xFF;
frame[pos_GPS2] = (pck_GPS2 >>8)&0xFF; frame[pos_GPS2 +1] = pck_GPS2 &0xFF;
frame[pos_GPS3] = (pck_GPS3 >>8)&0xFF; frame[pos_GPS3 +1] = pck_GPS3 &0xFF;
if (frametype() < -2) {
for (i = NDATA_LEN + 7; i < FRAME_LEN-2; i++) frame[i] = 0;
}
for (i = 0; i < rs_K; i++) cw1[rs_R+i] = frame[cfg_rs41.msgpos+2*i ];
for (i = 0; i < rs_K; i++) cw2[rs_R+i] = frame[cfg_rs41.msgpos+2*i+1];
errors1 = rs_decode(cw1, err_pos1, err_val1);
errors2 = rs_decode(cw2, err_pos2, err_val2);
}
// Wenn Fehler im 00-padding korrigiert wurden,
// war entweder der frame zu kurz, oder
// Fehler wurden falsch korrigiert;
@ -1022,19 +1052,31 @@ int print_position(int ec) {
}
void print_frame(int len) {
int i, ec = 0;
int i, ec = 0, ft;
gpx.crc = 0;
/*
frame[pos_FRAME-1] == 0x0F: len == NDATA_LEN(320)
frame[pos_FRAME-1] == 0xF0: len == FRAME_LEN(518)
*/
//frame[pos_FRAME-1] == 0x0F: len == NDATA_LEN(320)
//frame[pos_FRAME-1] == 0xF0: len == FRAME_LEN(518)
ft = frametype();
if (ft > 2) len = NDATA_LEN;
// STD-frames mit 00 auffuellen fuer Fehlerkorrektur
if (len > NDATA_LEN && len < NDATA_LEN+XDATA_LEN-10) {
if (ft < -2) {
len = NDATA_LEN + 7; // std-O3-AUX-frame
}
}
// AUX-frames mit vielen Fehlern besser mit 00 auffuellen
for (i = len; i < FRAME_LEN; i++) {
//xframe[i] = 0;
for (i = len; i < FRAME_LEN-2; i++) {
frame[i] = 0;
}
if (ft > 2 || len == NDATA_LEN) {
frame[FRAME_LEN-2] = 0;
frame[FRAME_LEN-1] = 0;
}
len = FRAME_LEN;
if (option_ecc) {
ec = rs41_ecc(len);
@ -1042,6 +1084,9 @@ void print_frame(int len) {
if (option_raw) {
if (option_ecc == 2 && ec >= 0) {
if (len < FRAME_LEN && frame[FRAME_LEN-1] != 0) len = FRAME_LEN;
}
for (i = 0; i < len; i++) {
fprintf(stdout, "%02x", frame[i]);
}
@ -1069,6 +1114,7 @@ int main(int argc, char *argv[]) {
int bit_count = 0,
bitpos = 0,
byte_count = FRAMESTART,
ft_len = FRAME_LEN,
header_found = 0;
int bit, byte;
int frmlen = FRAME_LEN;
@ -1211,6 +1257,7 @@ int main(int argc, char *argv[]) {
bitpos = 0;
Qerror_count = 0;
ft_len = frmlen;
while ( byte_count < frmlen ) {
bitQ = read_sbit(fp, symlen, &bit, option_inv, bitofs, bit_count==0, 0); // symlen=1, return: zeroX/bit
@ -1233,17 +1280,15 @@ int main(int argc, char *argv[]) {
byte_count++;
}
if (Qerror_count > 4) { // ab byte 320 entscheiden, ob framelen = 320 oder 518
if (byte_count > NDATA_LEN && byte_count < NDATA_LEN+XDATA_LEN-10) {
byte_count = NDATA_LEN;
} // in print_frame() wird ab byte_count mit 00 aufgefuellt fuer Fehlerkorrektur
break;
if (Qerror_count == 4) { // framelen = 320 oder 518
ft_len = byte_count;
Qerror_count += 1;
}
}
header_found = 0;
print_frame(byte_count);
print_frame(ft_len);
while ( bit_count < BITS*FRAME_LEN ) {
while ( bit_count < BITS*(FRAME_LEN-8+24) ) {
bitQ = read_sbit(fp, symlen, &bit, option_inv, bitofs, bit_count==0, 0); // symlen=1, return: zeroX/bit
if ( bitQ == EOF) break;
bit_count++;

Wyświetl plik

@ -225,7 +225,7 @@ HEADER 8
RS-PARITY 48 = 2*24
DATA 264-462 (max 2*231=462)
DATA hat zu Beginn z.B. 0F oder F0,
DATA hat zu Beginn 0F (std_len=320) oder F0 (aux_len=518),
dann Bloecke der Form IDLEN|DAT|CRC16:
IDLEN 2 (ID+LEN)
DAT LEN

Wyświetl plik

@ -1100,6 +1100,20 @@ int get_Calconf(int out) {
return 0;
}
/*
frame[pos_FRAME-1] == 0x0F: len == NDATA_LEN(320)
frame[pos_FRAME-1] == 0xF0: len == FRAME_LEN(518)
*/
int frametype() { // -4..+4: 0xF0 -> -4 , 0x0F -> +4
int i;
ui8_t b = frame[pos_FRAME-1];
int ft = 0;
for (i = 0; i < 4; i++) {
ft += ((b>>i)&1) - ((b>>(i+4))&1);
}
return ft;
}
/* ------------------------------------------------------------------------------------ */
/*
(uses fec-lib by KA9Q)
@ -1151,6 +1165,23 @@ int rs41_ecc(int frmlen) {
errors1 = rs_decode(cw1, err_pos1, err_val1);
errors2 = rs_decode(cw2, err_pos2, err_val2);
if (option_ecc == 2 && (errors1 < 0 || errors2 < 0)) {
frame[pos_FRAME] = (pck_FRAME>>8)&0xFF; frame[pos_FRAME+1] = pck_FRAME&0xFF;
frame[pos_PTU] = (pck_PTU >>8)&0xFF; frame[pos_PTU +1] = pck_PTU &0xFF;
frame[pos_GPS1] = (pck_GPS1 >>8)&0xFF; frame[pos_GPS1 +1] = pck_GPS1 &0xFF;
frame[pos_GPS2] = (pck_GPS2 >>8)&0xFF; frame[pos_GPS2 +1] = pck_GPS2 &0xFF;
frame[pos_GPS3] = (pck_GPS3 >>8)&0xFF; frame[pos_GPS3 +1] = pck_GPS3 &0xFF;
if (frametype() < -2) {
for (i = NDATA_LEN + 7; i < FRAME_LEN-2; i++) frame[i] = 0;
}
for (i = 0; i < rs_K; i++) cw1[rs_R+i] = frame[cfg_rs41.msgpos+2*i ];
for (i = 0; i < rs_K; i++) cw2[rs_R+i] = frame[cfg_rs41.msgpos+2*i+1];
errors1 = rs_decode(cw1, err_pos1, err_val1);
errors2 = rs_decode(cw2, err_pos2, err_val2);
}
// Wenn Fehler im 00-padding korrigiert wurden,
// war entweder der frame zu kurz, oder
// Fehler wurden falsch korrigiert;
@ -1252,19 +1283,31 @@ int print_position(int ec) {
}
void print_frame(int len) {
int i, ec = 0;
int i, ec = 0, ft;
gpx.crc = 0;
/*
frame[pos_FRAME-1] == 0x0F: len == NDATA_LEN(320)
frame[pos_FRAME-1] == 0xF0: len == FRAME_LEN(518)
*/
//frame[pos_FRAME-1] == 0x0F: len == NDATA_LEN(320)
//frame[pos_FRAME-1] == 0xF0: len == FRAME_LEN(518)
ft = frametype();
if (ft > 2) len = NDATA_LEN;
// STD-frames mit 00 auffuellen fuer Fehlerkorrektur
if (len > NDATA_LEN && len < NDATA_LEN+XDATA_LEN-10) {
if (ft < -2) {
len = NDATA_LEN + 7; // std-O3-AUX-frame
}
}
// AUX-frames mit vielen Fehlern besser mit 00 auffuellen
for (i = len; i < FRAME_LEN; i++) {
//xframe[i] = 0;
for (i = len; i < FRAME_LEN-2; i++) {
frame[i] = 0;
}
if (ft > 2 || len == NDATA_LEN) {
frame[FRAME_LEN-2] = 0;
frame[FRAME_LEN-1] = 0;
}
len = FRAME_LEN;
if (option_ecc) {
ec = rs41_ecc(len);
@ -1278,7 +1321,7 @@ void print_frame(int len) {
}
fprintf(stdout, "\n");
*/
if (option_ecc == 2 && ec >= 0) {
if (option_ecc == 2 && ec >= 0) {
if (len < FRAME_LEN && frame[FRAME_LEN-1] != 0) len = FRAME_LEN;
}
for (i = 0; i < len; i++) {
@ -1306,6 +1349,7 @@ int main(int argc, char *argv[]) {
char bitbuf[8];
int bit_count = 0,
byte_count = FRAMESTART,
ft_len = FRAME_LEN,
header_found = 0,
byte, i;
int bit, len,
@ -1444,6 +1488,7 @@ int main(int argc, char *argv[]) {
bitstart = 1;
sumQ = 0;
Qerror_count = 0;
ft_len = frmlen;
while ( byte_count < frmlen ) {
bitQ = read_rawbit(fp, &bit); // return: zeroX/bit (oder alternativ Varianz/bit)
@ -1471,17 +1516,14 @@ int main(int argc, char *argv[]) {
byte_count++;
}
if (Qerror_count > 4 && option_len == 0) { // ab byte 320 entscheiden, ob framelen = 320 oder 518
if (byte_count > NDATA_LEN && byte_count < NDATA_LEN+XDATA_LEN-10) {
byte_count = NDATA_LEN;
} // in print_frame() wird ab byte_count mit 00 aufgefuellt fuer Fehlerkorrektur
break;
if (Qerror_count == 4 && option_len == 0) { // framelen = 320 oder 518
ft_len = byte_count;
Qerror_count += 1;
}
}
header_found = 0;
print_frame(byte_count);
print_frame(ft_len);
byte_count = FRAMESTART;
}
}