package nl.ru.des;
+import java.io.IOException;
+import java.io.OutputStream;
+import java.io.PrintStream;
import java.util.Deque;
-import java.util.Iterator;
import java.util.LinkedList;
-import lejos.hardware.lcd.Font;
-import lejos.hardware.lcd.GraphicsLCD;
+import lejos.hardware.lcd.TextLCD;
import lejos.utility.Delay;
-public class LCDPrinter extends Thread {
+public class LCDPrinter{
public static final int PRINTDELAY = 50;
private static Deque<String> buffer = new LinkedList<String>();
- private GraphicsLCD glcd;
- private Font font;
- private Deque<String> lcdbuffer;
- private int charwidth;
-
- public LCDPrinter(GraphicsLCD glcd, Font font) {
- this.glcd = glcd;
- this.font = font;
- glcd.setFont(font);
- lcdbuffer = new LinkedList<String>();
- charwidth = glcd.getWidth()/font.width;
- for(int i = 0; i<glcd.getHeight()/font.height; i++){
- lcdbuffer.add("");
- }
+ public static void startLCDPrinter(final TextLCD glcd) {
+ new Thread(new Runnable(){
+ @Override
+ public void run() {
+ while (true) {
+ if (!buffer.isEmpty()) {
+ String c = buffer.remove();
+ if(c.length() > glcd.getTextWidth()){
+ buffer.addFirst(c.substring(glcd.getTextWidth(), c.length()));
+ c = c.substring(0, glcd.getTextWidth());
+ }
+ glcd.scroll();
+ glcd.drawString(c, 0, glcd.getTextHeight()-1);
+ }
+ Delay.msDelay(PRINTDELAY);
+ }
+ }
+ }).start();
+ LCDPrinter.print("LCDThread started");
}
public static void print(String s){
buffer.addLast(s);
}
-
- public void run() {
- Iterator<String> it;
- while (true) {
- if (!buffer.isEmpty()) {
- String c = buffer.remove();
- lcdbuffer.removeLast();
- if(c.length() > charwidth){
- buffer.addFirst(c.substring(charwidth, c.length()));
- c = c.substring(0, charwidth);
- }
- lcdbuffer.addFirst(c);
- glcd.clear();
- it = lcdbuffer.descendingIterator();
- for(int i = 0; it.hasNext(); i++){
- glcd.drawString(it.next(), 0, i*font.height, font.getBaselinePosition());
+
+ public static PrintStream getPrefixedPrintstream(final String prefix, final TextLCD glcd){
+ return new PrintStream(new OutputStream(){
+ private char[] line = new char[glcd.getTextWidth()];
+ private int index = 0;
+
+ @Override
+ public void write(int b) throws IOException {
+ if(index == line.length-prefix.length() || b == '\n'){
+ LCDPrinter.print(prefix + String.valueOf(line, 0, index));
+ index = 0;
+ } else {
+ line[index++] = (char)b;
}
}
- Delay.msDelay(PRINTDELAY);
- }
+ });
}
}