Skip to content
Commits on Source (3)
......@@ -23,6 +23,12 @@
</screenshot>
</screenshots>
<releases>
<release version="1.1.4" date="2021-12-1" type="stable">
<description>
<p>Fixed chart axis and history based on code from Michael Hufer.</p>
<p>Fixed colors of charts based on widget theme.</p>
</description>
</release>
<release version="1.1.3" date="2020-07-14" type="stable">
<description>
<p>Fixed icon display on some platforms.</p>
......
[Desktop Entry]
Name=QiFlora
Comment=Monitor plants with Mi Flora sensors.
Version=1.1.2
Version=1.1.4
Exec=qiflora
MimeType=application/x-qiflora;
Icon=org.eyecreate.qiflora
......
......@@ -2,11 +2,11 @@
"id": "org.eyecreate.qiflora",
"runtime": "org.kde.Platform",
"command": "qiflora",
"runtime-version": "5.14",
"sdk": "org.kde.Sdk",
"finish-args": [
"--share=ipc",
"--allow=bluetooth",
"runtime-version": "5.13",
"sdk": "org.kde.Sdk",
"--system-talk-name=org.bluez",
"--share=network",
"--socket=x11",
......@@ -66,7 +66,7 @@
"type": "git",
"url": "https://github.com/qt/qtconnectivity",
"branch": "5.13.2",
"commit": "f6be1f73a810514335ab3d27e1d05825a36b06af"
"commit": "13b15ab1b1ee2ad56d0d37b07d694fbfc22e97a3"
}
],
"build-commands": [
......@@ -85,7 +85,7 @@
"builddir": true,
"config-opts": [
"-DCMAKE_BUILD_TYPE=Release"
]
],
"sources": [
{
"type": "git",
......
......@@ -145,7 +145,7 @@ Kirigami.ApplicationWindow {
Charts.ChartView {
id: chart
antialiasing: true
backgroundColor: Kirigami.Theme.buttonBackgroundColor
backgroundColor: Kirigami.Theme.backgroundColor
titleColor: Kirigami.Theme.textColor
legend.visible: false
anchors.fill: parent
......@@ -169,8 +169,10 @@ Kirigami.ApplicationWindow {
id: valueAx
labelFormat: "%d "+units
labelsColor: Kirigami.Theme.textColor
min: yMin
max: yMax
Component.onCompleted: {
valueAx.min = yMin;
valueAx.max = yMax;
}
}
color: model.lineColor
name: model.title
......@@ -188,6 +190,7 @@ Kirigami.ApplicationWindow {
//Readjust graphs to show date range from earliest item.
dateAx.max = new Date();
dateAx.min = qiflora.model.data(qiflora.model.index(0,0));
valueAx.max = qiflora.model.maxValue(modelCol)*1.25;
}
}
}
......
......@@ -17,7 +17,7 @@ Q_DECL_EXPORT int main(int argc, char *argv[])
QQuickStyle::setStyle("Material");
#endif
KAboutData aboutData("org.eyecreate.qiflora", "QiFlora", "1.1.3", "Mobile friendly application to monitor Mi Flora devices.",KAboutLicense::GPL_V3);//TODO:i18n
KAboutData aboutData("org.eyecreate.qiflora", "QiFlora", "1.1.4", "Mobile friendly application to monitor Mi Flora devices.",KAboutLicense::GPL_V3);//TODO:i18n
aboutData.setProductName("qiflora");
aboutData.addAuthor("Kevin Whitaker",QString(),"eyecreate@eyecreate.org","https://www.eyecreate.org");
aboutData.setDesktopFileName("org.eyecreate.qiflora");
......@@ -30,7 +30,7 @@ Q_DECL_EXPORT int main(int argc, char *argv[])
QQmlApplicationEngine engine;
qmlRegisterType<BluetoothDevices>();
qmlRegisterAnonymousType<BluetoothDevices>("",1);
qmlRegisterType<MiFlora>("org.eyecreate.qiflora",1,1,"QiFlora");
engine.rootContext()->setContextProperty(QStringLiteral("appAboutData"), QVariant::fromValue(aboutData));
engine.load(QUrl(QStringLiteral("qrc:///main.qml")));
......
......@@ -55,6 +55,14 @@ int FloraHistory::rowCount(const QModelIndex& parent) const
void FloraHistory::addData(QDateTime time, float temperature, quint32 brightness, quint8 moisture, quint16 conductivity)
{
beginInsertRows(QModelIndex(),tableData.size(),tableData.size());
if( tableData.size() == 0 ) {
maxData = {time, temperature, brightness, moisture, conductivity};
} else {
if( maxData.temperature < temperature ) maxData.temperature = temperature;
if( maxData.brightness < brightness ) maxData.brightness = brightness;
if( maxData.moisture < moisture ) maxData.moisture = moisture;
if( maxData.conductivity < conductivity ) maxData.conductivity = conductivity;
}
tableData.append(flora_data{time, temperature, brightness, moisture, conductivity});
endInsertRows();
}
......@@ -65,4 +73,21 @@ void FloraHistory::clear()
emit layoutChanged();
}
QVariant FloraHistory::maxValue(int Column )
{
if( Column == 1 ) {
return QVariant( std::round( maxData.temperature*10/10 ));
} else if( Column == 2 ) {
return QVariant( maxData.brightness );
} else if( Column == 3 ) {
return QVariant( maxData.moisture );
} else if( Column == 4 ) {
return QVariant( maxData.conductivity );
} else if( Column == 5 ) {
return QVariant( std::round( (maxData.temperature*1.8+32)*10/10 ));
} else {
return QVariant();
}
}
......@@ -41,6 +41,8 @@ public:
void addData(QDateTime time, float temperature, quint32 brightness, quint8 moisture, quint16 conductivity);
Q_INVOKABLE QVariant maxValue(int Column);
private:
struct flora_data {
QDateTime time;
......@@ -51,6 +53,7 @@ private:
};
QList<flora_data> tableData;
flora_data maxData;
};
......
......@@ -71,7 +71,7 @@ void MiFlora::foundDevice ( const QBluetoothDeviceInfo& device )
QQmlListProperty<BluetoothDevices> MiFlora::getDeviceList()
{
return QQmlListProperty<BluetoothDevices>(this, devices);
return QQmlListProperty<BluetoothDevices>(this, &devices);
}
void MiFlora::logControllerError ( QLowEnergyController::Error err )
......@@ -175,10 +175,10 @@ void MiFlora::historyServiceCharRead(QLowEnergyCharacteristic readChar, QByteArr
connect(historyService, &QLowEnergyService::characteristicRead, this, &MiFlora::historyServiceCharReadData);
disconnect(historyService, &QLowEnergyService::characteristicWritten, this, &MiFlora::historyServiceCharWritten);
connect(historyService, &QLowEnergyService::characteristicWritten, this, &MiFlora::historyServiceCharWrittenData);
//Take size given and start by giving the last 48 numbers(if that many) to represent the last day of data. TODO: look to have amount of time be configurable.
//Take size given and start by giving the last 24 numbers(if that many) to represent the last day of data. TODO: look to have amount of time be configurable.
lastHistoryEntry = 0;
if(size > 48) {
currentHistoryEntry = 48;
if(size > historySize) {
currentHistoryEntry = historySize;
} else {
currentHistoryEntry = size;
}
......
......@@ -96,7 +96,8 @@ private:
const QByteArray magicBytes = QByteArray::fromHex("a01f");
const QByteArray historyReadInit = QByteArray::fromHex("a00000");
const quint16 historySize = 24;
float temp = 0.0;
quint32 bright = 0;
quint8 moisture = 0;
......