<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="pl-pl">
<link rel="self" type="application/atom+xml" href="https://forum.atnel.pl/feed.php?f=23&amp;t=2885&amp;mode" />

<title>ATNEL tech-forum</title>
<link href="https://forum.atnel.pl/index.php" />
<updated>2020-07-30T10:38:36+01:00</updated>

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=23&amp;t=2885&amp;mode</id>
<entry>
<author><name><![CDATA[Jarecki]]></name></author>
<updated>2020-07-30T10:38:36+01:00</updated>
<published>2020-07-30T10:38:36+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=2885&amp;p=228468#p228468</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=2885&amp;p=228468#p228468"/>
<title type="html"><![CDATA[Re: Kalkulator na ATB+TFT]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=2885&amp;p=228468#p228468"><![CDATA[
Kod tak dobrze napisany że pomimo niewielu komentarzy czyta się go jak dobrą poezję <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /> kawał roboty, obsługa i tworzenie buttonów to normalnie bajka <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /><p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=2511">Jarecki</a> — 30 lip 2020, o 10:38</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Arek1111111111]]></name></author>
<updated>2016-05-25T21:27:11+01:00</updated>
<published>2016-05-25T21:27:11+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=2885&amp;p=161101#p161101</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=2885&amp;p=161101#p161101"/>
<title type="html"><![CDATA[Re: Kalkulator na ATB+TFT]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=2885&amp;p=161101#p161101"><![CDATA[
Próbowałem z podobnymi wyświetlaczami z ssd1963 jednak zawsze jest xpt2046 którego nie bardzo lubie.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=3349">Arek1111111111</a> — 25 maja 2016, o 21:27</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Krauser]]></name></author>
<updated>2016-05-25T21:14:18+01:00</updated>
<published>2016-05-25T21:14:18+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=2885&amp;p=161100#p161100</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=2885&amp;p=161100#p161100"/>
<title type="html"><![CDATA[Re: Kalkulator na ATB+TFT]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=2885&amp;p=161100#p161100"><![CDATA[
Korzystałem z:<br /><!-- m --><a class="postlink" href="http://www.atnel.pl/atb-glcd-tft-konwerter.html" >http://www.atnel.pl/atb-glcd-tft-konwerter.html</a><!-- m --><br /><br />Wyświetlacz w tej chwili nie jest dostępny. Spróbuj dać ogłoszenie. Może komuś już się znudził. Trudniejsza droga to zakup gdzieś czegoś podobnego ze sterownikiem SSD1963 i albo obniżenie napięcia albo konwerter poziomów. Druga sprawa to obsługa układu od panela dotykowego. Poczytaj w GB. Mirek przygotował bardzo dobre biblioteki.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=465">Krauser</a> — 25 maja 2016, o 21:14</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Arek1111111111]]></name></author>
<updated>2016-05-25T15:38:10+01:00</updated>
<published>2016-05-25T15:38:10+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=2885&amp;p=161093#p161093</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=2885&amp;p=161093#p161093"/>
<title type="html"><![CDATA[Re: Kalkulator na ATB+TFT]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=2885&amp;p=161093#p161093"><![CDATA[
Gdzie można kupić taki wyświetlacz z tym kontrolerem panelu dotykowego? Projekt fajny, aż miło popatrzeć, sam chętnie bym się tym pobawił.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=3349">Arek1111111111</a> — 25 maja 2016, o 15:38</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Krauser]]></name></author>
<updated>2016-05-25T14:02:49+01:00</updated>
<published>2016-05-25T14:02:49+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=2885&amp;p=161088#p161088</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=2885&amp;p=161088#p161088"/>
<title type="html"><![CDATA[Re: Kalkulator na ATB+TFT]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=2885&amp;p=161088#p161088"><![CDATA[
<div class="quotetitle"><b>Quote:</b></div><div class="quotecontent"><br />Chodzi o wskaźniki.<br />[syntax=c]char * ptr;[/syntax]<br />Gwiazdka - no właśnie - gdzie ona powinna być? Powinna być przy TYPIE wskaźnika, a nie w połowie drogi między typem a nazwą (otoczona spacjami). Wtedy od razu widać, co to jest. Jakoś tak optycznie lepiej się to czyta.<br />Widać, że ta zmienna to wskaźnik na chara albo że funkcja zwraca wskaźnik na chara. Nie ma niejasności.<br />Czyli prawidłowo:<br />[syntax=c]char* ptr;[/syntax]<br /></div><br /><br />Co w przypadku lokalnej statycznej zmiennej wskaźnikowej?<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=465">Krauser</a> — 25 maja 2016, o 14:02</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Ledes]]></name></author>
<updated>2013-04-17T23:31:57+01:00</updated>
<published>2013-04-17T23:31:57+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=2885&amp;p=34586#p34586</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=2885&amp;p=34586#p34586"/>
<title type="html"><![CDATA[Re: Kalkulator na ATB+TFT]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=2885&amp;p=34586#p34586"><![CDATA[
Możesz mnożyć np. zawsze przez 1000000 i po prostu ucinać po N cyfrach po przecinku zawsze albo nieznaczących zer nie wyświetlać (wyświetlacz 3,4 zamiast 3,400000).<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=355">Ledes</a> — 17 kwi 2013, o 23:31</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Krauser]]></name></author>
<updated>2013-04-17T22:48:59+01:00</updated>
<published>2013-04-17T22:48:59+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=2885&amp;p=34584#p34584</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=2885&amp;p=34584#p34584"/>
<title type="html"><![CDATA[Re: Kalkulator na ATB+TFT]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=2885&amp;p=34584#p34584"><![CDATA[
<div class="quotetitle">Ledes napisał(a):</div><div class="quotecontent"><br />Z czym dokładnie masz problem jeśli chodzi o dzielenie? Bo przecież właśnie to mnożenie przez odwrotność (sam tak napisałeś).<br /></div><br />Odstawmy na chwilę język C. <br />Przykładowo mam liczby x = 10,03 y = -23,302 to działania wykonuję tak:<br />-dodawanie: zamieniam to na int i mam 1003 i -23302 i muszę jeszcze uwzględnić to, że 10,03 ma 2 miejsca po przecinku to dorzucam 0 i mam 10030 + -23302 = -13272 i teraz część całkowita to -13272/1000 (bo mam 3 miejsca po przecinku), a ułamkowa |-13272%1000|, czyli -13,272<br />-odejmowanie: jak wyżej ale najpierw drugiej liczbie zmieniam znak na przeciwny, czyli wynik 33,332<br />-mnożenie: zamieniam to na int i mam 1003 i -23302, pozbywam się znaków i po pomnożeniu mam 23371906 co zamieniam na ułamek dzieląc całkowicie i modulo przez iloczyn 100 * 1000, bo pierwszą tak jakby przy tej zamianie pomnożyłem razy 10^2, a drugą razy 10^3. Znak - to iloczyn znaków i mam wynik -233,71906<br />-dzielenie: zamieniam to na int i mam 1003 i -23302, pozbywam się znaków i mnożę 1 liczbę razy przyjętą dokładność np. * 1000 i otrzymuję 1003000 co dzielę przez 23302 i mam 43 i aby otrzymać część całkowita dzielę przez 10^2 (co wynika z ilości cyfr po przecinku 1 liczby), mnożę (z mianownika przenosi się do licznika) razy 10^3(co wynika z ilości cyfr po przecinku drugiej liczby) i dzielę przez dokładność czyli 1000 i część całkowita wynosi 0, a po przecinku 43. Zatem otrzymuje po ustaleniu znaku jak wyżej wynik -0,43 podczas gdy prawdziwy wynik to -0,43043515578061968929705604669127.<br /><br />Jeśli 10,03 / (-23,302) zastąpić 10,03 * (-0,042914) to wynik jest troszkę dokładniejszy, ale nie dużo, bo nie mnożę razy -0,04291477126426916144536949618059. Tylko jak uzyskać -0,042914 z -23,302  <img src="https://forum.atnel.pl/images/smilies/icon_question.gif" alt=":?:" title="Znak zapytania" />  Można obliczyć na innym kalkulatorze, ale nie o to przecież chodzi.<br />Inny prostszy przykład dzielenia:<br />x = 1 y = 1000 wynik 0,001 <br />ale<br />x = 1 y = 10000 wynik 0 (to wynika z przyjętej dokładności)<br />podczas, gdy spokojnie 1 * 0,0001 = 0,0001<br /><br />Masz jakiś pomysł ? Czy da się pozbyć tego mnożenia razy założoną dokładność ?<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=465">Krauser</a> — 17 kwi 2013, o 22:48</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Ledes]]></name></author>
<updated>2013-04-17T21:48:31+01:00</updated>
<published>2013-04-17T21:48:31+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=2885&amp;p=34578#p34578</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=2885&amp;p=34578#p34578"/>
<title type="html"><![CDATA[Re: Kalkulator na ATB+TFT]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=2885&amp;p=34578#p34578"><![CDATA[
<div class="quotetitle">Krauser napisał(a):</div><div class="quotecontent"><br />1. Bazuję na parsowaniu stringów, bo to pomimo początkowych trudności pozwala operować również na mieszanych danych wprowadzanych z klawiatury. Nikt nie mówił, że to ma być klawiatura numeryczna. Można też wyświetlić klawiaturę ze znakami ASCII i nawet robiłem już takie testy. Wyświetlając po 32 klawisze począwszy od spacji. Co można zrobić w pętli for (nie będzie to klawiatura qwerty)<br /></div><br />Hmmm na tym GLCD 3.5&quot;&quot; to QWERTY chyba mija się z celem. <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /> Za mało miejsca. Wg mnie 20 buttonów to max zakładając wygodę użytkowania i ergonomię GUI. Ale na pewno się da zrobić QWERTY, tylko nie wiem, przewijanie ekranu czy coś.<br /><br /><div class="quotetitle">Krauser napisał(a):</div><div class="quotecontent"><br />3. Plik common.h jak nazwa wskazuje to wspólne definicje dla wielu plików c, a tu nie ma to zastosowania<br /></div><br />Ok, mea culpa. Zwracam honor.<br /><br /><div class="quotetitle">Krauser napisał(a):</div><div class="quotecontent"><br />5. Liczby w kodzie zamiast #define buttonSizeX 32 i #define buttonSpaceX to oczywiście utrudnianie sobie życia<br /></div><br />No i tu się zgadzamy. <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /><br /><br /><div class="quotetitle">Krauser napisał(a):</div><div class="quotecontent"><br />- jak można rozwiązać działania na ułamkach dziesiętnych - i o tym bym podyskutował, bo np. nie znalazłem dobrego sposobu na dzielenie (jest ograniczone do 3 miejsc podczas gdy mnożenie przez odwrotność działa bardzo dobrze)<br /></div><br />Z czym dokładnie masz problem jeśli chodzi o dzielenie? Bo przecież właśnie to mnożenie przez odwrotność (sam tak napisałeś). <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /> <br /><br /><div class="quotetitle">Krauser napisał(a):</div><div class="quotecontent"><br />ale za drobną opłatą chętnie to poprawię<br /></div><br />Haaa, materialista! Przejrzałem Cię! Hyhyhyhyhyhy <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /><p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=355">Ledes</a> — 17 kwi 2013, o 21:48</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Krauser]]></name></author>
<updated>2013-04-17T17:59:22+01:00</updated>
<published>2013-04-17T17:59:22+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=2885&amp;p=34549#p34549</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=2885&amp;p=34549#p34549"/>
<title type="html"><![CDATA[Re: Kalkulator na ATB+TFT]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=2885&amp;p=34549#p34549"><![CDATA[
Dzięki za wszystkie uwagi. Postaram się odnieść do wszystkich. Zatem po kolei:<br />1. Bazuję na parsowaniu stringów, bo to pomimo początkowych trudności pozwala operować również na mieszanych danych wprowadzanych z klawiatury. Nikt nie mówił, że to ma być klawiatura numeryczna. Można też wyświetlić klawiaturę ze znakami ASCII i nawet robiłem już takie testy. Wyświetlając po 32 klawisze począwszy od spacji. Co można zrobić w pętli for (nie będzie to klawiatura qwerty)<br />2. Plik main.c można skrócić przenosząc funkcje odpowiedzialne za działania do plików calc.c i calc.h. Funkcja main moim zdaniem długa nie jest, ale można dodawanie przycisków przenieś do funkcji draw_keyboard();<br />3. Plik common.h jak nazwa wskazuje to wspólne definicje dla wielu plików c, a tu nie ma to zastosowania<br />4. Co do * przy typie wskaźnika to nie przywiązuje do tego wagi, ale stawiałbym przy zmiennej a nie typie, a jeśli jest sam typ to wtedy przy nim:<br />[syntax=c]uint8_t *a, *b, c; //2 wskaźniki i zmienna<br />uint16_t *d;<br />a = &amp;c;<br />b = (uint8_t*)d;[/syntax]<br />5. Liczby w kodzie zamiast #define buttonSizeX 32 i #define buttonSpaceX to oczywiście utrudnianie sobie życia <br />6. Rzutowanie usuwa warning<br />7. Biblioteka to tylko pliki button.c i button.h, a w main jest przykład jej wykorzystania. Cały ten &quot;kalkulator&quot; powstał by pokazać koledze Ledes i innym użytkownikom forum 2 rzeczy:<br />- jak obsługiwać klawiaturę ekranową, bo miał problem z wielokrotnym wypisywaniem na ekran<br />- jak można rozwiązać działania na ułamkach dziesiętnych - i o tym bym podyskutował, bo np. nie znalazłem dobrego sposobu na dzielenie (jest ograniczone do 3 miejsc podczas gdy mnożenie przez odwrotność działa bardzo dobrze)<br />8. Ja tam krytyki się nie boję, bo nikt nie wie kim jestem <img src="https://forum.atnel.pl/images/smilies/icon_lol.gif" alt=":lol:" title="Śmieje się" /> Sam mogę siebie skrytykować, że nie można zmieniać szerokości &quot;ramki&quot; oraz używać czcionki o zmiennej szerokości, ale za drobną opłatą chętnie to poprawię  <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /><p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=465">Krauser</a> — 17 kwi 2013, o 17:59</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Ledes]]></name></author>
<updated>2013-04-17T14:30:58+01:00</updated>
<published>2013-04-17T14:30:58+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=2885&amp;p=34539#p34539</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=2885&amp;p=34539#p34539"/>
<title type="html"><![CDATA[Re: Kalkulator na ATB+TFT]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=2885&amp;p=34539#p34539"><![CDATA[
<div class="quotetitle">mirekk36 napisał(a):</div><div class="quotecontent"><br />No widzisz <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /> jak czasem mogą przeszkadzać nawyki z programowania na PC. Pytając czy tu w takim konkretnym przypadku nie trzeba zwalniać pamięci, wynikałoby że nie do końca jakby (ale może się mylę nie odbierz tego źle), rozumiesz po co się zwalnia pamięć na PC i dlaczego. Więc podpowiem. Dlatego, że program po swoim zakończeniu zwraca sterowanie do nadrzędnego systemu operacyjnego i MUSI po sobie posprzątać. Tu jak się sam już widzę słusznie domyślasz - masz pętlę nieskończoną while(1) i co wychodzisz z niej ? no nie <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /> ... zakończenie pracy programu polega tu na ? ----&gt; na wyłączeniu urządzenia i brutalnym zwolnieniu wszystkich zasobów. Więc z tego punktu widzenia w takiej aplikacji statycznej nie ma czego zwalniać bo jak ? no chyba że zrobiłbyś specjalny button OFF dla wyłączenia urządzenia i programowo procek sam by się uśmiercił wyłączają np zasilanie .... ale i w takim wypadku - po co zwalniać pamięć skoro to ostatnie tchnienie żywota programu ? <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /><br /></div><br />Ok, teraz w pełni rozumiem. Dziękuję.<br /><br /><div class="quotetitle">mirekk36 napisał(a):</div><div class="quotecontent"><br />Zauważ, że tu drążysz (moim zdaniem zupełnie niepotrzebnie temat) .... bo to mi przypomina troszkę pseudo krytykę z elektrody, na zasadzie jak się nie ma do czego doczepić to doczepię się do ...... ... Sorki ale to jest podejście nie na miejscu, warto ew zwrócić uwagę jak ty byś to zrobił i napisał poniżej swoją propozycję, a najlepiej samemu napisać takiego libsa i pokazać ... Dla jednych może być to podejście dydaktyczne (ja tak np myślę) więc dla mnie nie jest to żadna zgroza! zresztą popatrz na inne komentarze - a przykład jaki był ciąg myślenia w trakcie tworzenia kodu, i nie chodzi tu ABSOLUTNIE o to żeby ktoś miał prezentować jakieś MEGA SUPER EXTRA WYPASIONO-DOPIESZCZONE biblioteki bo akurat ty tak oczekujesz? Ja na twoim miejscu byłbym wdzięczny za to co dostałem, i jeśli nie jestem w stanie pokazać jak bym sam to zrobił inaczej, tak wg mnie to nie będę się doczepiał - skoro dla wielu innych jest to przejrzysty kod. I proszę delikatnie o taką postawę na forum w naszym DIY. Nie chcę widzieć tu znań typu: &quot;doczepię się do .....&quot; Jak chcesz coś powiedzieć to zamiast doczepiać się do, pokaż jak wg ciebie mogłoby to wyglądać - wtedy będzie to OK - dobra ? (to taka prośba na przyszłość)<br /></div><br />Moim zamiarem nie jest dokopanie komuś czy krytykowanie na siłę. Ale tu jest forum i chyba nie spodziewasz się, że w takim temacie będą same pochwały &quot;o, jak super, gratulacje&quot; itp? Konstruktywna krytyka jest bardzo przydatna. Myślę, że warto dawać sobie takie wskazówki bo wzajemnie sobie wtedy pomagamy a nie tylko chwalimy. <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /> Co nie zmienia faktu, że super biblioteka wyszła Krauserowi i ukłony w jego stronę. Ja tylko zwróciłem uwagę na kilka rzeczy które moim zdaniem można było rozwiązać inaczej - moim zdaniem lepiej. Ale dlaczego to odbierasz jako doczepianie się na siłę? Wcale tak nie jest. Po prostu dzielę się swoimi przemyśleniami i nie chcę nikomu ująć wiedzy czy honoru. <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /> Kieruję się wyłącznie pozytywnymi pobudkami. No chyba, że oczekujesz samych pochwalnych postów w tym temacie - to napisz wprost. <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /> Własnej biblioteki nie zamieszczę z powodu braku czasu, ale klawiaturkę swoją już wrzuciłem w innym temacie - fakt, że kod też nie jest idealny, ale ja nie wrzuciłem tam biblioteki tylko goły kod który jeszcze wymaga dopracowania. A tutaj Krauser wyraźnie twierdzi, że napisał bibliotekę. No to w takim wypadku po prostu nie można takich technik stosować. <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /> Mam nadzieję, że nie zostałem źle odebrany. <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /><br /><br />Pozdrawiam<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=355">Ledes</a> — 17 kwi 2013, o 14:30</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[mirekk36]]></name></author>
<updated>2013-04-17T14:08:25+01:00</updated>
<published>2013-04-17T14:08:25+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=2885&amp;p=34536#p34536</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=2885&amp;p=34536#p34536"/>
<title type="html"><![CDATA[Re: Kalkulator na ATB+TFT]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=2885&amp;p=34536#p34536"><![CDATA[
<div class="quotetitle">Ledes napisał(a):</div><div class="quotecontent"><br />Znam opracowania, niestety nie mogę ich wyjawić z pewnych powodów, podpowiem tylko, że jest to jedna z wielu dobrych technik pisania kodu. I zalecana przez PROFESJONALISTÓW. Czytaj - poważne firmy produkujące soft.<br /></div><br />Ok więc tego nie skomentuję <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /><br /><br /><br /><div class="quotetitle">Ledes napisał(a):</div><div class="quotecontent"><br />Ok. Jednak jak to 36 pojawi się w wielu miejscach w pliku (niekoniecznie w tej samej okolicy) albo o zgrozo w różnych plikach projektu, to rodzi się problem kiedy trzeba zmienić to 36 na chociażby 21. Rozumiem, że w programach &quot;ad hoc&quot; takie coś jest dopuszczalne, ale no jak robimy bibliotekę i udostępniamy ją szerszej widowni to jednak warto o to zadbać i jak najbardziej sprametryzować kod.<br /></div><br />Zauważ, że tu drążysz (moim zdaniem zupełnie niepotrzebnie temat) .... bo to mi przypomina troszkę pseudo krytykę z elektrody, na zasadzie jak się nie ma do czego doczepić to doczepię się do ...... ... Sorki ale to jest podejście nie na miejscu, warto ew zwrócić uwagę jak ty byś to zrobił i napisał poniżej swoją propozycję, a najlepiej samemu napisać takiego libsa i pokazać ... Dla jednych może być to podejście dydaktyczne (ja tak np myślę) więc dla mnie nie jest to żadna zgroza! zresztą popatrz na inne komentarze - a przykład jaki był ciąg myślenia w trakcie tworzenia kodu, i nie chodzi tu ABSOLUTNIE o to żeby ktoś miał prezentować jakieś MEGA SUPER EXTRA WYPASIONO-DOPIESZCZONE biblioteki bo akurat ty tak oczekujesz? Ja na twoim miejscu byłbym wdzięczny za to co dostałem, i jeśli nie jestem w stanie pokazać jak bym sam to zrobił inaczej, tak wg mnie to nie będę się doczepiał - skoro dla wielu innych jest to przejrzysty kod. I proszę delikatnie o taką postawę na forum w naszym DIY. Nie chcę widzieć tu znań typu: &quot;doczepię się do .....&quot; Jak chcesz coś powiedzieć to zamiast doczepiać się do, pokaż jak wg ciebie mogłoby to wyglądać - wtedy będzie to OK - dobra ? (to taka prośba na przyszłość)<br /><br /><br /><div class="quotetitle">Ledes napisał(a):</div><div class="quotecontent"><br />No ale skoro pamięć została zaalokowana to gdzies musi być zwolniona - wszak w naturze nic nie ginie. Czemu zatem to nigdzie nie następuje? Czy jednak muszę przestawić swoje myślenie z PC-towego gdzie aplikacja po zakończeniu swojego działania zwalnia zajętą pamięć, a tu jest while(1) i aplikacja nigdy się nie kończy to i pamięci zwalniać nie trzeba?<br /></div><br />No widzisz <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /> jak czasem mogą przeszkadzać nawyki z programowania na PC. Pytając czy tu w takim konkretnym przypadku nie trzeba zwalniać pamięci, wynikałoby że nie do końca jakby (ale może się mylę nie odbierz tego źle), rozumiesz po co się zwalnia pamięć na PC i dlaczego. Więc podpowiem. Dlatego, że program po swoim zakończeniu zwraca sterowanie do nadrzędnego systemu operacyjnego i MUSI po sobie posprzątać. Tu jak się sam już widzę słusznie domyślasz - masz pętlę nieskończoną while(1) i co wychodzisz z niej ? no nie <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /> ... zakończenie pracy programu polega tu na ? ----&gt; na wyłączeniu urządzenia i brutalnym zwolnieniu wszystkich zasobów. Więc z tego punktu widzenia w takiej aplikacji statycznej nie ma czego zwalniać bo jak ? no chyba że zrobiłbyś specjalny button OFF dla wyłączenia urządzenia i programowo procek sam by się uśmiercił wyłączają np zasilanie .... ale i w takim wypadku - po co zwalniać pamięć skoro to ostatnie tchnienie żywota programu ? <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /><p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=54">mirekk36</a> — 17 kwi 2013, o 14:08</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Ledes]]></name></author>
<updated>2013-04-17T13:28:37+01:00</updated>
<published>2013-04-17T13:28:37+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=2885&amp;p=34529#p34529</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=2885&amp;p=34529#p34529"/>
<title type="html"><![CDATA[Re: Kalkulator na ATB+TFT]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=2885&amp;p=34529#p34529"><![CDATA[
<div class="quotetitle">mirekk36 napisał(a):</div><div class="quotecontent"><br />wg mnie nie ma NAJMNIEJSZEGO znaczenia gdzie jest ta gwiazdka. Tzn jeśli kolega zna jakieś gdzieś opracowania, które mówią na ten temat czy porady to chętnie przeczytam i nie mówię tego żeby się naigrywać, poważnie - bo może ja czegoś nie wiem po prostu.<br /></div><br />Znam opracowania, niestety nie mogę ich wyjawić z pewnych powodów, podpowiem tylko, że jest to jedna z wielu dobrych technik pisania kodu. I zalecana przez PROFESJONALISTÓW. Czytaj - poważne firmy produkujące soft.<br /><br /><strong><span style="color: #808000">------------------------ [ Dodano po: dzisiaj, o 08:22 ]</span></strong><br /><br /><div class="quotetitle">mirekk36 napisał(a):</div><div class="quotecontent"><br />Pewnie że lepiej ale .... ale to jest tak oczywiste jak przysłowiowy drut - za to w tym kodzie .... zaznaczmy przykładowym kodzie, powiedziałbym nawet DYDAKTYCZNEJ wersji kodu - bo nie dla każdego początkującego tego typu sztuczki hmmm majstersztyki Krausera mogłyby być jasne i przejrzyste - to uważam, że tu akurat pozostawienie tego tak jak jest wpływa ZDECYDOWANIE i TYLKO I WYŁĄCZNIE na próbę objaśnienia w kodzie nawet bez dodatkowych komentarzy - co i skąd się bierze. Zobacz - sam piszesz że &quot;powiedzmy że coś to znaczy , np rozmiar w osi X przycisku&quot;..... I w tym rzecz - przy takim zapisie, który przyznaję sam często używam gdy coś na szybko testuję - chyba o to chodziło autorowi. Później wiadomo, zawsze to sprzątam w kodzie własnym, ale gdybym miał pokazać taki kod - to chyba też bym tak zrobił. Może się mylę i może Krauser nie miał tego na myśli - ale pewnie sam odpowie na to pytanie. Mnie jako wersja przejrzysto dydaktyczna dla KAŻDEGO - podoba się takie pokazanie sprawy - bo to tylko mały przykład.<br /></div><br />Ok. Jednak jak to 36 pojawi się w wielu miejscach w pliku (niekoniecznie w tej samej okolicy) albo o zgrozo w różnych plikach projektu, to rodzi się problem kiedy trzeba zmienić to 36 na chociażby 21. Rozumiem, że w programach &quot;ad hoc&quot; takie coś jest dopuszczalne, ale no jak robimy bibliotekę i udostępniamy ją szerszej widowni to jednak warto o to zadbać i jak najbardziej sprametryzować kod.<br /><br /><strong><span style="color: #808000">------------------------ [ Dodano po: dzisiaj, o 08:22 ]</span></strong><br /><br /><div class="quotetitle">mirekk36 napisał(a):</div><div class="quotecontent"><br />A co ma wspólnego przekazywany do funkcji wskaźnik do BUTTON z rzutowaniem przy malloc ???<br /><br />Toż rzutowaniem mówisz kompilatorowi, żeby wykonał jawne rzutowanie (dopasowanie) wskaźnika po prawej stronie do strony LEWEJ. Zwróć uwagę że malloc jako rezultat zwraca typ void*, więc Krauser chyba dla porządku i przejrzystości kodu wykonał takie jawne rzutowanie. Chociaż w tym przypadku mogłoby ono akurat nie być konieczne ale wcale nie ze względu na jakiś tam przekazywany wskaźnik w argumencie funkcji (bo to nie ma nic wspólnego) tylko dlatego że mamy typ void* po prawej, a zatem niejawnie odbędzie się i tak rzutowanie do typu wskaźnikowego po lewej czyli do BUTTON*. Jednak dodanie tu jawnego rzutowania to znowu może chęć na lepsze zwrócenie uwagi co się dzieje w kodzie.<br /></div><br />Dzięki za objaśnienie. <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /><br /><br /><strong><span style="color: #808000">------------------------ [ Dodano po: dzisiaj, o 08:22 ]</span></strong><br /><br /><div class="quotetitle">mirekk36 napisał(a):</div><div class="quotecontent"><br />A powiedz mi gdzie w tym programie przykładowym widzisz miejsce hmmm konieczność zwalniania tej pamięci ? Ot program kalkulator, narysowane zostały wymyślone w założeniach przyciski i Quniec. Nie są one tu dynamicznie dodawane, usuwane itp .... Gdyby Krauser robił jeszcze opcję np jak w kalkulatorze windowsowym np:<br /><br />- widok zwykły<br />- widok programisty<br />- widok zaawansowany<br /><br /><img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /> to pewnie przydałoby się stworzyć jeszcze funkcję do zwalniania pamięci usuwanych z ekranu przycisków ... no ale to jest program przykład - powiedziałbym jak w VABANKU, to jest TŁUMIK a rewolwer każdy już sobie sam może dokręcić <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /> hyhyhy<br /></div><br />No ale skoro pamięć została zaalokowana to gdzies musi być zwolniona - wszak w naturze nic nie ginie. Czemu zatem to nigdzie nie następuje? Czy jednak muszę przestawić swoje myślenie z PC-towego gdzie aplikacja po zakończeniu swojego działania zwalnia zajętą pamięć, a tu jest while(1) i aplikacja nigdy się nie kończy to i pamięci zwalniać nie trzeba?<br /><br /><strong><span style="color: #808000">------------------------ [ Dodano po: dzisiaj, o 08:22 ]</span></strong><br /><br /><div class="quotetitle">Ledes napisał(a):</div><div class="quotecontent"><br />Po to aby łatwiej poruszać się (iterować) po utworzonych butonach, zwróć uwagę na prostą funkcję: make_buttons_released() gdzie ładnie widać jak można szybko &quot;przelecieć&quot; się po wszystkich stworzonych buttonach i coś z nimi zrobić. Po to są często wykorzystywane takie listy.<br /></div><br />Dzięki, przyjrzę się jeszcze temu mechanizmowi. <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /> Bo dość ciekawe podejście. <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /><p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=355">Ledes</a> — 17 kwi 2013, o 13:28</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[mirekk36]]></name></author>
<updated>2013-04-17T09:22:16+01:00</updated>
<published>2013-04-17T09:22:16+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=2885&amp;p=34524#p34524</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=2885&amp;p=34524#p34524"/>
<title type="html"><![CDATA[Re: Kalkulator na ATB+TFT]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=2885&amp;p=34524#p34524"><![CDATA[
<div class="quotetitle">SunRiver napisał(a):</div><div class="quotecontent"><br />No kolego istna masakra ....  <br />zawyżasz poziom forum normalnie , .....<br /></div><br /><br />Sun ja myślę, że za takie występki trzeba po prostu banować użytkowników bez mrugnięcia oka <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /> hahahahaha .... <br /><br />a na poważnie to im bardziej patrzę w kodziki Krausera to też dochodzę do wniosku , że to majstersztyk(i) <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /><br /><br /><strong><span style="color: #808000">------------------------ [ Dodano po: dzisiaj, o 09:22 ]</span></strong><br /><br /><div class="quotetitle">Ledes napisał(a):</div><div class="quotecontent"><br />A przyczepię się jeszcze, mam nadzieję że wybaczysz Krauser. <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /><br />Ale niestety (albo stety?) jestem pedantem jeśli chodzi o przejrzystość, składnię i czytelność kodu.<br /><br />Chodzi o wskaźniki.<br /><br />[syntax=c]char * ptr;[/syntax]<br />Gwiazdka - no właśnie - gdzie ona powinna być? Powinna być przy TYPIE wskaźnika, a nie w połowie drogi między typem a nazwą (otoczona spacjami). Wtedy od razu widać, co to jest. Jakoś tak optycznie lepiej się to czyta.<br />Widać, że ta zmienna to wskaźnik na chara albo że funkcja zwraca wskaźnik na chara. Nie ma niejasności.<br />Czyli prawidłowo:<br /><br />[syntax=c]char* ptr;[/syntax]<br /></div><br /><br />Ja nie chcę tu występować w roli jakiegoś obrońcy - ale po prostu sam nie zgodziłbym się z taką zasadą, tzn może inaczej - wg mnie nie ma NAJMNIEJSZEGO znaczenia gdzie jest ta gwiazdka. Tzn jeśli kolega zna jakieś gdzieś opracowania, które mówią na ten temat czy porady to chętnie przeczytam i nie mówię tego żeby się naigrywać, poważnie - bo może ja czegoś nie wiem po prostu.<br /><br /><div class="quotetitle">Ledes napisał(a):</div><div class="quotecontent"><br />Jeszcze jedno. <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /><br /><br />[syntax=c]add_button(button_ptr, 10, 90+36, 32, 32, blue, &amp;CourierNew12ptFontInfo, &quot;4&quot;, '4');<br />add_button(button_ptr, 10+36, 90+36, 32, 32, blue, &amp;CourierNew12ptFontInfo, &quot;5&quot;, '5');<br />add_button(button_ptr, 10+36+36, 90+36, 32, 32, blue, &amp;CourierNew12ptFontInfo, &quot;6&quot;, '6');<br />add_button(button_ptr, 10+36+36+36, 90+36, 32, 32, red, &amp;CourierNew12ptFontInfo, &quot;*&quot;, '*');<br />add_button(button_ptr, 10+36+36+36+36, 90+36, 32, 32, purple, &amp;CourierNew12ptFontInfo, &quot;C&quot;, ASCII_DEL);<br /> <br />add_button(button_ptr, 10, 90+36+36, 32, 32, blue, &amp;CourierNew12ptFontInfo, &quot;1&quot;, '1');<br />add_button(button_ptr, 10+36, 90+36+36, 32, 32, blue, &amp;CourierNew12ptFontInfo, &quot;2&quot;, '2');<br />add_button(button_ptr, 10+36+36, 90+36+36, 32, 32, blue, &amp;CourierNew12ptFontInfo, &quot;3&quot;, '3');<br />add_button(button_ptr, 10+36+36+36, 90+36+36, 32, 32, red, &amp;CourierNew12ptFontInfo, &quot;-&quot;, '-');<br />add_button(button_ptr, 10+36+36+36+36, 90+36+36, 32, 32+4+32, red, &amp;CourierNew12ptFontInfo, &quot;=&quot;, '=');[/syntax]<br />To aż się prosi o zmianę. Chodzi o <strong><span style="font-size: 150%; line-height: normal">magic inty</span></strong>. Czyli o wartości liczbowe bezpośrednio w kodzie, <strong>W WIELU MIEJSCACH</strong>. Np. to nieszczęsne 36. Powiedzmy że to coś znaczy, np. rozmiar w osi X przycisku. Nagle chcesz zmienić szerokość przycisku - i co? Musisz zmieniać w 40 miejscach! Nie lepiej zrobić sobie stałą wcześniej i zmieniać potem tylko w tym jednym miejscu? Lepiej, uwierz. <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /><br /></div><br /><br />Pewnie że lepiej ale .... ale to jest tak oczywiste jak przysłowiowy drut - za to w tym kodzie .... zaznaczmy przykładowym kodzie, powiedziałbym nawet DYDAKTYCZNEJ wersji kodu - bo nie dla każdego początkującego tego typu sztuczki hmmm majstersztyki Krausera mogłyby być jasne i przejrzyste - to uważam, że tu akurat pozostawienie tego tak jak jest wpływa ZDECYDOWANIE i TYLKO I WYŁĄCZNIE na próbę objaśnienia w kodzie nawet bez dodatkowych komentarzy - co i skąd się bierze. Zobacz - sam piszesz że &quot;powiedzmy że coś to znaczy , np rozmiar w osi X przycisku&quot;..... I w tym rzecz - przy takim zapisie, który przyznaję sam często używam gdy coś na szybko testuję - chyba o to chodziło autorowi. Później wiadomo, zawsze to sprzątam w kodzie własnym, ale gdybym miał pokazać taki kod - to chyba też bym tak zrobił. Może się mylę i może Krauser nie miał tego na myśli - ale pewnie sam odpowie na to pytanie. Mnie jako wersja przejrzysto dydaktyczna dla KAŻDEGO - podoba się takie pokazanie sprawy - bo to tylko mały przykład.<br /><br /><br /><br /><div class="quotetitle">Ledes napisał(a):</div><div class="quotecontent"><br />Kiepski jestem w mallocach, możesz wytłumaczyć tą linijkę?<br /><br />[syntax=c]new_button = (BUTTON *) malloc ( sizeof(BUTTON) ); /* allocate memory */[/syntax]<br /><br />Rozumiem, że rezerwujemy pamięć dla nowego buttona. Ale dlaczego rzutujemy rezultat na BUTTON* skoro już on jest przekazywany do funkcji właśnie jako wskaźnik do BUTTON? Zwróć uwagę jakiego typu jest zmienna new_button - czyż nie BUTTON* ??? a więc<br /></div><br />A co ma wspólnego przekazywany do funkcji wskaźnik do BUTTON z rzutowaniem przy malloc ???<br /><br />Toż rzutowaniem mówisz kompilatorowi, żeby wykonał jawne rzutowanie (dopasowanie) wskaźnika po prawej stronie do strony LEWEJ. Zwróć uwagę że malloc jako rezultat zwraca typ void*, więc Krauser chyba dla porządku i przejrzystości kodu wykonał takie jawne rzutowanie. Chociaż w tym przypadku mogłoby ono akurat nie być konieczne ale wcale nie ze względu na jakiś tam przekazywany wskaźnik w argumencie funkcji (bo to nie ma nic wspólnego) tylko dlatego że mamy typ void* po prawej, a zatem niejawnie odbędzie się i tak rzutowanie do typu wskaźnikowego po lewej czyli do BUTTON*. Jednak dodanie tu jawnego rzutowania to znowu może chęć na lepsze zwrócenie uwagi co się dzieje w kodzie.<br /><br /><br /><br /><div class="quotetitle">Ledes napisał(a):</div><div class="quotecontent"><br />I gdzie jest zwalniana ta pamięć? Szukam w twoim kodzie  odpowiednika <strong>delete </strong>z C++ ale nie widzę.<br /></div><br />A powiedz mi gdzie w tym programie przykładowym widzisz miejsce hmmm konieczność zwalniania tej pamięci ? Ot program kalkulator, narysowane zostały wymyślone w założeniach przyciski i Quniec. Nie są one tu dynamicznie dodawane, usuwane itp .... Gdyby Krauser robił jeszcze opcję np jak w kalkulatorze windowsowym np:<br /><br />- widok zwykły<br />- widok programisty<br />- widok zaawansowany<br /><br /><img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /> to pewnie przydałoby się stworzyć jeszcze funkcję do zwalniania pamięci usuwanych z ekranu przycisków ... no ale to jest program przykład - powiedziałbym jak w VABANKU, to jest TŁUMIK a rewolwer każdy już sobie sam może dokręcić <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /> hyhyhy<br /><br /><div class="quotetitle">Ledes napisał(a):</div><div class="quotecontent"><br />Nie wgłębiając się w szczegóły niezbyt pojmuję po co jest tutaj zastosowana lista jednokierunkowa. Mógłbyś przybliżyć ten cel?<br /></div><br /><br />Po to aby łatwiej poruszać się (iterować) po utworzonych butonach, zwróć uwagę na prostą funkcję: make_buttons_released() gdzie ładnie widać jak można szybko &quot;przelecieć&quot; się po wszystkich stworzonych buttonach i coś z nimi zrobić. Po to są często wykorzystywane takie listy.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=54">mirekk36</a> — 17 kwi 2013, o 09:22</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[SunRiver]]></name></author>
<updated>2013-04-17T09:05:13+01:00</updated>
<published>2013-04-17T09:05:13+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=2885&amp;p=34523#p34523</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=2885&amp;p=34523#p34523"/>
<title type="html"><![CDATA[Re: Kalkulator na ATB+TFT]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=2885&amp;p=34523#p34523"><![CDATA[
No kolego istna masakra ....  <br />zawyżasz poziom forum normalnie , ale to bardzo dobrze <br />mam nadzieje że i mnie się uda tobie dorównać kiedyś <br /><br />SUPER..<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=58">SunRiver</a> — 17 kwi 2013, o 09:05</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Ledes]]></name></author>
<updated>2013-04-16T23:41:19+01:00</updated>
<published>2013-04-16T23:41:19+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=2885&amp;p=34516#p34516</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=2885&amp;p=34516#p34516"/>
<title type="html"><![CDATA[Re: Kalkulator na ATB+TFT]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=2885&amp;p=34516#p34516"><![CDATA[
No fajnie, fajnie, szacun Krauser.<br />Fajne efekty wizualne (kliknięcie), układ przestrzenny przycisków no MEGA jak w Casio normalnie. <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /><br /><br />Powalczyłbym z tym żeby użyć tej biblioteki w swojej magisterce, ale już klawiaturkę ekranową mam własną (może nie jest tak fajna, funkcjonalna i dobrze napisana jak ta tutaj), ale jako-tako działa i szczerze powiedziawszy terminy gonią i trzeba przeć na przód zamiast udoskonalać to co już jest. W sumie poza liczbami x.0y (i typu x.00...0y) każdą liczbę da się wprowadzić a przecież liczba x.0y to w przybliżeniu liczba x albo x.1 (2.02 -&gt; 2, 2.09 -&gt; 2.1), więc to mnie aż tak bardzo nie boli bo można sobie wprowadzić właśnie 2 albo 2.1 i błędu wcale dużego nie będzie. No a z liczbami gdzie po przecinku jest kilka zer to już w ogóle można śmiało tą część po przecinku zaniechać i błędu... praktycznie nie ma! problem wynika z tego, że część ułamkowa u mnie jest intem w strukturze, a wiadomo, że 01 = 1 więc stąd się to bierze. Zależy też do czego chcemy użyć taką klawiaturkę. No jak kalkulator, to jednak precyzja gra dużą rolę. Ale np. w regulatorze PID można sobie pozwolić (można?) przy wprowadzaniu nastaw na niewielkie odchyłki od wzorcowych nastaw.<br /><br />Kolega widzę bazuje na parsowaniu stringów , ja z nimi przegrałem bitwę i jednak swoją klawiaturkę oparłem o działania na strukturce z intami i boolami. Liczba 5.2 reprezentowana jako int 5 (część całkowita), int 2 (część ułamkowa), kilka booli (znak, flaga całkowita/rzeczywista itp.). Do tych stringów w AVR wiedzie mnie ciężka droga... W C++ na PC jakoś łatwo się ich używało, a w AVR to jak droga przez mękę dla mnie... <br /><br />Jak będę robił jakiś następny projekt z użyciem GLCD to pozwolę sobie skorzystać z tej Krauserowej klawiaturki, no bo bomba, trzeba przyznać.<br /><br />Aha, ładnie przygotowana biblioteka, duże reusability, ładny, czytelny kod i dobre nazewnictwo. Aż chce się tego używać. <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /><br /><br /><strong><span style="color: #808000">------------------------ [ Dodano po: 23 minutach ]</span></strong><br /><br />Żeby nie było za słodko: za długi main (zarówno int main(void) jak i plik main.c)<br />I raczej nie powinno się tworzyć pliku main.h, tylko np. common.h<br /><br /><strong><span style="color: #808000">------------------------ [ Dodano po: 31 minutach ]</span></strong><br /><br />A przyczepię się jeszcze, mam nadzieję że wybaczysz Krauser. <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /><br />Ale niestety (albo stety?) jestem pedantem jeśli chodzi o przejrzystość, składnię i czytelność kodu.<br /><br />Chodzi o wskaźniki.<br /><br />[syntax=c]char * ptr;[/syntax]<br />Gwiazdka - no właśnie - gdzie ona powinna być? Powinna być przy TYPIE wskaźnika, a nie w połowie drogi między typem a nazwą (otoczona spacjami). Wtedy od razu widać, co to jest. Jakoś tak optycznie lepiej się to czyta.<br />Widać, że ta zmienna to wskaźnik na chara albo że funkcja zwraca wskaźnik na chara. Nie ma niejasności.<br />Czyli prawidłowo:<br /><br />[syntax=c]char* ptr;[/syntax]<br /><br /><strong><span style="color: #808000">------------------------ [ Dodano po: 35 minutach ]</span></strong><br /><br />Jeszcze jedno. <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /><br /><br />[syntax=c]add_button(button_ptr, 10, 90+36, 32, 32, blue, &amp;CourierNew12ptFontInfo, &quot;4&quot;, '4');<br />add_button(button_ptr, 10+36, 90+36, 32, 32, blue, &amp;CourierNew12ptFontInfo, &quot;5&quot;, '5');<br />add_button(button_ptr, 10+36+36, 90+36, 32, 32, blue, &amp;CourierNew12ptFontInfo, &quot;6&quot;, '6');<br />add_button(button_ptr, 10+36+36+36, 90+36, 32, 32, red, &amp;CourierNew12ptFontInfo, &quot;*&quot;, '*');<br />add_button(button_ptr, 10+36+36+36+36, 90+36, 32, 32, purple, &amp;CourierNew12ptFontInfo, &quot;C&quot;, ASCII_DEL);<br /> <br />add_button(button_ptr, 10, 90+36+36, 32, 32, blue, &amp;CourierNew12ptFontInfo, &quot;1&quot;, '1');<br />add_button(button_ptr, 10+36, 90+36+36, 32, 32, blue, &amp;CourierNew12ptFontInfo, &quot;2&quot;, '2');<br />add_button(button_ptr, 10+36+36, 90+36+36, 32, 32, blue, &amp;CourierNew12ptFontInfo, &quot;3&quot;, '3');<br />add_button(button_ptr, 10+36+36+36, 90+36+36, 32, 32, red, &amp;CourierNew12ptFontInfo, &quot;-&quot;, '-');<br />add_button(button_ptr, 10+36+36+36+36, 90+36+36, 32, 32+4+32, red, &amp;CourierNew12ptFontInfo, &quot;=&quot;, '=');[/syntax]<br />To aż się prosi o zmianę. Chodzi o <strong><span style="font-size: 150%; line-height: normal">magic inty</span></strong>. Czyli o wartości liczbowe bezpośrednio w kodzie, <strong>W WIELU MIEJSCACH</strong>. Np. to nieszczęsne 36. Powiedzmy że to coś znaczy, np. rozmiar w osi X przycisku. Nagle chcesz zmienić szerokość przycisku - i co? Musisz zmieniać w 40 miejscach! Nie lepiej zrobić sobie stałą wcześniej i zmieniać potem tylko w tym jednym miejscu? Lepiej, uwierz. <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /><br /><br /><strong><span style="color: #808000">------------------------ [ Dodano po: 45 minutach ]</span></strong><br /><br />Kiepski jestem w mallocach, możesz wytłumaczyć tą linijkę?<br /><br />[syntax=c]new_button = (BUTTON *) malloc ( sizeof(BUTTON) ); /* allocate memory */[/syntax]<br /><br />Rozumiem, że rezerwujemy pamięć dla nowego buttona. Ale dlaczego rzutujemy rezultat na BUTTON* skoro już on jest przekazywany do funkcji właśnie jako wskaźnik do BUTTON? I gdzie jest zwalniana ta pamięć? Szukam w twoim kodzie  odpowiednika <strong>delete </strong>z C++ ale nie widzę.<br /><br /><strong><span style="color: #808000">------------------------ [ Dodano po: 51 minutach ]</span></strong><br /><br />Nie wgłębiając się w szczegóły niezbyt pojmuję po co jest tutaj zastosowana lista jednokierunkowa. Mógłbyś przybliżyć ten cel?<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=355">Ledes</a> — 16 kwi 2013, o 23:41</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[mirekk36]]></name></author>
<updated>2013-04-16T23:17:46+01:00</updated>
<published>2013-04-16T23:17:46+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=2885&amp;p=34514#p34514</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=2885&amp;p=34514#p34514"/>
<title type="html"><![CDATA[Re: Kalkulator na ATB+TFT]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=2885&amp;p=34514#p34514"><![CDATA[
Kurczę a właśnie przed chwilą pisałem do kogoś maila, gdzie napisałem m.in takie zdanie - aż zacytuję sam siebie z tego maila:<br /><br /><div class="quotetitle">mirekk36 napisał(a):</div><div class="quotecontent"><br />jednak  jak  widzę  co  na naszym forum kolega Krauser wyprawia z tymi<br />wyświetlaczami  to  mi  normalnie  szczęka opada z zazdrości i sam nie<br />mogę  się  doczekać  kiedy  będę miał czas - nawet tak dla siebie żeby<br />sobie posiedzieć i przy nich podłubać więcej<br /></div><br /><br />wysłałem maila, klik - i jeszcze przed snem myślę sobie aaa co tam - zajrzę jeszcze na forum <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /><br /><br />a tu proszę znowu kolega Krauser <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /> i TFT GLCD ... i to jaki fajny projekt.... Powiem szczerze, że sam starałem się tak budować te biblioteki, że by później własnie w miarę łatwo można było robić sobie takie obiekty (jeśli chodzi o różne kontrolki w tym klawisze szczególnie).... wprawdzie miałem tylko czas na szybko przemyśleć wizję jakby samego modelu obiektu - no ale to co tu kolega Krauser odstawił to znowu - 10 kroków naprzód i wysunięcie się przed szereg albo jak to mówi modne powiedzenie ostatnimi czasy - &quot;ucieczka do przodu&quot; <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /><br /><br />No nie chcę słodzić - ale na prawdę kawał SUPER roboty i że tak powiem kolega wręcz wyprzedził mnie znowu w tym czym sam planowałem się też zająć i pogrzebać w kodzie z tymi LCD'kami jak tylko znajdę kiedyś czas ....<br /><br />Dodatkowo - chyba się z tego jeszcze szczególnie kolega Ledes z naszego forum ucieszy hmmm ? <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /> i doceni bo zdaje się sam jeszcze z tym walczy dzielnie ...<br /><br />Krauser - no BOMBA projekt !!!!<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=54">mirekk36</a> — 16 kwi 2013, o 23:17</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Krauser]]></name></author>
<updated>2013-04-16T22:48:04+01:00</updated>
<published>2013-04-16T22:48:04+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=2885&amp;p=34513#p34513</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=2885&amp;p=34513#p34513"/>
<title type="html"><![CDATA[Kalkulator na ATB+TFT]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=2885&amp;p=34513#p34513"><![CDATA[
<img src="http://forum.atnel.pl/_obrazki/o/54/abe35c54ba4c298e782ffea47e2eb703.jpg" alt="Obrazek" />Ekran dotykowy już na dobre zadomowił się w telefonach. W mikrokontrolerach AVR problem stanowi brak odpowiednich i łatwych do wykorzystania bibliotek. Są oczywiście biblioteki Mirka opisane w książce Język C Pasja programowania mikrokontrolerów 8-bitowych, ale można pójść o krok dalej i przygotować bardziej zaawansowane obiekty jak na przykład przycisk z zaprezentowanej poniżej biblioteki. Nie będzie to jednak zwykły przycisk, ale animowany &quot;button&quot;.<br /><a href="http://forum.atnel.pl/_obrazki/o/465/24d0e2e1d16ac8311c553783bc6d1583.jpg"  class="postlink"><img src="http://forum.atnel.pl/_obrazki/o/thumb/465/24d0e2e1d16ac8311c553783bc6d1583.jpg" alt="Obrazek" /></a><br />Oczywiście biblioteka bez konkretnego przykładu nie pokaże swoich możliwości. Dlatego przyciski zostały wykorzystane w kalkulatorze. Nie jest to szczyt techniki i nie polecam go do pracy przy wypełnianiu PITa  <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /> , ale można tam odnaleźć przykłady obliczeń na ułamkach dziesiętnych bez korzystania ze zmiennych typu double. Pokaz możliwości:<br /><div style="width: 583px; height: 471px; margin: 0 auto; padding-left: 26px; padding-top: 48px; background: url('https://www.atnel.pl/download/atnel_tv.png') no-repeat;"> <strong>iframe</strong> </div><br />Kod programu:<br />-main.h<br />[syntax=c]/*<br /> * main.h<br /> *<br /> *  Created on: 11-04-2013<br /> */<br /><br />#ifndef MAIN_H_<br />#define MAIN_H_<br /><br />#include &lt;avr/io.h&gt;<br />#include &lt;avr/interrupt.h&gt;<br />#include &lt;avr/pgmspace.h&gt;<br />#include &lt;string.h&gt;<br />#include &lt;stdlib.h&gt;<br />#include &lt;util/delay.h&gt;<br />#include &lt;stdio.h&gt;<br />#include &quot;button.h&quot;<br /><br />#define TEXT_BOX_SIZE 9<br /><br />#define ASCII_BS 8<br />#define ASCII_LF 10<br />#define ASCII_CR 13<br />#define ASCII_CTRLZ 26<br />#define ASCII_DEL 127<br /><br />#define DIVIDE_PREC 1000<br /><br />typedef struct<br />{<br />int8_t sign;<br />uint32_t total;<br />uint32_t fract;<br />uint8_t fract_length;<br />} DECIMAL;<br /><br />static void __init3( void ) __attribute__ (( section( &quot;.init3&quot; ), naked, used ));<br />void key_action(BUTTON * button);<br />void calculate(char * in, char * out);<br />DECIMAL * convert2decimal(DECIMAL * decimal_ptr, char * number);<br /><br />char * add(DECIMAL * x_ptr, DECIMAL * y_ptr, char * buf);<br />char * subtract(DECIMAL * x_ptr, DECIMAL * y_ptr, char * buf);<br />char * multiply(DECIMAL * x_ptr, DECIMAL * y_ptr, char * buf);<br />char * divide(DECIMAL * x_ptr, DECIMAL * y_ptr, char * buf);<br />char * convert2integer(DECIMAL * decimal_ptr, char * buf);<br /><br />#endif /* MAIN_H_ */[/syntax]<br /><br />-main.c<br />[syntax=c]/*<br /> * main.c<br /> *<br /> *  Created on: 07-04-2013<br /> */<br /><br /><br />#include &quot;main.h&quot;<br />#include &quot;button.h&quot;<br /><br />#define release 0<br />#define debug 1<br />#define mode release<br /><br />extern BUTTON * button_ptr;<br />volatile uint8_t timer1 = 5, timer2;<br /><br />/* main function */<br />int main(void) {<br /><br />uint8_t lock = 0;<br /><br />i2cSetBitrate(400);/* I2C speed */<br /><br />tft_init();/* TFT LCD initialization */<br /><br />stmpe811_init(); /* STMPE811 initialization */<br /><br />setCurrentFont(&amp;CourierNew12ptFontInfo);<br /><br />fx_ptr = SSDXBUF0;<br />tft_fill_rect(0, 0, 320, 240, BG_COLOR);<br />OCR0A = F_CPU/100/1024; //~100Hz<br />TCCR0A |= (1&lt;&lt;WGM01);<br />TCCR0B |= (1&lt;&lt;CS02) | (1&lt;&lt;CS00);<br />TIMSK0 |= (1&lt;&lt;OCIE0A);<br /><br />sei();/* enable interrupts */<br />button_ptr = add_button(button_ptr, 10, 90, 32, 32, blue, &amp;CourierNew12ptFontInfo, &quot;7&quot;, '7');<br />add_button(button_ptr, 10+36, 90, 32, 32, blue, &amp;CourierNew12ptFontInfo, &quot;8&quot;, '8');<br />add_button(button_ptr, 10+36+36, 90, 32, 32, blue, &amp;CourierNew12ptFontInfo, &quot;9&quot;, '9');<br />add_button(button_ptr, 10+36+36+36, 90, 32, 32, red, &amp;CourierNew12ptFontInfo, &quot;/&quot;, '/');<br />add_button(button_ptr, 10+36+36+36+36, 90, 32, 32, purple, &amp;CourierNew12ptFontInfo, &quot;&lt;-&quot;, ASCII_BS);<br /><br />add_button(button_ptr, 10, 90+36, 32, 32, blue, &amp;CourierNew12ptFontInfo, &quot;4&quot;, '4');<br />add_button(button_ptr, 10+36, 90+36, 32, 32, blue, &amp;CourierNew12ptFontInfo, &quot;5&quot;, '5');<br />add_button(button_ptr, 10+36+36, 90+36, 32, 32, blue, &amp;CourierNew12ptFontInfo, &quot;6&quot;, '6');<br />add_button(button_ptr, 10+36+36+36, 90+36, 32, 32, red, &amp;CourierNew12ptFontInfo, &quot;*&quot;, '*');<br />add_button(button_ptr, 10+36+36+36+36, 90+36, 32, 32, purple, &amp;CourierNew12ptFontInfo, &quot;C&quot;, ASCII_DEL);<br /><br />add_button(button_ptr, 10, 90+36+36, 32, 32, blue, &amp;CourierNew12ptFontInfo, &quot;1&quot;, '1');<br />add_button(button_ptr, 10+36, 90+36+36, 32, 32, blue, &amp;CourierNew12ptFontInfo, &quot;2&quot;, '2');<br />add_button(button_ptr, 10+36+36, 90+36+36, 32, 32, blue, &amp;CourierNew12ptFontInfo, &quot;3&quot;, '3');<br />add_button(button_ptr, 10+36+36+36, 90+36+36, 32, 32, red, &amp;CourierNew12ptFontInfo, &quot;-&quot;, '-');<br />add_button(button_ptr, 10+36+36+36+36, 90+36+36, 32, 32+4+32, red, &amp;CourierNew12ptFontInfo, &quot;=&quot;, '=');<br /><br /><br />add_button(button_ptr, 10, 90+36+36+36, 32+4+32, 32, blue, &amp;CourierNew12ptFontInfo, &quot;0&quot;, '0');<br />add_button(button_ptr, 10+36+36, 90+36+36+36, 32, 32, blue, &amp;CourierNew12ptFontInfo, &quot;,&quot;, ',');<br />add_button(button_ptr, 10+36+36+36, 90+36+36+36, 32, 32, red, &amp;CourierNew12ptFontInfo, &quot;+&quot;, '+');<br /><br />draw_buttons(button_ptr);<br />/* main loop */<br />while(1) {<br />if( !timer1 )<br />{<br />timer1 = 5;<br />if (st_intX_flag) /* screen touched */<br />{<br />make_button_pressed(pressed_button(button_ptr));<br />st_intX_flag = 0;<br />timer2 = 10;<br />if(!lock)<br />{<br />key_action(pressed_button(button_ptr));<br />lock = 1;<br />}<br /><br />} /* if (st_intX_flag) */<br />}<br />if( !timer2 )<br />{<br />lock = 0;<br />make_buttons_released(button_ptr);<br />}<br />}/* while(1) */<br />}/* main() */<br /><br />ISR(TIMER0_COMPA_vect)<br />{<br />uint8_t n;<br />n = timer1;/* 100Hz timer1 */<br />if (n) timer1 = --n;<br />n = timer2;/* 100Hz timer1 */<br />if (n) timer2 = --n;<br />}<br /><br />static void __init3( void )<br />{<br />    MCUSR = 0;<br />    WDTCSR = (1&lt;&lt;WDCE) | (1&lt;&lt;WDE);<br />    WDTCSR = 0;<br />}<br /><br />void key_action(BUTTON * button)<br />{<br />static char input&#91;TEXT_BOX_SIZE + 1&#93; = &quot;&quot;;<br />static char output&#91;20&#93; = &quot;&quot;;<br />static uint8_t lock_coma = 0;<br />char charBuf&#91;2&#93; = &quot;?&quot;;<br />char actionBuf&#91;3&#93; = &quot; ?&quot;;<br />if(  button-&gt;code &gt;= '0' &amp;&amp; button-&gt;code &lt;= '9'<br />&amp;&amp; strlen(input) &lt; TEXT_BOX_SIZE )<br />{<br />charBuf&#91;0&#93; = (char)button-&gt;code;<br />strcat (input, charBuf);<br />}<br />else if(button-&gt;code == ',' &amp;&amp; ( (strlen(input) &gt; 0 &amp;&amp; input&#91;0&#93; != '-')<br />|| (strlen(input) &gt; 1 &amp;&amp; input&#91;0&#93; == '-') )<br />&amp;&amp; strlen(input) &lt; TEXT_BOX_SIZE &amp;&amp; !lock_coma)<br />{<br />charBuf&#91;0&#93; = (char)button-&gt;code;<br />strcat (input, charBuf);<br />lock_coma++;<br />}<br />else if(button-&gt;code == '-' &amp;&amp; strlen(input) == 0)<br />{<br />charBuf&#91;0&#93; = (char)button-&gt;code;<br />strcat (input, charBuf);<br />}<br />else<br />{<br />if( button-&gt;code == '=' )<br />{<br />setCurrentFont(&amp;CourierNew12ptFontInfo);<br />tft_puts( 10, 10, output, BG_COLOR, BG_COLOR ); /* clear old */<br />tft_puts( 10, 30, input, BG_COLOR, BG_COLOR); /* clear old */<br />if(strlen(output) &gt; 0)<br />calculate(input, output);<br />strcpy(input, output);<br />if( strchr(input, ',') ) lock_coma++;<br />strcpy(output, &quot;&quot;);<br /><br />}<br />else if( button-&gt;code == '*' ||  button-&gt;code == '+' || ( button-&gt;code == '-' &amp;&amp;<br />( (strlen(input) &gt; 0 &amp;&amp; input&#91;0&#93; != '-') || (strlen(input) &gt; 1 &amp;&amp; input&#91;0&#93; == '-') ))<br />|| button-&gt;code == '/' )<br />{<br /><br />setCurrentFont(&amp;CourierNew12ptFontInfo);<br />tft_puts( 10, 10, output, BG_COLOR, BG_COLOR ); /* clear old */<br />tft_puts( 10, 30, input, BG_COLOR, BG_COLOR); /* clear old */<br />if(strlen(output) &gt; 0)<br />calculate(input, output);<br />else<br />{<br />strcpy(output, input);<br />}<br />actionBuf&#91;1&#93; = (char)button-&gt;code;<br />strcat(output, actionBuf);<br />tft_puts( 10, 10, output, LINE_COLOR, BG_COLOR );<br />strcpy(input, &quot;&quot;);<br />lock_coma = 0;<br />}<br />else if (button-&gt;code == ASCII_BS)<br />{<br />setCurrentFont(&amp;CourierNew12ptFontInfo);<br />tft_puts( 10, 30, input, BG_COLOR , BG_COLOR );/* clear old */<br />if(input&#91;strlen(input) - 1&#93; == ',') lock_coma = 0;<br />if(strlen(input)) input&#91;strlen(input) - 1&#93; = '\0'; //remove char<br /> //<br />}<br />else if (button-&gt;code == ASCII_DEL)<br />{<br />setCurrentFont(&amp;CourierNew12ptFontInfo);<br />tft_puts( 10, 10, output, BG_COLOR, BG_COLOR ); /* clear old */<br />tft_puts( 10, 30, input, BG_COLOR, BG_COLOR); /* clear old */<br />strcpy(output, &quot;&quot;);<br />strcpy(input, &quot;&quot;);<br />lock_coma = 0;<br />}<br />}<br />setCurrentFont(&amp;CourierNew12ptFontInfo);<br />tft_puts( 10, 30, input, LINE_COLOR, BG_COLOR );<br />}<br /><br />void calculate(char * in, char * out)<br />{<br />char action&#91;&#93; = &quot; &quot;;<br />DECIMAL x, y;<br />char buf&#91;20&#93;;<br /><br />strlcpy(buf,out,strlen(out) - 1);//without action<br />action&#91;0&#93; = out&#91;strlen(out) - 1&#93;;//copy action symbol<br />convert2decimal(&amp;x, buf); //convert to DECIMAL<br />convert2decimal(&amp;y, in); //convert to DECIMAL<br />#if mode == debug<br />tft_putint( 200, 10, x.total, LINE_COLOR, BG_COLOR );<br />tft_putint( 200, 30, x.fract, LINE_COLOR, BG_COLOR );<br />tft_putint( 200, 50, x.fract_length, LINE_COLOR, BG_COLOR );<br />tft_putint( 200, 70, y.total, LINE_COLOR, BG_COLOR );<br />tft_putint( 200, 90, y.fract, LINE_COLOR, BG_COLOR );<br />tft_putint( 200, 110, y.fract_length, LINE_COLOR, BG_COLOR );<br />tft_puts( 200, 130, action, LINE_COLOR, BG_COLOR );<br />#endif<br /><br />if( action&#91;0&#93; == '+')<br />add(&amp;x, &amp;y, buf);<br />else if (action&#91;0&#93; == '-')<br />subtract(&amp;x, &amp;y, buf);<br />else if( action&#91;0&#93; == '*')<br />multiply(&amp;x, &amp;y, buf);<br />else if( action&#91;0&#93; == '/')<br />divide(&amp;x, &amp;y, buf);<br />strcpy(out, buf);<br />}<br /><br />DECIMAL * convert2decimal(DECIMAL * decimal_ptr, char * number)<br />{<br />char * ptr;<br />if(number&#91;0&#93; == '-')<br />{<br />decimal_ptr-&gt;sign = -1;<br />}<br />else decimal_ptr-&gt;sign = 1;<br />ptr = strtok(number, &quot;,&quot;);<br />decimal_ptr-&gt;total = atol(ptr) * decimal_ptr-&gt;sign;<br />ptr = strtok(NULL, &quot;,&quot;);<br />if(ptr)<br />{<br />decimal_ptr-&gt;fract = atol(ptr);<br />decimal_ptr-&gt;fract_length = strlen(ptr);<br /><br />if(decimal_ptr-&gt;fract)<br />while( !(decimal_ptr-&gt;fract % 10)) //remove zeros at the end of the fract<br />{<br />decimal_ptr-&gt;fract /= 10;<br />decimal_ptr-&gt;fract_length--;<br />}<br />else<br />decimal_ptr-&gt;fract_length = 0;<br />}<br />else<br />{<br />decimal_ptr-&gt;fract = 0;<br />decimal_ptr-&gt;fract_length = 0;<br />}<br />return decimal_ptr;<br />}<br /><br />char * add(DECIMAL * x_ptr, DECIMAL * y_ptr, char * buf)<br />{<br />char bufx&#91;20&#93;=&quot;&quot;, bufy&#91;20&#93;=&quot;&quot;;<br />uint32_t x_multiplier = 1, y_multiplier = 1;<br />int64_t temp;<br /><br />for (uint8_t i = 0; i &lt; x_ptr-&gt;fract_length; i++){ x_multiplier *= 10; }<br />for (uint8_t i = 0; i &lt; y_ptr-&gt;fract_length; i++){ y_multiplier *= 10; }<br />convert2integer(x_ptr, bufx);<br />convert2integer(y_ptr, bufy);<br /><br />if(x_ptr-&gt;fract_length &gt; y_ptr-&gt;fract_length)<br />for(uint8_t i = 0; i &lt; x_ptr-&gt;fract_length - y_ptr-&gt;fract_length ; i++)<br />strcat(bufy, &quot;0&quot;);//add zeros<br />if(x_ptr-&gt;fract_length &lt; y_ptr-&gt;fract_length)<br />for(uint8_t i = 0; i &lt; y_ptr-&gt;fract_length - x_ptr-&gt;fract_length ; i++)<br />strcat(bufx, &quot;0&quot;);//add zeros<br /><br />temp = (int64_t)atol(bufx) + atol(bufy);//add 2 integers<br />ltoa( temp/( (x_multiplier &gt; y_multiplier) ? x_multiplier : y_multiplier), bufy, 10);//total<br />strcpy(buf, bufy);<br />temp = labs(temp%( (x_multiplier &gt; y_multiplier) ? x_multiplier : y_multiplier));//fract part<br />if(temp)//if fract &gt; 0<br />{<br />strcat(buf, &quot;,&quot;);<br />uint8_t lenght = 0;<br />uint64_t multiplier = ((x_multiplier &gt; y_multiplier) ? x_multiplier : y_multiplier);//result multiplier<br />ltoa(temp, bufx, 10);<br />while(multiplier/10) { multiplier /= 10; lenght++; }<br />for(uint8_t i = 0; i &lt; lenght - strlen(bufx); i++)<br />strcat(buf, &quot;0&quot;);//add zeros<br />strcat(buf, bufx);<br />while(buf&#91;strlen(buf)-1&#93; == '0') buf&#91;strlen(buf)-1&#93; = '\0'; //remove zeros at the end<br />}<br />return buf;<br />}<br /><br />char * subtract(DECIMAL * x_ptr, DECIMAL * y_ptr, char * buf)<br />{<br />char bufx&#91;20&#93;=&quot;&quot;, bufy&#91;20&#93;=&quot;&quot;;<br />uint32_t x_multiplier = 1, y_multiplier = 1;<br />int64_t temp;<br /><br />for (uint8_t i = 0; i &lt; x_ptr-&gt;fract_length; i++){ x_multiplier *= 10; }<br />for (uint8_t i = 0; i &lt; y_ptr-&gt;fract_length; i++){ y_multiplier *= 10; }<br />convert2integer(x_ptr, bufx);<br />convert2integer(y_ptr, bufy);<br /><br />if(x_ptr-&gt;fract_length &gt; y_ptr-&gt;fract_length)<br />for(uint8_t i = 0; i &lt; x_ptr-&gt;fract_length - y_ptr-&gt;fract_length ; i++)<br />strcat(bufy, &quot;0&quot;);//add zeros<br />if(x_ptr-&gt;fract_length &lt; y_ptr-&gt;fract_length)<br />for(uint8_t i = 0; i &lt; y_ptr-&gt;fract_length - x_ptr-&gt;fract_length ; i++)<br />strcat(bufx, &quot;0&quot;);//add zeros<br /><br />strcpy(buf, &quot;-&quot;);<br />if(y_ptr-&gt;sign &lt; 0) strcpy(buf, bufy + 1); //if &quot;-&quot; copy without sign<br />else strcat(buf,bufy); //if &quot;&quot; add next to &quot;-&quot;<br />strcpy(bufy, buf);<br /><br />temp = (int64_t)atol(bufx) + atol(bufy);//add 2 integers<br />ltoa( temp/( (x_multiplier &gt; y_multiplier) ? x_multiplier : y_multiplier), bufy, 10);//total<br />strcpy(buf, bufy);<br />temp = abs(temp%( (x_multiplier &gt; y_multiplier) ? x_multiplier : y_multiplier));//fract part<br />if(temp)//if fract &gt; 0<br />{<br />strcat(buf, &quot;,&quot;);<br />uint8_t lenght = 0;<br />uint64_t multiplier = ((x_multiplier &gt; y_multiplier) ? x_multiplier : y_multiplier);//result multiplier<br />ltoa(temp, bufx, 10);<br />while(multiplier/10) { multiplier /= 10; lenght++; }<br />for(uint8_t i = 0; i &lt; lenght - strlen(bufx); i++)<br />strcat(buf, &quot;0&quot;);//add zeros<br />strcat(buf, bufx);<br />while(buf&#91;strlen(buf)-1&#93; == '0') buf&#91;strlen(buf)-1&#93; = '\0'; //remove zeros at the end<br />}<br />return buf;<br />}<br /><br />char * multiply(DECIMAL * x_ptr, DECIMAL * y_ptr, char * buf)<br />{<br /><br />char bufx&#91;20&#93;=&quot;&quot;, bufy&#91;20&#93;=&quot;&quot;;<br />uint32_t x_multiplier = 1, y_multiplier = 1;<br />int64_t temp;<br /><br />for (uint8_t i = 0; i &lt; x_ptr-&gt;fract_length; i++){ x_multiplier *= 10; }<br />for (uint8_t i = 0; i &lt; y_ptr-&gt;fract_length; i++){ y_multiplier *= 10; }<br />convert2integer(x_ptr, bufx);<br />convert2integer(y_ptr, bufy);<br /><br />temp = (int64_t)labs(atol(bufx)) * labs(atol(bufy));//multiply 2 integers<br />if(x_ptr-&gt;sign * y_ptr-&gt;sign &lt; 0) strcpy(buf, &quot;-&quot;);<br />else strcpy(buf, &quot;&quot;);<br />ltoa( temp/(x_multiplier * y_multiplier), bufy, 10);//total<br />strcat(buf, bufy);<br />temp = temp%(x_multiplier * y_multiplier);//fract part<br /><br />if(temp)//if fract &gt; 0<br />{<br />strcat(buf, &quot;,&quot;);<br />uint8_t lenght = 0;<br />uint64_t multiplier = x_multiplier * y_multiplier;//result multiplier<br />ltoa(temp, bufx, 10);<br />while(multiplier/10) { multiplier /= 10; lenght++; }<br />for(uint8_t i = 0; i &lt; lenght - strlen(bufx); i++)<br />strcat(buf, &quot;0&quot;);//add zeros<br />strcat(buf, bufx);<br />while(buf&#91;strlen(buf)-1&#93; == '0') buf&#91;strlen(buf)-1&#93; = '\0'; //remove zeros at the end<br />}<br />return buf;<br />}<br /><br />char * divide(DECIMAL * x_ptr, DECIMAL * y_ptr, char * buf)<br />{<br /><br />char bufx&#91;20&#93;=&quot;&quot;, bufy&#91;20&#93;=&quot;&quot;;<br />uint32_t x_multiplier = 1, y_multiplier = 1;<br />int64_t temp;<br /><br />for (uint8_t i = 0; i &lt; x_ptr-&gt;fract_length; i++){ x_multiplier *= 10; }<br />for (uint8_t i = 0; i &lt; y_ptr-&gt;fract_length; i++){ y_multiplier *= 10; }<br />convert2integer(x_ptr, bufx);<br />convert2integer(y_ptr, bufy);<br /><br />temp = (int64_t)labs(atol(bufx)) * DIVIDE_PREC / labs(atol(bufy));//divide 2 integers<br />if(x_ptr-&gt;sign * y_ptr-&gt;sign &lt; 0) strcpy(buf, &quot;-&quot;);<br />else strcpy(buf, &quot;&quot;);<br />ltoa( ( temp/x_multiplier * y_multiplier) / DIVIDE_PREC  , bufy, 10);//total<br />strcat(buf, bufy);<br />temp = temp%(DIVIDE_PREC * x_multiplier / y_multiplier);//fract part<br /><br />if(temp)//if fract &gt; 0<br />{<br />strcat(buf, &quot;,&quot;);<br />uint8_t lenght = 0;<br />uint64_t multiplier = (DIVIDE_PREC * x_multiplier / y_multiplier);//result multiplier<br />ltoa(temp, bufx, 10);<br />while(multiplier/10) { multiplier /= 10; lenght++; }<br />for(uint8_t i = 0; i &lt; lenght - strlen(bufx); i++)<br />strcat(buf, &quot;0&quot;);//add zeros<br />strcat(buf, bufx);<br />while(buf&#91;strlen(buf)-1&#93; == '0') buf&#91;strlen(buf)-1&#93; = '\0'; //remove zeros at the end<br />}<br />return buf;<br />}<br /><br />char * convert2integer(DECIMAL * decimal_ptr, char * buf)<br />{<br />char temp_buf&#91;20&#93;;<br />uint8_t size;<br /><br />if(decimal_ptr-&gt;sign &lt; 0) strcpy(buf, &quot;-&quot;);<br />else strcpy(buf, &quot;&quot;);<br />if(decimal_ptr-&gt;total) strcat(buf,ltoa(decimal_ptr-&gt;total, temp_buf, 10));<br />if(decimal_ptr-&gt;fract)<br />{<br />ltoa(decimal_ptr-&gt;fract, temp_buf, 10);//fract without leading zeros<br />size = strlen(temp_buf); //number of digits<br />for(uint8_t i = 0; i &lt; decimal_ptr-&gt;fract_length - size ; i++)<br />strcat(buf, &quot;0&quot;);//add zeros before fract part<br />strcat(buf, temp_buf);//add fract<br />}<br />return buf;<br />}[/syntax]<br /><br />-button.h<br />[syntax=c]/*<br /> * button.h<br /> *<br /> *  Created on: 07-04-2013<br /> */<br /><br />#ifndef BUTTON_H_<br />#define BUTTON_H_<br />#include &lt;string.h&gt;<br />#include &lt;stdlib.h&gt;<br />#include &lt;util/delay.h&gt;<br /><br />#include &quot;MK_SSD1963/MK_SSD1963.h&quot;<br />#include &quot;I2C_TWI/i2c_twi.h&quot;<br />#include &quot;MK_STMPE811/mk_stmpe811.h&quot;<br /><br />#define BG_COLOR  white<br />#define LINE_COLOR red<br /><br />#define BRIGHT 0x80<br />#define DARK2<br /><br />typedef struct button<br />{<br />uint16_t x; /* left upper corner */<br />uint8_t y; /* left upper corner */<br />uint8_t width;<br />uint8_t height;<br />uint32_t color;<br />FONT_INFO * font;<br />char text&#91;6&#93;;<br />uint8_t code;<br />struct button * next;<br />} BUTTON;<br /><br />void make_buttons_released(BUTTON * ptr);<br />BUTTON * pressed_button(BUTTON * ptr);<br />BUTTON * search_code(BUTTON * ptr, uint8_t code);<br />void draw_buttons(BUTTON * ptr);<br />void draw_button(BUTTON * ptr);<br />void make_button_pressed(BUTTON * ptr);<br />void make_button_released(BUTTON * ptr);<br />BUTTON * add_button (BUTTON * ptr, uint16_t x, uint8_t y, uint8_t width, uint8_t height,<br />uint32_t color, const FONT_INFO * font, char * text, uint8_t code);<br />#endif /* BUTTON_H_ */[/syntax]<br /><br />-button.c<br />[syntax=c]/*<br /> * button.c<br /> *<br /> *  Created on: 07-04-2013<br /> */<br />#include &quot;button.h&quot;<br /><br />BUTTON * button_ptr = NULL;<br /><br />void make_buttons_released(BUTTON * ptr)<br />{<br />while(ptr)<br />{<br />make_button_released(ptr);<br />ptr = ptr-&gt;next;<br />}<br />}<br /><br />BUTTON * pressed_button(BUTTON * ptr)<br />{<br />int16_t x = TP_X, y = TP_Y;<br />while (ptr)<br />{<br />if ((x &gt;= ptr-&gt;x) &amp;&amp; (x &lt;= ptr-&gt;x + ptr-&gt;width) &amp;&amp; (y &gt;= ptr-&gt;y) &amp;&amp; (y &lt;= ptr-&gt;y + ptr-&gt;height)) break;<br />ptr = ptr-&gt;next;<br />}<br />return ptr;<br />}<br /><br />BUTTON * search_code(BUTTON * ptr, uint8_t code)<br />{<br />while (ptr)<br />{<br />if (ptr-&gt;code == code ) break;<br />ptr = ptr-&gt;next;<br />}<br />return ptr;<br />}<br /><br />void draw_buttons(BUTTON * ptr)<br />{<br />while(ptr)<br />{<br />draw_button(ptr);<br />ptr = ptr-&gt;next;<br />}<br />}<br /><br />void draw_button(BUTTON * ptr)<br />{<br />if(ptr == NULL) return;<br />uint8_t R, G, B, textSizeX, textSizeY;<br />R = ptr-&gt;color &gt;&gt; 16;<br />G = ptr-&gt;color &gt;&gt; 8;<br />B = ptr-&gt;color;<br />Set_color(R/DARK, G/DARK, B/DARK);<br />/* lower lines */<br />tft_line(ptr-&gt;x + 2, ptr-&gt;y + ptr-&gt;height - 2, ptr-&gt;x + ptr-&gt;width - 2, ptr-&gt;y + ptr-&gt;height - 2);<br />tft_line(ptr-&gt;x + 1, ptr-&gt;y + ptr-&gt;height - 1, ptr-&gt;x + ptr-&gt;width - 1, ptr-&gt;y + ptr-&gt;height - 1);<br />/* right lines */<br />tft_line(ptr-&gt;x + ptr-&gt;width - 2, ptr-&gt;y + 1, ptr-&gt;x + ptr-&gt;width - 2, ptr-&gt;y + ptr-&gt;height - 2);<br />tft_line(ptr-&gt;x + ptr-&gt;width - 1, ptr-&gt;y + 0, ptr-&gt;x + ptr-&gt;width - 1, ptr-&gt;y + ptr-&gt;height - 1);<br />/* main rectangle */<br />tft_fill_rect(ptr-&gt;x + 2, ptr-&gt;y + 2, ptr-&gt;width - 4, ptr-&gt;height - 4, ptr-&gt;color);<br />Set_color(R|BRIGHT, G|BRIGHT, B|BRIGHT);<br />/* upper lines */<br />tft_line(ptr-&gt;x + 1, ptr-&gt;y + 1, ptr-&gt;x + ptr-&gt;width - 3, ptr-&gt;y + 1);<br />tft_line(ptr-&gt;x + 0, ptr-&gt;y + 0, ptr-&gt;x + ptr-&gt;width - 2, ptr-&gt;y + 0);<br />/* left lines */<br />tft_line(ptr-&gt;x + 1, ptr-&gt;y + 1, ptr-&gt;x + 1, ptr-&gt;y + ptr-&gt;height - 2);<br />tft_line(ptr-&gt;x + 0, ptr-&gt;y + 0, ptr-&gt;x + 0, ptr-&gt;y + ptr-&gt;height - 1);<br />/* put text in center of the button */<br />setCurrentFont(ptr-&gt;font);<br /><br />/* read first byte form Character descriptors table */<br />textSizeX = pgm_read_byte(pgm_read_word(&amp;ptr-&gt;font-&gt;charInfo)) * strlen(ptr-&gt;text)<br />+ pgm_read_byte(&amp;ptr-&gt;font-&gt;interspacePixels) * (strlen(ptr-&gt;text) - 1);<br />textSizeY = pgm_read_byte(&amp;ptr-&gt;font-&gt;heightPixels);<br />tft_puts(ptr-&gt;x + ptr-&gt;width/2 - textSizeX/2, ptr-&gt;y + ptr-&gt;height/2<br />- textSizeY/2, ptr-&gt;text, ~ptr-&gt;color, ptr-&gt;color );<br />}<br /><br />void make_button_pressed(BUTTON * ptr)<br />{<br />if(ptr == NULL) return;<br />Set_color32(ptr-&gt;color);<br />/* lower line */<br />tft_line(ptr-&gt;x + 2, ptr-&gt;y + ptr-&gt;height - 2, ptr-&gt;x + ptr-&gt;width - 2, ptr-&gt;y + ptr-&gt;height - 2);<br />/* right line */<br />tft_line(ptr-&gt;x + ptr-&gt;width - 2, ptr-&gt;y + 1, ptr-&gt;x + ptr-&gt;width - 2, ptr-&gt;y + ptr-&gt;height - 2);<br /><br />Set_color32(ptr-&gt;color);<br />/* upper line */<br />tft_line(ptr-&gt;x + 1, ptr-&gt;y + 1, ptr-&gt;x + ptr-&gt;width - 3, ptr-&gt;y + 1);<br />/* left line */<br />tft_line(ptr-&gt;x + 1, ptr-&gt;y + 1, ptr-&gt;x + 1, ptr-&gt;y + ptr-&gt;height - 2);<br />}<br /><br />void make_button_released(BUTTON * ptr)<br />{<br />uint8_t R, G, B;<br />if(ptr == NULL) return;<br />R = ptr-&gt;color &gt;&gt; 16;<br />G = ptr-&gt;color &gt;&gt; 8;<br />B = ptr-&gt;color;<br />Set_color(R/DARK, G/DARK, B/DARK);<br />/* lower line */<br />tft_line(ptr-&gt;x + 2, ptr-&gt;y + ptr-&gt;height - 2, ptr-&gt;x + ptr-&gt;width - 2, ptr-&gt;y + ptr-&gt;height - 2);<br />/* right line */<br />tft_line(ptr-&gt;x + ptr-&gt;width - 2, ptr-&gt;y + 1, ptr-&gt;x + ptr-&gt;width - 2, ptr-&gt;y + ptr-&gt;height - 2);<br /><br />Set_color(R|BRIGHT, G|BRIGHT, B|BRIGHT);<br />/* upper line */<br />tft_line(ptr-&gt;x + 1, ptr-&gt;y + 1, ptr-&gt;x + ptr-&gt;width - 3, ptr-&gt;y + 1);<br />/* left line */<br />tft_line(ptr-&gt;x + 1, ptr-&gt;y + 1, ptr-&gt;x + 1, ptr-&gt;y + ptr-&gt;height - 2);<br />}<br /><br />BUTTON * add_button (BUTTON * ptr, uint16_t x, uint8_t y, uint8_t width, uint8_t height,<br />uint32_t color, const FONT_INFO * font, char * text, uint8_t code)<br />{<br />BUTTON * new_button; /* create pointer */<br />BUTTON * before = ptr; /* create pointer */<br /><br />if( ptr == NULL )<br />{<br />ptr = (BUTTON *) malloc( sizeof(BUTTON) ); /* allocate memory */<br />/* complete data */<br />ptr-&gt;x = x;<br />ptr-&gt;y = y;<br />ptr-&gt;width = width;<br />ptr-&gt;height = height;<br />ptr-&gt;color = color;<br />ptr-&gt;font = (FONT_INFO *) font;<br />strcpy ( ptr-&gt;text, text);<br />ptr-&gt;code = code;<br />ptr-&gt;next = NULL;<br />return ptr;<br />}<br />else<br />{<br />new_button = (BUTTON *) malloc ( sizeof(BUTTON) ); /* allocate memory */<br />/* complete data */<br />new_button-&gt;x = x;<br />new_button-&gt;y = y;<br />new_button-&gt;width = width;<br />new_button-&gt;height = height;<br />new_button-&gt;color = color;<br />new_button-&gt;font = (FONT_INFO *) font;<br />strcpy ( new_button-&gt;text, text);<br />new_button-&gt;code = code;<br /><br />while (before-&gt;next)<br />{<br />before = before-&gt;next;<br />}<br />before-&gt;next = new_button;<br />new_button-&gt;next = NULL;<br />return new_button;<br />}<br />}[/syntax]<br />Bibliotekę button można oczywiście wykorzystać w każdym innym projekcie na ekranie dotykowym. Dzięki wykorzystaniu listy jednokierunkowej / wskaźnika do następnej struktury funkcje operujące na klawiszach są wyjątkowo proste. Projekt był testowany na mikrokontrolerze ATMEGA644PA taktowanym częstotliwością 20MHz i taki polecam do tego przykładu ze względu na dużą objętość kodu programu. Do projektu należy również dodać kody z zielonej książki Mirosława Kardasia do obsługi wyświetlacza, kontrolera ekranu dotykowego, funkcji graficznych i do pracy na tekstach.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=465">Krauser</a> — 16 kwi 2013, o 22:48</p><hr />
]]></content>
</entry>
</feed>