diff --git a/ROV/src/Core/Event.h b/ROV/src/Core/Event.h index 01d9be6..863708f 100644 --- a/ROV/src/Core/Event.h +++ b/ROV/src/Core/Event.h @@ -38,6 +38,7 @@ namespace Core { LightChange, // Data in LightChangeDetails VideoRecord, // Data in bool Shutdown, // No extra data + TemperatureTaken, // Data in float Count }; @@ -45,7 +46,7 @@ namespace Core { EventType type = Count; - std::variant data; + std::variant data; explicit Event(EventType t) : type(t) {} }; diff --git a/ROV/src/Sensors/Conductivity.cpp b/ROV/src/Sensors/Conductivity.cpp index f7c0d30..ab64fe0 100644 --- a/ROV/src/Sensors/Conductivity.cpp +++ b/ROV/src/Sensors/Conductivity.cpp @@ -1,13 +1,20 @@ #include "Conductivity.h" +#include "../Core/GlobalContext.h" + +Sensor::Conductivity::Conductivity() { + tempTaken = GlobalContext::get_core_event_handler()->add_event_callback([&](const Core::Event * e) { + float temp = std::get(e->data); + conductivity.setTemperature(temp); + return true; + }, Core::Event::TemperatureTaken); +} const Sensor::SensorInfo &Sensor::Conductivity::getSensorInfo() { return info; } bool Sensor::Conductivity::setup() { - auto s = conductivity.init(); -// conductivity.singleCalibrate(53065.f); - return s; + return conductivity.init(); } void Sensor::Conductivity::initiateConversion() { @@ -15,5 +22,9 @@ void Sensor::Conductivity::initiateConversion() { } float Sensor::Conductivity::queryDevice() { - return conductivity.getTDM(); + return conductivity.getPSS(); +} + +Sensor::Conductivity::~Conductivity() { + GlobalContext::get_core_event_handler()->unhook_event_callback_for_all_events(tempTaken); } diff --git a/ROV/src/Sensors/Conductivity.h b/ROV/src/Sensors/Conductivity.h index 051382c..3291fab 100644 --- a/ROV/src/Sensors/Conductivity.h +++ b/ROV/src/Sensors/Conductivity.h @@ -2,6 +2,8 @@ #include "Sensor.h" #include "lib/ECEZ0.h" +#include "../Core/Event.h" +#include "../Core/EventHandler.h" namespace Sensor { class Conductivity : public Sensor{ @@ -9,14 +11,17 @@ namespace Sensor { const SensorInfo info{ .id = static_cast(SensorId::Conductivity), .maxFrequency = 1.f / 0.64f, - .name = "Conductivity", - .units = "ppm" + .name = "Salinity", + .units = "unitless" }; ECEZ0 conductivity; + EVENT_FUNC_INDEX_CORE tempTaken = nullptr; public: + Conductivity(); const SensorInfo& getSensorInfo() override; bool setup() override; void initiateConversion() override; float queryDevice() override; + ~Conductivity() override; }; } diff --git a/ROV/src/Sensors/Sensor.h b/ROV/src/Sensors/Sensor.h index ce79704..4d77dd3 100644 --- a/ROV/src/Sensors/Sensor.h +++ b/ROV/src/Sensors/Sensor.h @@ -33,5 +33,6 @@ namespace Sensor { virtual const SensorInfo& getSensorInfo() = 0; virtual void initiateConversion() = 0; virtual float queryDevice() = 0; + virtual ~Sensor() = default; }; } \ No newline at end of file diff --git a/ROV/src/Sensors/Temperature.cpp b/ROV/src/Sensors/Temperature.cpp index c1a2524..7ec9097 100644 --- a/ROV/src/Sensors/Temperature.cpp +++ b/ROV/src/Sensors/Temperature.cpp @@ -1,4 +1,5 @@ #include "Temperature.h" +#include "../Core/GlobalContext.h" const Sensor::SensorInfo &Sensor::Temperature::getSensorInfo() { return info; @@ -13,5 +14,9 @@ void Sensor::Temperature::initiateConversion() { } float Sensor::Temperature::queryDevice() { - return temp.temperature(); + float t = temp.temperature(); + auto ev = std::make_unique(Core::Event::TemperatureTaken); + ev->data = t; + GlobalContext::get_engine()->add_event(std::move(ev)); + return t; } diff --git a/ROV/src/Sensors/lib/ECEZ0.cpp b/ROV/src/Sensors/lib/ECEZ0.cpp index 67865b3..b8c9519 100644 --- a/ROV/src/Sensors/lib/ECEZ0.cpp +++ b/ROV/src/Sensors/lib/ECEZ0.cpp @@ -16,6 +16,7 @@ * @param uS */ void Sensor::ECEZ0::calibrate(float lowuS, float highuS) { + activate(); // Clear calibrations writeReg(CALIBRATION_REQUEST_REGISTER, 0x01); delay(2000); @@ -55,6 +56,9 @@ void Sensor::ECEZ0::calibrate(float lowuS, float highuS) { writeReg(CALIBRATION_REQUEST_REGISTER, 0x05); delay(1000); + writeReg(MODE_REGISTER, 0x00); + delay(1000); + // Confirm auto v = readReg(CALIBRATION_CONFIRMATION_REGISTER); return; @@ -91,6 +95,7 @@ float Sensor::ECEZ0::getEC() { } void Sensor::ECEZ0::singleCalibrate(float uS) { + activate(); // Clear calibrations writeReg(CALIBRATION_REQUEST_REGISTER, 0x01); delay(2000); @@ -116,6 +121,10 @@ void Sensor::ECEZ0::singleCalibrate(float uS) { delay(1000); + writeReg(MODE_REGISTER, 0x00); + + delay(1000); + // Confirm auto v = readReg(CALIBRATION_CONFIRMATION_REGISTER); return; @@ -138,9 +147,28 @@ void Sensor::ECEZ0::activate() { } -float Sensor::ECEZ0::getTDM() { +float Sensor::ECEZ0::getTDS() { // Put into hibernate mode writeReg(MODE_REGISTER, 0x00); return read4Reg(TDS_REGISTER_START); } + +void Sensor::ECEZ0::setTemperature(float temp) { + auto tempToSend = static_cast(temp * 100); + std::vector bytes(4); + for (unsigned i = 0; i < 4; ++i) { + bytes[3-i] = (tempToSend >> (i * 8)); + } + + for (unsigned i = 0; i < 4; ++i) { + writeReg(TEMP_REGISTER_START + i, bytes[i]); + } +} + +float Sensor::ECEZ0::getPSS() { + // Hibernate + writeReg(MODE_REGISTER, 0x00); + + return read4Reg(PSS_REGISTER_START); +} diff --git a/ROV/src/Sensors/lib/ECEZ0.h b/ROV/src/Sensors/lib/ECEZ0.h index 6585cdc..1047636 100644 --- a/ROV/src/Sensors/lib/ECEZ0.h +++ b/ROV/src/Sensors/lib/ECEZ0.h @@ -9,10 +9,12 @@ namespace Sensor { const unsigned char CALIBRATION_REGISTER_START = 0x0A; const unsigned char CALIBRATION_REQUEST_REGISTER = 0x0E; const unsigned char CALIBRATION_CONFIRMATION_REGISTER = 0x0F; + const unsigned char TEMP_REGISTER_START = 0x10; const unsigned char MODE_REGISTER = 0x06; // 4 bytes long const unsigned char EC_REGISTER_START = 0x18; const unsigned char TDS_REGISTER_START = 0x1C; + const unsigned char PSS_REGISTER_START = 0x20; int fd = -1; @@ -26,9 +28,11 @@ namespace Sensor { // to step through it one at a time. void calibrate(float lowuS, float highuS); void singleCalibrate(float uS); + void setTemperature(float temp); bool init(); void activate(); float getEC(); - float getTDM(); + float getTDS(); + float getPSS(); }; }