Skip to content
Snippets Groups Projects
Verified Commit 33e0483b authored by Zoe Michaela Dietmar Pfister's avatar Zoe Michaela Dietmar Pfister :gay_pride_flag:
Browse files

rename ForteRS485 class name, add docstrings

parent 40e67cd7
No related branches found
No related tags found
2 merge requests!39Merge Develop into Main,!30Renamed Sentec Sensors, made RS485 serial connection a singleton shared...
Pipeline #102069 failed
......@@ -10,7 +10,7 @@ static const char *TAG = "MAIN";
#define uS_TO_S_FACTOR 1000000 /* Conversion factor for micro seconds to seconds */
#define TIME_TO_SLEEP 0 * 1 /* Time ESP32 will go to sleep (in seconds) */
Forte_RS485 rs485;
ForteRS485 rs485;
ForteINA219 ina219;
SEM404 rainGaugeSensor = SEM404(2, 19);
......@@ -48,9 +48,9 @@ void setup() {
ina219.setup();
try {
Forte_RS485::powerOnRS485Sensors();
ForteRS485::powerOnRS485Sensors();
auto messages = rainGaugeSensor.buildMessages();
Forte_RS485::powerOffRS485Sensors();
ForteRS485::powerOffRS485Sensors();
// split into arrays of 6 messages TODO: Make this cleaner with default constructor
std::array<Message, 6> messages_1 = {Message::nullMessage(), Message::nullMessage(), Message::nullMessage(),
Message::nullMessage(), Message::nullMessage(), Message::nullMessage()};
......@@ -78,7 +78,7 @@ void setup() {
// demo of how to reset the rain gauge
#ifdef RESET_RAIN_GAUGE
if (messages_1.front().getClientDataPackage().getMeasurementData().getValue() > 20) {
Forte_RS485::powerOnRS485Sensors();
ForteRS485::powerOnRS485Sensors();
if (rainGaugeSensor.resetPrecipitation() == ErrorType::SEM404_COULD_NOT_RESET_PRECIPITATION) {
ESP_LOGE(TAG, "Could not reset precipitation");
auto precipitationErrorMessage = Message(
......@@ -90,7 +90,7 @@ void setup() {
Message::nullMessage(), Message::nullMessage()};
Message::sendMessages(messages_error);
}
Forte_RS485::powerOffRS485Sensors();
ForteRS485::powerOffRS485Sensors();
}
#endif
......
......@@ -4,6 +4,8 @@ board = esp32dev
framework = arduino
monitor_speed = 115200
lib_ldf_mode = deep
upload_port = /dev/ttyUSB0
monitor_port = /dev/ttyUSB0
lib_extra_dirs =
../libs
../../shared-libs
......
......@@ -14,6 +14,11 @@ struct out_data_rain_gauge {
ErrorType precipitationError;
};
/**
* @brief Class to read data from the Sentec rain gauge sensor (SEM404)
* @implements ForteSensor<out_data_rain_gauge>
* @extends SentecSensorRS485
*/
class SEM404 : public SentecSensorRS485, ForteSensor<out_data_rain_gauge> {
public:
using SentecSensorRS485::SentecSensorRS485;
......@@ -21,10 +26,19 @@ class SEM404 : public SentecSensorRS485, ForteSensor<out_data_rain_gauge> {
// precipitation values [mm]
unsigned int precipitation = 0; // prcp since reset? (I THINK!!!)
/**
* @brief Reset the precipitation value
* @return ErrorType. If the reset was unsuccessful, this will return ErrorType::SEM404_RESET_PRECIPITATION_ERROR.
* Otherwise it returns the error given from the device
*/
ErrorType resetPrecipitation();
void resetSensor();
/**
* @brief Get the instantaneous precipitation value
* @return out_data_rain_gauge
*/
out_data_rain_gauge getInstantaneousPrecipitation();
String getPrecipitationStr();
......@@ -34,6 +48,13 @@ class SEM404 : public SentecSensorRS485, ForteSensor<out_data_rain_gauge> {
std::list<Message> buildMessages() override;
[[nodiscard]] SensorInformation getSensorInformation() const override;
private:
/**
* @brief Check if the answer frame is equal to the query frame
* @param answerFrame The frame returned from the device
* @param queryFrame The frame sent to the device
* @return true if the answer frame is equal to the query frame
*/
bool isAnswerFrameEqualToQueryFrame(byte *answerFrame, byte *queryFrame);
};
#endif // CLIENT_CENTRAL_MAST_SENTECRAINGAUGESENSOR_H
......@@ -13,6 +13,11 @@ struct out_data_solar_radiation {
ErrorType solarError;
};
/**
* @brief Class to read data from the Sentec solar radiation sensor (SEM228A)
* @implements ForteSensor<out_data_solar_radiation>
* @extends SentecSensorRS485
*/
class SEM228A : public SentecSensorRS485, public ForteSensor<out_data_solar_radiation> {
public:
using SentecSensorRS485::SentecSensorRS485;
......
......@@ -8,6 +8,12 @@
#include <HardwareSerial.h>
#include <memory>
/**
* @brief Singleton class to get the RS485 serial port
* @example std::shared_ptr<HardwareSerial> RS485 = RS485HardwareSerial::getInstance().getRS485Serial();
*/
class RS485HardwareSerial {
public:
static RS485HardwareSerial &getInstance()
......
......@@ -3,8 +3,9 @@
#include "SentecSolarRadiationSensor.h"
// RS485 control
//#define RS485Serial Serial2
#define RXPin 14 // Serial Receive pin
#define TXPin 15 // Serial Transmit pin
#define RX_PIN 14 // Serial Receive pin
#define TX_PIN 15 // Serial Transmit pin
#define RE_DE_PIN 19 // Line to pull high or low to receive or send data from RS485
......@@ -17,20 +18,20 @@ static const char *TAG = "RS485";
SEM228A solarSensor(1, RE_DE_PIN);
SEM404 rainGauge = SEM404(2, RE_DE_PIN);
void Forte_RS485::setup() {
void ForteRS485::setup() {
RS485Serial = RS485HardwareSerial::getInstance().getRS485Serial();
// configure the pins to be output only
pinMode(RE_DE_PIN, OUTPUT);
pinMode(POWER_SWITCH_PIN_12V, OUTPUT);
pinMode(POWER_SWITCH_PIN_5V, OUTPUT);
RS485Serial->begin(4800, SERIAL_8N1, TXPin, RXPin);
RS485Serial->begin(4800, SERIAL_8N1, TX_PIN, RX_PIN);
}
void Forte_RS485::teardown() {
void ForteRS485::teardown() {
RS485Serial->end();
}
out_data_rs485 Forte_RS485::readData() {
out_data_rs485 ForteRS485::readData() {
powerOnRS485Sensors();
out_data_rs485 output{};
......@@ -40,21 +41,21 @@ out_data_rs485 Forte_RS485::readData() {
powerOffRS485Sensors();
return output;
}
void Forte_RS485::powerOffRS485Sensors() {
void ForteRS485::powerOffRS485Sensors() {
digitalWrite(POWER_SWITCH_PIN_12V, LOW);
digitalWrite(POWER_SWITCH_PIN_5V, LOW);
gpio_hold_en((gpio_num_t)POWER_SWITCH_PIN_12V);
gpio_hold_en((gpio_num_t)POWER_SWITCH_PIN_5V);
}
void Forte_RS485::powerOnRS485Sensors() { // Power on sensor
void ForteRS485::powerOnRS485Sensors() { // Power on sensor
digitalWrite(POWER_SWITCH_PIN_12V, HIGH);
digitalWrite(POWER_SWITCH_PIN_5V, HIGH); // Wait for sensors to power up
// TODO minimize delay
delay(1000);
}
std::list<Message> Forte_RS485::buildMessages() {
std::list<Message> ForteRS485::buildMessages() {
std::list<Message> messages;
out_data_rs485 output = readData();
......@@ -69,6 +70,6 @@ std::list<Message> Forte_RS485::buildMessages() {
return messages;
}
SensorInformation Forte_RS485::getSensorInformation() const {
SensorInformation ForteRS485::getSensorInformation() const {
return sensorInformation;
}
\ No newline at end of file
#ifndef _RS485
#define _RS485
#include "ForteSensor.hpp"
#include "Message.hpp"
#include "SentecSensorsRS485.h"
#include <MeasurementTypes.h>
#include <SentecSolarRadiationSensor.h>
#include <RS485HardwareSerial.h>
#include <SentecRainGaugeSensor.h>
#include "Message.hpp"
#include "ForteSensor.hpp"
#include "SentecSensorsRS485.h"
#include <SentecSolarRadiationSensor.h>
/**
* @brief Struct to hold all the data from the RS485 sensors
*/
struct out_data_rs485 {
out_data_solar_radiation solar;
out_data_rain_gauge precipitation;
out_data_solar_radiation solar;
out_data_rain_gauge precipitation;
};
class Forte_RS485: public ForteSensor<out_data_rs485> {
public:
void setup() override;
out_data_rs485 readData() override;
std::list<Message> buildMessages() override;
[[nodiscard]] SensorInformation getSensorInformation() const override;
void teardown();
static void powerOnRS485Sensors();
static void powerOffRS485Sensors();
/**
* @brief Class to read data from both the Sentec solar radiation sensor and the Sentec rain gauge sensor at once
* This class is required to be instantiated and setup in order to use RS485 communication.
*/
class ForteRS485 : public ForteSensor<out_data_rs485> {
public:
void setup() override;
out_data_rs485 readData() override;
std::list<Message> buildMessages() override;
[[nodiscard]] SensorInformation getSensorInformation() const override;
void teardown();
private:
/**
* @brief Power on the RS485 sensors
*/
static void powerOnRS485Sensors();
std::shared_ptr<HardwareSerial> RS485Serial;
/**
* @brief Power off the RS485 sensors
*/
static void powerOffRS485Sensors();
const SensorInformation
sensorInformation{HardwareName::RS485, SensorProtocol::RS485};
private:
std::shared_ptr<HardwareSerial> RS485Serial;
const SensorInformation sensorInformation{HardwareName::RS485, SensorProtocol::RS485};
};
#endif
\ No newline at end of file
#endif
\ No newline at end of file
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment