212 lines
5.6 KiB
C
212 lines
5.6 KiB
C
|
uint8_t currentSetting = 0;
|
||
|
#define SETTINGS_COUNT 7
|
||
|
|
||
|
#define limitMode 0
|
||
|
#define fanOveride 1
|
||
|
#define wheelDiameter 2 // Speed factor
|
||
|
#define minHallValue 3
|
||
|
#define centerHallValue 4
|
||
|
#define maxHallValue 5
|
||
|
|
||
|
int settings[SETTINGS_COUNT];
|
||
|
|
||
|
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] = {
|
||
|
"LimitMode",
|
||
|
"FanOveride",
|
||
|
"TriggerMode",
|
||
|
"Wheel diameter",
|
||
|
"Throttle Min",
|
||
|
"Throttle Center",
|
||
|
"Throttle Max"
|
||
|
};
|
||
|
|
||
|
// Setting rules format: default, min, max.
|
||
|
int settingRules[SETTINGS_COUNT][3] {
|
||
|
{0, 0, 1}, // default is no limit
|
||
|
{0, 0, 2}, // 0 no, 1 on, 2 off
|
||
|
{0, 0, 3}, // 0 Killswitch, 1 cruise & 2 data toggle
|
||
|
{83, 0, 250}, // wheel mm
|
||
|
{HAL_MIN, 1000, 2000},
|
||
|
{HAL_CENTER, 1000, 2000},
|
||
|
{HAL_MAX, 1000, 2000}
|
||
|
};
|
||
|
/*
|
||
|
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 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();
|
||
|
}
|
||
|
|
||
|
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();
|
||
|
}
|
||
|
}
|
||
|
|
||
|
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 >= (HAL_MAX - 250) && settingsLoopFlag == false) { //settings[maxHallValue]
|
||
|
// 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 <= (HAL_MIN + 250) && settingsLoopFlag == false) { //settings[minHallValue]
|
||
|
// 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, HAL_CENTER - 50, HAL_CENTER + 50)) { // settings[centerHallValue]
|
||
|
settingsLoopFlag = false;
|
||
|
}
|
||
|
}
|