Files @ 28bdbd881b55
Branch filter:

Location: seniordesign-firmware/master/master/lib/logger.c

ethanzonca@CL-SEC241-08.cedarville.edu
Added looptime and other optimizations. LoopTime interrupt is firing, but incrementing may or may not work.
/*
 * CFile1.c
 *
 * Created: 11/7/2012 8:05:44 PM
 *  Author: mkanning
 */ 

#include "../config.h"
#include <util/delay.h>
#include <string.h>
#include <avr/pgmspace.h>
#include <avr/sleep.h>
#include <avr/eeprom.h>
#include <string.h>
#include "sd/fat.h"
#include "sd/fat_config.h"
#include "sd/partition.h"
#include "sd/sd_raw.h"
#include "sd/sd_raw_config.h"
#include "logger.h"


/* 
	//config edits
  * By changing the MCU* variables in the Makefile, you can use other Atmel
  * microcontrollers or different clock speeds. You might also want to change
  * the configuration defines in the files fat_config.h, partition_config.h,
  * sd_raw_config.h and sd-reader_config.h. For example, you could disable
  * write support completely if you only need read support.
 */


struct partition_struct* partition;
struct fat_fs_struct* fs;
struct fat_dir_entry_struct directory;
struct fat_dir_struct* dd;
struct fat_file_struct* fd;

void logger_setup()
{

	if(!sd_raw_init())
	{
		// initialization failed
		return;
	}

	// TODO: Check SD card switch to see if inserted.
	// this was included in the library, but is commented out right now
	
	// Open first partition
	partition = partition_open(sd_raw_read, sd_raw_read_interval, sd_raw_write, sd_raw_write_interval, 0);
	
	// Check that partition was created correctly
	if(!partition)
	{
		// error
		// 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, sd_raw_write, sd_raw_write_interval, -1);
		if(!partition)
		{
			// opening partition failed
			return;
		}
	}
	
	
	// Open FAT filesystem
	fs = fat_open(partition);
	if(!fs)
	{
		// opening filesystem failed
		return;
	}
	
	// Open directory
	fat_get_dir_entry_of_path(fs, "/", &directory);

	dd = fat_open_dir(fs, &directory);
	if(!dd)
	{
		// opening root directory failed
		_delay_ms(10);
		return;
	}
	
		
	// Create new log file
	uint8_t logid = eeprom_read_byte(LOGGER_ID_EEPROM_ADDR);
	char filename[48];
	
	// we pre-increment logid here because it starts at 255, then wraps to 0
	sprintf(filename, "data%d.csv",++logid);
	
	// TODO: Catch errors here
	fat_create_file(dd, filename, &directory);
		
	eeprom_update_byte(LOGGER_ID_EEPROM_ADDR, logid);

	// Search for file in current directory and open it
	fd = open_file_in_dir(fs, dd, filename);
	if(!fd)
	{
		_delay_ms(10);
		return;
	}
	
	// Seek to beginning of file
	// TODO: Is this needed?
	int32_t offset = 0; 
	if(!fat_seek_file(fd, &offset, FAT_SEEK_SET))
	{
		// Error seeking to file
		_delay_ms(10);
		fat_close_file(fd);
		return;
	}
		
	// Write header information
	logger_log(LOGGER_HEADERTEXT);
	logger_log("\n-- BEGIN DATA --\n");
	logger_log("C1, C2, C3, C4, C5, C6\n");
	
}	

void logger_log(char *buffer) {
	uint8_t len = strlen(buffer);
	if(fat_write_file(fd, (uint8_t*) buffer, len) != len)
	{
		// Error writing to file
		return;
	}
}

void logger_closeLog() {
	fat_close_file(fd);
	fat_close_dir(dd);
	fat_close(fs);
	partition_close(partition);
}






// INTERNAL FUNCTIONS

// Opens a file so it can be read/written
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);
}

// Searches for file in directory listing
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)
{
	while(fat_read_dir(dd, dir_entry))
	{
		if(strcmp(dir_entry->long_name, name) == 0)
		{
			fat_reset_dir(dd);
			return 1;
		}
	}
	return 0;
}