• Nie Znaleziono Wyników

Dziennik tętna i ciśnienia krwi dla systemu Android

N/A
N/A
Protected

Academic year: 2022

Share "Dziennik tętna i ciśnienia krwi dla systemu Android"

Copied!
8
0
0

Pełen tekst

(1)

1

Dziennik tętna i ciśnienia krwi dla systemu Android

Kajetan Suchański1, Krzysztof Sołtysiak, Klaudia Rogus, Justyna Rak

Streszczenie

Tematem niniejszej pracy są różne mechanizmy i biblioteki pomocne w budowaniu aplikacji na system Android, na przykładzie podręcznego dziennika tętna oraz ciśnienia krwi o nazwie Moje Ciśnienie. Główną przesłanką do napisania tego programu był rosnący problem współczesnego świata, jakim jest nadciśnienie, biorący początek w niezdrowym trybie życia. Drugim powodem jest nieintuicyjność dużej części podobnych projektów dostępnych na rynku. Program ocenia wyniki pomiarów według przyjętych norm medycznych i informuje użytkowników o ewentualnych nieprawidłowościach. Aplikacja pozwala także na wgląd do wykresów stworzonych na podstawie pomiarów z podanego przedziału czasowego, a także na wyeksportowanie tych wyników do pliku PDF w celu ich wydrukowania i przekazania lekarzowi. Wszystkie wpisy do dziennika zapisywane są w lokalnej bazie danych, z którą program komunikuje się za pośrednictwem SQLite. W związku z korzystaniem z biblioteki, udostępnionej na licencji AGPL, kod programu jest w całości upubliczniony.

1 Wstęp

Android jest systemem operacyjnym opartym o jądro Linuxa, przeznaczonym głównie dla urządzeń mobilnych. Za jego rozwój odpowiedzialne jest konsorcjum Open Handset Alliance, w którego skład wchodzi ponad 70 firm związanych z branżą telekomunikacyjną. Zaletami Androida są między innymi otwarty kod źródłowy i duża popularność, co przekłada się na łatwiejsze dotarcie do potencjalnych użytkowników.

Na chwilę obecną, ze sklepów z aplikacjami dla tego systemu korzysta ponad miliard osób. [1]

Przedstawiona w niniejszym artykule aplikacja – Moje Ciśnienie – została stworzona właśnie na platformę Android i jest rozpowszechniana poprzez sklep Google Play.

Obecnie smartfony i tablety towarzyszą ludziom na każdym kroku – zastępują tradycyjne kalendarze, karteczki z notatkami, czy książki. Program będący przedmiotem tego artykułu ma być zastępstwem dla papierowego dziennika z pomiarami ciśnienia.

Oferuje on między innymi zapisywanie wyników, tworzenie kont użytkowników i wyświetlanie statystyk.

Dzięki wykorzystaniu specyfiki urządzeń mobilnych, użytkownik może w łatwy i wygodny sposób kontrolować stan swojego zdrowia, oraz w razie potrzeby przedstawić wyniki pomiarów lekarzowi.

(2)

2

2 Normy medyczne

Aplikacja Moje Ciśnienie posiada zaimplementowaną funkcję oceny prawidłowości wyników w odniesieniu do obecnych norm medycznych. Fakt posłużenia się przyjętymi standardami i wcześniejszą konsultacją z osobą o medycznym wykształceniu nie oznacza jednak, że wyniki zostaną zawsze prawidłowo zinterpretowane, gdyż aplikacja nie bierze pod uwagę żadnych danych środowiskowych i tym samym nie może zastąpić wizyty u lekarza. Aby pomiar był wiarygodny, powinien zostać wykonany w odpowiedni sposób, o czym informuje użytkownika załączona do aplikacji instrukcja.

2.1 Ciśnienie krwi

Sposób oceniania ciśnienia krwi przez program został przedstawiony w tabeli 1.

Tabela 1. Normy dotyczące wartości ciśnienia krwi

Wartość ciśnienia skurczowego [mmHg]

Wartość ciśnienia

rozkurczowego [mmHg] Ocena

< 90 < 60 Niskie

90 – 129 60 – 84 Prawidłowe

130 – 139 85 – 89 Podwyższone

≥ 140 ≥ 90 Wysokie (nadciśnienie)

