Commit 3a7dea0b authored by MagoKimbra's avatar MagoKimbra

Update LCD

parent 9f3e404f
......@@ -50,7 +50,8 @@ uint8_t debugLevel = DEBUG_ERRORS;
static float feedrate = 1500.0, saved_feedrate;
float current_position[NUM_AXIS] = { 0.0 };
float destination[NUM_AXIS] = { 0.0 };
bool axis_known_position[3] = { false };
uint8_t axis_known_position = 0;
uint8_t axis_was_homed = 0;
bool pos_saved = false;
float stored_position[NUM_POSITON_SLOTS][NUM_AXIS];
......@@ -913,6 +914,7 @@ void get_command() {
bool code_has_value() {
int i = 1;
char c = seen_pointer[i];
while (c == ' ') c = seen_pointer[++i];
if (c == '-' || c == '+') c = seen_pointer[++i];
if (c == '.') c = seen_pointer[++i];
return (c >= '0' && c <= '9');
......@@ -1358,7 +1360,7 @@ static void clean_up_after_endstop_move() {
#if HAS(SERVO_ENDSTOPS) && HASNT(Z_PROBE_SLED)
void raise_z_for_servo() {
float zpos = current_position[Z_AXIS], z_dest = Z_RAISE_BEFORE_PROBING;
z_dest += axis_known_position[Z_AXIS] ? zprobe_zoffset : zpos;
z_dest += TEST(axis_was_homed, Z_AXIS) ? zprobe_zoffset : zpos;
if (zpos < z_dest) do_blocking_move_to_z(z_dest); // also updates current_position
}
#endif
......@@ -1480,7 +1482,8 @@ static void clean_up_after_endstop_move() {
destination[axis] = current_position[axis];
feedrate = 0.0;
endstops_hit_on_purpose(); // clear endstop hit flags
axis_known_position[axis] = true;
BITSET(axis_was_homed, axis);
BITSET(axis_known_position, axis);
#if ENABLED(Z_PROBE_SLED)
// bring probe back
......@@ -1589,7 +1592,8 @@ static void clean_up_after_endstop_move() {
destination[axis] = current_position[axis];
feedrate = 0.0;
endstops_hit_on_purpose(); // clear endstop hit flags
axis_known_position[axis] = true;
BITSET(axis_was_homed, axis);
BITSET(axis_known_position, axis);
}
}
#define HOMEAXIS(LETTER) homeaxis(LETTER##_AXIS)
......@@ -2534,9 +2538,9 @@ static void clean_up_after_endstop_move() {
void gcode_get_mix() {
const char* mixing_codes = "ABCDHI";
float mix_total = 0.0;
for (int8_t e = 0; e < DRIVER_EXTRUDERS; e++) {
float v = code_seen(mixing_codes[e]) ? code_value() : mixing_factor[e];
mixing_factor[e] = v;
for (int8_t i = 0; i < DRIVER_EXTRUDERS; i++) {
float v = code_seen(mixing_codes[i]) ? code_value() : mixing_factor[i];
mixing_factor[i] = v;
mix_total += v;
}
......@@ -2544,8 +2548,8 @@ static void clean_up_after_endstop_move() {
if (mix_total < 0.9999 || mix_total > 1.0001) {
ECHO_EM("Warning: Mix factors must add up to 1.0. Scaling.");
float mix_scale = 1.0 / mix_total;
for (int8_t e = 0; e < DRIVER_EXTRUDERS; e++)
mixing_factor[e] *= mix_scale;
for (int8_t i = 0; i < DRIVER_EXTRUDERS; i++)
mixing_factor[i] *= mix_scale;
}
}
#endif
......@@ -2587,7 +2591,6 @@ static void clean_up_after_endstop_move() {
set_destination_to_current();
if (retracting) {
feedrate = retract_feedrate * 60;
current_position[E_AXIS] += (swapping ? retract_length_swap : retract_length) / volumetric_multiplier[active_extruder];
plan_set_e_position(current_position[E_AXIS]);
......@@ -2604,7 +2607,6 @@ static void clean_up_after_endstop_move() {
}
}
else {
if (retract_zlift > 0.01) {
current_position[Z_AXIS] += retract_zlift;
#if MECH(DELTA) || MECH(SCARA)
......@@ -2644,7 +2646,7 @@ static void clean_up_after_endstop_move() {
if (debugLevel & DEBUG_INFO)
ECHO_LMV(INFO, "dock_sled", dock);
if (!axis_known_position[X_AXIS] || !axis_known_position[Y_AXIS]) {
if (axis_known_position & (BIT(X_AXIS)|BIT(Y_AXIS)) != BIT(X_AXIS)|BIT(Y_AXIS)) {
LCD_MESSAGEPGM(MSG_POSITION_UNKNOWN);
ECHO_LM(DB, MSG_POSITION_UNKNOWN);
return;
......@@ -3303,7 +3305,7 @@ inline void gcode_G28() {
else if (homeZ) { // Don't need to Home Z twice
// Let's see if X and Y are homed
if (axis_known_position[X_AXIS] && axis_known_position[Y_AXIS]) {
if (axis_was_homed & (BIT(X_AXIS)|BIT(Y_AXIS)) == BIT(X_AXIS)|BIT(Y_AXIS)) {
// Make sure the probe is within the physical limits
// NOTE: This doesn't necessarily ensure the probe is also within the bed!
......@@ -3348,7 +3350,7 @@ inline void gcode_G28() {
if (home_all_axis || homeZ) {
// Let's see if X and Y are homed
if (axis_known_position[X_AXIS] && axis_known_position[Y_AXIS]) {
if (axis_was_homed & (BIT(X_AXIS)|BIT(Y_AXIS)) == BIT(X_AXIS)|BIT(Y_AXIS)) {
current_position[Z_AXIS] = 0;
sync_plan_position();
......@@ -3477,7 +3479,7 @@ inline void gcode_G28() {
ECHO_LM(INFO, "gcode_G29 >>>");
// Don't allow auto-leveling without homing first
if (!axis_known_position[X_AXIS] || !axis_known_position[Y_AXIS]) {
if (axis_known_position & (BIT(X_AXIS)|BIT(Y_AXIS)) != BIT(X_AXIS)|BIT(Y_AXIS)) {
LCD_MESSAGEPGM(MSG_POSITION_UNKNOWN);
ECHO_LM(ER, MSG_POSITION_UNKNOWN);
return;
......@@ -6151,7 +6153,7 @@ inline void gcode_M428() {
memcpy(new_pos, current_position, sizeof(new_pos));
memcpy(new_offs, home_offset, sizeof(new_offs));
for (int8_t i = X_AXIS; i <= Z_AXIS; i++) {
if (axis_known_position[i]) {
if (TEST(axis_known_position, i)) {
#if MECH(DELTA)
float base = (new_pos[i] > (min_pos[i] + max_pos[i]) / 2) ? base_home_pos[i] : 0,
#else
......
......@@ -96,13 +96,18 @@ extern float homing_feedrate[];
extern bool axis_relative_modes[];
extern int feedrate_multiplier;
extern bool volumetric_enabled;
extern int extruder_multiplier[EXTRUDERS]; // sets extrude multiply factor (in percent) for each extruder individually
extern int density_multiplier[EXTRUDERS]; // sets density multiply factor (in percent) for each extruder individually
extern float filament_size[EXTRUDERS]; // cross-sectional area of filament (in millimeters), typically around 1.75 or 2.85, 0 disables the volumetric calculations for the extruder.
extern float volumetric_multiplier[EXTRUDERS]; // reciprocal of cross-sectional area of filament (in square millimeters), stored this way to reduce computational burden in planner
extern int extruder_multiplier[EXTRUDERS]; // sets extrude multiply factor (in percent) for each extruder individually
extern int density_multiplier[EXTRUDERS]; // sets density multiply factor (in percent) for each extruder individually
extern float filament_size[EXTRUDERS]; // cross-sectional area of filament (in millimeters), typically around 1.75 or 2.85, 0 disables the volumetric calculations for the extruder.
extern float volumetric_multiplier[EXTRUDERS]; // reciprocal of cross-sectional area of filament (in square millimeters), stored this way to reduce computational burden in planner
extern float current_position[NUM_AXIS];
extern float destination[NUM_AXIS];
extern float home_offset[3];
extern float min_pos[3];
extern float max_pos[3];
extern float zprobe_zoffset;
extern uint8_t axis_known_position;
extern uint8_t axis_was_homed;
// Hotend offset
#if HOTENDS > 1
......@@ -132,11 +137,6 @@ extern float home_offset[3];
extern float axis_scaling[3]; // Build size scaling
#endif
extern float min_pos[3];
extern float max_pos[3];
extern bool axis_known_position[3];
extern float zprobe_zoffset;
// Lifetime stats
extern unsigned long printer_usage_seconds; // this can old about 136 year before go overflow. If you belive that you can live more than this please contact me.
// Filament stats
......
......@@ -354,7 +354,9 @@ static void lcd_implementation_status_screen() {
lcd_printPGM(PSTR("---"));
}
// X, Y, Z-Coordinates
// Print XYZ Coordinates
// If the axis was not homed, show "---"
// If the position is untrusted, show "?"
#define XYZ_BASELINE 38
lcd_setFont(FONT_STATUSMENU);
......@@ -364,30 +366,33 @@ static void lcd_implementation_status_screen() {
u8g.drawBox(0, 30, LCD_PIXEL_WIDTH, 9);
#endif
u8g.setColorIndex(0); // white on black
u8g.setPrintPos(2, XYZ_BASELINE);
lcd_print('X');
lcd_print(TEST(axis_known_position, X_AXIS) || !TEST(axis_was_homed, X_AXIS) ? 'X' : '?');
u8g.drawPixel(8, XYZ_BASELINE - 5);
u8g.drawPixel(8, XYZ_BASELINE - 3);
u8g.setPrintPos(10, XYZ_BASELINE);
if (axis_known_position[X_AXIS])
if (TEST(axis_was_homed, X_AXIS))
lcd_print(ftostr31ns(current_position[X_AXIS]));
else
lcd_printPGM(PSTR("---"));
u8g.setPrintPos(43, XYZ_BASELINE);
lcd_print('Y');
lcd_print(TEST(axis_known_position, Y_AXIS) || !TEST(axis_was_homed, Y_AXIS) ? 'Y' : '?');
u8g.drawPixel(49, XYZ_BASELINE - 5);
u8g.drawPixel(49, XYZ_BASELINE - 3);
u8g.setPrintPos(51, XYZ_BASELINE);
if (axis_known_position[Y_AXIS])
if (TEST(axis_was_homed, Y_AXIS))
lcd_print(ftostr31ns(current_position[Y_AXIS]));
else
lcd_printPGM(PSTR("---"));
u8g.setPrintPos(83, XYZ_BASELINE);
lcd_print('Z');
lcd_print(TEST(axis_known_position, Z_AXIS) || !TEST(axis_was_homed, Z_AXIS) ? 'Z' : '?');
u8g.drawPixel(89, XYZ_BASELINE - 5);
u8g.drawPixel(89, XYZ_BASELINE - 3);
u8g.setPrintPos(91, XYZ_BASELINE);
if (axis_known_position[Z_AXIS])
if (TEST(axis_was_homed, Z_AXIS))
lcd_print(ftostr32sp(current_position[Z_AXIS]));
else
lcd_printPGM(PSTR("---.--"));
......
......@@ -839,7 +839,7 @@ static void lcd_prepare_menu() {
// Level Bed
//
#if ENABLED(AUTO_BED_LEVELING_FEATURE)
if (axis_known_position[X_AXIS] && axis_known_position[Y_AXIS])
if (axis_known_position & (BIT(X_AXIS)|BIT(Y_AXIS)) == BIT(X_AXIS)|BIT(Y_AXIS)) {
MENU_ITEM(gcode, MSG_LEVEL_BED, PSTR("G29"));
#elif !MECH(DELTA) && DISABLED(Z_SAFE_HOMING) && Z_HOME_DIR < 0
MENU_ITEM(submenu, MSG_MBL_SETTING, config_lcd_level_bed);
......
......@@ -104,7 +104,7 @@
#define BLEN_REPRAPWORLD_KEYPAD_MIDDLE 5
#define BLEN_REPRAPWORLD_KEYPAD_DOWN 3
#define BLEN_REPRAPWORLD_KEYPAD_LEFT 7
#define REPRAPWORLD_BTN_OFFSET 0 // bit offset into buttons for shift register values
#define EN_REPRAPWORLD_KEYPAD_F3 BIT((BLEN_REPRAPWORLD_KEYPAD_F3+REPRAPWORLD_BTN_OFFSET))
......@@ -236,6 +236,11 @@
#include "utf_mapper.h"
#if ENABLED(SHOW_BOOTSCREEN)
static void bootscreen();
static bool show_bootscreen = true;
#endif
#if ENABLED(LCD_PROGRESS_BAR)
static millis_t progress_bar_ms = 0;
#if PROGRESS_MSG_EXPIRE > 0
......@@ -425,6 +430,10 @@ static void lcd_implementation_init(
lcd.begin(LCD_WIDTH, LCD_HEIGHT);
#endif
#if ENABLED(SHOW_BOOTSCREEN)
if (show_bootscreen) bootscreen();
#endif
lcd_set_custom_characters(
#if ENABLED(LCD_PROGRESS_BAR)
progress_bar_set
......@@ -452,6 +461,98 @@ char lcd_print(char* str) {
unsigned lcd_print(char c) { return charset_mapper(c); }
#if ENABLED(SHOW_BOOTSCREEN)
void lcd_erase_line(int line) {
lcd.setCursor(0, 3);
for (int i = 0; i < LCD_WIDTH; i++)
lcd_print(' ');
}
// Scroll the PSTR 'text' in a 'len' wide field for 'time' milliseconds at position col,line
void lcd_scroll(int col, int line, const char* text, int len, int time) {
char tmp[LCD_WIDTH + 1] = {0};
int n = max(lcd_strlen_P(text) - len, 0);
for (int i = 0; i <= n; i++) {
strncpy_P(tmp, text + i, min(len, LCD_WIDTH));
lcd.setCursor(col, line);
lcd_print(tmp);
delay(time / max(n, 1));
}
}
static void bootscreen() {
show_bootscreen = false;
byte top_left[8] = {
B00000,
B00000,
B00000,
B00000,
B00001,
B00010,
B00100,
B00100
};
byte top_right[8] = {
B00000,
B00000,
B00000,
B11100,
B11100,
B01100,
B00100,
B00100
};
byte botom_left[8] = {
B00100,
B00010,
B00001,
B00000,
B00000,
B00000,
B00000,
B00000
};
byte botom_right[8] = {
B00100,
B01000,
B10000,
B00000,
B00000,
B00000,
B00000,
B00000
};
lcd.createChar(0, top_left);
lcd.createChar(1, top_right);
lcd.createChar(2, botom_left);
lcd.createChar(3, botom_right);
lcd.clear();
#define TEXT_SCREEN_LOGO_SHIFT ((LCD_WIDTH/2) - 7)
lcd.setCursor(TEXT_SCREEN_LOGO_SHIFT, 0); lcd.print('\x00'); lcd_printPGM(PSTR( "------------" )); lcd.print('\x01');
lcd.setCursor(TEXT_SCREEN_LOGO_SHIFT, 1); lcd_printPGM(PSTR("|MarlinKimbra|"));
lcd.setCursor(TEXT_SCREEN_LOGO_SHIFT, 2); lcd.print('\x02'); lcd_printPGM(PSTR( "------------" )); lcd.print('\x03');
delay(1000);
#ifdef STRING_SPLASH_LINE1
lcd_erase_line(3);
lcd_scroll(0, 3, PSTR(STRING_SPLASH_LINE1), LCD_WIDTH, 3000);
#endif
#ifdef STRING_SPLASH_LINE2
lcd_erase_line(3);
lcd_scroll(0, 3, PSTR(STRING_SPLASH_LINE2), LCD_WIDTH, 3000);
#endif
#ifdef FIRMWARE_URL
lcd_erase_line(3);
lcd_scroll(0, 3, PSTR(FIRMWARE_URL), LCD_WIDTH, 5000);
#endif
}
#endif // SHOW_BOOTSCREEN
/*
Possible status screens:
16x2 |000/000 B000/000|
......@@ -561,6 +662,12 @@ static void lcd_implementation_status_screen() {
lcd.setCursor(0, 1);
//
// Print XYZ Coordinates
// If the axis was not homed, show "---"
// If the position is untrusted, show "?"
//
#if HOTENDS > 1 && TEMP_SENSOR_BED != 0
// If we both have a 2nd hotend and a heated bed,
......@@ -570,14 +677,14 @@ static void lcd_implementation_status_screen() {
#else
lcd.print('X');
if (axis_known_position[X_AXIS])
lcd.print(TEST(axis_known_position, X_AXIS) || !TEST(axis_was_homed, X_AXIS) ? 'X' : '?');
if (TEST(axis_was_homed, X_AXIS))
lcd.print(ftostr4sign(current_position[X_AXIS]));
else
lcd_printPGM(PSTR(" ---"));
lcd_printPGM(PSTR(" Y"));
if (axis_known_position[Y_AXIS])
lcd_printPGM(TEST(axis_known_position, Y_AXIS) || !TEST(axis_was_homed, Y_AXIS) ? PSTR(" Y") : PSTR(" ?"));
if (TEST(axis_was_homed, Y_AXIS))
lcd.print(ftostr4sign(current_position[Y_AXIS]));
else
lcd_printPGM(PSTR(" ---"));
......@@ -587,8 +694,8 @@ static void lcd_implementation_status_screen() {
#endif // LCD_WIDTH >= 20
lcd.setCursor(LCD_WIDTH - 8, 1);
lcd_printPGM(PSTR("Z "));
if (axis_known_position[Z_AXIS])
lcd_printPGM(TEST(axis_known_position, Z_AXIS) || !TEST(axis_was_homed, Z_AXIS) ? PSTR("Z ") : PSTR("? "));
if (TEST(axis_was_homed, Z_AXIS))
lcd.print(ftostr32sp(current_position[Z_AXIS] + 0.00001));
else
lcd_printPGM(PSTR("---.--"));
......
......@@ -7,6 +7,8 @@
// Macros for bit masks
#define BIT(b) (1<<(b))
#define TEST(n,b) (((n)&BIT(b))!=0)
#define BITSET(n,b) n |= BIT(b)
#define BITCLR(n,b) n &= ~BIT(b)
#define SET_BIT(n,b,value) (n) ^= ((-value)^(n)) & (BIT(b))
// Macros for maths shortcuts
......
......@@ -696,7 +696,7 @@ ISR(TIMER1_COMPA_vect) {
#if ENABLED(COLOR_MIXING_EXTRUDER)
long dir = TEST(out_bits, E_AXIS) ? -1 : 1;
for (uint8_t j = 0; j < DRIVER_EXTRUDERS; j++) {
for (int8_t j = 0; j < DRIVER_EXTRUDERS; j++) {
counter_m[j] += current_block->mix_steps[j];
if (counter_m[j] > 0) {
counter_m[j] -= current_block->step_event_count;
......@@ -713,9 +713,9 @@ ISR(TIMER1_COMPA_vect) {
#define STEP_START(axis, AXIS) \
_COUNTER(axis) += current_block->steps[_AXIS(AXIS)]; \
if (_COUNTER(axis) > 0) { \
_APPLY_STEP(AXIS)(!_INVERT_STEP_PIN(AXIS),0); \
_COUNTER(axis) -= current_block->step_event_count; \
count_position[_AXIS(AXIS)] += count_direction[_AXIS(AXIS)]; }
_APPLY_STEP(AXIS)(!_INVERT_STEP_PIN(AXIS),0); \
_COUNTER(axis) -= current_block->step_event_count; \
count_position[_AXIS(AXIS)] += count_direction[_AXIS(AXIS)]; }
STEP_START(x, X);
STEP_START(y, Y);
......
......@@ -180,10 +180,10 @@
#if ENABLED(DUAL_X_CARRIAGE) && HAS(X_ENABLE) && HAS(X2_ENABLE)
#define enable_x() do { X_ENABLE_WRITE( X_ENABLE_ON); X2_ENABLE_WRITE( X_ENABLE_ON); } while (0)
#define disable_x() do { X_ENABLE_WRITE(!X_ENABLE_ON); X2_ENABLE_WRITE(!X_ENABLE_ON); axis_known_position[X_AXIS] = false; } while (0)
#define disable_x() do { X_ENABLE_WRITE(!X_ENABLE_ON); X2_ENABLE_WRITE(!X_ENABLE_ON); BITCLR(axis_known_position, X_AXIS); } while (0)
#elif HAS(X_ENABLE)
#define enable_x() X_ENABLE_WRITE( X_ENABLE_ON)
#define disable_x() { X_ENABLE_WRITE(!X_ENABLE_ON); axis_known_position[X_AXIS] = false; }
#define disable_x() { X_ENABLE_WRITE(!X_ENABLE_ON); BITCLR(axis_known_position, X_AXIS); }
#else
#define enable_x() ;
#define disable_x() ;
......@@ -192,10 +192,10 @@
#if HAS(Y_ENABLE)
#if ENABLED(Y_DUAL_STEPPER_DRIVERS)
#define enable_y() { Y_ENABLE_WRITE( Y_ENABLE_ON); Y2_ENABLE_WRITE(Y_ENABLE_ON); }
#define disable_y() { Y_ENABLE_WRITE(!Y_ENABLE_ON); Y2_ENABLE_WRITE(!Y_ENABLE_ON); axis_known_position[Y_AXIS] = false; }
#define disable_y() { Y_ENABLE_WRITE(!Y_ENABLE_ON); Y2_ENABLE_WRITE(!Y_ENABLE_ON); BITCLR(axis_known_position, Y_AXIS); }
#else
#define enable_y() Y_ENABLE_WRITE( Y_ENABLE_ON)
#define disable_y() { Y_ENABLE_WRITE(!Y_ENABLE_ON); axis_known_position[Y_AXIS] = false; }
#define disable_y() { Y_ENABLE_WRITE(!Y_ENABLE_ON); BITCLR(axis_known_position, Y_AXIS); }
#endif
#else
#define enable_y() ;
......@@ -205,10 +205,10 @@
#if HAS(Z_ENABLE)
#if ENABLED(Z_DUAL_STEPPER_DRIVERS)
#define enable_z() { Z_ENABLE_WRITE( Z_ENABLE_ON); Z2_ENABLE_WRITE(Z_ENABLE_ON); }
#define disable_z() { Z_ENABLE_WRITE(!Z_ENABLE_ON); Z2_ENABLE_WRITE(!Z_ENABLE_ON); axis_known_position[Z_AXIS] = false; }
#define disable_z() { Z_ENABLE_WRITE(!Z_ENABLE_ON); Z2_ENABLE_WRITE(!Z_ENABLE_ON); BITCLR(axis_known_position, Z_AXIS); }
#else
#define enable_z() Z_ENABLE_WRITE( Z_ENABLE_ON)
#define disable_z() { Z_ENABLE_WRITE(!Z_ENABLE_ON); axis_known_position[Z_AXIS] = false; }
#define disable_z() { Z_ENABLE_WRITE(!Z_ENABLE_ON); BITCLR(axis_known_position, Z_AXIS); }
#endif
#else
#define enable_z() ;
......
......@@ -528,24 +528,24 @@
char* valuetemp;
memset(buffer, 0, sizeof(buffer));
strcat(buffer, "X");
if (axis_known_position[X_AXIS]) {
strcat(buffer, TEST(axis_known_position, X_AXIS) || !TEST(axis_was_homed, X_AXIS) ? "X" : "?");
if (TEST(axis_was_homed, X_AXIS)) {
valuetemp = ftostr4sign(current_position[X_AXIS]);
strcat(buffer, valuetemp);
}
else
strcat(buffer, "---");
strcat(buffer, " Y");
if (axis_known_position[Y_AXIS]) {
strcat(buffer, TEST(axis_known_position, Y_AXIS) || !TEST(axis_was_homed, Y_AXIS) ? PSTR(" Y") : PSTR(" ?"));
if (TEST(axis_was_homed, Y_AXIS)) {
valuetemp = ftostr4sign(current_position[Y_AXIS]);
strcat(buffer, valuetemp);
}
else
strcat(buffer, "---");
strcat(buffer, " Z");
if (axis_known_position[Z_AXIS]) {
strcat(buffer, TEST(axis_known_position, Z_AXIS) || !TEST(axis_was_homed, Z_AXIS) ? PSTR("Z ") : PSTR("? "));
if (TEST(axis_was_homed, Z_AXIS)) {
valuetemp = ftostr32sp(current_position[Z_AXIS] + 0.00001);
strcat(buffer, valuetemp);
}
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment