package mods.eln.sixnode.modbusrtu; import mods.eln.Eln; import mods.eln.cable.CableRenderDescriptor; import mods.eln.misc.*; import mods.eln.node.six.SixNodeDescriptor; import mods.eln.node.six.SixNodeElementRender; import mods.eln.node.six.SixNodeEntity; import net.minecraft.client.gui.GuiScreen; import net.minecraft.entity.player.EntityPlayer; import java.io.DataInputStream; import java.io.IOException; import java.util.HashMap; public class ModbusRtuRender extends SixNodeElementRender { Coordonate coord; PhysicalInterpolator interpolator; float modbusActivityTimeout = 0; float modbusErrorTimeout = 0; ModbusRtuDescriptor descriptor; HashMap<Integer, WirelessTxStatus> wirelessTxStatusList = new HashMap<Integer, WirelessTxStatus>(); HashMap<Integer, WirelessRxStatus> wirelessRxStatusList = new HashMap<Integer, WirelessRxStatus>(); int station = -1; String name; boolean boot = true; boolean rxTxChange = false; public ModbusRtuRender(SixNodeEntity tileEntity, Direction side, SixNodeDescriptor descriptor) { super(tileEntity, side, descriptor); this.descriptor = (ModbusRtuDescriptor) descriptor; interpolator = new PhysicalInterpolator(0.4f, 8.0f, 0.9f, 0.2f); coord = new Coordonate(tileEntity); } @Override public void draw() { super.draw(); if (side.isY()) { front.inverse().glRotateOnX(); } else { LRDU.Down.glRotateOnX(); } descriptor.draw(interpolator.get(), modbusActivityTimeout > 0, modbusErrorTimeout > 0); } @Override public void refresh(float deltaT) { if (!Utils.isPlayerAround(tileEntity.getWorldObj(), coord.getAxisAlignedBB(0))) interpolator.setTarget(0f); else interpolator.setTarget(1f); interpolator.step(deltaT); if (modbusActivityTimeout > 0) modbusActivityTimeout -= deltaT; if (modbusErrorTimeout > 0) modbusErrorTimeout -= deltaT; } @Override public void publishUnserialize(DataInputStream stream) { super.publishUnserialize(stream); try { station = stream.readInt(); name = stream.readUTF(); } catch (IOException e) { e.printStackTrace(); } if (boot) clientSend(ModbusRtuElement.serverAllSyncronise); boot = false; } @Override public void serverPacketUnserialize(DataInputStream stream) throws IOException { super.serverPacketUnserialize(stream); switch (stream.readByte()) { case ModbusRtuElement.clientAllSyncronise: { wirelessTxStatusList.clear(); for (int idx = stream.readInt(); idx > 0; idx--) { WirelessTxStatus tx = new WirelessTxStatus(); tx.readFrom(stream); wirelessTxStatusList.put(tx.uuid, tx); } wirelessRxStatusList.clear(); for (int idx = stream.readInt(); idx > 0; idx--) { WirelessRxStatus rx = new WirelessRxStatus(); rx.readFrom(stream); wirelessRxStatusList.put(rx.uuid, rx); } rxTxChange = true; } break; case ModbusRtuElement.clientTx1Syncronise: { WirelessTxStatus newTx = new WirelessTxStatus(); newTx.readFrom(stream); wirelessTxStatusList.put(newTx.uuid, newTx); rxTxChange = true; } break; case ModbusRtuElement.clientRx1Syncronise: { WirelessRxStatus newRx = new WirelessRxStatus(); newRx.readFrom(stream); wirelessRxStatusList.put(newRx.uuid, newRx); rxTxChange = true; } break; case ModbusRtuElement.clientTxDelete: { wirelessTxStatusList.remove(stream.readInt()); rxTxChange = true; } break; case ModbusRtuElement.clientRxDelete: { wirelessRxStatusList.remove(stream.readInt()); rxTxChange = true; } break; case ModbusRtuElement.clientRx1Connected: WirelessRxStatus rx = wirelessRxStatusList.get(stream.readInt()); if (rx != null) { rx.connected = stream.readBoolean(); } break; case ModbusRtuElement.ClientModbusActivityEvent: modbusActivityTimeout = 0.05f; break; case ModbusRtuElement.ClientModbusErrorEvent: modbusErrorTimeout = 1f; break; } } @Override public GuiScreen newGuiDraw(Direction side, EntityPlayer player) { return new ModbusRtuGui(player, this); } public CableRenderDescriptor getCableRender(LRDU lrdu) { return Eln.instance.signalCableDescriptor.render; } }