Dodatkowo, jeśli ciśnienie skurczowe jest większe bądź równe 140mmHg, a jednocześnie ciśnienie rozkurczowe jest mniejsze od 90mmHg, wtedy aplikacja zwraca informację o wystąpieniu tzw. ciśnienia izolowanego.

2.2 Tętno

Prawidłowe zakresy wartości tętna różnią się w zależności od wieku. W tabeli 2 pokazano, jak wyniki są interpretowane przez aplikację. Moje Ciśnienie pozwala na właściwą klasyfikację pulsu co najmniej rocznego dziecka. Wynika to z prędkości zmian zakresu prawidłowego tętna w pierwszych miesiącach życia i, co za tym idzie, trudnością w wiarygodnej jego ocenie bez znajomości kontekstu.

Tabela 2. Normy dotyczące wartości tętna w zależności od wieku

1 – 5 lat 6 – 11 lat 12 – 16 lat Powyżej 17 lat Ocena

< 85 < 70 < 60 < 60 Niskie (bradykardia)

85 – 150 70 – 135 60 – 120 60 – 100 Prawidłowe

> 150 > 135 > 120 > 100 Wysokie (tachykardia)

3 Przechowywanie danych w pamięci urządzenia

Projekt aplikacji wymagał możliwości zapisywania dwóch rodzajów danych.

Najważniejszymi z nich są wpisy do dziennika pomiarów, bez których program nie mógłby prawidłowo funkcjonować. Drugim rodzajem zapisywanych informacji są personalia użytkowników oraz ustawienia aplikacji, np. opcje dostosowania wyglądu i zawartości pliku wynikowego PDF.

(3)

3

3.1 Baza danych SQL

Do zapisywania zawartości dziennika oraz listy użytkowników wykorzystano prywatną bazę danych SQL, z którą program komunikuje się za pośrednictwem systemu zarządzania SQLite. W celu dostosowania bazy do wymagań aplikacji, stworzono klasę we wzorcu projektowym singleton[2] przechowującą nazwy tabel, kolumn i ustawień globalnych związanych z zapytaniami oraz metody ułatwiające ich wysyłanie.

Podstawowymi metodami służącymi do komunikacji z bazą danych są:

 SQLiteDatabase#execSQL(String) – wykonuje polecenia niezwracające żadnych danych, np. tworzenie tabeli czy usuwanie wierszy;

 SQLiteDatabase#rawQuery(String, String[]) – wysyła do bazy podane zapytanie (wraz z parametrami) i zwraca obiekt klasy Cursor umożliwiający dostęp do wszystkich wierszy będących odpowiedzią na zapytanie.

Metody pomocnicze do komunikacji z bazą:

 SQLiteDatabase#insert(String, String, ContentValues) – dodaje rekord do tabeli o podanej nazwie;

 SQLiteDatabase#update(String, ContentValues, String, String[]) – ułatwia aktualizację zawartości pól;

 SQLiteDatabase#delete(String, String, String[]) – usuwa wszystkie rekordy spełniające podany w argumencie warunek.

Do usunięcia wszystkich wpisów powiązanych z użytkownikiem aplikacja korzysta z tzw. transakcji, które znacznie przyspieszają wykonywanie operacji na wielu wierszach jednocześnie, oraz zwiększają bezpieczeństwo, jako że sprawiają, iż sekwencja poleceń jest traktowana jak atomowa instrukcja i zatwierdzana jest w całości, lub wcale.

Idiom transakcji w Javie:

db.beginTransaction();

try { //...

db.setTransactionSuccessful();

} finally {

db.endTransaction();

}

3.2 Plik ustawień

Dane wprowadzone przez użytkownika do aplikacji mogą być przydatne w przyszłości, dlatego Moje Ciśnienie wykorzystuje mechanizm znany jako shared preferences (udostępnione preferencje). Dzięki niemu w bardzo prosty sposób można zachować m. in. podstawowe dane wprowadzone przez użytkownika wyrażone przez typy proste (boolean, float, int, long), czy ciąg znaków. Co najistotniejsze – wszystkie dane są przechowywane nawet po ponownym uruchomieniu aplikacji, a dostęp do tych danych mają wszystkie komponenty mogące odwołać się do dowolnego obiektu klasy dziedziczącej po Context.

