/******************************************************************************* * Copyright (c) 2003-2005, 2013 Till Zoppke. * All rights reserved. This program and the accompanying materials * are made available under the terms of the GNU Public License v3.0 * which accompanies this distribution, and is available at * http://www.gnu.org/licenses/gpl.html * * Contributors: * Till Zoppke - initial API and implementation ******************************************************************************/ /* * Created on 26.10.2003 * * To change the template for this generated file go to * Window - Preferences - Java - Code Generation - Code and Comments */ package eniac.data.model.parent; import java.util.List; import eniac.data.model.EData; import eniac.data.model.sw.Switch; import eniac.data.model.sw.SwitchAndFlag; import eniac.data.model.unit.Unit; import eniac.data.type.EType; import eniac.property.ConditionedProperty; import eniac.property.Property; import eniac.util.StringConverter; /** * @author zoppke * * To change the template for this generated type comment go to Window - * Preferences - Java - Code Generation - Code and Comments */ public class BlinkenLights extends ParentData { public static final long MODVAL = 20000000000L; private boolean _enabled; // ============================= lifecycle // ================================== public BlinkenLights() { // empty } // ============================== methods // =================================== public boolean hasPower() { Configuration config = (Configuration) getParent(); Unit unit = config.getUnit(_gridNumbers[0]); return unit.hasPower(); } public List<Property> getProperties() { List<Property> list = super.getProperties(); if (hasPower()) { String s = Long.toString(getNumber()); list.add(new ConditionedProperty(Tag.NUMBER.toString(), s) { protected boolean checkValue(String value) { try { long l = Long.parseLong(value); return (l >= 0 && l < MODVAL); } catch (NumberFormatException e) { return false; } } }); } return list; } public void setProperties(List<Property> l) { for (Property p : l) { if (p.getName().equals(Tag.NUMBER)) { String s = ((ConditionedProperty) p).getValue(); setNumber(StringConverter.toLong(s)); // it.remove(); ==> need to remove from iterator (== property // list) ? } } super.setProperties(l); } public void setEnabled(boolean b) { if (b != _enabled) { EData[] children = getGarten().getAllKinder(); for (int i = 0; i < children.length; ++i) { Switch sw = (Switch) children[i]; sw.setEnabled(b); } } _enabled = b; setChanged(); notifyObservers(EData.REPAINT); } // ============================ number methods // ============================== public long getNumber() { // initialize start value for number according to sign Switch sign = (Switch) getGarten().getKind(EType.BLINKEN_SIGN_SWITCH, 0); long number = sign.getValue(); // add digit by digit EData[] digits = getGarten().getKinder(EType.BLINKEN_NUMBER_SWITCH); for (int i = 0; i < 10; ++i) { number *= 10; number += ((Switch) digits[i]).getValue(); } // return number return number; } /** * Sets the number to the specified value. * * @param l * The new value for the number */ public void setNumber(long l) { assert (0 <= l && l < MODVAL); // set digits EData[] digits = getGarten().getKinder(EType.BLINKEN_NUMBER_SWITCH); for (int i = 9; i >= 0; --i) { ((Switch) digits[i]).setValue((int) (l % 10)); l = l / 10; } // set sign Switch sign = (Switch) getGarten().getKind(EType.BLINKEN_SIGN_SWITCH, 0); sign.setValue((int) l); } public void rotateNumber(long pulse) { // rotate digits EData[] digits = getGarten().getKinder(EType.BLINKEN_NUMBER_SWITCH); for (int i = digits.length - 1; i >= 0; --i) { if (pulse % 10 > 0) { ((SwitchAndFlag) digits[i]).rotateValue(); } pulse /= 10; } // rotate sign if (pulse % 10 > 0) { Switch sign = (Switch) getGarten().getKind(EType.BLINKEN_SIGN_SWITCH, 0); sign.toggleValue(); } } public boolean carryOver() { // perform carryOver at number switches EData[] digits = getGarten().getKinder(EType.BLINKEN_NUMBER_SWITCH); for (int i = digits.length - 1; i > 0; --i) { if (((SwitchAndFlag) digits[i]).isFlag()) { ((SwitchAndFlag) digits[i - 1]).rotateValue(); } } // return the flag of the highest decade counter return ((SwitchAndFlag) digits[0]).isFlag(); } public void clearCarry() { // clear carryOver-flags for all number switches EData[] digits = getGarten().getKinder(EType.BLINKEN_NUMBER_SWITCH); for (int i = 0; i < digits.length; ++i) { ((SwitchAndFlag) digits[i]).setFlag(false); } } public long computePulse(int transmittionCycle) { // set sign EData sign = getGarten().getKind(EType.BLINKEN_SIGN_SWITCH, 0); long pulse = ((Switch) sign).getValue(); // set digits EData[] digits = getGarten().getKinder(EType.BLINKEN_NUMBER_SWITCH); for (int i = 0; i < digits.length; ++i) { pulse = pulse * 10; if (((Switch) digits[i]).getValue() < transmittionCycle) { pulse++; } } // System.out.println(Integer.toBinaryString(pulse)); return pulse; } }