Adapted application to data model changes

This commit is contained in:
2018-11-05 18:23:17 +01:00
parent 93fd192782
commit bcf4e1a274
25 changed files with 318 additions and 144 deletions

View File

@ -10,6 +10,8 @@
*******************************************************************************/
package com.minres.scviewer.database.swt.internal;
import java.text.DecimalFormat;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Color;
import org.eclipse.swt.graphics.GC;
@ -22,6 +24,8 @@ public class RulerPainter implements IPainter {
static final int rulerTickMinorC = 10;
static final int rulerTickMajorC = 100;
static final DecimalFormat df = new DecimalFormat("#.00####");
public RulerPainter(WaveformCanvas waveCanvas) {
this.waveCanvas=waveCanvas;
}
@ -64,7 +68,7 @@ public class RulerPainter implements IPainter {
for (long tick = startMinorIncr; tick < end; tick += rulerTickMinor) {
int x0 = (int) (tick/scaleFactor);
if ((tick % rulerTickMajor) == 0) {
gc.drawText(Double.toString(tick/scaleFactor*unitMultiplier)+unit, x0, area.y+textY);
gc.drawText(df.format(tick/scaleFactor*unitMultiplier)+unit, x0, area.y+textY);
gc.drawLine(x0, area.y+majorTickY, x0,area.y+ bottom);
} else {
gc.drawLine(x0, area.y+minorTickY, x0, area.y+bottom);

View File

@ -23,27 +23,24 @@ import org.eclipse.swt.graphics.GC;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.graphics.Rectangle;
import com.minres.scviewer.database.BitVector;
import com.minres.scviewer.database.ISignal;
import com.minres.scviewer.database.ISignalChange;
import com.minres.scviewer.database.ISignalChangeBit;
import com.minres.scviewer.database.ISignalChangeBitVector;
import com.minres.scviewer.database.ISignalChangeReal;
import com.minres.scviewer.database.ui.TrackEntry;
import com.minres.scviewer.database.ui.WaveformColors;
public class SignalPainter extends TrackPainter {
private class SignalChange {
long time;
ISignalChange value;
Object value;
boolean fromMap;
public SignalChange(Entry<Long, ? extends ISignalChange> entry) {
public SignalChange(Entry<Long, ?> entry) {
time = entry.getKey();
value = entry.getValue();
fromMap = true;
}
public void set(Entry<Long, ? extends ISignalChange> entry, Long actTime) {
public void set(Entry<Long, ?> entry, Long actTime) {
if (entry != null) {
time = entry.getKey();
value = entry.getValue();
@ -84,7 +81,7 @@ public class SignalPainter extends TrackPainter {
}
public void paintArea(GC gc, Rectangle area) {
ISignal<? extends ISignalChange> signal = trackEntry.getSignal();
ISignal<?> signal = trackEntry.getSignal();
if (trackEntry.selected)
gc.setBackground(this.waveCanvas.colors[WaveformColors.TRACK_BG_HIGHLITE.ordinal()]);
else
@ -93,8 +90,8 @@ public class SignalPainter extends TrackPainter {
gc.fillRectangle(area);
long beginTime = area.x * this.waveCanvas.getScaleFactor();
long endTime = (area.x + area.width) * this.waveCanvas.getScaleFactor();
Entry<Long, ? extends ISignalChange> first = signal.getEvents().floorEntry(beginTime);
Entry<Long, ? extends ISignalChange> last = signal.getEvents().floorEntry(endTime);
Entry<Long, ?> first = signal.getEvents().floorEntry(beginTime);
Entry<Long, ?> last = signal.getEvents().floorEntry(endTime);
if (first == null) {
if (last == null)
return;
@ -105,7 +102,7 @@ public class SignalPainter extends TrackPainter {
gc.setForeground(this.waveCanvas.colors[WaveformColors.LINE.ordinal()]);
gc.setLineStyle(SWT.LINE_SOLID);
gc.setLineWidth(1);
NavigableMap<Long, ? extends ISignalChange> entries = signal.getEvents().subMap(first.getKey(), false, last.getKey(), true);
NavigableMap<Long, ?> entries = signal.getEvents().subMap(first.getKey(), false, last.getKey(), true);
SignalChange left = new SignalChange(first);
SignalChange right = new SignalChange(entries.size() > 0 ? entries.firstEntry() : first);
maxX = area.x + area.width;
@ -143,7 +140,7 @@ public class SignalPainter extends TrackPainter {
if (xEnd == xBegin) {
multiple = true;
long eTime = (xBegin + 1) * this.waveCanvas.getScaleFactor();
Entry<Long, ? extends ISignalChange> entry = entries.floorEntry(eTime);
Entry<Long, ?> entry = entries.floorEntry(eTime);
if(entry!=null && entry.getKey()> right.time)
right.set(entry, endTime);
xEnd = getXEnd(eTime);
@ -151,17 +148,19 @@ public class SignalPainter extends TrackPainter {
} while (left.time < endTime);
}
private SignalStencil getStencil(GC gc, SignalChange left, NavigableMap<Long, ? extends ISignalChange> entries) {
if(left.value instanceof ISignalChangeBit)
return new SingleBitStencil();
else if (left.value instanceof ISignalChangeBitVector)
private SignalStencil getStencil(GC gc, SignalChange left, NavigableMap<Long, ?> entries) {
Object val = left.value;
if(val instanceof BitVector) {
BitVector bv = (BitVector) val;
if(bv.getWidth()==1)
return new SingleBitStencil();
if(trackEntry.waveDisplay==TrackEntry.WaveDisplay.DEFAULT)
return new MultiBitStencil(gc);
else
return new MultiBitStencilAnalog(entries, left.value,
trackEntry.waveDisplay==TrackEntry.WaveDisplay.CONTINOUS,
trackEntry.valueDisplay==TrackEntry.ValueDisplay.SIGNED);
else if (left.value instanceof ISignalChangeReal)
} else if (val instanceof Double)
return new RealStencil(entries, left.value, trackEntry.waveDisplay==TrackEntry.WaveDisplay.CONTINOUS);
else
return null;
@ -169,7 +168,7 @@ public class SignalPainter extends TrackPainter {
private interface SignalStencil {
public void draw(GC gc, Rectangle area, ISignalChange left, ISignalChange right, int xBegin, int xEnd, boolean multiple);
public void draw(GC gc, Rectangle area, Object left, Object right, int xBegin, int xEnd, boolean multiple);
}
private class MultiBitStencil implements SignalStencil {
@ -183,9 +182,10 @@ public class SignalPainter extends TrackPainter {
tmpAwtFont = new java.awt.Font(fd.getName(), fd.getStyle(), height);
}
public void draw(GC gc, Rectangle area, ISignalChange left, ISignalChange right, int xBegin, int xEnd, boolean multiple) {
@SuppressWarnings("unchecked")
public void draw(GC gc, Rectangle area, Object left, Object right, int xBegin, int xEnd, boolean multiple) {
Color colorBorder = waveCanvas.colors[WaveformColors.SIGNAL0.ordinal()];
ISignalChangeBitVector last = (ISignalChangeBitVector) left;
BitVector last = (BitVector) left;
if (last.getValue().toString().contains("X")) {
colorBorder = waveCanvas.colors[WaveformColors.SIGNALX.ordinal()];
} else if (last.getValue().toString().contains("Z")) {
@ -208,13 +208,13 @@ public class SignalPainter extends TrackPainter {
String label = null;
switch(trackEntry.valueDisplay) {
case SIGNED:
label=Long.toString(last.getValue().toSignedValue());
label=Long.toString(last.toSignedValue());
break;
case UNSIGNED:
label=Long.toString(last.getValue().toUnsignedValue());
label=Long.toString(last.toUnsignedValue());
break;
default:
label="h'"+last.getValue().toHexString();
label="h'"+last.toHexString();
}
Point bb = getBoxWidth(gc, label);
if (xBegin < area.x) {
@ -245,16 +245,15 @@ public class SignalPainter extends TrackPainter {
private long minVal;
private long range;
@SuppressWarnings("unchecked")
public MultiBitStencilAnalog(NavigableMap<Long, ? extends ISignalChange> entries, ISignalChange left, boolean continous, boolean signed) {
public MultiBitStencilAnalog(NavigableMap<Long, ?> entries, Object left, boolean continous, boolean signed) {
this.continous=continous;
Collection<ISignalChangeBitVector> values = ((NavigableMap<Long, ISignalChangeBitVector>) entries).values();
minVal=((ISignalChangeBitVector) left).getValue().toUnsignedValue();
Collection<?> values = ((NavigableMap<Long, ?>) entries).values();
minVal=((BitVector) left).toUnsignedValue();
range=2;
if(!values.isEmpty()) {
long maxVal=minVal;
for (ISignalChange e : entries.values()) {
long v = ((ISignalChangeBitVector)e).getValue().toUnsignedValue();
for (Object e : entries.values()) {
long v = ((BitVector)e).toUnsignedValue();
maxVal=Math.max(maxVal, v);
minVal=Math.min(minVal, v);
}
@ -268,9 +267,10 @@ public class SignalPainter extends TrackPainter {
}
public void draw(GC gc, Rectangle area, ISignalChange left, ISignalChange right, int xBegin, int xEnd, boolean multiple) {
long leftVal = ((ISignalChangeBitVector) left).getValue().toUnsignedValue();
long rightVal= ((ISignalChangeBitVector) right).getValue().toUnsignedValue();
@SuppressWarnings("unchecked")
public void draw(GC gc, Rectangle area, Object left, Object right, int xBegin, int xEnd, boolean multiple) {
long leftVal = ((BitVector) left).toUnsignedValue();
long rightVal= ((BitVector) right).toUnsignedValue();
gc.setForeground(waveCanvas.colors[WaveformColors.SIGNAL_REAL.ordinal()]);
int yOffsetLeft = (int) ((leftVal-minVal) / range * (yOffsetB-yOffsetT));
int yOffsetRight = (int) ((rightVal-minVal) / range * (yOffsetB-yOffsetT));
@ -294,7 +294,8 @@ public class SignalPainter extends TrackPainter {
}
private class SingleBitStencil implements SignalStencil {
public void draw(GC gc, Rectangle area, ISignalChange left, ISignalChange right, int xBegin, int xEnd, boolean multiple) {
@SuppressWarnings("unchecked")
public void draw(GC gc, Rectangle area, Object left, Object right, int xBegin, int xEnd, boolean multiple) {
if (multiple) {
gc.setForeground(waveCanvas.colors[WaveformColors.SIGNALU.ordinal()]);
gc.drawLine(xBegin, yOffsetT, xBegin, yOffsetB);
@ -303,7 +304,7 @@ public class SignalPainter extends TrackPainter {
} else {
Color color = waveCanvas.colors[WaveformColors.SIGNALX.ordinal()];
int yOffset = yOffsetM;
switch (((ISignalChangeBit) left).getValue()) {
switch (((BitVector) left).getValue()[0]) {
case '1':
color = waveCanvas.colors[WaveformColors.SIGNAL1.ordinal()];
yOffset = yOffsetT;
@ -323,7 +324,7 @@ public class SignalPainter extends TrackPainter {
} else {
gc.drawLine(xBegin, yOffset, xEnd, yOffset);
int yNext = yOffsetM;
switch (((ISignalChangeBit) right).getValue()) {
switch (((BitVector) right).getValue()[0]) {
case '1':
yNext = yOffsetT;
break;
@ -347,16 +348,15 @@ public class SignalPainter extends TrackPainter {
boolean continous=true;
@SuppressWarnings("unchecked")
public RealStencil(NavigableMap<Long, ? extends ISignalChange> entries, ISignalChange left, boolean continous) {
public RealStencil(NavigableMap<Long, ?> entries, Object left, boolean continous) {
this.continous=continous;
Collection<ISignalChangeReal> values = ((NavigableMap<Long, ISignalChangeReal>) entries).values();
minVal=((ISignalChangeReal) left).getValue();
Collection<?> values = ((NavigableMap<Long, ?>) entries).values();
minVal=(Double) left;
range=2.0;
if(!values.isEmpty()) {
double maxVal=minVal;
for (ISignalChange e : entries.values()) {
double v = ((ISignalChangeReal)e).getValue();
for (Object e : entries.values()) {
double v = ((Double)e);
if(Double.isNaN(maxVal))
maxVal=v;
else if(!Double.isNaN(v))
@ -375,9 +375,10 @@ public class SignalPainter extends TrackPainter {
}
}
public void draw(GC gc, Rectangle area, ISignalChange left, ISignalChange right, int xBegin, int xEnd, boolean multiple) {
double leftVal = ((ISignalChangeReal) left).getValue();
double rightVal= ((ISignalChangeReal) right).getValue();
@SuppressWarnings("unchecked")
public void draw(GC gc, Rectangle area, Object left, Object right, int xBegin, int xEnd, boolean multiple) {
double leftVal = (Double) left;
double rightVal= (Double) right;
if(Double.isNaN(leftVal)) {
Color color = waveCanvas.colors[WaveformColors.SIGNAL_NAN.ordinal()];
int width = xEnd - xBegin;

View File

@ -80,7 +80,7 @@ public class WaveformCanvas extends Canvas {
private List<CursorPainter> cursorPainters;
HashMap<IWaveform<?>, IWaveformPainter> wave2painterMap;
HashMap<IWaveform, IWaveformPainter> wave2painterMap;
/**
* Constructor for ScrollableCanvas.
*
@ -438,7 +438,7 @@ public class WaveformCanvas extends Canvas {
return result;
}
public List<Object> getEntriesAtPosition(IWaveform<? extends IWaveformEvent> iWaveform, int i) {
public List<Object> getEntriesAtPosition(IWaveform iWaveform, int i) {
LinkedList<Object> result=new LinkedList<>();
int x = i - origin.x;
for(IPainter p: wave2painterMap.values()){
@ -481,7 +481,7 @@ public class WaveformCanvas extends Canvas {
}
}
public void reveal(IWaveform<? extends IWaveformEvent> waveform) {
public void reveal(IWaveform waveform) {
for (IWaveformPainter painter : wave2painterMap.values()) {
TrackEntry te = painter.getTrackEntry();
if(te.waveform == waveform) {

View File

@ -13,6 +13,8 @@ package com.minres.scviewer.database.swt.internal;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.beans.PropertyChangeSupport;
import java.text.DecimalFormat;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.HashMap;
@ -70,11 +72,8 @@ import org.eclipse.swt.widgets.Widget;
import org.eclipse.wb.swt.SWTResourceManager;
import com.google.common.collect.Lists;
import com.minres.scviewer.database.BitVector;
import com.minres.scviewer.database.ISignal;
import com.minres.scviewer.database.ISignalChange;
import com.minres.scviewer.database.ISignalChangeBitVector;
import com.minres.scviewer.database.ISignalChangeReal;
import com.minres.scviewer.database.ISignalChangeBit;
import com.minres.scviewer.database.ITx;
import com.minres.scviewer.database.ITxEvent;
import com.minres.scviewer.database.ITxRelation;
@ -95,6 +94,8 @@ public class WaveformViewer implements IWaveformViewer {
private PropertyChangeSupport pcs;
static final DecimalFormat df = new DecimalFormat("#.00####");
private ITx currentTxSelection;
private TrackEntry currentWaveformSelection;
@ -448,24 +449,28 @@ public class WaveformViewer implements IWaveformViewer {
private void updateValueList(){
final Long time = getCursorTime();
for(TrackEntry entry:streams){
if(entry.isSignal()){
ISignalChange event = ((ISignal<?>)entry.waveform).getWaveformEventsBeforeTime(time);
if(event instanceof ISignalChangeBit){
entry.currentValue="b'"+((ISignalChangeBit)event).getValue();
} else if(event instanceof ISignalChangeBitVector){
// TODO: same code resides in SignalPainter, fix it
switch(entry.valueDisplay) {
case SIGNED:
entry.currentValue=Long.toString(((ISignalChangeBitVector)event).getValue().toSignedValue());
break;
case UNSIGNED:
entry.currentValue=Long.toString(((ISignalChangeBitVector)event).getValue().toUnsignedValue());
break;
default:
entry.currentValue="h'"+((ISignalChangeBitVector)event).getValue().toHexString();
if(entry.isSignal()){
ISignal<?> signal = (ISignal<?>) entry.waveform;
Object value = signal.getWaveformValueBeforeTime(time);
if(value instanceof BitVector){
BitVector bv = (BitVector) value;
if(bv.getWidth()==1)
entry.currentValue="b'"+bv;
else {
// TODO: same code resides in SignalPainter, fix it
switch(entry.valueDisplay) {
case SIGNED:
entry.currentValue=Long.toString(bv.toSignedValue());
break;
case UNSIGNED:
entry.currentValue=Long.toString(bv.toUnsignedValue());
break;
default:
entry.currentValue="h'"+bv.toHexString();
}
}
} else if(event instanceof ISignalChangeReal){
double val = ((ISignalChangeReal)event).getValue();
} else if(value instanceof Double){
Double val = (Double) value;
if(val>0.001)
entry.currentValue=String.format("%1$,.3f", val);
else
@ -486,15 +491,13 @@ public class WaveformViewer implements IWaveformViewer {
}
firstTx=stream.getEvents().lowerEntry(firstTx.getKey());
}while(firstTx!=null && !isArrayFull(resultsList));
String value=null;
entry.currentValue="";
boolean separator=false;
for(ITx o:resultsList){
if(value==null)
value=new String();
else
value+="|";
if(o!=null) value+=((ITx)o).getGenerator().getName();
if(separator) entry.currentValue+="|";
if(o!=null) entry.currentValue+=((ITx)o).getGenerator().getName();
separator=true;
}
entry.currentValue=value;
}
}
}
@ -813,13 +816,13 @@ public class WaveformViewer implements IWaveformViewer {
Rectangle subArea = new Rectangle(rect.x, 0, rect.width, waveformCanvas.getTrackHeight());
if (lastKey == firstKey) {
TrackEntry trackEntry=trackVerticalOffset.get(firstKey);
IWaveform<? extends IWaveformEvent> w = trackEntry.waveform;
IWaveform w = trackEntry.waveform;
if (w instanceof ITxStream<?>)
subArea.height *= ((ITxStream<?>) w).getMaxConcurrency();
drawTextFormat(gc, subArea, firstKey, w.getFullName(), trackEntry.selected);
} else {
for (Entry<Integer, TrackEntry> entry : trackVerticalOffset.subMap(firstKey, true, lastKey, true).entrySet()) {
IWaveform<? extends IWaveformEvent> w = entry.getValue().waveform;
IWaveform w = entry.getValue().waveform;
subArea.height = waveformCanvas.getTrackHeight();
if (w instanceof ITxStream<?>)
subArea.height *= ((ITxStream<?>) w).getMaxConcurrency();
@ -840,14 +843,14 @@ public class WaveformViewer implements IWaveformViewer {
Rectangle subArea = new Rectangle(rect.x, 0, rect.width, waveformCanvas.getTrackHeight());
if (lastKey == firstKey) {
TrackEntry trackEntry=trackVerticalOffset.get(firstKey);
IWaveform<? extends IWaveformEvent> w = trackEntry.waveform;
IWaveform w = trackEntry.waveform;
if (w instanceof ITxStream<?>)
subArea.height *= ((ITxStream<?>) w).getMaxConcurrency();
drawValue(gc, subArea, firstKey, trackEntry.currentValue, trackEntry.selected);
} else {
for (Entry<Integer, TrackEntry> entry : trackVerticalOffset.subMap(firstKey, true, lastKey, true)
.entrySet()) {
IWaveform<? extends IWaveformEvent> w = entry.getValue().waveform;
IWaveform w = entry.getValue().waveform;
subArea.height = waveformCanvas.getTrackHeight();
if (w instanceof ITxStream<?>)
subArea.height *= ((ITxStream<?>) w).getMaxConcurrency();
@ -1038,7 +1041,7 @@ public class WaveformViewer implements IWaveformViewer {
});
}
public TrackEntry getEntryForStream(IWaveform<?> source) {
public TrackEntry getEntryForStream(IWaveform source) {
for(TrackEntry trackEntry:streams)
if(trackEntry.waveform.equals(source)) return trackEntry;
return null;
@ -1178,7 +1181,8 @@ public class WaveformViewer implements IWaveformViewer {
public String getScaledTime(long time) {
StringBuilder sb = new StringBuilder();
Double dTime=new Double(time);
return sb.append(dTime/waveformCanvas.getScaleFactorPow10()).append(waveformCanvas.getUnitStr()).toString();
Double scaledTime = dTime/waveformCanvas.getScaleFactorPow10();
return sb.append(df.format(scaledTime)).append(waveformCanvas.getUnitStr()).toString();
}
/* (non-Javadoc)