Skip to content
GitLab
Projects
Groups
Snippets
/
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Sign in
Toggle navigation
Menu
9.2.2023: Due to updates GitLab will be unavailable for some minutes between 9:00 and 11:00.
Open sidebar
dcdb
dcdb
Commits
294e1751
Commit
294e1751
authored
Nov 24, 2018
by
Micha Mueller
Browse files
WIP Use std::shared_ptr instead of raw ptrs where appropriate
parent
6330a60a
Changes
11
Hide whitespace changes
Inline
Side-by-side
src/Configuration.cpp
View file @
294e1751
...
...
@@ -273,8 +273,8 @@ bool Configuration::readPlugins() {
}
//check if an MQTT-suffix was assigned twice
for
(
auto
g
:
dynLib
.
configurator
->
getSensorGroups
())
{
for
(
auto
s
:
g
->
getSensors
())
{
for
(
const
auto
&
g
:
dynLib
.
configurator
->
getSensorGroups
())
{
for
(
const
auto
&
s
:
g
->
getSensors
())
{
bool
ok
=
checkMqtt
(
s
->
getMqtt
());
if
(
!
ok
)
{
LOG
(
error
)
<<
"Problematic MQTT-Topics! Please check your config files"
;
...
...
src/HttpsServer.cpp
View file @
294e1751
...
...
@@ -147,9 +147,9 @@ void HttpsServer::requestHandler::operator()(server::request const &request, ser
if
(
p
.
id
==
pathStrs
[
0
])
{
boost
::
property_tree
::
ptree
root
,
sensors
;
for
(
auto
g
:
p
.
configurator
->
getSensorGroups
())
{
for
(
const
auto
&
g
:
p
.
configurator
->
getSensorGroups
())
{
boost
::
property_tree
::
ptree
group
;
for
(
auto
s
:
g
->
getSensors
())
{
for
(
const
auto
&
s
:
g
->
getSensors
())
{
group
.
put
(
s
->
getName
(),
""
);
}
sensors
.
add_child
(
g
->
getGroupName
(),
group
);
...
...
@@ -193,10 +193,10 @@ void HttpsServer::requestHandler::operator()(server::request const &request, ser
for
(
auto
&
p
:
_httpsServer
.
_plugins
)
{
if
(
p
.
id
==
pathStrs
[
0
])
{
response
=
"Sensor not found!"
;
for
(
auto
g
:
p
.
configurator
->
getSensorGroups
())
{
for
(
auto
s
:
g
->
getSensors
())
{
for
(
const
auto
&
g
:
p
.
configurator
->
getSensorGroups
())
{
for
(
const
auto
&
s
:
g
->
getSensors
())
{
if
(
s
->
getName
()
==
sensor
)
{
response
=
pathStrs
[
0
]
+
"::"
+
sensor
+
_httpsServer
.
calcAvg
(
s
,
g
->
getCacheSize
(),
time
);
response
=
pathStrs
[
0
]
+
"::"
+
sensor
+
_httpsServer
.
calcAvg
(
*
s
,
g
->
getCacheSize
(),
time
);
connection
->
set_status
(
server
::
connection
::
ok
);
break
;
}
...
...
@@ -231,7 +231,7 @@ void HttpsServer::requestHandler::operator()(server::request const &request, ser
if
(
action
==
"start"
)
{
for
(
auto
&
p
:
_httpsServer
.
_plugins
)
{
if
(
p
.
id
==
pathStrs
[
0
])
{
for
(
auto
g
:
p
.
configurator
->
getSensorGroups
())
{
for
(
const
auto
&
g
:
p
.
configurator
->
getSensorGroups
())
{
g
->
start
();
}
response
=
"Plugin "
+
pathStrs
[
0
]
+
": Sensors started"
;
...
...
@@ -242,7 +242,7 @@ void HttpsServer::requestHandler::operator()(server::request const &request, ser
}
else
if
(
action
==
"stop"
)
{
for
(
auto
&
p
:
_httpsServer
.
_plugins
)
{
if
(
p
.
id
==
pathStrs
[
0
])
{
for
(
auto
g
:
p
.
configurator
->
getSensorGroups
())
{
for
(
const
auto
&
g
:
p
.
configurator
->
getSensorGroups
())
{
g
->
stop
();
}
response
=
"Plugin "
+
pathStrs
[
0
]
+
": Sensors stopped"
;
...
...
@@ -269,7 +269,7 @@ void HttpsServer::requestHandler::operator()(server::request const &request, ser
connection
->
set_status
(
server
::
connection
::
internal_server_error
);
}
for
(
auto
g
:
p
.
configurator
->
getSensorGroups
())
{
for
(
const
auto
&
g
:
p
.
configurator
->
getSensorGroups
())
{
g
->
init
(
_httpsServer
.
_io
);
g
->
start
();
}
...
...
@@ -321,9 +321,9 @@ HttpsServer::~HttpsServer() {
delete
_server
;
}
std
::
string
HttpsServer
::
calcAvg
(
SensorBase
*
const
s
,
unsigned
cacheSize
,
uint64_t
time
)
{
std
::
string
HttpsServer
::
calcAvg
(
SensorBase
&
s
,
unsigned
cacheSize
,
uint64_t
time
)
{
uint64_t
avg
=
0
;
const
reading_t
*
const
cache
=
s
->
getCache
();
const
reading_t
*
const
cache
=
s
.
getCache
();
unsigned
count
=
0
;
for
(
unsigned
i
=
0
;
i
<
cacheSize
;
i
++
)
{
...
...
src/HttpsServer.h
View file @
294e1751
...
...
@@ -94,7 +94,7 @@ private:
*
* @return Response message of the form " Average of last *count* values is *avg*"
*/
std
::
string
calcAvg
(
SensorBase
*
const
s
,
unsigned
cacheSize
,
uint64_t
time
);
std
::
string
calcAvg
(
SensorBase
&
s
,
unsigned
cacheSize
,
uint64_t
time
);
/*
* Check if the authkey is valid and has the permission requiredPerm associated
...
...
src/MQTTPusher.cpp
View file @
294e1751
...
...
@@ -88,11 +88,11 @@ void MQTTPusher::push() {
//for faster response
break
;
}
for
(
auto
g
:
p
.
configurator
->
getSensorGroups
())
{
for
(
auto
s
:
g
->
getSensors
())
{
for
(
const
auto
&
g
:
p
.
configurator
->
getSensorGroups
())
{
for
(
const
auto
&
s
:
g
->
getSensors
())
{
if
(
s
->
getSizeOfReadingQueue
()
>=
g
->
getMinValues
())
{
if
(
totalCount
<
_maxNumberOfMessages
){
sendReadings
(
s
,
reads
,
totalCount
);
sendReadings
(
*
s
,
reads
,
totalCount
);
}
else
{
break
;
//ultimately we will go to sleep 1 second
}
...
...
@@ -106,7 +106,7 @@ void MQTTPusher::push() {
mosquitto_loop_stop
(
_mosq
,
false
);
}
void
MQTTPusher
::
sendReadings
(
SensorBase
*
s
,
reading_t
*
reads
,
std
::
size_t
&
totalCount
)
{
void
MQTTPusher
::
sendReadings
(
SensorBase
&
s
,
reading_t
*
reads
,
std
::
size_t
&
totalCount
)
{
//there was a (unintended) disconnect in the meantime --> reconnect
if
(
!
_connected
)
{
LOGM
(
error
)
<<
"Lost connection. Reconnecting..."
;
...
...
@@ -122,7 +122,7 @@ void MQTTPusher::sendReadings(SensorBase* s, reading_t* reads, std::size_t& tota
if
(
_connected
)
{
//get all sensor values out of its queue
std
::
size_t
count
=
s
->
popReadingQueue
(
reads
,
SensorBase
::
QUEUE_MAXLIMIT
);
std
::
size_t
count
=
s
.
popReadingQueue
(
reads
,
SensorBase
::
QUEUE_MAXLIMIT
);
//totalCount+= count;
totalCount
+=
1
;
#ifdef DEBUG
...
...
@@ -135,12 +135,12 @@ void MQTTPusher::sendReadings(SensorBase* s, reading_t* reads, std::size_t& tota
}
#endif
//try to send them to the broker
if
(
mosquitto_publish
(
_mosq
,
NULL
,
(
s
->
getMqtt
()).
c_str
(),
sizeof
(
reading_t
)
*
count
,
reads
,
1
,
false
)
!=
MOSQ_ERR_SUCCESS
)
{
if
(
mosquitto_publish
(
_mosq
,
NULL
,
(
s
.
getMqtt
()).
c_str
(),
sizeof
(
reading_t
)
*
count
,
reads
,
1
,
false
)
!=
MOSQ_ERR_SUCCESS
)
{
//could not send them --> push the sensor values back into the queue
LOGM
(
error
)
<<
"Could not send message! Trying again later"
;
_connected
=
false
;
s
->
pushReadingQueue
(
reads
,
count
);
s
.
pushReadingQueue
(
reads
,
count
);
//totalCount -= count;
totalCount
-=
1
;
sleep
(
5
);
...
...
src/MQTTPusher.h
View file @
294e1751
...
...
@@ -43,7 +43,7 @@ public:
}
private:
void
sendReadings
(
SensorBase
*
s
,
reading_t
*
reads
,
std
::
size_t
&
totalCount
);
void
sendReadings
(
SensorBase
&
s
,
reading_t
*
reads
,
std
::
size_t
&
totalCount
);
int
_brokerPort
;
std
::
string
_brokerHost
;
...
...
src/dcdbpusher.cpp
View file @
294e1751
...
...
@@ -59,7 +59,7 @@ void sigintHandler(int sig) {
LOG
(
info
)
<<
"Stopping sensors..."
;
for
(
auto
&
p
:
_configuration
->
getPlugins
())
{
LOG
(
info
)
<<
"Stop
\"
"
<<
p
.
id
<<
"
\"
plugin"
;
for
(
auto
g
:
p
.
configurator
->
getSensorGroups
())
{
for
(
const
auto
&
g
:
p
.
configurator
->
getSensorGroups
())
{
g
->
stop
();
}
}
...
...
@@ -268,7 +268,7 @@ int main(int argc, char** argv) {
LOG
(
info
)
<<
"Init sensors..."
;
for
(
auto
&
p
:
_configuration
->
getPlugins
())
{
LOG
(
info
)
<<
"Init
\"
"
<<
p
.
id
<<
"
\"
plugin"
;
for
(
auto
g
:
p
.
configurator
->
getSensorGroups
())
{
for
(
const
auto
&
g
:
p
.
configurator
->
getSensorGroups
())
{
LOG
(
debug
)
<<
" -Group: "
<<
g
->
getGroupName
();
g
->
init
(
io
);
}
...
...
@@ -278,7 +278,7 @@ int main(int argc, char** argv) {
LOG
(
info
)
<<
"Starting sensors..."
;
for
(
auto
&
p
:
_configuration
->
getPlugins
())
{
LOG
(
info
)
<<
"Start
\"
"
<<
p
.
id
<<
"
\"
plugin"
;
for
(
auto
g
:
p
.
configurator
->
getSensorGroups
())
{
for
(
const
auto
&
g
:
p
.
configurator
->
getSensorGroups
())
{
g
->
start
();
}
}
...
...
src/includes/ConfiguratorInterface.h
View file @
294e1751
...
...
@@ -30,7 +30,7 @@ public:
virtual
bool
readConfig
(
std
::
string
cfgPath
)
=
0
;
virtual
bool
reReadConfig
()
=
0
;
virtual
void
setGlobalSettings
(
const
pluginSettings_t
&
pluginSettings
)
=
0
;
virtual
std
::
vector
<
S
ensorGroupInterface
*
>&
getSensorGroups
()
=
0
;
virtual
std
::
vector
<
S
GroupPtr
>&
getSensorGroups
()
=
0
;
protected:
boost
::
log
::
sources
::
severity_logger
<
boost
::
log
::
trivial
::
severity_level
>
lg
;
...
...
src/includes/ConfiguratorTemplate.h
View file @
294e1751
...
...
@@ -39,6 +39,9 @@ protected:
typedef
std
::
map
<
std
::
string
,
SGroup
*>
sGroupMap_t
;
typedef
std
::
map
<
std
::
string
,
SEntity
*>
sEntityMap_t
;
using
SB_Ptr
=
std
::
shared_ptr
<
SBase
>
;
using
SG_Ptr
=
std
::
shared_ptr
<
SGroup
>
;
public:
ConfiguratorTemplate
()
:
_entityName
(
"INVALID"
),
...
...
@@ -51,9 +54,6 @@ public:
ConfiguratorTemplate
(
const
ConfiguratorTemplate
&
)
=
delete
;
virtual
~
ConfiguratorTemplate
()
{
for
(
auto
g
:
_sensorGroups
)
{
delete
g
;
}
for
(
auto
e
:
_sensorEntitys
)
{
delete
e
;
}
...
...
@@ -96,7 +96,6 @@ public:
//read groups and templates for groups. If present also entity/-template stuff
BOOST_FOREACH
(
boost
::
property_tree
::
iptree
::
value_type
&
val
,
cfg
)
{
//TODO allow single sensors for convenience?
//template entity
if
(
boost
::
iequals
(
val
.
first
,
"template_"
+
_entityName
))
{
LOG
(
debug
)
<<
"Template "
<<
_entityName
<<
"
\"
"
<<
val
.
second
.
data
()
<<
"
\"
"
;
...
...
@@ -153,7 +152,7 @@ public:
SGroup
*
group
=
new
SGroup
(
val
.
second
.
data
());
if
(
readSensorGroup
(
*
group
,
val
.
second
))
{
//group which consists of only one sensor
SB
ase
*
sensor
=
new
SBase
(
val
.
second
.
data
());
SB
_Ptr
sensor
=
std
::
make_shared
<
SBase
>
(
val
.
second
.
data
());
if
(
readSensorBase
(
*
sensor
,
val
.
second
))
{
group
->
pushBackSensor
(
sensor
);
auto
ret
=
_templateSensorGroups
.
insert
(
std
::
pair
<
std
::
string
,
SGroup
*>
(
val
.
second
.
data
(),
group
));
...
...
@@ -186,45 +185,41 @@ public:
}
else
if
(
boost
::
iequals
(
val
.
first
,
_groupName
))
{
LOG
(
debug
)
<<
_groupName
<<
"
\"
"
<<
val
.
second
.
data
()
<<
"
\"
"
;
if
(
!
val
.
second
.
empty
())
{
SG
roup
*
group
=
new
SGroup
(
val
.
second
.
data
());
SG
_Ptr
group
=
std
::
make_shared
<
SGroup
>
(
val
.
second
.
data
());
if
(
readSensorGroup
(
*
group
,
val
.
second
))
{
storeSensorGroup
(
group
);
}
else
{
LOG
(
warning
)
<<
_groupName
<<
"
\"
"
<<
val
.
second
.
data
()
<<
"
\"
has bad values! Ignoring..."
;
delete
group
;
}
}
//single sensor
}
else
if
(
boost
::
iequals
(
val
.
first
,
"single_"
+
_baseName
))
{
LOG
(
debug
)
<<
"Single "
<<
_baseName
<<
"
\"
"
<<
val
.
second
.
data
()
<<
"
\"
"
;
if
(
!
val
.
second
.
empty
())
{
SG
roup
*
group
=
new
SGroup
(
val
.
second
.
data
());
SG
_Ptr
group
=
std
::
make_shared
<
SGroup
>
(
val
.
second
.
data
());
if
(
readSensorGroup
(
*
group
,
val
.
second
))
{
//group which consists of only one sensor
SB
ase
*
sensor
;
SB
_Ptr
sensor
;
//perhaps one sensor is already present because it was copied from the template group
if
(
group
->
getSensors
().
size
()
!=
0
)
{
sensor
=
dynamic_cast
<
SBase
*
>
(
group
->
getSensors
()[
0
]);
sensor
=
static_pointer_cast
<
SB_Ptr
::
element_type
>
(
group
->
getSensors
()[
0
]);
sensor
->
setName
(
val
.
second
.
data
());
if
(
readSensorBase
(
*
sensor
,
val
.
second
))
{
storeSensorGroup
(
group
);
}
else
{
LOG
(
warning
)
<<
"Single "
<<
_baseName
<<
" "
<<
val
.
second
.
data
()
<<
" could not be read! Omitting"
;
delete
group
;
}
}
else
{
sensor
=
new
SBase
(
val
.
second
.
data
());
sensor
=
std
::
make_shared
<
SBase
>
(
val
.
second
.
data
());
if
(
readSensorBase
(
*
sensor
,
val
.
second
))
{
group
->
pushBackSensor
(
sensor
);
storeSensorGroup
(
group
);
}
else
{
LOG
(
warning
)
<<
"Single "
<<
_baseName
<<
" "
<<
val
.
second
.
data
()
<<
" could not be read! Omitting"
;
delete
group
;
}
}
}
else
{
LOG
(
warning
)
<<
"Single "
<<
_baseName
<<
"
\"
"
<<
val
.
second
.
data
()
<<
"
\"
has bad values! Ignoring..."
;
delete
group
;
}
}
}
...
...
@@ -256,9 +251,6 @@ public:
}
//clean up sensors/groups/entitys and templates
for
(
auto
g
:
_sensorGroups
)
{
delete
g
;
}
for
(
auto
e
:
_sensorEntitys
)
{
delete
e
;
}
...
...
@@ -301,12 +293,12 @@ public:
*
* @return Vector containing pointers to all sensor groups of this plugin
*/
std
::
vector
<
S
ensorGroupInterface
*
>&
getSensorGroups
()
final
{
std
::
vector
<
S
GroupPtr
>&
getSensorGroups
()
final
{
return
_sensorGroupInterfaces
;
}
protected:
void
storeSensorGroup
(
SG
roup
*
sGroup
)
{
void
storeSensorGroup
(
SG
_Ptr
sGroup
)
{
_sensorGroups
.
push_back
(
sGroup
);
_sensorGroupInterfaces
.
push_back
(
sGroup
);
}
...
...
@@ -389,12 +381,11 @@ protected:
}
}
else
if
(
boost
::
iequals
(
val
.
first
,
_baseName
))
{
LOG
(
debug
)
<<
" "
<<
_baseName
<<
" "
<<
val
.
second
.
data
();
SB
ase
*
sensor
=
new
SBase
(
val
.
second
.
data
());
SB
_Ptr
sensor
=
std
::
make_shared
<
SBase
>
(
val
.
second
.
data
());
if
(
readSensorBase
(
*
sensor
,
val
.
second
))
{
sGroup
.
pushBackSensor
(
sensor
);
}
else
{
LOG
(
warning
)
<<
_baseName
<<
" "
<<
sGroup
.
getGroupName
()
<<
"::"
<<
sensor
->
getName
()
<<
" could not be read! Omitting"
;
delete
sensor
;
}
}
}
...
...
@@ -430,7 +421,7 @@ protected:
sEntity
=
*
(
it
->
second
);
for
(
auto
g
:
_templateSensorGroups
)
{
if
(
isEntityOfGroup
(
*
(
it
->
second
),
*
(
g
.
second
)))
{
SG
roup
*
group
=
new
SGroup
(
*
(
g
.
second
));
SG
_Ptr
group
=
std
::
make_shared
<
SGroup
>
(
*
(
g
.
second
));
setEntityForGroup
(
sEntity
,
*
group
);
storeSensorGroup
(
group
);
}
...
...
@@ -446,32 +437,38 @@ protected:
if
(
boost
::
iequals
(
val
.
first
,
_groupName
))
{
LOG
(
debug
)
<<
" "
<<
_groupName
<<
" "
<<
val
.
second
.
data
();
if
(
!
val
.
second
.
empty
())
{
SGroup
*
group
=
new
SGroup
(
val
.
second
.
data
());
if
(
readSensor
Group
(
*
group
,
val
.
second
))
{
setEntityForGroup
(
sEntity
,
*
group
);
if
(
isTemplate
)
{
if
(
isTemplate
)
{
S
Group
*
group
=
new
SGroup
(
val
.
second
.
data
());
if
(
readSensorGroup
(
*
group
,
val
.
second
))
{
setEntityForGroup
(
sEntity
,
*
group
);
auto
ret
=
_templateSensorGroups
.
insert
(
std
::
pair
<
std
::
string
,
SGroup
*>
(
val
.
second
.
data
(),
group
));
if
(
!
ret
.
second
)
{
LOG
(
warning
)
<<
"Template "
<<
_groupName
<<
" "
<<
val
.
second
.
data
()
<<
" already exists! Omitting..."
;
delete
group
;
}
}
else
{
storeSensorGroup
(
group
);
LOG
(
warning
)
<<
_groupName
<<
" "
<<
group
->
getGroupName
()
<<
" could not be read! Omitting"
;
delete
group
;
}
}
else
{
LOG
(
warning
)
<<
_groupName
<<
" "
<<
group
->
getGroupName
()
<<
" could not be read! Omitting"
;
delete
group
;
SG_Ptr
group
=
std
::
make_shared
<
SGroup
>
(
val
.
second
.
data
());
if
(
readSensorGroup
(
*
group
,
val
.
second
))
{
setEntityForGroup
(
sEntity
,
*
group
);
storeSensorGroup
(
group
);
}
else
{
LOG
(
warning
)
<<
_groupName
<<
" "
<<
group
->
getGroupName
()
<<
" could not be read! Omitting"
;
}
}
}
}
else
if
(
boost
::
iequals
(
val
.
first
,
"single_"
+
_baseName
))
{
LOG
(
debug
)
<<
"Single "
<<
_baseName
<<
"
\"
"
<<
val
.
second
.
data
()
<<
"
\"
"
;
if
(
!
val
.
second
.
empty
())
{
SGroup
*
group
=
new
SGroup
(
val
.
second
.
data
());
//g
roup
which consists of only one sensor
if
(
readSensorGroup
(
*
group
,
val
.
second
))
{
setEntityForGroup
(
sEntity
,
*
group
);
if
(
isTemplate
)
{
SB
ase
*
sensor
=
new
SBase
(
val
.
second
.
data
());
if
(
isTemplate
)
{
SG
roup
*
group
=
new
SGroup
(
val
.
second
.
data
());
//group which consists of only one sensor
if
(
readSensorGroup
(
*
group
,
val
.
second
))
{
setEntityForGroup
(
sEntity
,
*
group
);
SB
_Ptr
sensor
=
std
::
make_shared
<
SBase
>
(
val
.
second
.
data
());
if
(
readSensorBase
(
*
sensor
,
val
.
second
))
{
group
->
pushBackSensor
(
sensor
);
auto
ret
=
_templateSensorGroups
.
insert
(
std
::
pair
<
std
::
string
,
SGroup
*>
(
val
.
second
.
data
(),
group
));
...
...
@@ -484,10 +481,18 @@ protected:
delete
group
;
}
}
else
{
SBase
*
sensor
;
LOG
(
warning
)
<<
"Single "
<<
_baseName
<<
"
\"
"
<<
val
.
second
.
data
()
<<
"
\"
has bad values! Ignoring..."
;
delete
group
;
}
}
else
{
SG_Ptr
group
=
std
::
make_shared
<
SGroup
>
(
val
.
second
.
data
());
//group which consists of only one sensor
if
(
readSensorGroup
(
*
group
,
val
.
second
))
{
setEntityForGroup
(
sEntity
,
*
group
);
SB_Ptr
sensor
;
//perhaps one sensor is already present because it was copied from the template group
if
(
group
->
getSensors
().
size
()
!=
0
)
{
sensor
=
dynamic
_cast
<
SBase
*
>
(
group
->
getSensors
()[
0
]);
sensor
=
static_pointer
_cast
<
SBase
>
(
group
->
getSensors
()[
0
]);
sensor
->
setName
(
val
.
second
.
data
());
if
(
readSensorBase
(
*
sensor
,
val
.
second
))
{
storeSensorGroup
(
group
);
...
...
@@ -496,7 +501,7 @@ protected:
delete
group
;
}
}
else
{
sensor
=
new
SBase
(
val
.
second
.
data
());
sensor
=
std
::
make_shared
<
SBase
>
(
val
.
second
.
data
());
if
(
readSensorBase
(
*
sensor
,
val
.
second
))
{
group
->
pushBackSensor
(
sensor
);
storeSensorGroup
(
group
);
...
...
@@ -505,10 +510,10 @@ protected:
delete
group
;
}
}
}
else
{
LOG
(
warning
)
<<
"Single "
<<
_baseName
<<
"
\"
"
<<
val
.
second
.
data
()
<<
"
\"
has bad values! Ignoring..."
;
delete
group
;
}
}
else
{
LOG
(
warning
)
<<
"Single "
<<
_baseName
<<
"
\"
"
<<
val
.
second
.
data
()
<<
"
\"
has bad values! Ignoring..."
;
delete
group
;
}
}
}
...
...
@@ -637,8 +642,8 @@ protected:
std
::
string
_cfgPath
;
std
::
string
_mqttPrefix
;
unsigned
int
_cacheInterval
;
std
::
vector
<
S
ensorGroupInterface
*
>
_sensorGroupInterfaces
;
std
::
vector
<
SG
roup
*>
_sensorGroups
;
std
::
vector
<
S
GroupPtr
>
_sensorGroupInterfaces
;
std
::
vector
<
SG
_Ptr
>
_sensorGroups
;
std
::
vector
<
SEntity
*>
_sensorEntitys
;
sBaseMap_t
_templateSensorBases
;
sGroupMap_t
_templateSensorGroups
;
...
...
src/includes/SensorBase.h
View file @
294e1751
...
...
@@ -86,8 +86,6 @@ public:
_latestValue
.
timestamp
=
reading
.
timestamp
;
}
protected:
std
::
string
_name
;
...
...
@@ -98,4 +96,7 @@ protected:
std
::
unique_ptr
<
boost
::
lockfree
::
spsc_queue
<
reading_t
>>
_readingQueue
;
};
//for better readability
using
SBasePtr
=
std
::
shared_ptr
<
SensorBase
>
;
#endif
/* SRC_SENSORBASE_H_ */
src/includes/SensorGroupInterface.h
View file @
294e1751
...
...
@@ -17,6 +17,7 @@
class
SensorGroupInterface
{
public:
SensorGroupInterface
(
const
std
::
string
&
groupName
)
:
_groupName
(
groupName
),
_mqttPart
(
""
),
...
...
@@ -92,8 +93,8 @@ public:
virtual
void
start
()
=
0
;
virtual
void
stop
()
=
0
;
virtual
void
pushBackSensor
(
S
ensor
Base
*
s
)
=
0
;
virtual
std
::
vector
<
S
ensor
Base
*
>&
getSensors
()
=
0
;
virtual
void
pushBackSensor
(
SBase
Ptr
s
)
=
0
;
virtual
std
::
vector
<
SBase
Ptr
>&
getSensors
()
=
0
;
protected:
virtual
void
read
()
=
0
;
...
...
@@ -112,4 +113,7 @@ protected:
boost
::
log
::
sources
::
severity_logger
<
boost
::
log
::
trivial
::
severity_level
>
lg
;
};
//for better readability
using
SGroupPtr
=
std
::
shared_ptr
<
SensorGroupInterface
>
;
#endif
/* SENSORGROUPINTERFACE_H_ */
src/includes/SensorGroupTemplate.h
View file @
294e1751
...
...
@@ -13,12 +13,16 @@
#include
"timestamp.h"
#include
<vector>
#include
<memory>
template
<
typename
S
>
class
SensorGroupTemplate
:
public
SensorGroupInterface
{
//the template shall only be instantiated for classes which derive from SensorBase
static_assert
(
std
::
is_base_of
<
SensorBase
,
S
>::
value
,
"S must derive from SensorBase!"
);
protected:
using
S_Ptr
=
std
::
shared_ptr
<
S
>
;
public:
SensorGroupTemplate
(
const
std
::
string
groupName
)
:
SensorGroupInterface
(
groupName
)
{}
...
...
@@ -26,28 +30,24 @@ public:
SensorGroupTemplate
(
const
SensorGroupTemplate
&
other
)
:
SensorGroupInterface
(
other
)
{
for
(
auto
s
:
other
.
_sensors
)
{
S
*
sensor
=
new
S
(
*
s
);
S
_Ptr
sensor
=
std
::
make_shared
<
S
>
(
*
s
);
_sensors
.
push_back
(
sensor
);
_baseSensors
.
push_back
(
sensor
);
}
}
virtual
~
SensorGroupTemplate
()
{
for
(
auto
s
:
_sensors
)
{
delete
s
;
}
_sensors
.
clear
();
_baseSensors
.
clear
();
}
SensorGroupTemplate
&
operator
=
(
const
SensorGroupTemplate
&
other
)
{
SensorGroupInterface
::
operator
=
(
other
);
for
(
auto
s
:
_sensors
)
{
delete
s
;
}
_sensors
.
clear
();
_baseSensors
.
clear
();
for
(
auto
s
:
other
.
_sensors
)
{
S
*
sensor
=
new
S
(
*
s
);
S
_Ptr
sensor
=
std
::
make_shared
<
S
>
(
*
s
);
_sensors
.
push_back
(
sensor
);
_baseSensors
.
push_back
(
sensor
);
}
...
...
@@ -55,8 +55,10 @@ public:
return
*
this
;
}
virtual
void
pushBackSensor
(
SensorBase
*
s
)
override
{
if
(
S
*
dSensor
=
dynamic_cast
<
S
*>
(
s
))
{
virtual
void
pushBackSensor
(
SBasePtr
s
)
override
{
//Undefined behavior will arise if a ptr type != S_Ptr is given to static_pointer_cast
//Use dynamic_pointer_cast instead if this is a problem
if
(
S_Ptr
dSensor
=
static_pointer_cast
<
S_Ptr
::
element_type
>
(
s
))
{
_sensors
.
push_back
(
dSensor
);
_baseSensors
.
push_back
(
s
);
}
else
{
...
...
@@ -64,7 +66,7 @@ public:
}
}
virtual
std
::
vector
<
S
ensor
Base
*
>&
getSensors
()
override
{
return
_baseSensors
;
}
virtual
std
::
vector
<
SBase
Ptr
>&
getSensors
()
override
{
return
_baseSensors
;
}
virtual
void
init
(
boost
::
asio
::
io_service
&
io
)
{
SensorGroupInterface
::
init
(
io
);
...
...
@@ -94,8 +96,8 @@ protected:
}
}
std
::
vector
<
S
*
>
_sensors
;
std
::
vector
<
S
ensor
Base
*
>
_baseSensors
;
std
::
vector
<
S
_Ptr
>
_sensors
;
std
::
vector
<
SBase
Ptr
>
_baseSensors
;
};
#endif
/* SENSORGROUPTEMPLATE_H_ */
Write
Preview
Supports
Markdown
0%
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment