Skip to content

Commit 8265fe6

Browse files
committed
Fixed running tranmitter linked to the viewport
1 parent de18dc0 commit 8265fe6

File tree

3 files changed

+51
-19
lines changed

3 files changed

+51
-19
lines changed

src/main/java/org/emrick/project/FootballFieldListener.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,10 @@
33
/**
44
* Listen to important events whose source comes from FootballFieldPanel. For example, when a performer is selected.
55
*/
6-
public interface FootballFieldListener {
6+
public interface FootballFieldListener extends RFSignalListener {
77
void onPerformerSelect();
88
void onPerformerDeselect();
99
void onResizeBackground();
1010
void onFinishRepaint();
11+
double getFrameRate();
1112
}

src/main/java/org/emrick/project/FootballFieldPanel.java

Lines changed: 33 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -2,14 +2,18 @@
22

33
import org.emrick.project.effect.Effect;
44
import org.emrick.project.effect.EffectManager;
5+
import org.emrick.project.effect.RFTrigger;
56

67
import javax.swing.*;
78
import javax.swing.event.MouseInputListener;
89
import java.awt.*;
910
import java.awt.event.MouseEvent;
1011
import java.awt.geom.Point2D;
1112
import java.awt.image.BufferedImage;
13+
import java.util.ArrayList;
14+
import java.util.Comparator;
1215
import java.util.HashMap;
16+
import java.util.Iterator;
1317

1418
public class FootballFieldPanel extends JPanel implements RepaintListener {
1519
public Drill drill;
@@ -34,19 +38,19 @@ public class FootballFieldPanel extends JPanel implements RepaintListener {
3438
public long currentMS = 0;
3539
private int currentCount = 0;
3640
private int currentSetStartCount = 0;
37-
private SerialTransmitter serialTransmitter;
3841

3942
// Effects utility
4043
private final FootballFieldListener footballFieldListener;
4144
private EffectManager effectManager;
4245
private int effectTransparency = 255;
4346
private boolean useFps;
47+
private HashMap<Integer, RFTrigger> count2RFTrigger;
4448

4549
public void setUseFps(boolean useFps) {
4650
this.useFps = useFps;
4751
}
4852

49-
public FootballFieldPanel(FootballFieldListener footballFieldListener) {
53+
public FootballFieldPanel(FootballFieldListener footballFieldListener, HashMap<Integer, RFTrigger> count2RFTrigger) {
5054
// setPreferredSize(new Dimension(fieldWidth + 2*margin, fieldHeight + 2*margin)); // Set preferred size for the drawing area
5155
setMinimumSize(new Dimension(1042, 548));
5256
drill = new Drill();
@@ -55,10 +59,11 @@ public FootballFieldPanel(FootballFieldListener footballFieldListener) {
5559
this.addMouseListener(new MouseInput(this));
5660
colorChosen = Color.BLACK;
5761
this.footballFieldListener = footballFieldListener;
62+
this.count2RFTrigger = count2RFTrigger;
5863
}
5964

6065
public FootballFieldPanel(Color colorChosen, FootballFieldListener footballFieldListener) {
61-
this(footballFieldListener);
66+
this.footballFieldListener = footballFieldListener;
6267
this.colorChosen = colorChosen;
6368
}
6469

@@ -75,12 +80,17 @@ public void setEffectTransparency(int effectTransparency) {
7580
this.effectTransparency = effectTransparency;
7681
}
7782

83+
public HashMap<Integer, RFTrigger> getCount2RFTrigger() {
84+
return count2RFTrigger;
85+
}
86+
87+
public void setCount2RFTrigger(HashMap<Integer, RFTrigger> count2RFTrigger) {
88+
this.count2RFTrigger = count2RFTrigger;
89+
}
90+
7891
public void addSetToField(Set set) {
7992
currentSet = set;
8093
if (!set.equals("0")) {
81-
if (serialTransmitter != null) {
82-
serialTransmitter.writeSet(set.index);
83-
}
8494
for (Performer p : drill.performers) {
8595
for (Coordinate c : p.getCoordinates()) {
8696
if (c.set.equals(set)) {
@@ -97,14 +107,6 @@ public void addSetToField(Set set) {
97107
repaint();
98108
}
99109

100-
public SerialTransmitter getSerialTransmitter() {
101-
return serialTransmitter;
102-
}
103-
104-
public void setSerialTransmitter(SerialTransmitter serialTransmitter) {
105-
this.serialTransmitter = serialTransmitter;
106-
}
107-
108110
public int getCurrentCount() {
109111
return currentCount;
110112
}
@@ -232,6 +234,23 @@ protected void paintComponent(Graphics g) {
232234
}
233235
// Case: User is not using FPS playback mode
234236
if (!useFps) currentSetRatio = 1;
237+
if (count2RFTrigger != null) {
238+
Iterator<RFTrigger> iterator = count2RFTrigger.values().iterator();
239+
ArrayList<RFTrigger> triggers = new ArrayList<>();
240+
while (iterator.hasNext()) {
241+
triggers.add(iterator.next());
242+
}
243+
triggers.sort(Comparator.comparingInt(RFTrigger::getCount));
244+
for (int i = 0; i < triggers.size(); i++) {
245+
RFTrigger trigger = triggers.get(i);
246+
long start = trigger.getTimestampMillis();
247+
long nextFrameMS = start + (long) (1.0 / footballFieldListener.getFrameRate() * 1000);
248+
if (currMS >= start && currMS < nextFrameMS) {
249+
footballFieldListener.onRFSignal(i);
250+
break;
251+
}
252+
}
253+
}
235254

236255
// Draw performers with their colors
237256
for (Performer p : drill.performers) {

src/main/java/org/emrick/project/MediaEditorGUI.java

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -91,6 +91,7 @@ public class MediaEditorGUI extends Component implements ImportListener, ScrubBa
9191
// RF Trigger
9292
private RFTriggerGUI rfTriggerGUI;
9393
private HashMap<Integer, RFTrigger> count2RFTrigger;
94+
private boolean runningShow;
9495

9596
private FlowViewGUI flowViewGUI;
9697

@@ -201,7 +202,7 @@ public MediaEditorGUI(String file) {
201202
UIManager.put("RadioButtonMenuItem.font", f);
202203

203204
// Field
204-
footballFieldPanel = new FootballFieldPanel(this);
205+
footballFieldPanel = new FootballFieldPanel(this, null);
205206
footballFieldPanel.setOpaque(false);
206207
//footballFieldPanel.setBackground(Color.lightGray); // temp. Visual indicator for unfilled space
207208
JScrollPane fieldScrollPane = new JScrollPane(footballFieldPanel);
@@ -220,6 +221,7 @@ public MediaEditorGUI(String file) {
220221

221222
// Scrub bar cursor starts on first count of drill by default
222223
useStartDelay = true;
224+
runningShow = false;
223225

224226
if (!file.equals("")) {
225227
if (file.endsWith(".emrick")) {
@@ -623,7 +625,6 @@ public void createAndShowGUI() {
623625
mainContentPanel.revalidate();
624626
mainContentPanel.repaint();
625627
}
626-
footballFieldPanel.setSerialTransmitter(null);
627628
serialTransmitter = null;
628629
stopShowItem.setEnabled(false);
629630
runShowItem.setEnabled(true);
@@ -673,7 +674,6 @@ public void createAndShowGUI() {
673674
return;
674675
}
675676

676-
footballFieldPanel.setSerialTransmitter(serialTransmitter);
677677
footballFieldPanel.addSetToField(footballFieldPanel.drill.sets.get(0));
678678
runShowItem.setEnabled(false);
679679
flowViewerItem.setEnabled(false);
@@ -976,6 +976,7 @@ public void loadProject(File path) {
976976
scrubBarGUI.setTimeSync(timeSync);
977977
startDelay = pf.startDelay;
978978
count2RFTrigger = pf.count2RFTrigger;
979+
footballFieldPanel.setCount2RFTrigger(count2RFTrigger);
979980
setupEffectView(pf.ids);
980981
updateTimelinePanel();
981982
updateEffectViewPanel(selectedEffectType);
@@ -1463,6 +1464,7 @@ public void onDrillImport(String drill) {
14631464
footballFieldPanel.drill = DrillParser.parseWholeDrill(text);
14641465
footballFieldPanel.addSetToField(footballFieldPanel.drill.sets.get(0));
14651466
count2RFTrigger = new HashMap<>();
1467+
footballFieldPanel.setCount2RFTrigger(count2RFTrigger);
14661468
updateEffectViewPanel(selectedEffectType);
14671469
updateTimelinePanel();
14681470
rebuildPageTabCounts();
@@ -1494,6 +1496,7 @@ public void onSync(ArrayList<SyncTimeGUI.Pair> times, float startDelay) {
14941496

14951497
scrubBarGUI.setTimeSync(timeSync);
14961498
count2RFTrigger = new HashMap<>();
1499+
footballFieldPanel.setCount2RFTrigger(count2RFTrigger);
14971500

14981501
setupEffectView(null);
14991502
}
@@ -1703,13 +1706,15 @@ public void onCreateRFTrigger(RFTrigger rfTrigger) {
17031706
return;
17041707
}
17051708
count2RFTrigger.put(footballFieldPanel.getCurrentCount(), rfTrigger);
1709+
footballFieldPanel.setCount2RFTrigger(count2RFTrigger);
17061710
updateRFTriggerButton();
17071711
updateTimelinePanel();
17081712
}
17091713

17101714
@Override
17111715
public void onDeleteRFTrigger(int count) {
17121716
count2RFTrigger.remove(count);
1717+
footballFieldPanel.setCount2RFTrigger(count2RFTrigger);
17131718
updateRFTriggerButton();
17141719
updateTimelinePanel();
17151720
}
@@ -1746,6 +1751,11 @@ public void onFinishRepaint() {
17461751
}
17471752
}
17481753

1754+
@Override
1755+
public double getFrameRate() {
1756+
return scrubBarGUI.getFps();
1757+
}
1758+
17491759
private void updateEffectViewPanel(int effectType) {
17501760

17511761
// No point in updating effect view if can't use effects
@@ -2128,7 +2138,9 @@ public void actionPerformed(ActionEvent e) {
21282138

21292139
@Override
21302140
public void onRFSignal(int i) {
2131-
serialTransmitter.writeSet(i);
2141+
if (serialTransmitter != null && scrubBarGUI.isPlaying()) {
2142+
serialTransmitter.writeSet(i);
2143+
}
21322144
}
21332145

21342146
/*

0 commit comments

Comments
 (0)