Skip to content

Commit

Permalink
Addition of CAN-FD support (at least partially), beginnings of support
Browse files Browse the repository at this point in the history
for a new board that has 5 CAN bus connections on it.
  • Loading branch information
collin80 committed Nov 15, 2022
1 parent fd53690 commit 8e57df3
Show file tree
Hide file tree
Showing 11 changed files with 330 additions and 163 deletions.
79 changes: 73 additions & 6 deletions ESP32RET.ino
Original file line number Diff line number Diff line change
Expand Up @@ -66,6 +66,8 @@ SerialConsole console;

CRGB leds[NUM_LEDS];

CAN_COMMON *canBuses[NUM_BUSES];

//initializes all the system EEPROM values. Chances are this should be broken out a bit but
//there is only one checksum check for all of them so it's simple to do it all here.
void loadSettings()
Expand All @@ -74,24 +76,31 @@ void loadSettings()

//Logger::console("%i\n", espChipRevision);

for (int i = 0; i < NUM_BUSES; i++) canBuses[i] = nullptr;

nvPrefs.begin(PREF_NAME, false);

settings.CAN0Speed = nvPrefs.getUInt("can0speed", 500000);
settings.CAN0_Enabled = nvPrefs.getBool("can0_en", true);
settings.CAN0ListenOnly = nvPrefs.getBool("can0-listenonly", false);
settings.canSettings[0].nomSpeed = nvPrefs.getUInt("can0speed", 500000);
settings.canSettings[0].enabled = nvPrefs.getBool("can0_en", true);
settings.canSettings[0].listenOnly = nvPrefs.getBool("can0-listenonly", false);
settings.canSettings[0].fdSpeed = nvPrefs.getUInt("can0fdspeed", 5000000);
settings.canSettings[0].fdMode = nvPrefs.getBool("can0fdmode", false);
settings.useBinarySerialComm = nvPrefs.getBool("binarycomm", false);
settings.logLevel = nvPrefs.getUChar("loglevel", 1); //info
settings.wifiMode = nvPrefs.getUChar("wifiMode", 2); //Wifi defaults to creating an AP
settings.enableBT = nvPrefs.getBool("enable-bt", false);
settings.enableLawicel = nvPrefs.getBool("enableLawicel", true);
settings.systemType = nvPrefs.getUChar("systype", (espChipRevision > 2) ? 0 : 1); //0 = A0, 1 = EVTV ESP32
settings.CAN1Speed = nvPrefs.getUInt("can1speed", 500000);
settings.CAN1ListenOnly = nvPrefs.getBool("can1-listenonly", false);
settings.CAN1_Enabled = nvPrefs.getBool("can1_en", (settings.systemType == 1) ? true : false);
settings.canSettings[1].nomSpeed = nvPrefs.getUInt("can1speed", 500000);
settings.canSettings[1].listenOnly = nvPrefs.getBool("can1-listenonly", false);
settings.canSettings[1].enabled = nvPrefs.getBool("can1_en", (settings.systemType == 1) ? true : false);
settings.canSettings[1].fdSpeed = nvPrefs.getUInt("can1fdspeed", 5000000);
settings.canSettings[1].fdMode = nvPrefs.getBool("can1fdmode", false);

if (settings.systemType == 0)
{
Logger::console("Running on Macchina A0");
canBuses[0] = &CAN0;
SysSettings.LED_CANTX = 255;
SysSettings.LED_CANRX = 255;
SysSettings.LED_LOGGING = 255;
Expand All @@ -118,11 +127,14 @@ void loadSettings()
FastLED.show();
pinMode(21, OUTPUT);
digitalWrite(21, LOW);
CAN0.setCANPins(GPIO_NUM_4, GPIO_NUM_5);
}

if (settings.systemType == 1)
{
Logger::console("Running on EVTV ESP32 Board");
canBuses[0] = &CAN0;
canBuses[1] = &CAN1;
SysSettings.LED_CANTX = 255;
SysSettings.LED_CANRX = 255;
SysSettings.LED_LOGGING = 255;
Expand All @@ -142,6 +154,61 @@ void loadSettings()
strcpy(otaFilename, "/esp32ret.bin");
}

