Java ANSI console
--------------- AnsiConsole.java ---------------
public class AnsiConsole {
static volatile double offs = 0, step1 = .15, step2 = .45;
public static void main(String[] args) {
if (System.console() == null) { System.err.println("Console is not available"); return; }
double dblPI = 2 * Math.PI;
Runnable trg = () -> {
while (!Thread.currentThread().isInterrupted()) {
if (offs >= dblPI) offs = 0;
System.out.print("\033[s"); //save cursor position
System.out.print("\033[22;1H");
System.out.print("\033[1J"); //clear screen from cursor up
double angle1 = offs, angle2 = offs;
for (int r, c = 1; c < 80; c++) {
if (angle1 >= dblPI) angle1 = 0;
if (angle2 >= dblPI) angle2 = 0;
r = 6 + (int)Math.round(Math.sin(angle1) * 4);
System.out.print("\033["+r+";"+c+"H"+"*");
r = 16 + (int)Math.round(Math.sin(angle2) * 4);
System.out.print("\033["+r+";"+c+"H"+"*");
angle1 += step1;
angle2 += step2;
}
System.out.print("\033[u"); //restore cursor position
offs += .5;
try { Thread.sleep(500); } catch (Exception e) { Thread.currentThread().interrupt(); }
}
};
System.out.print("\033c"); //reset terminal to initial state
exit: for (;;) {
System.out.print("\033[22;1H");
System.out.print("\033[J"); //clear screen from cursor down
System.out.print("\033[24;1HPress enter key");
Thread thread = new Thread(trg);
thread.start();
System.console().readPassword();
thread.interrupt();
try { thread.join(); } catch (Exception e) { }
String inf = "";
for(;;) {
System.out.print("\033[22;1H");
System.out.print("\033[J"); //clear screen from cursor down
System.out.print("\033[23;1Ht#-Period of top graph (1-9), b#-Period of bottom graph (1-9), q-Quit");
if (!inf.isEmpty()) System.out.print("\033[25;1H" + (inf.length() > 79 ? inf.substring(0, 79) : inf));
System.out.print("\033[24;1H>");
String st = System.console().readLine();
String cmd = st.trim().toLowerCase();
inf = "";
if (cmd.isEmpty()) break;
if ("q".equals(cmd)) break exit;
if (cmd.length() > 1 && "tb".indexOf(cmd.charAt(0)) > -1) {
int sn = 0;
try { sn = Integer.parseInt(cmd.substring(1)); } catch (Exception e) { }
if (sn > 0 && sn < 10) {
double step = sn / 20D + .05;
if (cmd.charAt(0) == 't') step1 = step;
else step2 = step;
break;
} else inf = "Invalid parameter";
}
else inf = "Unknown command: " + st.trim();
}
}
}
}