Aplikacja Moje Ciśnienie wykorzystuje SharedPreferences w pomocniczej klasie Settings. Aby móc odwoływać się do metod interfejsu SharedPreferences niezbędne jest odebranie zawartości zapisanych danych poprzez metodę Context#getSharedPreferences(String, int).

(4)

4

Zapisywanie danych do pliku ustawień ogranicza się do:

 Otwarcia edytora metodą SharedPreferences#edit();

 wprowadzenia danych metodami interfejsu Editor zaczynającymi się od put;

 zapisania danych synchronicznie, metodą Editor#commit(), lub asynchronicznie, metodą Editor#apply().

Odczyt danych sprowadza się jedynie do skorzystania z metod interfejsu SharedPreferences zaczynających się od get.

Dzięki utworzeniu klasy pomocniczej Settings, po odebraniu instancji owej klasy (Settings.getInstance()) można bezproblemowo odwołać się do wszystkich potrzebnych do zapisywania i odczytywania ustawień metod.

4 Eksportowanie tabeli do pliku PDF

Użytkownikowi została udostępniona możliwość wyeksportowania zapisanych pomiarów z podanego zakresu czasowego, aby w łatwy sposób można je było wydrukować i przekazać lekarzowi. Aplikacja do tego celu wykorzystuje upowszechnioną na licencji AGPL bibliotekę iText[3]. Jest ona zaprojektowana we w pełni obiektowy sposób, dzięki czemu jest przejrzysta, intuicyjna i estetyczna.

4.1 Tworzenie dokumentu i przygotowanie strumienia wyjściowego Tworzenie dokumentu PDF sprowadza się do wywołania konstruktora klasy Document i przekazania jako argumenty rozmiaru (np. stałej PageSize.A4) oraz opcjonalnie wielkości marginesów. Następnie należy połączyć utworzony dokument i strumień wyjściowy (OutputStream lub klasa po nim dziedzicząca) w klasie PdfWriter, która automatycznie przekierowuje zmiany dokumentu do pliku wynikowego oraz umożliwia obsługę zdarzeń, np. dodawania nagłówka i stopki do każdej strony.

4.2 Obsługa zdarzeń

Zdarzenia dokumentu są reprezentowane przez interfejs PdfPageEvent. Aby prawidłowo je obsłużyć, należy przekazać instancję klasy implementującej ten interfejs jako argument metody PdfWriter#setPageEvent(PdfPageEvent). Dla ułatwienia tego procesu, twórcy biblioteki stworzyli abstrakcyjną klasę pomocniczą o nazwie PdfPageEventHelper, która definiuje puste ciała metod będących następstwami wystąpienia określonego zdarzenia, i tym samym ułatwia przekazanie do wyżej wspomnianej metody – klasy anonimowej o zaimplementowanych jedynie tych zdarzeniach, które interesują użytkownika biblioteki. Aplikacja Moje Ciśnienie wykorzystuje tylko jedno ze zdarzeń – onEndPage. Jest ono odpowiedzialne za generowanie nagłówka i stopki na każdej ze stron.

4.3 Metadane

Dodanie metadanych do wynikowego pliku PDF można osiągnąć za pośrednictwem różnych metod klasy Document rozpoczynających się od add. Aplikacja korzysta wyłącznie z metody addCreator(String), aby zachować w dokumencie informację o tym, że został wygenerowany przez Moje Ciśnienie.

(5)

5

4.4 Tworzenie i wypełnianie tabeli

Tworzenie tabeli w bibliotece iText zaczyna się od stworzenia obiektu klasy PdfPTable podając w argumentach konstruktora ilość kolumn lub tablicę liczb zmiennoprzecinkowych reprezentujących proporcje między ich szerokościami.

Aby dodać zawartość kolejnej komórki należy skorzystać z przeciążonej metody PdfPTable#addCell, która może przyjmować ciąg znaków surowy (String) lub wystylizowany (Phrase lub PdfPCell), zdjęcie, a nawet inną tabelę. Komórki są automatycznie lokowane od lewej do prawej według kolejności ich dodania, a kiedy nastąpi próba dodania pola o numerze podzielnym przez ilość kolumn, wtedy tworzony jest nowy wiersz.

