@ -1,86 +0,0 @@ | |||||
#ifdef UART_MQTT_SUPPORT | |||||
// ----------------------------------------------------------------------------- | |||||
// GLOBALS TO THE MODULE | |||||
// ----------------------------------------------------------------------------- | |||||
const byte numChars = 100; | |||||
char receivedChars[numChars]; // an array to store the received data | |||||
boolean newData = false; | |||||
void _recvWithEndMarker() { | |||||
static byte ndx = 0; | |||||
char endMarker = '\n'; | |||||
char rc; | |||||
while (Serial.available() > 0 && newData == false) { | |||||
rc = Serial.read(); | |||||
if (rc != endMarker) { | |||||
receivedChars[ndx] = rc; | |||||
ndx++; | |||||
if (ndx >= numChars) { | |||||
ndx = numChars - 1; | |||||
} | |||||
} | |||||
else { | |||||
receivedChars[ndx] = '\0'; // terminate the string | |||||
ndx = 0; | |||||
newData = true; | |||||
} | |||||
} | |||||
} | |||||
void _uartSendUART_MQTT() { | |||||
if (newData == true && MQTT_SUPPORT) { | |||||
DEBUG_MSG_P(PSTR("[UART_MQTT] Send data over MQTT: %s\n"), receivedChars); | |||||
mqttSend(MQTT_TOPIC_UARTIN, receivedChars); // publish: UART -> mqtt bus | |||||
newData = false; | |||||
} | |||||
} | |||||
void _uartSendMQTT_UART(const char * message) { | |||||
DEBUG_MSG_P(PSTR("[UART_MQTT] Send data over UART: %s\n"), message); | |||||
Serial.print(message); | |||||
Serial.println(); | |||||
} | |||||
#if MQTT_SUPPORT | |||||
void _UART_MQTTMqttCallback(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 = mqttTopicKey((char *) topic); | |||||
bool isUARTOut = t.equals(MQTT_TOPIC_UARTOUT); | |||||
if (isUARTOut) { | |||||
_uartSendMQTT_UART(payload); | |||||
} | |||||
} | |||||
} | |||||
#endif | |||||
// ----------------------------------------------------------------------------- | |||||
// SETUP & LOOP | |||||
// ----------------------------------------------------------------------------- | |||||
void uart_mqttSetup() { | |||||
#if MQTT_SUPPORT | |||||
mqttRegister(_UART_MQTTMqttCallback); | |||||
#endif | |||||
// Register oop | |||||
espurnaRegisterLoop(UART_MQTTLoop); | |||||
} | |||||
void UART_MQTTLoop() { | |||||
_recvWithEndMarker(); | |||||
_uartSendUART_MQTT(); | |||||
} | |||||
#endif |
@ -0,0 +1,95 @@ | |||||
/* | |||||
UART_MQTT MODULE | |||||
Copyright (C) 2018 by Albert Weterings | |||||
Adapted by Xose Pérez <xose dot perez at gmail dot com> | |||||
*/ | |||||
#ifdef UART_MQTT_SUPPORT | |||||
char _uartmqttBuffer[UART_MQTT_BUFFER_SIZE]; | |||||
bool _uartmqttNewData = false; | |||||
// ----------------------------------------------------------------------------- | |||||
// Private | |||||
// ----------------------------------------------------------------------------- | |||||
void _uartmqttReceiveUART() { | |||||
static unsigned char ndx = 0; | |||||
while (UART_MQTT_PORT.available() > 0 && _uartmqttNewData == false) { | |||||
char rc = UART_MQTT_PORT.read(); | |||||
if (rc != '\n') { | |||||
_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); | |||||
} | |||||
} | |||||
} | |||||
// ----------------------------------------------------------------------------- | |||||
// SETUP & LOOP | |||||
// ----------------------------------------------------------------------------- | |||||
void _uartmqttLoop() { | |||||
_uartmqttReceiveUART(); | |||||
_uartmqttSendMQTT(); | |||||
} | |||||
void uartmqttSetup() { | |||||
// Init port | |||||
UART_MQTT_PORT.begin(UART_MQTT_BAUDRATE); | |||||
// Register MQTT callbackj | |||||
mqttRegister(_uartmqttMQTTCallback); | |||||
// Register loop | |||||
espurnaRegisterLoop(_uartmqttLoop); | |||||
} | |||||
#endif |