My Marlin configs for Fabrikator Mini and CTC i3 Pro B
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

bed_mesh_edit_screen.cpp 6.3KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196
  1. /****************************
  2. * bed_mesh_edit_screen.cpp *
  3. ****************************/
  4. /****************************************************************************
  5. * Written By Marcio Teixeira 2020 *
  6. * *
  7. * This program is free software: you can redistribute it and/or modify *
  8. * it under the terms of the GNU General Public License as published by *
  9. * the Free Software Foundation, either version 3 of the License, or *
  10. * (at your option) any later version. *
  11. * *
  12. * This program is distributed in the hope that it will be useful, *
  13. * but WITHOUT ANY WARRANTY; without even the implied warranty of *
  14. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
  15. * GNU General Public License for more details. *
  16. * *
  17. * To view a copy of the GNU General Public License, go to the following *
  18. * location: <https://www.gnu.org/licenses/>. *
  19. ****************************************************************************/
  20. #include "../config.h"
  21. #include "screens.h"
  22. #include "screen_data.h"
  23. #ifdef FTDI_BED_MESH_EDIT_SCREEN
  24. using namespace FTDI;
  25. using namespace Theme;
  26. using namespace ExtUI;
  27. constexpr static BedMeshEditScreenData &mydata = screen_data.BedMeshEditScreen;
  28. constexpr static float gaugeThickness = 0.1;
  29. #if ENABLED(TOUCH_UI_PORTRAIT)
  30. #define GRID_COLS 3
  31. #define GRID_ROWS 10
  32. #define MESH_POS BTN_POS(1, 2), BTN_SIZE(3,5)
  33. #define MESSAGE_POS BTN_POS(1, 7), BTN_SIZE(3,1)
  34. #define Z_LABEL_POS BTN_POS(1, 8), BTN_SIZE(1,1)
  35. #define Z_VALUE_POS BTN_POS(2, 8), BTN_SIZE(2,1)
  36. #define BACK_POS BTN_POS(1,10), BTN_SIZE(2,1)
  37. #define SAVE_POS BTN_POS(3,10), BTN_SIZE(1,1)
  38. #else
  39. #define GRID_COLS 5
  40. #define GRID_ROWS 5
  41. #define MESH_POS BTN_POS(1,1), BTN_SIZE(3,5)
  42. #define MESSAGE_POS BTN_POS(4,1), BTN_SIZE(2,1)
  43. #define Z_LABEL_POS BTN_POS(4,2), BTN_SIZE(2,1)
  44. #define Z_VALUE_POS BTN_POS(4,3), BTN_SIZE(2,1)
  45. #define BACK_POS BTN_POS(4,5), BTN_SIZE(1,1)
  46. #define SAVE_POS BTN_POS(5,5), BTN_SIZE(1,1)
  47. #endif
  48. constexpr uint8_t NONE = 255;
  49. static float meshGetter(uint8_t x, uint8_t y, void*) {
  50. xy_uint8_t pos;
  51. pos.x = x;
  52. pos.y = y;
  53. return ExtUI::getMeshPoint(pos) + (mydata.highlight.x != NONE && mydata.highlight == pos ? mydata.zAdjustment : 0);
  54. }
  55. void BedMeshEditScreen::onEntry() {
  56. mydata.needSave = false;
  57. mydata.highlight.x = NONE;
  58. mydata.zAdjustment = 0;
  59. mydata.savedMeshLevelingState = ExtUI::getLevelingActive();
  60. mydata.savedEndstopState = ExtUI::getSoftEndstopState();
  61. BaseScreen::onEntry();
  62. }
  63. void BedMeshEditScreen::onExit() {
  64. ExtUI::setLevelingActive(mydata.savedMeshLevelingState);
  65. ExtUI::setSoftEndstopState(mydata.savedEndstopState);
  66. }
  67. float BedMeshEditScreen::getHighlightedValue() {
  68. const float val = ExtUI::getMeshPoint(mydata.highlight);
  69. return (isnan(val) ? 0 : val) + mydata.zAdjustment;
  70. }
  71. void BedMeshEditScreen::setHighlightedValue(float value) {
  72. ExtUI::setMeshPoint(mydata.highlight, value);
  73. }
  74. void BedMeshEditScreen::moveToHighlightedValue() {
  75. if (ExtUI::getMeshValid()) {
  76. ExtUI::setLevelingActive(true);
  77. ExtUI::setSoftEndstopState(false);
  78. ExtUI::moveToMeshPoint(mydata.highlight, gaugeThickness + mydata.zAdjustment);
  79. }
  80. }
  81. void BedMeshEditScreen::adjustHighlightedValue(float increment) {
  82. if (mydata.highlight.x != NONE) {
  83. mydata.zAdjustment += increment;
  84. moveToHighlightedValue();
  85. mydata.needSave = true;
  86. }
  87. }
  88. void BedMeshEditScreen::saveAdjustedHighlightedValue() {
  89. if (mydata.zAdjustment && mydata.highlight.x != -1) {
  90. setHighlightedValue(getHighlightedValue());
  91. mydata.zAdjustment = 0;
  92. }
  93. }
  94. bool BedMeshEditScreen::changeHighlightedValue(uint8_t tag) {
  95. saveAdjustedHighlightedValue();
  96. if (tagToPoint(tag, mydata.highlight)) {
  97. moveToHighlightedValue();
  98. return true;
  99. }
  100. return false;
  101. }
  102. void BedMeshEditScreen::drawHighlightedPointValue() {
  103. CommandProcessor cmd;
  104. cmd.font(Theme::font_medium)
  105. .colors(normal_btn)
  106. .text(Z_LABEL_POS, GET_TEXT_F(MSG_MESH_EDIT_Z))
  107. .font(font_small);
  108. if (mydata.highlight.x != NONE)
  109. draw_adjuster(cmd, Z_VALUE_POS, 3, getHighlightedValue(), GET_TEXT_F(MSG_UNITS_MM), 4, 3);
  110. cmd.colors(mydata.needSave ? normal_btn : action_btn)
  111. .tag(1).button(BACK_POS, GET_TEXT_F(MSG_BUTTON_BACK))
  112. .colors(mydata.needSave ? action_btn : normal_btn)
  113. .enabled(mydata.needSave)
  114. .tag(2).button(SAVE_POS, GET_TEXT_F(MSG_TOUCHMI_SAVE));
  115. }
  116. void BedMeshEditScreen::onRedraw(draw_mode_t what) {
  117. #define _INSET_POS(x,y,w,h) x + min(w,h)/10, y + min(w,h)/10, w - min(w,h)/5, h - min(w,h)/5
  118. #define INSET_POS(pos) _INSET_POS(pos)
  119. CommandProcessor cmd;
  120. if (what & BACKGROUND) {
  121. cmd.cmd(CLEAR_COLOR_RGB(bg_color))
  122. .cmd(CLEAR(true,true,true));
  123. drawMeshBackground(cmd, INSET_POS(MESH_POS));
  124. }
  125. if (what & FOREGROUND) {
  126. drawHighlightedPointValue();
  127. drawMeshForeground(cmd, INSET_POS(MESH_POS), meshGetter, nullptr, pointToTag(mydata.highlight.x,mydata.highlight.y));
  128. }
  129. }
  130. bool BedMeshEditScreen::onTouchHeld(uint8_t tag) {
  131. constexpr float increment = 0.01;
  132. switch (tag) {
  133. case 3: adjustHighlightedValue(-increment); return true;
  134. case 4: adjustHighlightedValue( increment); return true;
  135. }
  136. return false;
  137. }
  138. bool BedMeshEditScreen::onTouchEnd(uint8_t tag) {
  139. switch (tag) {
  140. case 1:
  141. // On Cancel, reload saved mesh, discarding changes
  142. GOTO_PREVIOUS();
  143. injectCommands_P(PSTR("G29 L1"));
  144. return true;
  145. case 2:
  146. saveAdjustedHighlightedValue();
  147. injectCommands_P(PSTR("G29 S1"));
  148. mydata.needSave = false;
  149. return true;
  150. case 3:
  151. case 4:
  152. return onTouchHeld(tag);
  153. default: return changeHighlightedValue(tag);
  154. }
  155. return true;
  156. }
  157. void BedMeshEditScreen::show() {
  158. // On entry, home if needed and save current mesh
  159. if (!ExtUI::isMachineHomed()) {
  160. SpinnerDialogBox::enqueueAndWait_P(F("G28\nG29 S1"));
  161. // After the spinner, go to this screen.
  162. current_screen.forget();
  163. PUSH_SCREEN(BedMeshEditScreen);
  164. } else {
  165. injectCommands_P(PSTR("G29 S1"));
  166. GOTO_SCREEN(BedMeshEditScreen);
  167. }
  168. }
  169. #endif // FTDI_BED_MESH_EDIT_SCREEN