diff --git a/mock/src/main/java/seng302/Model/Race.java b/mock/src/main/java/seng302/Model/Race.java index 64e97f74..96473d2f 100644 --- a/mock/src/main/java/seng302/Model/Race.java +++ b/mock/src/main/java/seng302/Model/Race.java @@ -12,6 +12,7 @@ import seng302.Networking.Messages.Enums.BoatStatusEnum; import seng302.Networking.Messages.Enums.RaceStatusEnum; import seng302.Networking.Messages.Enums.RaceTypeEnum; import seng302.Networking.Messages.RaceStatus; +import seng302.Networking.Utils.AC35UnitConverter; import java.util.ArrayList; import java.util.Iterator; @@ -102,8 +103,11 @@ public class Race implements Runnable { */ private double windSpeed; - private int windDir; + private double windDirDegrees; + private double windDir; private int changeWind = 4; + private static final int windUpperBound = 235; + private static final int windLowerBound = 215; @@ -261,7 +265,7 @@ public class Race implements Runnable { //TODO REFACTOR for consistency, could send parameters to mockOutput instead of the whole racestatus. This will also fix the sequence number issue. //Convert wind direction and speed to ints. //TODO this conversion should be done inside the racestatus class. - int windDirectionInt = BoatLocation.convertHeadingDoubleToInt(this.windDirection.degrees()); + int windDirectionInt = AC35UnitConverter.encodeHeading(this.windDirection.degrees()); int windSpeedInt = (int) (windSpeed * Constants.KnotsToMMPerSecond); //Create race status object, and send it. @@ -863,31 +867,31 @@ public class Race implements Runnable { } protected void initialiseWindDir(){ - windDir = new Random().nextInt(65535+1); - this.windDirection = new Bearing(BoatLocation.convertHeadingIntToDouble(windDir)); + windDirDegrees = 225; + windDir = AC35UnitConverter.convertHeading(windDirDegrees); + /*windDir = new Random().nextInt(65535+1); + windDir = BoatLocation.convertHeadingIntToDouble(255);*/ + this.windDirection = new Bearing((int)windDir); } protected void changeWindDir(){ int r = new Random().nextInt(changeWind)+1; if(r==1){ - windDir+=100; + windDirDegrees = (0.5 + windDirDegrees) % 360; } else if (r==2){ - windDir-=100; + windDirDegrees = ((windDirDegrees - 0.5) + 360) % 360;///keep the degrees positive when below 0 } - if (windDir > 65535){ - windDir -= 65535; + if (windDirDegrees > windUpperBound){ + windDirDegrees = windUpperBound; } - if (windDir < 0){ - windDir += 65535; + if (windDirDegrees < windLowerBound){ + windDirDegrees = windLowerBound; } - this.windDirection = new Bearing(BoatLocation.convertHeadingIntToDouble(windDir)); - } - protected void setWindDir(int wind){ - if (wind>=0 && wind<=65535){ - windDir = wind; - this.windDirection = new Bearing(BoatLocation.convertHeadingIntToDouble(windDir)); - } + windDir = AC35UnitConverter.convertHeading(windDirDegrees); + + System.out.println(windDirDegrees + " + " + windDir); + this.windDirection = new Bearing(windDirDegrees); } protected void setChangeWind(int changeVal){ @@ -897,6 +901,6 @@ public class Race implements Runnable { } protected int getWind(){ - return windDir; + return (int)windDir; } } \ No newline at end of file diff --git a/network/src/main/java/seng302/Networking/Messages/RaceStatus.java b/network/src/main/java/seng302/Networking/Messages/RaceStatus.java index 89c7b90c..55ec10ce 100644 --- a/network/src/main/java/seng302/Networking/Messages/RaceStatus.java +++ b/network/src/main/java/seng302/Networking/Messages/RaceStatus.java @@ -1,6 +1,7 @@ package seng302.Networking.Messages; import seng302.Networking.Messages.Enums.MessageType; +import seng302.Networking.Utils.AC35UnitConverter; import java.util.ArrayList; import java.util.List; @@ -18,7 +19,6 @@ public class RaceStatus extends AC35Data { private int windSpeed; private int raceType; private List boatStatuses; - private static final double windDirectionScalar = 360.0 / 32768.0; // 0x8000 / 360 public RaceStatus(long currentTime, int raceID, int raceStatus, long expectedStartTime, int windDirection, int windSpeed, int raceType, List boatStatuses){ super(MessageType.RACESTATUS); @@ -29,7 +29,7 @@ public class RaceStatus extends AC35Data { this.windDirection = windDirection; this.windSpeed = windSpeed; this.raceType = raceType; - this.boatStatuses = boatStatuses;//note this is a copy so any alterations to the parent will affect this. + this.boatStatuses = boatStatuses;//note this is not a copy so any alterations to the parent will affect this. } @@ -125,6 +125,6 @@ public class RaceStatus extends AC35Data { } public double getScaledWindDirection() { - return (double) windDirection * windDirectionScalar; + return (double) AC35UnitConverter.convertHeading(windDirection); } } diff --git a/network/src/main/java/seng302/Networking/Utils/AC35UnitConverter.java b/network/src/main/java/seng302/Networking/Utils/AC35UnitConverter.java index 6e5b85a2..6aaba4c6 100644 --- a/network/src/main/java/seng302/Networking/Utils/AC35UnitConverter.java +++ b/network/src/main/java/seng302/Networking/Utils/AC35UnitConverter.java @@ -19,6 +19,23 @@ public class AC35UnitConverter { return (double) value * 360.0/65536.0;//2^15 } + public static double convertHeading(int value){ + return (double) value * 360.0/65536.0;//2^15 + } + + + public static double convertHeading(double value){ + return value * 360.0/65536.0;//2^15 + } + + public static int encodeHeading(int value){ + return (int) (value / 360.0 * 65536.0);//2^15 + } + + public static int encodeHeading(double value){ + return (int) (value / 360.0 * 65536.0);//2^15 + } + public static double convertTrueWindAngle(long value){ return (double) value * 180.0/32768.0;//-2^15 to 2^15 } diff --git a/visualiser/src/main/java/seng302/Controllers/RaceController.java b/visualiser/src/main/java/seng302/Controllers/RaceController.java index 3082b325..0c126146 100644 --- a/visualiser/src/main/java/seng302/Controllers/RaceController.java +++ b/visualiser/src/main/java/seng302/Controllers/RaceController.java @@ -31,6 +31,8 @@ public class RaceController extends Controller { private Map annoShownBeforeHide; private int buttonChecked;//button currently checked allows the checkboxes to know whether or not to put it's state in history (if not hidden then store) private int prevBtnChecked;//button to keep track of previous pressed button incase we want to check a checkbox straight from hidden we do not wish for all previous to come on. + private boolean radioBtnChecked; + private boolean selectShow = false; //button to make it so that show doesn't run the listener private static String nameCheckAnno = "name"; private static String abbrevCheckAnno = "abbrev"; @@ -350,7 +352,22 @@ public class RaceController extends Controller { } - private void storeCurrentAnnotationState(){ + private void storeCurrentAnnotationState(String dictionaryAnnotationKey, boolean selected){ + if (buttonChecked != hideBtn) { + //if we are checking the box straight out of hide instead of using the radio buttons + annoShownBeforeHide.put(dictionaryAnnotationKey, selected); + System.out.println(); + if (prevBtnChecked == hideBtn && buttonChecked == noBtn){ + storeCurrentAnnotationDictionary(); + } + if (buttonChecked == noBtn) { + selectShow = false; + annotationGroup.selectToggle(showAnnoRBTN); + } + } + } + + private void storeCurrentAnnotationDictionary(){ annoShownBeforeHide.put(nameCheckAnno, showName.isSelected()); annoShownBeforeHide.put(abbrevCheckAnno, showAbbrev.isSelected()); annoShownBeforeHide.put(pathCheckAnno, showBoatPath.isSelected()); @@ -381,92 +398,46 @@ public class RaceController extends Controller { showName.selectedProperty().addListener((ov, old_val, new_val) -> { if (old_val != new_val) { raceMap.toggleAnnoName(); + radioBtnChecked = false; + storeCurrentAnnotationState(nameCheckAnno, new_val); + raceMap.update(); } - if (buttonChecked != hideBtn) { - //if we are checking the box straight out of hide instead of using the radio buttons - if (prevBtnChecked == hideBtn && buttonChecked != showBtn){ - storeCurrentAnnotationState(); - } else { - annoShownBeforeHide.put(nameCheckAnno, showName.isSelected()); - } - if (buttonChecked == noBtn) { - annotationGroup.selectToggle(showAnnoRBTN); - } - } - raceMap.update(); - prevBtnChecked = noBtn; }); //listener for show abbreviation for annotation showAbbrev.selectedProperty().addListener((ov, old_val, new_val) -> { if (old_val != new_val) { raceMap.toggleAnnoAbbrev(); + radioBtnChecked = false; + storeCurrentAnnotationState(abbrevCheckAnno, new_val); + raceMap.update(); } - if (buttonChecked != hideBtn) { - if (prevBtnChecked == hideBtn && buttonChecked != showBtn){ - storeCurrentAnnotationState(); - } else { - annoShownBeforeHide.put(abbrevCheckAnno, showAbbrev.isSelected()); - } - if (buttonChecked == noBtn) { - annotationGroup.selectToggle(showAnnoRBTN); - } - } - raceMap.update(); - prevBtnChecked = noBtn; }); //listener for show boat path for annotation showBoatPath.selectedProperty().addListener((ov, old_val, new_val) -> { if (old_val != new_val) { raceMap.toggleBoatPath(); + radioBtnChecked = false; + storeCurrentAnnotationState(pathCheckAnno, new_val); + raceMap.update(); } - if (buttonChecked != hideBtn) { - if (prevBtnChecked == hideBtn && buttonChecked != showBtn){ - storeCurrentAnnotationState(); - } else { - annoShownBeforeHide.put(pathCheckAnno, showBoatPath.isSelected()); - } - if (buttonChecked == noBtn) { - annotationGroup.selectToggle(showAnnoRBTN); - } - } - raceMap.update(); - prevBtnChecked = noBtn; }); //listener to show speed for annotation showSpeed.selectedProperty().addListener((ov, old_val, new_val) -> { if (old_val != new_val) { raceMap.toggleAnnoSpeed(); + radioBtnChecked = false; + storeCurrentAnnotationState(speedCheckAnno, new_val); + raceMap.update(); } - if (buttonChecked != hideBtn) { - if (prevBtnChecked == hideBtn && buttonChecked != showBtn){ - storeCurrentAnnotationState(); - } else { - annoShownBeforeHide.put(speedCheckAnno, showSpeed.isSelected()); - } - if (buttonChecked == noBtn) { - annotationGroup.selectToggle(showAnnoRBTN); - } - } - raceMap.update(); - prevBtnChecked = noBtn; }); showTime.selectedProperty().addListener((ov, old_val, new_val) -> { if (old_val != new_val) { raceMap.toggleAnnoTime(); + radioBtnChecked = false; + storeCurrentAnnotationState(timeCheckAnno, new_val); + raceMap.update(); } - if (buttonChecked != hideBtn) { - if (prevBtnChecked == hideBtn && buttonChecked != showBtn){ - storeCurrentAnnotationState(); - } else { - annoShownBeforeHide.put(timeCheckAnno, showTime.isSelected()); - } - if (buttonChecked == noBtn) { - annotationGroup.selectToggle(showAnnoRBTN); - } - } - prevBtnChecked = noBtn; - raceMap.update(); }); //listener to save currently selected annotation saveAnno.setOnAction(event -> { @@ -477,47 +448,81 @@ public class RaceController extends Controller { presetAnno.add(showBoatPath.isSelected()); presetAnno.add(showTime.isSelected()); }); - //listener for hiding - hideAnnoRBTN.selectedProperty().addListener((ov, old_val, new_val) ->{ + hideAnnoRBTN.setOnAction((e)->{ + System.out.println("called hide"); buttonChecked = hideBtn; - //raceMap.hideAnnotations(); + selectShow = false; showName.setSelected(false); showAbbrev.setSelected(false); showBoatPath.setSelected(false); showSpeed.setSelected(false); showTime.setSelected(false); - annotationGroup.selectToggle(hideAnnoRBTN); raceMap.update(); buttonChecked = noBtn; prevBtnChecked = hideBtn; + selectShow = true; }); - //listener for showing all annotations - showAnnoRBTN.selectedProperty().addListener((ov, old_val, new_val) ->{ - buttonChecked = showBtn; - showName.setSelected(annoShownBeforeHide.get(nameCheckAnno)); - showAbbrev.setSelected(annoShownBeforeHide.get(abbrevCheckAnno)); - showBoatPath.setSelected(annoShownBeforeHide.get(pathCheckAnno)); - showSpeed.setSelected(annoShownBeforeHide.get(speedCheckAnno)); - showTime.setSelected(annoShownBeforeHide.get(timeCheckAnno)); + //listener for hiding + /*hideAnnoRBTN.selectedProperty().addListener((ov, old_val, new_val) ->{ + buttonChecked = hideBtn; + showName.setSelected(false); + showAbbrev.setSelected(false); + showBoatPath.setSelected(false); + showSpeed.setSelected(false); + showTime.setSelected(false); raceMap.update(); buttonChecked = noBtn; - prevBtnChecked = showBtn; - }); + prevBtnChecked = hideBtn; + });*/ + //listener for showing all annotations + showAnnoRBTN.setOnAction((e)->{ + if (selectShow) { + System.out.println("called show"); + buttonChecked = showBtn; + showName.setSelected(annoShownBeforeHide.get(nameCheckAnno)); + showAbbrev.setSelected(annoShownBeforeHide.get(abbrevCheckAnno)); + showBoatPath.setSelected(annoShownBeforeHide.get(pathCheckAnno)); + showSpeed.setSelected(annoShownBeforeHide.get(speedCheckAnno)); + showTime.setSelected(annoShownBeforeHide.get(timeCheckAnno)); + raceMap.update(); + buttonChecked = noBtn; + prevBtnChecked = showBtn; + } + selectShow = true; + });/*.addListener((ov, old_val, new_val) ->{ + if (selectShow) { + buttonChecked = showBtn; + showName.setSelected(annoShownBeforeHide.get(nameCheckAnno)); + showAbbrev.setSelected(annoShownBeforeHide.get(abbrevCheckAnno)); + showBoatPath.setSelected(annoShownBeforeHide.get(pathCheckAnno)); + showSpeed.setSelected(annoShownBeforeHide.get(speedCheckAnno)); + showTime.setSelected(annoShownBeforeHide.get(timeCheckAnno)); + raceMap.update(); + buttonChecked = noBtn; + prevBtnChecked = showBtn; + } + selectShow = true; + });*/ //listener for showing all important - partialAnnoRBTN.selectedProperty().addListener((ov, old_val, new_val) ->{ + partialAnnoRBTN.setOnAction((e)->{ + System.out.println("called Partial"); + selectShow = false; buttonChecked = partialBtn; showName.setSelected(false); showAbbrev.setSelected(true); showSpeed.setSelected(true); showBoatPath.setSelected(false); showTime.setSelected(false); - annotationGroup.selectToggle(partialAnnoRBTN); + raceMap.update(); buttonChecked = noBtn; prevBtnChecked = partialBtn; + selectShow = true; }); //listener for showing all important - importantAnnoRBTN.selectedProperty().addListener((ov, old_val, new_val) ->{ + importantAnnoRBTN.setOnAction((e) ->{ + System.out.println("called Important"); + selectShow = false; buttonChecked = importantBtn; if (presetAnno.size() > 0) { showName.setSelected(presetAnno.get(0)); @@ -525,11 +530,12 @@ public class RaceController extends Controller { showSpeed.setSelected(presetAnno.get(2)); showBoatPath.setSelected(presetAnno.get(3)); showTime.setSelected(presetAnno.get(4)); - annotationGroup.selectToggle(importantAnnoRBTN); + storeCurrentAnnotationDictionary(); raceMap.update(); } buttonChecked = noBtn; prevBtnChecked = importantBtn; + selectShow = true; }); annotationGroup.selectToggle(showAnnoRBTN); }