Exemple #1
0
/** \brief	Ereignisse mit niedriger Prioritaet abarbeiten. */
static void handle_events(void)
{
	morse_sym_t captured[CAPTURE_BUF_SIZE];
	uint8_t nr_captured = 0, nr_decoded;
	bool capture_error;
	bool had_async_lcd_update;

	/* Cleartaster abfragen. */
	handle_clear_button();

	/* Empfangene Symbole in temporaeren lokalen Puffer kopieren
	 * und Interrupts so schnell wie moeglich wieder freigeben. */
	irq_disable();
	if (capture.nr_captured) {
		nr_captured = capture.nr_captured;
		capture.nr_captured = 0;
		memcpy(captured, capture.captured,
		       nr_captured * sizeof(captured[0]));
	}
	capture_error = capture.capture_error;
	capture.capture_error = 0;
	irq_enable();

	/* Empfangene Symbole dekodieren und in LCD Puffer uebertragen. */
	nr_decoded = decode_symbols(captured, nr_captured,
				    capture_error);

	/* Asynchrones LCD-update Flag abfragen und ruecksetzen. */
	irq_disable();
	had_async_lcd_update = machine.async_lcd_update;
	machine.async_lcd_update = 0;
	irq_enable();

	/* LCD auffrischen, wenn neue Symbole decodiert wurden,
	 * oder ein asynchrones LCD Update angefordert wurde. */
	if (nr_decoded || had_async_lcd_update)
		update_lcd();
}
Exemple #2
0
/* tbc_decode:
 * 	If ptr is NULL then this uses in place decoding, 
 *	otherwise fills out the structure pointered to.
 *	When not using in place decoding the structure should be
 *	initialised with zeros.  tlp elements will be decoded if 
 *	tbc->tlp is not NULL.
 */
int tbc_decode (BYTE *data, unsigned int length, tbc_t **ptr)
{
	tenc_element_t 	element;
	tbc_t 		*tbc;
	int		in_place;
	int		ret;

	if (*ptr != NULL) {
		tbc		= *ptr;
		in_place 	= 0;
	} else {
		tbc		= (tbc_t *) data;
		in_place	= 1;
	}	

	/* Decode the required elements */
	if ((ret = load_uint (&data, &length, "endU", &(tbc->endian))) < 0)
		return ret;
	if ((ret = load_uint (&data, &length, "ws U", &(tbc->ws))) < 0)
		return ret;
	if ((ret = load_uint (&data, &length, "vs U", &(tbc->vs))) < 0)
		return ret;

	if ((ret = tenc_walk_to_element (data, &length, "bc B", &element)) < 0)
		return ret;
	
	tbc->bytecode_len	= element.length;
	tbc->bytecode		= element.data.bytes;
	data			= element.next;

	/* Decode optional elements */
	if (in_place) {
		tbc->tlp	= NULL;
		tbc->symbols	= NULL;
		tbc->ffi	= NULL;
		tbc->debug	= NULL;
	} else {
		if (tbc->tlp != NULL) {
			tbc->tlp->fmt 		= NULL;
			tbc->tlp->symbol 	= NULL;
		}
	}

	/* Copy pointer */
	*ptr 		= tbc;

	while (length > 0) {
		if (tenc_decode_element (data, &length, &element) < 0)
			return 0; /* ignore errors */

		if (ids_match (element.id, "tlpL")) {
			tbc->tlp = decode_tlp (data, tbc->tlp, &element); 
		} else if (in_place && ids_match (element.id, "ffiL")) {
			tbc->ffi = decode_ffi (data, &element);
		} else if (in_place && ids_match (element.id, "stbL")) {
			tbc->symbols = decode_symbols (&element);
		} else if (in_place && ids_match (element.id, "dbgL")) {
			tbc->debug = decode_debug (data, &element);
		}

		data = element.next;
	}

	return 0;
}