summaryrefslogtreecommitdiff
path: root/plugins/common/dbusplugin.cpp
blob: e56b403bab470599ff9cd96c9a94543c86bf2c2f (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
/*
	Copyright (C) 2012  Intel Corporation

	This library is free software; you can redistribute it and/or
	modify it under the terms of the GNU Lesser General Public
	License as published by the Free Software Foundation; either
	version 2.1 of the License, or (at your option) any later version.

	This library is distributed in the hope that it will be useful,
	but WITHOUT ANY WARRANTY; without even the implied warranty of
	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
	Lesser General Public License for more details.

	You should have received a copy of the GNU Lesser General Public
	License along with this library; if not, write to the Free Software
	Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
*/

#include "dbusplugin.h"

#include <boost/lexical_cast.hpp>
#include <map>
#include <string>

#include "abstractroutingengine.h"
#include "debugout.h"
#include "listplusplus.h"

std::map<std::string, std::string> DBusSink::dbusConfig;

DBusSink::DBusSink(std::string propertyName, AbstractRoutingEngine* engine, GDBusConnection* connection, std::map<std::string, std::string> config)
	:AbstractDBusInterface("org.automotive."+propertyName, propertyName, connection),
	  AbstractSink(engine, dbusConfig)
{
	AbstractDBusInterface::re = engine;

	int timeout = 60;

	if(configuration.find("frequency") != configuration.end())
	{
		int t = boost::lexical_cast<int>(configuration["frequency"]);

		timeout = 1000 / t;
	}

	setTimeout(timeout);
}

void DBusSink::supportedChanged(const PropertyList &supportedProperties)
{
	startRegistration();

	for(auto itr : propertyDBusMap)
	{
		if(contains(supportedProperties, itr->ambPropertyName()))
		{
			PropertyInfo info = re->getPropertyInfo(itr->ambPropertyName(), mSourceFilter);

			if (!info.isValid() || !contains(info.zones(), zoneFilter))
			{
				continue;
			}

			VariantType* prop = itr;
			prop->setSourceFilter(mSourceFilter);
			prop->setZoneFilter(zoneFilter);
			prop->initialize();
			VehicleProperty::Property p = itr->ambPropertyName();
			routingEngine->subscribeToProperty(p, mSourceFilter, this);
			addProperty(prop);
			supported = true;
			mTime = amb::currentTime();
		}
	}
}

void DBusSink::propertyChanged(AbstractPropertyType *value)
{
	VehicleProperty::Property property = value->name;

	if( value->zone != zoneFilter)
		return;

	for(auto i : propertyDBusMap)
	{
		if(i->ambPropertyName() == property)
		{
			VariantType* prop = i;
			mTime = value->timestamp;
			prop->updateValue(value);
			updateValue(prop);
		}
	}
}

const string DBusSink::uuid()
{
	return "c2e6cafa-eef5-4b8a-99a0-0f2c9be1057d";
}