My Marlin configs for Fabrikator Mini and CTC i3 Pro B
選択できるのは25トピックまでです。 トピックは、先頭が英数字で、英数字とダッシュ('-')を使用した35文字以内のものにしてください。

status_screen.cpp 13KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413
  1. /*********************
  2. * status_screen.cpp *
  3. *********************/
  4. /****************************************************************************
  5. * Written By Mark Pelletier 2017 - Aleph Objects, Inc. *
  6. * Written By Marcio Teixeira 2018 - Aleph Objects, Inc. *
  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. * To view a copy of the GNU General Public License, go to the following *
  19. * location: <http://www.gnu.org/licenses/>. *
  20. ****************************************************************************/
  21. #include "../config.h"
  22. #if ENABLED(TOUCH_UI_FTDI_EVE) && NONE(TOUCH_UI_LULZBOT_BIO, TOUCH_UI_COCOA_PRESS)
  23. #include "screens.h"
  24. #include "screen_data.h"
  25. #include "../archim2-flash/flash_storage.h"
  26. using namespace FTDI;
  27. using namespace Theme;
  28. #ifdef TOUCH_UI_PORTRAIT
  29. #define GRID_ROWS 8
  30. #else
  31. #define GRID_ROWS 8
  32. #endif
  33. void StatusScreen::draw_axis_position(draw_mode_t what) {
  34. CommandProcessor cmd;
  35. #define GRID_COLS 3
  36. if (what & BACKGROUND) {
  37. cmd.tag(6)
  38. #ifdef TOUCH_UI_PORTRAIT
  39. .fgcolor(Theme::axis_label)
  40. .font(Theme::font_large)
  41. .button( BTN_POS(1,5), BTN_SIZE(2,1), F(""), OPT_FLAT)
  42. .button( BTN_POS(1,6), BTN_SIZE(2,1), F(""), OPT_FLAT)
  43. .button( BTN_POS(1,7), BTN_SIZE(2,1), F(""), OPT_FLAT)
  44. .font(Theme::font_small)
  45. .text ( BTN_POS(1,5), BTN_SIZE(1,1), GET_TEXT_F(MSG_AXIS_X))
  46. .text ( BTN_POS(1,6), BTN_SIZE(1,1), GET_TEXT_F(MSG_AXIS_Y))
  47. .text ( BTN_POS(1,7), BTN_SIZE(1,1), GET_TEXT_F(MSG_AXIS_Z))
  48. .font(Theme::font_medium)
  49. .fgcolor(Theme::x_axis) .button( BTN_POS(2,5), BTN_SIZE(2,1), F(""), OPT_FLAT)
  50. .fgcolor(Theme::y_axis) .button( BTN_POS(2,6), BTN_SIZE(2,1), F(""), OPT_FLAT)
  51. .fgcolor(Theme::z_axis) .button( BTN_POS(2,7), BTN_SIZE(2,1), F(""), OPT_FLAT);
  52. #else
  53. .fgcolor(Theme::axis_label)
  54. .font(Theme::font_large)
  55. .button( BTN_POS(1,5), BTN_SIZE(1,2), F(""), OPT_FLAT)
  56. .button( BTN_POS(2,5), BTN_SIZE(1,2), F(""), OPT_FLAT)
  57. .button( BTN_POS(3,5), BTN_SIZE(1,2), F(""), OPT_FLAT)
  58. .font(Theme::font_small)
  59. .text ( BTN_POS(1,5), BTN_SIZE(1,1), GET_TEXT_F(MSG_AXIS_X))
  60. .text ( BTN_POS(2,5), BTN_SIZE(1,1), GET_TEXT_F(MSG_AXIS_Y))
  61. .text ( BTN_POS(3,5), BTN_SIZE(1,1), GET_TEXT_F(MSG_AXIS_Z))
  62. .font(Theme::font_medium)
  63. .fgcolor(Theme::x_axis) .button( BTN_POS(1,6), BTN_SIZE(1,1), F(""), OPT_FLAT)
  64. .fgcolor(Theme::y_axis) .button( BTN_POS(2,6), BTN_SIZE(1,1), F(""), OPT_FLAT)
  65. .fgcolor(Theme::z_axis) .button( BTN_POS(3,6), BTN_SIZE(1,1), F(""), OPT_FLAT);
  66. #endif
  67. }
  68. if (what & FOREGROUND) {
  69. using namespace ExtUI;
  70. char x_str[15];
  71. char y_str[15];
  72. char z_str[15];
  73. if (isAxisPositionKnown(X))
  74. format_position(x_str, getAxisPosition_mm(X));
  75. else
  76. strcpy_P(x_str, PSTR("?"));
  77. if (isAxisPositionKnown(Y))
  78. format_position(y_str, getAxisPosition_mm(Y));
  79. else
  80. strcpy_P(y_str, PSTR("?"));
  81. if (isAxisPositionKnown(Z))
  82. format_position(z_str, getAxisPosition_mm(Z));
  83. else
  84. strcpy_P(z_str, PSTR("?"));
  85. cmd.tag(6).font(Theme::font_medium)
  86. #ifdef TOUCH_UI_PORTRAIT
  87. .text ( BTN_POS(2,5), BTN_SIZE(2,1), x_str)
  88. .text ( BTN_POS(2,6), BTN_SIZE(2,1), y_str)
  89. .text ( BTN_POS(2,7), BTN_SIZE(2,1), z_str);
  90. #else
  91. .text ( BTN_POS(1,6), BTN_SIZE(1,1), x_str)
  92. .text ( BTN_POS(2,6), BTN_SIZE(1,1), y_str)
  93. .text ( BTN_POS(3,6), BTN_SIZE(1,1), z_str);
  94. #endif
  95. }
  96. #undef GRID_COLS
  97. }
  98. #ifdef TOUCH_UI_PORTRAIT
  99. #define GRID_COLS 8
  100. #else
  101. #define GRID_COLS 12
  102. #endif
  103. void StatusScreen::draw_temperature(draw_mode_t what) {
  104. using namespace Theme;
  105. CommandProcessor cmd;
  106. if (what & BACKGROUND) {
  107. cmd.font(Theme::font_small)
  108. #ifdef TOUCH_UI_PORTRAIT
  109. .tag(5)
  110. .fgcolor(temp) .button( BTN_POS(1,1), BTN_SIZE(4,2), F(""), OPT_FLAT)
  111. .button( BTN_POS(1,1), BTN_SIZE(8,1), F(""), OPT_FLAT)
  112. .fgcolor(fan_speed) .button( BTN_POS(5,2), BTN_SIZE(4,1), F(""), OPT_FLAT)
  113. .tag(0)
  114. .fgcolor(progress) .button( BTN_POS(1,3), BTN_SIZE(4,1), F(""), OPT_FLAT)
  115. .button( BTN_POS(5,3), BTN_SIZE(4,1), F(""), OPT_FLAT);
  116. #else
  117. .tag(5)
  118. .fgcolor(temp) .button( BTN_POS(1,1), BTN_SIZE(4,2), F(""), OPT_FLAT)
  119. .button( BTN_POS(1,1), BTN_SIZE(8,1), F(""), OPT_FLAT)
  120. .fgcolor(fan_speed) .button( BTN_POS(5,2), BTN_SIZE(4,1), F(""), OPT_FLAT)
  121. .tag(0)
  122. .fgcolor(progress) .button( BTN_POS(9,1), BTN_SIZE(4,1), F(""), OPT_FLAT)
  123. .button( BTN_POS(9,2), BTN_SIZE(4,1), F(""), OPT_FLAT);
  124. #endif
  125. // Draw Extruder Bitmap on Extruder Temperature Button
  126. cmd.tag(5)
  127. .cmd(BITMAP_SOURCE(Extruder_Icon_Info))
  128. .cmd(BITMAP_LAYOUT(Extruder_Icon_Info))
  129. .cmd(BITMAP_SIZE (Extruder_Icon_Info))
  130. .icon (BTN_POS(1,1), BTN_SIZE(1,1), Extruder_Icon_Info, icon_scale)
  131. .icon (BTN_POS(5,1), BTN_SIZE(1,1), Extruder_Icon_Info, icon_scale);
  132. // Draw Bed Heat Bitmap on Bed Heat Button
  133. cmd.cmd(BITMAP_SOURCE(Bed_Heat_Icon_Info))
  134. .cmd(BITMAP_LAYOUT(Bed_Heat_Icon_Info))
  135. .cmd(BITMAP_SIZE (Bed_Heat_Icon_Info))
  136. .icon (BTN_POS(1,2), BTN_SIZE(1,1), Bed_Heat_Icon_Info, icon_scale);
  137. // Draw Fan Percent Bitmap on Bed Heat Button
  138. cmd.cmd(BITMAP_SOURCE(Fan_Icon_Info))
  139. .cmd(BITMAP_LAYOUT(Fan_Icon_Info))
  140. .cmd(BITMAP_SIZE (Fan_Icon_Info))
  141. .icon (BTN_POS(5,2), BTN_SIZE(1,1), Fan_Icon_Info, icon_scale);
  142. #ifdef TOUCH_UI_USE_UTF8
  143. load_utf8_bitmaps(cmd); // Restore font bitmap handles
  144. #endif
  145. }
  146. if (what & FOREGROUND) {
  147. using namespace ExtUI;
  148. char e0_str[20];
  149. char e1_str[20];
  150. char bed_str[20];
  151. char fan_str[20];
  152. sprintf_P(
  153. fan_str,
  154. PSTR("%-3d %%"),
  155. int8_t(getActualFan_percent(FAN0))
  156. );
  157. if (isHeaterIdle(BED))
  158. format_temp_and_idle(bed_str, getActualTemp_celsius(BED));
  159. else
  160. format_temp_and_temp(bed_str, getActualTemp_celsius(BED), getTargetTemp_celsius(BED));
  161. if (isHeaterIdle(H0))
  162. format_temp_and_idle(e0_str, getActualTemp_celsius(H0));
  163. else
  164. format_temp_and_temp(e0_str, getActualTemp_celsius(H0), getTargetTemp_celsius(H0));
  165. #if EXTRUDERS == 2
  166. if (isHeaterIdle(H1))
  167. format_temp_and_idle(e1_str, getActualTemp_celsius(H1));
  168. else
  169. format_temp_and_temp(e1_str, getActualTemp_celsius(H1), getTargetTemp_celsius(H1));
  170. #else
  171. strcpy_P(
  172. e1_str,
  173. PSTR("-")
  174. );
  175. #endif
  176. cmd.tag(5)
  177. .font(font_medium)
  178. .text(BTN_POS(2,1), BTN_SIZE(3,1), e0_str)
  179. .text(BTN_POS(6,1), BTN_SIZE(3,1), e1_str)
  180. .text(BTN_POS(2,2), BTN_SIZE(3,1), bed_str)
  181. .text(BTN_POS(6,2), BTN_SIZE(3,1), fan_str);
  182. }
  183. }
  184. void StatusScreen::draw_progress(draw_mode_t what) {
  185. using namespace ExtUI;
  186. using namespace Theme;
  187. CommandProcessor cmd;
  188. if (what & BACKGROUND) {
  189. cmd.tag(0).font(font_medium)
  190. #ifdef TOUCH_UI_PORTRAIT
  191. .fgcolor(progress) .button(BTN_POS(1,3), BTN_SIZE(4,1), F(""), OPT_FLAT)
  192. .button(BTN_POS(5,3), BTN_SIZE(4,1), F(""), OPT_FLAT);
  193. #else
  194. .fgcolor(progress) .button(BTN_POS(9,1), BTN_SIZE(4,1), F(""), OPT_FLAT)
  195. .button(BTN_POS(9,2), BTN_SIZE(4,1), F(""), OPT_FLAT);
  196. #endif
  197. }
  198. if (what & FOREGROUND) {
  199. const uint32_t elapsed = getProgress_seconds_elapsed();
  200. const uint8_t hrs = elapsed/3600;
  201. const uint8_t min = (elapsed/60)%60;
  202. char time_str[10];
  203. char progress_str[10];
  204. sprintf_P(time_str, PSTR(" %02d : %02d"), hrs, min);
  205. sprintf_P(progress_str, PSTR("%-3d %%"), getProgress_percent() );
  206. cmd.font(font_medium)
  207. #ifdef TOUCH_UI_PORTRAIT
  208. .tag(0).text(BTN_POS(1,3), BTN_SIZE(4,1), time_str)
  209. .text(BTN_POS(5,3), BTN_SIZE(4,1), progress_str);
  210. #else
  211. .tag(0).text(BTN_POS(9,1), BTN_SIZE(4,1), time_str)
  212. .text(BTN_POS(9,2), BTN_SIZE(4,1), progress_str);
  213. #endif
  214. }
  215. }
  216. #undef GRID_COLS
  217. void StatusScreen::draw_interaction_buttons(draw_mode_t what) {
  218. #define GRID_COLS 4
  219. if (what & FOREGROUND) {
  220. using namespace ExtUI;
  221. const bool has_media = isMediaInserted() && !isPrintingFromMedia();
  222. CommandProcessor cmd;
  223. cmd.colors(normal_btn)
  224. .font(Theme::font_medium)
  225. .enabled(has_media)
  226. .colors(has_media ? action_btn : normal_btn)
  227. .tag(3).button(
  228. #ifdef TOUCH_UI_PORTRAIT
  229. BTN_POS(1,8), BTN_SIZE(2,1),
  230. #else
  231. BTN_POS(1,7), BTN_SIZE(2,2),
  232. #endif
  233. isPrintingFromMedia() ? GET_TEXT_F(MSG_PRINTING) : GET_TEXT_F(MSG_BUTTON_MEDIA)
  234. ).colors(!has_media ? action_btn : normal_btn)
  235. #ifdef TOUCH_UI_PORTRAIT
  236. .tag(4).button( BTN_POS(3,8), BTN_SIZE(2,1), GET_TEXT_F(MSG_BUTTON_MENU));
  237. #else
  238. .tag(4).button( BTN_POS(3,7), BTN_SIZE(2,2), GET_TEXT_F(MSG_BUTTON_MENU));
  239. #endif
  240. }
  241. #undef GRID_COLS
  242. }
  243. void StatusScreen::draw_status_message(draw_mode_t what, const char* message) {
  244. #define GRID_COLS 1
  245. if (what & BACKGROUND) {
  246. CommandProcessor cmd;
  247. cmd.fgcolor(Theme::status_msg)
  248. .tag(0)
  249. #ifdef TOUCH_UI_PORTRAIT
  250. .button( BTN_POS(1,4), BTN_SIZE(1,1), F(""), OPT_FLAT);
  251. #else
  252. .button( BTN_POS(1,3), BTN_SIZE(1,2), F(""), OPT_FLAT);
  253. #endif
  254. draw_text_box(cmd,
  255. #ifdef TOUCH_UI_PORTRAIT
  256. BTN_POS(1,4), BTN_SIZE(1,1),
  257. #else
  258. BTN_POS(1,3), BTN_SIZE(1,2),
  259. #endif
  260. message, OPT_CENTER, font_large);
  261. }
  262. #undef GRID_COLS
  263. }
  264. void StatusScreen::setStatusMessage(progmem_str message) {
  265. char buff[strlen_P((const char * const)message)+1];
  266. strcpy_P(buff, (const char * const) message);
  267. setStatusMessage((const char *) buff);
  268. }
  269. void StatusScreen::setStatusMessage(const char* message) {
  270. CommandProcessor cmd;
  271. cmd.cmd(CMD_DLSTART)
  272. .cmd(CLEAR_COLOR_RGB(Theme::bg_color))
  273. .cmd(CLEAR(true,true,true));
  274. draw_temperature(BACKGROUND);
  275. draw_progress(BACKGROUND);
  276. draw_axis_position(BACKGROUND);
  277. draw_status_message(BACKGROUND, message);
  278. draw_interaction_buttons(BACKGROUND);
  279. storeBackground();
  280. #if ENABLED(TOUCH_UI_DEBUG)
  281. SERIAL_ECHO_START();
  282. SERIAL_ECHOLNPAIR("New status message: ", message);
  283. #endif
  284. if (AT_SCREEN(StatusScreen)) {
  285. current_screen.onRefresh();
  286. }
  287. }
  288. void StatusScreen::loadBitmaps() {
  289. // Load the bitmaps for the status screen
  290. using namespace Theme;
  291. constexpr uint32_t base = ftdi_memory_map::RAM_G;
  292. CLCD::mem_write_pgm(base + TD_Icon_Info.RAMG_offset, TD_Icon, sizeof(TD_Icon));
  293. CLCD::mem_write_pgm(base + Extruder_Icon_Info.RAMG_offset, Extruder_Icon, sizeof(Extruder_Icon));
  294. CLCD::mem_write_pgm(base + Bed_Heat_Icon_Info.RAMG_offset, Bed_Heat_Icon, sizeof(Bed_Heat_Icon));
  295. CLCD::mem_write_pgm(base + Fan_Icon_Info.RAMG_offset, Fan_Icon, sizeof(Fan_Icon));
  296. // Load fonts for internationalization
  297. #ifdef TOUCH_UI_USE_UTF8
  298. load_utf8_data(base + UTF8_FONT_OFFSET);
  299. #endif
  300. }
  301. void StatusScreen::onStartup() {
  302. UIFlashStorage::initialize();
  303. }
  304. void StatusScreen::onRedraw(draw_mode_t what) {
  305. if (what & FOREGROUND) {
  306. draw_temperature(FOREGROUND);
  307. draw_progress(FOREGROUND);
  308. draw_axis_position(FOREGROUND);
  309. draw_interaction_buttons(FOREGROUND);
  310. }
  311. }
  312. void StatusScreen::onEntry() {
  313. onRefresh();
  314. }
  315. void StatusScreen::onIdle() {
  316. if (refresh_timer.elapsed(STATUS_UPDATE_INTERVAL)) {
  317. onRefresh();
  318. refresh_timer.start();
  319. }
  320. BaseScreen::onIdle();
  321. }
  322. bool StatusScreen::onTouchEnd(uint8_t tag) {
  323. using namespace ExtUI;
  324. switch (tag) {
  325. case 3: GOTO_SCREEN(FilesScreen); break;
  326. case 4:
  327. if (isPrinting()) {
  328. GOTO_SCREEN(TuneMenu);
  329. } else {
  330. GOTO_SCREEN(MainMenu);
  331. }
  332. break;
  333. case 5: GOTO_SCREEN(TemperatureScreen); break;
  334. case 6:
  335. if (!isPrinting()) {
  336. GOTO_SCREEN(MoveAxisScreen);
  337. }
  338. break;
  339. default:
  340. return true;
  341. }
  342. // If a passcode is enabled, the LockScreen will prevent the
  343. // user from proceeding.
  344. LockScreen::check_passcode();
  345. return true;
  346. }
  347. #endif // TOUCH_UI_FTDI_EVE