logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

[ATMEGA][BASCOM] Rezystancyjny panel dotykowy - scroll

adambehnke 06 Lip 2010 23:47 3199 6
REKLAMA
  • #1 8268482
    adambehnke
    Poziom 24  
    Witam

    Posiadam w swoich urządzeniach graficzne lcd wraz z dotykowymi panelami rezystancyjnymi. Mam dość rozbudowane menu i potrzebuję takiej funkcji na styl I-Phone -wybierania listy kontaktów , czyli przesuwam palcem w dół po ekranie i lista kontaktów także przesuwa się. Chodzi mi o samo rozpoznanie w którym kierunku przesuwam palcem po ekranie. Generalnie muszę rozpoznać cztery główne kierunki. Jak wiadomo kiedy dotykam ekranu to współrzędne X i Y przyjmują określone wartości jak np: X=100 Y=150. Teraz muszę rozpoznać przesuwanie palcem w 4 kierunkach czyli będę potrzebował jeszcze 4 dodatkowe zmienne jak G ,D,L,P analogicznie g-góra itd.
    Sama zrobienie tzw. scrolowanego menu nie jest problemem. Ale brak mi pomysłu na rozpoznanie kierunku. Oczywiście rozpoznanie kierunku następowało by po określonej długości przesuwania palcem po ekranie a także po czasie przesuwanie tak aby zlikwidować pomyłki w rozpoznawaniu. Samo pole przesuwania będzie miało minimalne wymiary 3*1 cm ale zapewne zrobię większe.

    Przyjmę każdą sugestię wykonania takiego "cudaka" , gdyż męczę się już któryś dzień i słabo to mi wychodzi.
  • REKLAMA
  • REKLAMA
  • #3 8269042
    m.bartczak
    Poziom 16  
    Witam

    Ja bym napisał następujący algorytm (pseudokod, nie znam bascoma ;)):

    
    ; Inicjalizacja zmiennych
    XAct = -1;
    YAct = 0;
    XLast = -1;
    YLast = 0;
    
    
    ; Poniższa procedura na przerwaniach:
    interrupt:
    	XAct, YAct = odczyt_panelu(); // Zakładam że X=-1 gdy panel nie jest dotknięty
    	if(XAct==-1)
    	{
    		XLast = -1;
    	} else {
    		if(XLast!=-1)
    		{
    			XLast = XAct;
    			YLast = YAct;
    		}
    	}
    	ret;
    
    ; Sprawdzanie przeciągnięcia palcem, dragX i dragY zwracają odpowiednie wartości, 0 gdy nie ma przesunięcia
    get_dragged:
    	dragX = 0;
    	dragY = 0;
    
    	if((XLast!=-1) && (XAct!=-1))
    	{
    		dragX = XLast-XAct;
    		dragY = YLast-YAct;
    	}
    	ret dragX, dragY;
    
  • REKLAMA
  • #4 8271954
    adambehnke
    Poziom 24  
    Już wiem jak to zrobię. Zatem:

    Stworzę na LCD pasek po którym będę przesuwał palcem. Owy pasek podzielę na kilkanaście mniejszych obszarów i podczas przeciągania palcem będę przeskakiwał z obszaru na obszar i tym samym będę wiedział który obszar został dotknięty po którym. Według mnie to chyba najprostsza metoda która w prosty sposób pokaże mi kierunek przesuwu. Może nie doskonała ale powinna działać jak trzeba.
  • REKLAMA
  • Pomocny post
    #5 8272045
    m.bartczak
    Poziom 16  
    A mój pomysł nie pomógł? W wyniku tego kodu powinieneś mieć informację o kierunku i odległości przeciągnięcia palcem po ekranie...
  • #6 8272125
    adambehnke
    Poziom 24  
    Przyznam że nie za bardzo rozumiem ten przykład :P Widzę że zapamiętujesz pozycję i podczas dotykania jeśli pozycja uległa zmianie to zostaje dodana lub odjęta od ostatniej pozycji. W ten sposób można by stwierdzić rzeczywiście i kierunek i odległość. W sumie w dużo prostszy sposób niż mój. Będę to musiał jutro przełożyć na bascom i przetestować.

    Chyba że źle zrozumiałem twój przykład to mnie proszę popraw.
  • Pomocny post
    #7 8273884
    m.bartczak
    Poziom 16  
    Dobrze zrozumiałeś :) Zapamiętuje pierwsze dotknięcie ekranu a potem porównuję położenie palca wobec tego pierwszego punktu.

    W momencie podniesienia palca, kasuję zapamiętany punkt dotknięcia.
REKLAMA