Skip to content
GitLab
Projects
Groups
Snippets
/
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Sign in
Toggle navigation
Menu
Open sidebar
dcdb
dcdb
Commits
ad6e8558
Commit
ad6e8558
authored
Oct 08, 2018
by
Micha Mueller
Browse files
Adapt BACnet plugin to sensorgroupsV2 architecture
parent
4dc51146
Changes
11
Hide whitespace changes
Inline
Side-by-side
Makefile
View file @
ad6e8558
...
...
@@ -17,7 +17,7 @@ CXXFLAGS = -std=c++11 -DBOOST_DATE_TIME_POSIX_TIME_STD_CONFIG -DBOOST_NETWORK_EN
LIBS
=
-L
../deps/mosquitto_build/lib
-L
$(DCDBDEPLOYPATH)
/lib/
-ldl
-lmosquitto
-lboost_system
-lboost_thread
-lboost_log_setup
-lboost_log
-lpthread
-lcrypto
-lssl
-lcppnetlib-server-parsers
-lcppnetlib-uri
-rdynamic
OBJS
=
src/dcdbpusher.o src/Configuration.o src/MQTTPusher.o src/HttpsServer.o
PLUGINS_BASE
=
libdcdbplugin_
pdu
libdcdbplugin_s
ysfs
libdcdbplugin_
ipmi
libdcdbplugin_
bacnet
libdcdbplugin_
snmp
libdcdbplugin_opa
PLUGINS_BASE
=
libdcdbplugin_
sysfs
libdcdbplugin_s
nmp
libdcdbplugin_
pdu
libdcdbplugin_
ipmi
libdcdbplugin_
bacnet#
libdcdbplugin_opa
ifeq
($(OS),Darwin)
BACNET_PORT
=
bsd
...
...
@@ -72,23 +72,23 @@ src/SensorGroup.o: CXXFLAGS+= $(PLUGINFLAGS)
src/sensors/%.o
:
CXXFLAGS+= $(PLUGINFLAGS) -I$(DCDBDEPSPATH)/bacnet-stack-$(BACNET-STACK_VERSION)/include -I$(DCDBDEPSPATH)/bacnet-stack-$(BACNET-STACK_VERSION)/ports/$(BACNET_PORT)
#src/sensors/*/%.o: %.cpp
libdcdbplugin_sysfs.$(LIBEXT)
:
src/sensors/sysfs/SysfsS
ingleS
ensor.o src/sensors/sysfs/SysfsConfigurator.o
libdcdbplugin_sysfs.$(LIBEXT)
:
src/sensors/sysfs/SysfsSensor
Group
.o src/sensors/sysfs/SysfsConfigurator.o
$(CXX)
$(LIBFLAGS)$@
-o
$@
$^
-L
$(DCDBDEPLOYPATH)
/lib/
-lboost_log
-lboost_system
libdcdbplugin_perfevent.$(LIBEXT)
:
src/sensors/perfevent/PerfS
ingleS
ensor.o src/sensors/perfevent/PerfeventConfigurator.o
src/sensors/perfevent/PerfSensorGroup.o
libdcdbplugin_perfevent.$(LIBEXT)
:
src/sensors/perfevent/PerfSensor
Group
.o src/sensors/perfevent/PerfeventConfigurator.o
$(CXX)
$(LIBFLAGS)$@
-o
$@
$^
-L
$(DCDBDEPLOYPATH)
/lib/
-lboost_log
-lboost_system
libdcdbplugin_ipmi.$(LIBEXT)
:
src/sensors/ipmi/IPMIS
ingleS
ensor.o src/sensors/ipmi/IPMIHost.o src/sensors/ipmi/IPMIConfigurator.o
libdcdbplugin_ipmi.$(LIBEXT)
:
src/sensors/ipmi/IPMISensor
Group
.o src/sensors/ipmi/IPMIHost.o src/sensors/ipmi/IPMIConfigurator.o
$(CXX)
$(LIBFLAGS)$@
-o
$@
$^
-L
$(DCDBDEPLOYPATH)
/lib/
-lboost_log
-lboost_system
-lfreeipmi
-lboost_regex
libdcdbplugin_pdu.$(LIBEXT)
:
src/sensors/pdu/PDUS
ingleS
ensor.o src/sensors/pdu/PDUUnit.o src/sensors/pdu/PDUConfigurator.o
libdcdbplugin_pdu.$(LIBEXT)
:
src/sensors/pdu/PDUSensor
Group
.o src/sensors/pdu/PDUUnit.o src/sensors/pdu/PDUConfigurator.o
$(CXX)
$(LIBFLAGS)$@
-o
$@
$^
-L
$(DCDBDEPLOYPATH)
/lib/
-lcrypto
-lssl
-lboost_log
-lboost_system
libdcdbplugin_bacnet.$(LIBEXT)
:
src/sensors/bacnet/BACnetS
ingleS
ensor.o src/sensors/bacnet/BACnetClient.o src/sensors/bacnet/BACnetConfigurator.o
libdcdbplugin_bacnet.$(LIBEXT)
:
src/sensors/bacnet/BACnetSensor
Group
.o src/sensors/bacnet/BACnetClient.o src/sensors/bacnet/BACnetConfigurator.o
$(CXX)
$(LIBFLAGS)$@
-o
$@
$^
-L
$(DCDBDEPLOYPATH)
/lib/
-lboost_log
-lboost_system
-lbacnet
libdcdbplugin_snmp.$(LIBEXT)
:
src/sensors/snmp/SNMPS
ingleS
ensor.o src/sensors/snmp/SNMPConnection.o src/sensors/snmp/SNMPConfigurator.o
libdcdbplugin_snmp.$(LIBEXT)
:
src/sensors/snmp/SNMPSensor
Group
.o src/sensors/snmp/SNMPConnection.o src/sensors/snmp/SNMPConfigurator.o
$(CXX)
$(LIBFLAGS)$@
-o
$@
$^
-L
$(DCDBDEPLOYPATH)
/lib/
-lboost_log
-lboost_system
-lnetsnmp
-lnetsnmpagent
libdcdbplugin_opa.$(LIBEXT)
:
src/sensors/opa/OpaS
ingleS
ensor.o src/sensors/opa/OpaConfigurator.o
src/sensors/opa/OpaSensorGroup.o
$(CXX)
$(LIBFLAGS)$@
-o
$@
$^
-L
$(DCDBDEPLOYPATH)
/lib/
-lboost_log
-lboost_system
-lopamgt
-libverbs
-libumad
-lssl
#
libdcdbplugin_opa.$(LIBEXT): src/sensors/opa/OpaSensor
Group
.o src/sensors/opa/OpaConfigurator.o
#
$(CXX) $(LIBFLAGS)$@ -o $@ $^ -L$(DCDBDEPLOYPATH)/lib/ -lboost_log -lboost_system -lopamgt -libverbs -libumad -lssl
config/bacnet.conf
View file @
ad6e8558
...
...
@@ -9,65 +9,41 @@ global {
cacheInterval
90
}
sensorTemplates
{
sensor
def0
{
factor
100
id
85
interval
1000
template_group
def0
{
interval
1000
minValues
3
}
}
mqttPart
FFFF
devices
{
device
asdf
{
instance
1234
mqttPart
FF
object
o1
{
type
8
instance
1234
mqttPart
FF
property
test1
{
factor
10
default
def0
mqttsuffix
0000
}
property
smth
{
id
75
mqttsuffix
0001
}
}
;
object
o2
{
;
type
1
;
instance
2
;
mqttPart
FF
;
property
propName
{
;
default
def0
;
minValues
1
;
mqttsuffix
0002
; }
;
property
propName2
{
;
id
80
;
minValues
1
;
mqttsuffix
0003
; }
; }
property
test1
{
factor
10
id
85
deviceInstance
1234
objectInstance
1234
objectType
8
mqttsuffix
0000
}
}
group
g1
{
default
def0
device
jklo
{
instance
2222
mqttPart
FF
object
o
{
type
8
instance
1234
mqttPart
FF
property
prop
{
id
75
mqttsuffix
0004
}
}
property
smth
{
id
80
deviceInstance
1234
objectInstance
1234
objectType
8
mqttsuffix
0001
}
}
group
g2
{
mqttPart
FFFF
property
prop
{
deviceInstance
2222
objectInstance
1234
objectType
8
id
75
mqttsuffix
0004
}
}
src/sensors/bacnet/BACnetClient.h
View file @
ad6e8558
...
...
@@ -63,11 +63,11 @@ public:
private:
/* Handler to process incoming BACnet data */
static
void
unrecognizedServiceHandler
(
uint8_t
*
service_request
,
uint16_t
service_len
,
BACNET_ADDRESS
*
src
,
BACNET_CONFIRMED_SERVICE_DATA
*
service_data
);
static
void
unrecognizedServiceHandler
(
uint8_t
*
service_request
,
uint16_t
service_len
,
BACNET_ADDRESS
*
src
,
BACNET_CONFIRMED_SERVICE_DATA
*
service_data
);
/**
* Handler for a ReadProperty ACK.
*
Doesn't actually do anything, except, for debugging, to print out the ACK data of a matching request.
*
Here the actual processing of a valid response takes place
*
* @param service_request The contents of the service request.
* @param service_len The length of the service_request.
...
...
@@ -75,12 +75,11 @@ private:
* @param service_data The BACNET_CONFIRMED_SERVICE_DATA information decoded from the APDU header of this message.
*/
static
void
readPropertyAckHandler
(
uint8_t
*
service_request
,
uint16_t
service_len
,
BACNET_ADDRESS
*
src
,
BACNET_CONFIRMED_SERVICE_ACK_DATA
*
service_data
);
static
void
errorHandler
(
BACNET_ADDRESS
*
src
,
uint8_t
invokeId
,
BACNET_ERROR_CLASS
error_class
,
BACNET_ERROR_CODE
error_code
);
static
void
abortHandler
(
BACNET_ADDRESS
*
src
,
uint8_t
invokeId
,
uint8_t
abort_reason
,
bool
server
);
static
void
rejectHandler
(
BACNET_ADDRESS
*
src
,
uint8_t
invokeId
,
uint8_t
reject_reason
);
uint8_t
_invokeId
;
//store as member variable to enable access in handler methods
uint8_t
_invokeId
;
unsigned
_timeout
;
// static because of handler functions
static
double
_presentValue
;
...
...
src/sensors/bacnet/BACnetConfigurator.cpp
View file @
ad6e8558
...
...
@@ -11,7 +11,10 @@
#include
<iostream>
BACnetConfigurator
::
BACnetConfigurator
()
{
_bacClient
=
NULL
;
_bacClient
=
nullptr
;
_groupName
=
"group"
;
_baseName
=
"property"
;
}
BACnetConfigurator
::~
BACnetConfigurator
()
{
...
...
@@ -20,32 +23,50 @@ BACnetConfigurator::~BACnetConfigurator() {
}
}
bool
BACnetConfigurator
::
derivedReadConfig
(
boost
::
property_tree
::
iptree
&
cfg
)
{
void
BACnetConfigurator
::
sensorBase
(
BACnetSensorBase
&
s
,
CFG_VAL
config
)
{
ADD
{
ATTRIBUTE
(
"deviceInstance"
,
setDeviceInstance
);
ATTRIBUTE
(
"objectInstance"
,
setObjectInstance
);
ATTRIBUTE
(
"objectType"
,
setObjectType
);
ATTRIBUTE
(
"id"
,
setPropertyId
);
ATTRIBUTE
(
"factor"
,
setFactor
);
}
}
void
BACnetConfigurator
::
sensorGroup
(
BACnetSensorGroup
&
s
,
CFG_VAL
config
)
{
ADD
{
//no group attributes currently
}
s
.
setBACnetClient
(
_bacClient
);
}
void
BACnetConfigurator
::
global
(
CFG_VAL
config
)
{
if
(
_bacClient
)
{
delete
_bacClient
;
}
_bacClient
=
new
BACnetClient
();
std
::
string
interface
,
address_cache
,
mqttPartDevice
,
mqttPartObject
;
std
::
string
address_cache
,
interface
;
unsigned
port
=
47808
,
timeout
=
1000
,
apdu_timeout
=
200
,
apdu_retries
=
0
;
unsigned
deviceInstance
=
0
,
objInstance
=
0
;
BACNET_OBJECT_TYPE
objType
=
OBJECT_DEVICE
;
/* = 8 */
//read global variables (if present overwrite those from global.conf)
BOOST_FOREACH
(
boost
::
property_tree
::
iptree
::
value_type
&
global
,
cfg
.
get_child
(
"global"
))
{
if
(
STRCMP
(
global
,
"address_cache"
))
{
address_cache
=
global
.
second
.
data
();
ADD
{
SETTING
(
"address_cache"
)
{
address_cache
=
val
.
second
.
data
();
LOG
(
debug
)
<<
" Address Cache: "
<<
address_cache
;
}
else
if
(
STRCMP
(
global
,
"interface"
)
)
{
interface
=
glob
al
.
second
.
data
();
}
SETTING
(
"interface"
)
{
interface
=
v
al
.
second
.
data
();
LOG
(
debug
)
<<
" Interface "
<<
interface
;
}
else
if
(
STRCMP
(
global
,
"port"
)
)
{
port
=
stoul
(
glob
al
.
second
.
data
());
}
SETTING
(
"port"
)
{
port
=
stoul
(
v
al
.
second
.
data
());
LOG
(
debug
)
<<
" Port "
<<
port
;
}
else
if
(
STRCMP
(
global
,
"timeout"
)
)
{
timeout
=
stoul
(
glob
al
.
second
.
data
());
}
SETTING
(
"timeout"
)
{
timeout
=
stoul
(
v
al
.
second
.
data
());
LOG
(
debug
)
<<
" Timeout "
<<
timeout
;
}
else
if
(
STRCMP
(
global
,
"apdu_timeout"
)
)
{
apdu_timeout
=
stoul
(
glob
al
.
second
.
data
());
}
SETTING
(
"apdu_timeout"
)
{
apdu_timeout
=
stoul
(
v
al
.
second
.
data
());
LOG
(
debug
)
<<
" apdu_timeout "
<<
apdu_timeout
;
}
else
if
(
STRCMP
(
global
,
"apdu_retries"
)
)
{
apdu_retries
=
stoul
(
glob
al
.
second
.
data
());
}
SETTING
(
"apdu_retries"
)
{
apdu_retries
=
stoul
(
v
al
.
second
.
data
());
LOG
(
debug
)
<<
" apdu_retries "
<<
apdu_retries
;
}
}
...
...
@@ -54,100 +75,8 @@ bool BACnetConfigurator::derivedReadConfig(boost::property_tree::iptree& cfg) {
_bacClient
->
init
(
interface
,
address_cache
,
port
,
timeout
,
apdu_timeout
,
apdu_retries
);
}
catch
(
const
std
::
exception
&
e
)
{
LOG
(
error
)
<<
"Could not initialize BACnetClient: "
<<
e
.
what
();
return
false
;
}
BOOST_FOREACH
(
boost
::
property_tree
::
iptree
::
value_type
&
device
,
cfg
.
get_child
(
"devices"
))
{
if
(
STRCMP
(
device
,
"device"
))
{
LOG
(
debug
)
<<
"Device "
<<
device
.
second
.
data
();
if
(
!
device
.
second
.
empty
())
{
BOOST_FOREACH
(
boost
::
property_tree
::
iptree
::
value_type
&
d
,
device
.
second
)
{
if
(
STRCMP
(
d
,
"instance"
))
{
deviceInstance
=
stoul
(
d
.
second
.
data
());
}
else
if
(
STRCMP
(
d
,
"mqttPart"
))
{
mqttPartDevice
=
d
.
second
.
data
();
if
(
mqttPartDevice
[
mqttPartDevice
.
length
()
-
1
]
!=
'/'
)
{
mqttPartDevice
.
append
(
"/"
);
}
}
else
if
(
STRCMP
(
d
,
"object"
))
{
LOG
(
debug
)
<<
"Object
\"
"
<<
d
.
second
.
data
()
<<
"
\"
"
;
if
(
!
d
.
second
.
empty
())
{
BOOST_FOREACH
(
boost
::
property_tree
::
iptree
::
value_type
&
object
,
d
.
second
)
{
if
(
STRCMP
(
object
,
"type"
))
{
objType
=
static_cast
<
BACNET_OBJECT_TYPE
>
(
stoul
(
object
.
second
.
data
()));
}
else
if
(
STRCMP
(
object
,
"instance"
))
{
objInstance
=
stoul
(
object
.
second
.
data
());
}
else
if
(
STRCMP
(
object
,
"mqttPart"
))
{
mqttPartObject
=
object
.
second
.
data
();
if
(
mqttPartObject
[
mqttPartObject
.
length
()
-
1
]
!=
'/'
)
{
mqttPartObject
.
append
(
"/"
);
}
}
else
if
(
STRCMP
(
object
,
"property"
))
{
LOG
(
debug
)
<<
"Property
\"
"
<<
object
.
second
.
data
()
<<
"
\"
"
;
if
(
!
object
.
second
.
empty
())
{
std
::
string
name
=
device
.
second
.
data
()
+
"_"
+
d
.
second
.
data
()
+
"_"
+
object
.
second
.
data
();
BACnetSingleSensor
*
bacSensor
=
new
BACnetSingleSensor
(
name
);
//first check if default sensor is given
boost
::
optional
<
boost
::
property_tree
::
iptree
&>
defaultC
=
object
.
second
.
get_child_optional
(
"default"
);
if
(
defaultC
)
{
LOG
(
debug
)
<<
" Using
\"
"
<<
defaultC
.
get
().
data
()
<<
"
\"
as default."
;
sensorMap_t
::
iterator
it
=
_templateSensors
.
find
(
defaultC
.
get
().
data
());
if
(
it
!=
_templateSensors
.
end
())
{
*
bacSensor
=
it
->
second
;
bacSensor
->
setName
(
name
);
}
else
{
LOG
(
warning
)
<<
" Template sensor
\"
"
<<
defaultC
.
get
().
data
()
<<
"
\"
not found! Using standard values."
;
}
}
//set object and device related data as well as BACnetClient instance
//assume property aka sensors are read at last
bacSensor
->
setDeviceInstance
(
deviceInstance
);
bacSensor
->
setObjectInstance
(
objInstance
);
bacSensor
->
setObjectType
(
objType
);
bacSensor
->
setBACnetClient
(
_bacClient
);
bacSensor
->
setMqtt
(
_mqttPrefix
+
mqttPartDevice
+
mqttPartObject
);
//read remaining values
if
(
readSensorBase
(
*
bacSensor
,
object
.
second
))
{
_sensors
.
push_back
(
bacSensor
);
}
else
{
LOG
(
warning
)
<<
" Sensor
\"
"
<<
object
.
second
.
data
()
<<
"
\"
has bad values! Ignoring..."
<<
std
::
endl
;
}
}
}
}
}
}
}
}
}
}
return
true
;
}
void
BACnetConfigurator
::
derivedReReadConfig
()
{
delete
_bacClient
;
_bacClient
=
NULL
;
}
bool
BACnetConfigurator
::
derivedReadSensorBase
(
BACnetSensorBase
&
sensor
,
boost
::
property_tree
::
iptree
&
config
)
{
BOOST_FOREACH
(
boost
::
property_tree
::
iptree
::
value_type
&
val
,
config
)
{
if
(
STRCMP
(
val
,
"mqttsuffix"
))
{
sensor
.
setMqtt
(
sensor
.
getMqtt
()
+
val
.
second
.
data
());
}
else
if
(
STRCMP
(
val
,
"factor"
))
{
sensor
.
setFactor
(
std
::
stod
(
val
.
second
.
data
()));
}
else
if
(
STRCMP
(
val
,
"id"
))
{
sensor
.
setPropertyId
(
static_cast
<
BACNET_PROPERTY_ID
>
(
stoul
(
val
.
second
.
data
())));
}
delete
_bacClient
;
_bacClient
=
nullptr
;
return
;
}
LOG
(
debug
)
<<
" MQTT : "
<<
sensor
.
getMqtt
();
LOG
(
debug
)
<<
" factor : "
<<
sensor
.
getFactor
();
LOG
(
debug
)
<<
" instance : "
<<
sensor
.
getDeviceInstance
();
LOG
(
debug
)
<<
" objInst : "
<<
sensor
.
getObjectInstance
();
LOG
(
debug
)
<<
" objType : "
<<
sensor
.
getObjectType
();
LOG
(
debug
)
<<
" Property : "
<<
sensor
.
getPropertyId
();
return
true
;
}
src/sensors/bacnet/BACnetConfigurator.h
View file @
ad6e8558
...
...
@@ -9,21 +9,22 @@
#define BACNETCONFIGURATOR_H_
#include
"../../includes/ConfiguratorTemplate.h"
#include
"BACnetClient.h"
#include
"BACnetSingleSensor.h"
#include
"BACnetClient.h"
#include
"BACnetSensorGroup.h"
class
BACnetConfigurator
:
public
ConfiguratorTemplate
<
BACnetSensorBase
,
BACnetS
ingleS
ensor
>
{
class
BACnetConfigurator
:
public
ConfiguratorTemplate
<
BACnetSensorBase
,
BACnetSensor
Group
>
{
public:
BACnetConfigurator
();
virtual
~
BACnetConfigurator
();
protected:
bool
derivedReadConfig
(
boost
::
property_tree
::
iptree
&
cfg
)
override
;
void
derivedReReadConfig
()
override
;
void
derivedSetGlobalSettings
(
const
pluginSettings_t
&
pluginSettings
)
override
{
/*nothing to overwrite*/
}
bool
derivedReadSensorBase
(
BACnetSensorBase
&
sensor
,
boost
::
property_tree
::
iptree
&
config
)
override
;
/* Overwritten from ConfiguratorTemplate */
void
sensorBase
(
BACnetSensorBase
&
s
,
CFG_VAL
config
)
override
;
void
sensorGroup
(
BACnetSensorGroup
&
s
,
CFG_VAL
config
)
override
;
void
global
(
CFG_VAL
config
)
override
;
private:
BACnetClient
*
_bacClient
;
...
...
src/sensors/bacnet/BACnetSensorBase.h
View file @
ad6e8558
...
...
@@ -24,7 +24,6 @@ public:
_objectType
=
OBJECT_DEVICE
;
_propertyId
=
PROP_PRESENT_VALUE
;
_objectIndex
=
BACNET_ARRAY_ALL
;
_bacClient
=
NULL
;
}
virtual
~
BACnetSensorBase
()
{}
...
...
@@ -35,15 +34,13 @@ public:
BACNET_OBJECT_TYPE
getObjectType
()
const
{
return
_objectType
;
}
BACNET_PROPERTY_ID
getPropertyId
()
const
{
return
_propertyId
;
}
int32_t
getObjectIndex
()
const
{
return
_objectIndex
;
}
BACnetClient
*
getBACnetClient
()
const
{
return
_bacClient
;
}
void
setFactor
(
double
factor
)
{
_factor
=
factor
;
}
void
setDeviceInstance
(
uint32_t
deviceInstance
)
{
_deviceInstance
=
deviceInstance
;
}
void
setObjectInstance
(
uint32_t
objectInstance
)
{
_objectInstance
=
objectInstance
;
}
void
setObjectType
(
BACNET_OBJECT_TYPE
objectType
)
{
_objectType
=
objectType
;
}
void
setPropertyId
(
BACNET_PROPERTY_ID
property
)
{
_propertyId
=
property
;
}
void
setObjectIndex
(
int32_t
objectIndex
)
{
_objectIndex
=
objectIndex
;
}
void
setBACnetClient
(
BACnetClient
*
bacClient
)
{
_bacClient
=
bacClient
;
}
void
setFactor
(
const
std
::
string
&
factor
)
{
_factor
=
std
::
stod
(
factor
);
}
void
setDeviceInstance
(
const
std
::
string
&
deviceInstance
)
{
_deviceInstance
=
stoul
(
deviceInstance
);
}
void
setObjectInstance
(
const
std
::
string
&
objectInstance
)
{
_objectInstance
=
stoul
(
objectInstance
);
}
void
setObjectType
(
const
std
::
string
&
objectType
)
{
_objectType
=
static_cast
<
BACNET_OBJECT_TYPE
>
(
stoul
(
objectType
));
}
void
setPropertyId
(
const
std
::
string
&
property
)
{
_propertyId
=
static_cast
<
BACNET_PROPERTY_ID
>
(
stoul
(
property
));
}
void
setObjectIndex
(
int32_t
objectIndex
)
{
_objectIndex
=
objectIndex
;
}
protected:
double
_factor
;
...
...
@@ -52,8 +49,6 @@ protected:
BACNET_OBJECT_TYPE
_objectType
;
BACNET_PROPERTY_ID
_propertyId
;
int32_t
_objectIndex
;
BACnetClient
*
_bacClient
;
};
#endif
/* SRC_SENSORS_BACNET_BACNETSENSORBASE_H_ */
src/sensors/bacnet/BACnetS
ingleS
ensor.cpp
→
src/sensors/bacnet/BACnetSensor
Group
.cpp
View file @
ad6e8558
/*
* BACnetS
ingleS
ensor.cpp
* BACnetSensor
Group
.cpp
*
* Created on: 14.04.2018
* Author: Micha Mueller
*/
#include
"BACnetSingleSensor.h"
#include
"timestamp.h"
#include
"BACnetSensorGroup.h"
#include
<functional>
BACnetSingleSensor
::
BACnetSingleSensor
(
const
std
::
string
&
name
)
:
SensorBase
(
name
),
BACnetSensorBase
(
name
),
SingleSensor
(
name
)
{}
BACnetSensorGroup
::
BACnetSensorGroup
(
const
std
::
string
&
name
)
:
SensorGroupTemplate
(
name
)
{
_bacClient
=
nullptr
;
}
BACnetS
ingleSensor
::~
BACnetSingleSensor
()
{}
BACnetS
ensorGroup
::~
BACnetSensorGroup
()
{}
void
BACnetSingleSensor
::
init
(
boost
::
asio
::
io_service
&
io
)
{
void
BACnetSensorGroup
::
init
(
boost
::
asio
::
io_service
&
io
)
{
SensorGroupTemplate
::
init
(
io
);
if
(
_bacClient
)
{
_bacClient
->
initializeStrand
(
io
);
}
else
{
LOG
(
error
)
<<
"No BACnetClient set for sensor "
<<
_
n
ame
<<
"! Cannot initialize sensor."
;
LOG
(
error
)
<<
"No BACnetClient set for sensor "
<<
_
groupN
ame
<<
"! Cannot initialize sensor."
;
}
SingleSensor
::
init
(
io
);
}
void
BACnetS
ingleS
ensor
::
start
()
{
void
BACnetSensor
Group
::
start
()
{
if
(
_keepRunning
)
{
//we have been started already
LOG
(
info
)
<<
"Sensor "
<<
_
n
ame
<<
" already running."
;
LOG
(
info
)
<<
"Sensor
group
"
<<
_
groupN
ame
<<
" already running."
;
return
;
}
if
(
_bacClient
)
{
_keepRunning
=
1
;
_pendingTasks
++
;
_timer
->
async_wait
(
_bacClient
->
getStrand
()
->
wrap
(
std
::
bind
(
&
BACnetS
ingleS
ensor
::
readAsync
,
this
)));
LOG
(
info
)
<<
"Sensor "
<<
_
n
ame
<<
" started."
;
_timer
->
async_wait
(
_bacClient
->
getStrand
()
->
wrap
(
std
::
bind
(
&
BACnetSensor
Group
::
readAsync
,
this
)));
LOG
(
info
)
<<
"Sensor
group
"
<<
_
groupN
ame
<<
" started."
;
}
else
{
LOG
(
error
)
<<
"No BACnetClient set for sensor "
<<
_
n
ame
<<
"! Cannot start polling."
;
LOG
(
error
)
<<
"No BACnetClient set for sensor
group
"
<<
_
groupN
ame
<<
"! Cannot start polling."
;
}
}
void
BACnetS
ingleS
ensor
::
stop
()
{
void
BACnetSensor
Group
::
stop
()
{
_keepRunning
=
0
;
//cancel any outstanding readAsync()
_timer
->
cancel
();
LOG
(
info
)
<<
"Sensor "
<<
_
n
ame
<<
" stopped."
;
LOG
(
info
)
<<
"Sensor
group
"
<<
_
groupN
ame
<<
" stopped."
;
}
void
BACnetS
ingleS
ensor
::
read
()
{
void
BACnetSensor
Group
::
read
()
{
reading_t
reading
;
reading
.
timestamp
=
getTimestamp
();
try
{
reading
.
value
=
_bacClient
->
readProperty
(
_deviceInstance
,
_objectInstance
,
_objectType
,
_propertyId
)
*
_factor
;
storeReading
(
reading
,
_cacheIndex
);
_cacheIndex
=
(
_cacheIndex
+
1
)
%
_cacheSize
;
for
(
auto
s
:
_sensors
)
{
try
{
reading
.
value
=
_bacClient
->
readProperty
(
s
->
getDeviceInstance
(),
s
->
getObjectInstance
(),
s
->
getObjectType
(),
s
->
getPropertyId
())
*
s
->
getFactor
();
}
catch
(
const
std
::
exception
&
e
)
{
LOG
(
error
)
<<
_groupName
<<
"::"
<<
s
->
getName
()
<<
" could not read value: "
<<
e
.
what
();
//dummy value
reading
.
value
=
0
;
}
#ifdef DEBUG
LOG
(
debug
)
<<
_
n
ame
<<
":
\"
"
<<
reading
.
value
<<
"
\"
"
;
LOG
(
debug
)
<<
_
groupName
<<
"::"
<<
s
->
getN
ame
()
<<
":
\"
"
<<
reading
.
value
<<
"
\"
"
;
#endif
}
ca
t
ch
(
const
std
::
exception
&
e
)
{
LOG
(
error
)
<<
_name
<<
" could not read value: "
<<
e
.
what
(
);
//to keep the _
cach
eIndex uniform for all sensors store value in every case
s
->
storeReading
(
reading
,
_cacheIndex
);
}
_cacheIndex
=
(
_cacheIndex
+
1
)
%
_cacheSize
;
}
void
BACnetS
ingleS
ensor
::
readAsync
()
{
void
BACnetSensor
Group
::
readAsync
()
{
uint64_t
now
=
getTimestamp
();
read
();
if
(
_timer
&&
_keepRunning
)
{
uint64_t
next
=
now
+
MS_TO_NS
(
_interval
);
_timer
->
expires_at
(
timestamp2ptime
(
next
));
_pendingTasks
++
;
_timer
->
async_wait
(
_bacClient
->
getStrand
()
->
wrap
(
std
::
bind
(
&
BACnetS
ingleS
ensor
::
readAsync
,
this
)));
_timer
->
async_wait
(
_bacClient
->
getStrand
()
->
wrap
(
std
::
bind
(
&
BACnetSensor
Group
::
readAsync
,
this
)));
}
_pendingTasks
--
;
}
src/sensors/bacnet/BACnetS
ingleS
ensor.h
→
src/sensors/bacnet/BACnetSensor
Group
.h
View file @
ad6e8558
/*
* BACnetS
ingleS
ensor.h
* BACnetSensor
Group
.h
*
* Created on: 14.04.2018
* Author: Micha Mueller
*/
#ifndef BACNETS
INGLES
ENSOR_H_
#define BACNETS
INGLES
ENSOR_H_
#ifndef BACNETSENSOR
GROUP
_H_
#define BACNETSENSOR
GROUP
_H_
#include
"BACnetSensorBase.h"
#include
"../../includes/S
ingleSensor
.h"
#include
"../../includes/S
ensorGroupTemplate
.h"
class
BACnetS
ingleSensor
:
public
BACnetSensorBase
,
public
Single
Sensor
{
class
BACnetS
ensorGroup
:
public
SensorGroupTemplate
<
BACnet
Sensor
Base
>
{
public:
BACnetS
ingleS
ensor
(
const
std
::
string
&
name
);
virtual
~
BACnetS
ingleS
ensor
();
BACnetSensor
Group
(
const
std
::
string
&
name
);
virtual
~
BACnetSensor
Group
();
void
init
(
boost
::
asio
::
io_service
&
io
)
override
;
void
start
()
override
;
void
stop
()
override
;
void
setBACnetClient
(
BACnetClient
*
bacClient
)
{
_bacClient
=
bacClient
;
}
BACnetClient
*
const
getBACnetClient
()
const
{
return
_bacClient
;
}
private:
void
read
()
override
;
void
readAsync
()
override
;
BACnetClient
*
_bacClient
;
};
#endif
/* BACNETS
INGLES
ENSOR_H_ */
#endif
/* BACNETSENSOR
GROUP
_H_ */
src/sensors/ipmi/IPMIConfigurator.cpp
View file @
ad6e8558
...
...
@@ -21,7 +21,6 @@ IPMIConfigurator::IPMIConfigurator() {
IPMIConfigurator
::~
IPMIConfigurator
()
{}
/* Overwritten from ConfiguratorTemplate */
void
IPMIConfigurator
::
sensorBase
(
IPMISensorBase
&
s
,
CFG_VAL
config
)
{
ADD
{
ATTRIBUTE
(
"cmd"
,
setRawCmd
);
...
...
src/sensors/ipmi/IPMISensorGroup.cpp
View file @
ad6e8558
...
...
@@ -48,7 +48,7 @@ void IPMISensorGroup::start() {
_timer
->
async_wait
(
_host
->
getStrand
()
->
wrap
(
boost
::
bind
(
&
IPMISensorGroup
::
readAsync
,
this
)));
LOG
(
info
)
<<
"Sensorgroup "
<<
_groupName
<<
" started."
;
}
else
{
LOG
(
error
)
<<
"No host set for sensor "
<<
_groupName
<<
"! Cannot start polling."
;
LOG
(
error
)
<<
"No host set for sensor
group
"
<<
_groupName
<<
"! Cannot start polling."
;
return
;
}
}
...
...
src/sensors/ipmi/IPMISensorGroup.h
View file @
ad6e8558
...
...
@@ -11,8 +11,6 @@
#include
"IPMISensorBase.h"
#include
"../../includes/SensorGroupTemplate.h"