From cc3beb6014f47cd1edff57d035f6b1ae1224c5e9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?L=C3=A9a=20Saviot?= Date: Thu, 6 Dec 2018 16:07:57 +0100 Subject: [PATCH] [python/turtle] Turtle::reset() method --- apps/code/console_controller.cpp | 7 +++++++ apps/code/console_controller.h | 1 + apps/code/sandbox_controller.cpp | 11 ++++++++++- apps/code/sandbox_controller.h | 2 ++ escher/include/escher/solid_color_view.h | 1 + escher/src/solid_color_view.cpp | 4 ++++ python/port/genhdr/qstrdefs.in.h | 4 +++- python/port/mod/turtle/modturtle.cpp | 5 +++++ python/port/mod/turtle/modturtle.h | 2 ++ python/port/mod/turtle/modturtle_table.c | 5 +++++ python/port/mod/turtle/turtle.cpp | 20 ++++++++++++++++++++ python/port/mod/turtle/turtle.h | 9 +++++++-- python/port/port.h | 11 ++++------- 13 files changed, 71 insertions(+), 11 deletions(-) diff --git a/apps/code/console_controller.cpp b/apps/code/console_controller.cpp index 19009dcf2..fff281861 100644 --- a/apps/code/console_controller.cpp +++ b/apps/code/console_controller.cpp @@ -304,6 +304,13 @@ void ConsoleController::displaySandbox() { stackViewController()->push(&m_sandboxController); } +void ConsoleController::resetSandbox() { + if (!m_sandboxIsDisplayed) { + return; + } + m_sandboxController.reset(); +} + /* printText is called by the Python machine. * The text argument is not always null-terminated. */ void ConsoleController::printText(const char * text, size_t length) { diff --git a/apps/code/console_controller.h b/apps/code/console_controller.h index 0502d6476..450ed8cbc 100644 --- a/apps/code/console_controller.h +++ b/apps/code/console_controller.h @@ -64,6 +64,7 @@ public: // MicroPython::ExecutionEnvironment void displaySandbox() override; + void resetSandbox() override; void printText(const char * text, size_t length) override; const char * inputText(const char * prompt) override; diff --git a/apps/code/sandbox_controller.cpp b/apps/code/sandbox_controller.cpp index 3a5b4ba0c..e72fbafb5 100644 --- a/apps/code/sandbox_controller.cpp +++ b/apps/code/sandbox_controller.cpp @@ -13,8 +13,13 @@ StackViewController * SandboxController::stackViewController() { return static_cast(parentResponder()); } +void SandboxController::reset() { + m_solidColorView.reload(); + redrawWindow(); +} + void SandboxController::viewWillAppear() { - static_cast(const_cast(app()->container()))->redrawWindow(); + redrawWindow(); } bool SandboxController::handleEvent(Ion::Events::Event event) { @@ -28,4 +33,8 @@ bool SandboxController::handleEvent(Ion::Events::Event event) { return true; } +void SandboxController::redrawWindow() { + static_cast(const_cast(app()->container()))->redrawWindow(); +} + } diff --git a/apps/code/sandbox_controller.h b/apps/code/sandbox_controller.h index 4c9fe250b..4bbd4d838 100644 --- a/apps/code/sandbox_controller.h +++ b/apps/code/sandbox_controller.h @@ -12,6 +12,7 @@ class SandboxController : public ViewController { public: SandboxController(Responder * parentResponder); StackViewController * stackViewController(); + void reset(); // ViewController View * view() override { return &m_solidColorView; } @@ -20,6 +21,7 @@ public: ViewController::DisplayParameter displayParameter() override { return ViewController::DisplayParameter::WantsMaximumSpace; } private: + void redrawWindow(); SolidColorView m_solidColorView; }; } diff --git a/escher/include/escher/solid_color_view.h b/escher/include/escher/solid_color_view.h index 23097df63..b6253f2f6 100644 --- a/escher/include/escher/solid_color_view.h +++ b/escher/include/escher/solid_color_view.h @@ -6,6 +6,7 @@ class SolidColorView : public View { public: SolidColorView(KDColor color); + void reload(); virtual void setColor(KDColor color); void drawRect(KDContext * ctx, KDRect rect) const override; protected: diff --git a/escher/src/solid_color_view.cpp b/escher/src/solid_color_view.cpp index b56e28477..8b24fe191 100644 --- a/escher/src/solid_color_view.cpp +++ b/escher/src/solid_color_view.cpp @@ -6,6 +6,10 @@ SolidColorView::SolidColorView(KDColor color) : { } +void SolidColorView::reload() { + markRectAsDirty(bounds()); +} + void SolidColorView::setColor(KDColor color) { if (m_color != color) { m_color = color; diff --git a/python/port/genhdr/qstrdefs.in.h b/python/port/genhdr/qstrdefs.in.h index 95cb7ef79..d9a63131c 100644 --- a/python/port/genhdr/qstrdefs.in.h +++ b/python/port/genhdr/qstrdefs.in.h @@ -27,6 +27,9 @@ Q(set_pixel) // Turtle QSTRs Q(turtle) + +Q(reset) + Q(forward) Q(fd) Q(backward) @@ -63,7 +66,6 @@ Q(ht) Q(isvisible) Q(pencolor) -Q(reset) // utime QSTRs Q(time) diff --git a/python/port/mod/turtle/modturtle.cpp b/python/port/mod/turtle/modturtle.cpp index e62cd4356..393abd4fd 100644 --- a/python/port/mod/turtle/modturtle.cpp +++ b/python/port/mod/turtle/modturtle.cpp @@ -19,6 +19,11 @@ mp_obj_t modturtle___init__() { return mp_const_none; } +mp_obj_t modturtle_reset() { + sTurtle.reset(); + return mp_const_none; +} + mp_obj_t modturtle_forward(mp_obj_t px) { sTurtle.forward(mp_obj_get_float(px)); return mp_const_none; diff --git a/python/port/mod/turtle/modturtle.h b/python/port/mod/turtle/modturtle.h index f27f65cf4..3bd128296 100644 --- a/python/port/mod/turtle/modturtle.h +++ b/python/port/mod/turtle/modturtle.h @@ -3,6 +3,8 @@ mp_obj_t modturtle___init__(); void modturtle_gc_collect(); +mp_obj_t modturtle_reset(); + mp_obj_t modturtle_forward(mp_obj_t px); mp_obj_t modturtle_backward(mp_obj_t px); mp_obj_t modturtle_right(mp_obj_t deg); diff --git a/python/port/mod/turtle/modturtle_table.c b/python/port/mod/turtle/modturtle_table.c index f58e28235..6f90310f9 100644 --- a/python/port/mod/turtle/modturtle_table.c +++ b/python/port/mod/turtle/modturtle_table.c @@ -1,5 +1,7 @@ #include "modturtle.h" +STATIC MP_DEFINE_CONST_FUN_OBJ_0(modturtle_reset_obj, modturtle_reset); + STATIC MP_DEFINE_CONST_FUN_OBJ_1(modturtle_forward_obj, modturtle_forward); STATIC MP_DEFINE_CONST_FUN_OBJ_1(modturtle_backward_obj, modturtle_backward); STATIC MP_DEFINE_CONST_FUN_OBJ_1(modturtle_right_obj, modturtle_right); @@ -27,6 +29,9 @@ STATIC MP_DEFINE_CONST_FUN_OBJ_0(modturtle___init___obj, modturtle___init__); STATIC const mp_rom_map_elem_t modturtle_module_globals_table[] = { { MP_ROM_QSTR(MP_QSTR___name__), MP_ROM_QSTR(MP_QSTR_turtle) }, { MP_ROM_QSTR(MP_QSTR___init__), (mp_obj_t)&modturtle___init___obj }, + + { MP_ROM_QSTR(MP_QSTR_reset), (mp_obj_t)&modturtle_reset_obj }, + { MP_ROM_QSTR(MP_QSTR_forward), (mp_obj_t)&modturtle_forward_obj }, { MP_ROM_QSTR(MP_QSTR_fd), (mp_obj_t)&modturtle_forward_obj }, { MP_ROM_QSTR(MP_QSTR_backward), (mp_obj_t)&modturtle_backward_obj }, diff --git a/python/port/mod/turtle/turtle.cpp b/python/port/mod/turtle/turtle.cpp index 6e3e53a84..5496012f6 100644 --- a/python/port/mod/turtle/turtle.cpp +++ b/python/port/mod/turtle/turtle.cpp @@ -7,6 +7,7 @@ extern "C" { #include "turtle_icon.h" static constexpr KDSize k_iconSize = KDSize(9, 9); +constexpr KDColor Turtle::k_defaultColor; template static inline T * allocate(size_t count) { /* We forward dynamic allocations to the Python GC so we don't have to bother @@ -16,6 +17,25 @@ template static inline T * allocate(size_t count) { return static_cast(m_malloc(sizeof(T) * count)); } +void Turtle::reset() { + // Erase the drawing + MicroPython::ExecutionEnvironment::currentExecutionEnvironment()->resetSandbox(); + + // Reset turtle values + m_x = 0; + m_y = 0; + m_heading = k_headingOffset; + m_color = k_defaultColor; + m_penDown = true; + m_visible = true; + m_speed = k_defaultSpeed; + m_penSize = k_defaultPenSize; + m_mileage = 0; + + // Draw the turtle + draw(); +} + void Turtle::forward(mp_float_t length) { goTo( m_x + length * sin(m_heading), diff --git a/python/port/mod/turtle/turtle.h b/python/port/mod/turtle/turtle.h index 99b4d5583..1f6d043de 100644 --- a/python/port/mod/turtle/turtle.h +++ b/python/port/mod/turtle/turtle.h @@ -25,11 +25,11 @@ public: m_x(0), m_y(0), m_heading(k_headingOffset), - m_color(KDColorBlack), + m_color(k_defaultColor), m_penDown(true), m_visible(true), m_speed(k_defaultSpeed), - m_penSize(1), + m_penSize(k_defaultPenSize), m_mileage(0), m_drawn(false), m_underneathPixelBuffer(nullptr), @@ -39,6 +39,8 @@ public: { } + void reset(); + void forward(mp_float_t length); void backward(mp_float_t length) { forward(-length); } void right(mp_float_t angle) { left(-angle); } @@ -76,6 +78,9 @@ private: static constexpr int k_numberOfIcons = 8; static constexpr uint8_t k_defaultSpeed = 3; static constexpr uint8_t k_maxSpeed = 10; + static constexpr KDColor k_defaultColor = KDColorBlack; + static constexpr uint8_t k_defaultPenSize = 1; + KDPoint position(mp_float_t x, mp_float_t y) const; KDPoint position() const { return position(m_x, m_y); } diff --git a/python/port/port.h b/python/port/port.h index 697867c57..52bc70a16 100644 --- a/python/port/port.h +++ b/python/port/port.h @@ -17,13 +17,10 @@ public: ExecutionEnvironment(); static ExecutionEnvironment * currentExecutionEnvironment(); void runCode(const char * ); - virtual const char * inputText(const char * prompt) { - return nullptr; - } - virtual void displaySandbox() { - } - virtual void printText(const char * text, size_t length) { - } + virtual const char * inputText(const char * prompt) { return nullptr; } + virtual void displaySandbox() {} + virtual void resetSandbox() {} + virtual void printText(const char * text, size_t length) {} void interrupt(); protected: bool m_sandboxIsDisplayed;