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
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
|
/* Copyright (C) 2015, Jaguar Land Rover. All Rights Reserved.
*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
#include <QCoreApplication>
#include <QDBusConnection>
#include <QDBusInterface>
#include <QDBusObjectPath>
#include <QDBusReply>
#include <QDebug>
#include <string.h>
int main(int argc, char *argv[])
{
// TODO: Clean this up, update API, etc.
if (argc < 5 || argc > 6)
{
qWarning() << "Error detected! Insufficient number of arguments.";
qWarning() << "";
qWarning() << "Usage: ambdbusaccess <R/W> <Object> <Property> <Zone> [Value]";
qWarning() << "- <R/W>";
qWarning() << " Used for specifying [R]ead or [W]rite.";
qWarning() << "- <Object>";
qWarning() << " The AMB object to access.";
qWarning() << "- <Property>";
qWarning() << " The property within the object to access.";
qWarning() << "- <Zone>";
qWarning() << " The AMB zone to access.";
qWarning() << "- [Value]";
qWarning() << " The value to write, if writing.";
qWarning() << "Example: ambdbusaccess Write ClimateControl FanSpeedLevel 0 7";
qWarning() << "";
qWarning() << "This program returns an int under the following conditions:";
qWarning() << "Successful Read: <Value Read>";
qWarning() << "Unsuccessful Read: -1";
qWarning() << "Successful Write: <Value Written>";
qWarning() << "Unsuccessful Write: -1";
return -1;
}
// TODO: Error check input.
bool read = !strncmp(argv[1], "R", 1);
QString object = argv[2];
QString property = argv[3];
qint32 zone = atoi(argv[4]);
qint32 value = 0;
if (argc == 6)
{
value = atoi(argv[5]);
}
// Necessary to suppress Qt messages about touching the D-Bus before the application was created.
QCoreApplication a(argc, argv);
// Sanity check that the system bus is actually present.
if (!QDBusConnection::systemBus().isConnected())
{
qCritical() << "Could not access system D-Bus!";
return -1;
}
// Get ahold of the manager object.
QDBusInterface *manager = new QDBusInterface("org.automotive.message.broker", "/", "org.automotive.Manager",
QDBusConnection::systemBus());
// Go fetch the path for the AMB object we are concerned with.
qDebug().nospace() << "Looking for property " << property.toStdString().c_str() << " of object " <<
object.toStdString().c_str() << " in zone " << zone << ".";
QDBusReply<QDBusObjectPath> propertyPath = manager->call("FindObjectForZone", object.toStdString().c_str(), zone);
if (!propertyPath.isValid())
{
qDebug() << "Invalid reply!" << propertyPath.error() << "Got the path:" << propertyPath.value().path();
}
// Now that we have the path, open an interface to the object.
QDBusInterface *propertyInterface = new QDBusInterface("org.automotive.message.broker", propertyPath.value().path(),
"org.automotive.ClimateControl", QDBusConnection::systemBus());
// Perform our read or write operation.
if (read)
{
QVariant reply = propertyInterface->property(property.toStdString().c_str());
if (!reply.isValid())
{
qDebug() << "Invalid reply when reading the property!" << propertyInterface->lastError() << "Property:" <<
reply.toString();
value = -1;
}
else
{
qDebug().nospace() << "Got a valid reply for the property of " << reply.toString().toStdString().c_str() << ".";
value = reply.toInt();
}
}
else
{
QVariant reply = propertyInterface->setProperty(property.toStdString().c_str(), value);
if (reply.toBool())
{
qDebug() << "Successfully wrote the property.";
}
else
{
qDebug() << "Failed to write the property.";
value = -1;
}
}
// Clean up.
delete propertyInterface;
delete manager;
// Either provide the read value or some feedback to the calling application.
return value;
}
|