44 lines
1.0 KiB
C++
44 lines
1.0 KiB
C++
// https://esphome.io/cookbook/uart_text_sensor.html
|
|
#include "esphome.h"
|
|
|
|
class UartReadLineSensor : public Component, public UARTDevice, public TextSensor {
|
|
public:
|
|
UartReadLineSensor(UARTComponent *parent) : UARTDevice(parent) {}
|
|
|
|
void setup() override {
|
|
// nothing to do here
|
|
}
|
|
|
|
int readline(int readch, char *buffer, int len)
|
|
{
|
|
static int pos = 0;
|
|
int rpos;
|
|
|
|
if (readch > 0) {
|
|
switch (readch) {
|
|
case '\n': // Ignore new-lines
|
|
break;
|
|
case '\r': // Return on CR
|
|
rpos = pos;
|
|
pos = 0; // Reset position index ready for next time
|
|
return rpos;
|
|
default:
|
|
if (pos < len-1) {
|
|
buffer[pos++] = readch;
|
|
buffer[pos] = 0;
|
|
}
|
|
}
|
|
}
|
|
// No end of line has been found, so return -1.
|
|
return -1;
|
|
}
|
|
|
|
void loop() override {
|
|
const int max_line_length = 80;
|
|
static char buffer[max_line_length];
|
|
if (available() && readline(read(), buffer, max_line_length) > 0) {
|
|
publish_state(buffer);
|
|
}
|
|
}
|
|
};
|