GridControlPanel.java 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201
  1. package eu.tankernn.grid.frame;
  2. import java.awt.BorderLayout;
  3. import java.awt.FlowLayout;
  4. import java.awt.GridLayout;
  5. import java.awt.event.ItemEvent;
  6. import java.awt.event.ItemListener;
  7. import java.awt.event.KeyEvent;
  8. import java.text.DecimalFormat;
  9. import java.util.Arrays;
  10. import javax.swing.JCheckBoxMenuItem;
  11. import javax.swing.JComboBox;
  12. import javax.swing.JComponent;
  13. import javax.swing.JFrame;
  14. import javax.swing.JLabel;
  15. import javax.swing.JMenu;
  16. import javax.swing.JMenuBar;
  17. import javax.swing.JMenuItem;
  18. import javax.swing.JPanel;
  19. import javax.swing.JSeparator;
  20. import javax.swing.JSpinner;
  21. import javax.swing.KeyStroke;
  22. import javax.swing.SpinnerNumberModel;
  23. import javax.swing.border.TitledBorder;
  24. import javax.swing.event.ChangeEvent;
  25. import eu.tankernn.grid.GridControl;
  26. import eu.tankernn.grid.model.ComputerModel;
  27. import eu.tankernn.grid.model.FanSpeedProfile;
  28. public class GridControlPanel extends JFrame {
  29. /**
  30. *
  31. */
  32. private static final long serialVersionUID = 1L;
  33. private ComputerModel model;
  34. private JMenuBar menuBar = new JMenuBar();
  35. private JMenu fileMenu = new JMenu("File"), settingsMenu = new JMenu("Settings"),
  36. profileMenu = new JMenu("Profiles");
  37. private JMenuItem saveSettings = new JMenuItem("Save settings", KeyEvent.VK_S),
  38. exit = new JMenuItem("Exit", KeyEvent.VK_E), sensorConf = new JMenuItem("Configure sensors..."),
  39. startMinimized = new JCheckBoxMenuItem("Start minimized"), addProfile = new JMenuItem("Add profile...");
  40. private FanPanel[] fanPanels;
  41. private JPanel serialPanel = new JPanel(), gridPanel = new JPanel(), infoPanel = new JPanel();
  42. private JSpinner minSpeed = new JSpinner(new SpinnerNumberModel(30, 0, 100, 5)),
  43. pollingSpeed = new JSpinner(new SpinnerNumberModel(500, 100, 2000, 100));
  44. private JComboBox<String> portMap = new JComboBox<>();
  45. private JLabel CPULabel = new JLabel("CPU:");
  46. private JLabel CPULoadLabel = new JLabel("CPU load");
  47. private JLabel GPULabel = new JLabel("GPU:");
  48. private JLabel PowerLabel = new JLabel("Power");
  49. private void setMinRPM(ChangeEvent event) {
  50. getModel().setMinSpeed((int) minSpeed.getValue());
  51. }
  52. private void setPort(ItemEvent event) {
  53. model.setGrid((String) portMap.getSelectedItem());
  54. }
  55. public GridControlPanel(GridControl control, ComputerModel model) {
  56. setModel(model);
  57. this.setLayout(new BorderLayout());
  58. menuBar.add(fileMenu);
  59. fileMenu.add(exit);
  60. exit.addActionListener(a -> control.exit());
  61. fileMenu.add(saveSettings);
  62. saveSettings.addActionListener(e -> control.saveSettings());
  63. saveSettings.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_S, KeyEvent.CTRL_DOWN_MASK));
  64. menuBar.add(settingsMenu);
  65. settingsMenu.add(sensorConf);
  66. sensorConf.addActionListener(e -> new SensorConfig(model.getSensor()));
  67. settingsMenu.add(startMinimized);
  68. startMinimized.addActionListener(e -> control.setStartMinimized(startMinimized.isSelected()));
  69. menuBar.add(profileMenu);
  70. profileMenu.add(addProfile);
  71. addProfile.addActionListener(e -> addProfile());
  72. this.setJMenuBar(this.menuBar);
  73. serialPanel.setLayout(new FlowLayout());
  74. serialPanel.setBorder(new TitledBorder("Serial settings"));
  75. serialPanel.add(labelledComponent("COM port: ", portMap));
  76. serialPanel.add(labelledComponent("Polling speed: ", pollingSpeed));
  77. this.add(serialPanel, BorderLayout.NORTH);
  78. fanPanels = model.getGrid().fanStream().map(f -> new FanPanel(f, model.getProfiles())).toArray(FanPanel[]::new);
  79. updateProfileMenu();
  80. gridPanel.setLayout(new GridLayout(3, 2));
  81. for (FanPanel p : fanPanels)
  82. gridPanel.add(p);
  83. this.add(gridPanel, BorderLayout.CENTER);
  84. minSpeed.setValue(model.getMinSpeed());
  85. minSpeed.addChangeListener(this::setMinRPM);
  86. pollingSpeed.setValue(control.getPollingSpeed());
  87. pollingSpeed.addChangeListener(e -> {
  88. control.setPollingSpeed((int) pollingSpeed.getValue());
  89. });
  90. infoPanel.setBorder(new TitledBorder("System info"));
  91. infoPanel.setLayout(new GridLayout(3, 2));
  92. infoPanel.add(CPULabel);
  93. infoPanel.add(GPULabel);
  94. infoPanel.add(CPULoadLabel);
  95. infoPanel.add(PowerLabel);
  96. infoPanel.add(labelledComponent("Minimum speed (%): ", minSpeed));
  97. this.add(infoPanel, BorderLayout.SOUTH);
  98. portMap.addItemListener(new ItemListener() {
  99. @Override
  100. public void itemStateChanged(ItemEvent e) {
  101. setPort(e);
  102. }
  103. });
  104. this.setTitle("JavaGridControl");
  105. }
  106. private void addProfile() {
  107. FanSpeedProfile profile = new ProfileEditor().editProfile(null);
  108. if (profile != null) {
  109. model.addProfile(profile);
  110. Arrays.stream(fanPanels).forEach(f -> f.addProfile(profile));
  111. updateProfileMenu();
  112. }
  113. }
  114. private void updateProfileMenu() {
  115. profileMenu.removeAll();
  116. for (FanSpeedProfile p : model.getCustomProfiles()) {
  117. JMenuItem item = new JMenuItem(p.getName());
  118. item.addActionListener(a -> new ProfileEditor().editProfile(p));
  119. profileMenu.add(item);
  120. }
  121. profileMenu.add(new JSeparator());
  122. profileMenu.add(addProfile);
  123. }
  124. static JPanel labelledComponent(String labelText, JComponent component) {
  125. JPanel panel = new JPanel(new FlowLayout());
  126. panel.add(new JLabel(labelText));
  127. panel.add(component);
  128. return panel;
  129. }
  130. /**
  131. * This method sets the model for this controller. After the model is set
  132. * certain UI elements are updated Finally a pollAndCompute Thread is
  133. * started
  134. *
  135. * @param model
  136. * the model to set
  137. */
  138. private void setModel(ComputerModel model) {
  139. this.model = model;
  140. portMap.removeAllItems();
  141. for (String key : model.getPortMap().keySet()) {
  142. portMap.addItem(key);
  143. }
  144. setPort(null);
  145. }
  146. /**
  147. * This method updates the values of some UI elements and binds properties
  148. * to others
  149. *
  150. */
  151. public void updateProperties() {
  152. DecimalFormat df = new DecimalFormat("#.##");
  153. // \u00B0 = "Degree sign"
  154. CPULabel.setText("CPU: " + df.format(getModel().getSensor().getCPUTemp()) + " \u00B0C");
  155. PowerLabel.setText("Total power: " + df.format(getModel().getGrid().getTotalWattage()) + " W");
  156. CPULoadLabel.setText("CPU load: " + df.format(getModel().getSensor().getCpuLoad()) + " %");
  157. GPULabel.setText("GPU: " + df.format(getModel().getSensor().getGPUTemp()) + " \u00B0C");
  158. for (FanPanel p : fanPanels)
  159. p.update();
  160. }
  161. public ComputerModel getModel() {
  162. return model;
  163. }
  164. }