#include "stepper.h"
#include "temperature.h"
#include "motion_control.h"
+#include "cardreader.h"
char version_string[] = "1.0.0 Alpha 1";
-#ifdef SDSUPPORT
- #include "SdFat.h"
-#endif //SDSUPPORT
// look here for descriptions of gcodes: http://linuxcnc.org/handbook/gcode/g-code.html
//===========================================================================
extern float HeaterPower;
-//public variables
+
+//===========================================================================
+//=============================public variables=============================
+//===========================================================================
+CardReader card;
float homing_feedrate[] = HOMING_FEEDRATE;
bool axis_relative_modes[] = AXIS_RELATIVE_MODES;
volatile int feedmultiply=100; //100->1 200->2
static uint8_t fanpwm=0;
-// comm variables
static char cmdbuffer[BUFSIZE][MAX_CMD_SIZE];
static bool fromsd[BUFSIZE];
static unsigned long starttime=0;
static unsigned long stoptime=0;
-#ifdef SDSUPPORT
- static Sd2Card card;
- static SdVolume volume;
- static SdFile root;
- static SdFile file;
- static uint32_t filesize = 0;
- static uint32_t sdpos = 0;
- static bool sdmode = false;
- static bool sdactive = false;
- static bool savetosd = false;
- static int16_t n;
- static unsigned long autostart_atmillis=0;
-
- static bool autostart_stilltocheck=true; //the sd start is delayed, because otherwise the serial cannot answer fast enought to make contact with the hostsoftware.
-#endif //SDSUPPORT
+
//===========================================================================
//=============================ROUTINES=============================
//===========================================================================
-#ifdef SDSUPPORT
- void initsd()
- {
- sdactive = false;
- #if SDSS >- 1
- if(root.isOpen())
- root.close();
- if (!card.init(SPI_FULL_SPEED,SDSS))
- {
- //if (!card.init(SPI_HALF_SPEED,SDSS))
- SERIAL_ECHOLN("SD init fail");
- }
- else if (!volume.init(&card))
- {
- SERIAL_ERRORLN("volume.init failed");
- }
- else if (!root.openRoot(&volume))
- {
- SERIAL_ERRORLN("openRoot failed");
- }
- else
- {
- sdactive = true;
- SERIAL_ECHOLN("SD card ok");
- }
- #endif //SDSS
- }
- void quickinitsd()
- {
- sdactive=false;
- autostart_atmillis=millis()+5000;
- }
-
- inline void write_command(char *buf)
- {
- char* begin = buf;
- char* npos = 0;
- char* end = buf + strlen(buf) - 1;
-
- file.writeError = false;
- if((npos = strchr(buf, 'N')) != NULL)
- {
- begin = strchr(npos, ' ') + 1;
- end = strchr(npos, '*') - 1;
- }
- end[1] = '\r';
- end[2] = '\n';
- end[3] = '\0';
- file.write(begin);
- if (file.writeError)
- {
- SERIAL_ERRORLN("error writing to file");
- }
- }
-
-
- void checkautostart(bool force)
- {
- //this is to delay autostart and hence the initialisaiton of the sd card to some seconds after the normal init, so the device is available quick after a reset
- if(!force)
- {
- if(!autostart_stilltocheck)
- return;
- if(autostart_atmillis<millis())
- return;
- }
- autostart_stilltocheck=false;
- if(!sdactive)
- {
- initsd();
- if(!sdactive) //fail
- return;
- }
- static int lastnr=0;
- char autoname[30];
- sprintf(autoname,"auto%i.g",lastnr);
- for(int i=0;i<(int)strlen(autoname);i++)
- autoname[i]=tolower(autoname[i]);
- dir_t p;
-
- root.rewind();
-
- bool found=false;
- while (root.readDir(p) > 0)
- {
- for(int i=0;i<(int)strlen((char*)p.name);i++)
- p.name[i]=tolower(p.name[i]);
- //Serial.print((char*)p.name);
- //Serial.print(" ");
- //Serial.println(autoname);
- if(p.name[9]!='~') //skip safety copies
- if(strncmp((char*)p.name,autoname,5)==0)
- {
- char cmd[30];
-
- sprintf(cmd,"M23 %s",autoname);
- //sprintf(cmd,"M115");
- //enquecommand("G92 Z0");
- //enquecommand("G1 Z10 F2000");
- //enquecommand("G28 X-105 Y-105");
- enquecommand(cmd);
- enquecommand("M24");
- found=true;
- }
- }
- if(!found)
- lastnr=-1;
- else
- lastnr++;
- }
-#else //NO SD SUPORT
- inline void checkautostart(bool x){};
-
-#endif //SDSUPPORT
//adds an command to the main command buffer
axis_steps_per_sqr_second[i] = max_acceleration_units_per_sq_second[i] * axis_steps_per_unit[i];
}
- #ifdef SDSUPPORT
- //power to SD reader
- #if SDPOWER > -1
- SET_OUTPUT(SDPOWER);
- WRITE(SDPOWER,HIGH);
- #endif //SDPOWER
- quickinitsd();
- #endif //SDSUPPORT
plan_init(); // Initialize planner;
st_init(); // Initialize stepper;
{
if(buflen<3)
get_command();
- checkautostart(false);
+ card.checkautostart(false);
if(buflen)
{
#ifdef SDSUPPORT
- if(savetosd)
+ if(card.savetosd)
{
if(strstr(cmdbuffer[bufindr],"M29") == NULL)
{
- write_command(cmdbuffer[bufindr]);
+ card.write_command(cmdbuffer[bufindr]);
Serial.println("ok");
}
else
{
- file.sync();
- file.close();
- savetosd = false;
+ card.closefile();
Serial.println("Done saving file.");
}
}
case 2:
case 3:
#ifdef SDSUPPORT
- if(savetosd)
+ if(card.savetosd)
break;
#endif //SDSUPPORT
Serial.println("ok");
}
}
#ifdef SDSUPPORT
- if(!sdmode || serial_count!=0){
+ if(!card.sdmode || serial_count!=0){
return;
}
- while( filesize > sdpos && buflen < BUFSIZE) {
- n = file.read();
+ while( card.filesize > card.sdpos && buflen < BUFSIZE) {
+ short n = card.file.read();
serial_char = (char)n;
if(serial_char == '\n' || serial_char == '\r' || serial_char == ':' || serial_count >= (MAX_CMD_SIZE - 1) || n == -1)
{
- sdpos = file.curPosition();
- if(sdpos >= filesize){
- sdmode = false;
+ card.sdpos = card.file.curPosition();
+ if(card.sdpos >= card.filesize){
+ card.sdmode = false;
Serial.println("echo: Done printing file");
stoptime=millis();
char time[30];
sprintf(time,"echo: %i min, %i sec",min,sec);
Serial.println(time);
LCD_MESSAGE(time);
- checkautostart(true);
+ card.checkautostart(true);
}
if(!serial_count)
return; //if empty line
case 20: // M20 - list SD card
Serial.println("Begin file list");
- root.ls();
+ card.root.ls();
Serial.println("End file list");
break;
case 21: // M21 - init SD card
- sdmode = false;
- initsd();
+ card.sdmode = false;
+ card.initsd();
break;
case 22: //M22 - release SD card
- sdmode = false;
- sdactive = false;
+ card.sdmode = false;
+ card.sdactive = false;
break;
case 23: //M23 - Select file
- if(sdactive){
- sdmode = false;
- file.close();
+ if(card.sdactive){
+ card.sdmode = false;
+ card.file.close();
starpos = (strchr(strchr_pointer + 4,'*'));
if(starpos!=NULL)
*(starpos-1)='\0';
- if (file.open(&root, strchr_pointer + 4, O_READ)) {
+ if (card.file.open(&card.root, strchr_pointer + 4, O_READ)) {
Serial.print("File opened:");
Serial.print(strchr_pointer + 4);
Serial.print(" Size:");
- Serial.println(file.fileSize());
- sdpos = 0;
- filesize = file.fileSize();
+ Serial.println(card.file.fileSize());
+ card.sdpos = 0;
+ card.filesize = card.file.fileSize();
Serial.println("File selected");
}
else{
}
break;
case 24: //M24 - Start SD print
- if(sdactive){
- sdmode = true;
+ if(card.sdactive){
+ card.sdmode = true;
starttime=millis();
}
break;
case 25: //M25 - Pause SD print
- if(sdmode){
- sdmode = false;
+ if(card.sdmode){
+ card.sdmode = false;
}
break;
case 26: //M26 - Set SD index
- if(sdactive && code_seen('S')){
- sdpos = code_value_long();
- file.seekSet(sdpos);
+ if(card.sdactive && code_seen('S')){
+ card.sdpos = code_value_long();
+ card.file.seekSet(card.sdpos);
}
break;
case 27: //M27 - Get SD status
- if(sdactive){
+ if(card.sdactive){
Serial.print("SD printing byte ");
- Serial.print(sdpos);
+ Serial.print(card.sdpos);
Serial.print("/");
- Serial.println(filesize);
+ Serial.println(card.filesize);
}
else{
Serial.println("Not SD printing");
}
break;
case 28: //M28 - Start SD write
- if(sdactive){
+ if(card.sdactive){
char* npos = 0;
- file.close();
- sdmode = false;
+ card.file.close();
+ card.sdmode = false;
starpos = (strchr(strchr_pointer + 4,'*'));
if(starpos != NULL){
npos = strchr(cmdbuffer[bufindr], 'N');
strchr_pointer = strchr(npos,' ') + 1;
*(starpos-1) = '\0';
}
- if (!file.open(&root, strchr_pointer+4, O_CREAT | O_APPEND | O_WRITE | O_TRUNC))
+ if (!card.file.open(&card.root, strchr_pointer+4, O_CREAT | O_APPEND | O_WRITE | O_TRUNC))
{
Serial.print("open failed, File: ");
Serial.print(strchr_pointer + 4);
Serial.print(".");
}
else{
- savetosd = true;
+ card.savetosd = true;
Serial.print("Writing to file: ");
Serial.println(strchr_pointer + 4);
}
--- /dev/null
+#ifdef SDSUPPORT
+#include "cardreader.h"
+
+CardReader::CardReader()
+{
+ filesize = 0;
+ sdpos = 0;
+ sdmode = false;
+ sdactive = false;
+ savetosd = false;
+ autostart_atmillis=0;
+
+ autostart_stilltocheck=true; //the sd start is delayed, because otherwise the serial cannot answer fast enought to make contact with the hostsoftware.
+ //power to SD reader
+ #if SDPOWER > -1
+ SET_OUTPUT(SDPOWER);
+ WRITE(SDPOWER,HIGH);
+ #endif //SDPOWER
+
+ autostart_atmillis=millis()+5000;
+}
+
+void CardReader::initsd()
+{
+ sdactive = false;
+ #if SDSS >- 1
+ if(root.isOpen())
+ root.close();
+ if (!card.init(SPI_FULL_SPEED,SDSS))
+ {
+ //if (!card.init(SPI_HALF_SPEED,SDSS))
+ SERIAL_ECHOLN("SD init fail");
+ }
+ else if (!volume.init(&card))
+ {
+ SERIAL_ERRORLN("volume.init failed");
+ }
+ else if (!root.openRoot(&volume))
+ {
+ SERIAL_ERRORLN("openRoot failed");
+ }
+ else
+ {
+ sdactive = true;
+ SERIAL_ECHOLN("SD card ok");
+ }
+ #endif //SDSS
+}
+
+void CardReader::write_command(char *buf)
+{
+ char* begin = buf;
+ char* npos = 0;
+ char* end = buf + strlen(buf) - 1;
+
+ file.writeError = false;
+ if((npos = strchr(buf, 'N')) != NULL)
+ {
+ begin = strchr(npos, ' ') + 1;
+ end = strchr(npos, '*') - 1;
+ }
+ end[1] = '\r';
+ end[2] = '\n';
+ end[3] = '\0';
+ file.write(begin);
+ if (file.writeError)
+ {
+ SERIAL_ERRORLN("error writing to file");
+ }
+}
+
+
+void CardReader::checkautostart(bool force)
+{
+ if(!force)
+ {
+ if(!autostart_stilltocheck)
+ return;
+ if(autostart_atmillis<millis())
+ return;
+ }
+ autostart_stilltocheck=false;
+ if(!sdactive)
+ {
+ initsd();
+ if(!sdactive) //fail
+ return;
+ }
+ static int lastnr=0;
+ char autoname[30];
+ sprintf(autoname,"auto%i.g",lastnr);
+ for(int i=0;i<(int)strlen(autoname);i++)
+ autoname[i]=tolower(autoname[i]);
+ dir_t p;
+
+ root.rewind();
+
+ bool found=false;
+ while (root.readDir(p) > 0)
+ {
+ for(int i=0;i<(int)strlen((char*)p.name);i++)
+ p.name[i]=tolower(p.name[i]);
+ //Serial.print((char*)p.name);
+ //Serial.print(" ");
+ //Serial.println(autoname);
+ if(p.name[9]!='~') //skip safety copies
+ if(strncmp((char*)p.name,autoname,5)==0)
+ {
+ char cmd[30];
+
+ sprintf(cmd,"M23 %s",autoname);
+ enquecommand(cmd);
+ enquecommand("M24");
+ found=true;
+ }
+ }
+ if(!found)
+ lastnr=-1;
+ else
+ lastnr++;
+}
+
+void CardReader::closefile()
+{
+ file.sync();
+ file.close();
+ savetosd = false;
+}
+
+void CardReader::getfilename(const uint8_t nr)
+{
+
+ dir_t p;
+ root.rewind();
+ uint8_t cnt=0;
+ filename[0]='\0';
+ while (root.readDir(p) > 0)
+ {
+ if (p.name[0] == DIR_NAME_FREE) break;
+ if (p.name[0] == DIR_NAME_DELETED || p.name[0] == '.'|| p.name[0] == '_') continue;
+ if (!DIR_IS_FILE_OR_SUBDIR(&p)) continue;
+ if(p.name[8]!='G') continue;
+ if(p.name[9]=='~') continue;
+ if(cnt++!=nr) continue;
+ //Serial.println((char*)p.name);
+ uint8_t writepos=0;
+ for (uint8_t i = 0; i < 11; i++)
+ {
+ if (p.name[i] == ' ') continue;
+ if (i == 8) {
+ filename[writepos++]='.';
+ }
+ filename[writepos++]=p.name[i];
+ }
+ filename[writepos++]=0;
+ }
+}
+
+uint8_t CardReader::getnrfilenames()
+{
+ dir_t p;
+ root.rewind();
+ uint8_t cnt=0;
+ while (root.readDir(p) > 0)
+ {
+ if (p.name[0] == DIR_NAME_FREE) break;
+ if (p.name[0] == DIR_NAME_DELETED || p.name[0] == '.'|| p.name[0] == '_') continue;
+ if (!DIR_IS_FILE_OR_SUBDIR(&p)) continue;
+ if(p.name[8]!='G') continue;
+ if(p.name[9]=='~') continue;
+ cnt++;
+ }
+ return cnt;
+}
+
+
+#endif //SDSUPPORT
\ No newline at end of file
extern volatile bool feedmultiplychanged;\r
\r
extern long position[4]; \r
+extern CardReader card;\r
\r
static char messagetext[LCD_WIDTH]="";\r
\r
\r
#include "SdFat.h"\r
\r
-void MainMenu::getfilename(const uint8_t nr)\r
-{\r
-#ifdef SDSUPPORT \r
- dir_t p;\r
- root.rewind();\r
- uint8_t cnt=0;\r
- filename[0]='\0';\r
- while (root.readDir(p) > 0)\r
- {\r
- if (p.name[0] == DIR_NAME_FREE) break;\r
- if (p.name[0] == DIR_NAME_DELETED || p.name[0] == '.'|| p.name[0] == '_') continue;\r
- if (!DIR_IS_FILE_OR_SUBDIR(&p)) continue;\r
- if(p.name[8]!='G') continue;\r
- if(p.name[9]=='~') continue;\r
- if(cnt++!=nr) continue;\r
- //Serial.println((char*)p.name);\r
- uint8_t writepos=0;\r
- for (uint8_t i = 0; i < 11; i++) \r
- {\r
- if (p.name[i] == ' ') continue;\r
- if (i == 8) {\r
- filename[writepos++]='.';\r
- }\r
- filename[writepos++]=p.name[i];\r
- }\r
- filename[writepos++]=0;\r
- }\r
-#endif \r
-}\r
\r
-uint8_t getnrfilenames()\r
-{\r
-#ifdef SDSUPPORT\r
- dir_t p;\r
- root.rewind();\r
- uint8_t cnt=0;\r
- while (root.readDir(p) > 0)\r
- {\r
- if (p.name[0] == DIR_NAME_FREE) break;\r
- if (p.name[0] == DIR_NAME_DELETED || p.name[0] == '.'|| p.name[0] == '_') continue;\r
- if (!DIR_IS_FILE_OR_SUBDIR(&p)) continue;\r
- if(p.name[8]!='G') continue;\r
- if(p.name[9]=='~') continue;\r
- cnt++;\r
- }\r
- return cnt;\r
-#else\r
- return 0;\r
-#endif\r
-}\r
+\r
\r
void MainMenu::showSD()\r
{\r
if(force_lcd_update)\r
{\r
clear();\r
- if(sdactive)\r
+ if(card.sdactive)\r
{\r
- nrfiles=getnrfilenames();\r
+ nrfiles=card.getnrfilenames();\r
}\r
else\r
{\r
{\r
BLOCK;\r
beepshort();\r
- initsd();\r
+ card.initsd();\r
force_lcd_update=true;\r
- nrfiles=getnrfilenames();\r
+ nrfiles=card.getnrfilenames();\r
}\r
}break;\r
default:\r
{\r
if(force_lcd_update)\r
{\r
- getfilename(i-2);\r
+ card.getfilename(i-2);\r
//Serial.print("Filenr:");Serial.println(i-2);\r
- lcd.setCursor(0,line);lcd.print(" ");lcd.print(filename);\r
+ lcd.setCursor(0,line);lcd.print(" ");lcd.print(card.filename);\r
}\r
if((activeline==line) && CLICKED)\r
{\r
BLOCK\r
- getfilename(i-2);\r
+ card.getfilename(i-2);\r
char cmd[30];\r
- for(int i=0;i<strlen(filename);i++)\r
- filename[i]=tolower(filename[i]);\r
- sprintf(cmd,"M23 %s",filename);\r
+ for(int i=0;i<strlen(card.filename);i++)\r
+ card.filename[i]=tolower(card.filename[i]);\r
+ sprintf(cmd,"M23 %s",card.filename);\r
//sprintf(cmd,"M115");\r
enquecommand(cmd);\r
enquecommand("M24");\r
beep(); \r
status=Main_Status;\r
- lcd_status(filename);\r
+ lcd_status(card.filename);\r
}\r
}\r
\r
if(true)\r
#endif\r
{\r
- if(sdmode)\r
+ if(card.sdmode)\r
lcd.print(" Stop Print \x7E");\r
else\r
lcd.print(" Card Menu \x7E");\r
#endif\r
if((activeline==line)&&CLICKED)\r
{\r
- sdmode = false;\r
+ card.sdmode = false;\r
BLOCK;\r
status=Main_SD;\r
beepshort();\r
//Serial.println("echo: SD CHANGE");\r
if(CARDINSERTED)\r
{\r
- initsd();\r
+ card.initsd();\r
lcd_status("Card inserted");\r
}\r
else\r
{\r
- sdactive=false;\r
+ card.sdactive=false;\r
lcd_status("Card removed");\r
}\r
}\r