Skip to content

Commit

Permalink
Fix: Serial Timeouts
Browse files Browse the repository at this point in the history
  • Loading branch information
shining-man committed Sep 16, 2024
1 parent f063345 commit 5a96cfc
Show file tree
Hide file tree
Showing 14 changed files with 45 additions and 53 deletions.
4 changes: 2 additions & 2 deletions include/BscSerial.h
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
#define BSCSERIAL_H

#include "Arduino.h"
#include "defines.h"
#include <SoftwareSerial.h>

class BscSerial {
Expand All @@ -23,8 +24,7 @@ class BscSerial {

void cyclicRun();

void setRxTxEnable(uint8_t u8_devNr, uint8_t e_rw);
void setRxTxEnable(uint8_t u8_devNr, uint8_t e_rw, bool takeSemaphore);
void setRxTxEnable(uint8_t u8_devNr, serialRxTxEn_e e_rw);
void sendSerialData(Stream *port, uint8_t devNr, uint8_t *txBuffer, uint8_t txLen);

void setReadBmsFunktion(uint8_t u8_devNr, uint8_t funktionsTyp);
Expand Down
3 changes: 1 addition & 2 deletions include/i2c.h
Original file line number Diff line number Diff line change
Expand Up @@ -12,11 +12,10 @@
class Inverter; //Forward-Deklaration

void i2cInit();
void i2cTakeSemaphore();
void i2cCyclicRun(Inverter &inverter);
void i2cSendData(Inverter &inverter, uint8_t i2cAdr, uint8_t data1, uint8_t data2, uint8_t data3, const void *dataAdr, uint8_t dataLen);
void i2cSendData(Inverter &inverter, uint8_t i2cAdr, uint8_t data1, uint8_t data2, uint8_t data3, String data, uint8_t dataLen);
void i2cExtSerialSetEnable(uint8_t u8_serialDevNr, serialRxTxEn_e serialRxTxEn, bool takeSemaphore);
void i2cExtSerialSetEnable(uint8_t u8_serialDevNr, serialRxTxEn_e serialRxTxEn);
bool isSerialExtEnabled();

#endif
2 changes: 1 addition & 1 deletion include/webpages.h
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ const char htmlPageRoot[] PROGMEM = "<!DOCTYPE HTML>"
"</head>"
"<body>"
"<div class='topnav'>"
"<span class='hl'>Battery Safety Controller&nbsp;&nbsp;&nbsp;V0.6.1_dm5</span>"
"<span class='hl'>Battery Safety Controller&nbsp;&nbsp;&nbsp;V0.6.1_dm8</span>"
"</div>"
"<div style='background-color: #BFEFFF; padding: 10px; margin-top: 10px;'>Gefällt dir das Projekt? Zeige deine Wertschätzung doch einfach mit einer Spende! Weitere Infos unter "
"<a href='./support/'>Unterst&uuml;tzung</a></div>"
Expand Down
32 changes: 12 additions & 20 deletions src/BscSerial.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -45,8 +45,6 @@ struct serialDeviceData_s
};
struct serialDeviceData_s serialDeviceData[SERIAL_BMS_DEVICES_COUNT];

void setRxTxEnable(uint8_t u8_devNr, uint8_t e_rw);

#ifdef UTEST_BMS_FILTER
bool readBmsTestData(uint8_t devNr);
#endif
Expand Down Expand Up @@ -317,7 +315,7 @@ void BscSerial::setReadBmsFunktion(uint8_t u8_devNr, uint8_t funktionsTyp)
*
*/
//serialRxTxEn_e {serialRxTx_RxTxDisable, serialRxTx_TxEn, serialRxTx_RxEn};
void BscSerial::setRxTxEnable(uint8_t u8_devNr, uint8_t e_rw, bool takeSemaphore)
void BscSerial::setRxTxEnable(uint8_t u8_devNr, serialRxTxEn_e e_rw)
{
#ifndef LILYGO_TCAN485
if(u8_devNr==0)
Expand Down Expand Up @@ -366,32 +364,23 @@ void BscSerial::setRxTxEnable(uint8_t u8_devNr, uint8_t e_rw, bool takeSemaphore
}
else if(u8_devNr>2 && u8_devNr<=10 && getHwVersion()>=2)
{
i2cExtSerialSetEnable(u8_devNr-3, (serialRxTxEn_e)e_rw, takeSemaphore);
i2cExtSerialSetEnable(u8_devNr-3, e_rw);
}
#endif
}

void BscSerial::setRxTxEnable(uint8_t u8_devNr, uint8_t e_rw)
{
setRxTxEnable(u8_devNr, e_rw, true);
}

void BscSerial::sendSerialData(Stream *port, uint8_t devNr, uint8_t *txBuffer, uint8_t txLen)
{
setRxTxEnable(devNr,serialRxTx_TxEn);
usleep(20);

// Wenn der serialport auf der Extension ist, dann vorher den I2C Mutex holen
if(devNr>2 && devNr<=10 && getHwVersion()>=2) i2cTakeSemaphore();

portMUX_TYPE serialMutex = portMUX_INITIALIZER_UNLOCKED;
taskENTER_CRITICAL(&serialMutex);

vTaskPrioritySet(task_handle_bscSerial, configMAX_PRIORITIES);

port->write(txBuffer, txLen);
port->flush();
setRxTxEnable(devNr, serialRxTx_RxEn, false);
setRxTxEnable(devNr, serialRxTx_RxEn);

taskEXIT_CRITICAL(&serialMutex);
vTaskPrioritySet(task_handle_bscSerial, TASK_PRIORITY_STD);
}


Expand All @@ -414,7 +403,7 @@ void BscSerial::cyclicRun()

uint8_t u8_serDeviceNr = dataDeviceSchnittstelle - BT_DEVICES_COUNT;

// Wenn BT-Device eingestellt ist
//
if(dataDeviceSchnittstelle >= MUBER_OF_DATA_DEVICES) continue;

// Wenn BT-Device eingestellt ist
Expand Down Expand Up @@ -465,8 +454,11 @@ void BscSerial::cyclicRun()


//BSC_LOGI(TAG, "cyclicRun dev=%i, u8_BmsDataAdr=%i, u8_NumberOfDevices=%i, u8_deviceNr=%i", u8_serDeviceNr, devData.u8_BmsDataAdr,devData.u8_NumberOfDevices,devData.u8_deviceNr);
if(serialDeviceData[u8_serDeviceNr].readBms!=NULL)
bo_lBmsReadOk=serialDeviceData[u8_serDeviceNr].readBms(this, serialDeviceData[u8_serDeviceNr].stream_mPort, u8_serDeviceNr, &devData); //Wenn kein Fehler beim Holen der Daten vom BMS
if(serialDeviceData[u8_serDeviceNr].readBms != NULL)
{
bo_lBmsReadOk = serialDeviceData[u8_serDeviceNr].readBms(this, serialDeviceData[u8_serDeviceNr].stream_mPort, u8_serDeviceNr, &devData); //Wenn kein Fehler beim Holen der Daten vom BMS
if(u8_serDeviceNr >= 2) setRxTxEnable(u8_serDeviceNr, serialRxTx_RxTxDisable);
}
else BSC_LOGE(TAG,"Error readBms nullptr, dev=%i",u8_serDeviceNr);

if(devData.bo_writeData) free(lRwData);
Expand Down
1 change: 0 additions & 1 deletion src/devices/DalyBms.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -97,7 +97,6 @@ bool DalyBms_readBmsData(BscSerial *bscSerial, Stream *port, uint8_t devNr, seri
else bo_ret=false;
//vTaskDelay(pdMS_TO_TICKS(DALAY_SEND_DELAY));

if(devNr>=2) bscSerial->setRxTxEnable(u8_mDevNr,serialRxTx_RxTxDisable);
return bo_ret;
}

Expand Down
3 changes: 0 additions & 3 deletions src/devices/GobelBms.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -204,9 +204,6 @@ bool GobelBms_readBmsData(BscSerial *bscSerial, Stream *port, uint8_t devNr, ser
if (bo_lRet == false) return bo_lRet;

vTaskDelay(pdMS_TO_TICKS(25));


if (devNr >= 2) bscSerial->setRxTxEnable(u8_mDevNr, serialRxTx_RxTxDisable);
return bo_lRet;
}

Expand Down
1 change: 0 additions & 1 deletion src/devices/GobelBms_PC200.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -168,7 +168,6 @@ bool GobelBmsPC200_readBmsData(BscSerial *bscSerial, Stream *port, uint8_t devNr
else ret = false;
}

if(devNr >= 2) bscSerial->setRxTxEnable(u8_mDevNr, serialRxTx_RxTxDisable);
vTaskDelay(pdMS_TO_TICKS(25));
return ret;
}
Expand Down
1 change: 0 additions & 1 deletion src/devices/JbdBms.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -73,7 +73,6 @@ bool JbdBms_readBmsData(BscSerial *bscSerial, Stream *port, uint8_t devNr, seria
bscSerial->sendSerialData(mPort, u8_mDevNr ,response, 9);
}

