Add support for RusEFI CAN Wideband based on STM32F042 (#1146)

* CAN WBO Support

* fix typo

* Change data handling

* add source repo information

* Added heater functionality and fixed value handling

* Missed 0

* Better condition handling and minor fixes to multiplication

* Remove code duplication

* fix

* Error fixing and correct address of controller for outgoing frames

* Page layout adjustment

* fix

* Second WBO added to be used in TS / MLV

* Add extended flag to out frame

* Functional test and fixes

* typo

* CAN WBO Support

fix typo

Change data handling

add source repo information

Added heater functionality and fixed value handling

Missed 0

Better condition handling and minor fixes to multiplication

Remove code duplication

fix

Error fixing and correct address of controller for outgoing frames

Page layout adjustment

fix

Second WBO added to be used in TS / MLV

Add extended flag to out frame

Add support for BlitzBox hardware in speeduino firmware (#1148)

* Add support for BlitzBox in init.cpp

added case 42 for BlitzBox support

* Added support for Blitzbox to speeduino.ini

Added support for Blitzbox to speeduino.ini to get an ECU entry in Tunerstudio

* Enabled spare pins in pin layout

Functional test and fixes

typo

Fix issue with LED indicator not working when MC33810 was in use

Resolve issue with Teensy not sending CAN msgs

Fix regression on MC33810 units from af2815d818

Added check for AFR greater than 25.5

Added overflow check of O2 value

Code clean up

Bump actions/upload-artifact from 3 to 4 (#1149)

Bumps [actions/upload-artifact](https://github.com/actions/upload-artifact) from 3 to 4.
- [Release notes](https://github.com/actions/upload-artifact/releases)
- [Commits](https://github.com/actions/upload-artifact/compare/v3...v4)

---
updated-dependencies:
- dependency-name: actions/upload-artifact
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

Spelling and typo correction

missing space

* Fix possible overflow

* Allow for future CAN based WBO modules to be added

* rusEFI case as requested.

* fix

* CAN WBO Support

* fix typo

* Change data handling

* add source repo information

* Added heater functionality and fixed value handling

* Missed 0

* Better condition handling and minor fixes to multiplication

* Remove code duplication

* fix

* Error fixing and correct address of controller for outgoing frames

* Page layout adjustment

* fix

* Second WBO added to be used in TS / MLV

* Add extended flag to out frame

* Functional test and fixes

* typo

* Allow for future CAN based WBO modules to be added

* CAN WBO Support

fix typo

Change data handling

add source repo information

Added heater functionality and fixed value handling

Missed 0

Better condition handling and minor fixes to multiplication

Remove code duplication

fix

Error fixing and correct address of controller for outgoing frames

Page layout adjustment

fix

Second WBO added to be used in TS / MLV

Add extended flag to out frame

Add support for BlitzBox hardware in speeduino firmware (#1148)

* Add support for BlitzBox in init.cpp

added case 42 for BlitzBox support

* Added support for Blitzbox to speeduino.ini

Added support for Blitzbox to speeduino.ini to get an ECU entry in Tunerstudio

* Enabled spare pins in pin layout

Functional test and fixes

typo

Fix issue with LED indicator not working when MC33810 was in use

Resolve issue with Teensy not sending CAN msgs

Fix regression on MC33810 units from af2815d818

Added check for AFR greater than 25.5

Added overflow check of O2 value

Code clean up

Bump actions/upload-artifact from 3 to 4 (#1149)

Bumps [actions/upload-artifact](https://github.com/actions/upload-artifact) from 3 to 4.
- [Release notes](https://github.com/actions/upload-artifact/releases)
- [Commits](https://github.com/actions/upload-artifact/compare/v3...v4)

---
updated-dependencies:
- dependency-name: actions/upload-artifact
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

Spelling and typo correction

missing space

* rusEFI case as requested.

* Revert "Merge branch 'master' of https://github.com/dynfer/speeduino"

This reverts commit 49dc0eab08, reversing
changes made to 56abc79008.

* fix merge

* fixes

* Added overflow prevention

* Final

---------

Co-authored-by: Josh Stewart <josh@noisymime.org>
This commit is contained in:
dynfer 2024-02-04 11:34:29 +01:00 committed by GitHub
parent 9c663a75b9
commit 3f75f55bdd
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
6 changed files with 76 additions and 21 deletions

View File

@ -477,10 +477,8 @@ page = 1
canBMWCluster = bits, U08, 126, [0:0], "Off", "On"
canVAGCluster = bits, U08, 126, [1:1], "Off", "On"
;These are reserved for future use, in case of more CAN broadcasting features are added
enable1Cluster = bits, U08, 126, [2:2], "Off", "On"
enable2Cluster = bits, U08, 126, [3:3], "Off", "On"
canWBO = bits, U08, 126, [2:3], "Off", "rusEFI WBO", "INVALID", "INVALID"
vssAuxCh = bits, U08, 126, [4:7], "Aux0", "Aux1", "Aux2", "Aux3", "Aux4", "Aux5", "Aux6", "Aux7", "Aux8", "Aux9", "Aux10", "Aux11", "Aux12", "Aux13", "Aux14", "Aux15"
decelAmount = scalar, U08, 127, "%", 1.0, 0.0, 0.0, 150.0, 0
;Page 2 is the fuel map and axis bins only
@ -1476,10 +1474,9 @@ page = 15
airConIdleUpRPMAdder = scalar, U08, 96, "Added Target RPM", 10.0, 0.0, 0.0, 250.0, 0
airConPwmFanMinDuty = scalar, U08, 97, "%", 0.5, 0.0, 0.0, 100.0, 1
rollingProtRPMDelta = array, S08, 98, [4], "RPM", 10.0, 0, -1000, 0, 0
rollingProtCutPercent = array, U08, 102, [4], "%", 1.0, 0, 0, 100, 0
Unused15_98_255 = array, U08, 98, [150], "%", 1.0, 0.0, 0.0, 255, 0
rollingProtRPMDelta = array, S08, 98, [4], "RPM", 10.0, 0, -1000, 0, 0
rollingProtCutPercent = array, U08, 102, [4], "%", 1.0, 0, 0, 100, 0
Unused15_106_255 = array, U08, 106, [150], "%", 1.0, 0.0, 0.0, 255, 0
;-------------------------------------------------------------------------------
@ -2427,6 +2424,7 @@ menuDialog = main
tachoMode = "The output mode for the tacho pulse. Fixed timing will produce a pulse that is always of the same duration, which works better with mode modern digital tachos. Dwell based output creates a pulse that is matched to the coil/s dwell time. If enabled the tacho pulse duration and timing is same as coil dwell and the number of pulses is same as number of ignition events. This can work better on some styles of tacho but note that the pulse duration might become problem on higher cylinder number engines."
canBMWCluster = "Enables CAN broadcasting for BMW E46, E39 and E38 instrument clusters with message ID's 0x316, 0x329 and 0x545"
canVAGCluster = "Enables CAN broadcasting for VAG instrument clusters with message ID's 0x280 and 0x5A0"
canWBO = "Enables to recive AFR via CAN for supported controllers"
caninputEndianess= "Byte ordering for values with two bytes."
boostControlEnable = "Set the trigger to enable/disable the closedloop boost controller. When set to: \n 'fixed': if the fuel load exceeds the threshold closedloop boost controller is enbaled.\n 'baro': if the fuel load exceeds the baro the controller is enabled (legacy) "
@ -3564,14 +3562,14 @@ menuDialog = main
dialog = CanBcast, "CAN Broadcasting menu"
field = "BMW Instrument Cluster Broadcast", canBMWCluster
field = "VAG Instrument Cluster Broadcast", canVAGCluster
field = "WBO over CAN", canWBO
dialog = Auxin_north
displayOnlyField = #"Secondary Serial ENABLED", blankfield, {enable_secondarySerial},{enable_secondarySerial}
displayOnlyField = !"Secondary Serial DISABLED", blankfield, {enable_secondarySerial == 0},{enable_secondarySerial == 0}
displayOnlyField = #"Internal CANBUS ENABLED", blankfield, {enable_intcan && intcan_available},{enable_intcan && intcan_available}
displayOnlyField = !"Internal CANBUS DISABLED", blankfield, {enable_intcan == 0 && intcan_available},{enable_intcan == 0 && intcan_available}
displayOnlyField = !"Internal CANBUS NOT AVAILABLE to MCU", blankfield, {enable_intcan == 1 && intcan_available == 0},{enable_intcan == 1 && intcan_available == 0}
displayOnlyField = !"Internal CANBUS NOT AVAILABLE to MCU", blankfield, {enable_intcan == 0 && intcan_available == 0},{enable_intcan == 0 && intcan_available == 0}
displayOnlyField = !"Secondary Serial DISABLED", blankfield, {enable_secondarySerial == 0},{enable_secondarySerial == 0}
displayOnlyField = #"Internal CANBUS ENABLED", blankfield, {enable_intcan && intcan_available},{enable_intcan && intcan_available}
displayOnlyField = !"Internal CANBUS DISABLED", blankfield, {enable_intcan == 0 && intcan_available},{enable_intcan == 0 && intcan_available}
displayOnlyField = !"Internal CANBUS NOT AVAILABLE to MCU", blankfield, {enable_intcan == 1 && intcan_available == 0},{enable_intcan == 1 && intcan_available == 0}
displayOnlyField = !"Internal CANBUS NOT AVAILABLE to MCU", blankfield, {enable_intcan == 0 && intcan_available == 0},{enable_intcan == 0 && intcan_available == 0}
field = " If Secondary Serial or Internal CANBUS is DISABLED then any input channel assigned to that external source will NOT function"
dialog = selectionOfEdianness. , "Endianness", yAxis

View File

@ -24,6 +24,14 @@ CAN_message_t outMsg;
FlexCAN_T4<CAN1, RX_SIZE_256, TX_SIZE_16> Can1;
#endif
//These are declared locally for Teensy due to this issue: https://github.com/tonton81/FlexCAN_T4/issues/67
#if defined(CORE_TEENSY35) // use for Teensy 3.5 only
FlexCAN_T4<CAN0, RX_SIZE_256, TX_SIZE_16> Can0;
#elif defined(CORE_TEENSY41) // use for Teensy 3.6 only
FlexCAN_T4<CAN0, RX_SIZE_256, TX_SIZE_16> Can0;
FlexCAN_T4<CAN1, RX_SIZE_256, TX_SIZE_16> Can1;
#endif
// Forward declare
void DashMessage(uint16_t DashMessageID);
@ -75,7 +83,48 @@ void sendVAGCluster()
DashMessage(CAN_VAG_VSS);
Can0.write(outMsg);
}
void receiveCANwbo()
{
// Currently only RusEFI CAN Wideband supported: https://github.com/mck1117/wideband
if(configPage2.canWBO == CAN_WBO_RUSEFI)
{
outMsg.id = 0xEF50000;
outMsg.flags.extended = 1;
outMsg.len = 2;
outMsg.buf[0] = currentStatus.battery10; // We don't do any conversion since factor is 0.1 and speeduino value is x10
outMsg.buf[1] = 0x1; // Enable heater
Can0.write(outMsg);
if ((inMsg.id == 0x190 || inMsg.id == 0x192))
{
uint32_t inLambda;
inLambda = (word(inMsg.buf[3], inMsg.buf[2])); // Combining 2 bytes of data into single variable factor is 0.0001 so lambda 1 comes in as 10K
if(inMsg.buf[1] == 0x1) // Checking if lambda is valid
{
switch(inMsg.id)
{
case 0x190:
if ((inLambda * configPage2.stoich / 10000) > 250) { //Check if we dont overflow the 8bit O2 variable
currentStatus.O2 = 250;
break;
}
currentStatus.O2 = (unsigned int)(inLambda * configPage2.stoich / 10000); // Multiplying lambda by stoich ratio to get AFR and dividing it by 10000 to get correct value
break;
case 0x192:
if ((inLambda * configPage2.stoich / 10000) > 250) { //Check if we dont overflow the 8bit O2 variable
currentStatus.O2 = 250;
break;
}
currentStatus.O2_2 = (unsigned int)(inLambda * configPage2.stoich / 10000); // Multiplying lambda by stoich ratio to get AFR and dividing it by 10000 to get correct value
break;
default:
break;
}
}
}
}
}
// switch case for gathering all data to message based on CAN Id.
void DashMessage(uint16_t DashMessageID)
{
@ -577,4 +626,4 @@ void readAuxCanBus()
}
}
}
#endif
#endif

View File

@ -14,6 +14,8 @@
#define CAN_VAG_RPM 0x280
#define CAN_VAG_VSS 0x5A0
#define CAN_WBO_RUSEFI 1
#define TS_CAN_OFFSET 0x100
void initCAN();
@ -21,6 +23,7 @@ int CAN_read();
void CAN_write();
void sendBMWCluster();
void sendVAGCluster();
void receiveCANwbo();
void DashMessages(uint16_t DashMessageID);
void can_Command(void);
void obd_response(uint8_t therequestedPID , uint8_t therequestedPIDlow, uint8_t therequestedPIDhigh);

View File

@ -861,8 +861,7 @@ struct config2 {
byte canBMWCluster : 1;
byte canVAGCluster : 1;
byte enableCluster1 : 1;
byte enableCluster2 : 1;
byte canWBO : 2 ;
byte vssAuxCh : 4;
byte decelAmount;
@ -1442,8 +1441,8 @@ struct config15 {
int8_t rollingProtRPMDelta[4]; // Signed RPM value representing how much below the RPM limit. Divided by 10
byte rollingProtCutPercent[4];
//Bytes 98-255
byte Unused15_98_255[150];
//Bytes 106-255
byte Unused15_106_255[150];
#if defined(CORE_AVR)
};

View File

@ -126,6 +126,7 @@ void loop(void)
{
can_Command();
readAuxCanBus();
if (configPage2.canWBO > 0) { receiveCANwbo(); }
}
}
#endif
@ -260,9 +261,11 @@ void loop(void)
#if TPS_READ_FREQUENCY == 30
readTPS();
#endif
readO2();
readO2_2();
if (configPage2.canWBO == 0)
{
readO2();
readO2_2();
}
#ifdef SD_LOGGING
if(configPage13.onboard_log_file_rate == LOGGER_RATE_30HZ) { writeSDLogEntry(); }
#endif

View File

@ -745,6 +745,9 @@ void doUpdates(void)
configPage9.egoMAPMax = 255, // 255 will be 510 kpa
configPage9.egoMAPMin = 0, // 0 will be 0 kpa
//rusEFI CAN Wideband
configPage2.canWBO = 0;
writeAllConfig();
storeEEPROMVersion(23);
}