Adding Quick selection, light, proper mode definitions and CRUISE MODE
This commit is contained in:
parent
1c948c7070
commit
af0e105366
230
src/remote.cpp
230
src/remote.cpp
@ -22,7 +22,24 @@ Preferences preferences;
|
|||||||
|
|
||||||
uint8_t boardData[6] = {0, 0, 0, 0, 0, 0};
|
uint8_t boardData[6] = {0, 0, 0, 0, 0, 0};
|
||||||
|
|
||||||
//#define DEBUG
|
#define M_NORMAL 0 // Limit is a sub of normal
|
||||||
|
#define M_SELECT 1
|
||||||
|
#define M_SETTINGS 2
|
||||||
|
#define M_CRUISE 3
|
||||||
|
#define M_STEERING 4
|
||||||
|
|
||||||
|
//#define steeringInfluential
|
||||||
|
|
||||||
|
uint8_t currentMode = M_NORMAL;
|
||||||
|
uint8_t selectedIndex = 2;
|
||||||
|
|
||||||
|
bool lightActive = false;
|
||||||
|
bool shouldUpdateSettings = false; // Needed to update limitmode on core 1 instead of 0
|
||||||
|
|
||||||
|
bool crusing = false;
|
||||||
|
uint8_t crusingSpeed = 127;
|
||||||
|
|
||||||
|
#define DEBUG
|
||||||
|
|
||||||
#ifdef DEBUG
|
#ifdef DEBUG
|
||||||
#define DEBUG_PRINTLN(x) Serial.println(x)
|
#define DEBUG_PRINTLN(x) Serial.println(x)
|
||||||
@ -48,9 +65,6 @@ unsigned long lastSignalBlink;
|
|||||||
bool signalBlink = false;
|
bool signalBlink = false;
|
||||||
unsigned long lastDataRotation;
|
unsigned long lastDataRotation;
|
||||||
|
|
||||||
bool beginnerMode = false; // TODO: moved to setting
|
|
||||||
bool steeringMode = false;
|
|
||||||
|
|
||||||
|
|
||||||
// Defining variables for Hall Effect throttle.
|
// Defining variables for Hall Effect throttle.
|
||||||
short hallMeasurement;
|
short hallMeasurement;
|
||||||
@ -60,8 +74,8 @@ uint8_t esc2 = 127;
|
|||||||
|
|
||||||
byte hallCenterMargin = 5;
|
byte hallCenterMargin = 5;
|
||||||
|
|
||||||
const float minVoltage = 3.4;
|
const float minVoltage = 2.9; // These values are heavily strange since the devider is not working nicely yet...
|
||||||
const float maxVoltage = 4.1;
|
const float maxVoltage = 3.6;
|
||||||
const float refVoltage = 3.3;
|
const float refVoltage = 3.3;
|
||||||
// Resistors in Ohms
|
// Resistors in Ohms
|
||||||
const float deviderR1 = 1500;
|
const float deviderR1 = 1500;
|
||||||
@ -88,6 +102,15 @@ bool triggerActive();
|
|||||||
#include "settings.h"
|
#include "settings.h"
|
||||||
|
|
||||||
|
|
||||||
|
void setCrusing(uint8_t speed) {
|
||||||
|
if(speed < 127) { // no backward cruse!
|
||||||
|
crusing = false;
|
||||||
|
crusingSpeed = 127;
|
||||||
|
} else {
|
||||||
|
crusing = true;
|
||||||
|
if(speed > crusingSpeed) crusingSpeed = speed;
|
||||||
|
}
|
||||||
|
}
|
||||||
// ESPNOW functions ##############################
|
// ESPNOW functions ##############################
|
||||||
// Scan for boards in AP mode
|
// Scan for boards in AP mode
|
||||||
|
|
||||||
@ -237,6 +260,7 @@ void sendData() {
|
|||||||
DEBUG_PRINT("Sending: "); DEBUG_PRINTLN(esc1);
|
DEBUG_PRINT("Sending: "); DEBUG_PRINTLN(esc1);
|
||||||
esp_err_t result = esp_now_send(peer_addr, data, sizeof(data));
|
esp_err_t result = esp_now_send(peer_addr, data, sizeof(data));
|
||||||
DEBUG_PRINT("Send Status: ");
|
DEBUG_PRINT("Send Status: ");
|
||||||
|
if(result != ESP_OK) setCrusing(0);
|
||||||
if (result == ESP_OK) {
|
if (result == ESP_OK) {
|
||||||
DEBUG_PRINTLN("Success");
|
DEBUG_PRINTLN("Success");
|
||||||
} else if (result == ESP_ERR_ESPNOW_NOT_INIT) {
|
} else if (result == ESP_ERR_ESPNOW_NOT_INIT) {
|
||||||
@ -268,6 +292,7 @@ void OnDataSent(const uint8_t *mac_addr, esp_now_send_status_t status) {
|
|||||||
} else {
|
} else {
|
||||||
connected = false;
|
connected = false;
|
||||||
DEBUG_PRINTLN("Delivery Fail");
|
DEBUG_PRINTLN("Delivery Fail");
|
||||||
|
setCrusing(0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -315,7 +340,7 @@ void calculateThrottlePosition() {
|
|||||||
DEBUG_PRINTLN(hallMeasurement);
|
DEBUG_PRINTLN(hallMeasurement);
|
||||||
|
|
||||||
int maxSpeed = 255;
|
int maxSpeed = 255;
|
||||||
if(settings[limitMode] == 1) maxSpeed = 190;
|
if(settings[limitMode] == 1) maxSpeed = 180;
|
||||||
|
|
||||||
if (hallMeasurement >= HAL_CENTER) {
|
if (hallMeasurement >= HAL_CENTER) {
|
||||||
throttle = c_map(hallMeasurement, HAL_CENTER, HAL_MAX, 127, maxSpeed);
|
throttle = c_map(hallMeasurement, HAL_CENTER, HAL_MAX, 127, maxSpeed);
|
||||||
@ -387,12 +412,42 @@ void checkClicks(void * parameter) {
|
|||||||
int timeSinceLastClick = millis()-lastClick;
|
int timeSinceLastClick = millis()-lastClick;
|
||||||
lastClick = millis();
|
lastClick = millis();
|
||||||
|
|
||||||
|
if(currentMode == M_SELECT) {
|
||||||
|
switch(selectedIndex) {
|
||||||
|
case 0:
|
||||||
|
currentMode = M_SETTINGS;
|
||||||
|
break;
|
||||||
|
case 1:
|
||||||
|
if(settings[limitMode] == 0) settings[limitMode] = 1;
|
||||||
|
else settings[limitMode] = 0;
|
||||||
|
shouldUpdateSettings = true;
|
||||||
|
currentMode = M_NORMAL;
|
||||||
|
break;
|
||||||
|
case 2:
|
||||||
|
lightActive = !lightActive;
|
||||||
|
currentMode = M_NORMAL;
|
||||||
|
break;
|
||||||
|
case 3:
|
||||||
|
currentMode = M_STEERING;
|
||||||
|
break;
|
||||||
|
case 4:
|
||||||
|
currentMode = M_CRUISE;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if(timeSinceLastClick < clickDiff) clickCounter++;
|
if(timeSinceLastClick < clickDiff) clickCounter++;
|
||||||
else clickCounter = 1;
|
else clickCounter = 1;
|
||||||
if(clickCounter == 3) {
|
if(clickCounter == 3) {
|
||||||
DEBUG_PRINTLN("YEAH TRIPPLE");
|
DEBUG_PRINTLN("YEAH TRIPPLE");
|
||||||
if(changeSettings) changeSettings = false;
|
|
||||||
else steeringMode = !steeringMode;
|
if(currentMode == M_NORMAL) {
|
||||||
|
currentMode = M_SELECT;
|
||||||
|
selectedIndex = 2;
|
||||||
|
} else {
|
||||||
|
currentMode = M_NORMAL;
|
||||||
|
}
|
||||||
|
|
||||||
vTaskDelay(pdMS_TO_TICKS(2000));
|
vTaskDelay(pdMS_TO_TICKS(2000));
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -430,7 +485,8 @@ void drawBatteryLevel() {
|
|||||||
void drawThrottle() {
|
void drawThrottle() {
|
||||||
int x = 0;
|
int x = 0;
|
||||||
int y = 18;
|
int y = 18;
|
||||||
|
uint8_t displayThrottle = throttle;
|
||||||
|
if(crusing) displayThrottle = crusingSpeed;
|
||||||
// Draw throttle
|
// Draw throttle
|
||||||
u8g2.drawHLine(x, y, 52);
|
u8g2.drawHLine(x, y, 52);
|
||||||
u8g2.drawVLine(x, y, 10);
|
u8g2.drawVLine(x, y, 10);
|
||||||
@ -438,14 +494,14 @@ void drawThrottle() {
|
|||||||
u8g2.drawHLine(x, y + 10, 5);
|
u8g2.drawHLine(x, y + 10, 5);
|
||||||
u8g2.drawHLine(x + 52 - 4, y + 10, 5);
|
u8g2.drawHLine(x + 52 - 4, y + 10, 5);
|
||||||
|
|
||||||
if (throttle >= 127) {
|
if (displayThrottle >= 127) {
|
||||||
int width = map(throttle, 127, 255, 0, 49);
|
int width = map(displayThrottle, 127, 255, 0, 49);
|
||||||
|
|
||||||
for (int i = 0; i < width; i++) {
|
for (int i = 0; i < width; i++) {
|
||||||
u8g2.drawVLine(x + i + 2, y + 2, 7);
|
u8g2.drawVLine(x + i + 2, y + 2, 7);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
int width = map(throttle, 0, 126, 49, 0);
|
int width = map(displayThrottle, 0, 126, 49, 0);
|
||||||
for (int i = 0; i < width; i++) {
|
for (int i = 0; i < width; i++) {
|
||||||
u8g2.drawVLine(x + 50 - i, y + 2, 7);
|
u8g2.drawVLine(x + 50 - i, y + 2, 7);
|
||||||
}
|
}
|
||||||
@ -577,18 +633,95 @@ void drawPage() {
|
|||||||
u8g2.drawStr(x + 86 + 2, y + 13, displayBuffer);
|
u8g2.drawStr(x + 86 + 2, y + 13, displayBuffer);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void controlSelect() {
|
||||||
|
if (hallMeasurement >= (HAL_MAX - 250) && settingsLoopFlag == false) { //settings[maxHallValue]
|
||||||
|
// Up
|
||||||
|
if (selectedIndex != 0) {
|
||||||
|
selectedIndex--;
|
||||||
|
settingsLoopFlag = true;
|
||||||
|
}
|
||||||
|
} else if (hallMeasurement <= (HAL_MIN + 250) && settingsLoopFlag == false) { //settings[minHallValue]
|
||||||
|
// Down
|
||||||
|
if (selectedIndex < 4) {
|
||||||
|
selectedIndex++;
|
||||||
|
settingsLoopFlag = true;
|
||||||
|
}
|
||||||
|
} else if (inRange(hallMeasurement, HAL_CENTER - 50, HAL_CENTER + 50)) { // settings[centerHallValue]
|
||||||
|
settingsLoopFlag = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
String selectionItems[5] = {
|
||||||
|
"Se","Li","B","St","Cr"
|
||||||
|
};
|
||||||
|
|
||||||
|
void drawSelectionMenu() {
|
||||||
|
const uint8_t y = 35;
|
||||||
|
const uint8_t xStart = 10;
|
||||||
|
const uint8_t xSpace = 20;
|
||||||
|
|
||||||
|
u8g2.setFontMode(0);
|
||||||
|
u8g2.setDrawColor(1);
|
||||||
|
|
||||||
|
String title = "Select Action";
|
||||||
|
title.toCharArray(displayBuffer, 20);
|
||||||
|
u8g2.setFont(u8g2_font_helvR10_tr );
|
||||||
|
u8g2.drawStr(20, 12, displayBuffer);
|
||||||
|
|
||||||
|
for(int i = 0; i < 5; i++) {
|
||||||
|
if(selectedIndex == i) {
|
||||||
|
u8g2.setFontMode(0);
|
||||||
|
u8g2.drawBox(xStart-2 + xSpace * i, y-12, 15, 15);
|
||||||
|
u8g2.setDrawColor(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
selectionItems[i].toCharArray(displayBuffer, 10);
|
||||||
|
u8g2.setFont(u8g2_font_profont12_tr);
|
||||||
|
u8g2.drawStr(xStart + xSpace * i, y, displayBuffer);
|
||||||
|
|
||||||
|
u8g2.setFontMode(0);
|
||||||
|
u8g2.setDrawColor(1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void drawLight() {
|
||||||
|
if(lightActive) {
|
||||||
|
displayString = "Light";
|
||||||
|
displayString.toCharArray(displayBuffer, 12);
|
||||||
|
u8g2.setFont(u8g2_font_profont10_tr);
|
||||||
|
u8g2.drawStr(100, 38, displayBuffer);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void drawMode() {
|
void drawMode() {
|
||||||
if(steeringMode) {
|
if(currentMode == M_STEERING) {
|
||||||
displayString = (String)esc1 + " |S| " + (String)esc2;
|
displayString = (String)esc1 + " |S| " + (String)esc2;
|
||||||
displayString.toCharArray(displayBuffer, 12);
|
displayString.toCharArray(displayBuffer, 12);
|
||||||
u8g2.setFont(u8g2_font_profont12_tr);
|
u8g2.setFont(u8g2_font_profont12_tr);
|
||||||
u8g2.drawStr(25, 50, displayBuffer);
|
u8g2.drawStr(25, 50, displayBuffer);
|
||||||
}
|
} else if(currentMode == M_NORMAL && settings[limitMode] == 1) {
|
||||||
if(settings[limitMode] == 1) {
|
|
||||||
displayString = "LIM";
|
displayString = "LIM";
|
||||||
displayString.toCharArray(displayBuffer, 12);
|
displayString.toCharArray(displayBuffer, 12);
|
||||||
u8g2.setFont(u8g2_font_profont12_tr);
|
u8g2.setFont(u8g2_font_profont12_tr);
|
||||||
u8g2.drawStr(105, 50, displayBuffer);
|
u8g2.drawStr(105, 50, displayBuffer);
|
||||||
|
} else if(currentMode == M_CRUISE) {
|
||||||
|
if(crusing) {
|
||||||
|
displayString = "ACTIVE: " + (String) crusingSpeed;
|
||||||
|
displayString.toCharArray(displayBuffer, 12);
|
||||||
|
u8g2.setFont(u8g2_font_profont12_tr);
|
||||||
|
u8g2.drawStr(0, 50, displayBuffer);
|
||||||
|
} else {
|
||||||
|
displayString = "Inactive";
|
||||||
|
displayString.toCharArray(displayBuffer, 12);
|
||||||
|
u8g2.setFont(u8g2_font_profont12_tr);
|
||||||
|
u8g2.drawStr(0, 50, displayBuffer);
|
||||||
|
}
|
||||||
|
|
||||||
|
displayString = "CRU";
|
||||||
|
displayString.toCharArray(displayBuffer, 12);
|
||||||
|
u8g2.setFont(u8g2_font_profont12_tr);
|
||||||
|
u8g2.drawStr(105, 50, displayBuffer);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -596,8 +729,9 @@ void updateMainDisplay() {
|
|||||||
|
|
||||||
u8g2.firstPage();
|
u8g2.firstPage();
|
||||||
do {
|
do {
|
||||||
|
if(currentMode == M_SELECT) {
|
||||||
if (changeSettings == true) {
|
drawSelectionMenu();
|
||||||
|
} else if (currentMode == M_SETTINGS) {
|
||||||
drawSettingsMenu();
|
drawSettingsMenu();
|
||||||
drawSettingNumber();
|
drawSettingNumber();
|
||||||
} else {
|
} else {
|
||||||
@ -605,6 +739,7 @@ void updateMainDisplay() {
|
|||||||
drawPage();
|
drawPage();
|
||||||
drawBatteryLevel();
|
drawBatteryLevel();
|
||||||
drawSignal();
|
drawSignal();
|
||||||
|
drawLight();
|
||||||
drawMode();
|
drawMode();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -661,7 +796,7 @@ void setup() {
|
|||||||
drawStartScreen();
|
drawStartScreen();
|
||||||
|
|
||||||
if (triggerActive()) {
|
if (triggerActive()) {
|
||||||
changeSettings = true;
|
currentMode = M_SETTINGS;
|
||||||
drawTitleScreen("Remote Settings");
|
drawTitleScreen("Remote Settings");
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -697,7 +832,7 @@ void setup() {
|
|||||||
void loop() {
|
void loop() {
|
||||||
updateMainDisplay();
|
updateMainDisplay();
|
||||||
|
|
||||||
readAccel();
|
if(currentMode == M_STEERING) readAccel();
|
||||||
|
|
||||||
Serial.print("Accel Value Left Right( Y): ");
|
Serial.print("Accel Value Left Right( Y): ");
|
||||||
Serial.print(map(AcY, -15000, 15000, -100, 100));
|
Serial.print(map(AcY, -15000, 15000, -100, 100));
|
||||||
@ -705,41 +840,61 @@ void loop() {
|
|||||||
Serial.println(map(GyY, -15000, 15000, -100, 100));
|
Serial.println(map(GyY, -15000, 15000, -100, 100));
|
||||||
|
|
||||||
calculateThrottlePosition();
|
calculateThrottlePosition();
|
||||||
if (changeSettings == true) {
|
|
||||||
|
if (currentMode == M_SELECT) {
|
||||||
|
controlSelect();
|
||||||
|
esc1 = 127;
|
||||||
|
esc2 = 127;
|
||||||
|
} else if (currentMode == M_SETTINGS) {
|
||||||
// Use throttle and trigger to change settings
|
// Use throttle and trigger to change settings
|
||||||
controlSettingsMenu();
|
controlSettingsMenu();
|
||||||
} else {
|
} else {
|
||||||
// Use throttle and trigger to drive motors
|
// Use throttle and trigger to drive motors
|
||||||
if (triggerActive()) {
|
if (triggerActive()) {
|
||||||
if(!steeringMode) {
|
if(currentMode == M_STEERING) {
|
||||||
esc1 = (uint8_t) throttle;
|
|
||||||
esc2 = (uint8_t) throttle;
|
|
||||||
} else {
|
|
||||||
DEBUG_PRINT("Value: ");
|
DEBUG_PRINT("Value: ");
|
||||||
int map = c_map(AcX, 15000, -15000, -50, 50);
|
int map = c_map(AcX, 15000, -15000, -60, 60);
|
||||||
DEBUG_PRINTLN(map);
|
DEBUG_PRINTLN(map);
|
||||||
|
|
||||||
esc1 = (uint8_t) constrain(throttle + map, 0, 200);
|
#ifdef steeringInfluential
|
||||||
esc2 = (uint8_t) constrain(throttle - map, 0, 200);
|
esc1 = (uint8_t) constrain(throttle - map, 0, 200);
|
||||||
|
esc2 = (uint8_t) constrain(throttle + map, 0, 200);
|
||||||
|
#else
|
||||||
|
esc1 = (uint8_t) constrain(127 - map, 0, 200);
|
||||||
|
esc2 = (uint8_t) constrain(127 + map, 0, 200);
|
||||||
|
if(-10 < map && map < 10) {
|
||||||
|
esc1 = throttle;
|
||||||
|
esc2 = throttle;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
if(throttle == 127) {
|
if(throttle == 127) {
|
||||||
esc1 = 127;
|
esc1 = 127;
|
||||||
esc2 = 127;
|
esc2 = 127;
|
||||||
}
|
}
|
||||||
|
|
||||||
DEBUG_PRINT("SteeringMode: ESC1: "); DEBUG_PRINT(esc1); DEBUG_PRINT(" ESC2: "); DEBUG_PRINTLN(esc2);
|
DEBUG_PRINT("SteeringMode: ESC1: "); DEBUG_PRINT(esc1); DEBUG_PRINT(" ESC2: "); DEBUG_PRINTLN(esc2);
|
||||||
|
} else if(currentMode == M_CRUISE) {
|
||||||
|
|
||||||
|
setCrusing(throttle);
|
||||||
|
|
||||||
|
esc1 = (uint8_t) throttle;
|
||||||
|
esc2 = (uint8_t) throttle;
|
||||||
|
|
||||||
|
if(crusing) {
|
||||||
|
esc1 = (uint8_t) crusingSpeed;
|
||||||
|
esc2 = (uint8_t) crusingSpeed;
|
||||||
|
}
|
||||||
|
|
||||||
|
} else {
|
||||||
|
esc1 = (uint8_t) throttle;
|
||||||
|
esc2 = (uint8_t) throttle;
|
||||||
}
|
}
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
// 127 is the middle position - no throttle and no brake/reverse
|
// 127 is the middle position - no throttle and no brake/reverse
|
||||||
esc1 = 127;
|
esc1 = 127;
|
||||||
esc2 = 127;
|
esc2 = 127;
|
||||||
if(throttle < 30) { // enter settings mode
|
if(crusing) setCrusing(0);
|
||||||
changeSettings = true;
|
|
||||||
}
|
|
||||||
// could use the other side for cruise control...
|
|
||||||
if(throttle > 230) {
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -759,4 +914,9 @@ void loop() {
|
|||||||
else {
|
else {
|
||||||
// No board found to process
|
// No board found to process
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if(shouldUpdateSettings) {
|
||||||
|
updateSettings();
|
||||||
|
shouldUpdateSettings = false;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -15,7 +15,6 @@ float ratioRpmSpeed;
|
|||||||
float ratioPulseDistance;
|
float ratioPulseDistance;
|
||||||
|
|
||||||
// Defining variables for Settings menu
|
// Defining variables for Settings menu
|
||||||
bool changeSettings = false;
|
|
||||||
bool changeSelectedSetting = false;
|
bool changeSelectedSetting = false;
|
||||||
|
|
||||||
bool settingsLoopFlag = false;
|
bool settingsLoopFlag = false;
|
||||||
|
Loading…
Reference in New Issue
Block a user