diff --git a/ion/include/ion.h b/ion/include/ion.h index a104d147f..af1b2af75 100644 --- a/ion/include/ion.h +++ b/ion/include/ion.h @@ -26,9 +26,6 @@ void ion_main(int argc, char * argv[]); namespace Ion { -void msleep(long ms); -void usleep(long us); - const char * serialNumber(); const char * softwareVersion(); const char * patchLevel(); diff --git a/ion/include/ion/timing.h b/ion/include/ion/timing.h index f5161e1d8..60d32d782 100644 --- a/ion/include/ion/timing.h +++ b/ion/include/ion/timing.h @@ -11,6 +11,9 @@ namespace Ion { EXTERNC uint32_t millis(); EXTERNC uint32_t micros(); +EXTERNC void msleep(long ms); +EXTERNC void usleep(long us); + #ifdef __cplusplus } #endif diff --git a/ion/src/blackbox/Makefile b/ion/src/blackbox/Makefile index d387bff79..e65cecac8 100644 --- a/ion/src/blackbox/Makefile +++ b/ion/src/blackbox/Makefile @@ -12,6 +12,7 @@ objs += $(addprefix ion/src/shared/, \ events.o \ power.o \ random.o \ + timing.o \ dummy/backlight.o \ dummy/battery.o \ dummy/events_modifier.o \ diff --git a/ion/src/blackbox/ion.cpp b/ion/src/blackbox/ion.cpp index 1044c8903..d946ac29b 100644 --- a/ion/src/blackbox/ion.cpp +++ b/ion/src/blackbox/ion.cpp @@ -3,17 +3,3 @@ void Ion::msleep(long ms) { } - -#include - -static auto start = std::chrono::high_resolution_clock::now(); - -uint32_t Ion::millis() { - auto elapsed = std::chrono::high_resolution_clock::now() - start; - return std::chrono::duration_cast(elapsed).count(); -} - -uint32_t Ion::micros() { - auto elapsed = std::chrono::high_resolution_clock::now() - start; - return std::chrono::duration_cast(elapsed).count(); -} diff --git a/ion/src/emscripten/Makefile b/ion/src/emscripten/Makefile index 042e45dd6..67085a188 100644 --- a/ion/src/emscripten/Makefile +++ b/ion/src/emscripten/Makefile @@ -10,6 +10,7 @@ objs += $(addprefix ion/src/shared/, \ events_modifier.o \ power.o \ random.o \ + timing.o \ dummy/backlight.o \ dummy/battery.o \ dummy/fcc_id.o \ diff --git a/ion/src/emscripten/main.cpp b/ion/src/emscripten/main.cpp index ed0d9568c..c753d78af 100644 --- a/ion/src/emscripten/main.cpp +++ b/ion/src/emscripten/main.cpp @@ -2,9 +2,6 @@ #include "display.h" #include "events_keyboard.h" #include "../../../apps/global_preferences.h" -extern "C" { -#include -} extern "C" { const char * IonSoftwareVersion(); @@ -24,7 +21,3 @@ int main(int argc, char * argv[]) { void Ion::msleep(long ms) { } - -uint32_t Ion::millis() { - return SDL_GetTicks(); -} diff --git a/ion/src/shared/timing.cpp b/ion/src/shared/timing.cpp new file mode 100644 index 000000000..ac3180fd4 --- /dev/null +++ b/ion/src/shared/timing.cpp @@ -0,0 +1,14 @@ +#include +#include + +static auto start = std::chrono::high_resolution_clock::now(); + +uint32_t Ion::millis() { + auto elapsed = std::chrono::high_resolution_clock::now() - start; + return std::chrono::duration_cast(elapsed).count(); +} + +uint32_t Ion::micros() { + auto elapsed = std::chrono::high_resolution_clock::now() - start; + return std::chrono::duration_cast(elapsed).count(); +} diff --git a/ion/src/simulator/Makefile b/ion/src/simulator/Makefile index 5df0e25eb..f9965da9f 100644 --- a/ion/src/simulator/Makefile +++ b/ion/src/simulator/Makefile @@ -13,6 +13,7 @@ objs += $(addprefix ion/src/shared/, \ events_modifier.o \ power.o \ random.o \ + timing.o \ dummy/backlight.o \ dummy/battery.o \ dummy/fcc_id.o \ diff --git a/ion/src/simulator/init.cpp b/ion/src/simulator/init.cpp index df09af645..d20630b14 100644 --- a/ion/src/simulator/init.cpp +++ b/ion/src/simulator/init.cpp @@ -116,19 +116,3 @@ void Ion::msleep(long ms) { } } } - -static auto start = std::chrono::high_resolution_clock::now(); - -uint32_t Ion::millis() { - sDisplay->redraw(); - Fl::wait(0); - auto elapsed = std::chrono::high_resolution_clock::now() - start; - return std::chrono::duration_cast(elapsed).count(); -} - -uint32_t Ion::micros() { - sDisplay->redraw(); - Fl::wait(0); - auto elapsed = std::chrono::high_resolution_clock::now() - start; - return std::chrono::duration_cast(elapsed).count(); -} diff --git a/python/port/helpers.cpp b/python/port/helpers.cpp index 5da28c6a5..a1a22b0be 100644 --- a/python/port/helpers.cpp +++ b/python/port/helpers.cpp @@ -4,13 +4,15 @@ extern "C" { #include "mphalport.h" } -bool micropython_port_should_interrupt() { +bool micropython_port_should_interrupt(bool force) { static int c = 0; - c++; - if (c%20000 != 0) { - return false; + if(!force) { + c++; + if (c%20000 != 0) { + return false; + } + c = 0; } - c = 0; Ion::Keyboard::State scan = Ion::Keyboard::scan(); if (scan.keyDown((Ion::Keyboard::Key)mp_interrupt_char)) { mp_keyboard_interrupt(); diff --git a/python/port/helpers.h b/python/port/helpers.h index 76abbde0d..acb4f7297 100644 --- a/python/port/helpers.h +++ b/python/port/helpers.h @@ -8,7 +8,7 @@ extern "C" { /* should_interrupt effectively does something once every 20000 calls. It checks * if a key is down to raise an interruption flag. */ -bool micropython_port_should_interrupt(); +bool micropython_port_should_interrupt(bool); #ifdef __cplusplus } diff --git a/python/port/mpconfigport.h b/python/port/mpconfigport.h index ff7fff87d..25ba668f8 100644 --- a/python/port/mpconfigport.h +++ b/python/port/mpconfigport.h @@ -90,7 +90,7 @@ // (This scheme won't work if we want to mix Thumb and normal ARM code.) #define MICROPY_MAKE_POINTER_CALLABLE(p) (p) -#define MICROPY_VM_HOOK_LOOP micropython_port_should_interrupt(); +#define MICROPY_VM_HOOK_LOOP micropython_port_should_interrupt(false); typedef intptr_t mp_int_t; // must be pointer size typedef uintptr_t mp_uint_t; // must be pointer size diff --git a/python/src/extmod/modutime.c b/python/src/extmod/modutime.c index f5ffdaa41..829ba0cd5 100644 --- a/python/src/extmod/modutime.c +++ b/python/src/extmod/modutime.c @@ -34,13 +34,15 @@ void delay_ms(mp_uint_t delay) { uint32_t start = millis(); - while (millis() - start < delay && !micropython_port_should_interrupt()) { + while (millis() - start < delay && !micropython_port_should_interrupt(true)) { + msleep(1); } } void delay_us(mp_uint_t delay) { uint32_t start = micros(); - while (micros() - start < delay && !micropython_port_should_interrupt()) { + while (micros() - start < delay && !micropython_port_should_interrupt(false)) { + usleep(1); } }