La libreria Pltouch I/O come il PLC: Un esempio pratico

In uno dei primi articoli della serie sul Pltouch, abbiamo discusso di come la libreria I/O per il Pltouch venga in contro ai tanti sviluppatori che sono abituati alla programmazione per PLC.

Coloro che sviluppano software per PLC sfruttano il paradigma di programmazione per cui tutto il codice viene eseguito in maniera sequenziale all’interno di un while(true) infinito. Purtroppo questa apparente semplificazione rende piuttosto ripida la curva di apprendimento di linguaggi con paradigma di esecuzione diversi (quali per esempio Java).

La libreria I/O Pltouch cerca invece di rendere questa curva più liscia possibile proponendo un approccio che permette di utilizzare anche in ambito Android lo stile di programmazione PLC.

E quindi in che cosa consiste? Molto semplice. Supponiamo abbiate già creato un progetto Android, importato la libreria Pltouch e già inizializzata (leggete il nostro articolo in merito). Ciò che serve è di far in modo che la vostra Activity implementi l’interfaccia PltouchListener. Grazie a questo potete mettere il vostro codice all’interno della callback onLogicExecution, come per esempio:

public class MainActivity extends Activity implements PlTouchListener{

  private PltouchManager pManager;

  private TextView analog1;

  private TextView analog2;<span style="font-weight: 300;"> </span>

  @Override
  protected void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    analog1 = (TextView)findViewById(R.id.txtAnalog1);
    analog2 = (TextView)findViewById(R.id.txtAnalog2);

    pManager = new PltouchManager(this);
    pManager.setDebug(false);

    pManager.initialize(analog1, analog2);
  }

  @Override
  protected void onPause() {
    super.onPause();
    pManager.teardown();
    pManager = null;
  }

  @Override
  public void onLibraryTearedDown() {
    /* rilascia le risorse */
    Log.d("Pltouch", "library teared down");
  }

  @Override
  public void onLogicExecution() {
    /* aggiungi qui il tuo codice in stile PLC */
    Log.d("Pltouch", "on logic execution");
  }

}

Il codice inserito all’interno della callback onLogicExecution sarà eseguito in maniera sequenziale, un numero infinito di volte indipendentemente da tutto il resto. Una cosa importante da sapere è che tutte le chiamate inserite all’interno del metodo saranno eseguite in un thread diverso da quello della UI: Ciò implica che se volete aggiornare un qualche widget grafico dall’interno della onLogicExecution, dovete utilizzare una chiamata a runOnUiThread, come nell’esempio che segue:

@Override
public void onLogicExecution() {

  Log.d("Pltouch", "on logic execution");

  runOnUiThread(new Runnable() {

    @Override
    public void run() {

      try {

        if (pManager.digitalRead(1) == DigitalValues.HIGH){
          analog1.setText("Digital Input 1 HIGH");
        }else{
          analog1.setText("");
        }

      } catch (IndexOutOfBounds e) {
        e.printStackTrace();
      }
    }

  });

}

In questo esempio, non appena il valore del primo ingresso digitale è alto, viene modificato il testo della TextView analog1 mentre azzerato quando è basso.