Pico-Arduino
Common.h
1 #pragma once
2 #include <stdint.h>
3 
4 #ifdef __cplusplus
5 extern "C"{
6 #endif
7 
8 void yield(void);
9 
10 typedef enum {
11  LOW = 0,
12  HIGH = 1,
13  CHANGE = 2,
14  FALLING = 3,
15  RISING = 4,
16 } PinStatus;
17 
18 typedef enum {
19  INPUT = 0x0,
20  OUTPUT = 0x1,
21  INPUT_PULLUP = 0x2,
22  INPUT_PULLDOWN = 0x3,
23 } PinMode;
24 
25 typedef enum {
26  LSBFIRST = 0,
27  MSBFIRST = 1,
28 } BitOrder;
29 
30 #define PI 3.1415926535897932384626433832795
31 #define HALF_PI 1.5707963267948966192313216916398
32 #define TWO_PI 6.283185307179586476925286766559
33 #define DEG_TO_RAD 0.017453292519943295769236907684886
34 #define RAD_TO_DEG 57.295779513082320876798154814105
35 #define EULER 2.718281828459045235360287471352
36 
37 #define SERIAL 0x0
38 #define DISPLAY 0x1
39 
40 #ifndef constrain
41 #define constrain(amt,low,high) ((amt)<(low)?(low):((amt)>(high)?(high):(amt)))
42 #endif
43 
44 #ifndef radians
45 #define radians(deg) ((deg)*DEG_TO_RAD)
46 #endif
47 
48 #ifndef degrees
49 #define degrees(rad) ((rad)*RAD_TO_DEG)
50 #endif
51 
52 #ifndef sq
53 #define sq(x) ((x)*(x))
54 #endif
55 
56 typedef void (*voidFuncPtr)(void);
57 typedef void (*voidFuncPtrParam)(void*);
58 
59 // interrupts() / noInterrupts() must be defined by the core
60 
61 #define lowByte(w) ((uint8_t) ((w) & 0xff))
62 #define highByte(w) ((uint8_t) ((w) >> 8))
63 
64 #define bitRead(value, bit) (((value) >> (bit)) & 0x01)
65 #define bitSet(value, bit) ((value) |= (1UL << (bit)))
66 #define bitClear(value, bit) ((value) &= ~(1UL << (bit)))
67 #define bitToggle(value, bit) ((value) ^= (1UL << (bit)))
68 #define bitWrite(value, bit, bitvalue) (bitvalue ? bitSet(value, bit) : bitClear(value, bit))
69 
70 #ifndef bit
71 #define bit(b) (1UL << (b))
72 #endif
73 
74 /* TODO: request for removal */
75 typedef bool boolean;
76 typedef uint8_t byte;
77 typedef uint16_t word;
78 
79 void init(void);
80 void initVariant(void);
81 
82 #ifndef HOST
83 int atexit(void (*func)()) __attribute__((weak));
84 #endif
85 int main() __attribute__((weak));
86 
87 #ifdef EXTENDED_PIN_MODE
88 // Platforms who wnat to declare more than 256 pins need to define EXTENDED_PIN_MODE globally
89 typedef uint32_t pin_size_t;
90 #else
91 typedef uint8_t pin_size_t;
92 #endif
93 
94 void pinMode(pin_size_t pinNumber, PinMode pinMode);
95 void digitalWrite(pin_size_t pinNumber, PinStatus status);
96 PinStatus digitalRead(pin_size_t pinNumber);
97 int analogRead(pin_size_t pinNumber);
98 void analogReference(uint8_t mode);
99 void analogWrite(pin_size_t pinNumber, int value);
100 
101 unsigned long millis(void);
102 unsigned long micros(void);
103 void delay(unsigned long);
104 void delayMicroseconds(unsigned int us);
105 unsigned long pulseIn(pin_size_t pin, uint8_t state, unsigned long timeout);
106 unsigned long pulseInLong(pin_size_t pin, uint8_t state, unsigned long timeout);
107 
108 void shiftOut(pin_size_t dataPin, pin_size_t clockPin, BitOrder bitOrder, uint8_t val);
109 uint8_t shiftIn(pin_size_t dataPin, pin_size_t clockPin, BitOrder bitOrder);
110 
111 void attachInterrupt(pin_size_t interruptNumber, voidFuncPtr callback, PinStatus mode);
112 void attachInterruptParam(pin_size_t interruptNumber, voidFuncPtrParam callback, PinStatus mode, void* param);
113 void detachInterrupt(pin_size_t interruptNumber);
114 
115 void setup(void);
116 void loop(void);
117 
118 #ifdef __cplusplus
119 } // extern "C"
120 #endif
121 
122 #ifdef __cplusplus
123  template<class T, class L>
124  auto min(const T& a, const L& b) -> decltype((b < a) ? b : a)
125  {
126  return (b < a) ? b : a;
127  }
128 
129  template<class T, class L>
130  auto max(const T& a, const L& b) -> decltype((b < a) ? b : a)
131  {
132  return (a < b) ? b : a;
133  }
134 #else
135 #ifndef min
136 #define min(a,b) \
137  ({ __typeof__ (a) _a = (a); \
138  __typeof__ (b) _b = (b); \
139  _a < _b ? _a : _b; })
140 #endif
141 #ifndef max
142 #define max(a,b) \
143  ({ __typeof__ (a) _a = (a); \
144  __typeof__ (b) _b = (b); \
145  _a > _b ? _a : _b; })
146 #endif
147 #endif
148 
149 #ifdef __cplusplus
150 
151 /* C++ prototypes */
152 uint16_t makeWord(uint16_t w);
153 uint16_t makeWord(byte h, byte l);
154 
155 #define word(...) makeWord(__VA_ARGS__)
156 
157 unsigned long pulseIn(uint8_t pin, uint8_t state, unsigned long timeout = 1000000L);
158 unsigned long pulseInLong(uint8_t pin, uint8_t state, unsigned long timeout = 1000000L);
159 
160 void tone(uint8_t _pin, unsigned int frequency, unsigned long duration = 0);
161 void noTone(uint8_t _pin);
162 
163 // WMath prototypes
164 long random(long);
165 long random(long, long);
166 void randomSeed(unsigned long);
167 long map(long, long, long, long, long);
168 
169 #endif // __cplusplus