Ostatnim krokiem przy eksportowaniu zawartości dziennika do pliku PDF jest wywołanie metody add(Element) dla stworzonego wcześniej dokumentu i przekazanie nowo powstałej tabeli. Wcześniejsze powiązanie dokumentu i pliku wynikowego klasą PdfWriter implikuje jego powstanie w tym momencie i tym samym kończy działanie metody odpowiedzialnej za eksportowanie pomiarów.

5 Rysowanie wykresów

Moje Ciśnienie umożliwia wgląd w wykresy sporządzane na podstawie danych z dziennika, dzięki czemu użytkownik może śledzić, w jaki sposób jego tętno i ciśnienie krwi zmieniało się na przestrzeni wybranego zakresu czasu. Program wykorzystuje do tego darmową bibliotekę MPAndroidChart[4], umożliwiającą rysowanie najważniejszych rodzajów wykresów i duże możliwości dostosowywania wyglądu do motywu wizualnego aplikacji.

5.1 Zarządzanie danymi statystycznymi

Projekt zakładał stworzenie trzech zakładek w aktywności statystyk, odpowiednio dla wykresu kołowego podsumowującego wyniki oraz wykresów kołowego i liniowego, osobno dla pomiarów ciśnienia i tętna. W związku z tym należało znaleźć rozwiązanie problemu współdzielenia danych z dziennika, aby urządzenie nie musiało wykonywać nadmiarowych obliczeń i połączeń z bazą, kiedy użytkownik nawigowałby do niewczytanej jeszcze zakładki.

Jako że same połączenia z bazą są często czasochłonne, a ilość koniecznych do przetworzenia danych może być bardzo duża (na przykład, jeśli użytkownik korzystałby z aplikacji przez rok, regularnie dodając trzy wpisy dziennie i zażądał stworzenia wykresu dla wszystkich pomiarów, wiązałoby się to z przetworzeniem ponad tysiąca obiektów), problem należało rozwiązać z pomocą współbieżnego przetwarzania[5].

Rozwiązanie znalazło się w zaprojektowanych do tego klasach StatsData oraz StatsSummary.

5.2 Wykres kołowy

Wykres kołowy jest opisywany przez klasę PieChart, która udostępnia metody manipulacji wyświetlanymi danymi oraz aspektami wizualnymi wykresu jako całości.

Do stworzenia tego wykresu potrzeba przede wszystkim danych reprezentowanych przez klasę PieData. Zawarte są w niej informacje dotyczące wartości poszczególnych wycinków w postaci tablicy (lub listy) liczb zmiennoprzecinkowych oraz przypisanych im identyfikatorom, kolorom i etykietom. Pierwsze trzy są dodatkowo opakowane w klasę PieDataSet, która pozwala również na dostosowanie

(6)

6

wyglądu związanego z samymi danymi. Efekty prawidłowo wygenerowanego wykresu zostały przedstawione na rysunku 1.

5.3 Wykres liniowy

Proces tworzenia liniowego wykresu (LineChart), podobnie do wykresu kołowego wymaga podania opakowanych – w tym przypadku w klasę LineDataSet – danych, które następnie, pod postacią klasy LineData zostaną zinterpretowane i wyświetlone przez mechanizm rysowania. Różnicą jest występowanie dwóch rodzajów etykiet. Poza opisami samych linii, np. Skurczowe i Rozkurczowe (rys. 1), należy także podać nazwy kolejnych punktów osi Y; w Moim Ciśnieniu są to numery dni lub nazwy miesięcy, w zależności od zakresu czasu, który wybrał użytkownik. Co ważne, nie ma konieczności zapewniania wartości dla każdego punktu osi Y. W takim przypadku kolejne wartości zostaną połączone dzięki odpowiedniej funkcji interpolacyjnej.

Program korzysta z domyślnej – interpolacji liniowej, gdyż taki sposób wydaje się bardziej uzasadniony w przypadku łączenia kolejnych wyników pomiarów ciśnienia i tętna, ale dostępny jest także drugi rodzaj interpolacji – sześcienny, łączący punkty zaokrąglonymi liniami. Aby z niego skorzystać należy wywołać metodę LineDataSet#setDrawCubic(boolean).

Rys. 1: Prezentacja kołowego i liniowych wykresów w aplikacji

6 Wygląd

