send buffer handling and token stuff
This commit is contained in:
@ -31,17 +31,17 @@ Metro secondTick = Metro(1000);
|
||||
|
||||
|
||||
MqttClient::MqttClient(RequestSender *meterBusMaster) :
|
||||
m_client(), m_meterBusMaster(meterBusMaster), m_mqttClient(MQTT_BROKER, MQTT_PORT, callback, m_client),
|
||||
m_disconnectState(3), m_disconnectTime(millis()), m_uptime(0)
|
||||
m_client(), m_meterBusMaster(meterBusMaster), m_mqttClient(MQTT_BROKER, MQTT_PORT, callback, m_client),
|
||||
m_disconnectState(3), m_disconnectTime(millis()), m_uptime(0), m_deviceIdx(0)
|
||||
{
|
||||
for (uint8_t i = 0; i < NUM_OF_DEVICES; i++) {
|
||||
m_mbusDevTuple[i] = { 0, 0, 0 };
|
||||
m_mbusDevTuple[i] = { 0, 0, 0, 0 };
|
||||
}
|
||||
|
||||
m_mbusDevTuple[0] = { 0x53, 60, 0 }; // light meter
|
||||
m_mbusDevTuple[0] = { 1, 0x53, 60, 0 }; // light meter
|
||||
}
|
||||
|
||||
void MqttClient::sendResponse(uint8_t *responseBuffer, uint16_t responseBufferLength) {
|
||||
void MqttClient::sendResponse(uint8_t *responseBuffer, uint16_t responseBufferLength, uint8_t token) {
|
||||
char strbuf[256];
|
||||
memset(strbuf, sizeof(strbuf), 0);
|
||||
PString buf = PString(strbuf, sizeof(strbuf));
|
||||
@ -49,21 +49,22 @@ void MqttClient::sendResponse(uint8_t *responseBuffer, uint16_t responseBufferLe
|
||||
|
||||
buf << "{ \"metadata\": { \"device\": \"MeterbusHub\" }, " <<
|
||||
"\"data\": {" <<
|
||||
"\"uptime\": " << m_uptime << ", "
|
||||
"\"token\": " << token << ", " <<
|
||||
"\"uptime\": " << m_uptime << ", " <<
|
||||
"\"telegram\": \"";
|
||||
|
||||
uint16_t i = 0;
|
||||
while (true) {
|
||||
if (responseBuffer[i] <= 0x0f) {
|
||||
buf.print("0");
|
||||
}
|
||||
buf.print(responseBuffer[i], HEX);
|
||||
buf.print(" ");
|
||||
i++;
|
||||
if (i == responseBufferLength) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
uint16_t i = 0;
|
||||
while (true) {
|
||||
if (responseBuffer[i] <= 0x0f) {
|
||||
buf.print("0");
|
||||
}
|
||||
buf.print(responseBuffer[i], HEX);
|
||||
buf.print(" ");
|
||||
i++;
|
||||
if (i == responseBufferLength) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
buf << "\"}}";
|
||||
|
||||
@ -77,7 +78,7 @@ void MqttClient::sendResponse(uint8_t *responseBuffer, uint16_t responseBufferLe
|
||||
// m_server.write(responseBuffer, responseBufferLength);
|
||||
}
|
||||
|
||||
void MqttClient::sendError(uint8_t code) {
|
||||
void MqttClient::sendError(uint8_t code, uint8_t token) {
|
||||
}
|
||||
|
||||
void MqttClient::begin() {
|
||||
@ -130,21 +131,40 @@ void MqttClient::exec() {
|
||||
Serial << "no MQTT connection, message lost: " << msg << endl;
|
||||
}
|
||||
|
||||
|
||||
for (uint8_t i = 0; i < NUM_OF_DEVICES; i++) {
|
||||
if ((m_mbusDevTuple[i].address != 0) && (m_mbusDevTuple[i].timer == 0)) {
|
||||
m_mbusDevTuple[i].timer = m_mbusDevTuple[i].queryPeriod;
|
||||
Serial << "Issue request for device " << m_mbusDevTuple[i].address << endl;
|
||||
|
||||
uint8_t *sendBuffer = m_meterBusMaster->getSendBuffer();
|
||||
sendBuffer[0] = 0x10;
|
||||
sendBuffer[1] = 0x5b;
|
||||
sendBuffer[2] = m_mbusDevTuple[i].address;
|
||||
sendBuffer[3] = (uint8_t)(sendBuffer[1] + sendBuffer[2]);
|
||||
sendBuffer[4] = 0x16;
|
||||
m_meterBusMaster->sendBufferReady(5, this);
|
||||
if ((m_mbusDevTuple[i].address != 0) && (m_mbusDevTuple[i].timer != 0)) {
|
||||
m_mbusDevTuple[i].timer -= 1;
|
||||
if (m_mbusDevTuple[i].timer == 0) {
|
||||
Serial << "Device " << m_mbusDevTuple[i].token << " ready for request" << endl;
|
||||
} else {
|
||||
Serial << "Device " << m_mbusDevTuple[i].token << " not ready for request, timer: " << m_mbusDevTuple[i].timer << endl;
|
||||
}
|
||||
}
|
||||
m_mbusDevTuple[i].timer -= 1;
|
||||
}
|
||||
|
||||
while (m_deviceIdx < NUM_OF_DEVICES) {
|
||||
if ((m_mbusDevTuple[m_deviceIdx].address != 0) && (m_mbusDevTuple[m_deviceIdx].timer == 0)) {
|
||||
m_mbusDevTuple[m_deviceIdx].timer = m_mbusDevTuple[m_deviceIdx].queryPeriod;
|
||||
Serial << "Issue request for device " << m_mbusDevTuple[m_deviceIdx].token << endl;
|
||||
uint8_t *sendBuffer = m_meterBusMaster->getSendBuffer();
|
||||
if (sendBuffer != 0) {
|
||||
Serial << "send buffer ready" << endl;
|
||||
|
||||
sendBuffer[0] = 0x10;
|
||||
sendBuffer[1] = 0x5b;
|
||||
sendBuffer[2] = m_mbusDevTuple[m_deviceIdx].address;
|
||||
sendBuffer[3] = (uint8_t)(sendBuffer[1] + sendBuffer[2]);
|
||||
sendBuffer[4] = 0x16;
|
||||
m_meterBusMaster->sendBufferReady(5, m_mbusDevTuple[m_deviceIdx].token, this);
|
||||
break;
|
||||
} else {
|
||||
Serial << "no send buffer ready" << endl;
|
||||
}
|
||||
}
|
||||
m_deviceIdx++;
|
||||
}
|
||||
if (m_deviceIdx >= NUM_OF_DEVICES) {
|
||||
m_deviceIdx = 0;
|
||||
}
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user