Re: SD.remove either complains during compile or crashes
Posted: Mon Oct 16, 2017 5:06 pm
I posted the salient bits. But if you want the rest, here it is. I have been on this project for a couple of months. So, yes, I have selected the WeMos D1 Mini. I have restarted the IDE. I have rebooted. This is a little test bed not the full project but it shows the deprecation error and crashes on me quite dependably.
Code: Select all
#include <SD.h>
#include <ESP8266WebServer.h>
#include <SPI.h>
#include <IPAddress.h>
/* How IPAddress is defined in IPAddress.h */
//class IPAddress: public Printable
//{
//private:
// union {
// uint8_t bytes[4]; // IPv4 address
// uint32_t dword;
// } _address;
//
// // Access the raw byte array containing the address. Because this returns a pointer
// // to the internal structure rather than a copy of the address this function should only
// // be used when you know that the usage of the returned uint8_t* will be transient and not
// // stored.
// uint8_t* raw_address()
// {
// return _address.bytes;
// }
#define MAX_CALLERS 300
typedef struct
{
IPAddress iaddr; // Little Endian
IPAddress iaddrBE; // Big Endian
long count;
} IPCallers;
IPCallers MyCallers[MAX_CALLERS];
IPCallers SDRead[MAX_CALLERS];
int WebRequests;
const char *STestFN = "test.txt";
const char *StuctFN = "Struct.txt";
String buffer;
IPAddress ip1( 10, 210, 0, 1);
IPAddress ip2(201, 2, 200, 22);
IPAddress ip3(123, 211, 135, 003);
IPAddress ip4( 96, 4, 4, 4);
int iTemp;
bool SD_Valid = true; // Until proven otherwise.
#define chipSelect D8
// Pin used for CS for the SD shield.
IPAddress ipTemp, ipTempBE;
uint32_t myLocalIP;
File myFile;
void setup() {
//Open serial communications and wait for port to open:
Serial.begin(115200);
while (!Serial) {
;
}
Serial.print("\nInitializing SD card...");
if (!SD.begin(D8)) {
Serial.println("initialization failed!");
return;
}
Serial.println("initialization done.");
//Initialize fields
MyCallers[0].iaddr = ip1; MyCallers[1].iaddr = ip2;
MyCallers[2].iaddr = ip3; MyCallers[3].iaddr = ip4;
MyCallers[0].count = 10; MyCallers[1].count = 9;
MyCallers[2].count = 8; MyCallers[3].count = 7;
WebRequests = 4;
for (iTemp = 0; iTemp < WebRequests; iTemp++) {
MyCallers[iTemp].iaddrBE[0] = MyCallers[iTemp].iaddr[3];
MyCallers[iTemp].iaddrBE[1] = MyCallers[iTemp].iaddr[2];
MyCallers[iTemp].iaddrBE[2] = MyCallers[iTemp].iaddr[1];
MyCallers[iTemp].iaddrBE[3] = MyCallers[iTemp].iaddr[0];
}
PrintOrigStruct();
Serial.println("By Count Ascending");
SortCtA();
PrintOrigStruct();
Serial.println("By Count Descending");
SortCtD();
PrintOrigStruct();
Serial.println("By IP Ascending");
SortIPA();
PrintOrigStruct();
Serial.println("By IP Descending");
SortIPD();
PrintOrigStruct();
Serial.println("Checking if file exists and removing if so.");
if (SD.exists(STestFN))
{
Serial.println("File exists, removing it now."); yield();
SD.remove("test.txt");
}
//Open the file. Note that only one file can be open at a time,
//so you have to close this one before opening another.
myFile = SD.open(STestFN, FILE_WRITE);
//If the file opened okay, write to it:
if (myFile) {
Serial.print("Writing to test.txt...");
myFile.println("testing 1, 2, 3.");
//close the file
myFile.close();
Serial.println("done.");
} else {
//if the file didn't open, print an error
Serial.println("error opening test.txt");
}
//Now open the file for reading:
myFile = SD.open(STestFN);
if (myFile) {
Serial.println("Reading test.txt:");
//Read from the file until there's nothing else in it
while (myFile.available()) {
Serial.print(">"); Serial.print(myFile.readStringUntil('\n'));
}
// iTemp = myFile.read());
//Close the file
myFile.close();
} else {
//If the file didn't open, print an error
Serial.println("error opening test.txt");
}
WriteIP(); ReadIP();
}
void WriteIP() {
Serial.println("Testing if file exists."); yield();
if (SD.exists("Struct.txt"));
{
Serial.println("File exists, removing it now."); yield();
SD.remove("Struct.txt");
}
Serial.println("Opening file now."); yield();
File dataFile = SD.open(StuctFN, FILE_WRITE);
if (dataFile) { // Only try to write it if it opened successfully.
Serial.println("Writing file data 1.");
dataFile.println(WebRequests);
for (iTemp = 0; iTemp < WebRequests; iTemp++) {
// myLocalIP = (uint32_t) MyCallers[iTemp].iaddr;
Serial.print("Numeric version of MyCallers[itemp].iaddr = "); Serial.println(myLocalIP);
// dataFile.println(myLocalIP);
dataFile.println((uint32_t) MyCallers[iTemp].iaddr);
dataFile.println(MyCallers[iTemp].count);
}
dataFile.close(); yield();
} else { // or if datafile did not open...
Serial.print("Error opening "); Serial.println(STestFN); return;
} // if (datafile)}
}
void ReadIP() {
int linesToRead;
int linesRead = 0;
long ct;
myFile = SD.open(StuctFN);
if (myFile) {
Serial.println("Reading Struct.txt:");
//Read from the file until there's nothing else in it
// while (myFile.available()) Serial.write(myFile.read());
if (myFile.available()) {
buffer = myFile.readStringUntil('\n');
if (isValidNumber(buffer)) linesToRead = buffer.toInt();
Serial.print("Converted count: "); Serial.println(linesToRead);
}
while (myFile.available()) {
buffer = myFile.readStringUntil('\n');
//Read first IP as UL
Serial.print("Line read: '");Serial.print(buffer); Serial.println("'"); yield();
if (isValidNumber(buffer)) {
myLocalIP = buffer.toInt();
SDRead[linesRead].iaddr = (uint32_t)myLocalIP;
}
buffer = myFile.readStringUntil('\n');
//Read first count as int
Serial.print("Line read: '");Serial.print(buffer); Serial.println("'"); yield();
if (isValidNumber(buffer)) {
ct = buffer.toInt();
SDRead[linesRead].count = ct;
}
SDRead[linesRead].iaddrBE[0] = SDRead[linesRead].iaddr[3];
SDRead[linesRead].iaddrBE[1] = SDRead[linesRead].iaddr[2];
SDRead[linesRead].iaddrBE[2] = SDRead[linesRead].iaddr[1];
SDRead[linesRead].iaddrBE[3] = SDRead[linesRead].iaddr[0];
linesRead++;
}
//Close the file
myFile.close();
} else {
//If the file didn't open, print an error
Serial.println("error opening test.txt");
}
PrintReadStruct();
}
void PrintOrigStruct() {
for (iTemp = 0; iTemp < WebRequests; iTemp++) {
Serial.print(iTemp); Serial.print(">");
Serial.print(MyCallers[iTemp].iaddr); Serial.print("\t- ");
Serial.print(MyCallers[iTemp].iaddrBE); Serial.print("\t ts:");
Serial.print(MyCallers[iTemp].iaddrBE.toString());
Serial.print("\t("); Serial.print(MyCallers[iTemp].count);
Serial.println(" times.)"); yield();
}
}
void PrintReadStruct() {
for (iTemp = 0; iTemp < WebRequests; iTemp++) {
Serial.print(iTemp); Serial.print(">");
Serial.print(SDRead[iTemp].iaddr); Serial.print("\t- ");
Serial.print(SDRead[iTemp].iaddrBE); Serial.print("\t ts:");
Serial.print(SDRead[iTemp].iaddrBE.toString());
Serial.print("\t("); Serial.print(SDRead[iTemp].count);
Serial.println(" times.)"); yield();
}
}
void SortCtD() {
IPAddress ipTemp;
long ctTemp;
for (iTemp = 0; iTemp < (WebRequests - 1); iTemp++) {
for (int iSort = 0; iSort < WebRequests - iTemp - 1; iSort++) {
if (MyCallers[iSort].count < MyCallers[iSort + 1].count) {
ipTemp = MyCallers[iSort].iaddr;
ipTempBE = MyCallers[iSort].iaddrBE;
ctTemp = MyCallers[iSort].count;
MyCallers[iSort].iaddr = MyCallers[iSort + 1].iaddr;
MyCallers[iSort].iaddrBE = MyCallers[iSort + 1].iaddrBE;
MyCallers[iSort].count = MyCallers[iSort + 1].count;
MyCallers[iSort + 1].iaddr = ipTemp;
MyCallers[iSort + 1].iaddrBE = ipTempBE;
MyCallers[iSort + 1].count = ctTemp;
yield();
}
}
}
}
void SortCtA() {
IPAddress ipTemp;
long ctTemp;
for (iTemp = 0; iTemp < (WebRequests - 1); iTemp++) {
for (int iSort = 0; iSort < WebRequests - iTemp - 1; iSort++) {
if (MyCallers[iSort].count > MyCallers[iSort + 1].count) {
ipTemp = MyCallers[iSort].iaddr;
ipTempBE = MyCallers[iSort].iaddrBE;
ctTemp = MyCallers[iSort].count;
MyCallers[iSort].iaddr = MyCallers[iSort + 1].iaddr;
MyCallers[iSort].iaddrBE = MyCallers[iSort + 1].iaddrBE;
MyCallers[iSort].count = MyCallers[iSort + 1].count;
MyCallers[iSort + 1].iaddr = ipTemp;
MyCallers[iSort + 1].iaddrBE = ipTempBE;
MyCallers[iSort + 1].count = ctTemp;
yield();
}
}
}
}
void SortIPA() {
IPAddress ipTemp;
long ctTemp;
for (iTemp = 0; iTemp < (WebRequests - 1); iTemp++) {
for (int iSort = 0; iSort < WebRequests - iTemp - 1; iSort++) {
if (MyCallers[iSort].iaddrBE > MyCallers[iSort + 1].iaddrBE) {
ipTemp = MyCallers[iSort].iaddr;
ipTempBE = MyCallers[iSort].iaddrBE;
ctTemp = MyCallers[iSort].count;
MyCallers[iSort].iaddr = MyCallers[iSort + 1].iaddr;
MyCallers[iSort].iaddrBE = MyCallers[iSort + 1].iaddrBE;
MyCallers[iSort].count = MyCallers[iSort + 1].count;
MyCallers[iSort + 1].iaddr = ipTemp;
MyCallers[iSort + 1].iaddrBE = ipTempBE;
MyCallers[iSort + 1].count = ctTemp;
yield();
}
}
}
}
void SortIPD() {
IPAddress ipTemp;
long ctTemp;
for (iTemp = 0; iTemp < (WebRequests - 1); iTemp++) {
for (int iSort = 0; iSort < WebRequests - iTemp - 1; iSort++) {
if (MyCallers[iSort].iaddrBE < MyCallers[iSort + 1].iaddrBE) {
ipTemp = MyCallers[iSort].iaddr;
ipTempBE = MyCallers[iSort].iaddrBE;
ctTemp = MyCallers[iSort].count;
MyCallers[iSort].iaddr = MyCallers[iSort + 1].iaddr;
MyCallers[iSort].iaddrBE = MyCallers[iSort + 1].iaddrBE;
MyCallers[iSort].count = MyCallers[iSort + 1].count;
MyCallers[iSort + 1].iaddr = ipTemp;
MyCallers[iSort + 1].iaddrBE = ipTempBE;
MyCallers[iSort + 1].count = ctTemp;
yield();
}
}
}
}
boolean isValidNumber(String str){
for(byte i = 0; i < str.length(); i++)
if(isDigit(str.charAt(i))) return true;
return false;
}
void loop() { }