- 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();
- }
- }
- }
- }