package org.example; import javax.swing.*; import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.InetAddress; import java.nio.charset.StandardCharsets; public class AmpelGUI extends JFrame { private JPanel carLightPanel; private JPanel pedestrianLightPanel; private JButton pedestrianButton; private UDPClient client; private LightPanel carRedLight; private LightPanel carYellowLight; private LightPanel carGreenLight; private LightPanel pedestrianRedLight; private LightPanel pedestrianGreenLight; public AmpelGUI() throws Exception { client = new UDPClient(); initUI(); startAmpelsteuerung(); } private void initUI() { setTitle("Ampelsimulation"); setSize(400, 400); setLayout(new GridLayout(1, 2)); carLightPanel = new JPanel(new GridLayout(3, 1)); // Vertical arrangement carRedLight = new LightPanel(Color.RED); carYellowLight = new LightPanel(Color.GRAY); carGreenLight = new LightPanel(Color.GRAY); carLightPanel.add(carRedLight); carLightPanel.add(carYellowLight); carLightPanel.add(carGreenLight); add(carLightPanel); pedestrianLightPanel = new JPanel(new GridLayout(3, 1)); // Vertical arrangement pedestrianRedLight = new LightPanel(Color.RED); pedestrianGreenLight = new LightPanel(Color.GRAY); pedestrianLightPanel.add(pedestrianRedLight); pedestrianLightPanel.add(new JLabel()); // Spacer pedestrianLightPanel.add(pedestrianGreenLight); add(pedestrianLightPanel); pedestrianButton = new JButton("Taster 1"); pedestrianButton.setBackground(Color.GRAY); pedestrianButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { pedestrianButton.setBackground(Color.BLUE); Timer timer = new Timer(100, new ActionListener() { @Override public void actionPerformed(ActionEvent e) { pedestrianButton.setBackground(Color.GRAY); } }); timer.setRepeats(false); timer.start(); } }); JPanel buttonPanel = new JPanel(new BorderLayout()); buttonPanel.add(pedestrianButton, BorderLayout.SOUTH); add(buttonPanel); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setLocationRelativeTo(null); setVisible(true); } private void startAmpelsteuerung() { new Thread(() -> { while (true) { try { setTrafficLights(Color.RED, Color.GRAY, Color.GRAY, Color.RED, Color.GRAY); Thread.sleep(10000); setTrafficLights(Color.RED, Color.YELLOW, Color.GRAY, Color.RED, Color.GRAY); Thread.sleep(2000); setTrafficLights(Color.GRAY, Color.GRAY, Color.GREEN, Color.RED, Color.GRAY); Thread.sleep(15000); setTrafficLights(Color.GRAY, Color.YELLOW, Color.GRAY, Color.RED, Color.GRAY); Thread.sleep(2000); setTrafficLights(Color.RED, Color.GRAY, Color.GRAY, Color.RED, Color.GRAY); Thread.sleep(2000); setTrafficLights(Color.RED, Color.GRAY, Color.GRAY, Color.GRAY, Color.GREEN); Thread.sleep(10000); } catch (InterruptedException e) { e.printStackTrace(); } catch (Exception e) { throw new RuntimeException(e); } } }).start(); } private void setTrafficLights(Color carRed, Color carYellow, Color carGreen, Color pedestrianRed, Color pedestrianGreen) { carRedLight.setColor(carRed); carYellowLight.setColor(carYellow); carGreenLight.setColor(carGreen); pedestrianRedLight.setColor(pedestrianRed); pedestrianGreenLight.setColor(pedestrianGreen); } public static void main(String[] args) { try { new AmpelGUI(); } catch (Exception e) { e.printStackTrace(); } } } class LightPanel extends JPanel { private Color color; public LightPanel(Color initialColor) { this.color = initialColor; setPreferredSize(new Dimension(100, 100)); } public void setColor(Color color) { this.color = color; repaint(); } @Override protected void paintComponent(Graphics g) { super.paintComponent(g); g.setColor(color); g.fillOval(10, 10, getWidth() - 20, getHeight() - 20); } } class UDPClient { private static final String SERVER_IP = "90.0.0.2"; // Beispiel IP-Adresse, bitte anpassen private static final int SERVER_PORT = 29060; // Beispiel Port, bitte anpassen private DatagramSocket socket; private InetAddress address; private String lastMessage; public UDPClient() throws Exception { socket = new DatagramSocket(); address = InetAddress.getByName(SERVER_IP); } public String sendRequest(String message) throws Exception { lastMessage = message; byte[] buf = message.getBytes(StandardCharsets.US_ASCII); DatagramPacket packet = new DatagramPacket(buf, buf.length, address, SERVER_PORT); socket.send(packet); byte[] responseBuf = new byte[256]; packet = new DatagramPacket(responseBuf, responseBuf.length); socket.receive(packet); return new String(packet.getData(), 0, packet.getLength(), StandardCharsets.US_ASCII); } public String requestAnalogValues() throws Exception { String message = "AE,?"; String response = sendRequest(message); if (response.startsWith("AE,")) { return response; } else if (response.startsWith("FE,")) { handleError(response); return null; } else { throw new Exception("Unerwartete Antwort: " + response); } } public String requestDigitalInputs() throws Exception { String message = "DE,?"; String response = sendRequest(message); if (response.startsWith("DE,")) { return response; } else if (response.startsWith("FE,")) { handleError(response); return null; } else { throw new Exception("Unerwartete Antwort: " + response); } } public void setDigitalOutputs(String outputStates) throws Exception { String message = "DA," + outputStates; String response = sendRequest(message); if (response.startsWith("FE,")) { handleError(response); } else { throw new Exception("Unerwartete Antwort: " + response); } } private void handleError(String response) { System.out.println("Fehler: " + response); // Fehlerbehandlung hier implementieren // Wiederholen, bis keine Fehler mehr auftreten while (response.startsWith("FE,")) { try { Thread.sleep(1000); // Wartezeit vor erneutem Versuch response = sendRequest(lastMessage); } catch (Exception e) { e.printStackTrace(); } } } }