@Override
 public void onNewShieldFrameReceived(ShieldFrame frame) {
   if (frame.getShieldId() == UIShield.DATA_LOGGER.getId()) {
     switch (frame.getFunctionId()) {
       case START_LOGGING:
         if (frame.getArguments().size() > 0) fileName = frame.getArgumentAsString(0);
         else fileName = null;
         headerList = new CopyOnWriteArrayList<String>();
         dataSet = new ArrayList<Map<String, String>>();
         rowData = new HashMap<String, String>();
         currentStatus = LOGGING;
         isStarted = true;
         if (eventHandler != null) {
           eventHandler.onStartLogging();
         }
         break;
       case STOP_LOGGING:
         saveData();
         break;
       case ADD_STRING:
         if (isStarted) {
           currentStatus = LOGGING;
           String key = frame.getArgumentAsString(0);
           String value = frame.getArgumentAsString(1);
           if (!headerList.contains(key)) headerList.add(key);
           rowData.put(key, value);
           if (eventHandler != null) {
             eventHandler.onAdd(key, value);
           }
         }
         break;
       case ADD_FLOAT:
         if (isStarted) {
           currentStatus = LOGGING;
           String keyFloat = frame.getArgumentAsString(0);
           String valueFloat = frame.getArgumentAsFloat(1) + "";
           if (!headerList.contains(keyFloat)) headerList.add(keyFloat);
           rowData.put(keyFloat, valueFloat);
           if (eventHandler != null) {
             eventHandler.onAdd(keyFloat, valueFloat);
           }
         }
         break;
       case LOG:
         if (isStarted) {
           currentStatus = LOGGING;
           if (eventHandler != null) {
             eventHandler.onLog(new HashMap<>(rowData));
           }
           if (!headerList.contains("Time")) headerList.add("Time");
           rowData.put(
               "Time",
               new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS", Locale.US)
                   .format(new Date())
                   .toString());
           // rowData.remove("Time");
           dataSet.add(new HashMap<>(rowData));
           rowData = new HashMap<>();
         }
         break;
       default:
         break;
     }
   }
 }
  private void saveData() {
    if (isStarted) {
      isStarted = false;
      ICsvMapWriter mapWriter = null;
      try {
        currentStatus = STOPPED_LOGGING;
        if (eventHandler != null) {
          eventHandler.onStopLogging(dataSet);
        }
        File folder = new File(Environment.getExternalStorageDirectory() + "/OneSheeld");
        if (!folder.exists()) {
          folder.mkdirs();
        }
        folder = new File(Environment.getExternalStorageDirectory() + "/OneSheeld/DataLogger");
        if (!folder.exists()) {
          folder.mkdirs();
        }
        mapWriter =
            new CsvMapWriter(
                new FileWriter(
                    Environment.getExternalStorageDirectory()
                        + "/OneSheeld/DataLogger/"
                        + (fileName == null || fileName.length() == 0
                            ? new Date().getTime() + ""
                            : fileName + " - " + new Date().getTime())
                        + ".csv"),
                CsvPreference.STANDARD_PREFERENCE);
        final CellProcessor[] processors = new CellProcessor[headerList.size()];
        for (int i = 0; i < processors.length; i++) {
          processors[i] = new Optional();
        }

        // write the header
        header = new String[headerList.size()];
        int i = 0;
        for (String headerItem : headerList) {
          header[i] = headerItem;
          i++;
        }
        mapWriter.writeHeader(header);

        // write the customer Maps
        for (Map<String, String> value : dataSet) {
          mapWriter.write(value, header, processors);
        }
      } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
      } finally {
        if (mapWriter != null) {
          try {
            mapWriter.close();
          } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
          }
          // reset();
        }
      }
    }
  }