RadioLib
Universal wireless communication library for Arduino
M17.h
1 #if !defined(_RADIOLIB_M17_H)
2 #define _RADIOLIB_M17_H
3 
4 #include "../../TypeDef.h"
5 
6 #if !RADIOLIB_EXCLUDE_M17
7 
8 #include "../PhysicalLayer/PhysicalLayer.h"
9 #include "../FSK4/FSK4.h"
10 
11 // basic M17 properties
12 #define RADIOLIB_M17_SHIFT_HZ (1600)
13 #define RADIOLIB_M17_RATE_BAUD (4800)
14 
15 // preamble
16 #define RADIOLIB_M17_PRE_LEN_BYTES (192/4)
17 #define RADIOLIB_M17_PRE_PATTERN_LSF (0x77)
18 #define RADIOLIB_M17_PRE_PATTERN_BERT (0xDD)
19 
20 // end-of-transmission
21 #define RADIOLIB_M17_EOT_LEN_BYTES (192/4)
22 #define RADIOLIB_M17_EOT_PATTERN (0x555D)
23 
24 // sync-burst
25 #define RADIOLIB_M17_SYNC_BURST_LSF (0x55F7)
26 #define RADIOLIB_M17_SYNC_BURST_BERT (0xDF55)
27 #define RADIOLIB_M17_SYNC_BURST_STREAM (0xFF5D)
28 #define RADIOLIB_M17_SYNC_BURST_PACKET (0x75FF)
29 
30 // link setup frame (LFS) bit fields MSB LSB DESCRIPTION
31 #define RADIOLIB_M17_LSF_MODE_PACKET (0x00UL << 0) // 0 0 LSF packet/stream indicator: packet
32 #define RADIOLIB_M17_LSF_MODE_STREAM (0x01UL << 0) // 0 0 stream
33 #define RADIOLIB_M17_LSF_DATA_TYPE_DATA (0x01UL << 1) // 2 1 data type: data
34 #define RADIOLIB_M17_LSF_DATA_TYPE_VOICE (0x02UL << 1) // 2 1 voice
35 #define RADIOLIB_M17_LSF_DATA_TYPE_VOICE_DATA (0x03UL << 1) // 2 1 data + voice
36 #define RADIOLIB_M17_LSF_ENC_NONE (0x00UL << 3) // 4 3 encryption: none
37 #define RADIOLIB_M17_LSF_ENC_SCRAMBLER (0x01UL << 3) // 4 3 scrambler
38 #define RADIOLIB_M17_LSF_ENC_AES (0x02UL << 3) // 4 3 AES
39 #define RADIOLIB_M17_LSF_ENC_OTHER (0x03UL << 3) // 4 3 other
40 #define RADIOLIB_M17_LSF_AES_LEN_128 (0x00UL << 5) // 6 5 encryption key length: 128-bit
41 #define RADIOLIB_M17_LSF_AES_LEN_192 (0x01UL << 5) // 6 5 192-bit
42 #define RADIOLIB_M17_LSF_AES_LEN_256 (0x02UL << 5) // 6 5 256-bit
43 #define RADIOLIB_M17_LSF_SCRAMLER_LEN_8 (0x00UL << 5) // 6 5 scrambler length: 8-bit
44 #define RADIOLIB_M17_LSF_SCRAMLER_LEN_16 (0x01UL << 5) // 6 5 16-bit
45 #define RADIOLIB_M17_LSF_SCRAMLER_LEN_24 (0x02UL << 5) // 6 5 24-bit
46 
47 // maximum length of LSF frame before puncturing
48 #define RADIOLIB_M17_LSF_MAXLEN_BYTES_ENCODED (368/8)
49 
50 #define RADIOLIB_M17_ADDR_LEN (6)
51 
52 #define RADIOLIB_M17_RANDOMIZER_LEN (46)
53 
54 static const uint8_t m17_randomizer[RADIOLIB_M17_RANDOMIZER_LEN] = {
55  0xD6, 0xB5, 0xE2, 0x30, 0x82, 0xFF, 0x84, 0x62,
56  0xBA, 0x4E, 0x96, 0x90, 0xD8, 0x98, 0xDD, 0x5D,
57  0x0C, 0xC8, 0x52, 0x43, 0x91, 0x1D, 0xF8, 0x6E,
58  0x68, 0x2F, 0x35, 0xDA, 0x14, 0xEA, 0xCD, 0x76,
59  0x19, 0x8D, 0xD5, 0x80, 0xD1, 0x33, 0x87, 0x13,
60  0x57, 0x18, 0x2D, 0x29, 0x78, 0xC3
61 };
62 
67 class M17Client: public FSK4Client {
68  public:
73  explicit M17Client(PhysicalLayer* phy);
74 
80  int16_t begin(float base, char* addr);
81 
82  int16_t transmit(uint8_t* data, size_t len, char* dst);
83 
84 #if !RADIOLIB_GODMODE
85  private:
86 #endif
87  PhysicalLayer* phyLayer;
88  uint8_t src[RADIOLIB_M17_ADDR_LEN] = { 0 };
89  uint8_t randIndex = 0;
90 
91  int16_t encodeAddr(char* in, uint8_t* out);
92  size_t encodeLsf(char* dst, uint16_t type, uint8_t* out, uint8_t* meta = NULL, size_t metaLen = 0);
93  void randomize(uint8_t* buff, size_t len);
94 };
95 
96 #endif
97 
98 #endif
Client for FSK-4 communication. The public interface is the same as Arduino Serial.
Definition: FSK4.h:15
Client for M17 transmissions.
Definition: M17.h:67
int16_t begin(float base, char *addr)
Initialization method.
Definition: M17.cpp:14
M17Client(PhysicalLayer *phy)
Constructor for 4-FSK mode.
Definition: M17.cpp:10
Provides common interface for protocols that run on LoRa/FSK modules, such as RTTY or LoRaWAN....
Definition: PhysicalLayer.h:151