Merge branch 've.direct-hex' into development

This commit is contained in:
helgeerbe 2023-04-19 14:33:00 +02:00
commit 84a6ed540d
5 changed files with 41 additions and 17 deletions

View File

@ -60,6 +60,7 @@ VeDirectFrameHandler::VeDirectFrameHandler() :
_state(IDLE), _state(IDLE),
_checksum(0), _checksum(0),
_textPointer(0), _textPointer(0),
_hexSize(0),
_name(""), _name(""),
_value(""), _value(""),
_tmpFrame(), _tmpFrame(),
@ -99,7 +100,9 @@ void VeDirectFrameHandler::rxData(uint8_t inbyte)
{ {
//if (mStop) return; //if (mStop) return;
if ( (inbyte == ':') && (_state != CHECKSUM) ) { if ( (inbyte == ':') && (_state != CHECKSUM) ) {
_prevState = _state; //hex frame can interrupt TEXT
_state = RECORD_HEX; _state = RECORD_HEX;
_hexSize = 0;
} }
if (_state != RECORD_HEX) { if (_state != RECORD_HEX) {
_checksum += inbyte; _checksum += inbyte;
@ -177,10 +180,7 @@ void VeDirectFrameHandler::rxData(uint8_t inbyte)
break; break;
} }
case RECORD_HEX: case RECORD_HEX:
if (hexRxEvent(inbyte)) { _state = hexRxEvent(inbyte);
_checksum = 0;
_state = IDLE;
}
break; break;
} }
} }
@ -279,10 +279,27 @@ void VeDirectFrameHandler::logE(const char * module, const char * error) {
/* /*
* hexRxEvent * hexRxEvent
* This function included for continuity and possible future use. * This function records hex answers or async messages
*/ */
bool VeDirectFrameHandler::hexRxEvent(uint8_t inbyte) { int VeDirectFrameHandler::hexRxEvent(uint8_t inbyte) {
return true; // stubbed out for future int ret=RECORD_HEX; // default - continue recording until end of frame
switch (inbyte) {
case '\n':
// restore previous state
ret=_prevState;
break;
default:
_hexSize++;
if (_hexSize>=VE_MAX_HEX_LEN) { // oops -buffer overflow - something went wrong, we abort
logE(MODULE,"hexRx buffer overflow - aborting read");
_hexSize=0;
ret=IDLE;
}
}
return ret;
} }
bool VeDirectFrameHandler::isDataValid() { bool VeDirectFrameHandler::isDataValid() {
@ -510,6 +527,9 @@ String VeDirectFrameHandler::getPidAsString(uint16_t pid)
case 0XA10F: case 0XA10F:
strPID = "BlueSolar MPPT VE.Can 150|100"; strPID = "BlueSolar MPPT VE.Can 150|100";
break; break;
case 0XA110:
strPID = "SmartSolar MPPT RS 450|100";
break;
case 0XA112: case 0XA112:
strPID = "BlueSolar MPPT VE.Can 250|70"; strPID = "BlueSolar MPPT VE.Can 250|70";
break; break;

View File

@ -23,6 +23,8 @@
#define VE_MAX_NAME_LEN 9 // VE.Direct Protocol: max name size is 9 including /0 #define VE_MAX_NAME_LEN 9 // VE.Direct Protocol: max name size is 9 including /0
#define VE_MAX_VALUE_LEN 33 // VE.Direct Protocol: max value size is 33 including /0 #define VE_MAX_VALUE_LEN 33 // VE.Direct Protocol: max value size is 33 including /0
#define VE_MAX_HEX_LEN 100 // Maximum size of hex frame - max payload 34 byte (=68 char) + safe buffer
typedef struct { typedef struct {
uint16_t PID; // product id uint16_t PID; // product id
@ -69,12 +71,14 @@ private:
void textRxEvent(char *, char *); void textRxEvent(char *, char *);
void frameEndEvent(bool); // copy temp struct to public struct void frameEndEvent(bool); // copy temp struct to public struct
void logE(const char *, const char *); void logE(const char *, const char *);
bool hexRxEvent(uint8_t); int hexRxEvent(uint8_t);
//bool mStop; // not sure what Victron uses this for, not using //bool mStop; // not sure what Victron uses this for, not using
int _state; // current state int _state; // current state
int _prevState; // previous state
uint8_t _checksum; // checksum value uint8_t _checksum; // checksum value
char * _textPointer; // pointer to the private buffer we're writing to, name or value char * _textPointer; // pointer to the private buffer we're writing to, name or value
int _hexSize; // length of hex buffer
char _name[VE_MAX_VALUE_LEN]; // buffer for the field name char _name[VE_MAX_VALUE_LEN]; // buffer for the field name
char _value[VE_MAX_VALUE_LEN]; // buffer for the field value char _value[VE_MAX_VALUE_LEN]; // buffer for the field value
veStruct _tmpFrame{}; // private struct for received name and value pairs veStruct _tmpFrame{}; // private struct for received name and value pairs

View File

@ -522,10 +522,10 @@
"InverterIdHint": "Wähle den Wechselrichter an dem die Batterie hängt.", "InverterIdHint": "Wähle den Wechselrichter an dem die Batterie hängt.",
"InverterChannelId": "Kanal ID", "InverterChannelId": "Kanal ID",
"InverterChannelIdHint": "Wähle den Kanal an dem die Batterie hängt.", "InverterChannelIdHint": "Wähle den Kanal an dem die Batterie hängt.",
"TargetPowerConsumption": "Erlaubter Stromverbrauch", "TargetPowerConsumption": "Angestrebter Netzbezung",
"TargetPowerConsumptionHint": "Angestrebter erlaubter Stromverbrauch.", "TargetPowerConsumptionHint": "Angestrebter erlaubter Stromverbrauch aus dem Netz.",
"TargetPowerConsumptionHysteresis": "Hysterese für den Zielstromverbrauch", "TargetPowerConsumptionHysteresis": "Hysterese für den angestrebten Netzbezug",
"TargetPowerConsumptionHysteresisHint": "Wert um den der Zielstromverbrauch schwanken darf, ohne dass nachgeregelt wird.", "TargetPowerConsumptionHysteresisHint": "Wert um den der angestrebte Netzbezug schwanken darf, ohne dass nachgeregelt wird.",
"LowerPowerLimit": "Unteres Leistungslimit", "LowerPowerLimit": "Unteres Leistungslimit",
"UpperPowerLimit": "Oberes Leistungslimit", "UpperPowerLimit": "Oberes Leistungslimit",
"PowerMeters": "Leistungsmesser", "PowerMeters": "Leistungsmesser",

View File

@ -523,10 +523,10 @@
"InverterIdHint": "Select proper inverter ID where battery is connected to.", "InverterIdHint": "Select proper inverter ID where battery is connected to.",
"InverterChannelId": "Channel ID", "InverterChannelId": "Channel ID",
"InverterChannelIdHint": "Select proper channel where battery is connected to.", "InverterChannelIdHint": "Select proper channel where battery is connected to.",
"TargetPowerConsumption": "Target power consumption", "TargetPowerConsumption": "Target power consumption from grid",
"TargetPowerConsumptionHint": "Set the grid power consumption the limiter tries to achieve.", "TargetPowerConsumptionHint": "Set the grid power consumption the limiter tries to achieve.",
"TargetPowerConsumptionHysteresis": "Hysteresis for power consumption", "TargetPowerConsumptionHysteresis": "Hysteresis for power consumption from grid",
"TargetPowerConsumptionHysteresisHint": "Value around which the target power consumption fluctuates without readjustment.", "TargetPowerConsumptionHysteresisHint": "Value around which the target grid power consumption fluctuates without readjustment.",
"LowerPowerLimit": "Lower power limit", "LowerPowerLimit": "Lower power limit",
"UpperPowerLimit": "Upper power limit", "UpperPowerLimit": "Upper power limit",
"PowerMeters": "Power meter", "PowerMeters": "Power meter",

View File

@ -65,7 +65,7 @@
<div class="col-sm-10"> <div class="col-sm-10">
<div class="input-group"> <div class="input-group">
<input type="number" class="form-control" id="targetPowerConsumption" <input type="number" class="form-control" id="targetPowerConsumption"
placeholder="75" min="0" v-model="powerLimiterConfigList.target_power_consumption" placeholder="75" v-model="powerLimiterConfigList.target_power_consumption"
aria-describedby="targetPowerConsumptionDescription" required/> aria-describedby="targetPowerConsumptionDescription" required/>
<span class="input-group-text" id="targetPowerConsumptionDescription">W</span> <span class="input-group-text" id="targetPowerConsumptionDescription">W</span>
</div> </div>