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#include <algorithm>
192
193#define GPIO_NONE -1
194#define IS_GPIO(pin) (pin >= 0)
195#define GPIO_TO_INT(pin) pin
196#define GPIO_TO_STR(pin) std::to_string(pin).c_str()
197
198using digital_pin_t = int;
199using std::min;
200using std::max;
201
202
204inline int digitalRead(digital_pin_t pin) {
205 printf("digitalRead:%d\n", pin);
206 return gpio_get_level((gpio_num_t)pin);
207}
208
209inline void digitalWrite(digital_pin_t pin, int value) {
210 gpio_set_level((gpio_num_t)pin, value);
211}
212
213inline void pinMode(digital_pin_t pin, int mode) {
214 gpio_num_t gpio_pin = (gpio_num_t)pin;
215 printf("pinMode(%d,%d)\n", pin, mode);
216
217 gpio_reset_pin(gpio_pin);
218 switch (mode) {
219 case INPUT:
220 gpio_set_direction(gpio_pin, GPIO_MODE_INPUT);
221 break;
222 case OUTPUT:
223 gpio_set_direction(gpio_pin, GPIO_MODE_OUTPUT);
224 break;
225 case INPUT_PULLUP:
226 gpio_set_direction(gpio_pin, GPIO_MODE_INPUT);
227 gpio_set_pull_mode(gpio_pin, GPIO_PULLUP_ONLY);
228 break;
229 default:
230 gpio_set_direction(gpio_pin, GPIO_MODE_INPUT_OUTPUT);
231 break;
232 }
233}
234
235inline void delay(uint32_t ms) { vTaskDelay(ms / portTICK_PERIOD_MS); }
236inline void yield() { taskYIELD(); }
237inline uint32_t millis() { return (xTaskGetTickCount() * portTICK_PERIOD_MS); }
238inline void delayMicroseconds(uint32_t ms) { esp_rom_delay_us(ms); }
239inline uint64_t micros() {
240 return xTaskGetTickCount() * portTICK_PERIOD_MS * 1000;
241}
242
243// delay and millis has been defined
244#define DESKTOP_MILLIS_DEFINED
245
246#endif
247
248#if defined(IS_ZEPHYR)
249#include <zephyr/drivers/gpio.h>
250
251#define DESKTOP_MILLIS_DEFINED
252#define IS_GPIO(pin) (pin.port != nullptr)
253#define GPIO_TO_INT(pin) pin.pin
254#define GPIO_TO_STR(pin) std::to_string(GPIO_TO_INT(pin)).c_str()
255#define ZLOGE(...) printk(__VA_ARGS__)
256
257namespace audio_tools {
258
259inline void delay(uint32_t ms) { k_msleep(ms); }
260inline uint32_t millis() { return k_uptime_get_32(); }
261inline void delayMicroseconds(uint32_t us) {
262 if (us == 0) return;
263 k_busy_wait(us);
264}
265inline uint64_t micros() { return k_cyc_to_us_floor64(k_cycle_get_64()); }
266inline void yield() { k_yield(); }
267
268
270using digital_pin_t = gpio_dt_spec;
271
273static gpio_dt_spec GPIO_NONE = {nullptr, 0, 0};
274
277 return (a.port == b.port) && (a.pin == b.pin);
278}
279
282 return !(a == b);
283}
284
285
286void pinMode(digital_pin_t pin, int mode) {
287 if (pin == GPIO_NONE || !gpio_is_ready_dt(&pin)) {
288 ZLOGE("GPIO pin not ready");
289 return;
290 }
291
292 gpio_flags_t flags;
293 switch (mode) {
294 case OUTPUT:
295 flags = GPIO_OUTPUT;
296 break;
297 case INPUT:
298 flags = GPIO_INPUT;
299 break;
300 case INPUT_PULLUP:
301 flags = GPIO_INPUT | GPIO_PULL_UP;
302 break;
303 // case INPUT_PULLDOWN:
304 // flags = GPIO_INPUT | GPIO_PULL_DOWN;
305 // break;
306 default:
307 flags = GPIO_OUTPUT;
308 break;
309 }
310
311 int rc = gpio_pin_configure_dt(&pin, flags);
312 if (rc != 0) {
313 ZLOGE("Failed to configure GPIO pin: %d", rc);
314 }
315}
316
317void digitalWrite(digital_pin_t pin, bool value) {
318 if (pin == GPIO_NONE || !gpio_is_ready_dt(&pin)) {
319 ZLOGE("GPIO pin not ready");
320 }
321
322 int rc = gpio_pin_set_dt(&pin, value ? 1 : 0);
323 if (rc != 0) {
324 ZLOGE("Failed to write GPIO pin: %d", rc);
325 }
326}
327
329 if (pin == GPIO_NONE || !gpio_is_ready_dt(&pin)) {
330 ZLOGE("GPIO pin not ready");
331 return false;
332 }
333
334 int rc = gpio_pin_get_dt(&pin);
335 if (rc < 0) {
336 ZLOGE("Failed to read GPIO pin: %d", rc);
337 }
338 return rc;
339}
340
341} // namespace audio_tools
342#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:255
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 LMSEchoCancellationStream.h:6
gpio_dt_spec digital_pin_t
Zephyr GPIO spec as digital_pin_t.
Definition Arduino.h:270
bool operator==(float a, PseudoFloat b)
Definition PseudoFloat.h:195
void digitalWrite(digital_pin_t pin, bool value)
Definition Arduino.h:317
static gpio_dt_spec GPIO_NONE
GPIO_NONE is no pin defined.
Definition Arduino.h:273
void yield()
Definition Arduino.h:266
void delay(uint32_t ms)
Definition Arduino.h:259
bool operator!=(float a, PseudoFloat b)
Definition PseudoFloat.h:196
uint64_t micros()
Definition Arduino.h:265
void pinMode(digital_pin_t pin, int mode)
Definition Arduino.h:286
int digitalRead(digital_pin_t pin)
Definition Arduino.h:328
void delayMicroseconds(uint32_t us)
Definition Arduino.h:261
uint32_t millis()
Returns the milliseconds since the start.
Definition Arduino.h:260