mirror of
https://github.com/lumapu/ahoy.git
synced 2025-05-10 07:26:38 +02:00
Merge branch 'main' into esp32-adjustments
This commit is contained in:
commit
c38afda489
10 changed files with 215 additions and 163 deletions
|
@ -84,6 +84,29 @@ void app::loop(void) {
|
|||
Inverter<> *iv = mSys->findInverter(&p->packet[1]);
|
||||
if(NULL != iv && p->packet[0] == (TX_REQ_INFO + 0x80)) { // response from get information command
|
||||
DPRINTLN(DBG_DEBUG, F("Response from info request received"));
|
||||
uint8_t *pid = &p->packet[9];
|
||||
if (*pid == 0x00)
|
||||
{
|
||||
DPRINT(DBG_DEBUG, "fragment number zero received and ignored");
|
||||
}
|
||||
else
|
||||
{
|
||||
if ((*pid & 0x7F) < 5)
|
||||
{
|
||||
memcpy(mPayload[iv->id].data[(*pid & 0x7F) - 1], &p->packet[10], len - 11);
|
||||
mPayload[iv->id].len[(*pid & 0x7F) - 1] = len - 11;
|
||||
}
|
||||
|
||||
if ((*pid & 0x80) == 0x80)
|
||||
{ // Last packet
|
||||
if ((*pid & 0x7f) > mPayload[iv->id].maxPackId)
|
||||
{
|
||||
mPayload[iv->id].maxPackId = (*pid & 0x7f);
|
||||
if (*pid > 0x81)
|
||||
mLastPacketId = *pid;
|
||||
}
|
||||
}
|
||||
}
|
||||
switch (mSys->InfoCmd){
|
||||
case InverterDevInform_Simple:
|
||||
{
|
||||
|
@ -94,7 +117,6 @@ void app::loop(void) {
|
|||
case InverterDevInform_All:
|
||||
{
|
||||
DPRINT(DBG_INFO, "Response from inform all\n");
|
||||
mSys->InfoCmd = RealTimeRunData_Debug; // Set back to default
|
||||
break;
|
||||
}
|
||||
case GetLossRate:
|
||||
|
@ -117,23 +139,6 @@ void app::loop(void) {
|
|||
}
|
||||
case RealTimeRunData_Debug:
|
||||
{
|
||||
uint8_t *pid = &p->packet[9];
|
||||
if (*pid == 0x00) {
|
||||
DPRINT(DBG_DEBUG, "fragment number zero received and ignored");
|
||||
} else {
|
||||
if((*pid & 0x7F) < 5) {
|
||||
memcpy(mPayload[iv->id].data[(*pid & 0x7F) - 1], &p->packet[10], len-11);
|
||||
mPayload[iv->id].len[(*pid & 0x7F) - 1] = len-11;
|
||||
}
|
||||
|
||||
if((*pid & 0x80) == 0x80) { // Last packet
|
||||
if((*pid & 0x7f) > mPayload[iv->id].maxPackId) {
|
||||
mPayload[iv->id].maxPackId = (*pid & 0x7f);
|
||||
if(*pid > 0x81)
|
||||
mLastPacketId = *pid;
|
||||
}
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
@ -175,7 +180,7 @@ void app::loop(void) {
|
|||
|
||||
|
||||
if(rxRdy) {
|
||||
processPayload(true);
|
||||
processPayload(true,mSys->InfoCmd);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -261,7 +266,7 @@ void app::loop(void) {
|
|||
|
||||
if(NULL != iv) {
|
||||
if(!mPayload[iv->id].complete)
|
||||
processPayload(false);
|
||||
processPayload(false,mSys->InfoCmd);
|
||||
|
||||
if(!mPayload[iv->id].complete) {
|
||||
mRxFailed++;
|
||||
|
@ -271,13 +276,7 @@ void app::loop(void) {
|
|||
}
|
||||
}
|
||||
|
||||
// reset payload data
|
||||
memset(mPayload[iv->id].len, 0, MAX_PAYLOAD_ENTRIES);
|
||||
mPayload[iv->id].retransmits = 0;
|
||||
mPayload[iv->id].maxPackId = 0;
|
||||
mPayload[iv->id].complete = false;
|
||||
mPayload[iv->id].requested = true;
|
||||
mPayload[iv->id].ts = mTimestamp;
|
||||
resetPayload(iv);
|
||||
|
||||
yield();
|
||||
if(mConfig.serialDebug)
|
||||
|
@ -335,6 +334,9 @@ bool app::buildPayload(uint8_t id) {
|
|||
|
||||
//-----------------------------------------------------------------------------
|
||||
void app::processPayload(bool retransmit) {
|
||||
processPayload(retransmit, RealTimeRunData_Debug);
|
||||
}
|
||||
void app::processPayload(bool retransmit, uint8_t cmd = RealTimeRunData_Debug) { // cmd value decides which parser is used to decode payload
|
||||
|
||||
#ifdef __MQTT_AFTER_RX__
|
||||
boolean doMQTT = false;
|
||||
|
@ -390,12 +392,14 @@ void app::processPayload(bool retransmit) {
|
|||
mSys->Radio.dumpBuf(NULL, payload, offs);
|
||||
}
|
||||
mRxSuccess++;
|
||||
mSys->InfoCmd = RealTimeRunData_Debug; // On success set back to default
|
||||
|
||||
iv->getAssignment(cmd); // choose the parser
|
||||
for(uint8_t i = 0; i < iv->listLen; i++) {
|
||||
iv->addValue(i, payload);
|
||||
iv->addValue(i, payload,cmd); // cmd value decides which parser is used to decode payload
|
||||
yield();
|
||||
}
|
||||
iv->doCalculations();
|
||||
iv->doCalculations(cmd); // cmd value decides which parser is used to decode payload
|
||||
|
||||
#ifdef __MQTT_AFTER_RX__
|
||||
doMQTT = true;
|
||||
|
@ -432,7 +436,6 @@ void app::cbMqtt(char* topic, byte* payload, unsigned int length) {
|
|||
if (std::strcmp(token,"devcontrol")==0){
|
||||
token = strtok(NULL, "/");
|
||||
uint8_t iv_id = std::stoi(token);
|
||||
uint8_t powerLimitControl = 0;
|
||||
if (iv_id >= 0 && iv_id <= MAX_NUM_INVERTERS){
|
||||
Inverter<> *iv = this->mSys->getInverterByPos(iv_id);
|
||||
if(NULL != iv) {
|
||||
|
@ -442,24 +445,22 @@ void app::cbMqtt(char* topic, byte* payload, unsigned int length) {
|
|||
case ActivePowerContr: // Active Power Control
|
||||
token = strtok(NULL, "/"); // get ControlMode aka "PowerPF.Desc" in DTU-Pro Code from topic string
|
||||
if (token == NULL) // default via mqtt ommit the LimitControlMode
|
||||
powerLimitControl = AbsolutNonPersistent;
|
||||
iv->powerLimit[1] = AbsolutNonPersistent;
|
||||
else
|
||||
powerLimitControl = std::stoi(token);
|
||||
// 0x0001 -> relativ limit in percent
|
||||
// 0x0000 -> absolut limit in Watt
|
||||
// 0x0101 -> persisten limit in percent (?)
|
||||
// ...
|
||||
if (true){ // if (std::stoi((char*)payload) > 0) error handling powerlimit needed?
|
||||
iv->devControlCmd = ActivePowerContr;
|
||||
iv->powerLimit[0] = std::stoi((char*)payload);
|
||||
if (powerLimitControl >= AbsolutNonPersistent && powerLimitControl <= RelativNonPersistent)
|
||||
iv->powerLimit[1] = powerLimitControl;
|
||||
if (iv->powerLimit[1] & 0x0001)
|
||||
DPRINTLN(DBG_INFO, F("Power limit for inverter ") + String(iv->id) + F(" set to ") + String(iv->powerLimit[0]) + F("%") );
|
||||
else
|
||||
DPRINTLN(DBG_INFO, F("Power limit for inverter ") + String(iv->id) + F(" set to ") + String(iv->powerLimit[0]) + F("W") );
|
||||
iv->powerLimit[1] = std::stoi(token);
|
||||
if (length<=5){ // if (std::stoi((char*)payload) > 0) more error handling powerlimit needed?
|
||||
if (iv->powerLimit[1] >= AbsolutNonPersistent && iv->powerLimit[1] <= RelativPersistent){
|
||||
iv->devControlCmd = ActivePowerContr;
|
||||
iv->powerLimit[0] = std::stoi(std::string((char*)payload, (unsigned int)length)); // THX to @silversurfer
|
||||
if (iv->powerLimit[1] & 0x0001)
|
||||
DPRINTLN(DBG_INFO, F("Power limit for inverter ") + String(iv->id) + F(" set to ") + String(iv->powerLimit[0]) + F("%") );
|
||||
else
|
||||
DPRINTLN(DBG_INFO, F("Power limit for inverter ") + String(iv->id) + F(" set to ") + String(iv->powerLimit[0]) + F("W") );
|
||||
}
|
||||
iv->devControlRequest = true;
|
||||
} else {
|
||||
DPRINTLN(DBG_INFO, F("Invalid mqtt payload recevied: ") + String((char*)payload));
|
||||
}
|
||||
iv->devControlRequest = true;
|
||||
break;
|
||||
case TurnOn: // Turn On
|
||||
iv->devControlCmd = TurnOn;
|
||||
|
@ -518,7 +519,7 @@ String app::getStatistics(void) {
|
|||
iv = mSys->getInverterByPos(i);
|
||||
if(NULL != iv) {
|
||||
bool avail = true;
|
||||
content += F("Inverter '") + String(iv->name) + F("' is ");
|
||||
content += F("Inverter '") + String(iv->name) + F(" (FW-Version: ") + String(iv->fwVersion) +F(")") + F("' is ");
|
||||
if(!iv->isAvailable(mTimestamp)) {
|
||||
content += F("not ");
|
||||
avail = false;
|
||||
|
@ -937,3 +938,15 @@ void app::setupMqtt(void) {
|
|||
}
|
||||
}
|
||||
}
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
void app::resetPayload(Inverter<>* iv)
|
||||
{
|
||||
// reset payload data
|
||||
memset(mPayload[iv->id].len, 0, MAX_PAYLOAD_ENTRIES);
|
||||
mPayload[iv->id].retransmits = 0;
|
||||
mPayload[iv->id].maxPackId = 0;
|
||||
mPayload[iv->id].complete = false;
|
||||
mPayload[iv->id].requested = true;
|
||||
mPayload[iv->id].ts = mTimestamp;
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue