Skocz do zawartości

Uniwersalna biblioteka obsługi menu wielopoziomowego - jak to ugryźć?


Pomocna odpowiedź

Już chciałem pisać rozprawkę o używaniu narzędzi odpowiednich do złożoności rozwiązywanego problemu, ale raczej sobie odpuszczę.

Mam pytanie o:

	IOmenu->callback[5] = esc;
	IOmenu->callback[6] = mexit;

co dokładnie ma robić esc i mexit? Pewnie okaże się oczywiste po wyjaśnieniu 🙂 

Po co tyle tych funkcji? A co będzie kiedy trzeba będzie dodać jeszcze jedną akcję której nie przewidziałeś?

Inaczej: czy wykonanie polecenia "do góry" może skutkować czymś innym niż przesunięcie do poprzedniej pozycji jeśli to możliwe lub zignorowaniem polecenia jeśli jesteś na początku? Jeśli tak, podaj przykład.

@pmochockiesc zakładam szybkie czyszczenie edytowanego pola, exit szybkie wyjście z menu. 

1 minutę temu, ethanak napisał:

Po co tyle tych funkcji? A co będzie kiedy trzeba będzie dodać jeszcze jedną akcję której nie przewidziałeś?

Dlatego wskaźniki są w tablicy, tak aby można bez problemu dodać akcje, faktycznie z tą inicjalizacją trzeba jeszcze przemyśleć sprawę, wiedziałem że się o to "przyczepisz" 😉 

(edytowany)

Czekaj czekaj czy ty mi sugerujesz że nie powinienem na przód zakładać kierunku przechodzenia po elementach menu? Przecież nie mamy zbyt wiele możliwości 🤔 jest góra, dół, prawo,lewo wejście, wyjście

Poza tym nie zakładam zmiany układu menu w trakcie działania programu, chyba że hm no ale to sporo miejsca zajmuje a przecież nie piszemy systemu operacyjnego

Edytowano przez _LM_

No tak, dochodzi jeszcze zmiana kontekstu w trakcie działania menu, przycisk czy coś musi mieć możliwość zmiany oddziaływania zależnie od wybranej opcji

A co tam się może zmienić?

Pozornie niby tak - np. w menu mojej Anetki jest pozycja "temperatura" i jak tam wciśniesz "enter" to klawisze góra/dół realizują zmuanę nastawu temperatury... ale przecież tego nie realizuje program menu tylko funkcja, którą wywołało wciśnięcie entera. A to zupełnie inna bajka.

4 godziny temu, ethanak napisał:

Teraz weź  swój kod i zmień tak, że na wejściu jest enkoder, a na wyjściu syntezator mowy z uwzględnieniem "where am i". A jak już to zrobisz, to dodaj na szybko dwie pozycje gdzieś na trzecim poziomie a na drugim połącz pozycję 3 i 5 w jedną.

Dodawanie nowych pozycji jest bardzo proste: dodanie nowego stanu i proste zmodyfikowanie przejść miedzy stanami "transitions". W "stanach" mamy wskaźniki na funkcje, które są wykonywane przy wejściu do danego stanu. Dodanie obsługi enkodera jest bardzo proste dodanie funkcji, która w swoim ciele generuje dodatkowy event dla FSM.

pozdrawiam

@FlyingDutch Mam prośbę. Ponieważ na razie udowadniasz wyższość istniejącego rozwiązania nad takim, którego nawet wstępne założenia nie są określome - poczekaj przynajmniej do jutra, do tego czasu pewnie coś się wyklaruje. Wtedy z czystym sumienem będziesz mógł powiedzieć "a nie mówiłem?"

Piszę na poważnie, bez żadnych złośliwości i podtekstów.

  • Lubię! 1
36 minut temu, _LM_ napisał:

Czekaj czekaj czy ty mi sugerujesz że nie powinienem na przód zakładać kierunku przechodzenia po elementach menu? Przecież nie mamy zbyt wiele możliwości 🤔 jest góra, dół, prawo,lewo wejście, wyjście

i tak jest dokładnie w kodzie, który przedstawiłem - naciśniecie klawiszy: góra, dół, prawo,lewo wejście generuje eventy(po polsku zdarzenia) dla maszyny FSM, po których wystąpieniu dokonuje ona zmiany stanu (w definicji "transitions" przejść stanów od FSM  są te zdarzenia). Coś mi się zdaje, że próbujecie odkryć koło na nowo 🤣.

