Okay I have the working code that
1. cycles through the code for at the moment 10 seconds.
2. Pings a for a local internet connection.
3. If found it will check for *.CSV files on the SD card.
4. Uploads any CSV file to a server.
5. Deletes the file from the SD card once uploaded.
6. Restarts Cycle.
The only final issues I have is if the internet connection is lost when it has started the read *.CSV or FTP it does not time out.
Any ides how to add this in to ftp section ?
Once I have worked this out I have every thing I need and it is all done and dusted
#include <SdFat.h>
#include <SdFatUtil.h>
#include <SdFile.h>
#include <SPI.h>
#include <Ethernet.h>
#include <ICMPPing.h>
// comment out next line to write to SD from FTP server
#define FTPWRITE
#define error(s) error_P(PSTR(s))
SOCKET pingSocket = 0;
// this must be unique
byte mac[] = {
0x90, 0xA2, 0xDA, 0x00, 0x59, 0x67 };
// change to your network settings
IPAddress ip( 192, 168, 3, 177 );
IPAddress gateway( 192, 168, 3, 254 );
IPAddress subnet( 255, 255, 255, 0 );
byte pingAddr[] = {
192,168,3,254}; // ip address to ping
// SD chip select pin
const uint8_t chipSelect = SS;
// file system object
SdFat sd;
SdFile uploadfile;
uint16_t count; // count of files
int const file_size =13;
char fname[file_size];
char dname[file_size];
//char file_list[13] = "10000219.CSV";
char fileName[13] = "10000221.CSV";
char *CSV_EXT = "CSV";
char pingbuffer [256];
#define SD_SELECT 4
/************ SDCARD STUFF ************/
Sd2Card card;
SdVolume volume;
SdFile root;
SdFile dfile;
SdBaseFile ufile;
// change to your server
//IPAddress server(serverName);
char serverName[] = "update.ftp.com.au";
EthernetClient client;
EthernetClient dclient;
char outBuf[128];
char outCount;
int CYCCount = 0;
byte pingcount=0;
byte pingfail=0;
// change fileName to your file (8.3 format!)
//char fileName[13] = "10000219.CSV";
ArduinoOutStream cout(Serial);
//...............errors..................
void error_P(const char* str) {
PgmPrint("error: ");
SerialPrintln_P(str);
if (card.errorCode()) {
PgmPrint("SD error: ");
Serial.print(card.errorCode(), HEX);
Serial.print(',');
Serial.println(card.errorData(), HEX);
}
while(1);
}
void setup()
{
Serial.begin(9600);
pinMode(10,OUTPUT);
digitalWrite(10,HIGH);
if(sd.begin(4) == 0)
{
Serial.println("SD init fail");
}
PgmPrint("Free RAM: ");
Serial.println(FreeRam());
// initialize the SD card at SPI_HALF_SPEED to avoid bus errors with
// breadboards. use SPI_FULL_SPEED for better performance.
// if (!card.init(SPI_HALF_SPEED))
pinMode(10, OUTPUT); // set the SS pin as an output (necessary!)
digitalWrite(10, HIGH); // but turn off the W5100 chip!
if (!card.init(SPI_HALF_SPEED, 4)) error("card.init failed!");
// initialize a FAT volume
if (!volume.init(&card)) error("vol.init failed!");
PgmPrint("Volume is FAT");
Serial.println(volume.fatType(),DEC);
Serial.println();
if (!root.openRoot(&volume)) error("openRoot failed");
// list file in root with date and size
PgmPrintln("Files found in root:");
root.ls(LS_DATE | LS_SIZE);
Serial.println();
// Recursive list of all directories
PgmPrintln("Files found in all dirs:");
root.ls(LS_R);
Serial.println();
PgmPrintln("Done");
Ethernet.begin(mac, ip, gateway, gateway, subnet);
digitalWrite(10,HIGH);
delay(2000);
}
void loop()
{
if ( CYCCount >= 1000)
{
bool pingRet;
ICMPPing ping(pingSocket);
pingRet = ping(3, pingAddr, pingbuffer);
Serial.println(pingbuffer);
if(pingRet) // Failure
{
Serial.println("pingSuccess");
pingcount = pingcount +1;
}
else
{
Serial.println("pingfail");
pingfail = pingfail +1;
}
if (pingcount >=10)
{
Serial.println("FTP upload Started ");
sd.vwd()->rewind();
callfile();
CYCCount = CYCCount =0;
pingcount =pingcount =0;
}
if (pingfail >=1)
{
pingcount =pingcount =0;
pingfail = pingfail =0;
CYCCount = CYCCount =0;
}
}
Serial.println(CYCCount);
CYCCount =CYCCount +1 ;
}
//***************************************** voids******************************************//
void callfile()
{
Serial.println("Call File");
count = 0;
while (uploadfile.openNext(sd.vwd(), O_READ))
{
if (uploadfile.isFile())
{
uploadfile.getFilename(fname);
if (strcmp(CSV_EXT, &fname[strlen(fname)-strlen(CSV_EXT)]) == 0){
Serial.println(fname);
doFTP();
todelete();
count++;
}
}
delay (1000);
uploadfile.close();
}
}
void todelete()
{
if (strcmp(fname,fileName) == 0){
Serial.println("Working File");
uploadfile.close();
}
else
{
uploadfile.close();
if (dfile.open(&root, fname, O_RDWR))
dfile.remove() ;
Serial.println("----------------------------------------------------------->File To Be Deleted");
}
}
byte doFTP()
{
Serial.println("SD opened");
if (client.connect(serverName,21)) {
Serial.println("Command connected");
}
else {
ufile.close();
Serial.println("Command connection failed");
return 0;
}
if(!eRcv()) return 0;
client.write("USER Username\r\n"); // change your username here
if(!eRcv()) return 0;
client.write("PASS password\r\n"); // change your password here
if(!eRcv()) return 0;
client.write("SYST\r\n");
if(!eRcv()) return 0;
client.write("PASV\r\n");
if(!eRcv()) return 0;
char *tStr = strtok(outBuf,"(,");
int array_pasv[6];
for ( int i = 0; i < 6; i++) {
tStr = strtok(NULL,"(,");
array_pasv[i] = atoi(tStr);
if(tStr == NULL)
{
Serial.println("Bad PASV Answer");
}
}
unsigned int hiPort,loPort;
hiPort = array_pasv[4] << 8;
loPort = array_pasv[5] & 255;
Serial.print("Data port: ");
hiPort = hiPort | loPort;
Serial.println(hiPort);
if (dclient.connect(serverName,hiPort)) {
Serial.println("Data connected");
}
else {
Serial.println("Data connection failed");
client.stop();
ufile.close();
return 0;
}
Serial.println("open file");
ufile.open(fname,O_READ);
client.write("STOR ");
client.println(fname);
if(!eRcv())
{
dclient.stop();
return 0;
}
Serial.println("Writing");
byte clientBuf[64];
int clientCount = 0;
while(ufile.available())
{
clientBuf[clientCount] = ufile.read();
clientCount++;
if(clientCount > 63)
{
Serial.println("Packet");
dclient.write(clientBuf,64);
clientCount = 0;
}
}
if(clientCount > 0) dclient.write(clientBuf,clientCount);
dclient.stop();
Serial.println("Data disconnected");
if(!eRcv()) return 0;
client.write("QUIT\r\n");
if(!eRcv()) return 0;
client.stop();
Serial.println("Command disconnected");
ufile.close();
Serial.println("SD closed");
return 1;
}
byte eRcv()
{
byte respCode;
byte thisByte;
while(!client.available()) delay(1);
respCode = client.peek();
outCount = 0;
while(client.available())
{
thisByte = client.read();
Serial.write(thisByte);
if(outCount < 127)
{
outBuf[outCount] = thisByte;
outCount++;
outBuf[outCount] = 0;
}
}
if(respCode >= '4')
{
efail();
return 0;
}
return 1;
}
void efail()
{
byte thisByte = 0;
client.write("QUIT\r\n");
while(!client.available()) delay(1);
while(client.available())
{
thisByte = client.read();
Serial.write(thisByte);
}
client.stop();
Serial.println("Command disconnected");
ufile.close();
Serial.println("SD closed");
}