summaryrefslogtreecommitdiff
path: root/src/fecmodem.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/fecmodem.h')
-rw-r--r--src/fecmodem.h67
1 files changed, 67 insertions, 0 deletions
diff --git a/src/fecmodem.h b/src/fecmodem.h
new file mode 100644
index 0000000..9d43fa3
--- /dev/null
+++ b/src/fecmodem.h
@@ -0,0 +1,67 @@
+/*
+ * Copyright (C) 2016 by Daniel Friesel
+ *
+ * License: You may use, redistribute and/or modify this file under the terms
+ * of either:
+ * * The GNU LGPL v3 (see COPYING and COPYING.LESSER), or
+ * * The 3-clause BSD License (see COPYING.BSD)
+ *
+ */
+
+#include <avr/io.h>
+#include <stdlib.h>
+
+#ifndef FECMODEM_H_
+#define FECMODEM_H_
+
+#include "hamming.h"
+#include "modem.h"
+
+/**
+ * Receive-only modem with forward error correction.
+ * Uses the Modem class to read raw modem data and uses the Hamming 2416
+ * algorithm to detect and, if possible, correct transmission errors.
+ * Exposes a global modem object for convenience.
+ */
+class FECModem : public Modem {
+ private:
+ enum HammingState : uint8_t {
+ FIRST_BYTE,
+ SECOND_BYTE
+ };
+ HammingState hammingState;
+ uint8_t buf_byte;
+
+ uint8_t parity128(uint8_t byte);
+ uint8_t parity2416(uint8_t byte1, uint8_t byte2);
+ uint8_t correct128(uint8_t *byte, uint8_t parity);
+ uint8_t hamming2416(uint8_t *byte1, uint8_t *byte2, uint8_t parity);
+ public:
+ FECModem() : Modem() {};
+
+ /**
+ * Enable the modem. Resets the internal Hamming state and calls
+ * Modem::enable().
+ */
+ void enable(void);
+
+ /**
+ * Checks if there are unprocessed bytes in the receive buffer.
+ * Parity bytes are accounted for, so if three raw bytes (two data,
+ * one parity) were received by Modem::receive(), this function will
+ * return 2.
+ * @return number of unprocessed data bytes
+ */
+ uint8_t buffer_available(void);
+
+ /**
+ * Get next byte from the receive buffer.
+ * @return received byte (0 if it contained uncorrectable errors
+ * or the buffer is empty)
+ */
+ uint8_t buffer_get(void);
+};
+
+extern FECModem modem;
+
+#endif /* FECMODEM_H_ */