Browse Source

made progmem mainly, found one bug in cardreader, added a empty class for cardreader in case no sd support.

pull/1/head
Bernhard Kubicek 13 years ago
parent
commit
7b70caab7c
  1. 79
      Marlin/EEPROMwrite.h
  2. 6
      Marlin/Marlin.h
  3. 147
      Marlin/Marlin.pde
  4. 31
      Marlin/cardreader.h
  5. 23
      Marlin/cardreader.pde
  6. 123
      Marlin/ultralcd.pde

79
Marlin/EEPROMwrite.h

@ -25,6 +25,19 @@ template <class T> int EEPROM_readAnything(int &ee, T& value)
} }
//====================================================================================== //======================================================================================
#include <avr/pgmspace.h>
void serialprintPGM(const char *str)
{
char ch=pgm_read_byte(str);
while(ch)
{
Serial.print(ch);
ch=pgm_read_byte(++str);
}
}
#define SerialprintPGM(x) serialprintPGM(PSTR(x))
#define EEPROM_OFFSET 100 #define EEPROM_OFFSET 100
@ -62,7 +75,7 @@ void StoreSettings()
char ver2[4]=EEPROM_VERSION; char ver2[4]=EEPROM_VERSION;
i=EEPROM_OFFSET; i=EEPROM_OFFSET;
EEPROM_writeAnything(i,ver2); // validate data EEPROM_writeAnything(i,ver2); // validate data
SERIAL_ECHOLN("Settings Stored"); SerialprintPGM("echo: Settings Stored\n");
} }
void RetrieveSettings(bool def=false) void RetrieveSettings(bool def=false)
@ -91,7 +104,7 @@ void RetrieveSettings(bool def=false)
EEPROM_readAnything(i,Ki); EEPROM_readAnything(i,Ki);
EEPROM_readAnything(i,Kd); EEPROM_readAnything(i,Kd);
SERIAL_ECHOLN("Stored settings retreived:"); SerialprintPGM("echo: Stored settings retreived:\n");
} }
else else
{ {
@ -111,21 +124,57 @@ void RetrieveSettings(bool def=false)
mintravelfeedrate=DEFAULT_MINTRAVELFEEDRATE; mintravelfeedrate=DEFAULT_MINTRAVELFEEDRATE;
max_xy_jerk=DEFAULT_XYJERK; max_xy_jerk=DEFAULT_XYJERK;
max_z_jerk=DEFAULT_ZJERK; max_z_jerk=DEFAULT_ZJERK;
SERIAL_ECHOLN("Using Default settings:"); SerialprintPGM("echo: Using Default settings:\n");
} }
SERIAL_ECHOLN("Steps per unit:"); SerialprintPGM("echo: Steps per unit:\n M92 X");
SERIAL_ECHOLN(" M92 X" <<_FLOAT(axis_steps_per_unit[0],3) << " Y" << _FLOAT(axis_steps_per_unit[1],3) << " Z" << _FLOAT(axis_steps_per_unit[2],3) << " E" << _FLOAT(axis_steps_per_unit[3],3)); Serial.print(axis_steps_per_unit[0]);
SERIAL_ECHOLN("Maximum feedrates (mm/s):"); SerialprintPGM(" Y");
SERIAL_ECHOLN(" M203 X" <<_FLOAT(max_feedrate[0]/60,2)<<" Y" << _FLOAT(max_feedrate[1]/60,2) << " Z" << _FLOAT(max_feedrate[2]/60,2) << " E" << _FLOAT(max_feedrate[3]/60,2)); Serial.print(axis_steps_per_unit[1]);
SERIAL_ECHOLN("Maximum Acceleration (mm/s2):"); SerialprintPGM(" Z");
SERIAL_ECHOLN(" M201 X" <<_FLOAT(max_acceleration_units_per_sq_second[0],0) << " Y" << _FLOAT(max_acceleration_units_per_sq_second[1],0) << " Z" << _FLOAT(max_acceleration_units_per_sq_second[2],0) << " E" << _FLOAT(max_acceleration_units_per_sq_second[3],0)); Serial.print(axis_steps_per_unit[2]);
SERIAL_ECHOLN("Acceleration: S=acceleration, T=retract acceleration"); SerialprintPGM(" E");
SERIAL_ECHOLN(" M204 S" <<_FLOAT(acceleration,2) << " T" << _FLOAT(retract_acceleration,2)); Serial.print(axis_steps_per_unit[3]);
SERIAL_ECHOLN("Advanced variables: S=Min feedrate (mm/s), T=Min travel feedrate (mm/s), B=minimum segment time (ms), X=maximum xY jerk (mm/s), Z=maximum Z jerk (mm/s)");
SERIAL_ECHOLN(" M205 S" <<_FLOAT(minimumfeedrate/60,2) << " T" << _FLOAT(mintravelfeedrate/60,2) << " B" << _FLOAT(minsegmenttime,2) << " X" << _FLOAT(max_xy_jerk/60,2) << " Z" << _FLOAT(max_z_jerk/60,2)); SerialprintPGM("\nMaximum feedrates (mm/s):\n M203 X" );
Serial.print(max_feedrate[0]/60);
SerialprintPGM(" Y" );
Serial.print(max_feedrate[1]/60 );
SerialprintPGM(" Z" );
Serial.print(max_feedrate[2]/60 );
SerialprintPGM(" E" );
Serial.print(max_feedrate[3]/60);
SerialprintPGM("\nMaximum Acceleration (mm/s2):\n M201 X" );
Serial.print(max_acceleration_units_per_sq_second[0] );
SerialprintPGM(" Y" );
Serial.print(max_acceleration_units_per_sq_second[1] );
SerialprintPGM(" Z" );
Serial.print(max_acceleration_units_per_sq_second[2] );
SerialprintPGM(" E" );
Serial.print(max_acceleration_units_per_sq_second[3]);
SerialprintPGM("\necho: Acceleration: S=acceleration, T=retract acceleration\n M204 S" );
Serial.print(acceleration );
SerialprintPGM(" T" );
Serial.print(retract_acceleration);
SerialprintPGM("\necho: Advanced variables: S=Min feedrate (mm/s), T=Min travel feedrate (mm/s), B=minimum segment time (ms), X=maximum xY jerk (mm/s), Z=maximum Z jerk (mm/s)");
SerialprintPGM(" M205 S" );
Serial.print(minimumfeedrate/60 );
SerialprintPGM(" T" );
Serial.print(mintravelfeedrate/60 );
SerialprintPGM(" B" );
Serial.print(minsegmenttime );
SerialprintPGM(" X" );
Serial.print(max_xy_jerk/60 );
SerialprintPGM(" Z" );
Serial.print(max_z_jerk/60);
SerialprintPGM("\n" );
#ifdef PIDTEMP #ifdef PIDTEMP
SERIAL_ECHOLN("PID settings:"); SerialprintPGM("PID settings:");
SERIAL_ECHOLN(" M301 P" << _FLOAT(Kp,3) << " I" << _FLOAT(Ki,3) << " D" << _FLOAT(Kd,3)); SerialprintPGM(" M301 P" );
Serial.print(Kp );
SerialprintPGM(" I" );
Serial.print(Ki );
SerialprintPGM(" D" );
Serial.print(Kd);
#endif #endif
} }

