/*
 * Calculate the sum and average of a list of floating point numbers
 */
#include <SPI.h>
#include <SdFat.h>

// SD chip select pin
const uint8_t chipSelect = SS;

// object for the SD file system
SdFat sd;

// define a serial output stream
ArduinoOutStream cout(Serial);
//------------------------------------------------------------------------------
void writeTestFile() {
  // open the output file
  ofstream sdout("AvgTest.txt");

  // write a series of float numbers
  for (int16_t i = -1001; i < 2000; i += 13) {
    sdout << 0.1 * i << endl;
  }
  if (!sdout) {
    sd.errorHalt("sdout failed");
  }

  sdout.close();
}
//------------------------------------------------------------------------------
void calcAverage() {
  uint16_t n = 0;  // count of input numbers
  double num;      // current input number
  double sum = 0;  // sum of input numbers

  // open the input file
  ifstream sdin("AvgTest.txt");

  // check for an open failure
  if (!sdin) {
    sd.errorHalt("sdin failed");
  }

  // read and sum the numbers
  while (sdin >> num) {
    n++;
    sum += num;
  }

  // print the results
  cout << "sum of " << n << " numbers = " << sum << endl;
  cout << "average = " << sum/n << endl;
}
//------------------------------------------------------------------------------
void setup() {
  Serial.begin(9600);
  while (!Serial) {}  // wait for Leonardo

  // F() stores strings in flash to save RAM
  cout << F("Type any character to start\n");
  while (Serial.read() <= 0) {}
  delay(400);  // Catch Due reset problem

  // initialize the SD card at SPI_HALF_SPEED to avoid bus errors with
  // breadboards.  use SPI_FULL_SPEED for better performance.
  if (!sd.begin(chipSelect, SPI_HALF_SPEED)) {
    sd.initErrorHalt();
  }

  // write the test file
  writeTestFile();

  // read the test file and calculate the average
  calcAverage();
}
//------------------------------------------------------------------------------
void loop() {}
