mirror of
https://github.com/MarlinFirmware/Marlin.git
synced 2024-11-27 22:08:02 +00:00
Move setup() and loop() to the end
This commit is contained in:
parent
8ff338c2b9
commit
f9a192c7e3
@ -850,10 +850,6 @@ void servo_init() {
|
||||
*/
|
||||
STOW_Z_SERVO();
|
||||
#endif
|
||||
|
||||
#if HAS_BED_PROBE
|
||||
endstops.enable_z_probe(false);
|
||||
#endif
|
||||
}
|
||||
|
||||
/**
|
||||
@ -879,216 +875,6 @@ void servo_init() {
|
||||
|
||||
#endif
|
||||
|
||||
/**
|
||||
* Marlin entry-point: Set up before the program loop
|
||||
* - Set up the kill pin, filament runout, power hold
|
||||
* - Start the serial port
|
||||
* - Print startup messages and diagnostics
|
||||
* - Get EEPROM or default settings
|
||||
* - Initialize managers for:
|
||||
* • temperature
|
||||
* • planner
|
||||
* • watchdog
|
||||
* • stepper
|
||||
* • photo pin
|
||||
* • servos
|
||||
* • LCD controller
|
||||
* • Digipot I2C
|
||||
* • Z probe sled
|
||||
* • status LEDs
|
||||
*/
|
||||
void setup() {
|
||||
|
||||
#ifdef DISABLE_JTAG
|
||||
// Disable JTAG on AT90USB chips to free up pins for IO
|
||||
MCUCR = 0x80;
|
||||
MCUCR = 0x80;
|
||||
#endif
|
||||
|
||||
#if ENABLED(FILAMENT_RUNOUT_SENSOR)
|
||||
setup_filrunoutpin();
|
||||
#endif
|
||||
|
||||
setup_killpin();
|
||||
|
||||
setup_powerhold();
|
||||
|
||||
#if HAS_STEPPER_RESET
|
||||
disableStepperDrivers();
|
||||
#endif
|
||||
|
||||
MYSERIAL.begin(BAUDRATE);
|
||||
SERIAL_PROTOCOLLNPGM("start");
|
||||
SERIAL_ECHO_START;
|
||||
|
||||
// Check startup - does nothing if bootloader sets MCUSR to 0
|
||||
byte mcu = MCUSR;
|
||||
if (mcu & 1) SERIAL_ECHOLNPGM(MSG_POWERUP);
|
||||
if (mcu & 2) SERIAL_ECHOLNPGM(MSG_EXTERNAL_RESET);
|
||||
if (mcu & 4) SERIAL_ECHOLNPGM(MSG_BROWNOUT_RESET);
|
||||
if (mcu & 8) SERIAL_ECHOLNPGM(MSG_WATCHDOG_RESET);
|
||||
if (mcu & 32) SERIAL_ECHOLNPGM(MSG_SOFTWARE_RESET);
|
||||
MCUSR = 0;
|
||||
|
||||
SERIAL_ECHOPGM(MSG_MARLIN);
|
||||
SERIAL_ECHOLNPGM(" " SHORT_BUILD_VERSION);
|
||||
|
||||
#ifdef STRING_DISTRIBUTION_DATE
|
||||
#ifdef STRING_CONFIG_H_AUTHOR
|
||||
SERIAL_ECHO_START;
|
||||
SERIAL_ECHOPGM(MSG_CONFIGURATION_VER);
|
||||
SERIAL_ECHOPGM(STRING_DISTRIBUTION_DATE);
|
||||
SERIAL_ECHOPGM(MSG_AUTHOR);
|
||||
SERIAL_ECHOLNPGM(STRING_CONFIG_H_AUTHOR);
|
||||
SERIAL_ECHOPGM("Compiled: ");
|
||||
SERIAL_ECHOLNPGM(__DATE__);
|
||||
#endif // STRING_CONFIG_H_AUTHOR
|
||||
#endif // STRING_DISTRIBUTION_DATE
|
||||
|
||||
SERIAL_ECHO_START;
|
||||
SERIAL_ECHOPGM(MSG_FREE_MEMORY);
|
||||
SERIAL_ECHO(freeMemory());
|
||||
SERIAL_ECHOPGM(MSG_PLANNER_BUFFER_BYTES);
|
||||
SERIAL_ECHOLN((int)sizeof(block_t)*BLOCK_BUFFER_SIZE);
|
||||
|
||||
// Send "ok" after commands by default
|
||||
for (int8_t i = 0; i < BUFSIZE; i++) send_ok[i] = true;
|
||||
|
||||
// Load data from EEPROM if available (or use defaults)
|
||||
// This also updates variables in the planner, elsewhere
|
||||
Config_RetrieveSettings();
|
||||
|
||||
// Initialize current position based on home_offset
|
||||
memcpy(current_position, home_offset, sizeof(home_offset));
|
||||
|
||||
// Vital to init stepper/planner equivalent for current_position
|
||||
SYNC_PLAN_POSITION_KINEMATIC();
|
||||
|
||||
thermalManager.init(); // Initialize temperature loop
|
||||
|
||||
#if ENABLED(USE_WATCHDOG)
|
||||
watchdog_init();
|
||||
#endif
|
||||
|
||||
stepper.init(); // Initialize stepper, this enables interrupts!
|
||||
setup_photpin();
|
||||
servo_init();
|
||||
|
||||
#if HAS_CONTROLLERFAN
|
||||
SET_OUTPUT(CONTROLLERFAN_PIN); //Set pin used for driver cooling fan
|
||||
#endif
|
||||
|
||||
#if HAS_STEPPER_RESET
|
||||
enableStepperDrivers();
|
||||
#endif
|
||||
|
||||
#if ENABLED(DIGIPOT_I2C)
|
||||
digipot_i2c_init();
|
||||
#endif
|
||||
|
||||
#if ENABLED(DAC_STEPPER_CURRENT)
|
||||
dac_init();
|
||||
#endif
|
||||
|
||||
#if ENABLED(Z_PROBE_SLED) && PIN_EXISTS(SLED)
|
||||
pinMode(SLED_PIN, OUTPUT);
|
||||
digitalWrite(SLED_PIN, LOW); // turn it off
|
||||
#endif // Z_PROBE_SLED
|
||||
|
||||
setup_homepin();
|
||||
|
||||
#ifdef STAT_LED_RED
|
||||
pinMode(STAT_LED_RED, OUTPUT);
|
||||
digitalWrite(STAT_LED_RED, LOW); // turn it off
|
||||
#endif
|
||||
|
||||
#ifdef STAT_LED_BLUE
|
||||
pinMode(STAT_LED_BLUE, OUTPUT);
|
||||
digitalWrite(STAT_LED_BLUE, LOW); // turn it off
|
||||
#endif
|
||||
|
||||
lcd_init();
|
||||
#if ENABLED(SHOW_BOOTSCREEN)
|
||||
#if ENABLED(DOGLCD)
|
||||
safe_delay(BOOTSCREEN_TIMEOUT);
|
||||
#elif ENABLED(ULTRA_LCD)
|
||||
bootscreen();
|
||||
lcd_init();
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#if ENABLED(MIXING_EXTRUDER) && MIXING_VIRTUAL_TOOLS > 1
|
||||
// Initialize mixing to 100% color 1
|
||||
for (uint8_t i = 0; i < MIXING_STEPPERS; i++)
|
||||
mixing_factor[i] = (i == 0) ? 1 : 0;
|
||||
for (uint8_t t = 0; t < MIXING_VIRTUAL_TOOLS; t++)
|
||||
for (uint8_t i = 0; i < MIXING_STEPPERS; i++)
|
||||
mixing_virtual_tool_mix[t][i] = mixing_factor[i];
|
||||
#endif
|
||||
|
||||
#if ENABLED(EXPERIMENTAL_I2CBUS) && I2C_SLAVE_ADDRESS > 0
|
||||
i2c.onReceive(i2c_on_receive);
|
||||
i2c.onRequest(i2c_on_request);
|
||||
#endif
|
||||
}
|
||||
|
||||
/**
|
||||
* The main Marlin program loop
|
||||
*
|
||||
* - Save or log commands to SD
|
||||
* - Process available commands (if not saving)
|
||||
* - Call heater manager
|
||||
* - Call inactivity manager
|
||||
* - Call endstop manager
|
||||
* - Call LCD update
|
||||
*/
|
||||
void loop() {
|
||||
if (commands_in_queue < BUFSIZE) get_available_commands();
|
||||
|
||||
#if ENABLED(SDSUPPORT)
|
||||
card.checkautostart(false);
|
||||
#endif
|
||||
|
||||
if (commands_in_queue) {
|
||||
|
||||
#if ENABLED(SDSUPPORT)
|
||||
|
||||
if (card.saving) {
|
||||
char* command = command_queue[cmd_queue_index_r];
|
||||
if (strstr_P(command, PSTR("M29"))) {
|
||||
// M29 closes the file
|
||||
card.closefile();
|
||||
SERIAL_PROTOCOLLNPGM(MSG_FILE_SAVED);
|
||||
ok_to_send();
|
||||
}
|
||||
else {
|
||||
// Write the string from the read buffer to SD
|
||||
card.write_command(command);
|
||||
if (card.logging)
|
||||
process_next_command(); // The card is saving because it's logging
|
||||
else
|
||||
ok_to_send();
|
||||
}
|
||||
}
|
||||
else
|
||||
process_next_command();
|
||||
|
||||
#else
|
||||
|
||||
process_next_command();
|
||||
|
||||
#endif // SDSUPPORT
|
||||
|
||||
// The queue may be reset by a command handler or by code invoked by idle() within a handler
|
||||
if (commands_in_queue) {
|
||||
--commands_in_queue;
|
||||
cmd_queue_index_r = (cmd_queue_index_r + 1) % BUFSIZE;
|
||||
}
|
||||
}
|
||||
endstops.report_state();
|
||||
idle();
|
||||
}
|
||||
|
||||
void gcode_line_error(const char* err, bool doFlush = true) {
|
||||
SERIAL_ERROR_START;
|
||||
serialprintPGM(err);
|
||||
@ -8889,3 +8675,217 @@ void calculate_volumetric_multipliers() {
|
||||
for (uint8_t i = 0; i < COUNT(filament_size); i++)
|
||||
volumetric_multiplier[i] = calculate_volumetric_multiplier(filament_size[i]);
|
||||
}
|
||||
|
||||
/**
|
||||
* Marlin entry-point: Set up before the program loop
|
||||
* - Set up the kill pin, filament runout, power hold
|
||||
* - Start the serial port
|
||||
* - Print startup messages and diagnostics
|
||||
* - Get EEPROM or default settings
|
||||
* - Initialize managers for:
|
||||
* • temperature
|
||||
* • planner
|
||||
* • watchdog
|
||||
* • stepper
|
||||
* • photo pin
|
||||
* • servos
|
||||
* • LCD controller
|
||||
* • Digipot I2C
|
||||
* • Z probe sled
|
||||
* • status LEDs
|
||||
*/
|
||||
void setup() {
|
||||
|
||||
#ifdef DISABLE_JTAG
|
||||
// Disable JTAG on AT90USB chips to free up pins for IO
|
||||
MCUCR = 0x80;
|
||||
MCUCR = 0x80;
|
||||
#endif
|
||||
|
||||
#if ENABLED(FILAMENT_RUNOUT_SENSOR)
|
||||
setup_filrunoutpin();
|
||||
#endif
|
||||
|
||||
setup_killpin();
|
||||
|
||||
setup_powerhold();
|
||||
|
||||
#if HAS_STEPPER_RESET
|
||||
disableStepperDrivers();
|
||||
#endif
|
||||
|
||||
MYSERIAL.begin(BAUDRATE);
|
||||
SERIAL_PROTOCOLLNPGM("start");
|
||||
SERIAL_ECHO_START;
|
||||
|
||||
// Check startup - does nothing if bootloader sets MCUSR to 0
|
||||
byte mcu = MCUSR;
|
||||
if (mcu & 1) SERIAL_ECHOLNPGM(MSG_POWERUP);
|
||||
if (mcu & 2) SERIAL_ECHOLNPGM(MSG_EXTERNAL_RESET);
|
||||
if (mcu & 4) SERIAL_ECHOLNPGM(MSG_BROWNOUT_RESET);
|
||||
if (mcu & 8) SERIAL_ECHOLNPGM(MSG_WATCHDOG_RESET);
|
||||
if (mcu & 32) SERIAL_ECHOLNPGM(MSG_SOFTWARE_RESET);
|
||||
MCUSR = 0;
|
||||
|
||||
SERIAL_ECHOPGM(MSG_MARLIN);
|
||||
SERIAL_ECHOLNPGM(" " SHORT_BUILD_VERSION);
|
||||
|
||||
#ifdef STRING_DISTRIBUTION_DATE
|
||||
#ifdef STRING_CONFIG_H_AUTHOR
|
||||
SERIAL_ECHO_START;
|
||||
SERIAL_ECHOPGM(MSG_CONFIGURATION_VER);
|
||||
SERIAL_ECHOPGM(STRING_DISTRIBUTION_DATE);
|
||||
SERIAL_ECHOPGM(MSG_AUTHOR);
|
||||
SERIAL_ECHOLNPGM(STRING_CONFIG_H_AUTHOR);
|
||||
SERIAL_ECHOPGM("Compiled: ");
|
||||
SERIAL_ECHOLNPGM(__DATE__);
|
||||
#endif // STRING_CONFIG_H_AUTHOR
|
||||
#endif // STRING_DISTRIBUTION_DATE
|
||||
|
||||
SERIAL_ECHO_START;
|
||||
SERIAL_ECHOPGM(MSG_FREE_MEMORY);
|
||||
SERIAL_ECHO(freeMemory());
|
||||
SERIAL_ECHOPGM(MSG_PLANNER_BUFFER_BYTES);
|
||||
SERIAL_ECHOLN((int)sizeof(block_t)*BLOCK_BUFFER_SIZE);
|
||||
|
||||
// Send "ok" after commands by default
|
||||
for (int8_t i = 0; i < BUFSIZE; i++) send_ok[i] = true;
|
||||
|
||||
// Load data from EEPROM if available (or use defaults)
|
||||
// This also updates variables in the planner, elsewhere
|
||||
Config_RetrieveSettings();
|
||||
|
||||
// Initialize current position based on home_offset
|
||||
memcpy(current_position, home_offset, sizeof(home_offset));
|
||||
|
||||
// Vital to init stepper/planner equivalent for current_position
|
||||
SYNC_PLAN_POSITION_KINEMATIC();
|
||||
|
||||
thermalManager.init(); // Initialize temperature loop
|
||||
|
||||
#if ENABLED(USE_WATCHDOG)
|
||||
watchdog_init();
|
||||
#endif
|
||||
|
||||
stepper.init(); // Initialize stepper, this enables interrupts!
|
||||
setup_photpin();
|
||||
servo_init();
|
||||
|
||||
#if HAS_BED_PROBE
|
||||
endstops.enable_z_probe(false);
|
||||
#endif
|
||||
|
||||
#if HAS_CONTROLLERFAN
|
||||
SET_OUTPUT(CONTROLLERFAN_PIN); //Set pin used for driver cooling fan
|
||||
#endif
|
||||
|
||||
#if HAS_STEPPER_RESET
|
||||
enableStepperDrivers();
|
||||
#endif
|
||||
|
||||
#if ENABLED(DIGIPOT_I2C)
|
||||
digipot_i2c_init();
|
||||
#endif
|
||||
|
||||
#if ENABLED(DAC_STEPPER_CURRENT)
|
||||
dac_init();
|
||||
#endif
|
||||
|
||||
#if ENABLED(Z_PROBE_SLED) && PIN_EXISTS(SLED)
|
||||
pinMode(SLED_PIN, OUTPUT);
|
||||
digitalWrite(SLED_PIN, LOW); // turn it off
|
||||
#endif // Z_PROBE_SLED
|
||||
|
||||
setup_homepin();
|
||||
|
||||
#ifdef STAT_LED_RED
|
||||
pinMode(STAT_LED_RED, OUTPUT);
|
||||
digitalWrite(STAT_LED_RED, LOW); // turn it off
|
||||
#endif
|
||||
|
||||
#ifdef STAT_LED_BLUE
|
||||
pinMode(STAT_LED_BLUE, OUTPUT);
|
||||
digitalWrite(STAT_LED_BLUE, LOW); // turn it off
|
||||
#endif
|
||||
|
||||
lcd_init();
|
||||
#if ENABLED(SHOW_BOOTSCREEN)
|
||||
#if ENABLED(DOGLCD)
|
||||
safe_delay(BOOTSCREEN_TIMEOUT);
|
||||
#elif ENABLED(ULTRA_LCD)
|
||||
bootscreen();
|
||||
lcd_init();
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#if ENABLED(MIXING_EXTRUDER) && MIXING_VIRTUAL_TOOLS > 1
|
||||
// Initialize mixing to 100% color 1
|
||||
for (uint8_t i = 0; i < MIXING_STEPPERS; i++)
|
||||
mixing_factor[i] = (i == 0) ? 1 : 0;
|
||||
for (uint8_t t = 0; t < MIXING_VIRTUAL_TOOLS; t++)
|
||||
for (uint8_t i = 0; i < MIXING_STEPPERS; i++)
|
||||
mixing_virtual_tool_mix[t][i] = mixing_factor[i];
|
||||
#endif
|
||||
|
||||
#if ENABLED(EXPERIMENTAL_I2CBUS) && I2C_SLAVE_ADDRESS > 0
|
||||
i2c.onReceive(i2c_on_receive);
|
||||
i2c.onRequest(i2c_on_request);
|
||||
#endif
|
||||
}
|
||||
|
||||
/**
|
||||
* The main Marlin program loop
|
||||
*
|
||||
* - Save or log commands to SD
|
||||
* - Process available commands (if not saving)
|
||||
* - Call heater manager
|
||||
* - Call inactivity manager
|
||||
* - Call endstop manager
|
||||
* - Call LCD update
|
||||
*/
|
||||
void loop() {
|
||||
if (commands_in_queue < BUFSIZE) get_available_commands();
|
||||
|
||||
#if ENABLED(SDSUPPORT)
|
||||
card.checkautostart(false);
|
||||
#endif
|
||||
|
||||
if (commands_in_queue) {
|
||||
|
||||
#if ENABLED(SDSUPPORT)
|
||||
|
||||
if (card.saving) {
|
||||
char* command = command_queue[cmd_queue_index_r];
|
||||
if (strstr_P(command, PSTR("M29"))) {
|
||||
// M29 closes the file
|
||||
card.closefile();
|
||||
SERIAL_PROTOCOLLNPGM(MSG_FILE_SAVED);
|
||||
ok_to_send();
|
||||
}
|
||||
else {
|
||||
// Write the string from the read buffer to SD
|
||||
card.write_command(command);
|
||||
if (card.logging)
|
||||
process_next_command(); // The card is saving because it's logging
|
||||
else
|
||||
ok_to_send();
|
||||
}
|
||||
}
|
||||
else
|
||||
process_next_command();
|
||||
|
||||
#else
|
||||
|
||||
process_next_command();
|
||||
|
||||
#endif // SDSUPPORT
|
||||
|
||||
// The queue may be reset by a command handler or by code invoked by idle() within a handler
|
||||
if (commands_in_queue) {
|
||||
--commands_in_queue;
|
||||
cmd_queue_index_r = (cmd_queue_index_r + 1) % BUFSIZE;
|
||||
}
|
||||
}
|
||||
endstops.report_state();
|
||||
idle();
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user