Skip to content

Commit

Permalink
Refactor SD detect handler (#17380)
Browse files Browse the repository at this point in the history
Co-Authored-By: Eric Ptak <trouch@users.noreply.github.com>
  • Loading branch information
thinkyhead and trouch committed Apr 4, 2020
1 parent bc01d8d commit 65f6a37
Show file tree
Hide file tree
Showing 6 changed files with 156 additions and 119 deletions.
95 changes: 57 additions & 38 deletions Marlin/src/MarlinCore.cpp
Expand Up @@ -443,7 +443,6 @@ void startOrResumeJob() {

/**
* Minimal management of Marlin's core activities:
* - Check for Filament Runout
* - Keep the command buffer full
* - Check for maximum inactive time between commands
* - Check for maximum inactive time between stepper commands
Expand All @@ -454,13 +453,8 @@ void startOrResumeJob() {
* - Check if an idle but hot extruder needs filament extruded (EXTRUDER_RUNOUT_PREVENT)
* - Pulse FET_SAFETY_PIN if it exists
*/

inline void manage_inactivity(const bool ignore_stepper_queue=false) {

#if HAS_FILAMENT_SENSOR
runout.run();
#endif

if (queue.length < BUFSIZE) queue.get_available_commands();

const millis_t ms = millis();
Expand Down Expand Up @@ -644,9 +638,53 @@ inline void manage_inactivity(const bool ignore_stepper_queue=false) {
}

/**
* Standard idle routine keeps the machine alive
* Standard idle routine keeps the machine alive:
* - Core Marlin activities
* - Manage heaters (and Watchdog)
* - Max7219 heartbeat, animation, etc.
*
* Only after setup() is complete:
* - Handle filament runout sensors
* - Run HAL idle tasks
* - Handle Power-Loss Recovery
* - Run StallGuard endstop checks
* - Handle SD Card insert / remove
* - Handle USB Flash Drive insert / remove
* - Announce Host Keepalive state (if any)
* - Update the Print Job Timer state
* - Update the Beeper queue
* - Read Buttons and Update the LCD
* - Run i2c Position Encoders
* - Auto-report Temperatures / SD Status
* - Update the Prusa MMU2
* - Handle Joystick jogging
*/
void idle(TERN_(ADVANCED_PAUSE_FEATURE, bool no_stepper_sleep/*=false*/)) {

// Core Marlin activities
manage_inactivity(TERN_(ADVANCED_PAUSE_FEATURE, no_stepper_sleep));

// Manage Heaters (and Watchdog)
thermalManager.manage_heater();

// Max7219 heartbeat, animation, etc
#if ENABLED(MAX7219_DEBUG)
max7219.idle_tasks();
#endif

// Return if setup() isn't completed
if (marlin_state == MF_INITIALIZING) return;

// Handle filament runout sensors
#if HAS_FILAMENT_SENSOR
runout.run();
#endif

// Run HAL idle tasks
#ifdef HAL_IDLETASK
HAL_idletask();
#endif

// Handle Power-Loss Recovery
#if ENABLED(POWER_LOSS_RECOVERY) && PIN_EXISTS(POWER_LOSS)
recovery.outage();
Expand All @@ -660,29 +698,21 @@ void idle(TERN_(ADVANCED_PAUSE_FEATURE, bool no_stepper_sleep/*=false*/)) {
if (endstops.tmc_spi_homing_check()) break;
#endif

// Max7219 heartbeat, animation, etc.
#if ENABLED(MAX7219_DEBUG)
max7219.idle_tasks();
// Handle SD Card insert / remove
#if ENABLED(SDSUPPORT)
card.manage_media();
#endif

// Read Buttons and Update the LCD
ui.update();
// Handle USB Flash Drive insert / remove
#if ENABLED(USB_FLASH_DRIVE_SUPPORT)
Sd2Card::idle();
#endif

// Announce Host Keepalive state (if any)
#if ENABLED(HOST_KEEPALIVE_FEATURE)
gcode.host_keepalive();
#endif

// Core Marlin activities
manage_inactivity(
#if ENABLED(ADVANCED_PAUSE_FEATURE)
no_stepper_sleep
#endif
);

// Manage heaters (and Watchdog)
thermalManager.manage_heater();

// Update the Print Job Timer state
#if ENABLED(PRINTCOUNTER)
print_job_timer.tick();
Expand All @@ -693,6 +723,9 @@ void idle(TERN_(ADVANCED_PAUSE_FEATURE, bool no_stepper_sleep/*=false*/)) {
buzzer.tick();
#endif

// Read Buttons and Update the LCD
ui.update();

// Run i2c Position Encoders
#if ENABLED(I2C_POSITION_ENCODERS)
static millis_t i2cpem_next_update_ms;
Expand All @@ -705,11 +738,6 @@ void idle(TERN_(ADVANCED_PAUSE_FEATURE, bool no_stepper_sleep/*=false*/)) {
}
#endif

// Run HAL idle tasks
#ifdef HAL_IDLETASK
HAL_idletask();
#endif

// Auto-report Temperatures / SD Status
#if HAS_AUTO_REPORTING
if (!gcode.autoreport_paused) {
Expand All @@ -722,11 +750,6 @@ void idle(TERN_(ADVANCED_PAUSE_FEATURE, bool no_stepper_sleep/*=false*/)) {
}
#endif

// Handle USB Flash Drive insert / remove
#if ENABLED(USB_FLASH_DRIVE_SUPPORT)
Sd2Card::idle();
#endif

// Update the Prusa MMU2
#if ENABLED(PRUSA_MMU2)
mmu2.mmu_loop();
Expand Down Expand Up @@ -983,8 +1006,8 @@ void setup() {
SETUP_RUN(ui.show_bootscreen());
#endif

#if ENABLED(SDSUPPORT) && defined(SDCARD_CONNECTION) && !SD_CONNECTION_IS(LCD)
SETUP_RUN(card.mount()); // Mount onboard / custom SD card before settings.first_load
#if BOTH(SDSUPPORT, SDCARD_EEPROM_EMULATION)
SETUP_RUN(card.mount()); // Mount media with settings before first_load
#endif

SETUP_RUN(settings.first_load()); // Load data from EEPROM if available (or use defaults)
Expand Down Expand Up @@ -1151,10 +1174,6 @@ void setup() {
queue.inject_P(PSTR(STARTUP_COMMANDS));
#endif

#if ENABLED(INIT_SDCARD_ON_BOOT) && !HAS_SPI_LCD
SETUP_RUN(card.beginautostart());
#endif

#if ENABLED(HOST_PROMPT_SUPPORT)
SETUP_RUN(host_action_prompt_end());
#endif
Expand Down
23 changes: 1 addition & 22 deletions Marlin/src/lcd/extui/ui_api.cpp
Expand Up @@ -1149,28 +1149,7 @@ void MarlinUI::init() {
ExtUI::onStartup();
}

void MarlinUI::update() {
#if ENABLED(SDSUPPORT)
static bool last_sd_status;
const bool sd_status = IS_SD_INSERTED();
if (sd_status != last_sd_status) {
last_sd_status = sd_status;
if (sd_status) {
card.mount();
if (card.isMounted())
ExtUI::onMediaInserted();
else
ExtUI::onMediaError();
}
else {
const bool ok = card.isMounted();
card.release();
if (ok) ExtUI::onMediaRemoved();
}
}
#endif // SDSUPPORT
ExtUI::onIdle();
}
void MarlinUI::update() { ExtUI::onIdle(); }

void MarlinUI::kill_screen(PGM_P const error, PGM_P const component) {
using namespace ExtUI;
Expand Down
114 changes: 55 additions & 59 deletions Marlin/src/lcd/ultralcd.cpp
Expand Up @@ -121,10 +121,6 @@ MarlinUI ui;
#endif
#endif

#if ENABLED(INIT_SDCARD_ON_BOOT)
uint8_t lcd_sd_status;
#endif

#if HAS_LCD_MENU && LCD_TIMEOUT_TO_STATUS
bool MarlinUI::defer_return_to_status;
#endif
Expand Down Expand Up @@ -342,13 +338,8 @@ void MarlinUI::init() {

#endif // HAS_SHIFT_ENCODER

#if ENABLED(SDSUPPORT)
#if PIN_EXISTS(SD_DETECT)
SET_INPUT_PULLUP(SD_DETECT_PIN);
#endif
#if ENABLED(INIT_SDCARD_ON_BOOT)
lcd_sd_status = 2; // UNKNOWN
#endif
#if ENABLED(SDSUPPORT) && PIN_EXISTS(SD_DETECT)
SET_INPUT_PULLUP(SD_DETECT_PIN);
#endif

#if HAS_ENCODER_ACTION && HAS_SLOW_BUTTONS
Expand Down Expand Up @@ -744,11 +735,11 @@ void MarlinUI::quick_feedback(const bool clear_buttons/*=true*/) {
*/

LCDViewAction MarlinUI::lcdDrawUpdate = LCDVIEW_CLEAR_CALL_REDRAW;
millis_t next_lcd_update_ms;

void MarlinUI::update() {

static uint16_t max_display_update_time = 0;
static millis_t next_lcd_update_ms;
millis_t ms = millis();

#if HAS_LCD_MENU && LCD_TIMEOUT_TO_STATUS
Expand Down Expand Up @@ -824,53 +815,6 @@ void MarlinUI::update() {

#endif // HAS_LCD_MENU

#if ENABLED(INIT_SDCARD_ON_BOOT)
//
// SPI SD Card detection (and first card init when the LCD is present)
//
const uint8_t sd_status = (uint8_t)IS_SD_INSERTED();
if (sd_status != lcd_sd_status && detected()) {

uint8_t old_sd_status = lcd_sd_status; // prevent re-entry to this block!
lcd_sd_status = sd_status;

if (sd_status) {
safe_delay(500); // Some boards need a delay to get settled
card.mount();
if (old_sd_status == 2)
card.beginautostart(); // Initial boot
else
set_status_P(GET_TEXT(MSG_MEDIA_INSERTED));
}
#if PIN_EXISTS(SD_DETECT)
else {
card.release();
if (old_sd_status != 2) {
set_status_P(GET_TEXT(MSG_MEDIA_REMOVED));
#if HAS_LCD_MENU
return_to_status();
#endif
}
}

#if DISABLED(NO_LCD_REINIT)
init_lcd(); // May revive the LCD if static electricity killed it
#endif

#endif

refresh();

ms = millis();
next_lcd_update_ms = ms + LCD_UPDATE_INTERVAL; // delay LCD update until after SD activity completes

#ifdef LED_BACKLIGHT_TIMEOUT
leds.reset_timeout(ms);
#endif
}

#endif // INIT_SDCARD_ON_BOOT

if (ELAPSED(ms, next_lcd_update_ms)
#if HAS_GRAPHICAL_LCD
|| drawing_screen
Expand Down Expand Up @@ -1595,3 +1539,55 @@ void MarlinUI::update() {
}

#endif // !HAS_DISPLAY

#if ENABLED(SDSUPPORT)

void MarlinUI::media_changed(const uint8_t old_status, const uint8_t status) {
if (old_status == status) {
#if ENABLED(EXTENSIBLE_UI)
ExtUI::onMediaError(); // Failed to mount/unmount
#endif
return;
}

if (status) {
#if ENABLED(EXTENSIBLE_UI)
ExtUI::onMediaInserted(); // ExtUI response
#endif
if (old_status < 2)
set_status_P(GET_TEXT(MSG_MEDIA_INSERTED));
}
else {
#if ENABLED(EXTENSIBLE_UI)
ExtUI::onMediaRemoved(); // ExtUI response
#endif
if (old_status < 2) {
#if PIN_EXISTS(SD_DETECT)
set_status_P(GET_TEXT(MSG_MEDIA_REMOVED));
#if HAS_LCD_MENU
return_to_status();
#endif
#endif
}
}

#if PIN_EXISTS(SD_DETECT) && DISABLED(NO_LCD_REINIT)
init_lcd(); // Revive a noisy shared SPI LCD
#endif

refresh();

#if HAS_SPI_LCD || defined(LED_BACKLIGHT_TIMEOUT)
const millis_t ms = millis();
#endif

#if HAS_SPI_LCD
next_lcd_update_ms = ms + LCD_UPDATE_INTERVAL; // Delay LCD update for SD activity
#endif

#ifdef LED_BACKLIGHT_TIMEOUT
leds.reset_timeout(ms);
#endif
}

#endif // SDSUPPORT
4 changes: 4 additions & 0 deletions Marlin/src/lcd/ultralcd.h
Expand Up @@ -274,6 +274,10 @@ class MarlinUI {
// LCD implementations
static void clear_lcd();

#if ENABLED(SDSUPPORT)
static void media_changed(const uint8_t old_stat, const uint8_t stat);
#endif

#if HAS_SPI_LCD
static bool detected();
static void init_lcd();
Expand Down

0 comments on commit 65f6a37

Please sign in to comment.