RadioLib
Universal wireless communication library for Arduino
AX25.h
1 #if !defined(_RADIOLIB_RADIOLIB_AX25_H)
2 #define _RADIOLIB_RADIOLIB_AX25_H
3 
4 #include "../../TypeDef.h"
5 
6 #if !defined(RADIOLIB_EXCLUDE_AX25)
7 
8 #include "../PhysicalLayer/PhysicalLayer.h"
9 #include "../AFSK/AFSK.h"
10 
11 // macros to access bits in byte array, from http://www.mathcs.emory.edu/~cheung/Courses/255/Syllabus/1-C-intro/bit-array.html
12 #define SET_BIT_IN_ARRAY(A, k) ( A[(k/8)] |= (1 << (k%8)) )
13 #define CLEAR_BIT_IN_ARRAY(A, k) ( A[(k/8)] &= ~(1 << (k%8)) )
14 #define TEST_BIT_IN_ARRAY(A, k) ( A[(k/8)] & (1 << (k%8)) )
15 #define GET_BIT_IN_ARRAY(A, k) ( (A[(k/8)] & (1 << (k%8))) ? 1 : 0 )
16 
17 // CRC-CCITT calculation macros
18 #define XOR(A, B) ( ((A) || (B)) && !((A) && (B)) )
19 #define CRC_CCITT_POLY 0x1021 // generator polynomial
20 #define CRC_CCITT_POLY_REVERSED 0x8408 // CRC_CCITT_POLY in reversed bit order
21 #define CRC_CCITT_INIT 0xFFFF // initial value
22 
23 // maximum callsign length in bytes
24 #define RADIOLIB_AX25_MAX_CALLSIGN_LEN 6
25 
26 // flag field MSB LSB DESCRIPTION
27 #define RADIOLIB_AX25_FLAG 0b01111110 // 7 0 AX.25 frame start/end flag
28 
29 // address field
30 #define RADIOLIB_AX25_SSID_COMMAND_DEST 0b10000000 // 7 7 frame type: command (set in destination SSID)
31 #define RADIOLIB_AX25_SSID_COMMAND_SOURCE 0b00000000 // 7 7 command (set in source SSID)
32 #define RADIOLIB_AX25_SSID_RESPONSE_DEST 0b00000000 // 7 7 response (set in destination SSID)
33 #define RADIOLIB_AX25_SSID_RESPONSE_SOURCE 0b10000000 // 7 7 response (set in source SSID)
34 #define RADIOLIB_AX25_SSID_HAS_NOT_BEEN_REPEATED 0b00000000 // 7 7 not repeated yet (set in repeater SSID)
35 #define RADIOLIB_AX25_SSID_HAS_BEEN_REPEATED 0b10000000 // 7 7 repeated (set in repeater SSID)
36 #define RADIOLIB_AX25_SSID_RESERVED_BITS 0b01100000 // 6 5 reserved bits in SSID
37 #define RADIOLIB_AX25_SSID_HDLC_EXTENSION_CONTINUE 0b00000000 // 0 0 HDLC extension bit: next octet contains more address information
38 #define RADIOLIB_AX25_SSID_HDLC_EXTENSION_END 0b00000001 // 0 0 address field end
39 
40 // control field
41 #define RADIOLIB_AX25_CONTROL_U_SET_ASYNC_BAL_MODE 0b01101100 // 7 2 U frame type: set asynchronous balanced mode (connect request)
42 #define RADIOLIB_AX25_CONTROL_U_SET_ASYNC_BAL_MODE_EXT 0b00101100 // 7 2 set asynchronous balanced mode extended (connect request with module 128)
43 #define RADIOLIB_AX25_CONTROL_U_DISCONNECT 0b01000000 // 7 2 disconnect request
44 #define RADIOLIB_AX25_CONTROL_U_DISCONNECT_MODE 0b00001100 // 7 2 disconnect mode (system busy or disconnected)
45 #define RADIOLIB_AX25_CONTROL_U_UNNUMBERED_ACK 0b01100000 // 7 2 unnumbered acknowledge
46 #define RADIOLIB_AX25_CONTROL_U_FRAME_REJECT 0b10000100 // 7 2 frame reject
47 #define RADIOLIB_AX25_CONTROL_U_UNNUMBERED_INFORMATION 0b00000000 // 7 2 unnumbered information
48 #define RADIOLIB_AX25_CONTROL_U_EXHANGE_IDENTIFICATION 0b10101100 // 7 2 exchange ID
49 #define RADIOLIB_AX25_CONTROL_U_TEST 0b11100000 // 7 2 test
50 #define RADIOLIB_AX25_CONTROL_POLL_FINAL_ENABLED 0b00010000 // 4 4 control field poll/final bit: enabled
51 #define RADIOLIB_AX25_CONTROL_POLL_FINAL_DISABLED 0b00000000 // 4 4 disabled
52 #define RADIOLIB_AX25_CONTROL_S_RECEIVE_READY 0b00000000 // 3 2 S frame type: receive ready (system ready to receive)
53 #define RADIOLIB_AX25_CONTROL_S_RECEIVE_NOT_READY 0b00000100 // 3 2 receive not ready (TNC buffer full)
54 #define RADIOLIB_AX25_CONTROL_S_REJECT 0b00001000 // 3 2 reject (out of sequence or duplicate)
55 #define RADIOLIB_AX25_CONTROL_S_SELECTIVE_REJECT 0b00001100 // 3 2 selective reject (single frame repeat request)
56 #define RADIOLIB_AX25_CONTROL_INFORMATION_FRAME 0b00000000 // 0 0 frame type: information (I frame)
57 #define RADIOLIB_AX25_CONTROL_SUPERVISORY_FRAME 0b00000001 // 1 0 supervisory (S frame)
58 #define RADIOLIB_AX25_CONTROL_UNNUMBERED_FRAME 0b00000011 // 1 0 unnumbered (U frame)
59 
60 // protocol identifier field
61 #define RADIOLIB_AX25_PID_ISO_8208 0x01
62 #define RADIOLIB_AX25_PID_TCP_IP_COMPRESSED 0x06
63 #define RADIOLIB_AX25_PID_TCP_IP_UNCOMPRESSED 0x07
64 #define RADIOLIB_AX25_PID_SEGMENTATION_FRAGMENT 0x08
65 #define RADIOLIB_AX25_PID_TEXNET_DATAGRAM_PROTOCOL 0xC3
66 #define RADIOLIB_AX25_PID_LINK_QUALITY_PROTOCOL 0xC4
67 #define RADIOLIB_AX25_PID_APPLETALK 0xCA
68 #define RADIOLIB_AX25_PID_APPLETALK_ARP 0xCB
69 #define RADIOLIB_AX25_PID_ARPA_INTERNET_PROTOCOL 0xCC
70 #define RADIOLIB_AX25_PID_ARPA_ADDRESS_RESOLUTION 0xCD
71 #define RADIOLIB_AX25_PID_FLEXNET 0xCE
72 #define RADIOLIB_AX25_PID_NET_ROM 0xCF
73 #define RADIOLIB_AX25_PID_NO_LAYER_3 0xF0
74 #define RADIOLIB_AX25_PID_ESCAPE_CHARACTER 0xFF
75 
76 // AFSK tones in Hz
77 #define RADIOLIB_AX25_AFSK_MARK 1200
78 #define RADIOLIB_AX25_AFSK_SPACE 2200
79 
80 // tone duration in us (for 1200 baud AFSK)
81 #define RADIOLIB_AX25_AFSK_TONE_DURATION 833
82 
88 class AX25Frame {
89  public:
93  char destCallsign[RADIOLIB_AX25_MAX_CALLSIGN_LEN + 1];
94 
98  uint8_t destSSID;
99 
103  char srcCallsign[RADIOLIB_AX25_MAX_CALLSIGN_LEN + 1];
104 
108  uint8_t srcSSID;
109 
113  uint8_t numRepeaters;
114 
118  uint8_t control;
119 
123  uint8_t protocolID;
124 
128  uint16_t infoLen;
129 
133  uint8_t rcvSeqNumber;
134 
138  uint16_t sendSeqNumber;
139 
140  #if !defined(RADIOLIB_STATIC_ONLY)
141 
144  uint8_t* info;
145 
150 
154  uint8_t* repeaterSSIDs;
155  #else
156 
159  uint8_t info[RADIOLIB_STATIC_ARRAY_SIZE];
160 
164  char repeaterCallsigns[8][RADIOLIB_AX25_MAX_CALLSIGN_LEN + 1];
165 
169  uint8_t repeaterSSIDs[8];
170  #endif
171 
185  AX25Frame(const char* destCallsign, uint8_t destSSID, const char* srcCallsign, uint8_t srcSSID, uint8_t control);
186 
204  AX25Frame(const char* destCallsign, uint8_t destSSID, const char* srcCallsign, uint8_t srcSSID, uint8_t control, uint8_t protocolID, const char* info);
205 
225  AX25Frame(const char* destCallsign, uint8_t destSSID, const char* srcCallsign, uint8_t srcSSID, uint8_t control, uint8_t protocolID, uint8_t* info, uint16_t infoLen);
226 
232  AX25Frame(const AX25Frame& frame);
233 
237  ~AX25Frame();
238 
244  AX25Frame& operator=(const AX25Frame& frame);
245 
257  int16_t setRepeaters(char** repeaterCallsigns, uint8_t* repeaterSSIDs, uint8_t numRepeaters);
258 
264  void setRecvSequence(uint8_t seqNumber);
265 
271  void setSendSequence(uint8_t seqNumber);
272 };
273 
279 class AX25Client {
280  public:
286  explicit AX25Client(PhysicalLayer* phy);
287 
288  #if !defined(RADIOLIB_EXCLUDE_AFSK)
289 
294  explicit AX25Client(AFSKClient* audio);
295 
307  int16_t setCorrection(int16_t mark, int16_t space, float length = 1.0f);
308  #endif
309 
310  // basic methods
311 
323  int16_t begin(const char* srcCallsign, uint8_t srcSSID = 0x00, uint8_t preambleLen = 8);
324 
336  int16_t transmit(String& str, const char* destCallsign, uint8_t destSSID = 0x00);
337 
349  int16_t transmit(const char* str, const char* destCallsign, uint8_t destSSID = 0x00);
350 
358  int16_t sendFrame(AX25Frame* frame);
359 
360 #if !defined(RADIOLIB_GODMODE)
361  private:
362 #endif
363  friend class APRSClient;
364 
365  PhysicalLayer* _phy;
366  #if !defined(RADIOLIB_EXCLUDE_AFSK)
367  AFSKClient* _audio;
368  uint32_t _afskMark;
369  uint32_t _afskSpace;
370  uint32_t _afskLen;
371  #endif
372 
373  char _srcCallsign[RADIOLIB_AX25_MAX_CALLSIGN_LEN + 1] = {0, 0, 0, 0, 0, 0, 0};
374  uint8_t _srcSSID = 0;
375  uint16_t _preambleLen = 0;
376 
377  static uint16_t getFrameCheckSequence(uint8_t* buff, size_t len);
378 
379  void getCallsign(char* buff);
380  uint8_t getSSID();
381 };
382 
383 #endif
384 
385 #endif
AX25Frame::infoLen
uint16_t infoLen
Number of bytes in the information field.
Definition: AX25.h:128
AX25Frame::protocolID
uint8_t protocolID
The protocol identifier (PID) field.
Definition: AX25.h:123
AX25Frame::setSendSequence
void setSendSequence(uint8_t seqNumber)
Method to set send sequence number.
Definition: AX25.cpp:149
AX25Frame
Abstraction of AX.25 frame format.
Definition: AX25.h:88
AFSKClient
Client for audio-based transmissions. Requires Arduino tone() function, and a module capable of direc...
Definition: AFSK.h:17
AX25Client
Client for AX25 communication.
Definition: AX25.h:279
AX25Frame::srcCallsign
char srcCallsign[RADIOLIB_AX25_MAX_CALLSIGN_LEN+1]
Callsign of the source station.
Definition: AX25.h:103
AX25Frame::info
uint8_t * info
The info field.
Definition: AX25.h:144
AX25Client::begin
int16_t begin(const char *srcCallsign, uint8_t srcSSID=0x00, uint8_t preambleLen=8)
Initialization method.
Definition: AX25.cpp:177
AX25Frame::setRepeaters
int16_t setRepeaters(char **repeaterCallsigns, uint8_t *repeaterSSIDs, uint8_t numRepeaters)
Method to set the repeater callsigns and SSIDs.
Definition: AX25.cpp:109
AX25Client::transmit
int16_t transmit(String &str, const char *destCallsign, uint8_t destSSID=0x00)
Transmit unnumbered information (UI) frame.
Definition: AX25.cpp:197
AX25Frame::setRecvSequence
void setRecvSequence(uint8_t seqNumber)
Method to set receive sequence number.
Definition: AX25.cpp:145
AX25Client::setCorrection
int16_t setCorrection(int16_t mark, int16_t space, float length=1.0f)
Set AFSK tone correction offset. On some platforms, this is required to get the audio produced by the...
Definition: AX25.cpp:169
AX25Client::AX25Client
AX25Client(PhysicalLayer *phy)
Constructor for 2-FSK mode.
Definition: AX25.cpp:153
AX25Frame::repeaterSSIDs
uint8_t * repeaterSSIDs
Array of repeater SSIDs.
Definition: AX25.h:154
AX25Frame::destSSID
uint8_t destSSID
SSID of the destination station.
Definition: AX25.h:98
APRSClient
Client for APRS communication.
Definition: APRS.h:66
PhysicalLayer
Provides common interface for protocols that run on LoRa/FSK modules, such as RTTY or LoRaWAN....
Definition: PhysicalLayer.h:14
AX25Frame::control
uint8_t control
The control field.
Definition: AX25.h:118
AX25Frame::destCallsign
char destCallsign[RADIOLIB_AX25_MAX_CALLSIGN_LEN+1]
Callsign of the destination station.
Definition: AX25.h:93
AX25Frame::rcvSeqNumber
uint8_t rcvSeqNumber
Receive sequence number.
Definition: AX25.h:133
AX25Frame::srcSSID
uint8_t srcSSID
SSID of the source station.
Definition: AX25.h:108
AX25Frame::~AX25Frame
~AX25Frame()
Default destructor.
Definition: AX25.cpp:56
AX25Frame::sendSeqNumber
uint16_t sendSeqNumber
Send sequence number.
Definition: AX25.h:138
AX25Frame::AX25Frame
AX25Frame(const char *destCallsign, uint8_t destSSID, const char *srcCallsign, uint8_t srcSSID, uint8_t control)
Overloaded constructor, for frames without info field.
Definition: AX25.cpp:4
AX25Frame::operator=
AX25Frame & operator=(const AX25Frame &frame)
Overload for assignment operator.
Definition: AX25.cpp:74
AX25Frame::numRepeaters
uint8_t numRepeaters
Number of repeaters to be used.
Definition: AX25.h:113
AX25Client::sendFrame
int16_t sendFrame(AX25Frame *frame)
Transmit arbitrary AX.25 frame.
Definition: AX25.cpp:212
AX25Frame::repeaterCallsigns
char ** repeaterCallsigns
Array of repeater callsigns.
Definition: AX25.h:149