summaryrefslogtreecommitdiff
path: root/peripheral/libupm/src/t8100/t8100.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'peripheral/libupm/src/t8100/t8100.cxx')
-rw-r--r--peripheral/libupm/src/t8100/t8100.cxx254
1 files changed, 254 insertions, 0 deletions
diff --git a/peripheral/libupm/src/t8100/t8100.cxx b/peripheral/libupm/src/t8100/t8100.cxx
new file mode 100644
index 0000000..6e5b596
--- /dev/null
+++ b/peripheral/libupm/src/t8100/t8100.cxx
@@ -0,0 +1,254 @@
+/*
+ * Author: Jon Trulson <jtrulson@ics.com>
+ * Copyright (c) 2016 Intel Corporation.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining
+ * a copy of this software and associated documentation files (the
+ * "Software"), to deal in the Software without restriction, including
+ * without limitation the rights to use, copy, modify, merge, publish,
+ * distribute, sublicense, and/or sell copies of the Software, and to
+ * permit persons to whom the Software is furnished to do so, subject to
+ * the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be
+ * included in all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+ * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+ * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+ * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+
+#include <unistd.h>
+#include <assert.h>
+#include <errno.h>
+#include <iostream>
+#include <stdexcept>
+#include <string>
+
+#include "t8100.hpp"
+
+using namespace upm;
+using namespace std;
+
+// conversion from fahrenheit to celcius and back
+
+static float f2c(float f)
+{
+ return ((f - 32.0) / (9.0 / 5.0));
+}
+
+static float c2f(float c)
+{
+ return (c * (9.0 / 5.0) + 32.0);
+}
+
+
+T8100::T8100(uint32_t targetDeviceObjectID) :
+ BACNETUTIL(targetDeviceObjectID)
+{
+ setDebug(false);
+
+ // we disable this by default for performance reasons
+ checkReliability(false);
+
+ m_isTempInitialized = false;
+ m_isCelcius = false;
+
+ m_humidity = 0.0;
+ m_temperature = 0.0;
+ m_co2 = 0.0;
+ m_relayState = false;
+}
+
+T8100::~T8100()
+{
+}
+
+void T8100::update()
+{
+ if (!m_isTempInitialized)
+ {
+ // this will update internals so conversions work properly
+ getTemperatureScale();
+ }
+
+ float tmpF = getAnalogInput(AI_Temperature_Thermistor);
+
+ if (m_isCelcius)
+ m_temperature = tmpF;
+ else
+ m_temperature = f2c(tmpF);
+
+ m_humidity = getAnalogInput(AI_Relative_Humidity);
+ m_co2 = getAnalogInput(AI_CO2);
+ m_relayState = getBinaryInput(BI_Relay_State);
+}
+
+float T8100::getTemperature(bool fahrenheit)
+{
+ if (fahrenheit)
+ return c2f(m_temperature);
+ else
+ return m_temperature;
+}
+
+void T8100::setTemperatureScale(bool fahrenheit)
+{
+ setBinaryValue(BV_Temperature_Units, fahrenheit);
+
+ m_isTempInitialized = true;
+ m_isCelcius = (fahrenheit) ? false : true;
+}
+
+bool T8100::getTemperatureScale()
+{
+ bool scale = getBinaryValue(BV_Temperature_Units);
+
+ m_isTempInitialized = true;
+ m_isCelcius = !scale;
+
+ return scale;
+}
+
+float T8100::getTemperatureOffset()
+{
+ return getAnalogValue(AV_Temperature_Offset);
+}
+
+void T8100::setTemperatureOffset(float value)
+{
+ // Always in C...
+ if (value < -50.0 || value > 50.0)
+ {
+ throw std::out_of_range(std::string(__FUNCTION__)
+ + ": value must be between -50 and 50,"
+ + " in degrees Celcius");
+
+ }
+
+ setAnalogValue(AV_Temperature_Offset, value);
+}
+
+float T8100::getHumidityOffset()
+{
+ return getAnalogValue(AV_RH_Offset);
+}
+
+void T8100::setHumidityOffset(float value)
+{
+ if (value < -100.0 || value > 100.0)
+ {
+ throw std::out_of_range(std::string(__FUNCTION__)
+ + ": value must be between -100 and 100");
+ }
+
+ setAnalogValue(AV_RH_Offset, value);
+}
+
+float T8100::getRelaySetPoint()
+{
+ return getAnalogValue(AV_Relay_Set_Point);
+}
+
+void T8100::setRelaySetPoint(float value)
+{
+ if (value < 0.00 || value > 65535.0)
+ {
+ throw std::out_of_range(std::string(__FUNCTION__)
+ + ": value must be between 0 and 65535");
+ }
+
+ setAnalogValue(AV_Relay_Set_Point, value);
+}
+
+float T8100::getRelayHysteresis()
+{
+ return getAnalogValue(AV_Relay_Hysteresis);
+}
+
+void T8100::setRelayHysteresis(float value)
+{
+ if (value < 0.00 || value > 65535.0)
+ {
+ throw std::out_of_range(std::string(__FUNCTION__)
+ + ": value must be between 0 and 65535");
+ }
+
+ setAnalogValue(AV_Relay_Hysteresis, value);
+}
+
+float T8100::getElevation()
+{
+ return getAnalogValue(AV_Elevation);
+}
+
+void T8100::setElevation(float value)
+{
+ if (value < 0.00 || value > 65535.0)
+ {
+ throw std::out_of_range(std::string(__FUNCTION__)
+ + ": value must be between 0 and 65535");
+ }
+
+ setAnalogValue(AV_Elevation, value);
+}
+
+float T8100::getCalibrationSinglePoint()
+{
+ return getAnalogValue(AV_Calibration_Single_Point);
+}
+
+void T8100::setCalibrationSinglePoint(float value)
+{
+ if (value < 0.00 || value > 65535.0)
+ {
+ throw std::out_of_range(std::string(__FUNCTION__)
+ + ": value must be between 0 and 65535");
+ }
+
+ setAnalogValue(AV_Calibration_Single_Point, value);
+}
+
+float T8100::getBaudRate()
+{
+ return getAnalogValue(AV_Baud_Rate);
+}
+
+float T8100::getMACAddress()
+{
+ return getAnalogValue(AV_MAC_Address);
+}
+
+bool T8100::getABCLogicState()
+{
+ return getBinaryValue(BV_ABC_Logic_State);
+}
+
+void T8100::setABCLogicState(bool value)
+{
+ setBinaryValue(BV_ABC_Logic_State, value);
+}
+
+bool T8100::getABCLogicReset()
+{
+ return getBinaryValue(BV_ABC_Logic_Reset);
+}
+
+void T8100::setABCLogicReset(bool value)
+{
+ setBinaryValue(BV_ABC_Logic_Reset, value);
+}
+
+bool T8100::getCO2Calibration()
+{
+ return getBinaryValue(BV_CO2_Calibration);
+}
+
+void T8100::setCO2Calibration(bool value)
+{
+ setBinaryValue(BV_CO2_Calibration, value);
+}