// Path: IOIO/iOIOLibAndroid/src/main/java/ioio/lib/impl/IOIOProtocol.java
// public interface IncomingHandler {
//     public void handleEstablishConnection(byte[] hardwareId, byte[] bootloaderId,
//                                           byte[] firmwareId);
// 
//     public void handleConnectionLost();
// 
//     public void handleSoftReset();
// 
//     public void handleCheckInterfaceResponse(boolean supported);
// 
//     public void handleSetChangeNotify(int pin, boolean changeNotify);
// 
//     public void handleReportDigitalInStatus(int pin, boolean level);
// 
//     public void handleRegisterPeriodicDigitalSampling(int pin, int freqScale);
// 
//     public void handleReportPeriodicDigitalInStatus(int frameNum, boolean values[]);
// 
//     public void handleAnalogPinStatus(int pin, boolean open);
// 
//     public void handleReportAnalogInStatus(List<Integer> pins, List<Integer> values);
// 
//     public void handleUartOpen(int uartNum);
// 
//     public void handleUartClose(int uartNum);
// 
//     public void handleUartData(int uartNum, int numBytes, byte data[]);
// 
//     public void handleUartReportTxStatus(int uartNum, int bytesRemaining);
// 
//     public void handleSpiOpen(int spiNum);
// 
//     public void handleSpiClose(int spiNum);
// 
//     public void handleSpiData(int spiNum, int ssPin, byte data[], int dataBytes);
// 
//     public void handleSpiReportTxStatus(int spiNum, int bytesRemaining);
// 
//     public void handleI2cOpen(int i2cNum);
// 
//     public void handleI2cClose(int i2cNum);
// 
//     public void handleI2cResult(int i2cNum, int size, byte[] data);
// 
//     public void handleI2cReportTxStatus(int spiNum, int bytesRemaining);
// 
//     void handleIcspOpen();
// 
//     void handleIcspClose();
// 
//     void handleIcspReportRxStatus(int bytesRemaining);
// 
//     void handleIcspResult(int size, byte[] data);
// 
//     public void handleIncapReport(int incapNum, int size, byte[] data);
// 
//     public void handleIncapClose(int incapNum);
// 
//     public void handleIncapOpen(int incapNum);
// 
//     public void handleCapSenseReport(int pinNum, int value);
// 
//     public void handleSetCapSenseSampling(int pinNum, boolean enable);
// 
//     public void handleSequencerEvent(SequencerEvent event, int arg);
// 
//     public void handleSync();
// }
// 
// Path: IOIO/iOIOLibAndroid/src/main/java/ioio/lib/impl/IOIOProtocol.java
// enum SequencerEvent {
//     PAUSED, STALLED, OPENED, NEXT_CUE, STOPPED, CLOSED
// }
// 
// Path: IOIO/iOIOLibAndroid/src/main/java/ioio/lib/spi/Log.java
// public class Log {
//     public static int println(int priority, String tag, String msg) {
//         return android.util.Log.println(priority, tag, msg);
//     }
// 
//     public static void e(String tag, String message) {
//         android.util.Log.e(tag, message);
//     }
// 
//     public static void e(String tag, String message, Throwable tr) {
//         android.util.Log.e(tag, message, tr);
//     }
// 
//     public static void w(String tag, String message) {
//         android.util.Log.w(tag, message);
//     }
// 
//     public static void w(String tag, String message, Throwable tr) {
//         android.util.Log.w(tag, message);
//     }
// 
//     public static void i(String tag, String message) {
//         android.util.Log.i(tag, message);
//     }
// 
//     public static void d(String tag, String message) {
//         android.util.Log.d(tag, message);
//     }
// 
//     public static void v(String tag, String message) {
//         android.util.Log.v(tag, message);
//     }
// }


import java.util.Queue;
import java.util.Set;
import java.util.concurrent.ConcurrentLinkedQueue;
import ioio.lib.api.exception.ConnectionLostException;
import ioio.lib.impl.Board.Hardware;
import ioio.lib.impl.IOIOProtocol.IncomingHandler;
import ioio.lib.impl.IOIOProtocol.SequencerEvent;
import ioio.lib.spi.Log;
import java.util.HashSet;
import java.util.List;

    @Override
    public void handleIncapOpen(int incapNum) {
        // logMethod("handleIncapOpen", incapNum);
        incapStates_[incapNum].openNextListener();
    }

    @Override
    public void handleIcspResult(int size, byte[] data) {
        // logMethod("handleIcspResult", size, data);
        icspState_.dataReceived(data, size);
    }

    @Override
    public void handleCapSenseReport(int pinNum, int value) {
        // logMethod("handleCapSenseReport", pinNum, value);
        intputPinStates_[pinNum].setValue(value);
    }

    @Override
    public void handleSetCapSenseSampling(int pinNum, boolean enable) {
        // logMethod("handleSetCapSenseSampling", pinNum, enable);
        if (enable) {
            intputPinStates_[pinNum].openNextListener();
        } else {
            intputPinStates_[pinNum].closeCurrentListener();
        }
    }

    @Override
