Upload files to "/"

This commit is contained in:
avery.babka 2025-07-25 14:06:16 -05:00
parent ae8af439c2
commit da8e241e53
5 changed files with 707 additions and 0 deletions

268
Parms_ADI.h Normal file
View File

@ -0,0 +1,268 @@
#ifndef Parms_ADI
#define Parms_ADI 1
#define PARMSIZE 140
int32_t parm[PARMSIZE];
int32_t tempParm[PARMSIZE]; // used to store parms of slave unit
int32_t remoteParm[PARMSIZE];
const int32_t parmlimits[][6] = // default, min, max, 1 = allow-default, 1 = needs-unlock-code
{
{0, 0, 2653999, 0, 0, 0}, // 0 Checksum
{0, 0, 2653999, 1, 0, 0}, // 1 Adnet address 0 = single door master, 100 = slave
{10, 0, 100, 1, 0, 0}, // 2 Gasket Delay
{10, 0, 10000, 1, 0, 0}, // 3 Bug Screen Button Time seconds * 10
{1, 0, 10000, 1, 0, 0}, // 4 Use Obstruction Sensor
{600, 0, 10000, 1, 0, 0}, // 5 Door Open Travel Timeout
{600, 1, 10000, 1, 0, 0}, // 6 Door Close Jog Limit -time from open to hit upper switch
{-6, -12, 12, 1, 0, 0}, // 7 Time Zone
{0, 0, 10000, 1, 0, 0}, // 8 Security Code Access
{0, 0, 1, 1, 0, 0}, // 9 Enable WiFi
{115, 0, 10000, 1, 0, 0}, // 10 Lo Battery voltage *10 / 0 = off
{0, 0, 10000, 0, 0, 0}, // 11 Open counter
{0, 0, 100000, 1, 0, 0}, // 12 auto setup script
{0, 0, 10000, 1, 0, 0}, // 13 0 = 2.4" Display, 1 = 5" Display
{0, 0, 10000, 0, 1, 0}, // 14 Store FIRMWARE Version Here
{1, 0, 15, 1, 0, 0}, // 15 bug screen channel
{0, 0, 10000, 1, 0, 0}, // 16 use SPARE relay for lock circuit ENERGIZE to UNLOCK
{1, 0, 10000, 1, 0, 0}, // 17
{1253, 0, 10000, 1, 0, 0}, // 18 batteryvoltage cal
{0, 0, 10000, 1, 0, 0}, // 19 number of 5" displays at address 181+
{0, 0, 10000, 1, 0, 0}, // 20 number of 2" displays at address 191+
{0, 0, 10000, 1, 0, 0}, // 21 number of motor controls at address 200+
{5, 1, 10000, 1, 0, 0}, // 22 WiFi service timer
{800, 200, 10000, 1, 0, 0}, // 23 WiFi Update timer
{0, 0, 10000, 0, 0, 0}, // 24 set to 1 to use NC interlock on spare 1
{0, 0, 2, 1, 0, 0}, // 25 #io expanders
{0, 0, 10000, 1, 0, 0}, // 26 ioExpander #0 remote open/close button mode -optos 0 and 1
{190, 0, 240, 1, 0, 0}, // 27 motor max current * 10
{0, 0, 10000, 1, 0, 538}, // 28 use ioExpander relays for Somfy screen control
{0, 0, 10000, 1, 0, 538}, // 29 splash screen timeout to blank screen 0 = off 1 = on
{30, 20, 10000, 1, 0, 538}, // 30 timeout for start motor
{10, 5, 10000, 1, 0, 538}, // 31 timeout for running motor
{0, 0, 10000, 1, 0, 0}, // 32
{0, 0, 20000, 1, 0, 0}, // 33 time between cycles for exercise mode / seconds * 10
{0, 0, 10000, 1, 0, 0}, // 34
{0, 0, 10000, 1, 0, 0}, // 35
{0, 0, 10000, 1, 0, 0}, // 36
{0, 0, 10000, 1, 0, 0}, // 37
{0, 0, 10000, 1, 0, 0}, // 38
{10, 0, 10000, 1, 0, 0}, // 39 Learned close position
{2000, 100, 10000, 1, 0, 0}, // 40 Learned open position
{5, 0, 10000, 1, 0, 0}, // 41 SYNC Inteval
{100, 0, 10000, 1, 0, 0}, // 42 SYNC Integral
{50, 0, 10000, 1, 0, 0}, // 43 SYNC Proportional
{200, 0, 10000, 1, 0, 0}, // 44 MAX_DELTA
{250, 0, 10000, 1, 0, 0}, // 45 MAX_CURRENT
{50, 0, 10000, 1, 0, 0}, // 46 MOTOR_SPEED
{3000, 0, 10000, 1, 0, 0}, // 47 EXTEND_LIMIT
{0, -10000, 10000, 1, 0, 0}, // 48 SLAVE OFFSET
{0, -1000, 1000, 1, 0, 0}, // 49 setCurrentBalance open
{0, -1000, 1000, 1, 0, 0}, // 50 setCurrentBalance close
{0, 0, 10000, 1, 0, 0}, // 51
{0, 0, 10000, 1, 0, 538}, // 52 number of slaves
{0, 0, 10000, 1, 0, 0}, // 53
{0, 0, 10000, 1, 0, 0}, // 54 Use Lidar
{0, 0, 10000, 1, 0, 0}, // 55 Lidar parm 2 door height
{0, 0, 10000, 1, 0, 0}, // 56 Lidar parm 3 door width
{0, 0, 10000, 1, 0, 0}, // 57 Lidar parm 4 deadband
{5, 0, 10000, 1, 0, 0}, // 58 Lidar parm 5 debounce count
{0, 0, 10000, 1, 0, 0}, // 59 Lidar parm 6 mounting angle
{0, 0, 10000, 1, 0, 0}, // 60 Lidar parm 7 run mode
{0, 0, 10000, 1, 0, 0}, // 61
{0, 0, 10000, 1, 0, 0}, // 62
{0, 0, 10000, 1, 0, 0}, // 63
{2002, 3, 9000000, 0, 1, 0}, // 64 serial# stored here.. not included in factory default set
{400, 0, 10000, 1, 0, 0}, // 65 Lidar down from open deadband
{300, 0, 10000, 1, 0, 0}, // 66 Lidar up from closed deadband
{0, 0, 10000, 1, 0, 538}, // 67 splash screen timeout to blank screen 0 = off 1 = on
{0, 0, 10000, 1, 0, 0}, // 68
{0, 0, 999999999, 1, 0, 0}, // 69 temp storage of last rtc set
{0, 0, 999999999, 1, 0, 0}, // 70
{0, 0, 999999999, 1, 0, 0}, // 71
{0, 0, 999999999, 1, 0, 0}, // 72
{0, 0, 999999999, 1, 0, 0}, // 73
{0, 0, 999999999, 1, 0, 0}, // 74
{1, 1, 1, 1, 0, 0}, // 75 Device type
{0, 0, 2147000000, 1, 0, 0}, // 76 Last Service time
{0, 0, 999999999, 1, 0, 0}, // 77
{0, 0, 999999999, 1, 0, 0}, // 78
{0, 0, 999999999, 1, 0, 0}, // 79
{0, 0, 999999999, 1, 0, 0}, // 80
{0, 0, 999999999, 1, 0, 0}, // 81
{0, 0, 999999999, 1, 0, 0}, // 82
{0, 0, 999999999, 1, 0, 0}, // 83
{0, 0, 999999999, 1, 0, 0}, // 84
{0, 0, 999999999, 1, 0, 0}, // 85
{0, 0, 999999999, 1, 0, 0}, // 86
{0, 0, 999999999, 1, 0, 0}, // 87
{0, 0, 999999999, 1, 0, 0}, // 88
{0, 0, 999999999, 1, 0, 0}, // 89
{0, 0, 999999999, 1, 0, 0}, // 90
{0, 0, 999999999, 1, 0, 0}, // 91
{0, 0, 999999999, 1, 0, 0}, // 92
{0, 0, 999999999, 1, 0, 0}, // 93
{0, 0, 999999999, 1, 0, 0}, // 94
{0, 0, 999999999, 1, 0, 0}, // 95
{0, 0, 999999999, 1, 0, 0}, // 96
{0, 0, 999999999, 1, 0, 0}, // 97
{0, 0, 999999999, 1, 0, 0}, // 98
{0, 0, 999999999, 1, 0, 0}, // 99
{0, 0, 999999999, 1, 0, 0}, // 100
{10, 0, 500, 1, 0, 0}, // 101 Clarity advertising repeat count v534
{0, 0, 999999999, 1, 0, 0}, // 102
{0, 0, 999999999, 1, 0, 0}, // 103
{0, 0, 999999999, 1, 0, 0}, // 104
{0, 0, 999999999, 1, 0, 0}, // 105
{0, 0, 999999999, 1, 0, 0}, // 106
{0, 0, 999999999, 1, 0, 0}, // 107
{0, 0, 999999999, 1, 0, 0}, // 108
{0, 0, 999999999, 1, 0, 0}, // 109
{0, 0, 999999999, 1, 0, 0}, // 110
{0, 0, 999999999, 1, 0, 0}, // 111
{0, 0, 999999999, 1, 0, 0}, // 112
{0, 0, 999999999, 1, 0, 0}, // 113
{0, 0, 999999999, 1, 0, 0}, // 114
{0, 0, 999999999, 1, 0, 0}, // 115
{0, 0, 999999999, 1, 0, 0}, // 116
{0, 0, 999999999, 1, 0, 0}, // 117
{0, 0, 999999999, 1, 0, 0}, // 118
{0, 0, 999999999, 1, 0, 0}, // 119
{0, 0, 999999999, 1, 0, 0}, // 120
{0, 0, 999999999, 1, 0, 0}, // 121
{0, 0, 999999999, 1, 0, 0}, // 122
{0, 0, 999999999, 1, 0, 0}, // 123
{0, 0, 999999999, 1, 0, 0}, // 124
{0, 0, 999999999, 1, 0, 0}, // 125
{0, 0, 999999999, 1, 0, 0}, // 126
{0, 0, 999999999, 1, 0, 0}, // 127
{0, 0, 999999999, 1, 0, 0}, // 128
{0, 0, 999999999, 1, 0, 0}, // 129
{0, 0, 999999999, 1, 0, 0}, // 130
{0, 0, 999999999, 1, 0, 0}, // 131
{0, 0, 999999999, 1, 0, 0}, // 132
{0, 0, 999999999, 1, 0, 0}, // 133
{0, 0, 999999999, 1, 0, 0}, // 134
{0, 0, 999999999, 1, 0, 0}, // 135
{0, 0, 999999999, 1, 0, 0}, // 136
{0, 0, 999999999, 1, 0, 0}, // 137
{0, 0, 999999999, 1, 0, 0}, // 138
{0, 0, 999999999, 1, 0, 0}, // 139
};
#endif
/*
if 255, factory default,
// if 19315, set serial to parm 22
// if 6911, set RLY08 at address 1 to parm 22 valid numbers are 2-4
// if 257, ssid = ADITEST, pass = 12345678
// if 6011, OTA
// if 6013, Sensor screen
// if 6012, Timer screen
// if 6014, Toggle VB
*/
#ifndef PARMS_LIB_H
#define PARMS_LIB_H
#include "FileLib.h"
class ParmsLibClass
{
private:
/**
* File system
*/
FileLibClass &_fileLib;
/**
* Verbose mode flag
*/
bool _verbose = false;
/**
* Qualify a single parm
* @param pnum Index of the parm to qualify
* @param pdat Value to qualify
*
* @return true if parm is valid
*/
bool _qualify(uint16_t pnum, int32_t pdat);
/**
* Qualify all parms and set parm to default if invalid
*/
void _qualifyAll(void);
/**
* Print out message, if verbose mode is enabled
*/
void _printMessage(const char *message, ...);
/**
* Calculate the checksum
*
* @return Checksum value
*/
int32_t _calcChecksum(void);
public:
/**
* Constructor
*/
ParmsLibClass(FileLibClass &fileLib) : _fileLib(fileLib){};
/**
* Destructor
*/
~ParmsLibClass();
/**
* Set verbose mode
* @param verbose true to enable verbose mode
*/
void setVerbose(bool verbose) { _verbose = verbose; }
/**
* Read parm
* @param pnum Index of the parm to read
*
* @returns Value at the parm index
*/
int32_t read(uint16_t pnum);
/**
* Write parm
* @param pnum Index of the parm to write
* @param pdat Value to write
*
* @return true if successful
*/
bool write(uint16_t pnum, int32_t pdat);
/**
* Set factory parms
*/
void factoryReset(void);
/**
* Read from FS
* @param filename Optional, default "/PARMS.ADI". Filename to write to.
*
* @return true if successful
*/
bool loadFromFS(char *filename = "/PARMS.ADI");
/**
* Write to FS
* @param filename Optional, default "/PARMS.ADI". Filename to write to.
*
* @return true if successful
*/
bool saveToFS(char *filename = "/PARMS.ADI");
};
#endif