Głównym założeniem przy projektowaniu interfejsu graficznego była jego prostota i intuicyjność dla użytkownika. Aby uzyskać taki efekt zdecydowano się na menu główne w formie dużych, czytelnych ikon (rys. 2). Większość grafik w aplikacji została stworzona zgodnie z obecnie obowiązującymi standardami w projektowaniu – przy użyciu prostych kształtów, bez cieni i gradientów.

(7)

7

Rys. 2: Niektóre z widoków aplikacji. Od lewej: menu główne, wpisy z wybranego dnia, ustawienia.

Grafiki realistyczne zostały wykorzystane jedynie w instrukcji. Dzięki takiemu zabiegowi porady dotyczące pomiaru ciśnienia są przystępniejsze dla użytkownika (rys. 3).

Rys. 3: Przykładowe grafiki wykorzystane w instrukcji

W aplikacji została przewidziana także możliwość personalizacji. Do konta użytkownika zostaje przypisany wybrany przez niego awatar. Na portretach przedstawiono postacie należące do różnych grup wiekowych (rys. 4).

Rys. 4: Dostępne w aplikacji portrety

Wraz z rozwojem aplikacji zostaną wprowadzone inne motywy wizualne, co pozwoli na lepsze dostosowanie aplikacji do preferencji użytkownika.

7 Podsumowanie

Zaprezentowana w artykule aplikacja kierowana jest głównie do osób w średnim i podeszłym wieku, które mają problemy z ciśnieniem, lub chcą je prewencyjnie, na bieżąco kontrolować. Grupa odbiorców warunkowała motyw wizualny, który

(8)

8

zastosowano, kładąc największy nacisk na intuicyjność, przejrzystość i lekkość w odbiorze.

Od strony programowej, skorzystano z wielu ważnych i uniwersalnych funkcjonalności oraz mechanizmów, bez których większość aplikacji na Androida obyć się nie może; należą do nich m. in. bazy danych, narzędzia związane z wielowątkowością, czy zwykłe wczytywanie i zapisywanie plików na nośniku urządzenia. Dzięki upublicznieniu kodu, każdy zainteresowany może sprawdzić, w jaki sposób można zaimplementować wszystkie te funkcjonalności.

Bibliografia

[1] https://www.android.com/intl/pl_pl/everyone/enabling-opportunity/

#tab-panel-worldwide-affordability

[2] Schildt Herbert, Java. Kompendium programisty. Wydanie IX, tłum. Piotr Rajca, wyd. Helion, 2015

[3] http://itextpdf.com/

[4] https://github.com/PhilJay/MPAndroidChart

[5] Göransson Anders, Android. Aplikacje wielowątkowe. Techniki przetwarzania, tłum. Lech Lachowski, wyd. Helion, 2015

Cytaty

Powiązane dokumenty

Jeśli warunek jest prawdziwy, wykonuje działania w danej sekwencji bloków; w przeciwnym razie bloki są ignorowane... Jeśli warunek jest prawdziwy, wykonuje działania w danej

• niedociśnienie (hypotonia} - obniżenie przejściowe, napadowe ciśnienia skurczowego i (lub) rozkurczowego poniżej wartości prawidłowych (zapaść orlo- statyczna)

Badanie prędkości fali tętna (PWV, pulse wave velocity) u 30-letniego mężczyzny; SYS (systolic blood pressure) — przedział war- tości referencyjnych, w których mieści się

W systemie Android N dodano dynamiczny kompilator JIT z profilowaniem kodu dla środowiska ART, który pozwala stale podnosić wydajność aplikacji Android w trakcie ich

Przy wyłączonym zasilaniu naciśnij przycisk „M”, żeby włączyć wy- świetlacz. Po wykonaniu przez urządzenie autotestu, na wyświetla- czu pokazywane są

£quisetum variegatum Skrzyp Zimowy Equisetum hyemafe Skrzyp Łąkowy Equ)setum pratense.. Identyfikacja

Linia przerywana: Przy zaniżeniu ciśnienia w stosunku do zalecanego o 20% temperatura rośnie przy wyższych prędkościach do ponad 120 C. Może to prowadzić do uszkodzenia

Upewnij się, że Twój zegarek Galaxy Watch jest sparowany przez Bluetooth z telefonem Galaxy, który będzie używany do pomiarów ciśnienia krwi.. Jeśli aplikacja Samsung Health