if(devNr>=2) bscSerial->setRxTxEnable(u8_mDevNr,serialRxTx_RxTxDisable);
return bo_lRet;
}

Expand Down
1 change: 0 additions & 1 deletion src/devices/JkBms.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -52,7 +52,6 @@ bool JkBms_readBmsData(BscSerial *bscSerial, Stream *port, uint8_t devNr, serial
}
else bo_lRet=false;

if(devNr>=2) bscSerial->setRxTxEnable(u8_mDevNr,serialRxTx_RxTxDisable);
return bo_lRet;
}

Expand Down
1 change: 0 additions & 1 deletion src/devices/JkBmsV13.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -63,7 +63,6 @@ bool JkBmsV13_readBmsData(BscSerial *bscSerial, Stream *port, uint8_t devNr, ser
}
else bo_lRet=false;

if(devNr>=2) bscSerial->setRxTxEnable(u8_mDevNrJkV13,serialRxTx_RxTxDisable);
return bo_lRet;
}

Expand Down
1 change: 0 additions & 1 deletion src/devices/SeplosBms.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -82,7 +82,6 @@ bool SeplosBms_readBmsData(BscSerial *bscSerial, Stream *port, uint8_t devNr, se
}
}

if(u8_mDevNr>=2) bscSerial->setRxTxEnable(u8_mDevNr,serialRxTx_RxTxDisable);
vTaskDelay(pdMS_TO_TICKS(25));
return ret;
}
Expand Down
2 changes: 0 additions & 2 deletions src/devices/SmartShunt.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -324,8 +324,6 @@ bool SmartShunt_readBmsData(BscSerial *bscSerial, Stream *port, uint8_t devNr, s
else break;
}


