PDA

View Full Version : [C/C++] Algoritmo gestione Single click/Double click/Right click


TRF83
01-10-2010, 10:51
Ciao a tutti, avrei bisogno di un consulto su di un algoritmo scritto per un microcontrollore (ma tanto è c, quindi la destinazione conta poco! ;)) per la gestione di click singoli, singoli prolungati, doppio click, click destro e click destro prolungato. A me pare funzionare (e le prime prove mi davano ragione..), ma ora..non va più. Le soglie (SOGLIA_CLICK,SOGLIA_DCLICK e SOGLIA_RCLICK sono tutte impostate ad un generico 200..programmando col c non abbiamo un'ottima gestione dei timings, e quindi utilizzare tempi "veri" è praticamente impossibile..).
Vi chiederei un parere su quanto scritto e se trovate errori e me li riportaste..ve ne sarei grato!


//variabili
// tasti=variabile che tiene traccia dello stato in cui mi trovo
// tempo=semplice contatore
// hid_report_in[0]=il tasto premuto
// action_sw=indica se il tasto è premuto o meno (NEGATO!)

switch(tasti){
case 0:
//stato iniziale
mLED_1_Toggle();
hid_report_in[0]=0;
tempo=0;
if(!action_sw){
tasti=1;
tempo=0;
}
break;
case 1:
//primo click
hid_report_in[0]=0;
tempo++;
if(!action_sw){
if(tempo>=floatData[SOGLIA_CLICK]){
tempo=0;
tasti=2;
}
}
else{
tempo=0;
tasti=3;
}
break;
case 2:
// click singolo prolungato
if(!action_sw)
hid_report_in[0]=1;
else{
hid_report_in[0]=0;
tasti=0;
}
break;
case 3:
// stato intermedio tra il primo click e il secondo
tempo++;
hid_report_in[0]=0;
if(action_sw){
if(tempo>floatData[SOGLIA_DCLICK]){
// click singolo
tempo=0;
hid_report_in[0]=1;
tasti=0;
}
}
else{
tempo=0;
tasti=4;
}
break;
case 4:
tempo++;
hid_report_in[0]=0;
if(!action_sw){
if(tempo>floatData[SOGLIA_RCLICK])
tasti=5;
}
else{
// doppio click
hid_report_in[0]=1;
tasti=0;
}
break;
case 5:
// click destro
if(!action_sw)
hid_report_in[0]=2;
else{
hid_report_in[0]=0;
tasti=0;
}
}




In pratica si comporta così:
finchè NON è premuto un tasto->aspetta;(stato 0)
se si preme un tasto, si cambia stato e si controlla cosa vuol fare l'utente;(stato 1)
se il tasto è premuto per più di SOGLIA_CLICK->click sinistro prolungato(stato 2, e al rilascio, stato 0)
altrimenti verifica se si vuole fare un click veloce, doppio click o click destro (stato 3)
se il tasto è rilasciato per più di SOGLIA_DCLICK->click singolo breve (e poi stato 0); altrimenti se si fa click, si verifica se si vuole fare doppio click o click destro (stato 4)
Se il tasto viene rilasciato prima di SOGLIA_RCLICK->doppio click (quindi si invia un semplice click, e poi si va a stato 0); altrimenti -> click destro (stato 5)


Resto in attesa di vostri pareri, e grazie per dargli un'occhiata!