initial commit
This commit is contained in:
256
libraries/FastLED/src/platforms/stub/Arduino.h
Normal file
256
libraries/FastLED/src/platforms/stub/Arduino.h
Normal file
@@ -0,0 +1,256 @@
|
||||
// Arduino.h emulation for the WebAssembly platform.
|
||||
// This allows us to compile sketches as is for the WebAssembly platform.
|
||||
|
||||
#pragma once
|
||||
|
||||
// Standard Arduino define - indicates Arduino environment and version
|
||||
// Using a modern Arduino IDE version number (1.8.19 = 10819)
|
||||
#ifndef ARDUINO
|
||||
#define ARDUINO 1
|
||||
#endif
|
||||
|
||||
#include "fl/str.h"
|
||||
#include <algorithm>
|
||||
#include <random>
|
||||
#include "fl/stdint.h"
|
||||
#include <stdio.h>
|
||||
#include <string>
|
||||
#include "fl/ostream.h"
|
||||
|
||||
#include "fl/namespace.h"
|
||||
// Arduino timing functions - provided by time_stub.h
|
||||
#include "time_stub.h"
|
||||
#include "fl/math_macros.h"
|
||||
#include "fl/math.h"
|
||||
|
||||
FASTLED_USING_NAMESPACE
|
||||
|
||||
template <typename T>
|
||||
T min(T a, T b) {
|
||||
return a < b ? a : b;
|
||||
}
|
||||
template <typename T>
|
||||
T max(T a, T b) {
|
||||
return a > b ? a : b;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
namespace fl {
|
||||
|
||||
inline long map(long x, long in_min, long in_max, long out_min, long out_max) {
|
||||
const long run = in_max - in_min;
|
||||
if (run == 0) {
|
||||
return 0; // AVR returns -1, SAM returns 0
|
||||
}
|
||||
const long rise = out_max - out_min;
|
||||
const long delta = x - in_min;
|
||||
return (delta * rise) / run + out_min;
|
||||
}
|
||||
|
||||
// constrain
|
||||
template <typename T> T constrain(T x, T a, T b) {
|
||||
return x < a ? a : (x > b ? b : x);
|
||||
}
|
||||
} // namespace fl
|
||||
|
||||
using fl::constrain;
|
||||
using fl::map;
|
||||
|
||||
inline long random(long min, long max) {
|
||||
if (min == max) {
|
||||
return min;
|
||||
}
|
||||
std::random_device rd;
|
||||
std::mt19937 gen(rd());
|
||||
// Arduino random is exclusive of the max value, but
|
||||
// std::uniform_int_distribution is inclusive. So we subtract 1 from the max
|
||||
// value.
|
||||
std::uniform_int_distribution<> dis(min, max - 1);
|
||||
return dis(gen);
|
||||
}
|
||||
|
||||
inline int analogRead(int) { return random(0, 1023); }
|
||||
|
||||
inline long random(long max) { return random(0, max); }
|
||||
|
||||
// Arduino-compatible random() with no parameters - returns full range random long
|
||||
inline long random() {
|
||||
std::random_device rd;
|
||||
std::mt19937 gen(rd());
|
||||
std::uniform_int_distribution<long> dis;
|
||||
return dis(gen);
|
||||
}
|
||||
|
||||
|
||||
|
||||
#ifndef A0
|
||||
#define A0 0
|
||||
#endif
|
||||
|
||||
#ifndef A1
|
||||
#define A1 1
|
||||
#endif
|
||||
|
||||
#ifndef A2
|
||||
#define A2 2
|
||||
#endif
|
||||
|
||||
#ifndef A3
|
||||
#define A3 3
|
||||
#endif
|
||||
|
||||
#ifndef A4
|
||||
#define A4 4
|
||||
#endif
|
||||
|
||||
#ifndef A5
|
||||
#define A5 5
|
||||
#endif
|
||||
|
||||
#ifndef A6
|
||||
#define A6 6
|
||||
#endif
|
||||
|
||||
#ifndef A7
|
||||
#define A7 7
|
||||
#endif
|
||||
|
||||
#ifndef A8
|
||||
#define A8 8
|
||||
#endif
|
||||
|
||||
#ifndef A9
|
||||
#define A9 9
|
||||
#endif
|
||||
|
||||
#ifndef A10
|
||||
#define A10 10
|
||||
#endif
|
||||
|
||||
#ifndef A11
|
||||
#define A11 11
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
struct SerialEmulation {
|
||||
void begin(int) {}
|
||||
template <typename T> void print(T val) {
|
||||
fl::cout << val;
|
||||
}
|
||||
template <typename T> void println(T val) {
|
||||
fl::cout << val << fl::endl;
|
||||
}
|
||||
|
||||
// Two-argument print overloads for formatting
|
||||
void print(float _val, int digits) {
|
||||
// Clamp digits to reasonable range
|
||||
digits = digits < 0 ? 0 : (digits > 9 ? 9 : digits);
|
||||
double val = static_cast<double>(_val);
|
||||
|
||||
// Use literal format strings to avoid linter warnings
|
||||
switch(digits) {
|
||||
case 0: printf("%.0f", val); break;
|
||||
case 1: printf("%.1f", val); break;
|
||||
case 2: printf("%.2f", val); break;
|
||||
case 3: printf("%.3f", val); break;
|
||||
case 4: printf("%.4f", val); break;
|
||||
case 5: printf("%.5f", val); break;
|
||||
case 6: printf("%.6f", val); break;
|
||||
case 7: printf("%.7f", val); break;
|
||||
case 8: printf("%.8f", val); break;
|
||||
case 9: printf("%.9f", val); break;
|
||||
}
|
||||
}
|
||||
void print(double val, int digits) {
|
||||
// Clamp digits to reasonable range
|
||||
digits = digits < 0 ? 0 : (digits > 9 ? 9 : digits);
|
||||
|
||||
// Use literal format strings to avoid linter warnings
|
||||
switch(digits) {
|
||||
case 0: printf("%.0f", val); break;
|
||||
case 1: printf("%.1f", val); break;
|
||||
case 2: printf("%.2f", val); break;
|
||||
case 3: printf("%.3f", val); break;
|
||||
case 4: printf("%.4f", val); break;
|
||||
case 5: printf("%.5f", val); break;
|
||||
case 6: printf("%.6f", val); break;
|
||||
case 7: printf("%.7f", val); break;
|
||||
case 8: printf("%.8f", val); break;
|
||||
case 9: printf("%.9f", val); break;
|
||||
}
|
||||
}
|
||||
void print(int val, int base) {
|
||||
if (base == 16) printf("%x", val);
|
||||
else if (base == 8) printf("%o", val);
|
||||
else if (base == 2) {
|
||||
// Binary output
|
||||
for (int i = 31; i >= 0; i--) {
|
||||
printf("%d", (val >> i) & 1);
|
||||
}
|
||||
}
|
||||
else printf("%d", val);
|
||||
}
|
||||
void print(unsigned int val, int base) {
|
||||
if (base == 16) printf("%x", val);
|
||||
else if (base == 8) printf("%o", val);
|
||||
else if (base == 2) {
|
||||
// Binary output
|
||||
for (int i = 31; i >= 0; i--) {
|
||||
printf("%d", (val >> i) & 1);
|
||||
}
|
||||
}
|
||||
else printf("%u", val);
|
||||
}
|
||||
|
||||
void println() { printf("\n"); }
|
||||
int available() { return 0; }
|
||||
int read() { return 0; }
|
||||
void write(uint8_t) {}
|
||||
void write(const char *s) { printf("%s", s); }
|
||||
void write(const uint8_t *s, size_t n) { fwrite(s, 1, n, stdout); }
|
||||
void write(const char *s, size_t n) { fwrite(s, 1, n, stdout); }
|
||||
void flush() {}
|
||||
void end() {}
|
||||
uint8_t peek() { return 0; }
|
||||
};
|
||||
|
||||
#define LED_BUILTIN 13
|
||||
#define HIGH 1
|
||||
#define LOW 0
|
||||
#define INPUT 0
|
||||
#define OUTPUT 1
|
||||
#define INPUT_PULLUP 2
|
||||
|
||||
inline void digitalWrite(int, int) {}
|
||||
inline void analogWrite(int, int) {}
|
||||
inline int digitalRead(int) { return LOW; }
|
||||
inline void pinMode(int, int) {}
|
||||
|
||||
|
||||
|
||||
// avr flash memory macro is disabled.
|
||||
#ifdef F
|
||||
#undef F
|
||||
#endif
|
||||
|
||||
#define F(x) x
|
||||
|
||||
// Found in the wild for scintillating example
|
||||
#ifdef FL_PGM_READ_PTR_NEAR
|
||||
#undef FL_PGM_READ_PTR_NEAR
|
||||
#endif
|
||||
|
||||
#define FL_PGM_READ_PTR_NEAR(addr) (*(addr))
|
||||
typedef unsigned char byte;
|
||||
|
||||
// Define Serial instances for stub compilation
|
||||
extern SerialEmulation Serial;
|
||||
extern SerialEmulation Serial1;
|
||||
extern SerialEmulation Serial2;
|
||||
extern SerialEmulation Serial3;
|
||||
|
||||
typedef SerialEmulation HardwareSerial;
|
||||
typedef SerialEmulation SoftwareSerial;
|
||||
Reference in New Issue
Block a user