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.

draw_baby_stepping.cpp 13KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352
  1. /**
  2. * Marlin 3D Printer Firmware
  3. * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin]
  4. *
  5. * Based on Sprinter and grbl.
  6. * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm
  7. *
  8. * This program is free software: you can redistribute it and/or modify
  9. * it under the terms of the GNU General Public License as published by
  10. * the Free Software Foundation, either version 3 of the License, or
  11. * (at your option) any later version.
  12. *
  13. * This program is distributed in the hope that it will be useful,
  14. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  15. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  16. * GNU General Public License for more details.
  17. *
  18. * You should have received a copy of the GNU General Public License
  19. * along with this program. If not, see <https://www.gnu.org/licenses/>.
  20. *
  21. */
  22. #include "../../../../inc/MarlinConfigPre.h"
  23. #if HAS_TFT_LVGL_UI
  24. #include "lv_conf.h"
  25. #include "draw_ui.h"
  26. #include "../../../../MarlinCore.h"
  27. #include "../../../../gcode/queue.h"
  28. #include "../../../../gcode/gcode.h"
  29. #if HAS_BED_PROBE
  30. #include "../../../../module/probe.h"
  31. #endif
  32. extern lv_group_t * g;
  33. static lv_obj_t * scr;
  34. static lv_obj_t *labelV, *buttonV, * zOffsetText;
  35. #define ID_BABY_STEP_X_P 1
  36. #define ID_BABY_STEP_X_N 2
  37. #define ID_BABY_STEP_Y_P 3
  38. #define ID_BABY_STEP_Y_N 4
  39. #define ID_BABY_STEP_Z_P 5
  40. #define ID_BABY_STEP_Z_N 6
  41. #define ID_BABY_STEP_DIST 7
  42. #define ID_BABY_STEP_RETURN 8
  43. static float babystep_dist=0.01;
  44. static uint8_t has_adjust_z = 0;
  45. static void event_handler(lv_obj_t * obj, lv_event_t event) {
  46. char baby_buf[30]={0};
  47. switch (obj->mks_obj_id) {
  48. case ID_BABY_STEP_X_P:
  49. if (event == LV_EVENT_CLICKED) {
  50. // nothing to do
  51. }
  52. else if (event == LV_EVENT_RELEASED) {
  53. ZERO(baby_buf);
  54. sprintf_P(baby_buf, PSTR("M290 X%.3f"),babystep_dist);
  55. gcode.process_subcommands_now_P(PSTR(baby_buf));
  56. has_adjust_z = 1;
  57. }
  58. break;
  59. case ID_BABY_STEP_X_N:
  60. if (event == LV_EVENT_CLICKED) {
  61. // nothing to do
  62. }
  63. else if (event == LV_EVENT_RELEASED) {
  64. ZERO(baby_buf);
  65. sprintf_P(baby_buf, PSTR("M290 X%.3f"),((float)0 - babystep_dist));
  66. gcode.process_subcommands_now_P(PSTR(baby_buf));
  67. has_adjust_z = 1;
  68. }
  69. break;
  70. case ID_BABY_STEP_Y_P:
  71. if (event == LV_EVENT_CLICKED) {
  72. // nothing to do
  73. }
  74. else if (event == LV_EVENT_RELEASED) {
  75. ZERO(baby_buf);
  76. sprintf_P(baby_buf, PSTR("M290 Y%.3f"), babystep_dist);
  77. gcode.process_subcommands_now_P(PSTR(baby_buf));
  78. has_adjust_z = 1;
  79. }
  80. break;
  81. case ID_BABY_STEP_Y_N:
  82. if (event == LV_EVENT_CLICKED) {
  83. // nothing to do
  84. }
  85. else if (event == LV_EVENT_RELEASED) {
  86. ZERO(baby_buf);
  87. sprintf_P(baby_buf, PSTR("M290 Y%.3f"),((float)0 - babystep_dist));
  88. gcode.process_subcommands_now_P(PSTR(baby_buf));
  89. has_adjust_z = 1;
  90. }
  91. break;
  92. case ID_BABY_STEP_Z_P:
  93. if (event == LV_EVENT_CLICKED) {
  94. // nothing to do
  95. }
  96. else if (event == LV_EVENT_RELEASED) {
  97. ZERO(baby_buf);
  98. sprintf_P(baby_buf, PSTR("M290 Z%.3f"), babystep_dist);
  99. gcode.process_subcommands_now_P(PSTR(baby_buf));
  100. has_adjust_z = 1;
  101. }
  102. break;
  103. case ID_BABY_STEP_Z_N:
  104. if (event == LV_EVENT_CLICKED) {
  105. // nothing to do
  106. }
  107. else if (event == LV_EVENT_RELEASED) {
  108. ZERO(baby_buf);
  109. sprintf_P(baby_buf, PSTR("M290 Z%.3f"),((float)0 - babystep_dist));
  110. gcode.process_subcommands_now_P(PSTR(baby_buf));
  111. has_adjust_z = 1;
  112. }
  113. break;
  114. case ID_BABY_STEP_DIST:
  115. if (event == LV_EVENT_CLICKED) {
  116. // nothing to do
  117. }
  118. else if (event == LV_EVENT_RELEASED) {
  119. if (abs((int)(100 * babystep_dist)) == 1)
  120. babystep_dist = 0.05;
  121. else if (abs((int)(100 * babystep_dist)) == 5)
  122. babystep_dist = 0.1;
  123. else
  124. babystep_dist = 0.01;
  125. disp_baby_step_dist();
  126. }
  127. break;
  128. case ID_BABY_STEP_RETURN:
  129. if (event == LV_EVENT_CLICKED) {
  130. // nothing to do
  131. }
  132. else if (event == LV_EVENT_RELEASED) {
  133. if (has_adjust_z == 1) {
  134. gcode.process_subcommands_now_P(PSTR("M500"));
  135. has_adjust_z = 0;
  136. }
  137. clear_cur_ui();
  138. draw_return_ui();
  139. }
  140. break;
  141. }
  142. }
  143. void lv_draw_baby_stepping(void) {
  144. lv_obj_t *buttonXI, *buttonXD, *buttonYI, *buttonYD, *buttonZI, *buttonZD, *buttonBack;
  145. if (disp_state_stack._disp_state[disp_state_stack._disp_index] != BABY_STEP_UI) {
  146. disp_state_stack._disp_index++;
  147. disp_state_stack._disp_state[disp_state_stack._disp_index] = BABY_STEP_UI;
  148. }
  149. disp_state = BABY_STEP_UI;
  150. scr = lv_obj_create(NULL, NULL);
  151. lv_obj_set_style(scr, &tft_style_scr);
  152. lv_scr_load(scr);
  153. lv_obj_clean(scr);
  154. lv_obj_t * title = lv_label_create(scr, NULL);
  155. lv_obj_set_style(title, &tft_style_label_rel);
  156. lv_obj_set_pos(title, TITLE_XPOS, TITLE_YPOS);
  157. lv_label_set_text(title, creat_title_text());
  158. lv_refr_now(lv_refr_get_disp_refreshing());
  159. // Create an Image button
  160. buttonXI = lv_imgbtn_create(scr, NULL);
  161. buttonXD = lv_imgbtn_create(scr, NULL);
  162. buttonYI = lv_imgbtn_create(scr, NULL);
  163. buttonYD = lv_imgbtn_create(scr, NULL);
  164. buttonZI = lv_imgbtn_create(scr, NULL);
  165. buttonZD = lv_imgbtn_create(scr, NULL);
  166. buttonV = lv_imgbtn_create(scr, NULL);
  167. buttonBack = lv_imgbtn_create(scr, NULL);
  168. lv_obj_set_event_cb_mks(buttonXI, event_handler, ID_BABY_STEP_X_P, NULL, 0);
  169. lv_imgbtn_set_src(buttonXI, LV_BTN_STATE_REL, "F:/bmp_xAdd.bin");
  170. lv_imgbtn_set_src(buttonXI, LV_BTN_STATE_PR, "F:/bmp_xAdd.bin");
  171. lv_imgbtn_set_style(buttonXI, LV_BTN_STATE_PR, &tft_style_label_pre);
  172. lv_imgbtn_set_style(buttonXI, LV_BTN_STATE_REL, &tft_style_label_rel);
  173. #if 1
  174. lv_obj_set_event_cb_mks(buttonXD, event_handler, ID_BABY_STEP_X_N, NULL, 0);
  175. lv_imgbtn_set_src(buttonXD, LV_BTN_STATE_REL, "F:/bmp_xDec.bin");
  176. lv_imgbtn_set_src(buttonXD, LV_BTN_STATE_PR, "F:/bmp_xDec.bin");
  177. lv_imgbtn_set_style(buttonXD, LV_BTN_STATE_PR, &tft_style_label_pre);
  178. lv_imgbtn_set_style(buttonXD, LV_BTN_STATE_REL, &tft_style_label_rel);
  179. lv_obj_set_event_cb_mks(buttonYI, event_handler, ID_BABY_STEP_Y_P, NULL, 0);
  180. lv_imgbtn_set_src(buttonYI, LV_BTN_STATE_REL, "F:/bmp_yAdd.bin");
  181. lv_imgbtn_set_src(buttonYI, LV_BTN_STATE_PR, "F:/bmp_yAdd.bin");
  182. lv_imgbtn_set_style(buttonYI, LV_BTN_STATE_PR, &tft_style_label_pre);
  183. lv_imgbtn_set_style(buttonYI, LV_BTN_STATE_REL, &tft_style_label_rel);
  184. lv_obj_set_event_cb_mks(buttonYD, event_handler, ID_BABY_STEP_Y_N, NULL, 0);
  185. lv_imgbtn_set_src(buttonYD, LV_BTN_STATE_REL, "F:/bmp_yDec.bin");
  186. lv_imgbtn_set_src(buttonYD, LV_BTN_STATE_PR, "F:/bmp_yDec.bin");
  187. lv_imgbtn_set_style(buttonYD, LV_BTN_STATE_PR, &tft_style_label_pre);
  188. lv_imgbtn_set_style(buttonYD, LV_BTN_STATE_REL, &tft_style_label_rel);
  189. lv_obj_set_event_cb_mks(buttonZI, event_handler, ID_BABY_STEP_Z_P, NULL, 0);
  190. lv_imgbtn_set_src(buttonZI, LV_BTN_STATE_REL, "F:/bmp_zAdd.bin");
  191. lv_imgbtn_set_src(buttonZI, LV_BTN_STATE_PR, "F:/bmp_zAdd.bin");
  192. lv_imgbtn_set_style(buttonZI, LV_BTN_STATE_PR, &tft_style_label_pre);
  193. lv_imgbtn_set_style(buttonZI, LV_BTN_STATE_REL, &tft_style_label_rel);
  194. lv_obj_set_event_cb_mks(buttonZD, event_handler, ID_BABY_STEP_Z_N, NULL, 0);
  195. lv_imgbtn_set_src(buttonZD, LV_BTN_STATE_REL, "F:/bmp_zDec.bin");
  196. lv_imgbtn_set_src(buttonZD, LV_BTN_STATE_PR, "F:/bmp_zDec.bin");
  197. lv_imgbtn_set_style(buttonZD, LV_BTN_STATE_PR, &tft_style_label_pre);
  198. lv_imgbtn_set_style(buttonZD, LV_BTN_STATE_REL, &tft_style_label_rel);
  199. lv_obj_set_event_cb_mks(buttonV, event_handler, ID_BABY_STEP_DIST, NULL, 0);
  200. lv_imgbtn_set_style(buttonV, LV_BTN_STATE_PR, &tft_style_label_pre);
  201. lv_imgbtn_set_style(buttonV, LV_BTN_STATE_REL, &tft_style_label_rel);
  202. lv_obj_set_event_cb_mks(buttonBack, event_handler, ID_BABY_STEP_RETURN, NULL, 0);
  203. lv_imgbtn_set_src(buttonBack, LV_BTN_STATE_REL, "F:/bmp_return.bin");
  204. lv_imgbtn_set_src(buttonBack, LV_BTN_STATE_PR, "F:/bmp_return.bin");
  205. lv_imgbtn_set_style(buttonBack, LV_BTN_STATE_PR, &tft_style_label_pre);
  206. lv_imgbtn_set_style(buttonBack, LV_BTN_STATE_REL, &tft_style_label_rel);
  207. #endif // if 1
  208. lv_obj_set_pos(buttonXI, INTERVAL_V, titleHeight);
  209. lv_obj_set_pos(buttonYI, BTN_X_PIXEL + INTERVAL_V * 2, titleHeight);
  210. lv_obj_set_pos(buttonZI, BTN_X_PIXEL * 2 + INTERVAL_V * 3, titleHeight);
  211. lv_obj_set_pos(buttonV, BTN_X_PIXEL * 3 + INTERVAL_V * 4, titleHeight);
  212. lv_obj_set_pos(buttonXD, INTERVAL_V, BTN_Y_PIXEL + INTERVAL_H + titleHeight);
  213. lv_obj_set_pos(buttonYD, BTN_X_PIXEL + INTERVAL_V * 2, BTN_Y_PIXEL + INTERVAL_H + titleHeight);
  214. lv_obj_set_pos(buttonZD, BTN_X_PIXEL * 2 + INTERVAL_V * 3, BTN_Y_PIXEL + INTERVAL_H + titleHeight);
  215. lv_obj_set_pos(buttonBack, BTN_X_PIXEL * 3 + INTERVAL_V * 4, BTN_Y_PIXEL + INTERVAL_H + titleHeight);
  216. // Create labels on the image buttons
  217. lv_btn_set_layout(buttonXI, LV_LAYOUT_OFF);
  218. lv_btn_set_layout(buttonXD, LV_LAYOUT_OFF);
  219. lv_btn_set_layout(buttonYI, LV_LAYOUT_OFF);
  220. lv_btn_set_layout(buttonYD, LV_LAYOUT_OFF);
  221. lv_btn_set_layout(buttonZI, LV_LAYOUT_OFF);
  222. lv_btn_set_layout(buttonZD, LV_LAYOUT_OFF);
  223. lv_btn_set_layout(buttonV, LV_LAYOUT_OFF);
  224. lv_btn_set_layout(buttonBack, LV_LAYOUT_OFF);
  225. lv_obj_t *labelXI = lv_label_create(buttonXI, NULL);
  226. lv_obj_t *labelXD = lv_label_create(buttonXD, NULL);
  227. lv_obj_t *labelYI = lv_label_create(buttonYI, NULL);
  228. lv_obj_t *labelYD = lv_label_create(buttonYD, NULL);
  229. lv_obj_t *labelZI = lv_label_create(buttonZI, NULL);
  230. lv_obj_t *labelZD = lv_label_create(buttonZD, NULL);
  231. labelV = lv_label_create(buttonV, NULL);
  232. lv_obj_t *label_Back = lv_label_create(buttonBack, NULL);
  233. if (gCfgItems.multiple_language != 0) {
  234. lv_label_set_text(labelXI, move_menu.x_add);
  235. lv_obj_align(labelXI, buttonXI, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET);
  236. lv_label_set_text(labelXD, move_menu.x_dec);
  237. lv_obj_align(labelXD, buttonXD, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET);
  238. lv_label_set_text(labelYI, move_menu.y_add);
  239. lv_obj_align(labelYI, buttonYI, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET);
  240. lv_label_set_text(labelYD, move_menu.y_dec);
  241. lv_obj_align(labelYD, buttonYD, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET);
  242. lv_label_set_text(labelZI, move_menu.z_add);
  243. lv_obj_align(labelZI, buttonZI, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET);
  244. lv_label_set_text(labelZD, move_menu.z_dec);
  245. lv_obj_align(labelZD, buttonZD, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET);
  246. lv_label_set_text(label_Back, common_menu.text_back);
  247. lv_obj_align(label_Back, buttonBack, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET);
  248. }
  249. #if HAS_ROTARY_ENCODER
  250. if (gCfgItems.encoder_enable) {
  251. lv_group_add_obj(g, buttonXI);
  252. lv_group_add_obj(g, buttonXD);
  253. lv_group_add_obj(g, buttonYI);
  254. lv_group_add_obj(g, buttonYD);
  255. lv_group_add_obj(g, buttonZI);
  256. lv_group_add_obj(g, buttonZD);
  257. lv_group_add_obj(g, buttonV);
  258. lv_group_add_obj(g, buttonBack);
  259. }
  260. #endif
  261. disp_baby_step_dist();
  262. zOffsetText = lv_label_create(scr, NULL);
  263. lv_obj_set_style(zOffsetText, &tft_style_label_rel);
  264. lv_obj_set_pos(zOffsetText, 290, TITLE_YPOS);
  265. disp_z_offset_value();
  266. }
  267. void disp_baby_step_dist() {
  268. // char buf[30] = {0};
  269. if ((int)(100 * babystep_dist) == 1) {
  270. lv_imgbtn_set_src(buttonV, LV_BTN_STATE_REL, "F:/bmp_baby_move0_01.bin");
  271. lv_imgbtn_set_src(buttonV, LV_BTN_STATE_PR, "F:/bmp_baby_move0_01.bin");
  272. }
  273. else if ((int)(100 * babystep_dist) == 5) {
  274. lv_imgbtn_set_src(buttonV, LV_BTN_STATE_REL, "F:/bmp_baby_move0_05.bin");
  275. lv_imgbtn_set_src(buttonV, LV_BTN_STATE_PR, "F:/bmp_baby_move0_05.bin");
  276. }
  277. else if ((int)(100 * babystep_dist) == 10) {
  278. lv_imgbtn_set_src(buttonV, LV_BTN_STATE_REL, "F:/bmp_baby_move0_1.bin");
  279. lv_imgbtn_set_src(buttonV, LV_BTN_STATE_PR, "F:/bmp_baby_move0_1.bin");
  280. }
  281. if (gCfgItems.multiple_language != 0) {
  282. if ((int)(100 * babystep_dist) == 1) {
  283. lv_label_set_text(labelV, move_menu.step_001mm);
  284. lv_obj_align(labelV, buttonV, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET);
  285. }
  286. else if ((int)(100 * babystep_dist) == 5) {
  287. lv_label_set_text(labelV, move_menu.step_005mm);
  288. lv_obj_align(labelV, buttonV, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET);
  289. }
  290. else if ((int)(100 * babystep_dist) == 10) {
  291. lv_label_set_text(labelV, move_menu.step_01mm);
  292. lv_obj_align(labelV, buttonV, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET);
  293. }
  294. }
  295. }
  296. void disp_z_offset_value() {
  297. char buf[20];
  298. ZERO(buf);
  299. sprintf_P(buf, PSTR("offset Z: %.3f"), (double)TERN(HAS_BED_PROBE, probe.offset.z, 0));
  300. lv_label_set_text(zOffsetText, buf);
  301. }
  302. void lv_clear_baby_stepping() {
  303. #if HAS_ROTARY_ENCODER
  304. if (gCfgItems.encoder_enable) lv_group_remove_all_objs(g);
  305. #endif
  306. lv_obj_del(scr);
  307. }
  308. #endif // HAS_TFT_LVGL_UI