diff options
Diffstat (limited to 'tradeshow/iot-sensortag')
-rw-r--r-- | tradeshow/iot-sensortag/bluetoothdataprovider.cpp | 18 | ||||
-rw-r--r-- | tradeshow/iot-sensortag/bluetoothdataprovider.h | 2 | ||||
-rw-r--r-- | tradeshow/iot-sensortag/bluetoothdevice.cpp | 212 | ||||
-rw-r--r-- | tradeshow/iot-sensortag/bluetoothdevice.h | 28 | ||||
-rw-r--r-- | tradeshow/iot-sensortag/clouddataprovider.cpp | 11 | ||||
-rw-r--r-- | tradeshow/iot-sensortag/cloudupdate.cpp | 4 | ||||
-rw-r--r-- | tradeshow/iot-sensortag/mockdataprovider.cpp | 42 | ||||
-rw-r--r-- | tradeshow/iot-sensortag/mockdataprovider.h | 3 | ||||
-rw-r--r-- | tradeshow/iot-sensortag/resources/base/ObjectTemperatureChart.qml | 2 | ||||
-rw-r--r-- | tradeshow/iot-sensortag/resources/base/TemperatureChart.qml | 10 | ||||
-rw-r--r-- | tradeshow/iot-sensortag/sensortagdataprovider.cpp | 38 | ||||
-rw-r--r-- | tradeshow/iot-sensortag/sensortagdataprovider.h | 15 |
12 files changed, 122 insertions, 263 deletions
diff --git a/tradeshow/iot-sensortag/bluetoothdataprovider.cpp b/tradeshow/iot-sensortag/bluetoothdataprovider.cpp index 4737987..c76404f 100644 --- a/tradeshow/iot-sensortag/bluetoothdataprovider.cpp +++ b/tradeshow/iot-sensortag/bluetoothdataprovider.cpp @@ -95,11 +95,10 @@ void BluetoothDataProvider::startServiceScan() activeDevice->scanServices(); } -void BluetoothDataProvider::temperatureReceived(double temperature) +void BluetoothDataProvider::temperatureReceived(double newAmbientTemperature, double newObjectTemperature) { - if (temperature == irTemperature) - return; - irTemperature = temperature; + irAmbientTemperature = newAmbientTemperature; + irObjectTemperature = newObjectTemperature; emit infraredCelsiusTemperatureChanged(); } @@ -137,8 +136,6 @@ float BluetoothDataProvider::countRotationDegrees(double degreesPerSecond, quint void BluetoothDataProvider::motionReceived(MotionSensorData &data) { - qCDebug(boot2QtDemos) << Q_FUNC_INFO << ":" << data.gyroScope_x << "," << data.msSincePreviousData - << "=" << countRotationDegrees(data.gyroScope_x, data.msSincePreviousData); gyroscopeX_degPerSec = data.gyroScope_x; gyroscopeY_degPerSec = data.gyroScope_y; gyroscopeZ_degPerSec = data.gyroScope_z; @@ -163,10 +160,6 @@ void BluetoothDataProvider::motionReceived(MotionSensorData &data) emit rotationXChanged(); emit rotationYChanged(); emit rotationZChanged(); - // Signal that all values have changed, for easier - // value change handling in clients - emit rotationValuesChanged(); - accelometer_mG_xAxis = data.accelometer_x; accelometer_mG_yAxis = data.accelometer_y; accelometer_mG_zAxis = data.accelometer_z; @@ -175,6 +168,9 @@ void BluetoothDataProvider::motionReceived(MotionSensorData &data) magnetometerMicroT_yAxis = data.magnetometer_y; magnetometerMicroT_zAxis = data.magnetometer_z; emit magnetometerMicroTChanged(); + // Signal that all values have changed, for easier + // value change handling in clients + emit rotationValuesChanged(); } QString BluetoothDataProvider::sensorType() const @@ -184,7 +180,7 @@ QString BluetoothDataProvider::sensorType() const QString BluetoothDataProvider::versionString() const { - return QString("1.0"); + return QString("1.1"); } void BluetoothDataProvider::updateState() diff --git a/tradeshow/iot-sensortag/bluetoothdataprovider.h b/tradeshow/iot-sensortag/bluetoothdataprovider.h index 0c72673..f232aae 100644 --- a/tradeshow/iot-sensortag/bluetoothdataprovider.h +++ b/tradeshow/iot-sensortag/bluetoothdataprovider.h @@ -75,7 +75,7 @@ public: public slots: void startServiceScan(); - void temperatureReceived(double temperature); + void temperatureReceived(double newAmbientTemperature, double newObjectTemperature); void barometerReceived(double temperature, double barometer); void humidityReceived(double humidity); void lightIntensityReceived(double lightIntensity); diff --git a/tradeshow/iot-sensortag/bluetoothdevice.cpp b/tradeshow/iot-sensortag/bluetoothdevice.cpp index 66faf5a..a7b8bc4 100644 --- a/tradeshow/iot-sensortag/bluetoothdevice.cpp +++ b/tradeshow/iot-sensortag/bluetoothdevice.cpp @@ -58,18 +58,14 @@ #include <QTimer> #include <QDebug> #include <QtMath> +#include <QDateTime> Q_DECLARE_LOGGING_CATEGORY(boot2QtDemos) -// The average time from read request to read response is 150ms in optimal conditions. -// With other sensors being read we have to limit it to even longer periods. -#define RAPID_TIMER_MS 350 -#define MEDIUM_TIMER_MS (1.5*RAPID_TIMER_MS) -#define SLOW_TIMER_MS 2000 - #define START_MEASUREMENT_STR "01" /* 01 start, 00 stop */ #define DISABLE_NOTIF_STR "0000" /* 0100 enable, 0000 disable */ -#define SLOW_TIMER_TIMEOUT_STR "FA" /* 250 -> 2500ms */ +#define ENABLE_NOTIF_STR "0100" /* 0100 enable, 0000 disable */ +#define SLOW_TIMER_TIMEOUT_STR "64" /* 100 -> 1000ms */ #define MEDIUM_TIMER_TIMEOUT_STR "32" /* 50 -> 500ms */ #define RAPID_TIMER_TIMEOUT_STR "0A" /* 10 -> 100ms */ #define MOVEMENT_ENABLE_SENSORS_BITMASK_VALUE "7F02" /* see below */ @@ -85,6 +81,13 @@ Q_DECLARE_LOGGING_CATEGORY(boot2QtDemos) //MPU9250_ACCELEROMETER_RANGE_2 =0b0000_0010 = 8 G (default) //MPU9250_ACCELEROMETER_RANGE_3 =0b0000_0011 = 16 G +// These modifiers come from the Texas Intruments SensorTag Bluetooth LE API specification +#define GYROSCOPE_API_READING_MULTIPLIER (500.0 / 65536.0) +#define ACCELOMETER_API_READING_MULTIPLIER (8.0 / 32.768) +#define HUMIDITY_API_READING_MULTIPLIER (100.0 / 65536.0) +#define IR_TEMPERATURE_API_READING_DIVIDER 128.0 +#define BAROMETER_API_READING_DIVIDER 100 + typedef struct { qint16 gyrox; qint16 gyroy; @@ -107,10 +110,8 @@ BluetoothDevice::BluetoothDevice() , motionService(0) , m_deviceState(DeviceState::Disconnected) , randomAddress(false) - , slowTimer(0) - , mediumTimer(0) - , rapidTimer(0) { + lastMilliseconds = QDateTime::currentMSecsSinceEpoch(); statusUpdated("Device created"); } @@ -122,18 +123,6 @@ BluetoothDevice::BluetoothDevice(const QBluetoothDeviceInfo &d) BluetoothDevice::~BluetoothDevice() { - if (slowTimer) { - slowTimer->stop(); - delete slowTimer; - } - if (mediumTimer) { - mediumTimer->stop(); - delete mediumTimer; - } - if (rapidTimer) { - rapidTimer->stop(); - delete rapidTimer; - } delete discoveryAgent; delete controller; qDeleteAll(m_services); @@ -240,7 +229,7 @@ void BluetoothDevice::serviceScanDone() irTemperatureService = controller->createServiceObject(uuid); connect(irTemperatureService, &QLowEnergyService::stateChanged, this, &BluetoothDevice::temperatureDetailsDiscovered); - connect(irTemperatureService, &QLowEnergyService::characteristicRead, this, &BluetoothDevice::characteristicsRead); + connect(irTemperatureService, &QLowEnergyService::characteristicChanged, this, &BluetoothDevice::characteristicsRead); irTemperatureService->discoverDetails(); } if (!baroService) @@ -256,7 +245,7 @@ void BluetoothDevice::serviceScanDone() baroService = controller->createServiceObject(uuid); connect(baroService, &QLowEnergyService::stateChanged, this, &BluetoothDevice::barometerDetailsDiscovered); - connect(baroService, &QLowEnergyService::characteristicRead, this, &BluetoothDevice::characteristicsRead); + connect(baroService, &QLowEnergyService::characteristicChanged, this, &BluetoothDevice::characteristicsRead); baroService->discoverDetails(); } if (!humidityService) @@ -273,7 +262,7 @@ void BluetoothDevice::serviceScanDone() humidityService = controller->createServiceObject(uuid); connect(humidityService, &QLowEnergyService::stateChanged, this, &BluetoothDevice::humidityDetailsDiscovered); - connect(humidityService, &QLowEnergyService::characteristicRead, this, &BluetoothDevice::characteristicsRead); + connect(humidityService, &QLowEnergyService::characteristicChanged, this, &BluetoothDevice::characteristicsRead); humidityService->discoverDetails(); } @@ -291,7 +280,7 @@ void BluetoothDevice::serviceScanDone() lightService = controller->createServiceObject(uuid); connect(lightService, &QLowEnergyService::stateChanged, this, &BluetoothDevice::lightIntensityDetailsDiscovered); - connect(lightService, &QLowEnergyService::characteristicRead, this, &BluetoothDevice::characteristicsRead); + connect(lightService, &QLowEnergyService::characteristicChanged, this, &BluetoothDevice::characteristicsRead); lightService->discoverDetails(); } if (!motionService) @@ -306,7 +295,7 @@ void BluetoothDevice::serviceScanDone() } motionService = controller->createServiceObject(uuid); connect(motionService, &QLowEnergyService::stateChanged, this, &BluetoothDevice::motionDetailsDiscovered); - connect(motionService, &QLowEnergyService::characteristicRead, this, &BluetoothDevice::characteristicsRead); + connect(motionService, &QLowEnergyService::characteristicChanged, this, &BluetoothDevice::characteristicsRead); motionService->discoverDetails(); } attitudeChangeInterval.restart(); @@ -331,7 +320,7 @@ void BluetoothDevice::temperatureDetailsDiscovered(QLowEnergyService::ServiceSta if (id.toString().contains("f000aa01-0451-4000-b000-000000000000")) { //RN - irTemperatureService->writeDescriptor(characteristic.descriptors().at(0), QByteArray::fromHex(DISABLE_NOTIF_STR)); + irTemperatureService->writeDescriptor(characteristic.descriptors().at(0), QByteArray::fromHex(ENABLE_NOTIF_STR)); } if (id.toString().contains("f000aa02-0451-4000-b000-000000000000")) { //RW @@ -363,13 +352,13 @@ void BluetoothDevice::barometerDetailsDiscovered(QLowEnergyService::ServiceState qCDebug(boot2QtDemos)<<"characteristic:"<<id.toString(); if (id.toString().contains("f000aa41-0451-4000-b000-000000000000")) { - baroService->writeDescriptor(characteristic.descriptors().at(0), QByteArray::fromHex(DISABLE_NOTIF_STR)); + baroService->writeDescriptor(characteristic.descriptors().at(0), QByteArray::fromHex(ENABLE_NOTIF_STR)); } if (id.toString().contains("f000aa42-0451-4000-b000-000000000000")) { baroService->writeCharacteristic(characteristic, QByteArray::fromHex(START_MEASUREMENT_STR), QLowEnergyService::WriteWithResponse); // Start } if (id.toString().contains("f000aa44-0451-4000-b000-000000000000")) { - baroService->writeCharacteristic(characteristic, QByteArray::fromHex(SLOW_TIMER_TIMEOUT_STR), QLowEnergyService::WriteWithResponse); // Period 1 second + baroService->writeCharacteristic(characteristic, QByteArray::fromHex(MEDIUM_TIMER_TIMEOUT_STR), QLowEnergyService::WriteWithResponse); // Period 1 second } } m_barometerMeasurementStarted = true; @@ -394,7 +383,7 @@ void BluetoothDevice::humidityDetailsDiscovered(QLowEnergyService::ServiceState qCDebug(boot2QtDemos)<<"characteristic:"<<id.toString(); if (id.toString().contains("f000aa21-0451-4000-b000-000000000000")) { - humidityService->writeDescriptor(characteristic.descriptors().at(0), QByteArray::fromHex(DISABLE_NOTIF_STR)); + humidityService->writeDescriptor(characteristic.descriptors().at(0), QByteArray::fromHex(ENABLE_NOTIF_STR)); } if (id.toString().contains("f000aa22-0451-4000-b000-000000000000")) { humidityService->writeCharacteristic(characteristic, QByteArray::fromHex(START_MEASUREMENT_STR), QLowEnergyService::WriteWithResponse); // Start @@ -425,7 +414,7 @@ void BluetoothDevice::lightIntensityDetailsDiscovered(QLowEnergyService::Service qCDebug(boot2QtDemos)<<"characteristic:"<<id.toString(); if (id.toString().contains("f000aa71-0451-4000-b000-000000000000")) { - lightService->writeDescriptor(characteristic.descriptors().at(0), QByteArray::fromHex(DISABLE_NOTIF_STR)); + lightService->writeDescriptor(characteristic.descriptors().at(0), QByteArray::fromHex(ENABLE_NOTIF_STR)); } if (id.toString().contains("f000aa72-0451-4000-b000-000000000000")) { lightService->writeCharacteristic(characteristic, QByteArray::fromHex(START_MEASUREMENT_STR), QLowEnergyService::WriteWithResponse); // Start @@ -440,8 +429,13 @@ void BluetoothDevice::lightIntensityDetailsDiscovered(QLowEnergyService::Service void BluetoothDevice::motionDetailsDiscovered(QLowEnergyService::ServiceState newstate) { + // reset the time once more before we start to receive measurements. + lastMilliseconds = QDateTime::currentMSecsSinceEpoch(); + if (newstate == QLowEnergyService::ServiceDiscovered) { - connect(motionService, &QLowEnergyService::characteristicWritten, this, &BluetoothDevice::startTimers); + connect(motionService, &QLowEnergyService::characteristicWritten, [=]() { + qCDebug(boot2QtDemos) << "Wrote Characteristic - gyro"; + }); connect(motionService, static_cast<void(QLowEnergyService::*)(QLowEnergyService::ServiceError)>(&QLowEnergyService::error), [=](QLowEnergyService::ServiceError newError) { @@ -454,65 +448,19 @@ void BluetoothDevice::motionDetailsDiscovered(QLowEnergyService::ServiceState ne qCDebug(boot2QtDemos)<<"characteristic:"<<id.toString(); if (id.toString().contains("f000aa81-0451-4000-b000-000000000000")) { - motionService->writeDescriptor(characteristic.descriptors().at(0), QByteArray::fromHex(DISABLE_NOTIF_STR)); + motionService->writeDescriptor(characteristic.descriptors().at(0), QByteArray::fromHex(ENABLE_NOTIF_STR)); } if (id.toString().contains("f000aa82-0451-4000-b000-000000000000")) { motionService->writeCharacteristic(characteristic, QByteArray::fromHex(MOVEMENT_ENABLE_SENSORS_BITMASK_VALUE), QLowEnergyService::WriteWithResponse); } if (id.toString().contains("f000aa83-0451-4000-b000-000000000000")) { - motionService->writeCharacteristic(characteristic, QByteArray::fromHex("0a"), QLowEnergyService::WriteWithResponse); + motionService->writeCharacteristic(characteristic, QByteArray::fromHex(RAPID_TIMER_TIMEOUT_STR), QLowEnergyService::WriteWithResponse); } } m_motionMeasurementStarted = true; } } -void BluetoothDevice::startTimers() { - qCDebug(boot2QtDemos) << "Wrote Characteristic - gyro, starting timers."; - if (!slowTimer) { - slowTimer = new QTimer(this); - connect(slowTimer, SIGNAL(timeout()), this, SLOT(slowTimerExpired())); - slowTimer->start(SLOW_TIMER_MS); - } - if (!mediumTimer) { - mediumTimer = new QTimer(this); - connect(mediumTimer, SIGNAL(timeout()), this, SLOT(mediumTimerExpired())); - mediumTimer->start(MEDIUM_TIMER_MS); - } - if (!rapidTimer) { - rapidTimer = new QTimer(this); - connect(rapidTimer, SIGNAL(timeout()), this, SLOT(rapidTimerExpired())); - rapidTimer->start(RAPID_TIMER_MS); - } -} - -void BluetoothDevice::slowTimerExpired() -{ - if (irTemperatureService && m_temperatureMeasurementStarted) { - queueReadRequest(temperatureCharacteristic); - } - if (baroService && m_barometerMeasurementStarted) { - queueReadRequest(barometerCharacteristic); - } - if (humidityService && m_humidityMeasurementStarted){ - queueReadRequest(humidityCharacteristic); - } -} - -void BluetoothDevice::mediumTimerExpired() -{ - if (lightService && m_lightIntensityMeasurementStarted){ - queueReadRequest(lightCharacteristic); - } -} - -void BluetoothDevice::rapidTimerExpired() -{ - if (motionService && m_motionMeasurementStarted) { - queueReadRequest(motionCharacteristic); - } -} - void BluetoothDevice::characteristicsRead(const QLowEnergyCharacteristic &info, const QByteArray &value) { switch (info.handle()) @@ -536,9 +484,6 @@ void BluetoothDevice::characteristicsRead(const QLowEnergyCharacteristic &info, qWarning() << "Invalid handle" << info.handle() << "in characteristicsRead!"; break; } - delete readRequestQueue.takeFirst(); - // Response got, now we can send new request. - sendFirstFromQueue(); } void BluetoothDevice::setState(BluetoothDevice::DeviceState state) @@ -549,76 +494,22 @@ void BluetoothDevice::setState(BluetoothDevice::DeviceState state) } } -bool BluetoothDevice::isNotInQueue(CharacteristicType characteristic) -{ - bool characteristicFound = false; - QVector<QueueData*>::const_iterator i; - for (i = readRequestQueue.constBegin(); i != readRequestQueue.constEnd(); ++i) { - if (characteristic == (*i)->typeToSend) { - characteristicFound = true; - break; - } - } - return !characteristicFound; -} - -void BluetoothDevice::queueReadRequest(CharacteristicType characteristicToRead) -{ - if (isNotInQueue(characteristicToRead)) { - readRequestQueue.append(new QueueData(characteristicToRead)); - // Try to send. If there is a request ongoing, this does nothing. - sendFirstFromQueue(); - } else { - qWarning() << "tried to add request of type " << characteristicToRead << " to queue before previous response was received!"; - } -} - -void BluetoothDevice::sendFirstFromQueue() +double BluetoothDevice::convertIrTemperatureAPIReadingToCelsius(quint16 rawReading) { - while (readRequestQueue.length() && - (false == readRequestQueue.first()->alreadySent)) { - readRequestQueue.first()->alreadySent = true; - switch (readRequestQueue.first()->typeToSend) - { - case temperatureCharacteristic: - if (irTemperatureService) - irTemperatureService->readCharacteristic(irTemperatureService->characteristic(QUuid(QString("f000aa01-0451-4000-b000-000000000000")))); - break; - case humidityCharacteristic: - if (humidityService) - humidityService->readCharacteristic(humidityService->characteristic(QUuid(QString("f000aa21-0451-4000-b000-000000000000")))); - break; - case barometerCharacteristic: - if (baroService) - baroService->readCharacteristic(baroService->characteristic(QUuid(QString("f000aa41-0451-4000-b000-000000000000")))); - break; - case motionCharacteristic: - if (motionService) - motionService->readCharacteristic(motionService->characteristic(QUuid(QString("f000aa81-0451-4000-b000-000000000000")))); - break; - case lightCharacteristic: - if (lightService) - lightService->readCharacteristic(lightService->characteristic(QUuid(QString("f000aa71-0451-4000-b000-000000000000")))); - break; - default: - delete readRequestQueue.takeFirst(); - break; - } - } + // Compute and filter final value according to TI Bluetooth LE API + const float SCALE_LSB = 0.03125; + int it = (int)((rawReading) >> 2); + float t = (float)it; + return t * SCALE_LSB; } void BluetoothDevice::irTemperatureReceived(const QByteArray &value) { - //Merge bytes - unsigned int temperature_raw = (((quint8)value.at(3)) << 8) + ((quint8)value.at(2)); - double temperature = static_cast<double>(temperature_raw); - - //Compute and filter final value - if (temperature < 32768) - temperature = temperature/128.0; //Positive temperature values - else if (temperature > 32768) - temperature = (temperature - 65536) / 128.0; //Negative temperature values - emit temperatureChanged(temperature); + const unsigned int rawObjectTemperature = (((quint8)value.at(3)) << 8) + ((quint8)value.at(2)); + const double objectTemperature = convertIrTemperatureAPIReadingToCelsius(rawObjectTemperature); + const unsigned int rawAmbientTemperature = (((quint8)value.at(1)) << 8) + ((quint8)value.at(0)); + const double ambientTemperature = convertIrTemperatureAPIReadingToCelsius(rawAmbientTemperature); + emit temperatureChanged(ambientTemperature, objectTemperature); } void BluetoothDevice::barometerReceived(const QByteArray &value) @@ -635,10 +526,10 @@ void BluetoothDevice::barometerReceived(const QByteArray &value) } double temperature = static_cast<double>(temperature_raw); - temperature /= 100; + temperature /= BAROMETER_API_READING_DIVIDER; double barometer = static_cast<double>(barometer_raw); - barometer /= 100; + barometer /= BAROMETER_API_READING_DIVIDER; emit barometerChanged(temperature, barometer); } @@ -647,7 +538,7 @@ void BluetoothDevice::humidityReceived(const QByteArray &value) //Merge bytes unsigned int humidity_raw = (((quint8)value.at(3)) << 8) + ((quint8)value.at(2)); double humidity = static_cast<double>(humidity_raw); - humidity = (humidity / 65536)*100; + humidity = humidity * HUMIDITY_API_READING_MULTIPLIER; emit humidityChanged(humidity); } @@ -660,6 +551,7 @@ void BluetoothDevice::lightIntensityReceived(const QByteArray &value) m = lightIntensity_raw & 0x0FFF; e = (lightIntensity_raw & 0xF000) >> 12; + // Compute and final value according to TI Bluetooth LE API double lightIntensity = ((double)m) * (0.01 * (double)qPow(2.0,(qreal)e)); emit lightIntensityChanged(lightIntensity); } @@ -667,7 +559,9 @@ void BluetoothDevice::lightIntensityReceived(const QByteArray &value) void BluetoothDevice::motionReceived(const QByteArray &value) { static MotionSensorData data; - data.msSincePreviousData = attitudeChangeInterval.restart(); + data.msSincePreviousData = lastMilliseconds; + lastMilliseconds = QDateTime::currentMSecsSinceEpoch(); + data.msSincePreviousData = lastMilliseconds - data.msSincePreviousData; movement_data_t values; quint8* writePtr = (quint8*)(&values); @@ -679,13 +573,13 @@ void BluetoothDevice::motionReceived(const QByteArray &value) // Data is in little endian. Fix here if needed. //Convert gyroscope and accelometer readings to proper units - data.gyroScope_x = (double(values.gyrox) * 500) / 65536; - data.gyroScope_y = (double(values.gyroy) * 500) / 65536; - data.gyroScope_z = (double(values.gyroz) * 500) / 65536; + data.gyroScope_x = double(values.gyrox) * GYROSCOPE_API_READING_MULTIPLIER; + data.gyroScope_y = double(values.gyroy) * GYROSCOPE_API_READING_MULTIPLIER; + data.gyroScope_z = double(values.gyroz) * GYROSCOPE_API_READING_MULTIPLIER; // Accelometer at 8G - data.accelometer_x = (double(values.accelx)*8) / 32.768; - data.accelometer_y = (double(values.accely)*8) / 32.768; - data.accelometer_z = (double(values.accelz)*8) / 32.768; + data.accelometer_x = double(values.accelx) * ACCELOMETER_API_READING_MULTIPLIER; + data.accelometer_y = double(values.accely) * ACCELOMETER_API_READING_MULTIPLIER; + data.accelometer_z = double(values.accelz) * ACCELOMETER_API_READING_MULTIPLIER; data.magnetometer_x = double(values.magnetomx); data.magnetometer_y = double(values.magnetomy); data.magnetometer_z = double(values.magnetomz); diff --git a/tradeshow/iot-sensortag/bluetoothdevice.h b/tradeshow/iot-sensortag/bluetoothdevice.h index 58f17c3..26ad814 100644 --- a/tradeshow/iot-sensortag/bluetoothdevice.h +++ b/tradeshow/iot-sensortag/bluetoothdevice.h @@ -95,19 +95,6 @@ typedef enum CharacteristicType { lightCharacteristic } CharacteristicType; -class QueueData { -public: - CharacteristicType typeToSend; - bool alreadySent; - QueueData(CharacteristicType characteristic) { - typeToSend = characteristic; - alreadySent = false; - } - -private: - QueueData() {} -}; - class SensorTagDataProvider; class BluetoothDevice: public QObject @@ -142,7 +129,7 @@ signals: void updateChanged(); void stateChanged(); void randomAddressChanged(); - void temperatureChanged(double temperature); + void temperatureChanged(double ambientTemperature, double objectTemperature); void barometerChanged(double temperature, double barometer); void humidityChanged(double humidity); void lightIntensityChanged(double intensity); @@ -151,7 +138,6 @@ signals: public slots: void scanServices(); - void startTimers(); void connectToService(const QString &uuid); void disconnectFromDevice(); void temperatureDetailsDiscovered(QLowEnergyService::ServiceState newstate); @@ -171,9 +157,6 @@ private slots: // QLowEnergyService related void serviceDetailsDiscovered(QLowEnergyService::ServiceState newState); - void slowTimerExpired(); - void mediumTimerExpired(); - void rapidTimerExpired(); void characteristicsRead(const QLowEnergyCharacteristic &info, const QByteArray &value); @@ -181,14 +164,12 @@ private: void setState(DeviceState state); private: - bool isNotInQueue(const CharacteristicType characteristic); - void queueReadRequest(CharacteristicType characteristicToRead); - void sendFirstFromQueue(); void irTemperatureReceived(const QByteArray &value); void barometerReceived(const QByteArray &value); void humidityReceived(const QByteArray &value); void lightIntensityReceived(const QByteArray &value); void motionReceived(const QByteArray &value); + double convertIrTemperatureAPIReadingToCelsius(quint16 rawReading); QBluetoothDeviceDiscoveryAgent *discoveryAgent; QList<QObject*> m_services; @@ -207,11 +188,8 @@ private: bool m_lightIntensityMeasurementStarted; bool m_motionMeasurementStarted; bool randomAddress; - QTimer* slowTimer; - QTimer* mediumTimer; - QTimer* rapidTimer; QElapsedTimer attitudeChangeInterval; - QVector<QueueData*> readRequestQueue; + quint64 lastMilliseconds; QBluetoothDeviceInfo m_deviceInfo; diff --git a/tradeshow/iot-sensortag/clouddataprovider.cpp b/tradeshow/iot-sensortag/clouddataprovider.cpp index ef1efa3..f98432d 100644 --- a/tradeshow/iot-sensortag/clouddataprovider.cpp +++ b/tradeshow/iot-sensortag/clouddataprovider.cpp @@ -54,7 +54,7 @@ #include <QTimer> #define MAJOR_VERSION_NUMBER 1 -#define MINOR_VERSION_NUMBER 0 +#define MINOR_VERSION_NUMBER 1 #ifndef QT_NO_SSL static QString dataFetchUrl = "https://ottoryynanenqt.blob.core.windows.net/btsensortagreadings/sensorTagReadings.txt"; #else @@ -118,7 +118,14 @@ void CloudDataProvider::parseReceivedText() humidity = doubleValue; emit relativeHumidityChanged(); } else if ("Temp(IR):" == headerText) { - irTemperature = doubleValue; + // Old object temperature from version 1.0 + irObjectTemperature = doubleValue; + emit infraredCelsiusTemperatureChanged(); + } else if ("Temp(Ambient):" == headerText) { + irAmbientTemperature = doubleValue; + emit infraredCelsiusTemperatureChanged(); + } else if ("Temp(Object):" == headerText) { + irObjectTemperature = doubleValue; emit infraredCelsiusTemperatureChanged(); } else if ("Light:" == headerText) { lightIntensityLux = doubleValue; diff --git a/tradeshow/iot-sensortag/cloudupdate.cpp b/tradeshow/iot-sensortag/cloudupdate.cpp index 54b0558..6ef373c 100644 --- a/tradeshow/iot-sensortag/cloudupdate.cpp +++ b/tradeshow/iot-sensortag/cloudupdate.cpp @@ -164,7 +164,9 @@ QString CloudUpdate::buildString() const exportString += QString("Type:\n%1\n").arg(m_provider->sensorType()); exportString += QString("Version:\n%1\n").arg(m_provider->versionString()); exportString += QString("Humid:\n%1\n").arg(m_provider->getRelativeHumidity(), 0, 'f', ROUNDING_DECIMALS); - exportString += QString("Temp(IR):\n%1\n").arg(m_provider->getInfraredCelsiusTemperature(), 0, 'f', ROUNDING_DECIMALS); + exportString += QString("Temp(IR):\n%1\n").arg(m_provider->getInfraredObjectTemperature(), 0, 'f', ROUNDING_DECIMALS); + exportString += QString("Temp(Ambient):\n%1\n").arg(m_provider->getInfraredAmbientTemperature(), 0, 'f', ROUNDING_DECIMALS); + exportString += QString("Temp(Object):\n%1\n").arg(m_provider->getInfraredObjectTemperature(), 0, 'f', ROUNDING_DECIMALS); exportString += QString("Light:\n%1\n").arg(m_provider->getLightIntensityLux(), 0, 'f', ROUNDING_DECIMALS); exportString += QString("Temp(Baro):\n%1\n").arg(m_provider->getBarometerCelsiusTemperature(), 0, 'f', ROUNDING_DECIMALS); exportString += QString("hPa:\n%1\n").arg(m_provider->getBarometer_hPa(), 0, 'f', ROUNDING_DECIMALS); diff --git a/tradeshow/iot-sensortag/mockdataprovider.cpp b/tradeshow/iot-sensortag/mockdataprovider.cpp index 8a34790..3bd841a 100644 --- a/tradeshow/iot-sensortag/mockdataprovider.cpp +++ b/tradeshow/iot-sensortag/mockdataprovider.cpp @@ -55,10 +55,14 @@ MockDataProvider::MockDataProvider(QString id, QObject* parent) xAxisG(-10), zAxisG(0), luxIncrease(100), + rotationDegPerSecXIncrease(5), + rotationDegPerSecYIncrease(7), + rotationDegPerSecZIncrease(-9), m_smaSamples(0) { humidity = 40; - irTemperature = 25; + irAmbientTemperature = 25; + irObjectTemperature = 25; barometerCelsiusTemperature = 25; barometerHPa = 1040; magnetometerMicroT_xAxis = 333; @@ -93,7 +97,7 @@ QString MockDataProvider::sensorType() const QString MockDataProvider::versionString() const { - return QLatin1String("1.0"); + return QLatin1String("1.1"); } void MockDataProvider::setTagType(int tagType) @@ -113,13 +117,14 @@ void MockDataProvider::oneSecondTimerExpired() // IR temperature goes randomly up OR down by half of a degree. So does barometer temperature. if (qrand() % 2) - irTemperature -= 0.5; + irAmbientTemperature -= 0.5; else - irTemperature += 0.5; - if (irTemperature > 38) - irTemperature = 38; - if (irTemperature < 15) - irTemperature = 15; + irAmbientTemperature += 0.5; + if (irAmbientTemperature > 38) + irAmbientTemperature = 38; + if (irAmbientTemperature < 15) + irAmbientTemperature = 15; + irObjectTemperature = irAmbientTemperature + 2; emit infraredCelsiusTemperatureChanged(); if (qrand() % 2) barometerCelsiusTemperature -= 0.5; @@ -209,14 +214,17 @@ void MockDataProvider::twentyMsTimerExpired() // value change handling in clients emit rotationValuesChanged(); - gyroscopeX_degPerSec += 1; - if (gyroscopeX_degPerSec > 360) - gyroscopeX_degPerSec -= 360; - gyroscopeY_degPerSec += 4; - if (gyroscopeY_degPerSec > 360) - gyroscopeY_degPerSec -= 360; - gyroscopeZ_degPerSec += 9; - if (gyroscopeZ_degPerSec > 360) - gyroscopeZ_degPerSec -= 360; + gyroscopeX_degPerSec += rotationDegPerSecXIncrease; + if ((gyroscopeX_degPerSec > 240) || + (gyroscopeX_degPerSec < -240)) + rotationDegPerSecXIncrease *= -1; + gyroscopeY_degPerSec += rotationDegPerSecYIncrease; + if ((gyroscopeY_degPerSec > 240) || + (gyroscopeY_degPerSec < -240)) + rotationDegPerSecYIncrease *= -1; + gyroscopeZ_degPerSec += rotationDegPerSecZIncrease; + if ((gyroscopeZ_degPerSec > 240) || + (gyroscopeZ_degPerSec < -240)) + rotationDegPerSecZIncrease *= -1; emit gyroscopeDegPerSecChanged(); } diff --git a/tradeshow/iot-sensortag/mockdataprovider.h b/tradeshow/iot-sensortag/mockdataprovider.h index 8383cfd..1381a7d 100644 --- a/tradeshow/iot-sensortag/mockdataprovider.h +++ b/tradeshow/iot-sensortag/mockdataprovider.h @@ -78,6 +78,9 @@ private: int xAxisG; int zAxisG; int luxIncrease; + int rotationDegPerSecXIncrease; + int rotationDegPerSecYIncrease; + int rotationDegPerSecZIncrease; int m_smaSamples; }; diff --git a/tradeshow/iot-sensortag/resources/base/ObjectTemperatureChart.qml b/tradeshow/iot-sensortag/resources/base/ObjectTemperatureChart.qml index e0e612e..11da845 100644 --- a/tradeshow/iot-sensortag/resources/base/ObjectTemperatureChart.qml +++ b/tradeshow/iot-sensortag/resources/base/ObjectTemperatureChart.qml @@ -58,7 +58,7 @@ BaseChart { property real value function updateTemps(){ - value = sensor.infraredCelsiusTemperature.toFixed(1); + value = sensor.infraredObjectTemperature.toFixed(1); if (minValue > value) minValue = value; if (maxValue < value) diff --git a/tradeshow/iot-sensortag/resources/base/TemperatureChart.qml b/tradeshow/iot-sensortag/resources/base/TemperatureChart.qml index d4878a4..5a98029 100644 --- a/tradeshow/iot-sensortag/resources/base/TemperatureChart.qml +++ b/tradeshow/iot-sensortag/resources/base/TemperatureChart.qml @@ -68,16 +68,16 @@ BaseChart { readonly property color chartColor: "#15bdff" onSensorChanged: if (sensor) { - sensor.barometerCelsiusTemperatureChanged.connect(contentItem.updateTemperatureGraph) + sensor.infraredCelsiusTemperatureChanged.connect(contentItem.updateTemperatureGraph) } - title: qsTr("Temperature") + title: qsTr("Ambient Temperature") content: Item { anchors.fill: parent function updateTemperatureGraph() { - avgTempSeries.append(temperatureSeriesIndex, sensor.barometerCelsiusTemperature); + avgTempSeries.append(temperatureSeriesIndex, sensor.infraredAmbientTemperature); if (temperatureSeriesIndex >= maxNumOfTempReadings) { avgTempSeries.remove(avgTempSeries.at(temperatureSeriesIndex-maxNumOfTempReadings)); @@ -86,7 +86,7 @@ BaseChart { } temperatureSeriesIndex++; - var value = sensor.barometerCelsiusTemperature; + var value = sensor.infraredAmbientTemperature; if (minValue > value) minValue = value; if (maxValue < value) @@ -122,7 +122,7 @@ BaseChart { Text { anchors.centerIn: parent - text: sensor ? sensor.barometerCelsiusTemperature : "" + text: sensor ? sensor.infraredAmbientTemperature : "" color: "white" } } diff --git a/tradeshow/iot-sensortag/sensortagdataprovider.cpp b/tradeshow/iot-sensortag/sensortagdataprovider.cpp index e278f94..157673d 100644 --- a/tradeshow/iot-sensortag/sensortagdataprovider.cpp +++ b/tradeshow/iot-sensortag/sensortagdataprovider.cpp @@ -63,7 +63,8 @@ SensorTagDataProvider::SensorTagDataProvider(QObject *parent) SensorTagDataProvider::SensorTagDataProvider(QString id, QObject* parent) : QObject(parent), humidity(0), - irTemperature(0), + irAmbientTemperature(0), + irObjectTemperature(0), lightIntensityLux(0), barometerCelsiusTemperature(0), barometerHPa(0), @@ -96,14 +97,14 @@ double SensorTagDataProvider::getRelativeHumidity() return humidity; } -QString SensorTagDataProvider::getInfraredCelsiusTemperatureString() +double SensorTagDataProvider::getInfraredAmbientTemperature() { - return QString::number(irTemperature) + QString("\u00B0C"); + return irAmbientTemperature; } -double SensorTagDataProvider::getInfraredCelsiusTemperature() +double SensorTagDataProvider::getInfraredObjectTemperature() { - return irTemperature; + return irObjectTemperature; } QString SensorTagDataProvider::getLightIntensityLuxString() @@ -185,33 +186,6 @@ float SensorTagDataProvider::getMagnetometerMicroT_zAxis() return magnetometerMicroT_zAxis; } -QColor SensorTagDataProvider::getTemperatureColor() -{ - // Get average and limit it between 15 and 38 degrees celsius. - double averageTemperature = (irTemperature + barometerCelsiusTemperature) / 2; - averageTemperature = std::min(averageTemperature, double(38)); - averageTemperature = std::max(averageTemperature, double(15)); - double relativeTemperature = ((averageTemperature-15)*255)/23; - int red; - int green = 128; - int blue; - if (relativeTemperature < 128) { - blue = 255; - red = relativeTemperature*2; - } else { - red = 255; - blue = 255 - ((relativeTemperature-128)*2); - } - return QColor(red, green, blue); -} - -QColor SensorTagDataProvider::getLightIntensityColor() -{ - double relativeLightIntensityLux = std::min(lightIntensityLux, double(1000)); - relativeLightIntensityLux = 10+((relativeLightIntensityLux*40) / 1000); - return QColor(relativeLightIntensityLux, relativeLightIntensityLux, relativeLightIntensityLux); -} - float SensorTagDataProvider::getRotationX() { return rotation_x; diff --git a/tradeshow/iot-sensortag/sensortagdataprovider.h b/tradeshow/iot-sensortag/sensortagdataprovider.h index 510fc6f..7ee4a0d 100644 --- a/tradeshow/iot-sensortag/sensortagdataprovider.h +++ b/tradeshow/iot-sensortag/sensortagdataprovider.h @@ -64,8 +64,8 @@ class SensorTagDataProvider : public QObject Q_PROPERTY(QString providerId MEMBER m_id CONSTANT) Q_PROPERTY(QString relativeHumidityString READ getRelativeHumidityString NOTIFY relativeHumidityChanged) Q_PROPERTY(double relativeHumidity READ getRelativeHumidity NOTIFY relativeHumidityChanged) - Q_PROPERTY(QString infraredCelsiusTemperatureString READ getInfraredCelsiusTemperatureString NOTIFY infraredCelsiusTemperatureChanged) - Q_PROPERTY(double infraredCelsiusTemperature READ getInfraredCelsiusTemperature NOTIFY infraredCelsiusTemperatureChanged) + Q_PROPERTY(double infraredAmbientTemperature READ getInfraredAmbientTemperature NOTIFY infraredCelsiusTemperatureChanged) + Q_PROPERTY(double infraredObjectTemperature READ getInfraredObjectTemperature NOTIFY infraredCelsiusTemperatureChanged) Q_PROPERTY(QString lightIntensityLuxString READ getLightIntensityLuxString NOTIFY lightIntensityChanged) Q_PROPERTY(double lightIntensityLux READ getLightIntensityLux NOTIFY lightIntensityChanged) Q_PROPERTY(double barometerCelsiusTemperature READ getBarometerCelsiusTemperature NOTIFY barometerCelsiusTemperatureChanged) @@ -82,8 +82,6 @@ class SensorTagDataProvider : public QObject Q_PROPERTY(float magnetometerMicroT_xAxis READ getMagnetometerMicroT_xAxis NOTIFY magnetometerMicroTChanged) Q_PROPERTY(float magnetometerMicroT_yAxis READ getMagnetometerMicroT_yAxis NOTIFY magnetometerMicroTChanged) Q_PROPERTY(float magnetometerMicroT_zAxis READ getMagnetometerMicroT_zAxis NOTIFY magnetometerMicroTChanged) - Q_PROPERTY(QColor temperatureColor READ getTemperatureColor NOTIFY infraredCelsiusTemperatureChanged) - Q_PROPERTY(QColor lightIntensityColor READ getLightIntensityColor NOTIFY lightIntensityChanged) Q_PROPERTY(float rotationX READ getRotationX NOTIFY rotationXChanged) Q_PROPERTY(float rotationY READ getRotationY NOTIFY rotationYChanged) Q_PROPERTY(float rotationZ READ getRotationZ NOTIFY rotationZChanged) @@ -105,8 +103,8 @@ public: virtual void endDataFetching() {} QString getRelativeHumidityString(); double getRelativeHumidity(); - QString getInfraredCelsiusTemperatureString(); - double getInfraredCelsiusTemperature(); + double getInfraredAmbientTemperature(); + double getInfraredObjectTemperature(); QString getLightIntensityLuxString(); double getLightIntensityLux(); double getBarometerCelsiusTemperature(); @@ -123,8 +121,6 @@ public: float getMagnetometerMicroT_xAxis(); float getMagnetometerMicroT_yAxis(); float getMagnetometerMicroT_zAxis(); - QColor getTemperatureColor(); - QColor getLightIntensityColor(); float getRotationX(); float getRotationY(); float getRotationZ(); @@ -157,7 +153,8 @@ signals: protected: double humidity; - double irTemperature; + double irAmbientTemperature; + double irObjectTemperature; double lightIntensityLux; double barometerCelsiusTemperature; double barometerTemperatureAverage; |