package com.lushprojects.circuitjs1.client;
import java.util.Date;
import com.google.gwt.i18n.client.DateTimeFormat;
import com.google.gwt.user.client.ui.Anchor;
public class DataRecorderElm extends CircuitElm {
int dataCount, dataPtr;
double data[];
boolean dataFull;
public DataRecorderElm(int xx, int yy) {
super(xx, yy);
setDataCount(10240);
}
public DataRecorderElm(int xa, int ya, int xb, int yb, int f,
StringTokenizer st) {
super(xa, ya, xb, yb, f);
setDataCount(Integer.parseInt(st.nextToken()));
}
String dump() {
return super.dump() + " " + dataCount;
}
int getDumpType() { return 210; }
int getPostCount() { return 1; }
void reset() {
dataPtr = 0;
dataFull = false;
}
void setPoints() {
super.setPoints();
lead1 = new Point();
}
void draw(Graphics g) {
boolean selected = (needsHighlight());
Font f = new Font("SansSerif", selected ? Font.BOLD : 0, 14);
g.setFont(f);
g.setColor(selected ? selectColor : whiteColor);
String s = "export";
interpPoint(point1, point2, lead1, 1-((int)g.context.measureText(s).getWidth()/2+8)/dn);
setBbox(point1, lead1, 0);
drawCenteredText(g, s, x2, y2, true);
setVoltageColor(g, volts[0]);
if (selected)
g.setColor(selectColor);
drawThickLine(g, point1, lead1);
drawPosts(g);
}
double getVoltageDiff() { return volts[0]; }
void getInfo(String arr[]) {
arr[0] = "data export";
arr[1] = "V = " + getVoltageText(volts[0]);
arr[2] = (dataFull ? dataCount : dataPtr) + "/" + dataCount;
}
void stepFinished() {
data[dataPtr++] = volts[0];
if (dataPtr >= dataCount) {
dataPtr = 0;
dataFull = true;
}
}
void setDataCount(int ct) {
dataCount = ct;
data = new double[dataCount];
dataPtr = 0;
dataFull = false;
}
static public final native String getBlobUrl(String data)
/*-{
var datain=[""];
datain[0]=data;
var oldblob = $doc.recorderBlob;
// remove old blob if any. We should do this when dialog is dismissed, but this is easier
if (oldblob)
URL.revokeObjectURL(oldblob);
var blob=new Blob(datain, {type: 'text/plain' } );
var url = URL.createObjectURL(blob);
$doc.recorderBlob = url;
return url;
}-*/;
public EditInfo getEditInfo(int n) {
if (n == 0) {
EditInfo ei = new EditInfo("# of Data Points", dataCount, -1, -1).setDimensionless();
return ei;
}
if (n == 1) {
EditInfo ei = new EditInfo("", 0, -1, -1);
String dataStr = "# time step = " + sim.timeStep + " sec\n";
int i;
if (dataFull) {
for (i = 0; i != dataCount; i++)
dataStr += data[(i+dataPtr) % dataCount] + "\n";
} else {
for (i = 0; i != dataPtr; i++)
dataStr += data[i] + "\n";
}
String url=getBlobUrl(dataStr);
Date date = new Date();
DateTimeFormat dtf = DateTimeFormat.getFormat("yyyyMMdd-HHmm");
String fname = "data-"+ dtf.format(date) + ".circuitjs.txt";
Anchor a=new Anchor(fname, url);
a.getElement().setAttribute("Download", fname);
ei.anchor = a;
return ei;
}
return null;
}
public void setEditValue(int n, EditInfo ei) {
if (n == 0 && ei.value > 0) {
setDataCount((int)ei.value);
}
if (n == 1)
return;
}
}