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); } }