Files
ESPNowESK8/src/settings.h
2024-05-18 15:35:43 +02:00

269 lines
6.2 KiB
C

uint8_t currentSetting = 0;
#define SETTINGS_COUNT 8
#define pageDisplay 0
#define limitMode 1
#define fanOveride 2
#define wheelDiameter 3 // Speed factor
#define lightMode 4
#define minHallValue 5
#define centerHallValue 6
#define maxHallValue 7
int settings[SETTINGS_COUNT];
uint8_t boardOptions = 0b00000000;
// Map:(LightActive, Fan, LightMode) XXXAFFLL
/*
float gearRatio;
float ratioRpmSpeed;
float ratioPulseDistance;
*/
// Defining variables for Settings menu
bool changeSelectedSetting = false;
bool settingsLoopFlag = false;
bool settingsChangeFlag = false;
bool settingsChangeValueFlag = false;
const char *settingPages[SETTINGS_COUNT] = {
"Page Display",
"LimitMode",
"CTRL Mode", // OLD FAN OVERRIDE
"Wheel diameter",
"Light Mode",
"Throttle Min",
"Throttle Center",
"Throttle Max"};
// Setting rules format: default, min, max.
int settingRules[SETTINGS_COUNT][3]{
{0, 0, 3}, // page: 0 cycle, 1 speed, 2 volt, 3 temp
{0, 0, 1}, // limit default is no limit
{0, 0, 2}, // fan 0 no, 1 on, 2 off // CTRL Mode 0 and 1 vlt 2 is torq
{83, 0, 250}, // wheel mm
{0, 0, 3}, // LightMode
{HAL_MIN, 1000, 3000},
{HAL_CENTER, 1000, 3000},
{HAL_MAX, 1000, 3000}};
/*
const char *settingAliases[SETTINGS_COUNT] = {
"Off", "ON"
"Auto", "Off", "On",
//"Wheel diameter",
//"Throttle Min",
//"Throttle Center",
//"Throttle Max"
};
*/
// Check if an integer is within a min and max value
bool inRange(int val, int minimum, int maximum)
{
return ((minimum <= val) && (val <= maximum));
}
void updateBoardOptions()
{
boardOptions = 0;
boardOptions |= (uint8_t)settings[fanOveride] << 2;
boardOptions |= boardOptions | (uint8_t)lightActive << 3;
boardOptions |= boardOptions | (uint8_t)settings[lightMode];
DEBUG_PRINT("board: ");
DEBUG_PRINTLN(boardOptions);
}
void updateSettings()
{
preferences.begin("remote-set", false);
for (int i = 0; i < SETTINGS_COUNT; i++)
{
preferences.putInt(settingPages[i], settings[i]);
}
preferences.end();
DEBUG_PRINTLN("UPDATED");
preferences.begin("remote-set", false);
DEBUG_PRINTLN(preferences.getInt(settingPages[0], 0));
preferences.end();
// calculateRatios();
updateBoardOptions();
}
void setDefaultSettings()
{
for (int i = 0; i < SETTINGS_COUNT; i++)
{
settings[i] = settingRules[i][0];
}
updateSettings();
}
void loadSettings()
{
preferences.begin("remote-set", false);
for (int i = 0; i < SETTINGS_COUNT; i++)
{
settings[i] = preferences.getInt(settingPages[i], settingRules[i][0]); // retrieve default value
}
preferences.end();
bool rewriteSettings = false;
// Loop through all settings to check if everything is fine
for (int i = 0; i < SETTINGS_COUNT; i++)
{
int val = settings[i];
if (!inRange(val, settingRules[i][1], settingRules[i][2]))
{
// Setting is damaged or never written. Rewrite default.
rewriteSettings = true;
settings[i] = settingRules[i][0];
}
}
if (rewriteSettings == true)
{
updateSettings();
}
else
{
// Calculate constants
// calculateRatios();
updateBoardOptions();
}
}
void drawSettingsMenu()
{
// Position on OLED
int x = 0;
int y = 10;
// Draw setting title
displayString = settingPages[currentSetting];
displayString.toCharArray(displayBuffer, displayString.length() + 1);
u8g2.setFont(u8g2_font_profont12_tr);
u8g2.drawStr(x, y, displayBuffer);
int val = settings[currentSetting];
displayString = (String)val + ""; //+ settingPages[currentSetting][1];
displayString.toCharArray(displayBuffer, displayString.length() + 1);
u8g2.setFont(u8g2_font_10x20_tr);
if (changeSelectedSetting == true)
{
u8g2.drawStr(x + 10, y + 20, displayBuffer);
}
else
{
u8g2.drawStr(x, y + 20, displayBuffer);
}
}
void drawSettingNumber()
{
// Position on OLED
int x = 2;
int y = 10;
// Draw current setting number box
u8g2.drawRFrame(x + 102, y - 10, 22, 32, 4);
// Draw current setting number
displayString = (String)(currentSetting + 1);
displayString.toCharArray(displayBuffer, displayString.length() + 1);
u8g2.setFont(u8g2_font_profont22_tn);
u8g2.drawStr(x + 108, 22, displayBuffer);
}
/*
// Update values used to calculate speed and distance travelled.
void calculateRatios() {
// Defining variables for speed and distance calculation
gearRatio = (float)remoteSettings.motorPulley / (float)remoteSettings.wheelPulley;
ratioRpmSpeed = (gearRatio * 60 * (float)remoteSettings.wheelDiameter * 3.14156) / (((float)remoteSettings.motorPoles / 2) * 1000000); // ERPM to Km/h
ratioPulseDistance = (gearRatio * (float)remoteSettings.wheelDiameter * 3.14156) / (((float)remoteSettings.motorPoles * 3) * 1000000); // Pulses to km travelled
}
*/
void controlSettingsMenu()
{
if (triggerActive())
{
if (settingsChangeFlag == false)
{
// Save settings
if (changeSelectedSetting == true)
{
updateSettings();
}
changeSelectedSetting = !changeSelectedSetting;
settingsChangeFlag = true;
}
}
else
{
settingsChangeFlag = false;
}
if (hallMeasurement >= (settings[maxHallValue] - 250) && settingsLoopFlag == false)
{
// Up
if (changeSelectedSetting == true)
{
int val = settings[currentSetting] - 1;
if (inRange(val, settingRules[currentSetting][1], settingRules[currentSetting][2]))
{
settings[currentSetting] = val;
settingsLoopFlag = true;
}
}
else
{
if (currentSetting != 0)
{
currentSetting--;
settingsLoopFlag = true;
}
}
}
else if (hallMeasurement <= (settings[minHallValue] + 250) && settingsLoopFlag == false)
{
// Down
if (changeSelectedSetting == true)
{
int val = settings[currentSetting] + 1;
if (inRange(val, settingRules[currentSetting][1], settingRules[currentSetting][2]))
{
settings[currentSetting] = val;
settingsLoopFlag = true;
}
}
else
{
if (currentSetting < (SETTINGS_COUNT - 1))
{
currentSetting++;
settingsLoopFlag = true;
}
}
}
else if (inRange(hallMeasurement, settings[centerHallValue] - 50, settings[centerHallValue] + 50))
{
settingsLoopFlag = false;
}
}