arduino-audio-tools
Loading...
Searching...
No Matches
LoRaStream.h
Go to the documentation of this file.
1#pragma once
2
4#include "LoRa.h" // https://github.com/sandeepmistry/arduino-LoRa
5
6// define the default pins used by the transceiver module
7#define rst 12
8#define dio0 14
9
10namespace audio_tools {
11
30struct LoRaConfig : public AudioInfo {
32 sample_rate = 0;
33 channels = 0;
35 }
36 int sync_word = 0xF3; // 0x0-0xFF
37 int32_t spi_speed = 8000000;
38 int max_size = 200; // max 256 bytes
39 int frequency = 868E6; // (Asio:433E6, EU:868E6, US: 915E6)
40 int tx_power = 20; // 2-20;
41 int spreading_factor = 6; // 6-12 (6 fastest)
42 // 7.8E3, 10.4E3, 15.6E3, 20.8E3, 31.25E3, 41.7E3, 62.5E3, 125E3, 250E3, and
43 // 500E3 (fastest)
45 int pin_ss = SS;
46 int pin_rst = rst;
49};
50
57class LoRaStream : public AudioStream {
58 public:
61 return rc;
62 }
63
70
71 bool begin(LoRaConfig config) {
72 cfg = config;
74 return begin();
75 }
76
77 bool begin() {
78 TRACEI();
79 is_audio_info_sent = false;
81 bool rc;
82 int count = 0;
83 LOGI("LoRa begin...");
85 do {
86 rc = LoRa.begin(cfg.frequency);
87 if (++count > cfg.max_begin_retry) return false;
88 if (!rc){
89 LOGI("LoRa begin failed");
90 delay(800);
91 }
92 } while(!rc);
93 LoRa.setSignalBandwidth(cfg.signal_bandwidth);
94 LoRa.setSpreadingFactor(cfg.spreading_factor);
95 LoRa.setTxPower(cfg.tx_power);
96 LoRa.setSPIFrequency(cfg.spi_speed);
97 LoRa.setSyncWord(cfg.sync_word);
98 if (rc) LOGI("LoRa begin success");
99 return rc;
100 }
101
102 void end() {
103 TRACEI();
104 LoRa.end();
105 }
106
107 size_t readBytes(uint8_t* data, size_t len) {
108 LOGI("LoRaStream::readBytes: %d", len);
109 size_t packetSize = LoRa.parsePacket();
110 if (!cfg && packetSize == sizeof(AudioInfo)) {
112 packetSize = LoRa.parsePacket();
113 }
114 int toRead = min(len, packetSize);
115 int read = LoRa.readBytes(data, toRead);
116 return read;
117 }
118
119 int available() { return cfg.max_size; }
120
122
123 size_t write(const uint8_t* data, size_t len) {
124 LOGI("LoRaStream::write: %d", len);
125
126 if (cfg && !is_audio_info_sent) {
128 is_audio_info_sent = true;
129 }
130
131 for (int j = 0; j < len; j++) {
132 buffer.write(data[j]);
133 if (buffer.isFull()) {
134 LoRa.beginPacket();
135 LoRa.write(buffer.data(), buffer.available());
136 LoRa.endPacket();
137 buffer.clear();
138 }
139 }
140 return len;
141 }
142
143 protected:
146 bool is_audio_info_sent = false;
147
149 TRACED();
150 AudioInfo tmp;
151 int read = LoRa.readBytes((uint8_t*)&tmp, sizeof(AudioInfo));
152 if (tmp) setAudioInfo(tmp);
153 }
154
156 TRACED();
157 LoRa.beginPacket();
159 LoRa.write((uint8_t*)&ai, sizeof(ai));
160 LoRa.endPacket();
161 }
162};
163
164} // namespace audio_tools
#define dio0
Definition AudioLoRa.h:10
#define rst
Definition AudioLoRa.h:9
#define TRACEI()
Definition AudioLoggerIDF.h:32
#define TRACED()
Definition AudioLoggerIDF.h:31
#define LOGI(...)
Definition AudioLoggerIDF.h:28
Base class for all Audio Streams. It support the boolean operator to test if the object is ready with...
Definition BaseStream.h:123
AudioInfo info
Definition BaseStream.h:174
virtual void setAudioInfo(AudioInfo newInfo) override
Defines the input AudioInfo.
Definition BaseStream.h:131
virtual AudioInfo audioInfo() override
provides the actual input AudioInfo
Definition BaseStream.h:154
void clear()
same as reset
Definition Buffers.h:95
LoRa: Sending and Receiving Audio.
Definition LoRaStream.h:57
void readAudioInfo()
Definition LoRaStream.h:148
LoRaConfig defaultConfig()
Definition LoRaStream.h:59
int available()
Definition LoRaStream.h:119
void setAudioInfo(AudioInfo info)
Defines the input AudioInfo.
Definition LoRaStream.h:64
bool begin()
Definition LoRaStream.h:77
void writeAudioInfo()
Definition LoRaStream.h:155
bool is_audio_info_sent
Definition LoRaStream.h:146
int availableForWrite()
Definition LoRaStream.h:121
size_t readBytes(uint8_t *data, size_t len)
Definition LoRaStream.h:107
LoRaConfig cfg
Definition LoRaStream.h:144
SingleBuffer< uint8_t > buffer
Definition LoRaStream.h:145
void end()
Definition LoRaStream.h:102
bool begin(LoRaConfig config)
Definition LoRaStream.h:71
size_t write(const uint8_t *data, size_t len)
Definition LoRaStream.h:123
A simple Buffer implementation which just uses a (dynamically sized) array.
Definition Buffers.h:172
bool write(T sample) override
write add an entry to the buffer
Definition Buffers.h:206
int available() override
provides the number of entries that are available to read
Definition Buffers.h:233
bool isFull() override
checks if the buffer is full
Definition Buffers.h:240
bool resize(int size)
Resizes the buffer if supported: returns false if not supported.
Definition Buffers.h:305
T * data()
Provides address of actual data.
Definition Buffers.h:284
Generic Implementation of sound input and output for desktop environments using portaudio.
Definition AudioCodecsBase.h:10
void delay(unsigned long ms)
Definition Time.h:23
size_t writeData(Print *p_out, T *data, int samples, int maxSamples=512)
Definition AudioTypes.h:512
Basic Audio information which drives e.g. I2S.
Definition AudioTypes.h:55
sample_rate_t sample_rate
Sample Rate: e.g 44100.
Definition AudioTypes.h:57
uint16_t channels
Number of channels: 2=stereo, 1=mono.
Definition AudioTypes.h:59
uint8_t bits_per_sample
Number of bits per sample (int16_t = 16 bits)
Definition AudioTypes.h:61
LoRa Audio Configuration with default values maximised for speed using the LoRa library from sandeepm...
Definition LoRaStream.h:30
int frequency
Definition LoRaStream.h:39
int pin_rst
Definition LoRaStream.h:46
LoRaConfig()
Definition LoRaStream.h:31
int tx_power
Definition LoRaStream.h:40
int signal_bandwidth
Definition LoRaStream.h:44
int spreading_factor
Definition LoRaStream.h:41
int32_t spi_speed
Definition LoRaStream.h:37
int pin_ss
Definition LoRaStream.h:45
int max_begin_retry
Definition LoRaStream.h:48
int max_size
Definition LoRaStream.h:38
int pin_dio0
Definition LoRaStream.h:47
int sync_word
Definition LoRaStream.h:36