Move kfile interface to the io/ directory.
[bertos.git] / bertos / net / afsk.h
1 /**
2  * \file
3  * <!--
4  * This file is part of BeRTOS.
5  *
6  * Bertos is free software; you can redistribute it and/or modify
7  * it under the terms of the GNU General Public License as published by
8  * the Free Software Foundation; either version 2 of the License, or
9  * (at your option) any later version.
10  *
11  * This program is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14  * GNU General Public License for more details.
15  *
16  * You should have received a copy of the GNU General Public License
17  * along with this program; if not, write to the Free Software
18  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
19  *
20  * As a special exception, you may use this file as part of a free software
21  * library without restriction.  Specifically, if other files instantiate
22  * templates or use macros or inline functions from this file, or you compile
23  * this file and link it with other files to produce an executable, this
24  * file does not by itself cause the resulting executable to be covered by
25  * the GNU General Public License.  This exception does not however
26  * invalidate any other reasons why the executable file might be covered by
27  * the GNU General Public License.
28  *
29  * Copyright 2008 Develer S.r.l. (http://www.develer.com/)
30  *
31  * -->
32  *
33  * \brief AFSK1200 modem.
34  *
35  * \author Francesco Sacchi <asterix@develer.com>
36  *
37  * $WIZ$ module_name = "afsk"
38  * $WIZ$ module_configuration = "bertos/cfg/cfg_afsk.h"
39  * $WIZ$ module_depends = "timer", "kfile"
40  * $WIZ$ module_hw = "bertos/hw/hw_afsk.h"
41  */
42
43 #ifndef NET_AFSK_H
44 #define NET_AFSK_H
45
46 #include "cfg/cfg_afsk.h"
47 #include "hw/hw_afsk.h"
48
49 #include <io/kfile.h>
50 #include <cfg/compiler.h>
51 #include <struct/fifobuf.h>
52
53
54
55 /**
56  * ADC sample rate.
57  * The demodulator filters are designed to work at this frequency.
58  * If you need to change this remember to update afsk_adc_isr().
59  */
60 #define SAMPLERATE 9600
61
62 /**
63  * Bitrate of the received/transmitted data.
64  * The demodulator filters and decoderes are designed to work at this frequency.
65  * If you need to change this remember to update afsk_adc_isr().
66  */
67 #define BITRATE    1200
68
69 #define SAMPLEPERBIT (SAMPLERATE / BITRATE)
70
71 /**
72  * HDLC (High-Level Data Link Control) context.
73  * Maybe to be moved in a separate HDLC module one day.
74  */
75 typedef struct Hdlc
76 {
77         uint8_t demod_bits; ///< Bitstream from the demodulator.
78         uint8_t bit_idx;    ///< Current received bit.
79         uint8_t currchar;   ///< Current received character.
80         bool rxstart;       ///< True if an HDLC_FLAG char has been found in the bitstream.
81 } Hdlc;
82
83 /**
84  * RX FIFO buffer full error.
85  */
86 #define AFSK_RXFIFO_OVERRUN BV(0)
87
88 /**
89  * AFSK1200 modem context.
90  */
91 typedef struct Afsk
92 {
93         /** Base "class" */
94         KFile fd;
95
96         /** ADC channel to be used by the demodulator */
97         int adc_ch;
98
99         /** DAC channel to be used by the modulator */
100         int dac_ch;
101
102         /** Current sample of bit for output data. */
103         uint8_t sample_count;
104
105         /** Current character to be modulated */
106         uint8_t curr_out;
107
108         /** Mask of current modulated bit */
109         uint8_t tx_bit;
110
111         /** True if bit stuff is allowed, false otherwise */
112         bool bit_stuff;
113
114         /** Counter for bit stuffing */
115         uint8_t stuff_cnt;
116         /**
117          * DDS phase accumulator for generating modulated data.
118          */
119         uint16_t phase_acc;
120
121         /** Current phase increment for current modulated bit */
122         uint16_t phase_inc;
123
124         /** Delay line used to delay samples by (SAMPLEPERBIT / 2) */
125         FIFOBuffer delay_fifo;
126
127         /**
128          * Buffer for delay FIFO.
129          * The 1 is added because the FIFO macros need
130          * 1 byte more to handle a buffer (SAMPLEPERBIT / 2) bytes long.
131          */
132         int8_t delay_buf[SAMPLEPERBIT / 2 + 1];
133
134         /** FIFO for received data */
135         FIFOBuffer rx_fifo;
136
137         /** FIFO rx buffer */
138         uint8_t rx_buf[CONFIG_AFSK_RX_BUFLEN];
139
140         /** FIFO for transmitted data */
141         FIFOBuffer tx_fifo;
142
143         /** FIFO tx buffer */
144         uint8_t tx_buf[CONFIG_AFSK_TX_BUFLEN];
145
146         /** IIR filter X cells, used to filter sampled data by the demodulator */
147         int16_t iir_x[2];
148
149         /** IIR filter Y cells, used to filter sampled data by the demodulator */
150         int16_t iir_y[2];
151
152         /**
153          * Bits sampled by the demodulator are here.
154          * Since ADC samplerate is higher than the bitrate, the bits here are
155          * SAMPLEPERBIT times the bitrate.
156          */
157         uint8_t sampled_bits;
158
159         /**
160          * Current phase, needed to know when the bitstream at ADC speed
161          * should be sampled.
162          */
163         int8_t curr_phase;
164
165         /** Bits found by the demodulator at the correct bitrate speed. */
166         uint8_t found_bits;
167
168         /** True while modem sends data */
169         volatile bool sending;
170
171         /**
172          * AFSK modem status.
173          * If 0 all is ok, otherwise errors are present.
174          */
175         volatile int status;
176
177         /** Hdlc context */
178         Hdlc hdlc;
179
180         /**
181          * Preamble length.
182          * When the AFSK modem wants to send data, before sending the actual data,
183          * shifts out preamble_len HDLC_FLAG characters.
184          * This helps to synchronize the demodulator filters on the receiver side.
185          */
186         uint16_t preamble_len;
187
188         /**
189          * Trailer length.
190          * After sending the actual data, the AFSK shifts out
191          * trailer_len HDLC_FLAG characters.
192          * This helps to synchronize the demodulator filters on the receiver side.
193          */
194         uint16_t trailer_len;
195 } Afsk;
196
197 #define KFT_AFSK MAKE_ID('A', 'F', 'S', 'K')
198
199 INLINE Afsk *AFSK_CAST(KFile *fd)
200 {
201   ASSERT(fd->_type == KFT_AFSK);
202   return (Afsk *)fd;
203 }
204
205
206 void afsk_adc_isr(Afsk *af, int8_t sample);
207 uint8_t afsk_dac_isr(Afsk *af);
208 void afsk_init(Afsk *af, int adc_ch, int dac_ch);
209
210
211 /**
212  * \name Afsk filter types.
213  * $WIZ$ afsk_filter_list = "AFSK_BUTTERWORTH", "AFSK_CHEBYSHEV"
214  * \{
215  */
216 #define AFSK_BUTTERWORTH  0
217 #define AFSK_CHEBYSHEV    1
218 /* \} */
219
220 int afsk_testSetup(void);
221 int afsk_testRun(void);
222 int afsk_testTearDown(void);
223
224 #endif /* NET_AFSK_H */