if(devNr>=2) bscSerial->setRxTxEnable(u8_mDevNr, serialRxTx_RxTxDisable);
//BSC_LOGI(TAG,"ret=%d, rxVal=%i, delCnt=%i, readCntGes=%i, errCnt=%i",bo_ret, rxValues, byteDelCnt, byteReadCntGes, errCntSmartShunt);
return bo_ret;
}
1 change: 0 additions & 1 deletion src/devices/SylcinBms.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -81,7 +81,6 @@ bool SylcinBms_readBmsData(BscSerial *bscSerial, Stream *port, uint8_t devNr, se
else ret = false;
}

if(u8_mDevNr>=2) bscSerial->setRxTxEnable(u8_mDevNr,serialRxTx_RxTxDisable);
return ret;
}

Expand Down
45 changes: 29 additions & 16 deletions src/i2c.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -59,14 +59,16 @@ void onReceive(int len)
}


void i2cWriteRegister(uint8_t u8_i2cDevAdr, uint8_t u8_reg, uint8_t u8_data, bool takeSemaphore)
/*
* Beim Nutzen der Funktion das mutexI2cRx nicht vergessen!
*/
void i2cWriteRegister(uint8_t u8_i2cDevAdr, uint8_t u8_reg, uint8_t u8_data)
{
if(takeSemaphore) xSemaphoreTake(mutexI2cRx, portMAX_DELAY);
//xSemaphoreTake(mutexI2cRx, portMAX_DELAY);
Wire.beginTransmission(u8_i2cDevAdr);
Wire.write(u8_reg);
Wire.write(u8_data);
Wire.endTransmission();
xSemaphoreGive(mutexI2cRx);
}


