diff --git a/CHANGELOG.md b/CHANGELOG.md index fdfd1083..1f44cc59 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,6 +8,7 @@ and this project adheres to [Semantic Versioning](http://semver.org/). ## [Unreleased] ### Added - Add `__AVR__` to defines when compiling +- Add support for `diditalPinToPort()`, `digitalPinToBitMask()`, and `portOutputRegister()` ### Changed - Move repository from https://github.com/ianfixes/arduino_ci to https://github.com/Arduino-CI/arduino_ci diff --git a/SampleProjects/TestSomething/test/outputRegister.cpp b/SampleProjects/TestSomething/test/outputRegister.cpp new file mode 100644 index 00000000..fa12255f --- /dev/null +++ b/SampleProjects/TestSomething/test/outputRegister.cpp @@ -0,0 +1,26 @@ +#include +#include + +// added to fix https://github.com/Arduino-CI/arduino_ci/issues/193 +// https://github.com/arduino-libraries/Ethernet/blob/master/src/utility/w5100.h#L337 + +#if defined(__AVR__) +unittest(portOutputRegister) +{ + uint8_t ss_pin = 12; + uint8_t ss_port = digitalPinToPort(ss_pin); + assertEqual(12, ss_port); + uint8_t *ss_pin_reg = portOutputRegister(ss_port); + assertEqual(GODMODE()->pMmapPort(ss_port), ss_pin_reg); + uint8_t ss_pin_mask = digitalPinToBitMask(ss_pin); + assertEqual(1, ss_pin_mask); + + assertEqual((int) 1, (int) *ss_pin_reg); // verify initial value + *(ss_pin_reg) &= ~ss_pin_mask; // set SS + assertEqual((int) 0, (int) *ss_pin_reg); // verify value + *(ss_pin_reg) |= ss_pin_mask; // clear SS + assertEqual((int) 1, (int) *ss_pin_reg); // verify value +} +#endif + +unittest_main() diff --git a/cpp/arduino/Godmode.h b/cpp/arduino/Godmode.h index 12fa1b51..de7a299e 100644 --- a/cpp/arduino/Godmode.h +++ b/cpp/arduino/Godmode.h @@ -43,6 +43,8 @@ class GodmodeState { uint8_t mode; }; + uint8_t mmapPorts[MOCK_PINS_COUNT]; + static GodmodeState* instance; public: @@ -87,12 +89,19 @@ class GodmodeState { spi.readDelayMicros = 0; } + void resetMmapPorts() { + for (int i = 0; i < MOCK_PINS_COUNT; ++i) { + mmapPorts[i] = 1; + } + } + void reset() { resetClock(); resetPins(); resetInterrupts(); resetPorts(); resetSPI(); + resetMmapPorts(); seed = 1; } @@ -112,6 +121,9 @@ class GodmodeState { return instance->micros; } + uint8_t* pMmapPort(uint8_t port) { return &mmapPorts[port]; } + uint8_t mmapPortValue(uint8_t port) { return mmapPorts[port]; } + // C++ 11, declare as public for better compiler error messages GodmodeState(GodmodeState const&) = delete; void operator=(GodmodeState const&) = delete; @@ -139,5 +151,16 @@ void detachInterrupt(uint8_t interrupt); inline void tone(uint8_t _pin, unsigned int frequency, unsigned long duration = 0) {} inline void noTone(uint8_t _pin) {} +// These definitions allow the following to compile (see issue #193): +// https://github.com/arduino-libraries/Ethernet/blob/master/src/utility/w5100.h:341 +// we allow one byte per port which "wastes" 224 bytes, but makes the code easier +#if defined(__AVR__) + #define digitalPinToBitMask(pin) (1) + #define digitalPinToPort(pin) (pin) + #define portOutputRegister(port) (GODMODE()->pMmapPort(port)) +#else + // we don't (yet) support other boards +#endif + GodmodeState* GODMODE();