if (settings.systemType == 2)
{
Logger::console("Running on Macchina 5-CAN");
canBuses[0] = &CAN0;
canBuses[1] = &CAN1;
canBuses[2] = new MCP2517FD(33, 39);
canBuses[3] = new MCP2517FD(25, 34);
canBuses[4] = new MCP2517FD(14, 13);
settings.canSettings[2].nomSpeed = nvPrefs.getUInt("can2speed", 500000);
settings.canSettings[2].listenOnly = nvPrefs.getBool("can2-listenonly", false);
settings.canSettings[2].enabled = nvPrefs.getBool("can2_en", false);
settings.canSettings[2].fdSpeed = nvPrefs.getUInt("can2fdspeed", 5000000);
settings.canSettings[2].fdMode = nvPrefs.getBool("can2fdmode", false);
settings.canSettings[3].nomSpeed = nvPrefs.getUInt("can3speed", 500000);
settings.canSettings[3].listenOnly = nvPrefs.getBool("can3-listenonly", false);
settings.canSettings[3].enabled = nvPrefs.getBool("can3_en", false);
settings.canSettings[3].fdSpeed = nvPrefs.getUInt("can3fdspeed", 5000000);
settings.canSettings[3].fdMode = nvPrefs.getBool("can3fdmode", false);
settings.canSettings[4].nomSpeed = nvPrefs.getUInt("can4speed", 500000);
settings.canSettings[4].listenOnly = nvPrefs.getBool("can4-listenonly", false);
settings.canSettings[4].enabled = nvPrefs.getBool("can4_en", false);
settings.canSettings[4].fdSpeed = nvPrefs.getUInt("can4fdspeed", 5000000);
settings.canSettings[4].fdMode = nvPrefs.getBool("can4fdmode", false);

//reconfigure the two already defined CAN buses to use the actual pins for this board.
CAN0.setCANPins(GPIO_NUM_4, GPIO_NUM_5); //rx, tx
CAN1.setINTPin(36);
CAN1.setCSPin(32);
SysSettings.LED_CANTX = 255;
SysSettings.LED_CANRX = 255;
SysSettings.LED_LOGGING = 255;
SysSettings.fancyLED = false;
SysSettings.logToggle = false;
SysSettings.txToggle = true;
SysSettings.rxToggle = true;
SysSettings.lawicelAutoPoll = false;
SysSettings.lawicelMode = false;
SysSettings.lawicellExtendedMode = false;
SysSettings.lawicelTimestamping = false;
SysSettings.numBuses = 5;
SysSettings.isWifiActive = false;
SysSettings.isWifiConnected = false;
strcpy(deviceName, MACC_NAME);
strcpy(otaHost, "macchina.cc");
strcpy(otaFilename, "/a0/files/a0ret.bin");
//Single wire interface
pinMode(SW_EN, OUTPUT);
pinMode(SW_MODE0, OUTPUT);
pinMode(SW_MODE1, OUTPUT);
digitalWrite(SW_EN, LOW); //MUST be LOW to use CAN1 channel
//HH = Normal Mode
digitalWrite(SW_MODE0, HIGH);
digitalWrite(SW_MODE1, HIGH);
}

