view sw/sniff-dec/pps.c @ 54:2855330ab96f

simsniff-dec: bug in PPS decoder
author Mychaela Falconia <falcon@freecalypso.org>
date Tue, 03 Oct 2023 23:32:43 +0000
parents 118a12e9483b
children
line wrap: on
line source

/*
 * Here we implement PPS request/response message decoding.
 */

#include <sys/types.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <strings.h>
#include "state.h"

extern char linebuf[];
extern int lineno;
extern unsigned rx_byte;
extern int state;

#define	SUBST_PPS0	0
#define	SUBST_PPS1	1
#define	SUBST_PPS2	2
#define	SUBST_PPS3	3
#define	SUBST_PCK	4

static char pps_start_timestamp[18];
static int pps_start_line;
static int substate;
static u_char pps_bytes[6];
static unsigned byte_count;

void
start_pps_msg()
{
	strcpy(pps_start_timestamp, linebuf);
	pps_start_line = lineno;
	pps_bytes[0] = rx_byte;
	byte_count = 1;
	state = STATE_PPS_MSG;
	substate = SUBST_PPS0;
}

static void
advance_state()
{
	if (substate == SUBST_PPS1) {
		if (pps_bytes[1] & 0x10)
			return;
		substate = SUBST_PPS2;
	}
	if (substate == SUBST_PPS2) {
		if (pps_bytes[1] & 0x20)
			return;
		substate = SUBST_PPS3;
	}
	if (substate == SUBST_PPS3) {
		if (pps_bytes[1] & 0x40)
			return;
		substate = SUBST_PCK;
	}
	if (substate == SUBST_PCK)
		return;
	fprintf(stderr, "BUG in PPS decoder: bad state in advance_state()\n");
	abort();
}

static void
check_pck()
{
	unsigned n, xor;

	xor = 0;
	for (n = 0; n < byte_count; n++)
		xor ^= pps_bytes[n];
	printf(" PCK is %s\n", xor ? "bad!" : "correct");
}

static void
pps_finish()
{
	unsigned n;

	printf("%s line %d: PPS", pps_start_timestamp, pps_start_line);
	for (n = 0; n < byte_count; n++)
		printf(" %02X", pps_bytes[n]);
	putchar('\n');
	check_pck();
	state = STATE_READY_FOR_CMD;
}

void
pps_byte_in()
{
	pps_bytes[byte_count++] = rx_byte;
	switch (substate) {
	case SUBST_PPS0:
		substate = SUBST_PPS1;
		advance_state();
		return;
	case SUBST_PPS1:
		substate = SUBST_PPS2;
		advance_state();
		return;
	case SUBST_PPS2:
		substate = SUBST_PPS3;
		advance_state();
		return;
	case SUBST_PPS3:
		substate = SUBST_PCK;
		return;
	case SUBST_PCK:
		pps_finish();
		return;
	default:
		fprintf(stderr,
			"BUG in PPS decoder: bad state in pps_byte_in()\n");
		abort();
	}
}