Witam,
od kilku dni analizuje kod dotyczący GB 8.LCDhd44780 + projekt wielozadaniowy i jestem pod dużym wrażeniem takiego sposobu sterowania zawartością wyświetlacza LCD świetne rozwiązanie.
Nie zajmuję się zawodowo pisaniem kodu i pewnie dlatego tak mnie to rozwiązanie zachwyciło, mam na myśli to, że nie będąc profesjonalistą nie spotkałem się z innymi rozwiązaniami i stad trudno mi oceniać ale to co zobaczyłem jest eleganckie.
Po to by lepiej opanować materiał wykonywałem przeróbki kodu by osiągnąć różne założenia, głównie kręciłem się wokół ON/OFF warstw przy użyciu pilota oraz zmiany kolejności/widoczności warstw :
W pewnym momencie chciałem za pomocą klawisza z pilota wykonać ON/OFF warstwy ir_mon_layer (monitor kodów hex pilota) No trochę to trwało nim dokładnie zrozumiałem w jaki sposób działa f.ir_mon_auto_hide, po n-tym czytaniu byłem pewny, że nie ma potrzeby wprowadzania zmian do kodu.
Mirek tak napisał kod, że po załadowaniu oryginału warstwa ir_mon_layer znikinie po 2s automatycznie o ile użytkownik nie będzie naciskał klawiszy.
Tymczasem po załadowaniu oryginalnego kodu obserwuję nieco inny efekt, naciskam dowolny klawisz pilota na wyświetlaczu LCD pojawia się kod klawisz, po 2s warstwa ir_mon_layer znika a po kolejnej 1s pojawia się ponownie i już nie znika. Oczywiście naciśnięcie kolejnego klawisza wywołuje identyczny scenariusz.
Sami spróbujcie załadować kod z GB L19_HD44780_LCD.
Super sprawa ja się ucieszyłem nareszcie mogłem sprawdzić czy tylko czytałem GB czy czytałem ze zrozumieniem.
To co poniżej opisuję to moja interpretacja może być błędna, w końcu najwięcej uczymy się właśnie na błędach.
Zabrałem się do szukania przyczyny, po długich poszukiwaniach ustaliłem, że przyczyną ponownego (po 1s) włączenia warstwy ir_mon_layer jest jakaś nieprawidłowość w funkcji (f.) ir_mon_auto_hide.
Lepiej przyjrzałem się f.ir_mon_auto_hide jak w szczegółach ona działa ?, nie opisuje wszystkiego bo to jest w książce skupiłem się na f.ir_mon_auto_hide i jej otoczeniu, ważne są warunki startowe omawianej funkcji.
Wcześniej f. nadrzędna f.show_ir_mon ustaliła warunki startowe dla f.ir_mon_auto_hide:
1. przypisała callbacka ir_mon_layer.EVENT = ir_mon_auto_hide; od tej pory zdarzenie BARREL_EVENT(1) będzie z rozdzielczością co 100ms wywoływało f. ir_mon_auto_hide
2. ustawiono wartość ir_mon_layer.visible=2;
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
Opis działania f.ir_mon_auto_hide:
1.wywołania f.ir_mon_auto_hide są inicjowane przesz zdarzenie BARREL_EVENT(1), przy pierwszym wywołaniu f.ir_mon_auto_hide wyrażenie w ifA TRUE, wartość wyrażenia ifB FALSE gdyż zmienna ir_mon_layer.visible=2, następuje postdekrementacja zmiennej ir_mon_layer.visible
2.kilkanascie kolejnych wywołań f.callback ir_mon_auto_hide inicjowanych przez zdarzenie BARREL_EVENT(1) dla warstwy r_mon_layer nie wywoła żadnych zmian gdyż wartość wyrażenia ifA FALSE, musi upłynąć 1s by zmienna/timer s1_cnt zmieniła wartość
3.po upływie 1s i kolejnym wywołaniu f.ir_mon_auto_hide ifA TRUE wartosc wyrazenia ifB FALSE gdyż zmienna r_mon_layer.visible=1,kolejna postdekrementacja zmiennej ir_mon_layer.visible
4.po kolejnej 1s ifA TRUE wartość wyrażenia ifB TRUE (visible=0)
- wykonana zostanie instrukcja ir_mon_layer.EVENT = NULL; która wyzeruje wsk.na naszą f.callback ir_mon_auto_hide od tego momentu zdarzenie BARREL_EVENT(1)
nie będzie wywoływało f.ir_mon_auto_hide
- nastepuje kolejna dekrementacja zmiennej ir_mon_layer.visible , zmienna ma wartość ? no tego nie rozumiem nie powinna mieć wartości -1 bo jest typu uint8_t,
pomimo tego dopisuję instrukcję ir_mon_layer.visible=0; i od teraz wszystko działa tak jak trzeba.
Po dodaniu instrukcji do f.ir_mon_auto_hide ir_mon_layer.visible=0; warstwa ir_mon_layer znika po 2s i już się nie pojawia, oczywiście kolejne naciśniecie
klawisza włącza warstwę i widzimy wartość kodu klawisza i po kolejnych 2 s znika.
Jednak dlaczego ten problem ma miejsce skoro zmienna ir_mon_layer.visible jest typu uint8_t ?
Nicht Gut.!!
Proszę o info co o tym myślicie, może zbłądziłem i leże jak ta biedna fretka w agreście ?
Pozdrawiam.