forked from Qyon/STM32_RTTY
-
Notifications
You must be signed in to change notification settings - Fork 15
/
QAPRSBase.h
202 lines (181 loc) · 6.2 KB
/
QAPRSBase.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
/*
Copyright (C) 2013 Lukasz Nidecki SQ5RWU
This file is part of ArduinoQAPRS.
ArduinoQAPRS is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
ArduinoQAPRS is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with ArduinoQAPRS; if not, write to the Free Software
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
ArduinoQAPRS jest wolnym oprogramowaniem; możesz go rozprowadzać dalej
i/lub modyfikować na warunkach Powszechnej Licencji Publicznej GNU,
wydanej przez Fundację Wolnego Oprogramowania - według wersji 2 tej
Licencji lub (według twojego wyboru) którejś z późniejszych wersji.
Niniejszy program rozpowszechniany jest z nadzieją, iż będzie on
użyteczny - jednak BEZ JAKIEJKOLWIEK GWARANCJI, nawet domyślnej
gwarancji PRZYDATNOŚCI HANDLOWEJ albo PRZYDATNOŚCI DO OKREŚLONYCH
ZASTOSOWAŃ. W celu uzyskania bliższych informacji sięgnij do
Powszechnej Licencji Publicznej GNU.
Z pewnością wraz z niniejszym programem otrzymałeś też egzemplarz
Powszechnej Licencji Publicznej GNU (GNU General Public License);
jeśli nie - napisz do Free Software Foundation, Inc., 59 Temple
Place, Fifth Floor, Boston, MA 02110-1301 USA
*/
/**
* @file
* @brief Nagłówki dla klasy QAPRSBase
*/
#ifndef QAPRSBASE_H_
#define QAPRSBASE_H_
#include "QAPRSCommon.h"
/**
* @brief Klasa bazowa do nadawania APRS
* @details Klasa słuzy jako baza do podimplemntacji generowania AFSK.
*/
class QAPRSBase {
private:
/**
* @brief suma kontrolna pakietu
*/
uint16_t ax25CRC;
/**
* @brief ilosć bajtów synchronizacyjnych do nadania przed zawartoscią pakietu
*/
static const uint8_t ax25HeaderFlagFieldCount1200 = 25;
/**
* @brief ilosć bajtów synchronizacyjnych do nadania przed zawartoscią pakietu
*/
static const uint8_t ax25HeaderFlagFieldCount300 = 45;
/**
* @brief ilosć bajtów synchronizacyjnych do nadania przed zawartoscią pakietu
*/
uint8_t ax25HeaderFlagFieldCount;
/**
* @brief Flaga
* @details <http://www.tapr.org/pub_ax25.html#2.2.1>
*/
static const uint8_t ax25FlagFieldValue = 0x7E;
/**
* @brief Czas wysyłania podedynczego tonu. W us.
* @details Czas calkowity powinien wynosic 833us. Wartosć podana tutaj uwzględnia zwłokę związaną z wywoływaniem
* funkcji itp.
*/
#if F_CPU == 16000000L
static const uint16_t toneSendTime1200 = 815;
#elif F_CPU == 8000000UL
static const uint16_t toneSendTime1200 = 785;
#else
//static const uint16_t toneSendTime1200 = 1000000/1200;
#endif
/**
* @brief Czas wysyłania podedynczego tonu. W ms.
* @details Czas calkowity powinien wynosic 4*833ms. Wartosć podana tutaj uwzględnia zwłokę związaną z wywoływaniem
* funkcji itp.
*/
static const uint16_t toneSendTime300 = 815 + 3 * 833;
/**
* @brief Czas oczekiwania na zwolnienie kanału.
* @details Co 100ms sprawdzamy czy można już nadawać @see canTransmit
*/
static const uint16_t channelFreeWaitingMS = 1; // 2000 ms
/**
* @brief Domylslny czas pomiędzy włączeniem nadawania a rozpoczęciem generowania AFSK
*/
static const uint16_t defaultTxDelay = 1; // 300 ms
/**
* @brief Pin Arduino na którym ustawiamy logiczną 1 w momencie nadawania
*/
int8_t txEnablePin;
/**
* @brief Bufor tymczasowy
*/
uint8_t tmpData[255];
/**
* @brief Opóźnienie w ms pomiędzy ustawieniem stanu wysokiego na wyjsciu txEnablePin a rozpoczęciem generowania AFSK
*/
uint16_t txDelay;
/**
* @brief
*/
char from_addr[6];
/**
* @brief
*/
uint8_t from_ssid;
/**
* @brief
*/
char to_addr[6];
/**
* @brief
*/
uint8_t to_ssid;
/**
* @brief
*/
char* relays[3*7];
uint8_t canTransmit();
void ax25SendHeaderBegin();
void ax25SendByte(uint8_t byte);
void ax25SendFooter();
void ax25CalcCRC(uint8_t ls_bit);
void parseRelays(const char * relays, char * dst);
protected:
/**
* @brief Pin Arduino [we] który musi być w stanie niskim (lub wysokim, jesli numer jest ujemny) aby rozpocząć nadawanie.
*/
int8_t sensePin;
/**
* @brief Obecnie generowany ton
*/
QAPRSSendingTone currentTone;
/**
* @brief Obecnie używany wariant
*/
QAPRSVariant variant;
void initializeRadio();
void enableTransmission();
void disableTranssmision();
void toggleTone();
void initializeTimer1();
void delayuSeconds(uint16_t us);
void doTxDelay();
public:
QAPRSBase() {};
QAPRSReturnCode send(char * buffer);
QAPRSReturnCode send(char * buffer, size_t length);
QAPRSReturnCode send(char * from_addr, uint8_t from_ssid, char * to_addr, uint8_t to_ssid, char * packet_content);
QAPRSReturnCode send(char * from_addr, uint8_t from_ssid, char * to_addr, uint8_t to_ssid, char * relays, char * packet_content);
QAPRSReturnCode send(char * from_addr, uint8_t from_ssid, char * to_addr, uint8_t to_ssid, char * relays, char * packet_content, size_t length);
QAPRSReturnCode sendData(char * buffer);
QAPRSReturnCode sendData(char * buffer, size_t length);
void init(int8_t sensePin, int8_t txEnablePin);
void init(int8_t sensePin, int8_t txEnablePin, char * from_addr, uint8_t from_ssid, char * to_addr, uint8_t to_ssid, char * relays);
void setTxDelay(uint16_t txDelay);
void timerInterruptHandler();
void setFromAddress(char * from_addr, uint8_t from_ssid);
void setToAddress(char * to_addr, uint8_t to_ssid);
void setRelays(char * relays);
void setVariant(QAPRSVariant variant = QAPRSVHF);
private:
static const uint16_t toneSendTime = 833;
static const uint16_t toneSendTime1200 = 795;
static const uint16_t MarkTimerValue = 393;
static const uint16_t SpaceTimerValue = 202;
void togglePin();
uint8_t pin;
public:
uint8_t enabled;
uint16_t timer1StartValue;
uint16_t _toneSendTime;
};
/**
* @brief Przesuń bajt o 1 bit w lewo. Używane w nagłówku ax.25
*/
#define SHIFT_BYTE(x) (x << 1)
#endif /* QAPRSBASE_H_ */