RS41_APRS/RS41HUP/QAPRSBase.h
2022-10-08 12:32:56 +02:00

203 lines
6.2 KiB
C++

/*
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_ */