From ab36943fa7276d20f8b6e14ae2352db0a3daec04 Mon Sep 17 00:00:00 2001 From: Daniel Friesel Date: Fri, 15 Jan 2016 16:51:19 +0100 Subject: C++-ize modem code (a little bit) --- src/main.cc | 7 +++++ src/modem.c | 95 ------------------------------------------------------------ src/modem.cc | 94 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ src/modem.h | 18 ++++++++---- 4 files changed, 114 insertions(+), 100 deletions(-) delete mode 100644 src/modem.c create mode 100644 src/modem.cc diff --git a/src/main.cc b/src/main.cc index c51483d..9bf9f4e 100644 --- a/src/main.cc +++ b/src/main.cc @@ -5,6 +5,7 @@ #include #include "font2.h" +#include "modem.h" #define SHUTDOWN_THRESHOLD 2048 @@ -89,6 +90,10 @@ void System::loop() else { want_shutdown = 0; } + + if (modem.buffer_available()) { + disp[0] = modem.buffer_get(); + } } int main (void) @@ -158,6 +163,8 @@ int main (void) disp[31] = 0x00; #endif + modem.init(); + sei(); while (1) { diff --git a/src/modem.c b/src/modem.c deleted file mode 100644 index dbe9d35..0000000 --- a/src/modem.c +++ /dev/null @@ -1,95 +0,0 @@ -/* Name: modem.c - * - * Audio modem for Attiny85 & other AVR chips with modifications - * - * Author: Jari Tulilahti - * Copyright: 2014 Rakettitiede Oy - * License: LGPLv3, see COPYING, and COPYING.LESSER -files for more info - */ - -#include "modem.h" - -/* Ring buffer global variables */ -static volatile uint8_t modem_buffer_head = 0, modem_buffer_tail = 0; -static volatile uint8_t modem_buffer[MODEM_BUFFER_SIZE]; - -/* - * Returns number of available bytes in ringbuffer or 0 if empty - */ -uint8_t modem_buffer_available() { - return modem_buffer_head - modem_buffer_tail; -} - -/* - * Store 1 byte in ringbuffer - */ -static inline void modem_buffer_put(const uint8_t c) { - if (modem_buffer_available() != MODEM_BUFFER_SIZE) { - modem_buffer[modem_buffer_head++ % MODEM_BUFFER_SIZE] = c; - } -} - -/* - * Fetch 1 byte from ringbuffer - */ -uint8_t modem_buffer_get() { - uint8_t b = 0; - if (modem_buffer_available() != 0) { - b = modem_buffer[modem_buffer_tail++ % MODEM_BUFFER_SIZE]; - } - return b; -} - -/* - * Pin Change Interrupt Vector. This is The Modem. - */ -ISR(PCINT3_vect) { - /* Static variables instead of globals to keep scope inside ISR */ - static uint8_t modem_bit = 0; - static uint8_t modem_bitlen = 0; - static uint8_t modem_byte = 0; - - /* Read & Zero Timer/Counter 1 value */ - uint8_t modem_pulselen = MODEM_TIMER; - MODEM_TIMER = 0; - - /* - * Check if we received Start/Sync -pulse. - * Calculate bit signal length middle point from pulse. - * Return from ISR immediately. - */ - if (modem_pulselen > MODEM_SYNC_LEN) { - modem_bitlen = (modem_pulselen >> 2); - modem_bit = 0; - return; - } - - /* - * Shift byte and set high bit according to the pulse length. - * Long pulse = 1, Short pulse = 0 - */ - modem_byte = (modem_byte >> 1) | (modem_pulselen < modem_bitlen ? 0x00 : 0x80); - - /* Check if we received complete byte and store it in ring buffer */ - if (!(++modem_bit % 0x08)) { - modem_buffer_put(modem_byte); - } -} - -/* - * Start the modem by enabling Pin Change Interrupts & Timer - */ -void modem_init() { - /* Modem pin as input */ - MODEM_DDR &= ~(1 << MODEM_PIN); - - /* Enable Pin Change Interrupts and PCINT for MODEM_PIN */ - PCMSK1 |= _BV(MODEM_PIN); - PCICR |= _BV(PCIE3); - - /* Timer: TCCR1: CS10 and CS11 bits: 8MHz clock with Prescaler 64 = 125kHz timer clock */ - TCCR1B = _BV(CS11) | _BV(CS10); - - /* Enable interrupts */ - sei(); -} diff --git a/src/modem.cc b/src/modem.cc new file mode 100644 index 0000000..6020a15 --- /dev/null +++ b/src/modem.cc @@ -0,0 +1,94 @@ +/* Name: modem.c + * + * Audio modem for Attiny85 & other AVR chips with modifications + * + * Author: Jari Tulilahti + * Copyright: 2014 Rakettitiede Oy + * License: LGPLv3, see COPYING, and COPYING.LESSER -files for more info + */ + +#include "modem.h" + +/* Ring buffer global variables */ +static volatile uint8_t modem_buffer_head = 0, modem_buffer_tail = 0; +static volatile uint8_t modem_buffer[MODEM_BUFFER_SIZE]; + +Modem modem; + +/* + * Returns number of available bytes in ringbuffer or 0 if empty + */ +uint8_t Modem::buffer_available() { + return modem_buffer_head - modem_buffer_tail; +} + +/* + * Store 1 byte in ringbuffer + */ +static inline void modem_buffer_put(const uint8_t c) { + if (modem.buffer_available() != MODEM_BUFFER_SIZE) { + modem_buffer[modem_buffer_head++ % MODEM_BUFFER_SIZE] = c; + } +} + +/* + * Fetch 1 byte from ringbuffer + */ +uint8_t Modem::buffer_get() { + uint8_t b = 0; + if (buffer_available() != 0) { + b = modem_buffer[modem_buffer_tail++ % MODEM_BUFFER_SIZE]; + } + return b; +} + +/* + * Pin Change Interrupt Vector. This is The Modem. + */ +ISR(PCINT3_vect) { + /* Static variables instead of globals to keep scope inside ISR */ + static uint8_t modem_bit = 0; + static uint8_t modem_bitlen = 0; + static uint8_t modem_byte = 0; + + /* Read & Zero Timer/Counter 1 value */ + uint8_t modem_pulselen = MODEM_TIMER; + MODEM_TIMER = 0; + + /* + * Check if we received Start/Sync -pulse. + * Calculate bit signal length middle point from pulse. + * Return from ISR immediately. + */ + if (modem_pulselen > MODEM_SYNC_LEN) { + modem_bitlen = (modem_pulselen >> 2); + modem_bit = 0; + return; + } + + /* + * Shift byte and set high bit according to the pulse length. + * Long pulse = 1, Short pulse = 0 + */ + modem_byte = (modem_byte >> 1) | (modem_pulselen < modem_bitlen ? 0x00 : 0x80); + + /* Check if we received complete byte and store it in ring buffer */ + if (!(++modem_bit % 0x08)) { + modem_buffer_put(modem_byte); + } +} + +/* + * Start the modem by enabling Pin Change Interrupts & Timer + */ +void Modem::init() { + /* Modem pin as input */ + MODEM_DDR &= ~(1 << MODEM_PIN); + + /* Enable Pin Change Interrupts and PCINT for MODEM_PIN */ + PCMSK1 |= _BV(MODEM_PIN); + PCICR |= _BV(PCIE3); + + /* Timer: TCCR1: CS10 and CS11 bits: 8MHz clock with Prescaler 64 = 125kHz timer clock */ + TCCR1B = _BV(CS11) | _BV(CS10); +} diff --git a/src/modem.h b/src/modem.h index d538c22..c02101c 100644 --- a/src/modem.h +++ b/src/modem.h @@ -4,7 +4,8 @@ * License: LGPLv3, see COPYING, and COPYING.LESSER -files for more info */ -#pragma once +#ifndef MODEM_H_ +#define MODEM_H_ #include #include @@ -18,7 +19,14 @@ #define MODEM_PIN PCINT24 #define MODEM_DDR DDRA -/* Public funtions */ -uint8_t modem_buffer_available(); -uint8_t modem_buffer_get(); -void modem_init(); +class Modem { + public: + Modem() {}; + uint8_t buffer_available(void); + uint8_t buffer_get(void); + void init(void); +}; + +extern Modem modem; + +#endif /* MODEM_H_ */ -- cgit v1.2.3