Beispiel #1
0
uint8_t sd_find_file_in_dir(struct fat16_dir_struct* dd, const char* name, struct fat16_dir_entry_struct* dir_entry)
{
    while(fat16_read_dir(dd, dir_entry))
    {
        if(strcmp(dir_entry->long_name, name) == 0)
        {
            fat16_reset_dir(dd);
            return 1;
        }
    }

    return 0;
}
Beispiel #2
0
void AF_Wave::reset_dir(void) {
  fat16_reset_dir(dd);
}
Beispiel #3
0
/**
 * \ingroup tcpcmdcommon
 * \b DIR-Befehl Verzeichnislisting
 *
 * Aufruf von USART direkt über DIR-Befehl. Von FTP wird die Funktion
 * paketweise vom Datenkanal aus aufgerufen.<br><br>
 * \b Ausgabe:
 * - auf USART wird komplettes Listing ausgegeben
 * - bei TCP wird der outbuffer mit vollständigen Verzeichniseinträgen
 *   bis maximal MAX_WINDOWS_SIZE gefüllt. Falls dann noch Einträge
 *   vorhanden sind wird <tt>tcpsrv_status.LISTcontinue</tt> auf true gesetzt.
 * 	 Bei abgeschlossenem Listing wird <tt>tcpsrv_status.LISTcontinue</tt> auf
 *   false gesetzt.
 */
int16_t cmd_MMCdir(char *outbuffer)
{
#if USE_MMC
	if (!cwdir_ptr)
		return 0;

	#if !FTP_ANONYMOUS
	if (outbuffer && !tcpsrv_status.loginOK)
		return cmd_530(outbuffer);
	#endif

	#if TCP_SERVICE
	tcpsrv_status.LISTcontinue = 0;	// continue Flag zurücksetzen
	#endif
	if (!outbuffer) {
		usart_write("\n\rSD-Karte:");
	}

	char *pstr = outbuffer;
    struct fat16_dir_entry_struct dir_entry;
	uint16_t year;
	uint8_t month;
	uint8_t day;
	uint8_t hour;
	uint8_t min;
	uint8_t sec;

    /* Verzeichniseinträge lesen */
    while(fat16_read_dir(cwdir_ptr, &dir_entry))
    {
		fat16_get_file_modification_date(&dir_entry, &year, &month, &day);
		fat16_get_file_modification_time(&dir_entry, &hour, &min, &sec);

		if (outbuffer) {
			#if TCP_SERVICE
			char tmpbuf[12];

			#ifdef UNIX_LIST
			/*
			*  UNIX style Dateiliste
			*/
			char mstr[4];

			if (dir_entry.attributes & FAT16_ATTRIB_DIR) {
				strcpy_P((char *)tmpbuf,PSTR("drwxr-xr-x"));
			}
			else {
				strcpy_P((char *)tmpbuf,PSTR("-rw-rw-rw-"));
			}

			strncpy_P(mstr,&US_Monate[(month-1)*3],3);
			mstr[3] = '\0';
			sprintf_P((char *)pstr,PSTR("%s 1 ftp ftp %ld %s/%i/%i %i:%i %s\r\n"),tmpbuf, dir_entry.file_size,
																mstr, day, year, hour, min, dir_entry.long_name);
			#endif

			#ifdef DOS_LIST
			/*
			*  DOS style Dateiliste
			* (bei FileZilla nennt sich das DOS - woanders Windows_NT(?) ...)
			*/
			if (dir_entry.attributes & FAT16_ATTRIB_DIR) {
				strcpy_P((char *)tmpbuf,PSTR("<DIR>"));
			}
			else {
				sprintf_P(tmpbuf,PSTR("%ld"),dir_entry.file_size);
			}

			sprintf_P((char *)pstr,PSTR("%i-%i-%i %i:%i:%i %8s %s\r\n"),month, day, year, hour, min, sec, tmpbuf,dir_entry.long_name);
			#endif

			while (*pstr++);	// bis auf '\0' vorzählen
			--pstr;

			if (pstr > (outbuffer + MAX_WINDOWS_SIZE - 64)) {	// mind. 64 Bytes für nächsten Eintrag freilassen
				tcpsrv_status.LISTcontinue = 1;					// continue Flag setzen
				break;
			}
			#endif
		}
		else {
			usart_write("\r\n%2i.%2i.%i %2i:%2i ",day, month, year, hour, min);
			if (dir_entry.attributes & FAT16_ATTRIB_DIR)
				usart_write("    <DIR> ");
			else
				usart_write("%9l ",dir_entry.file_size);

			usart_write("%s",dir_entry.long_name);
		}
    }

	#if TCP_SERVICE
	if (!tcpsrv_status.LISTcontinue)
		fat16_reset_dir(cwdir_ptr);
	#endif

	if (outbuffer)
		return strlen(outbuffer);
	else
#endif
		return 0;
}