/** \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(); }
/* 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; }