Megunolink / MLP

Arduino library for sending data to MegunoLink visualisers and useful components
http://www.megunolink.com
GNU Lesser General Public License v3.0
46 stars 26 forks source link

Compilation fails on all Arduino boards using ArduinoCore-mbed #12

Closed maxgerhardt closed 1 year ago

maxgerhardt commented 1 year ago

Includes Nano 33 BLE, Raspberry Pi Pico, Portenta H7 and more.

This is because:

  1. The ArduinoTimer class defined in this library directly conflicts with ArduinoTimer from the core. (Should have used a unique name)

https://github.com/Megunolink/MLP/blob/dec47782f92a470376f8a28b1fc6fcc85e96f0d6/src/ArduinoTimer.h#L15-L19

vs https://github.com/arduino/ArduinoCore-mbed/blob/80310080316bee7d0ff5c72392554dbaa29a7f11/cores/arduino/timer.h#L13-L15

  1. The Formatting.h file doing a #include "Print.h" to get Print and Printable class declarations is wrong because in ArduinoCore-mbed, when including this header directly, these classes are scoped in the arduino namespace, but the Formatting.h doesn't have using namespace arduino; in it. (Should have just used #include <Arduino.h>) https://github.com/Megunolink/MLP/blob/dec47782f92a470376f8a28b1fc6fcc85e96f0d6/src/Formatting.h#L6

This results in a wall of compiler errors for the user, such as happened here.

