More fixes from Andy

This commit is contained in:
Daniel 2023-11-22 10:45:15 +02:00
parent 0bfb757dff
commit 6fd2ca52db
4 changed files with 99 additions and 13 deletions

View file

@ -49,27 +49,62 @@ void updateData() {
*/ */
void manageSerialLinkReceiver() { void manageSerialLinkReceiver() {
static bool lasterror = false;
static unsigned long lastGood;
static uint16_t lastGoodMaxCharge;
static uint16_t lastGoodMaxDischarge;
static bool initLink = false;
unsigned long currentTime = millis();
if (!initLink) {
initLink = true;
// sends variables every 5000mS even if no change
dataLinkReceive.setUpdateInterval(5000);
#ifdef SERIALDATALINK_MUTEACK
dataLinkReceive.muteACK(true);
#endif
}
dataLinkReceive.run(); dataLinkReceive.run();
bool readError = dataLinkReceive.checkReadError(true); // check for error & clear error flag bool readError = dataLinkReceive.checkReadError(true); // check for error & clear error flag
LEDcolor = GREEN; LEDcolor = GREEN;
if (readError) { if (readError) {
LEDcolor = RED; LEDcolor = RED;
Serial.println("ERROR: Serial Data Link - Read Error"); bms_status = 4; //FAULT
Serial.print(currentTime);
Serial.println(" - ERROR: Serial Data Link - Read Error");
lasterror = true;
} else {
if (lasterror) {
lasterror = false;
Serial.print(currentTime);
Serial.println(" - RECOVERY: Serial Data Link - Read GOOD");
}
lastGood = currentTime;
} }
if (dataLinkReceive.checkNewData(true)) // true = clear Flag if (dataLinkReceive.checkNewData(true)) // true = clear Flag
{ {
__getData(); __getData();
lastGoodMaxCharge = max_target_charge_power;
lastGoodMaxDischarge = max_target_discharge_power;
} }
#ifdef INVERTER_SEND_NUM_VARIABLES unsigned long minutesLost = (currentTime - lastGood) / 60000UL;
static bool initLink = false; ;
static unsigned long updateTime = 0; if (minutesLost > 0 && lastGood > 0) {
if (!initLink) { // lose 25% each minute of data loss
initLink = true; if (minutesLost < 4) {
// sends variables every 5000mS even if no change max_target_charge_power = (lastGoodMaxCharge * (4 - minutesLost)) / 4;
dataLinkReceive.setUpdateInterval(5000); max_target_discharge_power = (lastGoodMaxDischarge * (4 - minutesLost)) / 4;
} else {
max_target_charge_power = 0;
max_target_discharge_power = 0;
} }
unsigned long currentTime = millis(); }
static unsigned long updateTime = 0;
#ifdef INVERTER_SEND_NUM_VARIABLES
if (currentTime - updateTime > 100) { if (currentTime - updateTime > 100) {
updateTime = currentTime; updateTime = currentTime;
dataLinkReceive.run(); dataLinkReceive.run();

View file

@ -31,6 +31,7 @@ void _getData() {
void manageSerialLinkTransmitter() { void manageSerialLinkTransmitter() {
static bool initLink = false; static bool initLink = false;
static unsigned long updateTime = 0; static unsigned long updateTime = 0;
static bool lasterror = false;
dataLinkTransmit.run(); dataLinkTransmit.run();
@ -53,9 +54,16 @@ void manageSerialLinkTransmitter() {
LEDcolor = GREEN; LEDcolor = GREEN;
if (sendError) { if (sendError) {
LEDcolor = RED; LEDcolor = RED;
Serial.println("ERROR: Serial Data Link - SEND Error"); Serial.print(millis());
Serial.println(" - ERROR: Serial Data Link - SEND Error");
lasterror = true;
} else {
if (lasterror) {
lasterror = false;
Serial.print(millis());
Serial.println(" - RECOVERY: Serial Data Link - Send GOOD");
}
} }
// todo some error management - LEDS etc
dataLinkTransmit.updateData(0, SOC); dataLinkTransmit.updateData(0, SOC);
dataLinkTransmit.updateData(1, StateOfHealth); dataLinkTransmit.updateData(1, StateOfHealth);

View file

@ -124,8 +124,31 @@ bool SerialDataLink::checkNewData(bool resetFlag) {
return currentStatus; return currentStatus;
} }
void SerialDataLink::muteACK(bool mute)
{
muteAcknowledgement = mute;
}
void SerialDataLink::run() void SerialDataLink::run()
{ {
unsigned long currentTime = millis();
static DataLinkState oldstate;
// Check if state has not changed for a prolonged period
if (oldstate != currentState)
{
lastStateChangeTime = currentTime;
oldstate = currentState;
}
if ((currentTime - lastStateChangeTime) > stateChangeTimeout) {
// Reset the state to Idle and perform necessary cleanup
currentState = DataLinkState::Idle;
// Perform any additional cleanup or reinitialization here
// ...
lastStateChangeTime = currentTime; // Reset the last state change time
}
switch (currentState) switch (currentState)
{ {
case DataLinkState::Idle: case DataLinkState::Idle:
@ -147,6 +170,11 @@ void SerialDataLink::run()
constructPacket(); // Construct a new packet if not currently transmitting constructPacket(); // Construct a new packet if not currently transmitting
if (muteAcknowledgement)
{
needToACK = false;
needToNACK = false;
}
uint8_t ack; uint8_t ack;
// now it is known which acknoledge need sending since last Reception // now it is known which acknoledge need sending since last Reception
if (needToACK) if (needToACK)
@ -215,6 +243,15 @@ void SerialDataLink::run()
} }
} }
void SerialDataLink::updateState(DataLinkState newState)
{
if (currentState != newState)
{
currentState = newState;
lastStateChangeTime = millis();
}
}
bool SerialDataLink::shouldTransmit() bool SerialDataLink::shouldTransmit()
{ {
// Priority condition: Device with transmitID = 1 and receiveID = 0 has the highest priority // Priority condition: Device with transmitID = 1 and receiveID = 0 has the highest priority

View file

@ -76,6 +76,7 @@ public:
void setHeaderChar(char header); void setHeaderChar(char header);
void setEOTChar(char eot); void setEOTChar(char eot);
void muteACK(bool mute);
private: private:
enum class DataLinkState enum class DataLinkState
@ -115,6 +116,7 @@ private:
bool retransmitEnabled; bool retransmitEnabled;
bool transmissionError = false; bool transmissionError = false;
bool readError = false; bool readError = false;
bool muteAcknowledgement = false;
// Data arrays and update management // Data arrays and update management
@ -130,6 +132,9 @@ private:
unsigned long ACK_TIMEOUT = 100; unsigned long ACK_TIMEOUT = 100;
unsigned long PACKET_TIMEOUT = 100; // Timeout in milliseconds unsigned long PACKET_TIMEOUT = 100; // Timeout in milliseconds
unsigned long lastStateChangeTime = 0;
unsigned long stateChangeTimeout = 200;
// Special characters for packet framing // Special characters for packet framing
char headerChar = '<'; char headerChar = '<';
char eotChar = '>'; char eotChar = '>';
@ -148,6 +153,7 @@ private:
bool sendNextByte(); bool sendNextByte();
bool ackReceived(); bool ackReceived();
bool ackTimeout(); bool ackTimeout();
void updateState(DataLinkState newState);
// Internal methods for reception // Internal methods for reception
void read(); void read();