Merge branch 'master' into fix-readme-typos

fixed readme typos
This commit is contained in:
Jeff Norman 2020-06-12 11:13:47 -04:00
commit af1aa46427
47 changed files with 11727 additions and 11146 deletions

56
Htmldocs/about-tr.html Normal file
View File

@ -0,0 +1,56 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html lang="tr">
<head>
<meta content="text/html; charset=UTF-8" http-equiv="content-type" >
<title>about</title>
<meta content="The OSCAR Team" name="author" >
<meta content="Translation copyright 2020 by The OSCAR Translation Team" name="description" >
</head>
<body>
<h1 style="text-align: center;">OSCAR'a hoş geldiniz,
<br>the
<u>O</u>pen
<u>S</u>ource
<u>C</u>PAP
<u>A</u>nalysis
<u>R</u>eporter
<br>(Açık Kaynak Kodlu CPAP Analizi Raporlayıcısı)</h1>
<div style="text-align: center;">Bu yazılım CPAP cihazınız ve ilgili diğer donanımlar tarafından üretilen verileri gözden geçirmeniz için size yardımcı olmak için tasarlanmıştır.
<br>
<br>Gönüllüler tarafından birçok dile tercüme edilmiştir. Kullanılan dili değiştirmek için Yardım sekmesine tıklayınız.
<br>
<br>
<b>Google Chrome</b> veya
<b>Microsoft Edge Chromium</b> gibi Chromium tabanlı herhangi bir gezgin şu anda mevcut en iyi
<u>otomatik tercüme</u> seçeneklerini sunmaktadır.
<br>OSCAR Wiki'sinden kapsamlı bir yardım seçeneği mevcuttur.
<a href="http://www.apneaboard.com/wiki/index.php/OSCAR_Help" >http://www.apneaboard.com/wiki/index.php/OSCAR_Help</a> adresine gidin.
<br>
<br>Sorularınız için
<a href="http://www.apneaboard.com" >http://www.apneaboard.com</a> forumuna veya yerel bir apne forumuna baş vurabilirsiniz.
<br></div>
<hr style="width: 100%; height: 2px;" >
<h1 align="center">
<font color="red">LÜTFEN DİKKATLE OKUYUN</font>
</h1>
<hr style="width: 100%; height: 2px;" >
<div style="text-align: center;">OSCAR doktorunuzun sağlayacağı tıbbi reberliğin yerini alabilecek bir alternatif
<b>DEĞİLDİR</b>
<br>
<br>Cihaz üreticilerinin dosya formatları hakkında yeterli miktarda bilgilendirme yapmamaları sebebiyle, OSCAR tarafından gösterilen verilerin doğruluğu hiçbir şekilde garanti edilemez.
<br>
<br>Oluşturulan tüm raporlar
<b>KİŞİSEL KULLANIM İÇİNDİR</b> ve mümkün olabildiği kadar doğru olmaları amaçlanmıştır.
<br>
<br>OSCAR raporları CPAP makinesi tarafından bildirilen verilere dayanmaktadır. Bu verilerin cihaz kullanımına uyum veya başka amaçlarla kullanılabilirliği, ilgili makamların onay verip vermemesine bağlıdır.
<br>Bu yazılımı kullanmanın doğuracağı risklerin sorumluluğu tamamıyla size aittir. Yazarlar
<u>hiçbir</u> şekilde bu yazılımın kullanım veya kötüye kullanımından doğabilecek sonuçlardan sorumlu değildir.
<br>
<hr style="width: 100%; height: 2px;" >OSCAR ücretsiz bir yazılım olup GNU Public License v3 başlığı altında kullanıma sunulmuştur, herhangi bir garanti sunmamaktadır ve belirli bir amaca uygun olduğuna dair bir iddası yoktur.
<br>
<br>OSCAR © 2019-2020 OSCAR Takımı: Apne Topluluğunun parçası olan, çeşitli forumlardan ve farklı milliyetlerden bir grup gönüllü geliştirici tarafından hazırlanmıştır.
<br>
<br>OSCAR telif hakkı © 2011-2018 Mark Watkins'e ait olan SleepyHead yazılımından türetilmiştir.</div>
</body>
</html>

53
Htmldocs/credits-tr.html Normal file
View File

@ -0,0 +1,53 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html lang="en">
<head>
<meta content="text/html; charset=UTF-8" http-equiv="content-type" >
<title>credits</title>
<meta content="The OSCAR Team" name="author" >
</head>
<body style="font-family: Helvetica,Arial,sans-serif;">
<h1>Projeye Emek Verenler</h1>
<hr style="width: 100%; height: 2px;" >
<p>
<b>OSCAR</b> Mark Watkins tarafından 2011 - 2018 yılları arasında yazılmış bir program olan SleepyHead'den türetilmiştir. Güncel proje CPAPtalk.com ve ApneaBoard.com forum katılımcıları ve diğer gönüllülerin 2019'da başlayan birleşik çabası sonucu yürütülmektedir.</p>
<p>
<b>ık Kaynak Kod Kütüphaneleri</b>
<br>OSCAR, kendisi de birçok küçük açık kaynak kod kütüphanelerinden beslenerek oluşturulan Qt platformlar-arası araç kitinin açık kaynak kodlu sürümünü kullanmakta olup bu sürüme
<a href="http://qt.io" >http://qt.io</a> adresinden ulaşılabilir. OSCAR'ın motorunun çalışmasını sağlayan bu bileşenlerin çoğuna ait lisanslama koşullarına
<a href="https://doc.qt.io/qt-5/licenses-used-in-qt.html" >https://doc.qt.io/qt-5/licenses-used-in-qt.html</a> adresinden ulaşılabilir.</p>
<p>
<b>Veri formatları</b>
<br>CPAP cihazlarının veri formatları genellikle belgelenmemiştir. Bunların OSCAR içerisinde çalışır hale getirilebilmeleri için birçok araştırmaya, çok sayıda SD kart veri örneklerine, çökmelere ve veri problemlerine katlanan sabırlı kullanıcılara ve veri formatlarının kodlarını çözmek için gereken iş yükünü paylaşan diğer geliştiricilerin yardımlarına gerek duyulmuştur. Kendi verimizi açık ve ulaşılabilir tutma hakkımızı korumak için verdiğimiz mücadeleye yardım etmiş olan herkese çok teşekkür ederiz!</p>
<h2>Güncel OSCAR takımı aşağıda yer alan kişilerden meydana gelmektedir:</h2>
<p>
<i>Fred Bonjour</i> : Proje Yöneticisi &amp; Baş Test Sorumlusu
<i>Phil Olynyk</i> : Baş Geliştirici,
<i>Arie Klerk</i> : Çeviri Ekibi Koordinatörü</p>
<p>
<b>Geliştiriciler</b>
<br>
Phil Olynyk (<i>Baş Geliştirici</i>), GuyScharf, sawinglogz</p>
<p>
<b>Raporlayıcılar</b>
<br>AlanE, BrandonA, Crimson Nape, foxfire, Heyns, jeremieb, jaswilliams, palerider, patl</p>
<p>
<b>Test Sorumluları</b>
<br>
Fred Bonjour (<i>Baş Test Sorumlusu</i>), Beej, DeepBreathing, Fastlane, GuyScharf, JJJ, LookingForward, Pollcat, Ruth Catrin, SarcasticDave94</p>
<p>
<b>Danışmanlar</b>
<br>aviB, SkepticDoc, Sleeprider, SleepyProgrammer, srlevine1, LunaFerret, harre, mdhamptom, mitchcampbell, rtannerf</p>
<p>
<b>Çevirmenler</b>
<br>
Arie Klerk (<i>Çeviri Ekibi Koordinatörü, Flemenkçe</i>), 1st.qwerty (<i>Polonyaca</i>), delta (<i>Romence</i>), drmaestro (<i>Türkçe</i>), drol (<i>Fransızca</i>), FaureCourtet (<i>Fransızca</i>), fossegrim (<i>Norveççe</i>), hearsay73 (<i>Filipince</i>), Heyns (<i>Afrikaanca</i>), jaswilliams (<i>İngilizce</i>), johanh (<i>Fince</i>), koimark (<i>Fince</i>), Lazer1234 (<i>İsveççe</i>), Mac_Sheepcounter (<i>Almanca</i>), mazingas (<i>Italyanca</i>), Perchas (<i>İspanyolca</i>), refurbished (<i>Polonyaca</i>), Ristraus (<i>Brezilya Portekizcesi</i>), ShaunBlake (<i>İngilizce</i>), steffenreitz (<i>Almanca</i>), tolnaiz (<i>Macarca</i>), unidee (<i>Fince</i>), untoutseul05 (<i>Fransızca</i>), yrnkrn (<i>İbranice</i>). <br>
<b>Sürekli çabalarınız için minnettarız!</b></p>
<p>
<b>OSCAR her zaman için projeye yardımcı olabilecek kişiler aramaktadır: programcılar, test ediciler, veya çevirmenler. Eğer ilgileniyorsanız lütfen Apnea Board Forum'undan &#39;bonjour&#39;'a PM gönderin.</b>
</p>
<hr style="width: 100%; height: 2px;" >
<p>OSCAR için bir geliştirme forumu açan ve OSCAR için <a href="https://sleepfiles.com/OSCAR" >https://sleepfiles.com/OSCAR</a> adresindeki birincil indirme sitesini sağlayan ApneaBoard'a özellikle teşekkür ederiz.</p>
<p>ApneaBoard'a CPAP kullanıcıları için yıllardır sağladıkları yazılım desteği için minnettarız.</p>
</body>
</html>

View File

@ -19,7 +19,7 @@
<p>
<b>Data formats</b>
<br>The CPAP device data formats are mostly undocumented. Getting them working in OSCAR involved a lot of investigation, together with a lot of SD card data samples, many patient users willing to put up with crashes and data issues, and plenty of help from fellow developers out there who shared in the workload of decoding data formats.Thanks to all of you who have helped in the fight to protect our right to keep our own data open and accessible!</p>
<h2>The current OSCAR team consists of the following:</h2>
<h2>The OSCAR team currently consists of the following persons:</h2>
<p>
<i>Fred Bonjour</i> : Project Manager &amp; Lead Tester,
<i>Phil Olynyk</i> : Lead Developer,
@ -27,22 +27,22 @@
<p>
<b>Developers</b>
<br>
<i>Phil Olynyk</i> (Lead Developer), GuyScharf, sawinglogz</p>
Phil Olynyk (<i>Lead Developer</i>), GuyScharf, sawinglogz</p>
<p>
<b>Reporters</b>
<br>AlanE, BrandonA, Crimson Nape, foxfire, Heyns, jeremieb, jaswilliams, palerider, patl</p>
<p>
<b>Testers</b>
<br>
<i>Fred Bonjour</i> (Lead Tester), Beej, DeepBreathing, Fastlane, GuyScharf, JJJ, LookingForward, Pollcat, Ruth Catrin, SarcasticDave94</p>
Fred Bonjour (<i>Lead Tester</i>), Beej, DeepBreathing, Fastlane, GuyScharf, JJJ, LookingForward, Pollcat, Ruth Catrin, SarcasticDave94</p>
<p>
<b>Advisors</b>
<br>aviB, SkepticDoc, Sleeprider, SleepyProgrammer, srlevine1, LunaFerret, harre, mdhamptom, mitchcampbell, rtannerf</p>
<p>
<b>Translators</b>
<br>
<i>Arie Klerk</i> (Translations Team Coordinator, Dutch), 1st.qwerty (Polish) delta (Romanian), drol (French), FaureCourtet (French), fossegrim (Norwegian), hearsay73 (Filipino), Heyns (African), jaswilliams (British), johanh (Finnish), koimark (Finnish), Lazer1234 (Swedish), Mac_Sheepcounter (German), Perchas (Spanish), refurbished (Polish), Ristraus (Brazilian Portugese), ShaunBlake (British), steffenreitz (German), tolnaiz (Hungarian), unidee (Finnish), untoutseul05 (French), yrnkrn (Hebrew).
<i>Thank you very much for your continuous effort!</i></p>
Arie Klerk (<i>Translations Team Coordinator, Dutch</i>), 1st.qwerty (<i>Polish</i>), delta (<i>Romanian</i>), drmaestro (<i>Turkish</i>), drol (<i>French</i>), FaureCourtet (<i>French</i>), fossegrim (<i>Norwegian</i>), hearsay73 (<i>Filipino</i>), Heyns (<i>African</i>), jaswilliams (<i>British</i>), johanh (<i>Finnish</i>), koimark (<i>Finnish</i>), Lazer1234 (<i>Swedish</i>), Mac_Sheepcounter (<i>German</i>), mazingas (<i>Italian</i>), Perchas (<i>Spanish</i>), refurbished (<i>Polish</i>), Ristraus (<i>Brazilian Portugese</i>), ShaunBlake (<i>British</i>), steffenreitz (<i>German</i>), tolnaiz (<i>Hungarian</i>), unidee (<i>Finnish</i>), untoutseul05 (<i>French</i>), yrnkrn (<i>Hebrew</i>). <br>
<b>Thank you very much for your continuous effort!</b></p>
<p>
<b>OSCAR is always looking for help: programmers, testers, or translators. If you are interested, please PM &#39;bonjour&#39; on the Apnea Board Forum.</b>
</p>

View File

