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.