Parity calculations...

Serguei Miridonov <[email protected]> Sat, 28 Aug 2004 23:46:43 -0700
Newsgroups gmane.comp.hardware.gps.opensource
Message-ID <[email protected]>
Hello,

Right now I'm playing with Magellan Sportrack Pro and its 
correlator: tracking Doppler frequency shift, reading 
navigation message, etc... I wrote a parity check function for 
this, it seems smaller than that one you use in OpenGPS 
project, so if you think that it can be merged into your code, 
please, use it as public domain program:

const static char parbits[26] = {
	0x13,	0x25,	0x0b,	0x16,	0x2c,	0x19,	0x32,	0x26,
	0x0e,	0x1f,	0x3e,	0x3d,	0x38,	0x31,	0x23,	0x07,
	0x0d,	0x1a,	0x37,	0x2f,	0x1c,	0x3b,	0x34,	0x2a,
	0x16,	0x29,
};

int gps_word_parity_ok(unsigned long word)
{
	register int i;
	register unsigned long b, w;
	register char s;
	int rc;
	s = 0;
	w = word;
	if (w & (1UL << 30)) {
		w ^= 0x3fffffc0;
		rc = -1;
	} else {
		rc = 1;
	}
	for (i = 0, b = (1 << 6); i < 26; i++, b <<= 1) {
		if (w & b) {
			s ^= parbits[i];
		}
	}
	return (s == (w & 0x3f) ? rc : 0);
}

word is 32 bits: bits 31 and 30 are D29 and D30 from previous 
word, bits 29..0 are from the current word including 6 parity 
bits. The function returns 0 if checksum is incorrect, +1 if 
the word is OK, and -1 if word is OK but 24 information bits 
must be inverted...

BTW, did you check the TLM word in current signal from any SV? 
It seems that it contains the week number, like the word 3 in 
subframe 1.

Best regards,
Serguei Miridonov.

P.S. Having real GPS receiver like this one from Magellan and 
programming it to see how real GPS stuff is working is a 
fun...