Skip to content
Snippets Groups Projects
Commit 69e2fb96 authored by Zoe Pfister's avatar Zoe Pfister :speech_balloon:
Browse files

WIP: Move ErrorType into MeasurementData

parent 3f52a6ff
No related branches found
No related tags found
2 merge requests!39Merge Develop into Main,!27Move from json-string based transfer between client and host to C struct / class based transfer
......@@ -192,8 +192,8 @@ void LC709203F::setThermistorB(uint16_t beta) {
std::list<Message> LC709203F::buildMessages() {
std::list<Message> messages;
float data = cellVoltage_mV() / 1000.0;
MeasurementData IncrementData{data, 0, NO_I2C_ADDRESS,
MeasurementType::BATTERY_VOLTAGE};
MeasurementData IncrementData{data, 0, NO_I2C_ADDRESS, MeasurementType::BATTERY_VOLTAGE,
ErrorType::DATA_OK};
messages.emplace_back(IncrementData,
sensorInformation,
Time::getInstance().getEpochSeconds());
......
......@@ -71,7 +71,8 @@ std::list<Message> ForteDR26::buildMessages() {
std::list <Message> messages;
float data = readData();
MeasurementData IncrementData
{data, channel, NO_I2C_ADDRESS, MeasurementType::CIRCUMFERENCE_INCREMENT};
{data, channel, NO_I2C_ADDRESS, MeasurementType::CIRCUMFERENCE_INCREMENT,
ErrorType::DATA_OK};
messages.emplace_back(IncrementData,
sensorInformation,
Time::getInstance().getEpochSeconds());
......@@ -82,7 +83,7 @@ std::list<Message> ForteDR26::buildMessages() {
std::list<Message> ForteDR26::buildMessages(MeasurementType measurementType) {
std::list<Message> messages;
float data = readData();
MeasurementData IncrementData{data, channel, NO_I2C_ADDRESS, measurementType};
MeasurementData IncrementData{data, channel, NO_I2C_ADDRESS, measurementType, ErrorType::DATA_OK};
messages.emplace_back(IncrementData,
sensorInformation,
Time::getInstance().getEpochSeconds());
......
......@@ -42,11 +42,12 @@ out_data_drs26 ForteDRS26::readData() {
std::list<Message> ForteDRS26::buildMessages() {
std::list<Message> messages;
MeasurementData circumferenceIncrementMeasurementData{
data.circumferenceIncrement, 0, NO_I2C_ADDRESS,
MeasurementType::CIRCUMFERENCE_INCREMENT};
MeasurementData temperatureMeasurementData{
data.temperature, 0, NO_I2C_ADDRESS, MeasurementType::TEMPERATURE};
MeasurementData circumferenceIncrementMeasurementData{data.circumferenceIncrement, 0,
NO_I2C_ADDRESS,
MeasurementType::CIRCUMFERENCE_INCREMENT,
ErrorType::DATA_OK};
MeasurementData temperatureMeasurementData{data.temperature, 0, NO_I2C_ADDRESS,
MeasurementType::TEMPERATURE, ErrorType::DATA_OK};
messages.emplace_back(circumferenceIncrementMeasurementData,
sensorInformation,
......
......@@ -38,9 +38,7 @@ esp_err_t Message::sendMessages(const std::array<Message, 6> &messages) {
break;
}
clientDataPackages[i] = message.getClientDataPackage();
if (message.clientDataPackage.getTimestamp() == NULL_TIMESTAMP) {
clientDataPackages[i].setErrorType(ErrorType::NULL_MESSAGE);
}
i++;
}
......@@ -81,7 +79,7 @@ Message::Message(ClientDataPackage data) : clientDataPackage(data) {
Message::Message(MeasurementData const &data,
const SensorInformation &information,
unsigned long timestamp)
: clientDataPackage(data, information, ErrorType::DATA_OK, timestamp) {
: clientDataPackage(data, information, timestamp) {
// check for existing host mac address, use broadcast otherwise
get_host_mac(recipient);
}
......
......@@ -27,7 +27,7 @@ class Message {
return Message{MeasurementData(ERROR_VALUE,
NO_CHANNEL,
NO_I2C_ADDRESS,
MeasurementType::NULL_MEASUREMENT),
MeasurementType::NULL_MEASUREMENT, ErrorType::DATA_OK),
SensorInformation(HardwareName::NONE,
SensorProtocol::NULL_PROTOCOL),
NULL_TIMESTAMP};
......
......@@ -27,25 +27,18 @@ out_data_ina219 ForteINA219::readData() {
std::list<Message> ForteINA219::buildMessages() {
std::list<Message> messages;
out_data_ina219 data = readData();
MeasurementData shuntVoltageData{
data.shuntVoltage_mV, 0, NO_I2C_ADDRESS, MeasurementType::SHUNT_VOLTAGE
};
MeasurementData busVoltageData{
data.busVoltage_V, 0, NO_I2C_ADDRESS, MeasurementType::BUS_VOLTAGE
};
MeasurementData currentMilliAmpData{
data.current_mA, 0, NO_I2C_ADDRESS, MeasurementType::CURRENT_mA
};
MeasurementData powerMilliWattData{
data.power_mW, 0, NO_I2C_ADDRESS, MeasurementType::POWER_mA
};
MeasurementData loadVoltageData{
data.loadVoltage_V, 0, NO_I2C_ADDRESS, MeasurementType::LOAD_VOLTAGE_V
};
MeasurementData ina219OverflowData{
static_cast<double>(data.ina219_overflow), 0, NO_I2C_ADDRESS,
MeasurementType::INA219_OVERFLOW
};
MeasurementData shuntVoltageData{data.shuntVoltage_mV, 0, NO_I2C_ADDRESS,
MeasurementType::SHUNT_VOLTAGE, ErrorType::DATA_OK};
MeasurementData busVoltageData{data.busVoltage_V, 0, NO_I2C_ADDRESS, MeasurementType::BUS_VOLTAGE,
ErrorType::DATA_OK};
MeasurementData currentMilliAmpData{data.current_mA, 0, NO_I2C_ADDRESS,
MeasurementType::CURRENT_mA, ErrorType::DATA_OK};
MeasurementData powerMilliWattData{data.power_mW, 0, NO_I2C_ADDRESS, MeasurementType::POWER_mA,
ErrorType::DATA_OK};
MeasurementData loadVoltageData{data.loadVoltage_V, 0, NO_I2C_ADDRESS,
MeasurementType::LOAD_VOLTAGE_V, ErrorType::DATA_OK};
MeasurementData ina219OverflowData{static_cast<double>(data.ina219_overflow), 0, NO_I2C_ADDRESS,
MeasurementType::INA219_OVERFLOW, ErrorType::DATA_OK};
messages.emplace_back(shuntVoltageData, sensorInformation, 0);
messages.emplace_back(busVoltageData, sensorInformation, 0);
......
......@@ -26,7 +26,7 @@ std::list<Message> MockSensor::buildMessages() {
std::list <Message> messages;
float data = readData() + static_cast<float>(DeepSleep::bootCount);
MeasurementData
MockData{data, channel, NO_I2C_ADDRESS, MeasurementType::MOCK};
MockData{data, channel, NO_I2C_ADDRESS, MeasurementType::MOCK, ErrorType::DATA_OK};
messages.emplace_back(MockData,
sensorInformation,
Time::getInstance().getEpochSeconds());
......
......@@ -25,10 +25,12 @@ std::list<Message> ForteSCD30::buildMessages() {
std::list<Message> messages;
data = readData(); // TODO: catch exception
MeasurementData CO2Data{data.C02, 0, NO_I2C_ADDRESS, MeasurementType::CO2};
MeasurementData CO2Data{data.C02, 0, NO_I2C_ADDRESS, MeasurementType::CO2, ErrorType::DATA_OK};
MeasurementData
TempData{data.Temperature, 0, NO_I2C_ADDRESS, MeasurementType::TEMPERATURE};
MeasurementData HumidData{data.Humidity, 0, NO_I2C_ADDRESS, MeasurementType::HUMIDITY};
TempData{data.Temperature, 0, NO_I2C_ADDRESS, MeasurementType::TEMPERATURE,
ErrorType::DATA_OK};
MeasurementData HumidData{data.Humidity, 0, NO_I2C_ADDRESS, MeasurementType::HUMIDITY,
ErrorType::DATA_OK};
messages.emplace_back(CO2Data,
sensorInformation,
......
......@@ -50,10 +50,10 @@ out_data_sht85 Sht85::readData() {
std::list<Message> Sht85::buildMessages() {
std::list<Message> messages;
auto data = readData();
MeasurementData temperatureMeasurementData{
data.temperature, NO_CHANNEL, 0x44, MeasurementType::TEMPERATURE};
MeasurementData humidityMeasurementData{
data.humidity, NO_CHANNEL, 0x44, MeasurementType::HUMIDITY};
MeasurementData temperatureMeasurementData{data.temperature, NO_CHANNEL, 0x44,
MeasurementType::TEMPERATURE, ErrorType::DATA_OK};
MeasurementData humidityMeasurementData{data.humidity, NO_CHANNEL, 0x44,
MeasurementType::HUMIDITY, ErrorType::DATA_OK};
messages.emplace_back(
temperatureMeasurementData,
......
......@@ -95,7 +95,7 @@ void on_data_recv(const uint8_t *mac, const uint8_t *incomingData, int len) {
for (auto &data : compressedDataPackage) {
// ignore padding messages
if (data.getTimestamp() == NULL_TIMESTAMP && data.getErrorType() == ErrorType::NULL_MESSAGE) {
if (data.getTimestamp() == NULL_TIMESTAMP && data.getMeasurementData().getErrorType() == ErrorType::NULL_MESSAGE) {
continue;
}
......
......@@ -13,65 +13,56 @@
// having the data be a struct of basic types makes sending easier,
// otherwise we would have to serialize the data before sending
class ClientDataPackage {
private:
MeasurementData measurementData;
SensorInformation sensorInformation;
ErrorType errorType;
unsigned long timestamp; // maybe make this array
private:
MeasurementData measurementData;
SensorInformation sensorInformation;
unsigned long timestamp; // maybe make this array
public:
ClientDataPackage(MeasurementData value,
SensorInformation sensorInformation,
ErrorType errorType,
unsigned long timestamp)
: measurementData(value),
sensorInformation(sensorInformation),
timestamp(timestamp),
errorType(errorType) {
}
public:
ClientDataPackage(MeasurementData value,
SensorInformation sensorInformation,
unsigned long timestamp)
: measurementData(value),
sensorInformation(sensorInformation),
timestamp(timestamp) {
}
[[nodiscard]] ErrorType getErrorType() const {
return errorType;
}
void setErrorType(ErrorType error) {
ClientDataPackage::errorType = error;
}
[[nodiscard]] const MeasurementData &
getMeasurementData() const { return measurementData; }
[[nodiscard]] const MeasurementData &
getMeasurementData() const { return measurementData; }
[[nodiscard]] const SensorInformation &
getSensorInformation() const { return sensorInformation; }
[[nodiscard]] const SensorInformation &
getSensorInformation() const { return sensorInformation; }
[[nodiscard]] unsigned long getTimestamp() const { return timestamp; }
[[nodiscard]] unsigned long getTimestamp() const { return timestamp; }
[[nodiscard]] std::string getDataPackageAsMinifiedJsonString() const {
StaticJsonDocument<250> document; // 250 byte is the max send size of espnow
[[nodiscard]] std::string getDataPackageAsMinifiedJsonString() const {
StaticJsonDocument<250> document; // 250 byte is the max send size of espnow
document["hardwareName"] = sensorInformation.getHardwareNameString();
document["timestamp"] = timestamp;
document["sensorProtocol"] = sensorInformation.getProtocolString();
document["value"] = measurementData.getValue();
document["hardwareName"] = sensorInformation.getHardwareNameString();
document["timestamp"] = timestamp;
document["sensorProtocol"] = sensorInformation.getProtocolString();
document["value"] = measurementData.getValue();
document["channel"] = measurementData.getChannel();
document["channel"] = measurementData.getChannel();
document["i2cAddress"] = measurementData.getI2CAddress();
document["i2cAddress"] = measurementData.getI2CAddress();
document["measurementType"] = measurementData.getMeasurementTypeString();
document["errorType"] = measurementData.getErrorTypeString();
document["measurementType"] = measurementData.getMeasurementTypeString();
std::string jsonString;
serializeJson(document, jsonString);
return jsonString;
}
std::string jsonString;
serializeJson(document, jsonString);
return jsonString;
}
ClientDataPackage() : measurementData(MeasurementData(ERROR_VALUE,
MeasurementType::TEMPERATURE)),
sensorInformation(SensorInformation(HardwareName::NONE,
SensorProtocol::NULL_PROTOCOL)),
timestamp(0),
errorType(ErrorType::NO_DATA) {}
ClientDataPackage() : measurementData(MeasurementData(ERROR_VALUE, NO_CHANNEL, NO_I2C_ADDRESS,
MeasurementType::TEMPERATURE,
ErrorType::NULL_MESSAGE)),
sensorInformation(SensorInformation(HardwareName::NONE,
SensorProtocol::NULL_PROTOCOL)),
timestamp(0) {}
};
......@@ -14,43 +14,55 @@
#include <utility>
#include <MeasurementTypes.h>
#include <GlobalDefinitions.hpp>
#include "ErrorTypes.h"
class MeasurementData {
public:
MeasurementData(double value,
int channel,
int i2cAddress,
MeasurementType measurementType)
: value(value), measurementType(measurementType), channel(channel),
i2cAddress(i2cAddress) {
}
MeasurementData(double value, MeasurementType measurementType)
: value(value), measurementType(measurementType) {
channel = NO_CHANNEL;
i2cAddress = NO_I2C_ADDRESS;
}
[[nodiscard]] double getValue() const { return value; }
[[nodiscard]] const MeasurementType &
getMeasurementType() const { return measurementType; }
[[nodiscard]] std::string getMeasurementTypeString() const {
return MeasurementTypes::measurementTypeToString(measurementType);
}
[[nodiscard]] const int &getChannel() const { return channel; }
[[nodiscard]] const int &
getI2CAddress() const { return i2cAddress; }
private:
double value;
MeasurementType measurementType;
// TODO: is it possible for a sensor to have both a channel and an i2cAddress?
int channel = NO_CHANNEL;
int i2cAddress = NO_I2C_ADDRESS;
public:
MeasurementData(double value, int channel, int i2cAddress, MeasurementType measurementType,
ErrorType errorType)
: value(value), measurementType(measurementType), channel(channel),
i2cAddress(i2cAddress), errorType(errorType) {
}
MeasurementData(double value, MeasurementType measurementType)
: value(value), measurementType(measurementType) {
channel = NO_CHANNEL;
i2cAddress = NO_I2C_ADDRESS;
errorType = ErrorType::DATA_OK;
}
[[nodiscard]] double getValue() const { return value; }
[[nodiscard]] const MeasurementType &
getMeasurementType() const { return measurementType; }
[[nodiscard]] std::string getMeasurementTypeString() const {
return MeasurementTypes::measurementTypeToString(measurementType);
}
[[nodiscard]] const int &getChannel() const { return channel; }
[[nodiscard]] const ErrorType &getErrorType() const { return errorType; }
[[nodiscard]] std::string getErrorTypeString() const {
return ErrorTypes::errorTypeToString(errorType);
}
void setErrorType(ErrorType type) {
errorType = type;
}
[[nodiscard]] const int &
getI2CAddress() const { return i2cAddress; }
private:
double value;
MeasurementType measurementType;
ErrorType errorType;
// TODO: is it possible for a sensor to have both a channel and an i2cAddress?
int channel = NO_CHANNEL;
int i2cAddress = NO_I2C_ADDRESS;
};
#endif // CLIENT_MEASUREMENTDATA_HPP
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