esphome-geiger-counter/components/geiger_counter_sensor/geiger_counter_sensor.cpp

114 lines
3.0 KiB
C++

#include "geiger_counter_sensor.h"
#include "esphome/core/log.h"
#include "esphome.h"
namespace esphome {
namespace geiger_counter_sensor {
static const char *TAG = "geiger_counter_sensor.sensor";
void GeigerCounterSensor::setup() {
ESP_LOGCONFIG(TAG, "Setting up Geiger Counter Sensor...");
if (green_led_pin_ != nullptr) {
green_led_pin_->setup();
green_led_pin_->digital_write(false);
}
if (yellow_led_pin_ != nullptr) {
yellow_led_pin_->setup();
yellow_led_pin_->digital_write(false);
}
if (red_led_pin_ != nullptr) {
red_led_pin_->setup();
red_led_pin_->digital_write(false);
}
}
void GeigerCounterSensor::loop() {
const int max_line_length = 80;
static char buffer[max_line_length];
while (available()) {
if (readline(read(), buffer, max_line_length) > 0) {
int cpm = atof(buffer);
float usv = cpm * 0.0057;
ESP_LOGCONFIG(TAG, "Received radiation level: %d cpm, %.2f μSv", cpm, usv);
this->publish_state(usv);
if (usv < safe_level_) {
if (green_led_pin_ != nullptr) {
green_led_pin_->digital_write(true);
}
if (yellow_led_pin_ != nullptr) {
yellow_led_pin_->digital_write(false);
}
if (red_led_pin_ != nullptr) {
red_led_pin_->digital_write(false);
}
} else if (usv >= safe_level_ && usv < warning_level_) {
if (green_led_pin_ != nullptr) {
green_led_pin_->digital_write(false);
}
if (yellow_led_pin_ != nullptr) {
yellow_led_pin_->digital_write(true);
}
if (red_led_pin_ != nullptr) {
red_led_pin_->digital_write(false);
}
} else {
if (green_led_pin_ != nullptr) {
green_led_pin_->digital_write(false);
}
if (yellow_led_pin_ != nullptr) {
yellow_led_pin_->digital_write(false);
}
if (red_led_pin_ != nullptr) {
red_led_pin_->digital_write(true);
}
}
}
}
}
void GeigerCounterSensor::dump_config() {
LOG_SENSOR("", "Geiger Counter Sensor", this);
}
void GeigerCounterSensor::update() {
}
} // namespace geiger_counter_sensor
} // namespace esphome
int readline(int readch, char *buffer, int len) {
static int pos = 0;
int rpos;
if (readch > 0) {
switch (readch) {
case '\n':
case '\r': // Return on CR or newline
buffer[pos] = 0; // Just to be sure, set last character 0
rpos = pos;
pos = 0; // Reset position index ready for next time
return rpos;
default:
if ((pos < len-1) && ( readch < 127 )) { // Filter on <127 to make sure it is a character
buffer[pos++] = readch;
buffer[pos] = 0;
}
else
{
buffer[pos] = 0; // Just to be sure, set last character 0
rpos = pos;
pos = 0; // Reset position index ready for next time
return rpos;
}
}
}
// No end of line has been found, so return -1.
return -1;
}