Kanał - ATNEL tech-forum
Wszystkie działy
Najnowsze wątki



Teraz jest 28 mar 2024, o 19:42


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 17 ] 
Autor Wiadomość
PostNapisane: 16 kwi 2013, o 22:48 
Offline
Uzytkownik zasłużony dla forum.atnel.pl
Avatar użytkownika

Dołączył(a): 16 lip 2012
Posty: 2088
Lokalizacja: Leżajsk / Kraków
Pomógł: 411

ObrazekEkran 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 "button".
Obrazek
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 ;) , ale można tam odnaleźć przykłady obliczeń na ułamkach dziesiętnych bez korzystania ze zmiennych typu double. Pokaz możliwości:

Kod programu:
-main.h
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


-main.c
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


-button.h
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


-button.c
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

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.

_________________
Dragonus Cracovus: Biomagia



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 16 kwi 2013, o 23:17 
Offline
Moderator
Avatar użytkownika

Dołączył(a): 03 paź 2011
Posty: 27212
Lokalizacja: Szczecin
Pomógł: 1041

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:

mirekk36 napisał(a):
jednak jak widzę co na naszym forum kolega Krauser wyprawia z tymi
wyświetlaczami to mi normalnie szczęka opada z zazdrości i sam nie
mogę się doczekać kiedy będę miał czas - nawet tak dla siebie żeby
sobie posiedzieć i przy nich podłubać więcej


wysłałem maila, klik - i jeszcze przed snem myślę sobie aaa co tam - zajrzę jeszcze na forum ;)

a tu proszę znowu kolega Krauser ;) 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 - "ucieczka do przodu" ;)

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 ....

Dodatkowo - chyba się z tego jeszcze szczególnie kolega Ledes z naszego forum ucieszy hmmm ? ;) i doceni bo zdaje się sam jeszcze z tym walczy dzielnie ...

Krauser - no BOMBA projekt !!!!

_________________
zapraszam na blog: http://www.mirekk36.blogspot.com (mój nick Skype: mirekk36 ) [ obejrzyj Kurs EAGLE ] [ mój kanał YT TV www.youtube.com/mirekk36 ]



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 16 kwi 2013, o 23:41 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 06 maja 2012
Posty: 758
Pomógł: 9

No fajnie, fajnie, szacun Krauser.
Fajne efekty wizualne (kliknięcie), układ przestrzenny przycisków no MEGA jak w Casio normalnie. :)

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 -> 2, 2.09 -> 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.

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...

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ć.

Aha, ładnie przygotowana biblioteka, duże reusability, ładny, czytelny kod i dobre nazewnictwo. Aż chce się tego używać. :)

------------------------ [ Dodano po: 23 minutach ]

Żeby nie było za słodko: za długi main (zarówno int main(void) jak i plik main.c)
I raczej nie powinno się tworzyć pliku main.h, tylko np. common.h

------------------------ [ Dodano po: 31 minutach ]

A przyczepię się jeszcze, mam nadzieję że wybaczysz Krauser. ;)
Ale niestety (albo stety?) jestem pedantem jeśli chodzi o przejrzystość, składnię i czytelność kodu.

Chodzi o wskaźniki.

Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

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.
Widać, że ta zmienna to wskaźnik na chara albo że funkcja zwraca wskaźnik na chara. Nie ma niejasności.
Czyli prawidłowo:

Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


------------------------ [ Dodano po: 35 minutach ]

Jeszcze jedno. :)

Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

To aż się prosi o zmianę. Chodzi o magic inty. Czyli o wartości liczbowe bezpośrednio w kodzie, W WIELU MIEJSCACH. 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. ;)

------------------------ [ Dodano po: 45 minutach ]

Kiepski jestem w mallocach, możesz wytłumaczyć tą linijkę?

Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


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 delete z C++ ale nie widzę.

------------------------ [ Dodano po: 51 minutach ]

Nie wgłębiając się w szczegóły niezbyt pojmuję po co jest tutaj zastosowana lista jednokierunkowa. Mógłbyś przybliżyć ten cel?

