1
+ #include " AudioTools/CoreAudio/Buffers.h"
2
+ #include " LoRa.h"
3
+
4
+ // define the default pins used by the transceiver module
5
+ #define ss 8
6
+ #define rst 12
7
+ #define dio0 14
8
+
9
+ namespace audio_tools {
10
+
11
+ /* *
12
+ * @brief LoRa Audio Configuration with default values maximised for
13
+ * speed.
14
+ * @author Phil Schatzmann
15
+ * @copyright GPLv3
16
+
17
+ Heltec LoRa 32 Lora Pins:
18
+ NSS: 8
19
+ SCK: 9
20
+ MOSI: 10
21
+ MISO: 11
22
+ RST: 12
23
+ BUSY: 13
24
+ DIO1: 14
25
+
26
+ */
27
+
28
+ struct AudioLoRaConfig : public AudioInfo {
29
+ int32_t spi_speed = 8E6 ;
30
+ int max_size = 200 ;
31
+ int frequency = 868E6 ; // (433E6, 868E6, 915E6)
32
+ int sync_word = 0xF3 ;
33
+ int tx_power = 20 ; // 2-20;
34
+ int spreading_factor = 12 ; // 6-12
35
+ int signal_bandwidth =
36
+ 7.8E3 ; // 7.8E3, 10.4E3, 15.6E3, 20.8E3, 31.25E3, 41.7E3,
37
+ // 62.5E3, 125E3, 250E3, and 500E3.
38
+ int pin_ss = ss;
39
+ int pin_rst = rst;
40
+ int pin_dio0 = dio0;
41
+ bool process_audio_info = true ;
42
+ };
43
+
44
+ /* *
45
+ * @brief LoRa Audio Sending and Receiving
46
+ * @author Phil Schatzmann
47
+ * @copyright GPLv3
48
+ */
49
+ class AudioLoRa : public AudioStream {
50
+ public:
51
+ AudioLoRaConfig defaultConfig () {
52
+ AudioLoRaConfig rc;
53
+ return rc;
54
+ }
55
+
56
+ void setAudioInfo (AudioInfo info) {
57
+ cfg.sample_rate = info.sample_rate ;
58
+ cfg.channels = info.channels ;
59
+ cfg.bits_per_sample = info.bits_per_sample ;
60
+ AudioStream::setAudioInfo (info);
61
+ }
62
+
63
+ bool begin (AudioLoRaConfig config) {
64
+ cfg = config;
65
+ AudioStream::setAudioInfo (config);
66
+ return begin ();
67
+ }
68
+
69
+ bool begin () {
70
+ TRACEI ();
71
+ buffer.resize (cfg.max_size );
72
+ LoRa.setSignalBandwidth (cfg.signal_bandwidth );
73
+ LoRa.setSpreadingFactor (cfg.spreading_factor );
74
+ LoRa.setTxPower (cfg.tx_power );
75
+ LoRa.setSPIFrequency (cfg.spi_speed );
76
+ LoRa.setPins (cfg.pin_ss , cfg.pin_rst , cfg.pin_dio0 );
77
+ LoRa.setSyncWord (cfg.sync_word );
78
+ bool rc = LoRa.begin (cfg.frequency );
79
+ if (cfg.process_audio_info ) {
80
+ writeAudioInfo ();
81
+ }
82
+ return rc;
83
+ }
84
+
85
+ void end () { LoRa.end (); }
86
+
87
+ size_t readBytes (uint8_t * data, size_t len) {
88
+ TRACEI ();
89
+ size_t packetSize = LoRa.parsePacket ();
90
+ if (cfg.process_audio_info && packetSize == sizeof (AudioInfo)) {
91
+ readAudioInfo ();
92
+ packetSize = LoRa.parsePacket ();
93
+ }
94
+ int toRead = min (len, packetSize);
95
+ int read = LoRa.readBytes (data, toRead);
96
+ return read;
97
+ }
98
+
99
+ int available () { return cfg.max_size ; }
100
+
101
+ int availableForWrite () { return cfg.max_size ; }
102
+
103
+ size_t write (const uint8_t * data, size_t len) {
104
+ TRACEI ();
105
+ for (int j = 0 ; j < len; j++) {
106
+ buffer.write (data[j]);
107
+ if (buffer.isFull ()) {
108
+ LoRa.beginPacket ();
109
+ LoRa.write (buffer.data (), buffer.available ());
110
+ LoRa.endPacket ();
111
+ buffer.clear ();
112
+ }
113
+ }
114
+ return len;
115
+ }
116
+
117
+ protected:
118
+ AudioLoRaConfig cfg;
119
+ SingleBuffer<uint8_t > buffer;
120
+
121
+ void readAudioInfo () {
122
+ AudioInfo tmp;
123
+ int read = LoRa.readBytes ((uint8_t *)&tmp, sizeof (AudioInfo));
124
+ setAudioInfo (tmp);
125
+ }
126
+
127
+ void writeAudioInfo () {
128
+ LoRa.beginPacket ();
129
+ AudioInfo ai = audioInfo ();
130
+ LoRa.write ((uint8_t *)&ai, sizeof (ai));
131
+ LoRa.endPacket ();
132
+ }
133
+ };
134
+
135
+ } // namespace audio_tools
0 commit comments