From: Olivier Matz Date: Thu, 17 Jul 2014 17:55:38 +0000 (+0200) Subject: add missing sd_log.[ch] files X-Git-Url: http://git.droids-corp.org/?p=protos%2Fimu.git;a=commitdiff_plain;h=a0a958396dfcb47aa2d71e2e8366377834cee99c add missing sd_log.[ch] files --- diff --git a/sd_log.c b/sd_log.c new file mode 100644 index 0000000..4659936 --- /dev/null +++ b/sd_log.c @@ -0,0 +1,139 @@ +#include +#include +#include +#include + +#include "fat.h" +#include "fat_config.h" +#include "partition.h" +#include "sd_raw.h" +#include "sd_raw_config.h" +#include "sd_log.h" + +static struct fat_file_struct *log_fd = NULL; + +uint8_t find_file_in_dir(struct fat_fs_struct* fs, + struct fat_dir_struct* dd, const char* name, + struct fat_dir_entry_struct* dir_entry) +{ + (void)fs; + + while(fat_read_dir(dd, dir_entry)) { + if(strcmp(dir_entry->long_name, name) == 0) { + fat_reset_dir(dd); + return 1; + } + } + + return 0; +} + +struct fat_file_struct *open_file_in_dir(struct fat_fs_struct* fs, + struct fat_dir_struct* dd, const char* name) +{ + struct fat_dir_entry_struct file_entry; + + if(!find_file_in_dir(fs, dd, name, &file_entry)) + return 0; + + return fat_open_file(fs, &file_entry); +} + +struct fat_file_struct *open_log_file(void) +{ + struct fat_file_struct *fd; + struct fat_fs_struct *fs; + struct partition_struct *partition ; + struct fat_dir_struct *dd; + struct fat_dir_entry_struct directory; + struct fat_dir_entry_struct file_entry; + int16_t i = 0; + char name[16]; + + /* setup sd card slot */ + if (!sd_raw_init()) { +#if SD_DEBUG + printf_P(PSTR("MMC/SD initialization failed\n")); +#endif + return NULL; + } + + /* open first partition */ + partition = partition_open(sd_raw_read, + sd_raw_read_interval, +#if SD_RAW_WRITE_SUPPORT + sd_raw_write, sd_raw_write_interval, +#else + 0, 0, +#endif + 0); + + if (!partition) { + /* If the partition did not open, assume the storage device + * is a "superfloppy", i.e. has no MBR. + */ + partition = partition_open(sd_raw_read, + sd_raw_read_interval, +#if SD_RAW_WRITE_SUPPORT + sd_raw_write, + sd_raw_write_interval, +#else + 0, + 0, +#endif + -1); + if (!partition) { +#if SD_DEBUG + printf_P(PSTR("opening partition failed\n")); +#endif + return NULL; + } + } + + /* open file system */ + fs = fat_open(partition); + if (!fs) { +#if SD_DEBUG + printf_P(PSTR("opening filesystem failed\n")); +#endif + return NULL; + } + + /* open root directory */ + fat_get_dir_entry_of_path(fs, "/", &directory); + dd = fat_open_dir(fs, &directory); + if (!dd) { +#if SD_DEBUG + printf_P(PSTR("opening root directory failed\n")); +#endif + return NULL; + } + + /* print some card information as a boot message */ + //print_disk_info(fs); + + printf("choose log file name\n"); + while (1) { + snprintf(name, sizeof(name), "log%.4d", i++); + if (!find_file_in_dir(fs, dd, name, &file_entry)) + break; + } + + printf("create log file %s\n", name); + if (!fat_create_file(dd, name, &file_entry)) { + printf_P(PSTR("error creating file: ")); + } + + fd = open_file_in_dir(fs, dd, name); + if (!fd) { + printf_P(PSTR("error opening ")); + return NULL; + } + + return fd; +} + +struct fat_file_struct *get_log_file(void) +{ + return log_fd; +} diff --git a/sd_log.h b/sd_log.h new file mode 100644 index 0000000..d2333e2 --- /dev/null +++ b/sd_log.h @@ -0,0 +1,7 @@ +#ifndef SD_LOG_H_ +#define SD_LOG_H_ + +struct fat_file_struct *open_log_file(void); +struct fat_file_struct *get_log_file(void); + +#endif