_________________
ATB 1.03, Win XP SP3, ECLIPSE Indigo 3.7.2



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 17 kwi 2013, o 09:05 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 04 paź 2011
Posty: 8583
Pomógł: 337

No kolego istna masakra ....
zawyżasz poziom forum normalnie , ale to bardzo dobrze
mam nadzieje że i mnie się uda tobie dorównać kiedyś

SUPER..

_________________
[b]San Escobar! Patria mia! Tu eres como la salud.[/b]



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 17 kwi 2013, o 09:22 
Offline
Moderator
Avatar użytkownika

Dołączył(a): 03 paź 2011
Posty: 27212
Lokalizacja: Szczecin
Pomógł: 1041

SunRiver napisał(a):
No kolego istna masakra ....
zawyżasz poziom forum normalnie , .....


Sun ja myślę, że za takie występki trzeba po prostu banować użytkowników bez mrugnięcia oka ;) hahahahaha ....

a na poważnie to im bardziej patrzę w kodziki Krausera to też dochodzę do wniosku , że to majstersztyk(i) ;)

------------------------ [ Dodano po: dzisiaj, o 09:22 ]

Ledes napisał(a):
A przyczepię się jeszcze, mam nadzieję że wybaczysz Krauser. ;)
Ale niestety (albo stety?) jestem pedantem jeśli chodzi o przejrzystość, składnię i czytelność kodu.

Chodzi o wskaźniki.

Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

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.
Widać, że ta zmienna to wskaźnik na chara albo że funkcja zwraca wskaźnik na chara. Nie ma niejasności.
Czyli prawidłowo:

Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


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.

Ledes napisał(a):
Jeszcze jedno. :)

Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

To aż się prosi o zmianę. Chodzi o magic inty. Czyli o wartości liczbowe bezpośrednio w kodzie, W WIELU MIEJSCACH. 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. ;)


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 "powiedzmy że coś to znaczy , np rozmiar w osi X przycisku"..... 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.



Ledes napisał(a):
Kiepski jestem w mallocach, możesz wytłumaczyć tą linijkę?

Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


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

A co ma wspólnego przekazywany do funkcji wskaźnik do BUTTON z rzutowaniem przy malloc ???

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.



Ledes napisał(a):
I gdzie jest zwalniana ta pamięć? Szukam w twoim kodzie odpowiednika delete z C++ ale nie widzę.

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:

- widok zwykły
- widok programisty
- widok zaawansowany

;) 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ć ;) hyhyhy

Ledes napisał(a):
Nie wgłębiając się w szczegóły niezbyt pojmuję po co jest tutaj zastosowana lista jednokierunkowa. Mógłbyś przybliżyć ten cel?


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 "przelecieć" się po wszystkich stworzonych buttonach i coś z nimi zrobić. Po to są często wykorzystywane takie listy.

_________________
zapraszam na blog: http://www.mirekk36.blogspot.com (mój nick Skype: mirekk36 ) [ obejrzyj Kurs EAGLE ] [ mój kanał YT TV www.youtube.com/mirekk36 ]



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 17 kwi 2013, o 13:28 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 06 maja 2012
Posty: 758
Pomógł: 9

mirekk36 napisał(a):
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.

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.

------------------------ [ Dodano po: dzisiaj, o 08:22 ]

mirekk36 napisał(a):
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 "powiedzmy że coś to znaczy , np rozmiar w osi X przycisku"..... 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.

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 "ad hoc" 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.

------------------------ [ Dodano po: dzisiaj, o 08:22 ]

mirekk36 napisał(a):
A co ma wspólnego przekazywany do funkcji wskaźnik do BUTTON z rzutowaniem przy malloc ???

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.

Dzięki za objaśnienie. ;)

------------------------ [ Dodano po: dzisiaj, o 08:22 ]

mirekk36 napisał(a):
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:

- widok zwykły
- widok programisty
- widok zaawansowany

;) 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ć ;) hyhyhy

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?

------------------------ [ Dodano po: dzisiaj, o 08:22 ]

Ledes napisał(a):
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 "przelecieć" się po wszystkich stworzonych buttonach i coś z nimi zrobić. Po to są często wykorzystywane takie listy.