6
Marlin/Marlin.h

@ -9,8 +9,10 @@
#include "streaming.h" #include "streaming.h"
#define SERIAL_ECHO(x) Serial << "echo: " << x; #define SERIAL_ECHO(x) Serial << "echo: " << x;
#define SERIAL_ECHOLN(x) Serial << "echo: "<<x<<endl; #define SERIAL_ECHOLN(x) Serial << "echo: "<<x<<endl;
#define SERIAL_ERROR(x) Serial << "echo: ERROR: " << x; #define SERIAL_ERROR(x) Serial << "Error: " << x;
#define SERIAL_ERRORLN(x) Serial << "echo: ERROR: " << x<<endl; #define SERIAL_ERRORLN(x) Serial << "Error: " << x<<endl;
#define SERIAL_PROTOCOL(x) Serial << x;
#define SERIAL_PROTOCOLLN(x) Serial << x<<endl;
void get_command(); void get_command();
void process_commands(); void process_commands();

147
Marlin/Marlin.pde

@ -44,6 +44,7 @@ char version_string[] = "1.0.0 Alpha 1";
// look here for descriptions of gcodes: http://linuxcnc.org/handbook/gcode/g-code.html // look here for descriptions of gcodes: http://linuxcnc.org/handbook/gcode/g-code.html
// http://objects.reprap.org/wiki/Mendel_User_Manual:_RepRapGCodes // http://objects.reprap.org/wiki/Mendel_User_Manual:_RepRapGCodes
@ -171,6 +172,23 @@ static unsigned long stoptime=0;
//=========================================================================== //===========================================================================
extern "C"{
extern unsigned int __bss_end;
extern unsigned int __heap_start;
extern void *__brkval;
int freeMemory() {
int free_memory;
if((int)__brkval == 0)
free_memory = ((int)&free_memory) - ((int)&__bss_end);
else
free_memory = ((int)&free_memory) - ((int)__brkval);
return free_memory;
}
}
//adds an command to the main command buffer //adds an command to the main command buffer
//thats really done in a non-safe way. //thats really done in a non-safe way.
@ -191,7 +209,9 @@ void setup()
{ {
Serial.begin(BAUDRATE); Serial.begin(BAUDRATE);
SERIAL_ECHOLN("Marlin "<<version_string); SERIAL_ECHOLN("Marlin "<<version_string);
Serial.println("start"); SERIAL_PROTOCOLLN("start");
Serial.print("echo: Free Memory:");
serial.println(freeMemory());
for(int8_t i = 0; i < BUFSIZE; i++) for(int8_t i = 0; i < BUFSIZE; i++)
{ {
fromsd[i] = false; fromsd[i] = false;
@ -224,12 +244,12 @@ void loop()
if(strstr(cmdbuffer[bufindr],"M29") == NULL) if(strstr(cmdbuffer[bufindr],"M29") == NULL)
{ {
card.write_command(cmdbuffer[bufindr]); card.write_command(cmdbuffer[bufindr]);
Serial.println("ok"); SERIAL_PROTOCOLLN("ok");
} }
else else
{ {
card.closefile(); card.closefile();
Serial.println("Done saving file."); SERIAL_PROTOCOLLN("Done saving file.");
} }
} }
else else
@ -264,8 +284,7 @@ inline void get_command()
strchr_pointer = strchr(cmdbuffer[bufindw], 'N'); strchr_pointer = strchr(cmdbuffer[bufindw], 'N');
gcode_N = (strtol(&cmdbuffer[bufindw][strchr_pointer - cmdbuffer[bufindw] + 1], NULL, 10)); gcode_N = (strtol(&cmdbuffer[bufindw][strchr_pointer - cmdbuffer[bufindw] + 1], NULL, 10));
if(gcode_N != gcode_LastN+1 && (strstr(cmdbuffer[bufindw], "M110") == NULL) ) { if(gcode_N != gcode_LastN+1 && (strstr(cmdbuffer[bufindw], "M110") == NULL) ) {
Serial.print("Serial Error: Line Number is not Last Line Number+1, Last Line:"); SERIAL_ERRORLN("Line Number is not Last Line Number+1, Last Line:"<<gcode_LastN);
Serial.println(gcode_LastN);
//Serial.println(gcode_N); //Serial.println(gcode_N);
FlushSerialRequestResend(); FlushSerialRequestResend();
serial_count = 0; serial_count = 0;
@ -280,8 +299,7 @@ inline void get_command()
strchr_pointer = strchr(cmdbuffer[bufindw], '*'); strchr_pointer = strchr(cmdbuffer[bufindw], '*');
if( (int)(strtod(&cmdbuffer[bufindw][strchr_pointer - cmdbuffer[bufindw] + 1], NULL)) != checksum) { if( (int)(strtod(&cmdbuffer[bufindw][strchr_pointer - cmdbuffer[bufindw] + 1], NULL)) != checksum) {
Serial.print("Error: checksum mismatch, Last Line:"); SERIAL_ERRORLN("checksum mismatch, Last Line:"<<gcode_LastN);
Serial.println(gcode_LastN);
FlushSerialRequestResend(); FlushSerialRequestResend();
serial_count = 0; serial_count = 0;
return; return;
@ -290,8 +308,7 @@ inline void get_command()
} }
else else
{ {
Serial.print("Error: No Checksum with line number, Last Line:"); SERIAL_ERRORLN("No Checksum with line number, Last Line:"<<gcode_LastN);
Serial.println(gcode_LastN);
FlushSerialRequestResend(); FlushSerialRequestResend();
serial_count = 0; serial_count = 0;
return; return;
@ -304,8 +321,7 @@ inline void get_command()
{ {
if((strstr(cmdbuffer[bufindw], "*") != NULL)) if((strstr(cmdbuffer[bufindw], "*") != NULL))
{ {
Serial.print("Error: No Line Number with checksum, Last Line:"); SERIAL_ERRORLN("No Line Number with checksum, Last Line:"<<gcode_LastN);
Serial.println(gcode_LastN);
serial_count = 0; serial_count = 0;
return; return;
} }
@ -321,7 +337,7 @@ inline void get_command()
if(card.saving) if(card.saving)
break; break;
#endif //SDSUPPORT #endif //SDSUPPORT
Serial.println("ok"); SERIAL_PROTOCOLLN("ok");
break; break;
default: default:
break; break;
@ -353,15 +369,15 @@ inline void get_command()
if(card.eof()){ if(card.eof()){
card.sdprinting = false; card.sdprinting = false;
Serial.println("echo: Done printing file"); SERIAL_PROTOCOL("Done printing file");
stoptime=millis(); stoptime=millis();
char time[30]; char time[30];
unsigned long t=(stoptime-starttime)/1000; unsigned long t=(stoptime-starttime)/1000;
int sec,min; int sec,min;
min=t/60; min=t/60;
sec=t%60; sec=t%60;
sprintf(time,"echo: %i min, %i sec",min,sec); sprintf(time,"%i min, %i sec",min,sec);
Serial.println(time); SERIAL_ECHOLN(time);
LCD_MESSAGE(time); LCD_MESSAGE(time);
card.checkautostart(true); card.checkautostart(true);
} }
@ -517,9 +533,9 @@ inline void process_commands()
#ifdef SDSUPPORT #ifdef SDSUPPORT
case 20: // M20 - list SD card case 20: // M20 - list SD card
Serial.println("Begin file list"); SERIAL_PROTOCOLLN("Begin file list");
card.ls(); card.ls();
Serial.println("End file list"); SERIAL_PROTOCOLLN("End file list");
break; break;
case 21: // M21 - init SD card case 21: // M21 - init SD card
@ -575,8 +591,8 @@ inline void process_commands()
int sec,min; int sec,min;
min=t/60; min=t/60;
sec=t%60; sec=t%60;
sprintf(time,"echo: time needed %i min, %i sec",min,sec); sprintf(time,"%i min, %i sec",min,sec);
Serial.println(time); SERIAL_ERRORLN(time);
LCD_MESSAGE(time); LCD_MESSAGE(time);
} }
break; break;
@ -613,6 +629,7 @@ inline void process_commands()
if (code_seen('S')) setTargetBed(code_value()); if (code_seen('S')) setTargetBed(code_value());
break; break;
case 105: // M105 case 105: // M105
//SERIAL_ECHOLN(freeMemory());
#if (TEMP_0_PIN > -1) || defined (HEATER_USES_AD595) #if (TEMP_0_PIN > -1) || defined (HEATER_USES_AD595)
tt = degHotend0(); tt = degHotend0();
#endif #endif
@ -620,21 +637,21 @@ inline void process_commands()
bt = degBed(); bt = degBed();
#endif #endif
#if (TEMP_0_PIN > -1) || defined (HEATER_USES_AD595) #if (TEMP_0_PIN > -1) || defined (HEATER_USES_AD595)
Serial.print("ok T:"); SERIAL_PROTOCOL("ok T:");
Serial.print(tt); SERIAL_PROTOCOL(tt);
#if TEMP_1_PIN > -1 #if TEMP_1_PIN > -1
#ifdef PIDTEMP #ifdef PIDTEMP
Serial.print(" B:"); SERIAL_PROTOCOL(" B:");
#if TEMP_1_PIN > -1 #if TEMP_1_PIN > -1
Serial.println(bt); SERIAL_PROTOCOLLN(bt);
#else #else
Serial.println(HeaterPower); SERIAL_PROTOCOLLN(HeaterPower);
#endif #endif
#else //not PIDTEMP #else //not PIDTEMP
Serial.println(); SERIAL_PROTOCOLLN("");
#endif //PIDTEMP #endif //PIDTEMP
#else #else
Serial.println(); SERIAL_PROTOCOLLN("");
#endif //TEMP_1_PIN #endif //TEMP_1_PIN
#else #else
SERIAL_ERRORLN("No thermistors - no temp"); SERIAL_ERRORLN("No thermistors - no temp");
@ -664,8 +681,7 @@ inline void process_commands()
#endif //TEMP_RESIDENCY_TIME #endif //TEMP_RESIDENCY_TIME
if( (millis() - codenum) > 1000 ) if( (millis() - codenum) > 1000 )
{ //Print Temp Reading every 1 second while heating up/cooling down { //Print Temp Reading every 1 second while heating up/cooling down
Serial.print("T:"); SERIAL_PROTOCOLLN("T:"<< degHotend0() );
Serial.println( degHotend0() );
codenum = millis(); codenum = millis();
} }
manage_heater(); manage_heater();
@ -694,12 +710,8 @@ inline void process_commands()
if( (millis()-codenum) > 1000 ) //Print Temp Reading every 1 second while heating up. if( (millis()-codenum) > 1000 ) //Print Temp Reading every 1 second while heating up.
{ {
float tt=degHotend0(); float tt=degHotend0();
Serial.print("T:"); SERIAL_PROTOCOLLN("T:"<<tt );
Serial.println( tt ); SERIAL_PROTOCOLLN("ok T:"<<tt <<" B:"<<degBed() );
Serial.print("ok T:");
Serial.print( tt );
Serial.print(" B:");
Serial.println( degBed() );
codenum = millis(); codenum = millis();
} }
manage_heater(); manage_heater();
@ -766,53 +778,53 @@ inline void process_commands()
} }
break; break;
case 115: // M115 case 115: // M115
Serial.println("FIRMWARE_NAME:Marlin; Sprinter/grbl mashup for gen6 FIRMWARE_URL:http://www.mendel-parts.com PROTOCOL_VERSION:1.0 MACHINE_TYPE:Mendel EXTRUDER_COUNT:1"); SERIAL_PROTOCOLLN("FIRMWARE_NAME:Marlin; Sprinter/grbl mashup for gen6 FIRMWARE_URL:http://www.mendel-parts.com PROTOCOL_VERSION:1.0 MACHINE_TYPE:Mendel EXTRUDER_COUNT:1");
break; break;
case 114: // M114 case 114: // M114
Serial.print("X:"); SERIAL_PROTOCOL("X:");
Serial.print(current_position[X_AXIS]); SERIAL_PROTOCOL(current_position[X_AXIS]);
Serial.print("Y:"); SERIAL_PROTOCOL("Y:");
Serial.print(current_position[Y_AXIS]); SERIAL_PROTOCOL(current_position[Y_AXIS]);
Serial.print("Z:"); SERIAL_PROTOCOL("Z:");
Serial.print(current_position[Z_AXIS]); SERIAL_PROTOCOL(current_position[Z_AXIS]);
Serial.print("E:"); SERIAL_PROTOCOL("E:");
Serial.print(current_position[E_AXIS]); SERIAL_PROTOCOL(current_position[E_AXIS]);
#ifdef DEBUG_STEPS #ifdef DEBUG_STEPS
Serial.print(" Count X:"); SERIAL_PROTOCOL(" Count X:");
Serial.print(float(count_position[X_AXIS])/axis_steps_per_unit[X_AXIS]); SERIAL_PROTOCOL(float(count_position[X_AXIS])/axis_steps_per_unit[X_AXIS]);
Serial.print("Y:"); SERIAL_PROTOCOL("Y:");
Serial.print(float(count_position[Y_AXIS])/axis_steps_per_unit[Y_AXIS]); SERIAL_PROTOCOL(float(count_position[Y_AXIS])/axis_steps_per_unit[Y_AXIS]);
Serial.print("Z:"); SERIAL_PROTOCOL("Z:");
Serial.println(float(count_position[Z_AXIS])/axis_steps_per_unit[Z_AXIS]); SERIAL_PROTOCOL(float(count_position[Z_AXIS])/axis_steps_per_unit[Z_AXIS]);
#endif #endif
Serial.println(""); SERIAL_PROTOCOLLN("");
break; break;
case 119: // M119 case 119: // M119
#if (X_MIN_PIN > -1) #if (X_MIN_PIN > -1)
Serial.print("x_min:"); SERIAL_PROTOCOL("x_min:");
Serial.print((READ(X_MIN_PIN)^ENDSTOPS_INVERTING)?"H ":"L "); SERIAL_PROTOCOL(((READ(X_MIN_PIN)^ENDSTOPS_INVERTING)?"H ":"L "));
#endif #endif
#if (X_MAX_PIN > -1) #if (X_MAX_PIN > -1)
Serial.print("x_max:"); SERIAL_PROTOCOL("x_max:");
Serial.print((READ(X_MAX_PIN)^ENDSTOPS_INVERTING)?"H ":"L "); SERIAL_PROTOCOL(((READ(X_MAX_PIN)^ENDSTOPS_INVERTING)?"H ":"L "));
#endif #endif
#if (Y_MIN_PIN > -1) #if (Y_MIN_PIN > -1)
Serial.print("y_min:"); SERIAL_PROTOCOL("y_min:");
Serial.print((READ(Y_MIN_PIN)^ENDSTOPS_INVERTING)?"H ":"L "); SERIAL_PROTOCOL(((READ(Y_MIN_PIN)^ENDSTOPS_INVERTING)?"H ":"L "));
#endif #endif
#if (Y_MAX_PIN > -1) #if (Y_MAX_PIN > -1)
Serial.print("y_max:"); SERIAL_PROTOCOL("y_max:");
Serial.print((READ(Y_MAX_PIN)^ENDSTOPS_INVERTING)?"H ":"L "); SERIAL_PROTOCOL(((READ(Y_MAX_PIN)^ENDSTOPS_INVERTING)?"H ":"L "));
#endif #endif
#if (Z_MIN_PIN > -1) #if (Z_MIN_PIN > -1)
Serial.print("z_min:"); SERIAL_PROTOCOL("z_min:");
Serial.print((READ(Z_MIN_PIN)^ENDSTOPS_INVERTING)?"H ":"L "); SERIAL_PROTOCOL(((READ(Z_MIN_PIN)^ENDSTOPS_INVERTING)?"H ":"L "));
#endif #endif
#if (Z_MAX_PIN > -1) #if (Z_MAX_PIN > -1)
Serial.print("z_max:"); SERIAL_PROTOCOL("z_max:");
Serial.print((READ(Z_MAX_PIN)^ENDSTOPS_INVERTING)?"H ":"L "); SERIAL_PROTOCOL(((READ(Z_MAX_PIN)^ENDSTOPS_INVERTING)?"H ":"L "));
#endif #endif
Serial.println(""); SERIAL_PROTOCOLLN("");
break; break;
//TODO: update for all axis, use for loop //TODO: update for all axis, use for loop
case 201: // M201 case 201: // M201
@ -885,9 +897,7 @@ inline void process_commands()
} }
else else
{ {
Serial.print("echo: Unknown command:\""); SERIAL_ECHOLN("Unknown command:\""<<cmdbuffer[bufindr]<<"\"");
Serial.print(cmdbuffer[bufindr]);
Serial.println("\"");
} }
ClearToSend(); ClearToSend();
@ -897,8 +907,7 @@ void FlushSerialRequestResend()
{ {
//char cmdbuffer[bufindr][100]="Resend:"; //char cmdbuffer[bufindr][100]="Resend:";
Serial.flush(); Serial.flush();
Serial.print("Resend:"); SERIAL_PROTOCOLLN("Resend:"<<gcode_LastN + 1);
Serial.println(gcode_LastN + 1);
ClearToSend(); ClearToSend();
} }
@ -909,7 +918,7 @@ void ClearToSend()
if(fromsd[bufindr]) if(fromsd[bufindr])
return; return;
#endif //SDSUPPORT #endif //SDSUPPORT
Serial.println("ok"); SERIAL_PROTOCOLLN("ok");
} }
inline void get_coordinates() inline void get_coordinates()

