diff options
author | Sebastian Muszytowski <sebastian@muszytowski.net> | 2016-06-03 15:48:16 +0200 |
---|---|---|
committer | Sebastian Muszytowski <sebastian@muszytowski.net> | 2016-06-03 15:48:16 +0200 |
commit | 7c56be8a724e2b0647e5a6cbd55c7b0eb948206b (patch) | |
tree | 26cd8f60a780b03a04c92503775c08eaa29dd6c2 /src/modem.h | |
parent | 2bf8aede5419574a785ad89ffa0e4c87a9fff71d (diff) |
initial commit of all data
Diffstat (limited to 'src/modem.h')
-rw-r--r-- | src/modem.h | 82 |
1 files changed, 82 insertions, 0 deletions
diff --git a/src/modem.h b/src/modem.h new file mode 100644 index 0000000..7409214 --- /dev/null +++ b/src/modem.h @@ -0,0 +1,82 @@ +/* Name: modem.h + * Author: Jari Tulilahti + * Copyright: 2014 Rakettitiede Oy and 2016 Daniel Friesel + * License: LGPLv3, see COPYING, and COPYING.LESSER -files for more info + */ + +#ifndef MODEM_H_ +#define MODEM_H_ + +#include <avr/interrupt.h> +#include <stdlib.h> + +/* Modem ring buffer size must be power of 2 */ +#define MODEM_BUFFER_SIZE 64 + +/* Modem defines */ +#define MODEM_SYNC_LEN 42 +#define MODEM_TIMER TCNT1L +#define MODEM_PCINT PCINT24 +#define MODEM_PCMSK PCMSK3 +#define MODEM_PCIE PCIE3 +#define MODEM_PIN PA0 +#define MODEM_DDR DDRA + +/** + * Receive-only modem. Sets up a pin change interrupt on the modem pin + * and receives bytes using a simple protocol. Does not detect or correct + * transmission errors. + */ +class Modem { + private: + uint8_t buffer_head; + uint8_t buffer_tail; + uint8_t buffer[MODEM_BUFFER_SIZE]; + bool new_transmission; + void buffer_put(const uint8_t c); + public: + Modem() {new_transmission = false;}; + + /** + * Checks if a new transmission was started since the last call + * to this function. Returns true if that is the case and false + * otherwise. + * @return true if a new transmission was started + */ + bool newTransmission(); + + /** + * Checks if there are unprocessed bytes in the modem receive buffer. + * @return number of unprocessed bytes + */ + uint8_t buffer_available(void); + + /** + * Get next byte from modem receive buffer. + * @return next unprocessed byte (0 if the buffer is empty) + */ + uint8_t buffer_get(void); + + /** + * Enable the modem. Turns on the input voltage divider on MODEM_PIN + * and enables the receive interrupt (MODEM_PCINT). + */ + void enable(void); + + /** + * Disable the modem. Disables the receive interrupt and turns off + * the input voltage divider on MODEM_PIN. + */ + void disable(void); + + /** + * Called by the pin change interrupt service routine whenever the + * modem pin is toggled. Detects sync pulses, receives bits and + * stores complete bytes in the buffer. + * + * Do not call this function yourself. + */ + void receive(void); +}; + +#endif /* MODEM_H_ */ |