Dzięki, przyjrzę się jeszcze temu mechanizmowi. ;) Bo dość ciekawe podejście. ;)

_________________
ATB 1.03, Win XP SP3, ECLIPSE Indigo 3.7.2



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 17 kwi 2013, o 14:08 
Offline
Moderator
Avatar użytkownika

Dołączył(a): 03 paź 2011
Posty: 27212
Lokalizacja: Szczecin
Pomógł: 1041

Ledes napisał(a):
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.

Ok więc tego nie skomentuję ;)


Ledes napisał(a):
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 "ad hoc" 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.

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: "doczepię się do ....." 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ść)


Ledes napisał(a):
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?

No widzisz ;) 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 ;) ... zakończenie pracy programu polega tu na ? ----> 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 ? ;)

_________________
zapraszam na blog: http://www.mirekk36.blogspot.com (mój nick Skype: mirekk36 ) [ obejrzyj Kurs EAGLE ] [ mój kanał YT TV www.youtube.com/mirekk36 ]



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 17 kwi 2013, o 14:30 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 06 maja 2012
Posty: 758
Pomógł: 9

mirekk36 napisał(a):
No widzisz ;) 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 ;) ... zakończenie pracy programu polega tu na ? ----> 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 ? ;)

Ok, teraz w pełni rozumiem. Dziękuję.

mirekk36 napisał(a):
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: "doczepię się do ....." 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ść)

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 "o, jak super, gratulacje" itp? Konstruktywna krytyka jest bardzo przydatna. Myślę, że warto dawać sobie takie wskazówki bo wzajemnie sobie wtedy pomagamy a nie tylko chwalimy. ;) 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. :) Kieruję się wyłącznie pozytywnymi pobudkami. No chyba, że oczekujesz samych pochwalnych postów w tym temacie - to napisz wprost. :) 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ć. :) Mam nadzieję, że nie zostałem źle odebrany. :)

Pozdrawiam

_________________
ATB 1.03, Win XP SP3, ECLIPSE Indigo 3.7.2



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 17 kwi 2013, o 17:59 
Offline
Uzytkownik zasłużony dla forum.atnel.pl
Avatar użytkownika

Dołączył(a): 16 lip 2012
Posty: 2088
Lokalizacja: Leżajsk / Kraków
Pomógł: 411

Dzięki za wszystkie uwagi. Postaram się odnieść do wszystkich. Zatem po kolei:
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)
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();
3. Plik common.h jak nazwa wskazuje to wspólne definicje dla wielu plików c, a tu nie ma to zastosowania
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:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

5. Liczby w kodzie zamiast #define buttonSizeX 32 i #define buttonSpaceX to oczywiście utrudnianie sobie życia
6. Rzutowanie usuwa warning
7. Biblioteka to tylko pliki button.c i button.h, a w main jest przykład jej wykorzystania. Cały ten "kalkulator" powstał by pokazać koledze Ledes i innym użytkownikom forum 2 rzeczy:
- jak obsługiwać klawiaturę ekranową, bo miał problem z wielokrotnym wypisywaniem na ekran
- 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)
8. Ja tam krytyki się nie boję, bo nikt nie wie kim jestem :lol: Sam mogę siebie skrytykować, że nie można zmieniać szerokości "ramki" oraz używać czcionki o zmiennej szerokości, ale za drobną opłatą chętnie to poprawię ;)

_________________
Dragonus Cracovus: Biomagia



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 17 kwi 2013, o 21:48 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 06 maja 2012
Posty: 758
Pomógł: 9

Krauser napisał(a):
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)

Hmmm na tym GLCD 3.5"" to QWERTY chyba mija się z celem. :) 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ś.

Krauser napisał(a):
3. Plik common.h jak nazwa wskazuje to wspólne definicje dla wielu plików c, a tu nie ma to zastosowania

Ok, mea culpa. Zwracam honor.

Krauser napisał(a):
5. Liczby w kodzie zamiast #define buttonSizeX 32 i #define buttonSpaceX to oczywiście utrudnianie sobie życia

No i tu się zgadzamy. :)

Krauser napisał(a):
- 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)

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ś). ;)

