Implemented AvoidObject behaviour and TextLCD
[des2015.git] / mart / ev3 / ex2 / nl / ru / des / LCDPrinter.java
index 104521a..8807ce9 100644 (file)
@@ -1,56 +1,58 @@
 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);
-               }
+               });
        }
 }