281
Parms_ADI.ino Normal file
View File

@ -0,0 +1,281 @@
#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];
}
}

6
platformio.ini Normal file
View File

@ -0,0 +1,6 @@
[env:esp32dev]
platform = espressif32
board = esp32dev
framework = arduino
build_flags = -v
build_dir = ./

19
printControl.h Normal file
View File

@ -0,0 +1,19 @@
#ifndef PRINT_H
#define PRINT_H
char printBuff[200];
#define _DEBUG_CAN 1
// define _DEBUG_SYNC 1
#define _DEBUG_MOTOR 1
bool vbCAN;
bool vbSync;
bool vb = 1;
bool vbCSV;
void printStartOfRun();
void printEndOfRun();
void printEndOfRunCSV();
void printPosition(void);
void printPrint(); // dump print buffer to serial port
#endif // PRINT_H

133
printControl.ino Normal file
View File

@ -0,0 +1,133 @@
#include "printControl.h"
// printing variables
void printPrint()
{
if (vb || vbCSV)
{
strcat(printBuff, "\r\n");
Serial.print(printBuff);
}
}
void printStartOfRun()
{
if (vbCSV == 1)
{
startMaster = mStatus[MASTER].bits.position;
startSlave = mStatus[SLAVE].bits.position;
return;
}
strcpy(printBuff, "****** Motor Start ");
if (motorDir == EXTEND)
strcat(printBuff, "Extend *****");
else
strcat(printBuff, "Retract *****");
printPrint();
if (bSyncEnable == 1)
strcpy(printBuff, "Sync Enabled");
else
strcpy(printBuff, "Sync Disabled");
printPrint();
if (cycleMax > 0)
{
sprintf(printBuff, "***** Start cycle %d of %d\r\n", (cycleMax - cycleCount), cycleMax);
printPrint();
}
sprintf(printBuff, "Position M:%04u S:%04u",
mStatus[MASTER].bits.position, mStatus[SLAVE].bits.position);
printPrint();
sprintf(printBuff, "Integral %u Proportional %u Update Rate %u\r\n",
parm[P_MOTOR_ADJ_I], parm[P_MOTOR_ADJ_P], parm[P_MOTOR_ADJ_INTERVAL]);
printPrint();
sprintf(printBuff, "Master Speed %u", masterSpeed);
printPrint();
if (vbSync)
{
sprintf(printBuff, "Delt MPOS SPOS INTG DxP +I +M1 M2 MS SS MA SA");
printPrint();
}
}
void printEndOfRun()
{
if (vbCSV)
{
printEndOfRunCSV();
return;
}
sprintf(printBuff, "*** End of Run ");
if (motorDir == EXTEND)
strcat(printBuff, "Extend");
else
strcat(printBuff, "Retract");
printPrint();
if (cycleCount > 0)
{
sprintf(printBuff, "Cycle %d", cycleMax - cycleCount);
printPrint();
}
sprintf(printBuff, "Position M:%04u S:%04u",
mStatus[MASTER].bits.position, mStatus[SLAVE].bits.position);
printPrint();
sprintf(printBuff, "Delta Max %d Min %d", maxDelta, minDelta);
printPrint();
sprintf(printBuff, "Speed Master %u Max Slave %u",
masterSpeed, maxSpeed);
printPrint();
sprintf(printBuff, "Max Current M-%d S-%d",
maxCurrentM, maxCurrentS);
printPrint();
sprintf(printBuff, "\r\nRun Time %d.%1d", runTime / 1000, runTime % 1000);
printPrint();
if (motorError != MOTOR_ERROR_NONE)
{
sprintf(printBuff, "Motor Error:%u", motorError);
printPrint();
cycleCount = 0;
}
if (vbSync)
printPosition();
}
// Print run data in a CSV Format
// Cycle count,masterStartPosition, master End, slave start, slave end, min delta, max delta,
// master speed, max slave speed, master current, slave current, runtime
void printEndOfRunCSV()
{
char c;
if (startMaster > mStatus[MASTER].bits.position)
c = 'R';
else
c = 'E';
sprintf(printBuff, "%u,%c,%u,%u,%u,%u,%d,%d,%u,%u,%u,%u,%d.%1d",
(cycleMax - cycleCount), c,
startMaster, mStatus[MASTER].bits.position,
startSlave, mStatus[SLAVE].bits.position,
minDelta, maxDelta,
masterSpeed, maxSpeed,
maxCurrentM, maxCurrentS,
runTime / 1000, runTime % 1000);
printPrint();
}
void printPosition(void)
{
sprintf(printBuff, "M:%04u S:%04u D:%04d\r\n",
mStatus[MASTER].bits.position,
mStatus[SLAVE].bits.position,
(mStatus[MASTER].bits.position - mStatus[SLAVE].bits.position));
printPrint();
}