31
Marlin/cardreader.h

@ -31,7 +31,7 @@ public:
inline void ls() {root.ls();}; inline void ls() {root.ls();};
inline bool eof() { sdpos = file.curPosition();return sdpos>=filesize ;}; inline bool eof() { sdpos = file.curPosition();return sdpos>=filesize ;};
inline char get() { int16_t n = file.read(); return (n!=-1)?(char)n:'\n';}; inline char get() { int16_t n = file.read(); return (n==-1)?'\n':(char)n;};
inline void setIndex(long index) {sdpos = index;file.seekSet(index);}; inline void setIndex(long index) {sdpos = index;file.seekSet(index);};
public: public:
@ -52,6 +52,35 @@ private:
bool autostart_stilltocheck; //the sd start is delayed, because otherwise the serial cannot answer fast enought to make contact with the hostsoftware. bool autostart_stilltocheck; //the sd start is delayed, because otherwise the serial cannot answer fast enought to make contact with the hostsoftware.
}; };
#else
class CardReader
{
public:
inline CardReader(){};
inline static void initsd(){};
inline static void write_command(char *buf){};
inline static void checkautostart(bool x) {};
inline static void closefile() {};
inline static void release(){};
inline static void startFileprint(){};
inline static void startFilewrite(char *name){};
inline static void pauseSDPrint(){};
inline static void getStatus(){};
inline static void selectFile(char* name){};
inline static void getfilename(const uint8_t nr){};
inline static uint8_t getnrfilenames(){return 0;};
inline static void ls() {};
inline static bool eof() {return true;};
inline static char get() {return 0;};
inline static void setIndex(){};
};
#endif //SDSUPPORT #endif //SDSUPPORT

