package com.jopdesign.io.paper;
import com.jopdesign.io.SerialPort;
public class SerialHandler extends InterruptHandler {
// A hardware object represents the serial device
private SerialPort sp;
final static int BUF_SIZE = 32;
private volatile byte buffer[];
private volatile int wrPtr, rdPtr;
public SerialHandler(SerialPort sp) {
this.sp = sp;
buffer = new byte[BUF_SIZE];
wrPtr = rdPtr = 0;
}
// This method is scheduled by the hardware
public void handle() {
byte val = (byte) sp.data;
// check for buffer full
if ((wrPtr+1)%BUF_SIZE!=rdPtr) {
buffer[wrPtr++] = val;
}
if (wrPtr>=BUF_SIZE) wrPtr=0;
// enable interrupts again
enableInterrupt();
}
// This method is invoked by the driver thread
synchronized public int read() {
if (rdPtr!=wrPtr) {
int val = ((int) buffer[rdPtr++]) & 0xff;
if (rdPtr>=BUF_SIZE) rdPtr=0;
return val;
} else {
return -1; // empty buffer
}
}
}