view rvinterf/old/before-rvinterf/trdump.c @ 497:74610c4f10f7

target-utils: added 10 ms delay at the end of abb_power_off() The deosmification of the ABB access code (replacement of osmo_delay_ms() bogus delays with correctly-timed ones, which are significantly shorter) had one annoying side effect: when executing the poweroff command from any of the programs, one last '=' prompt character was being sent (and received by the x86 host) as the Calypso board powers off. With delays being shorter now, the abb_power_off() function was returning and the standalone program's main loop was printing its prompt before the Iota chip fully executed the switch-off sequence! I thought about inserting an endless tight loop at the end of the abb_power_off() function, but the implemented solution of a 10 ms delay is a little nicer IMO because if the DEVOFF operation doesn't happen for some reason in a manual hacking scenario, there won't be an artificial blocker in the form of a tight loop keeping us from further poking around.
author Mychaela Falconia <falcon@freecalypso.org>
date Sat, 25 May 2019 20:44:05 +0000
parents e7502631a0f9
children
line wrap: on
line source

/*
 * This module implements the basic dump of any incoming packets
 */

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

extern u_char rxpkt[];
extern size_t rxpkt_len;

char pr_item[4096];

void
print_rv_trace()
{
	int i, c;
	char *dp;

	dp = pr_item;
	strcpy(dp, "RV ");
	dp += 3;
	/* the SWE static ID is sent MSB first */
	for (i = 1; i <= 4; i++) {
		sprintf(dp, "%02X", rxpkt[i]);
		dp += 2;
	}
	/* severity level */
	sprintf(dp, " %d ", rxpkt[5]);
	dp = index(dp, '\0');
	for (i = 6; i < rxpkt_len; i++) {
		c = rxpkt[i];
		if (c & 0x80) {
			*dp++ = 'M';
			*dp++ = '-';
			c &= 0x7F;
		}
		if (c < 0x20) {
			*dp++ = '^';
			*dp++ = c + '@';
		} else if (c == 0x7F) {
			*dp++ = '^';
			*dp++ = '?';
		} else
			*dp++ = c;
	}
	*dp = '\0';
	print_item();
}

void
print_l1_trace()
{
	int i, c;
	char *dp;

	dp = pr_item;
	strcpy(dp, "L1: ");
	dp += 4;
	for (i = 1; i < rxpkt_len; i++) {
		if ((i+1 < rxpkt_len) &&
		    (rxpkt[i] == '\r' && rxpkt[i+1] == '\n' ||
		     rxpkt[i] == '\n' && rxpkt[i+1] == '\r')) {
			*dp = '\0';
			print_item();
			if (i+2 == rxpkt_len)
				return;
			dp = pr_item;
			*dp++ = '+';
			*dp++ = ' ';
			i++;
			continue;
		}
		c = rxpkt[i];
		if (c & 0x80) {
			*dp++ = 'M';
			*dp++ = '-';
			c &= 0x7F;
		}
		if (c < 0x20) {
			*dp++ = '^';
			*dp++ = c + '@';
		} else if (c == 0x7F) {
			*dp++ = '^';
			*dp++ = '?';
		} else
			*dp++ = c;
	}
	/* will get here only if no newline sequence at the end */
	*dp = '\0';
	print_item();
}

void
print_g23_trace()
{
	int i;
	char *dp;

	dp = pr_item;
	strcpy(dp, "G23:");
	dp += 4;
	for (i = 1; i < rxpkt_len; i++) {
		sprintf(dp, " %02X", rxpkt[i]);
		dp += 3;
	}
	*dp = '\0';
	print_item();
}

void
print_etm_output_raw()
{
	int i;
	char *dp;

	dp = pr_item;
	strcpy(dp, "ETM:");
	dp += 4;
	for (i = 1; i < rxpkt_len; i++) {
		sprintf(dp, " %02X", rxpkt[i]);
		dp += 3;
	}
	*dp = '\0';
	print_item();
}

void
print_unknown_packet()
{
	int i;
	char *dp;

	dp = pr_item;
	strcpy(dp, "UNK:");
	dp += 4;
	for (i = 0; i < rxpkt_len; i++) {
		sprintf(dp, " %02X", rxpkt[i]);
		dp += 3;
	}
	*dp = '\0';
	print_item();
}

void
print_rx_packet()
{
	switch (rxpkt[0]) {
	case RVT_RV_HEADER:
		if (rxpkt_len < 6)
			goto unknown;
		print_rv_trace();
		return;
	case RVT_L1_HEADER:
		print_l1_trace();
		return;
	case RVT_L23_HEADER:
		print_g23_trace();
		return;
	case RVT_TM_HEADER:
		print_etm_output_raw();
		return;
	default:
	unknown:
		print_unknown_packet();
	}
}