23
Marlin/cardreader.pde

@ -76,17 +76,14 @@ void CardReader::selectFile(char* name)
file.close(); file.close();
if (file.open(&root, name, O_READ)) { if (file.open(&root, name, O_READ)) {
Serial.print("File opened:");
Serial.print(name);
Serial.print(" Size:");
filesize = file.fileSize(); filesize = file.fileSize();
Serial.println(filesize); SERIAL_PROTOCOLLN("File opened:"<<name<<" Size:"<<filesize);
sdpos = 0; sdpos = 0;
Serial.println("File selected"); SERIAL_PROTOCOLLN("File selected");
} }
else{ else{
Serial.println("file.open failed"); SERIAL_PROTOCOLLN("file.open failed");
} }
} }
} }
@ -101,14 +98,11 @@ void CardReader::startFilewrite(char *name)
if (!file.open(&root, name, O_CREAT | O_APPEND | O_WRITE | O_TRUNC)) if (!file.open(&root, name, O_CREAT | O_APPEND | O_WRITE | O_TRUNC))
{ {
Serial.print("open failed, File: "); SERIAL_PROTOCOLLN("open failed, File: "<<name<<".");
Serial.print(name);
Serial.print(".");
} }
else{ else{
saving = true; saving = true;
Serial.print("Writing to file: "); SERIAL_PROTOCOLLN("Writing to file: "<<name);
Serial.println(name);
} }
} }
} }
@ -116,13 +110,10 @@ void CardReader::startFilewrite(char *name)
void CardReader::getStatus() void CardReader::getStatus()
{ {
if(cardOK){ if(cardOK){
Serial.print("SD printing byte "); SERIAL_PROTOCOLLN("SD printing byte "<<sdpos<<"/"<<filesize);
Serial.print(sdpos);
Serial.print("/");
Serial.println(filesize);
} }
else{ else{
Serial.println("Not SD printing"); SERIAL_PROTOCOLLN("Not SD printing");
} }
} }
void CardReader::write_command(char *buf) void CardReader::write_command(char *buf)

