Aus RN-Wissen.de
Version vom 19. Juni 2006, 13:06 Uhr von SprinterSB_alt (Diskussion | Beiträge)

(Unterschied) ← Nächstältere Version | Aktuelle Version (Unterschied) | Nächstjüngere Version → (Unterschied)
Wechseln zu: Navigation, Suche
Rasenmaehroboter fuer schwierige und grosse Gaerten im Test

Interface

Funcktionen

void get_taster (const unsigned char num, unsigned char tast)
fff

Datenstrukturen

typedef struct 
{
    /* private */
    const unsigned char delay, old;

    /* Mode des Tasters aus: TM_SHORT, TM_LONG, TM_REPEAT */
    unsigned char mode;
} taste_t;

Defines

Defines (Input)

Input Defines dienen dazu, den Code bzw. die Funktionalität den eigenen Bedürfnissen anzupassen. Nach ihrer Änderung muss der Code neu übersetzt werden.

NUM_TASTER
Die Anzahl der Taster, die man behandeln möchte. Das Array tasten hat NUM_TASTEN Elemente (jedes vom Typ taste_t).
TASTER_LONG
Wird eine Taste kurz gedrückt, dann wird deren Nummer in taster gespeichert. Wird die Taste lange gedrückt, dann wird deren Nummer plus TASTER_LONG in taster gespeichert. Voreinstellung ist 16. Wird z.B. Taste No. 1 kurz gedrückt, wird taster auf 1 gesetzt. Wird sie lange gedrückt und ist tasten[1].mode = TM_LONG, dann wird in taster eine  17 gespeichert.
TASTER_REPEAT_DELAY
Für .mode=TM_REPEAT: Erstverzögerung in Ticks, nach der bei Dauerdruck eines Tasters der auto-repeate einsetzt.
TASTER_REPEAT
Für .mode=TM_REPEAT: Zeitspanne in Ticks zwischen zwei auto-repeats.
TASTER_DELAY_LONG
Für .mode=TM_LONG: Wird ein Taster gedrückt und erst wieder losgelassen, wenn mindestens TASTER_DELAY_LONG Ticks verstrichen sind, ist der Tastendruck "lang". Ansonsten ist er "kurz".

Defines (Output)

Output Defines dienen dazu, "magische Zahlen" aus dem Code heraus zu halten und ihn lesbarer zu machen. Output Defines müssen so bleiben wie sie sind und dürfen nicht verändert werden.

NO_TASTER
Wert, den taster hat, wenn keine Taste gedrückt wurde.

Werte für Komponente .mode:

TM_SHORT
Taster reagiert auf Tastendruck.
TM_LONG
Taster reagiert auf kurzen/langen Tastendruck.
TM_REPEAT
Taster reagiert auf kurzen Tastendruck. Bei langem Tastendruck auto-repeate.

Quellcode

taster.c

#include "taster.h"

volatile signed char taster = NO_TASTER;

taste_t tasten[NUM_TASTER];

/*
 * Aktualisiert 'taster', falls taster==NO_TASTER
 * num:  Nummer des Tasters von 0...NUM_TASTER-1
 * tast:  =0 falls der Taster gerade nicht gedrückt wird
 * tast: !=0 falls der Taster gerade gedrückt wird
 */
void get_taster (const unsigned char num, unsigned char tast) 
{
    const taste_t * const ptast = & tasten[num];
    const unsigned char taster_old = ptast->old;
    unsigned char pressed, press, release, mode, delay;
    if (tast)
        tast = 1;
 
    /* Was wurde gedrückt/losgelassen...? */
 
    /* Taster bleibt gedrückt */
    pressed =  taster_old &  tast;
    /* Taster neu gedrückt */
    press   = ~taster_old &  tast;
    /* Taster losgelassen */
    release =  taster_old & ~tast;

    /* ptast->old = tast;
     * Der Cast dient zum Wegwerfen des 'const' Qualifiers. 
     * Die Komponente wurde als 'const' qualifiziert, 
     * damit es einen Fehler gibt, wenn versucht wird,
     * ihren Wert von aussen zu ändern (private). */
    *((unsigned char *) & ptast->old) = tast;
 
    tast = 0;
 
    mode  = ptast->mode;
    delay = ptast->delay;
 
    if (press)
    {
        if (mode != TM_LONG)
            tast = num;
   
        delay = 0;
    }
    else if (pressed)
    {
        if (delay < 0xfe)
            delay++;
    }
    else if (release)
    {
        if (mode == TM_LONG && delay != 0xff)
            tast = num;
    }
 
    if (mode == TM_LONG)
    {
        if (delay == TASTER_DELAY_LONG)
        {
            tast = TASTER_LONG + num;
            delay = 0xff;
        }
    }
    else if (mode == TM_REPEAT)
    {
        if (delay == TASTER_REPEAT_DELAY)
        {
            tast = num;
            delay = TASTER_REPEAT_DELAY - TASTER_REPEAT;
        }
    }

    if (taster == NO_TASTER)
        taster = tast;
  
    /* siehe oben */ 
    *((unsigned char *) & ptast->delay) = delay;
}

taster.h

#ifndef _TASTER_H_
#define _TASTER_H_

/* Wert für taster, wenn nichts gedrückt wurde */
#define NO_TASTER (-1)

/* Maximale Anzzhl der Taster */
#define NUM_TASTER 4

/* Dieser Offset wird zur Tasten-Nummer addiert,
 * wenn eine Taste lange gedrückt wurde */
#define TASTER_LONG 16

/* Zeitverzögerung (in ticks), bis zum Beginn von auto-repeate */
#define TASTER_REPEAT_DELAY (60)

/* Zeitverzögerung (in ticks), bis zum nächsten auto-repeate */
#define TASTER_REPEAT       (15)

/* Ab dieser Dauer wird der Tastendruck 'lange' */
#define TASTER_DELAY_LONG   (80)

typedef struct 
{
    /* private */
    const unsigned char delay, old;

    /* Mode des Tasters aus: TM_SHORT, TM_LONG, TM_REPEAT */
    unsigned char mode;
} taste_t;

extern taste_t tasten[];

/* In dieser Variable kann abgefragt werden, welche Taste gedrückt wurde.
   --> NO_TASTER:
       es wurde nichts gedrückt
   --> 0..NUM_TASTER-1:
       Taster Numero 'taster' wurde (kurz) gedrückt
   --> TASTER_LONG ... TASTER_LONG + NUM_TASTER-1:
       Taster Numero 'taster-TASTER_LONG' wurde lange gedrückt
*/   
extern volatile signed char taster;

extern void get_taster (const unsigned char num, unsigned char tast);

enum
{
    TM_SHORT,
    TM_LONG,
    TM_REPEAT
};

#endif /* _TASTER_H_ */

LiFePO4 Speicher Test