Pozdrawiam

  • Lubię! 1
Przed chwilą, ethanak napisał:

@FlyingDutch Mam prośbę. Ponieważ na razie udowadniasz wyższość istniejącego rozwiązania nad takim, którego nawet wstępne założenia nie są określome - poczekaj przynajmniej do jutra, do tego czasu pewnie coś się wyklaruje. Wtedy z czystym sumienem będziesz mógł powiedzieć "a nie mówiłem?"

Piszę na poważnie, bez żadnych złośliwości i podtekstów.

@ethanak,

ja też na poważnie - nie zadaliście sobie trudu, aby chociaż pobieżnie przeanalizować kod, który przedstawiałem. Skąd tak wnoszę, bo piszecie dalej o sprawach, które w tym kodzie zostały bardzo prosto zrealizowane. Bardzo Cię cenię @ethanak, ale uważam, że w tym wątku trochę się za bardzo pośpieszyłeś z komentarzami..Ale dobra powstrzymam się do jutra od dalszych komentarzy.

Druga sprawa, gdyby ktoś napisał, że napisze swojego bardzo prostego RTOS'a na AVR'y to bym przyklasnął temu pomysłowi, ale pisanie generatora menu dla Arduino , to według mnie lekka przesada 😉. Tak ,ze nie jestem przeciw postępowi, ale opartemu na zdroworozsądkowych zasadach.

Pozdrawiam

 

  • Lubię! 1
25 minut temu, ethanak napisał:

poczekaj przynajmniej do jutra

Najgorzej że muszę za chwilę lecieć na dyżur więc możliwości pracy z libsem będę miał ograniczone.

@FlyingDutch może tak się stać że projekt zostanie porzucony nie mówię że nie(choć pewnie i tak będę próbował dalej). Chciałbym żebyś przeczytał jeszcze raz pierwszy wpis, zrozum że nie chodzi mi tylko o małe AVR  

 

  • Lubię! 1
16 minut temu, FlyingDutch napisał:

Druga sprawa, gdyby ktoś napisał, że napisze swojego bardzo prostego RTOS'a na AVR'y to bym przyklasnął temu pomysłowi, ale pisanie generatora menu dla Arduino , to według mnie lekka przesada 😉.

Pisania RTOS-a na AVR się nie podejmę, ale można założyć nowy wątek i zacząć pisanie czegoś na ARMv7-m 😉

  • Lubię! 2

No i to jest siła callbacków i struktur w języku C. Dzięki @ethanak mam punkt wyjścia, i tak już o wiele więcej wiem niż wynika z pierwszego wpisu, co do generowania menu to niemal od początku zakładałem że takie narzędzie będzie trzeba stworzyć - mi łatwiej będzie napisać aplikację w b4j, zobaczymy jak to wszystko wyjdzie w praktyce. Jak dla mnie jest już późno aby wgryźć się w kod który pokazałeś także zostawiam sobie to na późniejszy czas

Idzie mi to jak krew z nosa, no ale coś tam w miarę czasu wolnego działam. Mam pewną koncepcję związaną ze strukturami w menu: ponieważ budowa struktury od razu wymusza sposób prezentacji danych - przeważnie jest to wskaźnik na tekst, zastanawiam się czy nie lepiej byłoby zamiast tego indeksować pozycję menu przez zwykłego uin16_t. A dopiero na podstawie tego indeksu użyktownik mógłby podjąć decyzję w jaki sposób prezentować dane. Takie podejście komplikuje utworzenie szkieletu menu, ale jak już wcześniej pisałem, jeśli projekt się powiedzie to obliguję się do napisania oprogramowania do tego. Teraz struktura wyglądałaby tak: 

1) stara wersja zaproponowana przez @ethanak

struct menu_menuItem {
    menu_MENUADDR prev, next, parent, child;
    menu_displayItem display;
    uint8_t (*executor)(struct menu_Menu *);
    void *userData;
    uint8_t type;
};

2) z indeksem:

struct menu_menuItem {
    menu_MENUADDR prev, next, parent, child;
    uint16_t idx; // zmiana
    uint8_t (*executor)(struct menu_Menu *);
    void *userData;
    uint8_t type;
};

 

 

 

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...