/*
|
|
|
|
UART_MQTT MODULE
|
|
|
|
Copyright (C) 2018 by Albert Weterings
|
|
Adapted by Xose Pérez <xose dot perez at gmail dot com>
|
|
|
|
Module key prefix: u2m
|
|
|
|
*/
|
|
|
|
#if UART_MQTT_SUPPORT
|
|
|
|
char _uartmqttBuffer[UART_MQTT_BUFFER_SIZE];
|
|
bool _uartmqttNewData = false;
|
|
|
|
#if UART_MQTT_USE_SOFT
|
|
#include <SoftwareSerial.h>
|
|
SoftwareSerial _uart_mqtt_serial(UART_MQTT_RX_PIN, UART_MQTT_TX_PIN, false, UART_MQTT_BUFFER_SIZE);
|
|
#define UART_MQTT_PORT _uart_mqtt_serial
|
|
#else
|
|
#define UART_MQTT_PORT UART_MQTT_HW_PORT
|
|
#endif
|
|
|
|
// -----------------------------------------------------------------------------
|
|
// Private
|
|
// -----------------------------------------------------------------------------
|
|
|
|
void _uartmqttReceiveUART() {
|
|
|
|
static unsigned char ndx = 0;
|
|
|
|
while (UART_MQTT_PORT.available() > 0 && _uartmqttNewData == false) {
|
|
|
|
char rc = UART_MQTT_PORT.read();
|
|
|
|
if (rc != UART_MQTT_TERMINATION) {
|
|
|
|
_uartmqttBuffer[ndx] = rc;
|
|
if (ndx < UART_MQTT_BUFFER_SIZE - 1) ndx++;
|
|
|
|
} else {
|
|
|
|
_uartmqttBuffer[ndx] = '\0';
|
|
_uartmqttNewData = true;
|
|
ndx = 0;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
void _uartmqttSendMQTT() {
|
|
if (_uartmqttNewData == true && MQTT_SUPPORT) {
|
|
DEBUG_MSG_P(PSTR("[UART_MQTT] Send data over MQTT: %s\n"), _uartmqttBuffer);
|
|
mqttSend(MQTT_TOPIC_UARTIN, _uartmqttBuffer);
|
|
_uartmqttNewData = false;
|
|
}
|
|
}
|
|
|
|
void _uartmqttSendUART(const char * message) {
|
|
DEBUG_MSG_P(PSTR("[UART_MQTT] Send data over UART: %s\n"), message);
|
|
UART_MQTT_PORT.println(message);
|
|
}
|
|
|
|
void _uartmqttMQTTCallback(unsigned int type, const char * topic, const char * payload) {
|
|
|
|
if (type == MQTT_CONNECT_EVENT) {
|
|
mqttSubscribe(MQTT_TOPIC_UARTOUT);
|
|
}
|
|
|
|
if (type == MQTT_MESSAGE_EVENT) {
|
|
|
|
// Match topic
|
|
String t = mqttMagnitude((char *) topic);
|
|
if (t.equals(MQTT_TOPIC_UARTOUT)) {
|
|
_uartmqttSendUART(payload);
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
bool _uartmqttKeyCheck(const char * key) {
|
|
return (strncmp(key, "u2m", 3) == 0);
|
|
}
|
|
|
|
|
|
// -----------------------------------------------------------------------------
|
|
// SETUP & LOOP
|
|
// -----------------------------------------------------------------------------
|
|
|
|
void _uartmqttLoop() {
|
|
_uartmqttReceiveUART();
|
|
_uartmqttSendMQTT();
|
|
}
|
|
|
|
void uartmqttSetup() {
|
|
|
|
// Init port
|
|
UART_MQTT_PORT.begin(UART_MQTT_BAUDRATE);
|
|
|
|
// Register MQTT callbackj
|
|
mqttRegister(_uartmqttMQTTCallback);
|
|
|
|
// Register key check
|
|
settingsRegisterKeyCheck(_uartmqttKeyCheck);
|
|
|
|
// Register loop
|
|
espurnaRegisterLoop(_uartmqttLoop);
|
|
|
|
}
|
|
|
|
#endif // UART_MQTT_SUPPORT
|