1

I'm extending the BaseIOIOLooper to open up a UART device and send messages. I'm testing with a readback, where I send a packet over a line and receive that packet on another line and print it out. Because I don't want the InputStream.read() method to block, I am handling packet formation and input in a different thread. I have narrowed my problem down to the InputStream.read() method, which returns -1 (no bytes read, but no exception). Here is what it looks like in the Looper thread:

        @Override
    protected void setup() throws ConnectionLostException, InterruptedException {
        log_.write_log_line(log_header_ + "Beginning IOIO setup.");
        // Initialize IOIO UART pins
        // Input at pin 1, output at pin 2
        try {
            inQueue_ = MinMaxPriorityQueue.orderedBy(new ComparePackets())
                    .maximumSize(QUEUESIZE).create();
            outQueue_ = MinMaxPriorityQueue.orderedBy(new ComparePackets())
                    .maximumSize(QUEUESIZE).create();
            ioio_.waitForConnect();
            uart_ = ioio_.openUart(1, 2, 38400, Uart.Parity.NONE, Uart.StopBits.ONE);
            // Start InputHandler. Takes packets from ELKA on inQueue_
            in_= new InputHandler(inQueue_, uart_.getInputStream());
            in_.start();
            // Start OutputHandler. Takes packets from subprocesses on outQueue_
            out_= new OutputHandler(outQueue_);
            out_.start();
            // Get output stream
            os_=uart_.getOutputStream();
            // Set default target state
            setTargetState(State.TRANSFERRING);
            currInPacket_[0]=1; //Initial value to start transferring
            log_.write_log_line(log_header_ + "IOIO setup complete.\n\t" +
                    "Input pin set to 1\n\tOutput pin set to 2\n\tBaud rate set to 38400\n\t" +
                    "Parity set to even\n\tStop bits set to 1");
        } catch (IncompatibilityException e) {
            log_.write_log_line(log_header_+e.toString());
        } catch (ConnectionLostException e) {
            log_.write_log_line(log_header_+e.toString());
        } catch (Exception e) {
            log_.write_log_line(log_header_+"mystery exception: "+e.toString());
        }
    }

And in the InputHandler thread:

    @Override
public void run() {
    boolean notRead;
    byte i;
    log_.write_log_line(log_header_+"Beginning InputHandler thread");
    while (!stop) {
        i = 0;
        notRead = true;
        nextInPacket = new byte[BUFFERSIZE];
        readBytes = -1;
        //StringBuilder s=new StringBuilder();
        //TODO re-implement this with signals
        while (i < READATTEMPTS && notRead) {
            try {
                // Make sure to adjust packet size. Done manually here for speed.
                readBytes = is_.read(nextInPacket, 0, BUFFERSIZE);
                /* Debugging
                for (int j=0;j<nextInPacket.length;j++)
                    s.append(Byte.toString(nextInPacket[j]));
                log_.write_log_line(log_header_+s.toString());
                */

                if (readBytes != -1) {
                    notRead = false;
                    nextInPacket= new byte[]{1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0};
                    synchronized (q_) {
                        q_.add(nextInPacket);
                    }
                //log_.write_log_line(log_header_ + "Incoming packet contains valid data.");
                } else i++;
            } catch (IOException e) {
                log_.write_log_line(log_header_ + "mystery exception:\n\t" + e.toString());
            }
        }

        if (i>=READATTEMPTS)
            log_.write_log_line(log_header_+"Too many read attempts from input stream.");

        /*
        try {
            sleep(100);
        } catch (InterruptedException e) {
            log_.write_log_line(log_header_+"fuck");
        }
        */
    }
}

On an oscilloscope, pins 1 and 2 both read an oscillating voltage, albeit at a very high amplitude, which is of some concern. Point is nothing is available to be read from the InputStream in the InputHandler class. Any ideas?

errolflynn
  • 641
  • 2
  • 11
  • 24

1 Answers1

0

-1 returned from read() should only happen whenever the UART is closed. The closure can happen as result of explicitly calling close() on the Uart object or calling softReset() on the IOIO object.

The Android log might give you some clues about what's going on.

The reading you're seeing on the oscilloscope is suspicious: how high is "very high amplitude"? You should only ever see 0V or 3.3V on those pins, or floating in case the pins where not opened (or closed) for some reason.

Ytai
  • 631
  • 4
  • 9