#define msGetData 3000 // milliseconds to get data
#define maxTxSize 1500 // max transmit byte size
// network
uint8_t destination[8] = {0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF};
uint8_t PANID[2] = {0x12,0x34};
// data variables
char* filename = "YYMMDDHHMM.txt"; // format of each filename
char** data;
int maxDataSize = 0;
int sizePerSave = 50;
int lenFilename = 0;
int index = 0;
void setup()
{
USB.begin();
RTC.ON();
ACC.ON();
delay(500);
printMem();
// will use GPS instead of RTC
// 2011, dec, 21, wednesday, 6 pm, 00 min, 00 sec
RTC.setTime( 11, 12, 21, 4, 18, 0, 0 );
delay(500);
lenFilename = strlen(filename);
filename = getFile();
USB.print("filename = ");
USB.println(filename);
//SD.del( filename );
//SD.OFF();
// get sizePerSave
printMem();
//char* save;
//save = getData();
sizePerSave = strlen( getData() ) + 2;
//free(save);
//save = NULL;
printMem();
maxDataSize = maxTxSize / sizePerSave;
maxDataSize = 10;
printMem();
data = (char**) calloc(maxDataSize, sizeof(char*));
printMem();
// create # array elements to append the SD card with
//for (int j = 0; j < maxDataSize; j++)
// data[ j ] = (char*) calloc(sizePerSave, sizeof(char*));
USB.print("sizePerSave = ");
USB.print( sizePerSave, DEC );
USB.print(" | maxDataSize = ");
USB.print( maxDataSize, DEC );
USB.print(" | maxTxSize = ");
USB.println( maxTxSize, DEC );
}
void loop()
{
USB.println("********");
USB.print("index = ");
USB.println(index, DEC);
printMem();
// get data
data[ index ] = (char*) getData();
USB.print("Data: ");
USB.println( data[ index ] );
index += 1;
//filesize += sizePerSave;
//USB.print("Filesize: ");
//USB.println(filesize, DEC);
// if filesize is too great
// send it and create a new file
//if (filesize > maxTxSize)
if ( index >= maxDataSize )
{
USB.println("index >= maxDataSize");
printMem();
SD.ON();
saveToSD();
/*
// send data out
xbeeDM.ON();
connectToNetwork();
if (sendFile() == 1)
USB.println("Data sent successfully.");
else
USB.println("Data failed to send.");
xbeeDM.OFF();
*/
//USB.println(SD.ls());
/*
// check if there isn't any disk space for another file
if (SD.getDiskFree() < maxTxSize)
{
// delete the 20 oldest files
// array = SD.ls();
// for (i=0;i<n;i++) { SD.del( array(i) ); }
//char* arrLS = SD.ls();
for (int j = 0; j < 20; j++)
SD.del( SD.ls(0) );
USB.println(SD.ls());
//free(arrLS);
}
*/
SD.OFF();
printMem();
/*char* newFilename;
newFilename = getFile();
//USB.println( newFilename );
// if it's a different filename...
if (newFilename != filename)
filename = newFilename;
free( newFilename );
newFilename = NULL;*/
for (int j = 0; j < maxDataSize; j++)
{
free(data[ j ]);
data[ j ] = NULL;
}
free(data);
data = NULL;
data = (char**) calloc(maxDataSize, sizeof(char*));
index = 0;
USB.flush();
printMem();
}
delay( msGetData );
}
char* getData()
{
//char* result="\0 " ;
char* result;
result = (char*) calloc(sizePerSave, sizeof(char*));
//sprintf(result,"%02d%02d,x=%d,y=%d,z=%d,temp=%d,bat=%d%c%c%c",RTC.hour,RTC.minute,ACC.getX(),ACC.getY(),ACC.getZ(),RTC.getTemperature(),PWR.getBatteryLevel(),'%','\r','\n');
sprintf(result,"**%02d%02d,x=%d,y=%d,z=%d,temp=%d,bat=%d\%\n",RTC.hour,RTC.minute,ACC.getX(),ACC.getY(),ACC.getZ(),RTC.getTemperature(),PWR.getBatteryLevel());
//USB.println( result );
return result;
}
// determine the next file
char* getFile()
{
RTC.getTime(); // update time
//char* result1="\0 " ;
char* result1;
result1 = (char*) calloc(lenFilename, sizeof(char*));
// YYYYMMDDHHMMSS
//sprintf(result, "%04d%02d%02d%02d%02d%02d.txt",RTC.year + 2000,RTC.month,RTC.date,RTC.hour,RTC.minute,RTC.second);
// YYYYMMDDHHMM
sprintf(result1, "%04d%02d%02d%02d%02d.txt",RTC.year + 2000,RTC.month,RTC.date,RTC.hour,RTC.minute);
return result1;
}
int saveToSD()
{
USB.print("filename*** = ");
USB.println(filename);
if (SD.isFile(filename) == -1)
{
USB.println("File does not exist. Attempting to create...");
if(SD.create(filename))
{
USB.print("Created ");
USB.println(filename);
}
else
USB.println("Failed to create.");
}
else
USB.println("File already exists.");
// if file exists, append it
if (SD.isFile(filename) == 1)
{
USB.println("Attempting to append file...");
for (int j = 0; j < maxDataSize; j++)
if(SD.appendln(filename, data[ j ]))
{
USB.print("Added data[ ");
USB.print(j, DEC);
USB.print(" ] = ");
USB.println( data[ j ] );
}
else
{
USB.print("Failed to add data[ ");
USB.print( j, DEC );
USB.print(" ] = ");
USB.println( data[ j ] );
}
}
else
USB.println("File still does not exist.");
}
void printMem()
{
USB.print("Memory: ");
USB.println( freeMemory() );
}