Skip to content

Commit 8de846b

Browse files
authored
Merge pull request #2 from openlab-vn-ua/main
Ability to compile under MSVC to run at least unit tests under Windows (via VSCODE)
2 parents 9f7e52d + a72872d commit 8de846b

7 files changed

Lines changed: 200 additions & 49 deletions

File tree

ArduinoCore-Linux/cores/arduino/ArdStdio.h

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,9 @@ class StdioDevice : public Stream {
2121

2222
~StdioDevice(){
2323
}
24-
24+
25+
operator bool() const { return true; } // For classic while(!Serial) { ... } pattern for USB ready wait
26+
2527
virtual void begin(int speed){
2628
// nothing to be done
2729
}
@@ -36,13 +38,13 @@ class StdioDevice : public Stream {
3638
if (auto_flush) flush();
3739
}
3840

39-
virtual void print(int str){
40-
std::cout << str;
41+
virtual void print(int val, int radix = DEC){
42+
if (radix == DEC) { std::cout << val; } else { Stream::print(val, radix); }
4143
if (auto_flush) flush();
4244
}
4345

44-
virtual void println(int str){
45-
std::cout << str << "\n";
46+
virtual void println(int val, int radix = DEC){
47+
if (radix == DEC) { std::cout << val << "\n"; } else { Stream::println(val, radix); }
4648
if (auto_flush) flush();
4749
}
4850

ArduinoCore-Linux/cores/arduino/Arduino.cpp

Lines changed: 54 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -10,9 +10,17 @@
1010
#include "PluggableUSB.h"
1111
#include "RemoteSerial.h"
1212
#include "Hardware.h"
13+
#if defined(PROVIDE_HARDWARE_SETUP_SKIP)
14+
// Not available for Windows / MSVC
15+
#else
1316
#include "HardwareSetup.h"
17+
#endif
18+
#if defined(PROVIDE_HARDWARE_WIFI_SKIP)
19+
// Not available for Windows / MSVC
20+
#else
1421
#include "WiFi.h"
1522
#include "WiFiClient.h"
23+
#endif
1624
#include "PluggableUSB.h"
1725
#include "deprecated-avr-comp/avr/dtostrf.h"
1826
#include "ArduinoLogger.h"
@@ -22,10 +30,16 @@
2230
namespace arduino {
2331

2432
ArduinoLogger Logger; // Support for logging
25-
WifiMock WiFi; // So that we can use the WiFi
2633
StdioDevice Serial; // output to screen
2734
HardwareImpl Hardware; // implementation for gpio, spi, i2c
35+
#if defined(PROVIDE_HARDWARE_WIFI_SKIP)
36+
#else
37+
WifiMock WiFi; // So that we can use the WiFi
38+
#endif
39+
#if defined(PROVIDE_HARDWARE_SETUP_SKIP)
40+
#else
2841
HardwareSetupImpl HardwareSetup; // setup for implementation
42+
#endif
2943
#if PROVIDE_SERIALLIB
3044
SerialImpl Serial1("/dev/ttyACM0"); // output to serial port
3145
#endif
@@ -82,34 +96,63 @@ unsigned long micros(void){
8296
}
8397

8498
void pinMode(pin_size_t pinNumber, PinMode pinMode){
85-
Hardware.gpio->pinMode(pinNumber,pinMode);
99+
if (Hardware.gpio != nullptr) {
100+
Hardware.gpio->pinMode(pinNumber,pinMode);
101+
}
86102
}
87103
void digitalWrite(pin_size_t pinNumber, PinStatus status) {
88-
Hardware.gpio->digitalWrite(pinNumber,status);
104+
if (Hardware.gpio != nullptr) {
105+
Hardware.gpio->digitalWrite(pinNumber,status);
106+
}
89107
}
90108
PinStatus digitalRead(pin_size_t pinNumber) {
91-
return Hardware.gpio->digitalRead(pinNumber);
109+
if (Hardware.gpio != nullptr) {
110+
return Hardware.gpio->digitalRead(pinNumber);
111+
} else {
112+
return HIGH; //sumulate input pullup
113+
}
92114
}
93115
int analogRead(pin_size_t pinNumber){
94-
return Hardware.gpio->analogRead(pinNumber);
116+
if (Hardware.gpio != nullptr) {
117+
return Hardware.gpio->analogRead(pinNumber);
118+
} else {
119+
return 0;
120+
}
121+
95122
}
96123
void analogReference(uint8_t mode){
97-
Hardware.gpio->analogReference(mode);
124+
if (Hardware.gpio != nullptr) {
125+
Hardware.gpio->analogReference(mode);
126+
}
98127
}
99128
void analogWrite(pin_size_t pinNumber, int value) {
100-
Hardware.gpio->analogWrite(pinNumber,value);
129+
if (Hardware.gpio != nullptr) {
130+
Hardware.gpio->analogWrite(pinNumber,value);
131+
}
101132
}
102133
void tone(uint8_t pinNumber, unsigned int frequency, unsigned long duration) {
103-
Hardware.gpio->tone(pinNumber,frequency,duration);
134+
if (Hardware.gpio != nullptr) {
135+
Hardware.gpio->tone(pinNumber,frequency,duration);
136+
}
104137
}
105138
void noTone(uint8_t pinNumber) {
106-
Hardware.gpio->noTone(pinNumber);
139+
if (Hardware.gpio != nullptr) {
140+
Hardware.gpio->noTone(pinNumber);
141+
}
107142
}
108143
unsigned long pulseIn(uint8_t pinNumber, uint8_t state, unsigned long timeout){
109-
return Hardware.gpio->pulseIn(pinNumber, state, timeout);
144+
if (Hardware.gpio != nullptr) {
145+
return Hardware.gpio->pulseIn(pinNumber, state, timeout);
146+
} else {
147+
return 0;
148+
}
110149
}
111150
unsigned long pulseInLong(uint8_t pinNumber, uint8_t state, unsigned long timeout){
112-
return Hardware.gpio->pulseInLong(pinNumber, state, timeout);
151+
if (Hardware.gpio != nullptr) {
152+
return Hardware.gpio->pulseInLong(pinNumber, state, timeout);
153+
} else {
154+
return 0;
155+
}
113156
}
114157

115158
void yield(){

ArduinoCore-Linux/cores/arduino/Arduino.h

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,22 @@
2020
# define HOST
2121
#endif
2222

23+
#if defined(_MSC_VER) && !defined(M_PI) && !defined(_USE_MATH_DEFINES)
24+
#define _USE_MATH_DEFINES // to provide const like M_PI via <math.h>
25+
#endif
26+
27+
#if defined(_MSC_VER)
28+
// Not available under MSVC
29+
#define __attribute__(x) // nothing
30+
#define __builtin_constant_p(x) (0) // non-constant
31+
#endif
32+
33+
#if defined(_MSC_VER)
34+
// Temporary unsupported under Win/MSVC
35+
#define PROVIDE_HARDWARE_SETUP_SKIP
36+
#define PROVIDE_HARDWARE_WIFI_SKIP
37+
#endif
38+
2339
#include "ArduinoAPI.h"
2440
#include "ArdStdio.h"
2541
#include "ArduinoLogger.h"

ArduinoCore-Linux/cores/arduino/HardwareGPIO.cpp

Lines changed: 38 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -11,50 +11,76 @@
1111
namespace arduino {
1212

1313
void pinMode(pin_size_t pinNumber, PinMode pinMode){
14-
Hardware.gpio->pinMode(pinNumber,pinMode);
14+
if (Hardware.gpio != nullptr) {
15+
Hardware.gpio->pinMode(pinNumber,pinMode);
16+
}
1517
}
1618

1719
void digitalWrite(pin_size_t pinNumber, PinStatus status){
18-
Hardware.gpio->digitalWrite(pinNumber, status);
20+
if (Hardware.gpio != nullptr) {
21+
Hardware.gpio->digitalWrite(pinNumber, status);
22+
}
1923
}
2024

2125
PinStatus digitalRead(pin_size_t pinNumber){
22-
return Hardware.gpio->digitalRead(pinNumber);
26+
if (Hardware.gpio != nullptr) {
27+
return Hardware.gpio->digitalRead(pinNumber);
28+
} else {
29+
return HIGH; // return high, simulate weak pullup
30+
}
2331
}
2432

2533
int analogRead(pin_size_t pinNumber){
26-
return Hardware.gpio->analogRead(pinNumber);
34+
if (Hardware.gpio != nullptr) {
35+
return Hardware.gpio->analogRead(pinNumber);
36+
} else {
37+
return 0;
38+
}
2739
}
2840

2941
void analogReference(uint8_t mode){
30-
Hardware.gpio->analogReference(mode);
42+
if (Hardware.gpio != nullptr) {
43+
Hardware.gpio->analogReference(mode);
44+
}
3145
}
3246

3347
void analogWrite(pin_size_t pinNumber, int value){
34-
Hardware.gpio->analogWrite(pinNumber, value);
48+
if (Hardware.gpio != nullptr) {
49+
Hardware.gpio->analogWrite(pinNumber, value);
50+
}
3551
}
3652

3753

3854
// Generates a square wave of the specified frequency (and 50% duty cycle) on a pin
3955
void tone(uint8_t pinNumber, unsigned int frequency, unsigned long duration = 0){
40-
Hardware.gpio->tone(pinNumber, frequency, duration);
41-
56+
if (Hardware.gpio != nullptr) {
57+
Hardware.gpio->tone(pinNumber, frequency, duration);
58+
}
4259
}
4360

4461
// Stops the generation of a square wave triggered by tone()
4562
void noTone(uint8_t pinNumber){
46-
Hardware.gpio->noTone(pinNumber);
63+
if (Hardware.gpio != nullptr) {
64+
Hardware.gpio->noTone(pinNumber);
65+
}
4766
}
4867

4968
/// Reads a pulse (either HIGH or LOW) on a pin
5069
unsigned long pulseIn(uint8_t pinNumber, uint8_t state, unsigned long timeout = 1000000L){
51-
return Hardware.gpio->pulseIn(pinNumber, state, timeout);
52-
70+
if (Hardware.gpio != nullptr) {
71+
return Hardware.gpio->pulseIn(pinNumber, state, timeout);
72+
} else {
73+
return 0;
74+
}
5375
}
5476

5577
/// Reads a pulse (either HIGH or LOW) on a pin
5678
unsigned long pulseInLong(uint8_t pinNumber, uint8_t state, unsigned long timeout = 1000000L){
57-
return Hardware.gpio->pulseInLong(pinNumber, state, timeout);
79+
if (Hardware.gpio != nullptr) {
80+
return Hardware.gpio->pulseInLong(pinNumber, state, timeout);
81+
} else {
82+
return 0;
83+
}
5884
}
5985

6086

ArduinoCore-Linux/cores/arduino/HardwareI2CEx.cpp

Lines changed: 35 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -9,40 +9,65 @@ namespace arduino {
99

1010

1111
void HardwareI2CEx::begin() {
12-
Hardware.i2c->begin();
12+
if (Hardware.i2c != nullptr) {
13+
Hardware.i2c->begin();
14+
}
1315
}
1416

1517
void HardwareI2CEx::begin(uint8_t address) {
16-
Hardware.i2c->begin(address);
18+
if (Hardware.i2c != nullptr) {
19+
Hardware.i2c->begin(address);
20+
}
1721
}
1822

1923
void HardwareI2CEx::end(){
20-
Hardware.i2c->end();
24+
if (Hardware.i2c != nullptr) {
25+
Hardware.i2c->end();
26+
}
2127
}
2228

2329
void HardwareI2CEx::setClock(uint32_t freq){
24-
Hardware.i2c->setClock(freq);
30+
if (Hardware.i2c != nullptr) {
31+
Hardware.i2c->setClock(freq);
32+
}
2533
}
2634

2735
void HardwareI2CEx::beginTransmission(uint8_t address){
28-
Hardware.i2c->beginTransmission(address);
36+
if (Hardware.i2c != nullptr) {
37+
Hardware.i2c->beginTransmission(address);
38+
}
2939
}
3040

3141
uint8_t HardwareI2CEx::endTransmission(bool stopBit){
32-
return Hardware.i2c->endTransmission(stopBit);
42+
if (Hardware.i2c != nullptr) {
43+
return Hardware.i2c->endTransmission(stopBit);
44+
} else {
45+
return 0;
46+
}
3347
}
3448

3549
uint8_t HardwareI2CEx::endTransmission(void){
36-
return Hardware.i2c->endTransmission();
50+
if (Hardware.i2c != nullptr) {
51+
return Hardware.i2c->endTransmission();
52+
} else {
53+
return 0;
54+
}
3755
}
3856

3957
size_t HardwareI2CEx::requestFrom(uint8_t address, size_t len, bool stopBit){
40-
return Hardware.i2c->requestFrom(address,len,stopBit);
41-
58+
if (Hardware.i2c != nullptr) {
59+
return Hardware.i2c->requestFrom(address,len,stopBit);
60+
} else {
61+
return 0;
62+
}
4263
}
4364

4465
size_t HardwareI2CEx::requestFrom(uint8_t address, size_t len){
45-
return Hardware.i2c->requestFrom(address,len);
66+
if (Hardware.i2c != nullptr) {
67+
return Hardware.i2c->requestFrom(address,len);
68+
} else {
69+
return 0;
70+
}
4671
}
4772

4873

0 commit comments

Comments
 (0)