if (nvPrefs.getString("SSID", settings.SSID, 32) == 0)
{
strcpy(settings.SSID, deviceName);
Expand Down
1 change: 0 additions & 1 deletion Logger.h
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,6 @@
#include <Arduino.h>
#include "config.h"


class Logger {
public:
enum LogLevel {
Expand Down
86 changes: 47 additions & 39 deletions SerialConsole.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -73,9 +73,9 @@ void SerialConsole::printMenu()
Logger::console("LOGLEVEL=%i - set log level (0=debug, 1=info, 2=warn, 3=error, 4=off)", settings.logLevel);
Serial.println();

Logger::console("CAN0EN=%i - Enable/Disable CAN0 (0 = Disable, 1 = Enable)", settings.CAN0_Enabled);
Logger::console("CAN0SPEED=%i - Set speed of CAN0 in baud (125000, 250000, etc)", settings.CAN0Speed);
Logger::console("CAN0LISTENONLY=%i - Enable/Disable Listen Only Mode (0 = Dis, 1 = En)", settings.CAN0ListenOnly);
Logger::console("CAN0EN=%i - Enable/Disable CAN0 (0 = Disable, 1 = Enable)", settings.canSettings[0].enabled);
Logger::console("CAN0SPEED=%i - Set speed of CAN0 in baud (125000, 250000, etc)", settings.canSettings[0].nomSpeed);
Logger::console("CAN0LISTENONLY=%i - Enable/Disable Listen Only Mode (0 = Dis, 1 = En)", settings.canSettings[0].listenOnly);
/*for (int i = 0; i < 8; i++) {
sprintf(buff, "CAN0FILTER%i=0x%%x,0x%%x,%%i,%%i (ID, Mask, Extended, Enabled)", i);
Logger::console(buff, settings.CAN0Filters[i].id, settings.CAN0Filters[i].mask,
Expand All @@ -85,9 +85,9 @@ void SerialConsole::printMenu()

if (settings.systemType != 0)
{
Logger::console("CAN1EN=%i - Enable/Disable CAN0 (0 = Disable, 1 = Enable)", settings.CAN1_Enabled);
Logger::console("CAN1SPEED=%i - Set speed of CAN0 in baud (125000, 250000, etc)", settings.CAN1Speed);
Logger::console("CAN1LISTENONLY=%i - Enable/Disable Listen Only Mode (0 = Dis, 1 = En)", settings.CAN1ListenOnly);
Logger::console("CAN1EN=%i - Enable/Disable CAN0 (0 = Disable, 1 = Enable)", settings.canSettings[1].enabled);
Logger::console("CAN1SPEED=%i - Set speed of CAN0 in baud (125000, 250000, etc)", settings.canSettings[1].nomSpeed);
Logger::console("CAN1LISTENONLY=%i - Enable/Disable Listen Only Mode (0 = Dis, 1 = En)", settings.canSettings[1].listenOnly);
/*for (int i = 0; i < 8; i++) {
sprintf(buff, "CAN0FILTER%i=0x%%x,0x%%x,%%i,%%i (ID, Mask, Extended, Enabled)", i);
Logger::console(buff, settings.CAN0Filters[i].id, settings.CAN0Filters[i].mask,
Expand Down Expand Up @@ -201,11 +201,13 @@ void SerialConsole::handleConfigCmd()
unsigned char whichEntry = '0';
i = 0;

while (cmdBuffer[i] != '=' && i < ptrBuffer) {
while (cmdBuffer[i] != '=' && i < ptrBuffer)
{
cmdString.concat(String(cmdBuffer[i++]));
}
i++; //skip the =
if (i >= ptrBuffer) {
if (i >= ptrBuffer)
{
Logger::console("Command needs a value..ie TORQ=3000");
Logger::console("");
return; //or, we could use this to display the parameter instead of setting
Expand All @@ -217,69 +219,72 @@ void SerialConsole::handleConfigCmd()

cmdString.toUpperCase();

if (cmdString == String("CAN0EN")) {
if (cmdString == String("CAN0EN"))
{
if (newValue < 0) newValue = 0;
if (newValue > 1) newValue = 1;
Logger::console("Setting CAN0 Enabled to %i", newValue);
settings.CAN0_Enabled = newValue;
settings.canSettings[0].enabled = newValue;
if (newValue == 1)
{
//CAN0.enable();
CAN0.begin(settings.CAN0Speed, 255);
CAN0.watchFor();
canBuses[0]->begin(settings.canSettings[0].nomSpeed, 255);
canBuses[0]->watchFor();
}
else CAN0.disable();
else canBuses[0]->disable();
writeEEPROM = true;
} else if (cmdString == String("CAN0SPEED")) {
if (newValue > 0 && newValue <= 1000000) {
Logger::console("Setting CAN0 Baud Rate to %i", newValue);
settings.CAN0Speed = newValue;
if (settings.CAN0_Enabled)
settings.canSettings[0].nomSpeed = newValue;
if (settings.canSettings[0].enabled)
{
if (ESP.getChipRevision() > 2) CAN0.begin(settings.CAN0Speed * 2, 255);
else CAN0.begin(settings.CAN0Speed, 255);
canBuses[0]->begin(settings.canSettings[0].nomSpeed, 255);
}
writeEEPROM = true;
} else Logger::console("Invalid baud rate! Enter a value 1 - 1000000");
} else if (cmdString == String("CAN0LISTENONLY")) {
if (newValue >= 0 && newValue <= 1) {
Logger::console("Setting CAN0 Listen Only to %i", newValue);
settings.CAN0ListenOnly = newValue;
if (settings.CAN0ListenOnly) {
CAN0.setListenOnlyMode(true);
settings.canSettings[0].listenOnly = newValue;
if (settings.canSettings[0].listenOnly) {
canBuses[0]->setListenOnlyMode(true);
} else {
CAN0.setListenOnlyMode(false);
canBuses[0]->setListenOnlyMode(false);
}
writeEEPROM = true;
} else Logger::console("Invalid setting! Enter a value 0 - 1");
} else if (cmdString == String("CAN1EN")) {
if (newValue < 0) newValue = 0;
if (newValue > 1) newValue = 1;
Logger::console("Setting CAN1 Enabled to %i", newValue);
settings.CAN1_Enabled = newValue;
if (newValue == 1 && settings.systemType != 0)
settings.canSettings[1].enabled = newValue;
if (newValue == 1)
{
//CAN0.enable();
CAN1.begin(settings.CAN0Speed, 255);
CAN1.watchFor();
canBuses[1]->begin(settings.canSettings[1].nomSpeed, 255);
canBuses[1]->watchFor();
}
else CAN1.disable();
else canBuses[1]->disable();
writeEEPROM = true;
} else if (cmdString == String("CAN1SPEED")) {
if (newValue > 0 && newValue <= 1000000) {
Logger::console("Setting CAN1 Baud Rate to %i", newValue);
settings.CAN1Speed = newValue;
if (settings.CAN1_Enabled) CAN1.begin(settings.CAN1Speed, 255);
settings.canSettings[1].nomSpeed = newValue;
if (settings.canSettings[1].enabled)
{
canBuses[1]->begin(settings.canSettings[1].nomSpeed, 255);
}
writeEEPROM = true;
} else Logger::console("Invalid baud rate! Enter a value 1 - 1000000");
} else if (cmdString == String("CAN1LISTENONLY")) {
if (newValue >= 0 && newValue <= 1) {
Logger::console("Setting CAN1 Listen Only to %i", newValue);
settings.CAN1ListenOnly = newValue;
if (settings.CAN1ListenOnly) {
CAN1.setListenOnlyMode(true);
settings.canSettings[1].listenOnly = newValue;
if (settings.canSettings[1].listenOnly) {
canBuses[1]->setListenOnlyMode(true);
} else {
CAN1.setListenOnlyMode(false);
canBuses[1]->setListenOnlyMode(false);
}
writeEEPROM = true;
} else Logger::console("Invalid setting! Enter a value 0 - 1");
Expand Down Expand Up @@ -361,9 +366,10 @@ void SerialConsole::handleConfigCmd()
writeEEPROM = true;
} else if (cmdString == String("SYSTYPE")) {
if (newValue < 0) newValue = 0;
if (newValue > 1) newValue = 1;
if (newValue > 2) newValue = 2;
if (newValue == 0) Logger::console("Setting board type to Macchina A0");
if (newValue == 1) Logger::console("Setting board type to EVTV ESP32");
if (newValue == 2) Logger::console("Setting board type to Macchina 5CAN");
settings.systemType = newValue;
writeEEPROM = true;
} else if (cmdString == String("LOGLEVEL")) {
Expand Down Expand Up @@ -405,12 +411,14 @@ void SerialConsole::handleConfigCmd()
}
if (writeEEPROM) {
nvPrefs.begin(PREF_NAME, false);
nvPrefs.putUInt("can0speed", settings.CAN0Speed);
nvPrefs.putBool("can0_en", settings.CAN0_Enabled);
nvPrefs.putBool("can0-listenonly", settings.CAN0ListenOnly);
nvPrefs.putUInt("can1speed", settings.CAN1Speed);
nvPrefs.putBool("can1_en", settings.CAN1_Enabled);
nvPrefs.putBool("can1-listenonly", settings.CAN1ListenOnly);
nvPrefs.putUInt("can0speed", settings.canSettings[0].nomSpeed);
nvPrefs.putBool("can0_en", settings.canSettings[0].enabled);
nvPrefs.putBool("can0-listenonly", settings.canSettings[0].listenOnly);
nvPrefs.putUInt("can1speed", settings.canSettings[1].nomSpeed);
nvPrefs.putBool("can1_en", settings.canSettings[1].enabled);
nvPrefs.putBool("can1-listenonly", settings.canSettings[1].listenOnly);
nvPrefs.putUInt("canfdspeed", settings.canSettings[1].fdSpeed);
nvPrefs.putBool("canfdmode", settings.canSettings[1].fdMode);
nvPrefs.putBool("binarycomm", settings.useBinarySerialComm);
nvPrefs.putBool("enable-bt", settings.enableBT);
nvPrefs.putBool("enableLawicel", settings.enableLawicel);
Expand Down
Loading

0 comments on commit 8e57df3

Please sign in to comment.