X-Git-Url: https://codewiz.org/gitweb?p=rmslog.git;a=blobdiff_plain;f=rmslog%2Fmain.c;h=206f421c9a887e33c32aa8ee951e003ee0624a7c;hp=9f52d5f789ea5e4fe76fad5468140137ba0ab3d4;hb=5745e4104db210e76f8118a46bfdd0253bdce389;hpb=11db4fb1c52b7460f55d84402d5eb44da7bbda99 diff --git a/rmslog/main.c b/rmslog/main.c index 9f52d5f..206f421 100644 --- a/rmslog/main.c +++ b/rmslog/main.c @@ -10,6 +10,12 @@ * console messages. */ +// Configuration +#define FILE_NAME "log.txt" +#define FILE_OVERWRITE 1 +#define FILE_PREALLOC_SIZE 102400 + + #include "hw/hw_led.h" #define LOG_LEVEL 3 @@ -19,14 +25,9 @@ #include #include -#ifdef BERTOS_FAT - #include - #include -#else - #include - #include - #include -#endif +#include +#include +#include #include #include @@ -35,23 +36,17 @@ #include +// Our serial port static Serial ser; -#ifdef BERTOS_FAT - static Serial spi; - static FATFS fs; - static FatFile file; - static Sd sd; -#else - struct fat_fs_struct *fs; - struct partition_struct *partition; - struct fat_dir_struct *dd; - struct fat_dir_entry_struct dir_entry; - struct fat_file_struct *fd; -#endif - - -#ifndef BERTOS_FAT +// FAT global state +struct fat_fs_struct *fs; +struct partition_struct *partition; +struct fat_dir_struct *dd; +struct fat_dir_entry_struct dir_entry; +struct fat_file_struct *fd; + + static void fat_init(void) { partition = partition_open( @@ -84,7 +79,7 @@ static void fat_init(void) ASSERT(0); for(;;) {} } - //Open root directory + // Open root directory fat_get_dir_entry_of_path(fs, "/", &dir_entry); if (!(dd = fat_open_dir(fs, &dir_entry))) { @@ -116,7 +111,6 @@ static struct fat_file_struct *open_file_in_dir(struct fat_fs_struct* fs, struct return fat_open_file(fs, &file_entry); } -#endif // !BERTOS_FAT static void init(void) { @@ -144,21 +138,20 @@ static void init(void) // input stream to the SD card //ser_setbaudrate(&ser, 19200); - /* Initialize LED driver */ + // Initialize LED driver LED_INIT(); + /* + * This gives avrdude some time to start reflashing in case + * the bug caused the program to do continous serial output + */ timer_delay(1000); - kfile_printf(&ser.fd, "Hello, world!\r\n"); -#ifdef BERTOS_FAT - ser_init(&spi, SER_SPI); -#else DDRB |= BV(PORTB0) | BV(PORTB2) | BV(PORTB3) | BV(PORTB5); if (!sd_raw_init()) { ASSERT(0); for(;;) {} } -#endif fat_init(); } @@ -168,35 +161,36 @@ int main(void) { init(); -#ifdef BERTOS_FAT + size_t size; + char buf[256]; + bool sync_pending = false; - FRESULT fat_err; - if ((fat_err = f_mount(0, &fs)) != FR_OK) + /* create file */ + if(!fat_create_file(dd, FILE_NAME, &dir_entry)) { - LOG_ERR("Error mounting FAT volume: %d\n", fat_err); + #if FILE_OVERWRITE + fat_delete_file(fs, &dir_entry); + fat_create_file(dd, FILE_NAME, &dir_entry); + #endif } - fat_err = fatfile_open(&file, "foo.txt", FA_WRITE | FA_CREATE_ALWAYS); - ASSERT(fat_err == FR_OK); - - size_t count = kfile_write(&file.fd, "Hello, world!", strlen("Hello, world!")); - ASSERT(count == strlen("Hello, world!")); + fd = open_file_in_dir(fs, dd, FILE_NAME); -#else - - fat_create_file(dd, "log.txt", &dir_entry); - fd = open_file_in_dir(fs, dd, "log.txt"); - int32_t offset = 0; - fat_seek_file(fd, &offset, FAT_SEEK_END); + /* preallocate file */ + #if FILE_PREALLOC_SIZE + { + LED_ON(); + for (int i = 0; i < (int)(FILE_PREALLOC_SIZE / sizeof(buf)); ++i) + fat_write_file(fd, (void *)buf, sizeof(buf)); -#endif + int32_t offset = 0; + fat_seek_file(fd, &offset, FAT_SEEK_SET); + LED_OFF(); + } + #endif while (1) { - size_t size; - char buf[128]; - bool sync_pending = false; - if ((size = ser_read(&ser, buf, sizeof(buf))) != 0) { LED_ON();