Krauser napisał(a):
ale za drobną opłatą chętnie to poprawię

Haaa, materialista! Przejrzałem Cię! Hyhyhyhyhyhy :)

_________________
ATB 1.03, Win XP SP3, ECLIPSE Indigo 3.7.2



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 17 kwi 2013, o 22:48 
Offline
Uzytkownik zasłużony dla forum.atnel.pl
Avatar użytkownika

Dołączył(a): 16 lip 2012
Posty: 2088
Lokalizacja: Leżajsk / Kraków
Pomógł: 411

Ledes napisał(a):
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ś).

Odstawmy na chwilę język C.
Przykładowo mam liczby x = 10,03 y = -23,302 to działania wykonuję tak:
-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
-odejmowanie: jak wyżej ale najpierw drugiej liczbie zmieniam znak na przeciwny, czyli wynik 33,332
-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
-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.

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 :?: Można obliczyć na innym kalkulatorze, ale nie o to przecież chodzi.
Inny prostszy przykład dzielenia:
x = 1 y = 1000 wynik 0,001
ale
x = 1 y = 10000 wynik 0 (to wynika z przyjętej dokładności)
podczas, gdy spokojnie 1 * 0,0001 = 0,0001

Masz jakiś pomysł ? Czy da się pozbyć tego mnożenia razy założoną dokładność ?

_________________
Dragonus Cracovus: Biomagia



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 17 kwi 2013, o 23:31 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 06 maja 2012
Posty: 758
Pomógł: 9

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).

_________________
ATB 1.03, Win XP SP3, ECLIPSE Indigo 3.7.2



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 25 maja 2016, o 14:02 
Offline
Uzytkownik zasłużony dla forum.atnel.pl
Avatar użytkownika

Dołączył(a): 16 lip 2012
Posty: 2088
Lokalizacja: Leżajsk / Kraków
Pomógł: 411

Cytuj:
Chodzi o wskaźniki.
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

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.
Widać, że ta zmienna to wskaźnik na chara albo że funkcja zwraca wskaźnik na chara. Nie ma niejasności.
Czyli prawidłowo:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.



Co w przypadku lokalnej statycznej zmiennej wskaźnikowej?

_________________
Dragonus Cracovus: Biomagia



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 25 maja 2016, o 15:38 
Offline
Użytkownik

Dołączył(a): 08 mar 2014
Posty: 390
Lokalizacja: Głogów
Pomógł: 11

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ł.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 25 maja 2016, o 21:14 
Offline
Uzytkownik zasłużony dla forum.atnel.pl
Avatar użytkownika

Dołączył(a): 16 lip 2012
Posty: 2088
Lokalizacja: Leżajsk / Kraków
Pomógł: 411

Korzystałem z:
http://www.atnel.pl/atb-glcd-tft-konwerter.html

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.

_________________
Dragonus Cracovus: Biomagia



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 25 maja 2016, o 21:27 
Offline
Użytkownik

Dołączył(a): 08 mar 2014
Posty: 390
Lokalizacja: Głogów
Pomógł: 11

Próbowałem z podobnymi wyświetlaczami z ssd1963 jednak zawsze jest xpt2046 którego nie bardzo lubie.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 30 lip 2020, o 10:38 
Offline
Użytkownik

Dołączył(a): 23 sty 2014
Posty: 1079
Pomógł: 73

Kod tak dobrze napisany że pomimo niewielu komentarzy czyta się go jak dobrą poezję :) kawał roboty, obsługa i tworzenie buttonów to normalnie bajka :)



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
Wyświetl posty nie starsze niż:  Sortuj wg  
Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 17 ] 

Strefa czasowa: UTC + 1


Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zidentyfikowanych użytkowników i 0 gości


Nie możesz rozpoczynać nowych wątków
Nie możesz odpowiadać w wątkach
Nie możesz edytować swoich postów
Nie możesz usuwać swoich postów
Nie możesz dodawać załączników

Szukaj:
Skocz do:  
Sitemap
Technologię dostarcza phpBB® Forum Software © phpBB Group phpBB3.PL
phpBB SEO