mirror of
https://github.com/dalathegreat/Battery-Emulator.git
synced 2025-10-04 02:09:30 +02:00
More fixes from Andy
This commit is contained in:
parent
0bfb757dff
commit
6fd2ca52db
4 changed files with 99 additions and 13 deletions
|
@ -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();
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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();
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue