X-Git-Url: https://git.gag.com/?a=blobdiff_plain;f=src%2Fkernel%2Fao_log_micro.c;h=1cb03715b23eb284573e5e5ba6e22ff1e7c90b8d;hb=db30a0dd958617cbe7fa8054ebb7b40ced90b602;hp=aef78def446d7fe09f7fb13ee4407629d0ddd249;hpb=d1527a5457210eb914312cf8857bfb88982a8462;p=fw%2Faltos diff --git a/src/kernel/ao_log_micro.c b/src/kernel/ao_log_micro.c index aef78def..1cb03715 100644 --- a/src/kernel/ao_log_micro.c +++ b/src/kernel/ao_log_micro.c @@ -3,7 +3,8 @@ * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; version 2 of the License. + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of @@ -18,21 +19,24 @@ #include #include #include +#ifndef LOG_MICRO_ASYNC +#define LOG_MICRO_ASYNC 1 +#endif +#if LOG_MICRO_ASYNC #include +#else +#include +#endif +#include -static uint16_t ao_log_offset = STARTING_LOG_OFFSET; +static N_SAMPLES_TYPE ao_log_offset = STARTING_LOG_OFFSET; -#define AO_LOG_ID_SHIFT 12 -#define AO_LOG_ID_MASK ((1 << AO_LOG_ID_SHIFT) - 1) void ao_log_micro_save(void) { - uint16_t n_samples = (ao_log_offset - STARTING_LOG_OFFSET) / sizeof (uint16_t); + N_SAMPLES_TYPE n_samples = (ao_log_offset - STARTING_LOG_OFFSET) / sizeof (uint16_t); -#if AO_LOG_ID - n_samples |= AO_LOG_ID << AO_LOG_ID_SHIFT; -#endif ao_eeprom_write(PA_GROUND_OFFSET, &pa_ground, sizeof (pa_ground)); ao_eeprom_write(PA_MIN_OFFSET, &pa_min, sizeof (pa_min)); ao_eeprom_write(N_SAMPLES_OFFSET, &n_samples, sizeof (n_samples)); @@ -82,24 +86,26 @@ ao_log_hex_nibble(uint8_t b) ao_async_byte('a' - 10 + b); } -static void +void ao_log_hex(uint8_t b) { ao_log_hex_nibble(b>>4); ao_log_hex_nibble(b&0xf); } -static void +void ao_log_newline(void) { ao_async_byte('\r'); ao_async_byte('\n'); } +#define MAX_N_SAMPLES ((MAX_LOG_OFFSET - STARTING_LOG_OFFSET) / 2) + void ao_log_micro_dump(void) { - uint16_t n_samples; + N_SAMPLES_TYPE n_samples; uint16_t nbytes; uint8_t byte; uint16_t b; @@ -107,12 +113,24 @@ ao_log_micro_dump(void) ao_eeprom_read(N_SAMPLES_OFFSET, &n_samples, sizeof (n_samples)); - if (n_samples == 0xffff) + if (n_samples == (N_SAMPLES_TYPE) (~0)) n_samples = 0; + nbytes = STARTING_LOG_OFFSET + sizeof (uint16_t) * n_samples; + + /* + * Rewrite n_samples so that it includes the log ID value with + * 32-bit n_samples split into two chunks + */ + if (sizeof (n_samples) > 2) { + N_SAMPLES_TYPE n_samples_low; + N_SAMPLES_TYPE n_samples_high; + n_samples_low = n_samples & ((1 << AO_LOG_ID_SHIFT) - 1); + n_samples_high = (n_samples - n_samples_low) << AO_LOG_ID_WIDTH; + n_samples = n_samples_low | n_samples_high; + } #if AO_LOG_ID - n_samples &= AO_LOG_ID_MASK; + n_samples |= AO_LOG_ID << AO_LOG_ID_SHIFT; #endif - nbytes = STARTING_LOG_OFFSET + sizeof (uint16_t) * n_samples; ao_async_start(); ao_async_byte('M'); ao_async_byte('P'); @@ -120,6 +138,11 @@ ao_log_micro_dump(void) if ((b & 0xf) == 0) ao_log_newline(); ao_eeprom_read(b, &byte, 1); +#if AO_LOG_ID + if (N_SAMPLES_OFFSET <= b && b < (N_SAMPLES_OFFSET + sizeof(n_samples))) { + byte = n_samples >> ((b - N_SAMPLES_OFFSET) << 3); + } +#endif ao_log_hex(byte); crc = ao_log_micro_crc(crc, byte); }