My Marlin configs for Fabrikator Mini and CTC i3 Pro B
Você não pode selecionar mais de 25 tópicos Os tópicos devem começar com uma letra ou um número, podem incluir traços ('-') e podem ter até 35 caracteres.

draw_number_key.cpp 26KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770
  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 "draw_ui.h"
  25. #include <lv_conf.h>
  26. #include "../../../../gcode/gcode.h"
  27. #include "../../../../gcode/queue.h"
  28. #include "../../../../module/planner.h"
  29. #include "../../../../inc/MarlinConfig.h"
  30. #if ENABLED(POWER_LOSS_RECOVERY)
  31. #include "../../../../feature/powerloss.h"
  32. #endif
  33. #if HAS_TRINAMIC_CONFIG
  34. #include "../../../../module/stepper/indirection.h"
  35. #include "../../../../feature/tmc_util.h"
  36. #endif
  37. #if HAS_BED_PROBE
  38. #include "../../../../module/probe.h"
  39. #endif
  40. extern lv_group_t *g;
  41. static lv_obj_t *scr;
  42. static lv_obj_t *buttonValue = nullptr;
  43. static lv_obj_t *labelValue = nullptr;
  44. static char key_value[11] = { 0 };
  45. static uint8_t cnt = 0;
  46. static bool point_flag = true;
  47. enum {
  48. ID_NUM_KEY1 = 1,
  49. ID_NUM_KEY2,
  50. ID_NUM_KEY3,
  51. ID_NUM_KEY4,
  52. ID_NUM_KEY5,
  53. ID_NUM_KEY6,
  54. ID_NUM_KEY7,
  55. ID_NUM_KEY8,
  56. ID_NUM_KEY9,
  57. ID_NUM_KEY0,
  58. ID_NUM_BACK,
  59. ID_NUM_RESET,
  60. ID_NUM_CONFIRM,
  61. ID_NUM_POINT,
  62. ID_NUM_NEGATIVE
  63. };
  64. static void disp_key_value() {
  65. char *temp;
  66. char str_1[16];
  67. #if HAS_TRINAMIC_CONFIG
  68. float milliamps;
  69. #endif
  70. switch (value) {
  71. case PrintAcceleration:
  72. sprintf_P(public_buf_m, PSTR("%s"), dtostrf(planner.settings.acceleration, 1, 1, str_1));
  73. break;
  74. case RetractAcceleration:
  75. sprintf_P(public_buf_m, PSTR("%s"), dtostrf(planner.settings.retract_acceleration, 1, 1, str_1));
  76. break;
  77. case TravelAcceleration:
  78. sprintf_P(public_buf_m, PSTR("%s"), dtostrf(planner.settings.travel_acceleration, 1, 1, str_1));
  79. break;
  80. case XAcceleration:
  81. sprintf_P(public_buf_m, PSTR("%d"), (int)planner.settings.max_acceleration_mm_per_s2[X_AXIS]);
  82. break;
  83. case YAcceleration:
  84. sprintf_P(public_buf_m, PSTR("%d"), (int)planner.settings.max_acceleration_mm_per_s2[Y_AXIS]);
  85. break;
  86. case ZAcceleration:
  87. sprintf_P(public_buf_m, PSTR("%d"), (int)planner.settings.max_acceleration_mm_per_s2[Z_AXIS]);
  88. break;
  89. case E0Acceleration:
  90. sprintf_P(public_buf_m, PSTR("%d"), (int)planner.settings.max_acceleration_mm_per_s2[E_AXIS]);
  91. break;
  92. case E1Acceleration:
  93. sprintf_P(public_buf_m, PSTR("%d"), (int)planner.settings.max_acceleration_mm_per_s2[E_AXIS_N(1)]);
  94. break;
  95. case XMaxFeedRate:
  96. sprintf_P(public_buf_m, PSTR("%s"), dtostrf(planner.settings.max_feedrate_mm_s[X_AXIS], 1, 1, str_1));
  97. break;
  98. case YMaxFeedRate:
  99. sprintf_P(public_buf_m, PSTR("%s"), dtostrf(planner.settings.max_feedrate_mm_s[Y_AXIS], 1, 1, str_1));
  100. break;
  101. case ZMaxFeedRate:
  102. sprintf_P(public_buf_m, PSTR("%s"), dtostrf(planner.settings.max_feedrate_mm_s[Z_AXIS], 1, 1, str_1));
  103. break;
  104. case E0MaxFeedRate:
  105. sprintf_P(public_buf_m, PSTR("%s"), dtostrf(planner.settings.max_feedrate_mm_s[E_AXIS], 1, 1, str_1));
  106. break;
  107. case E1MaxFeedRate:
  108. sprintf_P(public_buf_m, PSTR("%s"), dtostrf(planner.settings.max_feedrate_mm_s[E_AXIS_N(1)], 1, 1, str_1));
  109. break;
  110. case XJerk:
  111. #if HAS_CLASSIC_JERK
  112. sprintf_P(public_buf_m, PSTR("%s"), dtostrf(planner.max_jerk[X_AXIS], 1, 1, str_1));
  113. #endif
  114. break;
  115. case YJerk:
  116. #if HAS_CLASSIC_JERK
  117. sprintf_P(public_buf_m, PSTR("%s"), dtostrf(planner.max_jerk[Y_AXIS], 1, 1, str_1));
  118. #endif
  119. break;
  120. case ZJerk:
  121. #if HAS_CLASSIC_JERK
  122. sprintf_P(public_buf_m, PSTR("%s"), dtostrf(planner.max_jerk[Z_AXIS], 1, 1, str_1));
  123. #endif
  124. break;
  125. case EJerk:
  126. #if HAS_CLASSIC_JERK
  127. sprintf_P(public_buf_m, PSTR("%s"), dtostrf(planner.max_jerk[E_AXIS], 1, 1, str_1));
  128. #endif
  129. break;
  130. case Xstep:
  131. sprintf_P(public_buf_m, PSTR("%s"), dtostrf(planner.settings.axis_steps_per_mm[X_AXIS], 1, 1, str_1));
  132. break;
  133. case Ystep:
  134. sprintf_P(public_buf_m, PSTR("%s"), dtostrf(planner.settings.axis_steps_per_mm[Y_AXIS], 1, 1, str_1));
  135. break;
  136. case Zstep:
  137. sprintf_P(public_buf_m, PSTR("%s"), dtostrf(planner.settings.axis_steps_per_mm[Z_AXIS], 1, 1, str_1));
  138. break;
  139. case E0step:
  140. sprintf_P(public_buf_m, PSTR("%s"), dtostrf(planner.settings.axis_steps_per_mm[E_AXIS], 1, 1, str_1));
  141. break;
  142. case E1step:
  143. sprintf_P(public_buf_m, PSTR("%s"), dtostrf(planner.settings.axis_steps_per_mm[E_AXIS_N(1)], 1, 1, str_1));
  144. break;
  145. case Xcurrent:
  146. #if AXIS_IS_TMC(X)
  147. milliamps = stepperX.getMilliamps();
  148. sprintf_P(public_buf_m, PSTR("%s"), dtostrf(milliamps, 1, 1, str_1));
  149. #endif
  150. break;
  151. case Ycurrent:
  152. #if AXIS_IS_TMC(Y)
  153. milliamps = stepperY.getMilliamps();
  154. sprintf_P(public_buf_m, PSTR("%s"), dtostrf(milliamps, 1, 1, str_1));
  155. #endif
  156. break;
  157. case Zcurrent:
  158. #if AXIS_IS_TMC(Z)
  159. milliamps = stepperZ.getMilliamps();
  160. sprintf_P(public_buf_m, PSTR("%s"), dtostrf(milliamps, 1, 1, str_1));
  161. #endif
  162. break;
  163. case E0current:
  164. #if AXIS_IS_TMC(E0)
  165. milliamps = stepperE0.getMilliamps();
  166. sprintf_P(public_buf_m, PSTR("%s"), dtostrf(milliamps, 1, 1, str_1));
  167. #endif
  168. break;
  169. case E1current:
  170. #if AXIS_IS_TMC(E1)
  171. milliamps = stepperE1.getMilliamps();
  172. sprintf_P(public_buf_m, PSTR("%s"), dtostrf(milliamps, 1, 1, str_1));
  173. #endif
  174. break;
  175. case pause_pos_x:
  176. sprintf_P(public_buf_m, PSTR("%s"), dtostrf(gCfgItems.pausePosX, 1, 1, str_1));
  177. break;
  178. case pause_pos_y:
  179. sprintf_P(public_buf_m, PSTR("%s"), dtostrf(gCfgItems.pausePosY, 1, 1, str_1));
  180. break;
  181. case pause_pos_z:
  182. sprintf_P(public_buf_m, PSTR("%s"), dtostrf(gCfgItems.pausePosZ, 1, 1, str_1));
  183. break;
  184. case level_pos_x1:
  185. sprintf_P(public_buf_m, PSTR("%d"), (int)gCfgItems.levelingPos[0][0]);
  186. break;
  187. case level_pos_y1:
  188. sprintf_P(public_buf_m, PSTR("%d"), (int)gCfgItems.levelingPos[0][1]);
  189. break;
  190. case level_pos_x2:
  191. sprintf_P(public_buf_m, PSTR("%d"), (int)gCfgItems.levelingPos[1][0]);
  192. break;
  193. case level_pos_y2:
  194. sprintf_P(public_buf_m, PSTR("%d"), (int)gCfgItems.levelingPos[1][1]);
  195. break;
  196. case level_pos_x3:
  197. sprintf_P(public_buf_m, PSTR("%d"), (int)gCfgItems.levelingPos[2][0]);
  198. break;
  199. case level_pos_y3:
  200. sprintf_P(public_buf_m, PSTR("%d"), (int)gCfgItems.levelingPos[2][1]);
  201. break;
  202. case level_pos_x4:
  203. sprintf_P(public_buf_m, PSTR("%d"), (int)gCfgItems.levelingPos[3][0]);
  204. break;
  205. case level_pos_y4:
  206. sprintf_P(public_buf_m, PSTR("%d"), (int)gCfgItems.levelingPos[3][1]);
  207. break;
  208. case level_pos_x5:
  209. sprintf_P(public_buf_m, PSTR("%d"), (int)gCfgItems.levelingPos[4][0]);
  210. break;
  211. case level_pos_y5:
  212. sprintf_P(public_buf_m, PSTR("%d"), (int)gCfgItems.levelingPos[4][1]);
  213. break;
  214. #if HAS_BED_PROBE
  215. case x_offset:
  216. #if HAS_PROBE_XY_OFFSET
  217. sprintf_P(public_buf_m, PSTR("%s"), dtostrf(probe.offset.x, 1, 3, str_1));
  218. #endif
  219. break;
  220. case y_offset:
  221. #if HAS_PROBE_XY_OFFSET
  222. sprintf_P(public_buf_m, PSTR("%s"), dtostrf(probe.offset.y, 1, 3, str_1));
  223. #endif
  224. break;
  225. case z_offset:
  226. sprintf_P(public_buf_m, PSTR("%s"), dtostrf(probe.offset.z, 1, 3, str_1));
  227. break;
  228. #endif
  229. case load_length:
  230. sprintf_P(public_buf_m, PSTR("%d"), gCfgItems.filamentchange_load_length);
  231. break;
  232. case load_speed:
  233. sprintf_P(public_buf_m, PSTR("%d"), gCfgItems.filamentchange_load_speed);
  234. break;
  235. case unload_length:
  236. sprintf_P(public_buf_m, PSTR("%d"), gCfgItems.filamentchange_unload_length);
  237. break;
  238. case unload_speed:
  239. sprintf_P(public_buf_m, PSTR("%d"), gCfgItems.filamentchange_unload_speed);
  240. break;
  241. case filament_temp:
  242. sprintf_P(public_buf_m, PSTR("%d"), gCfgItems.filament_limit_temp);
  243. break;
  244. case x_sensitivity:
  245. #if X_SENSORLESS
  246. sprintf_P(public_buf_m, PSTR("%d"), TERN(X_SENSORLESS, stepperX.homing_threshold(), 0));
  247. #endif
  248. break;
  249. case y_sensitivity:
  250. #if Y_SENSORLESS
  251. sprintf_P(public_buf_m, PSTR("%d"), TERN(Y_SENSORLESS, stepperY.homing_threshold(), 0));
  252. #endif
  253. break;
  254. case z_sensitivity:
  255. #if Z_SENSORLESS
  256. sprintf_P(public_buf_m, PSTR("%d"), TERN(Z_SENSORLESS, stepperZ.homing_threshold(), 0));
  257. #endif
  258. break;
  259. case z2_sensitivity:
  260. #if Z2_SENSORLESS
  261. sprintf_P(public_buf_m, PSTR("%d"), TERN(Z2_SENSORLESS, stepperZ2.homing_threshold(), 0));
  262. #endif
  263. break;
  264. }
  265. strcpy(key_value, public_buf_m);
  266. cnt = strlen(key_value);
  267. temp = strchr(key_value, '.');
  268. point_flag = !temp;
  269. lv_label_set_text(labelValue, key_value);
  270. lv_obj_align(labelValue, buttonValue, LV_ALIGN_CENTER, 0, 0);
  271. }
  272. static void set_value_confirm() {
  273. #if HAS_TRINAMIC_CONFIG
  274. uint16_t current_mA;
  275. #endif
  276. switch (value) {
  277. case PrintAcceleration:
  278. planner.settings.acceleration = atof(key_value);
  279. break;
  280. case RetractAcceleration:
  281. planner.settings.retract_acceleration = atof(key_value);
  282. break;
  283. case TravelAcceleration:
  284. planner.settings.travel_acceleration = atof(key_value);
  285. break;
  286. case XAcceleration:
  287. planner.settings.max_acceleration_mm_per_s2[X_AXIS] = atof(key_value);
  288. break;
  289. case YAcceleration:
  290. planner.settings.max_acceleration_mm_per_s2[Y_AXIS] = atof(key_value);
  291. break;
  292. case ZAcceleration:
  293. planner.settings.max_acceleration_mm_per_s2[Z_AXIS] = atof(key_value);
  294. break;
  295. case E0Acceleration:
  296. planner.settings.max_acceleration_mm_per_s2[E_AXIS] = atof(key_value);
  297. break;
  298. case E1Acceleration:
  299. planner.settings.max_acceleration_mm_per_s2[E_AXIS_N(1)] = atof(key_value);
  300. break;
  301. case XMaxFeedRate:
  302. planner.settings.max_feedrate_mm_s[X_AXIS] = atof(key_value);
  303. break;
  304. case YMaxFeedRate:
  305. planner.settings.max_feedrate_mm_s[Y_AXIS] = atof(key_value);
  306. break;
  307. case ZMaxFeedRate:
  308. planner.settings.max_feedrate_mm_s[Z_AXIS] = atof(key_value);
  309. break;
  310. case E0MaxFeedRate:
  311. planner.settings.max_feedrate_mm_s[E_AXIS] = atof(key_value);
  312. break;
  313. case E1MaxFeedRate:
  314. planner.settings.max_feedrate_mm_s[E_AXIS_N(1)] = atof(key_value);
  315. break;
  316. case XJerk:
  317. #if HAS_CLASSIC_JERK
  318. planner.max_jerk[X_AXIS] = atof(key_value);
  319. #endif
  320. break;
  321. case YJerk:
  322. #if HAS_CLASSIC_JERK
  323. planner.max_jerk[Y_AXIS] = atof(key_value);
  324. #endif
  325. break;
  326. case ZJerk:
  327. #if HAS_CLASSIC_JERK
  328. planner.max_jerk[Z_AXIS] = atof(key_value);
  329. #endif
  330. break;
  331. case EJerk:
  332. #if HAS_CLASSIC_JERK
  333. planner.max_jerk[E_AXIS] = atof(key_value);
  334. #endif
  335. break;
  336. case Xstep:
  337. planner.settings.axis_steps_per_mm[X_AXIS] = atof(key_value);
  338. planner.refresh_positioning();
  339. break;
  340. case Ystep:
  341. planner.settings.axis_steps_per_mm[Y_AXIS] = atof(key_value);
  342. planner.refresh_positioning();
  343. break;
  344. case Zstep:
  345. planner.settings.axis_steps_per_mm[Z_AXIS] = atof(key_value);
  346. planner.refresh_positioning();
  347. break;
  348. case E0step:
  349. planner.settings.axis_steps_per_mm[E_AXIS] = atof(key_value);
  350. planner.refresh_positioning();
  351. break;
  352. case E1step:
  353. planner.settings.axis_steps_per_mm[E_AXIS_N(1)] = atof(key_value);
  354. planner.refresh_positioning();
  355. break;
  356. case Xcurrent:
  357. #if AXIS_IS_TMC(X)
  358. current_mA = atoi(key_value);
  359. stepperX.rms_current(current_mA);
  360. #endif
  361. break;
  362. case Ycurrent:
  363. #if AXIS_IS_TMC(Y)
  364. current_mA = atoi(key_value);
  365. stepperY.rms_current(current_mA);
  366. #endif
  367. break;
  368. case Zcurrent:
  369. #if AXIS_IS_TMC(Z)
  370. current_mA = atoi(key_value);
  371. stepperZ.rms_current(current_mA);
  372. #endif
  373. break;
  374. case E0current:
  375. #if AXIS_IS_TMC(E0)
  376. current_mA = atoi(key_value);
  377. stepperE0.rms_current(current_mA);
  378. #endif
  379. break;
  380. case E1current:
  381. #if AXIS_IS_TMC(E1)
  382. current_mA = atoi(key_value);
  383. stepperE1.rms_current(current_mA);
  384. #endif
  385. break;
  386. case pause_pos_x:
  387. gCfgItems.pausePosX = atof(key_value);
  388. update_spi_flash();
  389. break;
  390. case pause_pos_y:
  391. gCfgItems.pausePosY = atof(key_value);
  392. update_spi_flash();
  393. break;
  394. case pause_pos_z:
  395. gCfgItems.pausePosZ = atof(key_value);
  396. update_spi_flash();
  397. break;
  398. case level_pos_x1:
  399. gCfgItems.levelingPos[0][0] = atoi(key_value);
  400. update_spi_flash();
  401. break;
  402. case level_pos_y1:
  403. gCfgItems.levelingPos[0][1] = atoi(key_value);
  404. update_spi_flash();
  405. break;
  406. case level_pos_x2:
  407. gCfgItems.levelingPos[1][0] = atoi(key_value);
  408. update_spi_flash();
  409. break;
  410. case level_pos_y2:
  411. gCfgItems.levelingPos[1][1] = atoi(key_value);
  412. update_spi_flash();
  413. break;
  414. case level_pos_x3:
  415. gCfgItems.levelingPos[2][0] = atoi(key_value);
  416. update_spi_flash();
  417. break;
  418. case level_pos_y3:
  419. gCfgItems.levelingPos[2][1] = atoi(key_value);
  420. update_spi_flash();
  421. break;
  422. case level_pos_x4:
  423. gCfgItems.levelingPos[3][0] = atoi(key_value);
  424. update_spi_flash();
  425. break;
  426. case level_pos_y4:
  427. gCfgItems.levelingPos[3][1] = atoi(key_value);
  428. update_spi_flash();
  429. break;
  430. case level_pos_x5:
  431. gCfgItems.levelingPos[4][0] = atoi(key_value);
  432. update_spi_flash();
  433. break;
  434. case level_pos_y5:
  435. gCfgItems.levelingPos[4][1] = atoi(key_value);
  436. update_spi_flash();
  437. break;
  438. #if HAS_BED_PROBE
  439. case x_offset:
  440. #if HAS_PROBE_XY_OFFSET
  441. float x;
  442. x = atof(key_value);
  443. if (WITHIN(x, -(X_BED_SIZE), X_BED_SIZE))
  444. probe.offset.x = x;
  445. #endif
  446. break;
  447. case y_offset:
  448. #if HAS_PROBE_XY_OFFSET
  449. float y;
  450. y = atof(key_value);
  451. if (WITHIN(y, -(Y_BED_SIZE), Y_BED_SIZE))
  452. probe.offset.y = y;
  453. #endif
  454. break;
  455. case z_offset:
  456. float z;
  457. z = atof(key_value);
  458. if (WITHIN(z, Z_PROBE_OFFSET_RANGE_MIN, Z_PROBE_OFFSET_RANGE_MAX))
  459. probe.offset.z = z;
  460. break;
  461. #endif
  462. case load_length:
  463. gCfgItems.filamentchange_load_length = atoi(key_value);
  464. uiCfg.filament_loading_time = (uint32_t)((gCfgItems.filamentchange_load_length*60.0/gCfgItems.filamentchange_load_speed)+0.5);
  465. update_spi_flash();
  466. break;
  467. case load_speed:
  468. gCfgItems.filamentchange_load_speed = atoi(key_value);
  469. uiCfg.filament_loading_time = (uint32_t)((gCfgItems.filamentchange_load_length*60.0/gCfgItems.filamentchange_load_speed)+0.5);
  470. update_spi_flash();
  471. break;
  472. case unload_length:
  473. gCfgItems.filamentchange_unload_length = atoi(key_value);
  474. uiCfg.filament_unloading_time = (uint32_t)((gCfgItems.filamentchange_unload_length*60.0/gCfgItems.filamentchange_unload_speed)+0.5);
  475. update_spi_flash();
  476. break;
  477. case unload_speed:
  478. gCfgItems.filamentchange_unload_speed = atoi(key_value);
  479. uiCfg.filament_unloading_time = (uint32_t)((gCfgItems.filamentchange_unload_length*60.0/gCfgItems.filamentchange_unload_speed)+0.5);
  480. update_spi_flash();
  481. break;
  482. case filament_temp:
  483. gCfgItems.filament_limit_temp = atoi(key_value);
  484. update_spi_flash();
  485. break;
  486. case x_sensitivity:
  487. #if X_SENSORLESS
  488. stepperX.homing_threshold(atoi(key_value));
  489. #endif
  490. break;
  491. case y_sensitivity:
  492. #if Y_SENSORLESS
  493. stepperY.homing_threshold(atoi(key_value));
  494. #endif
  495. break;
  496. case z_sensitivity:
  497. #if Z_SENSORLESS
  498. stepperZ.homing_threshold(atoi(key_value));
  499. #endif
  500. break;
  501. case z2_sensitivity:
  502. #if Z2_SENSORLESS
  503. stepperZ2.homing_threshold(atoi(key_value));
  504. #endif
  505. break;
  506. }
  507. gcode.process_subcommands_now_P(PSTR("M500"));
  508. }
  509. static void event_handler(lv_obj_t *obj, lv_event_t event) {
  510. if (event != LV_EVENT_RELEASED) return;
  511. switch (obj->mks_obj_id) {
  512. case ID_NUM_KEY1:
  513. if (cnt <= 10) {
  514. key_value[cnt] = (char)'1';
  515. lv_label_set_text(labelValue, key_value);
  516. lv_obj_align(labelValue, buttonValue, LV_ALIGN_CENTER, 0, 0);
  517. cnt++;
  518. }
  519. break;
  520. case ID_NUM_KEY2:
  521. if (cnt <= 10) {
  522. key_value[cnt] = (char)'2';
  523. lv_label_set_text(labelValue, key_value);
  524. lv_obj_align(labelValue, buttonValue, LV_ALIGN_CENTER, 0, 0);
  525. cnt++;
  526. }
  527. break;
  528. case ID_NUM_KEY3:
  529. if (cnt <= 10) {
  530. key_value[cnt] = (char)'3';
  531. lv_label_set_text(labelValue, key_value);
  532. lv_obj_align(labelValue, buttonValue, LV_ALIGN_CENTER, 0, 0);
  533. cnt++;
  534. }
  535. break;
  536. case ID_NUM_KEY4:
  537. if (cnt <= 10) {
  538. key_value[cnt] = (char)'4';
  539. lv_label_set_text(labelValue, key_value);
  540. lv_obj_align(labelValue, buttonValue, LV_ALIGN_CENTER, 0, 0);
  541. cnt++;
  542. }
  543. break;
  544. case ID_NUM_KEY5:
  545. if (cnt <= 10) {
  546. key_value[cnt] = (char)'5';
  547. lv_label_set_text(labelValue, key_value);
  548. lv_obj_align(labelValue, buttonValue, LV_ALIGN_CENTER, 0, 0);
  549. cnt++;
  550. }
  551. break;
  552. case ID_NUM_KEY6:
  553. if (cnt <= 10) {
  554. key_value[cnt] = (char)'6';
  555. lv_label_set_text(labelValue, key_value);
  556. lv_obj_align(labelValue, buttonValue, LV_ALIGN_CENTER, 0, 0);
  557. cnt++;
  558. }
  559. break;
  560. case ID_NUM_KEY7:
  561. if (cnt <= 10) {
  562. key_value[cnt] = (char)'7';
  563. lv_label_set_text(labelValue, key_value);
  564. lv_obj_align(labelValue, buttonValue, LV_ALIGN_CENTER, 0, 0);
  565. cnt++;
  566. }
  567. break;
  568. case ID_NUM_KEY8:
  569. if (cnt <= 10) {
  570. key_value[cnt] = (char)'8';
  571. lv_label_set_text(labelValue, key_value);
  572. lv_obj_align(labelValue, buttonValue, LV_ALIGN_CENTER, 0, 0);
  573. cnt++;
  574. }
  575. break;
  576. case ID_NUM_KEY9:
  577. if (cnt <= 10) {
  578. key_value[cnt] = (char)'9';
  579. lv_label_set_text(labelValue, key_value);
  580. lv_obj_align(labelValue, buttonValue, LV_ALIGN_CENTER, 0, 0);
  581. cnt++;
  582. }
  583. break;
  584. case ID_NUM_KEY0:
  585. if (cnt <= 10) {
  586. key_value[cnt] = (char)'0';
  587. lv_label_set_text(labelValue, key_value);
  588. lv_obj_align(labelValue, buttonValue, LV_ALIGN_CENTER, 0, 0);
  589. cnt++;
  590. }
  591. break;
  592. case ID_NUM_BACK:
  593. if (cnt > 0) cnt--;
  594. if (key_value[cnt] == (char)'.') point_flag = true;
  595. key_value[cnt] = (char)'\0';
  596. lv_label_set_text(labelValue, key_value);
  597. lv_obj_align(labelValue, buttonValue, LV_ALIGN_CENTER, 0, 0);
  598. break;
  599. case ID_NUM_RESET:
  600. ZERO(key_value);
  601. cnt = 0;
  602. key_value[cnt] = (char)'0';
  603. point_flag = true;
  604. lv_label_set_text(labelValue, key_value);
  605. lv_obj_align(labelValue, buttonValue, LV_ALIGN_CENTER, 0, 0);
  606. break;
  607. case ID_NUM_POINT:
  608. if (cnt != 0 && point_flag) {
  609. point_flag = false;
  610. key_value[cnt] = (char)'.';
  611. lv_label_set_text(labelValue, key_value);
  612. lv_obj_align(labelValue, buttonValue, LV_ALIGN_CENTER, 0, 0);
  613. cnt++;
  614. }
  615. break;
  616. case ID_NUM_NEGATIVE:
  617. if (cnt == 0) {
  618. key_value[cnt] = (char)'-';
  619. lv_label_set_text(labelValue, key_value);
  620. lv_obj_align(labelValue, buttonValue, LV_ALIGN_CENTER, 0, 0);
  621. cnt++;
  622. }
  623. break;
  624. case ID_NUM_CONFIRM:
  625. last_disp_state = NUMBER_KEY_UI;
  626. if (strlen(key_value) != 0) set_value_confirm();
  627. lv_clear_number_key();
  628. draw_return_ui();
  629. break;
  630. }
  631. }
  632. void lv_draw_number_key() {
  633. scr = lv_screen_create(NUMBER_KEY_UI, "");
  634. buttonValue = lv_btn_create(scr, 92, 40, 296, 40, event_handler, ID_NUM_KEY1, &style_num_text);
  635. labelValue = lv_label_create_empty(buttonValue);
  636. lv_obj_t *NumberKey_1 = lv_btn_create(scr, 92, 90, 68, 40, event_handler, ID_NUM_KEY1, &style_num_key_pre);
  637. lv_obj_t *labelKey_1 = lv_label_create_empty(NumberKey_1);
  638. lv_label_set_text(labelKey_1, machine_menu.key_1);
  639. lv_obj_align(labelKey_1, NumberKey_1, LV_ALIGN_CENTER, 0, 0);
  640. lv_obj_t *NumberKey_2 = lv_btn_create(scr, 168, 90, 68, 40, event_handler, ID_NUM_KEY2, &style_num_key_pre);
  641. lv_obj_t *labelKey_2 = lv_label_create_empty(NumberKey_2);
  642. lv_label_set_text(labelKey_2, machine_menu.key_2);
  643. lv_obj_align(labelKey_2, NumberKey_2, LV_ALIGN_CENTER, 0, 0);
  644. lv_obj_t *NumberKey_3 = lv_btn_create(scr, 244, 90, 68, 40, event_handler, ID_NUM_KEY3, &style_num_key_pre);
  645. lv_obj_t *labelKey_3 = lv_label_create_empty(NumberKey_3);
  646. lv_label_set_text(labelKey_3, machine_menu.key_3);
  647. lv_obj_align(labelKey_3, NumberKey_3, LV_ALIGN_CENTER, 0, 0);
  648. lv_obj_t *NumberKey_4 = lv_btn_create(scr, 92, 140, 68, 40, event_handler, ID_NUM_KEY4, &style_num_key_pre);
  649. lv_obj_t *labelKey_4 = lv_label_create_empty(NumberKey_4);
  650. lv_label_set_text(labelKey_4, machine_menu.key_4);
  651. lv_obj_align(labelKey_4, NumberKey_4, LV_ALIGN_CENTER, 0, 0);
  652. lv_obj_t *NumberKey_5 = lv_btn_create(scr, 168, 140, 68, 40, event_handler, ID_NUM_KEY5, &style_num_key_pre);
  653. lv_obj_t *labelKey_5 = lv_label_create_empty(NumberKey_5);
  654. lv_label_set_text(labelKey_5, machine_menu.key_5);
  655. lv_obj_align(labelKey_5, NumberKey_5, LV_ALIGN_CENTER, 0, 0);
  656. lv_obj_t *NumberKey_6 = lv_btn_create(scr, 244, 140, 68, 40, event_handler, ID_NUM_KEY6, &style_num_key_pre);
  657. lv_obj_t *labelKey_6 = lv_label_create_empty(NumberKey_6);
  658. lv_label_set_text(labelKey_6, machine_menu.key_6);
  659. lv_obj_align(labelKey_6, NumberKey_6, LV_ALIGN_CENTER, 0, 0);
  660. lv_obj_t *NumberKey_7 = lv_btn_create(scr, 92, 190, 68, 40, event_handler, ID_NUM_KEY7, &style_num_key_pre);
  661. lv_obj_t *labelKey_7 = lv_label_create_empty(NumberKey_7);
  662. lv_label_set_text(labelKey_7, machine_menu.key_7);
  663. lv_obj_align(labelKey_7, NumberKey_7, LV_ALIGN_CENTER, 0, 0);
  664. lv_obj_t *NumberKey_8 = lv_btn_create(scr, 168, 190, 68, 40, event_handler, ID_NUM_KEY8, &style_num_key_pre);
  665. lv_obj_t *labelKey_8 = lv_label_create_empty(NumberKey_8);
  666. lv_label_set_text(labelKey_8, machine_menu.key_8);
  667. lv_obj_align(labelKey_8, NumberKey_8, LV_ALIGN_CENTER, 0, 0);
  668. lv_obj_t *NumberKey_9 = lv_btn_create(scr, 244, 190, 68, 40, event_handler, ID_NUM_KEY9, &style_num_key_pre);
  669. lv_obj_t *labelKey_9 = lv_label_create_empty(NumberKey_9);
  670. lv_label_set_text(labelKey_9, machine_menu.key_9);
  671. lv_obj_align(labelKey_9, NumberKey_9, LV_ALIGN_CENTER, 0, 0);
  672. lv_obj_t *NumberKey_0 = lv_btn_create(scr, 92, 240, 68, 40, event_handler, ID_NUM_KEY0, &style_num_key_pre);
  673. lv_obj_t *labelKey_0 = lv_label_create_empty(NumberKey_0);
  674. lv_label_set_text(labelKey_0, machine_menu.key_0);
  675. lv_obj_align(labelKey_0, NumberKey_0, LV_ALIGN_CENTER, 0, 0);
  676. lv_obj_t *KeyBack = lv_btn_create(scr, 320, 90, 68, 40, event_handler, ID_NUM_BACK, &style_num_key_pre);
  677. lv_obj_t *labelKeyBack = lv_label_create_empty(KeyBack);
  678. lv_label_set_text(labelKeyBack, machine_menu.key_back);
  679. lv_obj_align(labelKeyBack, KeyBack, LV_ALIGN_CENTER, 0, 0);
  680. lv_obj_t *KeyReset = lv_btn_create(scr, 320, 140, 68, 40, event_handler, ID_NUM_RESET, &style_num_key_pre);
  681. lv_obj_t *labelKeyReset = lv_label_create_empty(KeyReset);
  682. lv_label_set_text(labelKeyReset, machine_menu.key_reset);
  683. lv_obj_align(labelKeyReset, KeyReset, LV_ALIGN_CENTER, 0, 0);
  684. lv_obj_t *KeyConfirm = lv_btn_create(scr, 320, 190, 68, 90, event_handler, ID_NUM_CONFIRM, &style_num_key_pre);
  685. lv_obj_t *labelKeyConfirm = lv_label_create_empty(KeyConfirm);
  686. lv_label_set_text(labelKeyConfirm, machine_menu.key_confirm);
  687. lv_obj_align(labelKeyConfirm, KeyConfirm, LV_ALIGN_CENTER, 0, 0);
  688. lv_obj_t *KeyPoint = lv_btn_create(scr, 244, 240, 68, 40, event_handler, ID_NUM_POINT, &style_num_key_pre);
  689. lv_obj_t *labelKeyPoint = lv_label_create_empty(KeyPoint);
  690. lv_label_set_text(labelKeyPoint, machine_menu.key_point);
  691. lv_obj_align(labelKeyPoint, KeyPoint, LV_ALIGN_CENTER, 0, 0);
  692. lv_obj_t *Minus = lv_btn_create(scr, 168, 240, 68, 40, event_handler, ID_NUM_NEGATIVE, &style_num_key_pre);
  693. lv_obj_t *labelMinus = lv_label_create_empty(Minus);
  694. lv_label_set_text(labelMinus, machine_menu.negative);
  695. lv_obj_align(labelMinus, Minus, LV_ALIGN_CENTER, 0, 0);
  696. #if HAS_ROTARY_ENCODER
  697. if (gCfgItems.encoder_enable) {
  698. lv_group_add_obj(g, NumberKey_1);
  699. lv_group_add_obj(g, NumberKey_2);
  700. lv_group_add_obj(g, NumberKey_3);
  701. lv_group_add_obj(g, KeyBack);
  702. lv_group_add_obj(g, NumberKey_4);
  703. lv_group_add_obj(g, NumberKey_5);
  704. lv_group_add_obj(g, NumberKey_6);
  705. lv_group_add_obj(g, KeyReset);
  706. lv_group_add_obj(g, NumberKey_7);
  707. lv_group_add_obj(g, NumberKey_8);
  708. lv_group_add_obj(g, NumberKey_9);
  709. lv_group_add_obj(g, NumberKey_0);
  710. lv_group_add_obj(g, Minus);
  711. lv_group_add_obj(g, KeyPoint);
  712. lv_group_add_obj(g, KeyConfirm);
  713. }
  714. #endif
  715. disp_key_value();
  716. }
  717. void lv_clear_number_key() {
  718. #if HAS_ROTARY_ENCODER
  719. if (gCfgItems.encoder_enable) lv_group_remove_all_objs(g);
  720. #endif
  721. lv_obj_del(scr);
  722. }
  723. #endif // HAS_TFT_LVGL_UI