@ -0,0 +1,319 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html lang="tr">
<head>
<meta content="text/html; charset=UTF-8" http-equiv="content-type" >
<title>release_notes</title>
<meta content="The OSCAR Team" name="author" >
<meta content="Translation copyright 2020 by The OSCAR Translation Team" name="description" >
</head>
<body>
<p>
<b>OSCAR v1.1.1 içindeki değişiklikler ve düzeltmeler</b>
<br>OSCAR'ın bazı kısımları telifi © 2019-2020
<i>OSCAR Takımı</i></p>
<ul>
<li>[yeni] Ek Philips Respironics cihazları test edildi ve tümüyle desteklendi:
<ul>
<li>BiPAP S/T (C Series) (1061401)</li>
<li>REMstar Pro (System One 60 Series) (461CA)</li>
<li>DreamStation BiPAP Pro (600X150)</li>
<li>DreamStation Auto BiPAP (700X120, 700X150)</li>
<li><i>Not: Ventilatör alarmları şu an için içe alınmamakatdır.</i></li>
</ul>
<li>[yeni] DreamStation öncesi ventilatörlerin bildirdikleri "tepe akım" kanalı eklendi.</li>
<li>[yeni] Windows'ta meydana gelen grafiklere bağlı çökmelerin otomatik olarak tespit ve düzeltilmesi.</li>
<li>[yeni] Genel Bakış basınç tablosunda AVAPS desteklendi.</li>
<li>[yeni] Philips Respironics cihazları için Genel Bakış basınç tablosunda eksik olan barlar düzeltildi.</li>
<li>[düzeltme] CSV dışa aktarımına eksik olan Philips Respironics basıç kanalları eklendi.</li>
<li>[düzeltme] CSV seans dışa aktarımında Philips Respironics sıfır AHI'si düzeltildi.</li>
<li>[düzeltme] DreamStation öncesi ventilatörlerde mevcut olan Bi-Flex kilit seçenekleri için destek eklendi.</li>
<li>[düzeltme] autoSV Advanced 30 (960T) BiPAP için basınç dalga formu skalası düzeltildi</li>
<li>[düzeltme] DreamStation BiPAP cihazları için (600X-700X) yükseliş zamanı modu (rise time mode) desteği eklendi.</li>
<li>[düzeltme] DreamStation öncesi cihazlarda rampa iptal edildiğinde rampa zamanı ve basınç ayarları kaldırıldı.</li>
<li>[düzeltme] Philips Respironics oksimetri verisinin içer aktarımı iyileştirildi.</li>
<li>[düzeltme] Philips Respironics cihazları için Günlük sayfasında gösterilen VS2 endeksi düzeltildi.</li>
<li>[düzeltme] İçe aktarılan Viatom verisinin bazen kaydedilememesi durumu düzeltildi.</li>
<li>[düzeltme] Tekrarlayan bir veri tabanı yükseltme önermesi düzeltildi.</li>
<li>[düzeltme] Bazen Resmed verisi içe aktarılırken meydana gelebilen bir çökme düzeltildi.</li>
<li>[düzeltme] Resmed giriş prosesine sınır hata kontrolü eklendi.</li>
<li>[düzeltme] Ayar verisi kaybını önlemek için STR.edf dosya yedeklemesi düzeltildi.</li>
</ul>
<p>
<b>Changes and fixes in OSCAR v1.1.0</b>
<br>Portions of OSCAR are © 2019-2020 by
<i>The OSCAR Team</i></p>
<ul>
<li>[new] Additional Philips Respironics devices tested and fully supported:
<ul>
<li>DreamStation Auto CPAP (500X180)</li>
</ul>
<li>[new] Add support for DreamStation humidifier passover and error modes.</li>
<li>[fix] Fix an rc-1 regression in pressure relief display on the Statistics page.</li>
<li>[fix] Fix the minutes-at-pressure graph for Philips Respironics devices.</li>
</ul>
<p>
<b>Changes and fixes in OSCAR v1.1.0-rc-1</b>
<br>Portions of OSCAR are © 2019-2020 by
<i>The OSCAR Team</i></p>
<ul>
<li>[fix] AHI and Usage bars in overview graphs now show the correct height when oximetry usage is significantly longer than CPAP usage.</li>
<li>[fix] Improved import of Philips Respironics settings. In particular:
<ul>
<li>The settings for PC, S, and S/T modes are now displayed correctly.</li>
<li>AVAPS settings are now displayed correctly, including target tidal volume.</li>
<li>Backup breath settings are now imported and displayed.</li>
<li>The settings for CPAP-Check and Auto-Trial modes are now displayed correctly.</li>
</ul>
<li>[fix] Fix the reported duration for extremely long sessions on DreamStation CPAP and BiPAP devices</li>
<li>[new] Additional Philips Respironics devices tested and fully supported:
<ul>
<li>DreamStation Auto CPAP (500X120)</li>
</ul>
<li>[fix] Fix regression in Welcome page pressure display</li>
<li>[fix] Several crashes have been fixed.</li>
</ul>
<p>
<b>Changes and fixes in OSCAR v1.1.0-beta-2</b>
<br>Portions of OSCAR are © 2019-2020 by
<i>The OSCAR Team</i></p>
<ul>
<li>[new] Add preliminary support for Viatom/Wellue pulse oximeters</li>
<li>[new] Add support for Dreem hypnograms</li>
<li>[new] Extensive reorganization of the ResMed loader to facilitate understanding and future improvements</li>
<li>[new] Additional Philips Respironics devices tested and fully supported:
<ul>
<li>DreamStation Auto CPAP (500X130)</li>
</ul>
<li>[new] Add a menu option to create a zip from an SD card</li>
<li>[new] Ask where to save screenshots</li>
<li>[new] Alert users when unexpected Philips Respironics data is encountered during import</li>
<li>[fix] Add support for CPAP mode on DreamStation BiPAP S/T and AVAPS</li>
<li>[fix] Pinch-to-zoom now works as expected</li>
<li>[fix] The Philips Respironics loader now respects the &quot;ignore old sessions&quot; preference</li>
<li>[fix] Improved handling of discontinuous Philips Respironics data</li>
<li>[fix] Improved import of Philips Respironics flex and humidification settings</li>
<li>[fix] Fix incorrect display of tube diameter on some Philips Respironics devices</li>
<li>[fix] Fix missing &quot;Bi-Flex&quot; label for bi-level DreamStations</li>
<li>[fix] Fix crashes in ZEO loader</li>
<li>[fix] Fix several memory leaks</li>
</ul>
<p>
<b>Changes and fixes in OSCAR v1.1.0-beta-1</b>
<br>Portions of OSCAR are © 2019 by
<i>The OSCAR Team</i></p>
<ul>
<li>[new] Extensive overhaul of the Philips Respironics System One importer, resolving all previously reported issues.</li>
<li>[new] The following Philips Respironics devices are now tested and fully supported:
<ul>
<li>REMstar Plus (System One) (251P),</li>
<li>REMstar Pro (System One) (450P, 451P),</li>
<li>REMstar Auto (System One) (550P, 551P),</li>
<li>BiPAP Auto (System One) (750P),</li>
<li>BiPAP AutoSV Advanced System One (950P, 951P),</li>
<li>REMstar Pro (System One 60 Series) (460P, 461P),</li>
<li>REMstar Auto (System One 60 Series) (560P, 561P, 562P, 560PBT),</li>
<li>BiPAP Pro (System One 60 Series) (660P),</li>
<li>BiPAP Auto (System One 60 Series) (760P),</li>
<li>BiPAP autoSV Advanced (System One 60 Series) (960P, 961P),</li>
<li>BiPAP autoSV Advanced 30 (System One 60 Series) (960T),</li>
<li>BiPAP S/T 30 (System One 60 Series) (1061T),</li>
<li>BiPAP AVAPS 30 (System One 60 Series) (1160P),</li>
<li>DreamStation CPAP (200X110),</li>
<li>DreamStation CPAP Pro (400X110, 400X150),</li>
<li>DreamStation Go (400G110),</li>
<li>DreamStation Auto CPAP (500X110, 500X150),</li>
<li>DreamStation Go Auto (500G110, 502G150),</li>
<li>DreamStation BiPAP Pro (600X110),</li>
<li>DreamStation Auto BiPAP (700X110),</li>
<li>DreamStation BiPAP autoSV (900X110, 900X120),</li>
<li>DreamStation BiPAP S/T 30 (1030X110),</li>
<li>DreamStation BiPAP S/T 30 with AAM (1030X150),</li>
<li>DreamStation BiPAP AVAPS 30 (1130X110),</li>
<li>DreamStation BiPAP AVAPS 30 AE (1131X150)</li>
<li> <i>Note: The settings for PC, S, and S/T modes are still displayed incorrectly.</i> </li>
</ul>
<li>[new] Update translation files and add new languages</li>
<li>[new] Allow user to reset graph order on the Daily page to Standard (for CPAP and APAP) or Advanced order (for ASV and AVAPS modes)</li>
<li>[new] Add preference setting to include the serial number on machine settings list</li>
<li>[fix] Place date, time, and Oscar version information in report footers</li>
<li>[fix] Update identification of ResMed S9 devices on the Welcome page</li>
<li>[fix] Correct formatting of event number in the Daily Events tab</li>
<li>[fix] Correct timezone offset for SomnoPose imports</li>
<li>[fix] Show a progress bar when setting the Overview range to a large number of days</li>
<li>[fix] Make session bars on the Daily page clearer by using a better color</li>
<li>[fix] Improve list of devices on the Statistics page</li>
<li>[fix] Report Pressure when IPAP data is missing</li>
<li>[fix] Implement Refresh button on the Profile page</li>
</ul>
<p>
<b>Changes and fixes in OSCAR v1.1.0-testing-4
<br></b> Portions of OSCAR are © 2019 by The OSCAR Team</p>
<ul>
<li>[new] Windows installers support Oscar, Oscar 32-bit, Oscar (test) and Oscar 32-bit (test)</li>
<li>[fix] Release builds use a Settings key of OSCAR, Test builds use OSCAR-test, and Branch builds use OSCAR-branch. Default data directories are similarly named.</li>
<li>[fix] Overview chart problems when both CPAP and Oximetry data were included fixed</li>
<li>[fix] Translations updated for all languages. Spanish (Mexico) and Norwegian languages added</li>
<li>[fix] All languages now available on Mac</li>
<li>[fix] Date bar on the bottom of the Daily graph now in the local time when no line cursor displayed, and formatting improved</li>
<li>[fix] 100% zoom now works on the Overview page</li>
<li>[fix] View/Reset Graphs now enables all graphs and all event flags</li>
<li>[fix] Calendar date now formatted per national settings</li>
<li>[fix] Toggle buttons on the Daily page&#39;s session list and event and chart pulldowns changed to checkboxes</li>
</ul>
<p>
<b>Changes and fixes in OSCAR v1.1.0-testing-3</b>
<br>
<i>NOTE: Translations have NOT yet been updated for these changes</i>
<br>Portions of OSCAR are © 2019 by
<i>The OSCAR Team</i></p>
<ul>
<li>[new] DreamStation BiPAP S/T and AVAPS ventilators (1030X and 1130X) are now supported. The settings aren&#39;t yet displayed correctly, but therapy events and graphs should now display properly.</li>
<li>[new] View/Reset Graphs organizes graphs in their original order</li>
<li>[fix] Format dates for the national region as reported by the operating system</li>
<li>[fix] Improve progress bar for the Statistics cache update</li>
<li>[fix] Correct calculations of seven-day AHI and leak rate on the Welcome page</li>
<li>[fix] Clarify AHI and hours labels on Records tab of the right sidebar</li>
<li>[fix] Correct import error resulting in invalid elapsed times and impossibly high AHI values</li>
</ul>
<p>
<b>Changes and fixes in OSCAR v1.1.0-testing-2</b>
<br>
<i>NOTE: Translations have NOT yet been updated for these changes</i>
<br>Portions of OSCAR are © 2019 by The OSCAR Team</p>
<ul>
<li>[new] Show progress bar when the Statistics page has to refresh the cache with more than 180 days in it</li>
<li>[new] Romanian language is supported</li>
<li>[fix] Show commit id in the title bar for testing and beta builds</li>
<li>[fix] Show BMI label and calculated value only when both weight and height are non-zero</li>
<li>[fix] Improve BMI display in Daily/Notes</li>
<li>[fix] Correct profile dialog to show height is measured in cm, not meters, when units system is metric</li>
<li>[fix] Always show event indices on the Daily page even when some event flags are turned off</li>
</ul>
<p>
<b>Changes and fixes in OSCAR v1.1.0-testing-1</b>
<br>
<i>NOTE: Translations have NOT yet been updated for these changes</i>
<br>Portions of OSCAR are © 2019 by
<i>The OSCAR Team</i></p>
<ul>
<li>[new] Offer migration if a non-default directory is selected on first use</li>
<li>[new] Hold the SHIFT key down when starting OSCAR to use Software Graphics Engine</li>
<li>[new] Support for DreamStation BiPAP autoSV (900X) should now be complete</li>
<li>[new] Improved DreamStation support</li>
<li>[new] Improve oximeter import for CM550D+</li>
<li>[new] Disable Dark Mode on Mac</li>
<li>[new] Show hours/day constituting compliance on the Statistics page</li>
<li>[new] Better order of graphs on the Daily page for newly created profiles</li>
<li>[new] Help/System Information shows info about OSCAR, OS, and data location</li>
<li>[new] Move pie chart option from Preferences dialog to View menu</li>
<li>[new] Hide pie chart when capturing screen</li>
<li>[new] The --datadir option now allows fully qualified name on Windows</li>
<li>[fix] Fix some oximeter import issues</li>
<li>[fix] Use local time rather than UTC in oximeter import</li>
<li>[fix] Improve screen capture on Mac</li>
<li>[fix] Fix crashes in CPAP data rebuild, purging of a machine</li>
<li>[fix] Prevent crash if taking a screenshot before a profile is opened</li>
<li>[fix] Increase mask vent ranges</li>
<li>[fix] Correct session bar if no sessions are present</li>
<li>[fix] Correct months shown on the Statistics page monthly view</li>
<li>[fix] Compute compliance on the Statistics page based on total days, not days used</li>
<li>[fix] Paginate the Statistics report when printing</li>
<li>[fix] Fix &quot;phantom date&quot; (12/31/1969) on some ResMed imports</li>
<li>[fix] Default font substituted when a specified font is not valid</li>
<li>[fix] Change Preferences measurement units choice to Metric or English</li>
<li>[fix] Improve display of cmH2O numbers</li>
<li>[fix] Show graphics engine in title bar correctly</li>
<li>[fix] Adjust the size of the Preferences dialog to fit smaller screens</li>
<li>[fix] Label climate control as manual or auto correctly on ResMed import</li>
<li>[fix] Move less useful information from title bar to Help/System Information</li>
<li>[fix] Change &quot;Prescription Settings&quot; to &quot;Machine Settings&quot; message</li>
<li>[fix] Improve icons, especially smaller ones</li>
<li>[fix] Correct Mac menu issues</li>
<li>[fix] Improve messages in debug pane</li>
<li>[fix] Re-organize build instructions and other cleanup</li>
</ul>
<p>
<b>Changes and fixes in OSCAR v1.0.1-r-1</b>
<br>Portions of OSCAR are © 2019 by
<i>The OSCAR Team</i></p>
<ul>
<li>Disable multitasking to avoid a crash during pre-loading of summaries</li>
</ul>
<p>
<b>Changes and fixes in OSCAR v1.0.0-beta-9</b>
<br>Portions of OSCAR are © 2019 by
<i>The OSCAR Team</i></p>
<ul>
<li>Picked up the latest translation files</li>
<li>Changed logo to big O with text</li>
<li>Clean up odds and ends</li>
</ul>
<p>
<b>Changes and fixes in OSCAR v1.0.0-beta-8</b>
<br>Portions of OSCAR are © 2019 by
<i>The OSCAR Team</i></p>
<ul>
<li>Picked up the latest translation files</li>
<li>Fixed filename creation for about OSCAR docs</li>
<li>Removed display of I:E ratio from the Daily page</li>
<li>Changed some Mac build parameters</li>
</ul>
<p>
<b>Changes and fixes in OSCAR v1.0.0-beta-7</b>
<br>Portions of OSCAR are © 2019 by
<i>The OSCAR Team</i></p>
<ul>
<li>Use the Qt language files for button text</li>
<li>Use &quot;Maximize&quot; (with frame &amp; menu) instead of &quot;FullScreen&quot;</li>
<li>Change Mac target platform to OS-X 10.12 Sierra</li>
</ul>
<p>
<b>Changes and fixes in OSCAR v1.0.0-beta-6</b>
<br>Portions of OSCAR are © 2019 by
<i>The OSCAR Team</i></p>
<ul>
<li>Added a progress bar during file migration</li>
<li>Raise the main window upon opening it</li>
</ul>
<p>
<b>Changes and fixes in OSCAR v1.0.0-beta-5</b>
<br>Portions of OSCAR are © 2019 by
<i>The OSCAR Team</i></p>
<ul>
<li>Moved the Help Index to a user-writable location</li>
<li>Clarified folder selection and Migration messages</li>
</ul>
<p>
<b>Changes and fixes in OSCAR v1.0.0-beta-4</b>
<br>Portions of OSCAR are © 2019 by
<i>The OSCAR Team</i></p>
<ul>
<li>Added code to migrate an old data directory to a new data directory</li>
<li>Removed &quot;-d&quot; startup option and &quot;Change directory&quot; file menu item. Use the &quot;--datadir foldername&quot; startup option to create or change the data directory.</li>
<li>Various fixes to tab and button visibility depending on profile and machine data presence.</li>
</ul>
<p>
<b>Changes and fixes in OSCAR v1.0.0-beta-3</b>
<br>Portions of OSCAR are © 2019 by
<i>The OSCAR Team</i> and members of the apnea community</p>
<ul>
<li>The Donation and Update features have been removed</li>
<li>The Glossary, FAQ, and Wiki features are not yet implemented</li>
<li>The Daily page left panel will resize to a smaller size.</li>
<li>Oximeter import reports file errors in a message box</li>
<li>Fixed date and time problems with Oximeter import</li>
<li>Added support for new CMS50D+ firmware version 4.6</li>
<li>Reformatted the &#39;No Data&#39; display on the Statistics page</li>
<li>Got the Help browser working - just stubs for now</li>
<li>Small fixes to build and debug problems</li>
</ul>
<p>
<b>SleepyHead v1.1.0-unstable-0</b>
</p>
<ul>
<li>Released under the GNU General Public License version 3</li>
<li>Copyright © 2011-2018 Mark Watkins</li>
</ul>
</body>
</html>

