summaryrefslogtreecommitdiff
path: root/src/micropeak/ao_log_micro.c
diff options
context:
space:
mode:
authorKeith Packard <keithp@keithp.com>2012-12-17 22:58:49 -0800
committerKeith Packard <keithp@keithp.com>2012-12-17 22:58:49 -0800
commit23dc9a63ae8bc982d9352cfb7a3f508d8a08c374 (patch)
tree81331ef8899b448dc5b02d2819d61e408a89d423 /src/micropeak/ao_log_micro.c
parentfc2e5beb9173663e1e37a9b5a7b6eea1046222f7 (diff)
altos: Make micropeak 'serial' interface work
I prototyped the mpserial interface on a breadboard and tuned the circuit to register the LED correctly. Then adjusted the serial code to send bits at the right speed and format. The logging contents are now in hexdecimal with a CCITT CRC-16 computed to verify correct reception. Signed-off-by: Keith Packard <keithp@keithp.com>
Diffstat (limited to 'src/micropeak/ao_log_micro.c')
-rw-r--r--src/micropeak/ao_log_micro.c55
1 files changed, 54 insertions, 1 deletions
diff --git a/src/micropeak/ao_log_micro.c b/src/micropeak/ao_log_micro.c
index 40a7a35d..d665efb5 100644
--- a/src/micropeak/ao_log_micro.c
+++ b/src/micropeak/ao_log_micro.c
@@ -49,6 +49,46 @@ ao_log_micro_data(void)
}
}
+#define POLY 0x8408
+
+static uint16_t
+ao_log_micro_crc(uint16_t crc, uint8_t byte)
+{
+ uint8_t i;
+
+ for (i = 0; i < 8; i++) {
+ if ((crc & 0x0001) ^ (byte & 0x0001))
+ crc = (crc >> 1) ^ POLY;
+ else
+ crc = crc >> 1;
+ byte >>= 1;
+ }
+ return crc;
+}
+
+static void
+ao_log_hex_nibble(uint8_t b)
+{
+ if (b < 10)
+ ao_async_byte('0' + b);
+ else
+ ao_async_byte('a' - 10 + b);
+}
+
+static void
+ao_log_hex(uint8_t b)
+{
+ ao_log_hex_nibble(b>>4);
+ ao_log_hex_nibble(b&0xf);
+}
+
+static void
+ao_log_newline(void)
+{
+ ao_async_byte('\r');
+ ao_async_byte('\n');
+}
+
void
ao_log_micro_dump(void)
{
@@ -56,13 +96,26 @@ ao_log_micro_dump(void)
uint16_t nbytes;
uint8_t byte;
uint16_t b;
+ uint16_t crc = 0xffff;
ao_eeprom_read(N_SAMPLES_OFFSET, &n_samples, sizeof (n_samples));
+ if (n_samples == 0xffff)
+ n_samples = 0;
nbytes = STARTING_LOG_OFFSET + sizeof (uint16_t) * n_samples;
+ ao_async_start();
ao_async_byte('M');
ao_async_byte('P');
for (b = 0; b < nbytes; b++) {
+ if ((b & 0xf) == 0)
+ ao_log_newline();
ao_eeprom_read(b, &byte, 1);
- ao_async_byte(byte);
+ ao_log_hex(byte);
+ crc = ao_log_micro_crc(crc, byte);
}
+ ao_log_newline();
+ crc = ~crc;
+ ao_log_hex(crc >> 8);
+ ao_log_hex(crc);
+ ao_log_newline();
+ ao_async_stop();
}