This commit is contained in:
James Devine 2018-03-26 01:12:56 +02:00 committed by GitHub
parent c46cef36b4
commit 17a4e40cd8

View file

@ -1,3 +1,6 @@
// This #include statement was automatically added by the Particle IDE.
#include <Particle-GPS.h>
// This #include statement was automatically added by the Particle IDE. // This #include statement was automatically added by the Particle IDE.
#include <ParticleSoftSerial.h> #include <ParticleSoftSerial.h>
#include "Particle.h" #include "Particle.h"
@ -10,30 +13,56 @@
const uint32_t baud = 9600; const uint32_t baud = 9600;
//#if (SYSTEM_VERSION >= 0x00060000) //init GPS device on Serial1
// SerialLogHandler logHandler; Gps _gps = Gps(&Serial1);
//#endif
//Create a 1ms timer to feed in the GPS data
Timer _timer = Timer(1, onSerialData);
//Pin assignments for the RFID reader
#define PSS_RX D3 // RX must be interrupt enabled (on Photon/Electron D0/A5 are not) #define PSS_RX D3 // RX must be interrupt enabled (on Photon/Electron D0/A5 are not)
#define PSS_TX C5 //this pin isn't something we use, I couldn't find a null pin #define PSS_TX C5 //this pin isn't something we use, I couldn't find a null pin
ParticleSoftSerial SoftSer(PSS_RX, PSS_TX); ParticleSoftSerial SoftSer(PSS_RX, PSS_TX);
struct Reservation {
char UserID[9];
int StartDay;
int StartMonth;
int StartYear;
int StartHour;
int StartMinute;
int Duration;
};
//variable for RFID card reading process
char CARDcurrent[4]; char CARDcurrent[4];
// First, let's create our "shorthand" for the pins //Pin asignments
// Same as in the Blink an LED example:
// led1 is D0, led2 is D7
int OpenRelay = D4; int OpenRelay = D4;
int CloseRelay = D5; int CloseRelay = D5;
int StatusLED = D7; int StatusLED = D7;
// Last time, we only needed to declare pins in the setup function.
// This time, we are also going to register our Particle function
bool DoorsOpenBool = false;
//boolean to track the door status; actually we'll only use it as a toggle. //boolean to track the door status; actually we'll only use it as a toggle.
bool DoorsOpenBool = false;
void clearEEPROM(); // forward declaration
int EEPROMctr = 0; //eeprom index
//Note that the 0th value of the EEPROM is used to store the number of reservations
//Values 1+ store reservations in blocks of 36 bytes.
int ReservationSize = 36; //number of bytes per reservation
//some strings that we'll use for system variables
String ReservationsTable; String ReservationsTable;
String ValidGPSPosition; String ValidGPSPosition;
//define a master RFID card that can always open/close the door regardless of reservation status (i.e. for pool manager)
String MasterRFIDCard = "983553fe"; String MasterRFIDCard = "983553fe";
class ReservationCmd { class ReservationCmd {
@ -41,13 +70,25 @@ class ReservationCmd {
public: public:
void extractValues(String); void extractValues(String);
String UserIDStr (void) { String UserIDStr (void) {
return argument.substring(argument.indexOf("#UserID=") + 8, argument.indexOf("#StartTime=")); return argument.substring(argument.indexOf("UserID=")+7, argument.indexOf("StDy="));
} }
String StartTimeStr (void) { int StartDayInt (void) {
return argument.substring(argument.indexOf("#StartTime=") + 14, argument.indexOf("#EndTime=")); return (argument.substring(argument.indexOf("StDy=")+5, argument.indexOf("StMon="))).toInt();
} }
String EndTimeStr (void) { int StartMonInt (void) {
return argument.substring(argument.indexOf("#EndTime=") + 14, argument.indexOf("#EndTime=")); return (argument.substring(argument.indexOf("StMon=")+6, argument.indexOf("StYr="))).toInt();
}
int StartYearInt (void) {
return (argument.substring(argument.indexOf("StYr=")+5, argument.indexOf("StHr="))).toInt();
}
int StartHourInt (void) {
return (argument.substring(argument.indexOf("StHr=")+5, argument.indexOf("StMin="))).toInt();
}
int StartMinuteInt (void) {
return (argument.substring(argument.indexOf("StMin=")+6, argument.indexOf("Dur="))).toInt();
}
int DurationInt (void) {
return (argument.substring(argument.indexOf("Dur=")+4, argument.indexOf("f"))).toInt();
} }
}; };
// //
@ -81,34 +122,87 @@ void StatusLEDFn()
void setup() void setup()
{ {
//set pin modes for hardwired devices
pinMode(OpenRelay, OUTPUT); pinMode(OpenRelay, OUTPUT);
pinMode(CloseRelay, OUTPUT); pinMode(CloseRelay, OUTPUT);
pinMode(StatusLED, OUTPUT); pinMode(StatusLED, OUTPUT);
//set these outputs correctly
Particle.function("Open", OpenRelayCmd);
Particle.function("Close", CloseRelayCmd);
Particle.function("StatusLED", StatusLEDFlash);
Particle.function("PubPosn", SendPosition);
Particle.function("MkResvn", ReserveString);
Particle.function("CanResvn", CancelString);
Particle.function("HomeBox", HomeCoords);
Particle.function("PubResvn", ShowReservations);
Particle.variable("CarResvn", ReservationsTable);
Particle.variable("CarPos", ValidGPSPosition);
digitalWrite(OpenRelay, LOW); digitalWrite(OpenRelay, LOW);
digitalWrite(CloseRelay, LOW); digitalWrite(CloseRelay, LOW);
digitalWrite(StatusLED, LOW); digitalWrite(StatusLED, LOW);
//define functions
Particle.function("Open", OpenRelayCmd);
Particle.function("Close", CloseRelayCmd);
Particle.function("StatusLED", StatusLEDFlash);
//Particle.function("PubPosn", SendPosition); deprecated
Particle.function("MkResvn", ReserveString);
Particle.function("CanResvn", CancelString);
Particle.function("HomeBox", HomeCoords);
Particle.function("PubResvn", ShowReservations);
Particle.function("WipeResvn", WipeReservations);
//define variables
Particle.variable("CarResvn", ReservationsTable);
Particle.variable("CarPos", ValidGPSPosition);
//set up serial debug link
Serial.begin(); Serial.begin();
Serial.printlnf("ready for data"); Serial.printlnf("ready for data");
//setup RFID reader soft serial
RECEIVER.begin(baud, PROTOCOL); // but SoftSerial can ;-) RECEIVER.begin(baud, PROTOCOL); // but SoftSerial can ;-)
//Init GPS
_gps.begin(9600);
_gps.sendCommand(PMTK_SET_NMEA_OUTPUT_ALLDATA);
_timer.start();
//initialise the EEPROM counter with the number of reservations that were in memory before poweroff.
EEPROM.get(0, EEPROMctr);
} }
void onSerialData()
{
_gps.onSerialData();
}
void loop() void loop()
{ {
Serial.print("Data[0] = "); Serial.println(_gps.data[0]);
Serial.print("Data[1] = "); Serial.println(_gps.data[1]);
Serial.print("Data[2] = "); Serial.println(_gps.data[2]);
Serial.print("Data[3] = "); Serial.println(_gps.data[3]);
Serial.print("Data[4] = "); Serial.println(_gps.data[4]);
Serial.print("Data[5] = "); Serial.println(_gps.data[5]);
Serial.print("Data[6] = "); Serial.println(_gps.data[6]);
Rmc rmc = Rmc(_gps);
if (rmc.parse())
{
Serial.println("3) Recommended Minimum Navigation Information ($GPRMC)");
Serial.println("======================================================");
Serial.print("UTC Time: "); Serial.println(rmc.utcTime);
Serial.print("Latitude: "); Serial.println(rmc.latitude);
Serial.print("North/SouthIndicator: "); Serial.println(rmc.northSouthIndicator);
Serial.print("Longitude: "); Serial.println(rmc.longitude);
Serial.print("East/WestIndicator: "); Serial.println(rmc.eastWestIndicator);
Serial.print("Speed Over Ground: "); Serial.println(rmc.speedOverGround);
Serial.print("Course Over Ground: "); Serial.println(rmc.courseOverGround);
Serial.print("Date: "); Serial.println(rmc.date);
Serial.print("Magnetic Variation: "); Serial.print(rmc.magneticVariation); Serial.print(" "); Serial.println(rmc.magneticVariationDirection);
Serial.print("Mode: "); Serial.println(rmc.mode);
Serial.println("");
}
ValidGPSPosition = rmc.latitude + ";" + rmc.northSouthIndicator + ";" + rmc.longitude + ";" + rmc.eastWestIndicator + ";" + rmc.utcTime;
Serial.println(ValidGPSPosition);
int counter = 0; int counter = 0;
unsigned long cardread = 0; unsigned long cardread = 0;
String cardpublish; String cardpublish;
@ -221,28 +315,48 @@ int StatusLEDFlash(String command) {
} }
/*
//deprecated
int SendPosition(String command){ int SendPosition(String command){
if (command=="on") { if (command=="on") {
digitalWrite(StatusLED,HIGH); //flash the led
delay(1000); StatusLEDFn();
digitalWrite(StatusLED,LOW); ValidGPSPosition = _gps.data[4];
return 1; return 1;
} }
else { else {
return -1; return -1;
} }
} }
*/
int ReserveString(String command){ int ReserveString(String mssgArgs){
if (command=="on") { Serial.println("command recieved...");
digitalWrite(StatusLED,HIGH); Serial.println(mssgArgs);
delay(1000); //oldData = false;
digitalWrite(StatusLED,LOW); //lastDataTransmitTime = millis();
return 1; ReservationCmd command;
} command.extractValues(mssgArgs);
else { Serial.println("Valid Reservation Recieved...");
return -1; Serial.print("UserID: ");
} Serial.println(command.UserIDStr());
Serial.println("Start Day = ");
Serial.println(command.StartDayInt());
Serial.println("Start Month = ");
Serial.println(command.StartMonInt());
Serial.println("Start Year = ");
Serial.println(command.StartYearInt());
Serial.println("Start Hour = ");
Serial.println(command.StartHourInt());
Serial.println("Start Minute = ");
Serial.println(command.StartMinuteInt());
Serial.println("Duration = ");
Serial.println(command.DurationInt());
// updateVariables(i, command.mssgText(), command.mssgValue0(), command.mssgValue1()); // Pass decoded variables to function
// badMessage = false;
return 1;
} }
int CancelString(String command){ int CancelString(String command){
@ -280,3 +394,75 @@ int ShowReservations(String command){
return -1; return -1;
} }
} }
int WipeReservations(String command) {
if (command=="on") {
//flash the LED
StatusLEDFn();
//Wipe the EEPROM
clearEEPROM();
//Reset the onboard reservation counter to 0 (assuming EEPROM is wiped)
EEPROM.get(0, EEPROMctr);
return 1;
}
else {
return -1;
}
}
Reservation CreateReservation(String CUserID, int CStartDay, int CStartMonth, int CStartYear, int CStartHour, int CStartMinute, int CDuration)
{
//make a buffer for the reservation
Reservation CreateResvn;
//transfer the data from the function - there's probably a better way to do the string transfer
CreateResvn.UserID[0] = CUserID[0];
CreateResvn.UserID[1] = CUserID[1];
CreateResvn.UserID[2] = CUserID[2];
CreateResvn.UserID[3] = CUserID[3];
CreateResvn.UserID[4] = CUserID[4];
CreateResvn.UserID[5] = CUserID[5];
CreateResvn.UserID[6] = CUserID[6];
CreateResvn.UserID[7] = CUserID[7];
CreateResvn.StartDay = CStartDay;
CreateResvn.StartMonth = CStartMonth;
CreateResvn.StartYear = CStartYear;
CreateResvn.StartHour = CStartHour;
CreateResvn.StartMinute = CStartMinute;
CreateResvn.Duration = CDuration;
//send the created variable back
return CreateResvn;
}
int AddReservation(Reservation ReservationToAdd)
{
//work out the next free spot and put it in that reservation
EEPROM.put(((EEPROMctr*ReservationSize)+1), ReservationToAdd);
EEPROMctr++;
return EEPROMctr;
}
void RecallReservation(int ResvnNumber)
{
//Create a buffer to store the recalled data
Reservation RetRes;
//extract it from the EEPROM
EEPROM.get((((ResvnNumber-1)*ReservationSize)+1), RetRes);
//Now format it as a string
const int STRING_BUF_SIZE = 9;
char stringBuf[STRING_BUF_SIZE];
stringBuf[sizeof(stringBuf) - 1] = 0; // make sure it's null terminated
// Initialize a String object from the buffer
String str(stringBuf);
str = String(RetRes.UserID);
//Print it out
Serial.printlnf("ReservationNum=%d, UserID=%s, Day=%d, Month=%d, Year=%d, Hour=%d, Minute=%d, Duration=%d, sizeof(RetRes)=%d", ResvnNumber, str.c_str(), RetRes.StartDay, RetRes.StartMonth, RetRes.StartYear, RetRes.StartHour, RetRes.StartMinute, RetRes.Duration, sizeof(RetRes));
}
void clearEEPROM() {
for(int addr = 0; addr < 256; addr++) {
EEPROM.write(addr, 0);
}
}