123
Marlin/ultralcd.pde

@ -42,6 +42,19 @@ static long previous_millis_buttons=0;
static MainMenu menu; static MainMenu menu;
#include <avr/pgmspace.h>
void lcdProgMemprint(const char *str)
{
char ch=pgm_read_byte(str);
while(ch)
{
lcd.print(ch);
ch=pgm_read_byte(++str);
}
}
#define lcdprintPGM(x) lcdProgMemprint(PSTR(x))
//=========================================================================== //===========================================================================
//=============================functions ============================ //=============================functions ============================
@ -264,9 +277,9 @@ void MainMenu::showStatus()
feedmultiplychanged=false; feedmultiplychanged=false;
encoderpos=feedmultiply; encoderpos=feedmultiply;
clear(); clear();
lcd.setCursor(0,0);lcd.print("\002123/567\001 "); lcd.setCursor(0,0);lcdprintPGM("\002123/567\001 ");
#if defined BED_USES_THERMISTOR || defined BED_USES_AD595 #if defined BED_USES_THERMISTOR || defined BED_USES_AD595
lcd.setCursor(10,0);lcd.print("B123/567\001 "); lcd.setCursor(10,0);lcdprintPGM("B123/567\001 ");
#endif #endif
} }
@ -311,7 +324,7 @@ void MainMenu::showStatus()
if(starttime!=oldtime) if(starttime!=oldtime)
{ {
lcd.print(itostr2(time/60));lcd.print("h ");lcd.print(itostr2(time%60));lcd.print("m"); lcd.print(itostr2(time/60));lcdprintPGM("h ");lcd.print(itostr2(time%60));lcdprintPGM("m");
oldtime=time; oldtime=time;
} }
} }
@ -320,7 +333,7 @@ void MainMenu::showStatus()
if((currentz!=oldzpos)||force_lcd_update) if((currentz!=oldzpos)||force_lcd_update)
{ {
lcd.setCursor(10,1); lcd.setCursor(10,1);
lcd.print("Z:");lcd.print(itostr31(currentz)); lcdprintPGM("Z:");lcd.print(itostr31(currentz));
oldzpos=currentz; oldzpos=currentz;
} }
static int oldfeedmultiply=0; static int oldfeedmultiply=0;
@ -339,7 +352,7 @@ void MainMenu::showStatus()
{ {
oldfeedmultiply=curfeedmultiply; oldfeedmultiply=curfeedmultiply;
lcd.setCursor(0,2); lcd.setCursor(0,2);
lcd.print(itostr3(curfeedmultiply));lcd.print("% "); lcd.print(itostr3(curfeedmultiply));lcdprintPGM("% ");
} }
if(messagetext[0]!='\0') if(messagetext[0]!='\0')
{ {
@ -353,9 +366,9 @@ void MainMenu::showStatus()
if(force_lcd_update) //initial display of content if(force_lcd_update) //initial display of content
{ {
encoderpos=feedmultiply; encoderpos=feedmultiply;
lcd.setCursor(0,0);lcd.print("\002123/567\001 "); lcd.setCursor(0,0);lcdprintPGM("\002123/567\001 ");
#if defined BED_USES_THERMISTOR || defined BED_USES_AD595 #if defined BED_USES_THERMISTOR || defined BED_USES_AD595
lcd.setCursor(10,0);lcd.print("B123/567\001 "); lcd.setCursor(10,0);lcdprintPGM("B123/567\001 ");
#endif #endif
} }
@ -405,7 +418,7 @@ void MainMenu::showPrepare()
{ {
if(force_lcd_update) if(force_lcd_update)
{ {
lcd.setCursor(0,line);lcd.print(" Prepare"); lcd.setCursor(0,line);lcdprintPGM(" Prepare");
} }
if((activeline==line) && CLICKED) if((activeline==line) && CLICKED)
{ {
@ -418,7 +431,7 @@ void MainMenu::showPrepare()
{ {
if(force_lcd_update) if(force_lcd_update)
{ {
lcd.setCursor(0,line);lcd.print(" Auto Home"); lcd.setCursor(0,line);lcdprintPGM(" Auto Home");
} }
if((activeline==line) && CLICKED) if((activeline==line) && CLICKED)
{ {
@ -431,7 +444,7 @@ void MainMenu::showPrepare()
{ {
if(force_lcd_update) if(force_lcd_update)
{ {
lcd.setCursor(0,line);lcd.print(" Set Origin"); lcd.setCursor(0,line);lcdprintPGM(" Set Origin");
} }
if((activeline==line) && CLICKED) if((activeline==line) && CLICKED)
@ -445,7 +458,7 @@ void MainMenu::showPrepare()
{ {
if(force_lcd_update) if(force_lcd_update)
{ {
lcd.setCursor(0,line);lcd.print(" Preheat"); lcd.setCursor(0,line);lcdprintPGM(" Preheat");
} }
if((activeline==line) && CLICKED) if((activeline==line) && CLICKED)
{ {
@ -458,7 +471,7 @@ void MainMenu::showPrepare()
{ {
if(force_lcd_update) if(force_lcd_update)
{ {
lcd.setCursor(0,line);lcd.print(" Extrude"); lcd.setCursor(0,line);lcdprintPGM(" Extrude");
} }
if((activeline==line) && CLICKED) if((activeline==line) && CLICKED)
{ {
@ -472,7 +485,7 @@ void MainMenu::showPrepare()
{ {
if(force_lcd_update) if(force_lcd_update)
{ {
lcd.setCursor(0,line);lcd.print(" Disable Steppers"); lcd.setCursor(0,line);lcdprintPGM(" Disable Steppers");
} }
if((activeline==line) && CLICKED) if((activeline==line) && CLICKED)
{ {
@ -541,7 +554,7 @@ void MainMenu::showControl()
{ {
if(force_lcd_update) if(force_lcd_update)
{ {
lcd.setCursor(0,line);lcd.print(" Control"); lcd.setCursor(0,line);lcdprintPGM(" Control");
} }
if((activeline==line) && CLICKED) if((activeline==line) && CLICKED)
{ {
@ -554,7 +567,7 @@ void MainMenu::showControl()
{ {
if(force_lcd_update) if(force_lcd_update)
{ {
lcd.setCursor(0,line);lcd.print(" \002Nozzle:"); lcd.setCursor(0,line);lcdprintPGM(" \002Nozzle:");
lcd.setCursor(13,line);lcd.print(ftostr3(intround(degHotend0()))); lcd.setCursor(13,line);lcd.print(ftostr3(intround(degHotend0())));
} }
@ -588,7 +601,7 @@ void MainMenu::showControl()
{ {
if(force_lcd_update) if(force_lcd_update)
{ {
lcd.setCursor(0,line);lcd.print(" Fan speed:"); lcd.setCursor(0,line);lcdprintPGM(" Fan speed:");
lcd.setCursor(13,line);lcd.print(ftostr3(fanpwm)); lcd.setCursor(13,line);lcd.print(ftostr3(fanpwm));
} }
@ -625,8 +638,8 @@ void MainMenu::showControl()
{ {
if(force_lcd_update) if(force_lcd_update)
{ {
lcd.setCursor(0,line);lcd.print(" Acc:"); lcd.setCursor(0,line);lcdprintPGM(" Acc:");
lcd.setCursor(13,line);lcd.print(itostr3(acceleration/100));lcd.print("00"); lcd.setCursor(13,line);lcd.print(itostr3(acceleration/100));lcdprintPGM("00");
} }
if((activeline==line) ) if((activeline==line) )
@ -650,7 +663,7 @@ void MainMenu::showControl()
{ {
if(encoderpos<5) encoderpos=5; if(encoderpos<5) encoderpos=5;
if(encoderpos>990) encoderpos=990; if(encoderpos>990) encoderpos=990;
lcd.setCursor(13,line);lcd.print(itostr3(encoderpos));lcd.print("00"); lcd.setCursor(13,line);lcd.print(itostr3(encoderpos));lcdprintPGM("00");
} }
} }
}break; }break;
@ -658,7 +671,7 @@ void MainMenu::showControl()
{ {
if(force_lcd_update) if(force_lcd_update)
{ {
lcd.setCursor(0,line);lcd.print(" Vxy-jerk: "); lcd.setCursor(0,line);lcdprintPGM(" Vxy-jerk: ");
lcd.setCursor(13,line);lcd.print(itostr3(max_xy_jerk/60)); lcd.setCursor(13,line);lcd.print(itostr3(max_xy_jerk/60));
} }
@ -692,7 +705,7 @@ void MainMenu::showControl()
{ {
if(force_lcd_update) if(force_lcd_update)
{ {
lcd.setCursor(0,line);lcd.print(" PID-P: "); lcd.setCursor(0,line);lcdprintPGM(" PID-P: ");
lcd.setCursor(13,line);lcd.print(itostr4(Kp)); lcd.setCursor(13,line);lcd.print(itostr4(Kp));
} }
@ -726,7 +739,7 @@ void MainMenu::showControl()
{ {
if(force_lcd_update) if(force_lcd_update)
{ {
lcd.setCursor(0,line);lcd.print(" PID-I: "); lcd.setCursor(0,line);lcdprintPGM(" PID-I: ");
lcd.setCursor(13,line);lcd.print(ftostr51(Ki)); lcd.setCursor(13,line);lcd.print(ftostr51(Ki));
} }
@ -760,7 +773,7 @@ void MainMenu::showControl()
{ {
if(force_lcd_update) if(force_lcd_update)
{ {
lcd.setCursor(0,line);lcd.print(" PID-D: "); lcd.setCursor(0,line);lcdprintPGM(" PID-D: ");
lcd.setCursor(13,line);lcd.print(itostr4(Kd)); lcd.setCursor(13,line);lcd.print(itostr4(Kd));
} }
@ -797,7 +810,7 @@ void MainMenu::showControl()
{ {
if(force_lcd_update) if(force_lcd_update)
{ {
lcd.setCursor(0,line);lcd.print(" PID-C: "); lcd.setCursor(0,line);lcdprintPGM(" PID-C: ");
lcd.setCursor(13,line);lcd.print(itostr3(Kc)); lcd.setCursor(13,line);lcd.print(itostr3(Kc));
} }
@ -834,11 +847,11 @@ void MainMenu::showControl()
{ {
if(force_lcd_update) if(force_lcd_update)
{ {
lcd.setCursor(0,line);lcd.print(" Vmax "); lcd.setCursor(0,line);lcdprintPGM(" Vmax ");
if(i==ItemC_vmaxx)lcd.print("x:"); if(i==ItemC_vmaxx)lcdprintPGM("x:");
if(i==ItemC_vmaxy)lcd.print("y:"); if(i==ItemC_vmaxy)lcdprintPGM("y:");
if(i==ItemC_vmaxz)lcd.print("z:"); if(i==ItemC_vmaxz)lcdprintPGM("z:");
if(i==ItemC_vmaxe)lcd.print("e:"); if(i==ItemC_vmaxe)lcdprintPGM("e:");
lcd.setCursor(13,line);lcd.print(itostr3(max_feedrate[i-ItemC_vmaxx]/60)); lcd.setCursor(13,line);lcd.print(itostr3(max_feedrate[i-ItemC_vmaxx]/60));
} }
@ -873,7 +886,7 @@ void MainMenu::showControl()
{ {
if(force_lcd_update) if(force_lcd_update)
{ {
lcd.setCursor(0,line);lcd.print(" Vmin:"); lcd.setCursor(0,line);lcdprintPGM(" Vmin:");
lcd.setCursor(13,line);lcd.print(itostr3(minimumfeedrate/60)); lcd.setCursor(13,line);lcd.print(itostr3(minimumfeedrate/60));
} }
@ -907,7 +920,7 @@ void MainMenu::showControl()
{ {
if(force_lcd_update) if(force_lcd_update)
{ {
lcd.setCursor(0,line);lcd.print(" VTrav min:"); lcd.setCursor(0,line);lcdprintPGM(" VTrav min:");
lcd.setCursor(13,line);lcd.print(itostr3(mintravelfeedrate/60)); lcd.setCursor(13,line);lcd.print(itostr3(mintravelfeedrate/60));
} }
@ -945,12 +958,12 @@ void MainMenu::showControl()
{ {
if(force_lcd_update) if(force_lcd_update)
{ {
lcd.setCursor(0,line);lcd.print(" Amax "); lcd.setCursor(0,line);lcdprintPGM(" Amax ");
if(i==ItemC_amaxx)lcd.print("x:"); if(i==ItemC_amaxx)lcdprintPGM("x:");
if(i==ItemC_amaxy)lcd.print("y:"); if(i==ItemC_amaxy)lcdprintPGM("y:");
if(i==ItemC_amaxz)lcd.print("z:"); if(i==ItemC_amaxz)lcdprintPGM("z:");
if(i==ItemC_amaxe)lcd.print("e:"); if(i==ItemC_amaxe)lcdprintPGM("e:");
lcd.setCursor(13,line);lcd.print(itostr3(max_acceleration_units_per_sq_second[i-ItemC_amaxx]/100));lcd.print("00"); lcd.setCursor(13,line);lcd.print(itostr3(max_acceleration_units_per_sq_second[i-ItemC_amaxx]/100));lcdprintPGM("00");
} }
if((activeline==line) ) if((activeline==line) )
@ -974,7 +987,7 @@ void MainMenu::showControl()
{ {
if(encoderpos<1) encoderpos=1; if(encoderpos<1) encoderpos=1;
if(encoderpos>990) encoderpos=990; if(encoderpos>990) encoderpos=990;
lcd.setCursor(13,line);lcd.print(itostr3(encoderpos));lcd.print("00"); lcd.setCursor(13,line);lcd.print(itostr3(encoderpos));lcdprintPGM("00");
} }
} }
}break; }break;
@ -982,8 +995,8 @@ void MainMenu::showControl()
{ {
if(force_lcd_update) if(force_lcd_update)
{ {
lcd.setCursor(0,line);lcd.print(" A-retract:"); lcd.setCursor(0,line);lcdprintPGM(" A-retract:");
lcd.setCursor(13,line);lcd.print(ftostr3(retract_acceleration/100));lcd.print("00"); lcd.setCursor(13,line);lcd.print(ftostr3(retract_acceleration/100));lcdprintPGM("00");
} }
if((activeline==line) ) if((activeline==line) )
@ -1008,7 +1021,7 @@ void MainMenu::showControl()
{ {
if(encoderpos<10) encoderpos=10; if(encoderpos<10) encoderpos=10;
if(encoderpos>990) encoderpos=990; if(encoderpos>990) encoderpos=990;
lcd.setCursor(13,line);lcd.print(itostr3(encoderpos));lcd.print("00"); lcd.setCursor(13,line);lcd.print(itostr3(encoderpos));lcdprintPGM("00");
} }
} }
}break; }break;
@ -1016,7 +1029,7 @@ void MainMenu::showControl()
{ {
if(force_lcd_update) if(force_lcd_update)
{ {
lcd.setCursor(0,line);lcd.print(" Esteps/mm:"); lcd.setCursor(0,line);lcdprintPGM(" Esteps/mm:");
lcd.setCursor(13,line);lcd.print(itostr4(axis_steps_per_unit[3])); lcd.setCursor(13,line);lcd.print(itostr4(axis_steps_per_unit[3]));
} }
@ -1053,7 +1066,7 @@ void MainMenu::showControl()
{ {
if(force_lcd_update) if(force_lcd_update)
{ {
lcd.setCursor(0,line);lcd.print(" Store EPROM"); lcd.setCursor(0,line);lcdprintPGM(" Store EPROM");
} }
if((activeline==line) && CLICKED) if((activeline==line) && CLICKED)
{ {
@ -1067,7 +1080,7 @@ void MainMenu::showControl()
{ {
if(force_lcd_update) if(force_lcd_update)
{ {
lcd.setCursor(0,line);lcd.print(" Load EPROM"); lcd.setCursor(0,line);lcdprintPGM(" Load EPROM");
} }
if((activeline==line) && CLICKED) if((activeline==line) && CLICKED)
{ {
@ -1081,7 +1094,7 @@ void MainMenu::showControl()
{ {
if(force_lcd_update) if(force_lcd_update)
{ {
lcd.setCursor(0,line);lcd.print(" Restore Failsafe"); lcd.setCursor(0,line);lcdprintPGM(" Restore Failsafe");
} }
if((activeline==line) && CLICKED) if((activeline==line) && CLICKED)
{ {
@ -1165,7 +1178,7 @@ void MainMenu::showSD()
{ {
if(force_lcd_update) if(force_lcd_update)
{ {
lcd.setCursor(0,line);lcd.print(" File"); lcd.setCursor(0,line);lcdprintPGM(" File");
} }
if((activeline==line) && CLICKED) if((activeline==line) && CLICKED)
{ {
@ -1185,11 +1198,11 @@ void MainMenu::showSD()
if(true) if(true)
#endif #endif
{ {
lcd.print(" \004Refresh"); lcdprintPGM(" \004Refresh");
} }
else else
{ {
lcd.print(" \004Insert Card"); lcdprintPGM(" \004Insert Card");
} }
} }
@ -1210,7 +1223,7 @@ void MainMenu::showSD()
{ {
card.getfilename(i-2); card.getfilename(i-2);
//Serial.print("Filenr:");Serial.println(i-2); //Serial.print("Filenr:");Serial.println(i-2);
lcd.setCursor(0,line);lcd.print(" ");lcd.print(card.filename); lcd.setCursor(0,line);lcdprintPGM(" ");lcd.print(card.filename);
} }
if((activeline==line) && CLICKED) if((activeline==line) && CLICKED)
{ {
@ -1292,7 +1305,7 @@ void MainMenu::showMainMenu()
{ {
case ItemM_watch: case ItemM_watch:
{ {
if(force_lcd_update) {lcd.setCursor(0,line);lcd.print(" Watch \x7E");} if(force_lcd_update) {lcd.setCursor(0,line);lcdprintPGM(" Watch \x7E");}
if((activeline==line)&&CLICKED) if((activeline==line)&&CLICKED)
{ {
BLOCK; BLOCK;
@ -1302,7 +1315,7 @@ void MainMenu::showMainMenu()
} break; } break;
case ItemM_prepare: case ItemM_prepare:
{ {
if(force_lcd_update) {lcd.setCursor(0,line);lcd.print(" Prepare \x7E");} if(force_lcd_update) {lcd.setCursor(0,line);lcdprintPGM(" Prepare \x7E");}
if((activeline==line)&&CLICKED) if((activeline==line)&&CLICKED)
{ {
BLOCK; BLOCK;
@ -1313,7 +1326,7 @@ void MainMenu::showMainMenu()
case ItemM_control: case ItemM_control:
{ {
if(force_lcd_update) {lcd.setCursor(0,line);lcd.print(" Control \x7E");} if(force_lcd_update) {lcd.setCursor(0,line);lcdprintPGM(" Control \x7E");}
if((activeline==line)&&CLICKED) if((activeline==line)&&CLICKED)
{ {
BLOCK; BLOCK;
@ -1334,13 +1347,13 @@ void MainMenu::showMainMenu()
#endif #endif
{ {
if(card.sdprinting) if(card.sdprinting)
lcd.print(" Stop Print \x7E"); lcdprintPGM(" Stop Print \x7E");
else else
lcd.print(" Card Menu \x7E"); lcdprintPGM(" Card Menu \x7E");
} }
else else
{ {
lcd.print(" No Card"); lcdprintPGM(" No Card");
} }
} }
#ifdef CARDINSERTED #ifdef CARDINSERTED

Loading…
Cancel
Save