summaryrefslogtreecommitdiff
path: root/peripheral/libupm/src/tb7300
diff options
context:
space:
mode:
Diffstat (limited to 'peripheral/libupm/src/tb7300')
-rw-r--r--peripheral/libupm/src/tb7300/CMakeLists.txt28
-rw-r--r--peripheral/libupm/src/tb7300/javaupm_tb7300.i32
-rw-r--r--peripheral/libupm/src/tb7300/jsupm_tb7300.i10
-rw-r--r--peripheral/libupm/src/tb7300/pyupm_tb7300.i14
-rw-r--r--peripheral/libupm/src/tb7300/tb7300.cxx108
-rw-r--r--peripheral/libupm/src/tb7300/tb7300.hpp258
6 files changed, 450 insertions, 0 deletions
diff --git a/peripheral/libupm/src/tb7300/CMakeLists.txt b/peripheral/libupm/src/tb7300/CMakeLists.txt
new file mode 100644
index 0000000..8564c80
--- /dev/null
+++ b/peripheral/libupm/src/tb7300/CMakeLists.txt
@@ -0,0 +1,28 @@
+set (libname "tb7300")
+set (libdescription "upm module for the TB7300 Fan Coil Thermostat")
+set (module_src ${libname}.cxx)
+set (module_hpp ${libname}.hpp)
+
+pkg_check_modules(BACNET libbacnet)
+if (BACNET_FOUND)
+ # upm-libbacnetmstp will bring in libbacnet, I hope
+ set (reqlibname "upm-bacnetmstp")
+ include_directories(${BACNET_INCLUDE_DIRS})
+ include_directories("../bacnetmstp")
+ upm_module_init()
+ target_link_libraries(${libname} bacnetmstp)
+ if (BUILDSWIG)
+ if (BUILDSWIGNODE)
+ set_target_properties(${SWIG_MODULE_jsupm_${libname}_REAL_NAME} PROPERTIES SKIP_BUILD_RPATH TRUE)
+ swig_link_libraries (jsupm_${libname} bacnetmstp)
+ endif()
+ if (BUILDSWIGPYTHON)
+ set_target_properties(${SWIG_MODULE_pyupm_${libname}_REAL_NAME} PROPERTIES SKIP_BUILD_RPATH TRUE)
+ swig_link_libraries (pyupm_${libname} bacnetmstp)
+ endif()
+ if (BUILDSWIGJAVA)
+ set_target_properties(${SWIG_MODULE_javaupm_${libname}_REAL_NAME} PROPERTIES SKIP_BUILD_RPATH TRUE)
+ swig_link_libraries (javaupm_${libname} bacnetmstp)
+ endif()
+ endif()
+endif ()
diff --git a/peripheral/libupm/src/tb7300/javaupm_tb7300.i b/peripheral/libupm/src/tb7300/javaupm_tb7300.i
new file mode 100644
index 0000000..7374878
--- /dev/null
+++ b/peripheral/libupm/src/tb7300/javaupm_tb7300.i
@@ -0,0 +1,32 @@
+%module javaupm_tb7300
+%include "../upm.i"
+%include "typemaps.i"
+
+// We need to use this method for enum wrapping since the enum typedefs used
+// by the derived classes (like ANALOG_VALUES_T) are passed to methods
+// in the base class which expect a uint32_t. This is fine, and
+// works everywhere except Java. It's type safety is a little too
+// stringent in these cases. %javaconst(1) is generally recommended
+// as it avoids JNI calls to determine the enumerant values at
+// runtime.
+%include "enumtypeunsafe.swg"
+%javaconst(1);
+
+%include "bacnetmstp.hpp"
+%include "bacnetutil.hpp"
+%include "tb7300.hpp"
+%{
+ #include "tb7300.hpp"
+%}
+
+
+%pragma(java) jniclasscode=%{
+ static {
+ try {
+ System.loadLibrary("javaupm_tb7300");
+ } catch (UnsatisfiedLinkError e) {
+ System.err.println("Native code library failed to load. \n" + e);
+ System.exit(1);
+ }
+ }
+%}
diff --git a/peripheral/libupm/src/tb7300/jsupm_tb7300.i b/peripheral/libupm/src/tb7300/jsupm_tb7300.i
new file mode 100644
index 0000000..e18f592
--- /dev/null
+++ b/peripheral/libupm/src/tb7300/jsupm_tb7300.i
@@ -0,0 +1,10 @@
+%module jsupm_tb7300
+%include "../upm.i"
+%include "stdint.i"
+
+%include "bacnetmstp.hpp"
+%include "bacnetutil.hpp"
+%include "tb7300.hpp"
+%{
+ #include "tb7300.hpp"
+%}
diff --git a/peripheral/libupm/src/tb7300/pyupm_tb7300.i b/peripheral/libupm/src/tb7300/pyupm_tb7300.i
new file mode 100644
index 0000000..a1e7bfe
--- /dev/null
+++ b/peripheral/libupm/src/tb7300/pyupm_tb7300.i
@@ -0,0 +1,14 @@
+// Include doxygen-generated documentation
+%include "pyupm_doxy2swig.i"
+%module pyupm_tb7300
+%include "../upm.i"
+%include "stdint.i"
+
+%feature("autodoc", "3");
+
+%include "bacnetmstp.hpp"
+%include "bacnetutil.hpp"
+%include "tb7300.hpp"
+%{
+ #include "tb7300.hpp"
+%}
diff --git a/peripheral/libupm/src/tb7300/tb7300.cxx b/peripheral/libupm/src/tb7300/tb7300.cxx
new file mode 100644
index 0000000..d4f14cc
--- /dev/null
+++ b/peripheral/libupm/src/tb7300/tb7300.cxx
@@ -0,0 +1,108 @@
+/*
+ * 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 <errno.h>
+#include <iostream>
+#include <stdexcept>
+#include <string>
+
+#include "tb7300.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);
+}
+
+
+TB7300::TB7300(uint32_t targetDeviceObjectID) :
+ BACNETUTIL(targetDeviceObjectID)
+{
+ setDebug(false);
+
+ // we disable this by default for performance reasons
+ checkReliability(false);
+
+ m_isTempInitialized = false;
+ m_isCelcius = false;
+
+ // room temperature only
+ m_temperature = 0.0;
+}
+
+TB7300::~TB7300()
+{
+}
+
+void TB7300::update()
+{
+ if (!m_isTempInitialized)
+ {
+ // this will update internals so conversions work properly
+ getTemperatureScale();
+ }
+
+ float tmpF = getAnalogValue(AV_Room_Temperature);
+
+ if (m_isCelcius)
+ m_temperature = tmpF;
+ else
+ m_temperature = f2c(tmpF);
+}
+
+float TB7300::getTemperature(bool fahrenheit)
+{
+ if (fahrenheit)
+ return c2f(m_temperature);
+ else
+ return m_temperature;
+}
+
+void TB7300::setTemperatureScale(bool fahrenheit)
+{
+ setBinaryValue(BV_Temperature_Scale, fahrenheit);
+
+ m_isTempInitialized = true;
+ m_isCelcius = (fahrenheit) ? false : true;
+}
+
+bool TB7300::getTemperatureScale()
+{
+ bool scale = getBinaryValue(BV_Temperature_Scale);
+
+ m_isTempInitialized = true;
+ m_isCelcius = !scale;
+
+ return scale;
+}
diff --git a/peripheral/libupm/src/tb7300/tb7300.hpp b/peripheral/libupm/src/tb7300/tb7300.hpp
new file mode 100644
index 0000000..2b6a0cc
--- /dev/null
+++ b/peripheral/libupm/src/tb7300/tb7300.hpp
@@ -0,0 +1,258 @@
+/*
+ * 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.
+ */
+#pragma once
+
+#include <string>
+#include <map>
+
+#include "bacnetmstp.hpp"
+#include "bacnetutil.hpp"
+
+namespace upm {
+
+ /**
+ * @brief Honeywell TB7300 Communicating Fan Coil Thermostat
+ * @defgroup tb7300 libupm-tb7300
+ * @ingroup uart temp
+ */
+
+ /**
+ * @library tb7300
+ * @sensor tb7300
+ * @comname UPM API for the Honeywell TB7300 Communicating Fan Coil
+ * Thermostat
+ * @type temp
+ * @man honeywell
+ * @con uart
+ * @web https://parts-hvac.com/tb7300c5014b.html
+ *
+ * @brief Honeywell TB7300 Communicating Fan Coil Thermostat
+ *
+ * This module implements support for the Honeywell TB7300
+ * Communicating Fan Coil Thermostat. It may also support the
+ * TB7200, though only the TB7300 was available for development of
+ * this driver.
+ *
+ * The TB7200 Series PI thermostats are designed for zoning
+ * applications, and the TB7300 Series PI thermostats are designed
+ * for fan coil control. Both Series are communicating thermostats
+ * with models available in BACnet® MS/TP protocol and can be easily
+ * integrated into a WEBs-AX building automation system based on the
+ * NiagaraAX® platform.
+ *
+ * TB7200 and TB7300 Series thermostats are compatible with the
+ * Honeywell Occupancy Sensor Cover. Thermostats equipped with an
+ * occupancy sensor cover provide advanced active occupancy logic,
+ * which will automatically switch occupancy levels from Occupied to
+ * Stand-By and Unoccupied as required by local activity being
+ * present or not. This advanced occupancy functionality provides
+ * advantageous energy savings during occupied hours without
+ * sacrificing occupant comfort. All thermostats can be ordered with
+ * or without a factory installed PIR cover.
+ *
+ * If you intend to work with this device and driver, it is
+ * strongly suggested you get the BACnet Intergration Guide document
+ * for this device: 63-4524.pdf as recommended in the device
+ * documentation.
+ *
+ * This module was developed using the upm::BACNETMSTP library,
+ * based on libbacnet-stack 0.8.3. Both libbacnet 0.8.3 and the
+ * upm::BACNETMSTP libraries must be present in order to build this
+ * module.
+ *
+ * It was connected using an RS232->RS485 interface. You cannot use
+ * the built in MCU TTL UART pins for accessing this device -- you
+ * must use a full Serial RS232->RS485 or USB-RS485 interface
+ * connected via USB.
+ *
+ * @snippet tb7300.cxx Interesting
+ */
+
+ class TB7300 : public BACNETUTIL {
+ public:
+
+ // Supported Analog Value Objects. These are readable and writable.
+ typedef enum : uint32_t {
+ AV_Room_Temperature = 7,
+
+ // GRP 20 Control Output
+ AV_PI_Heating_Demand = 21,
+ AV_PI_Cooling_Demand = 22,
+
+ // GRP 38 Temperature Setpoints
+ AV_Occupied_Heat_Setpoint = 39,
+ AV_Occupied_Cool_Setpoint = 40,
+ AV_Standby_Heat_Setpoint = 41,
+ AV_Standby_Cool_Setpoint = 42,
+ AV_Unoccupied_Heat_Setpoint = 43,
+ AV_Unoccupied_Cool_Setpoint = 44,
+
+ // GRP 55 General Options 2
+ AV_Password_Value = 56,
+ AV_Heating_Setpoint_Limit = 58,
+ AV_Cooling_Setpoint_Limit = 59,
+ AV_Deadband = 63,
+ AV_Standby_Time = 67,
+ AV_Unoccupied_Time = 68
+ } ANALOG_VALUES_T;
+
+ // Supported Analog Input Objects. These are read only.
+ typedef enum : uint32_t {
+ AI_Supply_Temperature = 12
+ } ANALOG_INPUTS_T;
+
+ // Supported Binary Value Objects. These are readable and writable.
+ typedef enum : uint32_t {
+ BV_Temp_Override = 8,
+ BV_Aux_Command = 14,
+
+ // GRP 45 General Options 1
+ BV_Menu_Scroll = 49,
+ BV_Auto_Mode_Enable = 50,
+ BV_Temperature_Scale = 51,
+
+ // GRP 55 General Option 2
+ BV_Setpoint_Type = 60,
+ BV_Setpoint_Function = 61,
+ BV_Reheat_Timebase = 64,
+ BV_Auto_Fan = 66,
+
+ // GRP 74 Output Configuration Options
+ BV_Control_type = 75,
+ BV_Direct_Reverse_Acting = 78
+ } BINARY_VALUES_T;
+
+ // Supported Binary Input Objects. These are read only.
+ typedef enum : uint32_t {
+ // GRP 24 Controller Status
+ BI_AUX_Status = 25,
+ BI_BI1_Status = 29,
+ BI_BI2_Status = 30,
+ BI_UI3_Status = 31,
+ BI_Local_Motion = 32,
+
+ // GRP 34 Controller Alarms
+ BI_Window_Alarm = 35,
+ BI_Filter_Alarm = 36,
+ BI_Service_Alarm = 37
+ } BINARY_INPUTS_T;
+
+ // Supported Multi-State Value Objects. These are readable and
+ // writable.
+ typedef enum : uint32_t {
+ MV_Sequence_of_Operation = 15,
+ MV_System_Mode = 16,
+ MV_Fan_Mode = 17,
+ MV_Occupancy_Command = 18,
+ MV_Keypad_Lockout = 19,
+
+ // GRP 24 Controller Status
+ MV_Heating_Valve_Status = 26,
+ MV_Cooling_Valve_Status = 27,
+ MV_Fan_Status = 28,
+ MV_Effective_Occupancy = 33,
+
+ // GRP 45 General Options 1
+ MV_BI1_Configuration = 46,
+ MV_BI2_Configuration = 47,
+ MV_UI1_Configuration = 48,
+ MV_Pipe_Number = 52,
+ MV_Out1_Config = 53,
+ MV_AUX_Configuration = 54,
+
+ // GRP 55 General Option 2
+ MV_Fan_Mode_Sequence = 58,
+ MV_Temporary_Occupancy_Time = 62,
+ MV_Proportional_Band = 65,
+
+ // GRP 74 Output Configuration Options
+ MV_Floating_Motor_Timing = 76,
+ MV_On_Off_Control_CPH = 77
+ } MULTISTATE_VALUES_T;
+
+ /**
+ * TB7300 constructor
+ *
+ * @param targetDeviceObjectID the unique Instance ID of the
+ * Device Object. This number is used to uniquely identify
+ * devices on the BACnet network, and ranges from 1 to 4194302.
+ * This is not the device's MAC address, though on some devices,
+ * the MAC address may be used as part of this number. On the
+ * TB7300, this number depends on the model and the MAC address.
+ */
+ TB7300(uint32_t targetDeviceObjectID);
+
+ /**
+ * TB7300 Destructor
+ */
+ ~TB7300();
+
+ /**
+ * Read current temperature from the sensor and update internal
+ * stored value. This method must be called prior to querying the
+ * temperature. All other values in the device must be queried
+ * directly via the appropriate BACNETUTIL::get*() methods
+ * depending on the object of interest.
+ */
+ void update();
+
+ /**
+ * Get the current temperature. update() must have been called
+ * prior to calling this method.
+ *
+ * @param fahrenheit true to return the temperature in degrees
+ * fahrenheit, false to return the temperature in degrees celcius.
+ * The default is false (degrees Celcius).
+ * @return The last temperature reading in Celcius or Fahrenheit.
+ */
+ float getTemperature(bool fahrenheit=false);
+
+ /**
+ * Set the device temperature scale to Celcius of Fahrenheit. For
+ * devices with an LCD display, this will affect which scale is
+ * displayed. When changing the scale, it may take several
+ * seconds for the setting to take effect.
+ *
+ * @param fahrenheit true to set the scale to fahrenheit, false
+ * for celcius.
+ */
+ void setTemperatureScale(bool fahrenheit);
+
+ /**
+ * Get the device temperature scale.
+ *
+ * @return true if scale is fahrenheit, false for celcius.
+ */
+ bool getTemperatureScale();
+
+ protected:
+ // always stored in C
+ float m_temperature;
+
+ bool m_isTempInitialized;
+ bool m_isCelcius;
+
+ private:
+ };
+}