package org.spin.gaitlib.util; import android.os.Environment; import android.util.Log; import java.io.File; import java.io.FileNotFoundException; import java.io.PrintWriter; import java.text.DateFormat; import java.text.SimpleDateFormat; import java.util.Date; /** * A logger for GaitLib, recording raw sensor data, cadence and gait calculation results in CSV log * form. Write to the log by calling one of the print functions. * * @author Mike */ public class Logger { private static final String TAG = "GaitLibLogger"; private static final String FOLDER_NAME = "gaitlib"; private static final String SUBFOLDER_PREFIX = "gaitlib_"; private static final String DEFAULT_FILENAME_EXTENSION = ".csv"; private final String filename; private final String filenameExtension; private final String headerLine; private PrintWriter printWriter = null; private boolean isEnabled = false; /** * Create a logger. Log files are in CSV format and stored at * gaitlib/gaitlib_yyyy-MM-dd/filename_yyyy-MM-dd_hh-mm-ss.csv * * @param filename * @param filenameExtension in the format of ".csv". * @param headerLine Header in CSV format. */ public Logger(String filename, String filenameExtension, String headerLine) { this.filename = filename; this.filenameExtension = filenameExtension != null ? filenameExtension : DEFAULT_FILENAME_EXTENSION; this.headerLine = headerLine; } /** * Close writing current file and start logging on a new file. */ public void reset() { close(); initPrintWriter(); } /** * @return <code>true</code> if PrintWriter is created successfully, <code>false</code> * otherwise. */ private boolean initPrintWriter() { DateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd"); DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd_HH-mm-ss"); Date date = new Date(); String dirString = FOLDER_NAME + "/" + SUBFOLDER_PREFIX + simpleDateFormat.format(date); File dir = new File(Environment.getExternalStorageDirectory() + "/" + dirString); if (!dir.exists() && !dir.mkdirs()) { Log.v(TAG, "Couldn't create directory for log files."); } String fileString = dateFormat.format(date) + filenameExtension; if (filename != null && filename.length() > 0) { fileString = filename + "_" + fileString; } File logFile = new File(dir, fileString); try { printWriter = new PrintWriter(logFile); if (headerLine != null && headerLine.length() > 0) { printWriter.print(headerLine); printWriter.print("\n"); } return true; } catch (FileNotFoundException e) { Log.v(TAG, e.toString()); return false; } } public void print(long timestamp, String value) { if (!isEnabled) { return; } printWriter.printf("%f," + value + "\n", timestamp); } public void print(long timestamp, String[] values) { if (!isEnabled) { return; } printWriter.printf("%f,", timestamp); printRow(values); } public void printTable(String[][] table) { if (!isEnabled) { return; } for (String[] row : table) { printRow(row); } } public void printRow(String[] row) { if (!isEnabled) { return; } for (int i = 0; i < row.length; i++) { if (i < row.length - 1) { printWriter.print(row[i] + ","); } else { printWriter.print(row[i]); } } printWriter.print("\n"); } public void printColumn(String[] column) { if (!isEnabled) { return; } for (int i = 0; i < column.length; i++) { printWriter.println(column[i]); } } public void close() { if (isEnabled) { printWriter.close(); } } public boolean isEnabled() { return isEnabled; } public void setEnabled(boolean enabled) { if (this.isEnabled == enabled) { return; } if (enabled) { boolean success = initPrintWriter(); if (!success) { return; } } else { close(); } this.isEnabled = enabled; } }