@ -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 |