extend sensor values
This commit is contained in:
parent
7e152b7a09
commit
19a104dca0
@ -26,7 +26,6 @@
|
||||
\ingroup plugins
|
||||
\ingroup guh-plugins
|
||||
|
||||
|
||||
\chapter Plugin properties
|
||||
Following JSON file contains the definition and the description of all available \l{DeviceClass}{DeviceClasses}
|
||||
and \l{Vendor}{Vendors} of this \l{DevicePlugin}.
|
||||
@ -72,6 +71,8 @@ DeviceManager::DeviceSetupStatus DevicePluginSenic::setupDevice(Device *device)
|
||||
connect(nuimo, &Nuimo::batteryValueChaged, this, &DevicePluginSenic::onBatteryValueChanged);
|
||||
connect(nuimo, &Nuimo::buttonPressed, this, &DevicePluginSenic::onButtonPressed);
|
||||
connect(nuimo, &Nuimo::buttonReleased, this, &DevicePluginSenic::onButtonReleased);
|
||||
connect(nuimo, &Nuimo::swipeDetected, this, &DevicePluginSenic::onSwipeDetected);
|
||||
connect(nuimo, &Nuimo::rotationValueChanged, this, &DevicePluginSenic::onRotationValueChanged);
|
||||
|
||||
m_nuimos.insert(nuimo, device);
|
||||
|
||||
@ -103,11 +104,19 @@ DeviceManager::DeviceError DevicePluginSenic::executeAction(Device *device, cons
|
||||
}
|
||||
|
||||
if (action.actionTypeId() == showLogoActionTypeId) {
|
||||
nuimo->showGuhLogo();
|
||||
|
||||
if (action.param("logo").value().toString() == "Guh")
|
||||
nuimo->showGuhLogo();
|
||||
|
||||
if (action.param("logo").value().toString() == "Arrow up")
|
||||
nuimo->showArrowUp();
|
||||
|
||||
if (action.param("logo").value().toString() == "Arrow down")
|
||||
nuimo->showArrowDown();
|
||||
|
||||
return DeviceManager::DeviceErrorNoError;
|
||||
}
|
||||
|
||||
|
||||
return DeviceManager::DeviceErrorActionTypeNotFound;
|
||||
}
|
||||
|
||||
@ -176,6 +185,36 @@ void DevicePluginSenic::onButtonReleased()
|
||||
// TODO: user timer for detekt long pressed (if needed)
|
||||
}
|
||||
|
||||
void DevicePluginSenic::onSwipeDetected(const Nuimo::SwipeDirection &direction)
|
||||
{
|
||||
Nuimo *nuimo = static_cast<Nuimo *>(sender());
|
||||
Device *device = m_nuimos.value(nuimo);
|
||||
|
||||
switch (direction) {
|
||||
case Nuimo::SwipeDirectionLeft:
|
||||
emitEvent(Event(swipeLeftEventTypeId, device->id()));
|
||||
break;
|
||||
case Nuimo::SwipeDirectionRight:
|
||||
emitEvent(Event(swipeRightEventTypeId, device->id()));
|
||||
break;
|
||||
case Nuimo::SwipeDirectionUp:
|
||||
emitEvent(Event(swipeUpEventTypeId, device->id()));
|
||||
break;
|
||||
case Nuimo::SwipeDirectionDown:
|
||||
emitEvent(Event(swipeDownEventTypeId, device->id()));
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void DevicePluginSenic::onRotationValueChanged(const uint &value)
|
||||
{
|
||||
Nuimo *nuimo = static_cast<Nuimo *>(sender());
|
||||
Device *device = m_nuimos.value(nuimo);
|
||||
device->setStateValue(rotationStateTypeId, value);
|
||||
}
|
||||
|
||||
|
||||
#endif // BLUETOOTH_LE
|
||||
|
||||
|
||||
@ -55,6 +55,8 @@ private slots:
|
||||
void onBatteryValueChanged(const uint &percentage);
|
||||
void onButtonPressed();
|
||||
void onButtonReleased();
|
||||
void onSwipeDetected(const Nuimo::SwipeDirection &direction);
|
||||
void onRotationValueChanged(const uint &value);
|
||||
|
||||
};
|
||||
|
||||
|
||||
@ -50,6 +50,17 @@
|
||||
"maxValue": 100,
|
||||
"unit": "Percentage",
|
||||
"defaultValue": 0
|
||||
},
|
||||
{
|
||||
"id": "69a5f495-5452-434b-8fb8-b73d992c5446",
|
||||
"idName": "rotation",
|
||||
"name": "rotation",
|
||||
"index": 2,
|
||||
"type": "int",
|
||||
"minValue": 0,
|
||||
"maxValue": 100,
|
||||
"unit": "Percentage",
|
||||
"defaultValue": 0
|
||||
}
|
||||
],
|
||||
"actionTypes": [
|
||||
@ -69,7 +80,20 @@
|
||||
"id": "d44ca5b7-f8d6-4413-9d2e-cef89282c039",
|
||||
"idName": "showLogo",
|
||||
"index": 2,
|
||||
"name": "show logo"
|
||||
"name": "Show logo",
|
||||
"paramTypes": [
|
||||
{
|
||||
"name": "logo",
|
||||
"type": "QString",
|
||||
"index": 0,
|
||||
"defaultValue": "Guh",
|
||||
"allowedValues": [
|
||||
"Guh",
|
||||
"Arrow up",
|
||||
"Arrow down"
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
],
|
||||
"eventTypes": [
|
||||
@ -77,19 +101,31 @@
|
||||
"id": "5b9e08e8-7a6c-4311-9db6-82547847708c",
|
||||
"idName": "clicked",
|
||||
"name": "clicked",
|
||||
"index": "0"
|
||||
"index": 0
|
||||
},
|
||||
{
|
||||
"id": "2be36aa0-e2fe-4192-81c5-cf0bb7f08dd4",
|
||||
"idName": "swipeLeft",
|
||||
"name": "Swipe left",
|
||||
"index": "1"
|
||||
"index": 1
|
||||
},
|
||||
{
|
||||
"id": "81fb61ab-6d3d-4c1b-85fe-3dbd5c8dead7",
|
||||
"idName": "swipeRight",
|
||||
"name": "Swipe right",
|
||||
"index": "2"
|
||||
"index": 2
|
||||
},
|
||||
{
|
||||
"id": "ab5c575b-b265-491c-93ca-ad9212374bc1",
|
||||
"idName": "swipeUp",
|
||||
"name": "Swipe up",
|
||||
"index": 3
|
||||
},
|
||||
{
|
||||
"id": "4d97cf28-1030-4a30-bed5-411102dd4b9b",
|
||||
"idName": "swipeDown",
|
||||
"name": "Swipe down",
|
||||
"index": 4
|
||||
}
|
||||
]
|
||||
}
|
||||
|
||||
@ -24,6 +24,7 @@
|
||||
#include "extern-plugininfo.h"
|
||||
|
||||
#include <QBitArray>
|
||||
#include <QtEndian>
|
||||
|
||||
Nuimo::Nuimo(const QBluetoothDeviceInfo &deviceInfo, const QLowEnergyController::RemoteAddressType &addressType, QObject *parent) :
|
||||
BluetoothLowEnergyDevice(deviceInfo, addressType, parent),
|
||||
@ -45,35 +46,49 @@ bool Nuimo::isAvailable()
|
||||
void Nuimo::showGuhLogo()
|
||||
{
|
||||
QByteArray matrix(
|
||||
" "
|
||||
" * "
|
||||
" ** ** "
|
||||
" **** "
|
||||
" ** "
|
||||
" * "
|
||||
" * "
|
||||
" * "
|
||||
" ");
|
||||
" "
|
||||
" * "
|
||||
" ** "
|
||||
" *** ** "
|
||||
" ***** "
|
||||
" ** "
|
||||
" ** "
|
||||
" * "
|
||||
" ");
|
||||
|
||||
QBitArray bits;
|
||||
bits.resize(81);
|
||||
for (int i = 0; i < matrix.size(); i++) {
|
||||
if (matrix.at(i) != ' ') {
|
||||
bits[i] = true;
|
||||
}
|
||||
}
|
||||
showMatrix(matrix, 10);
|
||||
}
|
||||
|
||||
QByteArray bytes;
|
||||
bytes.resize(bits.count() / 8+1);
|
||||
bytes.fill(0);
|
||||
// Convert from QBitArray to QByteArray
|
||||
for(int b = 0; b < bits.count(); ++b)
|
||||
bytes[b / 8] = (bytes.at(b / 8) | ((bits[b] ? 1 : 0) << (b % 8)));
|
||||
void Nuimo::showArrowUp()
|
||||
{
|
||||
QByteArray matrix(
|
||||
" * "
|
||||
" *** "
|
||||
" * * * "
|
||||
" * * * "
|
||||
"* * *"
|
||||
" * "
|
||||
" * "
|
||||
" * "
|
||||
" * ");
|
||||
|
||||
bytes.append(QByteArray::fromHex("FF"));
|
||||
bytes.append(QByteArray::fromHex("AA"));
|
||||
showMatrix(matrix, 3);
|
||||
}
|
||||
|
||||
m_ledMatrixService->writeCharacteristic(m_ledMatrixCharacteristic, bytes);
|
||||
void Nuimo::showArrowDown()
|
||||
{
|
||||
QByteArray matrix(
|
||||
" * "
|
||||
" * "
|
||||
" * "
|
||||
" * "
|
||||
"* * *"
|
||||
" * * * "
|
||||
" * * * "
|
||||
" *** "
|
||||
" * ");
|
||||
|
||||
showMatrix(matrix, 3);
|
||||
}
|
||||
|
||||
void Nuimo::registerService(QLowEnergyService *service)
|
||||
@ -87,6 +102,29 @@ void Nuimo::registerService(QLowEnergyService *service)
|
||||
service->discoverDetails();
|
||||
}
|
||||
|
||||
void Nuimo::showMatrix(const QByteArray &matrix, const int &seconds)
|
||||
{
|
||||
QBitArray bits;
|
||||
bits.resize(81);
|
||||
for (int i = 0; i < matrix.size(); i++) {
|
||||
if (matrix.at(i) != ' ') {
|
||||
bits[i] = true;
|
||||
}
|
||||
}
|
||||
|
||||
QByteArray bytes;
|
||||
bytes.resize(bits.count() / 8 + 1);
|
||||
bytes.fill(0);
|
||||
// Convert from QBitArray to QByteArray
|
||||
for(int b = 0; b < bits.count(); ++b)
|
||||
bytes[b / 8] = (bytes.at(b / 8) | ((bits[b] ? 1 : 0) << (b % 8)));
|
||||
|
||||
bytes.append(QByteArray::fromHex("FF"));
|
||||
quint8 time = quint8(seconds * 10);
|
||||
bytes.append((char)time);
|
||||
m_ledMatrixService->writeCharacteristic(m_ledMatrixCharacteristic, bytes);
|
||||
}
|
||||
|
||||
|
||||
void Nuimo::serviceScanFinished()
|
||||
{
|
||||
@ -192,18 +230,18 @@ void Nuimo::serviceStateChanged(const QLowEnergyService::ServiceState &state)
|
||||
|
||||
switch (state) {
|
||||
case QLowEnergyService::DiscoveringServices:
|
||||
if (service == m_batteryService) {
|
||||
if (service == m_batteryService)
|
||||
qCDebug(dcSenic()) << "Start discovering battery service...";
|
||||
}
|
||||
if (service == m_deviceInfoService) {
|
||||
|
||||
if (service == m_deviceInfoService)
|
||||
qCDebug(dcSenic()) << "Start discovering device information service...";
|
||||
}
|
||||
if (service == m_inputService) {
|
||||
|
||||
if (service == m_inputService)
|
||||
qCDebug(dcSenic()) << "Start discovering input service...";
|
||||
}
|
||||
if (service == m_inputService) {
|
||||
|
||||
if (service == m_ledMatrixService)
|
||||
qCDebug(dcSenic()) << "Start discovering led matrix service...";
|
||||
}
|
||||
|
||||
break;
|
||||
case QLowEnergyService::ServiceDiscovered:
|
||||
|
||||
@ -243,19 +281,43 @@ void Nuimo::serviceStateChanged(const QLowEnergyService::ServiceState &state)
|
||||
// Input
|
||||
if (service == m_inputService) {
|
||||
qCDebug(dcSenic()) << "Input service discovered";
|
||||
|
||||
// Button
|
||||
m_inputButtonCharacteristic = m_inputService->characteristic(QBluetoothUuid(QUuid("F29B1529-CB19-40F3-BE5C-7241ECB82FD2")));
|
||||
if (!m_inputButtonCharacteristic.isValid()) {
|
||||
qCWarning(dcSenic()) << "Button characteristc not found for device " << name() << address().toString();
|
||||
qCWarning(dcSenic()) << "Button characteristc not valid for device " << name() << address().toString();
|
||||
return;
|
||||
}
|
||||
foreach (const QLowEnergyDescriptor &descriptor, m_inputButtonCharacteristic.descriptors()) {
|
||||
qCDebug(dcSenic()) << descriptor.name() << descriptor.uuid().toString();
|
||||
m_inputService->writeDescriptor(descriptor, QByteArray::fromHex("0100"));
|
||||
}
|
||||
|
||||
// Swipe
|
||||
m_inputSwipeCharacteristic = m_inputService->characteristic(QBluetoothUuid(QUuid("F29B1527-CB19-40F3-BE5C-7241ECB82FD2")));
|
||||
if (!m_inputSwipeCharacteristic.isValid()) {
|
||||
qCWarning(dcSenic()) << "Swipe characteristc not valid for device " << name() << address().toString();
|
||||
return;
|
||||
}
|
||||
foreach (const QLowEnergyDescriptor &descriptor, m_inputSwipeCharacteristic.descriptors()) {
|
||||
qCDebug(dcSenic()) << descriptor.name() << descriptor.uuid().toString();
|
||||
m_inputService->writeDescriptor(descriptor, QByteArray::fromHex("0100"));
|
||||
}
|
||||
|
||||
// Swipe
|
||||
m_inputRotationCharacteristic = m_inputService->characteristic(QBluetoothUuid(QUuid("F29B1528-CB19-40F3-BE5C-7241ECB82FD2")));
|
||||
if (!m_inputRotationCharacteristic.isValid()) {
|
||||
qCWarning(dcSenic()) << "Rotation characteristc not valid for device " << name() << address().toString();
|
||||
return;
|
||||
}
|
||||
|
||||
foreach (const QLowEnergyDescriptor &descriptor, m_inputButtonCharacteristic.descriptors()) {
|
||||
foreach (const QLowEnergyDescriptor &descriptor, m_inputRotationCharacteristic.descriptors()) {
|
||||
qCDebug(dcSenic()) << descriptor.name() << descriptor.uuid().toString();
|
||||
m_inputService->writeDescriptor(descriptor, QByteArray::fromHex("0100"));
|
||||
}
|
||||
}
|
||||
|
||||
// Input
|
||||
// Led Matrix
|
||||
if (service == m_ledMatrixService) {
|
||||
qCDebug(dcSenic()) << "Led matrix service discovered";
|
||||
m_ledMatrixCharacteristic = m_ledMatrixService->characteristic(QBluetoothUuid(QUuid("F29B1524-CB19-40F3-BE5C-7241ECB82FD1")));
|
||||
@ -293,6 +355,47 @@ void Nuimo::serviceCharacteristicChanged(const QLowEnergyCharacteristic &charact
|
||||
return;
|
||||
}
|
||||
|
||||
if (characteristic.uuid() == m_inputSwipeCharacteristic.uuid()) {
|
||||
quint8 swipe = (quint8)value.toHex().toUInt(0, 16);
|
||||
switch (swipe) {
|
||||
case 0:
|
||||
qCDebug(dcSenic()) << "Swipe: Left";
|
||||
emit swipeDetected(SwipeDirectionLeft);
|
||||
break;
|
||||
case 1:
|
||||
qCDebug(dcSenic()) << "Swipe: Right";
|
||||
emit swipeDetected(SwipeDirectionRight);
|
||||
break;
|
||||
case 2:
|
||||
qCDebug(dcSenic()) << "Swipe: Up";
|
||||
emit swipeDetected(SwipeDirectionUp);
|
||||
break;
|
||||
case 3:
|
||||
qCDebug(dcSenic()) << "Swipe: Down";
|
||||
emit swipeDetected(SwipeDirectionDown);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
if (characteristic.uuid() == m_inputRotationCharacteristic.uuid()) {
|
||||
qint16 intValue = qFromLittleEndian<quint16>((uchar *)value.constData());
|
||||
qCDebug(dcSenic()) << "Rotation" << value.toHex() << intValue;
|
||||
int finalValue = m_rotationValue + qRound(intValue / 10.0);
|
||||
if (finalValue <= 0) {
|
||||
m_rotationValue = 0;
|
||||
} else if (finalValue >= 100) {
|
||||
m_rotationValue = 100;
|
||||
} else {
|
||||
m_rotationValue = finalValue;
|
||||
}
|
||||
emit rotationValueChanged(m_rotationValue);
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
qCDebug(dcSenic()) << "Service characteristic changed" << characteristic.name() << value.toHex();
|
||||
}
|
||||
|
||||
|
||||
@ -33,11 +33,20 @@ class Nuimo : public BluetoothLowEnergyDevice
|
||||
{
|
||||
Q_OBJECT
|
||||
public:
|
||||
enum SwipeDirection {
|
||||
SwipeDirectionLeft,
|
||||
SwipeDirectionRight,
|
||||
SwipeDirectionUp,
|
||||
SwipeDirectionDown
|
||||
};
|
||||
|
||||
explicit Nuimo(const QBluetoothDeviceInfo &deviceInfo, const QLowEnergyController::RemoteAddressType &addressType, QObject *parent = 0);
|
||||
|
||||
bool isAvailable();
|
||||
|
||||
void showGuhLogo();
|
||||
void showArrowUp();
|
||||
void showArrowDown();
|
||||
|
||||
private:
|
||||
QLowEnergyService *m_deviceInfoService;
|
||||
@ -47,18 +56,24 @@ private:
|
||||
|
||||
QLowEnergyCharacteristic m_deviceInfoCharacteristic;
|
||||
QLowEnergyCharacteristic m_batteryCharacteristic;
|
||||
QLowEnergyCharacteristic m_inputButtonCharacteristic;
|
||||
QLowEnergyCharacteristic m_ledMatrixCharacteristic;
|
||||
QLowEnergyCharacteristic m_inputButtonCharacteristic;
|
||||
QLowEnergyCharacteristic m_inputSwipeCharacteristic;
|
||||
QLowEnergyCharacteristic m_inputRotationCharacteristic;
|
||||
|
||||
bool m_isAvailable;
|
||||
uint m_rotationValue;
|
||||
|
||||
void registerService(QLowEnergyService *service);
|
||||
void showMatrix(const QByteArray &matrix, const int &seconds);
|
||||
|
||||
signals:
|
||||
void availableChanged();
|
||||
void buttonPressed();
|
||||
void buttonReleased();
|
||||
void batteryValueChaged(const uint &percentage);
|
||||
void swipeDetected(const SwipeDirection &direction);
|
||||
void rotationValueChanged(const uint &value);
|
||||
|
||||
private slots:
|
||||
void serviceScanFinished();
|
||||
|
||||
Reference in New Issue
Block a user