2 Commits

Author SHA1 Message Date
Stefan Kalscheuer
084dfb249a adjust cardreader filter to show BMP files 2024-06-27 17:57:04 +02:00
Stefan Kalscheuer
cd4905291b port integrated laser printing feature for the MEGA Pro
Migration from the original v1.2.9 firmware sourcecode to the current
Marlin 2.x implementation. Move functions to AnycubicTouchscreenClass
class and adjust Marlin calls.
2024-06-27 17:56:55 +02:00
5 changed files with 487 additions and 146 deletions

View File

@@ -62,17 +62,6 @@
#define SWAP_Z_MOTORS
#endif
/*
* This enables the integrated Laser engaving feature
* in the anycubic touchscreen. It's currently only
* supported by the Anycubic MEGA Pro and therefore it
* is automatically set if the MEGA_P is enabled.
*
*/
#if ENABLED(KNUTWURST_MEGA_P)
// #define KNUTWURST_MEGA_P_LASER
#endif
/*
* To ensure the correct endstop configuration,
* this has to be enabled to alter the motherboard

View File

@@ -3442,6 +3442,12 @@
#define SPINDLE_LASER_ENA_PIN 40 // D40 should be unused. The laser is only connected to the PWM output.
#define SPINDLE_LASER_PWM_PIN HEATER_0_PIN
// Anycubic TFT laser feature.
#define MAX_X_SIZE 220
#define MAX_Y_SIZE 150
#define LASER_X_OFFSET 0 // The distance in the X direction between the laser and the extruder.
#define LASER_Y_OFFSET 65 // The distance in the Y direction between the laser and the extruder.
#endif
#if EITHER(SPINDLE_FEATURE, LASER_FEATURE)

View File

@@ -145,6 +145,10 @@ void AnycubicTouchscreenClass::Setup() {
setup_OutageTestPin();
setup_PowerOffPin();
#if ENABLED(KNUTWURST_MEGA_P)
laser_init();
#endif
SENDLINE_DBG_PGM("J12", "TFT Serial Debug: Ready... J12");
CheckHeaterError();
@@ -157,52 +161,338 @@ void AnycubicTouchscreenClass::Setup() {
#endif
}
#if ENABLED(KNUTWURST_MEGA_P_LASER)
PRINTER_STRUCT Laser_printer_st = {0};
BMP_HEAD st_bmp = {0};
#if ENABLED(KNUTWURST_MEGA_P)
/*
* The following block is used for the integrated Laser engaving feature in the anycubic touchscreen.
* It's currently only supported by the Anycubic MEGA Pro.
*/
void laser_init() {
Laser_printer_st.pic_pixel_distance = PIC_FIXED;
Laser_printer_st.laser_height = 50;
Laser_printer_st.x_offset = 0;
Laser_printer_st.x_offset = 0;
static char laser_print_step = 0;
static float x_start, y_start;
static float x_end, y_end;
Laser_printer_st.pic_vector = 0;
Laser_printer_st.pic_x_mirror = 1;
Laser_printer_st.pic_y_mirror = 0;
Laser_printer_st.pic_laser_time = 15;
/**
* Initialize Anycubic laser feature.
*/
void AnycubicTouchscreenClass::laser_init() {
laser_printer_st.pic_pixel_distance = PIC_FIXED;
laser_printer_st.laser_height = 50;
laser_printer_st.x_offset = 0;
laser_printer_st.x_offset = 0;
laser_printer_st.pic_vector = 0;
laser_printer_st.pic_x_mirror = 1;
laser_printer_st.pic_y_mirror = 0;
laser_printer_st.pic_laser_time = 15;
send_laser_param();
}
}
void send_pic_param() {
SEND_PGM("A45V W");
LCD_SERIAL.print(Laser_printer_st.pic_width);
SEND_PGM(" H");
LCD_SERIAL(Laser_printer_st.pic_height);
/**
* Send picture parameters for the BMP laser engraving feature to the TFT.
*/
void AnycubicTouchscreenClass::send_pic_param() {
SEND_PGM("A45V W"); LCD_SERIAL.print(laser_printer_st.pic_width);
SEND_PGM( " H"); LCD_SERIAL.print(laser_printer_st.pic_height);
SENDLINE_PGM(" ");
}
}
void send_laser_param() {
SEND_PGM("A44V A");
LCD_SERIAL.print(Laser_printer_st.pic_vector);
SEND_PGM(" B");
LCD_SERIAL.print(Laser_printer_st.pic_laser_time);
SEND_PGM(" C");
LCD_SERIAL.print(Laser_printer_st.laser_height);
SEND_PGM(" D");
LCD_SERIAL.print(Laser_printer_st.pic_pixel_distance);
SEND_PGM(" E");
LCD_SERIAL.print(Laser_printer_st.x_offset);
SEND_PGM(" F");
LCD_SERIAL.print(Laser_printer_st.y_offset);
SEND_PGM(" G");
LCD_SERIAL.print(Laser_printer_st.pic_x_mirror);
SEND_PGM(" H");
LCD_SERIAL.print(Laser_printer_st.pic_y_mirror);
/**
* Send laser parameters to the TFT.
*/
void AnycubicTouchscreenClass::send_laser_param() {
SEND_PGM("A44V A"); LCD_SERIAL.print(laser_printer_st.pic_vector);
SEND_PGM( " B"); LCD_SERIAL.print(laser_printer_st.pic_laser_time);
SEND_PGM( " C"); LCD_SERIAL.print(laser_printer_st.laser_height);
SEND_PGM( " D"); LCD_SERIAL.print(laser_printer_st.pic_pixel_distance);
SEND_PGM( " E"); LCD_SERIAL.print(laser_printer_st.x_offset);
SEND_PGM( " F"); LCD_SERIAL.print(laser_printer_st.y_offset);
SEND_PGM( " G"); LCD_SERIAL.print(laser_printer_st.pic_x_mirror);
SEND_PGM( " H"); LCD_SERIAL.print(laser_printer_st.pic_y_mirror);
SENDLINE_PGM(" ");
}
#endif // if ENABLED(KNUTWURST_MEGA_P_LASER)
}
/**
* Read pixel gray level from BMP.
*
* @param gray Pointer to gray value.
* @param y Y coordinate.
* @param x X coordinate.
*/
void AnycubicTouchscreenClass::read_bmp(unsigned char *gray, unsigned int y, unsigned int x) {
unsigned char red_t, green_t, blue_t;
unsigned int temp;
float Y;
unsigned char buffer[4];
if (laser_printer_st.pic_bit == 32) {
laser_printer_st.pic_ptr = (laser_printer_st.pic_height - y - 1) * laser_printer_st.pic_real_width + x * 4 + laser_printer_st.pic_start;
card.setIndex( laser_printer_st.pic_ptr);
card.read(buffer, 4);
Y = buffer[2] * 0.212671f + buffer[1] * 0.715160f + buffer[0] * 0.072169f; // Y=0.212671*R + 0.715160*G + 0.072169*B,???????; Gray = (R*299 + G*587 + B*114 + 500) / 1000
*gray = 0xff - (unsigned char)Y;
}
else if (laser_printer_st.pic_bit == 24) {
laser_printer_st.pic_ptr = (unsigned long)(laser_printer_st.pic_height - y - 1) * laser_printer_st.pic_real_width + x * 3 + laser_printer_st.pic_start;
card.setIndex( laser_printer_st.pic_ptr);
card.read(buffer, 3);
Y = buffer[2] * 0.212671f + buffer[1] * 0.715160f + buffer[0] * 0.072169f; // Y=0.212671*R + 0.715160*G + 0.072169*B,???????;
*gray = 0xff - (unsigned char)Y;
}
else if (laser_printer_st.pic_bit == 16) {
laser_printer_st.pic_ptr = (laser_printer_st.pic_height - y - 1) * laser_printer_st.pic_real_width + x * 2 + laser_printer_st.pic_start;
card.setIndex( laser_printer_st.pic_ptr);
card.read(buffer, 2);
temp = (buffer[1] << 8) + buffer[0];
red_t = (temp & 0xf800) >> 8;
green_t = (temp & 0x07e0) >> 3;
blue_t = (temp & 0x001f) << 3;
Y = (red_t * 77 + green_t * 150 + blue_t * 29) / 256;
// Y=((buffer[1]&0xf8)>>3)*0.212671 + (((buffer[1]&0x07)>>3)+((buffer[0]&0xE0)>>5))*0.715160 +((buffer[0]&0x1f)>>3)*0.072169; // Y=0.212671*R + 0.715160*G + 0.072169*B,???????;
*gray = 0xff - (unsigned char)Y;
}
}
void AnycubicTouchscreenClass::prepare_laser_print() {
if (laser_print_step == 0) {
SERIAL_ECHOLNPGM("prepare_laser_print() step 0");
// Home axis.
queue.enqueue_now_P(PSTR("G28"));
// Move to laser height.
char value[30];
sprintf_P(value, PSTR("G1 Z%s F500"), ftostr42_52(laser_printer_st.laser_height));
queue.enqueue_one_now(value);
laser_print_step = 1;
}
else if (laser_print_step == 1) {
SERIAL_ECHOLNPGM("prepare_laser_print() step 1");
// Wait for homing and initialization to finish.
if (commandsInQueue()) return;
SERIAL_ECHOLNPGM("prepare_laser_print() step 1 complete");
laser_print_step = 2;
}
else if (laser_print_step == 2) {
SERIAL_ECHOLNPGM("prepare_laser_print() step 2");
// Start the actual engraving process.
laser_print_picture();
// Clean up after laser has finished.
laser_print_step = 0;
card.fileHasFinished();
card.autofile_check();
en_continue = 0;
}
}
void AnycubicTouchscreenClass::laser_print_picture() {
SERIAL_ECHOLNPGM("DEBUG: laser_print_picture()");
unsigned char Y;
unsigned long time;
static int i, j;
int ftemp;
static char laser_counter = 0;
static char cvalue[30];
int x_max = laser_printer_st.pic_width, y_max = laser_printer_st.pic_height;
WRITE(HEATER_0_PIN, 0);
laser_status = 1;
laser_counter = 0;
if (laser_printer_st.pic_vector == 0)
ftemp = LASER_PRINT_SPEED;
else
ftemp = 2 * LASER_PRINT_SPEED;
if (laser_printer_st.pic_x_mirror == 1) {
x_start = MAX_X_SIZE / 2 + LASER_X_OFFSET + (laser_printer_st.pic_width * laser_printer_st.pic_pixel_distance) / 2;
x_end = MAX_X_SIZE / 2 + LASER_X_OFFSET - (laser_printer_st.pic_width * laser_printer_st.pic_pixel_distance) / 2;
}
else {
x_end = MAX_X_SIZE / 2 + LASER_X_OFFSET + (laser_printer_st.pic_width * laser_printer_st.pic_pixel_distance) / 2;
x_start = MAX_X_SIZE / 2 + LASER_X_OFFSET - (laser_printer_st.pic_width * laser_printer_st.pic_pixel_distance) / 2;
}
if (laser_printer_st.pic_y_mirror == 1) {
y_start = MAX_Y_SIZE / 2 + LASER_Y_OFFSET + (laser_printer_st.pic_height * laser_printer_st.pic_pixel_distance) / 2;
y_end = MAX_Y_SIZE / 2 + LASER_Y_OFFSET - (laser_printer_st.pic_height * laser_printer_st.pic_pixel_distance) / 2;
}
else {
y_end = MAX_Y_SIZE / 2 + LASER_Y_OFFSET + (laser_printer_st.pic_height * laser_printer_st.pic_pixel_distance) / 2;
y_start = MAX_Y_SIZE / 2 + LASER_Y_OFFSET - (laser_printer_st.pic_height * laser_printer_st.pic_pixel_distance) / 2;
}
SENDLINE_PGM("J29");// hotend heating
SENDLINE_PGM("J29");// hotend heating
for (i = 0; i < y_max; i++) {
if (laser_printer_st.pic_y_mirror == 0)
sprintf_P(cvalue, PSTR("G1 Y%sF%i"), ftostr42_52(y_start + i * laser_printer_st.pic_pixel_distance), ftemp);
else
sprintf_P(cvalue, PSTR("G1 Y%sF%i"), ftostr42_52(y_start - i * laser_printer_st.pic_pixel_distance), ftemp);
if (i % 2 == 0) {
for (j = 0; j < x_max; j++) {
read_bmp(&Y, i, j);
if (Y > MIN_GRAY_VLAUE) {
if (laser_printer_st.pic_x_mirror == 1)
sprintf_P(cvalue, PSTR("G1 X%sF%i"), ftostr42_52(x_start - j * laser_printer_st.pic_pixel_distance), ftemp);
else
sprintf_P(cvalue, PSTR("G1 X%sF%i"), ftostr42_52(x_start + j * laser_printer_st.pic_pixel_distance), ftemp);
queue.enqueue_one_now(cvalue);
while (commandsInQueue()) idle();
WRITE(HEATER_0_PIN, 1);
if (laser_printer_st.pic_vector == 0) {
time = Y * laser_printer_st.pic_laser_time;
while (time--) WRITE(HEATER_0_PIN, 1);
WRITE(HEATER_0_PIN, 0);
}
}
else {
WRITE(HEATER_0_PIN, 0);
}
TFTCommandScan();
while (laser_print_pause) {
TFTCommandScan();
if (laser_status == 0) return;
}
if (laser_status == 0) return;
}
}
else {
for (j = 0; j < x_max; j++) {
read_bmp(&Y, i, x_max - j);
if (Y > MIN_GRAY_VLAUE && j != 0) {
if (laser_printer_st.pic_x_mirror == 1)
sprintf_P(cvalue, PSTR("G1 X%sF%i"), ftostr42_52(x_end + j * laser_printer_st.pic_pixel_distance), ftemp);
else
sprintf_P(cvalue, PSTR("G1 X%.1fF%i"), ftostr42_52(x_end - j * laser_printer_st.pic_pixel_distance), ftemp);
queue.enqueue_one_now(cvalue);
while (commandsInQueue()) idle();
WRITE(HEATER_0_PIN, 1);
if (laser_printer_st.pic_vector == 0) {
time = Y * laser_printer_st.pic_laser_time;
while (time--) WRITE(HEATER_0_PIN, 1);
WRITE(HEATER_0_PIN, 0);
}
if (laser_counter != 20) {
laser_counter = 20;
SENDLINE_PGM("J30");
SENDLINE_PGM("J30");
}
}
else {
WRITE(HEATER_0_PIN, 0);
}
CommandScan();
while (laser_print_pause)
{
CommandScan();
if (laser_status == 0) return;
}
if (laser_status == 0) return;
}
}
}
laser_status = 0;
}
/**
* Handle laser indication.
*/
void AnycubicTouchscreenClass::laser_indicate() {
static unsigned char laser_indicate_step = 0;
static unsigned char laser_indicate_on = 0;
static char cvalue[30];
if (laser_on_off == 1 && laser_indicate_on == 0 && laser_indicate_step == 3) {
// Activate the laser and start indication routine.
sprintf_P(cvalue, PSTR("M3 S%i"), LASER_INDICATE_LEVEL);
queue.enqueue_one_now(cvalue);
laser_indicate_on = 1;
}
else if (laser_on_off == 0 && (laser_indicate_on == 1 || laser_indicate_step > 0)) {
// Deactivate the laser.
queue.enqueue_now_P(PSTR("M5"));
laser_indicate_step = 0;
laser_indicate_on = 0;
return;
}
else if (laser_on_off == 0) {
// Indication not active and laser is off, nothing to do.
return;
}
if (file_type == 0) return;
if (laser_indicate_step == 0) {
// Home X and Y axis and initialize start/end coordinates for given picture.
queue.enqueue_now_P(PSTR("G28 X0 Y0"));
if (laser_printer_st.pic_x_mirror == 1) {
x_start = MAX_X_SIZE / 2 + LASER_X_OFFSET + (laser_printer_st.pic_width * laser_printer_st.pic_pixel_distance) / 2;
x_end = MAX_X_SIZE / 2 + LASER_X_OFFSET - (laser_printer_st.pic_width * laser_printer_st.pic_pixel_distance) / 2;
}
else {
x_end = MAX_X_SIZE / 2 + LASER_X_OFFSET + (laser_printer_st.pic_width * laser_printer_st.pic_pixel_distance) / 2;
x_start = MAX_X_SIZE / 2 + LASER_X_OFFSET - (laser_printer_st.pic_width * laser_printer_st.pic_pixel_distance) / 2;
}
if (laser_printer_st.pic_y_mirror == 1) {
y_start = MAX_Y_SIZE / 2 + LASER_Y_OFFSET + (laser_printer_st.pic_height * laser_printer_st.pic_pixel_distance) / 2;
y_end = MAX_Y_SIZE / 2 + LASER_Y_OFFSET - (laser_printer_st.pic_height * laser_printer_st.pic_pixel_distance) / 2;
}
else {
y_end = MAX_Y_SIZE / 2 + LASER_Y_OFFSET + (laser_printer_st.pic_height * laser_printer_st.pic_pixel_distance) / 2;
y_start = MAX_Y_SIZE / 2 + LASER_Y_OFFSET - (laser_printer_st.pic_height * laser_printer_st.pic_pixel_distance) / 2;
}
laser_indicate_step = 1;
}
else if (laser_indicate_step == 1) {
// Wait for homing to finish.
if (commandsInQueue()) return;
// Move to first corner.
SERIAL_ECHOLNPGM("1 x=", x_end);
sprintf_P(cvalue, PSTR("G1 X%sF3600"), ftostr42_52(x_end));
queue.enqueue_one_now(cvalue);
laser_indicate_step = 2;
}
else if (laser_indicate_step == 2) {
// Wait for previous move to finish.
if (commandsInQueue()) return;
// Move to second corner.
SERIAL_ECHOLNPGM("2 y=", y_end);
sprintf_P(cvalue, PSTR("G1 Y%sF3600"), ftostr42_52(y_end));
queue.enqueue_one_now(cvalue);
laser_indicate_step = 3;
}
else if (laser_indicate_step == 3) {
// Wait for previous move to finish.
if (commandsInQueue()) return;
// Move to third corner.
SERIAL_ECHOLNPGM("3 x=", x_start);
sprintf_P(cvalue, PSTR("G1 X%sF3600"), ftostr42_52(x_start));
queue.enqueue_one_now(cvalue);
laser_indicate_step = 4;
}
else if (laser_indicate_step == 4) {
// Wait for previous move to finish.
if (commandsInQueue()) return;
// Move to fourth corner.
SERIAL_ECHOLNPGM("4 y=", y_start);
sprintf_P(cvalue, PSTR("G1 Y%sF3600"), ftostr42_52(y_start));
queue.enqueue_one_now(cvalue);
laser_indicate_step = 1;
}
}
#endif // if ENABLED(KNUTWURST_MEGA_P)
void AnycubicTouchscreenClass::KillTFT() { SENDLINE_DBG_PGM("J11", "TFT Serial Debug: Kill command... J11"); }
@@ -1196,11 +1486,25 @@ void AnycubicTouchscreenClass::GetCommandFromTFT() {
if (isPrintingFromMediaPaused()) {
ResumePrint();
}
#endif
#if ENABLED(KNUTWURST_MEGA_P)
laser_print_pause = 0;
#endif
break;
case 11: // A11 stop sd print
TERN_(SDSUPPORT, StopPrint());
#if ENABLED(SDSUPPORT)
StopPrint();
#if ENABLED(KNUTWURST_MEGA_P)
laser_print_step = 0;
if (laser_status == 1) {
WRITE(HEATER_0_PIN, 0);
laser_status = 0;
laser_print_step = 0;
laser_print_pause = 0;
}
#endif
#endif
break;
case 12: // A12 kill
@@ -1227,9 +1531,50 @@ void AnycubicTouchscreenClass::GetCommandFromTFT() {
if (starpos) {
*(starpos - 1) = '\0';
}
#if ENABLED(KNUTWURST_MEGA_P)
file_type = 0;
if (strstr(TFTstrchr_pointer, ".bmp")) file_type = 1;
#endif
strcpy(currentFileOrDirectory, TFTstrchr_pointer + 4);
SENDLINE_DBG_PGM_VAL("J20", "TFT Serial Debug: File Selected... J20 ",
currentFileOrDirectory); // J20 File Selected
#if ENABLED(KNUTWURST_MEGA_P)
// Check if the file opened is a BMP. In this case, initialize the laser feature.
if (file_type == 1) {
laser_printer_st.pic_dir = 0;
card.read(&st_bmp, sizeof(st_bmp));
laser_printer_st.pic_file_size = (unsigned long)st_bmp.bfSize[0] + (unsigned long)st_bmp.bfSize[1] * 256 + (unsigned long)st_bmp.bfSize[2] * 256 * 256 + (unsigned long)st_bmp.bfSize[3] * 256 * 256 * 256;
laser_printer_st.pic_width = (unsigned int)st_bmp.biWidth[0] + (unsigned int)st_bmp.biWidth[1] * 256;
laser_printer_st.pic_width_odd = laser_printer_st.pic_width % 2;
laser_printer_st.pic_height = (unsigned int)st_bmp.biHeight[0] + (unsigned int)st_bmp.biHeight[1] * 256;
if (laser_printer_st.pic_height > 30000) {
laser_printer_st.pic_height = 65536 - laser_printer_st.pic_height;
laser_printer_st.pic_dir = 1;
}
laser_printer_st.pic_bit = st_bmp.biBitCount[0];
laser_printer_st.pic_start = 54;
laser_printer_st.pic_ptr = laser_printer_st.pic_width * laser_printer_st.pic_height * laser_printer_st.pic_bit / 8 + laser_printer_st.pic_start;
laser_printer_st.pic_real_width = (((laser_printer_st.pic_width * laser_printer_st.pic_bit) + 31) >> 5) << 2;
card.setIndex(54);
SERIAL_ECHOPGM("file size: ", laser_printer_st.pic_file_size);
SERIAL_EOL();
SERIAL_ECHOPGM("pic_width: ", laser_printer_st.pic_width);
SERIAL_EOL();
SERIAL_ECHOPGM("pic_height: ", laser_printer_st.pic_height);
SERIAL_EOL();
SERIAL_ECHOPGM("pic_bit: ", (int)laser_printer_st.pic_bit);
SERIAL_EOL();
SERIAL_ECHOPGM("pic_ptr: ", laser_printer_st.pic_ptr);
SERIAL_EOL();
SERIAL_ECHOPGM("real_widht: ", laser_printer_st.pic_real_width);
SERIAL_EOL();
SENDLINE_PGM("");
send_pic_param();
}
#endif
}
}
#endif
@@ -1240,6 +1585,9 @@ void AnycubicTouchscreenClass::GetCommandFromTFT() {
if (!isPrinting()) {
StartPrint();
}
#if ENABLED(KNUTWURST_MEGA_P)
laser_on_off = 0;
#endif
#endif
break;
@@ -1843,13 +2191,8 @@ void AnycubicTouchscreenClass::GetCommandFromTFT() {
break;
#endif
#if ENABLED(KNUTWURST_DGUS2_TFT)
case 50:
SENDLINE_PGM("J38 ");
break;
#endif
#if ENABLED(KNUTWURST_MEGA_P_LASER)
#if ENABLED(KNUTWURST_MEGA_P)
case 34: // Continuous printing
en_continue = 1;
break;
@@ -1860,12 +2203,11 @@ void AnycubicTouchscreenClass::GetCommandFromTFT() {
case 36:
if (CodeSeen('S')) {
int coorvalue;
coorvalue = CodeValueInt();
int coorvalue = CodeValueInt();
if (coorvalue != 0) {
Laser_printer_st.pic_vector = 1;
laser_printer_st.pic_vector = 1;
} else {
Laser_printer_st.pic_vector = 0;
laser_printer_st.pic_vector = 0;
}
}
break;
@@ -1875,64 +2217,57 @@ void AnycubicTouchscreenClass::GetCommandFromTFT() {
int coorvalue;
coorvalue = CodeValueInt();
if (coorvalue == 0) {
Laser_printer_st.pic_x_mirror = 0;
laser_printer_st.pic_x_mirror = 0;
} else if (coorvalue == 1) {
Laser_printer_st.pic_x_mirror = 1; // x
laser_printer_st.pic_x_mirror = 1;
}
}
break;
case 38:
if (CodeSeen('S')) {
int coorvalue;
coorvalue = CodeValueInt();
Laser_printer_st.pic_laser_time = coorvalue;
int coorvalue = CodeValueInt();
laser_printer_st.pic_laser_time = coorvalue;
}
break;
case 39:
if (CodeSeen('S')) { // A39
float coorvalue;
coorvalue = CodeValue();
Laser_printer_st.laser_height = coorvalue;
SEND_PGM("laser_height = ");
LCD_SERIAL.print(Laser_printer_st.laser_height);
SENDLINE_PGM("");
float coorvalue = CodeValue();
laser_printer_st.laser_height = coorvalue;
SERIAL_ECHOPGM("laser_height = ");
SERIAL_ECHOLN(laser_printer_st.laser_height);
}
break;
case 40:
if (CodeSeen('S')) { // A40
float coorvalue;
coorvalue = CodeValue();
Laser_printer_st.pic_pixel_distance = coorvalue;
float coorvalue = CodeValue();
laser_printer_st.pic_pixel_distance = coorvalue;
}
break;
case 41:
if (CodeSeen('S')) {
float coorvalue;
coorvalue = CodeValue();
Laser_printer_st.x_offset = coorvalue;
float coorvalue = CodeValue();
laser_printer_st.x_offset = coorvalue;
}
break;
case 42:
if (CodeSeen('S')) {
float coorvalue;
coorvalue = CodeValue();
Laser_printer_st.y_offset = coorvalue;
float coorvalue = CodeValue();
laser_printer_st.y_offset = coorvalue;
}
break;
case 43:
if (CodeSeen('S')) { // y
int coorvalue;
coorvalue = CodeValueInt();
int coorvalue = CodeValueInt();
if (coorvalue == 0) {
Laser_printer_st.pic_y_mirror = 0;
laser_printer_st.pic_y_mirror = 0;
} else if (coorvalue == 1) {
Laser_printer_st.pic_y_mirror = 1;
laser_printer_st.pic_y_mirror = 1;
}
}
break;
@@ -1943,20 +2278,19 @@ void AnycubicTouchscreenClass::GetCommandFromTFT() {
case 49: // A49
laser_on_off = 0;
WRITE(HEATER_0_PIN, 0);
injectCommands(F("M5"));
break;
case 50: // A50
case 50:
if (laser_on_off == 0) {
laser_on_off = 1;
} else {
}
else {
laser_on_off = 0;
WRITE(HEATER_0_PIN, 0);
injectCommands(F("M5"));
}
break;
#endif // if ENABLED(KNUTWURST_MEGA_P_LASER)
#if ENABLED(KNUTWURST_MEGA_P)
case 51:
if (CodeSeen('H')) {
injectCommands(F(
@@ -1964,37 +2298,45 @@ void AnycubicTouchscreenClass::GetCommandFromTFT() {
"G1 X30 Y30 F5000\n"
"G1 Z0.15 F300"
));
} else if (CodeSeen('I')) {
}
else if (CodeSeen('I')) {
injectCommands(F(
"G1 Z5 F500\n"
"G1 X190 Y30 F5000\n"
"G1 Z0.15 F300"
));
} else if (CodeSeen('J')) {
}
else if (CodeSeen('J')) {
injectCommands(F(
"G1 Z5 F500\n"
"G1 X190 Y190 F5000\n"
"G1 Z0.15 F300"
));
} else if (CodeSeen('K')) {
}
else if (CodeSeen('K')) {
injectCommands(F(
"G1 Z5 F500\n"
"G1 X30 Y190 F5000\n"
"G1 Z0.15 F300"
));
} else if (CodeSeen('L')) {
}
else if (CodeSeen('L')) {
injectCommands(F("G1 X100 Y100 Z50 F5000"));
}
break;
#endif
#elif ENABLED(KNUTWURST_DGUS2_TFT)
case 50:
SENDLINE_PGM("J38 ");
break;
#endif
default:
break;
} // switch
}
}
TFTbufindw = (TFTbufindw + 1) % TFTBUFSIZE;
TFTbuflen += 1;
} // if (!TFTcomment_mode)
}
serial3_count = 0; // clear buffer
} else {
if (serial3_char == ';') {
@@ -2007,42 +2349,6 @@ void AnycubicTouchscreenClass::GetCommandFromTFT() {
} // while
}
#if ENABLED(KNUTWURST_MEGA_P_LASER)
void prepare_laser_print() {
static unsigned long times = 0;
if (times > 100) {
times--;
return;
}
times = 10000;
if (laser_print_steps == 0) {
cvalue[0] = 0;
while (planner.blocks_queued())
;
queue.enqueue_now_P(PSTR("G28"));
sprintf_P(cvalue, PSTR("G1 Z%i F500"), (int)Laser_printer_st.laser_height);
SERIAL_PROTOCOLLN(cvalue);
enqueue_and_echo_command_now(cvalue);
laser_print_steps = 1;
times = 120000;
} else if (laser_print_steps == 1) {
if (planner.blocks_queued()) {
return;
}
laser_print_steps = 2;
} else if (laser_print_steps == 2) {
Laset_print_picture();
laser_print_steps = 0;
card.printingHasFinished();
card.checkautostart(true);
en_continue = 0;
}
}
#endif
#if ENABLED(KNUTWURST_4MAXP2)
void PowerDown() {
#if ENABLED(ANYCUBIC_TFT_DEBUG)
@@ -2083,6 +2389,17 @@ void AnycubicTouchscreenClass::GetCommandFromTFT() {
}
#endif
#if ENABLED(KNUTWURST_MEGA_P)
laser_indicate();
if (file_type == 1 && card.isPrinting()) {
prepare_laser_print();
}
#endif
TFTCommandScan();
}
void AnycubicTouchscreenClass::TFTCommandScan() {
if (TFTbuflen < (TFTBUFSIZE - 1)) {
GetCommandFromTFT();
}

View File

@@ -227,6 +227,8 @@ class AnycubicTouchscreenClass {
xy_uint8_t selectedmeshpoint;
float live_Zoffset;
void TFTCommandScan();
static AnycubicMediaPrintState mediaPrintingState;
static AnycubicMediaPauseState mediaPauseState;
static uint32_t time_last_cyclic_tft_command;
@@ -269,7 +271,7 @@ class AnycubicTouchscreenClass {
uint8_t LevelMenu = false;
uint8_t CaseLight = true;
#if ENABLED(KNUTWURST_MEGA_P_LASER)
#if ENABLED(KNUTWURST_MEGA_P)
typedef struct {
unsigned char bfType[2];
unsigned char bfSize[4];
@@ -319,8 +321,29 @@ class AnycubicTouchscreenClass {
#define PIC_OPEN 50 // // ms
#define PIC_SPEDD 20000
#define MIN_GRAY_VLAUE 20
#define LASER_PRINT_SPEED 30 // 50*60
#endif // if ENABLED(KNUTWURST_MEGA_P_LASER)
#define LASER_PRINT_SPEED 1800 // (mm/min) Speed for laser printing
#define MAX_X_SIZE 220
#define MAX_Y_SIZE 150
#define LASER_X_OFFSET 0 // The distance in the X direction between the laser and the extruder
#define LASER_Y_OFFSET 65 // The distance in the Y direction between the laser and the extruder
#define LASER_INDICATE_LEVEL 5
PRINTER_STRUCT laser_printer_st = {0};
BMP_HEAD st_bmp = {0};
char laser_on_off = 0;
char laser_status = 0;
char laser_print_pause = 0;
char en_continue = 0;
char file_type = 0;
void laser_init();
void send_pic_param();
void send_laser_param();
void read_bmp(unsigned char*, unsigned int, unsigned int);
void prepare_laser_print();
void laser_print_picture();
void laser_indicate();
#endif // if ENABLED(KNUTWURST_MEGA_P)
};
extern AnycubicTouchscreenClass AnycubicTouchscreen;

View File

@@ -233,6 +233,12 @@ bool CardReader::is_visible_entity(const dir_t &p OPTARG(CUSTOM_FIRMWARE_UPLOAD,
|| fileIsBinary() // BIN files are accepted
|| (!onlyBin && p.name[8] == 'G'
&& p.name[9] != '~') // Non-backup *.G* files are accepted
// PATCH START: KNUTWURST
#if ENABLED(KNUTWURST_MEGA_P)
|| (!onlyBin && p.name[8] == 'B' // Bitmap files for Anycubic laser engraving on Mega Pro.
&& p.name[9] != '~')
#endif
// PATCH ENDT: KNUTWURST
);
}