From 1be257bca264a2c6873e41d46a31697b96ce945f Mon Sep 17 00:00:00 2001 From: Mark Watkins Date: Sat, 16 Apr 2016 10:02:10 +1000 Subject: [PATCH 1/3] More PRS1 960T Event Parsing fixes --- .../SleepLib/loader_plugins/prs1_loader.cpp | 90 +++++++++++-------- sleepyhead/UpdaterWindow.cpp | 7 +- 2 files changed, 58 insertions(+), 39 deletions(-) diff --git a/sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp b/sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp index e99d3987..0c1baec1 100644 --- a/sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp +++ b/sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp @@ -811,7 +811,7 @@ bool PRS1Import::ParseF5Events() code = buffer[pos++]; if (code >= ncodes) { - qDebug() << "Illegal PRS1 code " << hex << int(code) << " appeared at " << hex << startpos; + qDebug() << "Illegal PRS1 code " << hex << int(code) << " appeared at " << hex << startpos << "in" << event->sessionid;; qDebug() << "1: (" << int(lastcode) << hex << lastpos << ")"; qDebug() << "2: (" << int(lastcode2) << hex << lastpos2 << ")"; qDebug() << "3: (" << int(lastcode3) << hex << lastpos3 << ")"; @@ -925,11 +925,16 @@ bool PRS1Import::ParseF5Events() break; case 0x09: // ASV Codes - //code=CPAP_FlowLimit; - data0 = buffer[pos++]; - tt -= qint64(data0) * 1000L; // Subtract Time Offset + if (event->familyVersion<2) { + //code=CPAP_FlowLimit; + data0 = buffer[pos++]; + tt -= qint64(data0) * 1000L; // Subtract Time Offset - FL->AddEvent(tt, data0); + FL->AddEvent(tt, data0); + } else { + data0 = buffer[pos++]; + data1 = buffer[pos++]; + } break; @@ -1001,44 +1006,53 @@ bool PRS1Import::ParseF5Events() break; case 0x0d: // All the other ASV graph stuff. - IPAP->AddEvent(t, currentPressure = data0 = buffer[pos++]); // 00=IAP - data4 = buffer[pos++]; - IPAPLo->AddEvent(t, data4); // 01=IAP Low - data5 = buffer[pos++]; - IPAPHi->AddEvent(t, data5); // 02=IAP High - TOTLEAK->AddEvent(t, leak=buffer[pos++]); // 03=LEAK - if (calcLeaks) { // Much Quicker doing this here than the recalc method. - leak -= (((currentPressure/10.0f) - 4.0) * ppm + lpm4); - if (leak < 0) leak = 0; + if (event->familyVersion>=2) { + data0 = (buffer[pos + 1] << 8 | buffer[pos]); + data0 *= 2; + pos += 2; + data1 = buffer[pos++]; + tt = t - qint64(data1) * 1000L; + } else { + IPAP->AddEvent(t, currentPressure = data0 = buffer[pos++]); // 00=IAP + data4 = buffer[pos++]; + IPAPLo->AddEvent(t, data4); // 01=IAP Low + data5 = buffer[pos++]; + IPAPHi->AddEvent(t, data5); // 02=IAP High - LEAK->AddEvent(t, leak); - } + TOTLEAK->AddEvent(t, leak=buffer[pos++]); // 03=LEAK + if (calcLeaks) { // Much Quicker doing this here than the recalc method. + leak -= (((currentPressure/10.0f) - 4.0) * ppm + lpm4); + if (leak < 0) leak = 0; - - RR->AddEvent(t, buffer[pos++]); // 04=Breaths Per Minute - PTB->AddEvent(t, buffer[pos++]); // 05=Patient Triggered Breaths - MV->AddEvent(t, buffer[pos++]); // 06=Minute Ventilation - //tmp=buffer[pos++] * 10.0; - TV->AddEvent(t, buffer[pos++]); // 07=Tidal Volume - SNORE->AddEvent(t, data2 = buffer[pos++]); // 08=Snore - - if (data2 > 0) { - if (!VS) { - if (!(VS = session->AddEventList(CPAP_VSnore, EVL_Event))) { - qDebug() << "!VS eventlist exit"; - return false; - } + LEAK->AddEvent(t, leak); } - VS->AddEvent(t, 0); //data2); // VSnore - } - EPAP->AddEvent(t, data1 = buffer[pos++]); // 09=EPAP - data2 = data0 - data1; - PS->AddEvent(t, data2); // Pressure Support - if (event->familyVersion >= 1) { - data0 = buffer[pos++]; + RR->AddEvent(t, buffer[pos++]); // 04=Breaths Per Minute + PTB->AddEvent(t, buffer[pos++]); // 05=Patient Triggered Breaths + MV->AddEvent(t, buffer[pos++]); // 06=Minute Ventilation + //tmp=buffer[pos++] * 10.0; + TV->AddEvent(t, buffer[pos++]); // 07=Tidal Volume + SNORE->AddEvent(t, data2 = buffer[pos++]); // 08=Snore + + if (data2 > 0) { + if (!VS) { + if (!(VS = session->AddEventList(CPAP_VSnore, EVL_Event))) { + qDebug() << "!VS eventlist exit"; + return false; + } + } + + VS->AddEvent(t, 0); //data2); // VSnore + } + + EPAP->AddEvent(t, data1 = buffer[pos++]); // 09=EPAP + data2 = data0 - data1; + PS->AddEvent(t, data2); // Pressure Support + if (event->familyVersion >= 1) { + data0 = buffer[pos++]; + } } break; @@ -1361,7 +1375,7 @@ bool PRS1Import::ParseF0Events() code = buffer[pos++]; if (code > 0x15) { - qDebug() << "Illegal PRS1 code " << hex << int(code) << " appeared at " << hex << startpos; + qDebug() << "Illegal PRS1 code " << hex << int(code) << " appeared at " << hex << startpos << "in" << event->sessionid; qDebug() << "1: (" << hex << int(lastcode) << hex << lastpos << ")"; qDebug() << "2: (" << hex << int(lastcode2) << hex << lastpos2 << ")"; qDebug() << "3: (" << hex << int(lastcode3) << hex << lastpos3 << ")"; diff --git a/sleepyhead/UpdaterWindow.cpp b/sleepyhead/UpdaterWindow.cpp index e5f37297..9195d889 100644 --- a/sleepyhead/UpdaterWindow.cpp +++ b/sleepyhead/UpdaterWindow.cpp @@ -93,9 +93,14 @@ void UpdaterWindow::checkForUpdates() mainwin->Notify(tr("Checking for SleepyHead Updates")); +#if defined(Q_OS_WIN) // language code? - update_url = QUrl(QString("http://sourceforge.net/projects/sleepyhead/files/AutoUpdate/%1/Updates.xml/download").arg(PlatformString)); + update_url = QUrl(QString("http://sleepyhead.jedimark.net/packages/win32/Updates.xml"); downloadUpdateXML(); +#elif defined(Q_OS_MAC) + update_url = QUrl(QString("http://sleepyhead.jedimark.net/packages/mac/Updates.xml")); + +#endif } void UpdaterWindow::downloadUpdateXML() From b0ca456410225b20254faca8a338ebf0efd49a71 Mon Sep 17 00:00:00 2001 From: Mark Watkins Date: Sat, 16 Apr 2016 23:15:42 +1000 Subject: [PATCH 2/3] Update notifier for Mac/Linux platforms --- sleepyhead/UpdaterWindow.cpp | 72 ++++++++++++++++++++++++++++++------ sleepyhead/UpdaterWindow.h | 1 + sleepyhead/main.cpp | 2 +- sleepyhead/mainwindow.cpp | 1 + sleepyhead/updateparser.h | 1 - 5 files changed, 64 insertions(+), 13 deletions(-) diff --git a/sleepyhead/UpdaterWindow.cpp b/sleepyhead/UpdaterWindow.cpp index 9195d889..106b7648 100644 --- a/sleepyhead/UpdaterWindow.cpp +++ b/sleepyhead/UpdaterWindow.cpp @@ -9,6 +9,7 @@ #include #include #include +#include #include #include #include @@ -71,21 +72,46 @@ UpdaterWindow::~UpdaterWindow() delete ui; } +QString platformStr() +{ + static QString platform; + +#if defined(Q_OS_WIN) + platform="win32"; +#elif defined(Q_OS_MAC) + platform="mac"; +#elif defined(Q_OS_LINUX) + platform="ubuntu"; +#else + platform="unknown"; +#endif + + return platform; +} void UpdaterWindow::checkForUpdates() { - QString filename = QApplication::applicationDirPath() + "/Updates.xml"; + QString platform=platformStr(); +#ifdef Q_OS_WINDOWS + QString filename = QApplication::applicationDirPath() + "/Updates.xml"; +#else + QString filename = QApplication::applicationDirPath() + QString("/LatestVersion-%1").arg(platform); +#endif // Check updates.xml file if it's still recent.. if (QFile::exists(filename)) { QFileInfo fi(filename); QDateTime created = fi.created(); int age = created.secsTo(QDateTime::currentDateTime()); - if (age < 0) { // 7200) { + if (age < 900) { QFile file(filename); file.open(QFile::ReadOnly); - ParseUpdateXML(&file); +#ifdef Q_OS_WINDOWS + ParseUpdatesXML(&file); +#else + ParseLatestVersion(&file); +#endif file.close(); return; } @@ -93,14 +119,12 @@ void UpdaterWindow::checkForUpdates() mainwin->Notify(tr("Checking for SleepyHead Updates")); -#if defined(Q_OS_WIN) - // language code? - update_url = QUrl(QString("http://sleepyhead.jedimark.net/packages/win32/Updates.xml"); - downloadUpdateXML(); -#elif defined(Q_OS_MAC) - update_url = QUrl(QString("http://sleepyhead.jedimark.net/packages/mac/Updates.xml")); - +#ifdef Q_OS_WINDOWS + update_url = QUrl(QString("http://sleepyhead.jedimark.net/packages/%1/Updates.xml").arg(platform)); +#else + update_url = QUrl(QString("http://sleepyhead.jedimark.net/releases/LatestVersion-%1").arg(platform)); #endif + downloadUpdateXML(); } void UpdaterWindow::downloadUpdateXML() @@ -143,15 +167,25 @@ void UpdaterWindow::updateFinished(QNetworkReply *reply) ui->plainTextEdit->appendPlainText(tr("%1 bytes received").arg(reply->size())); + +#ifdef Q_OS_WINDOWS QString filename = QApplication::applicationDirPath() + "/Updates.xml"; +#else + QString filename = QApplication::applicationDirPath() + QString("/LatestVersion-%1").arg(platformStr()); +#endif + qDebug() << filename; QFile file(filename); file.open(QFile::WriteOnly); file.write(reply->readAll()); file.close(); file.open(QFile::ReadOnly); - //QTextStream ts(&file); + +#ifdef Q_OS_WINDOWS ParseUpdatesXML(&file); +#else + ParseLatestVersion(&file); +#endif file.close(); reply->deleteLater(); } @@ -403,6 +437,22 @@ void StartMaintenanceTool() #endif } +void UpdaterWindow::ParseLatestVersion(QIODevice *file) +{ + // Temporary Cheat.. for linux & mac, just check the latest version number + QTextStream text(file); + + QString version=text.readAll().trimmed(); + qDebug() << "Latest version is" << version; + int i=compareVersion(version); + if (i>0) { + mainwin->Notify(tr("Version %1 of SleepyHead is available, opening link to download site.").arg(version), STR_TR_SleepyHead); + QDesktopServices::openUrl(QUrl(QString("http://sleepyhead.jedimark.net"))); + } else { + mainwin->Notify(tr("You are already running the latest version."), STR_TR_SleepyHead); + } +} + //New, Qt Installer framework version void UpdaterWindow::ParseUpdatesXML(QIODevice *dev) { diff --git a/sleepyhead/UpdaterWindow.h b/sleepyhead/UpdaterWindow.h index fd104264..c57601a9 100644 --- a/sleepyhead/UpdaterWindow.h +++ b/sleepyhead/UpdaterWindow.h @@ -52,6 +52,7 @@ class UpdaterWindow : public QMainWindow */ void ParseUpdateXML(QIODevice *dev); void ParseUpdatesXML(QIODevice *dev); + void ParseLatestVersion(QIODevice *dev); protected slots: void updateFinished(QNetworkReply *reply); diff --git a/sleepyhead/main.cpp b/sleepyhead/main.cpp index 86296938..348f8d96 100644 --- a/sleepyhead/main.cpp +++ b/sleepyhead/main.cpp @@ -506,7 +506,7 @@ retry_directory: loadChannels(changing_language); - // if (check_updates) { mainwin->CheckForUpdates(); } + if (check_updates) { mainwin->CheckForUpdates(); } w.show(); diff --git a/sleepyhead/mainwindow.cpp b/sleepyhead/mainwindow.cpp index 297c5c17..1d4c9b9d 100644 --- a/sleepyhead/mainwindow.cpp +++ b/sleepyhead/mainwindow.cpp @@ -2795,5 +2795,6 @@ void MainWindow::on_actionReport_a_Bug_triggered() { QSettings settings(getDeveloperName(), getAppName()); QString language = settings.value(LangSetting).toString(); + QDesktopServices::openUrl(QUrl(QString("http://sleepyhead.jedimark.net/report_bugs.php?lang=%1&version=%2&platform=%3").arg(language).arg(VersionString).arg(PlatformString))); } diff --git a/sleepyhead/updateparser.h b/sleepyhead/updateparser.h index e1a3062c..07664dcd 100644 --- a/sleepyhead/updateparser.h +++ b/sleepyhead/updateparser.h @@ -154,5 +154,4 @@ class UpdatesParser QString currentTag; }; - #endif // UPDATEPARSER_H From 6b1c125218475720e1bf7c920ed3d10140b0b7c2 Mon Sep 17 00:00:00 2001 From: Mark Watkins Date: Sat, 16 Apr 2016 23:22:52 +1000 Subject: [PATCH 3/3] Forgot to set the UpdatesLastChecked timestamp --- sleepyhead/UpdaterWindow.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/sleepyhead/UpdaterWindow.cpp b/sleepyhead/UpdaterWindow.cpp index 106b7648..90217bc7 100644 --- a/sleepyhead/UpdaterWindow.cpp +++ b/sleepyhead/UpdaterWindow.cpp @@ -186,6 +186,8 @@ void UpdaterWindow::updateFinished(QNetworkReply *reply) #else ParseLatestVersion(&file); #endif + PREF[STR_GEN_UpdatesLastChecked] = QDateTime::currentDateTime(); + file.close(); reply->deleteLater(); } @@ -445,6 +447,7 @@ void UpdaterWindow::ParseLatestVersion(QIODevice *file) QString version=text.readAll().trimmed(); qDebug() << "Latest version is" << version; int i=compareVersion(version); + if (i>0) { mainwin->Notify(tr("Version %1 of SleepyHead is available, opening link to download site.").arg(version), STR_TR_SleepyHead); QDesktopServices::openUrl(QUrl(QString("http://sleepyhead.jedimark.net")));