282 lines
6.0 KiB
C++
282 lines
6.0 KiB
C++
#include "Parms_ADI.h"
|
|
|
|
ParmsLibClass::~ParmsLibClass()
|
|
{
|
|
_fileLib.~FileLibClass();
|
|
}
|
|
|
|
int32_t ParmsLibClass::read(uint16_t pnum)
|
|
{
|
|
_printMessage("Read parm %d.\n", pnum);
|
|
return parm[pnum];
|
|
}
|
|
|
|
void ParmsLibClass::factoryReset(void)
|
|
{
|
|
//_printMessage("Setting factory parms.\n");
|
|
displayText("Parm Restore");
|
|
Serial.println("Setting factory parms.\n");
|
|
|
|
|
|
uint16_t parmLimitSize = sizeof(parmlimits) / sizeof(parmlimits[0]);
|
|
// skip 0 for checksum
|
|
for (int i = 1; i < parmLimitSize; i++)
|
|
{
|
|
// skip serial number
|
|
if (i != 64)
|
|
{
|
|
if (parmlimits[i][3] == 1)
|
|
{
|
|
parm[i] = parmlimits[i][0];
|
|
}
|
|
}
|
|
}
|
|
|
|
parm[0] = _calcChecksum();
|
|
|
|
// save to FS
|
|
saveToFS();
|
|
|
|
_printMessage("CheckSum: %d\n", parm[0]);
|
|
delay(2000);
|
|
}
|
|
|
|
bool ParmsLibClass::write(uint16_t pnum, int32_t pdat)
|
|
{
|
|
_printMessage("Write parm %d = %d.\n", pnum, pdat);
|
|
int csi, csi2;
|
|
if ((pnum == 1) && (pdat == 255))
|
|
{
|
|
factoryReset();
|
|
return true;
|
|
}
|
|
|
|
if ((pnum == 1) && (pdat == 253))
|
|
{
|
|
// esp_task_wdt_init(180, true); //enable panic so ESP32 restarts 180 seconds
|
|
updateFromFS();
|
|
return true;
|
|
}
|
|
|
|
if ((pnum == 1) && (pdat == 1234)) // v509
|
|
{
|
|
parm[76] = getEpochRtc();
|
|
saveToFS();
|
|
return true;
|
|
}
|
|
|
|
if ((pnum == 1) && (pdat == 252)) // v509
|
|
{
|
|
displayText("WDT TEST LONG");
|
|
delay(6000);
|
|
displayText("WDT TEST SHORT");
|
|
tone(HEARTBEATLED, 100, 500); // set wdog timeout to 2 sec
|
|
delay(5000);
|
|
displayText("WDT FAILED!!!!");
|
|
delay(4000);
|
|
return true;
|
|
}
|
|
|
|
if ((pnum == 1) && (pdat == 250)) // Lidar test mode
|
|
{
|
|
displayText("LIDAR TEST");
|
|
lidarTest = 1;
|
|
return true;
|
|
}
|
|
|
|
if ((pnum == 1) && (pdat == 6014))
|
|
{
|
|
displayText("TOGGLE VB");
|
|
if (VB)
|
|
{
|
|
VB = 0;
|
|
Serial.println("Verbose OFF");
|
|
}
|
|
else
|
|
{
|
|
VB = 1;
|
|
Serial.println("Verbose ON");
|
|
}
|
|
return true;
|
|
}
|
|
|
|
if (pnum == 18) // calibrate battery voltage
|
|
{
|
|
Serial.printf("Raw Battery A2D: %d\n", analogRead(BATTERYINPUTPIN));
|
|
pdat *= 1000; // voltage * 1000
|
|
|
|
csi = 0;
|
|
for (csi2 = 0; csi2 < 20; csi2++)
|
|
csi += analogRead(BATTERYINPUTPIN);
|
|
csi /= 20;
|
|
|
|
if (csi == 0)
|
|
csi = 1;
|
|
pdat /= csi;
|
|
}
|
|
|
|
// don't write parm 33(exercise mode) to SD, its set to 0 on boot
|
|
if (pnum == 33)
|
|
{
|
|
parm[pnum] = pdat;
|
|
return true;
|
|
}
|
|
|
|
if (!_qualify(pnum, pdat))
|
|
{
|
|
_printMessage("Parm %d with value %d is out of range.\n", pnum, pdat);
|
|
return false;
|
|
}
|
|
if (pnum == 1)
|
|
if ((pdat < 5) || (pdat == 100))
|
|
{}
|
|
else
|
|
return true;
|
|
|
|
parm[pnum] = pdat;
|
|
// update checksum
|
|
parm[0] = _calcChecksum();
|
|
// now write to SD
|
|
saveToFS();
|
|
return true;
|
|
|
|
}
|
|
|
|
//*******************************************************
|
|
//
|
|
//*******************************************************
|
|
|
|
bool ParmsLibClass::saveToFS(char *filename)
|
|
{
|
|
_printMessage("Writing parms to FS.\n");
|
|
_qualifyAll();
|
|
if (!_fileLib.write(filename, reinterpret_cast<uint8_t *>(parm), sizeof(parm)))
|
|
{
|
|
_printMessage("Failed to write parms to FS.\n");
|
|
return false;
|
|
}
|
|
return true;
|
|
}
|
|
|
|
bool ParmsLibClass::loadFromFS(char *filename)
|
|
{
|
|
_printMessage("Setting parms from FS.\n");
|
|
memset(parm, 0, sizeof(parm));
|
|
if (!_fileLib.read(filename, reinterpret_cast<uint8_t *>(parm), sizeof(parm)))
|
|
{
|
|
_printMessage("Failed to read parms from FS.\n");
|
|
factoryReset();
|
|
return false;
|
|
}
|
|
|
|
int32_t checkSum = _calcChecksum();
|
|
if (checkSum != parm[0])
|
|
{
|
|
_printMessage("Error checksum mismatch. Expected %d, got %d.\n", parm[0], checkSum);
|
|
factoryReset();
|
|
return false;
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
bool ParmsLibClass::_qualify(uint16_t pnum, int32_t pdat)
|
|
{
|
|
_printMessage("Qualifying parm %d with value %d.\n", pnum, pdat);
|
|
uint16_t parmLimitSize = sizeof(parmlimits) / sizeof(parmlimits[0]);
|
|
// qualify parms min/max
|
|
if(pnum > PARMSIZE) // disallow write to an non-existant parm
|
|
return false;
|
|
|
|
if (pnum > parmLimitSize) // allow any data if parm number is outside of limit table
|
|
{
|
|
return true;
|
|
}
|
|
|
|
if (pdat >= parmlimits[pnum][1])
|
|
{
|
|
if (pdat <= parmlimits[pnum][2])
|
|
{
|
|
return true;
|
|
}
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
void ParmsLibClass::_qualifyAll(void)
|
|
{
|
|
uint16_t parmLimitSize = sizeof(parmlimits) / sizeof(parmlimits[0]);
|
|
for (uint16_t i = 1; i < parmLimitSize; i++)
|
|
{
|
|
if (!_qualify(i, parm[i]))
|
|
{
|
|
parm[i] = parmlimits[i][0];
|
|
}
|
|
}
|
|
}
|
|
|
|
int32_t ParmsLibClass::_calcChecksum(void)
|
|
{
|
|
int32_t checkSum = 0;
|
|
uint16_t parmLimitSize = sizeof(parmlimits) / sizeof(parmlimits[0]);
|
|
// skip 0 for checksum
|
|
for (uint16_t i = 1; i < parmLimitSize; i++)
|
|
{
|
|
checkSum += parm[i];
|
|
}
|
|
return checkSum;
|
|
}
|
|
|
|
void ParmsLibClass::_printMessage(const char *message, ...)
|
|
{
|
|
if (_verbose)
|
|
{
|
|
char buffer[256];
|
|
|
|
va_list args;
|
|
va_start(args, message);
|
|
vsnprintf(buffer, sizeof(buffer), message, args);
|
|
va_end(args);
|
|
Serial.printf("ParmsLibClass:: %s", buffer);
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
void SD_LogWrite(char *str)
|
|
{
|
|
return;
|
|
|
|
char lstr[80];
|
|
char tstr[80];
|
|
String St;
|
|
|
|
Serial.println("Writing Log");
|
|
displayText("Writing Log");
|
|
|
|
St = makeTimeStr();
|
|
St.toCharArray(tstr, 80);
|
|
sprintf(lstr, "%s -> %s\n", tstr, str);
|
|
|
|
Serial.print("Log: ");
|
|
Serial.println(lstr);
|
|
|
|
}
|
|
|
|
void qualifyParms(void)
|
|
{
|
|
int i;
|
|
// qualify parms min/max
|
|
for (i = 1; i < (PARMSIZE - 1); i++)
|
|
{
|
|
if (parm[i] < parmlimits[i][1])
|
|
parm[i] = parmlimits[i][1];
|
|
if (parm[i] > parmlimits[i][2])
|
|
parm[i] = parmlimits[i][2];
|
|
}
|
|
}
|