In file included from lib\MLP\src\Formatting.cpp:6:
lib\MLP\src\Formatting.h:17:1: error: expected class-name before '{' token
 {
 ^
lib\MLP\src\Formatting.h:36:1: error: expected class-name before '{' token
 {
 ^
*** [.pio\build\nano33ble\libd56\MLP\Formatting.cpp.o] Error 1
lib\MLP\src\ArduinoTimer.cpp:3:1: error: reference to 'ArduinoTimer' is ambiguous
 ArduinoTimer::ArduinoTimer()
 ^~~~~~~~~~~~
In file included from C:\Users\Max\.platformio\packages\framework-arduino-mbed@3.1.1\cores\arduino/Arduino.h:103,
                 from lib\MLP\src\ArduinoTimer.h:15,
                 from lib\MLP\src\ArduinoTimer.cpp:1:
C:\Users\Max\.platformio\packages\framework-arduino-mbed@3.1.1\cores\arduino/timer.h:15:9: note: candidates are: 'class arduino::ArduinoTimer'
   class ArduinoTimer {
         ^~~~~~~~~~~~
In file included from lib\MLP\src\ArduinoTimer.cpp:1:
lib\MLP\src\ArduinoTimer.h:17:7: note:                 'class ArduinoTimer'
 class ArduinoTimer
       ^~~~~~~~~~~~
lib\MLP\src\ArduinoTimer.cpp:8:6: error: reference to 'ArduinoTimer' is ambiguous
 bool ArduinoTimer::TimePassed_Milliseconds(uint32_t uPeriod, bool bAutoReset)
      ^~~~~~~~~~~~
In file included from C:\Users\Max\.platformio\packages\framework-arduino-mbed@3.1.1\cores\arduino/Arduino.h:103,
                 from lib\MLP\src\ArduinoTimer.h:15,
                 from lib\MLP\src\ArduinoTimer.cpp:1:
C:\Users\Max\.platformio\packages\framework-arduino-mbed@3.1.1\cores\arduino/timer.h:15:9: note: candidates are: 'class arduino::ArduinoTimer'
   class ArduinoTimer {
         ^~~~~~~~~~~~
In file included from lib\MLP\src\ArduinoTimer.cpp:1:
lib\MLP\src\ArduinoTimer.h:17:7: note:                 'class ArduinoTimer'
 class ArduinoTimer
       ^~~~~~~~~~~~
lib\MLP\src\ArduinoTimer.cpp: In function 'bool TimePassed_Milliseconds(uint32_t, bool)':
lib\MLP\src\ArduinoTimer.cpp:13:14: error: 'm_uStartTime' was not declared in this scope
   if (uNow - m_uStartTime >= uPeriod)
              ^~~~~~~~~~~~
lib\MLP\src\ArduinoTimer.cpp: At global scope:
lib\MLP\src\ArduinoTimer.cpp:23:6: error: reference to 'ArduinoTimer' is ambiguous
 bool ArduinoTimer::TimePassed_Seconds(uint16_t uPeriod, bool bAutoReset)
      ^~~~~~~~~~~~
In file included from C:\Users\Max\.platformio\packages\framework-arduino-mbed@3.1.1\cores\arduino/Arduino.h:103,
                 from lib\MLP\src\ArduinoTimer.h:15,
                 from lib\MLP\src\ArduinoTimer.cpp:1:
C:\Users\Max\.platformio\packages\framework-arduino-mbed@3.1.1\cores\arduino/timer.h:15:9: note: candidates are: 'class arduino::ArduinoTimer'
   class ArduinoTimer {
         ^~~~~~~~~~~~
In file included from lib\MLP\src\ArduinoTimer.cpp:1:
lib\MLP\src\ArduinoTimer.h:17:7: note:                 'class ArduinoTimer'
 class ArduinoTimer
       ^~~~~~~~~~~~
lib\MLP\src\ArduinoTimer.cpp: In function 'bool TimePassed_Seconds(uint16_t, bool)':
lib\MLP\src\ArduinoTimer.cpp:28:15: error: 'm_uStartTime' was not declared in this scope
   if ((uNow - m_uStartTime)/1000 >= uPeriod)
               ^~~~~~~~~~~~
lib\MLP\src\ArduinoTimer.cpp: At global scope:
lib\MLP\src\ArduinoTimer.cpp:38:6: error: reference to 'ArduinoTimer' is ambiguous
 bool ArduinoTimer::TimePassed_Minutes(uint16_t uPeriod, bool bAutoReset)
      ^~~~~~~~~~~~
In file included from C:\Users\Max\.platformio\packages\framework-arduino-mbed@3.1.1\cores\arduino/Arduino.h:103,
                 from lib\MLP\src\ArduinoTimer.h:15,
                 from lib\MLP\src\ArduinoTimer.cpp:1:
C:\Users\Max\.platformio\packages\framework-arduino-mbed@3.1.1\cores\arduino/timer.h:15:9: note: candidates are: 'class arduino::ArduinoTimer'
   class ArduinoTimer {
         ^~~~~~~~~~~~
In file included from lib\MLP\src\ArduinoTimer.cpp:1:
lib\MLP\src\ArduinoTimer.h:17:7: note:                 'class ArduinoTimer'
 class ArduinoTimer
       ^~~~~~~~~~~~
lib\MLP\src\ArduinoTimer.cpp: In function 'bool TimePassed_Minutes(uint16_t, bool)':
lib\MLP\src\ArduinoTimer.cpp:44:19: error: 'm_uStartTime' was not declared in this scope
   uDelta = uNow - m_uStartTime;
                   ^~~~~~~~~~~~
lib\MLP\src\ArduinoTimer.cpp: At global scope:
lib\MLP\src\ArduinoTimer.cpp:56:6: error: reference to 'ArduinoTimer' is ambiguous
 bool ArduinoTimer::TimePassed_Hours( uint16_t uPeriod, bool bAutoReset /*= true*/ )
      ^~~~~~~~~~~~
In file included from C:\Users\Max\.platformio\packages\framework-arduino-mbed@3.1.1\cores\arduino/Arduino.h:103,
                 from lib\MLP\src\ArduinoTimer.h:15,
                 from lib\MLP\src\ArduinoTimer.cpp:1:
C:\Users\Max\.platformio\packages\framework-arduino-mbed@3.1.1\cores\arduino/timer.h:15:9: note: candidates are: 'class arduino::ArduinoTimer'
   class ArduinoTimer {
         ^~~~~~~~~~~~
In file included from lib\MLP\src\ArduinoTimer.cpp:1:
lib\MLP\src\ArduinoTimer.h:17:7: note:                 'class ArduinoTimer'
 class ArduinoTimer
       ^~~~~~~~~~~~
lib\MLP\src\ArduinoTimer.cpp: In function 'bool TimePassed_Hours(uint16_t, bool)':
lib\MLP\src\ArduinoTimer.cpp:62:19: error: 'm_uStartTime' was not declared in this scope
   uDelta = uNow - m_uStartTime;
                   ^~~~~~~~~~~~
*** [.pio\build\nano33ble\libd56\MLP\ArduinoTimer.cpp.o] Error 1
In file included from lib\MLP\src\UdpParser.cpp:1:
lib\MLP\src\UdpParser.h:27:5: error: reference to 'ArduinoTimer' is ambiguous
     ArduinoTimer m_tmrPacketCheck;
     ^~~~~~~~~~~~
In file included from C:\Users\Max\.platformio\packages\framework-arduino-mbed@3.1.1\cores\arduino/Arduino.h:103,
                 from lib\MLP\src\CommandDispatcherBase.h:2,
                 from lib\MLP\src\UdpParser.h:3,
                 from lib\MLP\src\UdpParser.cpp:1:
C:\Users\Max\.platformio\packages\framework-arduino-mbed@3.1.1\cores\arduino/timer.h:15:9: note: candidates are: 'class arduino::ArduinoTimer'
   class ArduinoTimer {
         ^~~~~~~~~~~~
In file included from lib\MLP\src\UdpParser.h:5,
                 from lib\MLP\src\UdpParser.cpp:1:
lib\MLP\src\ArduinoTimer.h:17:7: note:                 'class ArduinoTimer'
 class ArduinoTimer
       ^~~~~~~~~~~~
lib\MLP\src\UdpParser.cpp: In member function 'void MLP::UdpParser::Process()':
lib\MLP\src\UdpParser.cpp:14:7: error: 'm_tmrPacketCheck' was not declared in this scope
   if (m_tmrPacketCheck.TimePassed_Milliseconds(PacketCheckInterval))
       ^~~~~~~~~~~~~~~~
*** [.pio\build\nano33ble\libd56\MLP\UdpParser.cpp.o] Error 1
======================================================================== [FAILED] Took 7.76 seconds ========================================================================
PaulMartinsen commented 1 year ago

These problems should all be fixed in the latest release.

Note, if you want to use our ArduinoTimer in your own mbed sketches you'll need to disambiguate it from the mbed version using: ::ArduinoTimer MLPTimer;. Alternatively, to use the mbed version, make sure not to #include "ArduinoTimer.h", which brings in our version.

I'll close this issue for now; feel free to reopen it if the problem isn't resolved.