/******************************************************************************* * See the NOTICE file distributed with this work for additional information * regarding copyright ownership. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. ******************************************************************************/ package hr.fer.zemris.vhdllab.applets.editor.newtb.model.signals; import hr.fer.zemris.vhdllab.applets.editor.newtb.exceptions.UniformSignalChangeException; /** * * @author Davor Jurisic * */ public class SignalChange { private short signalDimension; private long time; private String signalValue; private Signal parentSignal; public SignalChange(short signalDimension, String signalValue, long time) throws UniformSignalChangeException { this(signalDimension, signalValue, time, null); } public SignalChange(short signalDimension, String signalValue, long time, Signal parentSignal) throws UniformSignalChangeException { if(!this.signalValueValid(signalValue)) { throw new UniformSignalChangeException("Vrijednost signala moze poprimiti samo binarne znamenke."); } if(signalValue.length() != signalDimension) throw new UniformSignalChangeException("Dimezija signala razlikuje se od dozvoljene dimenzije."); if(time < 0) throw new UniformSignalChangeException("Vrijeme ne smije biti negativno."); if(signalDimension < 1) throw new UniformSignalChangeException("Dimenzija signala mora biti veca ili jednaka 1."); this.signalDimension = signalDimension; this.signalValue = signalValue; this.time = time; this.parentSignal = parentSignal; } private boolean signalValueValid(String signalValue) { for(int i = 0; i < signalValue.length(); i++) { char c = signalValue.charAt(i); if(c != '1' && c != '0') return false; } return true; } public long getTime() { return time; } public String getSignalValue() { return signalValue; } public void setSignalValue(String signalValue) throws UniformSignalChangeException { if(signalValue.length() != this.signalDimension) throw new UniformSignalChangeException("Dimezija signala razlikuje se od dozvoljene dimenzije."); if(!this.signalValueValid(signalValue)) { throw new UniformSignalChangeException("Vrijednost signala moze poprimiti samo binarne znamenke."); } this.signalValue = signalValue; if(this.parentSignal != null && this.parentSignal.signalChangeListener != null) { this.parentSignal.signalChangeListener.signalChanged(this.parentSignal); } } public short getSignalDimension() { return signalDimension; } @Override public String toString() { return "Dimenzija: " + signalDimension + ", Time: " + time + ", Value: " + signalValue; } @Override public int hashCode() { final int prime = 31; int result = 1; result = prime * result + signalDimension; result = prime * result + ((signalValue == null) ? 0 : signalValue.hashCode()); result = prime * result + (int) (time ^ (time >>> 32)); return result; } @Override public boolean equals(Object obj) { if (this == obj) return true; if (obj == null) return false; if (getClass() != obj.getClass()) return false; SignalChange other = (SignalChange) obj; if (signalDimension != other.signalDimension) return false; if (signalValue == null) { if (other.signalValue != null) return false; } else if (!signalValue.equals(other.signalValue)) return false; if (time != other.time) return false; return true; } }