3.3.2.8 Detekce změny hodnoty GPIO vstupu
Java GUI rozhraní je převážně řízeno zprávami. Periodické načítání GPIO vstupů je z programátorského hlediska komplikace z důvodu rychlostního omezení, vysoké režie JNI a zpoždění díky komunikačním intervalům mezi Javou a démonem. Proto je pro detekci změn GPIO hodnot k dispozici pomocná vnořená statická třída IndoorTouch.GPIOWatcher. Ta při vytvoření své instance spustí vlákno, které periodicky kontroluje stav GPIO vstupů, a při změně zavolá svoji metodu public void OnGPIOChanged(int gpio, int value) skrze Android Looper, tj. vykonání obsahu této metody se provádí již v UI vlákně. Uživatel, který tedy chce sledovat stav GPIO, si vytvoří syna této třídy a přetíží si tuto metodu. Poté vytvoří instanci této třídy. Příklad:
class MyWatcher extends IndoorTouch.GPIOWatcher { public MyWatcher(int mask) { super(mask); } @Override public void OnGPIOChanged(int gpio, int value) { if (gpio == IndoorTouch.GPIO_PIN_IN1) { // do the magic } } } protected IndoorTouch.GPIOWatcher mWatch = new MyWatcher( IndoorTouch.GPIO_PIN_IN1 | IndoorTouch.GPIO_PIN_IN2);
GPIOWatcher má dva konstruktory:
- public GPIOWatcher(int watchMask)
- public GPIOWatcher(int watchMask, int updateMs)
watchMask je bitové pole GPIO pinů, které budou sledovány. UpdateMs značí počet milisekund, které uplynou mezi jednotlivou kontrolou GPIO vstupů. Výchozí hodnota je 200.