#include <Ethernet.h>
#include <SD.h>
#include <SPI.h>
#include <Wire.h>
#include <TinyGPS++.h>
#include <DS1307RTC.h>
#include <Time.h>
#include <Adafruit_BMP085.h>
#include <Adafruit_DotStar.h>
////Version Number for splash//////
String verstring = " Integrated Sensor, Logging, Route forwarding, Web Services and Forms, Flight Detection, voltage monitoring, Polar Tables, Dot Display, Tack Scoring & Polar Record Identification 1.3.3b ";
int versionArray[36] = {
255, 255, 255, 255, 0, 255, 255, 0, 255, 255, 255, 255, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
};
/////////
//////Dotstar Setup////////////
#define NUMPIXELS 20 // Number of LEDs in strip
#define DATAPIN 15 //11 Data Pin
#define CLOCKPIN 14 //13 Clock Pin
Adafruit_DotStar strip = Adafruit_DotStar(NUMPIXELS, DATAPIN, CLOCKPIN, DOTSTAR_BRG);
/////////
//Declare the server port now//////
EthernetServer server(80);
const char legalChars[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890/.-_~";
unsigned int requestNumber = 0;
int displayPageType = 0;
int displayColorMode = 0;
/////////
//////SD card Setup/////////////
const int chipSelect = 4; //sd card cs pin
String logFileExt = ".csv";
String logFileString;
String logFileStringPrev;
char logFile[] = "logfil.csv"; //file name to store into
char ExpFile[] = "logfil.csv";
char ipAdrVar[] ="192 ,168 , 0, 8";
char logFileName = 'logfile.txt';
int includeDate = 0;
File myFile;
int exINT = 15;
float exFloat = 1.12345;
boolean exBoolean = true;
long exLong = 2123456789;
/////////
///fix for defines not working properly //
#define nop() __asm volatile ("nop")
#if 1
nop();
#endif
/////////
/////////////DEFINES////////////
///////INSTRUMENT - SELECT ONE/////////
#define instBG //use if the instrument type is B&G (no VTG correction)
//#define instNKE //use if the instrument type is NKE (neeeds VTG HDM correction)
///////////DEBUG MESSAGES///////////////
//#define CSVDEBUG //use if you want general verbose data to console
//#define expDEBUG
//#define serverDEBUG //use if you want general verbose data to console
//#define distanceDEBUG //use if you want to add distance forward calcs to the console
//#define guageDEBUG //use this if you want to add guage loss details to the console
//#define TackScore //use if this is a tackscore device compile.
#define EPO // use if this is a EPO device compile
/////////
int expCtr2 = 1;
///I2C DEVICE ADDRESSES/////////
#define DEVICE (0x53) // tilt sensor addressDevice address as specified in data sheet
/////////
int vctr = 0; //counter for voltageXDR strings
int sctr = 0; //counter for voltageXDR strings
///Status Light Setup///////////
int neoMinTargetFloor = 70; //set range range of display (eg..80 represents 80 to 100 % of target/
int centerPixel = 12; //pixel to use as the 100% target
int pixelRange = 20; //100-neomintargetfloor
float pickPixelMult = 0; //speed range per pixel
float avgTrgtPixel = 0;
int neoActual = 0;
int neoActualT = 0;
int whichPixelT = 0;
int whichPixelR = 0;
int whichPixelG = 0;
int whichPixelB = 0;
int neoPixel = 0;
int prevPixelT = 0;
int numpixels = 20;
int dotBrightess = 5;
int whichPixelROld = 0;
int whichPixelGOld = 0;
int whichPixelBOld = 0;
int whichPixelROlder = 0;
int whichPixelGOlder = 0;
int whichPixelBOlder = 0;
int pixelIndex = 0;
int flightGain = 200;
int dotReset = 0;
int warningRoll = 45;
int cautionRoll = 35;
int flightRoll = 0;
float dotTargetMin = 50;
int pixelDiag = 0;
int dotMode = 1; //1 = target speed, 2= polar mode
int PixelArrayG[36] = {
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
};
int PixelArrayR[36] = {
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
};
int PixelArrayB[36] = {
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
};
/////////
float lat2f = 0.000000;
float lat2 = 0;
String latDDTmp ;
String latMMfinal ;
///Voltge Monitoring Setup /////
int v12Signal = A6;
//float v12Multiplier = .006091357421875;
float v12Multiplier = .006152737421875;
float v12Actual = 0;
float v1290Threshold = 13.8;
float v1280Threshold = 13.6;
float v1270Threshold = 13.4;
float v1260Threshold = 13.2;
float v1250Threshold = 13.0;
float v1240Threshold = 12.9;
float v1230Threshold = 12.8;
float v1220Threshold = 12.7;
float v1210Threshold = 12.3;
float v120Threshold = 12.0;
float v12Pct = 0;
//float v1270Threshold = 13.7;
int v24Signal = A7;
float v24Multiplier = .01215;
float v24Actual = 0;
float v2490Threshold = 26.5;
float v2480Threshold = 26.4;
float v2470Threshold = 26.3;
float v2460Threshold = 26.2;
float v2450Threshold = 26.0;
float v2440Threshold = 25.9;
float v2430Threshold = 25.7;
float v2420Threshold = 25.6;
float v2410Threshold = 25.2;
float v240Threshold = 24.9;
float v24Pct = 0;
///NMEA0183 STRUCTURES//////////
///////////NMEA CRC builder vars///////////
//int XDRSail = 500;
int XDRCounter = 0;
int XDRCounter2 = 0;
const byte buff_len = 90;
char CRCbuffer[buff_len];
unsigned long NMEAin = 0L;
////////// NMEA0183 output strings ////////
String sp = " ";
String delim = ",";
String splat = "*";
String msg = "";
/////////NMEA183 inbound check vars ///////
int charcount = 0;
String starcheck = "*"; //Sentence End Indicator
String hdrcheck = "$II"; //Sentece Talker Type
//String hdrcheck = "$EC"; //Sentece Talker Type
////////NMEA0183 BWC Sentence Vars/////////
String markMag; //mark bearing magnetic
int markInt = 0; //Bearing to Mark in degrees magnetic*100
String markDist; //mark Distance
int markDistInt = 0; //distance*100 to active mark
float markDistFloat = 0; //distance to active mark
/////////NMEA inbound read Strings ////////
String inData; //Serial1 inbound string
char inChar = -1; //Serial1 inbound character
String inData2; //Serial2 inbound string
char inChar2 = -1; //Serial2 inbound character
String inData3; //Serial3 inbound string
char inChar3 = -1; //Serial3 inbound character
/////NMEA0183 Inbound Fields //////////////
TinyGPSPlus gps;
//H5000 Types
TinyGPSCustom cog(gps, "ECVTG", 3); // COG, VTG 3RD ELEMENT, Course Over Ground
TinyGPSCustom sog(gps, "ECVTG", 5); // SOG, VTG 5th ELEMENT, Speed Over Ground
TinyGPSCustom twd(gps, "ECMWD", 3); // TWD, MWD 3RD ELEMENT, True Wind Direction
TinyGPSCustom tws(gps, "ECMWD", 5); // TWS, MwD 5th ELEMENT, True Wind Speed
TinyGPSCustom twa(gps, "ECVWT", 1); // TWA, VWT 1st ELEMENT, True Wind Angle
TinyGPSCustom hdm(gps, "ECHDM", 1); // HDM, HDM 1st ELEMENT, mag heading
TinyGPSCustom hdg(gps, "ECVHW", 3); // HDG, VHW 3RD ELEMENT, mag Heading
TinyGPSCustom bsp(gps, "ECVHW", 5); // BSP, VHW 5th ELEMENT, Boatspeed
TinyGPSCustom aws(gps, "ECVWR", 3); // AWS, VWR 3rd ELEMENT, Apparent Wind Speed
TinyGPSCustom dbt(gps, "ECDBT", 1); // DBT, DBT 1st ELEMENT, Depth Below Transducer
TinyGPSCustom totlog(gps, "ECVLW", 1); //
TinyGPSCustom currlog(gps, "ECVLW", 3); //
TinyGPSCustom rot (gps, "ECROT", 1); // ROT, ROT 1st ELEMENT, Rate of Turn in degrees per second
TinyGPSCustom rud (gps, "ECXDR", 18); // RUDDER, XDR 18th ELEMENT, Rudder position in degrees
//TinyGPSCustom aws(gps, "IIVWR", 3); // AWS, VWR 3rd ELEMENT, Apparent Wind Speed
//TinyGPSCustom twa (gps, "IIVWT", 1); // TWA, VWT 1st ELEMENT, True Wind Angle NKE and B&G //change to MWV
TinyGPSCustom mtw(gps, "ECMTW", 1); // MTW, MTW 1st ELEMENT, Water Temp NKE, B&G
int targetSpeedAVG = 0; //0 sets to actual speed, 1 sets to targets
String RorL; //conversion character for wind direction Right or Left of bow
String awa; // Apparent Wind Angle
String gpstime; //time from GPS
float lng2; //Longitude in HH.mmmm format
int twaInt = 0; //True Wind Angle *100
int twsInt = 0; //True Wind Speed *100
float twsFloat2 = 0; //True Wind Speed fractional for exp records
int awaInt = 0; //AWA*100 in degrees
int bspInt = 0; //Boatspeed*100 in Kts
long cogMag = 0; //COG in degrees MAG
int sogInt = 0; //SOG*100
int cogInt = 0; //Course Over Ground inDegrees
String sogTmp = 0; //Speed Over Ground as a string
String bspTmp = 0; //Boatspeed as a string
int dbspInt = 0; //difference between BSP and SOG in 1/100 kt
int hdmInt = 0; //Magnetic Heading in degrees
int leeway = 0; //Leeway in degreees
int dhdmInt = 0; //difference between heading and COG
int awaPrev = 0;
int twaPrev = 0;
int magVar = 0; //Magnetic Variation derived by GPS or manually input
int volts = 0; //v12 System Voltage
int awsInt = 0;
//////////
///////polar record check setup/////
float TWSUpperBoundary = 0;
float TWAUpperBoundary = 0;
float TWALowerBoundary = 0;
float TWSLowerBoundary = 0;
int ValidPolarRecCtr = 0;
int IsPolarRec = 0;
///////////configurables ///////////
float TWSRange = 2.0; //allowable range of TWS to qualify as stable
float TWARange = 2.0; //allowable range of TWA to qualify as stable
int ValidPolarRecMin = 5; //number of sequential records which meet the TWxRange requirements
//////////
///////tackscore setup///////////
int postCounterInit = 50; //determine how many cycles after the tack to track loss. (B&G H2000 should be 20, for 38 secconds. NKE and Expedition should be 30)
int tackIndex = 9; //current array index to load /started at 15 ///changedd to 9 for B&G //15 for expedition //sets the number of cycles prior to a tack to track loss. This + postcounierinit create the total cycles..
int prevTackIndex = 8; //prevoius index // started at 14 //always -1 from ti
int tackPoint = 0; //index to the tack trigger
int postCounter = 0; //number of records to count post tack, remainder will be per tack
long targetDist = 0; //benchmark distance traveled
long targetAngle = 30;
int tackScore = 9; //rating for the tack.
int ktConv = 1688; //kts to feet conversion factor
long duration = 1; //time between BSP measurments
long prevMillis = millis();// counter for time between sentences
int currBoard = 0; //are we on port(0) or starboard(1)
int avgDistCounter = 0; //array index for distance averageing
int avgAngleCounter = 0; //array index for AWA averaging
long avgDist = 0; //average distance per period pre tack
long avgSpeed = 000; //average distance per period pre tack
int avgAngle = 20;
long targetSpeed = 0;
long preDistTot = 0; //distance covered for period seconds prior to the tack
long preTimeTot = 0; //time covered for period seconds prior to the tack
long preLaneTot = 0; //distance to weather/ leward before tack
long tackDist = 0; //distance covered for the 15 seconds after the tack
long tackTime = 0; //time covered for the 15 seconds after the tack
long tackLane = 0; //
int deltaAngle = 0;
long distLost = 0; //distance lost in the tack
long angleLost = 0;
long laneLost = 0;
int activeTack = 0;
int targetBSPOld = 0;
int targetBSPAvg = 0;
int targetBSP = 0;
long finalForward = 0;
int finalGage = 1;
long tempLane = 0;
int finalLane = 0;
int targetTWA = 0;
int heelArray[36] = {
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
};
long sinArray[38] = {
0, 174, 348, 523, 697, 871, 1045, 1219, 1392, 1564, 1736, 1908, 2079, 2249, 2419, 2588, 2756, 2924, 3090, 3256, 3420, 3584, 3746, 3907, 4067, 4383, 4539, 4694, 4848, 5000, 5150, 5300, 5446, 5591, 5735, 6100, 6500, 7200
};
int bspArray[36] = {
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
};
int awaArray[36] = {
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
};
int twaArray[36] = {
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
};
int hdmArray[36] = {
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
};
int distArray[36] = {
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
};
long laneArray[36] = {
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
};
int RorLArray[36] = {
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
};
int timeArray[36] = {
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
};
///////////FUJIN Target Tables//////
//true wind speed comment for spreadhseet inport,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,
long targetBSPArrayUP[38] = {0, 100, 200, 300, 410, 490, 570, 645, 720, 770, 820, 865, 910, 965, 1030, 1070, 1100, 1225, 1350, 1380, 1410, 1430, 1450, 1430, 1410, 1440, 1480, 1530, 1580, 1600, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620};
int targetTWAArrayUP[38] = {45, 49, 49, 49, 49, 49, 48, 47, 47, 46, 45, 44, 44, 45, 45, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49};
long targetBSPArrayDN[38] = {0, 100, 200, 300, 460, 565, 670, 750, 810, 860, 910, 1000, 1070, 1220, 1350, 1520, 1700, 1925, 2150, 2200, 2230, 2360, 2480, 2540, 2590, 2640, 2730, 2810, 2870, 2920, 3030, 3100, 3210, 3280, 3300, 3365, 3400, 3510};
int targetTWAArrayDN[38] = {130, 130, 133, 138, 134, 135, 136, 138, 140, 142, 143, 141, 140, 138, 136, 134, 133, 132, 131, 132, 134, 135, 136, 138, 140, 140, 140, 141, 141, 141, 141, 141, 141, 135, 141, 135, 145, 145};
//////////
///////////////big table /////
int cosArray[92] = {
10000, 9998, 9994, 9986, 9976, 9962, 9945, 9925, 9903, 9877, 9848, 9816, 9781, 9744, 9703, 9659, 9613, 9563, 9511, 9455, 9397, 9336, 9272, 9205, 9135, 9063, 8988, 8910, 8829, 8746, 8660, 8572, 8480, 8387, 8290, 8192, 8090, 7986, 7880, 7771, 7660, 7547, 7431, 7314, 7193, 7071, 6947, 6820, 6691, 6561, 6428, 6293, 6157, 6018, 5878, 5736, 5592, 5446, 5299, 5150, 5000, 4848, 4695, 4540, 4384, 4226, 4067, 3907, 3746, 3584, 3420, 3256, 3090, 2924, 2756, 2588, 2419, 2250, 2079, 1908, 1736, 1564, 1392, 1219, 1045, 872, 698, 523, 349, 175, 0
};
int polarSpeed = 1;
float polarBsp = 0;
float polarBspAvg = 0;
int ploarBspInt = 0;
float polarArray [36][182];
///////////
////////////serial attached display variables//////////
int displayMode = 0;
boolean topButton = 0;
int maxDisplays = 3;
int statMsg = 0;
int XDRMsg = 1;
int reEntry = 0;
//
/////////tuneables read from SD file SETTINGS.TXT//
String settingHeader = "upstg"; //header to check if serial input is a update to the settings file
int baroffset = 0; //baro pressure offset. each 100 is 1 or reading //newer sensor
int twsCorrectorUP = 100; //upwind tagget windspeed factor (as a percent)
int twsCorrectorDN = 100; //downind tagget windspeed factor (as a percent)
int targetSpeedMultiplier = 100; //target boatspeed factor (as a percent)
int heelCorrector = 0; //corrector for install alighnement on heel sensor
int pitchCorrector = 0; //corrector for install alignment for pitch sensor
//
/////////system configuration option defaults. changes are read from SD file SETTINGS.TXT during setup.//
int NMEAPlay = 1; //echo the input stream to console
int Expedition = 1; //write expedition records (use in conjunction with directlog for SD logging)
int expFreq = 2; //number of data cycles per expedition record write
int Sensor = 0; //use the external sensors (must be on for barometer)
int Barometer = 0; //use the barometer
int paddleSelector = 2; //enable the selector relay
int flightDetector = 0; //enable the saildrive pressure transucers
int directLog = 1; //create expedition records and write them directly to the SD card
int startNo = 1; //default system restart number for the syslog file
int tackScoreData = 1; // turn on tackscore sentences. Reduces the number of pressure and pitch readings as we run out of 0183 room on serial1
int localDisplay = 0; //turn on the display attached to Serial2. Serial2 is disabled if the serverON=1;
int serverON = 1; //enable the web server
int nmeaSimulator = 0; //reads nmae0183 data from SD card instead of from Serial1. turns off expedition, sensors, directlog and paddleselector.
int wiFly = 0; //reads nmea0183 data from SD card instead of from Serial1. turns off expedition, sensors, directlog and paddleselector.
int dotTrgtAvg = 1; //simple averge for dot target display
int flightHost = 1; //is this system a host for flight mode or a dot client
int v24Record = 1; // 24v voltage recording
int v12Record = 1; // 12v voltage recording
int NMEALog = 0; ///////// enables writing S1 NMEA source to SD
float boardHeight = 0; // Just what the tin says it is
float travPos = -2; // Just what the tin says it is
String activeSail = "500"; // Just what the tin says it is
int activeSailCode = 500; //
int s3PIXComm = 0; //turn on S3 comm for PIX sentences
int s1PIXComm = 0; //turn on S1 comm for PIX sentences
int s0PIXComm = 0; //turn on console comm for PIX sentences
int s1NMEAComm = 1;
int s3NMEAComm = 1; //turn on s3 OUT for NMEA
int PIXGenerate = 0; //generate PIX Sentences, don't forget to select ports
int s0XDRComm = 0;
int s1XDRComm = 0;
int s3XDRComm = 1;
////
/////////////// Microsoft time format for expedition record variables.//
//Defaults for hen RTC fails ///
long LeapDays = -1; //corrector for number of leap days since 1900 (-1000 is a test value)
long Day = 02; //Default value for day
long Month = 03; //default value for month, SET TO ZERO to trigger Expedition COLE time set from GPS on start
long Year = 2014;
float Hour = 18;
float Minute = 00;
float Second = 01;
int secondinc = 11;
long fakeSecond = 0;
long fakeSecondPrev = 0;
/// Time Conversion Multipliers for RTC values///
float ctsHours = 41666.6667; //ColeTime fractional per hour
float ctsMinutes = 694.4444; //Cole Time fractional per minute
float ctsSeconds = 11.579; //Cole Time fractional per Second
long ColeTimeYear = 0; //resultant year component
double ColeTimeSecond = 0; // resultant time component
///
/// Expedition write record variables /////////
String expRecord2 = (",,,,,,,,,,,,,,,,,"); // 17 commas accomidates 5 tackdistfields
unsigned long ExpDelay = 0;
int ExpReady = 0;
///
///flight sensor setup///////
int isReadyToFly = 0; //Indicates whether flight is capable
int isReadyMode = 1; //mode for evaluating flight (1=bsp,2=tws,3=both,4=either)
int isReadyToFlyFlag = 0; //sets IRTF condition loop
int isInFlight = 0; // final determinor for flight
int isInFlightRange = 200; //allowable difference in pressure before inflight is set
int bspFlightMin = 2000; //minimum speed for flight detection in 1/100th of a kt
int twsFlightMin = 2000; //minimum windspeed for flight in 1/10 kt
int isReadyToFlySignal = 23; //Signal line to Pressures Sensor indicating flight conditions
int isInFlightSignal = 22; //Signal Line from Pressure Sensor indicating flight
int flightPressCorrector = 9400; //corrects the ATMOS sesor to equal the Drive Sesnor statically
int flightPressDrive = 0; //pressure in drive tube
int flightPressDiff = 0; //difference between drive and atmos (D-A)
int flightPressAtmos = 0; //pressure std atmosphere
//int flightGain = 0; //allowable difference in the 2 pressure sensors
int BMPSelector = 20; //pin for BMP mux
//int neoMinTargetRange = 20; //Total range of display (eg..20 represents 80 to 100 % of target
////
/////IMU Variables/////////
//Barometer and Temp Sensor Values///
short temperature;
short tempold;
long pressure = 100000;
long pressureold = 100000;
// Use these for altitude conversions
const float p0 = 102725; // Pressure at sea level (Pa)
float altitude;
///////////////ADXL045 accelerometer startup values//
byte _buff[6];
char POWER_CTL = 0x2D; //Power Control Register
char DATA_FORMAT = 0x31;
char DATAX0 = 0x32; //X-Axis Data 0
char DATAX1 = 0x33; //X-Axis Data 1
char DATAY0 = 0x34; //Y-Axis Data 0
char DATAY1 = 0x35; //Y-Axis Data 1
char DATAZ0 = 0x36; //Z-Axis Data 0
char DATAZ1 = 0x37; //Z-Axis Data 1
int16_t xold; //averaging value for x
int16_t yold; //averaging value for y
int16_t zold; // offset value for z
int16_t x; //heel variable
int16_t y; //pitch
int16_t z; //wave height
double pitch;
double roll;
//// Declare the BMP object////////
Adafruit_BMP085 bmp;
//////
////BUTTON OBJECT////////////
//bButton button = Button(3, BUTTON_PULLDOWN); // Declare the Button object
///////
void setup() {
///UART Port Initialization and setup//////////
Serial.begin(57600); // Console output
Serial1.begin(4800); // primary NMEA input and output port
//Serial2.begin(19200); // display (if attached)
Serial3.begin(4800); //output port to SD logging server
///
delay(2000);
/////I/O Pin setup for flight, paddle and voltage monitoring ////
if (flightHost == 1) pinMode(23, OUTPUT); //Ready to Fly Signal to Drive Pressure Monitor
digitalWrite(23, LOW); //Default to LOW
if (paddleSelector != 1) pinMode(22, INPUT); //Is In Flight Signal from Drive Pressure Monitor
else pinMode(22, OUTPUT);
if (v12Record == 1)pinMode(v12Signal, INPUT); //v12 monitor from voltage divider.
if (v24Record == 1) pinMode(v24Signal, INPUT); //v24 monitor from voltage divider
if (flightDetector == 1) pinMode(BMPSelector, OUTPUT); //MUX selector pin for BMP's
//
//Dot Array start ////////
//strip.begin(); // Initialize pins for output
//strip.show(); // Turn all LEDs off ASAP
///
/////I/O Pin setup, Enet Reset and SD Select Initializationp//
pinMode(9, OUTPUT);
digitalWrite(9, LOW); // begin reset the WIZ820io
pinMode(10, OUTPUT); //setup CS for 5100
digitalWrite(10, HIGH); //Enet disable
pinMode(4, OUTPUT);
digitalWrite(4, HIGH); // de-select the SD Card
digitalWrite(9, HIGH); // end reset pulse
//
///IP setup///////////////
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xEC };
// IPAddress ip( 192,168,5,10 ); // AJ5 Network(hamachi main router)
// IPAddress ip( 192,168,9,10 ); // AJ9 Network(new blue TPLink//
// IPAddress gateway( 192,168,5,254 ); // hamachi tplink router
IPAddress ip( 192, 168, 8, 10 ); // GC114 White Router//
IPAddress gateway( 192, 168, 8, 1 ); // GC114 ROUTER
IPAddress subnet( 255, 255, 0, 0 );
const char legalChars[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890/.-_~";
unsigned int requestNumber = 0;
//
//////SD Card Start////
SD.begin(4);
digitalWrite(10, LOW); //Enet disable
//
//////ethernet start //
if (serverON == 1)
{
Ethernet.begin(mac, ip, gateway, gateway, subnet);
server.begin();
int loopCount = 0;
}
///
///Get Configurables from SD card////////////
delay(1000);
Serial.print(verstring);
Serial.println(" Reading Setup Paramaters from SD card. to view anytime type rdstg into console ");
HumanTime();
delay(1000);
//logStart();
delay(1000);
readSDSettings();
logConfig();
logStart();
//if (localDisplay == 1) displayStart() ;
if (paddleSelector == 1) Serial.print(" Boatspeed paddle selector is ON. port sensor is failover digital 22 on relay 1 digital 23 on relay 2 ,");
if (paddleSelector == 2) Serial.print(" Remote flight signals are ON digital 22 and dgital 23,");
if (NMEAPlay == 1) Serial.print(" NMEA Play to console is ON, ");
if (Sensor == 1) Serial.print(" Heel/Pitch sensor is ON, ");
if (Expedition == 1) Serial.print(" Expedition Record out S3 is ON, ");
#ifdef CSVDEBUG
Serial.print(" CSV output diagnostic mode is ON,");
#endif
#ifdef DEBUG
Serial.print(" Expedition formatted record output to console is ON, ");
#endif
#ifdef serverDEBUG
Serial.print(" General Debug verbose mode is ON, ");
#endif
#ifdef distanceDEBUG
Serial.print(" Distance Debug verbose mode is ON, ");
#endif
#ifdef guageDEBUG
Serial.print(" Gage Debug verbose mode is ON, ");
#endif
#ifdef EPO
Serial.print(" Loaded as EPO Server, ");
#endif
#ifdef TackScore
Serial.print(" Loaded as TackScore display, ");
#endif
#ifdef instNKE
Serial.print(" NKE instrunent profile loaded, ");
Serial2.println(" NKE profile loaded ");
#endif
#ifdef instBG
Serial.print(" B&G instrunent profile loaded, ");
Serial2.println(" B&G profile loaded ");
#endif
///////Start the I2C Buss////
Wire.begin(); // join i2c bus (address optional for master)
startSensors();
listHelp();
Serial.println(" .....Initialization Complete. Initiating NMEA Processing");
#ifdef CSVDEBUG
Serial.println("Recnum,tackIndex,aDC,pressure,tws,twa,twaPrev,twaint,targetTWA,bspint,sogint,hdmint,cogmag,ktConv,duration,TAti,diArTemp,DAti,TAadc,avgDsttmp,avgdist,BSPadc,avgspeedtmp,DAadc,avgDist,avgSpeed,twsint,twsintreduced,targetBSP,targetBSPavg,delimiter,TWA,TWAti,TWAadc,AWA,AWAti,AWAadc,avgangle,deltaangle,SINda,templane,templanesign,LAti,LAadc,prelanetot,predisttot,pretimetot,postcounter,currboard,finalforward,finalLane,tacktime,tackdist,finalforward,tacklane,targetspeed,targetdist");
#endif
dotSplash();
checkVoltage24();
checkVoltage12();
ReadExpPolarFile();
ShowPolar();
} //end of setup
void loop() {
if (serverON == 1) checkServer();
while (Serial1.available() > 0) { //Port 1 Has Instruments
char recieved = Serial1.read();
charcount = charcount + 1;
gps.encode(recieved);
inData += recieved;
if (recieved == '\n') // Process message when new line character is recieved
{ //begin by checking sentence for gross errors////
//Serial.print(inData);
String nmeaheader = inData.substring(1, 6);
String checkchar = (inData.substring(charcount - 5, charcount - 4));
if (checkchar != starcheck)
{
inData = "";
}
else
{
String checkhdr = (inData.substring(0, 3));
if (checkhdr == "A")
{
inData = "";
}
///////////passed error testing, proceed with processing /////
else if (nmeaheader == "SDDPT" || nmeaheader == "IIDPT" || nmeaheader == "ECDPT")
{
if (Barometer == 1) readPressure();
inData = "";
}
else if (nmeaheader == "IIPIX")
{
if (flightDetector == 1)
{
processPIX();
checkFlight();
}
inData = "";
}
else if (nmeaheader == "SDROT" || nmeaheader == "IIROT" || nmeaheader == "ECROT")
{
if (PIXGenerate == 1); checkFlight();
if (v24Record == 1)checkVoltage24();
if (v12Record == 1)checkVoltage12();
}
else if (nmeaheader == "SDHDG" || nmeaheader == "IIHDG" || nmeaheader == "ECHDG") inData = "";
else if (nmeaheader == "IIMTW" || nmeaheader == "IIMTW" || nmeaheader == "ECMTW") inData = "";
else if (nmeaheader == "IIZDA" || nmeaheader == "IIZDA" || nmeaheader == "ECZDA") inData = "";
else if (nmeaheader == "SDHDT" || nmeaheader == "IIHDT" || nmeaheader == "ECHDT")
{
if (tackScoreData == 1) XDRSend();
if (polarSpeed == 1) getPolarBsp();
}
else if (nmeaheader == "GPVTG" || nmeaheader == "IIVTG" || nmeaheader == "ECVTG") processVTG();
else if (nmeaheader == "IIVWT" || nmeaheader == "IIVWT" || nmeaheader == "ECVWT")
{
processVWT();
if (PIXGenerate == 1); checkFlight();
}
else if (nmeaheader == "SDVHW" || nmeaheader == "IIVHW" || nmeaheader == "ECVHW")
{
processVHW();
if (PIXGenerate == 1); checkFlight();
if (tackScoreData == 1) TackScore(); //create score for every BSP
}
else if (nmeaheader == "GPGLL" || nmeaheader == "IIGLL" || nmeaheader == "ECGLL")
{
processGLL();
ExpDelay = ExpDelay + 1;
if (PIXGenerate == 1); checkFlight();
if (ExpDelay >= 1) ExpReady = 1; //wait for enough data to fill records
if (ExpReady = 1)
{
if (expCtr2 == expFreq)
{
LogExpeditionInfo();
//Serial.println("Exp Record Written");
}
expCtr2 = expCtr2 + 1;
}
}
else if (nmeaheader == "WIMWV" || nmeaheader == "IIMWV" || nmeaheader == "ECMWV")
{
processMWV();
if (PIXGenerate == 1); checkFlight();
}
} //end sentence selection
if (s1NMEAComm == 1) //Serial1.print(inData);
if (NMEALog == 1)
{
digitalWrite(13, HIGH);
myFile = SD.open("NMEALOG.txt", FILE_WRITE);
myFile.print(inData);
myFile.close();
digitalWrite(13, LOW);
}
if (NMEAPlay == 1) Serial.print(inData);
if (s3NMEAComm == 1) Serial3.print(inData);
inData = "";
charcount = 0;// end valid indata section
NMEAin = NMEAin + 1;
} // end \n (newline eval
} // end while serial1 available
////////
while (Serial3.available() > 0) {
char recieved3 = Serial3.read();
inData3 += recieved3;
if (recieved3 == '\n') // Process message when new line character is recieved
{
if (statMsg == 1) Serial.print("s3 Message: ");
if (statMsg == 1) Serial.print(inData3);
myFile = SD.open("syslog.txt", FILE_WRITE);
myFile.print("s3 message: ");
myFile.print(inData3);
myFile.close();
inData3 = ""; // Clear recieved buffer
} //end S3 input
}
////////
//console in port ///////////
while (Serial.available() > 0) {
char recieved2 = Serial.read();
inData2 += recieved2;
if (recieved2 == '\n') // Process message when new line character is received
{
if (statMsg == 1)
{
Serial.print("recieved a command input: ");
Serial.println(inData2);
}
String hdrChk = inData2.substring(0, 5);
//Serial.println(hdrChk);
if (hdrChk == settingHeader) WriteSettings();
else if (hdrChk == "setti") ReadSettings();
else if (hdrChk == "$ECRT")
{
if (statMsg == 1) Serial.println("RTE Recieved");
Serial1.print(inData2);
}
else if (hdrChk == "$ECWP")
{
if (statMsg == 1) Serial.println("WPL Recieved");
Serial1.print(inData2);
}
else if (hdrChk == "$ECBW")
//$ECBWC
{
Serial1.print(inData2);
int commaloc = inData2.indexOf(',');
int commaloc2 = inData2.indexOf(',', commaloc + 1);
int commaloc3 = inData2.indexOf(',', commaloc2 + 1);
int commaloc4 = inData2.indexOf(',', commaloc3 + 1);
int commaloc5 = inData2.indexOf(',', commaloc4 + 1);
int commaloc6 = inData2.indexOf(',', commaloc5 + 1);
int commaloc7 = inData2.indexOf(',', commaloc6 + 1);
int commaloc8 = inData2.indexOf(',', commaloc7 + 1);
int commaloc9 = inData2.indexOf(',', commaloc8 + 1);
int commaloc10 = inData2.indexOf(',', commaloc9 + 1);
int commaloc11 = inData2.indexOf(',', commaloc10 + 1);
markMag = inData2.substring(commaloc8 + 1, commaloc9);
if (statMsg == 1) Serial.print ("Mark Dir Mag: "); Serial.print(markMag);
markDist = inData2.substring(commaloc10 + 1, commaloc11);
if (statMsg == 1) Serial.print (" Mark Dist NM: "); Serial.println(markDist);
String markDistFloat = String(markDist.toFloat() * 100, 5);
//markDistInt = mkFloat.toInt();
String markFloat = String(markMag.toFloat(), 3);
int markInt = markFloat.toInt();
markDistInt = markDistFloat.toInt();
}
//
else if (hdrChk == "sed-s") ReadSettings();
else if (hdrChk == "sed-l") ReadLog();
else if (hdrChk == "sed-f") ReadExpeditionLog();
else if (hdrChk == "sed-p") ReadExpPolarFile();
else if (hdrChk == "rdsdc") listSD();
else if (hdrChk == "rmNME") rmNMEALog();
else if (hdrChk == "ls -l") listSD();
else if (hdrChk == "ls -p") ShowPolar();
else if (hdrChk == "statu") sysStatus();
else if (hdrChk == "echoo") NMEAPlay = 1;
else if (hdrChk == "nmeao") NMEAPlay = 1;
else if (hdrChk == "noisy") NMEAPlay = 1;
else if (hdrChk == "nomsg") statMsg = 0;
else if (hdrChk == "msgon") statMsg = 1;
else if (hdrChk == "-help") listHelp();
else if (hdrChk == "quiet") NMEAPlay = 0;
else if (hdrChk == "nonme") NMEAPlay = 0;
else if (hdrChk == "press") readPress();
else if (hdrChk == "fligh") checkFlight();
else if (hdrChk == "dimme") dotDim();
else if (hdrChk == "toggl") dotToggle();
else if (hdrChk == "brigh") dotBright();
else if (hdrChk == "clear") dotClear();
else if (hdrChk == "polar") getPolarBsp();
else if (hdrChk == "dotpo") dotMode = 3;
else if (hdrChk == "dotta") dotMode = 1;
else if (hdrChk == "dottw") dotMode = 2;
else if (hdrChk == "dotde") dotMode = 4;
else if (hdrChk == "rdybs") isReadyMode = 1;
else if (hdrChk == "rdytw") isReadyMode = 2;
else if (hdrChk == "rdybo") isReadyMode = 3;
else if (hdrChk == "rdyei") isReadyMode = 4;
else if (hdrChk == "ifcon") ShowIpInfo();
else if (hdrChk == "expre") ShowExpeditionInfo();
//else Serial.println("Bad Command");
inData2 = ""; // Clear recieved buffer
} //end NL
}///while serial inout string available
} //end void loop
///////////
// Expedition Record Write output ///
///////////
void LogExpeditionInfo() {
// digitalWrite(13, HIGH); //signal to show a write is taking place
tmElements_t tm;
RTC.read(tm);
ColeTimeYear = ((((tm.Year) + 70) * 365) + ((tm.Month) * 30) + (tm.Day) + LeapDays);
ColeTimeSecond = (((tm.Hour * 3600) + (tm.Minute * 60) + tm.Second) * 11.57407);
fakeSecond = (long)ColeTimeSecond;
if (Expedition == 1)
{
if (wiFly == 2)
{
s3expRecord();
}
}
//digitalWrite(13, LOW);
#ifdef ServerDEBUG
Serial.print(" And Expedition Record ");
Serial.print(ExpDelay);
Serial.println(" Was Sent ");
#endif
if (directLog == 1)
{
int cTimeInt = fakeSecond * .0001;
String timeCode;
if (cTimeInt > 75) timeCode = "D";
else if (cTimeInt > 50) timeCode = "C";
else if (cTimeInt > 25) timeCode = "B";
else timeCode = "A";
String cDate = String(ColeTimeYear);
logFileStringPrev = logFileString;
logFileString = cDate + timeCode + logFileExt;
if (logFileStringPrev != logFileString) {
myFile = SD.open("syslog.txt", FILE_WRITE);
myFile.print(" Expedition Log File ");
myFile.print(logFileString);
myFile.println(" now active ");
myFile.close();
}
logFileString.toCharArray(logFile, 13);
myFile = SD.open(logFile, FILE_WRITE);
myFile.print(ColeTimeYear);
myFile.print(".");
if (fakeSecond > 1000000)
{
fakeSecond = 10;
ColeTimeYear = ColeTimeYear + 1;
} //backstop to an end of day miss
if (fakeSecond < 100000) { //this set of statements backfills the second with leading zeros//
if (fakeSecond < 10000) {
if (fakeSecond < 1000) {
if (fakeSecond < 100) {
if (fakeSecond < 10) {
myFile.print("0");
}
myFile.print("0");
}
myFile.print("0");
}
myFile.print("0");
}
myFile.print("0");
}
myFile.print(fakeSecond); //print the int second value
myFile.print(F(","));
myFile.print(bsp.value()); //boatspeed from II tiny
myFile.print(F(","));
myFile.print(RorL); //port is negative
myFile.print(awaInt); //Apparent Wind Angle from II tiny
myFile.print(F(","));
myFile.print(awsInt); //Apparent Wind Speed from II tiny
myFile.print(F(","));
myFile.print(RorL); //port is negative
myFile.print(twaInt); //Right or Left of bow (- or nothing), TWA from Tiny
myFile.print(F(","));
myFile.print(twsFloat2/100); //True Wind Speed from Tiny
myFile.print(F(","));
myFile.print(twd.value()); //True Wind Direction from II tiny
myFile.print(F(",,,,")); //EXP COMMAS
myFile.print(F(","));
myFile.print(hdm.value()); //mag heading
myFile.print(F(","));
myFile.print((temperature)); //air temp
myFile.print(F(","));
myFile.print(mtw.value()); //water temp
myFile.print(F(","));
myFile.print(((pressure)*.01), 1); //Baro pressure
myFile.print(F(","));
myFile.print(dbt.value()); //depth
myFile.print(F(","));
myFile.print(roll, 1); // Heel
myFile.print(F(","));
myFile.print(pitch, 1); //trim
myFile.print(F(","));
myFile.print(rud.value()); //rudder
myFile.print(F(",,,,,,,,,")); //9 EXP COMMAS
myFile.print(F(","));
myFile.print(volts); //voltage calculated from BMS
myFile.print(F(","));
myFile.print(rot.value()); //rate of turn
myFile.print(F(",,,,,,,,")); //8 EXP COMMAS
myFile.print(lat2, 6); //latitude
//myFile.print(latDDTmp);
//myFile.print(latMMfinal);
myFile.print(F(",")); //corrected to make lng always negative, change if you go to the med or Japan!
myFile.print(lng2, 6); //longitude
myFile.print(F(","));
myFile.print(cogMag); //Course over Ground
myFile.print(F(","));
myFile.print(sog.value()); //Speed over Ground
myFile.print(F(",,,,,,"));
myFile.print(travPos); //Traveler position (neg is to weather)
myFile.print(F(",,,,,,,,"));
//myFile.print(F(",,,,,,,,,,,,,,"));
myFile.print(boardHeight); //Board Height
myFile.print(F(",,,,,"));
myFile.print(ColeTimeYear); // represnets days since 1900
myFile.print(".");
if (fakeSecond > 1000000) {
fakeSecond = 10;
ColeTimeYear = ColeTimeYear + 1;
} //backstop to an end of day miss
if (fakeSecond < 100000) { //this set of statements backfills the second with leading zeros//
if (fakeSecond < 10000) {
if (fakeSecond < 1000) {
if (fakeSecond < 100) {
if (fakeSecond < 10) {
myFile.print("0");
}
myFile.print("0");
}
myFile.print("0");
}
myFile.print("0");
}
myFile.print("0");
}
myFile.print(fakeSecond); //print the int second value
myFile.print(expRecord2); //17 additional commas //User1
myFile.print(",,,,");
myFile.print(activeSailCode); //active sail //User6
myFile.print(",");
myFile.print(polarBsp); //POLAR BSP //User7
myFile.print(F(","));
myFile.print(ExpDelay); //record number since starting //User8
myFile.print(F(","));
myFile.print(totlog.value()); //total miles in b&G log //User9
myFile.print(F(","));
myFile.print(currlog.value()); //current miles in B&G Log. //User10
myFile.print(F(","));
myFile.print(finalForward); //distance accumulated in the tack //user 11
myFile.print(F(","));
myFile.print(finalLane); //final Lane sag //user 12
myFile.print(F(","));
myFile.print(preDistTot / 100); //pre tack distance //user 13
myFile.print(F(","));
myFile.print(preLaneTot); //current guage +/- //user 14
myFile.print(F(","));
myFile.print(targetBSP / 10); //calculated target BSP, //user 15
myFile.print(F(","));
myFile.print(postCounter); //Duration counter for a tack //user 16
myFile.print(F(","));
myFile.print(targetTWA); //target TWA for a tack //user 17
myFile.print(F(","));
myFile.print(markDist); //mark distance //user 18
myFile.print(F(","));
myFile.print(markMag); //target bearing //user 19
myFile.print(F(","));
myFile.print(whichPixelR); //red target pixel //user 20
myFile.print(F(","));
myFile.print(whichPixelG); //green target pixel //user 21
myFile.print(F(","));
myFile.print(whichPixelB); //blue target pixel //user 22
myFile.print(F(","));
myFile.print(isReadyToFly); //flight conditions met //user 23
myFile.print(F(","));
myFile.print(isInFlight); //in flight //user 24
myFile.print(F(","));
myFile.print(v12Actual); //12v voltage //user 25
myFile.print(F(","));
myFile.print(v12Pct); //12v state of charge //user 26
myFile.print(F(","));
myFile.print(v24Actual); //24volt Voltage //user 27
myFile.print(F(","));
myFile.print(v24Pct); //24v Percent of Charge //user 28
myFile.print(F(","));
myFile.print(IsPolarRec); //is thia a polar eval record //user 29
myFile.print(F(","));
myFile.print(ValidPolarRecCtr); //number of sequential eval records //user 30
myFile.print(F(",,,,,,,,,,,"));
myFile.println((z - 119)); // z axis of accelerometer "motion" field
myFile.close();
expCtr2 = 0;
}
#ifdef ServerDEBUG
Serial.print(" And Expedition Record ");
Serial.print(ExpDelay);
Serial.println(" Was Sent ");
#endif
}
///////////
// HEEL, PITCH, SLAM BARO and temp sensor reads ///
///////////
void readSensors() {
uint8_t howManyBytesToRead = 6;
readFrom( DATAX0, howManyBytesToRead, _buff); //read the acceleration data from the ADXL345
// each axis reading comes in 10 bit resolution, ie 2 bytes. Least Significat Byte first!!
// thus we are converting both bytes in to one int
zold = z;
x = (((int16_t)_buff[1]) << 8) | _buff[0];
y = (((int16_t)_buff[3]) << 8) | _buff[2];
z = (((int16_t)_buff[5]) << 8) | _buff[4];
x = ((x + xold) / 2);
y = ((y + yold) / 2);
//Roll and Pitch to degree Equations
roll = (atan2(-y, z) * 180.0) / M_PI;
roll = roll + heelCorrector;
pitch = (atan2(x, sqrt(y * y + z * z)) * 180.0) / M_PI;
pitch = pitch + pitchCorrector;
String PT1 = "$YXXDR,A,";
String PT2 = ",D,HEEL,A,";
String PT2P = ",D,HEEL,P,"; String PT3 = ",D,TRIM,*";
String PT4 = ",D,SLAM,*";
String PT5 = ",B,BARO,*";
//Send to the output Stream
if (XDRCounter == 2) XDRCounter = 0;
if (XDRCounter == 0)
{
// heel and trim
String XDRSTRING = PT1 + roll + PT2 + pitch + PT3;
outputMsg(XDRSTRING); // print the entire message string, and append the CRC
}
else if (XDRCounter == 2)
{
// heel and slam
String XDRSTRING = PT1 + roll + PT2 + z + PT4;
outputMsg(XDRSTRING); // print the entire message string, and append the CRC
}
else if (XDRCounter == 1)
{
//heel and barometer
float pressure4 = pressure * .01;
String XDRSTRING = PT1 + roll + PT2P + pressure4 + PT5;
outputMsg(XDRSTRING); // print the entire message string, and append the CRC
}
XDRCounter = XDRCounter + 1;
xold = x; //averaging
yold = y; //averaging
}
// -----------------------------------------------------------------------
///////////
// Wire write routine for sensors ///
///////////
void writeTo(byte address, byte val) {
Wire.beginTransmission(DEVICE); // start transmission to device
Wire.write(address); // send register address
Wire.write(val); // send value to write
Wire.endTransmission(); // end transmission
}
//////
// Wire read routine for sensors ///
//////
// Reads num bytes starting from address register on device in to _buff array
void readFrom(byte address, int num, byte _buff[]) {
Wire.beginTransmission(DEVICE); // start transmission to device
Wire.write(address); // sends address to read from
Wire.endTransmission(); // end transmission
Wire.beginTransmission(DEVICE); // start transmission to device
Wire.requestFrom(DEVICE, num); // request 6 bytes from device
int i = 0;
while (Wire.available()) // device may send less than requested (abnormal)
{
_buff = Wire.read(); // receive a byte
i++;
}
Wire.endTransmission(); // end transmission
}
//////
//////
// Tackscore calcs and output //
//////
void TackScore() {
} //end TackScore
//////
//////// XDR user variable sentence creation //
void XDRSend() {
String PT10 = "$YXXDR,G,";
String PT20 = "$YXXDR,U,";
String PT06 = ",,006,*";
String PT07 = ",,007,*";
String PT11 = ",,011,*";
String PT12 = ",,012,*";
String PT13 = ",,013,*";
String PT14 = ",,014,*";
String PT15 = ",,015,*";
String PT16 = ",,016,*";
String PT17 = ",,017,*";
String PT18 = ",,018,*";
String PT21 = ",V,025,*";
String PT26 = ",,026,*";
String PT24 = ",V,027,*";
String PT28 = ",,028,*";
String PT29 = ",,029,*";
String PT30 = ",,030,*";
if (XDRCounter2 == 3) XDRCounter2 = 0;
if (XDRCounter2 == 0)
{
String XDRSTRING = PT10 + finalForward + PT11;
outputMsg(XDRSTRING); // print the entire message string, and append the CRC
///user 12, finalane //
XDRSTRING = PT10 + finalLane + PT12;
outputMsg(XDRSTRING); // print the entire message string, and append the CRC
}
else if (XDRCounter2 == 1)
{
if (vctr >= 6) vctr = 0;
String XDRSTRING = PT10 + postCounter + PT16;
outputMsg(XDRSTRING); // print the entire message string, and append the CRC
if ((v12Record == 1) && (vctr == 0)) {
String XDRSTRING = PT10 + v12Actual + PT21;
outputMsg(XDRSTRING); // print the entire message string, and append the CRC
}
if ((v24Record == 1) && (vctr == 1)) {
String XDRSTRING = PT10 + v24Actual + PT24;
outputMsg(XDRSTRING); // print the entire message string, and append the CRC
}
if ((v24Record == 1) && (vctr == 2)) {
String XDRSTRING = PT10 + v24Pct + PT26;
outputMsg(XDRSTRING); // print the entire message string, and append the CRC
}
if ((v12Record == 1) && (vctr == 3)) {
String XDRSTRING = PT10 + v12Pct + PT28;
outputMsg(XDRSTRING); // print the entire message string, and append the CRC
}
if (vctr == 4) {
String XDRSTRING = PT10 + travPos + PT29;
outputMsg(XDRSTRING); // print the entire message string, and append the CRC
}
if (vctr == 5) {
String XDRSTRING = PT10 + activeSailCode + PT06;
outputMsg(XDRSTRING); // print the entire message string, and append the CRC
}
vctr = vctr + 1;
}
else if (XDRCounter2 == 2)
{
if (sctr == 2)sctr = 0;
if (sctr == 0) {
///user 15, targetBSP //
float targetBSPFloat = targetBSP;
targetBSPFloat = targetBSPFloat * .01;
String XDRSTRING = PT10 + targetBSPFloat + PT15;
outputMsg(XDRSTRING); // print the entire message string, and append the CRC
//user 17, targetTWA //
XDRSTRING = PT10 + targetTWA + PT17;
outputMsg(XDRSTRING); // print the entire message string, and append the CRC
}
else if (sctr == 1) {
String XDRSTRING = PT10 + polarBsp + PT07;
outputMsg(XDRSTRING); // print the entire message string, and append the CRC
//user 17, targetTWA //
XDRSTRING = PT10 + boardHeight + PT30;
outputMsg(XDRSTRING); // print the entire message string, and append the CRC
}
sctr = sctr + 1;
}
XDRCounter2 = XDRCounter2 + 1;
}
//////
//Sends CRC Appended Message ////////////////
void outputMsg(String msg) {
msg.toCharArray(CRCbuffer, sizeof(CRCbuffer)); // put complete string into CRCbuffer
int crc = convertToCRC(CRCbuffer);
if (XDRMsg == 1) {
if (s1XDRComm == 1) {
Serial1.print(msg);
if (crc < 16) Serial1.print("0");// add leading 0
Serial1.println(crc, HEX); /////////there used to be serial3 here?????????????
}
if (s3XDRComm == 1) {
Serial3.print(msg); /////////there used to be serial3 here?????????????
if (crc < 16) Serial3.print("0");// add leading 0
Serial3.println(crc, HEX);
}
if (s0XDRComm == 1) {
Serial.print(msg);
if (crc < 16) Serial.print("0");// add leading 0
Serial.println(crc, HEX);
}
}
}
//////
///creates a CRC and appends to message//////
byte convertToCRC(char *buff) {
// NMEA CRC: XOR each byte with previous for all chars between '$' and '*'
char c;
byte i;
byte start_with = 0;
byte end_with = 0;
byte CRC = 0;
byte end_set = 0;
for (i = 0; i < buff_len; i++) {
c = buff;
if (c == '$') {
start_with = i;
}
if (c == '*') {
if (end_set == 0) {
end_with = i;
end_set = 1;
}
}
}
if (end_with > start_with) {
for (i = start_with + 1; i < end_with; i++) { // XOR every character between '$' and '*'
CRC = CRC ^ buff ; // compute CRC
}
}
else { // print locations if error
Serial.println("CRC ERROR");
Serial.println("CRC ERROR");
}
return CRC;
//based on code by Elimeléc López - July-19th-2013
}
//////
void WriteSettings() {
int commaloc = inData2.indexOf(',');
int commaloc2 = inData2.indexOf(',', commaloc + 1);
int commaloc3 = inData2.indexOf(',', commaloc2 + 1);
int commaloc4 = inData2.indexOf(',', commaloc3 + 1);
int commaloc5 = inData2.indexOf(',', commaloc4 + 1);
int commaloc6 = inData2.indexOf(',', commaloc5 + 1);
String settingType = inData2.substring(commaloc + 1, commaloc2);
String settingVal = inData2.substring(commaloc2 + 1, commaloc3);
myFile = SD.open("settings.txt", FILE_WRITE);
myFile.print("[");
myFile.print(settingType);
myFile.print("=");
myFile.print(settingVal);
myFile.println("]");
myFile.close();
Serial.print("The settings File has been updated with: ");
Serial.print(settingType);
Serial.print(" = ");
Serial.println(settingVal);
myFile = SD.open("syslog.txt", FILE_WRITE);
myFile.print("The settings File has been updated with: ");
myFile.print(settingType);
myFile.print("=");
myFile.println(settingVal);
myFile.close();
applySetting(settingType, settingVal);
}
//////
void ReadSettings() {
Serial.println("Current Server Settings. to update type upstg,var,val, ");
ShowIpInfo();
Serial.print("startno: ");
Serial.println(startNo);
Serial.print("leapdays: ");
Serial.println(LeapDays);
Serial.print("targetspeedmultiplier: ");
Serial.println(targetSpeedMultiplier);
Serial.print("twscorrectorup: ");
Serial.println(twsCorrectorUP);
Serial.print("twscorrectordn: ");
Serial.println(twsCorrectorDN);
Serial.print("heelcorrector: ");
Serial.println(heelCorrector);
Serial.print("targetSpeedAVG: ");
Serial.println(targetSpeedAVG);
Serial.print("pitchcorrector: ");
Serial.println(pitchCorrector);
Serial.print("pressureoffset: ");
Serial.println(baroffset);
Serial.print("flightrange: ");
Serial.println(isInFlightRange);
Serial.print("flightspdmin: ");
Serial.println(bspFlightMin);
//Serial.print("flightpresscorrect ");
//Serial.println(flightPressCorrector);
//Serial.print("pressureoffset: ");
//Serial.println(offset);
Serial.println( );
Serial.println("current soft switch settings");
Serial.print("serveron: ");
Serial.println(serverON);
Serial.print("paddleselector: ");
Serial.println(paddleSelector);
Serial.print("tackscore: ");
Serial.println(tackScore);
Serial.print("wifly: ");
Serial.println(wiFly);
Serial.print("directlog: ");
Serial.println(directLog);
Serial.print("sensor: ");
Serial.println(Sensor);
Serial.print("barometet: ");
Serial.println(Barometer);
Serial.print("expedition: ");
Serial.println(Expedition);
Serial.print("NMEAPlay: ");
Serial.println(NMEAPlay);
Serial.print("expFreq: ");
Serial.println(expFreq);
Serial.println( );
}
//////
///Reads the System Logfile /////////////////
void ReadLog() {
String inData4;
char recieved4;
File myFile = SD.open("syslog.txt");
if (myFile)
{
Serial.println(" SYSLOG.TXT file found. printing contents:");
while (myFile.available())
{
recieved4 = myFile.read();
inData4 += recieved4;
if (recieved4 == '\n') // Process message when new line character is recieved
{
Serial.print(inData4);
inData4 = "";
}
}
}
}
//////
///Reads the Named Expedition Log File///////
void ReadExpeditionLog() {
String inData4;
char recieved4;
Serial.print("Looking for File ");
int commaloc = inData2.indexOf(',');
int commaloc2 = inData2.indexOf(',', commaloc + 1);
int commaloc3 = inData2.indexOf(',', commaloc2 + 1);
String ExpFileString1 = inData2.substring(commaloc + 1, commaloc2);
String ExpFileString = inData2.substring(commaloc2 + 1, commaloc3);
Serial.print(ExpFileString1);
ExpFileString1.toCharArray(ExpFile, 13);
File myFile = SD.open(ExpFile);
if (myFile)
{
Serial.println("file found. printing contents:");
while (myFile.available())
{
recieved4 = myFile.read();
inData4 += recieved4;
if (recieved4 == '\n') // Process message when new line character is recieved
{
Serial.print(inData4);
inData4 = "";
}
}
}
}
//////
///Lists the Contents of the SD Card/////////
void ListSDC() {
Sd2Card card;
SdVolume volume;
SdFile root;
// print the type of card
Serial.print("\nCard type: ");
switch (card.type()) {
case SD_CARD_TYPE_SD1:
Serial.println("SD1");
break;
case SD_CARD_TYPE_SD2:
Serial.println("SD2");
break;
case SD_CARD_TYPE_SDHC:
Serial.println("SDHC");
break;
default:
Serial.println("Unknown");
}
// Now we will try to open the 'volume'/'partition' - it should be FAT16 or FAT32
if (!volume.init(card)) {
Serial.println("Could not find FAT16/FAT32 partition.\nMake sure you've formatted the card");
return;
}
Serial.println("\nFiles found on the card (name, date and size in bytes): ");
root.openRoot(volume);
// list all files in the card with date and size
root.ls(LS_R | LS_DATE | LS_SIZE);
}
//////
///Removes the NMEA log from the SD card/////
void rmNMEALog() {
SD.remove("NMEALOG.txt");
}
//////
///Reads the Settings.txt file and sets variables/////////////////
void readSDSettings() {
char character;
String settingName;
String settingValue;
File myFile = SD.open("settings.txt");
if (myFile)
{
Serial.println(" SETTINGS.TXT file found: getting Configuration");
while (myFile.available()) {
character = myFile.read();
while ((myFile.available()) && (character != '[')) {
character = myFile.read();
}
character = myFile.read();
while ((myFile.available()) && (character != '=')) {
settingName = settingName + character;
character = myFile.read();
}
character = myFile.read();
while ((myFile.available()) && (character != ']')) {
settingValue = settingValue + character;
character = myFile.read();
}
if (character == ']') {
//Debuuging Printing
Serial.print("Name:");
Serial.println(settingName);
Serial.print("Value :");
Serial.println(settingValue);
// Apply the value to the parameter
applySetting(settingName, settingValue);
// Reset Strings
settingName = "";
settingValue = "";
}
}
// close the file:
myFile.close();
} else {
// if the file didn't open, print an error:
Serial.println("error opening settings.txt");
}
}
//////
///adds a line to settings.txt///////////////
void writeSDSettings() {
// Delete the old One
SD.remove("settings.txt");
// Create new one
myFile = SD.open("settings.txt", FILE_WRITE);
// writing in the file works just like regular print()/println() function
myFile.print("[");
myFile.print("exINT=");
myFile.print(exINT);
myFile.println("]");
myFile.print("[");
myFile.print("exFloat=");
myFile.print(exFloat, 5);
myFile.println("]");
myFile.print("[");
myFile.print("exBoolean=");
myFile.print(exBoolean);
myFile.println("]");
myFile.print("[");
myFile.print("exLong=");
myFile.print(exLong);
myFile.println("]");
// close the file:
myFile.close();
//Serial.println("Writing done.");
}
//////
//Ethernet - main process/////
void checkServer() {
EthernetClient client = server.available();
if (client) {
boolean currentLineIsBlank = true;
boolean currentLineIsGet = true;
int tCount = 0;
char tBuf[254];
int r, t;
int parmValue;
char *pch;
char methodBuffer[8];
char requestBuffer[48];
char pageBuffer[48];
char paramBuffer[48];
char protocolBuffer[9];
char fileName[32];
char fileType[4];
int clientCount = 0;
requestNumber++;
#ifdef ServerDEBUG
Serial.print(F("\r\nClient request #"));
Serial.print(requestNumber);
Serial.print(F(": "));
#endif
// this controls the timeout
int loopCount = 0;
while (client.connected()) {
while (client.available()) {
// if packet, reset loopCount
loopCount = 0;
char c = client.read();
if (currentLineIsGet && tCount < 63)
{
tBuf[tCount] = c;
tCount++;
tBuf[tCount] = 0;
}
if (c == '\n' && currentLineIsBlank) {
#ifdef ServerDEBUG
Serial.print(tBuf);
#endif
// Serial.print(F("POST data: "));
while (client.available()) client.read();
int scanCount = sscanf(tBuf, "%7s %47s %8s", methodBuffer, requestBuffer, protocolBuffer);
if (scanCount != 3) {
#ifdef ServerDEBUG
Serial.println(F("bad request"));
#endif
sendBadRequest(client);
return;
}
char* pch = strtok(requestBuffer, "?");
if (pch != NULL) {
strncpy(fileName, pch, 31);
strncpy(tBuf, pch, 31);
pch = strtok(NULL, "?");
if (pch != NULL) {
strcpy(paramBuffer, pch);
}
else paramBuffer[0] = 0;
}
strtoupper(requestBuffer);
strtoupper(tBuf);
for (int x = 0; x < strlen(requestBuffer); x++) {
if (strchr(legalChars, requestBuffer[x]) == NULL) {
Serial.println(F("bad character"));
sendBadRequest(client);
return;
}
}
#ifdef ServerDEBUG
Serial.print(F("file = "));
Serial.println(requestBuffer);
#endif
pch = strtok(tBuf, ".");
if (pch != NULL) {
pch = strtok(NULL, ".");
if (pch != NULL) strncpy(fileType, pch, 4);
else fileType[0] = 0;
//#ifdef ServerDEBUG
if (statMsg == 1) Serial.print(F("file type = "));
if (statMsg == 1) Serial.println(fileType);
if (fileType == "LOG") {
ExpReady = 0; //
Serial.println("trapped LOG");
}
//#endif
}
#ifdef ServerDEBUG
Serial.print(F("method = "));
Serial.println(methodBuffer);
#endif
if (strcmp(methodBuffer, "GET") != 0 && strcmp(methodBuffer, "HEAD") != 0) {
sendBadRequest(client);
return;
}
#ifdef ServerDEBUG
Serial.print(F("params = "));
Serial.println(paramBuffer);
Serial.print(F("protocol = "));
Serial.println(protocolBuffer);
#endif
////Ethernet Dynamic page type selector///////////////
// if dynamic page name
if (strcmp(requestBuffer, "/BSPTWA.PHP") == 0) {
displayPageType = 1;
//displayColorMode = 1;
if (statMsg == 1) Serial.println("BSPTWA page requested");
}
else if (strcmp(requestBuffer, "/MYTEST.PHP") == 0) {
displayPageType = 0;
//displayColorMode = 1;
if (statMsg == 1) Serial.println("mytest page requested");
}
else if (strcmp(requestBuffer, "/BSPHDG.PHP") == 0) {
displayPageType = 2;
//displayColorMode = 1;
if (statMsg == 1) Serial.println("BSPHDG page requested");
}
else if (strcmp(requestBuffer, "/HDGTWA.PHP") == 0) {
displayPageType = 3;
//displayColorMode = 1;
if (statMsg == 1) Serial.println("HDGTWA page requested");
}
else if (strcmp(requestBuffer, "/BSPTRG.PHP") == 0) {
displayPageType = 4;
//displayColorMode = 1;
if (statMsg == 1) Serial.println("BSPTRG page requested");
}
else if (strcmp(requestBuffer, "/BSPTCT.PHP") == 0) {
displayPageType = 5;
//displayColorMode = 1;
if (statMsg == 1) Serial.println("bsptct page requested");
}
else if (strcmp(requestBuffer, "/RNGBRG.PHP") == 0) {
displayPageType = 6;
//displayColorMode = 1;
if (statMsg == 1) Serial.println("rngbrg page requested");
}
else if (strcmp(requestBuffer, "/SUMMARY.PHP") == 0) {
displayPageType = 7;
//displayColorMode = 1;
if (statMsg == 1) Serial.println("summary page requested");
}
else if (strcmp(requestBuffer, "/FLIGHT.PHP") == 0) {
displayPageType = 8;
//displayColorMode = 1;
if (statMsg == 1) Serial.println("flight page requested");
}
else if (strcmp(requestBuffer, "/TACKSCORE.PHP") == 0) {
displayPageType = 9;
//displayColorMode = 1;
if (statMsg == 1) Serial.println("TACKSCORE page requested");
}
else if (strcmp(requestBuffer, "/LISTFILES.PHP") == 0) {
displayPageType = 10;
//displayColorMode = 1;
if (statMsg == 1) Serial.println("listfiles page requested");
}
else if (strcmp(requestBuffer, "/SETTINGS.PHP") == 0) {
displayPageType = 11;
//displayColorMode = 1;
if (statMsg == 1) Serial.println("settings page requested");
}
else if (strcmp(requestBuffer, "/BATT.PHP") == 0) {
displayPageType = 12;
//displayColorMode = 1;
if (statMsg == 1) Serial.println("BATT page requested");
}
else if (strcmp(requestBuffer, "/DOT.PHP") == 0) {
displayPageType = 13;
//displayColorMode = 1;
if (statMsg == 1) Serial.println("BSPTRG page requested");
}
else if (strcmp(requestBuffer, "/BSPPOL.PHP") == 0) {
displayPageType = 14;
//displayColorMode = 1;
if (statMsg == 1) Serial.println("BSPTRG page requested");
}
else if (strcmp(requestBuffer, "/COMM.PHP") == 0) {
displayPageType = 15;
//displayColorMode = 1;
if (statMsg == 1) Serial.println("COMM page requested");
}
else if (strcmp(requestBuffer, "/FEAT.PHP") == 0) {
displayPageType = 16;
//displayColorMode = 1;
if (statMsg == 1) Serial.println("feature page requested");
}
else if (strcmp(requestBuffer, "/FEA2.PHP") == 0) {
displayPageType = 17;
//displayColorMode = 1;
if (statMsg == 1) Serial.println("feature 2 page requested");
}
else if (strcmp(requestBuffer, "/SAIL.PHP") == 0) {
displayPageType = 18;
//displayColorMode = 1;
if (statMsg == 1) Serial.println("sailelect page requested");
}
else if (strcmp(requestBuffer, "/MODE.PHP") == 0) {
displayPageType = 19;
//displayColorMode = 1;
if (statMsg == 1) Serial.println("mytest page requested");
}
//
////Home Page From SD Card///////////////
else {
if (strcmp(fileName, "/") == 0) {
strcpy(fileName, "/INDEX.HTM");
strcpy(fileType, "HTM");
includeDate = 0;
#ifdef ServerDEBUG
Serial.print(F("Home page "));
#endif
}
#ifdef ServerDEBUG
Serial.println(F("SD file"));
#endif
if (strlen(fileName) > 30) {
#ifdef ServerDEBUG
Serial.println(F("filename too long"));
#endif
sendBadRequest(client);
return;
}
else if (strlen(fileType) > 3 || strlen(fileType) < 1) {
#ifdef ServerDEBUG
Serial.println(F("file type invalid size"));
#endif
sendBadRequest(client);
return;
}
else {
#ifdef ServerDEBUG
Serial.println(F("filename format ok"));
#endif
if (SD.exists(fileName)) {
#ifdef ServerDEBUG
Serial.print(F("file found.."));
#endif
File myFile = SD.open(fileName);
ExpReady = 2;
if (!myFile) {
#ifdef ServerDEBUG
Serial.println(F("open error"));
#endif
sendFileNotFound(client);
return;
}
#ifdef ServerDEBUG
else Serial.print(F("opened.."));
#endif
strcpy_P(tBuf, PSTR("HTTP/1.0 200 OK\r\nContent-Type: "));
// client.write(tBuf);
// client.print(F("HTTP/1.0 200 OK\r\nContent-Type: "));
// send Content-Type
if (strcmp(fileType, "HTM") == 0) strcat_P(tBuf, PSTR("text/html"));
else if (strcmp(fileType, "PHP") == 0) strcat_P(tBuf, PSTR("text/html"));
else if (strcmp(fileType, "TXT") == 0) strcat_P(tBuf, PSTR("text/plain"));
else if (strcmp(fileType, "CSS") == 0) strcat_P(tBuf, PSTR("text/css"));
else if (strcmp(fileType, "GIF") == 0) strcat_P(tBuf, PSTR("image/gif"));
else if (strcmp(fileType, "JPG") == 0) strcat_P(tBuf, PSTR("image/jpeg"));
else if (strcmp(fileType, "JS") == 0) strcat_P(tBuf, PSTR("application/javascript"));
else if (strcmp(fileType, "CSV") == 0) strcat_P(tBuf, PSTR("application/expedition"));
else if (strcmp(fileType, "ICO") == 0) strcat_P(tBuf, PSTR("image/x-icon"));
else if (strcmp(fileType, "PNG") == 0) strcat_P(tBuf, PSTR("image/png"));
else if (strcmp(fileType, "PDF") == 0) strcat_P(tBuf, PSTR("application/pdf"));
else if (strcmp(fileType, "ZIP") == 0) strcat_P(tBuf, PSTR("application/zip"));
else strcat_P(tBuf, PSTR("text/plain"));
strcat_P(tBuf, PSTR("\r\nConnection: close\r\n\r\n"));
client.write(tBuf);
if (strcmp(methodBuffer, "GET") == 0) {
#ifdef ServerDEBUG
Serial.print(F("send.."));
#endif
while (myFile.available()) {
tBuf[clientCount] = myFile.read();
clientCount++;
tBuf[clientCount] = 0;
if (clientCount > 63) {
client.write((byte*)tBuf, 64);
clientCount = 0;
}
}
if (clientCount > 0) {
client.write((byte*)tBuf, clientCount);
}
}
// end this attempt
myFile.close();
#ifdef ServerDEBUG
Serial.println(F("closed"));
#endif
if (includeDate == 0)
{
////////conditional content appended to Index.htm///
Serial.println("include the Date line");
strcpy_P(tBuf, PSTR("<a href=\"HTTP://192.168.8.10/"));
client.write(tBuf);
strcpy_P(tBuf, PSTR(logFile));
client.write(tBuf);
strcpy_P(tBuf, PSTR("\"> <H2> Download active log file: "));
client.write(tBuf);
strcpy_P(tBuf, PSTR(logFile));
client.write(tBuf);
strcpy_P(tBuf, PSTR("</H2></a><p></p>"));
client.write(tBuf);
strcpy_P(tBuf, PSTR("<a href=\"HTTP://192.168.8.10/settings.txt"));
client.write(tBuf);
strcpy_P(tBuf, PSTR("\"> <H3> Server Settings "));
client.write(tBuf);
strcpy_P(tBuf, PSTR("</H3></a><p></p>"));
client.write(tBuf);
strcpy_P(tBuf, PSTR("<a href=\"HTTP://192.168.8.10/syslog.txt"));
client.write(tBuf);
strcpy_P(tBuf, PSTR("\"> <H3> Startup Log "));
client.write(tBuf);
strcpy_P(tBuf, PSTR("</H3></a><p></p>"));
client.write(tBuf);
strcpy_P(tBuf, PSTR("<a href=\"HTTP://192.168.8.10/LISTFILES.PHP"));
client.write(tBuf);
strcpy_P(tBuf, PSTR("\"> <H3> SD card File Listing"));
client.write(tBuf);
strcpy_P(tBuf, PSTR("</H3></a><p></p>"));
client.write(tBuf);
strcpy_P(tBuf, PSTR("<a href=\"HTTP://192.168.8.10/BSPTWA.PHP"));
client.write(tBuf);
strcpy_P(tBuf, PSTR("\"> <H3> Instrument Display"));
client.write(tBuf);
strcpy_P(tBuf, PSTR("</H3></a><p></p>"));
client.write(tBuf);
strcpy_P(tBuf, PSTR("<a href=\"HTTP://192.168.8.10/SAIL.PHP"));
client.write(tBuf);
strcpy_P(tBuf, PSTR("\"> <H3> System Tuning"));
client.write(tBuf);
includeDate = 1;
}
client.stop();
#ifdef ServerDEBUG
Serial.println(F("disconnected"));
#endif
return;
}
else {
#ifdef ServerDEBUG
Serial.println(F("File not found"));
#endif
sendFileNotFound(client);
return;
}
}
}
pch = strtok(paramBuffer, "&");
while (pch != NULL)
{
if (strncmp(pch, "a=", 2) == 0) ////////////////flight tws minimum
{
parmValue = atoi(pch + 2);
if (parmValue >= 0 && parmValue < 8) twsFlightMin = parmValue;
}
if (strncmp(pch, "b=", 2) == 0) ///dot brightness
{
parmValue = atoi(pch + 2);
if (parmValue >= 0 && parmValue < 8) dotBrightess = parmValue; // bounds check
}
if (strncmp(pch, "c=", 2) == 0) ////centerpixel
{
parmValue = atoi(pch + 2);
if (parmValue == 0) centerPixel = centerPixel - 2;
else if (parmValue == 1) centerPixel = centerPixel + 2;
else if (parmValue == 2) centerPixel = centerPixel - 1;
else if (parmValue == 3) centerPixel = centerPixel + 1;
else if (parmValue == 4) centerPixel = centerPixel - 5;
else if (parmValue == 5) centerPixel = centerPixel + 5;
if (centerPixel <= 1) centerPixel = 1;
if (centerPixel >= NUMPIXELS) centerPixel = NUMPIXELS - 2;
}
if (strncmp(pch, "d=", 2) == 0) //logging paramater
{
parmValue = atoi(pch + 2);
if (parmValue == 0) {
directLog = 0;
NMEALog = 0;
Expedition = 0;
}
else if (parmValue == 1) {
directLog = 1;
NMEALog = 0;
Expedition = 1;
}
else if (parmValue == 2) {
directLog = 0;
NMEALog = 1;
Expedition = 0;
}
}
if (strncmp(pch, "e=", 2) == 0) ////board height
{
travPos = atof(pch + 2);
}
if (strncmp(pch, "f=", 2) == 0) //////////////neo min target floor
{
parmValue = atoi(pch + 2);
if (parmValue >= 20 && parmValue < 100) neoMinTargetFloor = parmValue;
}
if (strncmp(pch, "g=", 2) == 0) //////////////flightspdmin
{
parmValue = atoi(pch + 2);
if (parmValue == 0) bspFlightMin = bspFlightMin - 200;
else if (parmValue == 1) bspFlightMin = bspFlightMin + 200;
else if (parmValue == 2) bspFlightMin = bspFlightMin - 100;
else if (parmValue == 3) bspFlightMin = bspFlightMin + 100;
else if (parmValue == 4) bspFlightMin = bspFlightMin - 50;
else if (parmValue == 5) bspFlightMin = bspFlightMin + 50;
}
if (strncmp(pch, "h=", 2) == 0) //caution roll
{
parmValue = atoi(pch + 2);
if (parmValue == 0) cautionRoll = cautionRoll - 2;
else if (parmValue == 1) cautionRoll = cautionRoll + 2;
else if (parmValue == 2) cautionRoll = cautionRoll - 1;
else if (parmValue == 3) cautionRoll = cautionRoll + 1;
else if (parmValue == 4) cautionRoll = cautionRoll - 5;
else if (parmValue == 5) cautionRoll = cautionRoll + 5;
}
if (strncmp(pch, "i=", 2) == 0) ///pitch corrector
{
parmValue = atoi(pch + 2);
if (parmValue >= -20 && parmValue < 45) pitchCorrector = parmValue;
}
if (strncmp(pch, "j=", 2) == 0) //////////////flightspdmin
{
parmValue = atoi(pch + 2);
if (parmValue == 0) twsFlightMin = twsFlightMin - 200;
else if (parmValue == 1) twsFlightMin = twsFlightMin + 200;
else if (parmValue == 2) twsFlightMin = twsFlightMin - 100;
else if (parmValue == 3) twsFlightMin = twsFlightMin + 100;
else if (parmValue == 4) twsFlightMin = twsFlightMin - 50;
else if (parmValue == 5) twsFlightMin = twsFlightMin + 50;
}
if (strncmp(pch, "k=", 2) == 0) //////////////flightspdmin
{
parmValue = atoi(pch + 2);
if (parmValue == 0) targetSpeedMultiplier = targetSpeedMultiplier - 2;
else if (parmValue == 1) targetSpeedMultiplier = targetSpeedMultiplier + 2;
else if (parmValue == 2) targetSpeedMultiplier = targetSpeedMultiplier - 1;
else if (parmValue == 3) targetSpeedMultiplier = targetSpeedMultiplier + 1;
else if (parmValue == 4) targetSpeedMultiplier = targetSpeedMultiplier - 5;
else if (parmValue == 5) targetSpeedMultiplier = targetSpeedMultiplier + 5;
}
if (strncmp(pch, "l=", 2) == 0) ///pitch corrector
{
parmValue = atoi(pch + 2);
if (parmValue >= -20 && parmValue < 45) pitchCorrector = parmValue;
}
if (strncmp(pch, "m=", 2) == 0) ///////dot mode
{
parmValue = atoi(pch + 2);
if (parmValue > 0 && parmValue < 4) dotMode = parmValue;
}
if (strncmp(pch, "n=", 2) == 0) /////ready mode
{
parmValue = atoi(pch + 2);
if (parmValue > 0 && parmValue < 5) isReadyMode = parmValue;
}
if (strncmp(pch, "o=", 2) == 0) /////ready mode
{
parmValue = atoi(pch + 2);
if (parmValue == 1) WriteTune();
}
if (strncmp(pch, "p=", 2) == 0) //////////////trget speed multiplier
{
parmValue = atoi(pch + 2);
if (parmValue > 1 && parmValue < 300) targetSpeedMultiplier = parmValue;
}
if (strncmp(pch, "q=", 2) == 0) //////////////trget speed multiplier
{
parmValue = atoi(pch + 2);
if (parmValue == 0) warningRoll = warningRoll - 2;
else if (parmValue == 1) warningRoll = warningRoll + 2;
else if (parmValue == 2) warningRoll = warningRoll - 1;
else if (parmValue == 3) warningRoll = warningRoll + 1;
else if (parmValue == 4) warningRoll = warningRoll - 5;
else if (parmValue == 5) warningRoll = warningRoll + 5;
}
if (strncmp(pch, "r=", 2) == 0) ////heel corrector
{
parmValue = atoi(pch + 2);
if (parmValue > -5 && parmValue < 20) heelCorrector = parmValue;
}
if (strncmp(pch, "t=", 2) == 0) ///heel corrector
{
parmValue = atoi(pch + 2);
displayColorMode = parmValue;
}
if (strncmp(pch, "v=", 2) == 0) ////////////minimum flight speed
{
parmValue = atoi(pch + 2);
//if(parmValue >0 && parmValue<50000) bspFlightMin = parmValue;
}
if (strncmp(pch, "w=", 2) == 0) ///comm selector
{
parmValue = atoi(pch + 2);
if (parmValue == 0) s0PIXComm = 0;
else if (parmValue == 1) s0PIXComm = 1;
else if (parmValue == 2) s1PIXComm = 0;
else if (parmValue == 3) s1PIXComm = 1;
else if (parmValue == 4) s3PIXComm = 0;
else if (parmValue == 5) s3PIXComm = 1;
else if (parmValue == 6) s0XDRComm = 0;
else if (parmValue == 7) s0XDRComm = 1;
else if (parmValue == 8) s1XDRComm = 0;
else if (parmValue == 9) s1XDRComm = 1;
else if (parmValue == 10) s3XDRComm = 0;
else if (parmValue == 11) s3XDRComm = 1;
else if (parmValue == 12) s1NMEAComm = 0;
else if (parmValue == 13) s1NMEAComm = 1;
else if (parmValue == 14) s3NMEAComm = 0;
else if (parmValue == 15) s3NMEAComm = 1;
else if (parmValue == 16) NMEAPlay = 0;
else if (parmValue == 17) NMEAPlay = 1;
}
if (strncmp(pch, "x=", 2) == 0) ///sail selector
{
parmValue = atoi(pch + 2);
if (parmValue == 0) activeSailCode = 400;
else if (parmValue == 1) activeSailCode = 100;
else if (parmValue == 2) activeSailCode = 200;
else if (parmValue == 3) activeSailCode = 300;
else if (parmValue == 4) activeSailCode = 500;
else if (parmValue == 5) activeSailCode = activeSailCode + 50;
else if (parmValue == 6) activeSailCode = activeSailCode + 25;
else if (parmValue == 7) activeSailCode = activeSailCode + 12;
}
if (strncmp(pch, "y=", 2) == 0) ////board height
{
boardHeight = atof(pch + 2);
}
if (strncmp(pch, "z=", 2) == 0) ///sail selector
{
parmValue = atoi(pch + 2);
if (parmValue == 0) tackScoreData = 0;
else if (parmValue == 1) tackScoreData = 1;
else if (parmValue == 10) serverON = 0;
else if (parmValue == 11) serverON = 1;
else if (parmValue == 20) wiFly = 0;
else if (parmValue == 21) wiFly = 1;
else if (parmValue == 30) v12Record = 0;
else if (parmValue == 31) v12Record = 1;
else if (parmValue == 32) v24Record = 0;
else if (parmValue == 33) v24Record = 1;
else if (parmValue == 34) {
v12Record = 0;
v24Record = 0;
}
else if (parmValue == 35) {
v12Record = 1;
v24Record = 1;
}
else if (parmValue == 40) Sensor = 0;
else if (parmValue == 41) Sensor = 1;
else if (parmValue == 42) Barometer = 0;
else if (parmValue == 43) {
Sensor = 0;
Barometer = 0;
}
else if (parmValue == 44) {
Sensor = 1;
Barometer = 1;
}
else if (parmValue == 50) paddleSelector = 1;
else if (parmValue == 51) paddleSelector = 2;
else if (parmValue == 60) PIXGenerate = 0;
else if (parmValue == 61) PIXGenerate = 1;
else if (parmValue == 70) PIXGenerate = 0;
else if (parmValue == 71) PIXGenerate = 1;
else if (parmValue == 72) PIXGenerate = 2;
else if (parmValue == 73) PIXGenerate = 3;
else if (parmValue == 74) PIXGenerate = 4;
else if (parmValue == 75) PIXGenerate = 5;
else if (parmValue == 76) PIXGenerate = 6;
else if (parmValue == 77) PIXGenerate = 7;
else if (parmValue == 78) PIXGenerate = 8;
else if (parmValue == 79) PIXGenerate = 9;
}
pch = strtok(NULL, "& ");
}
client.print(F("HTTP/1.1 200 OK\r\nContent-Type: text/html\r\n\r\n"));
if (strcmp(methodBuffer, "GET") == 0) {
/////////////////Dynamic Web Pages////
//////////boaspeed - true wind angle //
if (displayPageType == 1)
{
if (displayColorMode == 1) strcpy_P(tBuf, PSTR("<!DOCTYPE html><html><meta http-equiv=refresh content=1.5><body style=color:black;background-color:white;font-family:Verdana;font-weight:bold;><body><span style=font-size:28px;><center>Boatspeed"));
else strcpy_P(tBuf, PSTR("<!DOCTYPE html><html><meta http-equiv=refresh content=1.5><body style=background-color:black;color:white;font-family:Verdana;font-weight:bold;><body><span style=font-size:28px;><center>Boatspeed"));
client.write(tBuf);
strcpy_P(tBuf, PSTR("</span></p><span style=font-size:200px;line-height:53%;><center>"));
client.write(tBuf);
float wBspFloat = bspInt * .01;
dtostrf(wBspFloat, 5, 2, tBuf);
client.write(tBuf);
strcpy_P(tBuf, PSTR("</span></a><span style=font-size:10px;><hr></span><span style=font-size:28px;line-height:100%;><center>Wind Angle TRUE</span></p><span style=font-size:200px;line-height:53%;><center>"));
client.write(tBuf);
itoa (twaInt, tBuf, 10);
client.write(tBuf);
if (displayColorMode == 1) strcpy_P(tBuf, PSTR("<span style=font-size:20px;line-height:0%;><p align=left><a href=bsptwa.php?t=0>∗ <p align=right><a href=bsphdg.php?t=1>→ </P></span></a></span></a></body></html>"));
else strcpy_P(tBuf, PSTR("<span style=font-size:20px;line-height:0%;><p align=left><a href=bsptwa.php?t=1>∗ <p align=right><a href=bsphdg.php?t=0>→ </P></span></a></span></a></body></html>"));
client.write(tBuf);
}
//////////Boaspeed - Heading //////
else if (displayPageType == 2)
{
if (displayColorMode == 1) strcpy_P(tBuf, PSTR("<!DOCTYPE html><html><meta http-equiv=refresh content=1.5><body style=color:black;background-color:white;font-family:Verdana;font-weight:bold;><body><span style=font-size:28px;><center>Boatspeed"));
else strcpy_P(tBuf, PSTR("<!DOCTYPE html><html><meta http-equiv=refresh content=1.5><body style=background-color:black;color:white;font-family:Verdana;font-weight:bold;><body><span style=font-size:28px;><center>Boatspeed"));
client.write(tBuf);
strcpy_P(tBuf, PSTR("</span></p><span style=font-size:200px;line-height:53%;><center>"));
client.write(tBuf);
float wBspFloat = bspInt * .01;
dtostrf(wBspFloat, 5, 2, tBuf);
client.write(tBuf);
strcpy_P(tBuf, PSTR("</span></a><span style=font-size:10px;><hr></span><span style=font-size:28px;line-height:100%;><center>Heading</span></p><span style=font-size:200px;line-height:53%;><center>"));
client.write(tBuf);
itoa (hdmInt, tBuf, 10);
client.write(tBuf);
if (displayColorMode == 1) strcpy_P(tBuf, PSTR("<span style=font-size:20px;line-height:0%;><p align=left><a href=bsphdg.php?t=0>∗ <p align=right><a href=hdgtwa.php?t=1>→ </P></span></a></span></a></body></html>"));
else strcpy_P(tBuf, PSTR("<span style=font-size:20px;line-height:0%;><p align=left><a href=bsphdg.php?t=1>∗ <p align=right><a href=hdgtwa.php?t=0>→ </P></span></a></span></a></body></html>"));
client.write(tBuf);
}
//////////Heading - True Wind Angle //////
else if (displayPageType == 3) ///////////heading - true wind angle
{
if (displayColorMode == 1) strcpy_P(tBuf, PSTR("<!DOCTYPE html><html><meta http-equiv=refresh content=1.5><body style=color:black;background-color:white;font-family:Verdana;font-weight:bold;><body><span style=font-size:28px;><center>Heading"));
else strcpy_P(tBuf, PSTR("<!DOCTYPE html><html><meta http-equiv=refresh content=1.5><body style=background-color:black;color:white;font-family:Verdana;font-weight:bold;><body><span style=font-size:28px;><center>Heading"));
client.write(tBuf);
strcpy_P(tBuf, PSTR("</span></p><span style=font-size:200px;line-height:53%;><center>"));
client.write(tBuf);
itoa (hdmInt, tBuf, 10);
client.write(tBuf);
strcpy_P(tBuf, PSTR("</span></a><span style=font-size:10px;><hr></span><span style=font-size:28px;line-height:100%;><center>Wing Angle TRUE</span></p><span style=font-size:200px;line-height:53%;><center>"));
client.write(tBuf);
itoa (twaInt, tBuf, 10);
client.write(tBuf);
if (displayColorMode == 1) strcpy_P(tBuf, PSTR("<span style=font-size:20px;line-height:0%;><p align=left><a href=hdgtwa.php?t=0>∗ <p align=right><a href=bsptrg.php?t=1>→ </P></span></a></span></a></body></html>"));
else strcpy_P(tBuf, PSTR("<span style=font-size:20px;line-height:0%;><p align=left><a href=hdgtwa.php?t=1>∗ <p align=right><a href=bsptrg.php?t=0>→ </P></span></a></span></a></body></html>"));
client.write(tBuf);
}
//////////Boaspeed - Target Speed //////
else if (displayPageType == 4)
{
if (displayColorMode == 1) strcpy_P(tBuf, PSTR("<!DOCTYPE html><html><meta http-equiv=refresh content=1.5><body style=color:black;background-color:white;font-family:Verdana;font-weight:bold;><body><span style=font-size:28px;><center>Boatspeed"));
else strcpy_P(tBuf, PSTR("<!DOCTYPE html><html><meta http-equiv=refresh content=1.5><body style=background-color:black;color:white;font-family:Verdana;font-weight:bold;><body><span style=font-size:28px;><center>Boatspeed"));
client.write(tBuf);
strcpy_P(tBuf, PSTR("</span></p><span style=font-size:200px;line-height:53%;><center>"));
client.write(tBuf);
float wBspFloat = bspInt * .01;
dtostrf(wBspFloat, 5, 2, tBuf);
client.write(tBuf);
strcpy_P(tBuf, PSTR("</span></a><span style=font-size:10px;><hr></span><span style=font-size:28px;line-height:100%;><center>Target BSP</span></p><span style=font-size:200px;line-height:53%;><center>"));
client.write(tBuf);
float trgBspFloat = targetBSPAvg * .01;
dtostrf(trgBspFloat, 5, 2, tBuf);
client.write(tBuf);
if (displayColorMode == 1) strcpy_P(tBuf, PSTR("<span style=font-size:20px;line-height:0%;><p align=left><a href=bsptrg.php?t=0>∗ <p align=right><a href=bsptct.php?t=1>→ </P></span></a></span></a></body></html>"));
else strcpy_P(tBuf, PSTR("<span style=font-size:20px;line-height:0%;><p align=left><a href=bsptrg.php?t=1>∗ <p align=right><a href=bsptct.php?t=0>→ </P></span></a></span></a></body></html>"));
client.write(tBuf);
}
//////////Boaspeed - Target Speed Percentage ///
else if (displayPageType == 5)
{
if (displayColorMode == 1) strcpy_P(tBuf, PSTR("<!DOCTYPE html><html><meta http-equiv=refresh content=1.5><body style=color:black;background-color:white;font-family:Verdana;font-weight:bold;><body><span style=font-size:28px;><center>Boatspeed"));
else strcpy_P(tBuf, PSTR("<!DOCTYPE html><html><meta http-equiv=refresh content=1.5><body style=background-color:black;color:white;font-family:Verdana;font-weight:bold;><body><span style=font-size:28px;><center>Boatspeed"));
client.write(tBuf);
strcpy_P(tBuf, PSTR("</span></p><span style=font-size:200px;line-height:53%;><center>"));
client.write(tBuf);
float wBspFloat = bspInt * .01;
dtostrf(wBspFloat, 5, 2, tBuf);
client.write(tBuf);
strcpy_P(tBuf, PSTR("</span></a><span style=font-size:10px;><hr></span><span style=font-size:28px;line-height:100%;><center>Target PCT</span></p><span style=font-size:200px;line-height:53%;><center>"));
client.write(tBuf);
float trgBspFloat = targetBSPAvg * .01; /////////target
float targetPctBsp = wBspFloat / trgBspFloat;
float trgBspPctFloat = targetPctBsp * 100; //////////target avg
dtostrf(trgBspPctFloat, 5, 1, tBuf);
client.write(tBuf);
if (displayColorMode == 1) strcpy_P(tBuf, PSTR("<span style=font-size:20px;line-height:0%;><p align=left><a href=bsptct.php?t=0>∗ <p align=right><a href=bsppol.php?t=1>→ </P></span></a></span></a></body></html>"));
else strcpy_P(tBuf, PSTR("<span style=font-size:20px;line-height:0%;><p align=left><a href=bsptct.php?t=1>∗ <p align=right><a href=bsppol.php?t=0>→ </P></span></a></span></a></body></html>"));
client.write(tBuf);
}
//////////Mark Distance and Bearing //////
else if (displayPageType == 6)
{
if (displayColorMode == 1) strcpy_P(tBuf, PSTR("<!DOCTYPE html><html><meta http-equiv=refresh content=1.5><body style=color:black;background-color:white;font-family:Verdana;font-weight:bold;><body><span style=font-size:28px;><center>Mark Brg"));
else strcpy_P(tBuf, PSTR("<!DOCTYPE html><html><meta http-equiv=refresh content=1.5><body style=background-color:black;color:white;font-family:Verdana;font-weight:bold;><body><span style=font-size:28px;><center>Mark Brg"));
client.write(tBuf);
strcpy_P(tBuf, PSTR("</span></p><span style=font-size:200px;line-height:53%;><center>"));
client.write(tBuf);
itoa (markInt, tBuf, 10);
client.write(tBuf);
strcpy_P(tBuf, PSTR("</span></a><span style=font-size:10px;><hr></span><span style=font-size:28px;line-height:100%;><center>Mark Range</span></p><span style=font-size:200px;line-height:53%;><center>"));
client.write(tBuf);
dtostrf(markDistFloat, 5, 2, tBuf);
client.write(tBuf);
if (displayColorMode == 1) strcpy_P(tBuf, PSTR("<span style=font-size:20px;line-height:0%;><p align=left><a href=rngbrg.php?t=0>∗ <p align=right><a href=flight.php?t=1>→ </P></span></a></span></a></body></html>"));
else strcpy_P(tBuf, PSTR("<span style=font-size:20px;line-height:0%;><p align=left><a href=rngbrg.php?t=1>∗ <p align=right><a href=flight.php?t=0>→ </P></span></a></span></a></body></html>"));
client.write(tBuf);
}
/////////Flight Status //
else if (displayPageType == 8)
{
if (displayColorMode == 1) strcpy_P(tBuf, PSTR("<!DOCTYPE html><html><meta http-equiv=refresh content=1.5><body style=color:black;background-color:white;font-family:Verdana;font-weight:bold;><body><span style=font-size:28px;><center>Flight Conditions"));
else strcpy_P(tBuf, PSTR("<!DOCTYPE html><html><meta http-equiv=refresh content=1.5><body style=background-color:black;color:white;font-family:Verdana;font-weight:bold;><body><span style=font-size:28px;><center>Flight Conditions"));
client.write(tBuf);
strcpy_P(tBuf, PSTR("</span></p><span style=font-size:150px;line-height:53%;><center>"));
client.write(tBuf);
if (isReadyToFly == 1) strcpy_P(tBuf, PSTR("YES"));
else strcpy_P(tBuf, PSTR("NO"));
client.write(tBuf);
strcpy_P(tBuf, PSTR("</span></a><span style=font-size:10px;><hr></span><span style=font-size:28px;line-height:100%;><center>Flight Status</span></p><span style=font-size:200px;line-height:53%;><center>"));
client.write(tBuf);
if (isInFlight == 1) strcpy_P(tBuf, PSTR("YES"));
else strcpy_P(tBuf, PSTR("NO"));
client.write(tBuf);
if (displayColorMode == 1) strcpy_P(tBuf, PSTR("<span style=font-size:20px;line-height:0%;><p align=left><a href=flight.php?t=0>∗ <p align=right><a href=tackscore.php?t=1>→ </P></span></a></span></a></body></html>"));
else strcpy_P(tBuf, PSTR("<span style=font-size:20px;line-height:0%;><p align=left><a href=flight.php?t=1>∗ <p align=right><a href=tackscore.php?t=0>→ </P></span></a></span></a></body></html>"));
client.write(tBuf);
}
//////////Tack Scoring Info //
else if (displayPageType == 9) ///Tack Score Info
{
if (displayColorMode == 1) strcpy_P(tBuf, PSTR("<!DOCTYPE html><html><meta http-equiv=refresh content=1.5><body style=color:black;background-color:white;font-family:Verdana;font-weight:bold;><body><span style=font-size:28px;><center>Distance Lost"));
else strcpy_P(tBuf, PSTR("<!DOCTYPE html><html><meta http-equiv=refresh content=1.5><body style=background-color:black;color:white;font-family:Verdana;font-weight:bold;><body><span style=font-size:28px;><center>Forward Distance Lost (ft)"));
client.write(tBuf);
strcpy_P(tBuf, PSTR("</span></p><span style=font-size:150px;line-height:53%;><center>"));
client.write(tBuf);
if (postCounter == -1 ) dtostrf(finalForward, 5, 2, tBuf);
else strcpy_P(tBuf, PSTR("Processing"));
client.write(tBuf);
strcpy_P(tBuf, PSTR("</span></a><span style=font-size:10px;><hr></span><span style=font-size:28px;line-height:100%;><center>Lane Loss (ft)</span></p><span style=font-size:100px;line-height:53%;><center>"));
client.write(tBuf);
if (postCounter == -1) itoa (finalLane, tBuf, 10);
else itoa (postCounter, tBuf, 10);
client.write(tBuf);
if (displayColorMode == 1) strcpy_P(tBuf, PSTR("<span style=font-size:20px;line-height:0%;><p align=left><a href=tackscore.php?t=0>∗ <p align=right><a href=summary.php?t=1>→ </P></span></a></span></a></body></html>"));
else strcpy_P(tBuf, PSTR("<span style=font-size:20px;line-height:0%;><p align=left><a href=tackscore.php?t=1>∗ <p align=right><a href=summary.php?t=0>→ </P></span></a></span></a></body></html>"));
client.write(tBuf);
}
//////////list files on the SD card to a web page ////////
else if (displayPageType == 10) ///List Files on SD
{
delay(100);
strcpy_P(tBuf, PSTR("</H3></a><p></p>"));
client.write(tBuf);
File root;
root = SD.open("/");
printDirectory(root);
root.rewindDirectory(); // you need to rewind the the Directory
while (true)
{
File entry = root.openNextFile();
if (! entry)
{
break;
}
if (statMsg == 1)
{
Serial.print(entry.name());
Serial.print(" ");
Serial.println(entry.size());
}
strcpy_P(tBuf, PSTR("<a href=\"HTTP://192.168.8.10/"));
client.write(tBuf);
strcpy_P(tBuf, PSTR(entry.name()));
client.write(tBuf);
strcpy_P(tBuf, PSTR("\"> <H2> "));
client.write(tBuf);
strcpy_P(tBuf, PSTR(entry.name()));
client.write(tBuf);
strcpy_P(tBuf, PSTR("</H2></a><p></p>"));
client.write(tBuf);
}
delay(100);
}
//////////batttery monitor //
if (displayPageType == 12)
{
if (displayColorMode == 1) strcpy_P(tBuf, PSTR("<!DOCTYPE html><html><meta http-equiv=refresh content=1.5><body style=color:black;background-color:white;font-family:Verdana;font-weight:bold;><body><span style=font-size:28px;><center>24 V System"));
else strcpy_P(tBuf, PSTR("<!DOCTYPE html><html><meta http-equiv=refresh content=1.5><body style=background-color:black;color:white;font-family:Verdana;font-weight:bold;><body><span style=font-size:28px;><center>24 V Battery"));
client.write(tBuf);
strcpy_P(tBuf, PSTR("</span></p><span style=font-size:150px;line-height:53%;><center>"));
client.write(tBuf);
dtostrf(v24Actual, 5, 1, tBuf);
client.write(tBuf);
strcpy_P(tBuf, PSTR("v "));
client.write(tBuf);
itoa (v24Pct, tBuf, 10);
client.write(tBuf);
strcpy_P(tBuf, PSTR("%</span></a><span style=font-size:10px;><hr></span><span style=font-size:28px;line-height:100%;><center>12 V System</span></p><span style=font-size:150px;line-height:53%;><center>"));
client.write(tBuf);
dtostrf(v12Actual, 5, 1, tBuf);
client.write(tBuf);
strcpy_P(tBuf, PSTR("v "));
client.write(tBuf);
itoa (v12Pct, tBuf, 10);
client.write(tBuf);
if (displayColorMode == 1) strcpy_P(tBuf, PSTR("%<span style=font-size:20px;line-height:0%;><p align=left><a href=batt.php?t=0>∗ <p align=right><a href=bsptwa.php?t=1>→ </P></span></a></span></a></body></html>"));
else strcpy_P(tBuf, PSTR("%<span style=font-size:20px;line-height:0%;><p align=left><a href=batt.php?t=1>∗ <p align=right><a href=bsptwa.php?t=0>→ </P></span></a></span></a></body></html>"));
client.write(tBuf);
}
/////////dot speed thresholds//
else if (displayPageType == 13)
{
if (displayColorMode == 1) strcpy_P(tBuf, PSTR("<!DOCTYPE html><html><body style=color:black;background-color:white;font-family:Verdana;font-weight:bold;><body><span style=font-size:28px;><center>Min DOT BSP<p/>"));
else strcpy_P(tBuf, PSTR("<!DOCTYPE html><html><body style=background-color:black;color:white;font-family:Verdana;font-weight:bold;><body><span style=font-size:28px;><center>Min Dot BSP"));
client.write(tBuf);
strcpy_P(tBuf, PSTR("</span></p><span style=font-size:100px;line-height:53%;><center>"));
client.write(tBuf);
float wFlightBspFloat = bspFlightMin * .01;
dtostrf(wFlightBspFloat, 5, 2, tBuf);
client.write(tBuf);
strcpy_P(tBuf, PSTR("<span style=font-family:Verdana;font-size:30px;font-style:normal;font-weight:bold;line-height:53%;></p><center> Change To:</span></p><a href=DOT.PHP?g=0>-2kt </span></a><a href=DOT.PHP?g=2>-1kt "));
client.write(tBuf);
strcpy_P(tBuf, PSTR("</span></a><a href=DOT.PHP?g=4>-.5kt </span></a><a href=DOT.PHP?g=5>+.5kt </span></a><a href=DOT.PHP?g=3>+1kt </span></a><a href=DOT.PHP?g=1>+2kt </span></a>"));
client.write(tBuf);
strcpy_P(tBuf, PSTR("</span></a><span style=font-size:10px;><hr></span><span style=font-size:28px;line-height:100%;><center>Min DOT TWS</span></p><span style=font-size:100px;line-height:53%;><center>"));
client.write(tBuf);
float wFlightTwsFloat = twsFlightMin * .01;
dtostrf(wFlightTwsFloat, 5, 2, tBuf);
client.write(tBuf);
strcpy_P(tBuf, PSTR("<span style=font-family:Verdana;font-size:30px;font-style:normal;font-weight:bold;line-height:53%;></p><center> Change To:</span></p><a href=DOT.PHP?j=0>-2kt </span></a><a href=DOT.PHP?j=2>-1kt "));
client.write(tBuf);
strcpy_P(tBuf, PSTR("</span></a><a href=DOT.PHP?j=4>-.5kt </span></a><a href=DOT.PHP?j=5>+.5kt </span></a><a href=DOT.PHP?j=3>+1kt </span></a><a href=DOT.PHP?j=1>+2kt </span></a>"));
client.write(tBuf);
strcpy_P(tBuf, PSTR("</span></a><span style=font-size:10px;><hr></span><span style=font-size:28px;line-height:100%;><center>Target / Polar Gain</span></p><span style=font-size:100px;line-height:53%;><center>"));
client.write(tBuf);
itoa (targetSpeedMultiplier, tBuf, 10);
client.write(tBuf);
strcpy_P(tBuf, PSTR("<span style=font-family:Verdana;font-size:30px;font-style:normal;font-weight:bold;line-height:53%;></p><center> Change To:</span></p><a href=DOT.PHP?k=4>-5 </span></a><a href=DOT.PHP?k=0>-2 </span></a>"));
client.write(tBuf);
strcpy_P(tBuf, PSTR("<a href=DOT.PHP?k=2>-1 </span></a></span></a><a href=DOT.PHP?k=3>+1 </span></a><a href=DOT.PHP?k=1>+2 </span></a><a href=DOT.PHP?k=5>+5 "));
client.write(tBuf);
strcpy_P(tBuf, PSTR("</span></a><span style=font-size:10px;><hr></span><span style=font-size:28px;line-height:100%;><center>Caution Heel Angle</span></p><span style=font-size:100px;line-height:53%;><center>"));
client.write(tBuf);
itoa (cautionRoll, tBuf, 10);
client.write(tBuf);
strcpy_P(tBuf, PSTR("<span style=font-family:Verdana;font-size:30px;font-style:normal;font-weight:bold;line-height:53%;></p><center> Change To:</span></p><a href=DOT.PHP?h=0>-2 </span></a><a href=DOT.PHP?h=2>-1 "));
client.write(tBuf);
strcpy_P(tBuf, PSTR("</span></a><a href=DOT.PHP?h=3>+1 </span></a><a href=DOT.PHP?h=1>+2 </span></a>"));
client.write(tBuf);
strcpy_P(tBuf, PSTR("</span></a><span style=font-size:10px;><hr></span><span style=font-size:28px;line-height:100%;><center>Warning Heel Angle (RED)</span></p><span style=font-size:100px;line-height:53%;><center>"));
client.write(tBuf);
itoa (warningRoll, tBuf, 10);
client.write(tBuf);
strcpy_P(tBuf, PSTR("<span style=font-family:Verdana;font-size:30px;font-style:normal;font-weight:bold;line-height:53%;></p><center> Change To:</span></p><a href=DOT.PHP?q=0>-2 </span></a><a href=DOT.PHP?q=2>-1 "));
client.write(tBuf);
strcpy_P(tBuf, PSTR("</span></a><a href=DOT.PHP?q=3>+1 </span></a><a href=DOT.PHP?q=1>+2 </span></a>"));
client.write(tBuf);
strcpy_P(tBuf, PSTR("</span></a><span style=font-size:10px;><hr></span><span style=font-size:28px;line-height:100%;><center>CenterPixel</span></p><span style=font-size:100px;line-height:53%;><center>"));
client.write(tBuf);
itoa (centerPixel, tBuf, 10);
client.write(tBuf);
strcpy_P(tBuf, PSTR("<span style=font-family:Verdana;font-size:30px;font-style:normal;font-weight:bold;line-height:53%;></p><center> Change To:</span></p><a href=DOT.PHP?c=0>-2 </span></a><a href=DOT.PHP?c=2>-1 "));
client.write(tBuf);
strcpy_P(tBuf, PSTR("</span></a><a href=DOT.PHP?c=3>+1 </span></a><a href=DOT.PHP?c=1>+2 </span></a>"));
client.write(tBuf);
strcpy_P(tBuf, PSTR("</span></a><span style=font-size:10px;><hr></span><span style=font-size:28px;line-height:100%;><center>Update Settings File</span></p><span style=font-size:100px;line-height:53%;><center>"));
client.write(tBuf);
strcpy_P(tBuf, PSTR("<span style=font-family:Verdana;font-size:30px;font-style:normal;font-weight:bold;line-height:53%;></p><center> </span></p><a href=DOT.PHP?o=1>PRESS TO UPDATE</span></a>"));
client.write(tBuf);
if (displayColorMode == 1) strcpy_P(tBuf, PSTR("<span style=font-size:20px;line-height:0%;><p align=left><a href=dot.php?t=0>∗ <p align=right><a href=sail.php?t=1>→ </P></span></a></span></a></body></html>"));
else strcpy_P(tBuf, PSTR("<span style=font-size:20px;line-height:0%;><p align=left><a href=dot.php?t=1>∗ <p align=right><a href=sail.php?t=0>→ </P></span></a></span></a></body></html>"));
client.write(tBuf);
}
//////////Boaspeed - Polar Speed //////
else if (displayPageType == 14)
{
if (displayColorMode == 1) strcpy_P(tBuf, PSTR("<!DOCTYPE html><html><meta http-equiv=refresh content=1.5><body style=color:black;background-color:white;font-family:Verdana;font-weight:bold;><body><span style=font-size:28px;><center>Boatspeed"));
else strcpy_P(tBuf, PSTR("<!DOCTYPE html><html><meta http-equiv=refresh content=1.5><body style=background-color:black;color:white;font-family:Verdana;font-weight:bold;><body><span style=font-size:28px;><center>Boatspeed"));
client.write(tBuf);
strcpy_P(tBuf, PSTR("</span></p><span style=font-size:200px;line-height:53%;><center>"));
client.write(tBuf);
float wBspFloat = bspInt * .01;
dtostrf(wBspFloat, 5, 2, tBuf);
client.write(tBuf);
strcpy_P(tBuf, PSTR("</span></a><span style=font-size:10px;><hr></span><span style=font-size:28px;line-height:100%;><center>Polar BSP</span></p><span style=font-size:200px;line-height:53%;><center>"));
client.write(tBuf);
dtostrf(polarBsp, 5, 2, tBuf);
client.write(tBuf);
if (displayColorMode == 1) strcpy_P(tBuf, PSTR("<span style=font-size:20px;line-height:0%;><p align=left><a href=bsppol.php?t=0>∗ <p align=right><a href=rngbrg.php?t=1>→ </P></span></a></span></a></body></html>"));
else strcpy_P(tBuf, PSTR("<span style=font-size:20px;line-height:0%;><p align=left><a href=bsppol.php?t=1>∗ <p align=right><a href=rngbrg.php?t=0>→ </P></span></a></span></a></body></html>"));
client.write(tBuf);
}
/////////System Features //
else if (displayPageType == 15)
{
if (displayColorMode == 1) strcpy_P(tBuf, PSTR("<!DOCTYPE html><html><body style=color:black;background-color:white;font-family:Verdana;font-weight:bold;><body><span style=font-size:28px;><center>Standard NMEA Outputs<p/>"));
else strcpy_P(tBuf, PSTR("<!DOCTYPE html><html><body style=background-color:black;color:white;font-family:Verdana;font-weight:bold;><body><span style=font-size:28px;><center>Standard NMEA Outputs"));
client.write(tBuf);
strcpy_P(tBuf, PSTR("</span></p><span style=font-size:100px;line-height:53%;><center>"));
client.write(tBuf);
strcpy_P(tBuf, PSTR("S0: "));
client.write(tBuf);
itoa (NMEAPlay, tBuf, 10);
client.write(tBuf);
strcpy_P(tBuf, PSTR(" S1: "));
client.write(tBuf);
itoa (s1NMEAComm, tBuf, 10);
client.write(tBuf);
strcpy_P(tBuf, PSTR(" S3: "));
client.write(tBuf);
itoa (s3NMEAComm, tBuf, 10);
client.write(tBuf);
strcpy_P(tBuf, PSTR("<span style=font-family:Verdana;font-size:30px;font-style:normal;font-weight:bold;line-height:53%;></p><center> Change To:</span></p><a href=COMM.PHP?w=16>S0 OFF </span></a><a href=COMM.PHP?w=17>S0 ON </span></a>"));
client.write(tBuf);
strcpy_P(tBuf, PSTR("<a href=COMM.PHP?w=12>S1 OFF </span></a><a href=COMM.PHP?w=13>S1 ON </span></a><a href=COMM.PHP?w=14>S3 OFF </span></a><a href=COMM.PHP?w=15>S3 ON </span></a>"));
client.write(tBuf);
strcpy_P(tBuf, PSTR("<span style=font-size:10px;><hr></span><span style=font-size:28px;line-height:100%;><center>Special NMEA XDR Sentences</span></p><span style=font-size:100px;line-height:53%;><center>"));
client.write(tBuf);
strcpy_P(tBuf, PSTR("S0: "));
client.write(tBuf);
itoa (s0XDRComm, tBuf, 10);
client.write(tBuf);
strcpy_P(tBuf, PSTR(" S1: "));
client.write(tBuf);
itoa (s1XDRComm, tBuf, 10);
client.write(tBuf);
strcpy_P(tBuf, PSTR(" S3: "));
client.write(tBuf);
itoa (s3XDRComm, tBuf, 10);
client.write(tBuf);
strcpy_P(tBuf, PSTR("<span style=font-family:Verdana;font-size:30px;font-style:normal;font-weight:bold;line-height:53%;></p><center> Change To:</span></p><a href=COMM.PHP?w=6>S0 OFF </span></a><a href=COMM.PHP?w=7>S0 ON </span></a>"));
client.write(tBuf);
strcpy_P(tBuf, PSTR("<a href=COMM.PHP?w=8>S1 OFF </span></a><a href=COMM.PHP?w=9>S1 ON </span></a><a href=COMM.PHP?w=10>S3 OFF </span></a><a href=COMM.PHP?w=11>S3 ON </span></a>"));
client.write(tBuf);
strcpy_P(tBuf, PSTR("<span style=font-size:10px;><hr></span><span style=font-size:28px;line-height:100%;><center>PIX Sentences</span></p><span style=font-size:100px;line-height:53%;><center>"));
client.write(tBuf);
strcpy_P(tBuf, PSTR("S0: "));
client.write(tBuf);
itoa (s0PIXComm, tBuf, 10);
client.write(tBuf);
strcpy_P(tBuf, PSTR(" S1: "));
client.write(tBuf);
itoa (s1PIXComm, tBuf, 10);
client.write(tBuf);
strcpy_P(tBuf, PSTR(" S3: "));
client.write(tBuf);
itoa (s3PIXComm, tBuf, 10);
client.write(tBuf);
strcpy_P(tBuf, PSTR("<span style=font-family:Verdana;font-size:30px;font-style:normal;font-weight:bold;line-height:53%;></p><center> Change To:</span></p><a href=COMM.PHP?w=0>S0 OFF </span></a><a href=COMM.PHP?w=1>S0 ON </span></a>"));
client.write(tBuf);
strcpy_P(tBuf, PSTR("<a href=COMM.PHP?w=2>S1 OFF </span></a><a href=COMM.PHP?w=3>S1 ON </span></a><a href=COMM.PHP?w=4>S3 OFF </span></a><a href=COMM.PHP?w=5>S3 ON </span></a>"));
client.write(tBuf);
if (displayColorMode == 1) strcpy_P(tBuf, PSTR("<span style=font-size:20px;line-height:0%;><p align=left><a href=COMM.php?t=0>∗ <p align=right><a href=dot.php?t=1>→ </P></span></a></span></a></body></html>"));
else strcpy_P(tBuf, PSTR("<span style=font-size:20px;line-height:0%;><p align=left><a href=COMM.php?t=1>∗ <p align=right><a href=dot.php>→ </P></span></a></span></a></body></html>"));
client.write(tBuf);
}
/////////System Features //
else if (displayPageType == 16)
{
if (displayColorMode == 1) strcpy_P(tBuf, PSTR("<!DOCTYPE html><html><body style=color:black;background-color:white;font-family:Verdana;font-weight:bold;><body><span style=font-size:28px;><center>Heel/Pitch/Barometer<p/>"));
else strcpy_P(tBuf, PSTR("<!DOCTYPE html><html><body style=background-color:black;color:white;font-family:Verdana;font-weight:bold;><body><span style=font-size:28px;><center>Heel/Pitch/Barometer"));
client.write(tBuf);
strcpy_P(tBuf, PSTR("</span></p><span style=font-size:100px;line-height:53%;><center>"));
client.write(tBuf);
if (Sensor == 0 && Barometer == 0) strcpy_P(tBuf, PSTR("All OFF"));
else if (Sensor == 1 && Barometer == 1) strcpy_P(tBuf, PSTR("ON"));
else if (Sensor == 0 && Barometer == 1) strcpy_P(tBuf, PSTR(" Sensor OFF"));
else if (Sensor == 1 && Barometer == 0) strcpy_P(tBuf, PSTR("Barometer OFF"));
client.write(tBuf);
strcpy_P(tBuf, PSTR("<span style=font-family:Verdana;font-size:30px;font-style:normal;font-weight:bold;line-height:53%;></p><center> Change To:</span></p><a href=FEAT.PHP?z=43>OFF </span></a><a href=FEAT.PHP?z=44>ON </span></a>"));
client.write(tBuf);
strcpy_P(tBuf, PSTR("</span></a><span style=font-size:10px;><hr></span><span style=font-size:28px;line-height:100%;><center>Flight Sentences</span></p><span style=font-size:100px;line-height:53%;><center>"));
client.write(tBuf);
if (PIXGenerate == 1) strcpy_P(tBuf, PSTR("ON"));
else if (PIXGenerate == 0) strcpy_P(tBuf, PSTR("OFF"));
client.write(tBuf);
strcpy_P(tBuf, PSTR("<span style=font-family:Verdana;font-size:30px;font-style:normal;font-weight:bold;line-height:53%;></p><center> Change To:</span></p><a href=FEAT.PHP?z=60>OFF </span></a><a href=FEAT.PHP?z=61>ON </span></a>"));
client.write(tBuf);
strcpy_P(tBuf, PSTR("</span></a><span style=font-size:10px;><hr></span><span style=font-size:28px;line-height:100%;><center>Tack Scoring</span></p><span style=font-size:100px;line-height:53%;><center>"));
client.write(tBuf);
if (tackScoreData == 0) strcpy_P(tBuf, PSTR("OFF"));
else if (tackScoreData == 1) strcpy_P(tBuf, PSTR("ON"));
client.write(tBuf);
strcpy_P(tBuf, PSTR("<span style=font-family:Verdana;font-size:30px;font-style:normal;font-weight:bold;line-height:53%;></p><center> Change To:</span></p><a href=FEAT.PHP?z=0>OFF </span></a><a href=FEAT.PHP?z=1>ON </span></a>"));
client.write(tBuf);
strcpy_P(tBuf, PSTR("</span></a><span style=font-size:10px;><hr></span><span style=font-size:28px;line-height:100%;><center>Voltage Monitoring</span></p><span style=font-size:100px;line-height:53%;><center>"));
client.write(tBuf);
if (v12Record == 0 && v24Record == 0) strcpy_P(tBuf, PSTR("All OFF"));
else if (v12Record == 1 && v24Record == 1) strcpy_P(tBuf, PSTR("ALL ON"));
else if (v12Record == 0 && v24Record == 1) strcpy_P(tBuf, PSTR("24v ON 12v OFF"));
else if (v12Record == 1 && v24Record == 0) strcpy_P(tBuf, PSTR("12v ON 24v OFF"));
client.write(tBuf);
strcpy_P(tBuf, PSTR("<span style=font-family:Verdana;font-size:30px;font-style:normal;font-weight:bold;line-height:53%;></p><center> Change To:</span></p><a href=FEAT.PHP?z=34> ALL OFF </span></a><a href=FEAT.PHP?z=35>ALL ON </span></a>"));
client.write(tBuf);
strcpy_P(tBuf, PSTR("</span></a><span style=font-size:10px;><hr></span><span style=font-size:28px;line-height:100%;><center>SD Logging Type</span></p><span style=font-size:100px;line-height:53%;><center>"));
client.write(tBuf);
if (directLog == 1) strcpy_P(tBuf, PSTR("Expedition"));
else if (NMEALog == 1) strcpy_P(tBuf, PSTR("NMEA0183"));
else if (directLog == 0 && NMEALog == 0) strcpy_P(tBuf, PSTR("OFF"));
client.write(tBuf);
strcpy_P(tBuf, PSTR("<span style=font-family:Verdana;font-size:30px;font-style:normal;font-weight:bold;line-height:53%;></p><center> Change To:</span></p><a href=FEAT.PHP?d=0> ALL OFF </span></a><a href=FEAT.PHP?d=1>Expedition </span></a>"));
client.write(tBuf);
strcpy_P(tBuf, PSTR("<a href=FEAT.PHP?d=2>NMEA0183 </span></a>"));
client.write(tBuf);
if (displayColorMode == 1) strcpy_P(tBuf, PSTR("<span style=font-size:20px;line-height:0%;><p align=left><a href=feat.php?t=0>∗ <p align=right><a href=comm.php?t=1>→ </P></span></a></span></a></body></html>"));
else strcpy_P(tBuf, PSTR("<span style=font-size:20px;line-height:0%;><p align=left><a href=feat.php?t=1>∗ <p align=right><a href=comm.php>→ </P></span></a></span></a></body></html>"));
client.write(tBuf);
}
/////////system switches FEA2//
else if (displayPageType == 17)
{
if (displayColorMode == 1) strcpy_P(tBuf, PSTR("<!DOCTYPE html><html><body style=color:black;background-color:white;font-family:Verdana;font-weight:bold;><body><span style=font-size:28px;><center>Logging<p/>"));
else strcpy_P(tBuf, PSTR("<!DOCTYPE html><html><body style=background-color:black;color:white;font-family:Verdana;font-weight:bold;><body><span style=font-size:28px;><center>zzLogging"));
client.write(tBuf);
strcpy_P(tBuf, PSTR("</span></p><span style=font-size:100px;line-height:53%;><center>"));
client.write(tBuf);
if (directLog == 1) strcpy_P(tBuf, PSTR("Expedition"));
else if (NMEALog == 1) strcpy_P(tBuf, PSTR("NMEA0183"));
else if (directLog == 0 && NMEALog == 0) strcpy_P(tBuf, PSTR("OFF"));
client.write(tBuf);
strcpy_P(tBuf, PSTR("<span style=font-family:Verdana;font-size:30px;font-style:normal;font-weight:bold;line-height:53%;></p><center> Change To:</span></p><a href=PICK.PHP?b=0>0 </span></a><a href=PICK.PHP?b=1>1 "));
client.write(tBuf);
strcpy_P(tBuf, PSTR("</span></a><a href=FEA2.PHP?b=2>2 </span></a><a href=FEA2.PHP?b=3>3 </span></a><a href=FEA2.PHP?b=4>4 </span></a><a href=FEA2.PHP?b=5>5 </span></a>"));
client.write(tBuf);
strcpy_P(tBuf, PSTR("</span></a><a href=FEA2.PHP?b=6>6 </span></a><a href=FEA2.PHP?b=7>7 </span></a></p>"));
client.write(tBuf);
strcpy_P(tBuf, PSTR("</span></a><span style=font-size:10px;><hr></span><span style=font-size:28px;line-height:100%;><center>DOT Display Mode</span></p><span style=font-size:100px;line-height:53%;><center>"));
client.write(tBuf);
if (dotMode == 1) strcpy_P(tBuf, PSTR("Target Speed"));
else if (dotMode == 2) strcpy_P(tBuf, PSTR("TWA"));
else if (dotMode == 3) strcpy_P(tBuf, PSTR("Polar Speed"));
client.write(tBuf);
strcpy_P(tBuf, PSTR("<span style=font-family:Verdana;font-size:30px;font-style:normal;font-weight:bold;line-height:53%;></p><center> Change To:</span></p><a href=FEA2.PHP?m=1>Target Speed "));
client.write(tBuf);
strcpy_P(tBuf, PSTR("</span></a><a href=FEA2.PHP?m=2>TWA </span></a><a href=FEA2.PHP?m=3>Polar Speed </span></a></p>"));
client.write(tBuf);
strcpy_P(tBuf, PSTR("</span></a><span style=font-size:10px;><hr></span><span style=font-size:28px;line-height:100%;><center>Flight Ready Mode</span></p><span style=font-size:100px;line-height:53%;><center>"));
client.write(tBuf);
if (isReadyMode == 1) strcpy_P(tBuf, PSTR("BSP"));
else if (isReadyMode == 2) strcpy_P(tBuf, PSTR("TWS"));
else if (isReadyMode == 3) strcpy_P(tBuf, PSTR("BSP and TWS"));
else if (isReadyMode == 4) strcpy_P(tBuf, PSTR("BSP or TWS"));
client.write(tBuf);
strcpy_P(tBuf, PSTR("<span style=font-family:Verdana;font-size:30px;font-style:normal;font-weight:bold;line-height:53%;></p><center> Change To:</span></p><a href=FEA2.PHP?n=1>BSP </span></a><a href=FEA2.PHP?n=2>TWS "));
client.write(tBuf);
strcpy_P(tBuf, PSTR("</span></a><a href=FEA2.PHP?n=3>BOTH </span></a><a href=FEA2.PHP?n=4>EITHER </span></a></p>"));
client.write(tBuf);
if (displayColorMode == 1) strcpy_P(tBuf, PSTR("<span style=font-size:20px;line-height:0%;><p align=left><a href=FEA2.php?t=0>∗ <p align=right><a href=mytest.php?t=1>→ </P></span></a></span></a></body></html>"));
else strcpy_P(tBuf, PSTR("<span style=font-size:20px;line-height:0%;><p align=left><a href=FEA2.php?t=1>∗ <p align=right><a href=mytest.php>→ </P></span></a></span></a></body></html>"));
client.write(tBuf);
}
/////////Sail Selection //
else if (displayPageType == 18)
{
if (displayColorMode == 1) strcpy_P(tBuf, PSTR("<!DOCTYPE html><html><body style=color:black;background-color:white;font-family:Verdana;font-weight:bold;><body><span style=font-size:28px;><center>Active Headsail<p/>"));
else strcpy_P(tBuf, PSTR("<!DOCTYPE html><html><body style=background-color:black;color:white;font-family:Verdana;font-weight:bold;><body><span style=font-size:28px;><center>Active Headsail"));
client.write(tBuf);
strcpy_P(tBuf, PSTR("</span></p><span style=font-size:100px;line-height:53%;><center>"));
client.write(tBuf);
if (activeSailCode == 400) strcpy_P(tBuf, PSTR("C0"));
else if (activeSailCode == 100) strcpy_P(tBuf, PSTR("A1"));
else if (activeSailCode == 200) strcpy_P(tBuf, PSTR("A2"));
else if (activeSailCode == 300) strcpy_P(tBuf, PSTR("A3"));
else if (activeSailCode == 500) strcpy_P(tBuf, PSTR("SOLENT"));
else if (activeSailCode % 100 == 50) strcpy_P(tBuf, PSTR("Stysl"));
else if (activeSailCode % 100 == 25) strcpy_P(tBuf, PSTR("1 Reef"));
else if (activeSailCode % 100 == 12) strcpy_P(tBuf, PSTR("2 Reef"));
client.write(tBuf);
strcpy_P(tBuf, PSTR("</span><span style=font-family:Verdana;font-size:30px;font-style:normal;font-weight:bold;line-height:53%;><center></p> Change To: </p><a href=SAIL.PHP?x=0>A0 </span></a></p> <a href=SAIL.PHP?x=1>A1 "));
client.write(tBuf);
strcpy_P(tBuf, PSTR("</span></a></p><a href=SAIL.PHP?x=2>A2 </span></a></p><a href=SAIL.PHP?x=3>A3 </span></a></p><a href=SAIL.PHP?x=4>Solent </span></a></p><a href=SAIL.PHP?x=5>Staysail </span></a></p>"));
client.write(tBuf);
strcpy_P(tBuf, PSTR("</span></a><span style=font-size:10px;><hr></span><span style=font-size:28px;line-height:100%;><center>Board Height</span></p><span style=font-size:100px;line-height:53%;><center>"));
client.write(tBuf);
dtostrf(boardHeight, 5, 2, tBuf);
client.write(tBuf);
strcpy_P(tBuf, PSTR("<span style=font-family:Verdana;font-size:30px;font-style:normal;font-weight:bold;line-height:53%;></p><center> Change To:</span></p><a href=SAIL.PHP?y=0>0 </span></a></p> <a href=SAIL.PHP?y=0.5>.5 "));
client.write(tBuf);
strcpy_P(tBuf, PSTR("</span></a></p><a href=SAIL.PHP?y=1.0>1 </span></a></p><a href=SAIL.PHP?y=1.5>1.5 </span></a></p><a href=SAIL.PHP?y=2>2 </span></a></p><a href=SAIL.PHP?y=2.5>2.5 </span></a></p>"));
client.write(tBuf);
strcpy_P(tBuf, PSTR("</span></a></p><a href=SAIL.PHP?y=3>3 </span></a></p><a href=SAIL.PHP?y=3.5>3.5 </span></a></p><a href=SAIL.PHP?y=4>4 </span></a></p><a href=SAIL.PHP?y=4.5>4.5 </span></a></p><a href=SAIL.PHP?y=5>5 </span></a></p>"));
client.write(tBuf);
strcpy_P(tBuf, PSTR("</span></a><span style=font-size:10px;><hr></span><span style=font-size:28px;line-height:100%;><center>Traveler Position</span></p><span style=font-size:100px;line-height:53%;><center>"));
client.write(tBuf);
dtostrf(travPos, 5, 2, tBuf);
client.write(tBuf);
strcpy_P(tBuf, PSTR("<span style=font-family:Verdana;font-size:30px;font-style:normal;font-weight:bold;line-height:53%;></p><center> Change To:</span></p><a href=SAIL.PHP?e=-1>-1 </span></a></p><a href=SAIL.PHP?e=0>0 </span></a></p><a href=SAIL.PHP?e=0.5>.5 "));
client.write(tBuf);
strcpy_P(tBuf, PSTR("</span></a></p><a href=SAIL.PHP?e=1.0>1 </span></a></p><a href=SAIL.PHP?e=1.5>1.5 </span></a></p><a href=SAIL.PHP?e=2>2 </span></a></p><a href=SAIL.PHP?e=2.5>2.5 </span></a></p>"));
client.write(tBuf);
strcpy_P(tBuf, PSTR("</span></a></p><a href=SAIL.PHP?e=3>3 </span></a></p><a href=SAIL.PHP?e=3.5>3.5 </span></a></p><a href=SAIL.PHP?e=4>4 </span></a></p><a href=SAIL.PHP?e=4.5>4.5 </span></a></p><a href=SAIL.PHP?e=5>5 </span></a></p>"));
client.write(tBuf);
if (displayColorMode == 1) strcpy_P(tBuf, PSTR("<span style=font-size:20px;line-height:0%;><p align=left><a href=sail.php?t=0>∗ <p align=right><a href=mode.php?t=1>→ </P></span></a></span></a></body></html>"));
else strcpy_P(tBuf, PSTR("<span style=font-size:20px;line-height:0%;><p align=left><a href=sail.php?t=1>∗ <p align=right><a href=mode.php>→ </P></span></a></span></a></body></html>"));
client.write(tBuf);
}
/////////dot Brightness & Mode //
else if (displayPageType == 19)
{
if (displayColorMode == 1) strcpy_P(tBuf, PSTR("<!DOCTYPE html><html><body style=color:black;background-color:white;font-family:Verdana;font-weight:bold;><body><span style=font-size:28px;><center>Dot Brightness<p/>"));
else strcpy_P(tBuf, PSTR("<!DOCTYPE html><html><body style=background-color:black;color:white;font-family:Verdana;font-weight:bold;><body><span style=font-size:28px;><center>Dot Brightness"));
client.write(tBuf);
strcpy_P(tBuf, PSTR("</span></p><span style=font-size:100px;line-height:53%;><center>"));
client.write(tBuf);
itoa (dotBrightess, tBuf, 10);
client.write(tBuf);
strcpy_P(tBuf, PSTR("<span style=font-family:Verdana;font-size:30px;font-style:normal;font-weight:bold;line-height:53%;></p><center> Change To:</span></p><a href=MODE.PHP?b=0>0 </span></a><a href=MODE.PHP?b=1>1 "));
client.write(tBuf);
strcpy_P(tBuf, PSTR("</span></a><a href=MODE.PHP?b=2>2 </span></a><a href=MODE.PHP?b=3>3 </span></a><a href=mode.PHP?b=4>4 </span></a><a href=MODE.PHP?b=5>5 </span></a>"));
client.write(tBuf);
strcpy_P(tBuf, PSTR("</span></a><a href=MODE.PHP?b=6>6 </span></a><a href=MODE.PHP?b=7>7 </span></a></p>"));
client.write(tBuf);
strcpy_P(tBuf, PSTR("</span></a><span style=font-size:10px;><hr></span><span style=font-size:28px;line-height:100%;><center>DOT Display Mode</span></p><span style=font-size:100px;line-height:53%;><center>"));
client.write(tBuf);
if (dotMode == 1) strcpy_P(tBuf, PSTR("Target Speed"));
else if (dotMode == 2) strcpy_P(tBuf, PSTR("TWA"));
else if (dotMode == 3) strcpy_P(tBuf, PSTR("Polar Speed"));
client.write(tBuf);
strcpy_P(tBuf, PSTR("<span style=font-family:Verdana;font-size:30px;font-style:normal;font-weight:bold;line-height:53%;></p><center> Change To:</span></p><a href=MODE.PHP?m=1>Target Speed "));
client.write(tBuf);
strcpy_P(tBuf, PSTR("</span></a><a href=MODE.PHP?m=2>TWA </span></a><a href=MODE.PHP?m=3>Polar Speed </span></a></p>"));
client.write(tBuf);
strcpy_P(tBuf, PSTR("</span></a><span style=font-size:10px;><hr></span><span style=font-size:28px;line-height:100%;><center>Flight Ready Mode</span></p><span style=font-size:100px;line-height:53%;><center>"));
client.write(tBuf);
if (isReadyMode == 1) strcpy_P(tBuf, PSTR("BSP"));
else if (isReadyMode == 2) strcpy_P(tBuf, PSTR("TWS"));
else if (isReadyMode == 3) strcpy_P(tBuf, PSTR("BSP and TWS"));
else if (isReadyMode == 4) strcpy_P(tBuf, PSTR("BSP or TWS"));
client.write(tBuf);
strcpy_P(tBuf, PSTR("<span style=font-family:Verdana;font-size:30px;font-style:normal;font-weight:bold;line-height:53%;></p><center> Change To:</span></p><a href=MODE.PHP?n=1>BSP </span></a><a href=MODE.PHP?n=2>TWS "));
client.write(tBuf);
strcpy_P(tBuf, PSTR("</span></a><a href=MODE.PHP?n=3>BOTH </span></a><a href=MODE.PHP?n=4>EITHER </span></a></p>"));
client.write(tBuf);
strcpy_P(tBuf, PSTR("</span></a><span style=font-size:10px;><hr></span><span style=font-size:28px;line-height:100%;><center>Mood Lighting</span></p><span style=font-size:100px;line-height:53%;><center>"));
client.write(tBuf);
if (dotReset == 3) strcpy_P(tBuf, PSTR("Blue"));
if (dotReset == 4) strcpy_P(tBuf, PSTR("White"));
if (dotReset == 5) strcpy_P(tBuf, PSTR("Red"));
if (dotReset == 6) strcpy_P(tBuf, PSTR("Yellow"));
if (dotReset == 7) strcpy_P(tBuf, PSTR("Purple"));
if (dotReset == 8) strcpy_P(tBuf, PSTR("Clear All"));
if (dotReset == 1) strcpy_P(tBuf, PSTR("Sailing Mode"));
client.write(tBuf);
strcpy_P(tBuf, PSTR("<span style=font-family:Verdana;font-size:30px;font-style:normal;font-weight:bold;line-height:53%;></p><center> Change To:</span></p><a href=MODE.PHP?z=71>Sailing Mode </span></a><a href=MODE.PHP?z=73>Blue "));
client.write(tBuf);
strcpy_P(tBuf, PSTR("</span></a><a href=MODE.PHP?z=74>White </span></a><a href=MODE.PHP?z=75>Red </span></a></p></span></a><a href=MODE.PHP?z=75>Red </span></a></span></a><a href=MODE.PHP?z=76>Yellow </span></a>"));
client.write(tBuf);
strcpy_P(tBuf, PSTR("</span></a><a href=MODE.PHP?z=77>Purple </span></a><a href=MODE.PHP?z=78>Wipe </span></a>"));
client.write(tBuf);
if (displayColorMode == 1) strcpy_P(tBuf, PSTR("<span style=font-size:20px;line-height:0%;><p align=left><a href=mode.php?t=0>∗ <p align=right><a href=feat.php?t=1>→ </P></span></a></span></a></body></html>"));
else strcpy_P(tBuf, PSTR("<span style=font-size:20px;line-height:0%;><p align=left><a href=mode.php?t=1>∗ <p align=right><a href=feat.php>→ </P></span></a></span></a></body></html>"));
client.write(tBuf);
}
///////////default mytest.php page//////
else if (strcmp(requestBuffer, "/MYTEST.PHP") == 0)
{
strcpy_P(tBuf, PSTR("<html><head><script type=\"text/javascript\">"));
client.write(tBuf);
strcpy_P(tBuf, PSTR("function show_alert() {alert(\"Are You Sure?\");}"));
client.write(tBuf);
strcpy_P(tBuf, PSTR("</script></head><body><H1>Configuration and Tuning Paramaters</H1><form method=GET onSubmit=\"show_alert()\">"));
client.write(tBuf);
//brightnessw////////////////
strcpy_P(tBuf, PSTR("DOT Brightness...................range 0 to 8..... <input type=text name=b><input type=submit></form></body></html>"));
client.write(tBuf);
///minimum BSP for flight////////////////
strcpy_P(tBuf, PSTR("<form method=GET onSubmit=\"show_alert()\">Min BSP for flight........in 1/100 of a kt...... <input type=text name=v><input type=submit></form></body></html>"));
client.write(tBuf);
///minimum TWS for flight////////////////
strcpy_P(tBuf, PSTR("<form method=GET onSubmit=\"show_alert()\">Min TWS for flight.........in 1/10 of a kt...... <input type=text name=a><input type=submit></form></body></html>"));
client.write(tBuf);
///minimum HEEL for caution/////////////
strcpy_P(tBuf, PSTR("<form method=GET onSubmit=\"show_alert()\">Caution (purple) HEEL angle...20 to 30... <input type=text name=h><input type=submit></form></body></html>"));
client.write(tBuf);
///minimum HEEL WARNING////////////////
strcpy_P(tBuf, PSTR("<form method=GET onSubmit=\"show_alert()\">WARNING (RED) HEEL angle... 30 to 50.. <input type=text name=w><input type=submit></form></body></html>"));
client.write(tBuf);
///minimum %////
strcpy_P(tBuf, PSTR("<form method=GET onSubmit=\"show_alert()\">Display Range. set to 80 for a 20% range <input type=text name=p><input type=submit></form></body></html>"));
client.write(tBuf);
///minimum target %///
strcpy_P(tBuf, PSTR("<form method=GET onSubmit=\"show_alert()\">TARGET BSP Percentage........Typ 100...... <input type=text name=p><input type=submit></form></body></html>"));
client.write(tBuf);
//centerpixel %/////
strcpy_P(tBuf, PSTR("<form method=GET onSubmit=\"show_alert()\">TARGET Pixel (Blue Dot).......Typ 11........ <input type=text name=c><input type=submit></form></body></html>"));
client.write(tBuf);
///mode////////////////
strcpy_P(tBuf, PSTR("<form method=GET onSubmit=\"show_alert()\"> Flight Target MODE...............1 to 4........... <input type=text name=m><input type=submit></form></body></html>"));
client.write(tBuf);
///mode////////////////
strcpy_P(tBuf, PSTR("<form method=GET onSubmit=\"show_alert()\">Flight Ready MODE ............1 to 3.............. <input type=text name=n><input type=submit></form></body></html></p>"));
client.write(tBuf);
if (displayColorMode == 1)strcpy_P(tBuf, PSTR("<span style=font-size:20px;line-height:0%;><p align=left><a href=mytest.php?t=0>∗ <p align=right><a href=sail.php?t=1>→ </P></span></a></span></a></body></html>"));
else strcpy_P(tBuf, PSTR("<span style=font-size:20px;line-height:0%;><p align=left><a href=mytest.php?t=1>∗ <p align=right><a href=sail.php?t=0>→ </P></span></a></span></a></body></html>"));
client.write(tBuf);
}
/////////// 9 up detail page/////////////
else if (displayPageType == 7) ///////////nine up page
{
if (displayColorMode == 1)
{
strcpy_P(tBuf, PSTR("<!DOCTYPE html><html><meta http-equiv=refresh content=3><body style=color:black;background-color:white;font-family:Verdana;font-weight:bold;>"));
client.write(tBuf);
strcpy_P(tBuf, PSTR("<body><span style=font-size:28px;><center>BSP----------------Target----------------Pct</span></p><span style=font-size:48px;line-height:100%;><center>"));
client.write(tBuf);
}
else
{
strcpy_P(tBuf, PSTR("<!DOCTYPE html><html><meta http-equiv=refresh content=5><body style=background-color:black;color:white;font-family:Verdana;font-weight:bold;>;"));
client.write(tBuf);
strcpy_P(tBuf, PSTR("<body><span style=font-size:28px;><center>BSP----------------Target----------------Pct</span></p><span style=font-size:48px;line-height:100%;><center>"));
client.write(tBuf);
}
float wBspFloat = bspInt * .01; ////////speed
dtostrf(wBspFloat, 5, 2, tBuf);
client.write(tBuf);
strcpy_P(tBuf, PSTR("......."));
client.write(tBuf);
float trgBspFloat = targetBSPAvg * .01; /////////target
dtostrf(trgBspFloat, 5, 2, tBuf);
client.write(tBuf);
strcpy_P(tBuf, PSTR(".........."));
client.write(tBuf);
float targetPctBsp = wBspFloat / trgBspFloat;
float trgBspPctFloat = targetPctBsp * 100; //////////target avg
dtostrf(trgBspPctFloat, 5, 1, tBuf);
client.write(tBuf);
strcpy_P(tBuf, PSTR("</span></a><span style=font-size:10px;><hr></span><span style=font-size:28px;line-height:100%;><center>TWA----------------Target----------------Dif")); //////make a rule and move to the next line
client.write(tBuf);
strcpy_P(tBuf, PSTR("</p><span style=font-size:48px;line-height:53%;><center>")); //////make a rule and move to the next line
client.write(tBuf);
itoa (twaInt, tBuf, 10); ///////twa
client.write(tBuf);
strcpy_P(tBuf, PSTR("..........."));
client.write(tBuf);
itoa (targetTWA, tBuf, 10); /////////target twa
client.write(tBuf);
strcpy_P(tBuf, PSTR("............"));
client.write(tBuf);
int twaTargDiff = twaInt - targetTWA; ////////target vs actual twa diffeence
itoa (twaTargDiff, tBuf, 10);
client.write(tBuf);
strcpy_P(tBuf, PSTR("</span></a><span style=font-size:10px;><hr></span><span style=font-size:28px;line-height:100%;><center>HDG--------------Dist / Brg---------Opp Tack")); //////make a rule and move to the next line
client.write(tBuf);
strcpy_P(tBuf, PSTR("</span></p><span style=font-size:48px;line-height:53%;><center>")); //////make a rule and move to the next line
client.write(tBuf);
itoa (hdmInt, tBuf, 10); /////////heading
client.write(tBuf);
strcpy_P(tBuf, PSTR("..........."));
client.write(tBuf);
dtostrf(markDistFloat, 5, 2, tBuf);
client.write(tBuf);
strcpy_P(tBuf, PSTR(" / "));
client.write(tBuf);
itoa (markInt, tBuf, 10);
client.write(tBuf);
strcpy_P(tBuf, PSTR("..........."));
client.write(tBuf);
int tackAngle = 0;
int oppTack = 0;
if (twaInt > 90) /////sets the tacking angles
{
tackAngle = 180 - twaInt;
tackAngle = tackAngle * 2;
}
else
{
tackAngle = twaInt;
tackAngle = tackAngle * 2;
}
if (RorL == "-")
{
if (twaInt > 90) oppTack = hdmInt + tackAngle;
else oppTack = hdmInt - tackAngle;
}
else {
if (twaInt > 90) oppTack = hdmInt - tackAngle;
else oppTack = hdmInt + tackAngle;
}
if (oppTack < 0) oppTack = oppTack + 360;
else if (oppTack > 359) oppTack = oppTack - 360;
itoa (oppTack, tBuf, 10); /////////opp tack
client.write(tBuf);
strcpy_P(tBuf, PSTR("</span></a></body></html>"));
client.write(tBuf);
if (displayColorMode == 1) strcpy_P(tBuf, PSTR("<span style=font-size:20px;line-height:0%;><p align=left><a href=summary.php?t=0>∗ <p align=right><a href=bsptwa.php?t=1>→ </P></span></a></span></a></body></html>"));
else strcpy_P(tBuf, PSTR("<span style=font-size:20px;line-height:0%;><p align=left><a href=summary.php?t=1>∗ <p align=right><a href=bsptwa.php?t=0>→ </P></span></a></span></a></body></html>"));
client.write(tBuf);
}
else
{
}
}
client.stop();
}
else if (c == '\n') {
currentLineIsBlank = true;
currentLineIsGet = false;
}
else if (c != '\r') {
currentLineIsBlank = false;
}
}
loopCount++;
// if 1000ms has passed since last packet
if (loopCount > 1000) {
// close connection
client.stop();
#ifdef ServerDEBUG
Serial.println("\r\nTimeout");
#endif
}
// delay 1ms for timeout timing
delay(1);
}
#ifdef ServerDEBUG
Serial.println(F("disconnected"));
#endif
}
}
/////////responds to a Bad file Request/////
void sendFileNotFound(EthernetClient thisClient) {
char tBuf[64];
strcpy_P(tBuf, PSTR("HTTP/1.0 404 File Not Found\r\n"));
thisClient.write(tBuf);
strcpy_P(tBuf, PSTR("Content-Type: text/html\r\nConnection: close\r\n\r\n"));
thisClient.write(tBuf);
strcpy_P(tBuf, PSTR("<html><body><H1>FILE NOT FOUND</H1></body></html>"));
thisClient.write(tBuf);
thisClient.stop();
#ifdef ServerDEBUG
Serial.println(F("disconnected"));
#endif
}
/////////responds to an HTTP 400: Bad Request///
void sendBadRequest(EthernetClient thisClient) {
char tBuf[64];
strcpy_P(tBuf, PSTR("HTTP/1.0 400 Bad Request\r\n"));
thisClient.write(tBuf);
strcpy_P(tBuf, PSTR("Content-Type: text/html\r\nConnection: close\r\n\r\n"));
thisClient.write(tBuf);
strcpy_P(tBuf, PSTR("<html><body><H1>BAD REQUEST</H1></body></html>"));
thisClient.write(tBuf);
thisClient.stop();
#ifdef ServerDEBUG
Serial.println(F("disconnected"));
#endif
}
//////
void strtoupper(char* aBuf) {
for (int x = 0; x < strlen(aBuf); x++) {
aBuf[x] = toupper(aBuf[x]);
}
}
byte socketStat[MAX_SOCK_NUM];
////////////////Lists a directory////////////
void printDirectory(File dir) {
//------------------------------------------------------------
dir.rewindDirectory(); // you need to rewind the the Directory
//------------------------------------------------------------
while (true) {
File entry = dir.openNextFile();
if (! entry) {
break;
}
Serial.print(entry.name());
Serial.print(" ");
Serial.println(entry.size());
}
}
//////
///SD File Listing Routine ///
void listSD() {
File root;
root = SD.open("/");
printDirectory(root);
}
//////
void logStart() {
////Update Configuration////////////////
startNo = startNo + 1; //updates restart counter and writes to log.
myFile = SD.open("settings.txt", FILE_WRITE);
myFile.print("[");
myFile.print("startno=");
myFile.print(startNo);
myFile.println("]");
myFile.close();
delay(1000);
////Initialize System Log ////////////////
myFile = SD.open("syslog.txt", FILE_WRITE);
myFile.println("");
myFile.print("--------------------- SYSTEM START NUMBER ");
myFile.print(startNo);
myFile.print(" OF ");
myFile.print(verstring);
myFile.println("--------------------");
myFile.println("Reading Paramaters from Settings.txt");
myFile.close();
}
//////
////write settings to system log/////////////
void logConfig() {
myFile = SD.open("syslog.txt", FILE_WRITE);
myFile.print("System Configured with the following paramaters: ");
myFile.print(" Leapdays=");
myFile.print(LeapDays);
myFile.print(" Sensor=");
myFile.print(Sensor);
myFile.print(" Barometer=");
myFile.print(Barometer);
myFile.print(" NMEAPlay=");
myFile.print(NMEAPlay);
myFile.print(" barometer offset=");
myFile.print(baroffset);
myFile.print(" Expedition=");
myFile.print(Expedition);
myFile.print(" targetspeedmultiplier=");
myFile.print(targetSpeedMultiplier);
myFile.print(" twsCorrectorUP=");
myFile.print(twsCorrectorUP);
myFile.print(" twsCorrectorDN=");
myFile.print(twsCorrectorDN);
myFile.print(" pitchCorrector=");
myFile.print(pitchCorrector);
myFile.print(" heelCorrector=");
myFile.print(heelCorrector);
myFile.print(" directlog=");
myFile.println(directLog);
myFile.close();
}
//
///Start the I2C Sensors ///
void startSensors() {
Serial.println(" Configuration Complete. Initialization begins.....NMEA Processor logic 1.1.5 Tackscore 2.1.0 Initializing...Sensor Setup Begins....");
bmp.begin(); //start the pressure sensor
Serial.print(" BMP085 Pressure Sensor Online...");
Serial1.print(" BMP085 Pressure Sensor Online...");
writeTo(DATA_FORMAT, 0x01); //Put the ADXL345 into Measurement Mode by writing 0x08 to the POWER_CTL register.
writeTo(POWER_CTL, 0x08); //set ADXL to 4g
Serial.print("ADXL Online...");
Serial1.print("ADXL Online.4G mode..");
if (Sensor == 1) {
readSensors();
if (Barometer == 1) {
readPressure();
readPressure();
readPressure();
readPressure();
Serial.print(" Pressure Sensor is ON. Reading: ");
readPressure();
Serial.println((pressure)*.01, 1);
}
Serial.print("pitch: ");
Serial.print( pitch );
Serial.print(" heel: ");
Serial.print( roll );
Serial.print(" slam ");
Serial.print((z - 117), DEC);
Serial.print(" Barometric Pressure ");
Serial.print(((pressure)*.01), DEC ); ///changed from .1
Serial.print(" Air Temprature ");
Serial.print((temperature), DEC);
Serial.println(" degrees C ");
Serial.print(" Sensor Init Complete....Getting The Time...");
Serial1.print(" Sensor Init Complete...Getting The Time....");
myFile = SD.open("syslog.txt", FILE_WRITE);
myFile.print("Pressure and Orientation Sensor Enabled: ");
myFile.print("pitch=");
myFile.print(pitch);
myFile.print(" Heel=");
myFile.print(roll);
myFile.print(" Temperature=");
myFile.print(temperature);
myFile.print(" C, Pressure=");
myFile.println(pressure + baroffset);
myFile.close();
}
////setting up the time for expedition///////////
tmElements_t tm;
RTC.read(tm);
ColeTimeYear = ((((tm.Year) + 70) * 365) + ((tm.Month) * 30) + (tm.Day) + LeapDays);
ColeTimeSecond = (((tm.Hour * 3600) + (tm.Minute * 60) + tm.Second) * 11.57407);
fakeSecond = (long)ColeTimeSecond; //remove the decimal from the second
Serial.print("The dateTime is: ");
Serial.print(ColeTimeYear);
Serial.print(".");
Serial.println(fakeSecond);
Serial3.print("The dateTime is: ");
Serial3.print(ColeTimeYear);
Serial3.print(".");
Serial3.println(fakeSecond);
myFile = SD.open("syslog.txt", FILE_WRITE);
myFile.print("Time Enabled: ");
myFile.print("Day = ");
myFile.print(ColeTimeYear);
myFile.print(" Fraction =");
myFile.println(fakeSecond);
myFile.close();
}
//
///Interactive Systems Status ////////////////
void sysStatus() {
Serial.print(verstring);
Serial.print(" System Start Number: ");
Serial.println(startNo); //record number since starting //User8
ShowIpInfo();
Serial.print(". NMEA Records Processed: ");
Serial.print(NMEAin); //record number since starting
Serial.print(" Time in MS since last rec cycle: ");
Serial.println(duration); //record number since starting //User8
HumanTime();
Serial.print(" Active Log File: ");
Serial.print(logFileString);
Serial.print(" Exp. Recs written: ");
Serial.print(ExpDelay); //record number since starting //User8
Serial.print(" Date and Time: ");
Serial.print(ColeTimeYear); // represnets days since 1900
Serial.print(".");
if (fakeSecond > 1000000) {
fakeSecond = 10;
ColeTimeYear = ColeTimeYear + 1;
} //backstop to an end of day miss
if (fakeSecond < 100000) { //this set of statements backfills the second with leading zeros//
if (fakeSecond < 10000) {
if (fakeSecond < 1000) {
if (fakeSecond < 100) {
if (fakeSecond < 10) {
Serial.print("0");
}
Serial.print("0");
}
Serial.print("0");
}
Serial.print("0");
}
Serial.print("0");
}
Serial.println(fakeSecond); //print the int second value
Serial.println("");
Serial.print(" BSP: ");
Serial.print(bsp.value()); //boatspeed from II tiny
Serial.print(" SOG: ");
Serial.print(sog.value());
Serial.print(" DBSP: ");
Serial.print(dbspInt); //diff of bsp and sog
Serial.print(" TRGT: ");
Serial.println(targetBSP); //calculated target BSP,
Serial.print(" AWS: ");
Serial.print(awsInt); //Apparent Wind Speed from II tiny
Serial.print(" TWS: ");
Serial.print(twsInt); //True Wind Speed from Tiny
Serial.print(" AWA: ");
Serial.print(RorL);
Serial.print(awaInt); //Apparent Wind Angle from II tiny
Serial.print(" TWA: ");
Serial.print(RorL);
Serial.print(twaInt); //Right or Left of bow (- or nothing), TWA from Tiny
Serial.print(" TWD: ");
Serial.println(twd.value()); //True Wind Direction from II tiny
Serial.print(" HDM: ");
Serial.print(hdm.value()); //mag heading
Serial.print(" COG: ");
Serial.print(cogMag); //Course over Ground
Serial.print(" dHDM: ");
Serial.println(dhdmInt); //diff of hdm and cog //user 18
Serial.print(" MTA: ");
Serial.print((temperature)); //air temp
Serial.print(" MTW: ");
Serial.print(mtw.value()); //water temp
Serial.print(" MBAR: ");
Serial.println(((pressure)*.01), 1); ////from .01 //Baro pressure
Serial.print(" DBT: ");
Serial.print(dbt.value()); //depth
Serial.print(" HEEL: ");
Serial.print(roll, 1); // Heel
Serial.print(" PITCH: ");
Serial.println(pitch, 1); //trim
Serial.print(" Mark Brg: "); //
Serial.print(markMag); //mark bearing
Serial.print(" Mark Rng: "); //corrected to make lng always negative
Serial.println(markDist); //mark Range
Serial.print(" LNG: "); //corrected to make lng always negative
Serial.print(lng2, 6); //longitude
Serial.print(" LAT: ");
Serial.println(lat2, 6); //latitude
Serial.print(" VOLTS: ");
Serial.println(volts);
Serial.print(" isInFlight ");
Serial.print(isInFlight);
//Serial.print(" fltdrv: ");
//Serial.print(flightPressDrive);
//Serial.print(" fltdif: ");
//Serial.print(flightPressDiff);
Serial.print(" fltange: ");
Serial.print(isInFlightRange);
Serial.print(" fltrdy: ");
Serial.print(isReadyToFly);
Serial.print(" fltspdmin: ");
Serial.println(bspFlightMin);
Serial.print(" TOTLOG: ");
Serial.print(totlog.value()); //total miles in b&G log //User9
Serial.print(" CURLOG: ");
Serial.println(currlog.value()); //current miles in B&G Log. //User10
Serial.print(" FWD: ");
Serial.print(finalForward); //distance accumulated in the tack //user 11
Serial.print(" GUAGE: ");
Serial.println(finalLane); //final Lane sag //user 12
ReadSettings();
}
//
///SD File Listing///////
void listFileHTML(File dir) {
dir.rewindDirectory(); // you need to rewind the the Directory
while (true)
{
File entry = dir.openNextFile();
if (! entry) {
break;
}
Serial.print(entry.name());
Serial.print(" ");
Serial.println(entry.size());
/*strcpy_P(tBuf,PSTR("<a href=\"HTTP://192.168.8.10/"));
client.write(tBuf);
strcpy_P(tBuf,PSTR(entry.name()));
client.write(tBuf);
strcpy_P(tBuf,PSTR("\"> <H2> "));
client.write(tBuf);
strcpy_P(tBuf,PSTR(entry.name()));
client.write(tBuf);
strcpy_P(tBuf,PSTR("</H2></a><p></p>"));
client.write(tBuf);*/
}
}
//
///NMEA INBOUND SENTENCE PROCESSING //////////
///Process VTG Sentence ////
void processVTG() {
//$IIVTG,097.,T,102.,M,6.9,N,,K*75
//$ECVTG,169.7,T,184.0,M,0.9,N,1.7,K*54
//$GPVTG,129.3,T,143.6,M,5.2,N,9.7,K,A*23
int commaloc = inData.indexOf(',');
int commaloc2 = inData.indexOf(',', commaloc + 1);
int commaloc3 = inData.indexOf(',', commaloc2 + 1);
int commaloc4 = inData.indexOf(',', commaloc3 + 1);
int commaloc5 = inData.indexOf(',', commaloc4 + 1);
int commaloc6 = inData.indexOf(',', commaloc5 + 1);
sogTmp = inData.substring(commaloc5 + 1, commaloc6);
String cogTmp = inData.substring(commaloc3 + 1, commaloc4);
String sogFloat = String(sogTmp.toFloat() * 100, 2);
sogInt = sogFloat.toInt();
dbspInt = bspInt - sogInt;
String cogFloat = String(cogTmp.toFloat(), 0);
cogInt = cogFloat.toInt();
dhdmInt = hdmInt - cogInt;
if (dhdmInt > 90) dhdmInt = dhdmInt - 359;
if (dhdmInt < -90) dhdmInt = dhdmInt + 359;
long cogTru = 0;
cogTru = atol(cog.value());
cogMag = cogTru + magVar;
if (cogMag > 359) cogMag = cogMag - 359;
else if (cogMag < 0) cogMag = cogMag + 359;
/*
Serial.println("");
Serial.print(",sogint:");
Serial.print(sogInt);
Serial.print(", dbspInt:");
Serial.print(dbspInt);
Serial.print(", cogTru:");
Serial.print(cogTru);
Serial.print(", cogmag:");
Serial.print(cogMag);
Serial.print(", dhnmint:");
Serial.println(dhdmInt);
*/
#ifdef instNKE
Serial1.print("$IIVTG,,,");
Serial1.print(cogMag);
Serial1.print(",M,");
Serial1.print(sog.value());
Serial1.println(",N,,,A*23");
inData = ""; //eliminate VTG Sentence - NKE specific
#endif
} //end VTG
//
///Process VWT Sentence ////
void processVWT() {
// created bspInt, hdmInt
//$IIVWT,038,R,017.1,N,008.8,M,,K*73 Velocity Wind True VWT,true wind angle, Right or Left of bow, true wind speed, ,units,
//not in H5000
int commaloc = inData.indexOf(',');
int commaloc2 = inData.indexOf(',', commaloc + 1);
int commaloc3 = inData.indexOf(',', commaloc2 + 1);
int commaloc4 = inData.indexOf(',', commaloc3 + 1);
int commaloc5 = inData.indexOf(',', commaloc4 + 1);
int commaloc6 = inData.indexOf(',', commaloc5 + 1);
String twsTmp = inData.substring(commaloc3 + 1, commaloc4);
String twsFloat = String(twsTmp.toFloat() * 100, 4); //xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
twsInt = twsFloat.toInt();
twsFloat2 = twsFloat.toFloat() , 4;
twsFloat2 = twsFloat2 /100;
//Serial.print("TWS:"); Serial.println(twsInt);
//Serial.print("FWS:"); Serial.println(twsFlightMin);
twsInt = twsInt * twsCorrectorUP;
twsInt = twsInt / 10000;
targetBSPOld = targetBSPAvg;
if (awaInt > 50) targetBSP = targetBSPArrayDN[twsInt] * targetSpeedMultiplier;
else targetBSP = targetBSPArrayUP[twsInt] * targetSpeedMultiplier;
targetBSP = targetBSP / 100;
targetBSPAvg = (targetBSP + targetBSPOld) / 2;
String twaTmp = inData.substring(commaloc + 1, commaloc2);
float latDDFloat1 = (twaTmp.toFloat() * 100, 4);
String twaFloat = String(twaTmp.toFloat() * 100, 4);
twaPrev = twaInt;
twaInt = twaFloat.toInt();
twaInt = twaInt / 100;
twaArray[tackIndex] = twaInt;
//twaInt = twaInt /100;
if (twaInt > 60) targetTWA = targetTWAArrayDN[twsInt];
else targetTWA = targetTWAArrayUP[twsInt];
if (Sensor == 1) readSensors(); //inData = ""; //get the heel and add to the stream
}
//
///Process VHW Sentence ////
void processVHW() {
// creates bspInt, hdmInt
//$WIMWV,13.3,R,3.9,N,A*18
//$WIMWV,145.8,T,1.5,N,A*29
//$IIVHW, ,T,130 ,M,07.78,N,,K*41 (Boatspeed and heading) , direction ,True or Magnetic, Heading, Magnetic, BoatspeedSpeed, Knots
//$ECVHW,164.7,T,179.0,M,0.0 ,N,0.0,K*52
int commaloc = inData.indexOf(',');
int commaloc2 = inData.indexOf(',', commaloc + 1);
int commaloc3 = inData.indexOf(',', commaloc2 + 1);
int commaloc4 = inData.indexOf(',', commaloc3 + 1);
int commaloc5 = inData.indexOf(',', commaloc4 + 1);
int commaloc6 = inData.indexOf(',', commaloc5 + 1);
bspTmp = inData.substring(commaloc5 + 1, commaloc6);
String hdmTmp = inData.substring(commaloc3 + 1, commaloc4);
String bspFloat = String(bspTmp.toFloat() * 100, 4);
bspInt = bspFloat.toInt();
// Serial.print(bspInt);
// Serial.print(", hdmInt");
String hdmFloat = String(hdmTmp.toFloat(), 3);
hdmInt = hdmFloat.toInt();
// Serial.println(hdmInt);
} //end VHW
//
///Process GLL Sentence ////
void processGLL() {
// creates lat2, lng2,
//$IIGLL,2430.525,N,08150.750,W,171852,A*2E //GLL,Lat,N/S,LON,E/W . GPS LAT/LON
//$GPGLL,1802.1975,N,06307.4095,W,142741,A,A*5B//h5000
//$ECGLL,1938.143,N,06313.569,W,005450,A*25
int commaloc = inData.indexOf(',');
int commaloc2 = inData.indexOf(',', commaloc + 1);
int commaloc3 = inData.indexOf(',', commaloc2 + 1);
int commaloc4 = inData.indexOf(',', commaloc3 + 1);
int commaloc5 = inData.indexOf(',', commaloc4 + 1);
String gllChk = inData.substring(commaloc4 + 1, commaloc4 + 2);
if (gllChk == "W" or gllChk == "E")
{
String NOrS = inData.substring(commaloc2 + 1, commaloc2 + 2);
String latDDTmp = inData.substring(commaloc + 1, commaloc + 3);
float latDDFloat1 = latDDTmp.toFloat();
String latMMTmp = inData.substring(commaloc + 3, commaloc + 10);
float mmssFloat1 = latMMTmp.toFloat();
mmssFloat1 = (mmssFloat1 / 60);
lat2 = latDDFloat1 + mmssFloat1;
String lngDDTmp = inData.substring(commaloc3 + 1, commaloc3 + 4);
float lngDDFloat1 = lngDDTmp.toFloat();
String lngMMTmp = inData.substring(commaloc3 + 4, commaloc3 + 11);
float lngmmssFloat1 = lngMMTmp.toFloat();
lngmmssFloat1 = (lngmmssFloat1 / 60);
lng2 = lngDDFloat1 + lngmmssFloat1;
if (gllChk == "W") lng2 = lng2 * -1;
}
} //end GLL
//
///Process MWV Sentence ////
void processMWV() {
//$WIMWV,13.3,R,3.9,N,A*18 ///apparent wind
//$WIMWV,145.8,T,1.5,N,A*29 ///true wind
//$WIMWV,145.8,T,1.5,N,A*29 //h5000
//$ECMWV,293.0,T,12.0,N,A*06
//$ECMWV,319.0,R,16.8,N,A*0F
//creates awaInt,RorL, sets p/s relay
int commaloc = inData.indexOf(',');
int commaloc2 = inData.indexOf(',', commaloc + 1);
int commaloc3 = inData.indexOf(',', commaloc2 + 1);
int commaloc4 = inData.indexOf(',', commaloc3 + 1);
int commaloc5 = inData.indexOf(',', commaloc4 + 1);
int commaloc6 = inData.indexOf(',', commaloc5 + 1);
String typeTmp = inData.substring(commaloc2 + 1, commaloc3);
// Serial.print(", type:");
// Serial.println(typeTmp);
if (typeTmp == "R")
{
String awaTmp = inData.substring(commaloc + 1, commaloc2);
String awaFloat = String(awaTmp.toFloat(), 3);
// Serial.print(", awa:");
// Serial.print(awaFloat);
awaPrev = awaInt;
awaInt = awaFloat.toInt();
RorL = "";
RorLArray[tackIndex] = 1;
if (awaInt > 180)
{
awaInt = 360 - awaInt;
RorL = "-";
RorLArray[tackIndex] = 0;
// Serial.print(", awaIntCorr:");
// Serial.print(awaInt);
}
awaArray[tackIndex] = awaInt;
String awsTmp = inData.substring(commaloc3 + 1, commaloc4);
// Serial.print(", awaInt:");
// Serial.print(awaInt);
//new aws calcs
//aws = awsTmp;
String awsFloat = String(awsTmp.toFloat(), 3);
// Serial.print(", awsfloat:");
// Serial.println(awsFloat);
//awsPrev = awaInt;
awsInt = awsFloat.toInt();
// Serial.print(", awsInt:");//
// Serial.println(awsInt);
//awaArray[tackIndex] = awaInt;
} //awaTemp is OK, not "M"
else if (typeTmp == "T")
{
String twsTmp = inData.substring(commaloc3 + 1, commaloc4);
String twsFloat = String(twsTmp.toFloat() * 100, 4);
twsInt = twsFloat.toInt();
twsFloat2 = twsFloat.toFloat() , 4;
//Serial.print(", TWSInt:"); Serial.print(twsInt);
//Serial.print("FWS:"); Serial.println(twsFlightMin);
twsInt = twsInt * twsCorrectorUP;
twsInt = twsInt / 10000;
targetBSPOld = targetBSPAvg;
if (awaInt > 50) targetBSP = targetBSPArrayDN[twsInt] * targetSpeedMultiplier;
else targetBSP = targetBSPArrayUP[twsInt] * targetSpeedMultiplier;
targetBSP = targetBSP / 100;
targetBSPAvg = (targetBSP + targetBSPOld) / 2;
String twaTmp = inData.substring(commaloc + 1, commaloc2);
String twaFloat = String(twaTmp.toFloat() * 100, 4);
twaPrev = twaInt;
twaInt = twaFloat.toInt();
twaInt = twaInt / 100;
// Serial.print(", twaInt:");//
// Serial.println(twaInt);
if (twaInt > 180)
{
twaInt = 360 - twaInt;
//RorL = "-";
// Serial.print(", twaIntCorr:");
// Serial.println(twaInt);
}
twaArray[tackIndex] = twaInt;
//twaInt = twaInt /100;
if (twaInt > 60) targetTWA = targetTWAArrayDN[twsInt];
else targetTWA = targetTWAArrayUP[twsInt];
if (Sensor == 1) readSensors(); //inData = ""; //get the heel and add to the stream
polarRecordCheck();
}
}
//
///Process VWR Sentence ////
void processVWR() {
// Serial.println("VWR Processing");
//not in h5000
//creates awaInt,RorL, sets p/s relay
int commaloc = inData.indexOf(',');
int commaloc2 = inData.indexOf(',', commaloc + 1);
int commaloc3 = inData.indexOf(',', commaloc2 + 1);
String awaTmp = inData.substring(commaloc + 1, commaloc2);
if (awaTmp == "M") inData = ""; //checks for a bad VWR sentence read and throwss it away
else {
awa = awaTmp;
String awaFloat = String(awaTmp.toFloat(), 3);
awaPrev = awaInt;
awaInt = awaFloat.toInt();
awaArray[tackIndex] = awaInt;
String RorLTmp = inData.substring(commaloc2 + 1, commaloc3);
if (RorLTmp == "M") inData = ""; //checks for a bad VWR sentence read and throwss it away
else if (RorLTmp == "L")
{
RorL = "-";
if (paddleSelector == 1) digitalWrite(22, LOW);
RorLArray[tackIndex] = 0;
}
else
{
RorL = "";
RorLArray[tackIndex] = 1;
if (paddleSelector == 1) digitalWrite(22, HIGH);
}
} //awaTemp is OK, not "M"
} //end VWR
//
////Process PIX Sentence ///
void processPIX() {
}
//
/////END OF INBOUND SENTENCES/////////////////
////Checks 2 BMP's and gives difference //////
void checkDrive() {
digitalWrite(BMPSelector, HIGH);
flightPressDrive = (bmp.readPressure());
flightPressDrive = flightPressDrive - flightPressCorrector;
digitalWrite(BMPSelector, LOW);
delay(15);
flightPressAtmos = (bmp.readPressure());
flightPressDiff = flightPressDrive - flightPressAtmos + flightGain;
if (flightPressDiff >= 0) isInFlight = 1;
if (statMsg == 1)
{
Serial.print("Flight pressure Corrector: ");
Serial.print(flightPressCorrector);
Serial.print(" Corrected SailDrive Pressure: ");
Serial.print(flightPressDrive);
Serial.print(" Flight pressure Atmos: ");
Serial.print(flightPressAtmos);
Serial.print(" Gain Value: ");
Serial.print(flightGain);
Serial.print(" Difference with gain ");
Serial.print(flightPressDiff);
Serial.print(" isInFlight: ");
Serial.println(isInFlight);
}
}
//
//Interactive non-averaged Barometer//////////
void readPress() {
pressure = (bmp.readPressure());
pressure = pressure + baroffset;
Serial.println("The barometric pressure in mb is: ");
Serial.println((pressure)*.01, 1);
}
//
///standard baro pressure read////////////////
void readPressure() {
temperature = (bmp.readTemperature());
pressure = (bmp.readPressure());
//Serial.println(pressure);
pressure = pressure + baroffset;
//Serial.println(pressure);
pressure = ((pressure + pressureold) / 2);
//Serial.println(pressure);
temperature = ((temperature + tempold) / 2);
tempold = temperature; //averaging
pressureold = pressure; //averaging
}
//
//checks the 12v voltage////
void checkVoltage12() {
float v12Actual1 = analogRead(v12Signal);
}
//
///checkks 24 volt levels///
void checkVoltage24() {
float v24Actual1 = analogRead(v24Signal);
float v24Actual2 = analogRead(v24Signal);
float v24Actual3 = analogRead(v24Signal);
v24Actual = v24Actual1 + v24Actual2 + v24Actual3;
v24Actual = v24Actual * v24Multiplier;
v24Pct = 0;
if (v24Actual >= v2490Threshold) v24Pct = 90;
else if (v24Actual >= v2480Threshold) v24Pct = 80;
else if (v24Actual >= v2470Threshold) v24Pct = 70;
else if (v24Actual >= v2460Threshold) v24Pct = 60;
else if (v24Actual >= v2450Threshold) v24Pct = 50;
else if (v24Actual >= v2440Threshold) v24Pct = 40;
else if (v24Actual >= v2430Threshold) v24Pct = 30;
else if (v24Actual >= v2420Threshold) v24Pct = 20;
else if (v24Actual >= v2410Threshold) v24Pct = 10;
else if (v24Actual >= v240Threshold) v24Pct = 0;
if (statMsg == 1)
{
Serial.print(" 24 volt level:");
Serial.print(v24Actual);
Serial.print(" , ");
Serial.println(v24Pct);
}
}
//
/// checks flight status and sets pixels/////////
void checkFlight() {
isReadyToFlyFlag = 0;
}
//
//////prints the flight signals //////////////
void checkFlightStat() {
Serial.print(" Boatspeed is ");
Serial.print(bspInt);
Serial.print(", isReadyToFly is ");
Serial.print(isReadyToFly);
Serial.print(", isInFlightSignal is: ");
Serial.print(isInFlightSignal);
Serial.print(", isInFlight is ");
Serial.println(isInFlight);
}
//
///fills a row of dots//////
void dotFill(char clr) {
if (statMsg == 1) {
Serial.print(" dot fill color character:");
Serial.println(clr);
}
int clrR = 0;
int clrG = 0;
int clrB = 0;
if (clr == 'd')
{
int i;
for (i = 0; i < NUMPIXELS - 1; i++)
{
PixelArrayR = 255;
}
}
else if (clr == 'r')
{
int i;
for (i = 0; i < NUMPIXELS - 1; i++)
{
PixelArrayG = 255;
}
}
else if (clr == 'l')
{
int i;
for (i = 0; i < NUMPIXELS - 1; i++)
{
PixelArrayB = 255;
}
}
else if (clr == 'k')
{
int i;
for (i = 0; i < NUMPIXELS - 1; i++)
{
PixelArrayR = 0;
PixelArrayG = 0;
PixelArrayB = 0;
}
}
else if (clr == 'h')
{
int i;
for (i = 0; i < NUMPIXELS - 1; i++)
{
PixelArrayG = 255;
PixelArrayR = 255;
PixelArrayB = 255;
}
}
}
//
///wipes a row of dots//////
void dotWipe(char clr) {
//if (statMsg == 1) {
// Serial.print(" dot wipe color character:");
// Serial.println(clr);
// }
int clrR = 0;
int clrG = 0;
int clrB = 0;
if (clr == 'd')
{
int i;
for (i = 0; i < NUMPIXELS - 1; i++)
{
PixelArrayR = 0;
}
}
else if (clr == 'r')
{
int i;
for (i = 0; i < NUMPIXELS - 1; i++)
{
PixelArrayG = 0;
}
}
else if (clr == 'l')
{
int i;
for (i = 0; i < NUMPIXELS - 1; i++)
{
PixelArrayB = 0;
}
}
else if (clr == 'k')
{
int i;
for (i = 0; i < NUMPIXELS - 1; i++)
{
PixelArrayR = 0;
PixelArrayG = 0;
PixelArrayB = 0;
}
}
else if (clr == 'h')
{
int i;
for (i = 0; i < NUMPIXELS - 1; i++)
{
PixelArrayG = 0;
PixelArrayR = 0;
PixelArrayB = 0;
}
}
}
//
//dotBright - sets a higher brightness level///////
void dotBright() {
if (dotBrightess >= 7) dotBrightess = 7;
else dotBrightess = dotBrightess + 1;
if (statMsg == 1)
{
Serial.print(dotBrightess);
Serial.println("brightness level up by one");
}
}
//
///dotDim - sets a lower dimming level/////////////
void dotToggle() {
if (dotBrightess <= 0) dotBrightess = 3;
else dotBrightess = 0;
if (statMsg == 1)
{
Serial.print(dotBrightess);
Serial.println(" dots toggled ");
}
}
//
///dotDim - sets a lower dimming level/////////////
void dotDim() {
if (dotBrightess <= 0) dotBrightess = 0;
else dotBrightess = dotBrightess - 1;
if (statMsg == 1)
{
Serial.print(dotBrightess);
Serial.println("brightness level down by one");
}
}
//
///wipes a row of dots//////
void dotClear() {
if (statMsg == 1) {
Serial.println(" dot array cleared ");
}
int i;
for (i = 0; i < NUMPIXELS - 1; i++)
{
PixelArrayG = 0;
PixelArrayR = 0;
PixelArrayB = 0;
}
dotDisplay();
dotReset = 1;
if (statMsg == 1)Serial.println("Dot Reset");
}
//
////////////////sets the DOT String brightness///
void dotBrightness() {
if (dotBrightess == 0) strip.setBrightness(000);
if (dotBrightess == 1) strip.setBrightness(002);
if (dotBrightess == 2) strip.setBrightness(003);
if (dotBrightess == 3) strip.setBrightness(010);
if (dotBrightess == 4) strip.setBrightness(035);
if (dotBrightess == 5) strip.setBrightness(075);
if (dotBrightess == 6) strip.setBrightness(150);
if (dotBrightess == 7) strip.setBrightness(255);
if (statMsg == 1) Serial.println("brightness sent to strip");
}
//
///Moves the array to the DOT String and shows/////
void verDisplay() {
dotBrightness();
int i = 0;
for (i = 0; i < NUMPIXELS - 1; i++)
{
strip.setPixelColor(i, strip.Color(000, 000, versionArray));
strip.show();
}
}
//
///Moves the array to the DOT String and shows/////
void dotDisplay() {
dotBrightness();
int i = 0;
for (i = 0; i < NUMPIXELS - 1; i++)
{
strip.setPixelColor(i, strip.Color(PixelArrayG, PixelArrayR, PixelArrayB));
strip.show();
dotReset = 0;
}
}
//
///Help Commands/////////
void getPolarBsp() {
if (twaInt < 0) twaInt = 0;
if (twaInt > 180) twaInt = 180;
int twsTrunc = twsInt;
if (twsTrunc > 30) twsTrunc = 30;
if (twsTrunc < 0) twsTrunc = 0;
//polarBspOld = polarBspAvg;
polarBsp = polarArray[twsTrunc][twaInt];
polarBspAvg = polarBsp + polarBspAvg;
polarBspAvg = polarBspAvg * .5;
//polarBsp = polarBsp*.01;
if (statMsg == 1) {
Serial.print("polar speeds ");
Serial.print(", TWS Int ,"); Serial.print(twsInt);
Serial.print(", TWA Int "); Serial.print(twaInt);
Serial.print(", PolarBspAvg "); Serial.print(polarBspAvg);
Serial.print(",Polar Spd "); Serial.print(polarBsp); Serial.println(",");
}
}
//
////////////////sets target on red string/////
void dotTarget() {
float targetPctBsp2 = 0;
float bspFloat2 = bspInt;
float targetBSPAvg2 = targetBSPAvg;
float numpixelsFloat = NUMPIXELS;
float centerPixelFloat = centerPixel;
pickPixelMult = centerPixelFloat / numpixelsFloat; //calculate percentage for each pixel
targetPctBsp2 = bspFloat2 / targetBSPAvg2; //temp target percentage value
targetPctBsp2 = targetPctBsp2 * 100; //make ready for int conversion
prevPixelT = whichPixelT; //save the reentrant value
whichPixelT = targetPctBsp2 - neoMinTargetFloor; //figure where we are in the range
whichPixelT = pickPixelMult * whichPixelT; //set the range to the pixels
if (statMsg == 1)
{
Serial.print("dotTarget,");
Serial.print(",pickpixelmult," ); Serial.print(pickPixelMult);
Serial.print(",targetpctbsp," ); Serial.print(targetPctBsp2);
Serial.print(",neomintargetfloor," ); Serial.println(neoMinTargetFloor);
}
pixelXDR();
}
//
////////////////uses Polars instead of targets///
void dotPolar() {
float polarPctBsp2 = 0;
float bspFloat2 = bspInt;
float polarBSPAvg2 = polarBspAvg;
float numpixelsFloat = NUMPIXELS;
float centerPixelFloat = centerPixel;
bspFloat2 = bspFloat2 * .01;
pickPixelMult = centerPixelFloat / numpixelsFloat; //calculate percentage for each pixel
polarPctBsp2 = bspFloat2 / polarBSPAvg2; //temp target percentage value
polarPctBsp2 = polarPctBsp2 * 100; //make ready for int conversion
prevPixelT = whichPixelT; //save the reentrant value
whichPixelT = polarPctBsp2 - neoMinTargetFloor; //figure where we are in the range
whichPixelT = pickPixelMult * whichPixelT; //set the range to the pixels
if (statMsg == 1)
{
Serial.print("dotPolar,");
Serial.print(",pickpixelmult," ); Serial.print(pickPixelMult);
Serial.print(",polarpctbsp," ); Serial.print(polarPctBsp2);
Serial.print(",neomintargetfloor," ); Serial.println(neoMinTargetFloor);
}
pixelXDR();
}
//
////////////////displays TWA only downwind////
void dotTWA() {
float targetPctBsp2 = 0;
float bspFloat2 = bspInt;
float targetBSPAvg2 = targetBSPAvg;
float numpixelsFloat = NUMPIXELS;
float centerPixelFloat = centerPixel;
pickPixelMult = centerPixelFloat / numpixelsFloat; //calculate percentage for each pixel
targetPctBsp2 = bspFloat2 / targetBSPAvg2; //temp target percentage value
targetPctBsp2 = targetPctBsp2 * 100; //make ready for int conversion
prevPixelT = whichPixelT; //save the reentrant value
whichPixelT = targetPctBsp2 - neoMinTargetFloor; //figure where we are in the range
whichPixelT = pickPixelMult * whichPixelT; //set the range to the pixels
pixelXDR();
}
//
////////////////sets the driver pixel and sends the XDR////////////
void pixelXDR() {
}
//
///Dot Splash Lights /////////
void dotSplash() {
verDisplay();
delay(2000);
int splashDelay = 200;
dotBrightness();
dotFill('Rd');
dotDisplay();
delay(splashDelay);
dotWipe('Rd');
dotDisplay();
dotFill('Gr');
dotDisplay();
delay(splashDelay);
dotWipe('Gr');
dotDisplay();
dotFill('Bl');
dotDisplay();
delay(splashDelay);
dotWipe('Bl');
dotDisplay();
dotFill('Wh');
dotDisplay();
delay(splashDelay / 2);
int i;
for (i = 150; i > 0; i--)
{
strip.setBrightness(i);
//Serial.println(i);
strip.show();
delay(3);
}
dotWipe('Bk');
dotDisplay();
}
//
///updates a setting read from a file read or console//////////////
void applySetting(String settingName, String settingValue) {
if ((settingName == "pressureoffset") || (settingName == "baroffset")) {
Serial.print("the existing value of ");
Serial.print(baroffset);
baroffset = settingValue.toInt();
Serial.print(" has been replaced with ");
Serial.println(baroffset);
}
else if (settingName == "startno") {
Serial.print("the existing value of ");
Serial.print(startNo);
Serial.print(" has been replaced with ");
startNo = settingValue.toInt(); //set the leapdays to correct coledatetime
Serial.println(startNo);
}
}
//
///Help Commands/////
void listHelp() {
Serial.println(" Available Console Commands:");
Serial.println(" sed-l - reads the system log file and plays it to console");
Serial.println(" sed-s - reads the settings file and plays it to the console. can also type SETTINGS ");
Serial.println(" sed-p - reads the polar file and enumerates the polar array and target array ");
Serial.println(" rdsdc - lists he contents of the SD card and plays it to console. can also type ls -l ");
Serial.println(" sed-f - reads the file named and plays it to console, must be preceded and followed by a comma. example: sed-f,123456.csv, ");
Serial.println(" upstg - updates contents of the settings file with the paramater and value specified in the command. example: upstg,parmater,value, ");
Serial.println(" ");
Serial.println(" setti - reads the settings file and plays it to console");
Serial.println(" quiet - turns off NMEA data to console");
Serial.println(" nomsg - turns off system messages to serial");
Serial.println(" msgon - turns off system messages to serial");
Serial.println(" nonmea - turns off NMEA messages to serial");
Serial.println(" nmeaon - turns ON NMEA data to console");
Serial.println(" echoo - turns ON NMEA data to console");
Serial.println(" noisy - turns ON NMEA data to console");
Serial.println(" statu - shows system and data status");
Serial.println(" press - shows current barometric pressure");
Serial.println(" -help - shows the command help file");
Serial.println(" ls -l - lists the contents of the SD card and plays it to console");
Serial.println(" ls -p - lists the contents of the target and polar arrays and plays them to console");
Serial.println(" DOT COMMANDS");
Serial.println(" dimmer - dims the driver lights");
Serial.println(" bright - brightens the driver lights");
Serial.println(" clear - clears the dot display");
Serial.println(" dotpol - sets the dot mode to polar boatspeed mode");
Serial.println(" dottarg - sets the dot mode to target boatspeed mode");
Serial.println(" dottwa - sets the dot mode to target TWA display");
Serial.println(" rdybsp - sets dot ready mode to Boatspeed only");
Serial.println(" rdytwa - sets dot ready mode to TWA only");
Serial.println(" rdyboth - sets dot ready mode to both BSP & TWA ");
Serial.println(" rdyei - sets dot ready mode to either BSP or TWA ");
Serial.println(" toggle - toggles the dot display between on and off");
Serial.println(" ifcon - displays the IP interface settings");
}
//
////////////////writes expedition record to S3 /////////////
void s3expRecord() {
Serial3.print("$MEXP1#");
Serial3.println("#23");
}
//
////////////////reads the heel angle /////
void readRoll() {
uint8_t howManyBytesToRead = 6;
readFrom( DATAX0, howManyBytesToRead, _buff); //read the acceleration data from the ADXL345
// each axis reading comes in 10 bit resolution, ie 2 bytes. Least Significat Byte first!!
// thus we are converting both bytes in to one int
zold = z;
x = (((int16_t)_buff[1]) << 8) | _buff[0];
y = (((int16_t)_buff[3]) << 8) | _buff[2];
z = (((int16_t)_buff[5]) << 8) | _buff[4];
//x = ((x + xold) / 2);
//y = ((y + yold) / 2);
//Roll and Pitch to degree Equations
roll = (atan2(-y, z) * 180.0) / M_PI;
roll = roll + heelCorrector;
}
//
//show the polar array////
void ShowPolar() {
Serial.println("Polar File!");
for ( int c = 0; c < 180; c++) {
Serial.print(c);
Serial.print(",");
}
for ( int r = 0; r < 36; r++) {
for ( int c = 0; c < 180; c++) {
Serial.print( polarArray[r][c]);
Serial.print(",");
}
Serial.println();
}
Serial.println();
Serial.println("Upwind Targets!");
for ( int c = 0; c < 35; c++) {
Serial.print(c);
Serial.print(",");
Serial.print(targetTWAArrayUP[c]);
Serial.print(",");
Serial.print(targetBSPArrayUP[c]);
Serial.println("");
}
Serial.println("Downwind Targets!");
for ( int c = 0; c < 35; c++) {
Serial.print(c);
Serial.print(",");
Serial.print( targetTWAArrayDN[c]);
Serial.print(",");
Serial.print( targetBSPArrayDN[c]);
Serial.println("");
}
}
//
//////polar file read and enumerate routine/////////////////
//polar file must have 0 row, be CSV named txt and have a 0 tws row//////////////
void ReadExpPolarFile() {
String inData5 = "";
String inData6 = "";
char recieved5;
int colTyp = 0;
int pcommaloc = 0;
int pcommalocprev = 0;
int endLoc = 0;
int ididx = 0;
String valFloat = 0;
String valTmp = "";
int valRow = 0;
int polTws = 0;
int EOL = 0;
int firstCol = 1;
int polBsp = 0;
int polTwa = 0;
int lowTwa = 0;
int highTwa = 0;
int lowBsp = 0;
int highBsp = 0;
int lowerPair = 0;
float diffBsp = 0;
float lowBspF = 0;
int diffTwa = 0;
float addBsp = 0;
File myFile = SD.open("polarfil.txt");
if (myFile)
{
Serial.println(" fil.txt file found. processing contents: ");
while (myFile.available())
{
recieved5 = myFile.read();
inData5 += recieved5;
ididx = 0;
if (recieved5 == '\n') // Process message when new line character is received
{
inData6 = inData5;
inData5 = "";
endLoc = inData6.indexOf('\n'); //right end bound
//Serial.print("endloc "); Serial.print(endLoc); Serial.print(" ididx "); Serial.print(ididx);
Serial.print(" Processing Record:");
Serial.print(inData6);
pcommalocprev = 0;
firstCol = 1;
while (EOL == 0) //we're not at the end of a record so get more
{
if (firstCol == 1)
{
firstCol = 0;
pcommaloc = inData6.indexOf(',', pcommalocprev);
valTmp = inData6.substring(pcommalocprev, pcommaloc);
valFloat = String(valTmp.toFloat());
polTws = valFloat.toInt();
if (pcommaloc < ididx) EOL = 1;
ididx = pcommaloc + 1; //////////////sets us to the data row
pcommalocprev = pcommaloc + 1;
}
if (colTyp == 0) colTyp = 1; ////flops the column type values
else colTyp = 0;
pcommaloc = inData6.indexOf(',', pcommalocprev);
valTmp = inData6.substring(pcommalocprev, pcommaloc);
if (colTyp == 0) //speed
{
valFloat = String(valTmp.toFloat() * 100 , 4);
valRow = valFloat.toInt();
polBsp = valRow;
if (lowerPair == 0)
{
lowTwa = polTwa;
lowBsp = polBsp;
lowerPair = 1;
//Serial.println(" were slotted into lower vals ");
}
else
{
highTwa = polTwa;
highBsp = polBsp;
//build the diffs///////////
diffBsp = highBsp - lowBsp;
diffTwa = highTwa - lowTwa;
addBsp = diffBsp / diffTwa;
addBsp = addBsp * .01;
lowBspF = lowBsp * .01;
for (int co = lowTwa; co <= highTwa; co++)
{
int lowBspFInt = lowBspF * 100; //this line ghcanges to an int...
polarArray[polTws][co] = lowBspF;
lowBspF = lowBspF + addBsp;
}
Serial.print("+");
/////////////finishing up for the next loop
lowTwa = highTwa;
lowBsp = highBsp;
}
}
else //coltype must equal 1
{
valFloat = String(valTmp.toFloat());
valRow = valFloat.toInt();
polTwa = valRow;
}
if (pcommaloc < ididx) EOL = 1;
ididx = pcommaloc + 1; //////////////sets us to the data row
pcommalocprev = pcommaloc + 1;
}
Serial.println(" Record Sucessfully Processed ");
EOL = 0;
lowerPair = 0;
inData5 = "";
}
}
}
///fill in the columns
int r = 0;
int c = 0;
float lowB = 0;
float highB = 0;
int gotLow = 0;
int gotHigh = 0;
int rowCounter = 1;
int lowRow = 0;
float val = 0;
float valDiff = 0;
float valAdd = 0 ;
int highRow = 0;
while (c < 180)
{
while (r < 36)
{
val = polarArray[r][c];
if (val != 0 && gotLow == 0) {
gotLow = 1;
rowCounter = 0;
lowB = val;
lowRow = r;
}
else if (val != 0 && gotLow == 1 && gotHigh == 0)
{
gotHigh = 1;
highB = val;
valDiff = highB - lowB;
valAdd = valDiff / rowCounter;
highRow = lowRow + rowCounter;
for (int i = lowRow; i < highRow; i++)
{
Serial.print(".");
polarArray[lowRow][c] = lowB;
lowB = lowB + valAdd;
lowRow++;
}
gotLow = 1;
gotHigh = 0;
rowCounter = 0;
lowB = highB;
lowRow = r;
highB = 0;
highRow = 0;
}
r++;
if (gotLow == 1) rowCounter ++;
}
r = 0;
gotLow = 0;
gotHigh = 0;
c++;
}
//ShowPolar();
BuildTargets();
}
//
//Target array refresh from polars////////
void BuildTargets() {
float topVal = 0;
int topValInt = 0;
int angleT = 0;
float val = 0;
int c = 0;
int r = 0;
float cosTmp = 0;
int cCos = 0;
while (r < 36)
{
while (c < 180)
{
if (c > 90) cCos = 180 - c;
else cCos = c;
cosTmp = cosArray[cCos] * .0001;
val = polarArray[r][c] * cosTmp;
if (val > topVal) {
topVal = val;
angleT = c;
}
if (c > 90)
{
targetTWAArrayDN[r] = angleT;
topValInt = topVal * 100;
targetBSPArrayDN[r] = topValInt;
}
else
{
targetTWAArrayUP[r] = angleT;
topValInt = topVal * 100;
targetBSPArrayUP[r] = topValInt;
}
c++;
}
c = 0;
angleT = 0;
topVal = 0;
topValInt = 0;
r++;
}
}
//
///writes updateable settings to SD////
void WriteTune() {
myFile = SD.open("settings.txt", FILE_WRITE);
myFile.print("["); myFile.print("centerPixel"); myFile.print("="); myFile.print(centerPixel); myFile.println("]");
myFile.print("["); myFile.print("bspFlightMin"); myFile.print("="); myFile.print(bspFlightMin); myFile.println("]");
myFile.print("["); myFile.print("dotBrightess"); myFile.print("="); myFile.print(dotBrightess); myFile.println("]");
myFile.print("["); myFile.print("warningRoll"); myFile.print("="); myFile.print(warningRoll); myFile.println("]");
myFile.print("["); myFile.print("cautionRoll"); myFile.print("="); myFile.print(cautionRoll); myFile.println("]");
myFile.print("["); myFile.print("dotMode"); myFile.print("="); myFile.print(dotMode); myFile.println("]");
myFile.print("["); myFile.print("NMEALog"); myFile.print("="); myFile.print(NMEALog); myFile.println("]");
//myFile.print("["); myFile.print("boardHeight"); myFile.print("="); myFile.print(boardHeight); myFile.println("]");
//myFile.print("["); myFile.print("activeSail"); myFile.print("="); myFile.print(activeSail); myFile.println("]");
myFile.print("["); myFile.print("s3PIXComm"); myFile.print("="); myFile.print(s3PIXComm); myFile.println("]");
myFile.print("["); myFile.print("s1PIXComm"); myFile.print("="); myFile.print(s1PIXComm); myFile.println("]");
myFile.print("["); myFile.print("s0PIXComm"); myFile.print("="); myFile.print(s0PIXComm); myFile.println("]");
myFile.print("["); myFile.print("s1NMEAComm"); myFile.print("="); myFile.print(s1NMEAComm); myFile.println("]");
myFile.print("["); myFile.print("s3NMEAComm"); myFile.print("="); myFile.print(s3NMEAComm); myFile.println("]");
myFile.print("["); myFile.print("PIXGenerate"); myFile.print("="); myFile.print(PIXGenerate); myFile.println("]");
myFile.print("["); myFile.print("s0XDRComm"); myFile.print("="); myFile.print(s0XDRComm); myFile.println("]");
myFile.print("["); myFile.print("s1XDRComm"); myFile.print("="); myFile.print(s1XDRComm); myFile.println("]");
myFile.print("["); myFile.print("s3XDRComm"); myFile.print("="); myFile.print(s3XDRComm); myFile.println("]");
myFile.print("["); myFile.print("neoMinTargetFloor"); myFile.print("="); myFile.print(neoMinTargetFloor); myFile.println("]");
myFile.print("["); myFile.print("baroffset"); myFile.print("="); myFile.print(baroffset); myFile.println("]");
myFile.print("["); myFile.print("NMEAPlay"); myFile.print("="); myFile.print(NMEAPlay); myFile.println("]");
myFile.print("["); myFile.print("Expedition"); myFile.print("="); myFile.print(Expedition); myFile.println("]");
myFile.print("["); myFile.print("Sensor"); myFile.print("="); myFile.print(Sensor); myFile.println("]");
myFile.print("["); myFile.print("Barometer"); myFile.print("="); myFile.print(Barometer); myFile.println("]");
myFile.print("["); myFile.print("paddleSelector"); myFile.print("="); myFile.print(paddleSelector); myFile.println("]");
myFile.print("["); myFile.print("directLog"); myFile.print("="); myFile.print(directLog); myFile.println("]");
myFile.print("["); myFile.print("tackScoreData"); myFile.print("="); myFile.print(tackScoreData); myFile.println("]");
myFile.print("["); myFile.print("v24Record"); myFile.print("="); myFile.print(v24Record); myFile.println("]");
myFile.print("["); myFile.print("v12Record"); myFile.print("="); myFile.print(v12Record); myFile.println("]");
myFile.print("["); myFile.print("LeapDays"); myFile.print("="); myFile.print(LeapDays); myFile.println("]");
myFile.print("["); myFile.print("isReadyMode"); myFile.print("="); myFile.print(isReadyMode); myFile.println("]");
myFile.print("["); myFile.print("twsFlightMin"); myFile.print("="); myFile.print(twsFlightMin); myFile.println("]");
//myFile.print("["); myFile.print(""); myFile.print("="); myFile.print(); myFile.println("]");
myFile.close();
Serial.println("The settings File has been updated with a web request");
myFile = SD.open("syslog.txt", FILE_WRITE);
myFile.println("The settings File has been updated from a web request: ");
myFile.close();
}
/////
/////////////shows time in standard format//
void HumanTime() {
}
//////
//////
void print2digits(int number) {
if (number >= 0 && number < 10) {
Serial.write('0');
}
Serial.print(number);
}
//////
////sends a single expedition record to Serial//
void ShowExpeditionInfo() {
Serial.println((z - 119)); // z axis of accelerometer "motion" field
}
//////
////checks wind and sets polar field ////////////
void polarRecordCheck() {
}
/////
////displays ip settings ////
void ShowIpInfo()
{
Serial.println("")
;Serial.print("IP: ");
Serial.print(Ethernet.localIP());
Serial.print(" Gateway: ");
Serial.print(Ethernet.gatewayIP());
Serial.print(" Subnet Mask: ");
Serial.println(Ethernet.subnetMask());
}
/////