VSS_Rally_V3/backup/wmain2.dcpx
2022-04-26 17:25:12 +07:00

3744 lines
116 KiB
Plaintext

/*********
Rui Santos
Complete project details at https://RandomNerdTutorials.com/esp32-esp8266-input-data-html-form/
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files.
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
*********/
#include <Arduino.h>
#ifdef ESP32
#include <WiFi.h>
#include <AsyncTCP.h>
#include <AsyncJson.h>
#include <SPIFFS.h>
#else
#include <ESP8266WiFi.h>
#include <ESPAsyncTCP.h>
#include <Hash.h>
#include <FS.h>
#endif
#include <ESPAsyncWebServer.h>
// #include <ESPmDNS.h>
//#include <ESPAsync_WiFiManager.hpp>
#include <index.h>
#include <template_html.h>
#include <constanta.h>
#include <ArduinoJson.h>
#include <time.h>
//#include <VSS_Rally_V2.h>
AsyncWebServer server(80);
AsyncWebSocket ws("/ws");
AsyncWebSocket wscal("/wscal");
//WiFiManager wifiManager;
// REPLACE WITH YOUR NETWORK CREDENTIALS
// char ssid[] = "WiFi_SuGi";
char ssid[] = "123456789012345678901234567890";
char password[] = "123456789012345678901234567890";
//strcpy(ssid,"WiFi_SuGi");
//password = "1234567890";
const char *soft_ap_ssid = "MyESP32AP";
const char *soft_ap_password = "testpassword";
const char* PARAM_STRING = "inputString";
const char* PARAM_INT = "inputInt";
const char* PARAM_FLOAT = "inputFloat";
const char* PARAM_SSID = "ssidString";
const char* PARAM_PWD = "inputPwd";
const char* ntpServer = "pool.ntp.org";
const long gmtOffset_sec = 7*3600;
const int daylightOffset_sec = 0;
uint8_t STATE, dircount1, dircount2; //The current state machine state
//volatile DynamicJsonDocument getRally(200);
String getRallyJson="{\"counter\":0}";
String getCalibJson="{\"counter\":0}";
int globalClientRally=0;
int globalClientCalib=0;
#define REQUESTCOUNT 3
AsyncWebServerRequest *gRequest[REQUESTCOUNT];
JsonVariant gJson[REQUESTCOUNT];
uint8_t gReqCount=0;
bool gGotRequest[REQUESTCOUNT];
AsyncWebServerRequest *gRequestConstHTML[REQUESTCOUNT];
uint8_t gReqCountConstHTML=0;
bool gGotRequestConstHTML[REQUESTCOUNT];
////////
//
//
//
//
//
#ifndef min
#define min(a,b) (((a) < (b)) ? (a) : (b))
#endif
#ifndef max
#define max(a,b) (((a) > (b)) ? (a) : (b))
#endif
#include <Wire.h>
#include <ds3231.h>
// #include <LiquidCrystal_I2C.h>
#include <LiquidCrystal_PCF8574.h>
#include <AT24CX.h>
//#define BUFF_MAX 128
//****************************************Define I2C LCD Display *********************************
#define I2C_ADDR 0x27 // Define I2C Address for the PCF8574T
//---(Following are the PCF8574 pin assignments to LCD connections )----
// This are different than earlier/different I2C LCD displays
#define Rs_pin 0
#define Rw_pin 1
#define En_pin 2
#define BACKLIGHT_PIN 3
#define D4_pin 4
#define D5_pin 5
#define D6_pin 6
#define D7_pin 7
#define ATMEGA328 //comment out this line if it is not ATMEGA328
//#define DEBUG //comment out this line to disable for Production(No Serial print)
#define RRcountSIZE 20
#define count1Address 0
#define count1count2diffAddress 40 //only one address which is 40*32
//int count1Address = 0;
//int count1count2diffAddress = 40;
long count1count2diff = 0;
#define TRIPSIZE 16 //so thestartaddress is 50*32 until (50+12)*32
#define TRIPADDRESS 50
const byte interruptPin = 32; //2;
#define simulatorPWMPin 19
bool simstate = false;
volatile bool isloadingConst = false;
bool iscalculatingRally = false;
//const byte ledPin = 13;
// #ifndef ATMEGA328
volatile byte ledstate = LOW;
// #endif
#define LED_OFF 0
#define LED_ON 1
// set the LCD number of columns and rows
const int lcdColumns = 20;
const int lcdRows = 4;
///lolin esp32 lite i2c pin
#define I2C_SDA 15
#define I2C_SCL 13
#define LED_BUILTIN 22 // LED built in pada ESP32 Lolin32 Lite
// set LCD address, number of columns and rows
// if you don't know your display address, run an I2C scanner sketch
// LiquidCrystal_I2C lcd(0x27, lcdColumns, lcdRows); // marcoschwartz. ujungnya jelek ->remark
LiquidCrystal_PCF8574 lcd(0.27);
/*-----( Declare objects )-----*/
//LiquidCrystal_I2C lcd(I2C_ADDR,En_pin,Rw_pin,Rs_pin,D4_pin,D5_pin,D6_pin,D7_pin);
// LiquidCrystal_I2C lcd(I2C_ADDR);
AT24CX mem;
boolean cursorON=true;
boolean blinkON=true;
//************************************ END LCD DISPLAY *******************************************
uint8_t thistime[8];
//char recv[BUFF_MAX];
unsigned int recv_size = 0;
unsigned long prevsettime, intervalsettime = 250;
unsigned long prevtempint, tempinterval=60000;
unsigned long prevtemprally, tempintervalrally=333;
unsigned long prevcalibrationtime, calibrationtimeinterval = 200;
unsigned long updatecounttime=0;
float temperature;
byte x;
byte y;
// #ifndef y++
// //#define min(a,b) (((a) < (b)) ? (a) : (b))
// #define y++ y+1
// #endif
// #ifndef x++
// //#define min(a,b) (((a) < (b)) ? (a) : (b))
// #define x++ x+1
// #endif
unsigned long startmillis, startVSSCount;
unsigned long startsavemillis;
unsigned long broadcastwebsocket;
unsigned long broadcastwebsocketcalib;
volatile unsigned long howLongInMillis;
//#include <Button.h> //https://github.com/JChristensen/Button //from <Button.h> change to <JC_Button.h>
#include <JC_Button.h>
#define UP_pin 25 //4
#define DOWN_pin 26 //5
#define LEFT_pin 27 //6
#define RIGHT_pin 14 //7
#define OK_pin 12 //8
#define UP_PIN 25 //4 //Connect two tactile button switches (or something similar)
#define DN_PIN 26 //5 //from Arduino pin 2 to ground and from pin 3 to ground.
#define LF_PIN 27 //6
#define RF_PIN 14 //7
#define OK_PIN 12 //8
#define ESC_PIN 33 //10
#define PULLUPRES true //To keep things simple, we use the Arduino's internal PULLUPRES resistor.
#define INVERT true //Since the pullup resistor will keep the pin high unless the
//switch is closed, this is negative logic, i.e. a high state
//means the button is NOT pressed. (Assuming a normally open switch.)
#define DEBOUNCE_MS 40 //A debounce time of 20 milliseconds usually works well for tactile button switches.
#define REPEAT_FIRST 1000 //ms required before repeating on long press
#define REPEAT_INCR 75 //repeat interval for long press
#define MIN_COUNT 0
#define MAX_ROW 3
#define MAX_COL 19
#define MS_IN_HOUR 3600000 //Number of ms in an hour
#define MS_IN_MIN 60000 //Number of ms in a minute
// Button btnUP(UP_PIN, PULLUPRES, INVERT, DEBOUNCE_MS); //Declare the buttons
// Button btnDN(DN_PIN, PULLUPRES, INVERT, DEBOUNCE_MS);
// Button btnLF(LF_PIN, PULLUPRES, INVERT, DEBOUNCE_MS);
// Button btnRF(RF_PIN, PULLUPRES, INVERT, DEBOUNCE_MS); //Declare the buttons
// Button btnOK(OK_PIN, PULLUPRES, INVERT, DEBOUNCE_MS); //Declare the buttons
// Button btnESC(ESC_PIN, PULLUPRES, INVERT, DEBOUNCE_MS); //Declare the buttons
Button btnUP(UP_PIN, DEBOUNCE_MS, PULLUPRES, INVERT); //Declare the buttons
Button btnDN(DN_PIN, DEBOUNCE_MS, PULLUPRES, INVERT);
Button btnLF(LF_PIN, DEBOUNCE_MS, PULLUPRES, INVERT);
Button btnRF(RF_PIN, DEBOUNCE_MS, PULLUPRES, INVERT); //Declare the buttons
Button btnOK(OK_PIN, DEBOUNCE_MS, PULLUPRES, INVERT); //Declare the buttons
Button btnESC(ESC_PIN, DEBOUNCE_MS, PULLUPRES, INVERT); //Declare the buttons
enum {WAIT, UP, DOWN, LEFT, RIGHT, OKAY, RALLYEDIT, ESC}; //The possible states for the STATE machine
enum {MAIN, CALIBRATION, SETTIME, INPUTSUBTRAYEK, RALLY, CONSTANTA}; //The possible states for the MENU
enum {FORWARD, FREEZE, BACKWARD};
char const *dircount[] = {"Fw", "Zz", "Bw"}; //CHANGE 2022
//String dircount[] = {"Fw", "Zz", "Bw"};
uint8_t MENU, PREVMENU;
///uint8_t STATE, dircount1, dircount2; ///move to top //The current state machine state
byte hour24, min60, sec60;
unsigned long rpt = REPEAT_FIRST; //A variable time that is used to drive the repeats for long presses
uint8_t prevsec;
float constanta=3.275;
float distance1, distance2;
volatile float prevdistance1, prevdistance2;
volatile long prevcount1, prevcount2;
boolean showTIME = true;
float tempval;
struct ts t;
byte calibrationDistance=1;
byte tempcalibdist=1;
boolean calibrationON=false;
float oneMeter=0;
unsigned long startCalibration=0;
unsigned long Calibration=110400; //for CR-V 2012
unsigned long Calibrationcount;
unsigned long Calibrationcountbackup;
unsigned long Calibrationtime;
int digit1, digit2, digit3, digit4, digit5, digit6;
byte calibdigit1, calibdigit2, calibdigit3;
int dist1digit1, dist1digit2;
int dist2digit1, dist2digit2;
byte starttractsec, starttractmin, starttracthour;
boolean rallyON=false;
volatile unsigned long VSSCount =0;
long count1 = 0; //must be signed as technically distance can go negative
long count2 = 0;
long backcount1 = 0;
long backcount2 = 0;
//The two time variables are used to store reset times in ms
unsigned long time1 = 1;
unsigned long time2 = 1;
int CURSOR_POS = 1;
unsigned long count1Seq = 0;
boolean editDist1 = false;
//to save trayek data
struct RallyData {
char sub;
float speed;
byte startHour;
byte startMin;
byte startSec;
float distance;
unsigned int subTime;
};
//RallyData Trip={"b",23.342, 11,0,0,12.13};
RallyData Trip[TRIPSIZE];
//RallyData currentTrip;
byte curTrip=0;
byte prevTrip=0;
//
//
//
//
//
void notFound(AsyncWebServerRequest *request) {
request->send(404);
}
String readFile(fs::FS &fs, const char * path){
// Serial.printf("Reading file: %s\r\n", path);
// if (fs.exists(path)){
File file = fs.open(path, "r");
if(!file || file.isDirectory()){
Serial.println("- empty file or failed to open file");
return String();
}
// Serial.print("filesize:");Serial.println(file.size());
if (!file.size()){
Serial.println("File is empty");
file.close();
return String();
}
Serial.print("- read from file:");
String fileContent;
while(file.available()){
fileContent+=String((char)file.read());
}
file.close();
Serial.println(fileContent);
return fileContent;
// } else {return String();}
}
boolean writeFile(fs::FS &fs, const char * path, const char * message){
Serial.println(message);
Serial.println(sizeof(message));
if ((message != NULL) && (message[0] == '\0')) {
Serial.println("message is empty\n");
return false;
}
if (sizeof(message)==0){
return false;
}
Serial.printf("Writing file: %s\r\n", path);
File file = fs.open(path, "w");
if(!file){
Serial.println("- failed to open file for writing");
file.close();
return false;
}
if(file.print(message)){
Serial.println("- file written");
file.close();
return true;
} else {
Serial.println("- write failed");
file.close();
return false;
}
file.close();
return false;
}
// Replaces placeholder with stored values
String processor(const String& var){
//Serial.println(var);
Serial.print("Processor ");
Serial.print(var);
if(var == "ssidString"){
return readFile(SPIFFS, "/ssidString.txt");
}
else if(var == "localip"){
return WiFi.localIP().toString();
}
else if(var == "serveripaddress"){
if (WiFi.localIP().toString()!="0.0.0.0"){
Serial.println(WiFi.localIP());
return WiFi.localIP().toString();
} else {
Serial.println(WiFi.softAPIP());
return WiFi.softAPIP().toString();
}
}
// else if(var == "inputPwd"){
// return readFile(SPIFFS, "/inputPwd.txt");
// }
return String();
}
String procConst(const String& var){
Serial.print("proConst->");
Serial.print(var);
return String();
}
void OnWiFiEvent(WiFiEvent_t event)
{
switch (event) {
case SYSTEM_EVENT_STA_CONNECTED:
Serial.println("ESP32 Connected to WiFi Network");
break;
case SYSTEM_EVENT_AP_START:
Serial.println("ESP32 soft AP started");
break;
case SYSTEM_EVENT_AP_STACONNECTED:
Serial.println("Station connected to ESP32 soft AP");
break;
case SYSTEM_EVENT_AP_STADISCONNECTED:
Serial.println("Station disconnected from ESP32 soft AP");
break;
default: break;
}
}
String getPin(){
struct tm timeinfo;
String hasil;
if(!getLocalTime(&timeinfo)){
Serial.println("Failed to obtain time");
return hasil;
}
// StaticJsonBuffer<200> jsonBuffer;
// JsonObject& root = JsonBuffer.createObject();
DynamicJsonDocument testdoc(512);
//String datetime = &timeinfo;
char datetime[21];
char curtime[9];
strftime(datetime, 21, "%d %b %Y %H:%M:%S", &timeinfo);
strftime(curtime, 9, "%H:%M:%S", &timeinfo);
//Serial.println(&timeinfo);
//Serial.println(datetime);
testdoc["pin36"]=242;
testdoc["pin39"]=datetime;
testdoc["time"]=curtime;
// testdoc["datetime"]=datetime;
testdoc["pin5"]=millis();
testdoc["curtime"]=curtime;
testdoc["speed"]=String(float(random(1,20000))/100,1);
testdoc["counter"]=random(0,50000);
String bb[]={"A","B","C","D","E","F","G","H","I","J","K","L"};
testdoc["curtrack"]=bb[random(12)];
String dir[]={"FW","STOP","BACK"};
testdoc["dir1"]=dir[random(3)];
testdoc["dir2"]=dir[random(3)];
testdoc["time1"]=curtime;
testdoc["time2"]=curtime;
float odo1=float(millis())/10000;
float odo2=float(millis())/20000;
//Serial.println(odo1,3);
testdoc["odo1"]=String(odo1,3);
testdoc["odo2"]=String(odo2,3); // if disabled, the web will get undefined value
//serializeJson(testdoc,Serial);
serializeJson(testdoc,hasil);
//testdoc.printTo(hasil);
// testdoc.clear();
return hasil;
}
String getCalib(){
struct tm timeinfo;
String hasil;
if(!getLocalTime(&timeinfo)){
Serial.println("Failed to obtain time");
return hasil;
}
DynamicJsonDocument testdoc(200);
//String datetime = &timeinfo;
char datetime[21];
char curtime[9];
strftime(datetime, 21, "%d %b %Y %H:%M:%S", &timeinfo);
strftime(curtime, 9, "%H:%M:%S", &timeinfo);
//Serial.println(&timeinfo);
//Serial.println(datetime);
// testdoc["datetime"]=datetime;
testdoc["curtime"]=curtime;
testdoc["speed"]=String(float(random(1,20000))/100,1);
testdoc["counter"]=random(0,50000);
String bb[]={"A","B","C","D","E","F","G","H","I","J","K","L"};
testdoc["curtrack"]=bb[random(12)];
float calkm=float(millis())/100000;
float calmeter=float(millis())/100;
testdoc["caldist"]=random(9);
testdoc["calman"]=random(100000, 150000);
testdoc["calkm"]=String(calkm,3);
testdoc["calmeter"]=String(calmeter,3);
//Serial.println(odo1,3);
testdoc["calval"]=String(calmeter*1000); // if disabled, the web will get undefined value
//serializeJson(testdoc,Serial);
serializeJson(testdoc,hasil);
//testdoc.printTo(hasil);
// testdoc.clear();
return hasil;
}
void printLocalTime(){
struct tm timeinfo;
if(!getLocalTime(&timeinfo)){
Serial.println("Failed to obtain time");
return;
}
t.hour=timeinfo.tm_hour;
t.min=timeinfo.tm_min;
t.sec=timeinfo.tm_sec;
t.mday=timeinfo.tm_mday;
t.mon=timeinfo.tm_mon;
t.year=timeinfo.tm_year;
DS3231_set(t);
Serial.println(&timeinfo, "%A, %B %d %Y %H:%M:%S");
Serial.print("Day of week: ");
Serial.println(&timeinfo, "%A");
Serial.print("Month: ");
Serial.println(&timeinfo, "%B");
Serial.print("Day of Month: ");
Serial.println(&timeinfo, "%d");
Serial.print("Year: ");
Serial.println(&timeinfo, "%Y");
Serial.print("Hour: ");
Serial.println(&timeinfo, "%H");
Serial.print("Hour (12 hour format): ");
Serial.println(&timeinfo, "%I");
Serial.print("Minute: ");
Serial.println(&timeinfo, "%M");
Serial.print("Second: ");
Serial.println(&timeinfo, "%S");
Serial.println("Time variables");
char timeHour[3];
strftime(timeHour,3, "%H", &timeinfo);
Serial.println(timeHour);
char timeWeekDay[10];
strftime(timeWeekDay,10, "%A", &timeinfo);
Serial.println(timeWeekDay);
Serial.println();
}
boolean isDecimal(String str){
// boolean digit=true;
for(byte i=0;i<str.length();i++) {
if(!isDigit(str.charAt(i))){
return false;
}
}
return true;
}
boolean isNumeric(String str) {
unsigned int stringLength = str.length();
if (stringLength == 0) {
return false;
}
boolean seenDecimal = false;
for(unsigned int i = 0; i < stringLength; ++i) {
if (isDigit(str.charAt(i))) {
continue;
}
if (str.charAt(i) == '.') {
if (seenDecimal) {
return false;
}
seenDecimal = true;
continue;
}
return false;
}
return true;
}
boolean isFloat(String tString) {
//String tBuf;
boolean decPt = false;
int idx = 0;
if (tString.charAt(0) == '+' || tString.charAt(0) == '-' ) {
idx = 1;
if (tString.charAt(1) == '.' ) {
// check for +.???? or -.????
idx = 2;
decPt = true;
};
}
if (tString.charAt(0) == '.' ) {
// check for .????
idx = 1;
decPt = true;
};
// check for "+", "=", ".", "+.", "-.", empty string
if ( tString.length() <= idx ) return false;
for (int x = idx; x < tString.length(); x++) {
if (tString.charAt(x) == '.') {
if (decPt) return false;
else decPt = true;
}
else if (tString.charAt(x) < '0' || tString.charAt(x) > '9') return false;
}
return true;
}
boolean isShortTime(const char* st){
Serial.println(sizeof(st)); //ini size pointer saja longint(4)
Serial.println(strlen(st)); //ini yg benar
Serial.println(st);
if(strlen(st)!=5) return false;
for (int i=0; i<sizeof(st); i++) {
if (i==2){
if(st[i]!=':') return false;
} else {
if(!isdigit(st[i])) return false;
}
}
return true;
}
String getSplitValue(String data, char separator, int index)
{
int found = 0;
int strIndex[] = {0, -1};
int maxIndex = data.length()-1;
for(int i=0; i<=maxIndex && found <= index; i++){
if(data.charAt(i)==separator || i==maxIndex){
found++;
strIndex[0] = strIndex[1]+1;
strIndex[1] = (i == maxIndex) ? i+1 : i;
}
}
return found>index ? data.substring(strIndex[0], strIndex[1]) : "";
}
unsigned long getValueSetTime(const char* st){
Serial.print("getValueSetTime=");Serial.println(st);
if (!isShortTime(st)) {
Serial.println("getValueSetTime=-1");
return -1;
}
String x = getSplitValue(st, ':', 0);
int xval=x.toInt();
String y = getSplitValue(st, ':', 1);
int yval=y.toInt();
return ((xval*256)+yval)*256+0;
}
unsigned long getMemStime(uint8_t getmemsTimecurTrip);
String getsTime(uint8_t getsTimecurtrip){
unsigned long sTimeinconstanta;
int sTimeHour;
int sTimeMin;
for(int i=0; i<4; i++){
sTimeinconstanta = getMemStime(getsTimecurtrip);
sTimeHour = sTimeinconstanta/65536;
sTimeMin = (sTimeinconstanta/256)-sTimeHour*256;
if (sTimeHour<=24 && sTimeMin<=60){
break;
}
delayMicroseconds(20);
}
// String sTime;
char sTime[6];
// if (sTimeHour<10){
sprintf(sTime, "%02d:%02d", sTimeHour, sTimeMin);
Serial.print(getsTimecurtrip);Serial.print("getsTime:");Serial.print(sTimeHour);Serial.print(":");Serial.print(sTimeMin);Serial.print(";");Serial.println(sTime);
// }
return sTime;
}
void onWsEvent(AsyncWebSocket * server, AsyncWebSocketClient * client, AwsEventType type, void * arg, uint8_t *data, size_t len){
if(type == WS_EVT_CONNECT){
globalClientRally++;
Serial.println("Websocket client connection received");
Serial.print("Rally Client=");Serial.println(globalClientRally);
Serial.print("IPAdd client:"); Serial.println(client->remoteIP());
client->text(getRallyJson);
} else if(type == WS_EVT_DISCONNECT){
globalClientRally--;
Serial.println("Client disconnected");
Serial.print("Rally Client=");Serial.println(globalClientRally);
Serial.print("IPAdd client:"); Serial.println(client->remoteIP());
} else if(type == WS_EVT_DATA){
Serial.print("IPAdd client:"); Serial.println(client->remoteIP());
Serial.printf("[%u] get Text: %s\n", len, data);
String message = String((char*)( data));
Serial.println(message);
DynamicJsonDocument doc(256);
// Deserialize the data
DeserializationError error = deserializeJson(doc, message);
// parse the parameters we expect to receive (TO-DO: error handling)
// test if parsing succeeds
if (error){
Serial.print("deserialiseJson() failed: ");
Serial.println(error.c_str());
client->text(error.c_str());
return;
}
String resetodo=doc["resetodo"];
String copytoodo=doc["copytoodo"];
String direction1=doc["dir1"];
String direction2=doc["dir2"];
String toggle=doc["toggle"];
String ctotrip=doc["ctotrip"];
if (resetodo!="null"){
if (isDecimal(resetodo)){
if(resetodo=="1"){
Serial.print("resetodo=");Serial.println(resetodo);
count1 = 0;
backcount1 = 0;
time1 = VSSCount;
} else if(resetodo=="2"){
Serial.print("resetodo=");Serial.println(resetodo);
count2 = 0;
backcount2 = 0;
time2 = VSSCount;
}
}
}
if (copytoodo!="null"){
if (isDecimal(copytoodo)){
if(copytoodo=="2"){
Serial.print("copytoodo=");Serial.println(copytoodo);
count2 = count1; //no yet UNDO next update can UNDO
backcount2 = 0;
} else if(copytoodo=="1"){
Serial.print("copytoodo=");Serial.println(copytoodo);
count1 = count2; //no yet UNDO next update can UNDO
backcount1 = 0;
}
}
}
if (direction1!="null"){
if (isDecimal(direction1)){
if(direction1.toInt()>=0 && direction1.toInt()<=3){
Serial.print("direction1=");Serial.println(direction1);
dircount1=direction1.toInt();
}
}
}
if (direction2!="null"){
if (isDecimal(direction2)){
if(direction2.toInt()>=0 && direction2.toInt()<=3){
Serial.print("direction2=");Serial.println(direction2);
dircount2=direction2.toInt();
}
}
}
if (toggle!="null"){
if (isDecimal(toggle)){
if(toggle=="1"){
Serial.print("toggle=");Serial.println(toggle);
showTIME = !showTIME;
} else if(toggle=="2"){
Serial.print("toggle=");Serial.println(toggle);
showTIME = !showTIME;
}
}
}
if (ctotrip!="null"){
int temptrip;
temptrip = (int)ctotrip.charAt(0);
if (temptrip>=65 && temptrip<TRIPSIZE+65){
curTrip=temptrip-65;
constanta = Trip[curTrip].speed;
starttractsec = Trip[curTrip].startSec;
starttractmin = Trip[curTrip].startMin;
starttracthour = Trip[curTrip].startHour;
}
Serial.print(curTrip);Serial.print(";");Serial.print(constanta);Serial.print(";");
Serial.print(starttracthour);Serial.print(";");Serial.print(temptrip);Serial.println(";");
}
}
}
void onWsEvent2(AsyncWebSocket * server, AsyncWebSocketClient * client, AwsEventType type, void * arg, uint8_t *data, size_t len){
if(type == WS_EVT_CONNECT){
globalClientCalib++;
Serial.println("wscal Websocket client connection received");
Serial.print("Calib Client=");Serial.println(globalClientCalib);
Serial.print("IPAdd client:"); Serial.println(client->remoteIP());
client->text(getCalibJson);
} else if(type == WS_EVT_DISCONNECT){
globalClientCalib--;
Serial.println("wscal Client disconnected");
Serial.print("Calib Client=");Serial.println(globalClientCalib);
Serial.print("IPAdd client:"); Serial.println(client->remoteIP());
} else if(type == WS_EVT_DATA){
Serial.print("wscal IPAdd client:"); Serial.println(client->remoteIP());
Serial.printf("[%u] get Text: %s\n", len, data);
String message = String((char*)( data));
Serial.println(message);
DynamicJsonDocument doc(200);
// Deserialize the data
DeserializationError error = deserializeJson(doc, message);
// parse the parameters we expect to receive (TO-DO: error handling)
// test if parsing succeeds
if (error){
Serial.print("wscal deserialiseJson() failed: ");
Serial.println(error.c_str());
client->text(error.c_str());
return;
}
String setcaldis=doc["setcaldis"];
String setcaldisman=doc["setcaldisman"]; //set calibation distance manual
String calstart=doc["calstart"];
Serial.print("setcaldis=");Serial.println(setcaldis);
Serial.print("setcaldisman=");Serial.println(setcaldisman);
Serial.print("calstart=");Serial.println(calstart);
if (setcaldis!="null"){
if (isFloat(setcaldis)){
Serial.print("setcaldis=");Serial.println(setcaldis.toInt());
calibrationDistance=setcaldis.toInt();
}
}
if (setcaldisman!="null"){
if (isDecimal(setcaldisman)){
Serial.print("setcaldisman=");Serial.println(setcaldisman.toInt());
Calibration = setcaldisman.toInt();
mem.writeLong(896, Calibration);
}
}
if (calstart!="null"){
if (isDecimal(calstart)){
if(calstart=="1"){
Serial.print("calstart=");Serial.println("START");
Calibrationcount = 0;
startCalibration = VSSCount;
Calibrationtime = startCalibration;
calibrationON=true;
} else if(calstart=="0"){
Calibration = (VSSCount-startCalibration)/(float)calibrationDistance;
mem.writeLong(896, Calibration); //Save Calibration to memory
oneMeter=(millis()-startCalibration)/(1000*(float)calibrationDistance);//*calibrationDistance);
oneMeter=((float)VSSCount-startCalibration)/(1000*(float)calibrationDistance);//*calibrationDistance);
oneMeter=(float)(Calibration)/1000*(float)calibrationDistance;
calibrationON=false;
}
Serial.print("calstart=");Serial.println("STOP");
}
}
}
}
// void configModeCallback (WiFiManager *myWiFiManager) {
// Serial.println("Entered config mode");
// Serial.println(WiFi.softAPIP());
// Serial.println(myWiFiManager->getConfigPortalSSID());
// }
////// VSSRALLYMODULE
//
//
//
//
//
//
//
//
//
void printUPchar()
{
byte thumb1[8] = {B00100,B01110,B11111,B00100,B00100,B00100,B00100,B00100};
lcd.createChar(1, thumb1);
//lcd.write(1);
}
void printDOWNchar()
{
byte thumb1[8] = {B00100,B00100,B00100,B00100,B00100,B11111,B01110,B00100};
lcd.createChar(2, thumb1);
//lcd.write(2);
}
unsigned long memretrieveLong(int startaddress, byte rrpointersize, unsigned long &seq )
{
//Serial.print(seq);Serial.print(";R ");Serial.print(rrpointer[0]);Serial.print("; SizeofArr=");Serial.println(rrpointersize);
unsigned long largestcountpointer=0;
int lastpointer = 0;
unsigned long seqnumber = 0;
int pointeradd = 0;
for (int i = 0; i<rrpointersize; i++) {
pointeradd = startaddress+(i*32);
seqnumber = mem.readLong(pointeradd);
// Serial.print(i); Serial.print(":");Serial.print(largestcountpointer); Serial.print(":");Serial.println(seqnumber);
if (largestcountpointer < seqnumber) {
largestcountpointer = seqnumber;
lastpointer = i;
}
}
//unsigned int pointerto = mem.readLong(rrpointer[lastpointer]);
pointeradd = startaddress+(lastpointer*32);
seq = mem.readLong(pointeradd);
// Serial.print(seq);Serial.print(";RR ");Serial.print("; "); Serial.println(lastpointer);
pointeradd = pointeradd + 4;
return mem.readLong(pointeradd); //returning count1
}
void memwritingLong(int startaddress, byte rrpointersize, unsigned long &seq, unsigned long data)
{
int pointer = seq % rrpointersize;
// Serial.print(seq);Serial.print(";W ");Serial.print(startaddress); Serial.print("; data="); Serial.println(data);Serial.print("; "); Serial.println(pointer);
int addpointer = startaddress+(pointer*32);
mem.writeLong(addpointer, seq);
addpointer = addpointer + 4;
mem.writeLong(addpointer, data);
}
/*
void printmemLong(int pointer, byte pointersize)
{
for (int i = 0 ; i < pointersize; i++)
{
Serial.print(i);Serial.print("->");Serial.println(mem.readLong(pointer+(i*32)));
}
}
*/
void memretrieveTrip(int pointer, int startaddress)
{
//Serial.print (pointer); Serial.println(startaddress);
int pointeradd;
Trip[pointer].speed = mem.readFloat(startaddress);
pointeradd = (startaddress + 6);
Trip[pointer].startHour = mem.read(pointeradd);
pointeradd = (startaddress + 5);
Trip[pointer].startMin = mem.read(pointeradd);
pointeradd = (startaddress + 4);
Trip[pointer].startSec = mem.read(pointeradd);
if (Trip[pointer].startHour >= 24) Trip[pointer].startHour = 23;
if (Trip[pointer].startMin >= 60) Trip[pointer].startMin = 59;
if (Trip[pointer].startSec >= 60) Trip[pointer].startSec = 59;
}
void constantatodigit()
{
digit1=(int)(constanta/10);
digit2=(int)constanta%10;
digit3=(int)((constanta - (int)constanta)*10);
digit4=(int)((constanta*10 - (int)(constanta*10))*10);
digit5=(int)((constanta*100 - (int)(constanta*100))*10);
digit6=(int)((constanta*1000 - (int)(constanta*1000))*10);
//digit6=(int)((constanta*10000 - (int)(constanta*10000))*10);
}
void setMemSpeedInConstanta(float constanta, uint8_t setmemcurTrip){
int pointeradd = ((TRIPADDRESS+setmemcurTrip)*32);
mem.writeFloat(pointeradd, constanta);
Trip[setmemcurTrip].speed = constanta;
}
float getMemSpeedInConstanta(uint8_t getmemSpeedcurTrip){
int pointeradd = ((TRIPADDRESS+getmemSpeedcurTrip)*32);
float x=mem.readFloat(pointeradd);
if(isnan(x)) {
delayMicroseconds(10);
x=mem.readFloat(pointeradd);
}
return x;
}
void setMemStime(unsigned long valuesettime, uint8_t setmemssTimecurTrip){
int pointeradd = ((TRIPADDRESS+setmemssTimecurTrip)*32+4);
mem.writeLong(pointeradd, valuesettime);
Trip[setmemssTimecurTrip].startHour = (valuesettime/65536); //starttracthour;
Trip[setmemssTimecurTrip].startMin = (valuesettime/256)-Trip[setmemssTimecurTrip].startHour*256; // starttractmin;
Trip[setmemssTimecurTrip].startSec = valuesettime-((Trip[setmemssTimecurTrip].startHour*256 + Trip[curTrip].startMin)*256);//starttractsec;
Serial.print(Trip[setmemssTimecurTrip].startHour);Serial.print(";");
Serial.print(Trip[setmemssTimecurTrip].startMin);Serial.print(";");
Serial.println(Trip[setmemssTimecurTrip].startSec);
}
unsigned long getMemStime(uint8_t getmemsTimecurTrip){
int pointeradd = ((TRIPADDRESS+getmemsTimecurTrip)*32+4);
return mem.readLong(pointeradd);
}
void blink() {
// #ifndef ATMEGA328
ledstate = !ledstate;
// #else
// PORTB ^= B00100000;
// #endif
VSSCount++;
}
#ifdef DEBUG
long prevtimemicros=micros(); //**************************************************************************
#endif
unsigned long rallyEditTime=micros();
byte rallyEditRpt = 0;
boolean rallyEdit =false;
boolean savedCount = true;
unsigned long intervalsavemillis = 3000;
void printMOVEchar()
{
byte Movechar3[8] = {B00000,B00000,B00000,B00000,B00000,B00000,B00000,B11111};
lcd.createChar(3, Movechar3);
byte Movechar4[8] = {B00000,B00000,B00000,B00000,B00000,B00000,B11111,B11111};
lcd.createChar(4, Movechar4);
byte Movechar5[8] = {B00000,B00000,B00000,B00000,B00000,B11111,B11111,B11111};
lcd.createChar(5, Movechar5);
}
void lcdprint2digit(byte val)
{
if (val<10) lcd.print("0");
lcd.print(val);
}
void setTheTime(char *cmd)
{
// ssmmhhWDDMMYYYY set time
t.sec = inp2toi(cmd, 0);
t.min = inp2toi(cmd, 2);
t.hour = inp2toi(cmd, 4);
t.wday = inp2toi(cmd, 6);
t.mday = inp2toi(cmd, 7);
t.mon = inp2toi(cmd, 9);
t.year = inp2toi(cmd, 11) * 100 + inp2toi(cmd, 13);
DS3231_set(t);
#ifdef DEBUG
Serial.println("OK setTheTime()");
#endif
}
void printMonth(int month)
{
switch(month)
{
case 1: lcd.print(" January ");break;
case 2: lcd.print(" February ");break;
case 3: lcd.print(" March ");break;
case 4: lcd.print(" April ");break;
case 5: lcd.print(" May ");break;
case 6: lcd.print(" June ");break;
case 7: lcd.print(" July ");break;
case 8: lcd.print(" August ");break;
case 9: lcd.print(" September ");break;
case 10: lcd.print(" October ");break;
case 11: lcd.print(" November ");break;
case 12: lcd.print(" December ");break;
default: lcd.print(" Error ");break;
}
}
void mainMenu()
{
MENU = MAIN;
lcd.clear();
lcd.print("1. Rally TSD");
lcd.setCursor(0,1);
lcd.print("2. Set Main Time");
lcd.setCursor(0,2);
lcd.print("3. Input Constanta");
lcd.setCursor(0,3);
lcd.print("4. Calibration ODO");
//lcd.home();
x=2;
y=0;
lcd.cursor();
lcd.setCursor(x,y);
PREVMENU = MENU;
}
void runningtime(byte x1,byte y1)
{
lcd.setCursor(x1,y1); //Go to second line of the LCD Screen
if(t.hour<10)
{
lcd.print("0");
}
lcd.print(t.hour);
lcd.print(":");
if(t.min<10)
{
lcd.print("0");
}
lcd.print(t.min);
lcd.print(":");
if(t.sec<10)
{
lcd.print("0");
}
lcd.print(t.sec);
}
String runningtimeforESP32(byte x1,byte y1)
{
String runningTIME;
// lcd.setCursor(x1,y1); //Go to second line of the LCD Screen
if(t.hour<10)
{
// lcd.print("0");
runningTIME="0";
}
// lcd.print(t.hour);
// lcd.print(":");
runningTIME+=t.hour;
runningTIME+=":";
if(t.min<10)
{
// lcd.print("0");
runningTIME+="0";
}
// lcd.print(t.min);
// lcd.print(":");
runningTIME+=t.min;
runningTIME+=":";
if(t.sec<10)
{
// lcd.print("0");
runningTIME+="0";
}
// lcd.print(t.sec);
runningTIME+=t.sec;
// Serial.print("t.hour:");Serial.println(t.hour);
// Serial.print("runningtimeforesp:");Serial.println(runningTIME);
return runningTIME;
}
void settimeMenu()
{
lcd.setCursor(0,0);
lcd.print(t.mday);
printMonth(t.mon);
lcd.print(t.year);
runningtime(0,1);
lcd.setCursor(x,y);
prevsec = t.sec;
PREVMENU = MENU;
}
void calibrationMenu()
{
MENU = CALIBRATION;
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Calibration Back");
lcd.setCursor(0,1);
lcd.print("Set Distance(Km): ");
lcd.print(calibrationDistance);
lcd.setCursor(0,2);
lcd.print("Start 00.000Km");
lcd.setCursor(0,3);
lcd.print("1m=");
lcd.print(((float)Calibration/1000),3);
char Calibrationstr[6];
sprintf(Calibrationstr, "%06lu", Calibration);
lcd.setCursor(14,3);
lcd.print(Calibrationstr);
lcd.setCursor(0,0);
lcd.print("Calibration Back");
//lcd.setCursor(0,0);
//lcd.print(Calibration);
//lcd.home();
x=18;
y=0;
lcd.setCursor(x,y);
lcd.cursor();
//lcd.blink();
//blinkON=true;
PREVMENU = MENU;
Serial.print(Calibrationstr);Serial.println("end");
}
void constantaMenu()
{
MENU = CONSTANTA;
lcd.clear();
lcd.print("Constanta Back");
lcd.setCursor(0,1);
lcd.print("Sub Trip:");
lcd.setCursor(14,1);
lcd.print(Trip[curTrip].sub);
lcd.setCursor(0,2);
lcd.print("Set Speed:");
lcd.setCursor(13,2);
if (constanta<10) lcd.print("0");
lcd.print(constanta,4);
//lcd.print(
lcd.setCursor(0,3);
lcd.print("Start Time:");
//DS3231_get(&t); //Get time
lcd.setCursor(12,3); //Go to second line of the LCD Screen
if(starttracthour<10)
{
lcd.print("0");
}
lcd.print(starttracthour);
lcd.print(":");
if(starttractmin<10)
{
lcd.print("0");
}
lcd.print(starttractmin);
lcd.print(":");
if(starttractsec<10)
{
lcd.print("0");
}
lcd.print(starttractsec);
lcd.print("");
//x=14;
//y=0;
lcd.setCursor(x,y);
lcd.cursor();
//lcd.blink();
//blinkON=true;
PREVMENU = MENU;
}
void updateCount()
{
if (dircount1 == FORWARD) {
count1 = count1 + (VSSCount-time1);
}
else if (dircount1 == BACKWARD) {
count1 = count1 - (VSSCount-time1);
}
if (dircount2 == FORWARD) {
count2 = count2 + (VSSCount-time2);
}
else if (dircount2 == BACKWARD) {
count2 = count2 - (VSSCount-time2);
}
time1 = VSSCount;
time2 = VSSCount;
}
void saveCount()
{
if (count1 != prevcount1) {
count1Seq++;
memwritingLong(count1Address, RRcountSIZE, count1Seq, count1);//(int startaddress, byte RRsize, unsigned long seq, unsigned long Data)
prevcount1 = count1;
}
if ((count1-count2) != count1count2diff) {
#ifdef DEBUG
Serial.print("count1=");Serial.print(count1);Serial.print(";count2=");Serial.print(count2);Serial.print("countdiff=");Serial.println(count1count2diff);
#endif
count1count2diff = count1-count2;
int pointer = count1count2diffAddress*32;
mem.writeLong(pointer,count1count2diff);
#ifdef DEBUG
Serial.println("save count1count2diff");
#endif
}
}
void secondrallyMenu()
{
char heading2[6];
char heading4[6];
lcd.setCursor(9,1);
//sprintf(heading2, "%s", (dirfwdcount1?"Fw":"Bw"));
sprintf(heading2, "%s", dircount[dircount1]);
lcd.print(heading2);
lcd.setCursor(9,3);
//sprintf(heading4, "%s", (dirfwdcount2?"Fw":"Bw"));
sprintf(heading4, "%s", dircount[dircount2]);
lcd.print(heading4);
#ifdef DEBUG
Serial.println("secondrallyMenu");
#endif
}
void rallyMenu()
{
MENU = RALLY;
//lcd.clear();
lcd.setCursor(15,0);
if (showTIME) lcd.print("Time ");
else lcd.print("TDiff");
secondrallyMenu();
PREVMENU = MENU;
// #ifdef DEBUG
Serial.println("rallyMenu");
// #endif
}
unsigned long startspeed=0;
float startdistance=0;
void redrawcalibrationMenu()
{
// bool test=false;
float distance;
Calibrationcount = Calibrationcount + (VSSCount-Calibrationtime);
distance = (float)Calibrationcount/((float)Calibration);
char cur_distance_str[9];
byte xtemp=13;
if (distance<100) {
sprintf(cur_distance_str, "%02d.%03dKm", (int)distance, (int)((distance - (int)distance)*1000));
xtemp = 12;
}
else if (distance<1000) {
sprintf(cur_distance_str, "%02d.%02dKm", (int)distance, (int)((distance - (int)distance)*100));
}
else {
sprintf(cur_distance_str, "%03d.%01dKm", (int)distance, (int)((distance - (int)distance)*10));
}
// if(test){
Calibrationtime = VSSCount;
lcd.setCursor(xtemp,2);
lcd.print(cur_distance_str);
// }
}
void redrawcalibrationMenuForESP32()
{
DynamicJsonDocument getCalib(512);
deserializeJson(getCalib, getCalibJson);
float distance;
Calibrationcount = Calibrationcount + (VSSCount-Calibrationtime);
distance = (float)Calibrationcount/((float)Calibration);
// char cur_distance_str[8];
Calibrationtime = VSSCount;
// lcd.setCursor(xtemp,2);
// lcd.print(cur_distance_str);
getCalib["counter"]=VSSCount; /////
getCalib["curTrip"]=String(Trip[curTrip].sub); /////
getCalib["curTripSpeed"]=String(Trip[curTrip].speed); /////
String curTime = runningtimeforESP32(6,0);
getCalib["curTime"]=curTime;
getCalib["caldist"]=calibrationDistance;
getCalib["calman"]= Calibration;
// Serial.println(cur_distance_str);
if (calibrationON){
getCalib["calkm"]= String(distance,3);
Calibrationcountbackup=Calibrationcount;
} else {
distance = (float)Calibrationcountbackup/((float)Calibration);
getCalib["calkm"]= String(distance, 3);
}
getCalib["calmeter"]=String(float(Calibration)/1000,3);
getCalib["calval"]= Calibration;
getCalibJson = "";
serializeJson(getCalib, getCalibJson);
}
// char digitClock(int v){
// if (v < 10)
// return '0' + v;
// else
// return 'A' + (v-10);
// }
void digitClock(int v){
// lcd.setCursor(x,y);
if (v < 10){
lcd.print("0");
lcd.print(v);
// return '0' + v;
}
else lcd.print(v);
}
void digitClock(int v, byte x, byte y){
lcd.setCursor(x,y);
if (v < 10){
lcd.print("0");
lcd.print(v);
// return '0' + v;
}
else lcd.print(v);
}
void redrawrallyMenu()
{
// Serial.println("redrawRM");
DS3231_get(&t); //Get time
//runningtime(6,0);
//float distance, distance1, distance2;
//Serial.print(tempcount1);Serial.print(";"); Serial.print(time1);Serial.print("; ");Serial.print(Calibration); Serial.print(";"); Serial.println(count1);
updateCount();
distance1 = (float)count1/((float)Calibration); // * 1);
distance2 = (float)count2/((float)Calibration);
float speed1=0;
if ((distance1 - startdistance) > 0) {
speed1 = (distance1-startdistance)/(millis()-startspeed)*3600000;
}
startdistance = distance1;
startspeed = millis(); //startspeed is only one no startspeed2
// Serial.println("redrawRM 1");
if ((millis()-startsavemillis)>0) {
if (distance1 != prevdistance1) {
mem.writeFloat(832,distance1);
prevdistance1 = distance1;
}
if (distance2 != prevdistance2) {
mem.writeFloat(864,distance2);
prevdistance2 = distance2;
}
saveCount();
startsavemillis=millis()+2500;
}
//Serial.print(tempcount1);Serial.print(";"); Serial.print(time1);Serial.print("; ");Serial.print(Calibration); Serial.print(";"); Serial.println(count1);
//Serial.print(millis());Serial.print(";");Serial.println(distance1,3);
//Serial.print(starttracthour); Serial.print(":"); Serial.print(starttractmin); Serial.print(":"); Serial.println(starttractsec);
//Serial.println(distance2,3);
// lcd.setCursor(4,0);
// lcd.print(Trip[curTrip].sub);
// lcd.setCursor(0,2);
// lcd.print(Trip[curTrip].speed);
// lcd.print("Km/H");
runningtime(6,0);
// lcd.setCursor(11,2);
char cur_speed_str[9];
int speedtemp=(int)speed1;
int speedtemp2=(int)((speed1 - (int)speed1)*10);
sprintf(cur_speed_str, "%3d.%01dKm/h", speedtemp , speedtemp2 );
// Serial.print(count1); Serial.print(";");Serial.print(Calibration); Serial.print(";");Serial.print(speed1); Serial.print(";");Serial.println(cur_speed_str);
// Serial.print(distance1); Serial.print(";");Serial.print(startdistance); Serial.print(";");Serial.print(startspeed); Serial.println(";");
// lcd.print(cur_speed_str);
char cur_distance1_str[8];
char cur_distance2_str[8];
// lcd.setCursor(0,1);
// Serial.print(";redrawRM 2;");
if (distance1<100) {
sprintf(cur_distance1_str, "%02d.%03dKm", (int)distance1, (int)((distance1 - (int)distance1)*1000));
}
else if (distance1<1000) {
sprintf(cur_distance1_str, "%02d.%02dKm", (int)distance1, (int)((distance1 - (int)distance1)*100));
}
else {
sprintf(cur_distance1_str, "%03d.%01dKm", (int)distance1, (int)((distance1 - (int)distance1)*10));
}
// lcd.print(cur_distance1_str);
// lcd.setCursor(0,3);
if (distance2<100) {
sprintf(cur_distance2_str, "%02d.%03dKm", (int)distance2, (int)((distance2 - (int)distance2)*1000));
}
else if (distance2<1000) {
sprintf(cur_distance2_str, "%02d.%02dKm", (int)distance2, (int)((distance2 - (int)distance2)*100));
}
else {
sprintf(cur_distance2_str, "%03d.%01dKm", (int)distance2, (int)((distance2 - (int)distance2)*10));
}
// lcd.print(cur_distance2_str);
// Serial.print(";redrawRM 3;");
float distancetime1 = distance1 * 60 / constanta;
float distancetime2 = distance2 * 60 / constanta;
//Calculating all about TIME,TDiff(including passing 23:59:59)
// lcd.setCursor(9,1);
uint8_t secs1, mins1, hours1;
secs1 = (distancetime1-(int)distancetime1)*60;
mins1 = (int)distancetime1 % 60;
hours1 = (int)distancetime1 / 60;
unsigned long totcurrentsecs = t.sec + (t.min*60) + ((long)t.hour*3600);
unsigned long totsecs1 = secs1 + (mins1*60) + ((long)hours1*3600);
unsigned long totstarttractsecs = starttractsec + (starttractmin*60) + ((long)starttracthour*3600);
unsigned long tottime1 = totsecs1 + totstarttractsecs;
boolean negatifsign = false;
// Serial.print(";redrawRM 4;");
//Serial.print((long)starttracthour*3600); Serial.print(";"); Serial.print(starttractmin*60); Serial.println(";");
//Serial.print(totsecs1); Serial.print(";"); Serial.print(totstarttractsecs); Serial.print(";");
//Serial.print(tottime1);Serial.print(";");Serial.println(totcurrentsecs);
if (totcurrentsecs<totstarttractsecs) totcurrentsecs+=86400;
if (!showTIME) {
if (tottime1 >= totcurrentsecs) { //positif means we are too fast, slow down please.
// Serial.println("pos");
negatifsign = false;
tottime1 = tottime1 - totcurrentsecs;
}
else { //negatif means we need to hurry, its late
// Serial.println("neg");
negatifsign = true;
tottime1 = totcurrentsecs - tottime1;
}
}
//Serial.print(negatifsign);Serial.print(";"); Serial.println(tottime1);
hours1 = ((int)(tottime1 / 3600))%24;
mins1 = (int)((tottime1 % 3600)/60);
secs1 = (tottime1 % 60);
char cur_time1_str[12];
if (showTIME) {
// lcd.setCursor(9,1);
// lcd.print(dircount[dircount1]);
// lcd.print(" ");
// digitClock(hours1);
// lcd.print(":");
// digitClock(mins1);
// lcd.print(":");
// digitClock(secs1);
sprintf(cur_time1_str, "%s %02d:%02d:%02d", dircount[dircount1], hours1, mins1, secs1);
}
else {
if (hours1 < 10) sprintf(cur_time1_str, "%s %s%01d:%02d:%02d", dircount[dircount1], (negatifsign?"-":" "), hours1, mins1, secs1);
else sprintf(cur_time1_str, "%s%s%02d:%02d:%02d", dircount[dircount1], (negatifsign?"-":" "), hours1, mins1, secs1);
}
// lcd.print(cur_time1_str);
// Serial.print(";redrawRM 5;");
// Print Second TIME
// lcd.setCursor(9,3);
uint8_t secs2, mins2, hours2;
secs2 = (distancetime2-(int)distancetime2)*60;
mins2 = (int)distancetime2 % 60;
hours2 = (int)distancetime2 / 60;
unsigned long totsecs2 = secs2 + (mins2*60) + ((long)hours2*3600);
unsigned long tottime2 = totsecs2 + totstarttractsecs;
//Serial.println(tottime2);
if (!showTIME) {
if (tottime2 >= totcurrentsecs) { //positif means we are too fast, slow down please.
negatifsign = false;
tottime2 = tottime2 - totcurrentsecs;
}
else { //negatif means we need to hurry, its late
negatifsign = true;
tottime2 = totcurrentsecs - tottime2 ;
}
}
// Serial.print(";redrawRM 6;");
hours2 = ((int)(tottime2 / 3600))%24;
mins2 = (int)((tottime2 % 3600)/60);
secs2 = (tottime2 % 60);
char cur_time2_str[11];
if (showTIME) {
lcd.setCursor(9,3);
lcd.print(dircount[dircount2]);
lcd.print(" ");
digitClock(hours2);
lcd.print(":");
digitClock(mins2);
lcd.print(":");
digitClock(secs2);
// sprintf(cur_time2_str, "%s %02d:%02d:%02d", dircount[dircount2], hours2, mins2, secs2);
}
else {
if (hours2<10) sprintf(cur_time2_str, "%s %s%01d:%02d:%02d", dircount[dircount2], (negatifsign?"-":" "), hours2, mins2, secs2);
else sprintf(cur_time2_str, "%s%s%02d:%02d:%02d", dircount[dircount2], (negatifsign?"-":" "), hours2, mins2, secs2);
}
// lcd.setCursor(4,0);
// lcd.print(Trip[curTrip].sub);
// lcd.setCursor(0,2);
// lcd.print(Trip[curTrip].speed);
// lcd.print("Km/H");
// lcd.setCursor(11,2);
// lcd.print(cur_speed_str);
// lcd.setCursor(0,1);
// lcd.print(cur_distance1_str);
// lcd.setCursor(0,3);
// lcd.print(cur_distance2_str);
// lcd.setCursor(9,1);
// lcd.print(dircount[dircount1]);
// // lcd.print(cur_time1_str);
// digitClock(hours1,12,1);
// lcd.print(":");
// // lcd.print(digitClock(mins1));
// digitClock(mins1);
// lcd.print(":");
// // lcd.print(digitClock(secs1));
// digitClock(secs1);
// // Serial.print(digitClock(hours1));Serial.print(":");Serial.print(digitClock(mins1));Serial.print(":");Serial.println(digitClock(secs1));
// // lcd.setCursor(9,3);
// // lcd.print(cur_time2_str);
lcd.setCursor(x,y);
// Serial.println("END redrawRM");
}
void calculationRally() //calculation only ESP32
{
DynamicJsonDocument getRally(1024);
deserializeJson(getRally, getRallyJson);
DS3231_get(&t); //Get time
// Serial.println("startCRal");
updateCount();
distance1 = (float)count1/((float)Calibration); // * 1);
distance2 = (float)count2/((float)Calibration);
float speed1=0;
if ((distance1 - startdistance) > 0) {
speed1 = (distance1-startdistance)/(millis()-startspeed)*3600000;
}
startdistance = distance1;
startspeed = millis(); //startspeed is only one no startspeed2
if ((millis()-startsavemillis)>0) {
if (distance1 != prevdistance1) {
mem.writeFloat(832,distance1);
prevdistance1 = distance1;
}
if (distance2 != prevdistance2) {
mem.writeFloat(864,distance2);
prevdistance2 = distance2;
}
saveCount();
startsavemillis=millis()+2500;
}
// lcd.setCursor(4,0);
// lcd.print(Trip[curTrip].sub);
// lcd.setCursor(0,2);
// lcd.print(Trip[curTrip].speed);
// lcd.print("Km/H");
getRally["Trip"]=String(Trip[curTrip].sub); /////
getRally["TSpeed"]=String(Trip[curTrip].speed); /////
char sTime[9];
sprintf(sTime, "%02u:%02u:%02u", Trip[curTrip].startHour, Trip[curTrip].startMin, Trip[curTrip].startSec);
getRally["TsTime"]=sTime; /////
getRally["TTime"]=String(Trip[curTrip].subTime); /////
getRally["TDist"]=String(Trip[curTrip].distance); /////
// Serial.print(Trip[curTrip].sub);Serial.print(Trip[curTrip].speed);Serial.print(";");Serial.println(Trip[curTrip].startHour);
String curTime = runningtimeforESP32(6,0);
getRally["Time"]=curTime;
// lcd.setCursor(11,2);
char cur_speed_str[7];
sprintf(cur_speed_str, "%3d.%01d", (int)speed1, (int)((speed1 - (int)speed1)*10));
// lcd.print(cur_speed_str);
getRally["curSpeed"]=cur_speed_str; /////
// char cur_distance1_str[8];
// char cur_distance2_str[8];
char cur_distance1_plain[7];
char cur_distance2_plain[7];
// lcd.setCursor(0,1);
if (distance1<100) {
sprintf(cur_distance1_plain, "%02d.%03d", (int)distance1, (int)((distance1 - (int)distance1)*1000));
}
else if (distance1<1000) {
sprintf(cur_distance1_plain, "%02d.%02d", (int)distance1, (int)((distance1 - (int)distance1)*100));
}
else {
sprintf(cur_distance1_plain, "%03d.%01d", (int)distance1, (int)((distance1 - (int)distance1)*10));
}
// lcd.print(cur_distance1_str);
getRally["curDist1"]=String(cur_distance1_plain);
// lcd.setCursor(0,3);
if (distance2<100) {
sprintf(cur_distance2_plain, "%02d.%03d", (int)distance2, (int)((distance2 - (int)distance2)*1000));
}
else if (distance2<1000) {
sprintf(cur_distance2_plain, "%02d.%02d", (int)distance2, (int)((distance2 - (int)distance2)*100));
}
else {
sprintf(cur_distance2_plain, "%03d.%01d", (int)distance2, (int)((distance2 - (int)distance2)*10));
}
// lcd.print(cur_distance2_str);
getRally["curDist2"]=cur_distance2_plain;
float distancetime1 = distance1 * 60 / constanta;
float distancetime2 = distance2 * 60 / constanta;
//Calculating all about TIME,TDiff(including passing 23:59:59)
// lcd.setCursor(9,1);
int secs1, mins1, hours1;
secs1 = (distancetime1-(int)distancetime1)*60;
mins1 = (int)distancetime1 % 60;
hours1 = (int)distancetime1 / 60;
unsigned long totcurrentsecs = t.sec + (t.min*60) + ((long)t.hour*3600);
unsigned long totsecs1 = secs1 + (mins1*60) + ((long)hours1*3600);
unsigned long totstarttractsecs = starttractsec + (starttractmin*60) + ((long)starttracthour*3600);
unsigned long tottime1 = totsecs1 + totstarttractsecs;
boolean negatifsign = false;
if (totcurrentsecs<totstarttractsecs) totcurrentsecs+=86400;
if (!showTIME) {
//if ((long)(tottime1 - totcurrentsecs)>=0) { //positif means we are too fast, slow down please.
if (tottime1 >= totcurrentsecs) { //positif means we are too fast, slow down please.
// Serial.println("pos");
negatifsign = false;
tottime1 = tottime1 - totcurrentsecs;
}
else { //negatif means we need to hurry, its late
// Serial.println("neg");
negatifsign = true;
tottime1 = totcurrentsecs - tottime1;
}
}
//Serial.print(negatifsign);Serial.print(";"); Serial.println(tottime1);
hours1 = ((int)(tottime1 / 3600))%24;
mins1 = (int)((tottime1 % 3600)/60);
secs1 = (tottime1 % 60);
// char cur_time1_str[12];
char cur_time1_plain[10];
if (showTIME) {
sprintf(cur_time1_plain, "%02d:%02d:%02d", hours1, mins1, secs1);
}
else {
if (hours1<10) sprintf(cur_time1_plain, "%s%01d:%02d:%02d", (negatifsign?"-":" "), hours1, mins1, secs1);
else sprintf(cur_time1_plain, "%s%02d:%02d:%02d", (negatifsign?"-":" "), hours1, mins1, secs1);
}
// lcd.print(cur_time1_str);
getRally["time1"]=cur_time1_plain;
getRally["dir1"]=dircount[dircount1];
// Print Second TIME
// lcd.setCursor(9,3);
int secs2, mins2, hours2;
secs2 = (distancetime2-(int)distancetime2)*60;
mins2 = (int)distancetime2 % 60;
hours2 = (int)distancetime2 / 60;
unsigned long totsecs2 = secs2 + (mins2*60) + ((long)hours2*3600);
unsigned long tottime2 = totsecs2 + totstarttractsecs;
//Serial.println(tottime2);
if (!showTIME) {
if (tottime2 >= totcurrentsecs) { //positif means we are too fast, slow down please.
negatifsign = false;
tottime2 = tottime2 - totcurrentsecs;
}
else { //negatif means we need to hurry, its late
negatifsign = true;
tottime2 = totcurrentsecs - tottime2 ;
}
}
// Serial.println("MidCRal");
hours2 = ((int)(tottime2 / 3600))%24;
mins2 = (int)((tottime2 % 3600)/60);
secs2 = (tottime2 % 60);
char cur_time2_str[12];
char cur_time2_plain[9];
if (showTIME) {
sprintf(cur_time2_str, "%s %02d:%02d:%02d", dircount[dircount2], hours2, mins2, secs2);
}
else {
if (hours2<10) sprintf(cur_time2_str, "%s %s%01d:%02d:%02d", dircount[dircount2], (negatifsign?"-":" "), hours2, mins2, secs2);
else sprintf(cur_time2_str, "%s%s%02d:%02d:%02d", dircount[dircount2], (negatifsign?"-":" "), hours2, mins2, secs2);
}
if (showTIME) {
sprintf(cur_time2_plain, "%02d:%02d:%02d", hours2, mins2, secs2);
}
else {
if (hours2<10) sprintf(cur_time2_plain, "%s%01d:%02d:%02d", (negatifsign?"-":" "), hours2, mins2, secs2);
else sprintf(cur_time2_plain, "%s%02d:%02d:%02d", (negatifsign?"-":" "), hours2, mins2, secs2);
}
// lcd.print(cur_time2_str);
getRally["time2"]=cur_time2_plain;
getRally["dir2"]=dircount[dircount2];
// lcd.setCursor(x,y);
getRally["counter"]=VSSCount;
getRallyJson="";
serializeJson(getRally, getRallyJson);
// Serial.println("ENDCRal");
} ///// calculation only for esp32
void set_cursor_pos(int new_pos)
{
/*
Cursor Positon map:
----------------------
|Count1 TIME AvgSp|
|1 35 |7 9 |
|Count2 KmH|
|2 46 |8 10|
----------------------
*/
//Need to clear the previous cursor position
//int x, y;
switch(CURSOR_POS)
{
case 1:
x = 0;
y = 1;
break;
case 2:
x = 0;
y = 3;
break;
case 3:
x = 8; //Km is 7,1
y = 1;
break;
case 4:
x = 8; //Km is 7,3
y = 3;
break;
case 5:
x = 9;
y = 1;
break;
case 6:
x = 9;
y = 3;
break;
case 7:
x = 13;
y = 1;
break;
case 8:
x = 13;
y = 3;
break;
case 9:
x = 18;
y = 1;
break;
case 10:
x = 18;
y = 3;
break;
}
lcd.print(" ");
lcd.blink();
lcd.setCursor(8,3);
lcd.write(1); //UP Arrow
lcd.setCursor(8,1);
lcd.write(2); //DOWN Arrow
lcd.setCursor(x,y);
/*
switch(new_pos)
{
case 1:
lcd.setCursor(6,1);
//lcd.print(LCD_ARROW_RIGHT);
break;
case 2:
lcd.setCursor(6,1);
//lcd.print(LCD_ARROW_RIGHT);
break;
case 3:
lcd.setCursor(6,1);
//lcd.print(LCD_ARROW_DOWN);
break;
case 4:
lcd.setCursor(6,1);
//lcd.print(LCD_ARROW_DOWN);
break;
case 5:
lcd.setCursor(6,1);
//lcd.print(LCD_ARROW_DOWN);
break;
case 6:
lcd.setCursor(6,1);
//lcd.print(LCD_ARROW_DOWN);
break;
case 7:
lcd.setCursor(6,1);
//lcd.print(LCD_ARROW_LEFT);
break;
case 8:
lcd.setCursor(6,1);
//lcd.print(LCD_ARROW_LEFT);
break;
}
*/
CURSOR_POS = new_pos;
#ifdef DEBUG
Serial.print("SetCursorPosition:");
Serial.println(CURSOR_POS);
#endif
}
void IRAM_ATTR isr() { //esp32 only
VSSCount++;
ledstate=!ledstate;
}
void convertJsonTripToTripStruct(uint8_t iTrip, const char* strJson){
// Serial.print(iTrip); Serial.print(";");Serial.println(strJson);
DynamicJsonDocument doc(256);
deserializeJson(doc, strJson);
Trip[iTrip].distance = doc["dist"];
Trip[iTrip].subTime = doc["time"];
}
void fillTripArray(){
char tempTrip[7]="/tripZ";
// Serial.println(tempTrip);
String tempReadFile;
tempReadFile.reserve(100);
for (uint8_t i=0; i<TRIPSIZE; i++){
tempTrip[5]=i+65;
tempReadFile = readFile(SPIFFS, tempTrip);
// Serial.print(tempTrip); Serial.print(";");Serial.println(tempReadFile);
convertJsonTripToTripStruct(i, tempReadFile.c_str());
}
}
void handleConstantaHTML(AsyncWebServerRequest *request) {
//PAGE.replace("%serveripaddress%", WiFi.localIP().toString());
//request->send_P(200, "text/html", HTML_CALIBRATION, processor);
// isloadingConst=true;
howLongInMillis=millis();
int pageZise;
int pageZiseConstRow;
pageZise=strlen_P(HTML_CONSTHEADER) + strlen_P(HTML_CONSTROW)*TRIPSIZE + strlen_P(HTML_CONSTEND);
String PAGE;
PAGE.reserve(pageZise);
pageZiseConstRow = strlen_P(HTML_CONSTROW);
String PAGEROW;
PAGEROW.reserve(pageZiseConstRow);
PAGE = FPSTR(HTML_CONSTHEADER);
for (uint8_t i=65; i<(TRIPSIZE+65); i++){
PAGEROW = FPSTR(HTML_CONSTROW);
PAGEROW.replace("%A%", String(char(i)));
PAGEROW.replace("%speed%", "speed"+String(char(i)));
PAGEROW.replace("%dist%", "dist"+String(char(i)));
PAGEROW.replace("%time%", "time"+String(char(i)));
PAGEROW.replace("%stime%", "stime"+String(char(i)));
// Serial.println(PAGEROW);
PAGE += PAGEROW;
}
PAGE += FPSTR(HTML_CONSTEND);
// Serial.println(PAGE);
Serial.print(pageZise);
Serial.print("PAGE Size:");
Serial.println(PAGE.length());
request->send(200, "text/html", PAGE);
// request->send(SPIFFS, "/constanta.html", String(), false, procConst); // read from spiif straight away
// isloadingConst=false;
}
void handlesetConst(AsyncWebServerRequest *request, JsonVariant &json){
isloadingConst=true;
// JsonObject& jsonObj = json.as<JsonObject>();
if (not json.is<JsonObject>()) {
Serial.println("Not JSONG object");
request->send(400, "text/plain", "Not an object");
return;
}
auto&& data = json.as<JsonObject>();
String hasil;
hasil.reserve(100);
boolean canSave = true;
const char* datatrip = data["trip"];
char trip = datatrip[0];
int iTrip = ((int) trip)-65;
uint8_t constCurTrip= (int)trip;
Serial.println(trip);Serial.println(iTrip);Serial.println(constCurTrip);
if (constCurTrip >= 65 && constCurTrip < (TRIPSIZE+65)){
constCurTrip = constCurTrip-65;
} else {
canSave = false;
}
// const char* speed = data["speed"].as<const char*>();
float speed = data["speed"].as<float>();
float dist = data["dist"].as<float>();
const char* time = data["time"].as<const char*>();//.as<String>();
// if (!isNumeric(speed)){
// canSave = false;
// }
float constconstanta = speed; //.toFloat();
// String constdist = data["dist"].as<String>();
// String consttime = data["time"].as<String>();
const char* stime = data["stime"].as<const char*>();//.as<String>();
unsigned long constvaluesettime;
if(!isShortTime(stime)){
canSave = false;
}
constvaluesettime = getValueSetTime(stime);
Serial.println(dist);
if (constvaluesettime==-1){
canSave = false;
}
Serial.print(constconstanta,3); Serial.print(";"); Serial.println(constCurTrip);
Serial.print(constvaluesettime); Serial.print(";"); Serial.println(speed);
AsyncResponseStream *response = request->beginResponseStream("application/json");
if (canSave){
// String filename = String("/trip"+trip);
char filename[7] = "/tripZ";
// Serial.println(filename);
// Serial.println(filename);
filename[5]=trip;
Serial.println(filename);
// if (speed != "" && speed !="null" && stime!= "" && stime !="null") {
// if (stime!= "" && stime !="null") {
bool wfile;
serializeJson(data, hasil);
wfile = writeFile(SPIFFS, filename, hasil.c_str());
if (wfile){
setMemSpeedInConstanta(constconstanta, constCurTrip);
setMemStime(constvaluesettime, constCurTrip);
convertJsonTripToTripStruct(iTrip, hasil.c_str());
data["ok"]=1;
}
// }
Serial.println(hasil);
// Serial.print("isi ");Serial.print(filename);Serial.println(readFile(SPIFFS, filename));
}
// request->send(200, "text/plain", hasil); // handle data and respond
serializeJson(data, *response);
request->send(response);
// request->send(200, "text/plain", hasil);
isloadingConst=false;
}
void handleloadConst(AsyncWebServerRequest *request, JsonVariant &json) {
isloadingConst=true;
// while(iscalculatingRally) {
// yield();
// }
String constTrip;
String tempTrip;
tempTrip.reserve(100);
String tripload;
tripload = "{\"alltrip\":";
tripload+="[";
uint8_t maxI=81;
DynamicJsonDocument doc(256);
float speedinconstanta;
// unsigned long sTimeinconstanta;
String tempSpeed;
tempSpeed.reserve(10);
String tempsTime;
tempsTime.reserve(10);
for(uint8_t i=65; i<maxI; i++){
constTrip = String(char(i));
tempTrip=readFile(SPIFFS, String("/trip" + constTrip).c_str());
// Serial.print(tempTrip.length()); Serial.print(";");Serial.println(tempTrip);
deserializeJson(doc, tempTrip);
speedinconstanta = getMemSpeedInConstanta(i-65);
// sTimeinconstanta = getMemStime(i-65);
tempsTime = getsTime(i-65);
tempSpeed=String(speedinconstanta,5);
tempSpeed.remove(6);
Serial.print(tempSpeed);Serial.println(speedinconstanta,3);
// Serial.println(tempsTime);
if (tempTrip==""){
doc["trip"]=String(char(i));
doc["dist"]=String("");
doc["time"]=String("");
}
doc["speed"]=String(tempSpeed);
doc["stime"]=String(tempsTime);
tempTrip="";
tempSpeed="";
tempsTime="";
serializeJson(doc, tempTrip);
// Serial.print(char(i));Serial.print(tempTrip.length()); Serial.print(";(AFTER)");Serial.println(tempTrip);
if (tempTrip!=""){
tripload+=tempTrip;
tripload+=",";
}
}
tripload.remove(tripload.length()-1,1);
tripload+="]}";
// tripload=readFile(SPIFFS, String("/trip" + trip).c_str());
Serial.println(tripload);
// AsyncResponseStream *response = request->beginResponseStream("application/json");
// DynamicJsonDocument doc(1024);
// deserializeJson(doc, tripload);
// doc["ok"]=1;
// serializeJson(doc, *response);
request->send(200, "text/plain", tripload); // handle data and respond
// request->send(tripload);
isloadingConst=false;
Serial.print("constLoadTime=");Serial.println(millis()-howLongInMillis);
}
void setup() {
getCalibJson.reserve(512);
getRallyJson.reserve(512);
//
//
//
//
//#ifdef DEBUG
Serial.begin(115200);
Serial.println("Starting Rally");
//#endif
// pinMode(ledPin, OUTPUT);
pinMode(simulatorPWMPin,OUTPUT);
pinMode(LED_BUILTIN, OUTPUT);
pinMode(interruptPin, INPUT); //Pull down using resistor to ground
attachInterrupt(digitalPinToInterrupt(interruptPin), blink, FALLING);
// attachInterrupt(digitalPinToInterrupt(interruptPin), blink, FALLING);
// attachInterrupt(interruptPin, isr, FALLING);
Wire.begin(I2C_SDA, I2C_SCL); //for lolin32lite sda=15; scl=13
// pinMode(UP_pin, INPUT_PULLUP); ///
// pinMode(DOWN_pin, INPUT_PULLUP); ///
// pinMode(LEFT_pin, INPUT_PULLUP); ///
// pinMode(RIGHT_pin, INPUT_PULLUP); ///
// pinMode(OK_pin, INPUT_PULLUP); ///
btnUP.begin(); /// using JC_BUTTON harus ada begin
btnDN.begin();
btnLF.begin();
btnRF.begin();
btnOK.begin();
btnESC.begin();
//DS3231_init(DS3231_INTCN);
DS3231_init(DS3231_CONTROL_INTCN);
//memset(recv, 0, BUFF_MAX);
#ifdef DEBUG
Serial.println("GET time");
#endif
/*
Trip[0].sub = "A";
Trip[0].speed = 24.275;
Trip[0].startHour = 25;
//Trip[0].distance = 12.898;
Trip[9].sub = "A";
Trip[9].speed = 90.2751;
Trip[9].startHour = 22;
Trip[9].startMin = 59;
Trip[9].startSec = 58;
*/
//Trip[9].distance = 12.898;
//Serial.println(Trip[0].sub);Serial.println(Trip[0].speed);Serial.println(Trip[0].startHour);Serial.println(Trip[0].startMin);Serial.println(Trip[0].startSec);
//Serial.println(Trip[0].distance);
//Serial.println(Trip[0].subTime);
// lcd.init();
// lcd.backlight();
lcd.begin(20, 4);
// if(lcd.begin(20, 4))
// {
// // begin() failed so blink the onboard LED if possible
// return; // this never returns
// }
lcd.setBacklight(0xff);
// Wire.setClock(100000L); // set i2c clock bit rate, if asked
lcd.print("i2c clock:");
lcd.setCursor(0,1);
lcd.print(Wire.getClock());
lcd.print(" Hz");
delay(3000);
//**************************LCD Setup********************************
// // lcd.begin (20,4); // initialize the lcd
// // lcd.init();
// lcd.begin();
// // Switch on the backlight
// /// lcd.setBacklightPin(BACKLIGHT_PIN,POSITIVE);
// lcd.backlight();
// /// lcd.setBacklight(LED_ON);
//***************************END LCD Setup********************************
#ifdef DEBUG
Serial.println("Setting time");
#endif
//char a[]="304022129022016";
DS3231_get(&t); //Get time
blinkON=false;
sec60=t.sec;
min60=t.min;
hour24=t.hour;
delay(100); // delay for reading mem.read
//mainMenu();
printUPchar();
printDOWNchar();
count1 = memretrieveLong(count1Address, RRcountSIZE, count1Seq); //(int startaddress, byte RRsize, unsigned long seq)
Serial.println(count1Seq);
int countaddresspointer = count1count2diffAddress*32;
Serial.print(countaddresspointer);
count1count2diff = mem.readLong(countaddresspointer);
//count1count2diff = mem.readLong((count1count2diffAddress*32));
count2 = count1 - count1count2diff;
//printmemLong(0,20); //startaddress, size
Serial.print("count1=");Serial.print(count1);Serial.print(";count2=");Serial.print(count2);Serial.print("countdiff=");Serial.println(count1count2diff);
//TESTING MEM AT24cx EEPROM check the address in the library #define ..... 0x57
// Serial.println("Write 42 to address 12");
// mem.write(12, 42);
// Serial.println("Read byte from address 12 ...");
// byte b = mem.read(12);
// Serial.print("... read: ");
// Serial.println(b, DEC);
// Serial.println();
//count1Seq = 4294967290;
/*
for (int i=0; i<25 ; i++){
count1Seq++;
//Serial.println(count1Seq);
//memwritingLong(rrcountpointer1, count1Seq, count1+1, RRcountSIZE );
memwritingLong(count1Address, RRcountSIZE, count1Seq, count1);//(int startaddress, byte RRsize, unsigned long seq, unsigned long Data)
}
*/
//mem.writeLong(896, 110025); to reset CALIBRATION value to CRV
/*
starttracthour=mem.read(770);
starttractmin=mem.read(769);
starttractsec=mem.read(768);
*/
// for (int i = 0; i<TRIPSIZE; i++) {
// }
for (int i = 0; i<TRIPSIZE; i++) { //reading Trip
Trip[i].sub = char(i+65);
memretrieveTrip(i, (TRIPADDRESS+i)*32);
// Serial.print(Trip[i].sub);Serial.print(Trip[i].speed,5); Serial.print(";"); Serial.print(Trip[i].startHour); Serial.print(":");
// Serial.print(Trip[i].startMin); Serial.print(":");Serial.print(Trip[i].startSec); Serial.println(";");
}
starttracthour=Trip[curTrip].startHour;
starttractmin=Trip[curTrip].startMin;
starttractsec=Trip[curTrip].startSec;
if (starttracthour>23) starttracthour = 23;
if (starttractmin>59) starttractmin = 59;
if (starttractsec>59) starttractsec = 59;
//constanta=mem.readFloat(800);
constanta = Trip[curTrip].speed;
if ((constanta > 150) || (constanta < 0)) constanta = 60; /// aslinya if ((constanta > 150) || (constanta < 0)) constanta = 60;
long m = mem.readLong(896); //read calibration value;
if (m > 0) {
Calibration = m;
} else Calibration = 110025;
// Calibration = 100000;
//#ifdef DEBUG
Serial.println("calibration and constanta");
Serial.println(m);
Serial.println(Calibration);
Serial.println(constanta);
//#endif
constantatodigit();
// Serial.print(digit1);Serial.print(digit2); Serial.print(digit3); Serial.print(digit4);Serial.print(digit5);Serial.println(digit6);
// Serial.println(constanta,5);
//Serial.print(digitalRead(UP_pin));Serial.print(digitalRead(DOWN_pin));Serial.print(digitalRead(LEFT_pin));Serial.print(digitalRead(RIGHT_pin));Serial.println(digitalRead(OK_pin));
prevcount1 = count1;
prevcount2 = count2;
prevcalibrationtime+=calibrationtimeinterval;
prevtempint+=tempinterval;
prevtemprally+=tempintervalrally;
prevsettime += intervalsettime;
startmillis+=1000;
mainMenu();
//
//
//
//
//Serial.begin(115200);
//DynamicJsonDocument doc(512);
// Initialize SPIFFS
#ifdef ESP32
if(!SPIFFS.begin(true)){
Serial.println("An Error has occurred while mounting SPIFFS");
return;
}
#else
if(!SPIFFS.begin()){
Serial.println("An Error has occurred while mounting SPIFFS");
return;
}
#endif
// wifiManager.setAPCallback(configModeCallback);
// wifiManager.autoConnect(soft_ap_ssid);
fillTripArray();
WiFi.onEvent(OnWiFiEvent);
//WiFi.mode(WIFI_STA);
WiFi.mode(WIFI_MODE_APSTA);
WiFi.softAP(soft_ap_ssid, soft_ap_password);
String yourSSIDString = readFile(SPIFFS, "/ssidString.txt");
Serial.print("*** Your ssidString: ");
Serial.println(yourSSIDString);
Serial.println(ssid);
if (yourSSIDString != ""){
strncpy(ssid, yourSSIDString.c_str() , (sizeof ssid)-1);
// strncpy(ssid, yourSSIDString.c_str() , (sizeof yourSSIDString)-1);
}
Serial.println(ssid);
String yourInputPwd = readFile(SPIFFS, "/inputPwd.txt");
Serial.print("*** Your inputPwd: ");
Serial.println(yourInputPwd);
if (yourInputPwd != ""){
strncpy(password, yourInputPwd.c_str() , (sizeof password)-1);
// strncpy(password, yourInputPwd.c_str() , (sizeof yourInputPwd)-1);
}
Serial.print("try to connect to ssid:");Serial.print(ssid);Serial.print("; with pwd:");Serial.println(password);
WiFi.begin(ssid, password);
if (WiFi.waitForConnectResult() != WL_CONNECTED) {
Serial.println("WiFi Failed!");
//return;
}
Serial.print("ESP32 IP as soft AP: ");
Serial.println(WiFi.softAPIP());
Serial.println();
Serial.print("IP Address: ");
Serial.println(WiFi.localIP());
// //settingup MDNS
// if(!MDNS.begin("esp32")) {
// Serial.println("Error starting mDNS");
// return;
// }
// Serial.println(“MDNS started.”);
// MDNS.addService(“http”, “tcp”, 80);
// // Init and get the time
configTime(gmtOffset_sec, daylightOffset_sec, ntpServer);
printLocalTime();
// Send web page with input fields to client
server.on("/", HTTP_GET, [](AsyncWebServerRequest *request){
if (ON_STA_FILTER(request)) {
//request->send(200, "text/plain", "Hello from STA");
request->send_P(200, "text/html", main_menu, processor);
return;
} else if (ON_AP_FILTER(request)) {
//request->send(200, "text/plain", "Hello from AP");
Serial.println("on apfilter /");
request->send_P(200, "text/html", wifi_html, processor);
return;
}
});
server.on("/wifi", HTTP_GET, [](AsyncWebServerRequest * request) {
if (ON_STA_FILTER(request)) {
//request->send(200, "text/plain", "Hello from STA");
request->send_P(200, "text/html", wifi_html, processor);
return;
} else if (ON_AP_FILTER(request)) {
//request->send(200, "text/plain", "Hello from AP");
Serial.println("on apfilter /wifi");
request->send_P(200, "text/html", wifi_html, processor);
return;
}
request->send(200, "text/plain", "Hello from undefined");
});
// Send a GET request to <ESP_IP>/get?inputString=<inputMessage>
server.on("/setwifi", HTTP_POST, [] (AsyncWebServerRequest *request) {
String inputMessage;
boolean bolrestart=false;
boolean POST=true;
Serial.println("ini masuk /setwifi");
// GET inputString value on <ESP_IP>/get?inputString=<inputMessage>
if (request->hasParam(PARAM_SSID, POST)) {
inputMessage = request->getParam(PARAM_SSID, POST )->value();
if (inputMessage!=""){
writeFile(SPIFFS, "/ssidString.txt", inputMessage.c_str());
delay(50);
bolrestart=true;
//ESP.restart();
}
}
// GET inputPwd value on <ESP_IP>/wifi/get?inputPwd=<inputMessage>
if (request->hasParam(PARAM_PWD, POST)) {
inputMessage = request->getParam(PARAM_PWD, POST)->value();
if (inputMessage!=""){
writeFile(SPIFFS, "/inputPwd.txt", inputMessage.c_str());
delay(50);
bolrestart=true;
//ESP.restart();
}
}
else {
inputMessage = "No message sent";
}
if (bolrestart) {
ESP.restart();
}
Serial.println("ini /setwifi aja");Serial.println(inputMessage);
request->send(200, "text/text", inputMessage);
});
// // Send a GET request to <ESP_IP>/wifi/get?ssidString=<inputMessage>
// server.on("/wifi/get", HTTP_GET, [] (AsyncWebServerRequest *request) {
// String inputMessage;
// // GET ssidString value on <ESP_IP>/wifi/get?ssidString=<inputMessage>
// Serial.println("ini masuk wifi get");
// Serial.println(request->params());
// if (request->hasParam(PARAM_SSID)) {
// inputMessage = request->getParam(PARAM_SSID)->value();
// writeFile(SPIFFS, "/ssidString.txt", inputMessage.c_str());
// delay(100);
// ESP.restart();
// }
// // GET inputPwd value on <ESP_IP>/wifi/get?inputPwd=<inputMessage>
// else if (request->hasParam(PARAM_PWD)) {
// inputMessage = request->getParam(PARAM_PWD)->value();
// writeFile(SPIFFS, "/inputPwd.txt", inputMessage.c_str());
// delay(100);
// ESP.restart();
// }
// else {
// inputMessage = "No message sent";
// }
// Serial.println("/wifi/get value:"); Serial.println(inputMessage);
// request->send(200, "text/text", inputMessage);
// });
server.on("/menu", HTTP_GET, [] (AsyncWebServerRequest *request) {
//String s = MAIN_page; //Read HTML contents
//request->send_P(200, "text/html", s); //Send web page
request->send_P(200, "text/html", main_menu);
});
server.on("/startrally", HTTP_GET, [] (AsyncWebServerRequest *request) {
//String s = MAIN_page; //Read HTML contents
//request->send_P(200, "text/html", s); //Send web page
String PAGE;
PAGE += FPSTR(HTML_PAGEHEADER);
PAGE.replace("%serveripaddress%", WiFi.localIP().toString());
PAGE += FPSTR(HTML_DIVSTARTRALLY);
//PAGE += FPSTR(HTML_SCRIPTSETINTERVAL);
//PAGE += FPSTR(HTML_SCRIPTGETDATA);
PAGE += FPSTR(HTML_END);
//Serial.println(PAGE);
Serial.print("PAGE Size:");
Serial.println(PAGE.length());
request->send(200, "text/html", PAGE);
});
server.on("/startrally1", HTTP_GET, [] (AsyncWebServerRequest *request) {
request->send_P(200, "text/html", HTML_startrally1, processor);
});
server.on("/resetodo1", HTTP_GET, [] (AsyncWebServerRequest *request) {
Serial.println("ODORESET 1");
request->redirect("/startrally1");
});
server.on("/resetodo2", HTTP_GET, [] (AsyncWebServerRequest *request) {
Serial.println("ODORESET 22222");
request->redirect("/startrally1");
});
server.on("/copytoodo2", HTTP_GET, [] (AsyncWebServerRequest *request) {
Serial.println("COPY ODO 1 to 2");
request->redirect("/startrally1");
});
server.on("/copytoodo1", HTTP_GET, [] (AsyncWebServerRequest *request) {
Serial.println("COPY ODO 2 to 1");
request->redirect("/startrally1");
});
server.on("/DIR", HTTP_GET, [] (AsyncWebServerRequest *request) {
String inputMessage;
String inputParam;
if (request->hasParam("DIR1")){
inputMessage=request->getParam("DIR1")->value();
Serial.print("DIR 1->");Serial.println(inputMessage);
switch(inputMessage[0]){
case 'F':
Serial.println("FW1");
break;
case 'S':
Serial.println("ST1");
break;
case 'B':
Serial.println("BACK1");
break;
default:
Serial.println("Default VAL1");
}
}
else if (request->hasParam("DIR2")){
inputMessage=request->getParam("DIR2")->value();
Serial.print("DIR 2->");Serial.println(inputMessage);
switch(inputMessage[0]){
case 'F':
Serial.println("FW2");
break;
case 'S':
Serial.println("ST2");
break;
case 'B':
Serial.println("BACK2");
break;
default:
Serial.println("Default VAL2");
}
}
request->redirect("/startrally1");
});
server.on("/TG1", HTTP_GET, [] (AsyncWebServerRequest *request) {
Serial.println("TOGGLE 1");
request->redirect("/startrally1");
});
server.on("/TG2", HTTP_GET, [] (AsyncWebServerRequest *request) {
Serial.println("TOGGLE 2");
request->redirect("/startrally1");
});
// //server.on("/adc", HTTP_GET); //This is display page
// server.on("/readADC", HTTP_GET, [] (AsyncWebServerRequest *request) {
// // int a = analogRead(A0);
// // String adcValue = String(millis());
// String adcValue = getPin();
// Serial.println(adcValue);
// request->send_P(200, "text/plain", adcValue.c_str()); //Send ADC value only to client ajax request
// });
server.on("/calibration", HTTP_GET, [] (AsyncWebServerRequest *request) {
int params = request->params(); //showing all params
for(int i=0;i<params;i++){
AsyncWebParameter* p = request->getParam(i);
if(p->isFile()){ //p->isPost() is also true
Serial.printf("FILE[%s]: %s, size: %u\n", p->name().c_str(), p->value().c_str(), p->size());
} else if(p->isPost()){
Serial.printf("POST[%s]: %s\n", p->name().c_str(), p->value().c_str());
} else {
Serial.printf("GET[%s]: %s\n", p->name().c_str(), p->value().c_str());
}
}
//PAGE.replace("%serveripaddress%", WiFi.localIP().toString());
request->send_P(200, "text/html", HTML_CALIBRATION, processor);
});
server.on("/constanta", HTTP_GET, [] (AsyncWebServerRequest *request) {
Serial.println("start /const");
for (uint8_t i=0; i<REQUESTCOUNT;i++){
if(!gGotRequestConstHTML[i]){
gRequestConstHTML[i]=request;
gGotRequestConstHTML[i]=true;
Serial.print("FILL/const:");Serial.println(i);
break;
}
}
// handleConstantaHTML(request);
});
AsyncCallbackJsonWebHandler* setconst = new AsyncCallbackJsonWebHandler("/rest/endpoint", [](AsyncWebServerRequest *request, JsonVariant &json) {
isloadingConst=true;
handlesetConst(request, json);
isloadingConst=false;
});
AsyncCallbackJsonWebHandler* loadconst = new AsyncCallbackJsonWebHandler("/rest/loadconst", [](AsyncWebServerRequest *request, JsonVariant &json) {
Serial.println("loadconst");
// if (gGotRequest[0])
for (uint8_t i=0; i<REQUESTCOUNT;i++){
if(!gGotRequest[i]){
gRequest[i]=request;
gJson[i]=json;
gGotRequest[i]=true;
Serial.print("FILL:");Serial.println(i);
break;
}
}
// handleloadConst(request, json);
// auto&& data = json.as<JsonObject>();
});
server.addHandler(setconst);
server.addHandler(loadconst);
Serial.println("before onevent");
ws.onEvent(onWsEvent); //add ws event
wscal.onEvent(onWsEvent2); //add ws event
server.addHandler(&ws);
server.addHandler(&wscal);
Serial.println("after onevent");
server.onNotFound(notFound);
Serial.println("onnotfound");
server.begin();
Serial.println("server begin");
}
unsigned long testLoadTime;
void loop() //loop from VSS RALLY V2
{
#ifdef DEBUG
prevtimemicros = micros();
#endif
// #ifndef ATMEGA328
//digitalWrite(ledPin, ledstate);
digitalWrite(LED_BUILTIN, ledstate);
// #endif
// Serial.print("start loop; ");
char tempF[6];
unsigned long now1 = millis();
btnUP.read(); //read the buttons
btnDN.read();
btnLF.read(); //read the buttons
btnRF.read();
btnOK.read();
btnESC.read();
// Serial.print("read button; ");
if (millis()-rallyEditTime >1500) rallyEditRpt = 0;
switch (STATE) {
case WAIT: //wait for a button event
if (btnUP.wasPressed())
STATE = UP;
else if (btnDN.wasPressed())
STATE = DOWN;
else if (btnLF.wasPressed())
STATE = LEFT;
else if (btnRF.wasPressed())
STATE = RIGHT;
else if (btnUP.wasReleased()) //reset the long press interval
rpt = REPEAT_FIRST;
else if (btnDN.wasReleased())
rpt = REPEAT_FIRST;
else if (btnLF.wasReleased()) //reset the long press interval
rpt = REPEAT_FIRST;
else if (btnRF.wasReleased())
rpt = REPEAT_FIRST;
else if (btnUP.pressedFor(rpt)) { //check for long press
rpt += REPEAT_INCR; //increment the long press interval
STATE = UP;
}
else if (btnDN.pressedFor(rpt)) {
rpt += REPEAT_INCR;
STATE = DOWN;
}
else if (btnLF.pressedFor(rpt)) { //check for long press
rpt += REPEAT_INCR; //increment the long press interval
STATE = LEFT;
}
else if (btnRF.pressedFor(1000)) {
rpt += REPEAT_INCR;
STATE = RIGHT;
}
else if (btnOK.wasPressed() && (MENU != RALLY)) {
STATE = OKAY;
}
else if (btnOK.wasPressed() && (CURSOR_POS > 4)) {
STATE = OKAY;
}
else if (btnOK.wasPressed() && (CURSOR_POS <= 2)) {
//STATE = OKAY;
if (!rallyEditRpt) {
rallyEditTime = millis();
rallyEditRpt++;
//Serial.println("!rallyEditRpt");
//Serial.println(rallyEditRpt);
}
else if (millis()-rallyEditTime > 1500) {
rallyEditRpt = 0;
//Serial.println("rallyEditRpt = 0");
//Serial.println(rallyEditRpt);
}
else if (rallyEditRpt == 2) {
//Serial.println("rallyEditRpt = ");Serial.println(rallyEditRpt);
STATE = RALLYEDIT;
rallyEditRpt = 0;
}
else {
rallyEditRpt++;
//Serial.println("rallyEditRpt++");
//Serial.println(rallyEditRpt);
}
}
else if (btnOK.pressedFor(rpt) && (CURSOR_POS <= 4)) {
STATE = OKAY;
}
else if (btnESC.wasPressed()){
STATE = ESC;
//Serial.println("ESC pressed");
}
break;
case DOWN: //increment the counter
switch (MENU) {
case MAIN:
y = min(y+1, MAX_ROW); //but not more than the specified maximum
break;
case RALLY:
if (blinkON) {
if (y == 1) {
if (x == 0 || x == 1) {
dist1digit1 = max(dist1digit1-1, 0);
lcd.setCursor(0,y);
if (dist1digit1 <10) lcd.print("0");
lcd.print(dist1digit1);
}
else if (x == 3 || x == 4 || x == 5) {
dist1digit2 = max(dist1digit2-1, 0);
lcd.setCursor(3,y);
if (dist1digit2 <10) {
lcd.print("00");
}else if (dist1digit2 <100) lcd.print("0");
lcd.print(dist1digit2);
}
}
else if (y ==3) {
if (x == 0 || x == 1) {
dist2digit1 = max(dist2digit1-1, 0);
lcd.setCursor(0,y);
if (dist2digit1 <10) lcd.print("0");
lcd.print(dist2digit1);
}
else if (x == 3 || x == 4 || x == 5) {
dist2digit2 = max(dist2digit2-1, 0);
lcd.setCursor(3,y);
if (dist2digit2 <10) {
lcd.print("00");
}else if (dist2digit2 <100) lcd.print("0");
lcd.print(dist2digit2);
}
}
}
else {
CURSOR_POS=min(CURSOR_POS+1,10);
set_cursor_pos(CURSOR_POS);
}
break;
case CALIBRATION:
if (!blinkON) y = min(y+1, MAX_ROW ); //but not more than the specified maximum
else if (blinkON && y==1) {
//calibrationDistance=max(calibrationDistance-1, 1);
tempcalibdist=max(tempcalibdist-1, 1);
lcd.print(tempcalibdist);
}
else if (blinkON && y==3 && (x==18||x==19)) {
calibdigit3 = max(calibdigit3-1,0);
lcd.setCursor(18,3);
if (calibdigit3<10) lcd.print("0");
lcd.print(calibdigit3);
}
else if (blinkON && y==3 && (x==16||x==17)) {
calibdigit2 = max(calibdigit2-1,0);
lcd.setCursor(16,3);
if (calibdigit2<10) lcd.print("0");
lcd.print(calibdigit2);
}
else if (blinkON && y==3 && (x==14||x==15)) {
calibdigit1 = max(calibdigit1-1,0);
lcd.setCursor(14,3);
if (calibdigit1<10) lcd.print("0");
lcd.print(calibdigit1);
}
break;
case CONSTANTA:
if (!blinkON) {
y = min(y+1, 3); //but not less than the specified minimum
if (y==1) x=15;
}
else if (y==1) {
prevTrip = min(prevTrip+1,TRIPSIZE-1);
//curTrip = min(curTrip+1,TRIPSIZE-1);
lcd.setCursor(14,y);
lcd.print(Trip[prevTrip].sub);
}
else if (x==13 && y==2) {
digit1 = max(digit1-1, MIN_COUNT);
lcd.print(digit1);
}
else if (x==14 && y==2) {
digit2 = max(digit2-1, MIN_COUNT);
lcd.print(digit2);
}
else if (x==16 && y==2) {
digit3 = max(digit3-1, MIN_COUNT);
lcd.print(digit3);
}
else if (x==17 && y==2) {
digit4 = max(digit4-1, MIN_COUNT);
lcd.print(digit4);
}
else if (x==18 && y==2) {
digit5 = max(digit5-1, MIN_COUNT);
lcd.print(digit5);
}
else if (x==19 && y==2) {
digit6 = max(digit6-1, MIN_COUNT);
lcd.print(digit6);
}
else if ((x==12 || x==13) && y==3) { //******SET CONSTANTA TIME *******
hour24=max(hour24-1, MIN_COUNT);
lcd.setCursor(12,y);
if (hour24<10) lcd.print("0");
lcd.print(hour24);
}
else if ((x==15 || x==16) && y==3) {
min60=max(min60-1, MIN_COUNT);
lcd.setCursor(15,y);
if (min60<10) lcd.print("0");
lcd.print(min60);
}
else if ((x==18 || x==19) && y==3) {
sec60=max(sec60-1, MIN_COUNT);
lcd.setCursor(18,y);
if (sec60<10) lcd.print("0");
lcd.print(sec60);
}
break;
case SETTIME:
if (!blinkON) {
y = min(y+1, MAX_ROW); //but not more than the specified maximum
lcd.setCursor(x,y);
}
else if ((x==0 || x==1) && y==3) {
hour24=max(hour24-1, MIN_COUNT);
lcd.setCursor(0,y);
if (hour24<10) lcd.print("0");
lcd.print(hour24);
}
else if ((x==3 || x==4) && y==3) {
min60=max(min60-1, MIN_COUNT);
lcd.setCursor(3,y);
if (min60<10) lcd.print("0");
lcd.print(min60);
}
else if ((x==6 || x==7) && y==3) {
sec60=max(sec60-1, MIN_COUNT);
lcd.setCursor(6,y);
if (sec60<10) lcd.print("0");
lcd.print(sec60);
}
break;
}
STATE = WAIT;
lcd.setCursor(x,y);
break;
case UP: //decrement the counter
switch(MENU) {
case MAIN:
y = max(y-1, MIN_COUNT); //but not less than the specified minimum
break;
case CALIBRATION:
if (!blinkON) {
y = max(y-1, MIN_COUNT); //but not less than the specified minimum
x = 18;
}
else if (blinkON && y==1) {
//calibrationDistance=min(calibrationDistance+1, 9);
tempcalibdist=min(tempcalibdist+1, 9);
lcd.print(tempcalibdist);
}
else if (blinkON && y==3 && (x==18||x==19)) {
calibdigit3 = min(calibdigit3+1,99);
lcd.setCursor(18,3);
if (calibdigit3<10) lcd.print("0");
lcd.print(calibdigit3);
}
else if (blinkON && y==3 && (x==16||x==17)) {
calibdigit2 = min(calibdigit2+1,99);
lcd.setCursor(16,3);
if (calibdigit2<10) lcd.print("0");
lcd.print(calibdigit2);
}
else if (blinkON && y==3 && (x==14||x==15)) {
calibdigit1 = min(calibdigit1+1,50);
lcd.setCursor(14,3);
if (calibdigit1<10) lcd.print("0");
lcd.print(calibdigit1);
}
break;
case RALLY:
if (blinkON) {
if (y == 1) {
if (x == 0 || x == 1) {
dist1digit1 = min(dist1digit1+1, 999);
lcd.setCursor(0,y);
if (dist1digit1 <10) lcd.print("0");
lcd.print(dist1digit1);
}
else if (x == 3 || x == 4 || x == 5) {
dist1digit2 = min(dist1digit2+1, 999);
lcd.setCursor(3,y);
if (dist1digit2 <10) {
lcd.print("00");
}else if (dist1digit2 <100) lcd.print("0");
lcd.print(dist1digit2);
}
}
else if (y == 3) {
if (x == 0 || x == 1) {
dist2digit1 = min(dist2digit1+1, 99);
lcd.setCursor(0,y);
if (dist2digit1 <10) lcd.print("0");
lcd.print(dist2digit1);
}
else if (x == 3 || x == 4 || x == 5) {
dist2digit2 = min(dist2digit2+1, 999);
lcd.setCursor(3,y);
if (dist2digit2 <10) {
lcd.print("00");
}else if (dist2digit2 <100) lcd.print("0");
lcd.print(dist2digit2);
}
}
}
else {
CURSOR_POS=max(CURSOR_POS-1,1);
set_cursor_pos(CURSOR_POS);
}
break;
case CONSTANTA:
if (!blinkON) {
y = max(y-1, MIN_COUNT); //but not less than the specified minimum
if (y==0) x=16;
else if (y==1) x=15;
}
else if (y==1) {
prevTrip = max(prevTrip-1, MIN_COUNT);
//curTrip = max(curTrip-1, MIN_COUNT);
lcd.setCursor(14,y);
lcd.print(Trip[prevTrip].sub);
}
else if (x==13 && y==2) {
digit1=min(digit1+1, 9);
lcd.print(digit1);
}
else if (x==14 && y==2) {
digit2=min(digit2+1, 9);
lcd.print(digit2);
}
else if (x==16 && y==2) {
digit3=min(digit3+1, 9);
lcd.print(digit3);
}
else if (x==17 && y==2) {
digit4=min(digit4+1, 9);
lcd.print(digit4);
}
else if (x==18 && y==2) {
digit5=min(digit5+1, 9);
lcd.print(digit5);
}
else if (x==19 && y==2) {
digit6=min(digit6+1, 9);
lcd.print(digit6);
}
else if ((x==12 || x==13) && y==3) { //******SET CONSTANTA TIME *******
hour24=min(hour24+1, 23);
lcd.setCursor(12,y);
if (hour24<10) lcd.print("0");
lcd.print(hour24);
}
else if ((x==15 || x==16) && y==3) {
min60=min(min60+1, 59);
lcd.setCursor(15,y);
if (min60<10) lcd.print("0");
lcd.print(min60);
}
else if ((x==18 || x==19) && y==3) {
sec60=min(sec60+1, 59);
lcd.setCursor(18,y);
if (sec60<10) lcd.print("0");
lcd.print(sec60);
}
break;
case SETTIME:
if (!blinkON) {
y = max(y-1, MIN_COUNT); //but not less than the specified minimum
//Serial.print(x); Serial.print(","); Serial.println(y);
//lcd.setCursor(x,y);
}
else if ((x==0 || x==1) && y==3) {
hour24=min(hour24+1, 23);
lcd.setCursor(0,y);
if (hour24<10) lcd.print("0");
lcd.print(hour24);
}
else if ((x==3 || x==4) && y==3) {
min60=min(min60+1, 59);
lcd.setCursor(3,y);
if (min60<10) lcd.print("0");
lcd.print(min60);
}
else if ((x==6 || x==7) && y==3) {
sec60=min(sec60+1, 59);
lcd.setCursor(6,y);
if (sec60<10) lcd.print("0");
lcd.print(sec60);
}
break;
}
STATE = WAIT;
lcd.setCursor(x,y);
break;
case RIGHT: //increment the counter
switch (MENU) {
case SETTIME:
x = min(x+1, MAX_COL); //MAX_COUNT); //but not more than the specified maximum
//STATE = WAIT;
//Serial.print(x); Serial.print(","); Serial.println(y);
//lcd.setCursor(x,y);
break;
case RALLY:
if (blinkON) {
x = min(x+1, 5);
//Serial.println(x);
}
else if (CURSOR_POS % 2 ==0) CURSOR_POS=min(CURSOR_POS+2,10);
else CURSOR_POS=min(CURSOR_POS+2,9);
if (!blinkON) set_cursor_pos(CURSOR_POS);
break;
case CONSTANTA:
if (y==2 || y==3) {
x = min(x+1, MAX_COL); //MAX_COUNT);
}
break;
case CALIBRATION:
if (y==3) {
x = min(x+1,MAX_COL);
}
else x = 18;
break;
}
STATE = WAIT;
lcd.setCursor(x,y);
break;
case LEFT: //decrement the counter
switch (MENU) {
case SETTIME:
x = max(x-1, MIN_COUNT); //but not less than the specified minimum
//STATE = WAIT;
//Serial.print(x); Serial.print(","); Serial.println(y);
//lcd.setCursor(x,y);
break;
case RALLY:
if (blinkON) {
x = max(x-1, MIN_COUNT);
}
else if (CURSOR_POS % 2 == 0) CURSOR_POS=max(CURSOR_POS-2,2);
else CURSOR_POS=max(CURSOR_POS-2,1);
if (!blinkON) set_cursor_pos(CURSOR_POS);
break;
case CONSTANTA:
if (y==2 || y==3){
x = max(x-1, 12);
}
break;
case CALIBRATION:
if (y==3) {
x = max(x-1, 14);
}
else x = 18;
break;
}
STATE = WAIT;
lcd.setCursor(x,y);
break;
case OKAY:
switch (MENU) {
case MAIN:
if (y==1) {
MENU = SETTIME;
//prevsettime += millis();
//prevtempint+=millis();
}
else if (y==0) {
MENU = RALLY;
//prevtemprally=millis();
}
else if (y==2) MENU = CONSTANTA;
else if (y==3) {
MENU = CALIBRATION;
//prevcalibrationtime+=millis();
}
break;
case CONSTANTA:
if (y==0) MENU = MAIN;
//else if (!blinkON && y==1) {
// }
else if (!blinkON && y==2) {
constantatodigit();
lcd.blink();
blinkON=!blinkON;
}
else if (!blinkON && y==3) {
sec60 = starttractsec;
min60 = starttractmin;
hour24 = starttracthour;
lcd.blink();
blinkON=!blinkON;
}
else if (!blinkON && y==1) {
prevTrip = curTrip;
lcd.blink();
blinkON = !blinkON;
}
else if (blinkON && y==1) {
curTrip = prevTrip;
constanta = Trip[curTrip].speed;
starttractsec = Trip[curTrip].startSec;
starttractmin = Trip[curTrip].startMin;
starttracthour = Trip[curTrip].startHour;
lcd.noBlink();
blinkON=!blinkON;
constantaMenu();
}
else if (blinkON && y==2) {
lcd.noBlink();
blinkON=!blinkON;
constanta = (digit1*10)+digit2+(float)digit3/10+(float)digit4/100+(float)digit5/1000+(float)digit6/10000; //+(float)digit6/100000;
//mem.writeFloat(800, constanta);
setMemSpeedInConstanta(constanta, curTrip);
// int pointeradd = ((TRIPADDRESS+curTrip)*32);
// mem.writeFloat(pointeradd, constanta);
// Trip[curTrip].speed = constanta;
#ifdef DEBUG
Serial.println(pointeradd); Serial.print(";");Serial.println(constanta,5);
#endif
}
else if (blinkON && y==3) {
starttractsec=sec60;
starttractmin=min60;
starttracthour=hour24;
unsigned long valuesettime = starttracthour;
valuesettime = valuesettime * 256 + starttractmin; // effectively shift the first byte 8 bit positions
valuesettime = valuesettime * 256 + starttractsec;
//mem.writeLong(768,valuesettime);
setMemStime(valuesettime, curTrip); ///added for esp32
// int pointeradd = ((TRIPADDRESS+curTrip)*32+4);
// mem.writeLong(pointeradd, valuesettime);
// Trip[curTrip].startHour = starttracthour;
// Trip[curTrip].startMin = starttractmin;
// Trip[curTrip].startSec = starttractsec;
lcd.noBlink();
blinkON=!blinkON;
#ifdef DEBUG
Serial.println(pointeradd); Serial.println(valuesettime);
#endif
}
else {// if (y==3) {
lcd.blink();
blinkON=!blinkON;
}
break;
case RALLY:
#ifdef DEBUG
Serial.println("OKRALLY");
#endif
switch(CURSOR_POS)
{
case 1:
count1 = 0;
backcount1 = 0;
time1 = VSSCount;
//Serial.println("case 1");
break;
case 2:
count2 = 0;
backcount2 = 0;
time2 = VSSCount;
//Serial.println("case 2");
break;
case 3:
count2 = count1; //no yet UNDO next update can UNDO
backcount2 = 0;
//time2 = VSSCount;
//Serial.println("case 3");
break;
case 4:
count1 = count2; //no yet UNDO next update can UNDO
backcount1 = 0;
//time1 = VSSCount;
//Serial.println("case 4");
break;
case 5:
//dirfwdcount1 = !dirfwdcount1;
switch (dircount1)
{
case FORWARD:
dircount1 = FREEZE;
break;
case FREEZE:
dircount1 = BACKWARD;
break;
case BACKWARD:
dircount1 = FORWARD;
break;
default:
dircount1 = FORWARD;
break;
}
secondrallyMenu();
//Serial.println("case 5");
break;
case 6:
//dirfwdcount2 = !dirfwdcount2;
switch (dircount2)
{
case FORWARD:
dircount2 = FREEZE;
break;
case FREEZE:
dircount2 = BACKWARD;
break;
case BACKWARD:
dircount2 = FORWARD;
break;
default:
dircount2 = FORWARD;
break;
}
secondrallyMenu();
//Serial.println("case 6");
break;
case 7:
showTIME = !showTIME;
rallyMenu();
break;
case 8:
showTIME = !showTIME;
rallyMenu();
break;
case 9:
//Serial.println("case 9");
MENU = MAIN;
lcd.noBlink();
break;
case 10:
//Serial.println("case 10");
MENU = MAIN;
lcd.noBlink();
break;
}
break;
case CALIBRATION:
if (blinkON && y==1) {
lcd.noBlink();
blinkON=!blinkON;
calibrationDistance = tempcalibdist;
}
else if (!blinkON && y==1) {
lcd.blink();
blinkON=!blinkON;
tempcalibdist = calibrationDistance;
}
else if (!blinkON && y==2) {
//startCalibration = millis();
Calibrationcount = 0;
startCalibration = VSSCount;
Calibrationtime = startCalibration;
blinkON=!blinkON;
lcd.blink();
calibrationON=true;
lcd.setCursor(0,2);
lcd.print("Calibrating 00.000Km");
}
else if (blinkON && y==2) {
Calibration = (VSSCount-startCalibration)/(float)calibrationDistance;
mem.writeLong(896, Calibration); //Save Calibration to memory
oneMeter=(millis()-startCalibration)/(1000*(float)calibrationDistance);//*calibrationDistance);
oneMeter=((float)VSSCount-startCalibration)/(1000*(float)calibrationDistance);//*calibrationDistance);
oneMeter=(float)(Calibration)/1000*(float)calibrationDistance;
blinkON=!blinkON;
lcd.noBlink();
calibrationON=false;
lcd.setCursor(0,2);
lcd.print("Start ");
lcd.setCursor(0,3);
lcd.print("1m=");
//Serial.print(startCalibration);Serial.print(";");Serial.print((millis()-startCalibration)/1000);Serial.print(";");
#ifdef DEBUG
Serial.println(oneMeter,5);
#endif
lcd.print(oneMeter,3);
lcd.print(";");
}
else if (!blinkON && y==3) { //not yet implemented
lcd.blink();
blinkON=!blinkON;
calibdigit1 = (byte)(Calibration/10000);
calibdigit2 = (byte)((Calibration % 10000)/100);
calibdigit3 = Calibration % 100;
//Serial.println(calibdigit1);Serial.println(calibdigit2);Serial.println(calibdigit3);
}
else if (blinkON && y==3) {
lcd.noBlink();
blinkON=!blinkON;
//Serial.println(calibdigit1);Serial.println(calibdigit2);Serial.println(calibdigit3);
Calibration = ((long)calibdigit1*10000) + ((long)calibdigit2*100) + (calibdigit3);
//Serial.println(Calibration);
mem.writeLong(896, Calibration);
}
else if (y==0) MENU = MAIN;
break;
case SETTIME:
if (blinkON && y==3) {
t.sec=sec60;
t.min=min60;
t.hour=hour24;
DS3231_set(t);
lcd.noBlink();
blinkON=!blinkON;
//Serial.println("OKAY");
}
else if (y==3) {
lcd.blink();
blinkON=!blinkON;
}
else {//(blinkON) {
MENU = MAIN;
lcd.noBlink();
}
break;
}
STATE = WAIT;
lcd.setCursor(x,y);
break;
case RALLYEDIT:
if ((CURSOR_POS == 1 || CURSOR_POS == 2) && !blinkON) {
rallyEdit = true;
blinkON = true;
lcd.blink();
//if (distance<100) {
dist1digit1=((int)distance1%1000);
dist1digit2=(int)((distance1 - (int)distance1)*1000);
dist2digit1=((int)distance2%1000);
dist2digit2=(int)((distance2 - (int)distance2)*1000);
//}
/*
Serial.print(dist1digit1);Serial.println(dist1digit2); //Serial.print(dist1digit3); Serial.print(dist1digit4);Serial.println(dist1digit5);//Serial.println(digit6);
Serial.println(distance1,3);
Serial.print(dist2digit1);Serial.println(dist2digit2); //Serial.print(dist1digit3); Serial.print(dist1digit4);Serial.println(dist1digit5);//Serial.println(digit6);
Serial.println(distance2,3);
*/
}
else if (blinkON) { //set the new distance to count
blinkON = false;
rallyEdit = false;
/*
Serial.println(count1);
Serial.println(distance1,5);
Serial.println("");
*/
if (CURSOR_POS == 1) {
distance1 = dist1digit1 + (float)dist1digit2/1000;
count1 = (unsigned long)(distance1 * Calibration) + 5;
//distance1 = (float)count1/((float)Calibration);
}else if (CURSOR_POS == 2) {
distance2 = dist2digit1 + (float)dist2digit2/1000;
count2 = (unsigned long)(distance2 * Calibration) + 5;
//distance2 = (float)count2/((float)Calibration);
}
/*
Serial.println(count1);
Serial.println(distance1,3);
*/
set_cursor_pos(CURSOR_POS);
}
STATE = WAIT;
lcd.setCursor(x,y);
break;
case ESC:
switch (MENU)
{
case RALLY:
lcd.noBlink();
MENU=MAIN;
if (rallyEdit) {
rallyEdit = false;
lcd.blink();
MENU = RALLY;
set_cursor_pos(CURSOR_POS);
}
blinkON=false;
break;
case SETTIME:
lcd.noBlink();
if (!blinkON) MENU = MAIN;
blinkON=false;
//MENU=MAIN;
break;
case CONSTANTA:
//MENU=MAIN;
if (!blinkON) MENU = MAIN;
else constantaMenu();
lcd.noBlink();
blinkON=false;
break;
case CALIBRATION:
lcd.noBlink();
if (!blinkON) MENU = MAIN;
blinkON=false;
calibrationON=false;
//MENU=MAIN;
break;
}
STATE = WAIT;
lcd.setCursor(x,y);
break;
}
//*****************************************************************
//*************************************** M E N U *****************
//
//
//
//*************************************** M E N U *****************
//*****************************************************************
if (PREVMENU!=MENU)
{
switch (MENU)
{
case (MAIN):
mainMenu();
break;
case (RALLY):
lcd.clear();
rallyMenu();
rallyON=true;
//lcd.blink();
CURSOR_POS=10;
set_cursor_pos(CURSOR_POS);
break;
case (SETTIME):
lcd.clear();
settimeMenu();
sec60=t.sec;
min60=t.min;
hour24=t.hour;
lcd.setCursor(0,3);
lcdprint2digit(hour24);
lcd.print(":");
lcdprint2digit(min60);
lcd.print(":");
lcdprint2digit(sec60);
x=0;
y=2;
lcd.setCursor(x,y);
break;
case (CALIBRATION):
calibrationMenu();
break;
case CONSTANTA:
sec60=starttractsec;
min60=starttractmin;
hour24=starttracthour;
x = 16;
y = 0;
constantaMenu();
break;
case (INPUTSUBTRAYEK):
break;
}
}
if (MENU==RALLY) {
if (((now1 - prevtemprally) >= tempintervalrally) && !isloadingConst) {
//if ((long)(now1 - prevtemprally) >= 0) {
testLoadTime=millis();
//rallyMenu();
if (!rallyEdit) {
iscalculatingRally=true;
redrawrallyMenu(); //Distance is edited?
iscalculatingRally=false;
}
Serial.println(millis()-testLoadTime);
prevtemprally=now1;
//prevtemprally+=tempintervalrally;
}
}
if (MENU==SETTIME) {
//if ((long)(now1 - prevtempint) >=0 ){
if ((now1 - prevtempint) >=tempinterval ){
temperature = DS3231_get_treg(); //Get temperature
dtostrf(temperature, 5, 1, tempF);
lcd.setCursor(9,1);
lcd.print(tempF);
lcd.print((char)223);
lcd.print("C ");
//prevtempint+=tempinterval;
prevtempint=now1;
lcd.setCursor(x,y);
//lcd.setCursor(15,0);
//lcd.print(now);
}
//if ((long)(now1- prevsettime) >=0 ){ //show SET TIME MENU
if ((now1 - prevsettime) >=intervalsettime ){ //show SET TIME MENU
DS3231_get(&t); //Get time
if (prevsec!=t.sec) { //will update the LCD every sec(as long as the t.sec is different) eventhough intervalseetime is 250ms
settimeMenu();
prevsettime = now1;
//prevsettime += intervalsettime;
}
}
}
if (MENU==CALIBRATION) {
if (calibrationON) {
if ((now1 - prevcalibrationtime) >= calibrationtimeinterval ) {
//if ((long)(now1 - prevcalibrationtime) >=0 ) {
redrawcalibrationMenu();
char Calibrationstr[6];
unsigned long calibtemp = VSSCount - startCalibration;
sprintf(Calibrationstr, "%06lu", calibtemp);
lcd.setCursor(14,3);
lcd.print(Calibrationstr);
lcd.setCursor(x,y);
prevcalibrationtime=now1;
//prevcalibrationtime+=calibrationtimeinterval;
}
}
}
//if (((long)(millis()-startmillis)>=0) && MENU!=CALIBRATION) {
if ((now1-startmillis)>=500) { //&& MENU!=CALIBRATION && MENU!=MAIN) {
unsigned long VSSCountDiff = VSSCount - startVSSCount;
startVSSCount=VSSCount;
if ((VSSCountDiff == 0) && savedCount) {
intervalsavemillis = 4000000;
}
else if ((VSSCountDiff == 0) && !savedCount) {
saveCount();
savedCount = !savedCount;
intervalsavemillis = 2000000;
}
else if (VSSCountDiff < 15) intervalsavemillis = 3000;
else if (VSSCountDiff < 70) intervalsavemillis = 60000;
else intervalsavemillis = 4000000;
if (VSSCountDiff > 0) savedCount = false;
if (MENU!=CALIBRATION && MENU!=MAIN && MENU!=CONSTANTA) {
lcd.setCursor(0,0);
if (VSSCountDiff==0) lcd.print("0");
else if (VSSCountDiff <= 10) lcd.print("1");
else if (VSSCountDiff <= 50) lcd.print("2");
else if (VSSCountDiff <= 150) lcd.print("3");
else if (VSSCountDiff <= 250) lcd.print("4");
else if (VSSCountDiff <= 400) lcd.print("5");
else if (VSSCountDiff <= 600) lcd.print("6");
else if (VSSCountDiff <= 900) lcd.print("7");
else if (VSSCountDiff <= 1200) lcd.print("8");
else if (VSSCountDiff > 1200) lcd.print("9");
//lcd.print(VSSCountDiff);
//lcd.print(" ");
lcd.setCursor(x,y);
}
//startmillis+=400;
startmillis=now1;
}
/*
if (((millis() % 100)==0) && MENU!=CALIBRATION) {
lcd.setCursor(0,2);
lcd.print(VSSCount);
lcd.print(" ");
lcd.setCursor(x,y);
}
*/
if ((millis()-updatecounttime)>=250) {
// if ((millis()-updatecounttime)>=250) {
updateCount();
updatecounttime = millis();
digitalWrite(simulatorPWMPin, !simstate);
simstate = !simstate;
// Serial.print(ledstate); Serial.print(";");Serial.println(simstate);
}
if ((millis()-startsavemillis) > intervalsavemillis) {
saveCount();
//startsavemillis += 3000;
startsavemillis = millis();
}
if ((millis()-broadcastwebsocket) > 333 && !isloadingConst && globalClientRally) {
broadcastwebsocket = millis();
iscalculatingRally=true;
calculationRally();
iscalculatingRally=false;
// Serial.println(getRallyJson);
// Serial.println(millis()-broadcastwebsocket);
ws.textAll(getRallyJson);
// char pingPong[] = "{\"ping\":1}";
// ws.textAll(pingPong);
}
if ((millis()-broadcastwebsocketcalib) > 499 && !isloadingConst && globalClientCalib) {
broadcastwebsocketcalib = millis();
//calculationRally();
redrawcalibrationMenuForESP32();
// Serial.println(getCalibJson);
wscal.textAll(getCalibJson);
// Serial.print("VSSCount="); Serial.println(VSSCount);
// Serial.print(ledstate); Serial.print(";");Serial.println(simstate);
}
if(!isloadingConst){
for (int i=(REQUESTCOUNT-1); i>=0; i--){
// for (int i=0; i<REQUESTCOUNT; i++){
// Serial.print(i);Serial.print(";");
if(gGotRequestConstHTML[i]){
handleConstantaHTML(gRequestConstHTML[i]);
gGotRequestConstHTML[i]=false;
Serial.print("REMOVE/const:");Serial.println(i);
}
if(gGotRequest[i]){
handleloadConst(gRequest[i],gJson[i]);
gGotRequest[i]=false;
Serial.print("REMOVE:");Serial.println(i);
}
}
}
VSSCount=millis(); //VSSCount Simulator
#ifdef DEBUG
Serial.print(micros()-prevtimemicros); Serial.println("**");
#endif
}