@ -7,91 +7,69 @@
# ifdef SDSUPPORT
# ifdef SDSUPPORT
CardReader : : CardReader ( ) {
filesize = 0 ;
sdpos = 0 ;
sdprinting = false ;
cardOK = false ;
saving = false ;
logging = false ;
workDirDepth = 0 ;
file_subcall_ctr = 0 ;
memset ( workDirParents , 0 , sizeof ( workDirParents ) ) ;
autostart_stilltocheck = true ; //the SD start is delayed, because otherwise the serial cannot answer fast enough to make contact with the host software.
CardReader : : CardReader ( )
autostart_index = 0 ;
{
filesize = 0 ;
sdpos = 0 ;
sdprinting = false ;
cardOK = false ;
saving = false ;
logging = false ;
autostart_atmillis = 0 ;
workDirDepth = 0 ;
file_subcall_ctr = 0 ;
memset ( workDirParents , 0 , sizeof ( workDirParents ) ) ;
autostart_stilltocheck = true ; //the SD start is delayed, because otherwise the serial cannot answer fast enough to make contact with the host software.
autostart_index = 0 ;
//power to SD reader
//power to SD reader
# if SDPOWER > -1
# if SDPOWER > -1
SET_OUTPUT ( SDPOWER ) ;
SET_OUTPUT ( SDPOWER ) ;
WRITE ( SDPOWER , HIGH ) ;
WRITE ( SDPOWER , HIGH ) ;
# endif //SDPOWER
# endif //SDPOWER
autostart_atmillis = millis ( ) + 5000 ;
autostart_atmillis = millis ( ) + 5000 ;
}
}
char * createFilename ( char * buffer , const dir_t & p ) //buffer>12characters
char * createFilename ( char * buffer , const dir_t & p ) { //buffer > 12characters
{
char * pos = buffer ;
char * pos = buffer ;
for ( uint8_t i = 0 ; i < 11 ; i + + ) {
for ( uint8_t i = 0 ; i < 11 ; i + + )
if ( p . name [ i ] = = ' ' ) continue ;
{
if ( i = = 8 ) * pos + + = ' . ' ;
if ( p . name [ i ] = = ' ' ) continue ;
* pos + + = p . name [ i ] ;
if ( i = = 8 )
{
* pos + + = ' . ' ;
}
* pos + + = p . name [ i ] ;
}
}
* pos + + = 0 ;
* pos + + = 0 ;
return buffer ;
return buffer ;
}
}
void CardReader : : lsDive ( const char * prepend , SdFile parent , const char * const match /*=NULL*/ ) {
void CardReader : : lsDive ( const char * prepend , SdFile parent , const char * const match /*=NULL*/ )
{
dir_t p ;
dir_t p ;
uint8_t cnt = 0 ;
uint8_t cnt = 0 ;
while ( parent . readDir ( p , longFilename ) > 0 )
{
if ( DIR_IS_SUBDIR ( & p ) & & lsAction ! = LS_Count & & lsAction ! = LS_GetFilename ) // hence LS_SerialPrint
{
while ( parent . readDir ( p , longFilename ) > 0 ) {
if ( DIR_IS_SUBDIR ( & p ) & & lsAction ! = LS_Count & & lsAction ! = LS_GetFilename ) { // hence LS_SerialPrint
char path [ FILENAME_LENGTH * 2 ] ;
char path [ FILENAME_LENGTH * 2 ] ;
char lfilename [ FILENAME_LENGTH ] ;
char lfilename [ FILENAME_LENGTH ] ;
createFilename ( lfilename , p ) ;
createFilename ( lfilename , p ) ;
path [ 0 ] = 0 ;
path [ 0 ] = 0 ;
if ( prepend [ 0 ] = = 0 ) //avoid leading / if already in prepend
if ( prepend [ 0 ] = = 0 ) strcat ( path , " / " ) ; //avoid leading / if already in prepend
{
strcat ( path , prepend ) ;
strcat ( path , " / " ) ;
strcat ( path , lfilename ) ;
}
strcat ( path , " / " ) ;
strcat ( path , prepend ) ;
strcat ( path , lfilename ) ;
strcat ( path , " / " ) ;
//Serial.print(path);
//Serial.print(path);
SdFile dir ;
SdFile dir ;
if ( ! dir . open ( parent , lfilename , O_READ ) )
if ( ! dir . open ( parent , lfilename , O_READ ) ) {
{
if ( lsAction = = LS_SerialPrint ) {
if ( lsAction = = LS_SerialPrint )
{
SERIAL_ECHO_START ;
SERIAL_ECHO_START ;
SERIAL_ECHOLN ( MSG_SD_CANT_OPEN_SUBDIR ) ;
SERIAL_ECHOLN ( MSG_SD_CANT_OPEN_SUBDIR ) ;
SERIAL_ECHOLN ( lfilename ) ;
SERIAL_ECHOLN ( lfilename ) ;
}
}
}
}
lsDive ( path , dir ) ;
lsDive ( path , dir ) ;
//close done automatically by destructor of SdFile
//close done automatically by destructor of SdFile
}
}
else
else {
{
char pn0 = p . name [ 0 ] ;
char pn0 = p . name [ 0 ] ;
if ( pn0 = = DIR_NAME_FREE ) break ;
if ( pn0 = = DIR_NAME_FREE ) break ;
if ( pn0 = = DIR_NAME_DELETED | | pn0 = = ' . ' | | pn0 = = ' _ ' ) continue ;
if ( pn0 = = DIR_NAME_DELETED | | pn0 = = ' . ' | | pn0 = = ' _ ' ) continue ;
@ -99,384 +77,313 @@ void CardReader::lsDive(const char *prepend, SdFile parent, const char * const m
if ( lf0 = = ' . ' | | lf0 = = ' _ ' ) continue ;
if ( lf0 = = ' . ' | | lf0 = = ' _ ' ) continue ;
if ( ! DIR_IS_FILE_OR_SUBDIR ( & p ) ) continue ;
if ( ! DIR_IS_FILE_OR_SUBDIR ( & p ) ) continue ;
filenameIsDir = DIR_IS_SUBDIR ( & p ) ;
filenameIsDir = DIR_IS_SUBDIR ( & p ) ;
if ( ! filenameIsDir )
if ( ! filenameIsDir & & ( p . name [ 8 ] ! = ' G ' | | p . name [ 9 ] = = ' ~ ' ) ) continue ;
{
if ( p . name [ 8 ] ! = ' G ' ) continue ;
//if (cnt++ != nr) continue;
if ( p . name [ 9 ] = = ' ~ ' ) continue ;
createFilename ( filename , p ) ;
}
if ( lsAction = = LS_SerialPrint ) {
//if(cnt++!=nr) continue;
createFilename ( filename , p ) ;
if ( lsAction = = LS_SerialPrint )
{
SERIAL_PROTOCOL ( prepend ) ;
SERIAL_PROTOCOL ( prepend ) ;
SERIAL_PROTOCOLLN ( filename ) ;
SERIAL_PROTOCOLLN ( filename ) ;
}
}
else if ( lsAction = = LS_Count )
else if ( lsAction = = LS_Count ) {
{
nrFiles + + ;
nrFiles + + ;
}
}
else if ( lsAction = = LS_GetFilename )
else if ( lsAction = = LS_GetFilename ) {
{
if ( match ! = NULL ) {
if ( match ! = NULL ) {
if ( strcasecmp ( match , filename ) = = 0 ) return ;
if ( strcasecmp ( match , filename ) = = 0 ) return ;
}
}
else if ( cnt = = nrFiles ) return ;
else if ( cnt = = nrFiles ) return ;
cnt + + ;
cnt + + ;
}
}
}
}
}
}
}
}
void CardReader : : ls ( )
void CardReader : : ls ( ) {
{
lsAction = LS_SerialPrint ;
lsAction = LS_SerialPrint ;
if ( lsAction = = LS_Count )
nrFiles = 0 ;
root . rewind ( ) ;
root . rewind ( ) ;
lsDive ( " " , root ) ;
lsDive ( " " , root ) ;
}
}
void CardReader : : initsd ( ) {
void CardReader : : initsd ( )
{
cardOK = false ;
cardOK = false ;
if ( root . isOpen ( ) )
if ( root . isOpen ( ) ) root . close ( ) ;
root . close ( ) ;
# ifdef SDSLOW
# ifdef SDSLOW
if ( ! card . init ( SPI_HALF_SPEED , SDSS )
# define SPI_SPEED SPI_HALF_SPEED
# if defined(LCD_SDSS) && (LCD_SDSS != SDSS)
# else
& & ! card . init ( SPI_HALF_SPEED , LCD_SDSS )
# define SPI_SPEED SPI_FULL_SPEED
# endif
)
# else
if ( ! card . init ( SPI_FULL_SPEED , SDSS )
# if defined(LCD_SDSS) && (LCD_SDSS != SDSS)
& & ! card . init ( SPI_FULL_SPEED , LCD_SDSS )
# endif
# endif
)
# endif
if ( ! card . init ( SPI_SPEED , SDSS )
{
# if defined(LCD_SDSS) && (LCD_SDSS != SDSS)
& & ! card . init ( SPI_SPEED , LCD_SDSS )
# endif
) {
//if (!card.init(SPI_HALF_SPEED,SDSS))
//if (!card.init(SPI_HALF_SPEED,SDSS))
SERIAL_ECHO_START ;
SERIAL_ECHO_START ;
SERIAL_ECHOLNPGM ( MSG_SD_INIT_FAIL ) ;
SERIAL_ECHOLNPGM ( MSG_SD_INIT_FAIL ) ;
}
}
else if ( ! volume . init ( & card ) )
else if ( ! volume . init ( & card ) ) {
{
SERIAL_ERROR_START ;
SERIAL_ERROR_START ;
SERIAL_ERRORLNPGM ( MSG_SD_VOL_INIT_FAIL ) ;
SERIAL_ERRORLNPGM ( MSG_SD_VOL_INIT_FAIL ) ;
}
}
else if ( ! root . openRoot ( & volume ) )
else if ( ! root . openRoot ( & volume ) ) {
{
SERIAL_ERROR_START ;
SERIAL_ERROR_START ;
SERIAL_ERRORLNPGM ( MSG_SD_OPENROOT_FAIL ) ;
SERIAL_ERRORLNPGM ( MSG_SD_OPENROOT_FAIL ) ;
}
}
else
else {
{
cardOK = true ;
cardOK = true ;
SERIAL_ECHO_START ;
SERIAL_ECHO_START ;
SERIAL_ECHOLNPGM ( MSG_SD_CARD_OK ) ;
SERIAL_ECHOLNPGM ( MSG_SD_CARD_OK ) ;
}
}
workDir = root ;
workDir = root ;
curDir = & root ;
curDir = & root ;
/*
/*
if ( ! workDir . openRoot ( & volume ) )
if ( ! workDir . openRoot ( & volume ) ) {
{
SERIAL_ECHOLNPGM ( MSG_SD_WORKDIR_FAIL ) ;
SERIAL_ECHOLNPGM ( MSG_SD_WORKDIR_FAIL ) ;
}
}
*/
*/
}
}
void CardReader : : setroot ( )
void CardReader : : setroot ( ) {
{
/*if (!workDir.openRoot(&volume)) {
/*if(!workDir.openRoot(&volume))
{
SERIAL_ECHOLNPGM ( MSG_SD_WORKDIR_FAIL ) ;
SERIAL_ECHOLNPGM ( MSG_SD_WORKDIR_FAIL ) ;
} */
} */
workDir = root ;
workDir = root ;
curDir = & workDir ;
curDir = & workDir ;
}
}
void CardReader : : release ( )
{
void CardReader : : release ( ) {
sdprinting = false ;
sdprinting = false ;
cardOK = false ;
cardOK = false ;
}
}
void CardReader : : startFileprint ( )
void CardReader : : startFileprint ( ) {
{
if ( cardOK ) {
if ( cardOK )
{
sdprinting = true ;
sdprinting = true ;
}
}
}
}
void CardReader : : pauseSDPrint ( )
void CardReader : : pauseSDPrint ( ) {
{
if ( sdprinting ) sdprinting = false ;
if ( sdprinting )
{
sdprinting = false ;
}
}
}
void CardReader : : openLogFile ( char * name ) {
void CardReader : : openLogFile ( char * name )
{
logging = true ;
logging = true ;
openFile ( name , false ) ;
openFile ( name , false ) ;
}
}
void CardReader : : getAbsFilename ( char * t )
void CardReader : : getAbsFilename ( char * t ) {
{
uint8_t cnt = 0 ;
uint8_t cnt = 0 ;
* t = ' / ' ; t + + ; cnt + + ;
* t = ' / ' ; t + + ; cnt + + ;
for ( uint8_t i = 0 ; i < workDirDepth ; i + + ) {
for ( uint8_t i = 0 ; i < workDirDepth ; i + + )
{
workDirParents [ i ] . getFilename ( t ) ; //SDBaseFile.getfilename!
workDirParents [ i ] . getFilename ( t ) ; //SDBaseFile.getfilename!
while ( * t ! = 0 & & cnt < MAXPATHNAMELENGTH )
while ( * t & & cnt < MAXPATHNAMELENGTH ) { t + + ; cnt + + ; } //crawl counter forward.
{ t + + ; cnt + + ; } //crawl counter forward.
}
}
if ( cnt < MAXPATHNAMELENGTH - FILENAME_LENGTH )
if ( cnt < MAXPATHNAMELENGTH - FILENAME_LENGTH )
file . getFilename ( t ) ;
file . getFilename ( t ) ;
else
else
t [ 0 ] = 0 ;
t [ 0 ] = 0 ;
}
}
void CardReader : : openFile ( char * name , bool read , bool replace_current /*=true*/ )
void CardReader : : openFile ( char * name , bool read , bool replace_current /*=true*/ ) {
{
if ( ! cardOK ) return ;
if ( ! cardOK )
if ( file . isOpen ( ) ) { //replacing current file by new file, or subfile call
return ;
if ( ! replace_current ) {
if ( file . isOpen ( ) ) //replacing current file by new file, or subfile call
if ( file_subcall_ctr > SD_PROCEDURE_DEPTH - 1 ) {
{
if ( ! replace_current )
{
if ( ( int ) file_subcall_ctr > ( int ) SD_PROCEDURE_DEPTH - 1 )
{
SERIAL_ERROR_START ;
SERIAL_ERROR_START ;
SERIAL_ERRORPGM ( " trying to call sub-gcode files with too many levels. MAX level is: " ) ;
SERIAL_ERRORPGM ( " trying to call sub-gcode files with too many levels. MAX level is: " ) ;
SERIAL_ERRORLN ( SD_PROCEDURE_DEPTH ) ;
SERIAL_ERRORLN ( SD_PROCEDURE_DEPTH ) ;
kill ( ) ;
kill ( ) ;
return ;
return ;
}
}
SERIAL_ECHO_START ;
SERIAL_ECHO_START ;
SERIAL_ECHOPGM ( " SUBROUTINE CALL target: \" " ) ;
SERIAL_ECHOPGM ( " SUBROUTINE CALL target: \" " ) ;
SERIAL_ECHO ( name ) ;
SERIAL_ECHO ( name ) ;
SERIAL_ECHOPGM ( " \" parent: \" " ) ;
SERIAL_ECHOPGM ( " \" parent: \" " ) ;
//store current filename and position
//store current filename and position
getAbsFilename ( filenames [ file_subcall_ctr ] ) ;
getAbsFilename ( filenames [ file_subcall_ctr ] ) ;
SERIAL_ECHO ( filenames [ file_subcall_ctr ] ) ;
SERIAL_ECHO ( filenames [ file_subcall_ctr ] ) ;
SERIAL_ECHOPGM ( " \" pos " ) ;
SERIAL_ECHOPGM ( " \" pos " ) ;
SERIAL_ECHOLN ( sdpos ) ;
SERIAL_ECHOLN ( sdpos ) ;
filespos [ file_subcall_ctr ] = sdpos ;
filespos [ file_subcall_ctr ] = sdpos ;
file_subcall_ctr + + ;
file_subcall_ctr + + ;
}
}
else
else {
{
SERIAL_ECHO_START ;
SERIAL_ECHO_START ;
SERIAL_ECHOPGM ( " Now doing file: " ) ;
SERIAL_ECHOPGM ( " Now doing file: " ) ;
SERIAL_ECHOLN ( name ) ;
SERIAL_ECHOLN ( name ) ;
}
}
file . close ( ) ;
file . close ( ) ;
}
}
else //opening fresh file
else { //opening fresh file
{
file_subcall_ctr = 0 ; //resetting procedure depth in case user cancels print while in procedure
file_subcall_ctr = 0 ; //resetting procedure depth in case user cancels print while in procedure
SERIAL_ECHO_START ;
SERIAL_ECHO_START ;
SERIAL_ECHOPGM ( " Now fresh file: " ) ;
SERIAL_ECHOPGM ( " Now fresh file: " ) ;
SERIAL_ECHOLN ( name ) ;
SERIAL_ECHOLN ( name ) ;
}
}
sdprinting = false ;
sdprinting = false ;
SdFile myDir ;
SdFile myDir ;
curDir = & root ;
curDir = & root ;
char * fname = name ;
char * fname = name ;
char * dirname_start , * dirname_end ;
char * dirname_start , * dirname_end ;
if ( name [ 0 ] = = ' / ' )
if ( name [ 0 ] = = ' / ' ) {
{
dirname_start = & name [ 1 ] ;
dirname_start = strchr ( name , ' / ' ) + 1 ;
while ( dirname_start > 0 ) {
while ( dirname_start > 0 )
dirname_end = strchr ( dirname_start , ' / ' ) ;
{
//SERIAL_ECHO("start:");SERIAL_ECHOLN((int)(dirname_start - name));
dirname_end = strchr ( dirname_start , ' / ' ) ;
//SERIAL_ECHO("end :");SERIAL_ECHOLN((int)(dirname_end - name));
//SERIAL_ECHO("start:");SERIAL_ECHOLN((int)(dirname_start-name));
if ( dirname_end > 0 & & dirname_end > dirname_start ) {
//SERIAL_ECHO("end :");SERIAL_ECHOLN((int)(dirname_end-name));
if ( dirname_end > 0 & & dirname_end > dirname_start )
{
char subdirname [ FILENAME_LENGTH ] ;
char subdirname [ FILENAME_LENGTH ] ;
strncpy ( subdirname , dirname_start , dirname_end - dirname_start ) ;
strncpy ( subdirname , dirname_start , dirname_end - dirname_start ) ;
subdirname [ dirname_end - dirname_start ] = 0 ;
subdirname [ dirname_end - dirname_start ] = 0 ;
SERIAL_ECHOLN ( subdirname ) ;
SERIAL_ECHOLN ( subdirname ) ;
if ( ! myDir . open ( curDir , subdirname , O_READ ) )
if ( ! myDir . open ( curDir , subdirname , O_READ ) ) {
{
SERIAL_PROTOCOLPGM ( MSG_SD_OPEN_FILE_FAIL ) ;
SERIAL_PROTOCOLPGM ( MSG_SD_OPEN_FILE_FAIL ) ;
SERIAL_PROTOCOL ( subdirname ) ;
SERIAL_PROTOCOL ( subdirname ) ;
SERIAL_PROTOCOLLNPGM ( " . " ) ;
SERIAL_PROTOCOLLNPGM ( " . " ) ;
return ;
return ;
}
}
else
else {
{
//SERIAL_ECHOLN("dive ok");
//SERIAL_ECHOLN("dive ok");
}
}
curDir = & myDir ;
curDir = & myDir ;
dirname_start = dirname_end + 1 ;
dirname_start = dirname_end + 1 ;
}
}
else // the reminder after all /fsa/fdsa/ is the filename
else { // the remainder after all /fsa/fdsa/ is the filename
{
fname = dirname_start ;
fname = dirname_start ;
//SERIAL_ECHOLN("remainder");
//SERIAL_ECHOLN("remaider");
//SERIAL_ECHOLN(fname);
//SERIAL_ECHOLN(fname);
break ;
break ;
}
}
}
}
}
}
else //relative path
else { //relative path
{
curDir = & workDir ;
curDir = & workDir ;
}
}
if ( read )
{
if ( read ) {
if ( file . open ( curDir , fname , O_READ ) )
if ( file . open ( curDir , fname , O_READ ) ) {
{
filesize = file . fileSize ( ) ;
filesize = file . fileSize ( ) ;
SERIAL_PROTOCOLPGM ( MSG_SD_FILE_OPENED ) ;
SERIAL_PROTOCOLPGM ( MSG_SD_FILE_OPENED ) ;
SERIAL_PROTOCOL ( fname ) ;
SERIAL_PROTOCOL ( fname ) ;
SERIAL_PROTOCOLPGM ( MSG_SD_SIZE ) ;
SERIAL_PROTOCOLPGM ( MSG_SD_SIZE ) ;
SERIAL_PROTOCOLLN ( filesize ) ;
SERIAL_PROTOCOLLN ( filesize ) ;
sdpos = 0 ;
sdpos = 0 ;
SERIAL_PROTOCOLLNPGM ( MSG_SD_FILE_SELECTED ) ;
SERIAL_PROTOCOLLNPGM ( MSG_SD_FILE_SELECTED ) ;
getfilename ( 0 , fname ) ;
getfilename ( 0 , fname ) ;
lcd_setstatus ( longFilename [ 0 ] ? longFilename : fname ) ;
lcd_setstatus ( longFilename [ 0 ] ? longFilename : fname ) ;
}
}
else
else {
{
SERIAL_PROTOCOLPGM ( MSG_SD_OPEN_FILE_FAIL ) ;
SERIAL_PROTOCOLPGM ( MSG_SD_OPEN_FILE_FAIL ) ;
SERIAL_PROTOCOL ( fname ) ;
SERIAL_PROTOCOL ( fname ) ;
SERIAL_PROTOCOLLNPGM ( " . " ) ;
SERIAL_PROTOCOLLNPGM ( " . " ) ;
}
}
}
}
else
else { //write
{ //write
if ( ! file . open ( curDir , fname , O_CREAT | O_APPEND | O_WRITE | O_TRUNC ) ) {
if ( ! file . open ( curDir , fname , O_CREAT | O_APPEND | O_WRITE | O_TRUNC ) )
{
SERIAL_PROTOCOLPGM ( MSG_SD_OPEN_FILE_FAIL ) ;
SERIAL_PROTOCOLPGM ( MSG_SD_OPEN_FILE_FAIL ) ;
SERIAL_PROTOCOL ( fname ) ;
SERIAL_PROTOCOL ( fname ) ;
SERIAL_PROTOCOLLNPGM ( " . " ) ;
SERIAL_PROTOCOLLNPGM ( " . " ) ;
}
}
else
else {
{
saving = true ;
saving = true ;
SERIAL_PROTOCOLPGM ( MSG_SD_WRITE_TO_FILE ) ;
SERIAL_PROTOCOLPGM ( MSG_SD_WRITE_TO_FILE ) ;
SERIAL_PROTOCOLLN ( name ) ;
SERIAL_PROTOCOLLN ( name ) ;
lcd_setstatus ( fname ) ;
lcd_setstatus ( fname ) ;
}
}
}
}
}
}
void CardReader : : removeFile ( char * name )
void CardReader : : removeFile ( char * name ) {
{
if ( ! cardOK ) return ;
if ( ! cardOK )
return ;
file . close ( ) ;
file . close ( ) ;
sdprinting = false ;
sdprinting = false ;
SdFile myDir ;
SdFile myDir ;
curDir = & root ;
curDir = & root ;
char * fname = name ;
char * fname = name ;
char * dirname_start , * dirname_end ;
char * dirname_start , * dirname_end ;
if ( name [ 0 ] = = ' / ' )
if ( name [ 0 ] = = ' / ' ) {
{
dirname_start = strchr ( name , ' / ' ) + 1 ;
dirname_start = strchr ( name , ' / ' ) + 1 ;
while ( dirname_start > 0 ) {
while ( dirname_start > 0 )
dirname_end = strchr ( dirname_start , ' / ' ) ;
{
//SERIAL_ECHO("start:");SERIAL_ECHOLN((int)(dirname_start - name));
dirname_end = strchr ( dirname_start , ' / ' ) ;
//SERIAL_ECHO("end :");SERIAL_ECHOLN((int)(dirname_end - name));
//SERIAL_ECHO("start:");SERIAL_ECHOLN((int)(dirname_start-name));
if ( dirname_end > 0 & & dirname_end > dirname_start ) {
//SERIAL_ECHO("end :");SERIAL_ECHOLN((int)(dirname_end-name));
if ( dirname_end > 0 & & dirname_end > dirname_start )
{
char subdirname [ FILENAME_LENGTH ] ;
char subdirname [ FILENAME_LENGTH ] ;
strncpy ( subdirname , dirname_start , dirname_end - dirname_start ) ;
strncpy ( subdirname , dirname_start , dirname_end - dirname_start ) ;
subdirname [ dirname_end - dirname_start ] = 0 ;
subdirname [ dirname_end - dirname_start ] = 0 ;
SERIAL_ECHOLN ( subdirname ) ;
SERIAL_ECHOLN ( subdirname ) ;
if ( ! myDir . open ( curDir , subdirname , O_READ ) )
if ( ! myDir . open ( curDir , subdirname , O_READ ) ) {
{
SERIAL_PROTOCOLPGM ( " open failed, File: " ) ;
SERIAL_PROTOCOLPGM ( " open failed, File: " ) ;
SERIAL_PROTOCOL ( subdirname ) ;
SERIAL_PROTOCOL ( subdirname ) ;
SERIAL_PROTOCOLLNPGM ( " . " ) ;
SERIAL_PROTOCOLLNPGM ( " . " ) ;
return ;
return ;
}
}
else
else {
{
//SERIAL_ECHOLN("dive ok");
//SERIAL_ECHOLN("dive ok");
}
}
curDir = & myDir ;
curDir = & myDir ;
dirname_start = dirname_end + 1 ;
dirname_start = dirname_end + 1 ;
}
}
else // the reminder after all /fsa/fdsa/ is the filename
else { // the remainder after all /fsa/fdsa/ is the filename
{
fname = dirname_start ;
fname = dirname_start ;
//SERIAL_ECHOLN("remainder");
//SERIAL_ECHOLN("remaider");
//SERIAL_ECHOLN(fname);
//SERIAL_ECHOLN(fname);
break ;
break ;
}
}
}
}
}
}
else //relative path
else { // relative path
{
curDir = & workDir ;
curDir = & workDir ;
}
if ( file . remove ( curDir , fname ) ) {
SERIAL_PROTOCOLPGM ( " File deleted: " ) ;
SERIAL_PROTOCOLLN ( fname ) ;
sdpos = 0 ;
}
else {
SERIAL_PROTOCOLPGM ( " Deletion failed, File: " ) ;
SERIAL_PROTOCOL ( fname ) ;
SERIAL_PROTOCOLLNPGM ( " . " ) ;
}
}
if ( file . remove ( curDir , fname ) )
{
SERIAL_PROTOCOLPGM ( " File deleted: " ) ;
SERIAL_PROTOCOLLN ( fname ) ;
sdpos = 0 ;
}
else
{
SERIAL_PROTOCOLPGM ( " Deletion failed, File: " ) ;
SERIAL_PROTOCOL ( fname ) ;
SERIAL_PROTOCOLLNPGM ( " . " ) ;
}
}
}
void CardReader : : getStatus ( )
void CardReader : : getStatus ( ) {
{
if ( cardOK ) {
if ( cardOK ) {
SERIAL_PROTOCOLPGM ( MSG_SD_PRINTING_BYTE ) ;
SERIAL_PROTOCOLPGM ( MSG_SD_PRINTING_BYTE ) ;
SERIAL_PROTOCOL ( sdpos ) ;
SERIAL_PROTOCOL ( sdpos ) ;
SERIAL_PROTOCOLPGM ( " / " ) ;
SERIAL_PROTOCOLPGM ( " / " ) ;
SERIAL_PROTOCOLLN ( filesize ) ;
SERIAL_PROTOCOLLN ( filesize ) ;
}
}
else {
else {
SERIAL_PROTOCOLLNPGM ( MSG_SD_NOT_PRINTING ) ;
SERIAL_PROTOCOLLNPGM ( MSG_SD_NOT_PRINTING ) ;
}
}
}
}
void CardReader : : write_command ( char * buf )
{
void CardReader : : write_command ( char * buf ) {
char * begin = buf ;
char * begin = buf ;
char * npos = 0 ;
char * npos = 0 ;
char * end = buf + strlen ( buf ) - 1 ;
char * end = buf + strlen ( buf ) - 1 ;
file . writeError = false ;
file . writeError = false ;
if ( ( npos = strchr ( buf , ' N ' ) ) ! = NULL )
if ( ( npos = strchr ( buf , ' N ' ) ) ! = NULL ) {
{
begin = strchr ( npos , ' ' ) + 1 ;
begin = strchr ( npos , ' ' ) + 1 ;
end = strchr ( npos , ' * ' ) - 1 ;
end = strchr ( npos , ' * ' ) - 1 ;
}
}
@ -484,162 +391,129 @@ void CardReader::write_command(char *buf)
end [ 2 ] = ' \n ' ;
end [ 2 ] = ' \n ' ;
end [ 3 ] = ' \0 ' ;
end [ 3 ] = ' \0 ' ;
file . write ( begin ) ;
file . write ( begin ) ;
if ( file . writeError )
if ( file . writeError ) {
{
SERIAL_ERROR_START ;
SERIAL_ERROR_START ;
SERIAL_ERRORLNPGM ( MSG_SD_ERR_WRITE_TO_FILE ) ;
SERIAL_ERRORLNPGM ( MSG_SD_ERR_WRITE_TO_FILE ) ;
}
}
}
}
void CardReader : : checkautostart ( bool force ) {
if ( ! force & & ( ! autostart_stilltocheck | | autostart_atmillis < millis ( ) ) )
return ;
void CardReader : : checkautostart ( bool force )
autostart_stilltocheck = false ;
{
if ( ! force )
if ( ! cardOK ) {
{
if ( ! autostart_stilltocheck )
return ;
if ( autostart_atmillis < millis ( ) )
return ;
}
autostart_stilltocheck = false ;
if ( ! cardOK )
{
initsd ( ) ;
initsd ( ) ;
if ( ! cardOK ) //fail
if ( ! cardOK ) return ; // fail
return ;
}
}
char autoname [ 30 ] ;
char autoname [ 30 ] ;
sprintf_P ( autoname , PSTR ( " auto%i.g " ) , autostart_index ) ;
sprintf_P ( autoname , PSTR ( " auto%i.g " ) , autostart_index ) ;
for ( int8_t i = 0 ; i < ( int8_t ) strlen ( autoname ) ; i + + )
for ( int8_t i = 0 ; i < ( int8_t ) strlen ( autoname ) ; i + + ) autoname [ i ] = tolower ( autoname [ i ] ) ;
autoname [ i ] = tolower ( autoname [ i ] ) ;
dir_t p ;
dir_t p ;
root . rewind ( ) ;
root . rewind ( ) ;
bool found = false ;
while ( root . readDir ( p , NULL ) > 0 )
{
for ( int8_t i = 0 ; i < ( int8_t ) 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 ] ;
bool found = false ;
while ( root . readDir ( p , NULL ) > 0 ) {
for ( int8_t i = 0 ; i < ( int8_t ) strlen ( ( char * ) p . name ) ; i + + ) p . name [ i ] = tolower ( p . name [ i ] ) ;
if ( p . name [ 9 ] ! = ' ~ ' & & strncmp ( ( char * ) p . name , autoname , 5 ) = = 0 ) {
char cmd [ 30 ] ;
sprintf_P ( cmd , PSTR ( " M23 %s " ) , autoname ) ;
sprintf_P ( cmd , PSTR ( " M23 %s " ) , autoname ) ;
enquecommand ( cmd ) ;
enquecommand ( cmd ) ;
enquecommands_P ( PSTR ( " M24 " ) ) ;
enquecommands_P ( PSTR ( " M24 " ) ) ;
found = true ;
found = true ;
}
}
}
}
if ( ! found )
if ( ! found )
autostart_index = - 1 ;
autostart_index = - 1 ;
else
else
autostart_index + + ;
autostart_index + + ;
}
}
void CardReader : : closefile ( bool store_location )
void CardReader : : closefile ( bool store_location ) {
{
file . sync ( ) ;
file . sync ( ) ;
file . close ( ) ;
file . close ( ) ;
saving = false ;
saving = logging = false ;
logging = false ;
if ( store_location ) {
if ( store_location )
{
//future: store printer state, filename and position for continuing a stopped print
//future: store printer state, filename and position for continuing a stopped print
// so one can unplug the printer and continue printing the next day.
// so one can unplug the printer and continue printing the next day.
}
}
}
}
void CardReader : : getfilename ( uint16_t nr , const char * const match /*=NULL*/ )
/**
{
* Get the name of a file in the current directory by index
curDir = & workDir ;
*/
lsAction = LS_GetFilename ;
void CardReader : : getfilename ( uint16_t nr , const char * const match /*=NULL*/ ) {
nrFiles = nr ;
curDir = & workDir ;
lsAction = LS_GetFilename ;
nrFiles = nr ;
curDir - > rewind ( ) ;
curDir - > rewind ( ) ;
lsDive ( " " , * curDir , match ) ;
lsDive ( " " , * curDir , match ) ;
}
}
uint16_t CardReader : : getnrfilenames ( )
uint16_t CardReader : : getnrfilenames ( ) {
{
curDir = & workDir ;
curDir = & workDir ;
lsAction = LS_Count ;
lsAction = LS_Count ;
nrFiles = 0 ;
nrFiles = 0 ;
curDir - > rewind ( ) ;
curDir - > rewind ( ) ;
lsDive ( " " , * curDir ) ;
lsDive ( " " , * curDir ) ;
//SERIAL_ECHOLN(nrFiles);
//SERIAL_ECHOLN(nrFiles);
return nrFiles ;
return nrFiles ;
}
}
void CardReader : : chdir ( const char * relpath )
void CardReader : : chdir ( const char * relpath ) {
{
SdFile newfile ;
SdFile newfile ;
SdFile * parent = & root ;
SdFile * parent = & root ;
if ( workDir . isOpen ( ) )
if ( workDir . isOpen ( ) ) parent = & workDir ;
parent = & workDir ;
if ( ! newfile . open ( * parent , relpath , O_READ ) ) {
if ( ! newfile . open ( * parent , relpath , O_READ ) )
SERIAL_ECHO_START ;
{
SERIAL_ECHOPGM ( MSG_SD_CANT_ENTER_SUBDIR ) ;
SERIAL_ECHO_START ;
SERIAL_ECHOLN ( relpath ) ;
SERIAL_ECHOPGM ( MSG_SD_CANT_ENTER_SUBDIR ) ;
SERIAL_ECHOLN ( relpath ) ;
}
}
else
else {
{
if ( workDirDepth < MAX_DIR_DEPTH ) {
if ( workDirDepth < MAX_DIR_DEPTH ) {
for ( int d = + + workDirDepth ; d - - ; )
+ + workDirDepth ;
workDirParents [ d + 1 ] = workDirParents [ d ] ;
for ( int d = workDirDepth ; d - - ; ) workDirParents [ d + 1 ] = workDirParents [ d ] ;
workDirParents [ 0 ] = * parent ;
workDirParents [ 0 ] = * parent ;
}
}
workDir = newfile ;
workDir = newfile ;
}
}
}
}
void CardReader : : updir ( )
void CardReader : : updir ( ) {
{
if ( workDirDepth > 0 ) {
if ( workDirDepth > 0 )
{
- - workDirDepth ;
- - workDirDepth ;
workDir = workDirParents [ 0 ] ;
workDir = workDirParents [ 0 ] ;
int d ;
for ( int d = 0 ; d < workDirDepth ; d + + )
for ( int d = 0 ; d < workDirDepth ; d + + )
workDirParents [ d ] = workDirParents [ d + 1 ] ;
workDirParents [ d ] = workDirParents [ d + 1 ] ;
}
}
}
}
void CardReader : : printingHasFinished ( ) {
void CardReader : : printingHasFinished ( )
st_synchronize ( ) ;
{
if ( file_subcall_ctr > 0 ) { // Heading up to a parent file that called current as a procedure.
st_synchronize ( ) ;
file . close ( ) ;
if ( file_subcall_ctr > 0 ) //heading up to a parent file that called current as a procedure.
file_subcall_ctr - - ;
{
openFile ( filenames [ file_subcall_ctr ] , true , true ) ;
file . close ( ) ;
setIndex ( filespos [ file_subcall_ctr ] ) ;
file_subcall_ctr - - ;
startFileprint ( ) ;
openFile ( filenames [ file_subcall_ctr ] , true , true ) ;
}
setIndex ( filespos [ file_subcall_ctr ] ) ;
else {
startFileprint ( ) ;
quickStop ( ) ;
}
file . close ( ) ;
else
sdprinting = false ;
{
if ( SD_FINISHED_STEPPERRELEASE ) {
quickStop ( ) ;
//finishAndDisableSteppers();
file . close ( ) ;
enquecommands_P ( PSTR ( SD_FINISHED_RELEASECOMMAND ) ) ;
sdprinting = false ;
if ( SD_FINISHED_STEPPERRELEASE )
{
//finishAndDisableSteppers();
enquecommands_P ( PSTR ( SD_FINISHED_RELEASECOMMAND ) ) ;
}
autotempShutdown ( ) ;
}
}
autotempShutdown ( ) ;
}
}
}
# endif //SDSUPPORT
# endif //SDSUPPORT