diff --git a/Marlin/Configuration.h b/Marlin/Configuration.h index ab112894b1..3f9b6174c2 100644 --- a/Marlin/Configuration.h +++ b/Marlin/Configuration.h @@ -2395,6 +2395,10 @@ //#define TFT_COLOR_UI //#define TFT_LVGL_UI +#if ENABLED(TFT_LVGL_UI) + //#define MKS_WIFI_MODULE // MKS WiFi module +#endif + /** * TFT Rotation. Set to one of the following values: * diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_cloud_bind.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_cloud_bind.cpp new file mode 100644 index 0000000000..9eaf4d29df --- /dev/null +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_cloud_bind.cpp @@ -0,0 +1,205 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ +#include "../../../../inc/MarlinConfigPre.h" + +#if BOTH(HAS_TFT_LVGL_UI, MKS_WIFI_MODULE) + +#include "lv_conf.h" +#include "draw_ui.h" + +#include "../../../../MarlinCore.h" +#include "../../../../module/temperature.h" + +#include "QR_Encode.h" + +extern lv_group_t * g; +static lv_obj_t * scr; +static lv_obj_t *button_bind_or_not = NULL, *label_bind_or_not = NULL; +static lv_obj_t *buttonReleaseBind = NULL, *label_ReleaseBind = NULL; +static lv_obj_t * text_id; + +static uint8_t unbinding_flag = 0; +static uint8_t id_mark = 0; + +#define ID_CLOUD_BIND_RETURN 1 +#define ID_CLOUD_BIND_OR_NOT 2 +#define ID_CLOUD_RELEASE_BIND 3 + +static void event_handler(lv_obj_t * obj, lv_event_t event) { + if (event != LV_EVENT_RELEASED) return; + switch (obj->mks_obj_id) { + case ID_CLOUD_BIND_RETURN: + clear_cur_ui(); + draw_return_ui(); + break; + case ID_CLOUD_RELEASE_BIND: + if (cloud_para.state == 0x12) { + clear_cur_ui(); + lv_draw_dialog(DIALOG_TYPE_UNBIND); + } + break; + } +} + +void lv_draw_cloud_bind(void) { + lv_obj_t *buttonBack = NULL, *label_Back = NULL; + scr = lv_screen_create(BIND_UI); + + button_bind_or_not = lv_btn_create(scr, NULL); + lv_obj_set_pos(button_bind_or_not, TFT_WIDTH - 130, TFT_HEIGHT - 80 * 3); + lv_obj_set_size(button_bind_or_not, PARA_UI_VALUE_BTN_X_SIZE + 15, PARA_UI_VALUE_BTN_Y_SIZE + 15); + lv_obj_set_event_cb_mks(button_bind_or_not, event_handler, ID_CLOUD_BIND_OR_NOT, NULL, 0); + lv_btn_set_style(button_bind_or_not, LV_BTN_STYLE_REL, &style_para_value); + lv_btn_set_style(button_bind_or_not, LV_BTN_STYLE_PR, &style_para_value); + label_bind_or_not = lv_label_create_empty(button_bind_or_not); + + buttonReleaseBind = lv_btn_create(scr, NULL); + lv_obj_set_pos(buttonReleaseBind, TFT_WIDTH - 130, TFT_HEIGHT - 80 * 2); + lv_obj_set_size(buttonReleaseBind, PARA_UI_VALUE_BTN_X_SIZE + 15, PARA_UI_VALUE_BTN_Y_SIZE + 15); + lv_obj_set_event_cb_mks(buttonReleaseBind, event_handler, ID_CLOUD_RELEASE_BIND, NULL, 0); + label_ReleaseBind = lv_label_create_empty(buttonReleaseBind); + lv_label_set_text(label_ReleaseBind, cloud_menu.unbind); + lv_obj_align(label_ReleaseBind, buttonReleaseBind, LV_ALIGN_CENTER, 0, 0); + + buttonBack = lv_btn_create(scr, NULL); + lv_obj_set_pos(buttonBack, TFT_WIDTH - 130, TFT_HEIGHT - 80); + lv_obj_set_size(buttonBack, PARA_UI_VALUE_BTN_X_SIZE + 15, PARA_UI_VALUE_BTN_Y_SIZE + 15); + lv_obj_set_event_cb_mks(buttonBack, event_handler, ID_CLOUD_BIND_RETURN, NULL, 0); + lv_btn_set_style(buttonBack, LV_BTN_STYLE_REL, &style_para_back); + lv_btn_set_style(buttonBack, LV_BTN_STYLE_PR, &style_para_back); + label_Back = lv_label_create_empty(buttonBack); + lv_label_set_text(label_Back, common_menu.text_back); + lv_obj_align(label_Back, buttonBack, LV_ALIGN_CENTER, 0, 0); + + #if BUTTONS_EXIST(EN1, EN2, ENC) + if (gCfgItems.encoder_enable) { + lv_group_add_obj(g, buttonReleaseBind); + lv_group_add_obj(g, buttonBack); + } + #endif + + text_id = lv_label_create_empty(scr); + lv_obj_set_pos(text_id, 50, 60 + 200 + 20); + lv_obj_set_style(text_id, &tft_style_label_rel); + lv_label_set_text(text_id, (char *)cloud_para.id); + + id_mark = 0; + + disp_bind_state(); +} + +void disp_bind_state() { + if (cloud_para.state != 0x12) + unbinding_flag = 0; + + if (unbinding_flag) { + lv_label_set_text(label_bind_or_not, cloud_menu.unbinding); + lv_obj_align(label_bind_or_not, button_bind_or_not, LV_ALIGN_CENTER, 0, 0); + lv_btn_set_style(buttonReleaseBind, LV_BTN_STYLE_REL, &style_para_value); + lv_btn_set_style(buttonReleaseBind, LV_BTN_STYLE_PR, &style_para_value); + } + else { + if (cloud_para.state == 0x10) { + lv_label_set_text(label_bind_or_not, cloud_menu.disconnected); + lv_obj_align(label_bind_or_not, button_bind_or_not, LV_ALIGN_CENTER, 0, 0); + } + else if (cloud_para.state == 0x11) { + lv_label_set_text(label_bind_or_not, cloud_menu.unbinded); + lv_obj_align(label_bind_or_not, button_bind_or_not, LV_ALIGN_CENTER, 0, 0); + } + else if (cloud_para.state == 0x12) { + lv_label_set_text(label_bind_or_not, cloud_menu.binded); + lv_obj_align(label_bind_or_not, button_bind_or_not, LV_ALIGN_CENTER, 0, 0); + } + else { + lv_label_set_text(label_bind_or_not, cloud_menu.disable); + lv_obj_align(label_bind_or_not, button_bind_or_not, LV_ALIGN_CENTER, 0, 0); + } + } + + if (cloud_para.state == 0x12 && !unbinding_flag) { + lv_btn_set_style(buttonReleaseBind, LV_BTN_STYLE_REL, &style_para_back); + lv_btn_set_style(buttonReleaseBind, LV_BTN_STYLE_PR, &style_para_back); + } + else { + lv_btn_set_style(buttonReleaseBind, LV_BTN_STYLE_REL, &style_para_value); + lv_btn_set_style(buttonReleaseBind, LV_BTN_STYLE_PR, &style_para_value); + } +} + +static char last_cloud_state = 0; +void refresh_bind_ui() { + if ((last_cloud_state != cloud_para.state) || unbinding_flag) { + disp_bind_state(); + last_cloud_state = cloud_para.state; + } + if (cloud_para.id[0]) { + if (!id_mark) { + display_qrcode((uint8_t *)cloud_para.id); + lv_label_set_text(text_id, (char *)cloud_para.id); + } + } + else + id_mark = 0; +} + +void display_qrcode(uint8_t *qrcode_data) { + uint8_t i, j; + uint16_t x, y, p; + + if (!id_mark) { + EncodeData((char *)qrcode_data); + id_mark = 1; + } + + lv_fill_rect(10, QRCODE_Y, 300, QRCODE_Y + 300, LV_COLOR_WHITE); + + if (m_nSymbleSize * 2 > QRCODE_WIDTH) return; + + for (i = 0; i < 40; i++) + if ((m_nSymbleSize * i * 2) > QRCODE_WIDTH) break; + + p = (i - 1) * 2; + + x = QRCODE_X + 70; + y = QRCODE_Y + 70; + + for (i = 0; i < m_nSymbleSize; i++) + for (j = 0; j < m_nSymbleSize; j++) + if (m_byModuleData[i][j] == 1) + lv_fill_rect(x + p * i, y + p * j, x + p * (i + 1) - 1, y + p * (j + 1) - 1, LV_COLOR_BACKGROUND); +} + +void cloud_unbind() { + package_to_wifi(WIFI_CLOUD_UNBIND, (uint8_t *)0, 0); + unbinding_flag = 1; +} + +void lv_clear_cloud_bind() { + #if BUTTONS_EXIST(EN1, EN2, ENC) + if (gCfgItems.encoder_enable) + lv_group_remove_all_objs(g); + #endif + lv_obj_del(scr); +} + +#endif // HAS_TFT_LVGL_UI diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_cloud_bind.h b/Marlin/src/lcd/extui/lib/mks_ui/draw_cloud_bind.h new file mode 100644 index 0000000000..f0f354a065 --- /dev/null +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_cloud_bind.h @@ -0,0 +1,37 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ +#pragma once + +#ifdef __cplusplus +extern "C" { /* C-declarations for C++ */ +#endif + +extern void lv_draw_cloud_bind(void); +extern void lv_clear_cloud_bind(); +extern void disp_bind_state(); +extern void refresh_bind_ui(); +extern void display_qrcode(uint8_t *qrcode_data); +extern void cloud_unbind(); + +#ifdef __cplusplus +} /* C-declarations for C++ */ +#endif diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_dialog.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_dialog.cpp index 55a0e695fe..e2a24f78e1 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_dialog.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_dialog.cpp @@ -172,6 +172,17 @@ static void btn_ok_event_cb(lv_obj_t *btn, lv_event_t event) { clear_cur_ui(); draw_return_ui(); } + #if ENABLED(MKS_WIFI_MODULE) + else if (DIALOG_IS(TYPE_UNBIND)) { + cloud_unbind(); + clear_cur_ui(); + draw_return_ui(); + } + #endif + else { + clear_cur_ui(); + draw_return_ui(); + } } static void btn_cancel_event_cb(lv_obj_t *btn, lv_event_t event) { @@ -246,6 +257,9 @@ void lv_draw_dialog(uint8_t type) { lv_label_set_text(labelOk, print_file_dialog_menu.confirm); } } + else if (DIALOG_IS(TYPE_UPDATE_ESP_FIRMARE)) { + // nothing to do + } #endif else if (DIALOG_IS(TYPE_FILAMENT_LOAD_HEAT, TYPE_FILAMENT_UNLOAD_HEAT)) { btnCancel = lv_button_btn_create(scr, BTN_OK_X+90, BTN_OK_Y, 100, 50, btn_cancel_event_cb); @@ -412,6 +426,10 @@ void lv_draw_dialog(uint8_t type) { lv_obj_align(labelDialog, nullptr, LV_ALIGN_CENTER, 0, -20); } } + else if (DIALOG_IS(TYPE_UPDATE_ESP_FIRMARE)) { + lv_label_set_text(labelDialog, DIALOG_UPDATE_WIFI_FIRMWARE_EN); + lv_obj_align(labelDialog, NULL, LV_ALIGN_CENTER, 0, -20); + } #endif // MKS_WIFI_MODULE else if (DIALOG_IS(TYPE_FILAMENT_LOAD_HEAT)) { lv_label_set_text(labelDialog, filament_menu.filament_dialog_load_heat); @@ -445,6 +463,12 @@ void lv_draw_dialog(uint8_t type) { lv_label_set_text(labelDialog, filament_menu.filament_dialog_unloading); lv_obj_align(labelDialog, nullptr, LV_ALIGN_CENTER, 0, -70); } + #if ENABLED(MKS_WIFI_MODULE) + else if (DIALOG_IS(TYPE_UNBIND)) { + lv_label_set_text(labelDialog, common_menu.unbind_printer_tips); + lv_obj_align(labelDialog, NULL, LV_ALIGN_CENTER, 0, -70); + } + #endif #if HAS_ROTARY_ENCODER if (gCfgItems.encoder_enable) { if (btnOk) lv_group_add_obj(g, btnOk); diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_home.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_home.cpp index e0ef10a728..5e5b5f36a0 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_home.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_home.cpp @@ -66,8 +66,8 @@ static void event_handler(lv_obj_t *obj, lv_event_t event) { queue.inject_P(PSTR("M84 X Y")); break; case ID_H_RETURN: - lv_clear_home(); - lv_draw_tool(); + clear_cur_ui(); + draw_return_ui(); break; } } diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_keyboard.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_keyboard.cpp index 749738f6ea..ee219d5d0d 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_keyboard.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_keyboard.cpp @@ -55,13 +55,13 @@ static const lv_btnm_ctrl_t kb_ctrl_uc_map[] = { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, LV_KB_CTRL_BTN_FLAGS | 2, 2, 6, 2, LV_KB_CTRL_BTN_FLAGS | 2}; -static const char * kb_map_spec[] = {"0", "1", "2", "3", "4" ,"5", "6", "7", "8", "9", LV_SYMBOL_BACKSPACE, "\n", +static const char * kb_map_spec[] = {"0", "1", "2", "3", "4" ,"5", "6", "7", "8", "9", ".", LV_SYMBOL_BACKSPACE, "\n", "abc", "+", "-", "/", "*", "=", "%", "!", "?", "#", "<", ">", "\n", "\\", "@", "$", "(", ")", "{", "}", "[", "]", ";", "\"", "'", "\n", LV_SYMBOL_CLOSE, LV_SYMBOL_LEFT, " ", LV_SYMBOL_RIGHT, LV_SYMBOL_OK, ""}; static const lv_btnm_ctrl_t kb_ctrl_spec_map[] = { - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, LV_KB_CTRL_BTN_FLAGS | 2, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, LV_KB_CTRL_BTN_FLAGS | 2, LV_KB_CTRL_BTN_FLAGS | 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, LV_KB_CTRL_BTN_FLAGS | 2, 2, 6, 2, LV_KB_CTRL_BTN_FLAGS | 2}; diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_more.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_more.cpp new file mode 100644 index 0000000000..f718e62589 --- /dev/null +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_more.cpp @@ -0,0 +1,209 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ +#include "../../../../inc/MarlinConfigPre.h" + +#if HAS_TFT_LVGL_UI + +#include "../../../../MarlinCore.h" +#include "draw_ready_print.h" +#include "draw_set.h" +#include "lv_conf.h" +#include "draw_ui.h" +#include "../../../../gcode/queue.h" + +extern lv_group_t * g; +static lv_obj_t * scr; + +#define ID_CUSTOM_1 1 +#define ID_CUSTOM_2 2 +#define ID_CUSTOM_3 3 +#define ID_CUSTOM_4 4 +#define ID_CUSTOM_5 5 +#define ID_CUSTOM_6 6 +#define ID_CUSTOM_7 7 +#define ID_M_RETURN 8 + +static void event_handler(lv_obj_t * obj, lv_event_t event) { + if (event != LV_EVENT_RELEASED) return; + switch (obj->mks_obj_id) { + #if ENABLED(USER_CMD_1_ENABLE) + case ID_CUSTOM_1: + queue.inject_P(PSTR(USER_GCODE_1)); + break; + #endif + #if ENABLED(USER_CMD_2_ENABLE) + case ID_CUSTOM_2: + queue.inject_P(PSTR(USER_GCODE_2)); + break; + #endif + #if ENABLED(USER_CMD_3_ENABLE) + case ID_CUSTOM_3: + queue.inject_P(PSTR(USER_GCODE_3)); + break; + #endif + #if ENABLED(USER_CMD_4_ENABLE) + case ID_CUSTOM_4: + queue.inject_P(PSTR(USER_GCODE_4)); + break; + #endif + #if ENABLED(USER_CMD_5_ENABLE) + case ID_CUSTOM_5: + queue.inject_P(PSTR(USER_GCODE_5)); + break; + #endif + #if ENABLED(USER_CMD_6_ENABLE) + case ID_CUSTOM_6: + queue.inject_P(PSTR(USER_GCODE_6)); + break; + #endif + #if ENABLED(USER_CMD_7_ENABLE) + case ID_CUSTOM_7: + queue.inject_P(PSTR(USER_GCODE_7)); + break; + #endif + case ID_M_RETURN: + lv_clear_more(); + lv_draw_tool(); + break; + } +} + +void lv_draw_more(void) { + scr = lv_screen_create(MORE_UI); + + const bool enc_ena = TERN0(HAS_ROTARY_ENCODER, gCfgItems.encoder_enable); + + #if ENABLED(USER_CMD_1_ENABLE) + lv_obj_t *buttonCustom1 = lv_imgbtn_create(scr, "F:/bmp_custom1.bin", INTERVAL_V, titleHeight, event_handler, ID_CUSTOM_1); + if (enc_ena) lv_group_add_obj(g, buttonCustom1); + lv_obj_t *labelCustom1 = lv_label_create_empty(buttonCustom1); + #endif + + #if ENABLED(USER_CMD_2_ENABLE) + lv_obj_t *buttonCustom2 = lv_imgbtn_create(scr, "F:/bmp_custom2.bin", BTN_X_PIXEL + INTERVAL_V * 2, titleHeight, event_handler, ID_CUSTOM_2); + if (enc_ena) lv_group_add_obj(g, buttonCustom2); + lv_obj_t *labelCustom2 = lv_label_create_empty(buttonCustom2); + #endif + + #if ENABLED(USER_CMD_3_ENABLE) + lv_obj_t *buttonCustom3 = lv_imgbtn_create(scr, "F:/bmp_custom3.bin", BTN_X_PIXEL * 2 + INTERVAL_V * 3, titleHeight, event_handler, ID_CUSTOM_3); + if (enc_ena) lv_group_add_obj(g, buttonCustom3); + lv_obj_t *labelCustom3 = lv_label_create_empty(buttonCustom3); + #endif + + #if ENABLED(USER_CMD_4_ENABLE) + lv_obj_t *buttonCustom4 = lv_imgbtn_create(scr, "F:/bmp_custom4.bin", BTN_X_PIXEL * 3 + INTERVAL_V * 4, titleHeight, event_handler, ID_CUSTOM_4); + if (enc_ena) lv_group_add_obj(g, buttonCustom4); + lv_obj_t *labelCustom4 = lv_label_create_empty(buttonCustom4); + #endif + + #if ENABLED(USER_CMD_5_ENABLE) + lv_obj_t *buttonCustom5 = lv_imgbtn_create(scr, "F:/bmp_custom5.bin", INTERVAL_V, BTN_Y_PIXEL + INTERVAL_H + titleHeight, event_handler, ID_CUSTOM_5); + if (enc_ena) lv_group_add_obj(g, buttonCustom5); + lv_obj_t *labelCustom5 = lv_label_create_empty(buttonCustom5); + #endif + + #if ENABLED(USER_CMD_6_ENABLE) + lv_obj_t *buttonCustom6 = lv_imgbtn_create(scr, "F:/bmp_custom6.bin", BTN_X_PIXEL + INTERVAL_V * 2, BTN_Y_PIXEL + INTERVAL_H + titleHeight, event_handler, ID_CUSTOM_6); + if (enc_ena) lv_group_add_obj(g, buttonCustom6); + lv_obj_t *labelCustom6 = lv_label_create_empty(buttonCustom6); + #endif + + #if ENABLED(USER_CMD_7_ENABLE) + blv_obj_t *uttonCustom7 = lv_imgbtn_create(scr, "F:/bmp_custom7.bin", BTN_X_PIXEL * 2 + INTERVAL_V * 3, BTN_Y_PIXEL + INTERVAL_H + titleHeight, event_handler, ID_CUSTOM_7); + if (enc_ena) lv_group_add_obj(g, buttonCustom7); + lv_obj_t *labelCustom7 = lv_label_create_empty(buttonCustom7); + #endif + + lv_obj_t *buttonBack = lv_imgbtn_create(scr, "F:/bmp_return.bin", BTN_X_PIXEL * 3 + INTERVAL_V * 4, BTN_Y_PIXEL + INTERVAL_H + titleHeight, event_handler, ID_M_RETURN); + if (enc_ena) lv_group_add_obj(g, buttonBack); + lv_obj_t *label_Back = lv_label_create_empty(buttonBack); + + if (gCfgItems.multiple_language != 0) { + #if ENABLED(USER_CMD_1_ENABLE) + lv_label_set_text(labelCustom1, more_menu.custom1); + lv_obj_align(labelCustom1, buttonCustom1, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); + #endif + #if ENABLED(USER_CMD_2_ENABLE) + lv_label_set_text(labelCustom2, more_menu.custom2); + lv_obj_align(labelCustom2, buttonCustom2, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); + #endif + #if ENABLED(USER_CMD_3_ENABLE) + lv_label_set_text(labelCustom3, more_menu.custom3); + lv_obj_align(labelCustom3, buttonCustom3, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); + #endif + #if ENABLED(USER_CMD_4_ENABLE) + lv_label_set_text(labelCustom4, more_menu.custom4); + lv_obj_align(labelCustom4, buttonCustom4, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); + #endif + #if ENABLED(USER_CMD_5_ENABLE) + lv_label_set_text(labelCustom5, more_menu.custom5); + lv_obj_align(labelCustom5, buttonCustom5, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); + #endif + #if ENABLED(USER_CMD_6_ENABLE) + lv_label_set_text(labelCustom6, more_menu.custom6); + lv_obj_align(labelCustom6, buttonCustom6, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); + #endif + #if ENABLED(USER_CMD_7_ENABLE) + lv_label_set_text(labelCustom7, more_menu.custom7); + lv_obj_align(labelCustom7, buttonCustom7, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); + #endif + lv_label_set_text(label_Back, common_menu.text_back); + lv_obj_align(label_Back, buttonBack, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); + } + + #if BUTTONS_EXIST(EN1, EN2, ENC) + if (enc_ena) { + #if ENABLED(USER_CMD_1_ENABLE) + lv_group_add_obj(g, buttonCustom1); + #endif + #if ENABLED(USER_CMD_2_ENABLE) + lv_group_add_obj(g, buttonCustom2); + #endif + #if ENABLED(USER_CMD_3_ENABLE) + lv_group_add_obj(g, buttonCustom3); + #endif + #if ENABLED(USER_CMD_4_ENABLE) + lv_group_add_obj(g, buttonCustom4); + #endif + #if ENABLED(USER_CMD_5_ENABLE) + lv_group_add_obj(g, buttonCustom5); + #endif + #if ENABLED(USER_CMD_6_ENABLE) + lv_group_add_obj(g, buttonCustom6); + #endif + #if ENABLED(USER_CMD_7_ENABLE) + lv_group_add_obj(g, buttonCustom7); + #endif + lv_group_add_obj(g, buttonBack); + } + #endif +} + +void lv_clear_more() { + #if BUTTONS_EXIST(EN1, EN2, ENC) + if (gCfgItems.encoder_enable) lv_group_remove_all_objs(g); + #endif + lv_obj_del(scr); +} + +#endif // HAS_TFT_LVGL_UI diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_more.h b/Marlin/src/lcd/extui/lib/mks_ui/draw_more.h new file mode 100644 index 0000000000..9dfa705c8e --- /dev/null +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_more.h @@ -0,0 +1,33 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ +#pragma once + +#ifdef __cplusplus +extern "C" { /* C-declarations for C++ */ +#endif + +extern void lv_draw_more(void); +extern void lv_clear_more(); + +#ifdef __cplusplus +} /* C-declarations for C++ */ +#endif diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_move_motor.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_move_motor.cpp index 6c0198d9c0..ce240bf16d 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_move_motor.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_move_motor.cpp @@ -27,12 +27,18 @@ #include #include "../../../../gcode/queue.h" +#include "../../../../module/motion.h" #include "../../../../inc/MarlinConfig.h" extern lv_group_t *g; static lv_obj_t *scr; -static lv_obj_t *labelV, *buttonV; +static lv_obj_t *labelV, *buttonV, *labelP; +static lv_task_t *updatePosTask; +static char cur_label = 'Z'; +static float cur_pos = 0; + +void disp_cur_pos(); enum { ID_M_X_P = 1, @@ -47,67 +53,41 @@ enum { static void event_handler(lv_obj_t *obj, lv_event_t event) { if (event != LV_EVENT_RELEASED) return; + if (queue.length <= (BUFSIZE - 3)) { + float dist = uiCfg.move_dist; + switch (obj->mks_obj_id) { + case ID_M_X_N: dist *= -1; case ID_M_X_P: cur_label = 'X'; break; + case ID_M_Y_N: dist *= -1; case ID_M_Y_P: cur_label = 'Y'; break; + case ID_M_Z_N: dist *= -1; case ID_M_Z_P: cur_label = 'Z'; break; + } + sprintf_P(public_buf_l, PSTR("G91\nG1 %c%3.1f F%d\nG90"), cur_label, dist, uiCfg.moveSpeed); + queue.inject(public_buf_l); + } + switch (obj->mks_obj_id) { - case ID_M_X_P: - if (queue.length <= (BUFSIZE - 3)) { - queue.enqueue_one_P(PSTR("G91")); - sprintf_P(public_buf_l, PSTR("G1 X%3.1f F%d"), uiCfg.move_dist, uiCfg.moveSpeed); - queue.enqueue_one_now(public_buf_l); - queue.enqueue_one_P(PSTR("G90")); - } - break; - case ID_M_X_N: - if (queue.length <= (BUFSIZE - 3)) { - queue.enqueue_now_P(PSTR("G91")); - sprintf_P(public_buf_l, PSTR("G1 X-%3.1f F%d"), uiCfg.move_dist, uiCfg.moveSpeed); - queue.enqueue_one_now(public_buf_l); - queue.enqueue_now_P(PSTR("G90")); - } - break; - case ID_M_Y_P: - if (queue.length <= (BUFSIZE - 3)) { - queue.enqueue_now_P(PSTR("G91")); - sprintf_P(public_buf_l, PSTR("G1 Y%3.1f F%d"), uiCfg.move_dist, uiCfg.moveSpeed); - queue.enqueue_one_now(public_buf_l); - queue.enqueue_now_P(PSTR("G90")); - } - break; - case ID_M_Y_N: - if (queue.length <= (BUFSIZE - 3)) { - queue.enqueue_now_P(PSTR("G91")); - sprintf_P(public_buf_l, PSTR("G1 Y-%3.1f F%d"), uiCfg.move_dist, uiCfg.moveSpeed); - queue.enqueue_one_now(public_buf_l); - queue.enqueue_now_P(PSTR("G90")); - } - break; - case ID_M_Z_P: - if (queue.length <= (BUFSIZE - 3)) { - queue.enqueue_now_P(PSTR("G91")); - sprintf_P(public_buf_l, PSTR("G1 Z%3.1f F%d"), uiCfg.move_dist, uiCfg.moveSpeed); - queue.enqueue_one_now(public_buf_l); - queue.enqueue_now_P(PSTR("G90")); - } - break; - case ID_M_Z_N: - if (queue.length <= (BUFSIZE - 3)) { - queue.enqueue_now_P(PSTR("G91")); - sprintf_P(public_buf_l, PSTR("G1 Z-%3.1f F%d"), uiCfg.move_dist, uiCfg.moveSpeed); - queue.enqueue_one_now(public_buf_l); - queue.enqueue_now_P(PSTR("G90")); - } - break; case ID_M_STEP: if (abs(10 * (int)uiCfg.move_dist) == 100) uiCfg.move_dist = 0.1; else - uiCfg.move_dist *= (float)10; + uiCfg.move_dist *= 10.0f; disp_move_dist(); break; case ID_M_RETURN: clear_cur_ui(); draw_return_ui(); - break; + return; } + disp_cur_pos(); +} + +void refresh_pos(lv_task_t *) { + switch (cur_label) { + case 'X': cur_pos = current_position.x; break; + case 'Y': cur_pos = current_position.y; break; + case 'Z': cur_pos = current_position.z; break; + default: return; + } + disp_cur_pos(); } void lv_draw_move_motor(void) { @@ -124,19 +104,28 @@ void lv_draw_move_motor(void) { buttonV = lv_imgbtn_create(scr, nullptr, BTN_X_PIXEL * 3 + INTERVAL_V * 4, titleHeight, event_handler, ID_M_STEP); labelV = lv_label_create_empty(buttonV); #if HAS_ROTARY_ENCODER - if (gCfgItems.encoder_enable) { - lv_group_add_obj(g, buttonV); - } + if (gCfgItems.encoder_enable) lv_group_add_obj(g, buttonV); #endif lv_big_button_create(scr, "F:/bmp_return.bin", common_menu.text_back, BTN_X_PIXEL * 3 + INTERVAL_V * 4, BTN_Y_PIXEL + INTERVAL_H + titleHeight, event_handler, ID_M_RETURN); + // We need to patch the title to leave some space on the right for displaying the status + lv_obj_t * title = lv_obj_get_child_back(scr, NULL); + if (title != NULL) lv_obj_set_width(title, TFT_WIDTH - 101); + labelP = lv_label_create(scr, TFT_WIDTH - 100, TITLE_YPOS, "Z:0.0mm"); + if (labelP != NULL) + updatePosTask = lv_task_create(refresh_pos, 300, LV_TASK_PRIO_LOWEST, 0); + disp_move_dist(); + disp_cur_pos(); } -void disp_move_dist() { - // char buf[30] = {0}; +void disp_cur_pos() { + sprintf_P(public_buf_l, PSTR("%c:%3.1fmm"), cur_label, cur_pos); + if (labelP) lv_label_set_text(labelP, public_buf_l); +} +void disp_move_dist() { if ((int)(10 * uiCfg.move_dist) == 1) lv_imgbtn_set_src_both(buttonV, "F:/bmp_step_move0_1.bin"); else if ((int)(10 * uiCfg.move_dist) == 10) @@ -164,6 +153,7 @@ void lv_clear_move_motor() { #if HAS_ROTARY_ENCODER if (gCfgItems.encoder_enable) lv_group_remove_all_objs(g); #endif + lv_task_del(updatePosTask); lv_obj_del(scr); } diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_ui.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_ui.cpp index ffbaba4ea5..bb6e9419f0 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_ui.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_ui.cpp @@ -138,12 +138,10 @@ void gCfgItems_init() { gCfgItems.levelingPos[3][1] = Y_MAX_POS - 30; gCfgItems.levelingPos[4][0] = X_BED_SIZE / 2; gCfgItems.levelingPos[4][1] = Y_BED_SIZE / 2; - gCfgItems.cloud_enable = true; - #if ENABLED(MKS_WIFI_MODULE) - gCfgItems.wifi_mode_sel = STA_MODEL; - gCfgItems.fileSysType = FILE_SYS_SD; - gCfgItems.wifi_type = ESP_WIFI; - #endif + gCfgItems.cloud_enable = false; + gCfgItems.wifi_mode_sel = STA_MODEL; + gCfgItems.fileSysType = FILE_SYS_SD; + gCfgItems.wifi_type = ESP_WIFI; gCfgItems.filamentchange_load_length = 200; gCfgItems.filamentchange_load_speed = 1000; gCfgItems.filamentchange_unload_length = 200; @@ -449,6 +447,7 @@ void titleText_cat(char *str, int strSize, char *addPart) { char *getDispText(int index) { + ZERO(public_buf_l); switch (disp_state_stack._disp_state[index]) { case PRINT_READY_UI: @@ -593,7 +592,9 @@ char *creat_title_text() { if (strlen(public_buf_m) > MAX_TITLE_LEN) { ZERO(public_buf_m); - tmpText = getDispText(0); + tmpText = 0; + for (index = 0; index <= disp_state_stack._disp_index && (!tmpText || *tmpText == 0); index++) + tmpText = getDispText(index); if (*tmpText != 0) { titleText_cat(public_buf_m, sizeof(public_buf_m), tmpText); titleText_cat(public_buf_m, sizeof(public_buf_m), (char *)">...>"); @@ -639,253 +640,97 @@ char *creat_title_text() { #endif } - #if 1 - - void gcode_preview(char *path, int xpos_pixel, int ypos_pixel) { - #if ENABLED(SDSUPPORT) - //uint8_t ress; - //uint32_t write; - volatile uint32_t i, j; - volatile uint16_t *p_index; - //int res; - char *cur_name; - - cur_name = strrchr(path, '/'); - card.openFileRead(cur_name); - - if (gPicturePreviewStart <= 0) { - while (1) { - uint32_t br = card.read(public_buf, 400); - uint32_t* p1 = (uint32_t *)strstr((char *)public_buf, ";gimage:"); - if (p1) { - gPicturePreviewStart += (uint32_t)p1 - (uint32_t)((uint32_t *)(&public_buf[0])); - break; - } - else { - gPicturePreviewStart += br; - } - if (br < 400) break; - } - } - - card.setIndex((gPicturePreviewStart + To_pre_view) + size * row + 8); - SPI_TFT.setWindow(xpos_pixel, ypos_pixel + row, 200, 1); + void gcode_preview(char *path, int xpos_pixel, int ypos_pixel) { + #if ENABLED(SDSUPPORT) + volatile uint32_t i, j; + volatile uint16_t *p_index; + char *cur_name; - j = i = 0; + cur_name = strrchr(path, '/'); + card.openFileRead(cur_name); + if (gPicturePreviewStart <= 0) { while (1) { - card.read(public_buf, 400); - for (i = 0; i < 400;) { - bmp_public_buf[j] = ascii2dec_test((char*)&public_buf[i]) << 4 | ascii2dec_test((char*)&public_buf[i + 1]); - i += 2; - j++; - } - if (j >= 400) break; - } - for (i = 0; i < 400; i += 2) { - p_index = (uint16_t *)(&bmp_public_buf[i]); - if (*p_index == 0x0000) *p_index = LV_COLOR_BACKGROUND.full; - } - SPI_TFT.tftio.WriteSequence((uint16_t*)bmp_public_buf, 200); - #if HAS_BAK_VIEW_IN_FLASH - W25QXX.init(SPI_QUARTER_SPEED); - if (row < 20) W25QXX.SPI_FLASH_SectorErase(BAK_VIEW_ADDR_TFT35 + row * 4096); - W25QXX.SPI_FLASH_BufferWrite(bmp_public_buf, BAK_VIEW_ADDR_TFT35 + row * 400, 400); - #endif - row++; - if (row >= 200) { - size = 809; - row = 0; - - gcode_preview_over = false; - //flash_preview_begin = true; - - card.closefile(); - - /* - if (gCurFileState.file_open_flag != 0xAA) { - reset_file_info(); - res = f_open(file, curFileName, FA_OPEN_EXISTING | FA_READ); - if (res == FR_OK) { - f_lseek(file,PREVIEW_SIZE+To_pre_view); - gCurFileState.file_open_flag = 0xAA; - //bakup_file_path((uint8_t *)curFileName, strlen(curFileName)); - srcfp = file; - mksReprint.mks_printer_state = MKS_WORKING; - once_flag = false; - } - } - */ - char *cur_name; - - cur_name = strrchr(list_file.file_name[sel_id], '/'); - - SdFile file; - SdFile *curDir; - card.endFilePrint(); - const char * const fname = card.diveToFile(true, curDir, cur_name); - if (!fname) return; - if (file.open(curDir, fname, O_READ)) { - gCfgItems.curFilesize = file.fileSize(); - file.close(); - update_spi_flash(); + uint32_t br = card.read(public_buf, 400); + uint32_t* p1 = (uint32_t *)strstr((char *)public_buf, ";gimage:"); + if (p1) { + gPicturePreviewStart += (uint32_t)p1 - (uint32_t)((uint32_t *)(&public_buf[0])); + break; } - - card.openFileRead(cur_name); - if (card.isFileOpen()) { - feedrate_percentage = 100; - //saved_feedrate_percentage = feedrate_percentage; - planner.flow_percentage[0] = 100; - planner.e_factor[0] = planner.flow_percentage[0] * 0.01; - #if HAS_MULTI_EXTRUDER - planner.flow_percentage[1] = 100; - planner.e_factor[1] = planner.flow_percentage[1] * 0.01; - #endif - card.startFileprint(); - TERN_(POWER_LOSS_RECOVERY, recovery.prepare()); - once_flag = false; + else { + gPicturePreviewStart += br; } - return; + if (br < 400) break; } - card.closefile(); - #endif // SDSUPPORT - } - - #else // if 1 - - void gcode_preview(char *path, int xpos_pixel, int ypos_pixel) { - #if ENABLED(SDSUPPORT) - //uint8_t ress; - //uint32_t write; - volatile uint32_t i, j; - volatile uint16_t *p_index; - //int res; - char *cur_name; - uint16_t Color; - - cur_name = strrchr(path, '/'); - card.openFileRead(cur_name); - - card.setIndex((PREVIEW_LITTLE_PIC_SIZE + To_pre_view) + size * row + 8); - #if HAS_TFT_LVGL_UI_SPI - SPI_TFT.setWindow(xpos_pixel, ypos_pixel + row, 200, 1); - #else - LCD_setWindowArea(xpos_pixel, ypos_pixel + row, 200, 1); - LCD_WriteRAM_Prepare(); - #endif - - j = 0; - i = 0; + } - while (1) { - card.read(public_buf, 400); - for (i = 0; i < 400;) { - bmp_public_buf[j] = ascii2dec_test((char*)&public_buf[i]) << 4 | ascii2dec_test((char*)&public_buf[i + 1]); - i += 2; - j++; - } + card.setIndex(gPicturePreviewStart + size * row + 8); + SPI_TFT.setWindow(xpos_pixel, ypos_pixel + row, 200, 1); - //if (i > 800) break; - //#ifdef TFT70 - // if (j > 400) { - // f_read(file, buff_pic, 1, &read); - // break; - // } - //#elif defined(TFT35) - if (j >= 400) - //f_read(file, buff_pic, 1, &read); - break; - //#endif + j = i = 0; + while (1) { + card.read(public_buf, 400); + for (i = 0; i < 400;) { + bmp_public_buf[j] = ascii2dec_test((char*)&public_buf[i]) << 4 | ascii2dec_test((char*)&public_buf[i + 1]); + i += 2; + j++; } - #if HAS_TFT_LVGL_UI_SPI - for (i = 0; i < 400;) { - p_index = (uint16_t *)(&bmp_public_buf[i]); - - Color = (*p_index >> 8); - *p_index = Color | ((*p_index & 0xFF) << 8); - i += 2; - if (*p_index == 0x0000) *p_index = 0xC318; - } - TFT_CS_L; - TFT_DC_H; - SPI.dmaSend(bmp_public_buf, 400, true); - TFT_CS_H; - - #else - for (i = 0; i < 400;) { - p_index = (uint16_t *)(&bmp_public_buf[i]); - if (*p_index == 0x0000) *p_index = 0x18C3; - LCD_IO_WriteData(*p_index); - i = i + 2; - } - #endif + if (j >= 400) break; + } + for (i = 0; i < 400; i += 2) { + p_index = (uint16_t *)(&bmp_public_buf[i]); + if (*p_index == 0x0000) *p_index = LV_COLOR_BACKGROUND.full; + } + SPI_TFT.tftio.WriteSequence((uint16_t*)bmp_public_buf, 200); + #if HAS_BAK_VIEW_IN_FLASH W25QXX.init(SPI_QUARTER_SPEED); - if (row < 20) - W25QXX.SPI_FLASH_SectorErase(BAK_VIEW_ADDR_TFT35 + row * 4096); + if (row < 20) W25QXX.SPI_FLASH_SectorErase(BAK_VIEW_ADDR_TFT35 + row * 4096); W25QXX.SPI_FLASH_BufferWrite(bmp_public_buf, BAK_VIEW_ADDR_TFT35 + row * 400, 400); - row++; - if (row >= 200) { - size = 809; - row = 0; - - gcode_preview_over = false; - //flash_preview_begin = true; - - card.closefile(); - - /* - if (gCurFileState.file_open_flag != 0xAA) { - reset_file_info(); - res = f_open(file, curFileName, FA_OPEN_EXISTING | FA_READ); - if (res == FR_OK) { - f_lseek(file,PREVIEW_SIZE+To_pre_view); - gCurFileState.file_open_flag = 0xAA; - //bakup_file_path((uint8_t *)curFileName, strlen(curFileName)); - srcfp = file; - mksReprint.mks_printer_state = MKS_WORKING; - once_flag = false; - } - } - */ - char *cur_name; - - cur_name = strrchr(list_file.file_name[sel_id], '/'); - - SdFile file; - SdFile *curDir; - card.endFilePrint(); - const char * const fname = card.diveToFile(true, curDir, cur_name); - if (!fname) return; - if (file.open(curDir, fname, O_READ)) { - gCfgItems.curFilesize = file.fileSize(); - file.close(); - update_spi_flash(); - } + #endif + row++; + if (row >= 200) { + size = 809; + row = 0; + + gcode_preview_over = false; - card.openFileRead(cur_name); - if (card.isFileOpen()) { - feedrate_percentage = 100; - //saved_feedrate_percentage = feedrate_percentage; - planner.flow_percentage[0] = 100; - planner.e_factor[0] = planner.flow_percentage[0] * 0.01; - #if HAS_MULTI_EXTRUDER - planner.flow_percentage[1] = 100; - planner.e_factor[1] = planner.flow_percentage[1] * 0.01; - #endif - card.startFileprint(); - TERN_(POWER_LOSS_RECOVERY, recovery.prepare()); - once_flag = false; - } - return; - } card.closefile(); - #endif // SDSUPPORT - } + char *cur_name; - #endif // if 1 + cur_name = strrchr(list_file.file_name[sel_id], '/'); + + SdFile file; + SdFile *curDir; + card.endFilePrint(); + const char * const fname = card.diveToFile(true, curDir, cur_name); + if (!fname) return; + if (file.open(curDir, fname, O_READ)) { + gCfgItems.curFilesize = file.fileSize(); + file.close(); + update_spi_flash(); + } - void Draw_default_preview(int xpos_pixel, int ypos_pixel, uint8_t sel) { + card.openFileRead(cur_name); + if (card.isFileOpen()) { + feedrate_percentage = 100; + planner.flow_percentage[0] = 100; + planner.e_factor[0] = planner.flow_percentage[0] * 0.01; + #if HAS_MULTI_EXTRUDER + planner.flow_percentage[1] = 100; + planner.e_factor[1] = planner.flow_percentage[1] * 0.01; + #endif + card.startFileprint(); + TERN_(POWER_LOSS_RECOVERY, recovery.prepare()); + once_flag = false; + } + return; + } + card.closefile(); + #endif // SDSUPPORT + } + + void draw_default_preview(int xpos_pixel, int ypos_pixel, uint8_t sel) { int index; int y_off = 0; W25QXX.init(SPI_QUARTER_SPEED); @@ -914,12 +759,12 @@ char *creat_title_text() { #if HAS_BAK_VIEW_IN_FLASH if (flash_preview_begin) { flash_preview_begin = false; - Draw_default_preview(xpos_pixel, ypos_pixel, 1); + draw_default_preview(xpos_pixel, ypos_pixel, 1); } #endif #if HAS_GCODE_DEFAULT_VIEW_IN_FLASH if (default_preview_flg) { - Draw_default_preview(xpos_pixel, ypos_pixel, 0); + draw_default_preview(xpos_pixel, ypos_pixel, 0); default_preview_flg = false; } #endif @@ -1005,12 +850,11 @@ void GUI_RefreshPage() { temps_update_flag = false; } break; - #endif - - case BIND_UI: - /*refresh_bind_ui();*/ - break; + case BIND_UI: + refresh_bind_ui(); + break; + #endif case FILAMENTCHANGE_UI: if (temps_update_flag) { temps_update_flag = false; @@ -1097,8 +941,7 @@ void clear_cur_ui() { last_disp_state = disp_state_stack._disp_state[disp_state_stack._disp_index]; switch (disp_state_stack._disp_state[disp_state_stack._disp_index]) { - case PRINT_READY_UI: - lv_clear_ready_print(); break; + case PRINT_READY_UI: lv_clear_ready_print(); break; case PRINT_FILE_UI: lv_clear_print_file(); break; case PRINTING_UI: lv_clear_printing(); break; case MOVE_MOTOR_UI: lv_clear_move_motor(); break; @@ -1119,14 +962,16 @@ void clear_cur_ui() { #if ENABLED(MKS_WIFI_MODULE) case WIFI_UI: lv_clear_wifi(); break; #endif - case MORE_UI: /* Clear_more(); */ break; + case MORE_UI: lv_clear_more(); break; case FILETRANSFER_UI: break; case DIALOG_UI: lv_clear_dialog(); break; case FILETRANSFERSTATE_UI: break; case PRINT_MORE_UI: break; case FILAMENTCHANGE_UI: lv_clear_filament_change(); break; case LEVELING_UI: lv_clear_manualLevel(); break; - case BIND_UI: /* Clear_Bind(); */ break; + #if ENABLED(MKS_WIFI_MODULE) + case BIND_UI: lv_clear_cloud_bind(); break; + #endif #if HAS_BED_PROBE case NOZZLE_PROBE_OFFSET_UI: lv_clear_auto_level_offset_settings(); break; #endif @@ -1224,11 +1069,13 @@ void draw_return_ui() { #if ENABLED(MKS_WIFI_MODULE) case WIFI_UI: lv_draw_wifi(); break; #endif - case PRINT_MORE_UI: /* draw_printmore(); */ break; case MORE_UI: break; + case PRINT_MORE_UI: lv_draw_more(); break; case FILAMENTCHANGE_UI: lv_draw_filament_change(); break; case LEVELING_UI: lv_draw_manualLevel(); break; - case BIND_UI: /* draw_bind(); */ break; + #if ENABLED(MKS_WIFI_MODULE) + case BIND_UI: lv_draw_cloud_bind(); break; + #endif #if HAS_BED_PROBE case NOZZLE_PROBE_OFFSET_UI: lv_draw_auto_level_offset_settings(); break; #endif diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_ui.h b/Marlin/src/lcd/extui/lib/mks_ui/draw_ui.h index c911e9a6fd..68ef59728e 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_ui.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_ui.h @@ -46,6 +46,7 @@ #include "draw_preHeat.h" #include "draw_extrusion.h" #include "draw_home.h" +#include "draw_more.h" #include "draw_move_motor.h" #include "draw_fan.h" #include "draw_about.h" @@ -76,6 +77,8 @@ #include "draw_keyboard.h" #include "draw_encoder_settings.h" +#include "../../inc/MarlinConfigPre.h" + #if ENABLED(MKS_WIFI_MODULE) #include "wifiSerial.h" #include "wifi_module.h" @@ -84,11 +87,15 @@ #include "draw_wifi.h" #include "draw_wifi_list.h" #include "draw_wifi_tips.h" + #include "draw_cloud_bind.h" #endif -#include "../../../../inc/MarlinConfigPre.h" -#define FILE_SYS_USB 0 -#define FILE_SYS_SD 1 +#define ESP_WIFI 0x02 +#define AP_MODEL 0x01 +#define STA_MODEL 0x02 + +#define FILE_SYS_USB 0 +#define FILE_SYS_SD 1 #define TICK_CYCLE 1 @@ -157,6 +164,10 @@ #define PARA_UI_BACK_BTN_X_SIZE 70 #define PARA_UI_BACK_BTN_Y_SIZE 40 + #define QRCODE_X 20 + #define QRCODE_Y 40 + #define QRCODE_WIDTH 160 + #else // ifdef TFT35 #define TFT_WIDTH 320 @@ -237,6 +248,7 @@ typedef struct { float desireSprayerTempBak; float current_x_position_bak; float current_y_position_bak; + float current_z_position_bak; float current_e_position_bak; } UI_CFG; diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_wifi.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_wifi.cpp index 8dc6beb130..d52d508eb3 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_wifi.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_wifi.cpp @@ -41,60 +41,64 @@ enum { static void event_handler(lv_obj_t *obj, lv_event_t event) { if (event != LV_EVENT_RELEASED) return; + clear_cur_ui(); switch (obj->mks_obj_id) { case ID_W_RETURN: - clear_cur_ui(); lv_draw_set(); break; case ID_W_CLOUD: - //clear_cur_ui(); - //draw_return_ui(); - break; - case ID_W_RECONNECT: - clear_cur_ui(); - lv_draw_wifi_list(); + lv_draw_cloud_bind(); break; + #if ENABLED(MKS_WIFI_MODULE) + case ID_W_RECONNECT: { + uint8_t cmd_wifi_list[] = { 0xA5, 0x07, 0x00, 0x00, 0xFC }; + raw_send_to_wifi(cmd_wifi_list, COUNT(cmd_wifi_list)); + lv_draw_wifi_list(); + } break; + #endif } } void lv_draw_wifi(void) { scr = lv_screen_create(WIFI_UI); - // Create an Image button - lv_obj_t *buttonBack = lv_imgbtn_create(scr, "F:/bmp_return.bin", BTN_X_PIXEL * 3 + INTERVAL_V * 4, BTN_Y_PIXEL + INTERVAL_H + titleHeight, event_handler, ID_W_RETURN); - #if HAS_ROTARY_ENCODER - if (gCfgItems.encoder_enable) lv_group_add_obj(g, buttonBack); - #endif - lv_obj_t *label_Back = lv_label_create_empty(buttonBack); - lv_obj_t *buttonReconnect = nullptr, *label_Reconnect = nullptr; + lv_obj_t *buttonCloud = nullptr, *label_Cloud = nullptr; + + const bool enc_ena = TERN0(HAS_ROTARY_ENCODER, gCfgItems.encoder_enable); if (gCfgItems.wifi_mode_sel == STA_MODEL) { - buttonReconnect = lv_imgbtn_create(scr, nullptr); + if (gCfgItems.cloud_enable) + buttonCloud = lv_imgbtn_create(scr, "F:/bmp_cloud.bin", BTN_X_PIXEL+INTERVAL_V*2, BTN_Y_PIXEL + INTERVAL_H + titleHeight, event_handler, ID_W_CLOUD); - lv_obj_set_event_cb_mks(buttonReconnect, event_handler, ID_W_RECONNECT, "", 0); - lv_imgbtn_set_src_both(buttonReconnect, "F:/bmp_wifi.bin"); - lv_imgbtn_use_label_style(buttonReconnect); + buttonReconnect = lv_imgbtn_create(scr, "F:/bmp_wifi.bin", BTN_X_PIXEL * 2 + INTERVAL_V * 3, BTN_Y_PIXEL + INTERVAL_H + titleHeight, event_handler, ID_W_RECONNECT); #if HAS_ROTARY_ENCODER - if (gCfgItems.encoder_enable) lv_group_add_obj(g, buttonReconnect); + if (gCfgItems.cloud_enable) lv_group_add_obj(g, buttonCloud); + if (enc_ena) lv_group_add_obj(g, buttonReconnect); #endif - lv_obj_set_pos(buttonReconnect, BTN_X_PIXEL * 2 + INTERVAL_V * 3, BTN_Y_PIXEL + INTERVAL_H + titleHeight); - lv_btn_set_layout(buttonReconnect, LV_LAYOUT_OFF); - label_Reconnect = lv_label_create_empty(buttonReconnect); + if (gCfgItems.cloud_enable) label_Cloud = lv_label_create_empty(buttonCloud); } - if (gCfgItems.multiple_language) { - lv_label_set_text(label_Back, common_menu.text_back); - lv_obj_align(label_Back, buttonBack, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); + // Create an Image button + lv_obj_t *buttonBack = lv_imgbtn_create(scr, "F:/bmp_return.bin", BTN_X_PIXEL * 3 + INTERVAL_V * 4, BTN_Y_PIXEL + INTERVAL_H + titleHeight, event_handler, ID_W_RETURN); + if (enc_ena) lv_group_add_obj(g, buttonBack); + lv_obj_t *label_Back = lv_label_create_empty(buttonBack); + if (gCfgItems.multiple_language) { if (gCfgItems.wifi_mode_sel == STA_MODEL) { + if (gCfgItems.cloud_enable) { + lv_label_set_text(label_Cloud, wifi_menu.cloud); + lv_obj_align(label_Cloud, buttonCloud, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); + } lv_label_set_text(label_Reconnect, wifi_menu.reconnect); lv_obj_align(label_Reconnect, buttonReconnect, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); } + lv_label_set_text(label_Back, common_menu.text_back); + lv_obj_align(label_Back, buttonBack, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); } wifi_ip_text = lv_label_create_empty(scr); diff --git a/Marlin/src/lcd/extui/lib/mks_ui/irq_overrid.cpp b/Marlin/src/lcd/extui/lib/mks_ui/irq_overrid.cpp index 128bf0b2d4..388c4a35b8 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/irq_overrid.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/irq_overrid.cpp @@ -46,20 +46,10 @@ #define WIFI_IO1_RESET() WRITE(WIFI_IO1_PIN, LOW); void __irq_usart1(void) { - WIFISERIAL.wifi_usart_irq(USART1_BASE); - if (wifi_link_state == WIFI_TRANS_FILE) { - if (WIFISERIAL.available() == (400)) WIFI_IO1_SET(); - if (WIFISERIAL.wifi_rb_is_full()) { - if (esp_state == TRANSFER_IDLE) esp_state = TRANSFERING; - if (storeRcvData(UART_RX_BUFFER_SIZE)) { - if (wifiTransError.flag != 0x1) WIFI_IO1_RESET(); - } - else { - WIFI_IO1_SET(); - esp_state = TRANSFER_STORE; - } - } - } + if ((USART1_BASE->CR1 & USART_CR1_RXNEIE) && (USART1_BASE->SR & USART_SR_RXNE)) + WRITE(WIFI_IO1_PIN, HIGH); + + WIFISERIAL.wifi_usart_irq(USART1_BASE); } #ifdef __cplusplus diff --git a/Marlin/src/lcd/extui/lib/mks_ui/pic_manager.cpp b/Marlin/src/lcd/extui/lib/mks_ui/pic_manager.cpp index c908b9af3a..1cb7ed185e 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/pic_manager.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/pic_manager.cpp @@ -42,7 +42,7 @@ extern uint16_t DeviceCode; #endif static const char assets[][LONG_FILENAME_LENGTH] = { - //homing screen + // Homing screen "bmp_zeroAll.bin", "bmp_zero.bin", "bmp_zeroX.bin", @@ -50,14 +50,15 @@ static const char assets[][LONG_FILENAME_LENGTH] = { "bmp_zeroZ.bin", "bmp_manual_off.bin", - //tool screen + // Tool screen "bmp_preHeat.bin", "bmp_extruct.bin", "bmp_mov.bin", "bmp_leveling.bin", "bmp_filamentchange.bin", + "bmp_more.bin", - //fan screen + // Fan screen "bmp_Add.bin", "bmp_Dec.bin", "bmp_speed255.bin", @@ -70,7 +71,7 @@ static const char assets[][LONG_FILENAME_LENGTH] = { "bmp_step5_degree.bin", "bmp_step10_degree.bin", - //extrusion screen + // Extrusion screen "bmp_in.bin", "bmp_out.bin", "bmp_extru1.bin", @@ -84,15 +85,15 @@ static const char assets[][LONG_FILENAME_LENGTH] = { "bmp_step5_mm.bin", "bmp_step10_mm.bin", - //select file screen + // Select file screen "bmp_pageUp.bin", "bmp_pageDown.bin", "bmp_back.bin", //TODO: why two back buttons? Why not just one? (return / back) "bmp_dir.bin", "bmp_file.bin", - //move motor screen - //TODO: 6 equal icons, just in diffenct rotation... it may be optimized too + // Move motor screen + // TODO: 6 equal icons, just in diffenct rotation... it may be optimized too "bmp_xAdd.bin", "bmp_xDec.bin", "bmp_yAdd.bin", @@ -103,7 +104,7 @@ static const char assets[][LONG_FILENAME_LENGTH] = { "bmp_step_move1.bin", "bmp_step_move10.bin", - //operation screen + // Operation screen "bmp_auto_off.bin", "bmp_speed.bin", "bmp_fan.bin", @@ -111,7 +112,7 @@ static const char assets[][LONG_FILENAME_LENGTH] = { "bmp_extrude_opr.bin", "bmp_move_opr.bin", - //change speed screen + // Change speed screen "bmp_step1_percent.bin", "bmp_step5_percent.bin", "bmp_step10_percent.bin", @@ -120,7 +121,7 @@ static const char assets[][LONG_FILENAME_LENGTH] = { "bmp_mov_sel.bin", "bmp_speed_extruct.bin", - //printing screen + // Printing screen "bmp_pause.bin", "bmp_resume.bin", "bmp_stop.bin", @@ -134,7 +135,7 @@ static const char assets[][LONG_FILENAME_LENGTH] = { "bmp_zpos_state.bin", "bmp_operate.bin", - //manual leval screen (only if disabled auto level) + // Manual Level screen (only if auto level is disabled) #if DISABLED(AUTO_BED_LEVELING_BILINEAR) "bmp_leveling1.bin", "bmp_leveling2.bin", @@ -143,7 +144,7 @@ static const char assets[][LONG_FILENAME_LENGTH] = { "bmp_leveling5.bin", #endif - //lang select screen + // Language Select screen #if HAS_LANG_SELECT_SCREEN "bmp_language.bin", "bmp_simplified_cn.bin", @@ -162,7 +163,7 @@ static const char assets[][LONG_FILENAME_LENGTH] = { "bmp_italy_sel.bin", #endif // HAS_LANG_SELECT_SCREEN - // gcode preview + // G-code preview #if HAS_GCODE_DEFAULT_VIEW_IN_FLASH "bmp_preview.bin", #endif @@ -171,20 +172,18 @@ static const char assets[][LONG_FILENAME_LENGTH] = { "bmp_logo.bin", #endif - // settings screen + // Settings screen "bmp_about.bin", + "bmp_eeprom_settings.bin", + "bmp_machine_para.bin", + "bmp_function1.bin", - //start screen + // Start screen "bmp_printing.bin", "bmp_set.bin", "bmp_tool.bin", - // settings screen - "bmp_eeprom_settings.bin", - "bmp_machine_para.bin", - "bmp_function1.bin", - - // base icons + // Base icons "bmp_arrow.bin", "bmp_back70x40.bin", "bmp_value_blank.bin", @@ -194,14 +193,24 @@ static const char assets[][LONG_FILENAME_LENGTH] = { "bmp_return.bin", #if ENABLED(MKS_WIFI_MODULE) - // wifi screen + // Wifi screen "bmp_wifi.bin", + "bmp_cloud.bin", #endif - // babystep screen + // Babystep screen "bmp_baby_move0_01.bin", "bmp_baby_move0_05.bin", - "bmp_baby_move0_1.bin" + "bmp_baby_move0_1.bin", + + // More screen + "bmp_custom1.bin", + "bmp_custom2.bin", + "bmp_custom3.bin", + "bmp_custom4.bin", + "bmp_custom5.bin", + "bmp_custom6.bin", + "bmp_custom7.bin" }; #if HAS_SPI_FLASH_FONT @@ -235,14 +244,13 @@ uint32_t lv_get_pic_addr(uint8_t *Pname) { } while (PIC.name[j++] != '\0'); if ((strcasecmp((char*)Pname, (char*)PIC.name)) == 0) { - if ((DeviceCode == 0x9488) || (DeviceCode == 0x5761)) + if (DeviceCode == 0x9488 || DeviceCode == 0x5761) addr = PIC_DATA_ADDR_TFT35 + i * PER_PIC_MAX_SPACE_TFT35; else addr = PIC_DATA_ADDR_TFT32 + i * PER_PIC_MAX_SPACE_TFT32; return addr; } } - return addr; } diff --git a/Marlin/src/lcd/extui/lib/mks_ui/pic_manager.h b/Marlin/src/lcd/extui/lib/mks_ui/pic_manager.h index b856916b95..0abfd7834a 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/pic_manager.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/pic_manager.h @@ -120,7 +120,7 @@ // SD card information first addr #define VAR_INF_ADDR 0x000000 -#define FLASH_INF_VALID_FLAG 0x20200831 +#define FLASH_INF_VALID_FLAG 0x20201118 //Store some gcode commands, such as auto leveling commands #define GCODE_COMMAND_ADDR VAR_INF_ADDR + 3*1024 diff --git a/Marlin/src/lcd/extui/lib/mks_ui/printer_operation.cpp b/Marlin/src/lcd/extui/lib/mks_ui/printer_operation.cpp index 3c3e7c2674..61168fe0ec 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/printer_operation.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/printer_operation.cpp @@ -32,6 +32,7 @@ #include "../../../../sd/cardreader.h" #include "../../../../inc/MarlinConfig.h" #include "../../../../MarlinCore.h" +#include "../../../../gcode/queue.h" #if ENABLED(POWER_LOSS_RECOVERY) #include "../../../../feature/powerloss.h" @@ -55,6 +56,7 @@ void printer_state_polling() { //save the positon uiCfg.current_x_position_bak = current_position.x; uiCfg.current_y_position_bak = current_position.y; + uiCfg.current_z_position_bak = current_position.z; if (gCfgItems.pausePosZ != (float)-1) { gcode.process_subcommands_now_P(PSTR("G91")); @@ -87,10 +89,9 @@ void printer_state_polling() { gcode.process_subcommands_now(public_buf_m); } if (gCfgItems.pausePosZ != (float)-1) { - gcode.process_subcommands_now_P(PSTR("G91")); - sprintf_P(public_buf_l, PSTR("G1 Z-%.1f"), gCfgItems.pausePosZ); - gcode.process_subcommands_now(public_buf_l); - gcode.process_subcommands_now_P(PSTR("G90")); + ZERO(public_buf_m); + sprintf_P(public_buf_m, PSTR("G1 Z%.1f"), uiCfg.current_z_position_bak); + gcode.process_subcommands_now(public_buf_m); } gcode.process_subcommands_now_P(M24_STR); uiCfg.print_state = WORKING; diff --git a/Marlin/src/lcd/extui/lib/mks_ui/tft_Language_en.h b/Marlin/src/lcd/extui/lib/mks_ui/tft_Language_en.h index 07f4474dd6..4fdc946cca 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/tft_Language_en.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/tft_Language_en.h @@ -114,6 +114,7 @@ #define PROBE_Z_SPEED_EN "Probe Z-axis speed" #define ENABLE_EN "YES" #define DISABLE_EN "NO" +#define LOCKED_EN "N/A" #define Z_MIN_EN "ZMin" #define Z_MAX_EN "ZMax" @@ -725,3 +726,11 @@ #define EEPROM_STORE_TIPS_EN "Store settings to EEPROM?" #define EEPROM_READ_TIPS_EN "Read settings from EEPROM?" #define EEPROM_REVERT_TIPS_EN "Revert settings to factory defaults?" + +#define MORE_CUSTOM1_TEXT_EN USER_DESC_1 +#define MORE_CUSTOM2_TEXT_EN USER_DESC_2 +#define MORE_CUSTOM3_TEXT_EN USER_DESC_3 +#define MORE_CUSTOM4_TEXT_EN USER_DESC_4 +#define MORE_CUSTOM5_TEXT_EN USER_DESC_5 +#define MORE_CUSTOM6_TEXT_EN USER_DESC_6 +#define MORE_CUSTOM7_TEXT_EN USER_DESC_7 diff --git a/Marlin/src/lcd/extui/lib/mks_ui/tft_Language_fr.h b/Marlin/src/lcd/extui/lib/mks_ui/tft_Language_fr.h index 8b090285b3..e3226b3cbe 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/tft_Language_fr.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/tft_Language_fr.h @@ -257,3 +257,11 @@ #define EEPROM_STORE_TIPS_FR "Stocker les paramètres dans l'EEPROM?" #define EEPROM_READ_TIPS_FR "Lire les paramètres de l'EEPROM?" #define EEPROM_REVERT_TIPS_FR "Rétablir les paramètres par défaut d'usine?" + +#define MORE_CUSTOM1_TEXT_FR USER_DESC_1 +#define MORE_CUSTOM2_TEXT_FR USER_DESC_2 +#define MORE_CUSTOM3_TEXT_FR USER_DESC_3 +#define MORE_CUSTOM4_TEXT_FR USER_DESC_4 +#define MORE_CUSTOM5_TEXT_FR USER_DESC_5 +#define MORE_CUSTOM6_TEXT_FR USER_DESC_6 +#define MORE_CUSTOM7_TEXT_FR USER_DESC_7 diff --git a/Marlin/src/lcd/extui/lib/mks_ui/tft_Language_it.h b/Marlin/src/lcd/extui/lib/mks_ui/tft_Language_it.h index 9f53b1b321..2a1ba83cd0 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/tft_Language_it.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/tft_Language_it.h @@ -254,3 +254,11 @@ #define EEPROM_STORE_TIPS_IT "Memorizzare le impostazioni su EEPROM?" #define EEPROM_READ_TIPS_IT "Leggi le impostazioni dalla EEPROM?" #define EEPROM_REVERT_TIPS_IT "Ripristinare le impostazioni predefinite?" + +#define MORE_CUSTOM1_TEXT_IT USER_DESC_1 +#define MORE_CUSTOM2_TEXT_IT USER_DESC_2 +#define MORE_CUSTOM3_TEXT_IT USER_DESC_3 +#define MORE_CUSTOM4_TEXT_IT USER_DESC_4 +#define MORE_CUSTOM5_TEXT_IT USER_DESC_5 +#define MORE_CUSTOM6_TEXT_IT USER_DESC_6 +#define MORE_CUSTOM7_TEXT_IT USER_DESC_7 diff --git a/Marlin/src/lcd/extui/lib/mks_ui/tft_Language_ru.h b/Marlin/src/lcd/extui/lib/mks_ui/tft_Language_ru.h index a284b2bad8..94103354b9 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/tft_Language_ru.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/tft_Language_ru.h @@ -29,7 +29,7 @@ #define PRINT_TEXT_RU " печать" #define EXTRUDE_TEXT_RU "экструзия" #define LEVELING_TEXT_RU "уровень" -#define AUTO_LEVELING_TEXT_RU "aвто" +#define AUTO_LEVELING_TEXT_RU "aвтоуровень" #define SET_TEXT_RU "настройки" #define MORE_TEXT_RU "больше" @@ -46,23 +46,23 @@ #define BACK_TEXT_RU "назад" #define TOOL_PREHEAT_RU "нагрев" -#define TOOL_EXTRUDE_RU "экструзия" +#define TOOL_EXTRUDE_RU "экструдер" #define TOOL_MOVE_RU "движение" #define TOOL_HOME_RU "домой" #define TOOL_LEVELING_RU "уровень" -#define TOOL_AUTO_LEVELING_RU "aвто" +#define TOOL_AUTO_LEVELING_RU "aвтоуровень" #define TOOL_FILAMENT_RU "замена" #define TOOL_MORE_RU "больше" -#define AXIS_X_ADD_TEXT_RU "X+" -#define AXIS_X_DEC_TEXT_RU "X-" -#define AXIS_Y_ADD_TEXT_RU "Y+" -#define AXIS_Y_DEC_TEXT_RU "Y-" -#define AXIS_Z_ADD_TEXT_RU "Z+" -#define AXIS_Z_DEC_TEXT_RU "Z-" -#define TEXT_01MM_RU "0.1mm" -#define TEXT_1MM_RU "1mm" -#define TEXT_10MM_RU "10mm" +#define AXIS_X_ADD_TEXT_RU "X +" +#define AXIS_X_DEC_TEXT_RU "X -" +#define AXIS_Y_ADD_TEXT_RU "Y +" +#define AXIS_Y_DEC_TEXT_RU "Y -" +#define AXIS_Z_ADD_TEXT_RU "Z +" +#define AXIS_Z_DEC_TEXT_RU "Z -" +#define TEXT_01MM_RU "0.1 mm" +#define TEXT_1MM_RU "1 mm" +#define TEXT_10MM_RU "10 mm" #define HOME_X_TEXT_RU "X" #define HOME_Y_TEXT_RU "Y" @@ -75,18 +75,18 @@ #define EXTRUDER_IN_TEXT_RU "втянуть" #define EXTRUDER_OUT_TEXT_RU "выдавить" -#define EXTRUDE_1MM_TEXT_RU "1mm" -#define EXTRUDE_5MM_TEXT_RU "5mm" -#define EXTRUDE_10MM_TEXT_RU "10mm" +#define EXTRUDE_1MM_TEXT_RU "1 mm" +#define EXTRUDE_5MM_TEXT_RU "5 mm" +#define EXTRUDE_10MM_TEXT_RU "10 mm" #define EXTRUDE_LOW_SPEED_TEXT_RU "мин" #define EXTRUDE_MEDIUM_SPEED_TEXT_RU "сред" #define EXTRUDE_HIGH_SPEED_TEXT_RU "выс" -#define LEVELING_POINT1_TEXT_RU "1точка" -#define LEVELING_POINT2_TEXT_RU "2точка" -#define LEVELING_POINT3_TEXT_RU "3точка" -#define LEVELING_POINT4_TEXT_RU "4точка" -#define LEVELING_POINT5_TEXT_RU "5точка" +#define LEVELING_POINT1_TEXT_RU "1 точка" +#define LEVELING_POINT2_TEXT_RU "2 точка" +#define LEVELING_POINT3_TEXT_RU "3 точка" +#define LEVELING_POINT4_TEXT_RU "4 точка" +#define LEVELING_POINT5_TEXT_RU "5 точка" #define FILESYS_TEXT_RU "система" #define WIFI_TEXT_RU "WiFi" @@ -95,11 +95,10 @@ #define BREAK_POINT_TEXT_RU "продолжить" #define FILAMENT_TEXT_RU "замена" #define LANGUAGE_TEXT_RU "язык" -#define MOTOR_OFF_TEXT_RU "отклмотор" +#define MOTOR_OFF_TEXT_RU "откл. мотор" #define MOTOR_OFF_XY_TEXT_RU "Off-XY" #define SHUTDOWN_TEXT_RU "выключение" #define MACHINE_PARA_RU "конфиг" -#define EEPROM_SETTINGS_RU "Eeprom Set" #define U_DISK_TEXT_RU "U диск" #define SD_CARD_TEXT_RU "SD диск" @@ -111,14 +110,14 @@ #define WIFI_CONNECTED_TEXT_RU "подключен" #define WIFI_DISCONNECTED_TEXT_RU "не подключен" #define WIFI_EXCEPTION_TEXT_RU "исключение" -#define WIFI_RECONNECT_TEXT_RU "Reconnect" +#define WIFI_RECONNECT_TEXT_RU "выбор сети" #define CLOUD_TEXT_RU "облако" #define CLOUD_BIND_RU "соединён" -#define CLOUD_UNBIND_RU "не соединён" -#define CLOUD_UNBINDING_RU "Unbinding" -#define CLOUD_DISCONNECTED_RU "Disconnected" -#define CLOUD_UNBINDED_RU "Unbinded" -#define CLOUD_BINDED_RU "Binded" +#define CLOUD_UNBIND_RU "отсоед." +#define CLOUD_UNBINDING_RU "отвязано" +#define CLOUD_DISCONNECTED_RU "отключено" +#define CLOUD_UNBINDED_RU "несвяз." +#define CLOUD_BINDED_RU "связано" #define CLOUD_DISABLE_RU "Disable" #define FAN_ADD_TEXT_RU "добавить" @@ -169,11 +168,11 @@ #define ABOUT_VERSION_TEXT_RU "Firmware: " #define ABOUT_WIFI_TEXT_RU "WiFi: " -#define PRINTING_OPERATION_RU "управление" +#define PRINTING_OPERATION_RU "опции" #define PRINTING_PAUSE_RU "пауза" #define PRINTING_TEMP_RU "темп" #define PRINTING_CHANGESPEED_RU "скорости" -#define PRINTING_RESUME_RU "возобновить" +#define PRINTING_RESUME_RU "возобн. " #define PRINTING_STOP_RU "стоп" #define PRINTING_MORE_RU "больше" #define PRINTING_EXTRUDER_RU "экстр" @@ -193,6 +192,7 @@ #define TITLE_HOME_RU "Home" #define TITLE_EXTRUDE_RU "экструзия" #define TITLE_LEVELING_RU "уровень" +#define TITLE_MLEVELING_RU "углы" #define TITLE_SET_RU "настройки" #define TITLE_MORE_RU "больше" #define TITLE_CHOOSEFILE_RU "файла" @@ -230,7 +230,7 @@ #define DIALOG_CLOSE_MACHINE_RU "Closing machine......" #define DIALOG_UNBIND_PRINTER_RU "Unbind the printer?" #define DIALOG_FILAMENT_NO_PRESS_RU "Filament detection switch is not pressed" -#define DIALOG_PRINT_FINISH_RU "Печать завершена!" +#define DIALOG_PRINT_FINISH_RU "печать завершена!" #define DIALOG_PRINT_TIME_RU "Время печати: " #define DIALOG_REPRINT_RU "Print again" #define DIALOG_WIFI_ENABLE_TIPS_RU "The wifi module is being configured,\nplease wait a moment....." @@ -253,6 +253,115 @@ #define EEPROM_SETTINGS_READ_RU "Чтение настроек из EEPROM" #define EEPROM_SETTINGS_REVERT_RU "Bосстановить заводские настройки по умолчанию" -#define EEPROM_STORE_TIPS_RU "Сохранить настройки в EEPROM?" -#define EEPROM_READ_TIPS_RU "Читать настройки из EEPROM?" -#define EEPROM_REVERT_TIPS_RU "Revert settings to factory defaults?" +#define MORE_CUSTOM1_TEXT_RU USER_DESC_1 +#define MORE_CUSTOM2_TEXT_RU USER_DESC_2 +#define MORE_CUSTOM3_TEXT_RU USER_DESC_3 +#define MORE_CUSTOM4_TEXT_RU USER_DESC_4 +#define MORE_CUSTOM5_TEXT_RU USER_DESC_5 +#define MORE_CUSTOM6_TEXT_RU USER_DESC_6 +#define MORE_CUSTOM7_TEXT_RU USER_DESC_7 + +//Malderin translate +// +// +#define EEPROM_STORE_TIPS_RU "Cохранить настройки в EEPROM?" +#define EEPROM_READ_TIPS_RU "читать настройки из EEPROM?" +#define EEPROM_REVERT_TIPS_RU "Cбросить настройки к значениям по умолчанию?" +#define EEPROM_SETTINGS_RU "EEPROM" + +#define NEXT_RU "след." +#define PREVIOUS_RU "пред." +#define ENABLE_RU "да " +#define DISABLE_RU "нет" +#define KEY_CONFIRM_RU "OK" + +#define MACHINE_PARA_TITLE_RU "настройки" +#define MACHINE_TYPE_CNOFIG_RU "Hастройки принтера" +#define MOTOR_CONFIG_RU "Hастройки моторов" +#define MACHINE_LEVELING_CONFIG_RU "Hастройки уровня" +#define ADVANCE_CONFIG_RU "Pасширенные настройки" +#define MACHINE_FILAMENT_CONFIG_RU "Hастройки филамента" +#define ENCODER_SETTINGS_RU "Hастройки энкодера" + +#define LEVELING_CONF_TITLE_RU "Hастройки принтера>Hастройки уровня" +#define LEVELING_PARA_CONF_RU "настройки уровня" +#define LEVELING_MANUAL_POS_RU "настройки координат для уровня" +#define LEVELING_AUTO_COMMAND_RU "настройки комманд увтоуровня" +#define LEVELING_AUTO_ZOFFSET_RU "координаты смещения сопла" + +#define MACHINE_CONFIG_TITLE_RU "Hастройки принтера>настройки притера" +#define MAXFEEDRATE_CONF_RU "настройки максимальной скорости" +#define ACCELERATION_CONF_RU "настройки ускорений" +#define JERKCONF_RU "настройки рывков" + +#define MOTOR_CONF_TITLE_RU "Hастройки принтера>Hастройки моторов" +#define STEPSCONF_RU "настройки шагов" +#define TMC_CURRENT_RU "TMC настройки токов" +#define TMC_STEP_MODE_RU "TMC настрйоки режима шагов" + +#define ACCELERATION_CONF_TITLE_RU "Hастройки принтера>ускорения" +#define PRINT_ACCELERATION_RU "ускорение печати" +#define RETRACT_ACCELERATION_RU "ускорение ретракта" +#define TRAVEL_ACCELERATION_RU "ускорение перемещений" +#define X_ACCELERATION_RU "ускорение оси X" +#define Y_ACCELERATION_RU "ускорение оси Y" +#define Z_ACCELERATION_RU "ускорение оси Z" +#define E0_ACCELERATION_RU "ускорение E0" +#define E1_ACCELERATION_RU "ускорение E1" + +#define MAXFEEDRATE_CONF_TITLE_RU "Hастройки принтера>максимальная скорость" +#define X_MAXFEEDRATE_RU "максимальная скорость оси X" +#define Y_MAXFEEDRATE_RU "максимальная скорость оси Y" +#define Z_MAXFEEDRATE_RU "максимальная скорость оси Z" +#define E0_MAXFEEDRATE_RU "максимальная скорость E0" +#define E1_MAXFEEDRATE_RU "максимальная скорость E1" + +#define JERK_CONF_TITLE_RU "Hастройки принтера>скорость рывка" +#define X_JERK_RU "скорость рывка оси X" +#define Y_JERK_RU "скорость рывка оси Y" +#define Z_JERK_RU "скорость рывка оси Z" +#define E_JERK_RU "скорость рывка оси E" + +#define STEPS_CONF_TITLE_RU "Hастройки принтера>настройки шагов" +#define X_STEPS_RU "шаги оси X" +#define Y_STEPS_RU "шаги оси Y" +#define Z_STEPS_RU "шаги оси Z" +#define E0_STEPS_RU "шаги E0" +#define E1_STEPS_RU "шаги E1" + +#define TMC_CURRENT_CONF_TITLE_RU "Hастройки принтера>TMC настройка токов" +#define X_TMC_CURRENT_RU "ток оси X (mA)" +#define Y_TMC_CURRENT_RU "ток оси Y (mA)" +#define Z_TMC_CURRENT_RU "ток оси Z (mA)" +#define E0_TMC_CURRENT_RU "ток E0 (mA)" +#define E1_TMC_CURRENT_RU "ток E1 (mA)" + +#define TMC_MODE_CONF_TITLE_RU "Hастройки принтера>TMC настройки режима шагов" +#define X_TMC_MODE_RU "включает ли двигатель X режим StealthChop" +#define Y_TMC_MODE_RU "включает ли ось Y режим StealthChop" +#define Z_TMC_MODE_RU "включает ли ось Z режим StealthChop" +#define E0_TMC_MODE_RU "включает ли E0 режим StealthChop" +#define E1_TMC_MODE_RU "включает ли E1 режим StealthChop" + +#define ADVANCED_CONF_TITLE_RU "Hастройки принтера>Pасширенные" +#define PAUSE_POSITION_RU "Hастройки позиции паузы печати" +#define PAUSE_POSITION_X_RU "положение по X (абс. полож., -1 недействит.)" +#define PAUSE_POSITION_Y_RU "положение по Y (абс. полож., -1 недействит.)" +#define PAUSE_POSITION_Z_RU "положение по Z (абс. полож., -1 недействит.)" + +#define OFFSET_TITLE_RU "Hастройки принтера>отступ" +#define OFFSET_X_RU "X отступ" +#define OFFSET_Y_RU "Y отступ" +#define OFFSET_Z_RU "Z отступ" + +#define FILAMENT_CONF_TITLE_RU "Hастройки принтера>Hастройки филамента" +#define FILAMENT_IN_LENGTH_RU "длинна загрузки" +#define FILAMENT_IN_SPEED_RU "скорость загрузки" +#define FILAMENT_TEMPERATURE_RU "температура филамента" +#define FILAMENT_OUT_LENGTH_RU "длинна извлечения" +#define FILAMENT_OUT_SPEED_RU "скорость извлечения" + +#define ENCODER_CONF_TITLE_RU "Hастройки принтера>Hастройки энкодера" +#define ENCODER_CONF_TEXT_RU "энкодер используется?" + +//end of Malderin translate diff --git a/Marlin/src/lcd/extui/lib/mks_ui/tft_Language_s_cn.h b/Marlin/src/lcd/extui/lib/mks_ui/tft_Language_s_cn.h index 45eeb0f990..046968ba87 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/tft_Language_s_cn.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/tft_Language_s_cn.h @@ -99,6 +99,7 @@ #define PROBE_Z_SPEED_CN "探针Z方向移动速度" #define ENABLE_CN "是" #define DISABLE_CN "否" +#define LOCKED_CN "否" #define Z_MIN_CN "ZMin" #define Z_MAX_CN "ZMax" @@ -491,3 +492,11 @@ #define EEPROM_STORE_TIPS_CN "是否保存参数到EEPROM?" #define EEPROM_READ_TIPS_CN "是否使用EEPROM参数?" #define EEPROM_REVERT_TIPS_CN "是否恢复默认参数?" + +#define MORE_CUSTOM1_TEXT_CN USER_DESC_1 +#define MORE_CUSTOM2_TEXT_CN USER_DESC_2 +#define MORE_CUSTOM3_TEXT_CN USER_DESC_3 +#define MORE_CUSTOM4_TEXT_CN USER_DESC_4 +#define MORE_CUSTOM5_TEXT_CN USER_DESC_5 +#define MORE_CUSTOM6_TEXT_CN USER_DESC_6 +#define MORE_CUSTOM7_TEXT_CN USER_DESC_7 diff --git a/Marlin/src/lcd/extui/lib/mks_ui/tft_Language_sp.h b/Marlin/src/lcd/extui/lib/mks_ui/tft_Language_sp.h index 6366527d88..0b714930eb 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/tft_Language_sp.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/tft_Language_sp.h @@ -29,6 +29,7 @@ #define PRINT_TEXT_SP "Imprimir" #define EXTRUDE_TEXT_SP "Extrusor" #define LEVELING_TEXT_SP "Leveling" +#define MLEVELING_TEXT_SP "Leveling" #define AUTO_LEVELING_TEXT_SP "Autolevel" #define SET_TEXT_SP "Config" #define MORE_TEXT_SP "Más" @@ -50,6 +51,7 @@ #define TOOL_MOVE_SP "Mover" #define TOOL_HOME_SP "Origen" #define TOOL_LEVELING_SP "Leveling" +#define TOOL_MLEVELING_SP "Leveling" #define TOOL_AUTO_LEVELING_SP "Autolevel" #define TOOL_FILAMENT_SP "Filamento" #define TOOL_MORE_SP "Más" @@ -261,3 +263,11 @@ #define EEPROM_STORE_TIPS_SP "¿Guardar ajustes en EEPROM?" #define EEPROM_READ_TIPS_SP "Leer la configuración de EEPROM?" #define EEPROM_REVERT_TIPS_SP "Revert settings to factory defaults?" + +#define MORE_CUSTOM1_TEXT_SP USER_DESC_1 +#define MORE_CUSTOM2_TEXT_SP USER_DESC_2 +#define MORE_CUSTOM3_TEXT_SP USER_DESC_3 +#define MORE_CUSTOM4_TEXT_SP USER_DESC_4 +#define MORE_CUSTOM5_TEXT_SP USER_DESC_5 +#define MORE_CUSTOM6_TEXT_SP USER_DESC_6 +#define MORE_CUSTOM7_TEXT_SP USER_DESC_7 diff --git a/Marlin/src/lcd/extui/lib/mks_ui/tft_Language_t_cn.h b/Marlin/src/lcd/extui/lib/mks_ui/tft_Language_t_cn.h index 3288d5b8f9..30d0430313 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/tft_Language_t_cn.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/tft_Language_t_cn.h @@ -99,6 +99,7 @@ #define PROBE_Z_SPEED_T_CN "探针Z方向移動速度" #define ENABLE_T_CN "是" #define DISABLE_T_CN "否" +#define LOCKED_T_CN "否" #define Z_MIN_T_CN "ZMin" #define Z_MAX_T_CN "ZMax" @@ -489,3 +490,11 @@ #define EEPROM_STORE_TIPS_T_CN "是否保存參數到EEPROM?" #define EEPROM_READ_TIPS_T_CN "是否使用EEPROM參數?" #define EEPROM_REVERT_TIPS_T_CN "是否恢復默認參數?" + +#define MORE_CUSTOM1_TEXT_T_CN USER_DESC_1 +#define MORE_CUSTOM2_TEXT_T_CN USER_DESC_2 +#define MORE_CUSTOM3_TEXT_T_CN USER_DESC_3 +#define MORE_CUSTOM4_TEXT_T_CN USER_DESC_4 +#define MORE_CUSTOM5_TEXT_T_CN USER_DESC_5 +#define MORE_CUSTOM6_TEXT_T_CN USER_DESC_6 +#define MORE_CUSTOM7_TEXT_T_CN USER_DESC_7 diff --git a/Marlin/src/lcd/extui/lib/mks_ui/tft_lvgl_configuration.cpp b/Marlin/src/lcd/extui/lib/mks_ui/tft_lvgl_configuration.cpp index 5350ddb377..d005a9b103 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/tft_lvgl_configuration.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/tft_lvgl_configuration.cpp @@ -19,12 +19,6 @@ * along with this program. If not, see . * */ - -/** - * @file tft_lvgl_configuration.cpp - * @date 2020-02-21 - */ - #include "../../../../inc/MarlinConfigPre.h" #if HAS_TFT_LVGL_UI @@ -56,6 +50,10 @@ XPT2046 touch; #include "draw_touch_calibration.h" #endif +#if ENABLED(MKS_WIFI_MODULE) + #include "wifi_module.h" +#endif + #include #ifndef TFT_WIDTH @@ -120,6 +118,10 @@ void tft_lvgl_init() { watchdog_refresh(); // LVGL init takes time + #if MB(MKS_ROBIN_NANO) + OUT_WRITE(PB0, LOW); // HE1 + #endif + // Init TFT first! SPI_TFT.spi_init(SPI_FULL_SPEED); SPI_TFT.LCD_init(); @@ -137,19 +139,19 @@ void tft_lvgl_init() { lv_init(); - lv_disp_buf_init(&disp_buf, bmp_public_buf, nullptr, LV_HOR_RES_MAX * 14); /*Initialize the display buffer*/ + lv_disp_buf_init(&disp_buf, bmp_public_buf, nullptr, LV_HOR_RES_MAX * 14); // Initialize the display buffer - lv_disp_drv_t disp_drv; /*Descriptor of a display driver*/ - lv_disp_drv_init(&disp_drv); /*Basic initialization*/ - disp_drv.flush_cb = my_disp_flush; /*Set your driver function*/ - disp_drv.buffer = &disp_buf; /*Assign the buffer to the display*/ - lv_disp_drv_register(&disp_drv); /*Finally register the driver*/ + lv_disp_drv_t disp_drv; // Descriptor of a display driver + lv_disp_drv_init(&disp_drv); // Basic initialization + disp_drv.flush_cb = my_disp_flush; // Set your driver function + disp_drv.buffer = &disp_buf; // Assign the buffer to the display + lv_disp_drv_register(&disp_drv); // Finally register the driver lv_indev_drv_t indev_drv; - lv_indev_drv_init(&indev_drv); /*Descriptor of a input device driver*/ - indev_drv.type = LV_INDEV_TYPE_POINTER; /*Touch pad is a pointer-like device*/ - indev_drv.read_cb = my_touchpad_read; /*Set your driver function*/ - lv_indev_drv_register(&indev_drv); /*Finally register the driver*/ + lv_indev_drv_init(&indev_drv); // Descriptor of a input device driver + indev_drv.type = LV_INDEV_TYPE_POINTER; // Touch pad is a pointer-like device + indev_drv.read_cb = my_touchpad_read; // Set your driver function + lv_indev_drv_register(&indev_drv); // Finally register the driver #if HAS_ROTARY_ENCODER g = lv_group_create(); @@ -193,6 +195,8 @@ void tft_lvgl_init() { lv_encoder_pin_init(); + TERN_(MKS_WIFI_MODULE, mks_wifi_firmware_update()); + bool ready = true; #if ENABLED(POWER_LOSS_RECOVERY) recovery.load(); @@ -212,12 +216,9 @@ void tft_lvgl_init() { } #endif - if (ready) { - lv_draw_ready_print(); - } + if (ready) lv_draw_ready_print(); - if (mks_test_flag == 0x1E) - mks_gpio_test(); + if (mks_test_flag == 0x1E) mks_gpio_test(); } void my_disp_flush(lv_disp_drv_t * disp, const lv_area_t * area, lv_color_t * color_p) { @@ -229,8 +230,17 @@ void my_disp_flush(lv_disp_drv_t * disp, const lv_area_t * area, lv_color_t * co for (uint16_t i = 0; i < height; i++) SPI_TFT.tftio.WriteSequence((uint16_t*)(color_p + width * i), width); - lv_disp_flush_ready(disp); /* Indicate you are ready with the flushing*/ + lv_disp_flush_ready(disp); // Indicate you are ready with the flushing + + W25QXX.init(SPI_QUARTER_SPEED); +} +void lv_fill_rect(lv_coord_t x1, lv_coord_t y1, lv_coord_t x2, lv_coord_t y2, lv_color_t bk_color) { + uint16_t width, height; + width = x2 - x1 + 1; + height = y2 - y1 + 1; + SPI_TFT.setWindow((uint16_t)x1, (uint16_t)y1, width, height); + SPI_TFT.tftio.WriteMultiple(bk_color.full, width * height); W25QXX.init(SPI_QUARTER_SPEED); } @@ -298,13 +308,13 @@ int16_t enc_diff = 0; lv_indev_state_t state = LV_INDEV_STATE_REL; bool my_mousewheel_read(lv_indev_drv_t * indev_drv, lv_indev_data_t * data) { - (void) indev_drv; /*Unused*/ + (void) indev_drv; // Unused data->state = state; data->enc_diff = enc_diff; enc_diff = 0; - return false; /*No more data to read so return false*/ + return false; // No more data to read so return false } extern uint8_t currentFlashPage; @@ -327,7 +337,7 @@ lv_fs_res_t spi_flash_open_cb (lv_fs_drv_t * drv, void * file_p, const char * pa lv_fs_res_t spi_flash_close_cb (lv_fs_drv_t * drv, void * file_p) { lv_fs_res_t res = LV_FS_RES_OK; - /* Add your code here*/ + /* Add your code here */ pic_read_addr_offset = pic_read_base_addr; return res; } @@ -379,7 +389,7 @@ lv_fs_res_t sd_open_cb (lv_fs_drv_t * drv, void * file_p, const char * path, lv_ } lv_fs_res_t sd_close_cb (lv_fs_drv_t * drv, void * file_p) { - /* Add your code here*/ + /* Add your code here */ lv_close_gcode_file(); return LV_FS_RES_OK; } diff --git a/Marlin/src/lcd/extui/lib/mks_ui/tft_lvgl_configuration.h b/Marlin/src/lcd/extui/lib/mks_ui/tft_lvgl_configuration.h index 20fa3242e6..0d4ea1f404 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/tft_lvgl_configuration.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/tft_lvgl_configuration.h @@ -33,7 +33,9 @@ #include //#define TFT_ROTATION TFT_ROTATE_180 -#define MKS_WIFI_MODULE 0 + +extern uint8_t bmp_public_buf[14 * 1024]; +extern uint8_t public_buf[513]; extern uint8_t bmp_public_buf[14 * 1024]; extern uint8_t public_buf[513]; @@ -63,6 +65,8 @@ extern lv_fs_res_t sd_read_cb (lv_fs_drv_t * drv, void * file_p, void * buf, uin extern lv_fs_res_t sd_seek_cb(lv_fs_drv_t * drv, void * file_p, uint32_t pos); extern lv_fs_res_t sd_tell_cb(lv_fs_drv_t * drv, void * file_p, uint32_t * pos_p); +extern void lv_fill_rect(lv_coord_t x1, lv_coord_t y1, lv_coord_t x2, lv_coord_t y2, lv_color_t bk_color); + #ifdef __cplusplus } /* C-declarations for C++ */ #endif diff --git a/Marlin/src/lcd/extui/lib/mks_ui/tft_multi_language.cpp b/Marlin/src/lcd/extui/lib/mks_ui/tft_multi_language.cpp index 3cbbe538bc..2efe68a4ce 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/tft_multi_language.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/tft_multi_language.cpp @@ -136,6 +136,7 @@ void machine_setting_disp() { machine_menu.ProbeZspeed = PROBE_Z_SPEED_CN; machine_menu.enable = ENABLE_CN; machine_menu.disable = DISABLE_CN; + machine_menu.locked = LOCKED_CN; machine_menu.z_min = Z_MIN_CN; machine_menu.z_max = Z_MAX_CN; @@ -363,6 +364,7 @@ void machine_setting_disp() { machine_menu.ProbeZspeed = PROBE_Z_SPEED_T_CN; machine_menu.enable = ENABLE_T_CN; machine_menu.disable = DISABLE_T_CN; + machine_menu.locked = LOCKED_T_CN; machine_menu.z_min = Z_MIN_T_CN; machine_menu.z_max = Z_MAX_T_CN; @@ -591,6 +593,7 @@ void machine_setting_disp() { machine_menu.ProbeZspeed = PROBE_Z_SPEED_EN; machine_menu.enable = ENABLE_EN; machine_menu.disable = DISABLE_EN; + machine_menu.locked = LOCKED_EN; machine_menu.z_min = Z_MIN_EN; machine_menu.z_max = Z_MAX_EN; @@ -941,7 +944,28 @@ void disp_language_init() { filesys_menu.sd_sys = SD_CARD_TEXT_CN; filesys_menu.usb_sys = U_DISK_TEXT_CN; // - more_menu.title = TITLE_MORE_CN; + more_menu.title = TITLE_MORE_CN; + #if ENABLED(USER_CMD_1_ENABLE) + more_menu.custom1 = MORE_CUSTOM1_TEXT_CN; + #endif + #if ENABLED(USER_CMD_2_ENABLE) + more_menu.custom2 = MORE_CUSTOM2_TEXT_CN; + #endif + #if ENABLED(USER_CMD_3_ENABLE) + more_menu.custom3 = MORE_CUSTOM3_TEXT_CN; + #endif + #if ENABLED(USER_CMD_4_ENABLE) + more_menu.custom4 = MORE_CUSTOM4_TEXT_CN; + #endif + #if ENABLED(USER_CMD_5_ENABLE) + more_menu.custom5 = MORE_CUSTOM5_TEXT_CN; + #endif + #if ENABLED(USER_CMD_6_ENABLE) + more_menu.custom6 = MORE_CUSTOM6_TEXT_CN; + #endif + #if ENABLED(USER_CMD_7_ENABLE) + more_menu.custom7 = MORE_CUSTOM7_TEXT_CN; + #endif // WIFI wifi_menu.title = WIFI_TEXT; wifi_menu.cloud = CLOUD_TEXT_CN; @@ -953,6 +977,7 @@ void disp_language_init() { cloud_menu.unbind = CLOUD_UNBIND_CN; cloud_menu.unbinding = CLOUD_UNBINDED_CN; cloud_menu.disconnected = CLOUD_DISCONNECTED_CN; + cloud_menu.unbinded = CLOUD_UNBINDED_CN; cloud_menu.disable = CLOUD_DISABLE_CN; // about_menu.title = ABOUT_TEXT_CN; @@ -1166,9 +1191,30 @@ void disp_language_init() { filesys_menu.sd_sys = SD_CARD_TEXT_T_CN; filesys_menu.usb_sys = U_DISK_TEXT_T_CN; // - more_menu.title = TITLE_MORE_T_CN; + more_menu.title = TITLE_MORE_T_CN; + #if ENABLED(USER_CMD_1_ENABLE) + more_menu.custom1 = MORE_CUSTOM1_TEXT_T_CN; + #endif + #if ENABLED(USER_CMD_2_ENABLE) + more_menu.custom2 = MORE_CUSTOM2_TEXT_T_CN; + #endif + #if ENABLED(USER_CMD_3_ENABLE) + more_menu.custom3 = MORE_CUSTOM3_TEXT_T_CN; + #endif + #if ENABLED(USER_CMD_4_ENABLE) + more_menu.custom4 = MORE_CUSTOM4_TEXT_T_CN; + #endif + #if ENABLED(USER_CMD_5_ENABLE) + more_menu.custom5 = MORE_CUSTOM5_TEXT_T_CN; + #endif + #if ENABLED(USER_CMD_6_ENABLE) + more_menu.custom6 = MORE_CUSTOM6_TEXT_T_CN; + #endif + #if ENABLED(USER_CMD_7_ENABLE) + more_menu.custom7 = MORE_CUSTOM7_TEXT_T_CN; + #endif // WIFI - wifi_menu.title = WIFI_TEXT; + wifi_menu.title = WIFI_TEXT; wifi_menu.cloud = CLOUD_TEXT_T_CN; wifi_menu.reconnect = WIFI_RECONNECT_TEXT_T_CN; // CLOUD @@ -1178,6 +1224,7 @@ void disp_language_init() { cloud_menu.unbind = CLOUD_UNBIND_T_CN; cloud_menu.unbinding = CLOUD_UNBINDED_T_CN; cloud_menu.disconnected = CLOUD_DISCONNECTED_T_CN; + cloud_menu.unbinded = CLOUD_UNBINDED_T_CN; cloud_menu.disable = CLOUD_DISABLE_T_CN; // about_menu.title = ABOUT_TEXT_T_CN; @@ -1334,7 +1381,7 @@ void disp_language_init() { preheat_menu.hotbed = HEATBED_TEXT_EN; preheat_menu.off = CLOSE_TEXT_EN; // - move_menu.title = TITLE_MOVE_EN; + move_menu.title = TITLE_MOVE_EN; // home_menu.title = TITLE_HOME_EN; home_menu.stopmove = HOME_STOPMOVE_EN; @@ -1377,12 +1424,34 @@ void disp_language_init() { set_menu.machine_para = MACHINE_PARA_EN; set_menu.eepromSet = EEPROM_SETTINGS_EN; more_menu.title = TITLE_MORE_EN; + #if ENABLED(USER_CMD_1_ENABLE) + more_menu.custom1 = MORE_CUSTOM1_TEXT_EN; + #endif + #if ENABLED(USER_CMD_2_ENABLE) + more_menu.custom2 = MORE_CUSTOM2_TEXT_EN; + #endif + #if ENABLED(USER_CMD_3_ENABLE) + more_menu.custom3 = MORE_CUSTOM3_TEXT_EN; + #endif + #if ENABLED(USER_CMD_4_ENABLE) + more_menu.custom4 = MORE_CUSTOM4_TEXT_EN; + #endif + #if ENABLED(USER_CMD_5_ENABLE) + more_menu.custom5 = MORE_CUSTOM5_TEXT_EN; + #endif + #if ENABLED(USER_CMD_6_ENABLE) + more_menu.custom6 = MORE_CUSTOM6_TEXT_EN; + #endif + #if ENABLED(USER_CMD_7_ENABLE) + more_menu.custom7 = MORE_CUSTOM7_TEXT_EN; + #endif + // filesys_menu.title = TITLE_FILESYS_EN; filesys_menu.sd_sys = SD_CARD_TEXT_EN; filesys_menu.usb_sys = U_DISK_TEXT_EN; // WIFI - wifi_menu.title = WIFI_TEXT; + wifi_menu.title = WIFI_TEXT; wifi_menu.cloud = CLOUD_TEXT_EN; wifi_menu.reconnect = WIFI_RECONNECT_TEXT_EN; @@ -1392,6 +1461,7 @@ void disp_language_init() { cloud_menu.unbind = CLOUD_UNBIND_EN; cloud_menu.unbinding = CLOUD_UNBINDED_EN; cloud_menu.disconnected = CLOUD_DISCONNECTED_EN; + cloud_menu.unbinded = CLOUD_UNBINDED_EN; cloud_menu.disable = CLOUD_DISABLE_EN; // about_menu.title = TITLE_ABOUT_EN; @@ -1545,7 +1615,7 @@ void disp_language_init() { preheat_menu.hotbed = HEATBED_TEXT_RU; preheat_menu.off = CLOSE_TEXT_RU; // - move_menu.title = MOVE_TEXT_RU; + move_menu.title = MOVE_TEXT_RU; // home_menu.title = TITLE_HOME_RU; home_menu.stopmove = HOME_STOPMOVE_RU; @@ -1588,21 +1658,137 @@ void disp_language_init() { set_menu.machine_para = MACHINE_PARA_RU; set_menu.eepromSet = EEPROM_SETTINGS_RU; more_menu.title = TITLE_MORE_RU; + #if ENABLED(USER_CMD_1_ENABLE) + more_menu.custom1 = MORE_CUSTOM1_TEXT_RU; + #endif + #if ENABLED(USER_CMD_2_ENABLE) + more_menu.custom2 = MORE_CUSTOM2_TEXT_RU; + #endif + #if ENABLED(USER_CMD_3_ENABLE) + more_menu.custom3 = MORE_CUSTOM3_TEXT_RU; + #endif + #if ENABLED(USER_CMD_4_ENABLE) + more_menu.custom4 = MORE_CUSTOM4_TEXT_RU; + #endif + #if ENABLED(USER_CMD_5_ENABLE) + more_menu.custom5 = MORE_CUSTOM5_TEXT_RU; + #endif + #if ENABLED(USER_CMD_6_ENABLE) + more_menu.custom6 = MORE_CUSTOM6_TEXT_RU; + #endif + #if ENABLED(USER_CMD_7_ENABLE) + more_menu.custom7 = MORE_CUSTOM7_TEXT_RU; + #endif // filesys_menu.title = TITLE_FILESYS_RU; filesys_menu.sd_sys = SD_CARD_TEXT_RU; filesys_menu.usb_sys = U_DISK_TEXT_RU; // WIFI - wifi_menu.title = WIFI_TEXT; + wifi_menu.title = WIFI_TEXT; wifi_menu.cloud = CLOUD_TEXT_RU; wifi_menu.reconnect = WIFI_RECONNECT_TEXT_RU; + machine_menu.next = NEXT_RU; + machine_menu.previous = PREVIOUS_RU; + machine_menu.enable = ENABLE_RU; + machine_menu.disable = DISABLE_RU; + machine_menu.key_confirm = KEY_CONFIRM_RU; + + MachinePara_menu.MachineSetting = MACHINE_TYPE_CNOFIG_RU; + MachinePara_menu.title = MACHINE_PARA_TITLE_RU; + machine_menu.MachineConfigTitle = MACHINE_CONFIG_TITLE_RU; + MachinePara_menu.MotorSetting = MOTOR_CONFIG_RU; + MachinePara_menu.leveling = MACHINE_LEVELING_CONFIG_RU; + MachinePara_menu.AdvanceSetting = ADVANCE_CONFIG_RU; + machine_menu.MotorConfTitle = MOTOR_CONF_TITLE_RU; + machine_menu.MaxFeedRateConf = MAXFEEDRATE_CONF_RU; + machine_menu.AccelerationConf = ACCELERATION_CONF_RU; + machine_menu.JerkConf = JERKCONF_RU; + machine_menu.StepsConf = STEPSCONF_RU; + machine_menu.TMCcurrentConf = TMC_CURRENT_RU; + machine_menu.TMCStepModeConf = TMC_STEP_MODE_RU; + machine_menu.PausePosition = PAUSE_POSITION_RU; + machine_menu.FilamentConf = MACHINE_FILAMENT_CONFIG_RU; + machine_menu.EncoderSettings = ENCODER_SETTINGS_RU; + machine_menu.AdvancedConfTitle = ADVANCED_CONF_TITLE_RU; + + machine_menu.LevelingParaConfTitle = LEVELING_CONF_TITLE_RU; + machine_menu.LevelingParaConf = LEVELING_PARA_CONF_RU; + machine_menu.LevelingManuPosConf = LEVELING_MANUAL_POS_RU; + machine_menu.LevelingAutoCommandConf = LEVELING_AUTO_COMMAND_RU; + machine_menu.LevelingAutoZoffsetConf = LEVELING_AUTO_ZOFFSET_RU; + + machine_menu.AccelerationConfTitle = ACCELERATION_CONF_TITLE_RU; + machine_menu.PrintAcceleration = PRINT_ACCELERATION_RU; + machine_menu.RetractAcceleration = RETRACT_ACCELERATION_RU; + machine_menu.TravelAcceleration = TRAVEL_ACCELERATION_RU; + machine_menu.X_Acceleration = X_ACCELERATION_RU; + machine_menu.Y_Acceleration = Y_ACCELERATION_RU; + machine_menu.Z_Acceleration = Z_ACCELERATION_RU; + machine_menu.E0_Acceleration = E0_ACCELERATION_RU; + machine_menu.E1_Acceleration = E1_ACCELERATION_RU; + + machine_menu.MaxFeedRateConfTitle = MAXFEEDRATE_CONF_TITLE_RU; + machine_menu.XMaxFeedRate = X_MAXFEEDRATE_RU; + machine_menu.YMaxFeedRate = Y_MAXFEEDRATE_RU; + machine_menu.ZMaxFeedRate = Z_MAXFEEDRATE_RU; + machine_menu.E0MaxFeedRate = E0_MAXFEEDRATE_RU; + machine_menu.E1MaxFeedRate = E1_MAXFEEDRATE_RU; + + machine_menu.JerkConfTitle = JERK_CONF_TITLE_RU; + machine_menu.X_Jerk = X_JERK_RU; + machine_menu.Y_Jerk = Y_JERK_RU; + machine_menu.Z_Jerk = Z_JERK_RU; + machine_menu.E_Jerk = E_JERK_RU; + + machine_menu.StepsConfTitle = STEPS_CONF_TITLE_RU; + machine_menu.X_Steps = X_STEPS_RU; + machine_menu.Y_Steps = Y_STEPS_RU; + machine_menu.Z_Steps = Z_STEPS_RU; + machine_menu.E0_Steps = E0_STEPS_RU; + machine_menu.E1_Steps = E1_STEPS_RU; + + machine_menu.TmcCurrentConfTitle = TMC_CURRENT_CONF_TITLE_RU; + machine_menu.X_Current = X_TMC_CURRENT_RU; + machine_menu.Y_Current = Y_TMC_CURRENT_RU; + machine_menu.Z_Current = Z_TMC_CURRENT_RU; + machine_menu.E0_Current = E0_TMC_CURRENT_RU; + machine_menu.E1_Current = E1_TMC_CURRENT_RU; + + machine_menu.TmcStepModeConfTitle = TMC_MODE_CONF_TITLE_RU; + machine_menu.X_StepMode = X_TMC_MODE_RU; + machine_menu.Y_StepMode = Y_TMC_MODE_RU; + machine_menu.Z_StepMode = Z_TMC_MODE_RU; + machine_menu.E0_StepMode = E0_TMC_MODE_RU; + machine_menu.E1_StepMode = E1_TMC_MODE_RU; + + machine_menu.PausePosText = PAUSE_POSITION_RU; + machine_menu.xPos = PAUSE_POSITION_X_RU; + machine_menu.yPos = PAUSE_POSITION_Y_RU; + machine_menu.zPos = PAUSE_POSITION_Z_RU; + + machine_menu.OffsetConfTitle = OFFSET_TITLE_RU; + machine_menu.Xoffset = OFFSET_X_RU; + machine_menu.Yoffset = OFFSET_Y_RU; + machine_menu.Zoffset = OFFSET_Z_RU; + + machine_menu.FilamentConfTitle = FILAMENT_CONF_TITLE_RU; + machine_menu.InLength = FILAMENT_IN_LENGTH_RU; + machine_menu.InSpeed = FILAMENT_IN_SPEED_RU; + machine_menu.FilamentTemperature = FILAMENT_TEMPERATURE_RU; + machine_menu.OutLength = FILAMENT_OUT_LENGTH_RU; + machine_menu.OutSpeed = FILAMENT_OUT_SPEED_RU; + + machine_menu.EncoderConfTitle = ENCODER_CONF_TITLE_RU; + machine_menu.EncoderConfText = ENCODER_CONF_TEXT_RU; + cloud_menu.title = TITLE_CLOUD_TEXT_RU; cloud_menu.bind = CLOUD_BINDED_RU; cloud_menu.binded = CLOUD_BINDED_RU; cloud_menu.unbind = CLOUD_UNBIND_RU; cloud_menu.unbinding = CLOUD_UNBINDED_RU; cloud_menu.disconnected = CLOUD_DISCONNECTED_RU; + cloud_menu.unbinded = CLOUD_UNBINDED_RU; cloud_menu.disable = CLOUD_DISABLE_RU; // about_menu.title = ABOUT_TEXT_RU; @@ -1802,13 +1988,34 @@ void disp_language_init() { set_menu.machine_para = MACHINE_PARA_SP; set_menu.eepromSet = EEPROM_SETTINGS_SP; more_menu.title = TITLE_MORE_SP; + #if ENABLED(USER_CMD_1_ENABLE) + more_menu.custom1 = MORE_CUSTOM1_TEXT_SP; + #endif + #if ENABLED(USER_CMD_2_ENABLE) + more_menu.custom2 = MORE_CUSTOM2_TEXT_SP; + #endif + #if ENABLED(USER_CMD_3_ENABLE) + more_menu.custom3 = MORE_CUSTOM3_TEXT_SP; + #endif + #if ENABLED(USER_CMD_4_ENABLE) + more_menu.custom4 = MORE_CUSTOM4_TEXT_SP; + #endif + #if ENABLED(USER_CMD_5_ENABLE) + more_menu.custom5 = MORE_CUSTOM5_TEXT_SP; + #endif + #if ENABLED(USER_CMD_6_ENABLE) + more_menu.custom6 = MORE_CUSTOM6_TEXT_SP; + #endif + #if ENABLED(USER_CMD_7_ENABLE) + more_menu.custom7 = MORE_CUSTOM7_TEXT_SP; + #endif // filesys_menu.title = TITLE_FILESYS_SP; filesys_menu.sd_sys = SD_CARD_TEXT_SP; filesys_menu.usb_sys = U_DISK_TEXT_SP; // WIFI - wifi_menu.title = WIFI_TEXT; + wifi_menu.title = WIFI_TEXT; wifi_menu.cloud = CLOUD_TEXT_SP; wifi_menu.reconnect = WIFI_RECONNECT_TEXT_SP; @@ -1818,6 +2025,7 @@ void disp_language_init() { cloud_menu.unbind = CLOUD_UNBIND_SP; cloud_menu.unbinding = CLOUD_UNBINDED_SP; cloud_menu.disconnected = CLOUD_DISCONNECTED_SP; + cloud_menu.unbinded = CLOUD_UNBINDED_SP; cloud_menu.disable = CLOUD_DISABLE_SP; // about_menu.title = ABOUT_TEXT_SP; @@ -2015,6 +2223,27 @@ void disp_language_init() { set_menu.machine_para = MACHINE_PARA_FR; set_menu.eepromSet = EEPROM_SETTINGS_FR; more_menu.title = TITLE_MORE_FR; + #if ENABLED(USER_CMD_1_ENABLE) + more_menu.custom1 = MORE_CUSTOM1_TEXT_FR; + #endif + #if ENABLED(USER_CMD_2_ENABLE) + more_menu.custom2 = MORE_CUSTOM2_TEXT_FR; + #endif + #if ENABLED(USER_CMD_3_ENABLE) + more_menu.custom3 = MORE_CUSTOM3_TEXT_FR; + #endif + #if ENABLED(USER_CMD_4_ENABLE) + more_menu.custom4 = MORE_CUSTOM4_TEXT_FR; + #endif + #if ENABLED(USER_CMD_5_ENABLE) + more_menu.custom5 = MORE_CUSTOM5_TEXT_FR; + #endif + #if ENABLED(USER_CMD_6_ENABLE) + more_menu.custom6 = MORE_CUSTOM6_TEXT_FR; + #endif + #if ENABLED(USER_CMD_7_ENABLE) + more_menu.custom7 = MORE_CUSTOM7_TEXT_FR; + #endif // filesys_menu.title = TITLE_FILESYS_FR; filesys_menu.sd_sys = SD_CARD_TEXT_FR; @@ -2023,7 +2252,7 @@ void disp_language_init() { file_menu.no_file = NO_FILE_FR; file_menu.no_file_and_check = NO_FILE_FR; // WIFI - wifi_menu.title = WIFI_NAME_TEXT_FR; + wifi_menu.title = WIFI_NAME_TEXT_FR; wifi_menu.cloud = CLOUD_TEXT_FR; wifi_menu.reconnect = WIFI_RECONNECT_TEXT_FR; @@ -2033,6 +2262,7 @@ void disp_language_init() { cloud_menu.unbind = CLOUD_UNBIND_FR; cloud_menu.unbinding = CLOUD_UNBINDED_FR; cloud_menu.disconnected = CLOUD_DISCONNECTED_FR; + cloud_menu.unbinded = CLOUD_UNBINDED_FR; cloud_menu.disable = CLOUD_DISABLE_FR; // about_menu.title = ABOUT_TEXT_FR; @@ -2229,13 +2459,34 @@ void disp_language_init() { set_menu.machine_para = MACHINE_PARA_IT; set_menu.eepromSet = EEPROM_SETTINGS_IT; more_menu.title = TITLE_MORE_IT; + #if ENABLED(USER_CMD_1_ENABLE) + more_menu.custom1 = MORE_CUSTOM1_TEXT_IT; + #endif + #if ENABLED(USER_CMD_2_ENABLE) + more_menu.custom2 = MORE_CUSTOM2_TEXT_IT; + #endif + #if ENABLED(USER_CMD_3_ENABLE) + more_menu.custom3 = MORE_CUSTOM3_TEXT_IT; + #endif + #if ENABLED(USER_CMD_4_ENABLE) + more_menu.custom4 = MORE_CUSTOM4_TEXT_IT; + #endif + #if ENABLED(USER_CMD_5_ENABLE) + more_menu.custom5 = MORE_CUSTOM5_TEXT_IT; + #endif + #if ENABLED(USER_CMD_6_ENABLE) + more_menu.custom6 = MORE_CUSTOM6_TEXT_IT; + #endif + #if ENABLED(USER_CMD_7_ENABLE) + more_menu.custom7 = MORE_CUSTOM7_TEXT_IT; + #endif // filesys_menu.title = TITLE_FILESYS_IT; filesys_menu.sd_sys = SD_CARD_TEXT_IT; filesys_menu.usb_sys = U_DISK_TEXT_IT; // WIFI - wifi_menu.title = WIFI_NAME_TEXT_IT; + wifi_menu.title = WIFI_NAME_TEXT_IT; wifi_menu.cloud = CLOSE_TEXT_IT; wifi_menu.reconnect = WIFI_RECONNECT_TEXT_IT; @@ -2245,6 +2496,7 @@ void disp_language_init() { cloud_menu.unbind = CLOUD_UNBIND_IT; cloud_menu.unbinding = CLOUD_UNBINDED_IT; cloud_menu.disconnected = CLOUD_DISCONNECTED_IT; + cloud_menu.unbinded = CLOUD_UNBINDED_IT; cloud_menu.disable = CLOUD_DISABLE_IT; // about_menu.title = ABOUT_TEXT_IT; @@ -2442,13 +2694,34 @@ void disp_language_init() { set_menu.machine_para = MACHINE_PARA_EN; set_menu.eepromSet = EEPROM_SETTINGS_EN; // - more_menu.title = TITLE_MORE_EN; + more_menu.title = TITLE_MORE_EN; + #if ENABLED(USER_CMD_1_ENABLE) + more_menu.custom1 = MORE_CUSTOM1_TEXT_EN; + #endif + #if ENABLED(USER_CMD_2_ENABLE) + more_menu.custom2 = MORE_CUSTOM2_TEXT_EN; + #endif + #if ENABLED(USER_CMD_3_ENABLE) + more_menu.custom3 = MORE_CUSTOM3_TEXT_EN; + #endif + #if ENABLED(USER_CMD_4_ENABLE) + more_menu.custom4 = MORE_CUSTOM4_TEXT_EN; + #endif + #if ENABLED(USER_CMD_5_ENABLE) + more_menu.custom5 = MORE_CUSTOM5_TEXT_EN; + #endif + #if ENABLED(USER_CMD_6_ENABLE) + more_menu.custom6 = MORE_CUSTOM6_TEXT_EN; + #endif + #if ENABLED(USER_CMD_7_ENABLE) + more_menu.custom7 = MORE_CUSTOM7_TEXT_EN; + #endif // filesys_menu.title = TITLE_FILESYS_EN; filesys_menu.sd_sys = SD_CARD_TEXT_EN; filesys_menu.usb_sys = U_DISK_TEXT_EN; // WIFI - wifi_menu.title = WIFI_TEXT; + wifi_menu.title = WIFI_TEXT; wifi_menu.cloud = CLOUD_TEXT_EN; wifi_menu.reconnect = WIFI_RECONNECT_TEXT_EN; @@ -2458,6 +2731,7 @@ void disp_language_init() { cloud_menu.unbind = CLOUD_UNBIND_EN; cloud_menu.unbinding = CLOUD_UNBINDED_EN; cloud_menu.disconnected = CLOUD_DISCONNECTED_EN; + cloud_menu.unbinded = CLOUD_UNBINDED_EN; cloud_menu.disable = CLOUD_DISABLE_EN; // about_menu.title = TITLE_ABOUT_EN; diff --git a/Marlin/src/lcd/extui/lib/mks_ui/tft_multi_language.h b/Marlin/src/lcd/extui/lib/mks_ui/tft_multi_language.h index 519388992f..a3b55d469b 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/tft_multi_language.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/tft_multi_language.h @@ -118,6 +118,7 @@ typedef struct machine_common_disp{ const char *ProbeZspeed; const char *enable; const char *disable; + const char *locked; const char *z_min; const char *z_max; @@ -456,6 +457,13 @@ extern filesys_menu_def filesys_menu; typedef struct more_menu_disp { const char *title; + const char *custom1; + const char *custom2; + const char *custom3; + const char *custom4; + const char *custom5; + const char *custom6; + const char *custom7; const char *back; } more_menu_def; @@ -757,15 +765,15 @@ extern eeprom_def eeprom_menu; #define AXIS_Y_DEC_TEXT "Y-" #define AXIS_Z_ADD_TEXT "Z+" #define AXIS_Z_DEC_TEXT "Z-" -#define TEXT_001MM "0.01mm" -#define TEXT_005MM "0.05mm" -#define TEXT_01MM "0.1mm" -#define TEXT_1MM "1mm" -#define TEXT_10MM "10mm" +#define TEXT_001MM "0.01 mm" +#define TEXT_005MM "0.05 mm" +#define TEXT_01MM "0.1 mm" +#define TEXT_1MM "1 mm" +#define TEXT_10MM "10 mm" -#define EXTRUDE_1MM_TEXT "1mm" -#define EXTRUDE_5MM_TEXT "5mm" -#define EXTRUDE_10MM_TEXT "10mm" +#define EXTRUDE_1MM_TEXT "1 mm" +#define EXTRUDE_5MM_TEXT "5 mm" +#define EXTRUDE_10MM_TEXT "10 mm" #define STEP_1PERCENT "1%" #define STEP_5PERCENT "5%" @@ -819,6 +827,6 @@ extern eeprom_def eeprom_menu; #define DIALOG_UPDATE_WIFI_WEB_EN "Updating wifi model web data" #define DIALOG_UPDATE_NO_DEVICE_EN "Please check whether\nmemory device inserted!" -#define ZOFFSET_STEP001 "0.01mm" -#define ZOFFSET_STEP01 "0.1mm" -#define ZOFFSET_STEP1 "1mm" +#define ZOFFSET_STEP001 "0.01 mm" +#define ZOFFSET_STEP01 "0.1 mm" +#define ZOFFSET_STEP1 "1 mm" diff --git a/Marlin/src/lcd/extui/lib/mks_ui/wifiSerial.cpp b/Marlin/src/lcd/extui/lib/mks_ui/wifiSerial.cpp index 93fce6af30..6999c638f5 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/wifiSerial.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/wifiSerial.cpp @@ -55,10 +55,29 @@ WifiSerial::WifiSerial(usart_dev *usart_device, uint8 tx_pin, uint8 rx_pin) { static void disable_timer_if_necessary(timer_dev *dev, uint8 ch) { if (dev) timer_set_mode(dev, ch, TIMER_DISABLED); } + static void usart_enable_no_irq(usart_dev *usart_device, bool with_irq) { + if (with_irq) usart_enable(usart_device); + else { + usart_reg_map *regs = usart_device->regs; + regs->CR1 |= (USART_CR1_TE | USART_CR1_RE);// don't change the word length etc, and 'or' in the patten not overwrite |USART_CR1_M_8N1); + regs->CR1 |= USART_CR1_UE; + } + } + #elif STM32_MCU_SERIES == STM32_SERIES_F2 || STM32_MCU_SERIES == STM32_SERIES_F4 #define disable_timer_if_necessary(dev, ch) ((void)0) + + static void usart_enable_no_irq(usart_dev *usart_device, bool with_irq) { + if (with_irq) usart_enable(usart_device); + else { + usart_reg_map *regs = usart_device->regs; + regs->CR1 |= (USART_CR1_TE | USART_CR1_RE);// don't change the word length etc, and 'or' in the patten not overwrite |USART_CR1_M_8N1); + regs->CR1 |= USART_CR1_UE; + } + } #else #warning "Unsupported STM32 series; timer conflicts are possible" + #define usart_enable_no_irq(X, Y) usart_enable(X) #endif void WifiSerial::begin(uint32 baud) { begin(baud, SERIAL_8N1); } @@ -89,7 +108,7 @@ void WifiSerial::begin(uint32 baud, uint8_t config) { txi->gpio_device, txi->gpio_bit, config); usart_set_baud_rate(this->usart_device, USART_USE_PCLK, baud); - usart_enable(this->usart_device); + usart_enable_no_irq(this->usart_device, baud == WIFI_BAUDRATE); } void WifiSerial::end(void) { diff --git a/Marlin/src/lcd/extui/lib/mks_ui/wifiSerial.h b/Marlin/src/lcd/extui/lib/mks_ui/wifiSerial.h index e2b560e6fa..656ec1b9d0 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/wifiSerial.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/wifiSerial.h @@ -89,8 +89,9 @@ class WifiSerial { int wifi_rb_is_full(void); - private: + struct usart_dev *usart_device; + private: uint8 tx_pin; uint8 rx_pin; }; diff --git a/Marlin/src/lcd/extui/lib/mks_ui/wifi_module.cpp b/Marlin/src/lcd/extui/lib/mks_ui/wifi_module.cpp index a8537dd3de..dce4ce5977 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/wifi_module.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/wifi_module.cpp @@ -26,6 +26,7 @@ #include "draw_ui.h" #include "wifi_module.h" #include "wifi_upload.h" +#include "SPI_TFT.h" #if ENABLED(MKS_WIFI_MODULE) @@ -36,6 +37,8 @@ #include "../../../../lcd/marlinui.h" #include "../../../../sd/cardreader.h" #include "../../../../module/planner.h" +#include "../../../../module/servo.h" +#include "../../../../module/probe.h" #if ENABLED(POWER_LOSS_RECOVERY) #include "../../../../feature/powerloss.h" #endif @@ -109,10 +112,9 @@ extern IP_PARA ipPara; extern CLOUD_PARA cloud_para; extern bool once_flag, flash_preview_begin, default_preview_flg, gcode_preview_over; +extern bool flash_dma_mode; -uint32_t getWifiTick() { - return millis(); -} +uint32_t getWifiTick() { return millis(); } uint32_t getWifiTickDiff(int32_t lastTick, int32_t curTick) { if (lastTick <= curTick) @@ -149,40 +151,123 @@ void mount_file_sys(uint8_t disk_type) { } } -static void dma_init() { - #if 0 - __HAL_RCC_DMA1_CLK_ENABLE(); - - //HAL_NVIC_SetPriorityGrouping(NVIC_PRIORITYGROUP_0); - HAL_NVIC_SetPriority(DMA1_Channel5_IRQn, 4, 0); - HAL_NVIC_EnableIRQ(DMA1_Channel5_IRQn); - - hdma_usart1_rx.Instance = DMA1_Channel5; - //hdma_usart1_rx.Init.Channel = DMA_CHANNEL_4; - hdma_usart1_rx.Init.Direction = DMA_PERIPH_TO_MEMORY; - hdma_usart1_rx.Init.PeriphInc = DMA_PINC_DISABLE; - hdma_usart1_rx.Init.MemInc = DMA_MINC_ENABLE; - hdma_usart1_rx.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE; - hdma_usart1_rx.Init.MemDataAlignment = DMA_PDATAALIGN_BYTE; - hdma_usart1_rx.Init.Mode = DMA_NORMAL; - hdma_usart1_rx.Init.Priority = DMA_PRIORITY_VERY_HIGH; - if (HAL_DMA_Init((DMA_HandleTypeDef *)&hdma_usart1_rx) != HAL_OK) { - Error_Handler(); +#include +#include +#include + +#include +#include + +#include +#include + +#include +#include +#include +#include + +void changeFlashMode(const bool dmaMode) { + if (flash_dma_mode != dmaMode) { + flash_dma_mode = dmaMode; + if (!flash_dma_mode) { + dma_disable(DMA1, DMA_CH5); + dma_clear_isr_bits(DMA1, DMA_CH4); + } } +} +static bool longName2DosName(const char *longName, uint8_t *dosName) { + uint8_t i; + for (i = FILENAME_LENGTH; i--;) dosName[i] = '\0'; + while (*longName) { + uint8_t c = *longName++; + if (c == '.') { // For a dot... + if (i == 0) return false; + strcat((char *)dosName, ".GCO"); + break; + } + else { + if (c < 0x21 || c == 0x7F) return false; // Check size, non-printable characters + // Fail for illegal characters + PGM_P p = PSTR("|<>^+=?/[];,*\"\\"); + while (const uint8_t b = pgm_read_byte(p++)) if (b == c) return false; + dosName[i++] = c + (WITHIN(c, 'a', 'z') ? 'A' - 'a' : 0); // Uppercase required for 8.3 name + } + if (i >= 5) { + strcat((char *)dosName, "~1.GCO"); + break; + } + } + return dosName[0] != '\0'; // Return true if any name was set +} - HAL_DMA_Start_IT((DMA_HandleTypeDef *)&hdma_usart1_rx, - (uint32_t)&huart1.Instance->DR, - (uint32_t)(&WifiRxFifo.uartTxBuffer[0]), - UART_RX_BUFFER_SIZE); +static int storeRcvData(volatile uint8_t *bufToCpy, int32_t len) { + unsigned char tmpW = wifiDmaRcvFifo.write_cur; - //HAL_UART_Receive_DMA(&huart1,(uint8_t*)&WifiRxFifo.uartTxBuffer[0], UART_RX_BUFFER_SIZE); + if (len > UDISKBUFLEN) return 0; - /* Enable the DMA transfer for the receiver request by setting the DMAR bit - in the UART CR3 register */ - SET_BIT(huart1.Instance->CR3, USART_CR3_DMAR); + if (wifiDmaRcvFifo.state[tmpW] == udisk_buf_empty) { + memcpy((unsigned char *) wifiDmaRcvFifo.bufferAddr[tmpW], (uint8_t *)bufToCpy, len); + wifiDmaRcvFifo.state[tmpW] = udisk_buf_full; + wifiDmaRcvFifo.write_cur = (tmpW + 1) % TRANS_RCV_FIFO_BLOCK_NUM; + return 1; + } + + return 0; +} + +static void esp_dma_pre() { + dma_channel_reg_map *channel_regs = dma_tube_regs(DMA1, DMA_CH5); + + CBI32(channel_regs->CCR, 0); + channel_regs->CMAR = (uint32_t)WIFISERIAL.usart_device->rb->buf; + channel_regs->CNDTR = 0x0000; + channel_regs->CNDTR = UART_RX_BUFFER_SIZE; + DMA1->regs->IFCR = 0xF0000; + SBI32(channel_regs->CCR, 0); +} + +static void dma_ch5_irq_handle() { + uint8 status_bits = dma_get_isr_bits(DMA1, DMA_CH5); + dma_clear_isr_bits(DMA1, DMA_CH5); + if (status_bits & 0x8) { + // DMA transmit Error + } + else if (status_bits & 0x2) { + // DMA transmit complete + if (esp_state == TRANSFER_IDLE) + esp_state = TRANSFERING; + + if (storeRcvData(WIFISERIAL.usart_device->rb->buf, UART_RX_BUFFER_SIZE)) { + esp_dma_pre(); + if (wifiTransError.flag != 0x1) + WIFI_IO1_RESET(); + } + else { + WIFI_IO1_SET(); + esp_state = TRANSFER_STORE; + } + } + else if (status_bits & 0x4) { + // DMA transmit half + WIFI_IO1_SET(); + } +} +static void wifi_usart_dma_init() { + dma_init(DMA1); + uint32_t flags = ( DMA_MINC_MODE | DMA_TRNS_CMPLT | DMA_HALF_TRNS | DMA_TRNS_ERR); + dma_xfer_size dma_bit_size = DMA_SIZE_8BITS; + dma_setup_transfer(DMA1, DMA_CH5, &USART1_BASE->DR, dma_bit_size, + (volatile void*)WIFISERIAL.usart_device->rb->buf, dma_bit_size, flags);// Transmit buffer DMA + dma_set_priority(DMA1, DMA_CH5, DMA_PRIORITY_LOW); + dma_attach_interrupt(DMA1, DMA_CH5, &dma_ch5_irq_handle); + + dma_clear_isr_bits(DMA1, DMA_CH5); + dma_set_num_transfers(DMA1, DMA_CH5, UART_RX_BUFFER_SIZE); + + bb_peri_set_bit(&USART1_BASE->CR3, USART_CR3_DMAR_BIT, 1); + dma_enable(DMA1, DMA_CH5); // enable transmit - #endif for (uint8_t i = 0; i < TRANS_RCV_FIFO_BLOCK_NUM; i++) { wifiDmaRcvFifo.bufferAddr[i] = &bmp_public_buf[1024 * i]; wifiDmaRcvFifo.state[i] = udisk_buf_empty; @@ -193,113 +278,39 @@ static void dma_init() { wifiDmaRcvFifo.write_cur = 0; } -static void wifi_deInit() { - #if 0 - HAL_DMA_Abort((DMA_HandleTypeDef *)&hdma_usart1_rx); - HAL_DMA_DeInit((DMA_HandleTypeDef *)&hdma_usart1_rx); - __HAL_DMA_DISABLE((DMA_HandleTypeDef *)&hdma_usart1_rx); - #endif -} - -extern uint8_t mksUsart1Rx; - void esp_port_begin(uint8_t interrupt) { WifiRxFifo.uart_read_point = 0; WifiRxFifo.uart_write_point = 0; - #if 0 - NVIC_InitTypeDef NVIC_InitStructure; - USART_InitTypeDef USART_InitStructure; - GPIO_InitTypeDef GPIO_InitStruct; + #if 1 - WifiRxFifo.uart_read_point = 0; - WifiRxFifo.uart_write_point = 0; - memset((uint8_t*)WifiRxFifo.uartTxBuffer, 0, sizeof(WifiRxFifo.uartTxBuffer)); - - if (interrupt) { - #if TAN - wifi_deInit (); - - //SZ_STM32_COMInit(COM1, 115200); - __HAL_UART_ENABLE_IT(USART1, USART_IT_RXNE); - - USART_InitStructure.USART_BaudRate = 115200; //���ڵIJ����ʣ�����115200 ��ߴ�4.5Mbits/s - USART_InitStructure.USART_WordLength = USART_WordLength_8b; //�����ֳ���(8λ��9λ) - USART_InitStructure.USART_StopBits = USART_StopBits_1; //�����õ�ֹͣλ-֧��1��2��ֹͣλ - USART_InitStructure.USART_Parity = USART_Parity_No; //����żУ�� - USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; //��Ӳ�������� - USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; //˫��ģʽ��ʹ�ܷ��ͺͽ��� - - __HAL_RCC_USART1_CLK_ENABLE(); - - GPIO_InitStruct.Pin = TFT_WIFI_TX_Pin|TFT_WIFI_RX_Pin; - GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; - GPIO_InitStruct.Pull = GPIO_PULLUP; - GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; - GPIO_InitStruct.Alternate = GPIO_AF7_USART1; - HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); - GPIO_InitStruct.Mode = GPIO_MODE_INPUT; - GPIO_InitStruct.Pin = TFT_WIFI_RX_Pin; - HAL_GPIO_Init(GPIOA,&GPIO_InitStruct); - - USART_Init(USART1, &USART_InitStructure); - - NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn; - // NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; - // NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; - NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 3; - NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; - NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; - - NVIC_Init(&NVIC_InitStructure); - #else - HAL_UART_DeInit(&huart1); - MX_USART1_UART_Init(3); - //__HAL_UART_ENABLE_IT(&huart1, UART_IT_RXNE); - HAL_UART_Receive_IT(&huart1,&mksUsart1Rx,1); + #if ENABLED(MKS_WIFI_MODULE) + WIFISERIAL.end(); + if (interrupt) { + for (uint16_t i = 0; i < 65535; i++) { /*nada*/ } + WIFISERIAL.begin(WIFI_BAUDRATE); + uint32_t serial_connect_timeout = millis() + 1000UL; + while (PENDING(millis(), serial_connect_timeout)) { /*nada*/ } + } + else { + WIFISERIAL.usart_device->regs->CR1 &= ~USART_CR1_RXNEIE; + WIFISERIAL.begin(WIFI_UPLOAD_BAUDRATE); + wifi_usart_dma_init(); + } #endif - } - else{ - #if 0 - NVIC_DisableIRQ(SZ_STM32_COM1_IRQn); - - USART_Cmd(SZ_STM32_COM1, DISABLE); - - RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, DISABLE); - RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE); - SZ_STM32_COMInit(COM1, 1958400); + #else - USART_Cmd(SZ_STM32_COM1, ENABLE); - - wifi_delay(10); - - dma_init(); + #if MKS_WIFI_MODULE + WIFISERIAL.end(); + for (uint16_t i = 0; i < 65535; i++) { /*nada*/ } + WIFISERIAL.begin(interrupt ? WIFI_BAUDRATE : WIFI_UPLOAD_BAUDRATE); + uint32_t serial_connect_timeout = millis() + 1000UL; + while (PENDING(millis(), serial_connect_timeout)) { /*nada*/ } #endif - HAL_UART_DeInit(&huart1); - MX_USART1_UART_Init(5); - //dma1_5_IRQ_sel = 1; - dma_init(); - } - #endif - - #if ENABLED(MKS_WIFI_MODULE) - WIFISERIAL.end(); - for (uint16_t i = 0; i < 65535; i++) { /*nada*/ } - WIFISERIAL.begin(interrupt ? WIFI_BAUDRATE : WIFI_UPLOAD_BAUDRATE); + if (!interrupt) wifi_usart_dma_init(); - const millis_t serial_connect_timeout = millis() + 1000UL; - while (/*!WIFISERIAL && */PENDING(millis(), serial_connect_timeout)) { /*nada*/ } - - if (interrupt) { - //for (uint8_t i=0;i<100;i++) WIFISERIAL.write(0x33); - } - else { - //for (uint16_t i=0;i<65535;i++); //WIFISERIAL.write(0x33); - } #endif - - if (!interrupt) dma_init(); } #if ENABLED(MKS_WIFI_MODULE) @@ -441,10 +452,12 @@ int package_to_wifi(WIFI_RET_TYPE type, uint8_t *buf, int len) { ZERO(buf_to_wifi); index_to_wifi = 0; } + return 1; } -int send_to_wifi(char *buf, int len) { return package_to_wifi(WIFI_TRANS_INF, buf, len); } +#define SEND_OK_TO_WIFI send_to_wifi((uint8_t *)"ok\r\n", strlen("ok\r\n")) +int send_to_wifi(uint8_t *buf, int len) { return package_to_wifi(WIFI_TRANS_INF, buf, len); } void set_cur_file_sys(int fileType) { gCfgItems.fileSysType = fileType; } @@ -463,9 +476,9 @@ void get_file_list(char *path) { char wait_ip_back_flag = 0; typedef struct { - char write_buf[513]; int write_index; uint8_t saveFileName[30]; + uint8_t fileTransfer; uint32_t fileLen; uint32_t tick_begin; uint32_t tick_end; @@ -475,22 +488,43 @@ FILE_WRITER file_writer; int32_t lastFragment = 0; -char lastBinaryCmd[50] = { 0 }; +char saveFilePath[50]; -int total_write = 0; -char binary_head[2] = { 0, 0 }; -unsigned char binary_data_len = 0; +static SdFile upload_file, *upload_curDir; +static filepos_t pos; int write_to_file(char *buf, int len) { - for (int i = 0; i < len; i++) { - file_writer.write_buf[file_writer.write_index++] = buf[i]; + int i; + int res = 0; + + for (i = 0; i < len; i++) { + public_buf[file_writer.write_index++] = buf[i]; if (file_writer.write_index >= 512) { - int res = card.write(file_writer.write_buf, file_writer.write_index); - if (res == -1) return -1; - ZERO(file_writer.write_buf); + res = upload_file.write(public_buf, file_writer.write_index); + + if (res == -1) { + upload_file.close(); + const char * const fname = card.diveToFile(true, upload_curDir, saveFilePath); + + if (upload_file.open(upload_curDir, fname, O_WRITE)) { + upload_file.setpos(&pos); + res = upload_file.write(public_buf, file_writer.write_index); + } + } + if (res == -1) { + return -1; + } + upload_file.getpos(&pos); file_writer.write_index = 0; } } + + if (res == -1) { + memset(public_buf, 0, sizeof(public_buf)); + file_writer.write_index = 0; + return -1; + } + return 0; } @@ -543,10 +577,8 @@ uint8_t Explore_Disk(char* path , uint8_t recu_level) { for (uint8_t i = 0; i < fileCnt; i++) { card.getfilename_sorted(SD_ORDER(i, fileCnt)); - //if (card.longFilename[0] == 0) - strcpy(tmp, card.filename); - //else - // strcpy(tmp, card.longFilename); + memset(tmp, 0, sizeof(tmp)); + strcpy(tmp, card.filename); ZERO(Fstream); strcpy(Fstream, tmp); @@ -584,6 +616,7 @@ static void wifi_gcode_exec(uint8_t *cmd_line) { switch (cmd_value) { case 20: // M20: Print SD / µdisk file + file_writer.fileTransfer = 0; if (uiCfg.print_state == IDLE) { int index = 0; @@ -591,8 +624,8 @@ static void wifi_gcode_exec(uint8_t *cmd_line) { gCfgItems.fileSysType = FILE_SYS_SD; send_to_wifi((uint8_t *)"Begin file list\r\n", strlen("Begin file list\r\n")); get_file_list((char *)"0:/"); - send_to_wifi((char *)"End file list\r\n", strlen("End file list\r\n")); - send_to_wifi((char *)"ok\r\n", strlen("ok\r\n")); + send_to_wifi((uint8_t *)"End file list\r\n", strlen("End file list\r\n")); + SEND_OK_TO_WIFI; break; } @@ -613,14 +646,14 @@ static void wifi_gcode_exec(uint8_t *cmd_line) { get_file_list(path); send_to_wifi((uint8_t *)"End file list\r\n", strlen("End file list\r\n")); } - send_to_wifi((char *)"ok\r\n", strlen("ok\r\n")); + SEND_OK_TO_WIFI; } } break; case 21: /*init sd card*/ - send_to_wifi((char *)"ok\r\n", strlen("ok\r\n")); + SEND_OK_TO_WIFI; break; case 23: @@ -632,15 +665,40 @@ static void wifi_gcode_exec(uint8_t *cmd_line) { if (strstr((char *)&tmpStr[index], ".g") || strstr((char *)&tmpStr[index], ".G")) { if (strlen((char *)&tmpStr[index]) < 80) { ZERO(list_file.file_name[sel_id]); + ZERO(list_file.long_name[sel_id]); + uint8_t has_path_selected = 0; if (gCfgItems.wifi_type == ESP_WIFI) { - if (strncmp((char *)&tmpStr[index], "1:", 2) == 0) + if (strncmp((char *)&tmpStr[index], "1:", 2) == 0) { gCfgItems.fileSysType = FILE_SYS_SD; - else if (strncmp((char *)&tmpStr[index], "0:", 2) == 0) + has_path_selected = 1; + } + else if (strncmp((char *)&tmpStr[index], "0:", 2) == 0) { gCfgItems.fileSysType = FILE_SYS_USB; + has_path_selected = 1; + } else if (tmpStr[index] != '/') - strcat((char *)list_file.file_name[0], "/"); - strcat((char *)list_file.file_name[sel_id], (char *)&tmpStr[index]); + strcat((char *)list_file.file_name[sel_id], "/"); + + if (file_writer.fileTransfer == 1) { + uint8_t dosName[FILENAME_LENGTH]; + uint8_t fileName[sizeof(list_file.file_name[sel_id])]; + fileName[0] = '\0'; + if (has_path_selected == 1) { + strcat((char *)fileName, (char *)&tmpStr[index + 3]); + strcat((char *)list_file.file_name[sel_id], "/"); + } + else strcat((char *)fileName, (char *)&tmpStr[index]); + if (!longName2DosName((const char *)fileName, dosName)) { + strcpy(list_file.file_name[sel_id], "notValid"); + } + strcat((char *)list_file.file_name[sel_id], (char *)dosName); + strcat((char *)list_file.long_name[sel_id], (char *)dosName); + } + else { + strcat((char *)list_file.file_name[sel_id], (char *)&tmpStr[index]); + strcat((char *)list_file.long_name[sel_id], (char *)&tmpStr[index]); + } } else @@ -656,7 +714,7 @@ static void wifi_gcode_exec(uint8_t *cmd_line) { send_to_wifi((uint8_t *)"file.open failed\r\n", strlen("file.open failed\r\n")); strcpy(list_file.file_name[sel_id], "notValid"); } - send_to_wifi((char *)"ok\r\n", strlen("ok\r\n")); + SEND_OK_TO_WIFI; } } } @@ -680,6 +738,7 @@ static void wifi_gcode_exec(uint8_t *cmd_line) { SdFile file; SdFile *curDir; + card.endFilePrint(); const char * const fname = card.diveToFile(true, curDir, cur_name); if (!fname) return; if (file.open(curDir, fname, O_READ)) { @@ -726,7 +785,7 @@ static void wifi_gcode_exec(uint8_t *cmd_line) { lv_draw_printing(); } } - send_to_wifi((char *)"ok\r\n", strlen("ok\r\n")); + SEND_OK_TO_WIFI; break; case 25: @@ -745,7 +804,7 @@ static void wifi_gcode_exec(uint8_t *cmd_line) { else default_preview_flg = true; lv_draw_printing(); - send_to_wifi((char *)"ok\r\n", strlen("ok\r\n")); + SEND_OK_TO_WIFI; } break; @@ -762,7 +821,7 @@ static void wifi_gcode_exec(uint8_t *cmd_line) { lv_draw_ready_print(); - send_to_wifi((char *)"ok\r\n", strlen("ok\r\n")); + SEND_OK_TO_WIFI; } break; @@ -805,8 +864,7 @@ static void wifi_gcode_exec(uint8_t *cmd_line) { ZERO(tempBuf); sprintf((char *)tempBuf, "Writing to file: %s\r\n", (char *)file_writer.saveFileName); wifi_ret_ack(); - send_to_wifi((char *)tempBuf, strlen((char *)tempBuf)); - total_write = 0; + send_to_wifi((uint8_t *)tempBuf, strlen((char *)tempBuf)); wifi_link_state = WIFI_WAIT_TRANS_START; } else { @@ -822,7 +880,7 @@ static void wifi_gcode_exec(uint8_t *cmd_line) { case 991: ZERO(tempBuf); if (cmd_value == 105) { - send_to_wifi((char *)"ok\r\n", strlen("ok\r\n")); + SEND_OK_TO_WIFI; sprintf((char *)tempBuf,"T:%.1f /%.1f B:%.1f /%.1f T0:%.1f /%.1f T1:%.1f /%.1f @:0 B@:0\r\n", (float)thermalManager.temp_hotend[0].celsius, (float)thermalManager.temp_hotend[0].target, @@ -891,7 +949,7 @@ static void wifi_gcode_exec(uint8_t *cmd_line) { } else if (uiCfg.print_state == PAUSED) { wifi_ret_ack(); - send_to_wifi((char *)"M997 PAUSE\r\n", strlen("M997 PAUSE\r\n")); + send_to_wifi((uint8_t *)"M997 PAUSE\r\n", strlen("M997 PAUSE\r\n")); } else if (uiCfg.print_state == REPRINTING) { wifi_ret_ack(); @@ -913,8 +971,8 @@ static void wifi_gcode_exec(uint8_t *cmd_line) { case 115: ZERO(tempBuf); - send_to_wifi((char *)"ok\r\n", strlen("ok\r\n")); - send_to_wifi((char *)"FIRMWARE_NAME:Robin_nano\r\n", strlen("FIRMWARE_NAME:Robin_nano\r\n")); + SEND_OK_TO_WIFI; + send_to_wifi((uint8_t *)"FIRMWARE_NAME:Robin_nano\r\n", strlen("FIRMWARE_NAME:Robin_nano\r\n")); break; default: @@ -935,7 +993,7 @@ static void wifi_gcode_exec(uint8_t *cmd_line) { index++; } if (left - WIFI_GCODE_BUFFER_LEAST_SIZE >= strlen((const char *)cmd_line)) - send_to_wifi((char *)"ok\r\n", strlen("ok\r\n")); + SEND_OK_TO_WIFI; else need_ok_later = true; } @@ -961,7 +1019,7 @@ static void wifi_gcode_exec(uint8_t *cmd_line) { index++; } if (left_g - WIFI_GCODE_BUFFER_LEAST_SIZE >= strlen((const char *)cmd_line)) - send_to_wifi((char *)"ok\r\n", strlen("ok\r\n")); + SEND_OK_TO_WIFI; else need_ok_later = true; } @@ -1191,29 +1249,6 @@ void utf8_2_unicode(uint8_t *source,uint8_t Len) { COPY(source, FileName_unicode); } -char saveFilePath[50]; - -static bool longName2DosName(const char* longName, uint8_t* dosName) { - uint8_t i = 11; - while (i--) dosName[i] = '\0'; - while (*longName) { - uint8_t c = *longName++; - if (c == '.') { // For a dot... - if (i == 0) return false; - else { strcat((char *)dosName,".GCO"); return dosName[0] != '\0'; } - } - else { - // Fail for illegal characters - PGM_P p = PSTR("|<>^+=?/[];,*\"\\"); - while (uint8_t b = pgm_read_byte(p++)) if (b == c) return false; - if (c < 0x21 || c == 0x7F) return false; // Check size, non-printable characters - dosName[i++] = (c < 'a' || c > 'z') ? (c) : (c + ('A' - 'a')); // Uppercase required for 8.3 name - } - if (i >= 5) strcat((char *)dosName,"~1.GCO"); - } - return dosName[0] != '\0'; // Return true if any name was set -} - static void file_first_msg_handle(uint8_t * msg, uint16_t msgLen) { uint8_t fileNameLen = *msg; @@ -1226,7 +1261,7 @@ static void file_first_msg_handle(uint8_t * msg, uint16_t msgLen) { utf8_2_unicode(file_writer.saveFileName,fileNameLen); - ZERO(file_writer.write_buf); + ZERO(public_buf); if (strlen((const char *)file_writer.saveFileName) > sizeof(saveFilePath)) return; @@ -1234,11 +1269,7 @@ static void file_first_msg_handle(uint8_t * msg, uint16_t msgLen) { ZERO(saveFilePath); if (gCfgItems.fileSysType == FILE_SYS_SD) { - //sprintf((char *)saveFilePath, "/%s", file_writer.saveFileName); - card.mount(); - - //ZERO(list_file.long_name[sel_id]); - //memcpy(list_file.long_name[sel_id],file_writer.saveFileName,sizeof(list_file.long_name[sel_id])); + TERN_(SDSUPPORT, card.mount()); } else if (gCfgItems.fileSysType == FILE_SYS_USB) { @@ -1266,26 +1297,19 @@ static void file_first_msg_handle(uint8_t * msg, uint16_t msgLen) { lv_draw_dialog(DIALOG_TYPE_UPLOAD_FILE); return; } - sprintf((char *)saveFilePath, "/%s", dosName); - - ZERO(list_file.long_name[sel_id]); - memcpy(list_file.long_name[sel_id], dosName, sizeof(dosName)); + sprintf((char *)saveFilePath, "%s", dosName); - char *cur_name=strrchr((const char *)saveFilePath,'/'); + card.cdroot(); + upload_file.close(); + const char * const fname = card.diveToFile(true, upload_curDir, saveFilePath); - SdFile file; - SdFile *curDir; - card.endFilePrint(); - const char * const fname = card.diveToFile(true, curDir, cur_name); - if (!fname) return; - if (file.open(curDir, fname, O_CREAT | O_APPEND | O_WRITE | O_TRUNC)) { - gCfgItems.curFilesize = file.fileSize(); - } - else { + if (!upload_file.open(upload_curDir, fname, O_CREAT | O_APPEND | O_WRITE | O_TRUNC)) { clear_cur_ui(); upload_result = 2; + wifiTransError.flag = 1; wifiTransError.start_tick = getWifiTick(); + lv_draw_dialog(DIALOG_TYPE_UPLOAD_FILE); return; } @@ -1302,22 +1326,23 @@ static void file_first_msg_handle(uint8_t * msg, uint16_t msgLen) { lv_task_handler(); file_writer.tick_begin = getWifiTick(); + + file_writer.fileTransfer = 1; } -#define FRAG_MASK _BV32(31) +#define FRAG_MASK ~_BV32(31) static void file_fragment_msg_handle(uint8_t * msg, uint16_t msgLen) { uint32_t frag = *((uint32_t *)msg); - if ((frag & FRAG_MASK) != (uint32_t)(lastFragment + 1)) { - ZERO(file_writer.write_buf); + ZERO(public_buf); file_writer.write_index = 0; wifi_link_state = WIFI_CONNECTED; upload_result = 2; } else { if (write_to_file((char *)msg + 4, msgLen - 4) < 0) { - ZERO(file_writer.write_buf); + ZERO(public_buf); file_writer.write_index = 0; wifi_link_state = WIFI_CONNECTED; upload_result = 2; @@ -1325,16 +1350,31 @@ static void file_fragment_msg_handle(uint8_t * msg, uint16_t msgLen) { } lastFragment = frag; - if ((frag & (~FRAG_MASK))) { - int res = card.write(file_writer.write_buf, file_writer.write_index); + if ((frag & (~FRAG_MASK)) != 0) { + int res = upload_file.write(public_buf, file_writer.write_index); if (res == -1) { - ZERO(file_writer.write_buf); + upload_file.close(); + const char * const fname = card.diveToFile(true, upload_curDir, saveFilePath); + if (upload_file.open(upload_curDir, fname, O_WRITE)) { + upload_file.setpos(&pos); + res = upload_file.write(public_buf, file_writer.write_index); + } + } + upload_file.close(); + SdFile file, *curDir; + const char * const fname = card.diveToFile(true, curDir, saveFilePath); + if (file.open(curDir, fname, O_RDWR)) { + gCfgItems.curFilesize = file.fileSize(); + file.close(); + } + else { + ZERO(public_buf); file_writer.write_index = 0; wifi_link_state = WIFI_CONNECTED; upload_result = 2; return; } - ZERO(file_writer.write_buf); + ZERO(public_buf); file_writer.write_index = 0; file_writer.tick_end = getWifiTick(); upload_time = getWifiTickDiff(file_writer.tick_begin, file_writer.tick_end) / 1000; @@ -1342,7 +1382,6 @@ static void file_fragment_msg_handle(uint8_t * msg, uint16_t msgLen) { wifi_link_state = WIFI_CONNECTED; upload_result = 3; } - } } @@ -1453,7 +1492,6 @@ void esp_data_parser(char *cmdRxBuf, int len) { esp_msg_index = 0; return; } - if ((charAtArray(esp_msg_buf, esp_msg_index, ESP_PROTOC_HEAD) != -1) && (charAtArray(esp_msg_buf, esp_msg_index, ESP_PROTOC_TAIL) != -1)) loop_again = true; } @@ -1461,19 +1499,6 @@ void esp_data_parser(char *cmdRxBuf, int len) { } int32_t tick_net_time1, tick_net_time2; - -int storeRcvData(int32_t len) { - unsigned char tmpW = wifiDmaRcvFifo.write_cur; - if (len <= UDISKBUFLEN && wifiDmaRcvFifo.state[tmpW] == udisk_buf_empty) { - for (uint16_t i = 0; i < len; i++) - wifiDmaRcvFifo.bufferAddr[tmpW][i] = WIFISERIAL.read(); - wifiDmaRcvFifo.state[tmpW] = udisk_buf_full; - wifiDmaRcvFifo.write_cur = (tmpW + 1) % TRANS_RCV_FIFO_BLOCK_NUM; - return 1; - } - return 0; -} - int32_t readWifiFifo(uint8_t *retBuf, uint32_t bufLen) { unsigned char tmpR = wifiDmaRcvFifo.read_cur; if (bufLen >= UDISKBUFLEN && wifiDmaRcvFifo.state[tmpR] == udisk_buf_full) { @@ -1496,20 +1521,33 @@ void stopEspTransfer() { wifiTransError.start_tick = getWifiTick(); card.removeFile((const char *)saveFilePath); } - else { - } + wifi_delay(200); WIFI_IO1_SET(); - //exchangeFlashMode(1); //change spi flash to use dma mode + + // disable dma + dma_clear_isr_bits(DMA1, DMA_CH5); + bb_peri_set_bit(&USART1_BASE->CR3, USART_CR3_DMAR_BIT, 0); + dma_disable(DMA1, DMA_CH5); + + wifi_delay(200); + changeFlashMode(true); // Set SPI flash to use DMA mode esp_port_begin(1); + wifi_delay(200); + + W25QXX.init(SPI_QUARTER_SPEED); + + TERN_(HAS_TFT_LVGL_UI_SPI, SPI_TFT.spi_init(SPI_FULL_SPEED)); + TERN_(HAS_SERVOS, servo_init()); + TERN_(HAS_Z_SERVO_PROBE, probe.servo_probe_init()); + if (wifiTransError.flag != 0x1) WIFI_IO1_RESET(); } void wifi_rcv_handle() { int32_t len = 0; - uint8_t ucStr[(UART_RX_BUFFER_SIZE) + 1] = { 0 }; + uint8_t ucStr[(UART_RX_BUFFER_SIZE) + 1] = {0}; int8_t getDataF = 0; - if (wifi_link_state == WIFI_TRANS_FILE) { #if 0 if (WIFISERIAL.available() == UART_RX_BUFFER_SIZE) { @@ -1531,9 +1569,9 @@ void wifi_rcv_handle() { getDataF = 1; } if (esp_state == TRANSFER_STORE) { - if (storeRcvData(UART_RX_BUFFER_SIZE)) { + if (storeRcvData(WIFISERIAL.usart_device->rb->buf, UART_RX_BUFFER_SIZE)) { esp_state = TRANSFERING; - //esp_dma_pre(); + esp_dma_pre(); if (wifiTransError.flag != 0x1) WIFI_IO1_RESET(); } else @@ -1541,13 +1579,11 @@ void wifi_rcv_handle() { } } else { - //len = readUsartFifo((SZ_USART_FIFO *)&WifiRxFifo, (int8_t *)ucStr, UART_RX_BUFFER_SIZE); len = readWifiBuf((int8_t *)ucStr, UART_RX_BUFFER_SIZE); if (len > 0) { esp_data_parser((char *)ucStr, len); - if (wifi_link_state == WIFI_TRANS_FILE) { - //exchangeFlashMode(0); //change spi flash not use dma mode + changeFlashMode(false); // Set SPI flash to use non-DMA mode wifi_delay(10); esp_port_begin(0); wifi_delay(10); @@ -1558,7 +1594,7 @@ void wifi_rcv_handle() { } if (need_ok_later && (queue.length < BUFSIZE)) { need_ok_later = false; - send_to_wifi((char *)"ok\r\n", strlen("ok\r\n")); + send_to_wifi((uint8_t *)"ok\r\n", strlen("ok\r\n")); } } @@ -1569,7 +1605,7 @@ void wifi_rcv_handle() { tick_net_time2 = getWifiTick(); if (wifi_link_state == WIFI_TRANS_FILE) { - if ((tick_net_time1 != 0) && (getWifiTickDiff(tick_net_time1, tick_net_time2) > 4500)) { + if (tick_net_time1 && getWifiTickDiff(tick_net_time1, tick_net_time2) > 8000) { wifi_link_state = WIFI_CONNECTED; upload_result = 2; clear_cur_ui(); @@ -1577,11 +1613,10 @@ void wifi_rcv_handle() { lv_draw_dialog(DIALOG_TYPE_UPLOAD_FILE); } } - - if ((tick_net_time1 != 0) && (getWifiTickDiff(tick_net_time1, tick_net_time2) > 10000)) + if (tick_net_time1 && getWifiTickDiff(tick_net_time1, tick_net_time2) > 10000) wifi_link_state = WIFI_NOT_CONFIG; - if ((tick_net_time1 != 0) && (getWifiTickDiff(tick_net_time1, tick_net_time2) > 120000)) { + if (tick_net_time1 && getWifiTickDiff(tick_net_time1, tick_net_time2) > 120000) { wifi_link_state = WIFI_NOT_CONFIG; wifi_reset(); tick_net_time1 = getWifiTick(); @@ -1598,7 +1633,10 @@ void wifi_rcv_handle() { } void wifi_looping() { - do { wifi_rcv_handle(); } while (wifi_link_state == WIFI_TRANS_FILE); + do { + wifi_rcv_handle(); + watchdog_refresh(); + } while (wifi_link_state == WIFI_TRANS_FILE); } void mks_esp_wifi_init() { @@ -1616,32 +1654,8 @@ void mks_esp_wifi_init() { wifi_reset(); #if 0 - res = f_open(&esp_upload.uploadFile, ESP_FIRMWARE_FILE, FA_OPEN_EXISTING | FA_READ); - - if (res == FR_OK) { - f_close(&esp_upload.uploadFile); - - wifi_delay(2000); - - if (usartFifoAvailable((SZ_USART_FIFO *)&WifiRxFifo) < 20) { - return; - } - - clear_cur_ui(); - - draw_dialog(DIALOG_TYPE_UPDATE_ESP_FIRMARE); - - if (wifi_upload(0) >= 0) { - - f_unlink("1:/MKS_WIFI_CUR"); - f_rename(ESP_FIRMWARE_FILE,"/MKS_WIFI_CUR"); - } - draw_return_ui(); - - update_flag = 1; - } - if (update_flag == 0) { - res = f_open(&esp_upload.uploadFile, ESP_WEB_FIRMWARE_FILE, FA_OPEN_EXISTING | FA_READ); + if (update_flag == 0) { + res = f_open(&esp_upload.uploadFile, ESP_WEB_FIRMWARE_FILE, FA_OPEN_EXISTING | FA_READ); if (res == FR_OK) { f_close(&esp_upload.uploadFile); @@ -1694,32 +1708,42 @@ void mks_esp_wifi_init() { wifi_link_state = WIFI_NOT_CONFIG; } -#define BUF_INC_POINTER(p) ((p + 1 == UART_FIFO_BUFFER_SIZE) ? 0 : (p + 1)) -int usartFifoAvailable(SZ_USART_FIFO *fifo) { - int diff = fifo->uart_write_point - fifo->uart_read_point; - if (diff < 0) diff += UART_FIFO_BUFFER_SIZE; - return diff; -} +void mks_wifi_firmware_update() { + card.openFileRead((char *)ESP_FIRMWARE_FILE); + + if (card.isFileOpen()) { + card.closefile(); + + wifi_delay(2000); -int readUsartFifo(SZ_USART_FIFO *fifo, int8_t *buf, int32_t len) { - int i = 0 ; - while (i < len && fifo->uart_read_point != fifo->uart_write_point) { - buf[i++] = fifo->uartTxBuffer[fifo->uart_read_point]; - fifo->uart_read_point = BUF_INC_POINTER(fifo->uart_read_point); + if (usartFifoAvailable((SZ_USART_FIFO *)&WifiRxFifo) < 20) + return; + + clear_cur_ui(); + + lv_draw_dialog(DIALOG_TYPE_UPDATE_ESP_FIRMARE); + + lv_task_handler(); + watchdog_refresh(); + + if (wifi_upload(0) >= 0) { + card.removeFile((char *)ESP_FIRMWARE_FILE_RENAME); + SdFile file, *curDir; + const char * const fname = card.diveToFile(true, curDir, ESP_FIRMWARE_FILE); + if (file.open(curDir, fname, O_READ)) { + file.rename(curDir, (char *)ESP_FIRMWARE_FILE_RENAME); + file.close(); + } + } + clear_cur_ui(); } - return i; } -int writeUsartFifo(SZ_USART_FIFO *fifo, int8_t *buf, int32_t len) { - if (buf == 0 || len <= 0) return -1; +#define BUF_INC_POINTER(p) ((p + 1 == UART_FIFO_BUFFER_SIZE) ? 0:(p + 1)) - int i = 0 ; - while (i < len && fifo->uart_read_point != BUF_INC_POINTER(fifo->uart_write_point)) { - fifo->uartTxBuffer[fifo->uart_write_point] = buf[i++]; - fifo->uart_write_point = BUF_INC_POINTER(fifo->uart_write_point); - } - return i; +int usartFifoAvailable(SZ_USART_FIFO *fifo) { + return WIFISERIAL.available(); } void get_wifi_commands() { @@ -1791,10 +1815,9 @@ void get_wifi_commands() { if (!wifi_comment_mode) wifi_line_buffer[wifi_read_count++] = wifi_char; } } - }// queue has space, serial has data - else { + } // queue has space, serial has data + else espGcodeFifo.wait_tick++; - } } int readWifiBuf(int8_t *buf, int32_t len) { diff --git a/Marlin/src/lcd/extui/lib/mks_ui/wifi_module.h b/Marlin/src/lcd/extui/lib/mks_ui/wifi_module.h index 30da25bbe0..07ae6f72db 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/wifi_module.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/wifi_module.h @@ -34,11 +34,6 @@ #define UART_RX_BUFFER_SIZE 1024 #define UART_FIFO_BUFFER_SIZE 1024 -#define ESP_WIFI 0x02 - -#define AP_MODEL 0x01 -#define STA_MODEL 0x02 - #define WIFI_DECODE_TYPE 1 #define IP_DHCP_FLAG 1 @@ -66,7 +61,7 @@ typedef enum{ udisk_buf_full, } UDISK_DATA_BUFFER_STATE; -#define TRANS_RCV_FIFO_BLOCK_NUM 8 +#define TRANS_RCV_FIFO_BLOCK_NUM 14 typedef struct { unsigned char *bufferAddr[TRANS_RCV_FIFO_BLOCK_NUM]; @@ -164,7 +159,7 @@ typedef enum { typedef struct { uint32_t uart_read_point; uint32_t uart_write_point; - uint8_t uartTxBuffer[UART_FIFO_BUFFER_SIZE]; + //uint8_t uartTxBuffer[UART_FIFO_BUFFER_SIZE]; } SZ_USART_FIFO; #define WIFI_GCODE_BUFFER_LEAST_SIZE 96 @@ -195,7 +190,7 @@ extern int package_to_wifi(WIFI_RET_TYPE type, uint8_t *buf, int len); extern void get_wifi_list_command_send(); extern void get_wifi_commands(); extern int readWifiBuf(int8_t *buf, int32_t len); -extern int storeRcvData(int32_t len); +extern void mks_wifi_firmware_update(); #ifdef __cplusplus } /* C-declarations for C++ */ diff --git a/Marlin/src/lcd/extui/lib/mks_ui/wifi_upload.cpp b/Marlin/src/lcd/extui/lib/mks_ui/wifi_upload.cpp index 8b3c4edfcd..2776db3cac 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/wifi_upload.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/wifi_upload.cpp @@ -28,6 +28,7 @@ #include "wifi_upload.h" #include "../../../../MarlinCore.h" +#include "../../../../sd/cardreader.h" #define WIFI_SET() WRITE(WIFI_RESET_PIN, HIGH); #define WIFI_RESET() WRITE(WIFI_RESET_PIN, LOW); @@ -85,6 +86,7 @@ static const uint32_t defaultTimeout = 500; static const uint32_t eraseTimeout = 15000; static const uint32_t blockWriteTimeout = 200; static const uint32_t blockWriteInterval = 15; // 15ms is long enough, 10ms is mostly too short +static SdFile update_file, *update_curDir; // Messages corresponding to result codes, should make sense when followed by " error" const char *resultMessages[] = { @@ -113,23 +115,15 @@ signed char IsReady() { return esp_upload.state == upload_idle; } -void uploadPort_write(const uint8_t *buf, size_t len) { - #if 0 - int i; - - for (i = 0; i < len; i++) { - while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET) { /* nada */ } - USART_SendData(USART1, *(buf + i)); - } - #endif +void uploadPort_write(const uint8_t *buf, const size_t len) { + for (size_t i = 0; i < len; i++) + WIFISERIAL.write(*(buf + i)); } char uploadPort_read() { uint8_t retChar; - if (readUsartFifo(&WifiRxFifo, (int8_t *)&retChar, 1) == 1) - return retChar; - else - return 0; + retChar = WIFISERIAL.read(); + return _MAX(retChar, 0); } int uploadPort_available() { @@ -156,25 +150,21 @@ void flushInput() { // Extract 1-4 bytes of a value in little-endian order from a buffer beginning at a specified offset uint32_t getData(unsigned byteCnt, const uint8_t *buf, int ofst) { uint32_t val = 0; - if (buf && byteCnt) { unsigned int shiftCnt = 0; - if (byteCnt > 4) - byteCnt = 4; - do{ + NOMORE(byteCnt, 4); + do { val |= (uint32_t)buf[ofst++] << shiftCnt; shiftCnt += 8; } while (--byteCnt); } - return(val); + return val; } // Put 1-4 bytes of a value in little-endian order into a buffer beginning at a specified offset. void putData(uint32_t val, unsigned byteCnt, uint8_t *buf, int ofst) { if (buf && byteCnt) { - if (byteCnt > 4) { - byteCnt = 4; - } + NOMORE(byteCnt, 4); do { buf[ofst++] = (uint8_t)(val & 0xFF); val >>= 8; @@ -191,44 +181,25 @@ void putData(uint32_t val, unsigned byteCnt, uint8_t *buf, int ofst) { // -2 - a SLIP escape byte was found but the following byte wasn't available // -3 - a SLIP escape byte was followed by an invalid byte int ReadByte(uint8_t *data, signed char slipDecode) { - if (uploadPort_available() == 0) { - return(0); - } + if (uploadPort_available() == 0) return 0; - // at least one byte is available + // At least one byte is available *data = uploadPort_read(); - if (!slipDecode) { - return(1); - } - if (*data == 0xC0) { - // this shouldn't happen - return(-1); - } + if (!slipDecode) return 1; - // if not the SLIP escape, we're done - if (*data != 0xDB) { - return(1); - } + if (*data == 0xC0) return -1; // This shouldn't happen + if (*data != 0xDB) return 1; // If not the SLIP escape, we're done // SLIP escape, check availability of subsequent byte - if (uploadPort_available() == 0) { - return(-2); - } + if (uploadPort_available() == 0) return -2; // process the escaped byte *data = uploadPort_read(); - if (*data == 0xDC) { - *data = 0xC0; - return(2); - } + if (*data == 0xDC) { *data = 0xC0; return 2; } + if (*data == 0xDD) { *data = 0xDB; return 2; } - if (*data == 0xDD) { - *data = 0xDB; - return(2); - } - // invalid - return(-3); + return -3; // invalid } // When we write a sync packet, there must be no gaps between most of the characters. // So use this function, which does a block write to the UART buffer in the latest CoreNG. @@ -242,7 +213,7 @@ void WriteByteRaw(uint8_t b) { } // Write a byte to the serial port optionally SLIP encoding. Return the number of bytes actually written. -void WriteByteSlip(uint8_t b) { +void WriteByteSlip(const uint8_t b) { if (b == 0xC0) { WriteByteRaw(0xDB); WriteByteRaw(0xDC); @@ -251,9 +222,8 @@ void WriteByteSlip(uint8_t b) { WriteByteRaw(0xDB); WriteByteRaw(0xDD); } - else { + else uploadPort_write((const uint8_t *)&b, 1); - } } // Wait for a data packet to be returned. If the body of the packet is @@ -295,10 +265,10 @@ EspUploadResult readPacket(uint8_t op, uint32_t *valp, size_t *bodyLen, uint32_t EspUploadResult stat; //IWDG_ReloadCounter(); + watchdog_refresh(); - if (getWifiTickDiff(startTime, getWifiTick()) > msTimeout) { - return(timeout); - } + if (getWifiTickDiff(startTime, getWifiTick()) > msTimeout) + return timeout; if (uploadPort_available() < needBytes) { // insufficient data available @@ -310,9 +280,7 @@ EspUploadResult readPacket(uint8_t op, uint32_t *valp, size_t *bodyLen, uint32_t switch (state) { case begin: // expecting frame start c = uploadPort_read(); - if (c != (uint8_t)0xC0) { - break; - } + if (c == (uint8_t)0xC0) break; state = header; needBytes = 2; break; @@ -323,50 +291,45 @@ EspUploadResult readPacket(uint8_t op, uint32_t *valp, size_t *bodyLen, uint32_t break; case header: // reading an 8-byte header - case body: // reading the response body - { - int rslt; - // retrieve a byte with SLIP decoding - rslt = ReadByte(&c, 1); - if (rslt != 1 && rslt != 2) { - // some error occurred - stat = (rslt == 0 || rslt == -2) ? slipData : slipFrame; - return stat; - } - else if (state == header) { - //store the header byte - hdr[hdrIdx++] = c; - if (hdrIdx >= headerLength) { - // get the body length, prepare a buffer for it - *bodyLen = (uint16_t)getData(2, hdr, 2); - - // extract the value, if requested - if (valp != 0) { - *valp = getData(4, hdr, 4); - } - - if (*bodyLen != 0) { - state = body; - } - else { - needBytes = 1; - state = end; - } - } - } - else { - // Store the response body byte, check for completion - if (bodyIdx < ARRAY_SIZE(respBuf)) { - respBuf[bodyIdx] = c; - } - ++bodyIdx; - if (bodyIdx >= *bodyLen) { + case body: { // reading the response body + int rslt; + // retrieve a byte with SLIP decoding + rslt = ReadByte(&c, 1); + if (rslt != 1 && rslt != 2) { + // some error occurred + stat = (rslt == 0 || rslt == -2) ? slipData : slipFrame; + return stat; + } + else if (state == header) { + //store the header byte + hdr[hdrIdx++] = c; + if (hdrIdx >= headerLength) { + // get the body length, prepare a buffer for it + *bodyLen = (uint16_t)getData(2, hdr, 2); + + // extract the value, if requested + if (valp) + *valp = getData(4, hdr, 4); + + if (*bodyLen != 0) + state = body; + else { needBytes = 1; state = end; } } } - break; + else { + // Store the response body byte, check for completion + if (bodyIdx < ARRAY_SIZE(respBuf)) + respBuf[bodyIdx] = c; + + if (++bodyIdx >= *bodyLen) { + needBytes = 1; + state = end; + } + } + } break; default: return slipState; // this shouldn't happen } @@ -376,9 +339,7 @@ EspUploadResult readPacket(uint8_t op, uint32_t *valp, size_t *bodyLen, uint32_t resp = (uint8_t)getData(1, hdr, 0); opRet = (uint8_t)getData(1, hdr, 1); // Sync packets often provoke a response with a zero opcode instead of ESP_SYNC - if (resp != 0x01 || opRet != op) { - return respHeader; - } + if (resp != 0x01 || opRet != op) return respHeader; return success; } @@ -483,6 +444,7 @@ EspUploadResult Sync(uint16_t timeout) { for (;;) { size_t bodyLen; EspUploadResult rc = readPacket(ESP_SYNC, 0, &bodyLen, defaultTimeout); + watchdog_refresh(); if (rc != success || bodyLen != 2) break; } } @@ -527,7 +489,6 @@ uint16_t checksum(const uint8_t *data, uint16_t dataLen, uint16_t cksum) { } EspUploadResult flashWriteBlock(uint16_t flashParmVal, uint16_t flashParmMask) { - #if 0 const uint32_t blkSize = EspFlashBlockSize; int i; @@ -548,15 +509,14 @@ EspUploadResult flashWriteBlock(uint16_t flashParmVal, uint16_t flashParmMask) { putData(0, 4, blkBuf, hdrOfst + 12); // Get the data for the block - f_read(&esp_upload.uploadFile, blkBuf + dataOfst, blkSize, &cnt );//->Read(reinterpret_cast(blkBuf + dataOfst), blkSize); + cnt = update_file.read(blkBuf + dataOfst, blkSize); //->Read(reinterpret_cast(blkBuf + dataOfst), blkSize); if (cnt != blkSize) { - if (f_tell(&esp_upload.uploadFile) == esp_upload.fileSize) { + if (update_file.curPosition() == esp_upload.fileSize) { // partial last block, fill the remainder memset(blkBuf + dataOfst + cnt, 0xFF, blkSize - cnt); } - else { + else return fileRead; - } } // Patch the flash parameters into the first block if it is loaded at address 0 @@ -573,212 +533,132 @@ EspUploadResult flashWriteBlock(uint16_t flashParmVal, uint16_t flashParmMask) { if ((stat = doCommand(ESP_FLASH_DATA, blkBuf, blkBufSize, cksum, 0, blockWriteTimeout)) == success) break; return stat; - #else - return success; - #endif } void upload_spin() { - #if 0 - switch (esp_upload.state) { - case resetting: - - if (esp_upload.connectAttemptNumber == 9) { - // Time to give up - //Network::ResetWiFi(); - esp_upload.uploadResult = connected; - esp_upload.state = done; - } - else { - - // Reset the serial port at the new baud rate. Also reset the ESP8266. - // const uint32_t baud = uploadBaudRates[esp_upload.connectAttemptNumber/esp_upload.retriesPerBaudRate]; - if (esp_upload.connectAttemptNumber % esp_upload.retriesPerBaudRate == 0) { - } - //uploadPort.begin(baud); - //uploadPort_close(); - - uploadPort_begin(); - - wifi_delay(2000); - - flushInput(); - - esp_upload.lastAttemptTime = esp_upload.lastResetTime = getWifiTick(); - esp_upload.state = connecting; - } - break; - - case connecting: - if ((getWifiTickDiff(esp_upload.lastAttemptTime, getWifiTick()) >= connectAttemptInterval) && (getWifiTickDiff(esp_upload.lastResetTime, getWifiTick()) >= 500)) { - // Attempt to establish a connection to the ESP8266. - EspUploadResult res = Sync(5000); - esp_upload.lastAttemptTime = getWifiTick(); - if (res == success) { - // Successful connection - //MessageF(" success on attempt %d\n", (connectAttemptNumber % retriesPerBaudRate) + 1); - //printf("connect success\n"); - esp_upload.state = erasing; - } - else { - // This attempt failed - esp_upload.connectAttemptNumber++; - if (esp_upload.connectAttemptNumber % retriesPerReset == 0) { - esp_upload.state = resetting; // try a reset and a lower baud rate - } - } - } - break; - - case erasing: - if (getWifiTickDiff(esp_upload.lastAttemptTime, getWifiTick()) >= blockWriteInterval) { - uint32_t eraseSize; - const uint32_t sectorsPerBlock = 16; - const uint32_t sectorSize = 4096; - const uint32_t numSectors = (esp_upload.fileSize + sectorSize - 1)/sectorSize; - const uint32_t startSector = esp_upload.uploadAddress/sectorSize; - - uint32_t headSectors = sectorsPerBlock - (startSector % sectorsPerBlock); - NOMORE(headSectors, numSectors); - - eraseSize = (numSectors < 2 * headSectors) - ? (numSectors + 1) / 2 * sectorSize - : (numSectors - headSectors) * sectorSize; - - //MessageF("Erasing %u bytes...\n", fileSize); - esp_upload.uploadResult = flashBegin(esp_upload.uploadAddress, eraseSize); - if (esp_upload.uploadResult == success) { - //MessageF("Uploading file...\n"); - esp_upload.uploadBlockNumber = 0; - esp_upload.uploadNextPercentToReport = percentToReportIncrement; - esp_upload.lastAttemptTime = getWifiTick(); - esp_upload.state = uploading; + switch (esp_upload.state) { + case resetting: + if (esp_upload.connectAttemptNumber == 9) { + esp_upload.uploadResult = connected; + esp_upload.state = done; } else { - //MessageF("Erase failed\n"); - esp_upload.state = done; + uploadPort_begin(); + wifi_delay(2000); + flushInput(); + esp_upload.lastAttemptTime = esp_upload.lastResetTime = getWifiTick(); + esp_upload.state = connecting; } - } - break; - - case uploading: - // The ESP needs several milliseconds to recover from one packet before it will accept another - if (getWifiTickDiff(esp_upload.lastAttemptTime, getWifiTick()) >= 15) { - unsigned int percentComplete; - const uint32_t blkCnt = (esp_upload.fileSize + EspFlashBlockSize - 1) / EspFlashBlockSize; - if (esp_upload.uploadBlockNumber < blkCnt) { - esp_upload.uploadResult = flashWriteBlock(0, 0); + break; + + case connecting: + if ((getWifiTickDiff(esp_upload.lastAttemptTime, getWifiTick()) >= connectAttemptInterval) && (getWifiTickDiff(esp_upload.lastResetTime, getWifiTick()) >= 500)) { + EspUploadResult res = Sync(5000); esp_upload.lastAttemptTime = getWifiTick(); - if (esp_upload.uploadResult != success) { - //MessageF("Flash block upload failed\n"); - esp_upload.state = done; + if (res == success) + esp_upload.state = erasing; + else { + esp_upload.connectAttemptNumber++; + if (esp_upload.connectAttemptNumber % retriesPerReset == 0) + esp_upload.state = resetting; } - percentComplete = (100 * esp_upload.uploadBlockNumber)/blkCnt; - ++esp_upload.uploadBlockNumber; - if (percentComplete >= esp_upload.uploadNextPercentToReport) { - //MessageF("%u%% complete\n", percentComplete); - esp_upload.uploadNextPercentToReport += percentToReportIncrement; - } - } - else { - esp_upload.state = done; } - } - break; + break; - case done: - f_close(&esp_upload.uploadFile); - //uploadPort.end(); - //uploadPort_close(); + case erasing: + if (getWifiTickDiff(esp_upload.lastAttemptTime, getWifiTick()) >= blockWriteInterval) { + uint32_t eraseSize; + const uint32_t sectorsPerBlock = 16; + const uint32_t sectorSize = 4096; + const uint32_t numSectors = (esp_upload.fileSize + sectorSize - 1)/sectorSize; + const uint32_t startSector = esp_upload.uploadAddress/sectorSize; + + uint32_t headSectors = sectorsPerBlock - (startSector % sectorsPerBlock); + NOMORE(headSectors, numSectors); + + eraseSize = (numSectors < 2 * headSectors) + ? (numSectors + 1) / 2 * sectorSize + : (numSectors - headSectors) * sectorSize; + + esp_upload.uploadResult = flashBegin(esp_upload.uploadAddress, eraseSize); + if (esp_upload.uploadResult == success) { + esp_upload.uploadBlockNumber = 0; + esp_upload.uploadNextPercentToReport = percentToReportIncrement; + esp_upload.lastAttemptTime = getWifiTick(); + esp_upload.state = uploading; + } + else + esp_upload.state = done; + } + break; - //WIFI_COM.begin(115200, true); - //wifi_init(); + case uploading: + // The ESP needs several milliseconds to recover from one packet before it will accept another + if (getWifiTickDiff(esp_upload.lastAttemptTime, getWifiTick()) >= 15) { + unsigned int percentComplete; + const uint32_t blkCnt = (esp_upload.fileSize + EspFlashBlockSize - 1) / EspFlashBlockSize; + if (esp_upload.uploadBlockNumber < blkCnt) { + esp_upload.uploadResult = flashWriteBlock(0, 0); + esp_upload.lastAttemptTime = getWifiTick(); + if (esp_upload.uploadResult != success) + esp_upload.state = done; + percentComplete = (100 * esp_upload.uploadBlockNumber)/blkCnt; + ++esp_upload.uploadBlockNumber; + if (percentComplete >= esp_upload.uploadNextPercentToReport) + esp_upload.uploadNextPercentToReport += percentToReportIncrement; + } + else + esp_upload.state = done; + } + break; - if (esp_upload.uploadResult == success) { - //printf("upload successfully\n"); - } - else { - //printf("upload failed\n"); - } - esp_upload.state = upload_idle;//idle; - break; + case done: + update_file.close(); + esp_upload.state = upload_idle; + break; default: break; } - #endif } // Try to upload the given file at the given address void SendUpdateFile(const char *file, uint32_t address) { - #if 0 - FRESULT res = f_open(&esp_upload.uploadFile, file, FA_OPEN_EXISTING | FA_READ); + const char * const fname = card.diveToFile(true, update_curDir, ESP_FIRMWARE_FILE); + if (!update_file.open(update_curDir, fname, O_READ)) return; - if (res != FR_OK) return; + esp_upload.fileSize = update_file.fileSize(); - esp_upload.fileSize = f_size(&esp_upload.uploadFile); if (esp_upload.fileSize == 0) { - f_close(&esp_upload.uploadFile); + update_file.close(); return; } - f_lseek(&esp_upload.uploadFile, 0); esp_upload.uploadAddress = address; esp_upload.connectAttemptNumber = 0; esp_upload.state = resetting; - #endif } static const uint32_t FirmwareAddress = 0x00000000, WebFilesAddress = 0x00100000; void ResetWiFiForUpload(int begin_or_end) { - #if 0 - uint32_t start, now; - - GPIO_InitTypeDef GPIO_InitStructure; - - #if V1_0_V1_1 - GPIO_InitStructure.Speed = GPIO_SPEED_FREQ_HIGH; - GPIO_InitStructure.Pin = GPIO_Pin_8; - GPIO_InitStructure.Mode = GPIO_MODE_OUTPUT_PP; - HAL_GPIO_Init(GPIOA, &GPIO_InitStructure); - #else - GPIO_InitStructure.Speed = GPIO_SPEED_FREQ_LOW; - GPIO_InitStructure.Pin = GPIO_Pin_13; - GPIO_InitStructure.Mode = GPIO_MODE_OUTPUT_PP; - HAL_GPIO_Init(GPIOC, &GPIO_InitStructure); - #endif - start = getWifiTick(); - now = start; - - if (begin_or_end == 0) { - #if V1_0_V1_1 - HAL_GPIO_WritePin(GPIOA,GPIO_Pin_8,GPIO_PIN_RESET); //update mode - #else - HAL_GPIO_WritePin(GPIOC,GPIO_Pin_13,GPIO_PIN_RESET); //update mode - #endif - } - else { - #if V1_0_V1_1 - #if V1_0_V1_1 - HAL_GPIO_WritePin(GPIOA,GPIO_Pin_8,GPIO_PIN_SET); //boot mode - GPIO_InitStructure.Speed = GPIO_SPEED_FREQ_HIGH; - GPIO_InitStructure.Pin = GPIO_Pin_8; - GPIO_InitStructure.Mode = GPIO_MODE_INPUT; - HAL_GPIO_Init(GPIOA, &GPIO_InitStructure); - #endif - #else - HAL_GPIO_WritePin(GPIOC,GPIO_Pin_13,GPIO_PIN_SET); //boot mode - GPIO_InitStructure.Speed = GPIO_SPEED_FREQ_LOW; - GPIO_InitStructure.Pin = GPIO_Pin_13; - GPIO_InitStructure.Mode = GPIO_MODE_INPUT; - HAL_GPIO_Init(GPIOC, &GPIO_InitStructure); - #endif - } - WIFI_RESET(); - while (getWifiTickDiff(start, now) < 500) now = getWifiTick(); - WIFI_SET(); - #endif + //#if 0 + uint32_t start, now; + + start = getWifiTick(); + now = start; + + if (begin_or_end == 0) { + SET_OUTPUT(WIFI_IO0_PIN); + WRITE(WIFI_IO0_PIN, LOW); + } + else + SET_INPUT_PULLUP(WIFI_IO0_PIN); + + WIFI_RESET(); + while (getWifiTickDiff(start, now) < 500) now = getWifiTick(); + WIFI_SET(); + //#endif } int32_t wifi_upload(int type) { @@ -797,7 +677,7 @@ int32_t wifi_upload(int type) { while (esp_upload.state != upload_idle) { upload_spin(); - //IWDG_ReloadCounter(); + watchdog_refresh(); } ResetWiFiForUpload(1); diff --git a/Marlin/src/lcd/extui/lib/mks_ui/wifi_upload.h b/Marlin/src/lcd/extui/lib/mks_ui/wifi_upload.h index 246cc10bec..ff98173b95 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/wifi_upload.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/wifi_upload.h @@ -25,9 +25,10 @@ extern "C" { /* C-declarations for C++ */ #endif -#define ESP_FIRMWARE_FILE "1:/MksWifi.bin" -#define ESP_WEB_FIRMWARE_FILE "1:/MksWifi_Web.bin" -#define ESP_WEB_FILE "1:/MksWifi_WebView.bin" +#define ESP_FIRMWARE_FILE "MksWifi.bin" +#define ESP_FIRMWARE_FILE_RENAME "MKSWIFI.CUR" +#define ESP_WEB_FIRMWARE_FILE "1:/MksWifi_Web.bin" +#define ESP_WEB_FILE "1:/MksWifi_WebView.bin" typedef enum { upload_idle, diff --git a/Marlin/src/libs/W25Qxx.cpp b/Marlin/src/libs/W25Qxx.cpp index ebf326f2e5..dc96758e6d 100644 --- a/Marlin/src/libs/W25Qxx.cpp +++ b/Marlin/src/libs/W25Qxx.cpp @@ -49,6 +49,8 @@ MarlinSPI W25QXXFlash::mySPI(SPI_FLASH_MOSI_PIN, SPI_FLASH_MISO_PIN, SPI_FLASH_S #define W25QXX_CS_H OUT_WRITE(SPI_FLASH_CS_PIN, HIGH) #define W25QXX_CS_L OUT_WRITE(SPI_FLASH_CS_PIN, LOW) +bool flash_dma_mode = true; + void W25QXXFlash::init(uint8_t spiRate) { OUT_WRITE(SPI_FLASH_CS_PIN, HIGH); @@ -144,11 +146,11 @@ uint16_t W25QXXFlash::W25QXX_ReadID(void) { } void W25QXXFlash::SPI_FLASH_WriteEnable(void) { - /* Select the FLASH: Chip Select low */ + // Select the FLASH: Chip Select low W25QXX_CS_L; - /* Send "Write Enable" instruction */ + // Send "Write Enable" instruction spi_flash_Send(W25X_WriteEnable); - /* Deselect the FLASH: Chip Select high */ + // Deselect the FLASH: Chip Select high W25QXX_CS_H; } @@ -164,54 +166,54 @@ void W25QXXFlash::SPI_FLASH_WriteEnable(void) { void W25QXXFlash::SPI_FLASH_WaitForWriteEnd(void) { uint8_t FLASH_Status = 0; - /* Select the FLASH: Chip Select low */ + // Select the FLASH: Chip Select low W25QXX_CS_L; - /* Send "Read Status Register" instruction */ + // Send "Read Status Register" instruction spi_flash_Send(W25X_ReadStatusReg); - /* Loop as long as the memory is busy with a write cycle */ + // Loop as long as the memory is busy with a write cycle do /* Send a dummy byte to generate the clock needed by the FLASH and put the value of the status register in FLASH_Status variable */ FLASH_Status = spi_flash_Rec(); - while ((FLASH_Status & WIP_Flag) == 0x01); /* Write in progress */ + while ((FLASH_Status & WIP_Flag) == 0x01); // Write in progress - /* Deselect the FLASH: Chip Select high */ + // Deselect the FLASH: Chip Select high W25QXX_CS_H; } void W25QXXFlash::SPI_FLASH_SectorErase(uint32_t SectorAddr) { - /* Send write enable instruction */ + // Send write enable instruction SPI_FLASH_WriteEnable(); - /* Sector Erase */ - /* Select the FLASH: Chip Select low */ + // Sector Erase + // Select the FLASH: Chip Select low W25QXX_CS_L; - /* Send Sector Erase instruction */ + // Send Sector Erase instruction spi_flash_Send(W25X_SectorErase); - /* Send SectorAddr high nibble address byte */ + // Send SectorAddr high nibble address byte spi_flash_Send((SectorAddr & 0xFF0000) >> 16); - /* Send SectorAddr medium nibble address byte */ + // Send SectorAddr medium nibble address byte spi_flash_Send((SectorAddr & 0xFF00) >> 8); - /* Send SectorAddr low nibble address byte */ + // Send SectorAddr low nibble address byte spi_flash_Send(SectorAddr & 0xFF); - /* Deselect the FLASH: Chip Select high */ + // Deselect the FLASH: Chip Select high W25QXX_CS_H; - /* Wait the end of Flash writing */ + // Wait the end of Flash writing SPI_FLASH_WaitForWriteEnd(); } void W25QXXFlash::SPI_FLASH_BlockErase(uint32_t BlockAddr) { SPI_FLASH_WriteEnable(); W25QXX_CS_L; - /* Send Sector Erase instruction */ + // Send Sector Erase instruction spi_flash_Send(W25X_BlockErase); - /* Send SectorAddr high nibble address byte */ + // Send SectorAddr high nibble address byte spi_flash_Send((BlockAddr & 0xFF0000) >> 16); - /* Send SectorAddr medium nibble address byte */ + // Send SectorAddr medium nibble address byte spi_flash_Send((BlockAddr & 0xFF00) >> 8); - /* Send SectorAddr low nibble address byte */ + // Send SectorAddr low nibble address byte spi_flash_Send(BlockAddr & 0xFF); W25QXX_CS_H; @@ -227,18 +229,18 @@ void W25QXXFlash::SPI_FLASH_BlockErase(uint32_t BlockAddr) { * Return : None *******************************************************************************/ void W25QXXFlash::SPI_FLASH_BulkErase(void) { - /* Send write enable instruction */ + // Send write enable instruction SPI_FLASH_WriteEnable(); - /* Bulk Erase */ - /* Select the FLASH: Chip Select low */ + // Bulk Erase + // Select the FLASH: Chip Select low W25QXX_CS_L; - /* Send Bulk Erase instruction */ + // Send Bulk Erase instruction spi_flash_Send(W25X_ChipErase); - /* Deselect the FLASH: Chip Select high */ + // Deselect the FLASH: Chip Select high W25QXX_CS_H; - /* Wait the end of Flash writing */ + // Wait the end of Flash writing SPI_FLASH_WaitForWriteEnd(); } @@ -256,34 +258,34 @@ void W25QXXFlash::SPI_FLASH_BulkErase(void) { * Return : None *******************************************************************************/ void W25QXXFlash::SPI_FLASH_PageWrite(uint8_t* pBuffer, uint32_t WriteAddr, uint16_t NumByteToWrite) { - /* Enable the write access to the FLASH */ + // Enable the write access to the FLASH SPI_FLASH_WriteEnable(); - /* Select the FLASH: Chip Select low */ + // Select the FLASH: Chip Select low W25QXX_CS_L; - /* Send "Write to Memory " instruction */ + // Send "Write to Memory " instruction spi_flash_Send(W25X_PageProgram); - /* Send WriteAddr high nibble address byte to write to */ + // Send WriteAddr high nibble address byte to write to spi_flash_Send((WriteAddr & 0xFF0000) >> 16); - /* Send WriteAddr medium nibble address byte to write to */ + // Send WriteAddr medium nibble address byte to write to spi_flash_Send((WriteAddr & 0xFF00) >> 8); - /* Send WriteAddr low nibble address byte to write to */ + // Send WriteAddr low nibble address byte to write to spi_flash_Send(WriteAddr & 0xFF); NOMORE(NumByteToWrite, SPI_FLASH_PerWritePageSize); - /* while there is data to be written on the FLASH */ + // While there is data to be written on the FLASH while (NumByteToWrite--) { - /* Send the current byte */ + // Send the current byte spi_flash_Send(*pBuffer); - /* Point on the next byte to be written */ + // Point on the next byte to be written pBuffer++; } - /* Deselect the FLASH: Chip Select high */ + // Deselect the FLASH: Chip Select high W25QXX_CS_H; - /* Wait the end of Flash writing */ + // Wait the end of Flash writing SPI_FLASH_WaitForWriteEnd(); } @@ -306,11 +308,11 @@ void W25QXXFlash::SPI_FLASH_BufferWrite(uint8_t* pBuffer, uint32_t WriteAddr, ui NumOfPage = NumByteToWrite / SPI_FLASH_PageSize; NumOfSingle = NumByteToWrite % SPI_FLASH_PageSize; - if (Addr == 0) { /* WriteAddr is SPI_FLASH_PageSize aligned */ - if (NumOfPage == 0) { /* NumByteToWrite < SPI_FLASH_PageSize */ + if (Addr == 0) { // WriteAddr is SPI_FLASH_PageSize aligned + if (NumOfPage == 0) { // NumByteToWrite < SPI_FLASH_PageSize SPI_FLASH_PageWrite(pBuffer, WriteAddr, NumByteToWrite); } - else { /* NumByteToWrite > SPI_FLASH_PageSize */ + else { // NumByteToWrite > SPI_FLASH_PageSize while (NumOfPage--) { SPI_FLASH_PageWrite(pBuffer, WriteAddr, SPI_FLASH_PageSize); WriteAddr += SPI_FLASH_PageSize; @@ -319,9 +321,9 @@ void W25QXXFlash::SPI_FLASH_BufferWrite(uint8_t* pBuffer, uint32_t WriteAddr, ui SPI_FLASH_PageWrite(pBuffer, WriteAddr, NumOfSingle); } } - else { /* WriteAddr is not SPI_FLASH_PageSize aligned */ - if (NumOfPage == 0) { /* NumByteToWrite < SPI_FLASH_PageSize */ - if (NumOfSingle > count) { /* (NumByteToWrite + WriteAddr) > SPI_FLASH_PageSize */ + else { // WriteAddr is not SPI_FLASH_PageSize aligned + if (NumOfPage == 0) { // NumByteToWrite < SPI_FLASH_PageSize + if (NumOfSingle > count) { // (NumByteToWrite + WriteAddr) > SPI_FLASH_PageSize temp = NumOfSingle - count; SPI_FLASH_PageWrite(pBuffer, WriteAddr, count); WriteAddr += count; @@ -332,7 +334,7 @@ void W25QXXFlash::SPI_FLASH_BufferWrite(uint8_t* pBuffer, uint32_t WriteAddr, ui SPI_FLASH_PageWrite(pBuffer, WriteAddr, NumByteToWrite); } } - else { /* NumByteToWrite > SPI_FLASH_PageSize */ + else { // NumByteToWrite > SPI_FLASH_PageSize NumByteToWrite -= count; NumOfPage = NumByteToWrite / SPI_FLASH_PageSize; NumOfSingle = NumByteToWrite % SPI_FLASH_PageSize; @@ -364,24 +366,24 @@ void W25QXXFlash::SPI_FLASH_BufferWrite(uint8_t* pBuffer, uint32_t WriteAddr, ui * Return : None *******************************************************************************/ void W25QXXFlash::SPI_FLASH_BufferRead(uint8_t* pBuffer, uint32_t ReadAddr, uint16_t NumByteToRead) { - /* Select the FLASH: Chip Select low */ + // Select the FLASH: Chip Select low W25QXX_CS_L; - /* Send "Read from Memory " instruction */ + // Send "Read from Memory " instruction spi_flash_Send(W25X_ReadData); - /* Send ReadAddr high nibble address byte to read from */ + // Send ReadAddr high nibble address byte to read from spi_flash_Send((ReadAddr & 0xFF0000) >> 16); - /* Send ReadAddr medium nibble address byte to read from */ + // Send ReadAddr medium nibble address byte to read from spi_flash_Send((ReadAddr & 0xFF00) >> 8); - /* Send ReadAddr low nibble address byte to read from */ + // Send ReadAddr low nibble address byte to read from spi_flash_Send(ReadAddr & 0xFF); - if (NumByteToRead < 33) { - while (NumByteToRead--) { /* while there is data to be read */ - /* Read a byte from the FLASH */ + if (NumByteToRead <= 32 || !flash_dma_mode) { + while (NumByteToRead--) { // While there is data to be read + // Read a byte from the FLASH *pBuffer = spi_flash_Rec(); - /* Point to the next location where the byte read will be saved */ + // Point to the next location where the byte read will be saved pBuffer++; } } diff --git a/Marlin/src/sd/SdBaseFile.cpp b/Marlin/src/sd/SdBaseFile.cpp index 47875a08b1..270053be3e 100644 --- a/Marlin/src/sd/SdBaseFile.cpp +++ b/Marlin/src/sd/SdBaseFile.cpp @@ -401,8 +401,8 @@ bool SdBaseFile::make83Name(const char* str, uint8_t* name, const char** ptr) { // Fail for illegal characters PGM_P p = PSTR("|<>^+=?/[];,*\"\\"); while (uint8_t b = pgm_read_byte(p++)) if (b == c) return false; - if (i > n || c < 0x21 || c == 0x7F) return false; // Check size, non-printable characters - name[i++] = (c < 'a' || c > 'z') ? (c) : (c + ('A' - 'a')); // Uppercase required for 8.3 name + if (i > n || c < 0x21 || c == 0x7F) return false; // Check size, non-printable characters + name[i++] = c + (WITHIN(c, 'a', 'z') ? 'A' - 'a' : 0); // Uppercase required for 8.3 name } } *ptr = str; // Set passed pointer to the end diff --git a/platformio.ini b/platformio.ini index daeaee4021..81ed916eeb 100644 --- a/platformio.ini +++ b/platformio.ini @@ -214,6 +214,7 @@ lib_deps = HAS_TFT_LVGL_UI = lvgl=https://github.com/makerbase-mks/LVGL-6.1.1-MKS/archive/master.zip src_filter=+ extra_scripts=download_mks_assets.py +MKS_WIFI_MODULE = QRCode=https://github.com/makerbase-mks/QRCode/archive/master.zip HAS_TRINAMIC_CONFIG = TMCStepper@~0.7.1 src_filter=+ + + + + HAS_STEALTHCHOP = src_filter=+