arduino-audio-tools
Loading...
Searching...
No Matches
Arduino.h
Go to the documentation of this file.
1#pragma once
13// Used by logger: so we can not use any logging in this file
14#ifdef IS_DESKTOP
15#error We should not get here!
16#endif
17#include <ctype.h>
18#include <stdint.h>
19#include <stdio.h>
20#include <stdlib.h>
21#include <string.h>
22
23#define IS_NOARDUINO
24
25#ifndef PSTR
26#define PSTR(fmt) fmt
27#endif
28
29#ifndef PI
30#define PI 3.14159265359f
31#endif
32
33#ifndef INPUT
34#define INPUT 0x0
35#endif
36
37#ifndef OUTPUT
38#define OUTPUT 0x1
39#endif
40
41#ifndef INPUT_PULLUP
42#define INPUT_PULLUP 0x2
43#endif
44
45#ifndef HIGH
46#define HIGH 0x1
47#endif
48#ifndef LOW
49#define LOW 0x0
50#endif
51
52// using namespace std;
53
54enum PrintCharFmt { DEC = 10, HEX = 16 };
55
56class Print {
57 public:
58#ifndef DOXYGEN
59 virtual size_t write(uint8_t ch) {
60 // not implememnted: to be overritten
61 return 0;
62 }
63
64 virtual size_t write(const char* str) {
65 return write((const uint8_t*)str, strlen(str));
66 }
67
68 virtual size_t write(const char* buffer, size_t size) {
69 return write((const uint8_t*)buffer, size);
70 }
71
72 virtual size_t print(const char* msg) {
73 int result = strlen(msg);
74 return write(msg, result);
75 }
76
77 virtual size_t println(const char* msg = "") {
78 int result = print(msg);
79 write('\n');
80 return result + 1;
81 }
82
83 virtual size_t println(float number) {
84 char buffer[120];
85 snprintf(buffer, 120, "%f", number);
86 return println(buffer);
87 }
88
89 virtual size_t print(float number) {
90 char buffer[120];
91 snprintf(buffer, 120, "%f", number);
92 return print(buffer);
93 }
94
95 virtual size_t print(int number) {
96 char buffer[80];
97 snprintf(buffer, 80, "%d", number);
98 return print(buffer);
99 }
100
101 virtual size_t print(char c, PrintCharFmt spec) {
102 char result[5];
103 switch (spec) {
104 case DEC:
105 snprintf(result, 3, "%c", c);
106 return print(result);
107 case HEX:
108 snprintf(result, 3, "%x", c);
109 return print(result);
110 }
111 return -1;
112 }
113
114 size_t println(int value, PrintCharFmt fmt) {
115 return print(value, fmt) + println();
116 }
117
118#endif
119
120 virtual size_t write(const uint8_t* data, size_t len) {
121 if (data == nullptr) return 0;
122 for (size_t j = 0; j < len; j++) {
123 write(data[j]);
124 }
125 return len;
126 }
127
128 virtual int availableForWrite() { return 1024; }
129
130 virtual void flush() { /* Empty implementation for backward compatibility */ }
131
132 protected:
133 int _timeout = 10;
134};
135
136class Stream : public Print {
137 public:
138 virtual ~Stream() = default;
139 virtual int available() { return 0; }
140 virtual size_t readBytes(uint8_t* data, size_t len) { return 0; }
141#ifndef DOXYGEN
142 virtual int read() { return -1; }
143 virtual int peek() { return -1; }
144 virtual void setTimeout(size_t timeoutMs) {}
145 size_t readBytesUntil(char terminator, char* buffer, size_t length) {
146 for (size_t j = 0; j < length; j++) {
147 int val = read();
148 if (val == -1) return j - 1;
149 if (val == terminator) return j;
150 buffer[j] = val;
151 }
152 return length;
153 };
154 size_t readBytesUntil(char terminator, uint8_t* buffer, size_t length) {
155 return readBytesUntil(terminator, (char*)buffer, length);
156 }
157
158#endif
159 operator bool() { return true; }
160};
161
162class Client : public Stream {
163 public:
164 void stop() {};
165 virtual int read(uint8_t* buffer, size_t len) { return 0; };
166 virtual int read() { return 0; };
167 bool connected() { return false; };
168 bool connect(const char* ip, int port) { return false; }
169 virtual operator bool() { return false; }
170};
171
172class HardwareSerial : public Stream {
173 public:
174 size_t write(uint8_t ch) override { return putchar(ch); }
175 virtual operator bool() { return true; }
176 bool begin(long baudrate, int config = 0) { return true; }
177};
178
180
182inline long map(long x, long in_min, long in_max, long out_min, long out_max) {
183 return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min;
184}
185
186#if defined(ESP32_CMAKE)
187
188#include "driver/gpio.h"
189#include "freertos/FreeRTOS.h" // needed for ESP Arduino < 2.0
190#include "freertos/FreeRTOSConfig.h"
191
192#define GPIO_NONE -1
193#define IS_GPIO(pin) (pin >= 0)
194#define GPIO_TO_INT(pin) pin
195#define GPIO_TO_STR(pin) std::to_string(pin).c_str()
196
197using digital_pin_t = int;
198
200inline int digitalRead(digital_pin_t pin) {
201 printf("digitalRead:%d\n", pin);
202 return gpio_get_level((gpio_num_t)pin);
203}
204
205inline void digitalWrite(digital_pin_t pin, int value) {
206 gpio_set_level((gpio_num_t)pin, value);
207}
208
209inline void pinMode(digital_pin_t pin, int mode) {
210 gpio_num_t gpio_pin = (gpio_num_t)pin;
211 printf("pinMode(%d,%d)\n", pin, mode);
212
213 gpio_reset_pin(gpio_pin);
214 switch (mode) {
215 case INPUT:
216 gpio_set_direction(gpio_pin, GPIO_MODE_INPUT);
217 break;
218 case OUTPUT:
219 gpio_set_direction(gpio_pin, GPIO_MODE_OUTPUT);
220 break;
221 case INPUT_PULLUP:
222 gpio_set_direction(gpio_pin, GPIO_MODE_INPUT);
223 gpio_set_pull_mode(gpio_pin, GPIO_PULLUP_ONLY);
224 break;
225 default:
226 gpio_set_direction(gpio_pin, GPIO_MODE_INPUT_OUTPUT);
227 break;
228 }
229}
230
231inline void delay(uint32_t ms) { vTaskDelay(ms / portTICK_PERIOD_MS); }
232inline void yield() { taskYIELD(); }
233inline uint32_t millis() { return (xTaskGetTickCount() * portTICK_PERIOD_MS); }
234inline void delayMicroseconds(uint32_t ms) { esp_rom_delay_us(ms); }
235inline uint64_t micros() {
236 return xTaskGetTickCount() * portTICK_PERIOD_MS * 1000;
237}
238
239// delay and millis has been defined
240#define DESKTOP_MILLIS_DEFINED
241
242#endif
243
244#if defined(IS_ZEPHYR)
245#include <zephyr/drivers/gpio.h>
246
247#define DESKTOP_MILLIS_DEFINED
248#define IS_GPIO(pin) (pin.port != nullptr)
249#define GPIO_TO_INT(pin) pin.pin
250#define GPIO_TO_STR(pin) std::to_string(GPIO_TO_INT(pin)).c_str()
251#define ZLOGE(...) printk(__VA_ARGS__)
252
253namespace audio_tools {
254
255inline void delay(uint32_t ms) { k_msleep(ms); }
256inline uint32_t millis() { return k_uptime_get_32(); }
258 if (us == 0) return;
260}
262inline void yield() { k_yield(); }
263
264
267
269static gpio_dt_spec GPIO_NONE = {nullptr, 0, 0};
270
273 return (a.port == b.port) && (a.pin == b.pin);
274}
275
278 return !(a == b);
279}
280
281
282void pinMode(digital_pin_t pin, int mode) {
283 if (pin == GPIO_NONE || !gpio_is_ready_dt(&pin)) {
284 ZLOGE("GPIO pin not ready");
285 return;
286 }
287
288 gpio_flags_t flags;
289 switch (mode) {
290 case OUTPUT:
291 flags = GPIO_OUTPUT;
292 break;
293 case INPUT:
294 flags = GPIO_INPUT;
295 break;
296 case INPUT_PULLUP:
297 flags = GPIO_INPUT | GPIO_PULL_UP;
298 break;
299 // case INPUT_PULLDOWN:
300 // flags = GPIO_INPUT | GPIO_PULL_DOWN;
301 // break;
302 default:
303 flags = GPIO_OUTPUT;
304 break;
305 }
306
307 int rc = gpio_pin_configure_dt(&pin, flags);
308 if (rc != 0) {
309 ZLOGE("Failed to configure GPIO pin: %d", rc);
310 }
311}
312
313void digitalWrite(digital_pin_t pin, bool value) {
314 if (pin == GPIO_NONE || !gpio_is_ready_dt(&pin)) {
315 ZLOGE("GPIO pin not ready");
316 }
317
318 int rc = gpio_pin_set_dt(&pin, value ? 1 : 0);
319 if (rc != 0) {
320 ZLOGE("Failed to write GPIO pin: %d", rc);
321 }
322}
323
325 if (pin == GPIO_NONE || !gpio_is_ready_dt(&pin)) {
326 ZLOGE("GPIO pin not ready");
327 return false;
328 }
329
330 int rc = gpio_pin_get_dt(&pin);
331 if (rc < 0) {
332 ZLOGE("Failed to read GPIO pin: %d", rc);
333 }
334 return rc;
335}
336
337} // namespace audio_tools
338#endif
#define INPUT
Definition Arduino.h:34
#define OUTPUT
Definition Arduino.h:38
#define INPUT_PULLUP
Definition Arduino.h:42
static HardwareSerial Serial
Definition Arduino.h:179
long map(long x, long in_min, long in_max, long out_min, long out_max)
Maps input to output values.
Definition Arduino.h:182
PrintCharFmt
Definition Arduino.h:54
@ DEC
Definition Arduino.h:54
@ HEX
Definition Arduino.h:54
#define ZLOGE(...)
Definition Arduino.h:251
Definition Arduino.h:162
bool connect(const char *ip, int port)
Definition Arduino.h:168
bool connected()
Definition Arduino.h:167
virtual int read(uint8_t *buffer, size_t len)
Definition Arduino.h:165
void stop()
Definition Arduino.h:164
virtual int read()
Definition Arduino.h:166
Definition Arduino.h:172
size_t write(uint8_t ch) override
Definition Arduino.h:174
bool begin(long baudrate, int config=0)
Definition Arduino.h:176
Definition Arduino.h:56
virtual int availableForWrite()
Definition Arduino.h:128
virtual size_t write(const uint8_t *data, size_t len)
Definition Arduino.h:120
int _timeout
Definition Arduino.h:133
virtual void flush()
Definition Arduino.h:130
Definition Arduino.h:136
virtual size_t readBytes(uint8_t *data, size_t len)
Definition Arduino.h:140
virtual int available()
Definition Arduino.h:139
virtual ~Stream()=default
Generic Implementation of sound input and output for desktop environments using portaudio.
Definition AudioCodecsBase.h:10
gpio_dt_spec digital_pin_t
Zephyr GPIO spec as digital_pin_t.
Definition Arduino.h:266
void digitalWrite(digital_pin_t pin, bool value)
Definition Arduino.h:313
static gpio_dt_spec GPIO_NONE
GPIO_NONE is no pin defined.
Definition Arduino.h:269
void yield()
Definition Arduino.h:262
static bool operator!=(audio_tools::digital_pin_t &a, audio_tools::digital_pin_t &b)
Support for pin compare.
Definition Arduino.h:277
void delay(uint32_t ms)
Definition Arduino.h:255
uint64_t micros()
Definition Arduino.h:261
void pinMode(digital_pin_t pin, int mode)
Definition Arduino.h:282
static bool operator==(audio_tools::digital_pin_t &a, audio_tools::digital_pin_t &b)
Support for pin compare.
Definition Arduino.h:272
int digitalRead(digital_pin_t pin)
Definition Arduino.h:324
void delayMicroseconds(uint32_t us)
Definition Arduino.h:257
uint32_t millis()
Returns the milliseconds since the start.
Definition Arduino.h:256
size_t writeData(Print *p_out, T *data, int samples, int maxSamples=512)
Definition AudioTypes.h:508