package com.integreight.onesheeld.shields.controller;
import android.app.Activity;
import com.integreight.onesheeld.sdk.ShieldFrame;
import com.integreight.onesheeld.R;
import com.integreight.onesheeld.enums.UIShield;
import com.integreight.onesheeld.model.ArduinoConnectedPin;
import com.integreight.onesheeld.model.TerminalPrintedLine;
import com.integreight.onesheeld.shields.ControllerParent;
import com.integreight.onesheeld.shields.fragments.TerminalFragment;
import com.integreight.onesheeld.utils.Log;
import java.io.UnsupportedEncodingException;
import java.util.concurrent.CopyOnWriteArrayList;
public class TerminalShield extends ControllerParent<TerminalShield> {
private static final byte WRITE = 0x01;
private static final byte PRINT = 0x02;
private static final byte DATA_IN = 0x01;
private TerminalHandler eventHandler;
public int[] encodingMths = new int[]{R.id.terminalString, R.id.asci,
R.id.binary, R.id.hex};
public int selectedEnMth = 0;
public CopyOnWriteArrayList<TerminalPrintedLine> terminalPrintedLines = new CopyOnWriteArrayList<>();
public boolean lastItemEndedWithNewLine = true;
public CopyOnWriteArrayList<TerminalPrintedLine> tempLines = new CopyOnWriteArrayList<TerminalPrintedLine>();
public boolean isTimeOn = true, isAutoScrolling = true;
public TerminalShield() {
super();
}
public TerminalShield(Activity activity, String tag) {
super(activity, tag);
}
@Override
public ControllerParent<TerminalShield> init(String tag) {
terminalPrintedLines = new CopyOnWriteArrayList<TerminalPrintedLine>();
lastItemEndedWithNewLine = true;
return super.init(tag);
}
@Override
public void setConnected(ArduinoConnectedPin... pins) {
super.setConnected(pins);
}
private ShieldFrame sf;
public void input(String input) {
sf = new ShieldFrame(UIShield.TERMINAL_SHIELD.getId(), DATA_IN);
sf.addArgument(input);
sendShieldFrame(sf,true);
}
@Override
public void refresh() {
// TODO Auto-generated method stub
}
private boolean greaterThanThousand = false;
@Override
public void onNewShieldFrameReceived(ShieldFrame frame) {
if (frame.getShieldId() == UIShield.TERMINAL_SHIELD.getId()) {
String outputTxt = null;
if (frame.getArguments() != null && frame.getArguments().size() > 0)
outputTxt = frame.getArgumentAsString(0);
if (outputTxt != null) {
String date = terminalPrintedLines.size() == 0
|| terminalPrintedLines
.get(terminalPrintedLines.size() - 1).isEndedWithNewLine ? TerminalFragment
.getTimeAsString() + " [RX] : "
: "";
boolean isEndedWithNewLine = outputTxt.length() > 0
&& outputTxt.charAt(outputTxt.length() - 1) == '\n';
if (lastItemEndedWithNewLine) {
terminalPrintedLines.add(new TerminalPrintedLine(date,
outputTxt.substring(0,
isEndedWithNewLine ? outputTxt.length() - 1
: outputTxt.length()),
isEndedWithNewLine, true));
tempLines.add(new TerminalPrintedLine(date,
getEncodedString(outputTxt.substring(0,
isEndedWithNewLine ? outputTxt.length() - 1
: outputTxt.length())),
isEndedWithNewLine, true));
} else if (terminalPrintedLines.size() > 0
&& tempLines.size() > 0) {
terminalPrintedLines.get(terminalPrintedLines.size() - 1).print = terminalPrintedLines
.get(terminalPrintedLines.size() - 1).print
+ outputTxt.substring(0,
isEndedWithNewLine ? outputTxt.length() - 1
: outputTxt.length());
tempLines.get(tempLines.size() - 1).print = getEncodedString(terminalPrintedLines
.get(terminalPrintedLines.size() - 1).print);
if (isEndedWithNewLine)
terminalPrintedLines
.get(terminalPrintedLines.size() - 1).isEndedWithNewLine = true;
}
lastItemEndedWithNewLine = isEndedWithNewLine;
greaterThanThousand = terminalPrintedLines.size() > 1000;
if (greaterThanThousand) {
// for (int i = 0; i < 1; i++) {
terminalPrintedLines.remove(0);
tempLines.remove(0);
// }
}
switch (frame.getFunctionId()) {
case WRITE:
if (eventHandler != null) {
eventHandler.onPrint(outputTxt, greaterThanThousand);
}
break;
case PRINT:
if (eventHandler != null) {
eventHandler.onPrint(outputTxt, greaterThanThousand);
}
break;
default:
break;
}
}
// Log.d("internetLog", "Terminal " + outputTxt);
}
}
@Override
public void reset() {
if (terminalPrintedLines != null)
terminalPrintedLines.clear();
terminalPrintedLines = null;
}
public TerminalHandler getEventHandler() {
return eventHandler;
}
public void setEventHandler(TerminalHandler eventHandler) {
this.eventHandler = eventHandler;
}
public interface TerminalHandler {
public void onPrint(String output, final boolean clearBeforeWriting);
}
public String getEncodedString(String toBeEncoded) {
String out = "";
switch (selectedEnMth) {
case 0:
out = toBeEncoded;
break;
case 1:
try {
byte[] en = toBeEncoded.getBytes("US-ASCII");
for (byte b : en) {
out += b;
}
} catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
break;
case 2:
byte[] bytes = toBeEncoded.getBytes();
StringBuilder binary = new StringBuilder();
for (byte b : bytes) {
int val = b;
for (int i = 0; i < 8; i++) {
binary.append((val & 128) == 0 ? 0 : 1);
val <<= 1;
}
binary.append(' ');
}
out = binary.toString();
break;
case 3:
byte[] byts = toBeEncoded.getBytes();
for (byte b : byts) {
if ((Integer.toHexString(b).length() < 2))
out += "0" + Integer.toHexString(b) + " ";
else if ((Integer.toHexString(b).length() == 2))
out += Integer.toHexString(b) + " ";
else {
String temp = Integer.toHexString(b);
temp = temp.substring(temp.length() - 2);
out += temp + " ";
}
}
break;
default:
break;
}
return out;
}
}