X-Git-Url: https://codewiz.org/gitweb?a=blobdiff_plain;f=bertos%2Fnet%2Fafsk.h;h=d5eb272db1dc16e903c4f7d2ce433a06a15297df;hb=911d2706a86d326786bfe721dcc3d63aeade7f28;hp=49d5ce7ba1261fd956511b5fbdada5c6c6aa38d0;hpb=192418d2e34d644d7f652378f68ff3b2fed183e0;p=bertos.git diff --git a/bertos/net/afsk.h b/bertos/net/afsk.h index 49d5ce7b..d5eb272d 100644 --- a/bertos/net/afsk.h +++ b/bertos/net/afsk.h @@ -32,24 +32,166 @@ * * \brief AFSK1200 modem. * - * \version $Id$ * \author Francesco Sacchi - * + * * $WIZ$ module_name = "afsk" * $WIZ$ module_configuration = "bertos/cfg/cfg_afsk.h" * $WIZ$ module_depends = "timer", "kfile" + * $WIZ$ module_hw = "bertos/hw/hw_afsk.h" */ -#ifndef DRV_AFSK_H -#define DRV_AFSK_H +#ifndef NET_AFSK_H +#define NET_AFSK_H -#include -#include +#include "cfg/cfg_afsk.h" #include "hw/hw_afsk.h" +#include +#include +#include + + + +/** + * ADC sample rate. + * The demodulator filters are designed to work at this frequency. + * If you need to change this remember to update afsk_adc_isr(). + */ +#define SAMPLERATE 9600 + +/** + * Bitrate of the received/transmitted data. + * The demodulator filters and decoderes are designed to work at this frequency. + * If you need to change this remember to update afsk_adc_isr(). + */ +#define BITRATE 1200 + +#define SAMPLEPERBIT (SAMPLERATE / BITRATE) + +/** + * HDLC (High-Level Data Link Control) context. + * Maybe to be moved in a separate HDLC module one day. + */ +typedef struct Hdlc +{ + uint8_t demod_bits; ///< Bitstream from the demodulator. + uint8_t bit_idx; ///< Current received bit. + uint8_t currchar; ///< Current received character. + bool rxstart; ///< True if an HDLC_FLAG char has been found in the bitstream. +} Hdlc; + +/** + * RX FIFO buffer full error. + */ +#define AFSK_RXFIFO_OVERRUN BV(0) + +/** + * AFSK1200 modem context. + */ typedef struct Afsk { - KFile fd; + /** Base "class" */ + KFile fd; + + /** ADC channel to be used by the demodulator */ + int adc_ch; + + /** DAC channel to be used by the modulator */ + int dac_ch; + + /** Current sample of bit for output data. */ + uint8_t sample_count; + + /** Current character to be modulated */ + uint8_t curr_out; + + /** Mask of current modulated bit */ + uint8_t tx_bit; + + /** True if bit stuff is allowed, false otherwise */ + bool bit_stuff; + + /** Counter for bit stuffing */ + uint8_t stuff_cnt; + /** + * DDS phase accumulator for generating modulated data. + */ + uint16_t phase_acc; + + /** Current phase increment for current modulated bit */ + uint16_t phase_inc; + + /** Delay line used to delay samples by (SAMPLEPERBIT / 2) */ + FIFOBuffer delay_fifo; + + /** + * Buffer for delay FIFO. + * The 1 is added because the FIFO macros need + * 1 byte more to handle a buffer (SAMPLEPERBIT / 2) bytes long. + */ + int8_t delay_buf[SAMPLEPERBIT / 2 + 1]; + + /** FIFO for received data */ + FIFOBuffer rx_fifo; + + /** FIFO rx buffer */ + uint8_t rx_buf[CONFIG_AFSK_RX_BUFLEN]; + + /** FIFO for transmitted data */ + FIFOBuffer tx_fifo; + + /** FIFO tx buffer */ + uint8_t tx_buf[CONFIG_AFSK_TX_BUFLEN]; + + /** IIR filter X cells, used to filter sampled data by the demodulator */ + int16_t iir_x[2]; + + /** IIR filter Y cells, used to filter sampled data by the demodulator */ + int16_t iir_y[2]; + + /** + * Bits sampled by the demodulator are here. + * Since ADC samplerate is higher than the bitrate, the bits here are + * SAMPLEPERBIT times the bitrate. + */ + uint8_t sampled_bits; + + /** + * Current phase, needed to know when the bitstream at ADC speed + * should be sampled. + */ + int8_t curr_phase; + + /** Bits found by the demodulator at the correct bitrate speed. */ + uint8_t found_bits; + + /** True while modem sends data */ + volatile bool sending; + + /** + * AFSK modem status. + * If 0 all is ok, otherwise errors are present. + */ + volatile int status; + + /** Hdlc context */ + Hdlc hdlc; + + /** + * Preamble length. + * When the AFSK modem wants to send data, before sending the actual data, + * shifts out preamble_len HDLC_FLAG characters. + * This helps to synchronize the demodulator filters on the receiver side. + */ + uint16_t preamble_len; + + /** + * Trailer length. + * After sending the actual data, the AFSK shifts out + * trailer_len HDLC_FLAG characters. + * This helps to synchronize the demodulator filters on the receiver side. + */ + uint16_t trailer_len; } Afsk; #define KFT_AFSK MAKE_ID('A', 'F', 'S', 'K') @@ -60,10 +202,23 @@ INLINE Afsk *AFSK_CAST(KFile *fd) return (Afsk *)fd; } -void afsk_init(Afsk *af); -#define HDLC_FLAG 0x7E -#define HDLC_RESET 0x7F -#define AFSK_ESC 0x1B +void afsk_adc_isr(Afsk *af, int8_t sample); +uint8_t afsk_dac_isr(Afsk *af); +void afsk_init(Afsk *af, int adc_ch, int dac_ch); + + +/** + * \name Afsk filter types. + * $WIZ$ afsk_filter_list = "AFSK_BUTTERWORTH", "AFSK_CHEBYSHEV" + * \{ + */ +#define AFSK_BUTTERWORTH 0 +#define AFSK_CHEBYSHEV 1 +/* \} */ + +int afsk_testSetup(void); +int afsk_testRun(void); +int afsk_testTearDown(void); -#endif +#endif /* NET_AFSK_H */