package devices.NXT;
import reflect.ObjectInfo;
public class Display
{
private static AT91_REG AT91C_PIOA_SODR;
private static AT91_REG AT91C_PIOA_CODR;
private byte[] buf;
private static SPI spi;
private static byte displayLineNumbers[][] =
{ { (byte) 0xB0, 0x10, 0x00 },
{ (byte) 0xB1, 0x10, 0x00 },
{ (byte) 0xB2, 0x10, 0x00 },
{ (byte) 0xB3, 0x10, 0x00 },
{ (byte) 0xB4, 0x10, 0x00 },
{ (byte) 0xB5, 0x10, 0x00 },
{ (byte) 0xB6, 0x10, 0x00 },
{ (byte) 0xB7, 0x10, 0x00 } };
Display ()
{
AT91C_PIOA_SODR = new AT91_REG(0xFFFFF430);
AT91C_PIOA_CODR = new AT91_REG(0xFFFFF434);
spi = new SPI(0xFFFE0000, 0x100);
buf = new byte[1];
}
public void gotoLine (byte lineNo)
{
displayWrite(displayLineNumbers[lineNo], true);
}
private void put (byte b)
{
displayWait();
buf[0] = b;
displayWrite(buf, false);
}
private static void displayWait ()
{
while ((spi.SPI_SR & AT91_REG.AT91C_SPI_TXEMPTY) == 0)
{
;
}
}
private boolean displayWrite (byte[] pData, boolean isCmd)
{
boolean result = false;
if ((spi.SPI_SR & AT91_REG.AT91C_SPI_TXEMPTY) > 0)
{
if (isCmd)
{
AT91C_PIOA_CODR.reg = AT91_REG.AT91C_PIO_PA12;
}
else
{
AT91C_PIOA_SODR.reg = AT91_REG.AT91C_PIO_PA12;
}
int bufferAddress = ObjectInfo.getAddress(pData);
bufferAddress += 4; // Add header and array count
SPI.spiPDC.TPR = bufferAddress;
SPI.spiPDC.TCR = pData.length;
SPI.spiPDC.PTCR = AT91_REG.AT91C_PDC_TXTEN;
result = true;
}
return result;
}
public void print (byte b)
{
put(b);
}
public void print (char c)
{
byte[] buf = C64Font.get(c);
displayWait();
displayWrite(buf, false);
}
public void print (String s)
{
char[] arr = s.toCharArray();
for (int i = 0; i < arr.length; i++)
print(arr[i]);
}
/**
*
* @param lineNo Linenumber, 0 <= no < 8
* @param s The string to print; 0 < s.length <= 12
*/
public void printAt(byte lineNo, String s)
{
gotoLine (lineNo);
print(s);
}
}