void HAL_init() { // Support the 4 LEDs some LPC176x boards have #if PIN_EXISTS(LED) SET_DIR_OUTPUT(LED_PIN); WRITE_PIN_CLR(LED_PIN); #if PIN_EXISTS(LED2) SET_DIR_OUTPUT(LED2_PIN); WRITE_PIN_CLR(LED2_PIN); #if PIN_EXISTS(LED3) SET_DIR_OUTPUT(LED3_PIN); WRITE_PIN_CLR(LED3_PIN); #if PIN_EXISTS(LED4) SET_DIR_OUTPUT(LED4_PIN); WRITE_PIN_CLR(LED4_PIN); #endif #endif #endif // Flash status LED 3 times to indicate Marlin has started booting for (uint8_t i = 0; i < 6; ++i) { TOGGLE(LED_PIN); delay(100); } #endif //debug_frmwrk_init(); //_DBG("\n\nDebug running\n"); // Initialise the SD card chip select pins as soon as possible #if PIN_EXISTS(SS) WRITE(SS_PIN, HIGH); SET_OUTPUT(SS_PIN); #endif #if defined(ONBOARD_SD_CS) && ONBOARD_SD_CS > -1 WRITE(ONBOARD_SD_CS, HIGH); SET_OUTPUT(ONBOARD_SD_CS); #endif USB_Init(); // USB Initialization USB_Connect(FALSE); // USB clear connection delay(1000); // Give OS time to notice USB_Connect(TRUE); #if DISABLED(USB_SD_DISABLED) MSC_SD_Init(0); // Enable USB SD card access #endif const millis_t usb_timeout = millis() + 2000; while (!USB_Configuration && PENDING(millis(), usb_timeout)) { delay(50); HAL_idletask(); #if PIN_EXISTS(LED) TOGGLE(LED_PIN); // Flash quickly during USB initialization #endif } #if NUM_SERIAL > 0 MYSERIAL0.begin(BAUDRATE); #if NUM_SERIAL > 1 MYSERIAL1.begin(BAUDRATE); #endif SERIAL_PRINTF("\n\necho:%s (%dMhz) Initialized\n", isLPC1769() ? "LPC1769" : "LPC1768", SystemCoreClock / 1000000); SERIAL_FLUSHTX(); #endif HAL_timer_init(); }
/** * Produce one of these mesh maps: * 0: Human-readable * 1: CSV format for spreadsheet import * 2: TODO: Display on Graphical LCD * 4: Compact Human-Readable */ void unified_bed_leveling::display_map(const int map_type) { #if HAS_AUTO_REPORTING || ENABLED(HOST_KEEPALIVE_FEATURE) suspend_auto_report = true; #endif constexpr uint8_t eachsp = 1 + 6 + 1, // [-3.567] twixt = eachsp * (GRID_MAX_POINTS_X) - 9 * 2; // Leading 4sp, Coordinates 9sp each const bool human = !(map_type & 0x3), csv = map_type == 1, lcd = map_type == 2, comp = map_type & 0x4; SERIAL_ECHOPGM("\nBed Topography Report"); if (human) { SERIAL_ECHOLNPGM(":\n"); serial_echo_xy(4, MESH_MIN_X, MESH_MAX_Y); serial_echo_xy(twixt, MESH_MAX_X, MESH_MAX_Y); SERIAL_EOL(); serial_echo_column_labels(eachsp - 2); } else { SERIAL_ECHOPGM(" for "); serialprintPGM(csv ? PSTR("CSV:\n") : PSTR("LCD:\n")); } const float current_xi = get_cell_index_x(current_position[X_AXIS] + (MESH_X_DIST) / 2.0), current_yi = get_cell_index_y(current_position[Y_AXIS] + (MESH_Y_DIST) / 2.0); if (!lcd) SERIAL_EOL(); for (int8_t j = GRID_MAX_POINTS_Y - 1; j >= 0; j--) { // Row Label (J index) if (human) { if (j < 10) SERIAL_CHAR(' '); SERIAL_ECHO(j); SERIAL_ECHOPGM(" |"); } // Row Values (I indexes) for (uint8_t i = 0; i < GRID_MAX_POINTS_X; i++) { // Opening Brace or Space const bool is_current = i == current_xi && j == current_yi; if (human) SERIAL_CHAR(is_current ? '[' : ' '); // Z Value at current I, J const float f = z_values[i][j]; if (lcd) { // TODO: Display on Graphical LCD } else if (isnan(f)) serialprintPGM(human ? PSTR(" . ") : PSTR("NAN")); else if (human || csv) { if (human && f >= 0.0) SERIAL_CHAR(f > 0 ? '+' : ' '); // Space for positive ('-' for negative) SERIAL_ECHO_F(f, 3); // Positive: 5 digits, Negative: 6 digits } if (csv && i < GRID_MAX_POINTS_X - 1) SERIAL_CHAR('\t'); // Closing Brace or Space if (human) SERIAL_CHAR(is_current ? ']' : ' '); SERIAL_FLUSHTX(); idle(); } if (!lcd) SERIAL_EOL(); // A blank line between rows (unless compact) if (j && human && !comp) SERIAL_ECHOLNPGM(" |"); } if (human) { serial_echo_column_labels(eachsp - 2); SERIAL_EOL(); serial_echo_xy(4, MESH_MIN_X, MESH_MIN_Y); serial_echo_xy(twixt, MESH_MAX_X, MESH_MIN_Y); SERIAL_EOL(); SERIAL_EOL(); } #if HAS_AUTO_REPORTING || ENABLED(HOST_KEEPALIVE_FEATURE) suspend_auto_report = false; #endif }