Expand Down Expand Up @@ -104,12 +106,6 @@ void i2cInit()
}


void i2cTakeSemaphore()
{
xSemaphoreTake(mutexI2cRx, portMAX_DELAY);
}


void isI2CdeviceConn()
{
uint8_t u8_lErr;
Expand Down Expand Up @@ -483,23 +479,24 @@ void i2cInitExtSerial()
1 1 1 0x27 (39)
*/

i2cWriteRegister(I2C_DEV_ADDR_SERIAL_EXTENSION, MCP23017_IODIRA, 0x0, true);
i2cWriteRegister(I2C_DEV_ADDR_SERIAL_EXTENSION, MCP23017_IODIRB, 0x0, true);
i2cWriteRegister(I2C_DEV_ADDR_SERIAL_EXTENSION, MCP23017_IODIRA, 0x0);
i2cWriteRegister(I2C_DEV_ADDR_SERIAL_EXTENSION, MCP23017_IODIRB, 0x0);

i2cWriteRegister(I2C_DEV_ADDR_SERIAL_EXTENSION, MCP23017_GPIOA, 0xAA, true);
i2cWriteRegister(I2C_DEV_ADDR_SERIAL_EXTENSION, MCP23017_GPIOB, 0xAA, true);
i2cWriteRegister(I2C_DEV_ADDR_SERIAL_EXTENSION, MCP23017_GPIOA, 0xAA);
i2cWriteRegister(I2C_DEV_ADDR_SERIAL_EXTENSION, MCP23017_GPIOB, 0xAA);
}

//serialRxTxEn_e {serialRxTx_RxTxDisable, serialRxTx_TxEn, serialRxTx_RxEn};


void i2cExtSerialSetEnable(uint8_t u8_serialDevNr, serialRxTxEn_e serialRxTxEn, bool takeSemaphore)
void i2cExtSerialSetEnable(uint8_t u8_serialDevNr, serialRxTxEn_e serialRxTxEn)
{
uint8_t valueA=0;
uint8_t valueB=0;
const char TX_EN = 0x00;
const char RX_EN = 0x03;
const char TXRX_DIS = 0x02;
static bool semaphoreState = false;

for(uint8_t i=0;i<8;i++)
{
Expand All @@ -525,6 +522,22 @@ void i2cExtSerialSetEnable(uint8_t u8_serialDevNr, serialRxTxEn_e serialRxTxEn,
}
}

i2cWriteRegister(I2C_DEV_ADDR_SERIAL_EXTENSION, MCP23017_GPIOA, valueA, takeSemaphore);
i2cWriteRegister(I2C_DEV_ADDR_SERIAL_EXTENSION, MCP23017_GPIOB, valueB, takeSemaphore);

// Mögliche States
// enum serialRxTxEn_e {serialRxTx_RxTxDisable, serialRxTx_TxEn, serialRxTx_RxEn};

if(semaphoreState == false)
{
xSemaphoreTake(mutexI2cRx, portMAX_DELAY);
semaphoreState = true;
}

i2cWriteRegister(I2C_DEV_ADDR_SERIAL_EXTENSION, MCP23017_GPIOA, valueA);
i2cWriteRegister(I2C_DEV_ADDR_SERIAL_EXTENSION, MCP23017_GPIOB, valueB);

if(serialRxTxEn != serialRxTx_TxEn)
{
xSemaphoreGive(mutexI2cRx);
semaphoreState = false;
}
}

0 comments on commit 5a96cfc

Please sign in to comment.