arduino-audio-tools
All Classes Namespaces Files Functions Variables Typedefs Enumerations Friends Modules Pages
AudioLoRa.h
1#pragma once
2
3#include "AudioTools/CoreAudio/Buffers.h"
4#include "AudioTools/CoreAudio/BaseStream.h"
5#include "LoRa.h"
6
7// define the default pins used by the transceiver module
8#define ss 8
9#define rst 12
10#define dio0 14
11
12namespace audio_tools {
13
31struct AudioLoRaConfig : public AudioInfo {
32 int32_t spi_speed = 8E6;
33 int max_size = 200;
34 int frequency = 868E6; // (433E6, 868E6, 915E6)
35 int sync_word = 0xF3;
36 int tx_power = 20; // 2-20;
37 int spreading_factor = 12; // 6-12
38 int signal_bandwidth =
39 7.8E3; // 7.8E3, 10.4E3, 15.6E3, 20.8E3, 31.25E3, 41.7E3,
40 // 62.5E3, 125E3, 250E3, and 500E3.
41 int pin_ss = ss;
42 int pin_rst = rst;
43 int pin_dio0 = dio0;
44 bool process_audio_info = true;
45};
46
52class AudioLoRa : public AudioStream {
53 public:
54 AudioLoRaConfig defaultConfig() {
56 return rc;
57 }
58
60 cfg.sample_rate = info.sample_rate;
61 cfg.channels = info.channels;
64 }
65
66 bool begin(AudioLoRaConfig config) {
67 cfg = config;
69 return begin();
70 }
71
72 bool begin() {
73 TRACEI();
74 buffer.resize(cfg.max_size);
75 LoRa.setSignalBandwidth(cfg.signal_bandwidth);
76 LoRa.setSpreadingFactor(cfg.spreading_factor);
77 LoRa.setTxPower(cfg.tx_power);
78 LoRa.setSPIFrequency(cfg.spi_speed);
79 LoRa.setPins(cfg.pin_ss, cfg.pin_rst, cfg.pin_dio0);
80 LoRa.setSyncWord(cfg.sync_word);
81 bool rc = LoRa.begin(cfg.frequency);
82 if (cfg.process_audio_info) {
83 writeAudioInfo();
84 }
85 return rc;
86 }
87
88 void end() { LoRa.end(); }
89
90 size_t readBytes(uint8_t* data, size_t len) {
91 TRACEI();
92 size_t packetSize = LoRa.parsePacket();
93 if (cfg.process_audio_info && packetSize == sizeof(AudioInfo)) {
94 readAudioInfo();
95 packetSize = LoRa.parsePacket();
96 }
97 int toRead = min(len, packetSize);
98 int read = LoRa.readBytes(data, toRead);
99 return read;
100 }
101
102 int available() { return cfg.max_size; }
103
104 int availableForWrite() { return cfg.max_size; }
105
106 size_t write(const uint8_t* data, size_t len) {
107 TRACEI();
108 for (int j = 0; j < len; j++) {
109 buffer.write(data[j]);
110 if (buffer.isFull()) {
111 LoRa.beginPacket();
112 LoRa.write(buffer.data(), buffer.available());
113 LoRa.endPacket();
114 buffer.clear();
115 }
116 }
117 return len;
118 }
119
120 protected:
121 AudioLoRaConfig cfg;
122 SingleBuffer<uint8_t> buffer;
123
124 void readAudioInfo() {
125 AudioInfo tmp;
126 int read = LoRa.readBytes((uint8_t*)&tmp, sizeof(AudioInfo));
127 setAudioInfo(tmp);
128 }
129
130 void writeAudioInfo() {
131 LoRa.beginPacket();
132 AudioInfo ai = audioInfo();
133 LoRa.write((uint8_t*)&ai, sizeof(ai));
134 LoRa.endPacket();
135 }
136};
137
138} // namespace audio_tools
LoRa Audio Sending and Receiving.
Definition AudioLoRa.h:52
void setAudioInfo(AudioInfo info)
Defines the input AudioInfo.
Definition AudioLoRa.h:59
Base class for all Audio Streams. It support the boolean operator to test if the object is ready with...
Definition BaseStream.h:115
virtual void setAudioInfo(AudioInfo newInfo) override
Defines the input AudioInfo.
Definition BaseStream.h:123
virtual AudioInfo audioInfo() override
provides the actual input AudioInfo
Definition BaseStream.h:146
void clear()
same as reset
Definition Buffers.h:134
bool write(T sample) override
write add an entry to the buffer
Definition Buffers.h:194
int available() override
provides the number of entries that are available to read
Definition Buffers.h:219
bool isFull() override
checks if the buffer is full
Definition Buffers.h:226
T * data()
Provides address of actual data.
Definition Buffers.h:252
Vector implementation which provides the most important methods as defined by std::vector....
Definition Vector.h:21
Generic Implementation of sound input and output for desktop environments using portaudio.
Definition AudioConfig.h:885
Basic Audio information which drives e.g. I2S.
Definition AudioTypes.h:52
sample_rate_t sample_rate
Sample Rate: e.g 44100.
Definition AudioTypes.h:55
uint16_t channels
Number of channels: 2=stereo, 1=mono.
Definition AudioTypes.h:57
uint8_t bits_per_sample
Number of bits per sample (int16_t = 16 bits)
Definition AudioTypes.h:59
LoRa Audio Configuration with default values maximised for speed.
Definition AudioLoRa.h:31