muwerk ustd Library
A low-resource, minimal implementation of Arrays, Maps and Queues for low-resource avrs.
Loading...
Searching...
No Matches
ustd_platform.h
1// ustd_platform.h - adapt platform specific stuff
2#pragma once
3
4//================= Platform defines ==========================
5// https://docs.platformio.org/en/latest/plus/debugging.html
6// MCU CPU RAM Flash EEPROM Clock Family
7// ATtiny85 512b 8k 512b 20MHz
8// Uno 2k 32k 1k 16MHz __ARDUINO__
9// Mega 8k 256k 4k 16MHz __ARDUINO__
10// Feater M0 Cortex M0 32k
11// STM32F103C8T6 20k 64k 72MHz __ARM__
12// "Bluepill" Cortex-M3
13// STM32F411CEU6 128k 512k 100MHz __ARM__
14// "Blackpill" Cortex-M4F
15// Teensy 4.0 512k 1984k 1k 600Mhz __ARM__
16// Esp8266 80k 512k-4M 80-160MHz __ESP__
17// ESP32 320k 2M-4M 160-240MHz __ESP__
18
19// ATtiny85
20#define USTD_FEATURE_MEM_512B 512
21// Arduino UNO, ATtiny1614, AT328P
22#define USTD_FEATURE_MEM_2K 2048
23// Arduino MEGA
24#define USTD_FEATURE_MEM_8K 8192
25// ESP8266, Bluepill
26#define USTD_FEATURE_MEM_32K 32768
27// Blackpill
28#define USTD_FEATURE_MEM_128K 131072
29// ESP32
30#define USTD_FEATURE_MEM_512K 524288
31// Unixoids
32#define USTD_FEATURE_MEM_1M 1048576
33
34/*
35A Platform sets USTD_FEATURE_MEMORY to one of the above _MEM_ defines.
36// #if USTD_FEATURE_MEMORY >= USTD_FEATURE_MEM_2K
37// we have at least 2k RAM
38// #endif
39
40// Platforms use the following defines to show feature-availability:
41
42// Filesystem:
43#define USTD_FEATURE_FILESYSTEM
44#define USTD_FEATURE_FS_SPIFFS
45#define USTD_FEATURE_FS_LITTLEFS
46#define USTD_FEATURE_FS_SD
47
48// User override-options for FS:
49#define USTD_OPTION_FS_FORCE_SPIFFS
50#define USTD_OPTION_FS_FORCE_NO_FS
51
52// EEPROM:
53#define USTD_FEATURE_EEPROM
54
55// Time:
56#define USTD_FEATURE_SYSTEMCLOCK
57#define USTD_FEATURE_CLK_READ
58#define USTD_FEATURE_CLK_SET
59
60// Network:
61#define USTD_FEATURE_NETWORK
62*/
63
64// Compatibility-1
65#if !defined(DONT_USE_FEATURE_COMPATIBILITY)
66#if defined(__USE_OLD_FS__)
67#define USTD_FEATURE_FS_FORCE_SPIFFS
68#pragma message("Please use USTD_OPTION_FS_FORCE_SPIFFS instead of __USE_OLD_FS__")
69#endif
70#if defined(__USE_SPIFFS_FS__)
71#pragma message("Please use USTD_OPTION_FS_FORCE_SPIFFS instead of __USE_SPIFFS_FS__")
72#endif
73#if defined(__USE_LITTLE_FS__)
74#pragma message("Please do not use __USE_LITTLEFS__")
75#endif
76#endif // DONT_USE_FEATURE_COMPATIBILITY
77// Compatibility-1 end (see below for more)
78
79// ------------- ATTINY ---------------------------------------
80#if defined(__ATTINY__)
81#if defined(KNOWN_PLATFORM)
82#error "Platform already defined"
83#endif
84#define KNOWN_PLATFORM 1
85#define USTD_FEATURE_MEMORY 512
86#define USTD_FEATURE_EEPROM
87#include <Arduino.h>
88#include <SoftwareSerial.h>
89#endif // ATTINY
90
91// ------------- Arduino UNO ----------------------------------
92#if defined(__UNO__)
93#if defined(KNOWN_PLATFORM)
94#error "Platform already defined"
95#endif
96#define KNOWN_PLATFORM 1
97#define USTD_FEATURE_MEMORY 2048
98#define USTD_FEATURE_EEPROM
99#define __ARDUINO__ 1
100#include <Arduino.h>
101#include <new.h> // New Arduino core new operator
102#endif // Arduino UNO
103
104// ------------- Arduino MEGA ---------------------------------
105#if defined(__ATMEGA__)
106#if defined(KNOWN_PLATFORM)
107#error "Platform already defined"
108#endif
109#define KNOWN_PLATFORM 1
110#define USTD_FEATURE_MEMORY 8192
111#define USTD_FEATURE_EEPROM
112#define __ARDUINO__ 1
113#include <Arduino.h>
114#include <new.h> // New Arduino core new operator
115#endif // Arduino Mega
116
117// ------------- Adafruit M0 Wifi ----------------------------
118#if defined(__FEATHER_M0__)
119#if defined(KNOWN_PLATFORM)
120#error "Platform already defined"
121#endif
122#define KNOWN_PLATFORM 1
123#define USTD_FEATURE_MEMORY 32768
124#define __ARM__ 1
125#include <Arduino.h>
126#endif // Feather M0
127
128// ------------- Raspberry Pi PICO RP2040 ---------------------
129#if defined(__RP2040__)
130#if defined(KNOWN_PLATFORM)
131#error "Platform already defined"
132#endif
133#define KNOWN_PLATFORM 1
134#define USTD_FEATURE_MEMORY 264000
135#define USTD_FEATURE_SUPPORTS_NEW_OPERATOR
136#include "pico/stdlib.h"
137#include "stdlib.h"
138#define __ARM__ 1
139#define __RP_PICO__ 1
140#endif // RP2040
141
142// ------------- STM32F103C8T6 Bluepill -----------------------
143#if defined(__BLUEPILL__)
144#if defined(KNOWN_PLATFORM)
145#error "Platform already defined"
146#endif
147#define KNOWN_PLATFORM 1
148#define USTD_FEATURE_MEMORY 20480
149#define USTD_FEATURE_SUPPORTS_NEW_OPERATOR
150#define __ARM__ 1
151#include <Arduino.h>
152#endif // Bluepill
153
154// ------------- Adafruit Bluefruit feather (NRF52832) --------
155#if defined(__NRF52__)
156#if defined(KNOWN_PLATFORM)
157#error "Platform already defined"
158#endif
159#define KNOWN_PLATFORM 1
160#define USTD_FEATURE_MEMORY 65536
161#define __ARM__ 1
162#include <Arduino.h>
163#endif // NRF52
164
165// ------------- ESP8266 --------------------------------------
166#if defined(__ESP__) && !defined(__ESP32__) && !defined(__ESP32DEV__)
167#if defined(KNOWN_PLATFORM)
168#error "Platform already defined"
169#endif
170#define KNOWN_PLATFORM 1
171#define USTD_FEATURE_MEMORY 80000
172#include <ESP8266WiFi.h>
173#define USTD_FEATURE_NETWORK
174#include <time.h> // time() ctime()
175#include <sys/time.h> // struct timeval
176#include <coredecls.h> // settimeofday_cb()
177#define USTD_FEATURE_SYSTEMCLOCK
178#define USTD_FEATURE_CLK_READ
179#define USTD_FEATURE_CLK_SET
180#if !defined(USTD_OPTION_FS_FORCE_NO_FS)
181#define USTD_FEATURE_FILESYSTEM
182#define FS_NO_GLOBALS // see: https://github.com/esp8266/Arduino/issues/3819
183#if defined(USTD_OPTION_FS_FORCE_SPIFFS)
184#include <SPIFFS.h>
185#define USTD_FEATURE_FS_SPIFFS
186#else // Use standard LittleFS
187#define USTD_FEATURE_FS_LITTLEFS
188#include <LittleFS.h>
189#endif // FORCE_SPIFFS
190#endif // FORCE_NO_FS
191#endif // ESP8266
192
193// ------------- STM32 Black Pill -----------------------------
194#if defined(__BLACKPILL__)
195#if defined(KNOWN_PLATFORM)
196#error "Platform already defined"
197#endif
198#define KNOWN_PLATFORM 1
199#define USTD_FEATURE_MEMORY 128000
200#define USTD_FEATURE_SUPPORTS_NEW_OPERATOR
201#define __ARM__ 1
202#include <Arduino.h>
203#endif // Blackpill
204
205// ------------- Adafruit Feather M4 Express ------------------
206#if defined(__FEATHER_M4__)
207#if defined(KNOWN_PLATFORM)
208#error "Platform already defined"
209#endif
210#define KNOWN_PLATFORM 1
211#define USTD_FEATURE_MEMORY 192000
212#define __ARM__ 1
213#include <Arduino.h>
214#endif // FEATHER_M4
215
216// ------------- Arduino BLE Sense (NRF52840) -----------------
217#if defined(__NANOBLE__)
218#if defined(KNOWN_PLATFORM)
219#error "Platform already defined"
220#endif
221#define KNOWN_PLATFORM 1
222#define USTD_FEATURE_MEMORY 256000
223#define USTD_FEATURE_SUPPORTS_NEW_OPERATOR
224#define __ARM__ 1
225#include <Arduino.h>
226#endif // NANOBLE
227
228// ------------- Teensy 4.0 (Cortex M7, imxrt1062) -----------------
229#if defined(__TEENSY40__)
230#if defined(KNOWN_PLATFORM)
231#error "Platform already defined"
232#endif
233#define KNOWN_PLATFORM 1
234#define USTD_FEATURE_MEMORY 512000
235#define USTD_FEATURE_SUPPORTS_NEW_OPERATOR
236#define __ARM__ 1
237#include <Arduino.h>
238#endif // TEEENSY40
239
240// ------------- ESP32 and ESP32DEV ---------------------------
241#if defined(__ESP32__) || defined(__ESP32DEV__) || defined(__ESP32_RISC__)
242#if defined(KNOWN_PLATFORM)
243#error "Platform already defined"
244#endif
245#define KNOWN_PLATFORM 1
246// This is probably somewhat inconsistent:
247#ifndef __ESP__
248#define __ESP__
249#endif
250#ifdef __ESP32_RISC__
251#define __RISC_V__
252#define USTD_FEATURE_SUPPORTS_NEW_OPERATOR
253#define USTD_OPTION_FS_FORCE_LITTLEFS
254#else
255#define __TENSILICA__
256#endif
257#define USTD_FEATURE_MEMORY 320000
258#include <WiFi.h>
259#define USTD_FEATURE_NETWORK
260#include <time.h> // time() ctime()
261#include <sys/time.h> // struct timeval
262#define USTD_FEATURE_SYSTEMCLOCK
263#define USTD_FEATURE_CLK_READ
264#define USTD_FEATURE_CLK_SET
265#if !defined(USTD_OPTION_FS_FORCE_NO_FS)
266#define USTD_FEATURE_FILESYSTEM
267#define FS_NO_GLOBALS // see: https://github.com/esp8266/Arduino/issues/3819
268#if !defined(USTD_OPTION_FS_FORCE_LITTLEFS)
269#include <SPIFFS.h>
270#define USTD_FEATURE_FS_SPIFFS
271#else
272#include <LittleFS.h>
273#define USTD_FEATURE_FS_LITTLEFS
274#endif // USTD_OPTION_FS_FORCE_LITTLEFS)
275#include <FS.h>
276#endif // FORCE_NO_FS
277#endif // ESP32 || ESP32DEV || ESP32_RISC
278
279// ------ RISC-V Maix Bit -------------------------------------
280#if defined(__MAIXBIT__)
281#if defined(KNOWN_PLATFORM)
282#error "Platform already defined"
283#endif
284#define KNOWN_PLATFORM 1
285#define __RISC_V__
286#define USTD_FEATURE_MEMORY 6000000
287#include <Arduino.h>
288#endif
289
290//------- compatibility-2
291#if !defined(DONT_USE_FEATURE_COMPATIBILITY)
292#if defined(USTD_FEATURE_FS_LITTLEFS)
293#define __USE_LITTLEFS__
294#endif
295#if defined(USTD_FEATURE_FS_SPIFFS)
296#define __USE_SPIFFS_FS__
297#define __USE_OLD_FS__
298#endif
299#endif // DONT_USE_FEATURE_COMPATIBILITY
300//-------- end compatibility-2
301
302// ------------- Raspberry Pico -------------------------------
303#if defined(__RP_PICO__)
304#include <cstring>
305#include <string>
306typedef std::string String;
307inline unsigned long micros() {
308 return time_us_64();
309}
310inline unsigned long millis() {
311 return time_us_64() / 1000;
312}
313#endif // __RP_PICO__
314
315// ------------- Unixoids -------------------------------------
316#if defined(__linux__) || defined(__APPLE__)
317#if defined(KNOWN_PLATFORM)
318#error "Platform already defined"
319#endif
320#define KNOWN_PLATFORM 1
321#define USTD_FEATURE_MEMORY 1048576
322#define __UNIXOID__ 1
323#include <climits>
324#include <cstring>
325#include <stdio.h>
326#include <stdlib.h>
327#include <unistd.h>
328#include <iostream>
329#include <string>
330#include <sys/time.h>
331#include <cassert>
332
333#define USTD_FEATURE_NETWORK
334#define USTD_FEATURE_FILESYSTEM
335#define USTD_FEATURE_SYSTEMCLOCK
336#define USTD_FEATURE_CLK_READ
337#define USTD_FEATURE_CLK_SET
338
339// ------------- Compatibility libs for Unixoids --------------
340/*
341#define USTD_ASSERT 1
342#include <cassert>
343#ifdef USTD_ASSERT
344#define ASSERT(f) assert(f)
345#else // else USTD_ASSERT
346#define ASSERT(f)
347#endif // end USTD_ASSERT
348*/
349typedef std::string String;
350
351inline unsigned long micros() {
352 struct timeval tv;
353 gettimeofday(&tv, nullptr);
354 unsigned long tu;
355 tu = (tv.tv_sec % 1000L) * 1000000L + tv.tv_usec;
356 return tu;
357}
358inline unsigned long millis() {
359 struct timeval tv;
360 gettimeofday(&tv, nullptr);
361 unsigned long tm;
362 tm = (tv.tv_sec % 1000000L) * 1000L + tv.tv_usec / 1000L;
363 return tm;
364}
365
366class SerialSim {
367 public:
368 void Serial() {
369 }
370 void begin(unsigned long baud) {
371 }
372 void println() {
373 std::cout << std::endl;
374 }
375
376 void println(String s) {
377 std::cout << s << std::endl;
378 }
379 void println(const char *sz) {
380 std::cout << sz << std::endl;
381 }
382 void println(uint8_t b) {
383 std::cout << b << std::endl;
384 }
385 void println(int l) {
386 std::cout << l << std::endl;
387 }
388 void println(unsigned long l) {
389 std::cout << l << std::endl;
390 }
391 void println(double d) {
392 std::cout << d << std::endl;
393 }
394
395 void print(String s) {
396 std::cout << s;
397 }
398 void print(const char *sz) {
399 std::cout << sz;
400 }
401 void print(uint8_t b) {
402 std::cout << b;
403 }
404 void print(int l) {
405 std::cout << l;
406 }
407 void print(unsigned long l) {
408 std::cout << l;
409 }
410 void print(double d) {
411 std::cout << d;
412 }
413};
414
415SerialSim Serial;
416
417#else // else linux, apple
418// ------------- Debug helpers and small tools for MCUs -------
419/*
420#if defined(USTD_ASSERT) && !defined(__NANOBLE__)
421#ifdef USE_SERIAL_DBG
422bool assertFailedLine(const char *filename, int line) {
423 Serial.print("Assertion Failed: File ");
424 Serial.print(filename);
425 Serial.print(", Line ");
426 Serial.println(line);
427 return false;
428}
429
430#define ASSERT(f) \
431 if (!(f)) \
432 assertFailedLine(__FILE__, __LINE__)
433#else // else USE_SERIAL_DBG
434#define ASSERT(f)
435#endif // end USE_SERIAL_DBG
436#else // else USTD_ASSERT
437#define ASSERT(f)
438#endif // end USTD_ASSERT
439*/
440#endif // end linux, apple
441
442#if defined(__ARDUINO__) || defined(__ARM__)
443#define USTD_FEATURE_FREE_MEMORY
444// from: https://learn.adafruit.com/memories-of-an-arduino/measuring-free-memory
445#ifdef __arm__
446// should use uinstd.h to define sbrk but Due causes a conflict
447extern "C" char *sbrk(int incr);
448#else // __ARM__
449extern char *__brkval;
450#endif // __arm__
451
452inline int freeMemory() {
453 char top;
454#ifdef __arm__
455 return &top - reinterpret_cast<char *>(sbrk(0));
456#elif defined(CORE_TEENSY) || (ARDUINO > 103 && ARDUINO != 151)
457 return &top - __brkval;
458#else // __arm__
459 return __brkval ? &top - __brkval : &top - __malloc_heap_start;
460#endif // __arm__
461}
462#elif defined(__ESP__)
463#define USTD_FEATURE_FREE_MEMORY
464inline int freeMemory() {
465 return (int)ESP.getFreeHeap();
466}
467#elif defined(__UNIXOID__)
468#define USTD_FEATURE_FREE_MEMORY
469// To keep the API compatible, this function gives back max INT_MAX as free memory.
470inline int freeMemory() {
471 long pages = sysconf(_SC_PHYS_PAGES);
472 long page_size = sysconf(_SC_PAGE_SIZE);
473 long long memfree = pages * page_size;
474 if (memfree > INT_MAX) {
475 return INT_MAX;
476 } else {
477 return (int)memfree;
478 };
479}
480#endif
481
482#ifdef USE_SERIAL_DBG
483
484#define DBG_INIT(f) Serial.begin(f)
485#define DBG_ONLY(f) f
486#define DBG(f) Serial.println(f)
487#define DBGP(f) Serial.print(f)
488#define DBGF(...) Serial.printf(__VA_ARGS__)
489#if USE_SERIAL_DBG > 1
490#define DBG2(f) Serial.println(f)
491#define DBGP2(f) Serial.print(f)
492#if USE_SERIAL_DBG > 2
493#define DBG3(f) Serial.println(f)
494#define DBGP3(f) Serial.print(f)
495#else
496#define DBG3(f)
497#define DBGP3(f)
498#endif // end USE_SERIAL_DBG > 2
499#else
500#define DBG2(f)
501#define DBG3(f)
502#define DBGP2(f)
503#define DBGP3(f)
504#endif // end USE_SERIAL_DBG > 1
505
506#else
507
508#define DBG_INIT(f)
509#define DBG_ONLY(f)
510#define DBG(f)
511#define DBGP(f)
512#define DBGF(...)
513#define DBG2(f)
514#define DBG3(f)
515#define DBGP2(f)
516#define DBGP3(f)
517
518#endif // USE_SERIAL_DBG
519
520#ifndef UINT_MAX
521#define UINT_MAX (65535) // or 4294967295 (mostly)
522#endif
523
524#ifndef KNOWN_PLATFORM
525#error Unkown platform. Please use a platform define, e.g. __ATMEGA__, __ESP__, __linux__, __APPLE__. Check https://github.com/muwerk/ustd#platform-defines for complete list.
526#endif