package cbccore.low.simulator; import java.util.LinkedList; import java.util.Queue; public class CreateFirmware extends Thread { private static CreateFirmware instance = null; private boolean exit = false; private Queue<Integer> buffer = new LinkedList<Integer>(); private static final double WHEEL_DIAMETER = 255; private double rightVel = 0.0; private double leftVel = 0.0; private double vel = 0.0; private double distance = 0.0; private double angle = 0.0; private double dpa = 0.0; private double x = 0.0; private double y = 0.0; private long lastUpdate = 0; public static CreateFirmware get() { if (instance == null) { instance = new CreateFirmware(); instance.start(); } return instance; } private CreateFirmware() { clear(); } public void sendByte(int i) { synchronized (buffer) { buffer.add(i); } } private int poll() { Integer i = null; while ((i = buffer.poll()) == null) Thread.yield(); return i; } private int eat8() { Integer i = poll(); buffer.remove(); return i; } public int eat16() { int h = eat8(); int l = eat8(); return (h << 8) | l; } private void clear() { update(); distance = 0; angle = 0; } private void update() { if(lastUpdate == 0) { lastUpdate = System.currentTimeMillis(); return; } long delta = System.currentTimeMillis() - lastUpdate; double oldDistance = distance; distance += vel * ((double)delta / 1000.0); lastUpdate = System.currentTimeMillis(); angle += dpa * (distance - oldDistance); } @Override public void run() { while (!exit) { update(); int op = poll(); switch(op) { case 137: // Drive eat8(); int v = eat16(); int r = eat16(); double half = (WHEEL_DIAMETER / 2); leftVel = ((r - half) * v) / r; rightVel = ((r + half) * v) / r; vel = v; dpa = (Math.PI * r * 2) / 360; break; case 157: dpa = 0.0; break; } Thread.yield(); } } public void exit() { exit = true; } }