Log data to a micro SD card.
Dependencies: SDFileSystem mbed
Log.cpp
- Committer:
- onaka
- Date:
- 2015-05-04
- Revision:
- 1:c5e56e2580bf
File content as of revision 1:c5e56e2580bf:
#include "Log.h"
Log::Log(PinName rx, PinName tx, PinName mosi, PinName miso, PinName sck, PinName cs, const char* name) :
_device(rx, tx), _sd(mosi, miso, sck, cs, name){
buf_send.initialize_buffer();
_device.attach(this, &Log::int_serial_tx, Serial::TxIrq);
}
int Log::initialize_sdlog(const char* str){
char filename[15];
int n = find_last();
if(n < 0) return 0;
//ログ番号を+1してファイルを新規作成
//ファイル名は"logXXX.csv"
sprintf(filename, "/sd/log%03d.csv", n+1);
fp = fopen(filename, "w");
_device.printf(str);
fprintf(fp, str);
return 1;
}
void Log::close(){
wait(0.5);
fclose(fp);
}
//SDカード内からログ番号の最大値を取得する関数
int Log::find_last() {
int i, n = 0;
char c;
DIR *dp;
struct dirent *dirst;
dp = opendir("/sd/");
if (!dp){
printf("Could not open directry\n");
return -1;
}
while((dirst = readdir(dp)) != NULL) {
if(sscanf(dirst->d_name, "log%03d.csv%c", &i, &c) == 1 && i>n) {
n = i;
}
}
closedir(dp);
return n;
}
void Log::puts(const char* str){
int16_t len=strlen(str);
int16_t capa=buf_send.buffer_capacity();
bool empty=buf_send.is_buffer_empty();
char ch;
if(len>capa){
len=capa;
}
buf_send.write_buffer((const uint8_t*)str, 0, len);
if((_device.writeable()) && (empty)){
ch=buf_send.read_buffer_byte();
_device.putc(ch);
fputc(ch, fp);
}
}
void Log::putc(char ch){
int16_t capa=buf_send.buffer_capacity();
if(capa==0) return;
buf_send.write_buffer_byte(ch);
}
void Log::write_data(uint8_t* buf, int16_t size){
int capa=buf_send.buffer_capacity();
if(size>capa){
size=capa;
}
buf_send.write_buffer(buf, 0, size);
}
bool Log::is_empty(){
return buf_send.is_buffer_empty();
}
int16_t Log::recieve_buffer_size(){
return buf_recieve.buffer_size();
}
int16_t Log::getc(){
if(buf_recieve.is_buffer_empty()){
return -1;
}
return buf_recieve.read_buffer_byte();
}
int16_t Log::read_data(uint8_t* buf, int16_t size){
int len=buf_recieve.buffer_size();
if(size>len){
size=len;
}
buf_recieve.read_buffer(buf, 0, size);
return size;
}
char Log::int_tx(){
return buf_send.read_buffer_byte();
}
void Log::int_serial_tx(){
char ch;
while((_device.writeable()) && (buf_send.is_buffer_empty()==false)){
ch=buf_send.read_buffer_byte();
_device.putc(ch);
fputc(ch, fp);
}
}