diff sw/sniff-dec/pps.c @ 41:118a12e9483b

simtrace3-sniff-dec started
author Mychaela Falconia <falcon@freecalypso.org>
date Thu, 31 Aug 2023 08:46:23 +0000
parents
children 2855330ab96f
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sw/sniff-dec/pps.c	Thu Aug 31 08:46:23 2023 +0000
@@ -0,0 +1,116 @@
+/*
+ * 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[2] & 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();
+	}
+}