package mods.eln.sixnode.modbusrtu; import mods.eln.gui.*; import mods.eln.gui.IGuiObject.IGuiObjectObserver; import mods.eln.wiki.GuiVerticalExtender; import net.minecraft.entity.player.EntityPlayer; import java.io.ByteArrayOutputStream; import java.io.DataOutputStream; import java.io.IOException; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import static mods.eln.i18n.I18N.tr; public class ModbusRtuGui extends GuiScreenEln { ModbusRtuRender render; GuiTextFieldEln station, name; GuiVerticalExtender extender; int extenderYStart; GuiButtonEln txAddButton; GuiButtonEln rxAddButton; HashMap<Integer, GuiTextFieldEln> uuidToRxName = new HashMap<Integer, GuiTextFieldEln>(); GuiHelper helper; public ModbusRtuGui(EntityPlayer player, ModbusRtuRender render) { this.render = render; } @Override public void initGui() { super.initGui(); int y = 6; render.rxTxChange = true; extenderYStart = y + 6; } int generateTxRd(int x, int y) { uuidToRxName.clear(); float extenderPosition = 0; if (extender != null) { extenderPosition = extender.getSliderPosition(); remove(extender); } y = 0; extender = new GuiVerticalExtender(6, 6, helper.xSize - 12, helper.ySize - 12, helper); add(extender); GuiLabel title = new GuiLabel(2, y, tr("Modbus RTU")); extender.add(title); y += 10; station = new GuiTextFieldEln(fontRendererObj, 2, y, 30, helper); if (render.station != -1) station.setText(render.station); station.setObserver(this); station.setComment(0, tr("Station ID")); extender.add(station); name = new GuiTextFieldEln(fontRendererObj, 2 + station.getWidth() + 12, y, 101, helper); y += name.getHeight(); name.setText(render.name); name.setObserver(this); name.setComment(0, tr("Station name")); extender.add(name); y += 5; //y = 0; { x = 2; GuiLabel txLabel = new GuiLabel(x, y + 6, tr("Wireless TX")); extender.add(txLabel); x += 65; txAddButton = new GuiButtonEln(x, y, 40, 20, tr("Add")); txAddButton.setObserver(this); extender.add(txAddButton); y += 20; } List<WirelessTxStatus> tempListTx = new ArrayList<WirelessTxStatus>(render.wirelessTxStatusList.values()); while (!tempListTx.isEmpty()) { int smaller = Integer.MAX_VALUE; WirelessTxStatus best = null; for (WirelessTxStatus tx : tempListTx) { if (tx.uuid < smaller) { smaller = tx.uuid; best = tx; } } tempListTx.remove(best); WirelessTxStatus tx = best; y += 2; x = 2; GuiTextFieldEln txName = new GuiTextFieldEln(fontRendererObj, x, y + 4, 90, helper); txName.setText(tx.name); txName.setComment(0, tr("Channel name")); extender.add(txName); x += txName.getWidth() + 12; GuiTextFieldEln txId = new GuiTextFieldEln(fontRendererObj, x, y + 4, 40, helper); if (tx.id != -1) txId.setText(tx.id); else txId.setText(""); txId.setComment(0, tr("Modbus ID")); extender.add(txId); x += txId.getWidth() + 12; GuiButtonEln txDelete = new GuiButtonEln(x, y, 20, 20, "X"); txDelete.setObserver(new WirelessTxDeleteListener(render, tx.uuid)); extender.add(txDelete); WirelessTxStatusListener configListener = new WirelessTxStatusListener(render, tx.uuid, txName, txId); y += 20; } { x = 2; y += 6; GuiLabel rxLabel = new GuiLabel(x, y + 6, tr("Wireless RX")); extender.add(rxLabel); rxAddButton = new GuiButtonEln(x + 65, y, 40, 20, tr("Add")); rxAddButton.setObserver(this); extender.add(rxAddButton); y += 20; } List<WirelessRxStatus> tempListRx = new ArrayList<WirelessRxStatus>(render.wirelessRxStatusList.values()); while (!tempListRx.isEmpty()) { int smaller = Integer.MAX_VALUE; WirelessRxStatus best = null; for (WirelessRxStatus rx : tempListRx) { if (rx.uuid < smaller) { smaller = rx.uuid; best = rx; } } tempListRx.remove(best); WirelessRxStatus rx = best; y += 2; x = 2; GuiTextFieldEln rxName = new GuiTextFieldEln(fontRendererObj, x, y + 4, 90, helper); rxName.setText(rx.name); rxName.setComment(0, tr("Channel name")); extender.add(rxName); x += rxName.getWidth() + 12; GuiTextFieldEln rxId = new GuiTextFieldEln(fontRendererObj, x, y + 4, 40, helper); if (rx.id != -1) rxId.setText(rx.id); else rxId.setText(""); rxId.setComment(0, tr("Modbus ID")); extender.add(rxId); x += rxId.getWidth() + 12; GuiButtonEln rxDelete = new GuiButtonEln(x, y, 20, 20, "X"); rxDelete.setObserver(new WirelessRxDeleteListener(render, rx.uuid)); extender.add(rxDelete); WirelessRxStatusListener configListener = new WirelessRxStatusListener(render, rx.uuid, rxName, rxId); uuidToRxName.put(rx.uuid, rxName); y += 20; } y += 6; extender.setSliderPosition(extenderPosition); return y; } @Override public void guiObjectEvent(IGuiObject object) { super.guiObjectEvent(object); if (object == station) { try { render.clientSetInt(ModbusRtuElement.setStation, Integer.parseInt(station.getText())); } catch (NumberFormatException e) { // TODO: handle exception } } else if (object == name) { render.clientSetString(ModbusRtuElement.setName, name.getText()); } else if (object == txAddButton) { render.clientSetString(ModbusRtuElement.serverTxAdd, "newTX"); } else if (object == rxAddButton) { render.clientSetString(ModbusRtuElement.serverRxAdd, "newRX"); } } @Override protected void preDraw(float f, int x, int y) { super.preDraw(f, x, y); if (render.rxTxChange) { generateTxRd(0, extenderYStart); render.rxTxChange = false; } for (WirelessRxStatus rx : render.wirelessRxStatusList.values()) { GuiTextFieldEln name = uuidToRxName.get(rx.uuid); if (rx.connected) name.setComment(1, "\u00a72" + tr("Connected")); else name.setComment(1, "\u00a74" + tr("Not connected")); } } @Override protected GuiHelper newHelper() { return helper = new GuiHelper(this, 190, 200); } static class WirelessTxDeleteListener implements IGuiObjectObserver { private ModbusRtuRender render; private int uuid; public WirelessTxDeleteListener(ModbusRtuRender render, int uuid) { this.render = render; this.uuid = uuid; } @Override public void guiObjectEvent(IGuiObject object) { try { ByteArrayOutputStream bos = new ByteArrayOutputStream(); DataOutputStream stream = new DataOutputStream(bos); render.preparePacketForServer(stream); stream.writeByte(ModbusRtuElement.serverTxDelete); stream.writeInt(uuid); render.sendPacketToServer(bos); } catch (IOException e) { e.printStackTrace(); } } } static class WirelessTxStatusListener implements IGuiObjectObserver { GuiTextFieldEln name, id; private ModbusRtuRender render; int uuid; public WirelessTxStatusListener(ModbusRtuRender render, int uuid, GuiTextFieldEln name, GuiTextFieldEln id) { this.uuid = uuid; this.id = id; this.name = name; this.render = render; id.setGuiObserver(this); name.setGuiObserver(this); } @Override public void guiObjectEvent(IGuiObject object) { String nameStr = name.getText(); int idInt; try { idInt = Integer.parseInt(id.getText()); } catch (NumberFormatException e) { idInt = -1; } try { ByteArrayOutputStream bos = new ByteArrayOutputStream(); DataOutputStream stream = new DataOutputStream(bos); render.preparePacketForServer(stream); stream.writeByte(ModbusRtuElement.serverTxConfig); stream.writeInt(uuid); stream.writeUTF(nameStr); stream.writeInt(idInt); render.sendPacketToServer(bos); } catch (IOException e) { e.printStackTrace(); } } } static class WirelessRxDeleteListener implements IGuiObjectObserver { private ModbusRtuRender render; private int uuid; public WirelessRxDeleteListener(ModbusRtuRender render, int uuid) { this.render = render; this.uuid = uuid; } @Override public void guiObjectEvent(IGuiObject object) { try { ByteArrayOutputStream bos = new ByteArrayOutputStream(); DataOutputStream stream = new DataOutputStream(bos); render.preparePacketForServer(stream); stream.writeByte(ModbusRtuElement.serverRxDelete); stream.writeInt(uuid); render.sendPacketToServer(bos); } catch (IOException e) { e.printStackTrace(); } } } static class WirelessRxStatusListener implements IGuiObjectObserver { GuiTextFieldEln name, id; private ModbusRtuRender render; int uuid; public WirelessRxStatusListener(ModbusRtuRender render, int uuid, GuiTextFieldEln name, GuiTextFieldEln id) { this.uuid = uuid; this.id = id; this.name = name; this.render = render; id.setGuiObserver(this); name.setGuiObserver(this); } @Override public void guiObjectEvent(IGuiObject object) { String nameStr = name.getText(); int idInt; try { idInt = Integer.parseInt(id.getText()); } catch (NumberFormatException e) { idInt = -1; } try { ByteArrayOutputStream bos = new ByteArrayOutputStream(); DataOutputStream stream = new DataOutputStream(bos); render.preparePacketForServer(stream); stream.writeByte(ModbusRtuElement.serverRxConfig); stream.writeInt(uuid); stream.writeUTF(nameStr); stream.writeInt(idInt); render.sendPacketToServer(bos); } catch (IOException e) { e.printStackTrace(); } } } }