/*
Attempt 2
+ Join or create a secure network
+ Broadcast data to all nodes
+ Create filename depending on the time
+ time uses RTC
- time will use GPS time
+ add data to file
+ create new file on each day
- check if space is available
- if not, delete the oldest file (or last 10 oldest)
*/
#define ORIG "OceanWasp10" // name of this node
#define KEY "waspmote12345678" // security key
#define MS_MINI_DELAY 50 // milliseconds for each mini delay. Mini delay is needed after starting components as a safety
#define MAX_TX_SIZE 1500
// network
uint8_t destination[8] = {0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF};
uint8_t PANID[2] = {0x12,0x34};
char* filename = "YYYY-MM-DD.txt";
char* data;
int lastDate = 0;
int numLoop = 0;
// connect to a secure network
// returns 0 if no error, 1 is there is an error
int connectToNetwork()
{
// Chosing a channel : channel 0x0A
xbeeDM.setChannel(0x0A);
if( xbeeDM.error_AT ) XBee.println("Error while changing channel");
// Chosing a PANID : PANID=0x1234
xbeeDM.setPAN(PANID);
if( xbeeDM.error_AT ) XBee.println("Error while changing PANID");
// Enabling security
xbeeDM.encryptionMode(1);
if( xbeeDM.error_AT ) XBee.println("Error while enabling security");
xbeeDM.setLinkKey(KEY);
if( xbeeDM.error_AT ) XBee.println("Error while setting Key");
// Set Node name
xbeeDM.setNodeIdentifier(ORIG);
if( xbeeDM.error_AT ) XBee.println("Error while setting Node name");
// Keep values
xbeeDM.writeValues();
if( xbeeDM.error_AT ) XBee.println("Error while storing values");
return xbeeDM.error_AT;
}
// send out a packetized string of data
int sendpaq(char* msg)
{
packetXBee* paq_sent;
paq_sent=(packetXBee*) calloc(1,sizeof(packetXBee));
paq_sent->mode=BROADCAST;
paq_sent->MY_known=0;
paq_sent->packetID=0x52;
paq_sent->opt=0;
xbeeDM.hops=0;
xbeeDM.setOriginParams(paq_sent, ORIG, NI_TYPE);
xbeeDM.setDestinationParams(paq_sent, destination, msg, MAC_TYPE, DATA_ABSOLUTE);
int state = xbeeDM.sendXBee(paq_sent);
free(paq_sent);
paq_sent = NULL;
return state;
}
// show available memory
void printMem()
{
USB.print("Memory: ");
USB.println( freeMemory() );
}
// get data and return it
char* getData()
{
sprintf(data,"time=%02d:%02d:%02d,x=%d,y=%d,z=%d,temp=%d,bat=%d%c%c",RTC.hour,RTC.minute,RTC.second,ACC.getX(),ACC.getY(),ACC.getZ(),(int) RTC.getTemperature(),PWR.getBatteryLevel(),'\r','\n');
return data;
}
char* getFileName()
{
RTC.getTime(); // update time
delay(MS_MINI_DELAY);
sprintf(filename, "20%02d-%02d-%02d.txt",RTC.year,RTC.month,RTC.date);
return filename;
}
int saveToSD()
{
int newDate = RTC.date;
if (newDate != lastDate)
{
lastDate = newDate;
filename = getFileName();
delay(MS_MINI_DELAY);
}
USB.print("Filename: ");
USB.println(filename);
delay(MS_MINI_DELAY);
// if file does not exist, create it
if(SD.isFile(filename) == -1)
{
USB.println("File does not exist. Attempting to create...");
delay(MS_MINI_DELAY);
while (!SD.create(filename))
{
USB.print("Could not create file: ");
USB.println(filename);
delay(MS_MINI_DELAY);
}
USB.print("File created: ");
USB.println(filename);
delay(MS_MINI_DELAY);
}
else
USB.println("File name exists.");
// if the disk free is less than the maximum
// transmit size, then delete the oldest 20 files
if (SD.getDiskFree() < MAX_TX_SIZE)
{
USB.println( SD.ls() );
for (int j = 0; j < 20; j++)
SD.del( SD.ls(0) );
USB.println( SD.ls() );
}
if(SD.isFile(filename) == 1)
{
USB.println("Appending...");
while (!SD.appendln(filename, data))
{
USB.println("- Failed to add");
delay(MS_MINI_DELAY);
}
USB.println("+ Added!");
USB.print("New filesize: ");
USB.println( SD.getFileSize( filename ) );
USB.print("Disk free: ");
USB.println(SD.getDiskFree());
return 1;
}
else
{
USB.println("Unknown error.");
return 0;
}
}
void setup()
{
xbeeDM.init(DIGIMESH,FREQ900M,NORMAL);
delay(MS_MINI_DELAY);
xbeeDM.ON();
delay(MS_MINI_DELAY);
RTC.ON();
delay(MS_MINI_DELAY);
RTC.setTime( 12, 07, 25, 6, 10, 30, 0 );
delay(MS_MINI_DELAY);
lastDate = RTC.date;
ACC.ON();
delay(MS_MINI_DELAY);
SD.ON();
delay(MS_MINI_DELAY);
USB.begin();
delay(MS_MINI_DELAY);
USB.println("Connecting...");
while (connectToNetwork() > 0)
{
USB.println("fail");
delay(MS_MINI_DELAY);
}
USB.println("Connected!");
USB.println("Init data");
printMem();
data = (char*) calloc(50, sizeof(char*));
int size = strlen( getData() ) + 2;
free(data);
data = NULL;
printMem();
data = (char*) calloc(size, sizeof(char*));
printMem();
USB.println("Init filename");
/*filename = (char*) calloc(50, sizeof(char*));
size = strlen( getFileName() ) + 2;
free(filename);
filename = NULL;
printMem();
filename = (char*) calloc(size, sizeof(char*));*/
//free(filename);
//filename = NULL;
getFileName();
printMem();
}
void loop()
{
USB.print("Loop: ");
USB.println( numLoop );
delay(MS_MINI_DELAY);
data = getData();
sendpaq( data );
delay(MS_MINI_DELAY);
saveToSD();
delay(MS_MINI_DELAY);
printMem();
delay(MS_MINI_DELAY);
USB.flush();
delay(MS_MINI_DELAY);
XBee.flush();
numLoop += 1;
USB.println();
delay(1000);
}