// Path: IOIO/iOIOLibAndroid/src/main/java/ioio/lib/impl/IOIOProtocol.java
// public interface IncomingHandler {
//     public void handleEstablishConnection(byte[] hardwareId, byte[] bootloaderId,
//                                           byte[] firmwareId);
// 
//     public void handleConnectionLost();
// 
//     public void handleSoftReset();
// 
//     public void handleCheckInterfaceResponse(boolean supported);
// 
//     public void handleSetChangeNotify(int pin, boolean changeNotify);
// 
//     public void handleReportDigitalInStatus(int pin, boolean level);
// 
//     public void handleRegisterPeriodicDigitalSampling(int pin, int freqScale);
// 
//     public void handleReportPeriodicDigitalInStatus(int frameNum, boolean values[]);
// 
//     public void handleAnalogPinStatus(int pin, boolean open);
// 
//     public void handleReportAnalogInStatus(List<Integer> pins, List<Integer> values);
// 
//     public void handleUartOpen(int uartNum);
// 
//     public void handleUartClose(int uartNum);
// 
//     public void handleUartData(int uartNum, int numBytes, byte data[]);
// 
//     public void handleUartReportTxStatus(int uartNum, int bytesRemaining);
// 
//     public void handleSpiOpen(int spiNum);
// 
//     public void handleSpiClose(int spiNum);
// 
//     public void handleSpiData(int spiNum, int ssPin, byte data[], int dataBytes);
// 
//     public void handleSpiReportTxStatus(int spiNum, int bytesRemaining);
// 
//     public void handleI2cOpen(int i2cNum);
// 
//     public void handleI2cClose(int i2cNum);
// 
//     public void handleI2cResult(int i2cNum, int size, byte[] data);
// 
//     public void handleI2cReportTxStatus(int spiNum, int bytesRemaining);
// 
//     void handleIcspOpen();
// 
//     void handleIcspClose();
// 
//     void handleIcspReportRxStatus(int bytesRemaining);
// 
//     void handleIcspResult(int size, byte[] data);
// 
//     public void handleIncapReport(int incapNum, int size, byte[] data);
// 
//     public void handleIncapClose(int incapNum);
// 
//     public void handleIncapOpen(int incapNum);
// 
//     public void handleCapSenseReport(int pinNum, int value);
// 
//     public void handleSetCapSenseSampling(int pinNum, boolean enable);
// 
//     public void handleSequencerEvent(SequencerEvent event, int arg);
// 
//     public void handleSync();
// }
// 
// Path: IOIO/iOIOLibAndroid/src/main/java/ioio/lib/impl/IOIOProtocol.java
// enum SequencerEvent {
//     PAUSED, STALLED, OPENED, NEXT_CUE, STOPPED, CLOSED
// }
// 
// Path: IOIO/iOIOLibAndroid/src/main/java/ioio/lib/spi/Log.java
// public class Log {
//     public static int println(int priority, String tag, String msg) {
//         return android.util.Log.println(priority, tag, msg);
//     }
// 
//     public static void e(String tag, String message) {
//         android.util.Log.e(tag, message);
//     }
// 
//     public static void e(String tag, String message, Throwable tr) {
//         android.util.Log.e(tag, message, tr);
//     }
// 
//     public static void w(String tag, String message) {
//         android.util.Log.w(tag, message);
//     }
// 
//     public static void w(String tag, String message, Throwable tr) {
//         android.util.Log.w(tag, message);
//     }
// 
//     public static void i(String tag, String message) {
//         android.util.Log.i(tag, message);
//     }
// 
//     public static void d(String tag, String message) {
//         android.util.Log.d(tag, message);
//     }
// 
//     public static void v(String tag, String message) {
//         android.util.Log.v(tag, message);
//     }
// }


// Path: IOIO/iOIOLibAndroid/src/main/java/ioio/lib/impl/IncomingState.java
import java.util.Queue;
import java.util.Set;
import java.util.concurrent.ConcurrentLinkedQueue;
import ioio.lib.api.exception.ConnectionLostException;
import ioio.lib.impl.Board.Hardware;
import ioio.lib.impl.IOIOProtocol.IncomingHandler;
import ioio.lib.impl.IOIOProtocol.SequencerEvent;
import ioio.lib.spi.Log;
import java.util.HashSet;
import java.util.List;


    @Override
    public void handleIncapOpen(int incapNum) {
        // logMethod("handleIncapOpen", incapNum);
        incapStates_[incapNum].openNextListener();
    }

    @Override
    public void handleIcspResult(int size, byte[] data) {
        // logMethod("handleIcspResult", size, data);
        icspState_.dataReceived(data, size);
    }

    @Override
    public void handleCapSenseReport(int pinNum, int value) {
        // logMethod("handleCapSenseReport", pinNum, value);
        intputPinStates_[pinNum].setValue(value);
    }

    @Override
    public void handleSetCapSenseSampling(int pinNum, boolean enable) {
        // logMethod("handleSetCapSenseSampling", pinNum, enable);
        if (enable) {
            intputPinStates_[pinNum].openNextListener();
        } else {
            intputPinStates_[pinNum].closeCurrentListener();
        }
    }

    @Override
    public void handleSequencerEvent(SequencerEvent event, int arg) {