View File

@ -16,6 +16,7 @@
<ul>
<li>BiPAP S/T (C Series) (1061401)</li>
<li>REMstar Pro (System One 60 Series) (461CA)</li>
<li>DreamStation CPAP Pro (400X130)</li>
<li>DreamStation BiPAP Pro (600X150)</li>
<li>DreamStation Auto BiPAP (700X120, 700X150)</li>
<li><i>Note: Ventilator alarms are not currently imported.</i></li>
@ -23,6 +24,7 @@
<li>[new] Add the "peak flow" channel reported by pre-DreamStation ventilators.</li>
<li>[new] Automatically detect and resolve graphics-related crashes on Windows.</li>
<li>[new] Support AVAPS in the Overview pressure chart.</li>
<li>[new] Added Italian and Turkish translations.</li>
<li>[fix] Fix missing bars in the Overview pressure chart for Philips Respironics devices.</li>
<li>[fix] Add missing Philips Respironics pressure channels to CSV export.</li>
<li>[fix] Fix zero Philips Respironics AHI in CSV session export.</li>
@ -37,6 +39,9 @@
<li>[fix] Fix an occasional crash when importing Resmed data.</li>
<li>[fix] Add bounds error checking to Resmed input processing.</li>
<li>[fix] Fix STR.edf file backup to avoid loss of settings data.</li>
<li>[fix] Fix Backup Journal to format XML properly.</li>
<li>[fix] In flow rate graph, don't show duration for events with no duration.</li>
<li>[fix] Fix pressure settings in Overview graph reported as a huge negative number.</li>
</ul>
<p>
<b>Changes and fixes in OSCAR v1.1.0</b>

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -687,10 +687,6 @@
<source>-</source>
<translation>-</translation>
</message>
<message>
<source>Gah!</source>
<translation>Gah!</translation>
</message>
<message>
<source>Help</source>
<translation></translation>
@ -1377,6 +1373,10 @@
<source>Calculating size...</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Show Personal Data</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>MinMaxWidget</name>
@ -4666,10 +4666,6 @@ p, li { white-space: pre-wrap; }
<source>Maximum Therapy Pressure</source>
<translation></translation>
</message>
<message>
<source>Couldn&apos;t parse Channels.xml, this build is seriously borked, no choice but to abort!!</source>
<translation> Channels.xml,,退!</translation>
</message>
<message>
<source>Current Selection</source>
<translation></translation>
@ -4928,14 +4924,6 @@ p, li { white-space: pre-wrap; }
<source>(last night)</source>
<translation>(</translation>
</message>
<message>
<source>(yesterday)</source>
<translation>()</translation>
</message>
<message>
<source>(%2 day ago)</source>
<translation>(%2 )</translation>
</message>
<message>
<source>Contec</source>
<translation>Contec</translation>
@ -6639,6 +6627,18 @@ Line %2, column %3</source>
<source>To resolve this, OSCAR has reverted to a slower but more compatible method of drawing.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Couldn&apos;t parse Channels.xml, OSCAR cannot continue and is exiting.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>(1 day ago)</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>(%2 days ago)</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>Report</name>
@ -7047,10 +7047,6 @@ Line %2, column %3</source>
<source>Checking for OSCAR Updates</source>
<translation>OSCAR更新</translation>
</message>
<message>
<source>OSCAR Updates are currently unvailable for this platform</source>
<translation>OSCAR更新目前不适用于此平台</translation>
</message>
<message>
<source>OSCAR Updates</source>
<translation>OSCAR更新</translation>
@ -7063,6 +7059,10 @@ Line %2, column %3</source>
<source>New OSCAR Updates are avilable:</source>
<translation>OSCAR更新可用</translation>
</message>
<message>
<source>OSCAR Updates are currently unavailable for this platform</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>Welcome</name>
@ -7106,10 +7106,6 @@ Line %2, column %3</source>
<source>last night</source>
<translation></translation>
</message>
<message>
<source>yesterday</source>
<translation></translation>
</message>
<message>
<source>%2 days ago</source>
<translation>%2 </translation>
@ -7206,6 +7202,10 @@ Line %2, column %3</source>
<source>&lt;span style=&quot; font-weight:600;&quot;&gt;Warning: &lt;/span&gt;&lt;span style=&quot; color:#ff0000;&quot;&gt;ResMed S9 SDCards need to be locked &lt;/span&gt;&lt;span style=&quot; font-weight:600; color:#ff0000;&quot;&gt;before inserting into your computer.&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot; color:#000000;&quot;&gt;&lt;br&gt;Some operating systems write index files to the card without asking, which can render your card unreadable by your cpap machine.&lt;/span&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>1 day ago</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>gGraph</name>

File diff suppressed because it is too large Load Diff

View File

@ -5,7 +5,7 @@
<name>AboutDialog</name>
<message>
<source>Sorry, could not locate About file.</source>
<translation>Leider konnte die About-Datei nicht gefunden werden.</translation>
<translation>Leider konnte die Über OSCAR-Datei nicht gefunden werden.</translation>
</message>
<message>
<source>Close</source>
@ -13,7 +13,7 @@
</message>
<message>
<source>&amp;About</source>
<translation>&amp;Schließen</translation>
<translation>&amp;Über</translation>
</message>
<message>
<source>GPL License</source>
@ -691,10 +691,6 @@
<source>Exit</source>
<translation>Beenden</translation>
</message>
<message>
<source>Gah!</source>
<translation>Bah!</translation>
</message>
<message>
<source>Help</source>
<translation>Hilfe</translation>
@ -789,7 +785,7 @@
</message>
<message>
<source>&amp;About</source>
<translation>&amp;Schließen</translation>
<translation>&amp;Über</translation>
</message>
<message>
<source>View &amp;Daily</source>
@ -1395,6 +1391,10 @@
<source>Calculating size...</source>
<translation>Größe berechnen...</translation>
</message>
<message>
<source>Show Personal Data</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>MinMaxWidget</name>
@ -5468,10 +5468,6 @@ TTIA: %1</translation>
<source>Pressure Min</source>
<translation>Mindestdruck</translation>
</message>
<message>
<source>(%2 day ago)</source>
<translation>(%2 Vortag)</translation>
</message>
<message>
<source>Diameter of primary CPAP hose</source>
<translation>Durchmesser des Primär CPAP Schlauch</translation>
@ -5552,10 +5548,6 @@ TTIA: %1</translation>
<source>There is a lockfile already present for this profile &apos;%1&apos;, claimed on &apos;%2&apos;.</source>
<translation>Es ist ein bereits für dieses Profil vorhanden Sperrdatei &apos;%1&apos;, behauptete auf &apos;%2&apos;.</translation>
</message>
<message>
<source>(yesterday)</source>
<translation>(gestern)</translation>
</message>
<message>
<source>User Flag #1</source>
<translation>Benutzer Markierung #1</translation>
@ -5940,10 +5932,6 @@ Stunden: %1</translation>
<source>%1 (%2 day): </source>
<translation>%1 (%2 Tag): </translation>
</message>
<message>
<source>Couldn&apos;t parse Channels.xml, this build is seriously borked, no choice but to abort!!</source>
<translation>Konnte die Kanäle.xml nicht analysieren. Bitte beenden Sie den Vorgang!!</translation>
</message>
<message>
<source>Current Selection</source>
<translation>Aktuelle Auswahl</translation>
@ -6670,6 +6658,18 @@ Stunden: %1</translation>
<source>To resolve this, OSCAR has reverted to a slower but more compatible method of drawing.</source>
<translation>Um dieses Problem zu lösen, ist OSCAR zu einer langsameren, aber kompatibleren Zeichenmethode zurückgekehrt.</translation>
</message>
<message>
<source>Couldn&apos;t parse Channels.xml, OSCAR cannot continue and is exiting.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>(1 day ago)</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>(%2 days ago)</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>Report</name>
@ -6998,10 +6998,6 @@ Stunden: %1</translation>
<source>&amp;Finished</source>
<translation>&amp;Fertig</translation>
</message>
<message>
<source>OSCAR Updates are currently unvailable for this platform</source>
<translation>OSCAR-Updates sind derzeit für diese Plattform nicht verfügbar</translation>
</message>
<message>
<source>Please wait while updates are downloaded and installed...</source>
<translation>Bitte warten Sie solange, bis die Updates heruntergeladen und installiert wurden...</translation>
@ -7094,6 +7090,10 @@ Stunden: %1</translation>
<source>New OSCAR Updates are avilable:</source>
<translation>Neue OSCAR-Updates sind verfügbar:</translation>
</message>
<message>
<source>OSCAR Updates are currently unavailable for this platform</source>
<translation>OSCAR-Updates sind derzeit für diese Plattform nicht verfügbar</translation>
</message>
</context>
<context>
<name>Welcome</name>
@ -7169,10 +7169,6 @@ Stunden: %1</translation>
<source>%2 days ago</source>
<translation>vor %2 Tagen</translation>
</message>
<message>
<source>yesterday</source>
<translation>gestern</translation>
</message>
<message>
<source>Statistics</source>
<translation>Statistiken</translation>
@ -7237,6 +7233,10 @@ Stunden: %1</translation>
<source>&lt;span style=&quot; font-weight:600;&quot;&gt;Warning: &lt;/span&gt;&lt;span style=&quot; color:#ff0000;&quot;&gt;ResMed S9 SDCards need to be locked &lt;/span&gt;&lt;span style=&quot; font-weight:600; color:#ff0000;&quot;&gt;before inserting into your computer.&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot; color:#000000;&quot;&gt;&lt;br&gt;Some operating systems write index files to the card without asking, which can render your card unreadable by your cpap machine.&lt;/span&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation>&lt;span style=&quot; font-weight:600;&quot;&gt;Achtung: &lt;/span&gt;&lt;span style=&quot; color:#ff0000;&quot;&gt;ResMed S9 SDCards müssen gesperrt werden &lt;/span&gt;&lt;span style=&quot; font-weight:600; color:#ff0000;&quot;&gt;vor dem Einsetzen in Ihren Computer.&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot; color:#000000;&quot;&gt;&lt;br&gt;Einige Betriebssysteme schreiben ungefragt Indexdateien auf die Karte, was Ihre Karte für Ihren Rechner unlesbar machen kann.&lt;/span&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>
</message>
<message>
<source>1 day ago</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>gGraph</name>

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -144,10 +144,6 @@
<source>Small</source>
<translation>Petit</translation>
</message>
<message>
<source>Machine Settings Unavailable</source>
<translation type="vanished">Réglages de l&apos;appareil indisponibles</translation>
</message>
<message>
<source>Journal</source>
<translation>Journal</translation>
@ -404,10 +400,6 @@
<source>%1h %2m %3s</source>
<translation>%1h %2m %3s</translation>
</message>
<message>
<source>One or more waveform record(s) for this session had faulty source data. Some waveform overlay points may not match up correctly.</source>
<translation type="vanished">Un ou plusieurs enregistrement de cette session a des données corrompues. Certains points des graphiques peuvent ne pas coïncider correctement.</translation>
</message>
<message>
<source>PAP Mode: %1</source>
<translation>Mode PAP : %1</translation>
@ -699,10 +691,6 @@
<source>Exit</source>
<translation>Quitter</translation>
</message>
<message>
<source>Gah!</source>
<translation>Zut !</translation>
</message>
<message>
<source>Help</source>
<translation>Aide</translation>
@ -1403,6 +1391,10 @@
<source>Calculating size...</source>
<translation>Calcul de la taille...</translation>
</message>
<message>
<source>Show Personal Data</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>MinMaxWidget</name>
@ -3768,10 +3760,6 @@ p, li { white-space: pre-wrap; }
<source>%1</source>
<translation>%1</translation>
</message>
<message>
<source>??</source>
<translation type="vanished">??</translation>
</message>
<message>
<source>AI</source>
<translation>AI</translation>
@ -3896,26 +3884,6 @@ p, li { white-space: pre-wrap; }
<source>oz</source>
<translation>oz</translation>
</message>
<message>
<source>x1</source>
<translation type="vanished">x1</translation>
</message>
<message>
<source>x2</source>
<translation type="vanished">x2</translation>
</message>
<message>
<source>x3</source>
<translation type="vanished">x3</translation>
</message>
<message>
<source>x4</source>
<translation type="vanished">x4</translation>
</message>
<message>
<source>x5</source>
<translation type="vanished">x5</translation>
</message>
<message>
<source>&amp;No</source>
<translation>&amp;Non</translation>
@ -3924,10 +3892,6 @@ p, li { white-space: pre-wrap; }
<source>90%</source>
<translation>90%</translation>
</message>
<message>
<source>???</source>
<translation type="vanished">???</translation>
</message>
<message>
<source>AHI</source>
<translation>IAH</translation>
@ -4428,10 +4392,6 @@ p, li { white-space: pre-wrap; }
<source>Sleep Stage</source>
<translation>Période du sommeil</translation>
</message>
<message>
<source>Sys1 Resist. Status</source>
<translation type="vanished">État de la résistance Sys1</translation>
</message>
<message>
<source>Minute Vent.</source>
<translation>Vent. minute</translation>
@ -4512,10 +4472,6 @@ p, li { white-space: pre-wrap; }
<source>SmartFlex Level</source>
<translation>Niveau de SmartFlex</translation>
</message>
<message>
<source>System One Resistance Status</source>
<translation type="vanished">État résistance System One</translation>
</message>
<message>
<source>Journal Data</source>
<translation>Données du journal</translation>
@ -4548,10 +4504,6 @@ p, li { white-space: pre-wrap; }
<source>Machine Unsupported</source>
<translation>Appareil non supporté</translation>
</message>
<message>
<source>0cmH2O</source>
<translation type="vanished">0cmH2O</translation>
</message>
<message>
<source>SOMNOsoft2</source>
<translation>SOMNOsoft2</translation>
@ -4564,30 +4516,14 @@ p, li { white-space: pre-wrap; }
<source>Machine</source>
<translation>Appareil</translation>
</message>
<message>
<source>1cmH2O</source>
<translation type="vanished">1cmH2O</translation>
</message>
<message>
<source>Whether System One resistance settings are available to you.</source>
<translation type="vanished">Selon disponibilité des réglages de résistance System One.</translation>
</message>
<message>
<source>Mask On</source>
<translation>Avec masque</translation>
</message>
<message>
<source>2cmH2O</source>
<translation type="vanished">2cmH2O</translation>
</message>
<message>
<source>Max: %1</source>
<translation>Max : %1</translation>
</message>
<message>
<source>3cmH2O</source>
<translation type="vanished">3CmH2O</translation>
</message>
<message>
<source>A sudden (user definable) drop in blood oxygen saturation</source>
<translation>Une baisse soudaine d&apos;oxygénation du sang (définissable par l&apos;utilisateur)</translation>
@ -4721,10 +4657,6 @@ p, li { white-space: pre-wrap; }
<source>AB Filter</source>
<translation>Filtre AB</translation>
</message>
<message>
<source>Sys1 Resist. Lock</source>
<translation type="vanished">Verrou résist. Sys1</translation>
</message>
<message>
<source>%1
Line %2, column %3</source>
@ -4883,10 +4815,6 @@ Merci de reconstruire les données de PPC</translation>
<source>Orientation</source>
<translation>Orientation</translation>
</message>
<message>
<source>Whether or not machine shows AHI via LCD panel.</source>
<translation type="vanished">Selon que l&apos;appareil affiche ou pas l&apos;IAH sur l&apos;affichage LCD.</translation>
</message>
<message>
<source>Smart Start</source>
<translation>SmartStart</translation>
@ -5087,10 +5015,6 @@ Début : %2
<source>Rate of breaths per minute</source>
<translation>Respirations par minute</translation>
</message>
<message>
<source>Once you upgrade, you &lt;font size=+1&gt;can not&lt;/font&gt; use this profile with the previous version anymore.</source>
<translation type="vanished">Une fois mis à jour, vous &lt;font size=+1&gt;ne pourrez plus &lt;/font&gt;utiliser ce profil avec l&apos;ancienne version.</translation>
</message>
<message>
<source>Usage Statistics</source>
<translation>Statistiques d&apos;utilisation</translation>
@ -5193,10 +5117,6 @@ TTIA : %1</translation>
<source>ASV (Variable EPAP)</source>
<translation>ASV (EPAP variable)</translation>
</message>
<message>
<source>Sys1 Resist. Set</source>
<translation type="vanished">Réglages résist. Sys1</translation>
</message>
<message>
<source>Exhale Pressure Relief Level</source>
<translation>Niveau de dépression d&apos;expiration</translation>
@ -5225,10 +5145,6 @@ TTIA : %1</translation>
<source>Rise Time</source>
<translation>Montée temporisée</translation>
</message>
<message>
<source>System One Resistance Lock</source>
<translation type="vanished">Verrou de résistance System One</translation>
</message>
<message>
<source>Cheyne Stokes Respiration</source>
<translation>Respiration de Cheyne-Stokes</translation>
@ -5297,10 +5213,6 @@ TTIA : %1</translation>
<source>Pressure Min</source>
<translation>Pression mini</translation>
</message>
<message>
<source>(%2 day ago)</source>
<translation>(il y a %2 jours)</translation>
</message>
<message>
<source>Diameter of primary CPAP hose</source>
<translation>Diamètre du tuyau principal de PPC</translation>
@ -5373,10 +5285,6 @@ TTIA : %1</translation>
<source>There is a lockfile already present for this profile &apos;%1&apos;, claimed on &apos;%2&apos;.</source>
<translation>Il y a un fichier de verrouillage déjà présent pour ce profil &apos;%1&apos;, demandé sur &apos;%2&apos;.</translation>
</message>
<message>
<source>(yesterday)</source>
<translation>(hier)</translation>
</message>
<message>
<source>User Flag #1</source>
<translation>Évènement utilisateur #1</translation>
@ -5437,10 +5345,6 @@ TTIA : %1</translation>
<source>Question</source>
<translation>Question</translation>
</message>
<message>
<source>System One Mask Resistance Setting</source>
<translation type="vanished">Réglage de résistance du masque System One</translation>
</message>
<message>
<source>Waketime: %1</source>
<translation>Réveil : %1</translation>
@ -5605,10 +5509,6 @@ Heures : %1</translation>
<source>Min Pressure</source>
<translation>Pression min</translation>
</message>
<message>
<source>System One Resistance Setting</source>
<translation type="vanished">Réglage de la résistance System One</translation>
</message>
<message>
<source>Total Leak Rate</source>
<translation>Total des fuites</translation>
@ -5673,10 +5573,6 @@ Heures : %1</translation>
<source>%1 (%2 day): </source>
<translation>%1 (%2 jour) : </translation>
</message>
<message>
<source>Couldn&apos;t parse Channels.xml, this build is seriously borked, no choice but to abort!!</source>
<translation>Impossible de traiter le fichier channels.xml, cette version est sévèrement endommagée, pas d&apos;autre choix que de quitter !!</translation>
</message>
<message>
<source>Current Selection</source>
<translation>Sélection courante</translation>
@ -5841,10 +5737,6 @@ Heures : %1</translation>
<source>ms</source>
<translation>ms</translation>
</message>
<message>
<source>ÇSR</source>
<translation type="vanished">RCS</translation>
</message>
<message>
<source>Height</source>
<translation>Taille</translation>
@ -6438,26 +6330,6 @@ corporelle</translation>
<source>Tube Temp.</source>
<translation>Temp. circuit</translation>
</message>
<message>
<source>1</source>
<translation type="vanished">1</translation>
</message>
<message>
<source>2</source>
<translation type="vanished">2</translation>
</message>
<message>
<source>3</source>
<translation type="vanished">3</translation>
</message>
<message>
<source>4</source>
<translation type="vanished">4</translation>
</message>
<message>
<source>5</source>
<translation type="vanished">5</translation>
</message>
<message>
<source>PRS1 Humidifier Setting</source>
<translation>Réglage de lhumidificateur PRS1</translation>
@ -6470,14 +6342,6 @@ corporelle</translation>
<source>12mm</source>
<translation>12 mm</translation>
</message>
<message>
<source>PRS1 Unknown</source>
<translation type="vanished">PRS1 inconnu</translation>
</message>
<message>
<source>Unknown PRS1 span 0x0E</source>
<translation type="vanished">Intervalle 0x0E PRS1 inconnu</translation>
</message>
<message>
<source>Parsing STR.edf records...</source>
<translation>Analyse des enregistrements STR.edf...</translation>
@ -6797,6 +6661,18 @@ corporelle</translation>
<source>To resolve this, OSCAR has reverted to a slower but more compatible method of drawing.</source>
<translation>Pour résoudre ce problème, OSCAR est revenu à une méthode de dessin plus lente mais plus compatible.</translation>
</message>
<message>
<source>Couldn&apos;t parse Channels.xml, OSCAR cannot continue and is exiting.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>(1 day ago)</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>(%2 days ago)</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>Report</name>
@ -7205,10 +7081,6 @@ corporelle</translation>
<source>Checking for OSCAR Updates</source>
<translation>Vérification de disponibilité de mise à jour</translation>
</message>
<message>
<source>OSCAR Updates are currently unvailable for this platform</source>
<translation>Pas de mise à jour disponible pour cette plateforme</translation>
</message>
<message>
<source>OSCAR Updates</source>
<translation>Mise à jour de OSCAR</translation>
@ -7221,6 +7093,10 @@ corporelle</translation>
<source>New OSCAR Updates are avilable:</source>
<translation>Une mise à jour de OSCAR est disponible :</translation>
</message>
<message>
<source>OSCAR Updates are currently unavailable for this platform</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>Welcome</name>
@ -7264,10 +7140,6 @@ corporelle</translation>
<source>last night</source>
<translation>la nuit dernière</translation>
</message>
<message>
<source>yesterday</source>
<translation>hier</translation>
</message>
<message>
<source>%2 days ago</source>
<translation>il y a %2 jours</translation>
@ -7364,6 +7236,10 @@ corporelle</translation>
<source>&lt;span style=&quot; font-weight:600;&quot;&gt;Warning: &lt;/span&gt;&lt;span style=&quot; color:#ff0000;&quot;&gt;ResMed S9 SDCards need to be locked &lt;/span&gt;&lt;span style=&quot; font-weight:600; color:#ff0000;&quot;&gt;before inserting into your computer.&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot; color:#000000;&quot;&gt;&lt;br&gt;Some operating systems write index files to the card without asking, which can render your card unreadable by your cpap machine.&lt;/span&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation>&lt;span style=&quot; font-weight:600;&quot;&gt;Attention: &lt;/span&gt;&lt;span style=&quot; color:#ff0000;&quot;&gt;La carte SD de l&apos;appareil ResMed S9 doit être verrouillée &lt;/span&gt;&lt;span style=&quot; font-weight:600; color:#ff0000;&quot;&gt;avant d&apos;être insérée dans votre ordinateur.&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot; color:#000000;&quot;&gt;&lt;br&gt;Certains systèmes d&apos;exploitation écrivent des fichiers sur la carte sans le demander et peuvent rendre la carte inutilisable par votre appareil.&lt;/span&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>
</message>
<message>
<source>1 day ago</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>gGraph</name>

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -1138,10 +1138,6 @@
<source>Screenshot saved to file &quot;%1&quot;</source>
<translation>Zrzut ekranu zapisany do pliku &quot;%1&quot;</translation>
</message>
<message>
<source>Gah!</source>
<translation>Gah!</translation>
</message>
<message>
<source>There was a problem opening MSeries block File: </source>
<translation>Problem z otwarciem pliku blokującego MSeries: </translation>
@ -1396,6 +1392,10 @@
<source>Calculating size...</source>
<translation>Obliczanie rozmiaru...</translation>
</message>
<message>
<source>Show Personal Data</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>MinMaxWidget</name>
@ -4805,10 +4805,6 @@ TTIA: %1</translation>
<source>Rebuilding from %1 Backup</source>
<translation>Odbudowa z kopii zapasowej %1</translation>
</message>
<message>
<source>Couldn&apos;t parse Channels.xml, this build is seriously borked, no choice but to abort!!</source>
<translation>Nie mogę zanalizować Channels.xml, ta wersja jest poważnie uszkodzona, nic tylko spadać!!!</translation>
</message>
<message>
<source>Therapy Pressure</source>
<translation>Ciśnienie lecznicze</translation>
@ -5648,14 +5644,6 @@ TTIA: %1</translation>
<source>(last night)</source>
<translation>(ostatnia noc)</translation>
</message>
<message>
<source>(yesterday)</source>
<translation>(wczoraj)</translation>
</message>
<message>
<source>(%2 day ago)</source>
<translation>(%2 dni temu)</translation>
</message>
<message>
<source>No oximetry data has been imported yet.</source>
<translation>Nie zaimportowano dotąd żadnych danych pulsoksymetrii.</translation>
@ -5918,10 +5906,6 @@ Proszę przebuduj dane CPAP</translation>
<source>VPAP-S/T</source>
<translation>VPAP-S/T</translation>
</message>
<message>
<source>??</source>
<translation type="vanished">??</translation>
</message>
<message>
<source>VPAPauto</source>
<translation>VPAPauto</translation>
@ -5930,10 +5914,6 @@ Proszę przebuduj dane CPAP</translation>
<source>ASVAuto</source>
<translation>ASVAuto</translation>
</message>
<message>
<source>???</source>
<translation type="vanished">???</translation>
</message>
<message>
<source>Auto for Her</source>
<translation>Auto for Her</translation>
@ -5958,22 +5938,6 @@ Proszę przebuduj dane CPAP</translation>
<source>Exhale Pressure Relief Level</source>
<translation>Poziom ulgi wydechowej</translation>
</message>
<message>
<source>0cmH2O</source>
<translation type="vanished">0cmH2O</translation>
</message>
<message>
<source>1cmH2O</source>
<translation type="vanished">1cmH2O</translation>
</message>
<message>
<source>2cmH2O</source>
<translation type="vanished">2cmH2O</translation>
</message>
<message>
<source>3cmH2O</source>
<translation type="vanished">3cmH2O</translation>
</message>
<message>
<source>SmartStart</source>
<translation>SmartStart</translation>
@ -6690,6 +6654,18 @@ Wiersz %2, kolumna %3</translation>
<source>To resolve this, OSCAR has reverted to a slower but more compatible method of drawing.</source>
<translation>Aby to rozwiązać, OSCAR przeszedł na wolniejszą ale bardziej kompatybilną metodę rysowania.</translation>
</message>
<message>
<source>Couldn&apos;t parse Channels.xml, OSCAR cannot continue and is exiting.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>(1 day ago)</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>(%2 days ago)</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>Report</name>
@ -7082,10 +7058,6 @@ Wiersz %2, kolumna %3</translation>
<source>Checking for OSCAR Updates</source>
<translation>Sprawdzanie uaktualnień OSCAR</translation>
</message>
<message>
<source>OSCAR Updates are currently unvailable for this platform</source>
<translation>Uaktualnienie OSCAR dla tej platformy jest obecnie niedostępne</translation>
</message>
<message>
<source>OSCAR Updates</source>
<translation>Uaktualnienia OSCAR</translation>
@ -7114,6 +7086,10 @@ Wiersz %2, kolumna %3</translation>
<source>New OSCAR Updates are avilable:</source>
<translation> dostępne aktualizacje:</translation>
</message>
<message>
<source>OSCAR Updates are currently unavailable for this platform</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>Welcome</name>
@ -7169,10 +7145,6 @@ Wiersz %2, kolumna %3</translation>
<source>last night</source>
<translation>ostatniej nocy</translation>
</message>
<message>
<source>yesterday</source>
<translation>wczoraj</translation>
</message>
<message>
<source>%2 days ago</source>
<translation>%2 dni temu</translation>
@ -7257,6 +7229,10 @@ Wiersz %2, kolumna %3</translation>
<source>&lt;span style=&quot; font-weight:600;&quot;&gt;Warning: &lt;/span&gt;&lt;span style=&quot; color:#ff0000;&quot;&gt;ResMed S9 SDCards need to be locked &lt;/span&gt;&lt;span style=&quot; font-weight:600; color:#ff0000;&quot;&gt;before inserting into your computer.&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot; color:#000000;&quot;&gt;&lt;br&gt;Some operating systems write index files to the card without asking, which can render your card unreadable by your cpap machine.&lt;/span&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation>&lt;span style=&quot; font-weight:600;&quot;&gt;UWAGA: &lt;/span&gt;&lt;span style=&quot; color:#ff0000;&quot;&gt;Karty SD z aparatów ResMed S9 muszą być zablokowane &lt;/span&gt;&lt;span style=&quot; font-weight:600; color:#ff0000;&quot;&gt;przed włożeniem do komputera.&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot; color:#000000;&quot;&gt;&lt;br&gt;Niektóre systemy operacyjne dopisują pliki indeksu na karcie bez pytania, co może uczynić kartę nieczytelną dla aparatu CPAP.&lt;/span&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>
</message>
<message>
<source>1 day ago</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>gGraph</name>

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,90 @@
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE TS>
<TS version="2.1" language="tr_TR">
<context>
<name>QShortcut</name>
<message>
<source>No</source>
<translation>Hayır</translation>
</message>
<message>
<source>Yes</source>
<translation>Evet</translation>
</message>
</context>
<context>
<name>QPlatformTheme</name>
<message>
<source>OK</source>
<translation>Tamam</translation>
</message>
<message>
<source>&amp;No</source>
<translation>&amp;Hayır</translation>
</message>
<message>
<source>&amp;Yes</source>
<translation>&amp;Evet</translation>
</message>
<message>
<source>Help</source>
<translation>Yardım</translation>
</message>
<message>
<source>Open</source>
<translation></translation>
</message>
<message>
<source>Save</source>
<translation>Kaydet</translation>
</message>
<message>
<source>Abort</source>
<translation>Durdur</translation>
</message>
<message>
<source>Apply</source>
<translation>Uygula</translation>
</message>
<message>
<source>Close</source>
<translation>Kapat</translation>
</message>
<message>
<source>Reset</source>
<translation>Sıfırla</translation>
</message>
<message>
<source>Retry</source>
<translation>Tekrar Dene</translation>
</message>
<message>
<source>Restore Defaults</source>
<translation>Varsayılanları Geri Yükle</translation>
</message>
<message>
<source>Cancel</source>
<translation>İptal</translation>
</message>
<message>
<source>Ignore</source>
<translation>Görmezden Gel</translation>
</message>
<message>
<source>N&amp;o to All</source>
<translation>&amp;Tümüne Hayır</translation>
</message>
<message>
<source>Save All</source>
<translation>Hepsini Kaydet</translation>
</message>
<message>
<source>Discard</source>
<translation>At</translation>
</message>
<message>
<source>Yes to &amp;All</source>
<translation>Tümüne E&amp;vet</translation>
</message>
</context>
</TS>

View File

@ -39,6 +39,7 @@ AppWideSetting::AppWideSetting(Preferences *pref) : PrefSettings(pref)
initPref(STR_AS_RightSidebarVisible, false);
initPref(STR_CS_UserEventPieChart, false);
initPref(STR_US_ShowSerialNumbers, false);
initPref(STR_US_ShowPersonalData, true);
initPref(STR_US_OpenTabAtStart, 1);
initPref(STR_US_OpenTabAfterImport, 0);
initPref(STR_US_AutoLaunchImport, false);

View File

@ -52,6 +52,7 @@ const QString STR_US_OpenTabAfterImport = "OpenTabAfterImport";
const QString STR_US_AutoLaunchImport = "AutoLaunchImport";
const QString STR_US_RemoveCardReminder = "RemoveCardReminder";
const QString STR_US_DontAskWhenSavingScreenshots = "DontAskWhenSavingScreenshots";
const QString STR_US_ShowPersonalData = "ShowPersonalData";
const QString STR_IS_CacheSessions = "MemoryHog";
const QString STR_GEN_AutoOpenLastUsed = "AutoOpenLastUsed";
@ -141,6 +142,7 @@ public:
bool dontAskWhenSavingScreenshots() const { return getPref(STR_US_DontAskWhenSavingScreenshots).toBool(); }
bool autoOpenLastUsed() const { return getPref(STR_GEN_AutoOpenLastUsed).toBool(); }
inline const QString & language() const { return m_language; }
bool showPersonalData() const { return getPref(STR_US_ShowPersonalData).toBool(); }
void setProfileName(QString name) { setPref(STR_GEN_Profile, m_profileName=name); }
void setAutoLaunchImport(bool b) { setPref(STR_US_AutoLaunchImport, b); }
@ -191,6 +193,7 @@ public:
void setOpenTabAfterImport(int idx) { setPref(STR_US_OpenTabAfterImport, idx); }
void setRemoveCardReminder(bool b) { setPref(STR_US_RemoveCardReminder, b); }
void setDontAskWhenSavingScreenshots(bool b) { setPref(STR_US_DontAskWhenSavingScreenshots, b); }
void setShowPersonalData(bool b) { setPref(STR_US_ShowPersonalData, b); }
void setVersionString(QString version) { setPref(STR_PREF_VersionString, version); }
#ifndef NO_UPDATER

View File

@ -0,0 +1,28 @@
/* Device Connection Class Implementation
*
* Copyright (c) 2020 The OSCAR Team
*
* This file is subject to the terms and conditions of the GNU General Public
* License. See the file COPYING in the main directory of the source code
* for more details. */
#include "deviceconnection.h"
SerialPortInfo::SerialPortInfo(const QSerialPortInfo & other)
: QSerialPortInfo(other)
{
}
SerialPortInfo::SerialPortInfo(const SerialPortInfo & other)
: QSerialPortInfo(dynamic_cast<const SerialPortInfo &>(other))
{
}
QList<SerialPortInfo> SerialPortInfo::availablePorts()
{
QList<SerialPortInfo> out;
for (auto & info : QSerialPortInfo::availablePorts()) {
out.append(SerialPortInfo(info));
}
return out;
}

View File

@ -0,0 +1,38 @@
/* Device Connection Class Header
*
* Copyright (c) 2020 The OSCAR Team
*
* This file is subject to the terms and conditions of the GNU General Public
* License. See the file COPYING in the main directory of the source code
* for more details. */
#ifndef DEVICECONNECTION_H
#define DEVICECONNECTION_H
// TODO: This file will eventually abstract serial port or bluetooth (or other)
// connections to devices. For now it just supports serial ports.
#include <QtSerialPort/QSerialPort>
#include <QtSerialPort/QSerialPortInfo>
// TODO: This class may eventually be internal to a DeviceConnection class,
// but for now it is used to provide support for recording and playback of
// serial port connections before refactoring.
class SerialPort : public QSerialPort
{
};
// TODO: This class's functionality will eventually be internal to a
// DeviceConnection class, but for now it is needed to support recording
// and playback of serial port scanning before refactoring.
class SerialPortInfo : public QSerialPortInfo
{
public:
static QList<SerialPortInfo> availablePorts();
SerialPortInfo(const SerialPortInfo & other);
protected:
SerialPortInfo(const QSerialPortInfo & other);
};
#endif // DEVICECONNECTION_H

View File

@ -272,6 +272,7 @@ static const PRS1TestedModel s_PRS1TestedModels[] = {
{ "200X110", 0, 6, "DreamStation CPAP" }, // (brick)
{ "400G110", 0, 6, "DreamStation Go" },
{ "400X110", 0, 6, "DreamStation CPAP Pro" },
{ "400X130", 0, 6, "DreamStation CPAP Pro" },
{ "400X150", 0, 6, "DreamStation CPAP Pro" },
{ "500X110", 0, 6, "DreamStation Auto CPAP" },
{ "500X120", 0, 6, "DreamStation Auto CPAP" },
@ -3038,8 +3039,12 @@ bool PRS1Import::ImportEventChunk(PRS1DataChunk* event)
if (session->last() == 0) {
qWarning() << sessionid << "End time not set by summary?";
} else if (t > session->last()) {
// This has only been seen once, with corrupted data, in which the summary and event
// files each contained multiple conflicting sessions (all brief) with the same ID.
// This has only been seen in two instances:
// 1. Once with corrupted data, in which the summary and event files each contained
// multiple conflicting sessions (all brief) with the same ID.
// 2. On one 500G110, multiple PRS1PressureSetEvents appear after the end of the session,
// across roughtly two dozen sessions. These seem to be discarded on official reports,
// see ImportEvent() below.
qWarning() << sessionid << "Events continue after summary?";
}
// Events can end before the session if the mask was off before the equipment turned off.
@ -3070,6 +3075,10 @@ void PRS1Import::ImportEvent(qint64 t, PRS1ParsedEvent* e)
switch (e->m_type) {
case PRS1PressureSetEvent::TYPE: // currentPressure is used to calculate unintentional leak, not just PS
// TODO: These have sometimes been observed with t > session->last() on a 500G110.
// Official reports seem to discard such events, OSCAR currently doesn't.
// Test this more thoroughly before changing behavior here.
// fall through
case PRS1IPAPSetEvent::TYPE:
case PRS1IPAPAverageEvent::TYPE:
AddEvent(channel, t, e->m_value, e->m_gain);
@ -7257,10 +7266,15 @@ bool PRS1DataChunk::ParseSummaryF0V6(void)
tt += data[pos] | (data[pos+1] << 8); // This adds to the total duration (otherwise it won't match report)
this->ParseHumidifierSettingV3(data[pos+2], data[pos+3]);
break;
case 0x0d: // ???
// seen on one 500G multiple times
//CHECK_VALUE(data[pos], 0); // 16-bit value
//CHECK_VALUE(data[pos+1], 0);
break;
case 0x0e:
// only seen once on 400G, many times on 500G
CHECK_VALUES(data[pos], 0, 6);
CHECK_VALUE(data[pos+1], 0);
//CHECK_VALUES(data[pos], 0, 6); // 16-bit value
//CHECK_VALUE(data[pos+1], 0);
//CHECK_VALUES(data[pos+2], 7, 9);
//CHECK_VALUES(data[pos+3], 7, 15);
//CHECK_VALUES(data[pos+4], 7, 12);

View File

@ -108,7 +108,7 @@ void init()
// Note: Old channel names stored in channels.xml are not translatable.. they need to be moved to be defined AFTER here instead
if (!schema::channel.Load(":/docs/channels.xml")) {
QMessageBox::critical(0, STR_MessageBox_Error,
QObject::tr("Couldn't parse Channels.xml, this build is seriously borked, no choice but to abort!!"),
QObject::tr("Couldn't parse Channels.xml, OSCAR cannot continue and is exiting."),
QMessageBox::Ok);
QApplication::exit(-1);
}

View File

@ -1,13 +1,12 @@
/* SleepLib Machine Loader Class Implementation
*
* Copyright (c) 2011-2018 Mark Watkins <mark@jedimark.net>
* Copyright (c) 2020 The OSCAR Team
*
* This file is subject to the terms and conditions of the GNU General Public
* License. See the file COPYING in the main directory of the source code
* for more details. */
#include <QtSerialPort/QSerialPortInfo>
#include "serialoximeter.h"
// Possibly need to replan this to include oximetry
@ -31,11 +30,11 @@ bool SerialOximeter::scanDevice(QString keyword, quint16 vendor_id, quint16 prod
QStringList ports;
qDebug() << "seroxi - Scanning for USB Serial devices";
QList<QSerialPortInfo> list=QSerialPortInfo::availablePorts();
QList<SerialPortInfo> list=SerialPortInfo::availablePorts();
// How does the mac detect this as a SPO2 device?
for (int i=0;i<list.size();i++) {
const QSerialPortInfo * info = &list.at(i);
const SerialPortInfo * info = &list.at(i);
QString name = info->portName();
QString desc = info->description();

View File

@ -1,6 +1,7 @@
/* SleepLib MachineLoader Base Class Header
/* SleepLib MachineLoader Base Class Header
*
* Copyright (C) 2011-2018 Mark Watkins <mark@jedimark.net>
* Copyright (c) 2020 The OSCAR Team
*
* This file is subject to the terms and conditions of the GNU General Public
* License. See the file COPYING in the main directory of the source code
@ -10,7 +11,7 @@
#define SERIALOXIMETER_H
#include <QTimer>
#include <QtSerialPort/QSerialPort>
#include "SleepLib/deviceconnection.h"
#include "SleepLib/machine_loader.h"
@ -126,7 +127,7 @@ protected:
virtual void requestData() {}
QString port;
QSerialPort serial;
SerialPort serial;
QTimer startTimer;
QTimer resetTimer;

View File

@ -1,5 +1,5 @@
// Update the string below to set OSCAR's version and release status.
// See https://semver.org/spec/v2.0.0.html for details on format.
#define VERSION "1.1.1-rc-4"
#define VERSION "1.1.2-alpha-0"

View File

@ -226,6 +226,8 @@ void MainWindow::SetupGUI()
ui->action_Sidebar_Toggle->setChecked(b);
ui->toolBox->setVisible(b);
ui->actionShowPersonalData->setChecked(AppSetting->showPersonalData());
ui->actionPie_Chart->setChecked(AppSetting->showPieChart());
ui->actionDaily_Calendar->setChecked(AppSetting->calendarVisible());
@ -1827,7 +1829,7 @@ void MainWindow::RestartApplication(bool force_login, QString cmdline)
if (QProcess::startDetached("/usr/bin/open", args)) {
QApplication::instance()->exit();
} else {
QMessageBox::warning(nullptr, tr("Gah!"),
QMessageBox::warning(nullptr, STR_MessageBox_Error,
tr("If you can read this, the restart command didn't work. You will have to do it yourself manually."), QMessageBox::Ok);
}
@ -1854,7 +1856,7 @@ void MainWindow::RestartApplication(bool force_login, QString cmdline)
// ::exit(0);
} else {
QMessageBox::warning(nullptr, tr("Gah!"),
QMessageBox::warning(nullptr, STR_MessageBox_Error,
tr("If you can read this, the restart command didn't work. You will have to do it yourself manually."), QMessageBox::Ok);
}
@ -2710,6 +2712,13 @@ void MainWindow::on_actionDaily_Calendar_toggled(bool visible)
if (daily) daily->setCalendarVisible(visible);
}
void MainWindow::on_actionShowPersonalData_toggled(bool visible)
{
AppSetting->setShowPersonalData(visible);
if (!setupRunning)
GenerateStatistics();
}
#include "SleepLib/journal.h"
void MainWindow::on_actionExport_Journal_triggered()

View File

@ -362,6 +362,8 @@ class MainWindow : public QMainWindow
void on_statisticsView_anchorClicked(const QUrl &url);
void on_actionShowPersonalData_toggled(bool visible);
private:
QString getMainWindowTitle();

View File

@ -2851,6 +2851,8 @@ p, li { white-space: pre-wrap; }
<addaction name="actionLeft_Daily_Sidebar"/>
<addaction name="actionDaily_Calendar"/>
<addaction name="action_Sidebar_Toggle"/>
<addaction name="separator"/>
<addaction name="actionShowPersonalData"/>
</widget>
<widget class="QMenu" name="menu_Help">
<property name="title">
@ -3286,6 +3288,17 @@ p, li { white-space: pre-wrap; }
<string>Advanced graph order, good for ASV, AVAPS</string>
</property>
</action>
<action name="actionShowPersonalData">
<property name="checkable">
<bool>true</bool>
</property>
<property name="checked">
<bool>true</bool>
</property>
<property name="text">
<string>Show Personal Data</string>
</property>
</action>
</widget>
<customwidgets>
<customwidget>

View File

@ -302,6 +302,7 @@ SOURCES += \
translation.cpp \
statistics.cpp \
oximeterimport.cpp \
SleepLib/deviceconnection.cpp \
SleepLib/serialoximeter.cpp \
SleepLib/loader_plugins/md300w1_loader.cpp \
Graphs/gSessionTimesChart.cpp \
@ -381,6 +382,7 @@ HEADERS += \
translation.h \
statistics.h \
oximeterimport.h \
SleepLib/deviceconnection.h \
SleepLib/serialoximeter.h \
SleepLib/loader_plugins/md300w1_loader.h \
Graphs/gSessionTimesChart.h \

View File

@ -141,7 +141,7 @@ void Report::PrintReport(gGraphView *gv, QString name, QDate date)
int maxy = 0;
if (!p_profile->user->firstName().isEmpty()) {
if (AppSetting->showPersonalData() && !p_profile->user->firstName().isEmpty()) {
QString userinfo = STR_TR_Name + QString(":\t %1, %2\n").
arg(p_profile->user->lastName()).
arg(p_profile->user->firstName());

View File

@ -39,7 +39,7 @@ QString resizeHTMLPixmap(QPixmap &pixmap, int width, int height) {
QBuffer buffer(&byteArray); // use buffer to store pixmap into byteArray
buffer.open(QIODevice::WriteOnly);
pixmap.scaled(width, height, Qt::KeepAspectRatio, Qt::SmoothTransformation).save(&buffer, "PNG");
return QString("<img src=\"data:image/png;base64,"+byteArray.toBase64()+"\">");
return QString("<img src='data:image/png;base64,"+byteArray.toBase64()+"' ALT='logo'>");
}
QString formatTime(float time)
@ -620,40 +620,45 @@ Statistics::Statistics(QObject *parent) :
// Get the user information block for displaying at top of page
QString Statistics::getUserInfo () {
if (!AppSetting->showPersonalData())
return "";
QString address = p_profile->user->address();
address.replace("\n", "<br/>");
address.replace("\n", "<br>");
QString userinfo = "";
if (!p_profile->user->firstName().isEmpty()) {
userinfo = tr("Name: %1, %2").arg(p_profile->user->lastName()).arg(p_profile->user->firstName()) + "<br/>";
userinfo = tr("Name: %1, %2").arg(p_profile->user->lastName()).arg(p_profile->user->firstName()) + "<br>";
if (!p_profile->user->DOB().isNull()) {
userinfo += tr("DOB: %1").arg(p_profile->user->DOB().toString(MedDateFormat)) + "<br/>";
userinfo += tr("DOB: %1").arg(p_profile->user->DOB().toString(MedDateFormat)) + "<br>";
}
if (!p_profile->user->phone().isEmpty()) {
userinfo += tr("Phone: %1").arg(p_profile->user->phone()) + "<br/>";
userinfo += tr("Phone: %1").arg(p_profile->user->phone()) + "<br>";
}
if (!p_profile->user->email().isEmpty()) {
userinfo += tr("Email: %1").arg(p_profile->user->email()) + "<br/><br/>";
userinfo += tr("Email: %1").arg(p_profile->user->email()) + "<br><br>";
}
if (!p_profile->user->address().isEmpty()) {
userinfo += tr("Address:")+"<br/>"+address;
userinfo += tr("Address:")+"<br>"+address;
}
}
while (userinfo.length() > 0 && userinfo.endsWith("<br/>")) // Strip trailing newlines
userinfo = userinfo.mid(0, userinfo.length()-5);
while (userinfo.length() > 0 && userinfo.endsWith("<br>")) // Strip trailing newlines
userinfo = userinfo.mid(0, userinfo.length()-4);
return userinfo;
}
const QString table_width = "width=99%";
const QString table_width = "width='100%'";
// Create the page header in HTML. Includes everything from <head> through <body>
QString Statistics::generateHeader(bool onScreen)
{
QString html = QString("<html><head>")+
"<style type='text/css'>";
QString html = QString("<html><head>");
html += "<title>Oscar Statistics Report</title>";
html += "<style type='text/css'>";
if (onScreen) {
html += "p,a,td,body { font-family: '" + QApplication::font().family() + "'; }"
"p,a,td,body { font-size: " + QString::number(QApplication::font().pointSize() + 2) + "px; }";
@ -682,7 +687,7 @@ QString Statistics::generateHeader(bool onScreen)
"</style>"
"<link rel='stylesheet' type='text/css' href='qrc:/docs/tooltips.css' />"
"<link rel='stylesheet' type='text/css' href='qrc:/docs/tooltips.css' >"
"<script type='text/javascript'>"
"function ChangeColor(tableRow, highLight)"
@ -692,18 +697,19 @@ QString Statistics::generateHeader(bool onScreen)
"</head>"
"<body leftmargin=0 topmargin=5 rightmargin=0>";
"<body>"; //leftmargin=0 topmargin=5 rightmargin=0>";
QPixmap logoPixmap(":/icons/logo-lg.png");
html += "<div align=center><table class=curved width='100%'>"
// html += "<div align=center><table class=curved width='100%'>"
html += "<div align=center><table class=curved " + table_width + ">"
"<tr>"
"<td align='left' valign='middle'>" + getUserInfo() + "</td>"
"<td align='right' valign='middle' width='200'>"
"<font size='+2'>" + STR_TR_OSCAR + "&nbsp;&nbsp;&nbsp;</font><br/>"
"<font size='+2'>" + STR_TR_OSCAR + "&nbsp;&nbsp;&nbsp;</font><br>"
"<font size='+1'>" + QObject::tr("Usage Statistics") + "&nbsp;&nbsp;&nbsp;</font>"
"</td>"
"<td align='right' valign='middle' width='110'>" + resizeHTMLPixmap(logoPixmap,80,80)+"&nbsp;&nbsp;&nbsp;<br/>"
"<td align='right' valign='middle' width='110'>" + resizeHTMLPixmap(logoPixmap,80,80)+"&nbsp;&nbsp;&nbsp;<br>"
"</td>"
"</tr>"
"</table>"
@ -722,7 +728,7 @@ QString Statistics::generateFooter(bool showinfo)
QDateTime timestamp = QDateTime::currentDateTime();
html += tr("This report was prepared on %1 by OSCAR %2").arg(timestamp.toString(MedDateFormat + " hh:mm"))
.arg(getVersion())
+ "<br/>"
+ "<br>"
+ tr("OSCAR is free open-source CPAP report software");
html += "</i></font></div>";
}
@ -892,12 +898,12 @@ QString Statistics::GenerateMachineList()
QString html;
if (mach.size() > 0) {
html += "<div align=center><br/>";
html += "<div align=center><br>";
html += QString("<table class=curved style=\"page-break-before:auto;\" "+table_width+">");
html += QString("<table class=curved style='page-break-before:auto' "+table_width+">");
html += "<thead>";
html += "<tr bgcolor='"+heading_color+"'><th colspan=7 align=center><font size=+2>" + tr("Machine Information") + "</font></th></tr>";
html += "<tr bgcolor='"+heading_color+"'><th colspan=7 align=center><font size='+2'>" + tr("Machine Information") + "</font></th></tr>";
html += QString("<tr><td><b>%1</b></td><td><b>%2</b></td><td><b>%3</b></td><td><b>%4</b></td><td><b>%5</b></td></tr>")
.arg(STR_TR_Brand)
@ -953,10 +959,10 @@ QString Statistics::GenerateRXChanges()
}
QString html = "<div align=center><br/>";
html += QString("<table class=curved style=\"page-break-before:always;\" "+table_width+" width=100%>");
QString html = "<div align=center><br>";
html += QString("<table class=curved style='page-break-before:always' " + table_width+">");
html += "<thead>";
html += "<tr bgcolor='"+heading_color+"'><th colspan=9 align=center><font size=+2>" + tr("Changes to Machine Settings") + "</font></th></tr>";
html += "<tr bgcolor='"+heading_color+"'><th colspan=9 align=center><font size='+2'>" + tr("Changes to Machine Settings") + "</font></th></tr>";
// QString extratxt;
@ -972,17 +978,17 @@ QString Statistics::GenerateRXChanges()
hdrlist.push_back(STR_TR_Mode);
hdrlist.push_back(tr("Pressure Settings"));
html+="<tr>\n";
html+="<tr>";
for (int i=0; i < hdrlist.size(); ++i) {
html+=QString(" <th align=left><b>%1</b></th>\n").arg(hdrlist.at(i));
html+=QString(" <th align=left><b>%1</b></th>").arg(hdrlist.at(i));
}
html+="</tr>\n";
html+="</tr>";
html += "</thead>";
// html += "<tfoot>";
// html += "<tr><td colspan=10 align=center>";
// html += QString("<i>") +
// tr("Efficacy highlighting ignores prescription settings with less than %1 days of recorded data.").
// arg(rxthresh) + QString("</i><br/>");
// arg(rxthresh) + QString("</i><br>");
// html += "</td></tr>";
// html += "</tfoot>";
@ -1042,8 +1048,8 @@ QString Statistics::GenerateRXChanges()
QString Statistics::htmlNoData()
{
QString html = "<div align=center>";
html += QString( "<p><font size=\"+3\"><br />" + tr("No data found?!?") + "</font></p>"+
"<p><img src='qrc:/icons/logo-lm.png' width=\"100\" height=\"100\"></p>"
html += QString( "<p><font size=\"+3\"><br>" + tr("No data found?!?") + "</font></p>"+
"<p><img src='qrc:/icons/logo-lm.png' alt='logo' width='100' height='100'></p>"
"<p><i>"+tr("Oscar has no data to report :(")+"</i></p>");
return html;
}
@ -1104,7 +1110,7 @@ QString Statistics::GenerateCPAPUsage()
// Prepare top of table
html += "<div align=center>";
html += "<table class=curved width="+table_width+">";
html += "<table class=curved "+table_width+">";
// Compute number of monthly periods for a monthly rather than standard time distribution
int number_periods = 0;
@ -1176,7 +1182,7 @@ QString Statistics::GenerateCPAPUsage()
int days = p_profile->countDays(row.type, first, last);
skipsection = (days == 0);
if (days > 0) {
html+=QString("<tr bgcolor='%1'><th colspan=%2 align=center><font size=+2>%3</font></th></tr>\n").
html+=QString("<tr bgcolor='%1'><th colspan=%2 align=center><font size='+2'>%3</font></th></tr>").
arg(heading_color).arg(periods.size()+1).arg(row.src);
}
continue;
@ -1192,11 +1198,11 @@ QString Statistics::GenerateCPAPUsage()
} else if (row.calc == SC_COMPLIANCE) {
name = QString(row.src).arg(p_profile->cpap->m_complianceHours);
} else if (row.calc == SC_COLUMNHEADERS) {
html += QString("<tr><td><b>%1</b></td>\n").arg(tr("Details"));
html += QString("<tr><td><b>%1</b></td>").arg(tr("Details"));
for (int j=0; j < periods.size(); j++) {
html += QString("<td onmouseover='ChangeColor(this, \"#eeeeee\");' onmouseout='ChangeColor(this, \"#ffffff\");' onclick='alert(\"overview=%1,%2\");'><b>%3</b></td>\n").arg(periods.at(j).start.toString(Qt::ISODate)).arg(periods.at(j).end.toString(Qt::ISODate)).arg(periods.at(j).header);
html += QString("<td onmouseover='ChangeColor(this, \"#eeeeee\");' onmouseout='ChangeColor(this, \"#ffffff\");' onclick='alert(\"overview=%1,%2\");'><b>%3</b></td>").arg(periods.at(j).start.toString(Qt::ISODate)).arg(periods.at(j).end.toString(Qt::ISODate)).arg(periods.at(j).header);
}
html += "</tr>\n";
html += "</tr>";
continue;
} else if (row.calc == SC_DAYS) {
QDate first=p_profile->FirstGoodDay(row.type);
@ -1205,16 +1211,16 @@ QString Statistics::GenerateCPAPUsage()
int value=p_profile->countDays(row.type, first, last);
if (value == 0) {
html+=QString("<tr><td colspan=%1 align=center>%2</td></tr>\n").arg(periods.size()+1).
html+=QString("<tr><td colspan=%1 align=center>%2</td></tr>").arg(periods.size()+1).
arg(tr("No %1 data available.").arg(machine));
} else if (value == 1) {
html+=QString("<tr><td colspan=%1 align=center>%2</td></tr>\n").arg(periods.size()+1).
html+=QString("<tr><td colspan=%1 align=center>%2</td></tr>").arg(periods.size()+1).
arg(tr("%1 day of %2 Data on %3")
.arg(value)
.arg(machine)
.arg(last.toString(MedDateFormat)));
} else {
html+=QString("<tr><td colspan=%1 align=center>%2</td></tr>\n").arg(periods.size()+1).
html+=QString("<tr><td colspan=%1 align=center>%2</td></tr>").arg(periods.size()+1).
arg(tr("%1 days of %2 Data, between %3 and %4")
.arg(value)
.arg(machine)
@ -1223,7 +1229,7 @@ QString Statistics::GenerateCPAPUsage()
}
continue;
} else if (row.calc == SC_SUBHEADING) { // subheading..
html+=QString("<tr bgcolor='%1'><td colspan=%2 align=center><b>%3</b></td></tr>\n").
html+=QString("<tr bgcolor='%1'><td colspan=%2 align=center><b>%3</b></td></tr>").
arg(subheading_color).arg(periods.size()+1).arg(row.src);
continue;
} else if (row.calc == SC_UNDEFINED) {
@ -1236,17 +1242,18 @@ QString Statistics::GenerateCPAPUsage()
name = calcnames[row.calc].arg(schema::channel[id].fullname());
}
QString line;
line += QString("<tr class=datarow><td width=24%>%1</td>").arg(name);
int np = periods.size();
int width;
int dataWidth = 14;
int headerWidth = 30;
if (p_profile->general->statReportMode() == STAT_MODE_MONTHLY) {
dataWidth = 6;
headerWidth = 22;
}
line += QString("<tr class=datarow><td width='%1%'>%2</td>").arg(headerWidth).arg(name);
for (int j=0; j < np; j++) {
if (p_profile->general->statReportMode() == STAT_MODE_MONTHLY) {
width = j < np-1 ? 6 : 100 - (24 + 6*(np-1));
} else {
width = 76/np;
}
line += QString("<td width=%1%>").arg(width);
width = j < np-1 ? dataWidth : 100 - (headerWidth + dataWidth*(np-1));
line += QString("<td width='%1%'>").arg(width);
if (!periods.at(j).header.isEmpty()) {
line += row.value(periods.at(j).start, periods.at(j).end);
} else {
@ -1255,7 +1262,7 @@ QString Statistics::GenerateCPAPUsage()
line += "</td>";
}
html += line;
html += "</tr>\n";
html += "</tr>";
}
html += "</table>";
@ -1305,7 +1312,11 @@ void Statistics::printReport(QWidget * parent) {
printer.setOrientation(QPrinter::Portrait);
printer.setFullPage(false); // Print only on printable area of page and not in non-printable margins
printer.setNumCopies(1);
printer.setPageMargins(10, 10, 10, 10, QPrinter::Millimeter);
QMarginsF minMargins = printer.pageLayout().margins(QPageLayout::Millimeter);
printer.setPageMargins(fmax(10,minMargins.left()), fmax(10,minMargins.top()), fmax(10,minMargins.right()), fmax(12,minMargins.bottom()), QPrinter::Millimeter);
QMarginsF setMargins = printer.pageLayout().margins(QPageLayout::Millimeter);
qDebug () << "Min margins" << minMargins << "Set margins" << setMargins << "millimeters";
// Show print dialog to user and allow them to change settings as desired
QPrintDialog pdlg(&printer, parent);
@ -1313,18 +1324,32 @@ void Statistics::printReport(QWidget * parent) {
if (pdlg.exec() == QPrintDialog::Accepted) {
QTextDocument doc;
QSizeF printArea = printer.pageRect().size();
doc.setPageSize(printArea); // Set document to print area, removing default 2cm margins
qDebug() << "print area" << printArea;
QSizeF printArea = printer.pageRect(QPrinter::Point).size();
QSizeF originalPrintArea = printArea;
printArea.setWidth(printArea.width()*2); // scale up for better font appearance
printArea.setHeight(printArea.height()*2);
doc.setPageSize(printArea); // Set document to print area, in pixels, removing default 2cm margins
// QFont font = doc.defaultFont();
qDebug() << "print area (points)" << originalPrintArea << "Enlarged print area" << printArea << "paper size" << printer.paperRect(QPrinter::Point).size();
// Determine appropriate font and font size
QFont font = QFont("Helvetica");
font.setPointSize(10 * (printArea.width()/1200.0)); // Scale the font
float fontScalar = 12;
float printWidth = printArea.width();
if (printWidth > 1000)
printWidth = 1000 + (printWidth - 1000) * 0.90; // Increase font for wide paper (landscape), but not linearly
float pointSize = (printWidth / fontScalar) / 10.0;
font.setPointSize(round(pointSize)); // Scale the font
doc.setDefaultFont(font);
qDebug() << "Printer font set to" << font << "and printer default font is now" << doc.defaultFont();
qDebug() << "Enlarged printer font" << font << "printer default font set" << doc.defaultFont();
doc.setHtml(htmlReportHeaderPrint + htmlUsage + htmlMachineSettings + htmlMachines + htmlReportFooter);
// Dump HTML for use with HTML4 validator
// QString html = htmlReportHeaderPrint + htmlUsage + htmlMachineSettings + htmlMachines + htmlReportFooter;
// qDebug() << "Html:" << html;
doc.print(&printer);
}
}
@ -1336,7 +1361,9 @@ QString Statistics::UpdateRecordsBox()
"p,a,td,body { font-size: " + QString::number(QApplication::font().pointSize() + 2) + "px; }"
"a:link,a:visited { color: inherit; text-decoration: none; }" //font-weight: normal;
"a:hover { background-color: inherit; color: white; text-decoration:none; font-weight: bold; }"
"</style></head><body>";
"</style>"
"<title>Machine Statistics Panel</title>"
"</head><body>";
Machine * cpap = p_profile->GetMachine(MT_CPAP);
if (cpap) {
@ -1351,10 +1378,10 @@ QString Statistics::UpdateRecordsBox()
float comperc = (100.0 / float(totaldays)) * float(compliant);
html += "<b>"+tr("CPAP Usage")+"</b><br/>";
html += tr("Days Used: %1").arg(totaldays) + "<br/>";
html += tr("Low Use Days: %1").arg(totaldays - compliant) + "<br/>";
html += tr("Compliance: %1%").arg(comperc, 0, 'f', 1) + "<br/>";
html += "<b>"+tr("CPAP Usage")+"</b><br>";
html += tr("Days Used: %1").arg(totaldays) + "<br>";
html += tr("Low Use Days: %1").arg(totaldays - compliant) + "<br>";
html += tr("Compliance: %1%").arg(comperc, 0, 'f', 1) + "<br>";
/////////////////////////////////////////////////////////////////////////////////////
/// AHI Records
@ -1378,34 +1405,34 @@ QString Statistics::UpdateRecordsBox()
}
ahilist.insert(ahi, date);
}
html += tr("Days AHI of 5 or greater: %1").arg(baddays) + "<br/><br/>";
html += tr("Days AHI of 5 or greater: %1").arg(baddays) + "<br><br>";
if (ahilist.size() > (show_records * 2)) {
it = ahilist.begin();
it_end = ahilist.end();
html += "<b>"+tr("Best AHI")+"</b><br/>";
html += "<b>"+tr("Best AHI")+"</b><br>";
for (int i=0; (i<show_records) && (it != it_end); ++i, ++it) {
html += QString("<a href='daily=%1'>").arg(it.value().toString(Qt::ISODate))
+tr("Date: %1 AHI: %2").arg(it.value().toString(Qt::SystemLocaleShortDate)).arg(it.key(), 0, 'f', 2) + "</a><br/>";
+tr("Date: %1 AHI: %2").arg(it.value().toString(Qt::SystemLocaleShortDate)).arg(it.key(), 0, 'f', 2) + "</a><br>";
}
html += "<br/>";
html += "<br>";
html += "<b>"+tr("Worst AHI")+"</b><br/>";
html += "<b>"+tr("Worst AHI")+"</b><br>";
it = ahilist.end() - 1;
it_end = ahilist.begin();
for (int i=0; (i<show_records) && (it != it_end); ++i, --it) {
html += QString("<a href='daily=%1'>").arg(it.value().toString(Qt::ISODate))
+tr("Date: %1 AHI: %2").arg(it.value().toString(Qt::SystemLocaleShortDate)).arg(it.key(), 0, 'f', 2) + "</a><br/>";
+tr("Date: %1 AHI: %2").arg(it.value().toString(Qt::SystemLocaleShortDate)).arg(it.key(), 0, 'f', 2) + "</a><br>";
}
html += "<br/>";
html += "<br>";
}
/////////////////////////////////////////////////////////////////////////////////////
@ -1432,32 +1459,32 @@ QString Statistics::UpdateRecordsBox()
it = ahilist.begin();
it_end = ahilist.end();
html += "<b>"+tr("Best Flow Limitation")+"</b><br/>";
html += "<b>"+tr("Best Flow Limitation")+"</b><br>";
for (int i=0; (i<show_records) && (it != it_end); ++i, ++it) {
html += QString("<a href='daily=%1'>").arg(it.value().toString(Qt::ISODate))
+tr("Date: %1 FL: %2").arg(it.value().toString(Qt::SystemLocaleShortDate)).arg(it.key(), 0, 'f', 2) + "</a><br/>";
+tr("Date: %1 FL: %2").arg(it.value().toString(Qt::SystemLocaleShortDate)).arg(it.key(), 0, 'f', 2) + "</a><br>";
}
html += "<br/>";
html += "<br>";
html += "<b>"+tr("Worst Flow Limtation")+"</b><br/>";
html += "<b>"+tr("Worst Flow Limtation")+"</b><br>";
it = ahilist.end() - 1;
it_end = ahilist.begin();
for (int i=0; (i<show_records) && (it != it_end); ++i, --it) {
if (it.key() > 0) {
html += QString("<a href='daily=%1'>").arg(it.value().toString(Qt::ISODate))
+tr("Date: %1 FL: %2").arg(it.value().toString(Qt::SystemLocaleShortDate)).arg(it.key(), 0, 'f', 2) + "</a><br/>";
+tr("Date: %1 FL: %2").arg(it.value().toString(Qt::SystemLocaleShortDate)).arg(it.key(), 0, 'f', 2) + "</a><br>";
cnt++;
}
}
if (cnt == 0) {
html+= "<i>"+tr("No Flow Limitation on record")+"</i><br/>";
html+= "<i>"+tr("No Flow Limitation on record")+"</i><br>";
}
html += "<br/>";
html += "<br>";
}
/////////////////////////////////////////////////////////////////////////////////////
@ -1475,7 +1502,7 @@ QString Statistics::UpdateRecordsBox()
cnt = 0;
if (ahilist.size() > (show_records * 2)) {
html += "<b>"+tr("Worst Large Leaks")+"</b><br/>";
html += "<b>"+tr("Worst Large Leaks")+"</b><br>";
it = ahilist.end() - 1;
it_end = ahilist.begin();
@ -1483,16 +1510,16 @@ QString Statistics::UpdateRecordsBox()
for (int i=0; (i<show_records) && (it != it_end); ++i, --it) {
if (it.key() > 0) {
html += QString("<a href='daily=%1'>").arg(it.value().toString(Qt::ISODate))
+tr("Date: %1 Leak: %2%").arg(it.value().toString(Qt::SystemLocaleShortDate)).arg(it.key(), 0, 'f', 2) + "</a><br/>";
+tr("Date: %1 Leak: %2%").arg(it.value().toString(Qt::SystemLocaleShortDate)).arg(it.key(), 0, 'f', 2) + "</a><br>";
cnt++;
}
}
if (cnt == 0) {
html+= "<i>"+tr("No Large Leaks on record")+"</i><br/>";
html+= "<i>"+tr("No Large Leaks on record")+"</i><br>";
}
html += "<br/>";
html += "<br>";
}
@ -1512,7 +1539,7 @@ QString Statistics::UpdateRecordsBox()
}
if (ahilist.size() > (show_records * 2)) {
html += "<b>"+tr("Worst CSR")+"</b><br/>";
html += "<b>"+tr("Worst CSR")+"</b><br>";
it = ahilist.end() - 1;
it_end = ahilist.begin();
@ -1520,15 +1547,15 @@ QString Statistics::UpdateRecordsBox()
if (it.key() > 0) {
html += QString("<a href='daily=%1'>").arg(it.value().toString(Qt::ISODate))
+tr("Date: %1 CSR: %2%").arg(it.value().toString(Qt::SystemLocaleShortDate)).arg(it.key(), 0, 'f', 2) + "</a><br/>";
+tr("Date: %1 CSR: %2%").arg(it.value().toString(Qt::SystemLocaleShortDate)).arg(it.key(), 0, 'f', 2) + "</a><br>";
cnt++;
}
}
if (cnt == 0) {
html+= "<i>"+tr("No CSR on record")+"</i><br/>";
html+= "<i>"+tr("No CSR on record")+"</i><br>";
}
html += "<br/>";
html += "<br>";
}
}
if (p_profile->hasChannel(CPAP_PB)) {
@ -1542,7 +1569,7 @@ QString Statistics::UpdateRecordsBox()
}
if (ahilist.size() > (show_records * 2)) {
html += "<b>"+tr("Worst PB")+"</b><br/>";
html += "<b>"+tr("Worst PB")+"</b><br>";
it = ahilist.end() - 1;
it_end = ahilist.begin();
@ -1550,22 +1577,22 @@ QString Statistics::UpdateRecordsBox()
if (it.key() > 0) {
html += QString("<a href='daily=%1'>").arg(it.value().toString(Qt::ISODate))
+tr("Date: %1 PB: %2%").arg(it.value().toString(Qt::SystemLocaleShortDate)).arg(it.key(), 0, 'f', 2) + "</a><br/>";
+tr("Date: %1 PB: %2%").arg(it.value().toString(Qt::SystemLocaleShortDate)).arg(it.key(), 0, 'f', 2) + "</a><br>";
cnt++;
}
}
if (cnt == 0) {
html+= "<i>"+tr("No PB on record")+"</i><br/>";
html+= "<i>"+tr("No PB on record")+"</i><br>";
}
html += "<br/>";
html += "<br>";
}
}
} else {
html += "<br/><b>"+tr("Want more information?")+"</b><br/>";
html += "<i>"+tr("OSCAR needs all summary data loaded to calculate best/worst data for individual days.")+"</i><br/><br/>";
html += "<i>"+tr("Please enable Pre-Load Summaries checkbox in preferences to make sure this data is available.")+"</i><br/><br/>";
html += "<br><b>"+tr("Want more information?")+"</b><br>";
html += "<i>"+tr("OSCAR needs all summary data loaded to calculate best/worst data for individual days.")+"</i><br><br>";
html += "<i>"+tr("Please enable Pre-Load Summaries checkbox in preferences to make sure this data is available.")+"</i><br><br>";
}
@ -1585,29 +1612,29 @@ QString Statistics::UpdateRecordsBox()
if (list.size() >= 2) {
html += "<b>"+tr("Best RX Setting")+"</b><br/>";
html += "<b>"+tr("Best RX Setting")+"</b><br>";
const RXItem & rxbest = *list.at(0);
html += QString("<a href='overview=%1,%2'>").arg(rxbest.start.toString(Qt::ISODate)).arg(rxbest.end.toString(Qt::ISODate)) +
tr("Date: %1 - %2").arg(rxbest.start.toString(Qt::SystemLocaleShortDate)).arg(rxbest.end.toString(Qt::SystemLocaleShortDate)) + "</a><br/>";
html += QString("%1").arg(rxbest.machine->model()) + "<br/>";
html += QString("Serial: %1").arg(rxbest.machine->serial()) + "<br/>";
html += tr("AHI: %1").arg(double(rxbest.ahi) / rxbest.hours, 0, 'f', 2) + "<br/>";
html += tr("Total Hours: %1").arg(rxbest.hours, 0, 'f', 2) + "<br/>";
html += QString("%1").arg(rxbest.pressure) + "<br/>";
html += QString("%1").arg(formatRelief(rxbest.relief)) + "<br/>";
html += "<br/>";
tr("Date: %1 - %2").arg(rxbest.start.toString(Qt::SystemLocaleShortDate)).arg(rxbest.end.toString(Qt::SystemLocaleShortDate)) + "</a><br>";
html += QString("%1").arg(rxbest.machine->model()) + "<br>";
html += QString("Serial: %1").arg(rxbest.machine->serial()) + "<br>";
html += tr("AHI: %1").arg(double(rxbest.ahi) / rxbest.hours, 0, 'f', 2) + "<br>";
html += tr("Total Hours: %1").arg(rxbest.hours, 0, 'f', 2) + "<br>";
html += QString("%1").arg(rxbest.pressure) + "<br>";
html += QString("%1").arg(formatRelief(rxbest.relief)) + "<br>";
html += "<br>";
html += "<b>"+tr("Worst RX Setting")+"</b><br/>";
html += "<b>"+tr("Worst RX Setting")+"</b><br>";
const RXItem & rxworst = *list.at(list.size() -1);
html += QString("<a href='overview=%1,%2'>").arg(rxworst.start.toString(Qt::ISODate)).arg(rxworst.end.toString(Qt::ISODate)) +
tr("Date: %1 - %2").arg(rxworst.start.toString(Qt::SystemLocaleShortDate)).arg(rxworst.end.toString(Qt::SystemLocaleShortDate)) + "</a><br/>";
html += QString("%1").arg(rxworst.machine->model()) + "<br/>";
html += QString("Serial: %1").arg(rxworst.machine->serial()) + "<br/>";
html += tr("AHI: %1").arg(double(rxworst.ahi) / rxworst.hours, 0, 'f', 2) + "<br/>";
html += tr("Total Hours: %1").arg(rxworst.hours, 0, 'f', 2) + "<br/>";
tr("Date: %1 - %2").arg(rxworst.start.toString(Qt::SystemLocaleShortDate)).arg(rxworst.end.toString(Qt::SystemLocaleShortDate)) + "</a><br>";
html += QString("%1").arg(rxworst.machine->model()) + "<br>";
html += QString("Serial: %1").arg(rxworst.machine->serial()) + "<br>";
html += tr("AHI: %1").arg(double(rxworst.ahi) / rxworst.hours, 0, 'f', 2) + "<br>";
html += tr("Total Hours: %1").arg(rxworst.hours, 0, 'f', 2) + "<br>";
html += QString("%1").arg(rxworst.pressure) + "<br/>";
html += QString("%1").arg(formatRelief(rxworst.relief)) + "<br/>";
html += QString("%1").arg(rxworst.pressure) + "<br>";
html += QString("%1").arg(formatRelief(rxworst.relief)) + "<br>";
}
}

View File

@ -178,7 +178,7 @@ QString Welcome::GenerateCPAPHTML()
int daysto = date.daysTo(QDate::currentDate());
QString daystring;
if (daysto == 1) daystring += tr("last night");
else if (daysto == 2) daystring += tr("yesterday");
else if (daysto == 2) daystring += tr("1 day ago");
else daystring += tr("%2 days ago").arg(date.daysTo(QDate::currentDate()));
html += tr("was %1 (on %2)").arg(daystring).arg(date.toString(Qt::SystemLocaleLongDate)) + "<br/>";
@ -339,8 +339,8 @@ QString Welcome::GenerateOxiHTML()
html += "<p>"+QObject::tr("Most recent Oximetry data: <a onclick='alert(\"daily=%2\");'>%1</a> ").arg(oxidate.toString(Qt::SystemLocaleLongDate)).arg(oxidate.toString(Qt::ISODate));
if (daysto == 1) html += QObject::tr("(last night)");
else if (daysto == 2) html += QObject::tr("(yesterday)");
else html += QObject::tr("(%2 day ago)").arg(oxidate.daysTo(QDate::currentDate()));
else if (daysto == 2) html += QObject::tr("(1 day ago)");
else html += QObject::tr("(%2 days ago)").arg(oxidate.daysTo(QDate::currentDate()));
html+="</p>";
ui->oxiIcon->setVisible(true);
ui->oxiInfo->setVisible(true);