Package com.cburch.logisim.std.io

Source Code of com.cburch.logisim.std.io.HexDigit

/* Copyright (c) 2010, Carl Burch. License information is located in the
* com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */

package com.cburch.logisim.std.io;

import java.awt.Color;

import com.cburch.logisim.data.Attribute;
import com.cburch.logisim.data.BitWidth;
import com.cburch.logisim.data.Bounds;
import com.cburch.logisim.data.Value;
import com.cburch.logisim.instance.InstanceDataSingleton;
import com.cburch.logisim.instance.InstanceFactory;
import com.cburch.logisim.instance.InstancePainter;
import com.cburch.logisim.instance.InstanceState;
import com.cburch.logisim.instance.Port;

public class HexDigit extends InstanceFactory {
  public HexDigit() {
    super("Hex Digit Display", Strings.getter("hexDigitComponent"));
    setAttributes(new Attribute[] { Io.ATTR_ON_COLOR, Io.ATTR_OFF_COLOR,
          Io.ATTR_BACKGROUND },
        new Object[] { new Color(240, 0, 0), SevenSegment.DEFAULT_OFF,
          Io.DEFAULT_BACKGROUND });
    setPorts(new Port[] {
        new Port( 0, 0, Port.INPUT, 4),
        new Port(10, 0, Port.INPUT, 1)
      });
    setOffsetBounds(Bounds.create(-15, -60, 40, 60));
    setIconName("hexdig.gif");
  }

  @Override
  public void propagate(InstanceState state) {
    int summary = 0;
    Value baseVal = state.getPort(0);
    if (baseVal == null) baseVal = Value.createUnknown(BitWidth.create(4));
    int segs; // each nibble is one segment, in top-down, left-to-right
      // order: middle three nibbles are the three horizontal segments
    switch (baseVal.toIntValue()) {
    case 0:  segs = 0x1110111; break;
    case 1:  segs = 0x0000011; break;
    case 2:  segs = 0x0111110; break;
    case 3:  segs = 0x0011111; break;
    case 4:  segs = 0x1001011; break;
    case 5:  segs = 0x1011101; break;
    case 6:  segs = 0x1111101; break;
    case 7:  segs = 0x0010011; break;
    case 8:  segs = 0x1111111; break;
    case 9:  segs = 0x1011011; break;
    case 10: segs = 0x1111011; break;
    case 11: segs = 0x1101101; break;
    case 12: segs = 0x1110100; break;
    case 13: segs = 0x0101111; break;
    case 14: segs = 0x1111100; break;
    case 15: segs = 0x1111000; break;
    default: segs = 0x0001000; break; // a dash '-'
    }
    if ((segs & 0x1) != 0) summary |= 4; // vertical seg in bottom right
    if ((segs & 0x10) != 0) summary |= 2; // vertical seg in top right
    if ((segs & 0x100) != 0) summary |= 8; // horizontal seg at bottom
    if ((segs & 0x1000) != 0) summary |= 64; // horizontal seg at middle
    if ((segs & 0x10000) != 0) summary |= 1; // horizontal seg at top
    if ((segs & 0x100000) != 0) summary |= 16; // vertical seg at bottom left
    if ((segs & 0x1000000) != 0) summary |= 32; // vertical seg at top left
    if (state.getPort(1) == Value.TRUE) summary |= 128;
   
    Object value = Integer.valueOf(summary);
    InstanceDataSingleton data = (InstanceDataSingleton) state.getData();
    if (data == null) {
      state.setData(new InstanceDataSingleton(value));
    } else {
      data.setValue(value);
    }
  }
 
  @Override
  public void paintInstance(InstancePainter painter) {
    SevenSegment.drawBase(painter);
  }
}
TOP

Related Classes of com.cburch.logisim.std.io.HexDigit

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.