Commit c5abccad8d5216e616814a6b0d971337ea72cedb
1 parent
c52f6592
PercTeacher interface PC done
Showing
18 changed files
with
569 additions
and
0 deletions
Show diff stats
@@ -0,0 +1,88 @@ | @@ -0,0 +1,88 @@ | ||
1 | + | ||
2 | + | ||
3 | +public class Action { | ||
4 | + public static final long DELAI_DEFAULT = 1000; | ||
5 | + | ||
6 | + private boolean endAction = true; | ||
7 | + | ||
8 | + private long deltaL = 0; | ||
9 | + private long deltaR = 0; | ||
10 | + | ||
11 | + private long delaiL = DELAI_DEFAULT; // in us | ||
12 | + private long delaiR = DELAI_DEFAULT; // in us | ||
13 | + | ||
14 | + public Action() {} | ||
15 | + public Action(long deltaL, long deltaR) { | ||
16 | + this.deltaL = deltaL; | ||
17 | + this.deltaR = deltaR; | ||
18 | + this.endAction = false; | ||
19 | + } | ||
20 | + public Action(long deltaL, long deltaR, long delaiL, long delaiR) { | ||
21 | + this.deltaL = deltaL; | ||
22 | + this.deltaR = deltaR; | ||
23 | + this.delaiL = delaiL; | ||
24 | + this.delaiR = delaiR; | ||
25 | + this.endAction = false; | ||
26 | + } | ||
27 | + | ||
28 | + public void addDeltaL(long amount){this.deltaL += amount; endAction = false;} | ||
29 | + public void addDeltaR(long amount){this.deltaR += amount; endAction = false;} | ||
30 | + public void setDeltaL(long amount){this.deltaL = amount; endAction = false;} | ||
31 | + public void setDeltaR(long amount){this.deltaR = amount; endAction = false;} | ||
32 | + public long getDeltaL(){return this.deltaL;} | ||
33 | + public long getDeltaR(){return this.deltaR;} | ||
34 | + | ||
35 | + public void setDelaiL(long delai){this.delaiL = delai; endAction = false;} | ||
36 | + public void setDelaiR(long delai){this.delaiR = delai; endAction = false;} | ||
37 | + public long getDelaiL(){return this.delaiL;} | ||
38 | + public long getDelaiR(){return this.delaiR;} | ||
39 | + | ||
40 | + public boolean isEmpty() {return endAction;} | ||
41 | + | ||
42 | + public void calculateDelais(long microseconds) { | ||
43 | + // left | ||
44 | + double ticksL = (double) microseconds / (double) deltaL; | ||
45 | + delaiL = (long) (ticksL / 2d); // 1 step = 1 "on state" + 1 "off state" | ||
46 | + | ||
47 | + // right | ||
48 | + double ticksR = (double) microseconds / (double) deltaR; | ||
49 | + delaiR = (long) (ticksR / 2d); | ||
50 | + | ||
51 | + // tests | ||
52 | + if(delaiL < 50 || delaiR < 50) | ||
53 | + System.out.println("Warning : delais are very small ! (< 50 us)"); | ||
54 | + } | ||
55 | + | ||
56 | + @Override | ||
57 | + public String toString() { | ||
58 | + if(endAction) | ||
59 | + return "End sequence"; | ||
60 | + if(deltaL == 0 && deltaR == 0) | ||
61 | + return "Pause for " + String.valueOf((double) delaiL / 1000d) + " miliseconds"; | ||
62 | + if(deltaL == 0) { | ||
63 | + if(deltaR > 0) | ||
64 | + return "Turning right forward for " + String.valueOf(deltaR) + " steps during " + String.valueOf((double) (deltaR * delaiR) / 1000d) + " miliseconds"; | ||
65 | + else | ||
66 | + return "Turning right backward for " + String.valueOf(-deltaR) + " steps during " + String.valueOf((double) (-deltaR * delaiR) / 1000d) + " miliseconds"; | ||
67 | + } if(deltaR == 0) { | ||
68 | + if(deltaL > 0) | ||
69 | + return "Turning left forward for " + String.valueOf(deltaL) + " steps during " + String.valueOf((double) (deltaL * delaiL) / 1000d) + " miliseconds"; | ||
70 | + else | ||
71 | + return "Turning left backward for " + String.valueOf(-deltaL) + " steps during " + String.valueOf((double) (-deltaL * delaiL) / 1000d) + " miliseconds"; | ||
72 | + } if(deltaR == deltaL) { | ||
73 | + if(deltaL > 0) | ||
74 | + return "Going forward for " + String.valueOf(deltaL) + " steps during " + String.valueOf((double) (deltaL * delaiL) / 1000d) + " miliseconds"; | ||
75 | + else | ||
76 | + return "Going backward for " + String.valueOf(-deltaL) + " steps during " + String.valueOf((double) (deltaL * delaiL) / 1000d) + " miliseconds"; | ||
77 | + } if(deltaR == -deltaL) { | ||
78 | + if(deltaL > 0) | ||
79 | + return "Turning on the spot clockwise for " + String.valueOf(deltaL) + " steps during " | ||
80 | + + String.valueOf((double) (deltaL * delaiL) / 1000d) + " miliseconds"; | ||
81 | + else | ||
82 | + return "Turning on the spot anti-clockwise for " + String.valueOf(deltaR) + " steps during " | ||
83 | + + String.valueOf((double) (deltaR * delaiR) / 1000d) + " miliseconds"; | ||
84 | + } | ||
85 | + return "Custom curve dL:" + String.valueOf(deltaL) + "steps tL:" + String.valueOf((double) (deltaL * delaiL) / 1000d) + "ms | dR" | ||
86 | + + String.valueOf(deltaR) + "steps tR:" + String.valueOf((double) (deltaR * delaiR) / 1000d) + "ms"; | ||
87 | + } | ||
88 | +} |
@@ -0,0 +1,128 @@ | @@ -0,0 +1,128 @@ | ||
1 | +import java.util.ArrayList; | ||
2 | + | ||
3 | +public class ActionList { | ||
4 | + private ArrayList<Action> actions; | ||
5 | + | ||
6 | + public ActionList() { | ||
7 | + actions = new ArrayList<>(); | ||
8 | + actions.add(new Action()); | ||
9 | + } | ||
10 | + public ActionList(long[] leftDeltaArray, long[] rightDeltaArray, long[] leftDelaiArray, long[] rightDelaiArray) { | ||
11 | + if(leftDelaiArray.length != rightDelaiArray.length | ||
12 | + || leftDelaiArray.length != leftDelaiArray.length | ||
13 | + || leftDelaiArray.length != rightDelaiArray.length) | ||
14 | + throw new InvalidActionListArrays(); | ||
15 | + actions = new ArrayList<>(); | ||
16 | + for(int i=0; i<leftDeltaArray.length; i++) | ||
17 | + actions.add(new Action(leftDeltaArray[i], rightDeltaArray[i], leftDelaiArray[i], rightDelaiArray[i])); | ||
18 | + actions.add(new Action()); | ||
19 | + } | ||
20 | + | ||
21 | + public void addToActionList(int i, int j, long step) { | ||
22 | + switch (j * 10 + i) { | ||
23 | + case 00: //ACTION_LEFT_PLUS; | ||
24 | + addToLastAction(step, 0); | ||
25 | + break; | ||
26 | + case 02: //ACTION_LEFT_MINUS; | ||
27 | + addToLastAction(-step, 0); | ||
28 | + break; | ||
29 | + case 20: //ACTION_RIGHT_PLUS; | ||
30 | + addToLastAction(0, step); | ||
31 | + break; | ||
32 | + case 22: //ACTION_RIGHT_MINUS; | ||
33 | + addToLastAction(0, -step); | ||
34 | + break; | ||
35 | + case 10: //ACTION_FORWARD; | ||
36 | + addToLastAction(step, step); | ||
37 | + break; | ||
38 | + case 12: //ACTION_BACKWARD; | ||
39 | + addToLastAction(-step, -step); | ||
40 | + break; | ||
41 | + case 01: //ACTION_CLOCKWISE; | ||
42 | + addToLastAction(step, -step); | ||
43 | + break; | ||
44 | + case 21: //ACTION_ANTI_CLOCKWISE; | ||
45 | + addToLastAction(-step, step); | ||
46 | + break; | ||
47 | + default: | ||
48 | + throw new InvalidInputException(); | ||
49 | + } | ||
50 | + } | ||
51 | + | ||
52 | + public void completeAction() { | ||
53 | + if(!actions.get(actions.size() - 1).isEmpty()) | ||
54 | + actions.add(new Action()); | ||
55 | + } | ||
56 | + | ||
57 | + public void completeActionAndAddPause(long delai) { | ||
58 | + if(actions.get(actions.size() - 1).isEmpty()) | ||
59 | + actions.set(actions.size() - 1, new Action(0, 0, delai, delai)); | ||
60 | + else | ||
61 | + actions.add(new Action(0, 0, delai, delai)); | ||
62 | + completeAction(); | ||
63 | + } | ||
64 | + | ||
65 | + private void addToLastAction(long deltaL, long deltaR) { | ||
66 | + actions.get(actions.size() - 1).addDeltaL(deltaL); | ||
67 | + actions.get(actions.size() - 1).addDeltaR(deltaR); | ||
68 | + } | ||
69 | + | ||
70 | + public void revertLastAction() { | ||
71 | + if(actions.size() <= 0) | ||
72 | + return; | ||
73 | + if(actions.get(actions.size() - 1).isEmpty()) { | ||
74 | + actions.remove(actions.size() - 1); | ||
75 | + if(actions.size() != 0) | ||
76 | + actions.set(actions.size() - 1, new Action()); | ||
77 | + else | ||
78 | + actions.add(new Action()); | ||
79 | + } else { | ||
80 | + actions.set(actions.size() - 1, new Action()); | ||
81 | + } | ||
82 | + } | ||
83 | + | ||
84 | + public String getLeftDeltaArray() { | ||
85 | + String str = "{"; | ||
86 | + for(Action action : actions) { | ||
87 | + if(!action.isEmpty()) | ||
88 | + str += String.valueOf(action.getDeltaL()) + "L, "; | ||
89 | + } | ||
90 | + str = str.substring(0, str.length() - 2) + "}"; | ||
91 | + return str; | ||
92 | + } | ||
93 | + public String getRightDeltaArray() { | ||
94 | + String str = "{"; | ||
95 | + for(Action action : actions) { | ||
96 | + if(!action.isEmpty()) | ||
97 | + str += String.valueOf(action.getDeltaR()) + "L, "; | ||
98 | + } | ||
99 | + str = str.substring(0, str.length() - 2) + "}"; | ||
100 | + return str; | ||
101 | + } | ||
102 | + public String getLeftDelaiArray() { | ||
103 | + String str = "{"; | ||
104 | + for(Action action : actions) { | ||
105 | + if(!action.isEmpty()) | ||
106 | + str += String.valueOf(action.getDeltaR()) + "L, "; | ||
107 | + } | ||
108 | + str = str.substring(0, str.length() - 2) + "}"; | ||
109 | + return str; | ||
110 | + } | ||
111 | + public String getRightDelaiArray() { | ||
112 | + String str = "{"; | ||
113 | + for(Action action : actions) { | ||
114 | + if(!action.isEmpty()) | ||
115 | + str += String.valueOf(action.getDeltaR()) + "L, "; | ||
116 | + } | ||
117 | + str = str.substring(0, str.length() - 2) + "}"; | ||
118 | + return str; | ||
119 | + } | ||
120 | + | ||
121 | + @Override | ||
122 | + public String toString() { | ||
123 | + String str = ""; | ||
124 | + for(Action action : actions) | ||
125 | + str += action.toString() + "\n"; | ||
126 | + return str; | ||
127 | + } | ||
128 | +} |
@@ -0,0 +1,65 @@ | @@ -0,0 +1,65 @@ | ||
1 | +import java.io.BufferedWriter; | ||
2 | +import java.io.File; | ||
3 | +import java.io.FileWriter; | ||
4 | +import java.io.IOException; | ||
5 | +import java.nio.charset.Charset; | ||
6 | +import java.nio.file.Files; | ||
7 | +import java.nio.file.Paths; | ||
8 | + | ||
9 | +import javax.swing.JFileChooser; | ||
10 | +import javax.swing.JOptionPane; | ||
11 | +import javax.swing.filechooser.FileNameExtensionFilter; | ||
12 | + | ||
13 | +public class ImportExport { | ||
14 | + public static void exportWithDialog(ActionList list) { | ||
15 | + JFileChooser chooser = new JFileChooser(); | ||
16 | + FileNameExtensionFilter filter = new FileNameExtensionFilter("Array data", "adata"); | ||
17 | + chooser.setFileFilter(filter); | ||
18 | + chooser.setApproveButtonText("Exporter"); | ||
19 | + int returnVal = chooser.showOpenDialog(null); | ||
20 | + if(returnVal == JFileChooser.APPROVE_OPTION) | ||
21 | + export(list, chooser.getSelectedFile().getPath()); | ||
22 | + } | ||
23 | + private static void export(ActionList list, String path) { | ||
24 | + String str = list.getLeftDeltaArray() + "\n" + list.getRightDeltaArray() + "\n" + list.getLeftDelaiArray() + "\n" + list.getRightDelaiArray(); | ||
25 | + | ||
26 | + if(!path.endsWith(".adata")) | ||
27 | + path += ".adata"; | ||
28 | + BufferedWriter bufferedWriter = null; | ||
29 | + try { | ||
30 | + File file = new File(path); | ||
31 | + if (!file.exists()) | ||
32 | + file.createNewFile(); | ||
33 | + bufferedWriter = new BufferedWriter(new FileWriter(file)); | ||
34 | + bufferedWriter.write(str); | ||
35 | + bufferedWriter.close(); | ||
36 | + } catch (IOException e) { | ||
37 | + e.printStackTrace(); | ||
38 | + } | ||
39 | + } | ||
40 | + | ||
41 | + public static ActionList importsWithDialog() { | ||
42 | + JFileChooser chooser = new JFileChooser(); | ||
43 | + FileNameExtensionFilter filter = new FileNameExtensionFilter("Array data", "adata"); | ||
44 | + chooser.setFileFilter(filter); | ||
45 | + chooser.setMultiSelectionEnabled(false); | ||
46 | + chooser.setApproveButtonText("Importer"); | ||
47 | + int returnVal = chooser.showOpenDialog(null); | ||
48 | + if(returnVal == JFileChooser.APPROVE_OPTION && chooser.getSelectedFile().exists() && chooser.getSelectedFile().isFile()) | ||
49 | + return imports(chooser.getSelectedFile().getPath()); | ||
50 | + if(returnVal == JFileChooser.APPROVE_OPTION) | ||
51 | + JOptionPane.showMessageDialog(null, "You have to choose an exisiting file", "Import error", JOptionPane.ERROR_MESSAGE); | ||
52 | + return null; | ||
53 | + } | ||
54 | + private static ActionList imports(String path) { | ||
55 | + try { | ||
56 | + byte[] encoded = Files.readAllBytes(Paths.get(path)); | ||
57 | + String str = new String(encoded, Charset.defaultCharset()); | ||
58 | + long[][] longList = Util.getArraysFromImport(str); | ||
59 | + if(longList != null) | ||
60 | + return new ActionList(longList[0], longList[1], longList[2], longList[3]); | ||
61 | + JOptionPane.showMessageDialog(null, "The choosen file is invalid or currupted", "Import error", JOptionPane.ERROR_MESSAGE); | ||
62 | + } catch (IOException ignored) {} | ||
63 | + return null; | ||
64 | + } | ||
65 | +} |
@@ -0,0 +1,230 @@ | @@ -0,0 +1,230 @@ | ||
1 | +import java.awt.BorderLayout; | ||
2 | +import java.awt.Color; | ||
3 | +import java.awt.Component; | ||
4 | +import java.awt.FlowLayout; | ||
5 | +import java.awt.Font; | ||
6 | +import java.awt.GridLayout; | ||
7 | +import java.awt.event.ActionEvent; | ||
8 | +import java.awt.event.ActionListener; | ||
9 | +import java.awt.event.FocusEvent; | ||
10 | +import java.awt.event.FocusListener; | ||
11 | + | ||
12 | +import javax.swing.BorderFactory; | ||
13 | +import javax.swing.BoxLayout; | ||
14 | +import javax.swing.ImageIcon; | ||
15 | +import javax.swing.JButton; | ||
16 | +import javax.swing.JFrame; | ||
17 | +import javax.swing.JLabel; | ||
18 | +import javax.swing.JOptionPane; | ||
19 | +import javax.swing.JPanel; | ||
20 | +import javax.swing.JScrollPane; | ||
21 | +import javax.swing.JSeparator; | ||
22 | +import javax.swing.JTextArea; | ||
23 | +import javax.swing.JTextField; | ||
24 | +import javax.swing.border.Border; | ||
25 | + | ||
26 | +public class Interface extends JFrame implements ActionListener, FocusListener { | ||
27 | + private static final long serialVersionUID = 1L; | ||
28 | + private static final Font titleFont = new Font(new JLabel().getFont().getName(), Font.BOLD, 14); | ||
29 | + private static final Font defaultFont = new Font(new JLabel().getFont().getName(), Font.PLAIN, new JLabel().getFont().getSize()); | ||
30 | + private static final Border defaultJTextFieldBorder = new JTextField().getBorder(); | ||
31 | + | ||
32 | + private JTextArea logs; | ||
33 | + private JButton[][] moveButtons = new JButton[3][3]; | ||
34 | + private JTextField stepsField; | ||
35 | + private JButton waitButton; | ||
36 | + private JButton nextButton; | ||
37 | + private JButton revertButton; | ||
38 | + private JButton exportButton; | ||
39 | + private JButton importButton; | ||
40 | + | ||
41 | + private ActionList actionList; | ||
42 | + | ||
43 | + public Interface(ActionList actionList) { | ||
44 | + super("PercTeacher"); | ||
45 | + this.actionList = actionList; | ||
46 | + setResizable(false); | ||
47 | + populateWindow(); | ||
48 | + pack(); | ||
49 | + setLocationRelativeTo(null); // center window | ||
50 | + } | ||
51 | + | ||
52 | + private void populateWindow() { | ||
53 | + JPanel mainPanel = new JPanel(new BorderLayout()); | ||
54 | + addLogPanel(mainPanel); | ||
55 | + | ||
56 | + JPanel centerPanel = new JPanel(new FlowLayout(FlowLayout.LEADING, 0, 0)); | ||
57 | + addMoveCommandsPanel(centerPanel); | ||
58 | + JPanel optionCommandsPanel = new JPanel(); | ||
59 | + addOptionCommandsPanel(centerPanel, optionCommandsPanel); | ||
60 | + addExportImportPanel(optionCommandsPanel); | ||
61 | + | ||
62 | + mainPanel.add(centerPanel, BorderLayout.CENTER); | ||
63 | + add(mainPanel); | ||
64 | + | ||
65 | + updateLogs(); | ||
66 | + } | ||
67 | + | ||
68 | + private void addLogPanel(JPanel parent) { | ||
69 | + JPanel logPanel = new JPanel(new BorderLayout()); | ||
70 | + logPanel.setBorder(BorderFactory.createMatteBorder(2, 0, 0, 0, Color.LIGHT_GRAY)); | ||
71 | + | ||
72 | + JLabel loglabel = new JLabel("Actions"); | ||
73 | + loglabel.setFont(titleFont); | ||
74 | + logPanel.add(loglabel, BorderLayout.NORTH); | ||
75 | + | ||
76 | + logs = new JTextArea(6, 0); | ||
77 | + logs.setEditable(false); | ||
78 | + JScrollPane logScroll = new JScrollPane(logs, JScrollPane.VERTICAL_SCROLLBAR_ALWAYS, JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED); | ||
79 | + logPanel.add(logScroll, BorderLayout.CENTER); | ||
80 | + | ||
81 | + parent.add(logPanel, BorderLayout.SOUTH); | ||
82 | + } | ||
83 | + | ||
84 | + private void addMoveCommandsPanel(JPanel parent) { | ||
85 | + JPanel moveCommandsPanel = new JPanel(new GridLayout(3, 3)); | ||
86 | + moveCommandsPanel.setBorder(BorderFactory.createMatteBorder(0, 0, 0, 2, Color.LIGHT_GRAY)); | ||
87 | + | ||
88 | + for(int i=0; i<3; i++) { | ||
89 | + for(int j=0; j<3; j++) { | ||
90 | + if(i == 1 && j == 1) { // central component is an image of the robot | ||
91 | + JLabel label = new JLabel(new ImageIcon(getClass().getResource("/icons/robot.png"))); | ||
92 | + moveButtons[i][j] = null; | ||
93 | + moveCommandsPanel.add(label); | ||
94 | + } else { | ||
95 | + JButton button = new JButton(new ImageIcon(getClass().getResource("/icons/move" + String.valueOf(j) + String.valueOf(i) + ".png"))); | ||
96 | + moveButtons[i][j] = button; | ||
97 | + button.addActionListener(this); | ||
98 | + moveCommandsPanel.add(button); | ||
99 | + } | ||
100 | + } | ||
101 | + } | ||
102 | + | ||
103 | + parent.add(moveCommandsPanel, BorderLayout.CENTER); | ||
104 | + } | ||
105 | + | ||
106 | + private void addOptionCommandsPanel(JPanel parent, JPanel optionCommandsPanel) { | ||
107 | + optionCommandsPanel.setLayout(new BoxLayout(optionCommandsPanel, BoxLayout.PAGE_AXIS)); | ||
108 | + | ||
109 | + // title | ||
110 | + JLabel title = new JLabel("Options"); | ||
111 | + title.setFont(titleFont); | ||
112 | + title.setAlignmentX(Component.LEFT_ALIGNMENT); | ||
113 | + optionCommandsPanel.add(title); | ||
114 | + | ||
115 | + // steps | ||
116 | + JPanel stepPanel = new JPanel(new FlowLayout(FlowLayout.LEADING, 0, 0)); | ||
117 | + stepPanel.setAlignmentX(Component.LEFT_ALIGNMENT); | ||
118 | + | ||
119 | + JLabel stepLabel = new JLabel("Steps : "); | ||
120 | + stepLabel.setFont(defaultFont); | ||
121 | + stepPanel.add(stepLabel); | ||
122 | + | ||
123 | + stepsField = new JTextField(10); | ||
124 | + stepsField.setText("10"); | ||
125 | + stepsField.addFocusListener(this); | ||
126 | + stepPanel.add(stepsField); | ||
127 | + | ||
128 | + optionCommandsPanel.add(stepPanel); | ||
129 | + | ||
130 | + //buttons | ||
131 | + JPanel buttonsPanel = new JPanel(new GridLayout(0, 1)); | ||
132 | + buttonsPanel.setAlignmentX(Component.LEFT_ALIGNMENT); | ||
133 | + | ||
134 | + // wait button | ||
135 | + waitButton = new JButton("Add a pause"); | ||
136 | + waitButton.addActionListener(this); | ||
137 | + buttonsPanel.add(waitButton); | ||
138 | + | ||
139 | + // next action button | ||
140 | + nextButton = new JButton("Next action"); | ||
141 | + nextButton.addActionListener(this); | ||
142 | + buttonsPanel.add(nextButton); | ||
143 | + | ||
144 | + // revert action button | ||
145 | + revertButton = new JButton("Revert last action"); | ||
146 | + revertButton.addActionListener(this); | ||
147 | + buttonsPanel.add(revertButton); | ||
148 | + | ||
149 | + optionCommandsPanel.add(buttonsPanel); | ||
150 | + | ||
151 | + // separator | ||
152 | + JSeparator sep = new JSeparator(); | ||
153 | + sep.setForeground(Color.LIGHT_GRAY); | ||
154 | + sep.setBackground(Color.LIGHT_GRAY); | ||
155 | + optionCommandsPanel.add(sep); | ||
156 | + | ||
157 | + parent.add(optionCommandsPanel, BorderLayout.EAST); | ||
158 | + } | ||
159 | + | ||
160 | + private void addExportImportPanel(JPanel parent) { | ||
161 | + JPanel exportImportPanel = new JPanel(new GridLayout(0, 1)); | ||
162 | + exportImportPanel.setAlignmentX(Component.LEFT_ALIGNMENT); | ||
163 | + | ||
164 | + // export | ||
165 | + exportButton = new JButton("Export actions"); | ||
166 | + exportButton.addActionListener(this); | ||
167 | + exportImportPanel.add(exportButton); | ||
168 | + | ||
169 | + // import | ||
170 | + importButton = new JButton("Import actions"); | ||
171 | + importButton.addActionListener(this); | ||
172 | + exportImportPanel.add(importButton); | ||
173 | + | ||
174 | + parent.add(exportImportPanel); | ||
175 | + } | ||
176 | + | ||
177 | + @Override | ||
178 | + public void actionPerformed(ActionEvent e) { | ||
179 | + for(int i=0; i<3; i++) { | ||
180 | + for(int j=0; j<3; j++) { | ||
181 | + if(e.getSource() == moveButtons[i][j]) { | ||
182 | + String str = stepsField.getText(); | ||
183 | + try { | ||
184 | + if(str != null && !str.equals("")) { | ||
185 | + long step = Long.parseLong(str); | ||
186 | + actionList.addToActionList(i, j, step); | ||
187 | + } | ||
188 | + } catch (NumberFormatException ignored) { | ||
189 | + stepsField.setBorder(BorderFactory.createLineBorder(Color.RED)); | ||
190 | + } | ||
191 | + } | ||
192 | + } | ||
193 | + } | ||
194 | + if(e.getSource() == waitButton) { | ||
195 | + String str = JOptionPane.showInputDialog(null, "Pause duration (in miliseconds) :"); | ||
196 | + try { | ||
197 | + if(str != null && !str.equals("")) { | ||
198 | + long delai = Long.parseLong(str) * 1000; | ||
199 | + actionList.completeActionAndAddPause(delai); | ||
200 | + } | ||
201 | + } catch (NumberFormatException ignored) {} | ||
202 | + } else if(e.getSource() == nextButton) { | ||
203 | + actionList.completeAction(); | ||
204 | + } else if(e.getSource() == revertButton) { | ||
205 | + actionList.revertLastAction(); | ||
206 | + } else if(e.getSource() == exportButton) { | ||
207 | + ImportExport.exportWithDialog(actionList); | ||
208 | + } else if(e.getSource() == importButton) { | ||
209 | + ActionList newActionList = ImportExport.importsWithDialog(); | ||
210 | + if(newActionList != null) | ||
211 | + actionList = newActionList; | ||
212 | + } | ||
213 | + updateLogs(); | ||
214 | + } | ||
215 | + | ||
216 | + private void updateLogs() { | ||
217 | + if(actionList != null) | ||
218 | + logs.setText(actionList.toString()); | ||
219 | + } | ||
220 | + | ||
221 | + @Override | ||
222 | + public void focusGained(FocusEvent e) { | ||
223 | + if(e.getSource() == stepsField) { | ||
224 | + stepsField.setBorder(defaultJTextFieldBorder); | ||
225 | + stepsField.setCaretPosition(stepsField.getDocument().getLength()); | ||
226 | + } | ||
227 | + } | ||
228 | + @Override | ||
229 | + public void focusLost(FocusEvent e) {} | ||
230 | +} |
@@ -0,0 +1,15 @@ | @@ -0,0 +1,15 @@ | ||
1 | +import javax.swing.JFrame; | ||
2 | + | ||
3 | +/* TODO list : | ||
4 | + * - data to send to the arduino : do action, revert action | ||
5 | + */ | ||
6 | + | ||
7 | +public class Main { | ||
8 | + public static void main(String[] args) { | ||
9 | + ActionList actionList = new ActionList(); | ||
10 | + | ||
11 | + Interface i = new Interface(actionList); | ||
12 | + i.setVisible(true); | ||
13 | + i.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); | ||
14 | + } | ||
15 | +} |
@@ -0,0 +1,27 @@ | @@ -0,0 +1,27 @@ | ||
1 | + | ||
2 | +public class Util { | ||
3 | + public static long[][] getArraysFromImport(String str){ | ||
4 | + long[][] arrays = new long[4][]; | ||
5 | + String[] split = str.split("\n"); | ||
6 | + if(split.length < 4) | ||
7 | + return null; | ||
8 | + | ||
9 | + for(int i=0; i<arrays.length; i++) { | ||
10 | + arrays[i] = getArrayFromLine(split[i]); | ||
11 | + if(arrays[i] == null) | ||
12 | + return null; | ||
13 | + } | ||
14 | + return arrays; | ||
15 | + } | ||
16 | + private static long[] getArrayFromLine(String str) { | ||
17 | + str = str.substring(1, str.length() - 2); // remove { and } | ||
18 | + String[] longsStr = str.split("L, "); | ||
19 | + try { | ||
20 | + long[] longs = new long[longsStr.length]; | ||
21 | + for(int i=0; i<longs.length; i++) | ||
22 | + longs[i] = Long.parseLong(longsStr[i]); | ||
23 | + return longs; | ||
24 | + } catch (NumberFormatException ignored) {} | ||
25 | + return null; | ||
26 | + } | ||
27 | +} |
No preview for this file type
1.03 KB
1.07 KB
1.03 KB
605 Bytes
604 Bytes
1.03 KB
1016 Bytes
1.04 KB
4.42 KB