From 17510b64c050b94d68a5d9b510a4e0a377a1578a Mon Sep 17 00:00:00 2001 From: Andrew Date: Mon, 17 Apr 2023 16:25:50 +0500 Subject: [PATCH 01/34] initial configure --- .gitignore | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index 2c6eb3893..c5b2fd429 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,6 @@ /.metadata /robots/.settings /robots/bin -eclipse.bat \ No newline at end of file +eclipse.bat +/out/ +/.idea/ From e6b60ee6991003afac891439b7181bfbdef484e1 Mon Sep 17 00:00:00 2001 From: Andrew Date: Tue, 18 Apr 2023 11:26:07 +0500 Subject: [PATCH 02/34] drawing logic incapsulated in drawModels, removed service math function from GameVisualizer to Drawable interface --- robots/src/gui/GameVisualizer.java | 75 +++++++------------ robots/src/gui/drawModels/DefaultRobot.java | 38 ++++++++++ robots/src/gui/drawModels/Drawable.java | 26 +++++++ .../drawModels/TargetDrawRepresentation.java | 29 +++++++ 4 files changed, 118 insertions(+), 50 deletions(-) create mode 100644 robots/src/gui/drawModels/DefaultRobot.java create mode 100644 robots/src/gui/drawModels/Drawable.java create mode 100644 robots/src/gui/drawModels/TargetDrawRepresentation.java diff --git a/robots/src/gui/GameVisualizer.java b/robots/src/gui/GameVisualizer.java index f82cfd8f8..df83c540f 100644 --- a/robots/src/gui/GameVisualizer.java +++ b/robots/src/gui/GameVisualizer.java @@ -1,5 +1,8 @@ package gui; +import gui.drawModels.DefaultRobot; +import gui.drawModels.TargetDrawRepresentation; + import java.awt.Color; import java.awt.EventQueue; import java.awt.Graphics; @@ -24,17 +27,23 @@ private static Timer initTimer() } private volatile double m_robotPositionX = 100; - private volatile double m_robotPositionY = 100; - private volatile double m_robotDirection = 0; + private volatile double m_robotPositionY = 100; + private volatile double m_robotDirection = 0; private volatile int m_targetPositionX = 150; private volatile int m_targetPositionY = 100; - private static final double maxVelocity = 0.1; - private static final double maxAngularVelocity = 0.001; + private static final double maxVelocity = 0.1; + private static final double maxAngularVelocity = 0.001; + + private DefaultRobot m_robotDraw; + private TargetDrawRepresentation m_target; + public GameVisualizer() { + m_robotDraw=new DefaultRobot(m_robotPositionX,m_robotPositionY,m_robotDirection); + m_target=new TargetDrawRepresentation(m_targetPositionX,m_targetPositionY); m_timer.schedule(new TimerTask() { @Override @@ -67,6 +76,7 @@ protected void setTargetPosition(Point p) { m_targetPositionX = p.x; m_targetPositionY = p.y; + m_target.update(p.x,p.y); } protected void onRedrawEvent() @@ -80,12 +90,12 @@ private static double distance(double x1, double y1, double x2, double y2) double diffY = y1 - y2; return Math.sqrt(diffX * diffX + diffY * diffY); } - + private static double angleTo(double fromX, double fromY, double toX, double toY) { double diffX = toX - fromX; double diffY = toY - fromY; - + return asNormalizedRadians(Math.atan2(diffY, diffX)); } @@ -143,6 +153,7 @@ private void moveRobot(double velocity, double angularVelocity, double duration) m_robotPositionY = newY; double newDirection = asNormalizedRadians(m_robotDirection + angularVelocity * duration); m_robotDirection = newDirection; + m_robotDraw.update(newX,newY,newDirection); } private static double asNormalizedRadians(double angle) @@ -157,54 +168,18 @@ private static double asNormalizedRadians(double angle) } return angle; } - - private static int round(double value) - { - return (int)(value + 0.5); - } - + @Override public void paint(Graphics g) { super.paint(g); - Graphics2D g2d = (Graphics2D)g; - drawRobot(g2d, round(m_robotPositionX), round(m_robotPositionY), m_robotDirection); - drawTarget(g2d, m_targetPositionX, m_targetPositionY); - } - - private static void fillOval(Graphics g, int centerX, int centerY, int diam1, int diam2) - { - g.fillOval(centerX - diam1 / 2, centerY - diam2 / 2, diam1, diam2); - } - - private static void drawOval(Graphics g, int centerX, int centerY, int diam1, int diam2) - { - g.drawOval(centerX - diam1 / 2, centerY - diam2 / 2, diam1, diam2); - } - - private void drawRobot(Graphics2D g, int x, int y, double direction) - { - int robotCenterX = round(m_robotPositionX); - int robotCenterY = round(m_robotPositionY); - AffineTransform t = AffineTransform.getRotateInstance(direction, robotCenterX, robotCenterY); - g.setTransform(t); - g.setColor(Color.MAGENTA); - fillOval(g, robotCenterX, robotCenterY, 30, 10); - g.setColor(Color.BLACK); - drawOval(g, robotCenterX, robotCenterY, 30, 10); - g.setColor(Color.WHITE); - fillOval(g, robotCenterX + 10, robotCenterY, 5, 5); - g.setColor(Color.BLACK); - drawOval(g, robotCenterX + 10, robotCenterY, 5, 5); + Graphics2D g2d = (Graphics2D)g; + m_robotDraw.draw(g2d); + m_target.draw(g2d); + } + + - private void drawTarget(Graphics2D g, int x, int y) - { - AffineTransform t = AffineTransform.getRotateInstance(0, 0, 0); - g.setTransform(t); - g.setColor(Color.GREEN); - fillOval(g, x, y, 5, 5); - g.setColor(Color.BLACK); - drawOval(g, x, y, 5, 5); - } + } diff --git a/robots/src/gui/drawModels/DefaultRobot.java b/robots/src/gui/drawModels/DefaultRobot.java new file mode 100644 index 000000000..c0125379c --- /dev/null +++ b/robots/src/gui/drawModels/DefaultRobot.java @@ -0,0 +1,38 @@ +package gui.drawModels; + +import java.awt.*; +import java.awt.geom.AffineTransform; + +public class DefaultRobot implements Drawable{ + private double m_posX; + private double m_posY; + private double m_dir; + + public DefaultRobot(double m_posX, double m_posY, double m_dir) { + update(m_posX,m_posY,m_dir); + } + public void update(double m_posX, double m_posY, double m_dir) { + this.m_posX = m_posX; + this.m_posY = m_posY; + this.m_dir = m_dir; + } + + @Override + public void draw(Graphics2D g) { + int robotCenterX = Drawable.round(m_posX); + int robotCenterY = Drawable.round(m_posY); + AffineTransform t = AffineTransform.getRotateInstance(m_dir, robotCenterX, robotCenterY); + g.setTransform(t); + g.setColor(Color.MAGENTA); + Drawable.fillOval(g, robotCenterX, robotCenterY, 30, 10); + g.setColor(Color.BLACK); + Drawable.drawOval(g, robotCenterX, robotCenterY, 30, 10); + g.setColor(Color.WHITE); + Drawable.fillOval(g, robotCenterX + 10, robotCenterY, 5, 5); + g.setColor(Color.BLACK); + Drawable.drawOval(g, robotCenterX + 10, robotCenterY, 5, 5); + } + + + +} diff --git a/robots/src/gui/drawModels/Drawable.java b/robots/src/gui/drawModels/Drawable.java new file mode 100644 index 000000000..5476c3035 --- /dev/null +++ b/robots/src/gui/drawModels/Drawable.java @@ -0,0 +1,26 @@ +package gui.drawModels; + +import java.awt.*; + +public interface Drawable { + void draw(Graphics2D g); + + + + static int round(double value) + { + return (int)(value + 0.5); + } + + + + static void fillOval(Graphics g, int centerX, int centerY, int diam1, int diam2) + { + g.fillOval(centerX - diam1 / 2, centerY - diam2 / 2, diam1, diam2); + } + + static void drawOval(Graphics g, int centerX, int centerY, int diam1, int diam2) + { + g.drawOval(centerX - diam1 / 2, centerY - diam2 / 2, diam1, diam2); + } +} diff --git a/robots/src/gui/drawModels/TargetDrawRepresentation.java b/robots/src/gui/drawModels/TargetDrawRepresentation.java new file mode 100644 index 000000000..5e5da2712 --- /dev/null +++ b/robots/src/gui/drawModels/TargetDrawRepresentation.java @@ -0,0 +1,29 @@ +package gui.drawModels; + +import java.awt.*; +import java.awt.geom.AffineTransform; + +public class TargetDrawRepresentation implements Drawable{ + + private int m_x; + private int m_y; + + public TargetDrawRepresentation(int m_x, int m_y) { + update(m_x,m_y); + } + + public void update(int m_x, int m_y) { + this.m_x = m_x; + this.m_y = m_y; + } + + @Override + public void draw(Graphics2D g) { + AffineTransform t = AffineTransform.getRotateInstance(0, 0, 0); + g.setTransform(t); + g.setColor(Color.GREEN); + Drawable.fillOval(g, m_x, m_y, 5, 5); + g.setColor(Color.BLACK); + Drawable.drawOval(g, m_x, m_y, 5, 5); + } +} From 83d02624595ecafbc6832cf903b666d9bd0631a0 Mon Sep 17 00:00:00 2001 From: Andrew Date: Tue, 18 Apr 2023 11:44:37 +0500 Subject: [PATCH 03/34] robot movement logic incapsulated into RobotModel class, unused functions removed from GameVisualizer --- robots/src/gui/GameVisualizer.java | 93 +++---------------- robots/src/models/RobotModel.java | 139 +++++++++++++++++++++++++++++ 2 files changed, 150 insertions(+), 82 deletions(-) create mode 100644 robots/src/models/RobotModel.java diff --git a/robots/src/gui/GameVisualizer.java b/robots/src/gui/GameVisualizer.java index df83c540f..19e59049d 100644 --- a/robots/src/gui/GameVisualizer.java +++ b/robots/src/gui/GameVisualizer.java @@ -2,12 +2,9 @@ import gui.drawModels.DefaultRobot; import gui.drawModels.TargetDrawRepresentation; +import models.RobotModel; -import java.awt.Color; -import java.awt.EventQueue; -import java.awt.Graphics; -import java.awt.Graphics2D; -import java.awt.Point; +import java.awt.*; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.awt.geom.AffineTransform; @@ -39,11 +36,14 @@ private static Timer initTimer() private DefaultRobot m_robotDraw; private TargetDrawRepresentation m_target; + private RobotModel m_model; + public GameVisualizer() { m_robotDraw=new DefaultRobot(m_robotPositionX,m_robotPositionY,m_robotDirection); m_target=new TargetDrawRepresentation(m_targetPositionX,m_targetPositionY); + m_model=new RobotModel(100,100,100,150,100); m_timer.schedule(new TimerTask() { @Override @@ -77,6 +77,7 @@ protected void setTargetPosition(Point p) m_targetPositionX = p.x; m_targetPositionY = p.y; m_target.update(p.x,p.y); + m_model.setTargetPosition(p); } protected void onRedrawEvent() @@ -84,90 +85,18 @@ protected void onRedrawEvent() EventQueue.invokeLater(this::repaint); } - private static double distance(double x1, double y1, double x2, double y2) - { - double diffX = x1 - x2; - double diffY = y1 - y2; - return Math.sqrt(diffX * diffX + diffY * diffY); - } - - private static double angleTo(double fromX, double fromY, double toX, double toY) - { - double diffX = toX - fromX; - double diffY = toY - fromY; - return asNormalizedRadians(Math.atan2(diffY, diffX)); - } protected void onModelUpdateEvent() { - double distance = distance(m_targetPositionX, m_targetPositionY, - m_robotPositionX, m_robotPositionY); - if (distance < 0.5) - { - return; - } - double velocity = maxVelocity; - double angleToTarget = angleTo(m_robotPositionX, m_robotPositionY, m_targetPositionX, m_targetPositionY); - double angularVelocity = 0; - if (angleToTarget > m_robotDirection) - { - angularVelocity = maxAngularVelocity; - } - if (angleToTarget < m_robotDirection) - { - angularVelocity = -maxAngularVelocity; - } - - moveRobot(velocity, angularVelocity, 10); - } - - private static double applyLimits(double value, double min, double max) - { - if (value < min) - return min; - if (value > max) - return max; - return value; + + m_model.updatePos(); + m_robotDraw.update(m_model.getM_PositionX(),m_model.getM_PositionY(),m_model.getM_Direction()); + } - private void moveRobot(double velocity, double angularVelocity, double duration) - { - velocity = applyLimits(velocity, 0, maxVelocity); - angularVelocity = applyLimits(angularVelocity, -maxAngularVelocity, maxAngularVelocity); - double newX = m_robotPositionX + velocity / angularVelocity * - (Math.sin(m_robotDirection + angularVelocity * duration) - - Math.sin(m_robotDirection)); - if (!Double.isFinite(newX)) - { - newX = m_robotPositionX + velocity * duration * Math.cos(m_robotDirection); - } - double newY = m_robotPositionY - velocity / angularVelocity * - (Math.cos(m_robotDirection + angularVelocity * duration) - - Math.cos(m_robotDirection)); - if (!Double.isFinite(newY)) - { - newY = m_robotPositionY + velocity * duration * Math.sin(m_robotDirection); - } - m_robotPositionX = newX; - m_robotPositionY = newY; - double newDirection = asNormalizedRadians(m_robotDirection + angularVelocity * duration); - m_robotDirection = newDirection; - m_robotDraw.update(newX,newY,newDirection); - } - private static double asNormalizedRadians(double angle) - { - while (angle < 0) - { - angle += 2*Math.PI; - } - while (angle >= 2*Math.PI) - { - angle -= 2*Math.PI; - } - return angle; - } + @Override public void paint(Graphics g) diff --git a/robots/src/models/RobotModel.java b/robots/src/models/RobotModel.java new file mode 100644 index 000000000..e9890cc13 --- /dev/null +++ b/robots/src/models/RobotModel.java @@ -0,0 +1,139 @@ +package models; + +import java.awt.*; + +public class RobotModel { + + + private volatile double m_PositionX = 100; + private volatile double m_PositionY = 100; + private volatile double m_Direction = 0; + + private volatile int m_targetPositionX = 150; + private volatile int m_targetPositionY = 100; + private double turn_duration=10; + + private static final double maxVelocity = 0.1; + private static final double maxAngularVelocity = 0.001; + + + public RobotModel(double m_PositionX, double m_PositionY, double m_Direction,int targetPosX,int targetPosY) { + this.m_PositionX = m_PositionX; + this.m_PositionY = m_PositionY; + this.m_Direction = m_Direction; + this.m_targetPositionX=targetPosX; + this.m_targetPositionY=targetPosY; + } + + public void setTargetPosition(Point p) + { + m_targetPositionX = p.x; + m_targetPositionY = p.y; + } + public void updatePos(){ + if(isTooClose()){ + return; + } + double velocity=calculateVelocity(); + double angular = calculateAngularVelocity(); + move(velocity,angular); + } + + public double getM_PositionX() { + return m_PositionX; + } + + public double getM_PositionY() { + return m_PositionY; + } + + public double getM_Direction() { + return m_Direction; + } + + + static double asNormalizedRadians(double angle) + { + while (angle < 0) + { + angle += 2*Math.PI; + } + while (angle >= 2*Math.PI) + { + angle -= 2*Math.PI; + } + return angle; + } + + private static double distance(double x1, double y1, double x2, double y2) + { + double diffX = x1 - x2; + double diffY = y1 - y2; + return Math.sqrt(diffX * diffX + diffY * diffY); + } + + private static double angleTo(double fromX, double fromY, double toX, double toY) + { + double diffX = toX - fromX; + double diffY = toY - fromY; + + return asNormalizedRadians(Math.atan2(diffY, diffX)); + } + private static double applyLimits(double value, double min, double max) + { + if (value < min) + return min; + if (value > max) + return max; + return value; + } + private double calculateVelocity(){ + return maxVelocity; + } + private double calculateAngularVelocity(){ + double angleToTarget = angleTo(m_PositionX, m_PositionY, m_targetPositionX, m_targetPositionY); + double angularVelocity = 0; + if (angleToTarget > m_Direction) + { + angularVelocity = maxAngularVelocity; + } + if (angleToTarget < m_Direction) + { + angularVelocity = -maxAngularVelocity; + } + return angularVelocity; + } + private boolean isTooClose(){ + double distance = distance(m_targetPositionX, m_targetPositionY, + m_PositionX, m_PositionY); + return distance<0.5; + } + private void move(double velocity,double angularVelocity){ + velocity = applyLimits(velocity, 0, maxVelocity); + angularVelocity = applyLimits(angularVelocity, -maxAngularVelocity, maxAngularVelocity); + double newX = m_PositionX + velocity / angularVelocity * + (Math.sin(m_Direction + angularVelocity * turn_duration) - + Math.sin(m_Direction)); + if (!Double.isFinite(newX)) + { + newX = m_PositionX + velocity * turn_duration * Math.cos(m_Direction); + } + double newY = m_PositionY - velocity / angularVelocity * + (Math.cos(m_Direction + angularVelocity * turn_duration) - + Math.cos(m_Direction)); + if (!Double.isFinite(newY)) + { + newY = m_PositionY + velocity * turn_duration * Math.sin(m_Direction); + } + m_PositionX = newX; + m_PositionY = newY; + double newDirection = asNormalizedRadians(m_Direction + angularVelocity * turn_duration); + m_Direction = newDirection; + } + + + + + + +} From 33340f8717240b2d8cd444d388b6453a9bcdabb6 Mon Sep 17 00:00:00 2001 From: Andrew Date: Tue, 18 Apr 2023 11:48:35 +0500 Subject: [PATCH 04/34] robot internal variable dublicates removed from GameVisualizer, replaced by constructor local variables --- robots/src/gui/GameVisualizer.java | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/robots/src/gui/GameVisualizer.java b/robots/src/gui/GameVisualizer.java index 19e59049d..96cbe2281 100644 --- a/robots/src/gui/GameVisualizer.java +++ b/robots/src/gui/GameVisualizer.java @@ -23,15 +23,12 @@ private static Timer initTimer() return timer; } - private volatile double m_robotPositionX = 100; - private volatile double m_robotPositionY = 100; - private volatile double m_robotDirection = 0; + private volatile int m_targetPositionX = 150; private volatile int m_targetPositionY = 100; - private static final double maxVelocity = 0.1; - private static final double maxAngularVelocity = 0.001; + private DefaultRobot m_robotDraw; private TargetDrawRepresentation m_target; @@ -41,9 +38,12 @@ private static Timer initTimer() public GameVisualizer() { - m_robotDraw=new DefaultRobot(m_robotPositionX,m_robotPositionY,m_robotDirection); + double r_posX=100; + double r_posY=100; + double r_dir=100; + m_robotDraw=new DefaultRobot(r_posX,r_posY,r_dir); m_target=new TargetDrawRepresentation(m_targetPositionX,m_targetPositionY); - m_model=new RobotModel(100,100,100,150,100); + m_model=new RobotModel(r_posX,r_posY,r_dir,m_targetPositionX,m_targetPositionY); m_timer.schedule(new TimerTask() { @Override From 41ad220d2191a2fa1e301487ed1d0c38c040d356 Mon Sep 17 00:00:00 2001 From: Andrew Date: Tue, 18 Apr 2023 12:51:53 +0500 Subject: [PATCH 05/34] model update timer incapsulated into controller class, model update calls replaced by controller calls, model and controller creation moved to MainApplicationFrame contructor --- robots/src/Controllers/Controller.java | 32 +++++++++ robots/src/gui/GameVisualizer.java | 84 ++++++++++-------------- robots/src/gui/GameWindow.java | 9 ++- robots/src/gui/MainApplicationFrame.java | 10 ++- robots/src/models/RobotModel.java | 7 +- 5 files changed, 84 insertions(+), 58 deletions(-) create mode 100644 robots/src/Controllers/Controller.java diff --git a/robots/src/Controllers/Controller.java b/robots/src/Controllers/Controller.java new file mode 100644 index 000000000..b438da4b3 --- /dev/null +++ b/robots/src/Controllers/Controller.java @@ -0,0 +1,32 @@ +package Controllers; + +import models.RobotModel; + +import java.awt.*; +import java.util.Timer; +import java.util.TimerTask; + +public class Controller { + + private final Timer m_timer = initTimer(); + private RobotModel m_model; + private static Timer initTimer() { + Timer timer = new Timer("events generator", true); + return timer; + } + public Controller(RobotModel model){ + m_model=model; + m_timer.schedule(new TimerTask() { + @Override + public void run() { + updateModel(); + } + }, 0, 10); + } + public void setTargetPos(Point p){ + m_model.setTargetPosition(p); + } + public void updateModel(){ + m_model.updatePos(); + } +} diff --git a/robots/src/gui/GameVisualizer.java b/robots/src/gui/GameVisualizer.java index 96cbe2281..491c60a9f 100644 --- a/robots/src/gui/GameVisualizer.java +++ b/robots/src/gui/GameVisualizer.java @@ -1,5 +1,6 @@ package gui; +import Controllers.Controller; import gui.drawModels.DefaultRobot; import gui.drawModels.TargetDrawRepresentation; import models.RobotModel; @@ -8,63 +9,49 @@ import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.awt.geom.AffineTransform; +import java.util.Observable; +import java.util.Observer; import java.util.Timer; import java.util.TimerTask; import javax.swing.JPanel; -public class GameVisualizer extends JPanel -{ +public class GameVisualizer extends JPanel implements Observer { private final Timer m_timer = initTimer(); - - private static Timer initTimer() - { + + private static Timer initTimer() { Timer timer = new Timer("events generator", true); return timer; } - private volatile int m_targetPositionX = 150; private volatile int m_targetPositionY = 100; - private DefaultRobot m_robotDraw; private TargetDrawRepresentation m_target; + private Controller m_controller; private RobotModel m_model; - - public GameVisualizer() - { - double r_posX=100; - double r_posY=100; - double r_dir=100; - m_robotDraw=new DefaultRobot(r_posX,r_posY,r_dir); - m_target=new TargetDrawRepresentation(m_targetPositionX,m_targetPositionY); - m_model=new RobotModel(r_posX,r_posY,r_dir,m_targetPositionX,m_targetPositionY); - m_timer.schedule(new TimerTask() - { + + public GameVisualizer(Controller modelController, RobotModel model,int targetX, int targetY) { + m_targetPositionX=targetX; + m_targetPositionY=targetY; + m_model=model; + m_robotDraw = new DefaultRobot(m_model.getM_PositionX(), m_model.getM_PositionY(),m_model.getM_Direction()); + m_target = new TargetDrawRepresentation(targetX, targetY); + m_controller = modelController; + m_timer.schedule(new TimerTask() { @Override - public void run() - { + public void run() { onRedrawEvent(); } }, 0, 50); - m_timer.schedule(new TimerTask() - { + addMouseListener(new MouseAdapter() { @Override - public void run() - { - onModelUpdateEvent(); - } - }, 0, 10); - addMouseListener(new MouseAdapter() - { - @Override - public void mouseClicked(MouseEvent e) - { + public void mouseClicked(MouseEvent e) { setTargetPosition(e.getPoint()); repaint(); } @@ -72,43 +59,38 @@ public void mouseClicked(MouseEvent e) setDoubleBuffered(true); } - protected void setTargetPosition(Point p) - { + protected void setTargetPosition(Point p) { m_targetPositionX = p.x; m_targetPositionY = p.y; - m_target.update(p.x,p.y); - m_model.setTargetPosition(p); + m_target.update(p.x, p.y); + m_controller.setTargetPos(p); } - - protected void onRedrawEvent() - { + + protected void onRedrawEvent() { EventQueue.invokeLater(this::repaint); } - - protected void onModelUpdateEvent() - { + protected void onModelUpdateEvent() { - m_model.updatePos(); - m_robotDraw.update(m_model.getM_PositionX(),m_model.getM_PositionY(),m_model.getM_Direction()); + m_controller.updateModel(); + m_robotDraw.update(m_model.getM_PositionX(), m_model.getM_PositionY(), m_model.getM_Direction()); } - - @Override - public void paint(Graphics g) - { + public void paint(Graphics g) { super.paint(g); - Graphics2D g2d = (Graphics2D)g; + Graphics2D g2d = (Graphics2D) g; m_robotDraw.draw(g2d); m_target.draw(g2d); } - - + @Override + public void update(Observable o, Object arg) { + m_robotDraw.update(m_model.getM_PositionX(), m_model.getM_PositionY(), m_model.getM_Direction()); + } } diff --git a/robots/src/gui/GameWindow.java b/robots/src/gui/GameWindow.java index ecb63c00f..04c1b8346 100644 --- a/robots/src/gui/GameWindow.java +++ b/robots/src/gui/GameWindow.java @@ -1,5 +1,8 @@ package gui; +import Controllers.Controller; +import models.RobotModel; + import java.awt.BorderLayout; import javax.swing.JInternalFrame; @@ -8,10 +11,12 @@ public class GameWindow extends JInternalFrame { private final GameVisualizer m_visualizer; - public GameWindow() + public GameWindow(RobotModel model,Controller controller) { super("Игровое поле", true, true, true, true); - m_visualizer = new GameVisualizer(); + + m_visualizer = new GameVisualizer(controller,model,150,100); + model.addObserver(m_visualizer); JPanel panel = new JPanel(new BorderLayout()); panel.add(m_visualizer, BorderLayout.CENTER); getContentPane().add(panel); diff --git a/robots/src/gui/MainApplicationFrame.java b/robots/src/gui/MainApplicationFrame.java index 62e943ee1..315b52fe1 100644 --- a/robots/src/gui/MainApplicationFrame.java +++ b/robots/src/gui/MainApplicationFrame.java @@ -14,7 +14,9 @@ import javax.swing.UIManager; import javax.swing.UnsupportedLookAndFeelException; +import Controllers.Controller; import log.Logger; +import models.RobotModel; /** * Что требуется сделать: @@ -36,12 +38,16 @@ public MainApplicationFrame() { screenSize.height - inset*2); setContentPane(desktopPane); - + LogWindow logWindow = createLogWindow(); addWindow(logWindow); - GameWindow gameWindow = new GameWindow(); + RobotModel model=new RobotModel(100,100,100,150,100); + Controller controller = new Controller(model); + + + GameWindow gameWindow = new GameWindow(model,controller); gameWindow.setSize(400, 400); addWindow(gameWindow); diff --git a/robots/src/models/RobotModel.java b/robots/src/models/RobotModel.java index e9890cc13..6be0a48b2 100644 --- a/robots/src/models/RobotModel.java +++ b/robots/src/models/RobotModel.java @@ -1,8 +1,9 @@ package models; import java.awt.*; +import java.util.Observable; -public class RobotModel { +public class RobotModel extends Observable { private volatile double m_PositionX = 100; @@ -37,6 +38,8 @@ public void updatePos(){ double velocity=calculateVelocity(); double angular = calculateAngularVelocity(); move(velocity,angular); + setChanged(); + notifyObservers(); } public double getM_PositionX() { @@ -50,8 +53,6 @@ public double getM_PositionY() { public double getM_Direction() { return m_Direction; } - - static double asNormalizedRadians(double angle) { while (angle < 0) From 069627a63aed8781ef48b241609ea48b9764dde1 Mon Sep 17 00:00:00 2001 From: Andrew Date: Tue, 18 Apr 2023 13:21:22 +0500 Subject: [PATCH 06/34] created PositionShowWinow, representing position of model --- robots/src/gui/MainApplicationFrame.java | 4 +++ robots/src/gui/PositionShowWindow.java | 32 ++++++++++++++++++++++++ 2 files changed, 36 insertions(+) create mode 100644 robots/src/gui/PositionShowWindow.java diff --git a/robots/src/gui/MainApplicationFrame.java b/robots/src/gui/MainApplicationFrame.java index 315b52fe1..af48aea45 100644 --- a/robots/src/gui/MainApplicationFrame.java +++ b/robots/src/gui/MainApplicationFrame.java @@ -49,6 +49,10 @@ public MainApplicationFrame() { GameWindow gameWindow = new GameWindow(model,controller); gameWindow.setSize(400, 400); + + PositionShowWindow coordWindow=new PositionShowWindow(model); + coordWindow.setSize(200,100); + addWindow(coordWindow); addWindow(gameWindow); setJMenuBar(generateMenuBar()); diff --git a/robots/src/gui/PositionShowWindow.java b/robots/src/gui/PositionShowWindow.java new file mode 100644 index 000000000..051d29d04 --- /dev/null +++ b/robots/src/gui/PositionShowWindow.java @@ -0,0 +1,32 @@ +package gui; + +import models.RobotModel; + +import javax.swing.*; +import java.awt.*; +import java.util.Observable; +import java.util.Observer; + +public class PositionShowWindow extends JInternalFrame implements Observer { + private RobotModel m_model; + private JLabel m_labelX; + private JLabel m_labelY; + public PositionShowWindow(RobotModel model){ + super("Labels", true, true, true, true); + m_model=model; + m_labelX=new JLabel("X : %f".formatted(m_model.getM_PositionX())); + m_labelY=new JLabel("T : %f".formatted(m_model.getM_PositionY())); + m_model.addObserver(this); + JPanel panel = new JPanel(new BorderLayout()); + panel.add(m_labelX, BorderLayout.CENTER); + panel.add(m_labelY, BorderLayout.AFTER_LAST_LINE); + getContentPane().add(panel); + pack(); + } + + @Override + public void update(Observable o, Object arg) { + m_labelX.setText("X : %f".formatted(m_model.getM_PositionX())); + m_labelY.setText("Y : %f".formatted(m_model.getM_PositionY())); + } +} From a370a85fe2bf17a5bf253e3bfacd4b2447f658d0 Mon Sep 17 00:00:00 2001 From: Andrew Date: Fri, 21 Apr 2023 11:19:39 +0500 Subject: [PATCH 07/34] start task 3: robot rotation bug fixed --- robots/src/models/RobotModel.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/robots/src/models/RobotModel.java b/robots/src/models/RobotModel.java index 6be0a48b2..3671cc41d 100644 --- a/robots/src/models/RobotModel.java +++ b/robots/src/models/RobotModel.java @@ -102,6 +102,10 @@ private double calculateAngularVelocity(){ { angularVelocity = -maxAngularVelocity; } + if(Math.abs(angleToTarget-m_Direction)>Math.PI){ + angularVelocity=-angularVelocity; + + } return angularVelocity; } private boolean isTooClose(){ From 0b0863b688c4b0408dddb2e1fc0995dc52db25d8 Mon Sep 17 00:00:00 2001 From: Andrew Date: Sat, 22 Apr 2023 09:41:18 +0500 Subject: [PATCH 08/34] window redraw for GameVisualizer and PosotionShowWindow moved to daemon stream --- robots/src/gui/GameVisualizer.java | 5 ++--- robots/src/gui/PositionShowWindow.java | 5 ++++- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/robots/src/gui/GameVisualizer.java b/robots/src/gui/GameVisualizer.java index 491c60a9f..b22b47b2e 100644 --- a/robots/src/gui/GameVisualizer.java +++ b/robots/src/gui/GameVisualizer.java @@ -72,8 +72,6 @@ protected void onRedrawEvent() { protected void onModelUpdateEvent() { - - m_controller.updateModel(); m_robotDraw.update(m_model.getM_PositionX(), m_model.getM_PositionY(), m_model.getM_Direction()); } @@ -91,6 +89,7 @@ public void paint(Graphics g) { @Override public void update(Observable o, Object arg) { - m_robotDraw.update(m_model.getM_PositionX(), m_model.getM_PositionY(), m_model.getM_Direction()); + EventQueue.invokeLater(this::onModelUpdateEvent); } + } diff --git a/robots/src/gui/PositionShowWindow.java b/robots/src/gui/PositionShowWindow.java index 051d29d04..259cea5a8 100644 --- a/robots/src/gui/PositionShowWindow.java +++ b/robots/src/gui/PositionShowWindow.java @@ -12,7 +12,7 @@ public class PositionShowWindow extends JInternalFrame implements Observer { private JLabel m_labelX; private JLabel m_labelY; public PositionShowWindow(RobotModel model){ - super("Labels", true, true, true, true); + super("Robot coordinates", true, true, true, true); m_model=model; m_labelX=new JLabel("X : %f".formatted(m_model.getM_PositionX())); m_labelY=new JLabel("T : %f".formatted(m_model.getM_PositionY())); @@ -26,6 +26,9 @@ public PositionShowWindow(RobotModel model){ @Override public void update(Observable o, Object arg) { + EventQueue.invokeLater(this::onTextUpdate); + } + void onTextUpdate(){ m_labelX.setText("X : %f".formatted(m_model.getM_PositionX())); m_labelY.setText("Y : %f".formatted(m_model.getM_PositionY())); } From 806a35507b3f492847d9402bf04d58afde442b0c Mon Sep 17 00:00:00 2001 From: Andrew Date: Sat, 22 Apr 2023 11:22:13 +0500 Subject: [PATCH 09/34] added dependency (model, controller) for MainApplicationFrame --- robots/src/gui/MainApplicationFrame.java | 5 +---- robots/src/gui/RobotsProgram.java | 10 +++++++++- 2 files changed, 10 insertions(+), 5 deletions(-) diff --git a/robots/src/gui/MainApplicationFrame.java b/robots/src/gui/MainApplicationFrame.java index af48aea45..229c2074e 100644 --- a/robots/src/gui/MainApplicationFrame.java +++ b/robots/src/gui/MainApplicationFrame.java @@ -28,7 +28,7 @@ public class MainApplicationFrame extends JFrame { private final JDesktopPane desktopPane = new JDesktopPane(); - public MainApplicationFrame() { + public MainApplicationFrame(RobotModel model, Controller controller) { //Make the big window be indented 50 pixels from each edge //of the screen. int inset = 50; @@ -43,9 +43,6 @@ public MainApplicationFrame() { LogWindow logWindow = createLogWindow(); addWindow(logWindow); - RobotModel model=new RobotModel(100,100,100,150,100); - Controller controller = new Controller(model); - GameWindow gameWindow = new GameWindow(model,controller); gameWindow.setSize(400, 400); diff --git a/robots/src/gui/RobotsProgram.java b/robots/src/gui/RobotsProgram.java index ae0930a8b..534d97063 100644 --- a/robots/src/gui/RobotsProgram.java +++ b/robots/src/gui/RobotsProgram.java @@ -1,5 +1,8 @@ package gui; +import Controllers.Controller; +import models.RobotModel; + import java.awt.Frame; import javax.swing.SwingUtilities; @@ -17,7 +20,12 @@ public static void main(String[] args) { e.printStackTrace(); } SwingUtilities.invokeLater(() -> { - MainApplicationFrame frame = new MainApplicationFrame(); + + RobotModel model=new RobotModel(100,100,100,150,100); + Controller controller = new Controller(model); + + + MainApplicationFrame frame = new MainApplicationFrame(model, controller); frame.pack(); frame.setVisible(true); frame.setExtendedState(Frame.MAXIMIZED_BOTH); From 2c47c4cad48cc725bc1eb58cc81f881e519917fd Mon Sep 17 00:00:00 2001 From: Andrew Date: Thu, 4 May 2023 11:34:44 +0500 Subject: [PATCH 10/34] Controller package and Controller class renamed --- .../ModelUpdateController.java} | 6 +++--- robots/src/gui/GameVisualizer.java | 7 +++---- robots/src/gui/GameWindow.java | 4 ++-- robots/src/gui/MainApplicationFrame.java | 4 ++-- robots/src/gui/RobotsProgram.java | 4 ++-- 5 files changed, 12 insertions(+), 13 deletions(-) rename robots/src/{Controllers/Controller.java => controllers/ModelUpdateController.java} (85%) diff --git a/robots/src/Controllers/Controller.java b/robots/src/controllers/ModelUpdateController.java similarity index 85% rename from robots/src/Controllers/Controller.java rename to robots/src/controllers/ModelUpdateController.java index b438da4b3..2205ec98b 100644 --- a/robots/src/Controllers/Controller.java +++ b/robots/src/controllers/ModelUpdateController.java @@ -1,4 +1,4 @@ -package Controllers; +package controllers; import models.RobotModel; @@ -6,7 +6,7 @@ import java.util.Timer; import java.util.TimerTask; -public class Controller { +public class ModelUpdateController { private final Timer m_timer = initTimer(); private RobotModel m_model; @@ -14,7 +14,7 @@ private static Timer initTimer() { Timer timer = new Timer("events generator", true); return timer; } - public Controller(RobotModel model){ + public ModelUpdateController(RobotModel model){ m_model=model; m_timer.schedule(new TimerTask() { @Override diff --git a/robots/src/gui/GameVisualizer.java b/robots/src/gui/GameVisualizer.java index b22b47b2e..4e6b86c51 100644 --- a/robots/src/gui/GameVisualizer.java +++ b/robots/src/gui/GameVisualizer.java @@ -1,6 +1,6 @@ package gui; -import Controllers.Controller; +import controllers.ModelUpdateController; import gui.drawModels.DefaultRobot; import gui.drawModels.TargetDrawRepresentation; import models.RobotModel; @@ -8,7 +8,6 @@ import java.awt.*; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; -import java.awt.geom.AffineTransform; import java.util.Observable; import java.util.Observer; import java.util.Timer; @@ -32,11 +31,11 @@ private static Timer initTimer() { private DefaultRobot m_robotDraw; private TargetDrawRepresentation m_target; - private Controller m_controller; + private ModelUpdateController m_controller; private RobotModel m_model; - public GameVisualizer(Controller modelController, RobotModel model,int targetX, int targetY) { + public GameVisualizer(ModelUpdateController modelController, RobotModel model, int targetX, int targetY) { m_targetPositionX=targetX; m_targetPositionY=targetY; m_model=model; diff --git a/robots/src/gui/GameWindow.java b/robots/src/gui/GameWindow.java index 04c1b8346..71e15ed36 100644 --- a/robots/src/gui/GameWindow.java +++ b/robots/src/gui/GameWindow.java @@ -1,6 +1,6 @@ package gui; -import Controllers.Controller; +import controllers.ModelUpdateController; import models.RobotModel; import java.awt.BorderLayout; @@ -11,7 +11,7 @@ public class GameWindow extends JInternalFrame { private final GameVisualizer m_visualizer; - public GameWindow(RobotModel model,Controller controller) + public GameWindow(RobotModel model, ModelUpdateController controller) { super("Игровое поле", true, true, true, true); diff --git a/robots/src/gui/MainApplicationFrame.java b/robots/src/gui/MainApplicationFrame.java index 229c2074e..159379eec 100644 --- a/robots/src/gui/MainApplicationFrame.java +++ b/robots/src/gui/MainApplicationFrame.java @@ -14,7 +14,7 @@ import javax.swing.UIManager; import javax.swing.UnsupportedLookAndFeelException; -import Controllers.Controller; +import controllers.ModelUpdateController; import log.Logger; import models.RobotModel; @@ -28,7 +28,7 @@ public class MainApplicationFrame extends JFrame { private final JDesktopPane desktopPane = new JDesktopPane(); - public MainApplicationFrame(RobotModel model, Controller controller) { + public MainApplicationFrame(RobotModel model, ModelUpdateController controller) { //Make the big window be indented 50 pixels from each edge //of the screen. int inset = 50; diff --git a/robots/src/gui/RobotsProgram.java b/robots/src/gui/RobotsProgram.java index 534d97063..3983a5d24 100644 --- a/robots/src/gui/RobotsProgram.java +++ b/robots/src/gui/RobotsProgram.java @@ -1,6 +1,6 @@ package gui; -import Controllers.Controller; +import controllers.ModelUpdateController; import models.RobotModel; import java.awt.Frame; @@ -22,7 +22,7 @@ public static void main(String[] args) { SwingUtilities.invokeLater(() -> { RobotModel model=new RobotModel(100,100,100,150,100); - Controller controller = new Controller(model); + ModelUpdateController controller = new ModelUpdateController(model); MainApplicationFrame frame = new MainApplicationFrame(model, controller); From 75e449393d746b9c83299210a77ef6b8dfc75a0a Mon Sep 17 00:00:00 2001 From: Andrew Date: Thu, 4 May 2023 11:42:58 +0500 Subject: [PATCH 11/34] setting position logic separated from update timer --- .../controllers/ModelPositionController.java | 17 +++++++++++++++++ .../src/controllers/ModelUpdateController.java | 4 +--- robots/src/gui/GameVisualizer.java | 5 +++-- robots/src/gui/GameWindow.java | 3 ++- robots/src/gui/MainApplicationFrame.java | 3 ++- robots/src/gui/RobotsProgram.java | 7 ++++--- 6 files changed, 29 insertions(+), 10 deletions(-) create mode 100644 robots/src/controllers/ModelPositionController.java diff --git a/robots/src/controllers/ModelPositionController.java b/robots/src/controllers/ModelPositionController.java new file mode 100644 index 000000000..01f52ef18 --- /dev/null +++ b/robots/src/controllers/ModelPositionController.java @@ -0,0 +1,17 @@ +package controllers; + +import models.RobotModel; + +import java.awt.*; + +public class ModelPositionController { + private RobotModel m_model; + + + public ModelPositionController(RobotModel model){ + m_model=model; + } + public void setTargetPos(Point p){ + m_model.setTargetPosition(p); + } +} diff --git a/robots/src/controllers/ModelUpdateController.java b/robots/src/controllers/ModelUpdateController.java index 2205ec98b..50bc6fb99 100644 --- a/robots/src/controllers/ModelUpdateController.java +++ b/robots/src/controllers/ModelUpdateController.java @@ -23,9 +23,7 @@ public void run() { } }, 0, 10); } - public void setTargetPos(Point p){ - m_model.setTargetPosition(p); - } + public void updateModel(){ m_model.updatePos(); } diff --git a/robots/src/gui/GameVisualizer.java b/robots/src/gui/GameVisualizer.java index 4e6b86c51..fd7dda9b5 100644 --- a/robots/src/gui/GameVisualizer.java +++ b/robots/src/gui/GameVisualizer.java @@ -1,5 +1,6 @@ package gui; +import controllers.ModelPositionController; import controllers.ModelUpdateController; import gui.drawModels.DefaultRobot; import gui.drawModels.TargetDrawRepresentation; @@ -31,11 +32,11 @@ private static Timer initTimer() { private DefaultRobot m_robotDraw; private TargetDrawRepresentation m_target; - private ModelUpdateController m_controller; + private ModelPositionController m_controller; private RobotModel m_model; - public GameVisualizer(ModelUpdateController modelController, RobotModel model, int targetX, int targetY) { + public GameVisualizer(ModelPositionController modelController, RobotModel model, int targetX, int targetY) { m_targetPositionX=targetX; m_targetPositionY=targetY; m_model=model; diff --git a/robots/src/gui/GameWindow.java b/robots/src/gui/GameWindow.java index 71e15ed36..d4ca8de8d 100644 --- a/robots/src/gui/GameWindow.java +++ b/robots/src/gui/GameWindow.java @@ -1,5 +1,6 @@ package gui; +import controllers.ModelPositionController; import controllers.ModelUpdateController; import models.RobotModel; @@ -11,7 +12,7 @@ public class GameWindow extends JInternalFrame { private final GameVisualizer m_visualizer; - public GameWindow(RobotModel model, ModelUpdateController controller) + public GameWindow(RobotModel model, ModelPositionController controller) { super("Игровое поле", true, true, true, true); diff --git a/robots/src/gui/MainApplicationFrame.java b/robots/src/gui/MainApplicationFrame.java index 159379eec..fbe651a3b 100644 --- a/robots/src/gui/MainApplicationFrame.java +++ b/robots/src/gui/MainApplicationFrame.java @@ -14,6 +14,7 @@ import javax.swing.UIManager; import javax.swing.UnsupportedLookAndFeelException; +import controllers.ModelPositionController; import controllers.ModelUpdateController; import log.Logger; import models.RobotModel; @@ -28,7 +29,7 @@ public class MainApplicationFrame extends JFrame { private final JDesktopPane desktopPane = new JDesktopPane(); - public MainApplicationFrame(RobotModel model, ModelUpdateController controller) { + public MainApplicationFrame(RobotModel model, ModelPositionController controller) { //Make the big window be indented 50 pixels from each edge //of the screen. int inset = 50; diff --git a/robots/src/gui/RobotsProgram.java b/robots/src/gui/RobotsProgram.java index 3983a5d24..d69cb6757 100644 --- a/robots/src/gui/RobotsProgram.java +++ b/robots/src/gui/RobotsProgram.java @@ -1,5 +1,6 @@ package gui; +import controllers.ModelPositionController; import controllers.ModelUpdateController; import models.RobotModel; @@ -22,10 +23,10 @@ public static void main(String[] args) { SwingUtilities.invokeLater(() -> { RobotModel model=new RobotModel(100,100,100,150,100); - ModelUpdateController controller = new ModelUpdateController(model); + ModelUpdateController updateController = new ModelUpdateController(model); + ModelPositionController movementController=new ModelPositionController(model); - - MainApplicationFrame frame = new MainApplicationFrame(model, controller); + MainApplicationFrame frame = new MainApplicationFrame(model, movementController); frame.pack(); frame.setVisible(true); frame.setExtendedState(Frame.MAXIMIZED_BOTH); From 81cadba9128a7a68df15c430acdc925cbe16a1f5 Mon Sep 17 00:00:00 2001 From: Andrew Date: Thu, 4 May 2023 11:46:01 +0500 Subject: [PATCH 12/34] redraw timer removed from GameVisualizer. Now redraw is triggered by model update --- robots/src/gui/GameVisualizer.java | 16 ++-------------- 1 file changed, 2 insertions(+), 14 deletions(-) diff --git a/robots/src/gui/GameVisualizer.java b/robots/src/gui/GameVisualizer.java index fd7dda9b5..65390fc53 100644 --- a/robots/src/gui/GameVisualizer.java +++ b/robots/src/gui/GameVisualizer.java @@ -17,13 +17,6 @@ import javax.swing.JPanel; public class GameVisualizer extends JPanel implements Observer { - private final Timer m_timer = initTimer(); - - private static Timer initTimer() { - Timer timer = new Timer("events generator", true); - return timer; - } - private volatile int m_targetPositionX = 150; private volatile int m_targetPositionY = 100; @@ -43,12 +36,7 @@ public GameVisualizer(ModelPositionController modelController, RobotModel model, m_robotDraw = new DefaultRobot(m_model.getM_PositionX(), m_model.getM_PositionY(),m_model.getM_Direction()); m_target = new TargetDrawRepresentation(targetX, targetY); m_controller = modelController; - m_timer.schedule(new TimerTask() { - @Override - public void run() { - onRedrawEvent(); - } - }, 0, 50); + addMouseListener(new MouseAdapter() { @Override public void mouseClicked(MouseEvent e) { @@ -73,7 +61,7 @@ protected void onRedrawEvent() { protected void onModelUpdateEvent() { m_robotDraw.update(m_model.getM_PositionX(), m_model.getM_PositionY(), m_model.getM_Direction()); - + onRedrawEvent(); } From ec0b6ccbe3d6e7d14da1552dc126bff5e47b850d Mon Sep 17 00:00:00 2001 From: Andrew Date: Thu, 4 May 2023 11:56:18 +0500 Subject: [PATCH 13/34] target point incapsulated into separate model, changed dependency for ModelPositionController --- .../controllers/ModelPositionController.java | 7 +++--- robots/src/gui/RobotsProgram.java | 9 +++++--- robots/src/models/RobotModel.java | 20 +++++++--------- robots/src/models/TargetModel.java | 23 +++++++++++++++++++ 4 files changed, 41 insertions(+), 18 deletions(-) create mode 100644 robots/src/models/TargetModel.java diff --git a/robots/src/controllers/ModelPositionController.java b/robots/src/controllers/ModelPositionController.java index 01f52ef18..8828250fd 100644 --- a/robots/src/controllers/ModelPositionController.java +++ b/robots/src/controllers/ModelPositionController.java @@ -1,17 +1,18 @@ package controllers; import models.RobotModel; +import models.TargetModel; import java.awt.*; public class ModelPositionController { - private RobotModel m_model; + private TargetModel m_model; - public ModelPositionController(RobotModel model){ + public ModelPositionController(TargetModel model){ m_model=model; } public void setTargetPos(Point p){ - m_model.setTargetPosition(p); + m_model.setPos(p.x,p.y); } } diff --git a/robots/src/gui/RobotsProgram.java b/robots/src/gui/RobotsProgram.java index d69cb6757..7eebc1e99 100644 --- a/robots/src/gui/RobotsProgram.java +++ b/robots/src/gui/RobotsProgram.java @@ -3,9 +3,12 @@ import controllers.ModelPositionController; import controllers.ModelUpdateController; import models.RobotModel; +import models.TargetModel; import java.awt.Frame; +import java.lang.annotation.Target; +import javax.sound.sampled.TargetDataLine; import javax.swing.SwingUtilities; import javax.swing.UIManager; @@ -21,10 +24,10 @@ public static void main(String[] args) { e.printStackTrace(); } SwingUtilities.invokeLater(() -> { - - RobotModel model=new RobotModel(100,100,100,150,100); + TargetModel target=new TargetModel(150,100); + RobotModel model=new RobotModel(100,100,100,target); ModelUpdateController updateController = new ModelUpdateController(model); - ModelPositionController movementController=new ModelPositionController(model); + ModelPositionController movementController=new ModelPositionController(target); MainApplicationFrame frame = new MainApplicationFrame(model, movementController); frame.pack(); diff --git a/robots/src/models/RobotModel.java b/robots/src/models/RobotModel.java index 3671cc41d..71073926c 100644 --- a/robots/src/models/RobotModel.java +++ b/robots/src/models/RobotModel.java @@ -8,29 +8,25 @@ public class RobotModel extends Observable { private volatile double m_PositionX = 100; private volatile double m_PositionY = 100; + private TargetModel m_Target; + private volatile double m_Direction = 0; - private volatile int m_targetPositionX = 150; - private volatile int m_targetPositionY = 100; + private double turn_duration=10; private static final double maxVelocity = 0.1; private static final double maxAngularVelocity = 0.001; - public RobotModel(double m_PositionX, double m_PositionY, double m_Direction,int targetPosX,int targetPosY) { + public RobotModel(double m_PositionX, double m_PositionY, double m_Direction,TargetModel target) { this.m_PositionX = m_PositionX; this.m_PositionY = m_PositionY; this.m_Direction = m_Direction; - this.m_targetPositionX=targetPosX; - this.m_targetPositionY=targetPosY; + m_Target=target; } - public void setTargetPosition(Point p) - { - m_targetPositionX = p.x; - m_targetPositionY = p.y; - } + public void updatePos(){ if(isTooClose()){ return; @@ -92,7 +88,7 @@ private double calculateVelocity(){ return maxVelocity; } private double calculateAngularVelocity(){ - double angleToTarget = angleTo(m_PositionX, m_PositionY, m_targetPositionX, m_targetPositionY); + double angleToTarget = angleTo(m_PositionX, m_PositionY, m_Target.getPosX(), m_Target.getPosY()); double angularVelocity = 0; if (angleToTarget > m_Direction) { @@ -109,7 +105,7 @@ private double calculateAngularVelocity(){ return angularVelocity; } private boolean isTooClose(){ - double distance = distance(m_targetPositionX, m_targetPositionY, + double distance = distance(m_Target.getPosX(), m_Target.getPosY(), m_PositionX, m_PositionY); return distance<0.5; } diff --git a/robots/src/models/TargetModel.java b/robots/src/models/TargetModel.java new file mode 100644 index 000000000..9c909b152 --- /dev/null +++ b/robots/src/models/TargetModel.java @@ -0,0 +1,23 @@ +package models; + +public class TargetModel { + private volatile double m_PositionX = 100; + private volatile double m_PositionY = 100; + + public TargetModel(double posX, double posY) { + setPos(posX, posY); + } + + public double getPosX() { + return m_PositionX; + } + + public double getPosY() { + return m_PositionY; + } + + public void setPos(double posX, double posY) { + m_PositionX = posX; + m_PositionY = posY; + } +} From 50557b75cb1843e8664ccdfe1e6268558b70adb5 Mon Sep 17 00:00:00 2001 From: Andrew Date: Thu, 4 May 2023 12:04:05 +0500 Subject: [PATCH 14/34] Drawable interface cleared from static functions. Added utils package --- robots/src/gui/drawModels/DefaultRobot.java | 15 ++++++++------- robots/src/gui/drawModels/Drawable.java | 13 +------------ .../gui/drawModels/TargetDrawRepresentation.java | 5 +++-- robots/src/utils/DrawUtils.java | 15 +++++++++++++++ robots/src/utils/MathUtils.java | 9 +++++++++ 5 files changed, 36 insertions(+), 21 deletions(-) create mode 100644 robots/src/utils/DrawUtils.java create mode 100644 robots/src/utils/MathUtils.java diff --git a/robots/src/gui/drawModels/DefaultRobot.java b/robots/src/gui/drawModels/DefaultRobot.java index c0125379c..6e5620a3d 100644 --- a/robots/src/gui/drawModels/DefaultRobot.java +++ b/robots/src/gui/drawModels/DefaultRobot.java @@ -1,5 +1,6 @@ package gui.drawModels; - +import static utils.DrawUtils.*; +import static utils.MathUtils.*; import java.awt.*; import java.awt.geom.AffineTransform; @@ -19,18 +20,18 @@ public void update(double m_posX, double m_posY, double m_dir) { @Override public void draw(Graphics2D g) { - int robotCenterX = Drawable.round(m_posX); - int robotCenterY = Drawable.round(m_posY); + int robotCenterX = round(m_posX); + int robotCenterY = round(m_posY); AffineTransform t = AffineTransform.getRotateInstance(m_dir, robotCenterX, robotCenterY); g.setTransform(t); g.setColor(Color.MAGENTA); - Drawable.fillOval(g, robotCenterX, robotCenterY, 30, 10); + fillOval(g, robotCenterX, robotCenterY, 30, 10); g.setColor(Color.BLACK); - Drawable.drawOval(g, robotCenterX, robotCenterY, 30, 10); + drawOval(g, robotCenterX, robotCenterY, 30, 10); g.setColor(Color.WHITE); - Drawable.fillOval(g, robotCenterX + 10, robotCenterY, 5, 5); + fillOval(g, robotCenterX + 10, robotCenterY, 5, 5); g.setColor(Color.BLACK); - Drawable.drawOval(g, robotCenterX + 10, robotCenterY, 5, 5); + drawOval(g, robotCenterX + 10, robotCenterY, 5, 5); } diff --git a/robots/src/gui/drawModels/Drawable.java b/robots/src/gui/drawModels/Drawable.java index 5476c3035..24f9383ac 100644 --- a/robots/src/gui/drawModels/Drawable.java +++ b/robots/src/gui/drawModels/Drawable.java @@ -7,20 +7,9 @@ public interface Drawable { - static int round(double value) - { - return (int)(value + 0.5); - } - static void fillOval(Graphics g, int centerX, int centerY, int diam1, int diam2) - { - g.fillOval(centerX - diam1 / 2, centerY - diam2 / 2, diam1, diam2); - } - static void drawOval(Graphics g, int centerX, int centerY, int diam1, int diam2) - { - g.drawOval(centerX - diam1 / 2, centerY - diam2 / 2, diam1, diam2); - } + } diff --git a/robots/src/gui/drawModels/TargetDrawRepresentation.java b/robots/src/gui/drawModels/TargetDrawRepresentation.java index 5e5da2712..a148e9a76 100644 --- a/robots/src/gui/drawModels/TargetDrawRepresentation.java +++ b/robots/src/gui/drawModels/TargetDrawRepresentation.java @@ -2,6 +2,7 @@ import java.awt.*; import java.awt.geom.AffineTransform; +import static utils.DrawUtils.*; public class TargetDrawRepresentation implements Drawable{ @@ -22,8 +23,8 @@ public void draw(Graphics2D g) { AffineTransform t = AffineTransform.getRotateInstance(0, 0, 0); g.setTransform(t); g.setColor(Color.GREEN); - Drawable.fillOval(g, m_x, m_y, 5, 5); + fillOval(g, m_x, m_y, 5, 5); g.setColor(Color.BLACK); - Drawable.drawOval(g, m_x, m_y, 5, 5); + drawOval(g, m_x, m_y, 5, 5); } } diff --git a/robots/src/utils/DrawUtils.java b/robots/src/utils/DrawUtils.java new file mode 100644 index 000000000..a87ef3489 --- /dev/null +++ b/robots/src/utils/DrawUtils.java @@ -0,0 +1,15 @@ +package utils; + +import java.awt.*; + +public class DrawUtils { + public static void fillOval(Graphics g, int centerX, int centerY, int diam1, int diam2) + { + g.fillOval(centerX - diam1 / 2, centerY - diam2 / 2, diam1, diam2); + } + + public static void drawOval(Graphics g, int centerX, int centerY, int diam1, int diam2) + { + g.drawOval(centerX - diam1 / 2, centerY - diam2 / 2, diam1, diam2); + } +} diff --git a/robots/src/utils/MathUtils.java b/robots/src/utils/MathUtils.java new file mode 100644 index 000000000..377ad02d1 --- /dev/null +++ b/robots/src/utils/MathUtils.java @@ -0,0 +1,9 @@ +package utils; + +public class MathUtils { + public static int round(double value) + { + return (int)(value + 0.5); + } + +} From ebe5acaf2c79cdaaf00bd133ac6856edb77dc75b Mon Sep 17 00:00:00 2001 From: Andrew Date: Thu, 4 May 2023 12:24:44 +0500 Subject: [PATCH 15/34] target model is now dependency for visualisation --- robots/src/gui/GameVisualizer.java | 12 +++++---- robots/src/gui/GameWindow.java | 8 +++--- robots/src/gui/MainApplicationFrame.java | 6 +++-- robots/src/gui/RobotsProgram.java | 3 ++- .../drawModels/TargetDrawRepresentation.java | 25 +++++++++++-------- 5 files changed, 32 insertions(+), 22 deletions(-) diff --git a/robots/src/gui/GameVisualizer.java b/robots/src/gui/GameVisualizer.java index 65390fc53..ce0ea4a11 100644 --- a/robots/src/gui/GameVisualizer.java +++ b/robots/src/gui/GameVisualizer.java @@ -5,6 +5,7 @@ import gui.drawModels.DefaultRobot; import gui.drawModels.TargetDrawRepresentation; import models.RobotModel; +import models.TargetModel; import java.awt.*; import java.awt.event.MouseAdapter; @@ -29,12 +30,13 @@ public class GameVisualizer extends JPanel implements Observer { private RobotModel m_model; - public GameVisualizer(ModelPositionController modelController, RobotModel model, int targetX, int targetY) { - m_targetPositionX=targetX; - m_targetPositionY=targetY; + + + public GameVisualizer(ModelPositionController modelController, RobotModel model, TargetModel target) { + m_model=model; m_robotDraw = new DefaultRobot(m_model.getM_PositionX(), m_model.getM_PositionY(),m_model.getM_Direction()); - m_target = new TargetDrawRepresentation(targetX, targetY); + m_target = new TargetDrawRepresentation(target); m_controller = modelController; addMouseListener(new MouseAdapter() { @@ -50,7 +52,7 @@ public void mouseClicked(MouseEvent e) { protected void setTargetPosition(Point p) { m_targetPositionX = p.x; m_targetPositionY = p.y; - m_target.update(p.x, p.y); + m_controller.setTargetPos(p); } diff --git a/robots/src/gui/GameWindow.java b/robots/src/gui/GameWindow.java index d4ca8de8d..362acc9ad 100644 --- a/robots/src/gui/GameWindow.java +++ b/robots/src/gui/GameWindow.java @@ -1,8 +1,10 @@ package gui; import controllers.ModelPositionController; -import controllers.ModelUpdateController; +import gui.drawModels.TargetDrawRepresentation; import models.RobotModel; +import models.TargetModel; + import java.awt.BorderLayout; @@ -12,11 +14,11 @@ public class GameWindow extends JInternalFrame { private final GameVisualizer m_visualizer; - public GameWindow(RobotModel model, ModelPositionController controller) + public GameWindow(RobotModel model, ModelPositionController controller, TargetModel target) { super("Игровое поле", true, true, true, true); - m_visualizer = new GameVisualizer(controller,model,150,100); + m_visualizer = new GameVisualizer(controller,model,target); model.addObserver(m_visualizer); JPanel panel = new JPanel(new BorderLayout()); panel.add(m_visualizer, BorderLayout.CENTER); diff --git a/robots/src/gui/MainApplicationFrame.java b/robots/src/gui/MainApplicationFrame.java index fbe651a3b..b32d04efd 100644 --- a/robots/src/gui/MainApplicationFrame.java +++ b/robots/src/gui/MainApplicationFrame.java @@ -16,8 +16,10 @@ import controllers.ModelPositionController; import controllers.ModelUpdateController; +import gui.drawModels.TargetDrawRepresentation; import log.Logger; import models.RobotModel; +import models.TargetModel; /** * Что требуется сделать: @@ -29,7 +31,7 @@ public class MainApplicationFrame extends JFrame { private final JDesktopPane desktopPane = new JDesktopPane(); - public MainApplicationFrame(RobotModel model, ModelPositionController controller) { + public MainApplicationFrame(RobotModel model, ModelPositionController controller, TargetModel target) { //Make the big window be indented 50 pixels from each edge //of the screen. int inset = 50; @@ -45,7 +47,7 @@ public MainApplicationFrame(RobotModel model, ModelPositionController controller addWindow(logWindow); - GameWindow gameWindow = new GameWindow(model,controller); + GameWindow gameWindow = new GameWindow(model,controller,target); gameWindow.setSize(400, 400); PositionShowWindow coordWindow=new PositionShowWindow(model); diff --git a/robots/src/gui/RobotsProgram.java b/robots/src/gui/RobotsProgram.java index 7eebc1e99..bd15bd694 100644 --- a/robots/src/gui/RobotsProgram.java +++ b/robots/src/gui/RobotsProgram.java @@ -2,6 +2,7 @@ import controllers.ModelPositionController; import controllers.ModelUpdateController; +import gui.drawModels.TargetDrawRepresentation; import models.RobotModel; import models.TargetModel; @@ -29,7 +30,7 @@ public static void main(String[] args) { ModelUpdateController updateController = new ModelUpdateController(model); ModelPositionController movementController=new ModelPositionController(target); - MainApplicationFrame frame = new MainApplicationFrame(model, movementController); + MainApplicationFrame frame = new MainApplicationFrame(model, movementController, target); frame.pack(); frame.setVisible(true); frame.setExtendedState(Frame.MAXIMIZED_BOTH); diff --git a/robots/src/gui/drawModels/TargetDrawRepresentation.java b/robots/src/gui/drawModels/TargetDrawRepresentation.java index a148e9a76..da990b43d 100644 --- a/robots/src/gui/drawModels/TargetDrawRepresentation.java +++ b/robots/src/gui/drawModels/TargetDrawRepresentation.java @@ -1,30 +1,33 @@ package gui.drawModels; +import models.TargetModel; + import java.awt.*; import java.awt.geom.AffineTransform; +import java.util.Observable; +import java.util.Observer; + import static utils.DrawUtils.*; +import static utils.MathUtils.*; -public class TargetDrawRepresentation implements Drawable{ +public class TargetDrawRepresentation implements Drawable { - private int m_x; - private int m_y; + private TargetModel m_model; - public TargetDrawRepresentation(int m_x, int m_y) { - update(m_x,m_y); + public TargetDrawRepresentation(TargetModel model) { + m_model=model; } - public void update(int m_x, int m_y) { - this.m_x = m_x; - this.m_y = m_y; - } @Override public void draw(Graphics2D g) { AffineTransform t = AffineTransform.getRotateInstance(0, 0, 0); g.setTransform(t); g.setColor(Color.GREEN); - fillOval(g, m_x, m_y, 5, 5); + fillOval(g, round(m_model.getPosX()) ,round(m_model.getPosY()) , 5, 5); g.setColor(Color.BLACK); - drawOval(g, m_x, m_y, 5, 5); + drawOval(g, round(m_model.getPosX()) ,round(m_model.getPosY()), 5, 5); } + + } From 1a72771c7df4f2816f45e118531385e8358f3cb4 Mon Sep 17 00:00:00 2001 From: Andrew Date: Thu, 4 May 2023 12:50:06 +0500 Subject: [PATCH 16/34] getters in models changed to global getPos method. Potentially fixing multythread bug --- robots/src/gui/GameVisualizer.java | 7 ++++-- robots/src/gui/PositionShowWindow.java | 11 +++++---- .../drawModels/TargetDrawRepresentation.java | 6 +++-- robots/src/models/CoordPair.java | 16 +++++++++++++ robots/src/models/RobotModel.java | 23 +++++++++++-------- robots/src/models/TargetModel.java | 12 ++++++---- 6 files changed, 52 insertions(+), 23 deletions(-) create mode 100644 robots/src/models/CoordPair.java diff --git a/robots/src/gui/GameVisualizer.java b/robots/src/gui/GameVisualizer.java index ce0ea4a11..6b02d48b5 100644 --- a/robots/src/gui/GameVisualizer.java +++ b/robots/src/gui/GameVisualizer.java @@ -4,6 +4,7 @@ import controllers.ModelUpdateController; import gui.drawModels.DefaultRobot; import gui.drawModels.TargetDrawRepresentation; +import models.CoordPair; import models.RobotModel; import models.TargetModel; @@ -35,7 +36,8 @@ public class GameVisualizer extends JPanel implements Observer { public GameVisualizer(ModelPositionController modelController, RobotModel model, TargetModel target) { m_model=model; - m_robotDraw = new DefaultRobot(m_model.getM_PositionX(), m_model.getM_PositionY(),m_model.getM_Direction()); + CoordPair modelCoord=model.getPos(); + m_robotDraw = new DefaultRobot(modelCoord.x, modelCoord.y, modelCoord.z); m_target = new TargetDrawRepresentation(target); m_controller = modelController; @@ -62,7 +64,8 @@ protected void onRedrawEvent() { protected void onModelUpdateEvent() { - m_robotDraw.update(m_model.getM_PositionX(), m_model.getM_PositionY(), m_model.getM_Direction()); + CoordPair coord=m_model.getPos(); + m_robotDraw.update(coord.x, coord.y, coord.z); onRedrawEvent(); } diff --git a/robots/src/gui/PositionShowWindow.java b/robots/src/gui/PositionShowWindow.java index 259cea5a8..38f80806f 100644 --- a/robots/src/gui/PositionShowWindow.java +++ b/robots/src/gui/PositionShowWindow.java @@ -1,5 +1,6 @@ package gui; +import models.CoordPair; import models.RobotModel; import javax.swing.*; @@ -14,8 +15,9 @@ public class PositionShowWindow extends JInternalFrame implements Observer { public PositionShowWindow(RobotModel model){ super("Robot coordinates", true, true, true, true); m_model=model; - m_labelX=new JLabel("X : %f".formatted(m_model.getM_PositionX())); - m_labelY=new JLabel("T : %f".formatted(m_model.getM_PositionY())); + CoordPair coord= m_model.getPos(); + m_labelX=new JLabel("X : %f".formatted(coord.x)); + m_labelY=new JLabel("T : %f".formatted(coord.y)); m_model.addObserver(this); JPanel panel = new JPanel(new BorderLayout()); panel.add(m_labelX, BorderLayout.CENTER); @@ -29,7 +31,8 @@ public void update(Observable o, Object arg) { EventQueue.invokeLater(this::onTextUpdate); } void onTextUpdate(){ - m_labelX.setText("X : %f".formatted(m_model.getM_PositionX())); - m_labelY.setText("Y : %f".formatted(m_model.getM_PositionY())); + CoordPair coord= m_model.getPos(); + m_labelX.setText("X : %f".formatted(coord.x)); + m_labelY.setText("Y : %f".formatted(coord.y)); } } diff --git a/robots/src/gui/drawModels/TargetDrawRepresentation.java b/robots/src/gui/drawModels/TargetDrawRepresentation.java index da990b43d..3633d87cd 100644 --- a/robots/src/gui/drawModels/TargetDrawRepresentation.java +++ b/robots/src/gui/drawModels/TargetDrawRepresentation.java @@ -1,5 +1,6 @@ package gui.drawModels; +import models.CoordPair; import models.TargetModel; import java.awt.*; @@ -21,12 +22,13 @@ public TargetDrawRepresentation(TargetModel model) { @Override public void draw(Graphics2D g) { + CoordPair targetCoord=m_model.getPos(); AffineTransform t = AffineTransform.getRotateInstance(0, 0, 0); g.setTransform(t); g.setColor(Color.GREEN); - fillOval(g, round(m_model.getPosX()) ,round(m_model.getPosY()) , 5, 5); + fillOval(g, round(targetCoord.x) ,round(targetCoord.y) , 5, 5); g.setColor(Color.BLACK); - drawOval(g, round(m_model.getPosX()) ,round(m_model.getPosY()), 5, 5); + drawOval(g, round(targetCoord.x) ,round(targetCoord.y), 5, 5); } diff --git a/robots/src/models/CoordPair.java b/robots/src/models/CoordPair.java new file mode 100644 index 000000000..5788a8470 --- /dev/null +++ b/robots/src/models/CoordPair.java @@ -0,0 +1,16 @@ +package models; + +public class CoordPair { + public double x; + public double y; + public double z=0; + public CoordPair(double _x,double _y){ + x=_x; + y=_y; + } + public CoordPair(double _x,double _y,double _z){ + x=_x; + y=_y; + z=_z; + } +} diff --git a/robots/src/models/RobotModel.java b/robots/src/models/RobotModel.java index 71073926c..3eb9e3c71 100644 --- a/robots/src/models/RobotModel.java +++ b/robots/src/models/RobotModel.java @@ -38,17 +38,18 @@ public void updatePos(){ notifyObservers(); } - public double getM_PositionX() { - return m_PositionX; - } - public double getM_PositionY() { - return m_PositionY; - } - public double getM_Direction() { - return m_Direction; + public CoordPair getPos(){ + CoordPair ans=new CoordPair(0,0); + synchronized (this){ + ans.x=m_PositionX; + ans.y=m_PositionY; + ans.z=m_Direction; + } + return ans; } + static double asNormalizedRadians(double angle) { while (angle < 0) @@ -88,7 +89,8 @@ private double calculateVelocity(){ return maxVelocity; } private double calculateAngularVelocity(){ - double angleToTarget = angleTo(m_PositionX, m_PositionY, m_Target.getPosX(), m_Target.getPosY()); + CoordPair targetCoord= m_Target.getPos(); + double angleToTarget = angleTo(m_PositionX, m_PositionY, targetCoord.x, targetCoord.y); double angularVelocity = 0; if (angleToTarget > m_Direction) { @@ -105,7 +107,8 @@ private double calculateAngularVelocity(){ return angularVelocity; } private boolean isTooClose(){ - double distance = distance(m_Target.getPosX(), m_Target.getPosY(), + CoordPair targetCoord= m_Target.getPos(); + double distance = distance(targetCoord.x, targetCoord.y, m_PositionX, m_PositionY); return distance<0.5; } diff --git a/robots/src/models/TargetModel.java b/robots/src/models/TargetModel.java index 9c909b152..c47afc8c2 100644 --- a/robots/src/models/TargetModel.java +++ b/robots/src/models/TargetModel.java @@ -8,12 +8,14 @@ public TargetModel(double posX, double posY) { setPos(posX, posY); } - public double getPosX() { - return m_PositionX; - } - public double getPosY() { - return m_PositionY; + public CoordPair getPos(){ + CoordPair ans=new CoordPair(0,0); + synchronized (this){ + ans.x=m_PositionX; + ans.y=m_PositionY; + } + return ans; } public void setPos(double posX, double posY) { From 089875beda0d0a8bb1951164fc49ec5a3c3f7b78 Mon Sep 17 00:00:00 2001 From: Andrew Date: Thu, 4 May 2023 12:54:08 +0500 Subject: [PATCH 17/34] RobotModel class cleared from static math function, that now placed in MathUtils --- robots/src/models/RobotModel.java | 36 +------------------------------ robots/src/utils/MathUtils.java | 36 +++++++++++++++++++++++++++++++ 2 files changed, 37 insertions(+), 35 deletions(-) diff --git a/robots/src/models/RobotModel.java b/robots/src/models/RobotModel.java index 3eb9e3c71..e85a5bcf6 100644 --- a/robots/src/models/RobotModel.java +++ b/robots/src/models/RobotModel.java @@ -1,6 +1,6 @@ package models; -import java.awt.*; +import static utils.MathUtils.*; import java.util.Observable; public class RobotModel extends Observable { @@ -50,41 +50,7 @@ public CoordPair getPos(){ return ans; } - static double asNormalizedRadians(double angle) - { - while (angle < 0) - { - angle += 2*Math.PI; - } - while (angle >= 2*Math.PI) - { - angle -= 2*Math.PI; - } - return angle; - } - private static double distance(double x1, double y1, double x2, double y2) - { - double diffX = x1 - x2; - double diffY = y1 - y2; - return Math.sqrt(diffX * diffX + diffY * diffY); - } - - private static double angleTo(double fromX, double fromY, double toX, double toY) - { - double diffX = toX - fromX; - double diffY = toY - fromY; - - return asNormalizedRadians(Math.atan2(diffY, diffX)); - } - private static double applyLimits(double value, double min, double max) - { - if (value < min) - return min; - if (value > max) - return max; - return value; - } private double calculateVelocity(){ return maxVelocity; } diff --git a/robots/src/utils/MathUtils.java b/robots/src/utils/MathUtils.java index 377ad02d1..bd7a6626a 100644 --- a/robots/src/utils/MathUtils.java +++ b/robots/src/utils/MathUtils.java @@ -6,4 +6,40 @@ public static int round(double value) return (int)(value + 0.5); } + public static double asNormalizedRadians(double angle) + { + while (angle < 0) + { + angle += 2*Math.PI; + } + while (angle >= 2*Math.PI) + { + angle -= 2*Math.PI; + } + return angle; + } + + public static double distance(double x1, double y1, double x2, double y2) + { + double diffX = x1 - x2; + double diffY = y1 - y2; + return Math.sqrt(diffX * diffX + diffY * diffY); + } + + public static double angleTo(double fromX, double fromY, double toX, double toY) + { + double diffX = toX - fromX; + double diffY = toY - fromY; + + return asNormalizedRadians(Math.atan2(diffY, diffX)); + } + public static double applyLimits(double value, double min, double max) + { + if (value < min) + return min; + if (value > max) + return max; + return value; + } + } From c4e425e73e72b60e812c006bda3f935a335cbb38 Mon Sep 17 00:00:00 2001 From: Andrew Date: Fri, 5 May 2023 11:43:06 +0500 Subject: [PATCH 18/34] TargetModel now extends Observable --- robots/src/models/TargetModel.java | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/robots/src/models/TargetModel.java b/robots/src/models/TargetModel.java index c47afc8c2..ebbdab82b 100644 --- a/robots/src/models/TargetModel.java +++ b/robots/src/models/TargetModel.java @@ -1,6 +1,8 @@ package models; -public class TargetModel { +import java.util.Observable; + +public class TargetModel extends Observable { private volatile double m_PositionX = 100; private volatile double m_PositionY = 100; @@ -21,5 +23,7 @@ public CoordPair getPos(){ public void setPos(double posX, double posY) { m_PositionX = posX; m_PositionY = posY; + setChanged(); + notifyObservers(); } } From 7a3f520701c4b971f1fee7e4d51ddbe3d9012206 Mon Sep 17 00:00:00 2001 From: Andrew Date: Fri, 5 May 2023 11:52:15 +0500 Subject: [PATCH 19/34] refactor: CoordPair class renamed into Vector --- robots/src/gui/GameVisualizer.java | 9 +++------ robots/src/gui/PositionShowWindow.java | 6 +++--- robots/src/gui/drawModels/TargetDrawRepresentation.java | 6 ++---- robots/src/models/RobotModel.java | 8 ++++---- robots/src/models/TargetModel.java | 4 ++-- robots/src/models/{CoordPair.java => Vector.java} | 6 +++--- 6 files changed, 17 insertions(+), 22 deletions(-) rename robots/src/models/{CoordPair.java => Vector.java} (57%) diff --git a/robots/src/gui/GameVisualizer.java b/robots/src/gui/GameVisualizer.java index 6b02d48b5..958be383f 100644 --- a/robots/src/gui/GameVisualizer.java +++ b/robots/src/gui/GameVisualizer.java @@ -1,10 +1,9 @@ package gui; import controllers.ModelPositionController; -import controllers.ModelUpdateController; import gui.drawModels.DefaultRobot; import gui.drawModels.TargetDrawRepresentation; -import models.CoordPair; +import models.Vector; import models.RobotModel; import models.TargetModel; @@ -13,8 +12,6 @@ import java.awt.event.MouseEvent; import java.util.Observable; import java.util.Observer; -import java.util.Timer; -import java.util.TimerTask; import javax.swing.JPanel; @@ -36,7 +33,7 @@ public class GameVisualizer extends JPanel implements Observer { public GameVisualizer(ModelPositionController modelController, RobotModel model, TargetModel target) { m_model=model; - CoordPair modelCoord=model.getPos(); + Vector modelCoord=model.getPos(); m_robotDraw = new DefaultRobot(modelCoord.x, modelCoord.y, modelCoord.z); m_target = new TargetDrawRepresentation(target); m_controller = modelController; @@ -64,7 +61,7 @@ protected void onRedrawEvent() { protected void onModelUpdateEvent() { - CoordPair coord=m_model.getPos(); + Vector coord=m_model.getPos(); m_robotDraw.update(coord.x, coord.y, coord.z); onRedrawEvent(); } diff --git a/robots/src/gui/PositionShowWindow.java b/robots/src/gui/PositionShowWindow.java index 38f80806f..2de24aab1 100644 --- a/robots/src/gui/PositionShowWindow.java +++ b/robots/src/gui/PositionShowWindow.java @@ -1,6 +1,6 @@ package gui; -import models.CoordPair; +import models.Vector; import models.RobotModel; import javax.swing.*; @@ -15,7 +15,7 @@ public class PositionShowWindow extends JInternalFrame implements Observer { public PositionShowWindow(RobotModel model){ super("Robot coordinates", true, true, true, true); m_model=model; - CoordPair coord= m_model.getPos(); + Vector coord= m_model.getPos(); m_labelX=new JLabel("X : %f".formatted(coord.x)); m_labelY=new JLabel("T : %f".formatted(coord.y)); m_model.addObserver(this); @@ -31,7 +31,7 @@ public void update(Observable o, Object arg) { EventQueue.invokeLater(this::onTextUpdate); } void onTextUpdate(){ - CoordPair coord= m_model.getPos(); + Vector coord= m_model.getPos(); m_labelX.setText("X : %f".formatted(coord.x)); m_labelY.setText("Y : %f".formatted(coord.y)); } diff --git a/robots/src/gui/drawModels/TargetDrawRepresentation.java b/robots/src/gui/drawModels/TargetDrawRepresentation.java index 3633d87cd..5d061179c 100644 --- a/robots/src/gui/drawModels/TargetDrawRepresentation.java +++ b/robots/src/gui/drawModels/TargetDrawRepresentation.java @@ -1,12 +1,10 @@ package gui.drawModels; -import models.CoordPair; +import models.Vector; import models.TargetModel; import java.awt.*; import java.awt.geom.AffineTransform; -import java.util.Observable; -import java.util.Observer; import static utils.DrawUtils.*; import static utils.MathUtils.*; @@ -22,7 +20,7 @@ public TargetDrawRepresentation(TargetModel model) { @Override public void draw(Graphics2D g) { - CoordPair targetCoord=m_model.getPos(); + Vector targetCoord=m_model.getPos(); AffineTransform t = AffineTransform.getRotateInstance(0, 0, 0); g.setTransform(t); g.setColor(Color.GREEN); diff --git a/robots/src/models/RobotModel.java b/robots/src/models/RobotModel.java index e85a5bcf6..1c3632f99 100644 --- a/robots/src/models/RobotModel.java +++ b/robots/src/models/RobotModel.java @@ -40,8 +40,8 @@ public void updatePos(){ - public CoordPair getPos(){ - CoordPair ans=new CoordPair(0,0); + public Vector getPos(){ + Vector ans=new Vector(0,0); synchronized (this){ ans.x=m_PositionX; ans.y=m_PositionY; @@ -55,7 +55,7 @@ private double calculateVelocity(){ return maxVelocity; } private double calculateAngularVelocity(){ - CoordPair targetCoord= m_Target.getPos(); + Vector targetCoord= m_Target.getPos(); double angleToTarget = angleTo(m_PositionX, m_PositionY, targetCoord.x, targetCoord.y); double angularVelocity = 0; if (angleToTarget > m_Direction) @@ -73,7 +73,7 @@ private double calculateAngularVelocity(){ return angularVelocity; } private boolean isTooClose(){ - CoordPair targetCoord= m_Target.getPos(); + Vector targetCoord= m_Target.getPos(); double distance = distance(targetCoord.x, targetCoord.y, m_PositionX, m_PositionY); return distance<0.5; diff --git a/robots/src/models/TargetModel.java b/robots/src/models/TargetModel.java index ebbdab82b..e324d7a66 100644 --- a/robots/src/models/TargetModel.java +++ b/robots/src/models/TargetModel.java @@ -11,8 +11,8 @@ public TargetModel(double posX, double posY) { } - public CoordPair getPos(){ - CoordPair ans=new CoordPair(0,0); + public Vector getPos(){ + Vector ans=new Vector(0,0); synchronized (this){ ans.x=m_PositionX; ans.y=m_PositionY; diff --git a/robots/src/models/CoordPair.java b/robots/src/models/Vector.java similarity index 57% rename from robots/src/models/CoordPair.java rename to robots/src/models/Vector.java index 5788a8470..bef944b64 100644 --- a/robots/src/models/CoordPair.java +++ b/robots/src/models/Vector.java @@ -1,14 +1,14 @@ package models; -public class CoordPair { +public class Vector { public double x; public double y; public double z=0; - public CoordPair(double _x,double _y){ + public Vector(double _x, double _y){ x=_x; y=_y; } - public CoordPair(double _x,double _y,double _z){ + public Vector(double _x, double _y, double _z){ x=_x; y=_y; z=_z; From bb526be83a13eace43a8f327901e1ae9bf1c0268 Mon Sep 17 00:00:00 2001 From: Andrew Date: Thu, 11 May 2023 22:19:26 +0500 Subject: [PATCH 20/34] Naming changes, changed signature for RobotRepresentation constructor and Update method removed --- ...roller.java => RobotUpdateController.java} | 5 +-- ...ler.java => TargetPositionController.java} | 5 +-- robots/src/gui/GameVisualizer.java | 40 ++++++++----------- robots/src/gui/GameWindow.java | 5 +-- robots/src/gui/MainApplicationFrame.java | 6 +-- robots/src/gui/PositionShowWindow.java | 6 +-- robots/src/gui/RobotsProgram.java | 11 ++--- ...ultRobot.java => RobotRepresentation.java} | 26 ++++++------ ...ntation.java => TargetRepresentation.java} | 8 ++-- .../{Vector.java => ModelCoordinate.java} | 6 +-- robots/src/models/RobotModel.java | 8 ++-- robots/src/models/TargetModel.java | 4 +- 12 files changed, 57 insertions(+), 73 deletions(-) rename robots/src/controllers/{ModelUpdateController.java => RobotUpdateController.java} (84%) rename robots/src/controllers/{ModelPositionController.java => TargetPositionController.java} (64%) rename robots/src/gui/drawModels/{DefaultRobot.java => RobotRepresentation.java} (51%) rename robots/src/gui/drawModels/{TargetDrawRepresentation.java => TargetRepresentation.java} (75%) rename robots/src/models/{Vector.java => ModelCoordinate.java} (53%) diff --git a/robots/src/controllers/ModelUpdateController.java b/robots/src/controllers/RobotUpdateController.java similarity index 84% rename from robots/src/controllers/ModelUpdateController.java rename to robots/src/controllers/RobotUpdateController.java index 50bc6fb99..055389aba 100644 --- a/robots/src/controllers/ModelUpdateController.java +++ b/robots/src/controllers/RobotUpdateController.java @@ -2,11 +2,10 @@ import models.RobotModel; -import java.awt.*; import java.util.Timer; import java.util.TimerTask; -public class ModelUpdateController { +public class RobotUpdateController { private final Timer m_timer = initTimer(); private RobotModel m_model; @@ -14,7 +13,7 @@ private static Timer initTimer() { Timer timer = new Timer("events generator", true); return timer; } - public ModelUpdateController(RobotModel model){ + public RobotUpdateController(RobotModel model){ m_model=model; m_timer.schedule(new TimerTask() { @Override diff --git a/robots/src/controllers/ModelPositionController.java b/robots/src/controllers/TargetPositionController.java similarity index 64% rename from robots/src/controllers/ModelPositionController.java rename to robots/src/controllers/TargetPositionController.java index 8828250fd..c36d945c4 100644 --- a/robots/src/controllers/ModelPositionController.java +++ b/robots/src/controllers/TargetPositionController.java @@ -1,15 +1,14 @@ package controllers; -import models.RobotModel; import models.TargetModel; import java.awt.*; -public class ModelPositionController { +public class TargetPositionController { private TargetModel m_model; - public ModelPositionController(TargetModel model){ + public TargetPositionController(TargetModel model){ m_model=model; } public void setTargetPos(Point p){ diff --git a/robots/src/gui/GameVisualizer.java b/robots/src/gui/GameVisualizer.java index 958be383f..f43162a6f 100644 --- a/robots/src/gui/GameVisualizer.java +++ b/robots/src/gui/GameVisualizer.java @@ -1,9 +1,9 @@ package gui; -import controllers.ModelPositionController; -import gui.drawModels.DefaultRobot; -import gui.drawModels.TargetDrawRepresentation; -import models.Vector; +import controllers.TargetPositionController; +import gui.drawModels.RobotRepresentation; +import gui.drawModels.TargetRepresentation; +import models.ModelCoordinate; import models.RobotModel; import models.TargetModel; @@ -17,26 +17,23 @@ public class GameVisualizer extends JPanel implements Observer { - private volatile int m_targetPositionX = 150; - private volatile int m_targetPositionY = 100; - private DefaultRobot m_robotDraw; - private TargetDrawRepresentation m_target; + private RobotRepresentation m_robotView; + private TargetRepresentation m_targetView; - private ModelPositionController m_controller; - private RobotModel m_model; + private TargetPositionController m_targetController; + private RobotModel m_robot; - public GameVisualizer(ModelPositionController modelController, RobotModel model, TargetModel target) { + public GameVisualizer(TargetPositionController modelController, RobotModel model, TargetModel target) { - m_model=model; - Vector modelCoord=model.getPos(); - m_robotDraw = new DefaultRobot(modelCoord.x, modelCoord.y, modelCoord.z); - m_target = new TargetDrawRepresentation(target); - m_controller = modelController; + m_robot =model; + m_robotView = new RobotRepresentation(m_robot); + m_targetView = new TargetRepresentation(target); + m_targetController = modelController; addMouseListener(new MouseAdapter() { @Override @@ -49,10 +46,9 @@ public void mouseClicked(MouseEvent e) { } protected void setTargetPosition(Point p) { - m_targetPositionX = p.x; - m_targetPositionY = p.y; - m_controller.setTargetPos(p); + + m_targetController.setTargetPos(p); } protected void onRedrawEvent() { @@ -61,8 +57,6 @@ protected void onRedrawEvent() { protected void onModelUpdateEvent() { - Vector coord=m_model.getPos(); - m_robotDraw.update(coord.x, coord.y, coord.z); onRedrawEvent(); } @@ -71,8 +65,8 @@ protected void onModelUpdateEvent() { public void paint(Graphics g) { super.paint(g); Graphics2D g2d = (Graphics2D) g; - m_robotDraw.draw(g2d); - m_target.draw(g2d); + m_robotView.draw(g2d); + m_targetView.draw(g2d); } diff --git a/robots/src/gui/GameWindow.java b/robots/src/gui/GameWindow.java index 362acc9ad..6612fab60 100644 --- a/robots/src/gui/GameWindow.java +++ b/robots/src/gui/GameWindow.java @@ -1,7 +1,6 @@ package gui; -import controllers.ModelPositionController; -import gui.drawModels.TargetDrawRepresentation; +import controllers.TargetPositionController; import models.RobotModel; import models.TargetModel; @@ -14,7 +13,7 @@ public class GameWindow extends JInternalFrame { private final GameVisualizer m_visualizer; - public GameWindow(RobotModel model, ModelPositionController controller, TargetModel target) + public GameWindow(RobotModel model, TargetPositionController controller, TargetModel target) { super("Игровое поле", true, true, true, true); diff --git a/robots/src/gui/MainApplicationFrame.java b/robots/src/gui/MainApplicationFrame.java index b32d04efd..328cc02ae 100644 --- a/robots/src/gui/MainApplicationFrame.java +++ b/robots/src/gui/MainApplicationFrame.java @@ -14,9 +14,7 @@ import javax.swing.UIManager; import javax.swing.UnsupportedLookAndFeelException; -import controllers.ModelPositionController; -import controllers.ModelUpdateController; -import gui.drawModels.TargetDrawRepresentation; +import controllers.TargetPositionController; import log.Logger; import models.RobotModel; import models.TargetModel; @@ -31,7 +29,7 @@ public class MainApplicationFrame extends JFrame { private final JDesktopPane desktopPane = new JDesktopPane(); - public MainApplicationFrame(RobotModel model, ModelPositionController controller, TargetModel target) { + public MainApplicationFrame(RobotModel model, TargetPositionController controller, TargetModel target) { //Make the big window be indented 50 pixels from each edge //of the screen. int inset = 50; diff --git a/robots/src/gui/PositionShowWindow.java b/robots/src/gui/PositionShowWindow.java index 2de24aab1..dae05a4dc 100644 --- a/robots/src/gui/PositionShowWindow.java +++ b/robots/src/gui/PositionShowWindow.java @@ -1,6 +1,6 @@ package gui; -import models.Vector; +import models.ModelCoordinate; import models.RobotModel; import javax.swing.*; @@ -15,7 +15,7 @@ public class PositionShowWindow extends JInternalFrame implements Observer { public PositionShowWindow(RobotModel model){ super("Robot coordinates", true, true, true, true); m_model=model; - Vector coord= m_model.getPos(); + ModelCoordinate coord= m_model.getPos(); m_labelX=new JLabel("X : %f".formatted(coord.x)); m_labelY=new JLabel("T : %f".formatted(coord.y)); m_model.addObserver(this); @@ -31,7 +31,7 @@ public void update(Observable o, Object arg) { EventQueue.invokeLater(this::onTextUpdate); } void onTextUpdate(){ - Vector coord= m_model.getPos(); + ModelCoordinate coord= m_model.getPos(); m_labelX.setText("X : %f".formatted(coord.x)); m_labelY.setText("Y : %f".formatted(coord.y)); } diff --git a/robots/src/gui/RobotsProgram.java b/robots/src/gui/RobotsProgram.java index bd15bd694..040b3427c 100644 --- a/robots/src/gui/RobotsProgram.java +++ b/robots/src/gui/RobotsProgram.java @@ -1,15 +1,12 @@ package gui; -import controllers.ModelPositionController; -import controllers.ModelUpdateController; -import gui.drawModels.TargetDrawRepresentation; +import controllers.TargetPositionController; +import controllers.RobotUpdateController; import models.RobotModel; import models.TargetModel; import java.awt.Frame; -import java.lang.annotation.Target; -import javax.sound.sampled.TargetDataLine; import javax.swing.SwingUtilities; import javax.swing.UIManager; @@ -27,8 +24,8 @@ public static void main(String[] args) { SwingUtilities.invokeLater(() -> { TargetModel target=new TargetModel(150,100); RobotModel model=new RobotModel(100,100,100,target); - ModelUpdateController updateController = new ModelUpdateController(model); - ModelPositionController movementController=new ModelPositionController(target); + RobotUpdateController updateController = new RobotUpdateController(model); + TargetPositionController movementController=new TargetPositionController(target); MainApplicationFrame frame = new MainApplicationFrame(model, movementController, target); frame.pack(); diff --git a/robots/src/gui/drawModels/DefaultRobot.java b/robots/src/gui/drawModels/RobotRepresentation.java similarity index 51% rename from robots/src/gui/drawModels/DefaultRobot.java rename to robots/src/gui/drawModels/RobotRepresentation.java index 6e5620a3d..a05cf0a88 100644 --- a/robots/src/gui/drawModels/DefaultRobot.java +++ b/robots/src/gui/drawModels/RobotRepresentation.java @@ -1,28 +1,26 @@ package gui.drawModels; +import models.ModelCoordinate; +import models.RobotModel; + import static utils.DrawUtils.*; import static utils.MathUtils.*; import java.awt.*; import java.awt.geom.AffineTransform; -public class DefaultRobot implements Drawable{ - private double m_posX; - private double m_posY; - private double m_dir; +public class RobotRepresentation implements Drawable{ + private RobotModel m_model; - public DefaultRobot(double m_posX, double m_posY, double m_dir) { - update(m_posX,m_posY,m_dir); - } - public void update(double m_posX, double m_posY, double m_dir) { - this.m_posX = m_posX; - this.m_posY = m_posY; - this.m_dir = m_dir; + public RobotRepresentation(RobotModel model) { + m_model=model; } + @Override public void draw(Graphics2D g) { - int robotCenterX = round(m_posX); - int robotCenterY = round(m_posY); - AffineTransform t = AffineTransform.getRotateInstance(m_dir, robotCenterX, robotCenterY); + ModelCoordinate coord=m_model.getPos(); + int robotCenterX = round(coord.x); + int robotCenterY = round(coord.y); + AffineTransform t = AffineTransform.getRotateInstance(coord.z, robotCenterX, robotCenterY); g.setTransform(t); g.setColor(Color.MAGENTA); fillOval(g, robotCenterX, robotCenterY, 30, 10); diff --git a/robots/src/gui/drawModels/TargetDrawRepresentation.java b/robots/src/gui/drawModels/TargetRepresentation.java similarity index 75% rename from robots/src/gui/drawModels/TargetDrawRepresentation.java rename to robots/src/gui/drawModels/TargetRepresentation.java index 5d061179c..74bc10af1 100644 --- a/robots/src/gui/drawModels/TargetDrawRepresentation.java +++ b/robots/src/gui/drawModels/TargetRepresentation.java @@ -1,6 +1,6 @@ package gui.drawModels; -import models.Vector; +import models.ModelCoordinate; import models.TargetModel; import java.awt.*; @@ -9,18 +9,18 @@ import static utils.DrawUtils.*; import static utils.MathUtils.*; -public class TargetDrawRepresentation implements Drawable { +public class TargetRepresentation implements Drawable { private TargetModel m_model; - public TargetDrawRepresentation(TargetModel model) { + public TargetRepresentation(TargetModel model) { m_model=model; } @Override public void draw(Graphics2D g) { - Vector targetCoord=m_model.getPos(); + ModelCoordinate targetCoord=m_model.getPos(); AffineTransform t = AffineTransform.getRotateInstance(0, 0, 0); g.setTransform(t); g.setColor(Color.GREEN); diff --git a/robots/src/models/Vector.java b/robots/src/models/ModelCoordinate.java similarity index 53% rename from robots/src/models/Vector.java rename to robots/src/models/ModelCoordinate.java index bef944b64..d2b8ca49a 100644 --- a/robots/src/models/Vector.java +++ b/robots/src/models/ModelCoordinate.java @@ -1,14 +1,14 @@ package models; -public class Vector { +public class ModelCoordinate { public double x; public double y; public double z=0; - public Vector(double _x, double _y){ + public ModelCoordinate(double _x, double _y){ x=_x; y=_y; } - public Vector(double _x, double _y, double _z){ + public ModelCoordinate(double _x, double _y, double _z){ x=_x; y=_y; z=_z; diff --git a/robots/src/models/RobotModel.java b/robots/src/models/RobotModel.java index 1c3632f99..e221de9a9 100644 --- a/robots/src/models/RobotModel.java +++ b/robots/src/models/RobotModel.java @@ -40,8 +40,8 @@ public void updatePos(){ - public Vector getPos(){ - Vector ans=new Vector(0,0); + public ModelCoordinate getPos(){ + ModelCoordinate ans=new ModelCoordinate(0,0); synchronized (this){ ans.x=m_PositionX; ans.y=m_PositionY; @@ -55,7 +55,7 @@ private double calculateVelocity(){ return maxVelocity; } private double calculateAngularVelocity(){ - Vector targetCoord= m_Target.getPos(); + ModelCoordinate targetCoord= m_Target.getPos(); double angleToTarget = angleTo(m_PositionX, m_PositionY, targetCoord.x, targetCoord.y); double angularVelocity = 0; if (angleToTarget > m_Direction) @@ -73,7 +73,7 @@ private double calculateAngularVelocity(){ return angularVelocity; } private boolean isTooClose(){ - Vector targetCoord= m_Target.getPos(); + ModelCoordinate targetCoord= m_Target.getPos(); double distance = distance(targetCoord.x, targetCoord.y, m_PositionX, m_PositionY); return distance<0.5; diff --git a/robots/src/models/TargetModel.java b/robots/src/models/TargetModel.java index e324d7a66..094c46c86 100644 --- a/robots/src/models/TargetModel.java +++ b/robots/src/models/TargetModel.java @@ -11,8 +11,8 @@ public TargetModel(double posX, double posY) { } - public Vector getPos(){ - Vector ans=new Vector(0,0); + public ModelCoordinate getPos(){ + ModelCoordinate ans=new ModelCoordinate(0,0); synchronized (this){ ans.x=m_PositionX; ans.y=m_PositionY; From 9e19d4d6524e7103853b346828f2b31669d93662 Mon Sep 17 00:00:00 2001 From: Andrew Date: Thu, 11 May 2023 22:58:37 +0500 Subject: [PATCH 21/34] vector class removed, added state hierarchie --- robots/src/gui/GameVisualizer.java | 1 - robots/src/gui/PositionShowWindow.java | 15 +++++---- .../gui/drawModels/RobotRepresentation.java | 10 +++--- .../gui/drawModels/TargetRepresentation.java | 9 +++--- robots/src/models/ModelCoordinate.java | 16 ---------- robots/src/models/RobotModel.java | 22 +++++++------ robots/src/models/TargetModel.java | 11 ++++--- robots/src/models/states/RobotState.java | 32 +++++++++++++++++++ .../src/models/states/RobotStateReader.java | 7 ++++ robots/src/models/states/TargetState.java | 19 +++++++++++ .../src/models/states/TargetStateReader.java | 6 ++++ 11 files changed, 102 insertions(+), 46 deletions(-) delete mode 100644 robots/src/models/ModelCoordinate.java create mode 100644 robots/src/models/states/RobotState.java create mode 100644 robots/src/models/states/RobotStateReader.java create mode 100644 robots/src/models/states/TargetState.java create mode 100644 robots/src/models/states/TargetStateReader.java diff --git a/robots/src/gui/GameVisualizer.java b/robots/src/gui/GameVisualizer.java index f43162a6f..34f3d7b6a 100644 --- a/robots/src/gui/GameVisualizer.java +++ b/robots/src/gui/GameVisualizer.java @@ -3,7 +3,6 @@ import controllers.TargetPositionController; import gui.drawModels.RobotRepresentation; import gui.drawModels.TargetRepresentation; -import models.ModelCoordinate; import models.RobotModel; import models.TargetModel; diff --git a/robots/src/gui/PositionShowWindow.java b/robots/src/gui/PositionShowWindow.java index dae05a4dc..4e46612aa 100644 --- a/robots/src/gui/PositionShowWindow.java +++ b/robots/src/gui/PositionShowWindow.java @@ -1,7 +1,8 @@ package gui; -import models.ModelCoordinate; + import models.RobotModel; +import models.states.RobotStateReader; import javax.swing.*; import java.awt.*; @@ -15,9 +16,9 @@ public class PositionShowWindow extends JInternalFrame implements Observer { public PositionShowWindow(RobotModel model){ super("Robot coordinates", true, true, true, true); m_model=model; - ModelCoordinate coord= m_model.getPos(); - m_labelX=new JLabel("X : %f".formatted(coord.x)); - m_labelY=new JLabel("T : %f".formatted(coord.y)); + RobotStateReader state= m_model.getPos(); + m_labelX=new JLabel("X : %f".formatted(state.getX())); + m_labelY=new JLabel("T : %f".formatted(state.getY())); m_model.addObserver(this); JPanel panel = new JPanel(new BorderLayout()); panel.add(m_labelX, BorderLayout.CENTER); @@ -31,8 +32,8 @@ public void update(Observable o, Object arg) { EventQueue.invokeLater(this::onTextUpdate); } void onTextUpdate(){ - ModelCoordinate coord= m_model.getPos(); - m_labelX.setText("X : %f".formatted(coord.x)); - m_labelY.setText("Y : %f".formatted(coord.y)); + RobotStateReader state= m_model.getPos(); + m_labelX.setText("X : %f".formatted(state.getX())); + m_labelY.setText("Y : %f".formatted(state.getY())); } } diff --git a/robots/src/gui/drawModels/RobotRepresentation.java b/robots/src/gui/drawModels/RobotRepresentation.java index a05cf0a88..df74904c2 100644 --- a/robots/src/gui/drawModels/RobotRepresentation.java +++ b/robots/src/gui/drawModels/RobotRepresentation.java @@ -1,6 +1,6 @@ package gui.drawModels; -import models.ModelCoordinate; import models.RobotModel; +import models.states.RobotStateReader; import static utils.DrawUtils.*; import static utils.MathUtils.*; @@ -17,10 +17,10 @@ public RobotRepresentation(RobotModel model) { @Override public void draw(Graphics2D g) { - ModelCoordinate coord=m_model.getPos(); - int robotCenterX = round(coord.x); - int robotCenterY = round(coord.y); - AffineTransform t = AffineTransform.getRotateInstance(coord.z, robotCenterX, robotCenterY); + RobotStateReader state=m_model.getPos(); + int robotCenterX = round(state.getX()); + int robotCenterY = round(state.getY()); + AffineTransform t = AffineTransform.getRotateInstance(state.getDir(), robotCenterX, robotCenterY); g.setTransform(t); g.setColor(Color.MAGENTA); fillOval(g, robotCenterX, robotCenterY, 30, 10); diff --git a/robots/src/gui/drawModels/TargetRepresentation.java b/robots/src/gui/drawModels/TargetRepresentation.java index 74bc10af1..9afb83940 100644 --- a/robots/src/gui/drawModels/TargetRepresentation.java +++ b/robots/src/gui/drawModels/TargetRepresentation.java @@ -1,7 +1,8 @@ package gui.drawModels; -import models.ModelCoordinate; + import models.TargetModel; +import models.states.TargetStateReader; import java.awt.*; import java.awt.geom.AffineTransform; @@ -20,13 +21,13 @@ public TargetRepresentation(TargetModel model) { @Override public void draw(Graphics2D g) { - ModelCoordinate targetCoord=m_model.getPos(); + TargetStateReader targetCoord=m_model.getPos(); AffineTransform t = AffineTransform.getRotateInstance(0, 0, 0); g.setTransform(t); g.setColor(Color.GREEN); - fillOval(g, round(targetCoord.x) ,round(targetCoord.y) , 5, 5); + fillOval(g, round(targetCoord.getX()) ,round(targetCoord.getY()) , 5, 5); g.setColor(Color.BLACK); - drawOval(g, round(targetCoord.x) ,round(targetCoord.y), 5, 5); + drawOval(g, round(targetCoord.getX()) ,round(targetCoord.getY()), 5, 5); } diff --git a/robots/src/models/ModelCoordinate.java b/robots/src/models/ModelCoordinate.java deleted file mode 100644 index d2b8ca49a..000000000 --- a/robots/src/models/ModelCoordinate.java +++ /dev/null @@ -1,16 +0,0 @@ -package models; - -public class ModelCoordinate { - public double x; - public double y; - public double z=0; - public ModelCoordinate(double _x, double _y){ - x=_x; - y=_y; - } - public ModelCoordinate(double _x, double _y, double _z){ - x=_x; - y=_y; - z=_z; - } -} diff --git a/robots/src/models/RobotModel.java b/robots/src/models/RobotModel.java index e221de9a9..eac5f31f3 100644 --- a/robots/src/models/RobotModel.java +++ b/robots/src/models/RobotModel.java @@ -1,5 +1,10 @@ package models; + +import models.states.RobotState; +import models.states.RobotStateReader; +import models.states.TargetStateReader; + import static utils.MathUtils.*; import java.util.Observable; @@ -40,14 +45,13 @@ public void updatePos(){ - public ModelCoordinate getPos(){ - ModelCoordinate ans=new ModelCoordinate(0,0); + public RobotStateReader getPos(){ + RobotState ans; synchronized (this){ - ans.x=m_PositionX; - ans.y=m_PositionY; - ans.z=m_Direction; + ans=new RobotState(m_PositionX,m_PositionY,m_Direction); } return ans; + } @@ -55,8 +59,8 @@ private double calculateVelocity(){ return maxVelocity; } private double calculateAngularVelocity(){ - ModelCoordinate targetCoord= m_Target.getPos(); - double angleToTarget = angleTo(m_PositionX, m_PositionY, targetCoord.x, targetCoord.y); + TargetStateReader targetCoord= m_Target.getPos(); + double angleToTarget = angleTo(m_PositionX, m_PositionY, targetCoord.getX(), targetCoord.getY()); double angularVelocity = 0; if (angleToTarget > m_Direction) { @@ -73,8 +77,8 @@ private double calculateAngularVelocity(){ return angularVelocity; } private boolean isTooClose(){ - ModelCoordinate targetCoord= m_Target.getPos(); - double distance = distance(targetCoord.x, targetCoord.y, + TargetStateReader targetCoord= m_Target.getPos(); + double distance = distance(targetCoord.getX(), targetCoord.getY(), m_PositionX, m_PositionY); return distance<0.5; } diff --git a/robots/src/models/TargetModel.java b/robots/src/models/TargetModel.java index 094c46c86..bcc341523 100644 --- a/robots/src/models/TargetModel.java +++ b/robots/src/models/TargetModel.java @@ -1,5 +1,9 @@ package models; + +import models.states.TargetState; +import models.states.TargetStateReader; + import java.util.Observable; public class TargetModel extends Observable { @@ -11,11 +15,10 @@ public TargetModel(double posX, double posY) { } - public ModelCoordinate getPos(){ - ModelCoordinate ans=new ModelCoordinate(0,0); + public TargetStateReader getPos(){ + TargetStateReader ans; synchronized (this){ - ans.x=m_PositionX; - ans.y=m_PositionY; + ans=new TargetState(m_PositionX,m_PositionY); } return ans; } diff --git a/robots/src/models/states/RobotState.java b/robots/src/models/states/RobotState.java new file mode 100644 index 000000000..83b090f28 --- /dev/null +++ b/robots/src/models/states/RobotState.java @@ -0,0 +1,32 @@ +package models.states; + +public class RobotState implements RobotStateReader{ + + + private volatile double m_x; + private volatile double m_y; + private volatile double m_dir; + + public RobotState(double m_x, double m_y, double m_dir) { + this.m_x = m_x; + this.m_y = m_y; + this.m_dir = m_dir; + } + + @Override + public double getX() { + return m_x; + } + + @Override + public double getY() { + return m_y; + } + + @Override + public double getDir() { + return m_dir; + } + + +} diff --git a/robots/src/models/states/RobotStateReader.java b/robots/src/models/states/RobotStateReader.java new file mode 100644 index 000000000..543c6842b --- /dev/null +++ b/robots/src/models/states/RobotStateReader.java @@ -0,0 +1,7 @@ +package models.states; + +public interface RobotStateReader { + double getX(); + double getY(); + double getDir(); +} diff --git a/robots/src/models/states/TargetState.java b/robots/src/models/states/TargetState.java new file mode 100644 index 000000000..399404908 --- /dev/null +++ b/robots/src/models/states/TargetState.java @@ -0,0 +1,19 @@ +package models.states; + +public class TargetState implements TargetStateReader{ + private double x; + private double y; + + public TargetState(double x, double y) { + this.x = x; + this.y = y; + } + + public double getX() { + return x; + } + + public double getY() { + return y; + } +} diff --git a/robots/src/models/states/TargetStateReader.java b/robots/src/models/states/TargetStateReader.java new file mode 100644 index 000000000..d692a161b --- /dev/null +++ b/robots/src/models/states/TargetStateReader.java @@ -0,0 +1,6 @@ +package models.states; + +public interface TargetStateReader { + double getX(); + double getY(); +} From 46378d61f3d538c313372bd09013ec9fd5f5f278 Mon Sep 17 00:00:00 2001 From: Andrew Date: Thu, 11 May 2023 23:03:09 +0500 Subject: [PATCH 22/34] renamed getPos method to getState in RobotModel and TargetModel --- robots/src/gui/PositionShowWindow.java | 4 ++-- robots/src/gui/drawModels/RobotRepresentation.java | 2 +- robots/src/gui/drawModels/TargetRepresentation.java | 2 +- robots/src/models/RobotModel.java | 6 +++--- robots/src/models/TargetModel.java | 2 +- 5 files changed, 8 insertions(+), 8 deletions(-) diff --git a/robots/src/gui/PositionShowWindow.java b/robots/src/gui/PositionShowWindow.java index 4e46612aa..cd519c5f2 100644 --- a/robots/src/gui/PositionShowWindow.java +++ b/robots/src/gui/PositionShowWindow.java @@ -16,7 +16,7 @@ public class PositionShowWindow extends JInternalFrame implements Observer { public PositionShowWindow(RobotModel model){ super("Robot coordinates", true, true, true, true); m_model=model; - RobotStateReader state= m_model.getPos(); + RobotStateReader state= m_model.getState(); m_labelX=new JLabel("X : %f".formatted(state.getX())); m_labelY=new JLabel("T : %f".formatted(state.getY())); m_model.addObserver(this); @@ -32,7 +32,7 @@ public void update(Observable o, Object arg) { EventQueue.invokeLater(this::onTextUpdate); } void onTextUpdate(){ - RobotStateReader state= m_model.getPos(); + RobotStateReader state= m_model.getState(); m_labelX.setText("X : %f".formatted(state.getX())); m_labelY.setText("Y : %f".formatted(state.getY())); } diff --git a/robots/src/gui/drawModels/RobotRepresentation.java b/robots/src/gui/drawModels/RobotRepresentation.java index df74904c2..b9866eac7 100644 --- a/robots/src/gui/drawModels/RobotRepresentation.java +++ b/robots/src/gui/drawModels/RobotRepresentation.java @@ -17,7 +17,7 @@ public RobotRepresentation(RobotModel model) { @Override public void draw(Graphics2D g) { - RobotStateReader state=m_model.getPos(); + RobotStateReader state=m_model.getState(); int robotCenterX = round(state.getX()); int robotCenterY = round(state.getY()); AffineTransform t = AffineTransform.getRotateInstance(state.getDir(), robotCenterX, robotCenterY); diff --git a/robots/src/gui/drawModels/TargetRepresentation.java b/robots/src/gui/drawModels/TargetRepresentation.java index 9afb83940..fc71f4d91 100644 --- a/robots/src/gui/drawModels/TargetRepresentation.java +++ b/robots/src/gui/drawModels/TargetRepresentation.java @@ -21,7 +21,7 @@ public TargetRepresentation(TargetModel model) { @Override public void draw(Graphics2D g) { - TargetStateReader targetCoord=m_model.getPos(); + TargetStateReader targetCoord=m_model.getState(); AffineTransform t = AffineTransform.getRotateInstance(0, 0, 0); g.setTransform(t); g.setColor(Color.GREEN); diff --git a/robots/src/models/RobotModel.java b/robots/src/models/RobotModel.java index eac5f31f3..4d0c78604 100644 --- a/robots/src/models/RobotModel.java +++ b/robots/src/models/RobotModel.java @@ -45,7 +45,7 @@ public void updatePos(){ - public RobotStateReader getPos(){ + public RobotStateReader getState(){ RobotState ans; synchronized (this){ ans=new RobotState(m_PositionX,m_PositionY,m_Direction); @@ -59,7 +59,7 @@ private double calculateVelocity(){ return maxVelocity; } private double calculateAngularVelocity(){ - TargetStateReader targetCoord= m_Target.getPos(); + TargetStateReader targetCoord= m_Target.getState(); double angleToTarget = angleTo(m_PositionX, m_PositionY, targetCoord.getX(), targetCoord.getY()); double angularVelocity = 0; if (angleToTarget > m_Direction) @@ -77,7 +77,7 @@ private double calculateAngularVelocity(){ return angularVelocity; } private boolean isTooClose(){ - TargetStateReader targetCoord= m_Target.getPos(); + TargetStateReader targetCoord= m_Target.getState(); double distance = distance(targetCoord.getX(), targetCoord.getY(), m_PositionX, m_PositionY); return distance<0.5; diff --git a/robots/src/models/TargetModel.java b/robots/src/models/TargetModel.java index bcc341523..a8202de89 100644 --- a/robots/src/models/TargetModel.java +++ b/robots/src/models/TargetModel.java @@ -15,7 +15,7 @@ public TargetModel(double posX, double posY) { } - public TargetStateReader getPos(){ + public TargetStateReader getState(){ TargetStateReader ans; synchronized (this){ ans=new TargetState(m_PositionX,m_PositionY); From c0c0b0edb2e76b6f0c54b2a8d35a0a29b872bf4d Mon Sep 17 00:00:00 2001 From: Andrew Date: Fri, 12 May 2023 19:52:49 +0500 Subject: [PATCH 23/34] listener for application closure added --- robots/src/gui/MainApplicationFrame.java | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/robots/src/gui/MainApplicationFrame.java b/robots/src/gui/MainApplicationFrame.java index 328cc02ae..36a604289 100644 --- a/robots/src/gui/MainApplicationFrame.java +++ b/robots/src/gui/MainApplicationFrame.java @@ -3,6 +3,8 @@ import java.awt.Dimension; import java.awt.Toolkit; import java.awt.event.KeyEvent; +import java.awt.event.WindowAdapter; +import java.awt.event.WindowEvent; import javax.swing.JDesktopPane; import javax.swing.JFrame; @@ -32,7 +34,7 @@ public class MainApplicationFrame extends JFrame public MainApplicationFrame(RobotModel model, TargetPositionController controller, TargetModel target) { //Make the big window be indented 50 pixels from each edge //of the screen. - int inset = 50; + int inset = 50; Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize(); setBounds(inset, inset, screenSize.width - inset*2, @@ -55,6 +57,13 @@ public MainApplicationFrame(RobotModel model, TargetPositionController controlle setJMenuBar(generateMenuBar()); setDefaultCloseOperation(EXIT_ON_CLOSE); + addWindowListener(new WindowAdapter() { + @Override + public void windowClosing(WindowEvent e) { + System.out.println("Window Closed!"); + super.windowClosing(e); + } + }); } protected LogWindow createLogWindow() From 96b585f827f5f63b30f4b0e500a74a725ce5cf7b Mon Sep 17 00:00:00 2001 From: Andrew Date: Mon, 15 May 2023 20:11:50 +0500 Subject: [PATCH 24/34] dirty serialization logic added. No Logger saving --- robots/src/config/ConfigException.java | 6 + robots/src/config/ConfigReader.java | 9 ++ robots/src/config/ConfigWriter.java | 9 ++ .../config/PredeterminedPathConfigReader.java | 37 +++++ .../config/PredeterminedPathConfigWriter.java | 54 ++++++++ robots/src/gui/GameVisualizer.java | 6 +- robots/src/gui/GameWindow.java | 8 +- robots/src/gui/LogWindow.java | 8 +- robots/src/gui/MainApplicationFrame.java | 63 +++++++-- robots/src/gui/PositionShowWindow.java | 8 +- robots/src/gui/RobotsProgram.java | 129 +++++++++++++++--- .../gui/serial/InnerWindowStateContainer.java | 31 +++++ .../gui/serial/MainWindowStateContainer.java | 16 +++ robots/src/gui/serial/MySerializable.java | 4 + robots/src/models/RobotModel.java | 8 +- robots/src/models/TargetModel.java | 9 +- robots/src/models/states/RobotState.java | 4 +- robots/src/models/states/TargetState.java | 4 +- 18 files changed, 372 insertions(+), 41 deletions(-) create mode 100644 robots/src/config/ConfigException.java create mode 100644 robots/src/config/ConfigReader.java create mode 100644 robots/src/config/ConfigWriter.java create mode 100644 robots/src/config/PredeterminedPathConfigReader.java create mode 100644 robots/src/config/PredeterminedPathConfigWriter.java create mode 100644 robots/src/gui/serial/InnerWindowStateContainer.java create mode 100644 robots/src/gui/serial/MainWindowStateContainer.java create mode 100644 robots/src/gui/serial/MySerializable.java diff --git a/robots/src/config/ConfigException.java b/robots/src/config/ConfigException.java new file mode 100644 index 000000000..beb4e0311 --- /dev/null +++ b/robots/src/config/ConfigException.java @@ -0,0 +1,6 @@ +package config; + +import java.io.IOException; + +public class ConfigException extends IOException { +} diff --git a/robots/src/config/ConfigReader.java b/robots/src/config/ConfigReader.java new file mode 100644 index 000000000..396713487 --- /dev/null +++ b/robots/src/config/ConfigReader.java @@ -0,0 +1,9 @@ +package config; + +import java.io.Closeable; +import java.io.IOException; +import java.io.ObjectInputStream; + +public interface ConfigReader extends Closeable { + Object readObject() throws ConfigException, IOException, ClassNotFoundException; +} diff --git a/robots/src/config/ConfigWriter.java b/robots/src/config/ConfigWriter.java new file mode 100644 index 000000000..4e3ede747 --- /dev/null +++ b/robots/src/config/ConfigWriter.java @@ -0,0 +1,9 @@ +package config; + +import java.io.Closeable; +import java.io.IOException; + +public interface ConfigWriter extends Closeable { + void writeObject(Object data) throws IOException; + +} diff --git a/robots/src/config/PredeterminedPathConfigReader.java b/robots/src/config/PredeterminedPathConfigReader.java new file mode 100644 index 000000000..a6eac2c6a --- /dev/null +++ b/robots/src/config/PredeterminedPathConfigReader.java @@ -0,0 +1,37 @@ +package config; + +import java.io.*; + +public class PredeterminedPathConfigReader implements ConfigReader{ + + private File m_path; + private ObjectInputStream m_data; + + public PredeterminedPathConfigReader(String path){ + m_path=new File(path); + try{ + m_data=new ObjectInputStream( new BufferedInputStream(new FileInputStream(m_path))); + } + catch (IOException e){ + m_data=null; + } + } + + + + @Override + public void close() throws IOException { + if(m_data==null){ + return; + } + m_data.close(); + } + + @Override + public Object readObject() throws ConfigException, IOException, ClassNotFoundException { + if(m_data==null){ + throw new ConfigException(); + } + return m_data.readObject(); + } +} diff --git a/robots/src/config/PredeterminedPathConfigWriter.java b/robots/src/config/PredeterminedPathConfigWriter.java new file mode 100644 index 000000000..598105520 --- /dev/null +++ b/robots/src/config/PredeterminedPathConfigWriter.java @@ -0,0 +1,54 @@ +package config; + +import java.io.*; +import java.nio.file.Paths; + +public class PredeterminedPathConfigWriter implements ConfigWriter { + + File m_path; + ObjectOutputStream m_stream; + + public PredeterminedPathConfigWriter(String path) { + m_path = new File(path); + try{ + m_path.createNewFile(); + m_stream=new ObjectOutputStream(new FileOutputStream(m_path)); + + + } catch (IOException e) { + m_stream=null; + } + } + + @Override + public void writeObject(Object data) throws IOException { + if (m_stream == null) { + throw new ConfigException(); + } + + m_stream.writeObject(data); + } + + @Override + public void close() throws IOException { + if (m_stream == null) { + return; + } + m_stream.close(); + } + + public static void main(String[] args) { + + String d ="fooo"; + + var p= new File(System.getProperty("user.home"),"config.conf"); + System.out.println(p); + try (PredeterminedPathConfigWriter writer = new PredeterminedPathConfigWriter(p.getPath())) { + writer.writeObject(d); + + } catch (IOException e) { + throw new RuntimeException(e); + } + + } +} diff --git a/robots/src/gui/GameVisualizer.java b/robots/src/gui/GameVisualizer.java index 34f3d7b6a..93d91351d 100644 --- a/robots/src/gui/GameVisualizer.java +++ b/robots/src/gui/GameVisualizer.java @@ -3,6 +3,8 @@ import controllers.TargetPositionController; import gui.drawModels.RobotRepresentation; import gui.drawModels.TargetRepresentation; +import gui.serial.InnerWindowStateContainer; +import gui.serial.MySerializable; import models.RobotModel; import models.TargetModel; @@ -14,7 +16,7 @@ import javax.swing.JPanel; -public class GameVisualizer extends JPanel implements Observer { +public class GameVisualizer extends JPanel implements Observer{ @@ -75,4 +77,6 @@ public void update(Observable o, Object arg) { EventQueue.invokeLater(this::onModelUpdateEvent); } + + } diff --git a/robots/src/gui/GameWindow.java b/robots/src/gui/GameWindow.java index 6612fab60..40625ad46 100644 --- a/robots/src/gui/GameWindow.java +++ b/robots/src/gui/GameWindow.java @@ -1,6 +1,8 @@ package gui; import controllers.TargetPositionController; +import gui.serial.InnerWindowStateContainer; +import gui.serial.MySerializable; import models.RobotModel; import models.TargetModel; @@ -10,7 +12,7 @@ import javax.swing.JInternalFrame; import javax.swing.JPanel; -public class GameWindow extends JInternalFrame +public class GameWindow extends JInternalFrame implements MySerializable { private final GameVisualizer m_visualizer; public GameWindow(RobotModel model, TargetPositionController controller, TargetModel target) @@ -24,4 +26,8 @@ public GameWindow(RobotModel model, TargetPositionController controller, TargetM getContentPane().add(panel); pack(); } + public InnerWindowStateContainer getState(){ + return new InnerWindowStateContainer(getX(),getY(),getSize().width,getSize().height); + } + } diff --git a/robots/src/gui/LogWindow.java b/robots/src/gui/LogWindow.java index 723d3e2fc..d7c974466 100644 --- a/robots/src/gui/LogWindow.java +++ b/robots/src/gui/LogWindow.java @@ -7,11 +7,13 @@ import javax.swing.JInternalFrame; import javax.swing.JPanel; +import gui.serial.InnerWindowStateContainer; +import gui.serial.MySerializable; import log.LogChangeListener; import log.LogEntry; import log.LogWindowSource; -public class LogWindow extends JInternalFrame implements LogChangeListener +public class LogWindow extends JInternalFrame implements LogChangeListener, MySerializable { private LogWindowSource m_logSource; private TextArea m_logContent; @@ -47,4 +49,8 @@ public void onLogChanged() { EventQueue.invokeLater(this::updateLogContent); } + + public InnerWindowStateContainer getState(){ + return new InnerWindowStateContainer(getX(),getY(),getSize().width,getSize().height); + } } diff --git a/robots/src/gui/MainApplicationFrame.java b/robots/src/gui/MainApplicationFrame.java index 36a604289..28c470ff7 100644 --- a/robots/src/gui/MainApplicationFrame.java +++ b/robots/src/gui/MainApplicationFrame.java @@ -17,6 +17,8 @@ import javax.swing.UnsupportedLookAndFeelException; import controllers.TargetPositionController; +import gui.serial.InnerWindowStateContainer; +import gui.serial.MainWindowStateContainer; import log.Logger; import models.RobotModel; import models.TargetModel; @@ -30,7 +32,11 @@ public class MainApplicationFrame extends JFrame { private final JDesktopPane desktopPane = new JDesktopPane(); - + private final LogWindow m_logger; + private final GameWindow m_game; + + private final PositionShowWindow m_coordShow; + public MainApplicationFrame(RobotModel model, TargetPositionController controller, TargetModel target) { //Make the big window be indented 50 pixels from each edge //of the screen. @@ -42,18 +48,51 @@ public MainApplicationFrame(RobotModel model, TargetPositionController controlle setContentPane(desktopPane); - - LogWindow logWindow = createLogWindow(); - addWindow(logWindow); + m_logger = createLogWindow(); + addWindow(m_logger); - GameWindow gameWindow = new GameWindow(model,controller,target); - gameWindow.setSize(400, 400); - PositionShowWindow coordWindow=new PositionShowWindow(model); - coordWindow.setSize(200,100); - addWindow(coordWindow); - addWindow(gameWindow); + m_game = new GameWindow(model,controller,target); + m_game.setSize(400, 400); + + m_coordShow=new PositionShowWindow(model); + m_coordShow.setSize(200,100); + addWindow(m_coordShow); + addWindow(m_game); + + setJMenuBar(generateMenuBar()); + setDefaultCloseOperation(EXIT_ON_CLOSE); + addWindowListener(new WindowAdapter() { + @Override + public void windowClosing(WindowEvent e) { + System.out.println("Window Closed!"); + super.windowClosing(e); + } + }); + } + + public MainApplicationFrame(RobotModel model, TargetPositionController controller, TargetModel target,MainWindowStateContainer container){ + int inset = 50; + Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize(); + setBounds(inset, inset, + screenSize.width - inset*2, + screenSize.height - inset*2); + + setContentPane(desktopPane); + m_logger = createLogWindow(); + m_logger.setLocation(container.LoggerState.x,container.LoggerState.y); + m_logger.setSize(container.LoggerState.sizeX,container.LoggerState.sizeY); + addWindow(m_logger); + m_game=new GameWindow(model,controller,target); + m_game.setLocation(container.GameState.x,container.GameState.y); + m_game.setSize(container.GameState.sizeX,container.GameState.sizeY); + addWindow(m_game); + + m_coordShow=new PositionShowWindow(model); + m_coordShow.setLocation(container.PositionShowState.x,container.PositionShowState.y); + m_coordShow.setSize(container.PositionShowState.sizeX,container.PositionShowState.sizeY); + addWindow(m_coordShow); setJMenuBar(generateMenuBar()); setDefaultCloseOperation(EXIT_ON_CLOSE); @@ -65,7 +104,6 @@ public void windowClosing(WindowEvent e) { } }); } - protected LogWindow createLogWindow() { LogWindow logWindow = new LogWindow(Logger.getDefaultLogSource()); @@ -170,4 +208,7 @@ private void setLookAndFeel(String className) // just ignore } } + public MainWindowStateContainer getFrameState(){ + return new MainWindowStateContainer(m_game.getState(),m_logger.getState(),m_coordShow.getState()); + } } diff --git a/robots/src/gui/PositionShowWindow.java b/robots/src/gui/PositionShowWindow.java index cd519c5f2..eb039b6d5 100644 --- a/robots/src/gui/PositionShowWindow.java +++ b/robots/src/gui/PositionShowWindow.java @@ -1,6 +1,8 @@ package gui; +import gui.serial.InnerWindowStateContainer; +import gui.serial.MySerializable; import models.RobotModel; import models.states.RobotStateReader; @@ -9,7 +11,7 @@ import java.util.Observable; import java.util.Observer; -public class PositionShowWindow extends JInternalFrame implements Observer { +public class PositionShowWindow extends JInternalFrame implements Observer, MySerializable { private RobotModel m_model; private JLabel m_labelX; private JLabel m_labelY; @@ -36,4 +38,8 @@ void onTextUpdate(){ m_labelX.setText("X : %f".formatted(state.getX())); m_labelY.setText("Y : %f".formatted(state.getY())); } + + public InnerWindowStateContainer getState(){ + return new InnerWindowStateContainer(getX(),getY(),getSize().width,getSize().height); + } } diff --git a/robots/src/gui/RobotsProgram.java b/robots/src/gui/RobotsProgram.java index 040b3427c..a2af213c5 100644 --- a/robots/src/gui/RobotsProgram.java +++ b/robots/src/gui/RobotsProgram.java @@ -1,35 +1,124 @@ package gui; +import config.ConfigReader; +import config.ConfigWriter; +import config.PredeterminedPathConfigReader; +import config.PredeterminedPathConfigWriter; import controllers.TargetPositionController; import controllers.RobotUpdateController; +import gui.serial.MainWindowStateContainer; import models.RobotModel; import models.TargetModel; +import models.states.RobotState; +import models.states.TargetState; -import java.awt.Frame; +import java.awt.*; +import java.awt.event.WindowAdapter; +import java.awt.event.WindowEvent; +import java.io.File; +import java.io.IOException; import javax.swing.SwingUtilities; import javax.swing.UIManager; -public class RobotsProgram -{ +public class RobotsProgram { + private static File m_serialize_path = new File("C:\\Users\\as-pa\\config.conf"); + private static TargetModel m_targetModel; + private static RobotModel m_robotModel; + private static RobotUpdateController m_updater; + private static TargetPositionController m_targetController; + private static MainApplicationFrame m_frame; + public static void main(String[] args) { - try { - UIManager.setLookAndFeel("javax.swing.plaf.nimbus.NimbusLookAndFeel"); + try { + UIManager.setLookAndFeel("javax.swing.plaf.nimbus.NimbusLookAndFeel"); // UIManager.setLookAndFeel("javax.swing.plaf.metal.MetalLookAndFeel"); // UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); // UIManager.setLookAndFeel(UIManager.getCrossPlatformLookAndFeelClassName()); - } catch (Exception e) { - e.printStackTrace(); - } - SwingUtilities.invokeLater(() -> { - TargetModel target=new TargetModel(150,100); - RobotModel model=new RobotModel(100,100,100,target); - RobotUpdateController updateController = new RobotUpdateController(model); - TargetPositionController movementController=new TargetPositionController(target); - - MainApplicationFrame frame = new MainApplicationFrame(model, movementController, target); - frame.pack(); - frame.setVisible(true); - frame.setExtendedState(Frame.MAXIMIZED_BOTH); - }); - }} + } catch (Exception e) { + e.printStackTrace(); + } + + SwingUtilities.invokeLater(() -> { + + + try (PredeterminedPathConfigReader reader = new PredeterminedPathConfigReader(m_serialize_path.getPath())) { + readProgramState(reader); + + } catch (IOException | ClassNotFoundException e) { + initProgramState(); + + } + }); + } + private static void initProgramState(){ + m_targetModel = new TargetModel(150, 100); + m_robotModel = new RobotModel(100, 100, 100, m_targetModel); + m_updater = new RobotUpdateController(m_robotModel); + m_targetController = new TargetPositionController(m_targetModel); + m_frame = new MainApplicationFrame(m_robotModel, m_targetController, m_targetModel); + m_frame.pack(); + m_frame.setVisible(true); + m_frame.setExtendedState(Frame.MAXIMIZED_BOTH); + m_frame.addWindowListener(new WindowAdapter() { + @Override + public void windowClosing(WindowEvent e) { + synchronized (this){ + try(ConfigWriter writer = new PredeterminedPathConfigWriter(m_serialize_path.getPath())){ + writeProgramState(writer); + + } catch (IOException ex) { + ex.printStackTrace(); + + } + finally { + super.windowClosing(e); + } + } + + + } + }); + } + private static void readProgramState(ConfigReader reader) throws IOException, ClassNotFoundException { + MainWindowStateContainer Windowscontainer=(MainWindowStateContainer)reader.readObject(); + RobotState robotContainer=(RobotState) reader.readObject(); + TargetState targetContainer=(TargetState) reader.readObject(); + m_targetModel=new TargetModel(targetContainer); + m_robotModel=new RobotModel(robotContainer,m_targetModel); + m_targetController=new TargetPositionController(m_targetModel); + m_updater=new RobotUpdateController(m_robotModel); + m_frame=new MainApplicationFrame(m_robotModel,m_targetController,m_targetModel,Windowscontainer); + m_frame.pack(); + m_frame.setVisible(true); + m_frame.setExtendedState(Frame.MAXIMIZED_BOTH); + m_frame.addWindowListener(new WindowAdapter() { + @Override + public void windowClosing(WindowEvent e) { + synchronized (this){ + try(ConfigWriter writer = new PredeterminedPathConfigWriter(m_serialize_path.getPath())){ + writeProgramState(writer); + + } catch (IOException ex) { + ex.printStackTrace(); + + } + finally { + super.windowClosing(e); + } + } + + + } + }); + } + + private static void writeProgramState(ConfigWriter writer) throws IOException{ + MainWindowStateContainer windowContainer=m_frame.getFrameState(); + RobotState robotContainer=m_robotModel.getState(); + TargetState targetContainer=m_targetModel.getState(); + writer.writeObject(windowContainer); + writer.writeObject(robotContainer); + writer.writeObject(targetContainer); + } +} diff --git a/robots/src/gui/serial/InnerWindowStateContainer.java b/robots/src/gui/serial/InnerWindowStateContainer.java new file mode 100644 index 000000000..cc6c980cd --- /dev/null +++ b/robots/src/gui/serial/InnerWindowStateContainer.java @@ -0,0 +1,31 @@ +package gui.serial; + +import java.io.Serializable; + +public class InnerWindowStateContainer implements Serializable { + + + public int x; + public int y; + public int sizeX; + public int sizeY; + + + + public InnerWindowStateContainer(int x, int y, int sizeX, int sizeY) { + this.x = x; + this.y = y; + this.sizeX = sizeX; + this.sizeY = sizeY; + + } + + + + + + + + + +} diff --git a/robots/src/gui/serial/MainWindowStateContainer.java b/robots/src/gui/serial/MainWindowStateContainer.java new file mode 100644 index 000000000..a0b0f8b5a --- /dev/null +++ b/robots/src/gui/serial/MainWindowStateContainer.java @@ -0,0 +1,16 @@ +package gui.serial; + +import java.io.Serializable; + +public class MainWindowStateContainer implements Serializable { + public InnerWindowStateContainer GameState; + public InnerWindowStateContainer LoggerState; + + public MainWindowStateContainer(InnerWindowStateContainer gameState, InnerWindowStateContainer loggerState, InnerWindowStateContainer positionShowState) { + GameState = gameState; + LoggerState = loggerState; + PositionShowState = positionShowState; + } + + public InnerWindowStateContainer PositionShowState; +} diff --git a/robots/src/gui/serial/MySerializable.java b/robots/src/gui/serial/MySerializable.java new file mode 100644 index 000000000..57b3a60b3 --- /dev/null +++ b/robots/src/gui/serial/MySerializable.java @@ -0,0 +1,4 @@ +package gui.serial; + +public interface MySerializable { +} diff --git a/robots/src/models/RobotModel.java b/robots/src/models/RobotModel.java index 4d0c78604..be5e62150 100644 --- a/robots/src/models/RobotModel.java +++ b/robots/src/models/RobotModel.java @@ -30,6 +30,12 @@ public RobotModel(double m_PositionX, double m_PositionY, double m_Direction,Tar this.m_Direction = m_Direction; m_Target=target; } + public RobotModel(RobotState state,TargetModel target){ + this.m_Target=target; + this.m_PositionY=state.getY(); + this.m_PositionX=state.getX(); + this.m_Direction=state.getDir(); + } public void updatePos(){ @@ -45,7 +51,7 @@ public void updatePos(){ - public RobotStateReader getState(){ + public RobotState getState(){ RobotState ans; synchronized (this){ ans=new RobotState(m_PositionX,m_PositionY,m_Direction); diff --git a/robots/src/models/TargetModel.java b/robots/src/models/TargetModel.java index a8202de89..31327a3dd 100644 --- a/robots/src/models/TargetModel.java +++ b/robots/src/models/TargetModel.java @@ -13,10 +13,13 @@ public class TargetModel extends Observable { public TargetModel(double posX, double posY) { setPos(posX, posY); } + public TargetModel(TargetState state){ + m_PositionX=state.getX(); + m_PositionY=state.getY(); + } - - public TargetStateReader getState(){ - TargetStateReader ans; + public TargetState getState(){ + TargetState ans; synchronized (this){ ans=new TargetState(m_PositionX,m_PositionY); } diff --git a/robots/src/models/states/RobotState.java b/robots/src/models/states/RobotState.java index 83b090f28..829694681 100644 --- a/robots/src/models/states/RobotState.java +++ b/robots/src/models/states/RobotState.java @@ -1,6 +1,8 @@ package models.states; -public class RobotState implements RobotStateReader{ +import java.io.Serializable; + +public class RobotState implements RobotStateReader, Serializable { private volatile double m_x; diff --git a/robots/src/models/states/TargetState.java b/robots/src/models/states/TargetState.java index 399404908..23490c0fa 100644 --- a/robots/src/models/states/TargetState.java +++ b/robots/src/models/states/TargetState.java @@ -1,6 +1,8 @@ package models.states; -public class TargetState implements TargetStateReader{ +import java.io.Serializable; + +public class TargetState implements TargetStateReader, Serializable { private double x; private double y; From fd97fb4f1c6a136e07bbc5ffd977f6205d144cca Mon Sep 17 00:00:00 2001 From: Andrew Date: Wed, 17 May 2023 11:01:09 +0500 Subject: [PATCH 25/34] added serialization container for logWindowSource, added method of generating it and rebuilding source from state --- robots/src/log/LogWindowSource.java | 11 +++++++++++ robots/src/log/states/LoggerSourceState.java | 15 +++++++++++++++ 2 files changed, 26 insertions(+) create mode 100644 robots/src/log/states/LoggerSourceState.java diff --git a/robots/src/log/LogWindowSource.java b/robots/src/log/LogWindowSource.java index ca0ce4426..bff7c76dd 100644 --- a/robots/src/log/LogWindowSource.java +++ b/robots/src/log/LogWindowSource.java @@ -1,5 +1,7 @@ package log; +import log.states.LoggerSourceState; + import java.util.ArrayList; import java.util.Collections; @@ -26,6 +28,11 @@ public LogWindowSource(int iQueueLength) m_messages = new ArrayList(iQueueLength); m_listeners = new ArrayList(); } + public LogWindowSource(LoggerSourceState container){ + m_iQueueLength=container.qLength; + m_messages=container.logs; + m_listeners=new ArrayList(); + } public void registerListener(LogChangeListener listener) { @@ -86,4 +93,8 @@ public Iterable all() { return m_messages; } + + public LoggerSourceState getState(){ + return new LoggerSourceState(m_messages,m_iQueueLength); + } } diff --git a/robots/src/log/states/LoggerSourceState.java b/robots/src/log/states/LoggerSourceState.java new file mode 100644 index 000000000..d89cd576f --- /dev/null +++ b/robots/src/log/states/LoggerSourceState.java @@ -0,0 +1,15 @@ +package log.states; + +import log.LogEntry; + +import java.io.Serializable; +import java.util.ArrayList; + +public class LoggerSourceState implements Serializable { + public ArrayList logs; + public int qLength; + public LoggerSourceState(ArrayList l,int len){ + logs=l; + qLength=len; + } +} From 1fb164fd923b71bf6801496a784464c3b893e142 Mon Sep 17 00:00:00 2001 From: Andrew Date: Wed, 17 May 2023 11:02:27 +0500 Subject: [PATCH 26/34] serialization markup for log message components --- robots/src/log/LogEntry.java | 4 +++- robots/src/log/LogLevel.java | 4 +++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/robots/src/log/LogEntry.java b/robots/src/log/LogEntry.java index 3d9147107..f6665e9f5 100644 --- a/robots/src/log/LogEntry.java +++ b/robots/src/log/LogEntry.java @@ -1,6 +1,8 @@ package log; -public class LogEntry +import java.io.Serializable; + +public class LogEntry implements Serializable { private LogLevel m_logLevel; private String m_strMessage; diff --git a/robots/src/log/LogLevel.java b/robots/src/log/LogLevel.java index 582d010cc..4f06ff14d 100644 --- a/robots/src/log/LogLevel.java +++ b/robots/src/log/LogLevel.java @@ -1,6 +1,8 @@ package log; -public enum LogLevel +import java.io.Serializable; + +public enum LogLevel implements Serializable { Trace(0), Debug(1), From 2302b8f2df9ef910c96480171bf6bcbefcb15a20 Mon Sep 17 00:00:00 2001 From: Andrew Date: Wed, 17 May 2023 11:03:07 +0500 Subject: [PATCH 27/34] logSource is now a property of main program and dependency for graphics subsystem. Logger now saves its state --- robots/src/gui/MainApplicationFrame.java | 13 +++++++------ robots/src/gui/RobotsProgram.java | 13 +++++++++++-- 2 files changed, 18 insertions(+), 8 deletions(-) diff --git a/robots/src/gui/MainApplicationFrame.java b/robots/src/gui/MainApplicationFrame.java index 28c470ff7..714b3559a 100644 --- a/robots/src/gui/MainApplicationFrame.java +++ b/robots/src/gui/MainApplicationFrame.java @@ -19,6 +19,7 @@ import controllers.TargetPositionController; import gui.serial.InnerWindowStateContainer; import gui.serial.MainWindowStateContainer; +import log.LogWindowSource; import log.Logger; import models.RobotModel; import models.TargetModel; @@ -37,7 +38,7 @@ public class MainApplicationFrame extends JFrame private final PositionShowWindow m_coordShow; - public MainApplicationFrame(RobotModel model, TargetPositionController controller, TargetModel target) { + public MainApplicationFrame(RobotModel model, TargetPositionController controller, TargetModel target, LogWindowSource logs) { //Make the big window be indented 50 pixels from each edge //of the screen. int inset = 50; @@ -49,7 +50,7 @@ public MainApplicationFrame(RobotModel model, TargetPositionController controlle setContentPane(desktopPane); - m_logger = createLogWindow(); + m_logger = createLogWindow(logs); addWindow(m_logger); @@ -72,7 +73,7 @@ public void windowClosing(WindowEvent e) { }); } - public MainApplicationFrame(RobotModel model, TargetPositionController controller, TargetModel target,MainWindowStateContainer container){ + public MainApplicationFrame(RobotModel model, TargetPositionController controller, TargetModel target,MainWindowStateContainer container,LogWindowSource logs){ int inset = 50; Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize(); setBounds(inset, inset, @@ -80,7 +81,7 @@ public MainApplicationFrame(RobotModel model, TargetPositionController controlle screenSize.height - inset*2); setContentPane(desktopPane); - m_logger = createLogWindow(); + m_logger = createLogWindow(logs); m_logger.setLocation(container.LoggerState.x,container.LoggerState.y); m_logger.setSize(container.LoggerState.sizeX,container.LoggerState.sizeY); addWindow(m_logger); @@ -104,9 +105,9 @@ public void windowClosing(WindowEvent e) { } }); } - protected LogWindow createLogWindow() + protected LogWindow createLogWindow(LogWindowSource source) { - LogWindow logWindow = new LogWindow(Logger.getDefaultLogSource()); + LogWindow logWindow = new LogWindow(source); logWindow.setLocation(10,10); logWindow.setSize(300, 800); setMinimumSize(logWindow.getSize()); diff --git a/robots/src/gui/RobotsProgram.java b/robots/src/gui/RobotsProgram.java index a2af213c5..b6eb9d643 100644 --- a/robots/src/gui/RobotsProgram.java +++ b/robots/src/gui/RobotsProgram.java @@ -7,6 +7,9 @@ import controllers.TargetPositionController; import controllers.RobotUpdateController; import gui.serial.MainWindowStateContainer; +import log.LogWindowSource; +import log.Logger; +import log.states.LoggerSourceState; import models.RobotModel; import models.TargetModel; import models.states.RobotState; @@ -26,6 +29,7 @@ public class RobotsProgram { private static TargetModel m_targetModel; private static RobotModel m_robotModel; private static RobotUpdateController m_updater; + private static LogWindowSource m_logs; private static TargetPositionController m_targetController; private static MainApplicationFrame m_frame; @@ -55,8 +59,9 @@ private static void initProgramState(){ m_targetModel = new TargetModel(150, 100); m_robotModel = new RobotModel(100, 100, 100, m_targetModel); m_updater = new RobotUpdateController(m_robotModel); + m_logs= Logger.getDefaultLogSource(); m_targetController = new TargetPositionController(m_targetModel); - m_frame = new MainApplicationFrame(m_robotModel, m_targetController, m_targetModel); + m_frame = new MainApplicationFrame(m_robotModel, m_targetController, m_targetModel,m_logs); m_frame.pack(); m_frame.setVisible(true); m_frame.setExtendedState(Frame.MAXIMIZED_BOTH); @@ -84,11 +89,13 @@ private static void readProgramState(ConfigReader reader) throws IOException, Cl MainWindowStateContainer Windowscontainer=(MainWindowStateContainer)reader.readObject(); RobotState robotContainer=(RobotState) reader.readObject(); TargetState targetContainer=(TargetState) reader.readObject(); + LoggerSourceState logs=(LoggerSourceState)reader.readObject(); + m_logs=new LogWindowSource(logs); m_targetModel=new TargetModel(targetContainer); m_robotModel=new RobotModel(robotContainer,m_targetModel); m_targetController=new TargetPositionController(m_targetModel); m_updater=new RobotUpdateController(m_robotModel); - m_frame=new MainApplicationFrame(m_robotModel,m_targetController,m_targetModel,Windowscontainer); + m_frame=new MainApplicationFrame(m_robotModel,m_targetController,m_targetModel, Windowscontainer,m_logs); m_frame.pack(); m_frame.setVisible(true); m_frame.setExtendedState(Frame.MAXIMIZED_BOTH); @@ -117,8 +124,10 @@ private static void writeProgramState(ConfigWriter writer) throws IOException{ MainWindowStateContainer windowContainer=m_frame.getFrameState(); RobotState robotContainer=m_robotModel.getState(); TargetState targetContainer=m_targetModel.getState(); + LoggerSourceState logs=m_logs.getState(); writer.writeObject(windowContainer); writer.writeObject(robotContainer); writer.writeObject(targetContainer); + writer.writeObject(logs); } } From f5d81fb8ea21c2715a1d92d1b12f88ac3895b78e Mon Sep 17 00:00:00 2001 From: Andrew Date: Sun, 11 Jun 2023 16:17:36 +0500 Subject: [PATCH 28/34] minor linter refactor --- .../src/config/PredeterminedPathConfigWriter.java | 13 ------------- robots/src/gui/MainApplicationFrame.java | 13 ++++++------- robots/src/gui/drawModels/Drawable.java | 6 ------ robots/src/gui/serial/MainWindowStateContainer.java | 13 +++++++------ 4 files changed, 13 insertions(+), 32 deletions(-) diff --git a/robots/src/config/PredeterminedPathConfigWriter.java b/robots/src/config/PredeterminedPathConfigWriter.java index 598105520..3c99842bf 100644 --- a/robots/src/config/PredeterminedPathConfigWriter.java +++ b/robots/src/config/PredeterminedPathConfigWriter.java @@ -37,18 +37,5 @@ public void close() throws IOException { m_stream.close(); } - public static void main(String[] args) { - String d ="fooo"; - - var p= new File(System.getProperty("user.home"),"config.conf"); - System.out.println(p); - try (PredeterminedPathConfigWriter writer = new PredeterminedPathConfigWriter(p.getPath())) { - writer.writeObject(d); - - } catch (IOException e) { - throw new RuntimeException(e); - } - - } } diff --git a/robots/src/gui/MainApplicationFrame.java b/robots/src/gui/MainApplicationFrame.java index 714b3559a..e4cb9a45a 100644 --- a/robots/src/gui/MainApplicationFrame.java +++ b/robots/src/gui/MainApplicationFrame.java @@ -17,7 +17,6 @@ import javax.swing.UnsupportedLookAndFeelException; import controllers.TargetPositionController; -import gui.serial.InnerWindowStateContainer; import gui.serial.MainWindowStateContainer; import log.LogWindowSource; import log.Logger; @@ -82,17 +81,17 @@ public MainApplicationFrame(RobotModel model, TargetPositionController controlle setContentPane(desktopPane); m_logger = createLogWindow(logs); - m_logger.setLocation(container.LoggerState.x,container.LoggerState.y); - m_logger.setSize(container.LoggerState.sizeX,container.LoggerState.sizeY); + m_logger.setLocation(container.m_loggerState.x,container.m_loggerState.y); + m_logger.setSize(container.m_loggerState.sizeX,container.m_loggerState.sizeY); addWindow(m_logger); m_game=new GameWindow(model,controller,target); - m_game.setLocation(container.GameState.x,container.GameState.y); - m_game.setSize(container.GameState.sizeX,container.GameState.sizeY); + m_game.setLocation(container.m_gameState.x,container.m_gameState.y); + m_game.setSize(container.m_gameState.sizeX,container.m_gameState.sizeY); addWindow(m_game); m_coordShow=new PositionShowWindow(model); - m_coordShow.setLocation(container.PositionShowState.x,container.PositionShowState.y); - m_coordShow.setSize(container.PositionShowState.sizeX,container.PositionShowState.sizeY); + m_coordShow.setLocation(container.m_positionShowState.x,container.m_positionShowState.y); + m_coordShow.setSize(container.m_positionShowState.sizeX,container.m_positionShowState.sizeY); addWindow(m_coordShow); setJMenuBar(generateMenuBar()); diff --git a/robots/src/gui/drawModels/Drawable.java b/robots/src/gui/drawModels/Drawable.java index 24f9383ac..ef9617464 100644 --- a/robots/src/gui/drawModels/Drawable.java +++ b/robots/src/gui/drawModels/Drawable.java @@ -6,10 +6,4 @@ public interface Drawable { void draw(Graphics2D g); - - - - - - } diff --git a/robots/src/gui/serial/MainWindowStateContainer.java b/robots/src/gui/serial/MainWindowStateContainer.java index a0b0f8b5a..c49316166 100644 --- a/robots/src/gui/serial/MainWindowStateContainer.java +++ b/robots/src/gui/serial/MainWindowStateContainer.java @@ -3,14 +3,15 @@ import java.io.Serializable; public class MainWindowStateContainer implements Serializable { - public InnerWindowStateContainer GameState; - public InnerWindowStateContainer LoggerState; + public InnerWindowStateContainer m_gameState; + public InnerWindowStateContainer m_loggerState; + public InnerWindowStateContainer m_positionShowState; public MainWindowStateContainer(InnerWindowStateContainer gameState, InnerWindowStateContainer loggerState, InnerWindowStateContainer positionShowState) { - GameState = gameState; - LoggerState = loggerState; - PositionShowState = positionShowState; + m_gameState = gameState; + m_loggerState = loggerState; + m_positionShowState = positionShowState; } - public InnerWindowStateContainer PositionShowState; + } From 8aacbe33944069f6073bbbbb9c9aa3724e20b006 Mon Sep 17 00:00:00 2001 From: Andrew Date: Sun, 11 Jun 2023 23:56:39 +0500 Subject: [PATCH 29/34] GameVisualizer import cleaning --- robots/src/gui/GameVisualizer.java | 3 +-- .../gui/serial/{MySerializable.java => SerializableFrame.java} | 0 robots/src/serviceLocators/ModelAndControllerLocator.java | 2 ++ robots/src/windowConstructors/AbstractWindowConstructor.java | 2 ++ robots/src/windowConstructors/GameWindowConstructor.java | 2 ++ robots/src/windowConstructors/LogWindowConstructor.java | 2 ++ robots/src/windowConstructors/PositionShowConstructor.java | 2 ++ robots/src/windowConstructors/WindowConstructor.java | 2 ++ 8 files changed, 13 insertions(+), 2 deletions(-) rename robots/src/gui/serial/{MySerializable.java => SerializableFrame.java} (100%) create mode 100644 robots/src/serviceLocators/ModelAndControllerLocator.java create mode 100644 robots/src/windowConstructors/AbstractWindowConstructor.java create mode 100644 robots/src/windowConstructors/GameWindowConstructor.java create mode 100644 robots/src/windowConstructors/LogWindowConstructor.java create mode 100644 robots/src/windowConstructors/PositionShowConstructor.java create mode 100644 robots/src/windowConstructors/WindowConstructor.java diff --git a/robots/src/gui/GameVisualizer.java b/robots/src/gui/GameVisualizer.java index 93d91351d..d72303396 100644 --- a/robots/src/gui/GameVisualizer.java +++ b/robots/src/gui/GameVisualizer.java @@ -3,8 +3,7 @@ import controllers.TargetPositionController; import gui.drawModels.RobotRepresentation; import gui.drawModels.TargetRepresentation; -import gui.serial.InnerWindowStateContainer; -import gui.serial.MySerializable; + import models.RobotModel; import models.TargetModel; diff --git a/robots/src/gui/serial/MySerializable.java b/robots/src/gui/serial/SerializableFrame.java similarity index 100% rename from robots/src/gui/serial/MySerializable.java rename to robots/src/gui/serial/SerializableFrame.java diff --git a/robots/src/serviceLocators/ModelAndControllerLocator.java b/robots/src/serviceLocators/ModelAndControllerLocator.java new file mode 100644 index 000000000..33d9eecf8 --- /dev/null +++ b/robots/src/serviceLocators/ModelAndControllerLocator.java @@ -0,0 +1,2 @@ +package serviceLocators;public class ModelAndControllerLocator { +} diff --git a/robots/src/windowConstructors/AbstractWindowConstructor.java b/robots/src/windowConstructors/AbstractWindowConstructor.java new file mode 100644 index 000000000..6b06ccc65 --- /dev/null +++ b/robots/src/windowConstructors/AbstractWindowConstructor.java @@ -0,0 +1,2 @@ +package windowConstructors;public class AbstractWindowConstructor { +} diff --git a/robots/src/windowConstructors/GameWindowConstructor.java b/robots/src/windowConstructors/GameWindowConstructor.java new file mode 100644 index 000000000..985344b32 --- /dev/null +++ b/robots/src/windowConstructors/GameWindowConstructor.java @@ -0,0 +1,2 @@ +package windowConstructors;public class GameWindowConstructor { +} diff --git a/robots/src/windowConstructors/LogWindowConstructor.java b/robots/src/windowConstructors/LogWindowConstructor.java new file mode 100644 index 000000000..0e2a02e11 --- /dev/null +++ b/robots/src/windowConstructors/LogWindowConstructor.java @@ -0,0 +1,2 @@ +package windowConstructors;public class LogWindowConstructor { +} diff --git a/robots/src/windowConstructors/PositionShowConstructor.java b/robots/src/windowConstructors/PositionShowConstructor.java new file mode 100644 index 000000000..f8fd02d40 --- /dev/null +++ b/robots/src/windowConstructors/PositionShowConstructor.java @@ -0,0 +1,2 @@ +package windowConstructors;public class PositionShowConstructor { +} diff --git a/robots/src/windowConstructors/WindowConstructor.java b/robots/src/windowConstructors/WindowConstructor.java new file mode 100644 index 000000000..46a6a0f93 --- /dev/null +++ b/robots/src/windowConstructors/WindowConstructor.java @@ -0,0 +1,2 @@ +package windowConstructors;public interface WindowConstructor { +} From 457e18d63e3d6a72d3169d1df8fca4e01f19b135 Mon Sep 17 00:00:00 2001 From: Andrew Date: Sun, 11 Jun 2023 23:58:03 +0500 Subject: [PATCH 30/34] serialization logic generalized. --- robots/src/gui/GameWindow.java | 14 +- robots/src/gui/LogWindow.java | 12 +- robots/src/gui/MainApplicationFrame.java | 110 ++----------- robots/src/gui/PositionShowWindow.java | 11 +- robots/src/gui/RobotsProgram.java | 146 ++++++++++-------- .../gui/serial/InnerWindowStateContainer.java | 6 +- robots/src/gui/serial/SerializableFrame.java | 5 +- .../ModelAndControllerLocator.java | 59 ++++++- .../AbstractWindowConstructor.java | 25 ++- .../GameWindowConstructor.java | 21 ++- .../LogWindowConstructor.java | 21 ++- .../PositionShowConstructor.java | 21 ++- .../windowConstructors/WindowConstructor.java | 9 +- 13 files changed, 274 insertions(+), 186 deletions(-) diff --git a/robots/src/gui/GameWindow.java b/robots/src/gui/GameWindow.java index 40625ad46..537f4e8d4 100644 --- a/robots/src/gui/GameWindow.java +++ b/robots/src/gui/GameWindow.java @@ -2,9 +2,11 @@ import controllers.TargetPositionController; import gui.serial.InnerWindowStateContainer; -import gui.serial.MySerializable; +import gui.serial.SerializableFrame; import models.RobotModel; import models.TargetModel; +import windowConstructors.GameWindowConstructor; +import windowConstructors.WindowConstructor; import java.awt.BorderLayout; @@ -12,7 +14,7 @@ import javax.swing.JInternalFrame; import javax.swing.JPanel; -public class GameWindow extends JInternalFrame implements MySerializable +public class GameWindow extends JInternalFrame implements SerializableFrame { private final GameVisualizer m_visualizer; public GameWindow(RobotModel model, TargetPositionController controller, TargetModel target) @@ -26,8 +28,10 @@ public GameWindow(RobotModel model, TargetPositionController controller, TargetM getContentPane().add(panel); pack(); } - public InnerWindowStateContainer getState(){ - return new InnerWindowStateContainer(getX(),getY(),getSize().width,getSize().height); - } + + @Override + public WindowConstructor getFrameState() { + return new GameWindowConstructor(getX(),getY(),getSize().width,getSize().height); + } } diff --git a/robots/src/gui/LogWindow.java b/robots/src/gui/LogWindow.java index d7c974466..7e53ce46e 100644 --- a/robots/src/gui/LogWindow.java +++ b/robots/src/gui/LogWindow.java @@ -8,12 +8,14 @@ import javax.swing.JPanel; import gui.serial.InnerWindowStateContainer; -import gui.serial.MySerializable; +import gui.serial.SerializableFrame; import log.LogChangeListener; import log.LogEntry; import log.LogWindowSource; +import windowConstructors.LogWindowConstructor; +import windowConstructors.WindowConstructor; -public class LogWindow extends JInternalFrame implements LogChangeListener, MySerializable +public class LogWindow extends JInternalFrame implements LogChangeListener, SerializableFrame { private LogWindowSource m_logSource; private TextArea m_logContent; @@ -35,6 +37,7 @@ public LogWindow(LogWindowSource logSource) private void updateLogContent() { + StringBuilder content = new StringBuilder(); for (LogEntry entry : m_logSource.all()) { @@ -50,7 +53,8 @@ public void onLogChanged() EventQueue.invokeLater(this::updateLogContent); } - public InnerWindowStateContainer getState(){ - return new InnerWindowStateContainer(getX(),getY(),getSize().width,getSize().height); + @Override + public WindowConstructor getFrameState() { + return new LogWindowConstructor(getX(),getY(),getWidth(),getHeight()); } } diff --git a/robots/src/gui/MainApplicationFrame.java b/robots/src/gui/MainApplicationFrame.java index e4cb9a45a..2e565dc3a 100644 --- a/robots/src/gui/MainApplicationFrame.java +++ b/robots/src/gui/MainApplicationFrame.java @@ -16,12 +16,8 @@ import javax.swing.UIManager; import javax.swing.UnsupportedLookAndFeelException; -import controllers.TargetPositionController; -import gui.serial.MainWindowStateContainer; -import log.LogWindowSource; import log.Logger; -import models.RobotModel; -import models.TargetModel; + /** * Что требуется сделать: @@ -32,47 +28,11 @@ public class MainApplicationFrame extends JFrame { private final JDesktopPane desktopPane = new JDesktopPane(); - private final LogWindow m_logger; - private final GameWindow m_game; - - private final PositionShowWindow m_coordShow; - - public MainApplicationFrame(RobotModel model, TargetPositionController controller, TargetModel target, LogWindowSource logs) { - //Make the big window be indented 50 pixels from each edge - //of the screen. - int inset = 50; - Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize(); - setBounds(inset, inset, - screenSize.width - inset*2, - screenSize.height - inset*2); - - setContentPane(desktopPane); - m_logger = createLogWindow(logs); - addWindow(m_logger); - m_game = new GameWindow(model,controller,target); - m_game.setSize(400, 400); - - m_coordShow=new PositionShowWindow(model); - m_coordShow.setSize(200,100); - addWindow(m_coordShow); - addWindow(m_game); - - setJMenuBar(generateMenuBar()); - setDefaultCloseOperation(EXIT_ON_CLOSE); - addWindowListener(new WindowAdapter() { - @Override - public void windowClosing(WindowEvent e) { - System.out.println("Window Closed!"); - super.windowClosing(e); - } - }); - } - - public MainApplicationFrame(RobotModel model, TargetPositionController controller, TargetModel target,MainWindowStateContainer container,LogWindowSource logs){ + public MainApplicationFrame(){ int inset = 50; Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize(); setBounds(inset, inset, @@ -80,19 +40,9 @@ public MainApplicationFrame(RobotModel model, TargetPositionController controlle screenSize.height - inset*2); setContentPane(desktopPane); - m_logger = createLogWindow(logs); - m_logger.setLocation(container.m_loggerState.x,container.m_loggerState.y); - m_logger.setSize(container.m_loggerState.sizeX,container.m_loggerState.sizeY); - addWindow(m_logger); - m_game=new GameWindow(model,controller,target); - m_game.setLocation(container.m_gameState.x,container.m_gameState.y); - m_game.setSize(container.m_gameState.sizeX,container.m_gameState.sizeY); - addWindow(m_game); - - m_coordShow=new PositionShowWindow(model); - m_coordShow.setLocation(container.m_positionShowState.x,container.m_positionShowState.y); - m_coordShow.setSize(container.m_positionShowState.sizeX,container.m_positionShowState.sizeY); - addWindow(m_coordShow); + + + setJMenuBar(generateMenuBar()); setDefaultCloseOperation(EXIT_ON_CLOSE); @@ -104,51 +54,13 @@ public void windowClosing(WindowEvent e) { } }); } - protected LogWindow createLogWindow(LogWindowSource source) - { - LogWindow logWindow = new LogWindow(source); - logWindow.setLocation(10,10); - logWindow.setSize(300, 800); - setMinimumSize(logWindow.getSize()); - logWindow.pack(); - Logger.debug("Протокол работает"); - return logWindow; - } - protected void addWindow(JInternalFrame frame) + public void addWindow(JInternalFrame frame) { desktopPane.add(frame); frame.setVisible(true); } - -// protected JMenuBar createMenuBar() { -// JMenuBar menuBar = new JMenuBar(); -// -// //Set up the lone menu. -// JMenu menu = new JMenu("Document"); -// menu.setMnemonic(KeyEvent.VK_D); -// menuBar.add(menu); -// -// //Set up the first menu item. -// JMenuItem menuItem = new JMenuItem("New"); -// menuItem.setMnemonic(KeyEvent.VK_N); -// menuItem.setAccelerator(KeyStroke.getKeyStroke( -// KeyEvent.VK_N, ActionEvent.ALT_MASK)); -// menuItem.setActionCommand("new"); -//// menuItem.addActionListener(this); -// menu.add(menuItem); -// -// //Set up the second menu item. -// menuItem = new JMenuItem("Quit"); -// menuItem.setMnemonic(KeyEvent.VK_Q); -// menuItem.setAccelerator(KeyStroke.getKeyStroke( -// KeyEvent.VK_Q, ActionEvent.ALT_MASK)); -// menuItem.setActionCommand("quit"); -//// menuItem.addActionListener(this); -// menu.add(menuItem); -// -// return menuBar; -// } + private JMenuBar generateMenuBar() { @@ -194,7 +106,9 @@ private JMenuBar generateMenuBar() menuBar.add(testMenu); return menuBar; } - + public JInternalFrame[] getInternalFrames(){ + return desktopPane.getAllFrames(); + } private void setLookAndFeel(String className) { try @@ -208,7 +122,5 @@ private void setLookAndFeel(String className) // just ignore } } - public MainWindowStateContainer getFrameState(){ - return new MainWindowStateContainer(m_game.getState(),m_logger.getState(),m_coordShow.getState()); - } + } diff --git a/robots/src/gui/PositionShowWindow.java b/robots/src/gui/PositionShowWindow.java index eb039b6d5..fd69895ee 100644 --- a/robots/src/gui/PositionShowWindow.java +++ b/robots/src/gui/PositionShowWindow.java @@ -2,16 +2,18 @@ import gui.serial.InnerWindowStateContainer; -import gui.serial.MySerializable; +import gui.serial.SerializableFrame; import models.RobotModel; import models.states.RobotStateReader; +import windowConstructors.PositionShowConstructor; +import windowConstructors.WindowConstructor; import javax.swing.*; import java.awt.*; import java.util.Observable; import java.util.Observer; -public class PositionShowWindow extends JInternalFrame implements Observer, MySerializable { +public class PositionShowWindow extends JInternalFrame implements Observer, SerializableFrame { private RobotModel m_model; private JLabel m_labelX; private JLabel m_labelY; @@ -39,7 +41,8 @@ void onTextUpdate(){ m_labelY.setText("Y : %f".formatted(state.getY())); } - public InnerWindowStateContainer getState(){ - return new InnerWindowStateContainer(getX(),getY(),getSize().width,getSize().height); + @Override + public WindowConstructor getFrameState() { + return new PositionShowConstructor(getX(),getY(),getSize().width,getSize().height); } } diff --git a/robots/src/gui/RobotsProgram.java b/robots/src/gui/RobotsProgram.java index b6eb9d643..cb084de8a 100644 --- a/robots/src/gui/RobotsProgram.java +++ b/robots/src/gui/RobotsProgram.java @@ -4,34 +4,27 @@ import config.ConfigWriter; import config.PredeterminedPathConfigReader; import config.PredeterminedPathConfigWriter; -import controllers.TargetPositionController; import controllers.RobotUpdateController; -import gui.serial.MainWindowStateContainer; -import log.LogWindowSource; -import log.Logger; -import log.states.LoggerSourceState; -import models.RobotModel; -import models.TargetModel; -import models.states.RobotState; -import models.states.TargetState; +import gui.serial.InnerWindowStateContainer; +import gui.serial.SerializableFrame; +import serviceLocators.ModelAndControllerLocator; +import windowConstructors.*; import java.awt.*; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import java.io.File; import java.io.IOException; +import java.util.ArrayList; -import javax.swing.SwingUtilities; -import javax.swing.UIManager; +import javax.swing.*; public class RobotsProgram { - private static File m_serialize_path = new File("C:\\Users\\as-pa\\config.conf"); - private static TargetModel m_targetModel; - private static RobotModel m_robotModel; - private static RobotUpdateController m_updater; - private static LogWindowSource m_logs; - private static TargetPositionController m_targetController; - private static MainApplicationFrame m_frame; + private static File m_modelsPath = new File("C:\\Users\\as-pa\\modelsConfig.conf"); + private static File m_windowsPath = new File("C:\\Users\\as-pa\\windowsConfig.conf"); + private static MainApplicationFrame m_frame=new MainApplicationFrame(); + public static ModelAndControllerLocator m_locator; + public static void main(String[] args) { try { @@ -46,88 +39,109 @@ public static void main(String[] args) { SwingUtilities.invokeLater(() -> { - try (PredeterminedPathConfigReader reader = new PredeterminedPathConfigReader(m_serialize_path.getPath())) { - readProgramState(reader); + try(ConfigReader modelsConfig=new PredeterminedPathConfigReader(m_modelsPath.getPath())){ + try(ConfigReader windowsConfig = new PredeterminedPathConfigReader(m_windowsPath.getPath())){ + readProgramState(modelsConfig,windowsConfig); + } catch (IOException | ClassNotFoundException e) { + initProgramState(); - } catch (IOException | ClassNotFoundException e) { + } + } catch (IOException e) { initProgramState(); - } + + + + }); } - private static void initProgramState(){ - m_targetModel = new TargetModel(150, 100); - m_robotModel = new RobotModel(100, 100, 100, m_targetModel); - m_updater = new RobotUpdateController(m_robotModel); - m_logs= Logger.getDefaultLogSource(); - m_targetController = new TargetPositionController(m_targetModel); - m_frame = new MainApplicationFrame(m_robotModel, m_targetController, m_targetModel,m_logs); + + private static void initProgramState() { + System.out.println("Program state initiated"); + m_locator = ModelAndControllerLocator.getDefault(); + InnerWindowStateContainer defaultWindowLayout = new InnerWindowStateContainer(0, 0, 200, 200); + var updater = new RobotUpdateController(m_locator.getRobotModel()); + ArrayList frameConstructors = new ArrayList<>(); + frameConstructors.add(new GameWindowConstructor(defaultWindowLayout)); + frameConstructors.add(new LogWindowConstructor(defaultWindowLayout)); + frameConstructors.add(new PositionShowConstructor(defaultWindowLayout)); + + m_frame = new MainApplicationFrame(); + for (var constructor:frameConstructors) { + m_frame.addWindow(constructor.construct(m_locator)); + } + m_frame.pack(); m_frame.setVisible(true); m_frame.setExtendedState(Frame.MAXIMIZED_BOTH); m_frame.addWindowListener(new WindowAdapter() { @Override public void windowClosing(WindowEvent e) { - synchronized (this){ - try(ConfigWriter writer = new PredeterminedPathConfigWriter(m_serialize_path.getPath())){ - writeProgramState(writer); - + System.out.println("program ended"); + try(ConfigWriter modelsConfig=new PredeterminedPathConfigWriter(m_modelsPath.getPath())){ + try(ConfigWriter windowsConfig = new PredeterminedPathConfigWriter(m_windowsPath.getPath())){ + writeProgramState(modelsConfig,windowsConfig); + System.exit(0); } catch (IOException ex) { - ex.printStackTrace(); + throw new RuntimeException(ex); } - finally { - super.windowClosing(e); - } + } catch (IOException ex) { + throw new RuntimeException(ex); } + } }); } - private static void readProgramState(ConfigReader reader) throws IOException, ClassNotFoundException { - MainWindowStateContainer Windowscontainer=(MainWindowStateContainer)reader.readObject(); - RobotState robotContainer=(RobotState) reader.readObject(); - TargetState targetContainer=(TargetState) reader.readObject(); - LoggerSourceState logs=(LoggerSourceState)reader.readObject(); - m_logs=new LogWindowSource(logs); - m_targetModel=new TargetModel(targetContainer); - m_robotModel=new RobotModel(robotContainer,m_targetModel); - m_targetController=new TargetPositionController(m_targetModel); - m_updater=new RobotUpdateController(m_robotModel); - m_frame=new MainApplicationFrame(m_robotModel,m_targetController,m_targetModel, Windowscontainer,m_logs); + private static void readProgramState(ConfigReader modelsReader, ConfigReader windowReader) throws IOException, ClassNotFoundException { + System.out.println("program state read from disk"); + m_locator=ModelAndControllerLocator.getFromConfig(modelsReader); + m_frame = new MainApplicationFrame(); + var updater = new RobotUpdateController(m_locator.getRobotModel()); + int windowsCount=(Integer)windowReader.readObject(); + for (int i = 0; i < windowsCount; i++) { + m_frame.addWindow(((WindowConstructor)windowReader.readObject()).construct(m_locator)); + } m_frame.pack(); m_frame.setVisible(true); m_frame.setExtendedState(Frame.MAXIMIZED_BOTH); m_frame.addWindowListener(new WindowAdapter() { @Override public void windowClosing(WindowEvent e) { - synchronized (this){ - try(ConfigWriter writer = new PredeterminedPathConfigWriter(m_serialize_path.getPath())){ - writeProgramState(writer); - + System.out.println("program ended"); + try(ConfigWriter modelsConfig=new PredeterminedPathConfigWriter(m_modelsPath.getPath())){ + try(ConfigWriter windowsConfig = new PredeterminedPathConfigWriter(m_windowsPath.getPath())){ + writeProgramState(modelsConfig,windowsConfig); } catch (IOException ex) { - ex.printStackTrace(); + throw new RuntimeException(ex); } - finally { - super.windowClosing(e); - } + } catch (IOException ex) { + throw new RuntimeException(ex); } } }); } - - private static void writeProgramState(ConfigWriter writer) throws IOException{ - MainWindowStateContainer windowContainer=m_frame.getFrameState(); - RobotState robotContainer=m_robotModel.getState(); - TargetState targetContainer=m_targetModel.getState(); - LoggerSourceState logs=m_logs.getState(); - writer.writeObject(windowContainer); - writer.writeObject(robotContainer); - writer.writeObject(targetContainer); - writer.writeObject(logs); + private static void writeProgramState(ConfigWriter modelsWriter,ConfigWriter windowsWriter) throws IOException { + m_locator.writeStateToConfig(modelsWriter); + JInternalFrame[] frames=m_frame.getInternalFrames(); + int frameCount=0; + ArrayList constructors=new ArrayList<>(); + for (JInternalFrame frame:frames) { + if(frame instanceof SerializableFrame){ + frameCount++; + constructors.add(((SerializableFrame)frame).getFrameState()); + } + } + windowsWriter.writeObject(frameCount); + for (var constructor:constructors) { + windowsWriter.writeObject(constructor); + } } + + } diff --git a/robots/src/gui/serial/InnerWindowStateContainer.java b/robots/src/gui/serial/InnerWindowStateContainer.java index cc6c980cd..43f20aeb2 100644 --- a/robots/src/gui/serial/InnerWindowStateContainer.java +++ b/robots/src/gui/serial/InnerWindowStateContainer.java @@ -1,5 +1,6 @@ package gui.serial; +import javax.swing.*; import java.io.Serializable; public class InnerWindowStateContainer implements Serializable { @@ -19,7 +20,10 @@ public InnerWindowStateContainer(int x, int y, int sizeX, int sizeY) { this.sizeY = sizeY; } - + public void applyState(JInternalFrame frame){ + frame.setLocation(x,y); + frame.setSize(sizeX,sizeY); + } diff --git a/robots/src/gui/serial/SerializableFrame.java b/robots/src/gui/serial/SerializableFrame.java index 57b3a60b3..e5802695a 100644 --- a/robots/src/gui/serial/SerializableFrame.java +++ b/robots/src/gui/serial/SerializableFrame.java @@ -1,4 +1,7 @@ package gui.serial; -public interface MySerializable { +import windowConstructors.WindowConstructor; + +public interface SerializableFrame { + WindowConstructor getFrameState(); } diff --git a/robots/src/serviceLocators/ModelAndControllerLocator.java b/robots/src/serviceLocators/ModelAndControllerLocator.java index 33d9eecf8..e6db8961d 100644 --- a/robots/src/serviceLocators/ModelAndControllerLocator.java +++ b/robots/src/serviceLocators/ModelAndControllerLocator.java @@ -1,2 +1,59 @@ -package serviceLocators;public class ModelAndControllerLocator { +package serviceLocators; + +import config.ConfigReader; +import config.ConfigWriter; +import controllers.TargetPositionController; +import log.LogWindowSource; +import log.Logger; +import log.states.LoggerSourceState; +import models.RobotModel; +import models.TargetModel; +import models.states.RobotState; +import models.states.TargetState; + +import java.io.IOException; + +public class ModelAndControllerLocator { + private RobotModel m_robotModel; + private TargetModel m_targetModel; + private TargetPositionController m_targetController; + private LogWindowSource m_logs; + public ModelAndControllerLocator(RobotModel robotModel, TargetModel targetModel, TargetPositionController targetController, LogWindowSource m_logs) { + this.m_robotModel = robotModel; + this.m_targetModel = targetModel; + this.m_targetController = targetController; + this.m_logs = m_logs; + } + public static ModelAndControllerLocator getDefault(){ + var targetModel = new TargetModel(150, 100); + var robotModel = new RobotModel(100, 100, 100, targetModel); + var logs = Logger.getDefaultLogSource(); + var targetController = new TargetPositionController(targetModel); + return new ModelAndControllerLocator(robotModel, targetModel, targetController, logs); + } + public static ModelAndControllerLocator getFromConfig(ConfigReader reader) throws IOException, ClassNotFoundException { + RobotState robotState=(RobotState)reader.readObject(); + TargetState targetState=(TargetState)reader.readObject(); + TargetModel targetModel=new TargetModel(targetState); + RobotModel robotModel=new RobotModel(robotState,targetModel); + + var log=(LoggerSourceState)reader.readObject(); + LogWindowSource logs= Logger.getDefaultLogSource(); + for (var a: log.logs) { + logs.append(a.getLevel(),a.getMessage()); + } + var TargetController=new TargetPositionController(targetModel); +return new ModelAndControllerLocator(robotModel, targetModel, TargetController, logs); + } + public void writeStateToConfig(ConfigWriter writer) throws IOException { + writer.writeObject(m_robotModel.getState()); + writer.writeObject(m_targetModel.getState()); + writer.writeObject(m_logs.getState()); + } + public RobotModel getRobotModel(){return m_robotModel;}; + public TargetModel getTargetModel(){return m_targetModel;} + public TargetPositionController getTargetPositionController(){return m_targetController;} + public LogWindowSource getLogSource(){ + return m_logs; + } } diff --git a/robots/src/windowConstructors/AbstractWindowConstructor.java b/robots/src/windowConstructors/AbstractWindowConstructor.java index 6b06ccc65..de9955301 100644 --- a/robots/src/windowConstructors/AbstractWindowConstructor.java +++ b/robots/src/windowConstructors/AbstractWindowConstructor.java @@ -1,2 +1,25 @@ -package windowConstructors;public class AbstractWindowConstructor { +package windowConstructors; + +import gui.serial.InnerWindowStateContainer; +import serviceLocators.ModelAndControllerLocator; + +import javax.swing.*; +import java.io.Serializable; + + +public abstract class AbstractWindowConstructor implements WindowConstructor, Serializable { + protected InnerWindowStateContainer m_windowState; + + protected AbstractWindowConstructor(InnerWindowStateContainer m_windowState) { + this.m_windowState = m_windowState; + } + public AbstractWindowConstructor(int x, int y,int width,int height){ + m_windowState=new InnerWindowStateContainer(x,y,width,height); + } + protected abstract JInternalFrame windowFabricMethod(ModelAndControllerLocator locator); + public JInternalFrame construct(ModelAndControllerLocator locator){ + var window= windowFabricMethod(locator); + m_windowState.applyState(window); + return window; + } } diff --git a/robots/src/windowConstructors/GameWindowConstructor.java b/robots/src/windowConstructors/GameWindowConstructor.java index 985344b32..edc11b881 100644 --- a/robots/src/windowConstructors/GameWindowConstructor.java +++ b/robots/src/windowConstructors/GameWindowConstructor.java @@ -1,2 +1,21 @@ -package windowConstructors;public class GameWindowConstructor { +package windowConstructors; + +import gui.GameWindow; +import gui.serial.InnerWindowStateContainer; +import serviceLocators.ModelAndControllerLocator; + +import javax.swing.*; + +public class GameWindowConstructor extends AbstractWindowConstructor{ + public GameWindowConstructor(InnerWindowStateContainer m_windowState) { + super(m_windowState); + } + public GameWindowConstructor(int x, int y, int width, int height){ + super(x,y,width,height); + m_windowState=new InnerWindowStateContainer(x,y,width,height); + } + @Override + protected JInternalFrame windowFabricMethod(ModelAndControllerLocator locator) { + return new GameWindow(locator.getRobotModel(),locator.getTargetPositionController(),locator.getTargetModel()); + } } diff --git a/robots/src/windowConstructors/LogWindowConstructor.java b/robots/src/windowConstructors/LogWindowConstructor.java index 0e2a02e11..67094a3cc 100644 --- a/robots/src/windowConstructors/LogWindowConstructor.java +++ b/robots/src/windowConstructors/LogWindowConstructor.java @@ -1,2 +1,21 @@ -package windowConstructors;public class LogWindowConstructor { +package windowConstructors; + +import gui.LogWindow; +import gui.serial.InnerWindowStateContainer; +import serviceLocators.ModelAndControllerLocator; + +import javax.swing.*; + +public class LogWindowConstructor extends AbstractWindowConstructor{ + public LogWindowConstructor(InnerWindowStateContainer m_windowState) { + super(m_windowState); + } + public LogWindowConstructor(int x, int y,int width,int height){ + super(x,y,width,height); + m_windowState=new InnerWindowStateContainer(x,y,width,height); + } + @Override + protected JInternalFrame windowFabricMethod(ModelAndControllerLocator locator) { + return new LogWindow(locator.getLogSource()); + } } diff --git a/robots/src/windowConstructors/PositionShowConstructor.java b/robots/src/windowConstructors/PositionShowConstructor.java index f8fd02d40..f47050c22 100644 --- a/robots/src/windowConstructors/PositionShowConstructor.java +++ b/robots/src/windowConstructors/PositionShowConstructor.java @@ -1,2 +1,21 @@ -package windowConstructors;public class PositionShowConstructor { +package windowConstructors; + +import gui.PositionShowWindow; +import gui.serial.InnerWindowStateContainer; +import serviceLocators.ModelAndControllerLocator; + +import javax.swing.*; + +public class PositionShowConstructor extends AbstractWindowConstructor{ + public PositionShowConstructor(InnerWindowStateContainer m_windowState) { + super(m_windowState); + } + public PositionShowConstructor(int x, int y,int width,int height){ + super(x,y,width,height); + + } + @Override + protected JInternalFrame windowFabricMethod(ModelAndControllerLocator locator) { + return new PositionShowWindow(locator.getRobotModel()); + } } diff --git a/robots/src/windowConstructors/WindowConstructor.java b/robots/src/windowConstructors/WindowConstructor.java index 46a6a0f93..113977129 100644 --- a/robots/src/windowConstructors/WindowConstructor.java +++ b/robots/src/windowConstructors/WindowConstructor.java @@ -1,2 +1,9 @@ -package windowConstructors;public interface WindowConstructor { +package windowConstructors; + +import serviceLocators.ModelAndControllerLocator; + +import javax.swing.*; + +public interface WindowConstructor { + JInternalFrame construct(ModelAndControllerLocator locator); } From 44746e65f9dad20293518653094396b249d124cc Mon Sep 17 00:00:00 2001 From: Andrew Date: Mon, 12 Jun 2023 12:37:49 +0500 Subject: [PATCH 31/34] debug messages removed, unused import removed --- robots/src/gui/GameWindow.java | 1 - robots/src/gui/MainApplicationFrame.java | 1 - .../gui/serial/MainWindowStateContainer.java | 17 ----------------- 3 files changed, 19 deletions(-) delete mode 100644 robots/src/gui/serial/MainWindowStateContainer.java diff --git a/robots/src/gui/GameWindow.java b/robots/src/gui/GameWindow.java index 537f4e8d4..eb77ea017 100644 --- a/robots/src/gui/GameWindow.java +++ b/robots/src/gui/GameWindow.java @@ -1,7 +1,6 @@ package gui; import controllers.TargetPositionController; -import gui.serial.InnerWindowStateContainer; import gui.serial.SerializableFrame; import models.RobotModel; import models.TargetModel; diff --git a/robots/src/gui/MainApplicationFrame.java b/robots/src/gui/MainApplicationFrame.java index 2e565dc3a..3b980a1fe 100644 --- a/robots/src/gui/MainApplicationFrame.java +++ b/robots/src/gui/MainApplicationFrame.java @@ -49,7 +49,6 @@ public MainApplicationFrame(){ addWindowListener(new WindowAdapter() { @Override public void windowClosing(WindowEvent e) { - System.out.println("Window Closed!"); super.windowClosing(e); } }); diff --git a/robots/src/gui/serial/MainWindowStateContainer.java b/robots/src/gui/serial/MainWindowStateContainer.java deleted file mode 100644 index c49316166..000000000 --- a/robots/src/gui/serial/MainWindowStateContainer.java +++ /dev/null @@ -1,17 +0,0 @@ -package gui.serial; - -import java.io.Serializable; - -public class MainWindowStateContainer implements Serializable { - public InnerWindowStateContainer m_gameState; - public InnerWindowStateContainer m_loggerState; - public InnerWindowStateContainer m_positionShowState; - - public MainWindowStateContainer(InnerWindowStateContainer gameState, InnerWindowStateContainer loggerState, InnerWindowStateContainer positionShowState) { - m_gameState = gameState; - m_loggerState = loggerState; - m_positionShowState = positionShowState; - } - - -} From ed6938113d353dc974b21896e4d7ea5b6c3e3466 Mon Sep 17 00:00:00 2001 From: Andrew Date: Mon, 12 Jun 2023 12:38:16 +0500 Subject: [PATCH 32/34] initialization logic refactored --- robots/src/gui/RobotsProgram.java | 72 +++++++++++-------------------- 1 file changed, 26 insertions(+), 46 deletions(-) diff --git a/robots/src/gui/RobotsProgram.java b/robots/src/gui/RobotsProgram.java index cb084de8a..34081694f 100644 --- a/robots/src/gui/RobotsProgram.java +++ b/robots/src/gui/RobotsProgram.java @@ -22,7 +22,7 @@ public class RobotsProgram { private static File m_modelsPath = new File("C:\\Users\\as-pa\\modelsConfig.conf"); private static File m_windowsPath = new File("C:\\Users\\as-pa\\windowsConfig.conf"); - private static MainApplicationFrame m_frame=new MainApplicationFrame(); + private static MainApplicationFrame m_frame; public static ModelAndControllerLocator m_locator; @@ -49,7 +49,16 @@ public static void main(String[] args) { } catch (IOException e) { initProgramState(); } + m_frame.pack(); + m_frame.setVisible(true); + m_frame.setExtendedState(Frame.MAXIMIZED_BOTH); + m_frame.addWindowListener(new WindowAdapter() { + @Override + public void windowClosing(WindowEvent e) { + onExit(); + } + }); @@ -57,7 +66,7 @@ public static void main(String[] args) { } private static void initProgramState() { - System.out.println("Program state initiated"); + m_frame=new MainApplicationFrame(); m_locator = ModelAndControllerLocator.getDefault(); InnerWindowStateContainer defaultWindowLayout = new InnerWindowStateContainer(0, 0, 200, 200); var updater = new RobotUpdateController(m_locator.getRobotModel()); @@ -71,60 +80,17 @@ private static void initProgramState() { m_frame.addWindow(constructor.construct(m_locator)); } - m_frame.pack(); - m_frame.setVisible(true); - m_frame.setExtendedState(Frame.MAXIMIZED_BOTH); - m_frame.addWindowListener(new WindowAdapter() { - @Override - public void windowClosing(WindowEvent e) { - System.out.println("program ended"); - try(ConfigWriter modelsConfig=new PredeterminedPathConfigWriter(m_modelsPath.getPath())){ - try(ConfigWriter windowsConfig = new PredeterminedPathConfigWriter(m_windowsPath.getPath())){ - writeProgramState(modelsConfig,windowsConfig); - System.exit(0); - } catch (IOException ex) { - throw new RuntimeException(ex); - - } - } catch (IOException ex) { - throw new RuntimeException(ex); - } - - - } - }); } private static void readProgramState(ConfigReader modelsReader, ConfigReader windowReader) throws IOException, ClassNotFoundException { - System.out.println("program state read from disk"); + m_frame=new MainApplicationFrame(); m_locator=ModelAndControllerLocator.getFromConfig(modelsReader); - m_frame = new MainApplicationFrame(); var updater = new RobotUpdateController(m_locator.getRobotModel()); int windowsCount=(Integer)windowReader.readObject(); for (int i = 0; i < windowsCount; i++) { m_frame.addWindow(((WindowConstructor)windowReader.readObject()).construct(m_locator)); } - m_frame.pack(); - m_frame.setVisible(true); - m_frame.setExtendedState(Frame.MAXIMIZED_BOTH); - m_frame.addWindowListener(new WindowAdapter() { - @Override - public void windowClosing(WindowEvent e) { - System.out.println("program ended"); - try(ConfigWriter modelsConfig=new PredeterminedPathConfigWriter(m_modelsPath.getPath())){ - try(ConfigWriter windowsConfig = new PredeterminedPathConfigWriter(m_windowsPath.getPath())){ - writeProgramState(modelsConfig,windowsConfig); - } catch (IOException ex) { - throw new RuntimeException(ex); - - } - } catch (IOException ex) { - throw new RuntimeException(ex); - } - - } - }); } private static void writeProgramState(ConfigWriter modelsWriter,ConfigWriter windowsWriter) throws IOException { m_locator.writeStateToConfig(modelsWriter); @@ -142,6 +108,20 @@ private static void writeProgramState(ConfigWriter modelsWriter,ConfigWriter win windowsWriter.writeObject(constructor); } } + private static void onExit(){ + + try(ConfigWriter modelsConfig=new PredeterminedPathConfigWriter(m_modelsPath.getPath())){ + try(ConfigWriter windowsConfig = new PredeterminedPathConfigWriter(m_windowsPath.getPath())){ + writeProgramState(modelsConfig,windowsConfig); + System.exit(0); + } catch (IOException ex) { + throw new RuntimeException(ex); + + } + } catch (IOException ex) { + throw new RuntimeException(ex); + } + } } From 49e45d1cedc99078816993ae74514d15c92e0285 Mon Sep 17 00:00:00 2001 From: Andrew Date: Mon, 12 Jun 2023 13:44:28 +0500 Subject: [PATCH 33/34] config writer and reader replaced with general objectFileStream logic --- robots/src/config/ConfigException.java | 6 -- robots/src/config/ConfigReader.java | 9 --- robots/src/config/ConfigWriter.java | 9 --- robots/src/config/FileSupplier.java | 7 +++ .../config/PredeterminedPathConfigReader.java | 37 ------------ .../config/PredeterminedPathConfigWriter.java | 41 ------------- .../config/PredeterminedPathFileSupplier.java | 16 +++++ robots/src/gui/RobotsProgram.java | 58 ++++++++++--------- .../ModelAndControllerLocator.java | 8 +-- 9 files changed, 57 insertions(+), 134 deletions(-) delete mode 100644 robots/src/config/ConfigException.java delete mode 100644 robots/src/config/ConfigReader.java delete mode 100644 robots/src/config/ConfigWriter.java create mode 100644 robots/src/config/FileSupplier.java delete mode 100644 robots/src/config/PredeterminedPathConfigReader.java delete mode 100644 robots/src/config/PredeterminedPathConfigWriter.java create mode 100644 robots/src/config/PredeterminedPathFileSupplier.java diff --git a/robots/src/config/ConfigException.java b/robots/src/config/ConfigException.java deleted file mode 100644 index beb4e0311..000000000 --- a/robots/src/config/ConfigException.java +++ /dev/null @@ -1,6 +0,0 @@ -package config; - -import java.io.IOException; - -public class ConfigException extends IOException { -} diff --git a/robots/src/config/ConfigReader.java b/robots/src/config/ConfigReader.java deleted file mode 100644 index 396713487..000000000 --- a/robots/src/config/ConfigReader.java +++ /dev/null @@ -1,9 +0,0 @@ -package config; - -import java.io.Closeable; -import java.io.IOException; -import java.io.ObjectInputStream; - -public interface ConfigReader extends Closeable { - Object readObject() throws ConfigException, IOException, ClassNotFoundException; -} diff --git a/robots/src/config/ConfigWriter.java b/robots/src/config/ConfigWriter.java deleted file mode 100644 index 4e3ede747..000000000 --- a/robots/src/config/ConfigWriter.java +++ /dev/null @@ -1,9 +0,0 @@ -package config; - -import java.io.Closeable; -import java.io.IOException; - -public interface ConfigWriter extends Closeable { - void writeObject(Object data) throws IOException; - -} diff --git a/robots/src/config/FileSupplier.java b/robots/src/config/FileSupplier.java new file mode 100644 index 000000000..ee90729cc --- /dev/null +++ b/robots/src/config/FileSupplier.java @@ -0,0 +1,7 @@ +package config; + +import java.io.File; + +public interface FileSupplier { + File getFile(); +} diff --git a/robots/src/config/PredeterminedPathConfigReader.java b/robots/src/config/PredeterminedPathConfigReader.java deleted file mode 100644 index a6eac2c6a..000000000 --- a/robots/src/config/PredeterminedPathConfigReader.java +++ /dev/null @@ -1,37 +0,0 @@ -package config; - -import java.io.*; - -public class PredeterminedPathConfigReader implements ConfigReader{ - - private File m_path; - private ObjectInputStream m_data; - - public PredeterminedPathConfigReader(String path){ - m_path=new File(path); - try{ - m_data=new ObjectInputStream( new BufferedInputStream(new FileInputStream(m_path))); - } - catch (IOException e){ - m_data=null; - } - } - - - - @Override - public void close() throws IOException { - if(m_data==null){ - return; - } - m_data.close(); - } - - @Override - public Object readObject() throws ConfigException, IOException, ClassNotFoundException { - if(m_data==null){ - throw new ConfigException(); - } - return m_data.readObject(); - } -} diff --git a/robots/src/config/PredeterminedPathConfigWriter.java b/robots/src/config/PredeterminedPathConfigWriter.java deleted file mode 100644 index 3c99842bf..000000000 --- a/robots/src/config/PredeterminedPathConfigWriter.java +++ /dev/null @@ -1,41 +0,0 @@ -package config; - -import java.io.*; -import java.nio.file.Paths; - -public class PredeterminedPathConfigWriter implements ConfigWriter { - - File m_path; - ObjectOutputStream m_stream; - - public PredeterminedPathConfigWriter(String path) { - m_path = new File(path); - try{ - m_path.createNewFile(); - m_stream=new ObjectOutputStream(new FileOutputStream(m_path)); - - - } catch (IOException e) { - m_stream=null; - } - } - - @Override - public void writeObject(Object data) throws IOException { - if (m_stream == null) { - throw new ConfigException(); - } - - m_stream.writeObject(data); - } - - @Override - public void close() throws IOException { - if (m_stream == null) { - return; - } - m_stream.close(); - } - - -} diff --git a/robots/src/config/PredeterminedPathFileSupplier.java b/robots/src/config/PredeterminedPathFileSupplier.java new file mode 100644 index 000000000..320a5e33c --- /dev/null +++ b/robots/src/config/PredeterminedPathFileSupplier.java @@ -0,0 +1,16 @@ +package config; + +import java.io.File; + +public class PredeterminedPathFileSupplier implements FileSupplier{ + private File path; + + public PredeterminedPathFileSupplier(String path) { + this.path = new File(path); + } + + @Override + public File getFile() { + return path; + } +} diff --git a/robots/src/gui/RobotsProgram.java b/robots/src/gui/RobotsProgram.java index 34081694f..072cc6ae4 100644 --- a/robots/src/gui/RobotsProgram.java +++ b/robots/src/gui/RobotsProgram.java @@ -1,9 +1,7 @@ package gui; -import config.ConfigReader; -import config.ConfigWriter; -import config.PredeterminedPathConfigReader; -import config.PredeterminedPathConfigWriter; +import config.FileSupplier; +import config.PredeterminedPathFileSupplier; import controllers.RobotUpdateController; import gui.serial.InnerWindowStateContainer; import gui.serial.SerializableFrame; @@ -13,15 +11,14 @@ import java.awt.*; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; -import java.io.File; -import java.io.IOException; +import java.io.*; import java.util.ArrayList; import javax.swing.*; public class RobotsProgram { - private static File m_modelsPath = new File("C:\\Users\\as-pa\\modelsConfig.conf"); - private static File m_windowsPath = new File("C:\\Users\\as-pa\\windowsConfig.conf"); + private static FileSupplier m_modelsPath = new PredeterminedPathFileSupplier("C:\\Users\\as-pa\\modelsConfig.conf"); + private static FileSupplier m_windowsPath = new PredeterminedPathFileSupplier("C:\\Users\\as-pa\\windowsConfig.conf"); private static MainApplicationFrame m_frame; public static ModelAndControllerLocator m_locator; @@ -37,25 +34,29 @@ public static void main(String[] args) { } SwingUtilities.invokeLater(() -> { - - - try(ConfigReader modelsConfig=new PredeterminedPathConfigReader(m_modelsPath.getPath())){ - try(ConfigReader windowsConfig = new PredeterminedPathConfigReader(m_windowsPath.getPath())){ - readProgramState(modelsConfig,windowsConfig); + try(var modelsFileStream=new FileInputStream(m_modelsPath.getFile().getPath())){ + try(var windowsFileStream=new FileInputStream(m_windowsPath.getFile().getPath())){ + var modelsInputStream=new ObjectInputStream(new BufferedInputStream(modelsFileStream)); + var windowsInputStream=new ObjectInputStream(new BufferedInputStream(windowsFileStream)); + readProgramState(modelsInputStream,windowsInputStream); } catch (IOException | ClassNotFoundException e) { initProgramState(); - } } catch (IOException e) { initProgramState(); } + m_frame.pack(); m_frame.setVisible(true); m_frame.setExtendedState(Frame.MAXIMIZED_BOTH); m_frame.addWindowListener(new WindowAdapter() { @Override public void windowClosing(WindowEvent e) { - onExit(); + try { + onExit(); + } catch (FileNotFoundException ex) { + throw new RuntimeException(ex); + } } }); @@ -82,7 +83,7 @@ private static void initProgramState() { } - private static void readProgramState(ConfigReader modelsReader, ConfigReader windowReader) throws IOException, ClassNotFoundException { + private static void readProgramState(ObjectInputStream modelsReader, ObjectInputStream windowReader) throws IOException, ClassNotFoundException { m_frame=new MainApplicationFrame(); m_locator=ModelAndControllerLocator.getFromConfig(modelsReader); var updater = new RobotUpdateController(m_locator.getRobotModel()); @@ -92,7 +93,7 @@ private static void readProgramState(ConfigReader modelsReader, ConfigReader win } } - private static void writeProgramState(ConfigWriter modelsWriter,ConfigWriter windowsWriter) throws IOException { + private static void writeProgramState(ObjectOutputStream modelsWriter,ObjectOutputStream windowsWriter) throws IOException { m_locator.writeStateToConfig(modelsWriter); JInternalFrame[] frames=m_frame.getInternalFrames(); int frameCount=0; @@ -108,20 +109,21 @@ private static void writeProgramState(ConfigWriter modelsWriter,ConfigWriter win windowsWriter.writeObject(constructor); } } - private static void onExit(){ + private static void onExit() throws FileNotFoundException { - try(ConfigWriter modelsConfig=new PredeterminedPathConfigWriter(m_modelsPath.getPath())){ - try(ConfigWriter windowsConfig = new PredeterminedPathConfigWriter(m_windowsPath.getPath())){ - writeProgramState(modelsConfig,windowsConfig); - System.exit(0); - } catch (IOException ex) { - throw new RuntimeException(ex); + try (var modelsInputStream = new ObjectOutputStream(new BufferedOutputStream(new FileOutputStream(m_modelsPath.getFile().getPath()))); + var windowsInputStream = new ObjectOutputStream(new BufferedOutputStream(new FileOutputStream(m_windowsPath.getFile().getPath()))) + ) { + + writeProgramState(modelsInputStream, windowsInputStream); + + } catch (IOException e) { + throw new RuntimeException(e); - } - } catch (IOException ex) { - throw new RuntimeException(ex); } - } + + + } } diff --git a/robots/src/serviceLocators/ModelAndControllerLocator.java b/robots/src/serviceLocators/ModelAndControllerLocator.java index e6db8961d..e71455363 100644 --- a/robots/src/serviceLocators/ModelAndControllerLocator.java +++ b/robots/src/serviceLocators/ModelAndControllerLocator.java @@ -1,7 +1,5 @@ package serviceLocators; -import config.ConfigReader; -import config.ConfigWriter; import controllers.TargetPositionController; import log.LogWindowSource; import log.Logger; @@ -12,6 +10,8 @@ import models.states.TargetState; import java.io.IOException; +import java.io.ObjectInputStream; +import java.io.ObjectOutputStream; public class ModelAndControllerLocator { private RobotModel m_robotModel; @@ -31,7 +31,7 @@ public static ModelAndControllerLocator getDefault(){ var targetController = new TargetPositionController(targetModel); return new ModelAndControllerLocator(robotModel, targetModel, targetController, logs); } - public static ModelAndControllerLocator getFromConfig(ConfigReader reader) throws IOException, ClassNotFoundException { + public static ModelAndControllerLocator getFromConfig(ObjectInputStream reader) throws IOException, ClassNotFoundException { RobotState robotState=(RobotState)reader.readObject(); TargetState targetState=(TargetState)reader.readObject(); TargetModel targetModel=new TargetModel(targetState); @@ -45,7 +45,7 @@ public static ModelAndControllerLocator getFromConfig(ConfigReader reader) throw var TargetController=new TargetPositionController(targetModel); return new ModelAndControllerLocator(robotModel, targetModel, TargetController, logs); } - public void writeStateToConfig(ConfigWriter writer) throws IOException { + public void writeStateToConfig(ObjectOutputStream writer) throws IOException { writer.writeObject(m_robotModel.getState()); writer.writeObject(m_targetModel.getState()); writer.writeObject(m_logs.getState()); From 77b9dc58e0ec5724c63bd5bff03895bc1428aa66 Mon Sep 17 00:00:00 2001 From: Andrew Date: Mon, 12 Jun 2023 13:54:58 +0500 Subject: [PATCH 34/34] fixed bug with empty files, removved hard-coded file names --- robots/src/gui/RobotsProgram.java | 51 ++++++++++++++----------------- 1 file changed, 23 insertions(+), 28 deletions(-) diff --git a/robots/src/gui/RobotsProgram.java b/robots/src/gui/RobotsProgram.java index 072cc6ae4..856dab6c9 100644 --- a/robots/src/gui/RobotsProgram.java +++ b/robots/src/gui/RobotsProgram.java @@ -17,8 +17,8 @@ import javax.swing.*; public class RobotsProgram { - private static FileSupplier m_modelsPath = new PredeterminedPathFileSupplier("C:\\Users\\as-pa\\modelsConfig.conf"); - private static FileSupplier m_windowsPath = new PredeterminedPathFileSupplier("C:\\Users\\as-pa\\windowsConfig.conf"); + private static FileSupplier m_modelsPath = new PredeterminedPathFileSupplier(System.getProperty("user.home").concat("\\modelsConfig.conf")); + private static FileSupplier m_windowsPath = new PredeterminedPathFileSupplier(System.getProperty("user.home").concat("\\windowsConfig.conf")); private static MainApplicationFrame m_frame; public static ModelAndControllerLocator m_locator; @@ -34,15 +34,10 @@ public static void main(String[] args) { } SwingUtilities.invokeLater(() -> { - try(var modelsFileStream=new FileInputStream(m_modelsPath.getFile().getPath())){ - try(var windowsFileStream=new FileInputStream(m_windowsPath.getFile().getPath())){ - var modelsInputStream=new ObjectInputStream(new BufferedInputStream(modelsFileStream)); - var windowsInputStream=new ObjectInputStream(new BufferedInputStream(windowsFileStream)); - readProgramState(modelsInputStream,windowsInputStream); - } catch (IOException | ClassNotFoundException e) { - initProgramState(); - } - } catch (IOException e) { + try (var modelsInputStream = new ObjectInputStream(new BufferedInputStream(new FileInputStream(m_modelsPath.getFile().getPath()))); + var windowsInputStream = new ObjectInputStream(new BufferedInputStream(new FileInputStream(m_windowsPath.getFile().getPath())))) { + readProgramState(modelsInputStream, windowsInputStream); + } catch (IOException | ClassNotFoundException e) { initProgramState(); } @@ -62,12 +57,11 @@ public void windowClosing(WindowEvent e) { }); - }); } private static void initProgramState() { - m_frame=new MainApplicationFrame(); + m_frame = new MainApplicationFrame(); m_locator = ModelAndControllerLocator.getDefault(); InnerWindowStateContainer defaultWindowLayout = new InnerWindowStateContainer(0, 0, 200, 200); var updater = new RobotUpdateController(m_locator.getRobotModel()); @@ -77,38 +71,41 @@ private static void initProgramState() { frameConstructors.add(new PositionShowConstructor(defaultWindowLayout)); m_frame = new MainApplicationFrame(); - for (var constructor:frameConstructors) { + for (var constructor : frameConstructors) { m_frame.addWindow(constructor.construct(m_locator)); } } + private static void readProgramState(ObjectInputStream modelsReader, ObjectInputStream windowReader) throws IOException, ClassNotFoundException { - m_frame=new MainApplicationFrame(); - m_locator=ModelAndControllerLocator.getFromConfig(modelsReader); + m_frame = new MainApplicationFrame(); + m_locator = ModelAndControllerLocator.getFromConfig(modelsReader); var updater = new RobotUpdateController(m_locator.getRobotModel()); - int windowsCount=(Integer)windowReader.readObject(); + int windowsCount = (Integer) windowReader.readObject(); for (int i = 0; i < windowsCount; i++) { - m_frame.addWindow(((WindowConstructor)windowReader.readObject()).construct(m_locator)); + m_frame.addWindow(((WindowConstructor) windowReader.readObject()).construct(m_locator)); } } - private static void writeProgramState(ObjectOutputStream modelsWriter,ObjectOutputStream windowsWriter) throws IOException { + + private static void writeProgramState(ObjectOutputStream modelsWriter, ObjectOutputStream windowsWriter) throws IOException { m_locator.writeStateToConfig(modelsWriter); - JInternalFrame[] frames=m_frame.getInternalFrames(); - int frameCount=0; - ArrayList constructors=new ArrayList<>(); - for (JInternalFrame frame:frames) { - if(frame instanceof SerializableFrame){ + JInternalFrame[] frames = m_frame.getInternalFrames(); + int frameCount = 0; + ArrayList constructors = new ArrayList<>(); + for (JInternalFrame frame : frames) { + if (frame instanceof SerializableFrame) { frameCount++; - constructors.add(((SerializableFrame)frame).getFrameState()); + constructors.add(((SerializableFrame) frame).getFrameState()); } } windowsWriter.writeObject(frameCount); - for (var constructor:constructors) { + for (var constructor : constructors) { windowsWriter.writeObject(constructor); } } + private static void onExit() throws FileNotFoundException { try (var modelsInputStream = new ObjectOutputStream(new BufferedOutputStream(new FileOutputStream(m_modelsPath.getFile().getPath()))); @@ -123,7 +120,5 @@ private static void onExit() throws FileNotFoundException { } - - } }