20 changed files with 2087 additions and 155 deletions
@ -0,0 +1,7 @@ |
|||
package org.hwo.pulscounter; |
|||
|
|||
public interface IPCController { |
|||
|
|||
void shutdownService(int exitCode); |
|||
|
|||
} |
@ -1,24 +1,30 @@ |
|||
package org.hwo.pulscounter; |
|||
|
|||
import org.hwo.bitfields.BitField; |
|||
import org.hwo.io.SerialPortExeption; |
|||
|
|||
public interface IPulsCounter { |
|||
|
|||
public String[] getDeviceName(); |
|||
|
|||
public int getChannels(); |
|||
public void close(); |
|||
|
|||
public int getChannels() throws SerialPortExeption; |
|||
|
|||
public String getChannelName(Integer channel); |
|||
public void setChannelName(Integer channel,String name); |
|||
public String getChannelName(Integer channel) throws SerialPortExeption; |
|||
public void setChannelName(Integer channel,String name) throws SerialPortExeption; |
|||
|
|||
public int[] getChannelCounters(); |
|||
public void setChannelCounter(Integer channel,Integer count); |
|||
public int[] getChannelCounters() throws SerialPortExeption; |
|||
public void setChannelCounter(Integer channel,Integer count) throws SerialPortExeption; |
|||
|
|||
public int[] getChannelOffsets(); |
|||
public void setChannelOffset(Integer channel,Integer offset); |
|||
public int[] getChannelOffsets() throws SerialPortExeption; |
|||
public void setChannelOffset(Integer channel,Integer offset) throws SerialPortExeption; |
|||
|
|||
public String getPhysicalInterfaceName(); |
|||
public void setPhysicalInterfaceName(String interfaceName); |
|||
public String getPhysicalInterfaceName() throws SerialPortExeption; |
|||
public void setPhysicalInterfaceName(String interfaceName) throws SerialPortExeption; |
|||
|
|||
public String[] getPhysicalInterfaceNames(); |
|||
public String[] getPhysicalInterfaceNames() throws SerialPortExeption; |
|||
|
|||
public Integer getPhysicalInputs() throws SerialPortExeption; |
|||
|
|||
} |
|||
|
@ -0,0 +1,75 @@ |
|||
package org.hwo.pulscounter; |
|||
|
|||
import java.util.LinkedList; |
|||
import java.util.List; |
|||
|
|||
import org.hwo.io.SerialPort; |
|||
import org.hwo.io.servicelink.ServiceLink; |
|||
import org.hwo.pulscounter.ui.AppSettingsListener; |
|||
|
|||
public class PulsCounter2Application { |
|||
|
|||
static PulsCounter2Application _application; |
|||
public static PulsCounter2Application getApplication(){ |
|||
if (_application == null) |
|||
_application = new PulsCounter2Application(); |
|||
|
|||
return _application; |
|||
} |
|||
|
|||
SerialPort serialPort; |
|||
ServiceLink serviceLink; |
|||
|
|||
List<AppSettingsListener> appSettingsListeners; |
|||
|
|||
public PulsCounter2Application(){ |
|||
appSettingsListeners = new LinkedList<AppSettingsListener>(); |
|||
} |
|||
|
|||
public void addAppSettingsListener(AppSettingsListener listener){ |
|||
appSettingsListeners.add(listener); |
|||
} |
|||
public void removeAppSettingsListener(AppSettingsListener listener){ |
|||
appSettingsListeners.remove(listener); |
|||
} |
|||
|
|||
private void fireServiceLinkChanged(){ |
|||
for (AppSettingsListener l: appSettingsListeners){ |
|||
l.ServiceLinkChanged(serviceLink); |
|||
} |
|||
} |
|||
|
|||
public synchronized SerialPort getSerialPort() { |
|||
return serialPort; |
|||
} |
|||
public synchronized void setSerialPort(SerialPort serialPort) { |
|||
if (serviceLink != null){ |
|||
serviceLink.close(); |
|||
serviceLink = null; |
|||
} |
|||
this.serialPort = serialPort; |
|||
|
|||
fireServiceLinkChanged(); |
|||
} |
|||
|
|||
public synchronized ServiceLink getServiceLink() { |
|||
if (serviceLink == null){ |
|||
if (serialPort != null){ |
|||
serviceLink = new ServiceLink(serialPort); |
|||
serviceLink.getSerialPort().setTimeout(200); |
|||
} |
|||
} |
|||
return serviceLink; |
|||
} |
|||
public synchronized void setServiceLink(ServiceLink serviceLink) { |
|||
if (serviceLink != null){ |
|||
serviceLink.close(); |
|||
} |
|||
this.serviceLink = serviceLink; |
|||
|
|||
fireServiceLinkChanged(); |
|||
} |
|||
|
|||
|
|||
|
|||
} |
@ -0,0 +1,87 @@ |
|||
package org.hwo.pulscounter.application; |
|||
|
|||
import java.sql.Connection; |
|||
import java.sql.DriverManager; |
|||
import java.sql.ResultSet; |
|||
import java.sql.SQLException; |
|||
import java.sql.Statement; |
|||
import java.util.LinkedList; |
|||
import java.util.List; |
|||
|
|||
import org.hwo.pulscounter.elements.WorkShift; |
|||
|
|||
public class InspectorApplication { |
|||
List<WorkShift> workShifts; |
|||
|
|||
Connection db; |
|||
|
|||
public InspectorApplication(){ |
|||
workShifts = new LinkedList<WorkShift>(); |
|||
/* |
|||
workShifts.add(new WorkShift()); |
|||
workShifts.add(new WorkShift()); |
|||
|
|||
workShifts.get(0).setName("Frรผhschicht"); |
|||
workShifts.get(0).getBegins().setHours(6); |
|||
workShifts.get(0).getBegins().setMinutes(0); |
|||
workShifts.get(0).getEnds().setHours(15); |
|||
workShifts.get(0).getEnds().setMinutes(0); |
|||
workShifts.get(1).setName("Frรผhschicht"); |
|||
workShifts.get(1).getBegins().setHours(15); |
|||
workShifts.get(1).getBegins().setMinutes(0); |
|||
workShifts.get(1).getEnds().setHours(3); |
|||
workShifts.get(1).getEnds().setMinutes(0); |
|||
*/ |
|||
connect(); |
|||
|
|||
try { |
|||
Statement stat = db.createStatement(); |
|||
ResultSet result = stat.executeQuery("SELECT * from workshifts"); |
|||
|
|||
while (result.next()){ |
|||
WorkShift shift = new WorkShift(); |
|||
shift.setName(result.getString("name")); |
|||
shift.getBegins().setTime( result.getTime("begins")); |
|||
shift.getEnds().setTime( result.getTime("ends")); |
|||
workShifts.add(shift); |
|||
} |
|||
|
|||
result.close(); |
|||
stat.close(); |
|||
|
|||
} catch (Exception e) |
|||
{ |
|||
e.printStackTrace(); |
|||
} |
|||
} |
|||
|
|||
public void connect(){ |
|||
try { |
|||
Class.forName("org.postgresql.Driver"); |
|||
|
|||
db = DriverManager.getConnection("jdbc:postgresql://10.112.1.1/pulscounter", "haraldwolff","diekleinefeine"); |
|||
} catch (ClassNotFoundException e) { |
|||
e.printStackTrace(); |
|||
} catch (SQLException e) { |
|||
e.printStackTrace(); |
|||
} |
|||
} |
|||
|
|||
public WorkShift[] getWorkShifts(){ |
|||
return workShifts.toArray(new WorkShift[0]); |
|||
} |
|||
|
|||
|
|||
public Connection getConnection() { |
|||
return db; |
|||
} |
|||
|
|||
|
|||
|
|||
} |
|||
|
|||
/*** |
|||
|
|||
properties.put("hibernate.connection.driver", "org.postgresql.Driver"); |
|||
properties.put("hibernate.connection.url", ); |
|||
***/ |
@ -0,0 +1,11 @@ |
|||
package org.hwo.pulscounter.elements; |
|||
|
|||
import org.hwo.datetime.DateTime; |
|||
|
|||
public class RawValueEntry { |
|||
|
|||
int channel; |
|||
DateTime dateTime; |
|||
int value; |
|||
|
|||
} |
@ -0,0 +1,73 @@ |
|||
package org.hwo.pulscounter.elements; |
|||
|
|||
import org.hwo.datetime.Date; |
|||
import org.hwo.datetime.TimeOfDay; |
|||
import org.hwo.datetime.DateTime; |
|||
|
|||
|
|||
public class WorkShift { |
|||
|
|||
private String name; |
|||
private String comment; |
|||
|
|||
private TimeOfDay begins; |
|||
private TimeOfDay ends; |
|||
|
|||
public WorkShift(){ |
|||
this.name = ""; |
|||
this.comment = ""; |
|||
this.begins = new TimeOfDay(); |
|||
this.ends = new TimeOfDay(); |
|||
} |
|||
|
|||
public boolean isOverMidnight(){ |
|||
return ends.isEarlierThan(begins); |
|||
} |
|||
|
|||
public String getName() { |
|||
return name; |
|||
} |
|||
public void setName(String name) { |
|||
this.name = name; |
|||
} |
|||
|
|||
public String getComment() { |
|||
return comment; |
|||
} |
|||
public void setComment(String comment) { |
|||
this.comment = comment; |
|||
} |
|||
|
|||
public TimeOfDay getBegins() { |
|||
return begins; |
|||
} |
|||
public void setBegins(TimeOfDay begins) { |
|||
this.begins = begins; |
|||
} |
|||
|
|||
public TimeOfDay getEnds() { |
|||
return ends; |
|||
} |
|||
public void setEnds(TimeOfDay ends) { |
|||
this.ends = ends; |
|||
} |
|||
|
|||
public DateTime getShiftBegins(Date date){ |
|||
DateTime dt = new DateTime(date, begins); |
|||
return dt; |
|||
} |
|||
|
|||
public DateTime getShiftEnds(Date date){ |
|||
DateTime dt = new DateTime(date, ends); |
|||
if (isOverMidnight()){ |
|||
dt.getDate().addDays(1); |
|||
} |
|||
return dt; |
|||
} |
|||
|
|||
@Override |
|||
public String toString() { |
|||
return this.name; |
|||
} |
|||
|
|||
} |
@ -0,0 +1,131 @@ |
|||
package org.hwo.pulscounter.elements; |
|||
|
|||
import java.sql.PreparedStatement; |
|||
import java.sql.ResultSet; |
|||
import java.sql.SQLException; |
|||
import java.sql.Statement; |
|||
import java.util.Hashtable; |
|||
import java.util.LinkedList; |
|||
import java.util.List; |
|||
|
|||
import org.hwo.datetime.Date; |
|||
import org.hwo.datetime.DateTime; |
|||
import org.hwo.pulscounter.PulsCounter; |
|||
|
|||
public class WorkShiftRecord { |
|||
|
|||
public class ChannelRecords{ |
|||
|
|||
public class ChannelRecord |
|||
{ |
|||
DateTime timestamp; |
|||
Integer value; |
|||
|
|||
public ChannelRecord(DateTime timestamp,int value){ |
|||
this.timestamp = timestamp; |
|||
this.value = value; |
|||
} |
|||
|
|||
public DateTime getTimestamp() { |
|||
return timestamp; |
|||
} |
|||
public void setTimestamp(DateTime timestamp) { |
|||
this.timestamp = timestamp; |
|||
} |
|||
|
|||
public int getValue() { |
|||
return value; |
|||
} |
|||
public void setValue(int value) { |
|||
this.value = value; |
|||
} |
|||
} |
|||
|
|||
int channel; |
|||
List<ChannelRecord> values; |
|||
|
|||
public ChannelRecords(int channel){ |
|||
this.channel = channel; |
|||
this.values = new LinkedList<WorkShiftRecord.ChannelRecords.ChannelRecord>(); |
|||
} |
|||
|
|||
public void addValue(DateTime timestamp,int value){ |
|||
this.values.add(new ChannelRecord(timestamp, value)); |
|||
} |
|||
|
|||
public void sort(){ |
|||
/* List<ChannelRecord> sorted = new LinkedList<WorkShiftRecord.ChannelRecords.ChannelRecord>(); |
|||
|
|||
for (ChannelRecord r: values){ |
|||
if (values.size() == 0) |
|||
sorted.add(r); |
|||
} |
|||
|
|||
this.values = sorted; |
|||
*/ |
|||
} |
|||
|
|||
public List<ChannelRecord> getRecords(){ |
|||
return this.values; |
|||
} |
|||
|
|||
} |
|||
|
|||
WorkShift workShift; |
|||
Date date; |
|||
|
|||
Hashtable<Integer, ChannelRecords> |
|||
records; |
|||
|
|||
public WorkShiftRecord(WorkShift shift,Date date){ |
|||
workShift = shift; |
|||
this.date = date; |
|||
records = new Hashtable<Integer, WorkShiftRecord.ChannelRecords>(); |
|||
|
|||
loadRecords(); |
|||
} |
|||
|
|||
void loadRecords(){ |
|||
try { |
|||
PreparedStatement stat = PulsCounter.getInspectorApplication().getConnection().prepareStatement("SELECT tstamp,channel,chvalue FROM rawvalues WHERE tstamp >= ? AND tstamp < ? ORDER BY channel,tstamp"); |
|||
|
|||
stat.setTimestamp(1, workShift.getShiftBegins(date).getTimeStamp()); |
|||
stat.setTimestamp(2, workShift.getShiftEnds(date).getTimeStamp()); |
|||
|
|||
ResultSet result = stat.executeQuery(); |
|||
|
|||
while (result.next()){ |
|||
int channel = result.getInt("channel"); |
|||
|
|||
if (!records.containsKey(channel)){ |
|||
records.put(channel, new ChannelRecords(channel)); |
|||
} |
|||
|
|||
// System.err.println("Record: " + result.getString("tstamp") + " [" + result.getString("channel") + "] " + result.getString("chvalue") );
|
|||
|
|||
records.get(channel).addValue(new DateTime(result.getTimestamp("tstamp")),result.getInt("chvalue")); |
|||
|
|||
|
|||
} |
|||
|
|||
result.close(); |
|||
stat.close(); |
|||
|
|||
for (WorkShiftRecord.ChannelRecords record: records.values().toArray(new WorkShiftRecord.ChannelRecords[0])){ |
|||
record.sort(); |
|||
} |
|||
|
|||
|
|||
} catch (SQLException e) { |
|||
e.printStackTrace(); |
|||
} |
|||
} |
|||
|
|||
public Integer[] getChannels(){ |
|||
return (Integer[]) this.records.keySet().toArray(new Integer[0]); |
|||
} |
|||
|
|||
public ChannelRecords getChannelRecords(int channel){ |
|||
return records.get(channel); |
|||
} |
|||
} |
@ -0,0 +1,72 @@ |
|||
package org.hwo.pulscounter.service; |
|||
|
|||
import java.io.IOException; |
|||
import java.net.InetAddress; |
|||
import java.net.UnknownHostException; |
|||
|
|||
import org.hwo.beacon.Beacon; |
|||
import org.hwo.pulscounter.IPulsCounter; |
|||
import org.hwo.pulscounter.NewPulsCounterDevice; |
|||
import org.hwo.rpc.simple.SimpleRPCServer; |
|||
|
|||
public class PulsCounterService { |
|||
|
|||
private NewPulsCounterDevice localDevice; |
|||
private SimpleRPCServer localRPCServer; |
|||
private Beacon serviceBeacon; |
|||
|
|||
|
|||
|
|||
public PulsCounterService(){ |
|||
|
|||
serviceBeacon = new Beacon(44556); |
|||
serviceBeacon.getProperties().setProperty("rpc.simple.interfaces", "org.hwo.pulsecounter"); |
|||
serviceBeacon.getProperties().setProperty("rpc.simple.port", "44352"); |
|||
serviceBeacon.setServerOnly(true); |
|||
|
|||
} |
|||
|
|||
public void start(){ |
|||
|
|||
if (localDevice == null){ |
|||
localDevice = new NewPulsCounterDevice(); |
|||
|
|||
try { |
|||
localRPCServer = new SimpleRPCServer(InetAddress.getByName("0.0.0.0"), 44352); |
|||
localRPCServer.registerObject(IPulsCounter.class, localDevice); |
|||
localRPCServer.start(); |
|||
|
|||
serviceBeacon.start(); |
|||
|
|||
} catch (Exception e) { |
|||
localDevice = null; |
|||
e.printStackTrace(); |
|||
} |
|||
} |
|||
} |
|||
|
|||
public void stop(){ |
|||
if (serviceBeacon.isAlive()) |
|||
serviceBeacon.exit(); |
|||
|
|||
if (localDevice != null){ |
|||
localRPCServer.exit(); |
|||
localDevice.close(); |
|||
localDevice = null; |
|||
} |
|||
|
|||
} |
|||
|
|||
public boolean isActive() { |
|||
return (serviceBeacon.isAlive()); |
|||
} |
|||
|
|||
public NewPulsCounterDevice getLocalDevice(){ |
|||
return localDevice; |
|||
} |
|||
void setLocalDevice(NewPulsCounterDevice device){ |
|||
localDevice = device; |
|||
} |
|||
|
|||
|
|||
} |
@ -0,0 +1,165 @@ |
|||
package org.hwo.pulscounter.ui; |
|||
|
|||
import java.awt.BorderLayout; |
|||
import java.awt.EventQueue; |
|||
|
|||
import javax.swing.JFrame; |
|||
import javax.swing.JPanel; |
|||
import javax.swing.border.EmptyBorder; |
|||
|
|||
import java.awt.Dialog.ModalExclusionType; |
|||
|
|||
import javax.swing.JTabbedPane; |
|||
|
|||
import java.awt.GridBagLayout; |
|||
import java.awt.GridBagConstraints; |
|||
|
|||
import javax.swing.JLabel; |
|||
|
|||
import java.awt.Insets; |
|||
|
|||
import javax.swing.JTextField; |
|||
import javax.swing.JButton; |
|||
|
|||
import org.hwo.io.SerialPort; |
|||
import org.hwo.io.SerialPortChooser; |
|||
import org.hwo.pulscounter.PulsCounter2Application; |
|||
|
|||
import java.awt.event.ActionListener; |
|||
import java.awt.event.ActionEvent; |
|||
|
|||
public class AppSettingsFrame extends JFrame { |
|||
|
|||
private JPanel contentPane; |
|||
private JTextField tfInterface; |
|||
|
|||
private SerialPort selectedSerialPort; |
|||
|
|||
|
|||
/** |
|||
* Create the frame. |
|||
*/ |
|||
public AppSettingsFrame() { |
|||
setTitle("Einstellungen"); |
|||
setModalExclusionType(ModalExclusionType.APPLICATION_EXCLUDE); |
|||
setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); |
|||
setBounds(100, 100, 603, 447); |
|||
contentPane = new JPanel(); |
|||
contentPane.setBorder(new EmptyBorder(5, 5, 5, 5)); |
|||
contentPane.setLayout(new BorderLayout(0, 0)); |
|||
setContentPane(contentPane); |
|||
|
|||
JTabbedPane tabbedPane = new JTabbedPane(JTabbedPane.TOP); |
|||
contentPane.add(tabbedPane, BorderLayout.CENTER); |
|||
|
|||
JPanel panel = new JPanel(); |
|||
tabbedPane.addTab("Kommunikation", null, panel, null); |
|||
tabbedPane.setEnabledAt(0, true); |
|||
GridBagLayout gbl_panel = new GridBagLayout(); |
|||
gbl_panel.columnWidths = new int[]{0, 0, 0, 0}; |
|||
gbl_panel.rowHeights = new int[]{0, 0, 0, 0}; |
|||
gbl_panel.columnWeights = new double[]{0.0, 1.0, 0.0, Double.MIN_VALUE}; |
|||
gbl_panel.rowWeights = new double[]{0.0, 0.0, 0.0, Double.MIN_VALUE}; |
|||
panel.setLayout(gbl_panel); |
|||
|
|||
JLabel lblSchnittstelle = new JLabel("Schnittstelle:"); |
|||
GridBagConstraints gbc_lblSchnittstelle = new GridBagConstraints(); |
|||
gbc_lblSchnittstelle.anchor = GridBagConstraints.EAST; |
|||
gbc_lblSchnittstelle.insets = new Insets(0, 0, 5, 5); |
|||
gbc_lblSchnittstelle.gridx = 0; |
|||
gbc_lblSchnittstelle.gridy = 0; |
|||
panel.add(lblSchnittstelle, gbc_lblSchnittstelle); |
|||
|
|||
tfInterface = new JTextField(); |
|||
GridBagConstraints gbc_tfInterface = new GridBagConstraints(); |
|||
gbc_tfInterface.anchor = GridBagConstraints.NORTH; |
|||
gbc_tfInterface.insets = new Insets(0, 0, 5, 5); |
|||
gbc_tfInterface.fill = GridBagConstraints.HORIZONTAL; |
|||
gbc_tfInterface.gridx = 1; |
|||
gbc_tfInterface.gridy = 0; |
|||
panel.add(tfInterface, gbc_tfInterface); |
|||
tfInterface.setColumns(10); |
|||
|
|||
JButton btnWhlen = new JButton("wรคhlen..."); |
|||
btnWhlen.addActionListener(new ActionListener() { |
|||
public void actionPerformed(ActionEvent arg0) { |
|||
chooseSerialPort(); |
|||
} |
|||
}); |
|||
GridBagConstraints gbc_btnWhlen = new GridBagConstraints(); |
|||
gbc_btnWhlen.insets = new Insets(0, 0, 5, 0); |
|||
gbc_btnWhlen.gridx = 2; |
|||
gbc_btnWhlen.gridy = 0; |
|||
panel.add(btnWhlen, gbc_btnWhlen); |
|||
|
|||
JPanel panel_1 = new JPanel(); |
|||
contentPane.add(panel_1, BorderLayout.SOUTH); |
|||
GridBagLayout gbl_panel_1 = new GridBagLayout(); |
|||
gbl_panel_1.columnWidths = new int[]{0, 0, 0}; |
|||
gbl_panel_1.rowHeights = new int[]{0, 0}; |
|||
gbl_panel_1.columnWeights = new double[]{1.0, 1.0, Double.MIN_VALUE}; |
|||
gbl_panel_1.rowWeights = new double[]{0.0, Double.MIN_VALUE}; |
|||
panel_1.setLayout(gbl_panel_1); |
|||
|
|||
JButton bCANCEL = new JButton("cancel"); |
|||
bCANCEL.addActionListener(new ActionListener() { |
|||
public void actionPerformed(ActionEvent e) { |
|||
setVisible(false); |
|||
} |
|||
}); |
|||
GridBagConstraints gbc_bCANCEL = new GridBagConstraints(); |
|||
gbc_bCANCEL.fill = GridBagConstraints.HORIZONTAL; |
|||
gbc_bCANCEL.insets = new Insets(0, 0, 0, 5); |
|||
gbc_bCANCEL.gridx = 0; |
|||
gbc_bCANCEL.gridy = 0; |
|||
panel_1.add(bCANCEL, gbc_bCANCEL); |
|||
|
|||
JButton bOK = new JButton("OK"); |
|||
bOK.addActionListener(new ActionListener() { |
|||
public void actionPerformed(ActionEvent e) { |
|||
accept(); |
|||
setVisible(false); |
|||
} |
|||
}); |
|||
GridBagConstraints gbc_bOK = new GridBagConstraints(); |
|||
gbc_bOK.fill = GridBagConstraints.HORIZONTAL; |
|||
gbc_bOK.gridx = 1; |
|||
gbc_bOK.gridy = 0; |
|||
panel_1.add(bOK, gbc_bOK); |
|||
|
|||
initialize(); |
|||
} |
|||
|
|||
private void initialize(){ |
|||
PulsCounter2Application pc2a = PulsCounter2Application.getApplication(); |
|||
|
|||
selectedSerialPort = pc2a.getSerialPort(); |
|||
|
|||
if (selectedSerialPort != null) |
|||
tfInterface.setText(selectedSerialPort.getPortName()); |
|||
} |
|||
|
|||
private void accept(){ |
|||
PulsCounter2Application pc2a = PulsCounter2Application.getApplication(); |
|||
pc2a.setSerialPort(selectedSerialPort); |
|||
} |
|||
|
|||
private void chooseSerialPort(){ |
|||
PulsCounter2Application pc2a = PulsCounter2Application.getApplication(); |
|||
|
|||
SerialPortChooser spc = new SerialPortChooser(); |
|||
|
|||
String selectedPortName = null; |
|||
if (selectedSerialPort != null) |
|||
selectedPortName = selectedSerialPort.getPortName(); |
|||
|
|||
SerialPort sp = spc.execute(selectedPortName); |
|||
if (sp != null){ |
|||
selectedSerialPort = sp; |
|||
tfInterface.setText(sp.getPortName()); |
|||
}; |
|||
|
|||
} |
|||
|
|||
|
|||
} |
@ -0,0 +1,10 @@ |
|||
package org.hwo.pulscounter.ui; |
|||
|
|||
import org.hwo.io.servicelink.ServiceLink; |
|||
|
|||
public interface AppSettingsListener { |
|||
|
|||
void ServiceLinkChanged(ServiceLink serviceLink); |
|||
|
|||
|
|||
} |
@ -0,0 +1,302 @@ |
|||
package org.hwo.pulscounter.ui; |
|||
|
|||
import java.awt.BorderLayout; |
|||
import java.awt.EventQueue; |
|||
|
|||
import javax.swing.JFrame; |
|||
import javax.swing.JPanel; |
|||
import javax.swing.border.EmptyBorder; |
|||
|
|||
import java.awt.GridBagLayout; |
|||
import java.awt.GridBagConstraints; |
|||
|
|||
import javax.swing.border.TitledBorder; |
|||
|
|||
import java.awt.Insets; |
|||
|
|||
import javax.swing.JLabel; |
|||
import javax.swing.JTextField; |
|||
import javax.swing.JButton; |
|||
|
|||
import org.hwo.datetime.Date; |
|||
import org.hwo.pulscounter.PulsCounter; |
|||
import org.hwo.pulscounter.elements.WorkShift; |
|||
import org.hwo.pulscounter.elements.WorkShiftRecord; |
|||
|
|||
import javax.swing.JComboBox; |
|||
|
|||
import java.awt.event.ActionListener; |
|||
import java.awt.event.ActionEvent; |
|||
import java.util.LinkedList; |
|||
|
|||
import javax.swing.JTable; |
|||
|
|||
import org.hwo.ui.FlexibleJTable; |
|||
import org.hwo.ui.JComboBoxEx; |
|||
|
|||
import javax.swing.JScrollPane; |
|||
|
|||
public class CheckWorkshiftRecords extends JFrame { |
|||
|
|||
private Date selectedDate; |
|||
private WorkShiftRecord selectedWorkShift; |
|||
|
|||
|
|||
private JPanel contentPane; |
|||
private JTextField tfDatum; |
|||
private JComboBox cbWorkShift; |
|||
private JTextField tfBegins; |
|||
private JTextField tfEnds; |
|||
private FlexibleJTable<WorkShiftRecord.ChannelRecords.ChannelRecord> flexibleJTable; |
|||
private JComboBoxEx cbChannel; |
|||
|
|||
/** |
|||
* Launch the application. |
|||
*/ |
|||
public static void main(String[] args) { |
|||
EventQueue.invokeLater(new Runnable() { |
|||
public void run() { |
|||
try { |
|||
CheckWorkshiftRecords frame = new CheckWorkshiftRecords(); |
|||
frame.setVisible(true); |
|||
} catch (Exception e) { |
|||
e.printStackTrace(); |
|||
} |
|||
} |
|||
}); |
|||
} |
|||
|
|||
/** |
|||
* Create the frame. |
|||
*/ |
|||
public CheckWorkshiftRecords() { |
|||
setTitle("Schichtdaten prรผfen"); |
|||
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); |
|||
setBounds(100, 100, 938, 686); |
|||
contentPane = new JPanel(); |
|||
contentPane.setBorder(new EmptyBorder(5, 5, 5, 5)); |
|||
setContentPane(contentPane); |
|||
GridBagLayout gbl_contentPane = new GridBagLayout(); |
|||
gbl_contentPane.columnWidths = new int[]{0, 0}; |
|||
gbl_contentPane.rowHeights = new int[]{0, 0, 0, 0}; |
|||
gbl_contentPane.columnWeights = new double[]{1.0, Double.MIN_VALUE}; |
|||
gbl_contentPane.rowWeights = new double[]{0.0, 0.0, 1.0, Double.MIN_VALUE}; |
|||
contentPane.setLayout(gbl_contentPane); |
|||
|
|||
JPanel panel = new JPanel(); |
|||
panel.setBorder(new TitledBorder(null, "Auswahl", TitledBorder.LEADING, TitledBorder.TOP, null, null)); |
|||
GridBagConstraints gbc_panel = new GridBagConstraints(); |
|||
gbc_panel.insets = new Insets(0, 0, 5, 0); |
|||
gbc_panel.fill = GridBagConstraints.BOTH; |
|||
gbc_panel.gridx = 0; |
|||
gbc_panel.gridy = 0; |
|||
contentPane.add(panel, gbc_panel); |
|||
GridBagLayout gbl_panel = new GridBagLayout(); |
|||
gbl_panel.columnWidths = new int[]{0, 0, 0, 0, 0, 0}; |
|||
gbl_panel.rowHeights = new int[]{0, 0, 0, 0}; |
|||
gbl_panel.columnWeights = new double[]{0.0, 1.0, 1.0, 0.0, 0.0, Double.MIN_VALUE}; |
|||
gbl_panel.rowWeights = new double[]{0.0, 0.0, 0.0, Double.MIN_VALUE}; |
|||
panel.setLayout(gbl_panel); |
|||
|
|||
JLabel lblDatum = new JLabel("Datum:"); |
|||
GridBagConstraints gbc_lblDatum = new GridBagConstraints(); |
|||
gbc_lblDatum.insets = new Insets(0, 0, 5, 5); |
|||
gbc_lblDatum.anchor = GridBagConstraints.EAST; |
|||
gbc_lblDatum.gridx = 0; |
|||
gbc_lblDatum.gridy = 0; |
|||
panel.add(lblDatum, gbc_lblDatum); |
|||
|
|||
tfDatum = new JTextField(); |
|||
tfDatum.addActionListener(new ActionListener() { |
|||
public void actionPerformed(ActionEvent e) { |
|||
Date d = new Date(); |
|||
d.fromSQLDate(tfDatum.getText()); |
|||
selectDatum(d); |
|||
} |
|||
}); |
|||
GridBagConstraints gbc_tfDatum = new GridBagConstraints(); |
|||
gbc_tfDatum.gridwidth = 2; |
|||
gbc_tfDatum.insets = new Insets(0, 0, 5, 5); |
|||
gbc_tfDatum.fill = GridBagConstraints.HORIZONTAL; |
|||
gbc_tfDatum.gridx = 1; |
|||
gbc_tfDatum.gridy = 0; |
|||
panel.add(tfDatum, gbc_tfDatum); |
|||
tfDatum.setColumns(10); |
|||
|
|||
JButton btnGestern = new JButton("GESTERN"); |
|||
btnGestern.addActionListener(new ActionListener() { |
|||
public void actionPerformed(ActionEvent e) { |
|||
Date d = new Date(); |
|||
d.addDays(-1); |
|||
selectDatum(d); |
|||
} |
|||
}); |
|||
|
|||
JButton btnHeute = new JButton("HEUTE"); |
|||
btnHeute.addActionListener(new ActionListener() { |
|||
public void actionPerformed(ActionEvent arg0) { |
|||
selectDatum(new Date()); |
|||
} |
|||
}); |
|||
GridBagConstraints gbc_btnHeute = new GridBagConstraints(); |
|||
gbc_btnHeute.insets = new Insets(0, 0, 5, 5); |
|||
gbc_btnHeute.gridx = 3; |
|||
gbc_btnHeute.gridy = 0; |
|||
panel.add(btnHeute, gbc_btnHeute); |
|||
GridBagConstraints gbc_btnGestern = new GridBagConstraints(); |
|||
gbc_btnGestern.insets = new Insets(0, 0, 5, 0); |
|||
gbc_btnGestern.gridx = 4; |
|||
gbc_btnGestern.gridy = 0; |
|||
panel.add(btnGestern, gbc_btnGestern); |
|||
|
|||
JLabel lblSchicht = new JLabel("Schicht:"); |
|||
GridBagConstraints gbc_lblSchicht = new GridBagConstraints(); |
|||
gbc_lblSchicht.insets = new Insets(0, 0, 5, 5); |
|||
gbc_lblSchicht.gridx = 0; |
|||
gbc_lblSchicht.gridy = 1; |
|||
panel.add(lblSchicht, gbc_lblSchicht); |
|||
|
|||
cbWorkShift = new JComboBox(); |
|||
cbWorkShift.addActionListener(new ActionListener() { |
|||
public void actionPerformed(ActionEvent e) { |
|||
selectionChanged(); |
|||
} |
|||
}); |
|||
GridBagConstraints gbc_cbWorkShift = new GridBagConstraints(); |
|||
gbc_cbWorkShift.gridwidth = 2; |
|||
gbc_cbWorkShift.insets = new Insets(0, 0, 5, 5); |
|||
gbc_cbWorkShift.fill = GridBagConstraints.HORIZONTAL; |
|||
gbc_cbWorkShift.gridx = 1; |
|||
gbc_cbWorkShift.gridy = 1; |
|||
panel.add(cbWorkShift, gbc_cbWorkShift); |
|||
|
|||
JLabel lblSchichtgrenzen = new JLabel("Schichtgrenzen:"); |
|||
GridBagConstraints gbc_lblSchichtgrenzen = new GridBagConstraints(); |
|||
gbc_lblSchichtgrenzen.anchor = GridBagConstraints.EAST; |
|||
gbc_lblSchichtgrenzen.insets = new Insets(0, 0, 0, 5); |
|||
gbc_lblSchichtgrenzen.gridx = 0; |
|||
gbc_lblSchichtgrenzen.gridy = 2; |
|||
panel.add(lblSchichtgrenzen, gbc_lblSchichtgrenzen); |
|||
|
|||
tfBegins = new JTextField(); |
|||
GridBagConstraints gbc_tfBegins = new GridBagConstraints(); |
|||
gbc_tfBegins.insets = new Insets(0, 0, 0, 5); |
|||
gbc_tfBegins.fill = GridBagConstraints.HORIZONTAL; |
|||
gbc_tfBegins.gridx = 1; |
|||
gbc_tfBegins.gridy = 2; |
|||
panel.add(tfBegins, gbc_tfBegins); |
|||
tfBegins.setColumns(10); |
|||
|
|||
tfEnds = new JTextField(); |
|||
tfEnds.setColumns(10); |
|||
GridBagConstraints gbc_tfEnds = new GridBagConstraints(); |
|||
gbc_tfEnds.insets = new Insets(0, 0, 0, 5); |
|||
gbc_tfEnds.fill = GridBagConstraints.HORIZONTAL; |
|||
gbc_tfEnds.gridx = 2; |
|||
gbc_tfEnds.gridy = 2; |
|||
panel.add(tfEnds, gbc_tfEnds); |
|||
|
|||
JPanel panel_2 = new JPanel(); |
|||
panel_2.setBorder(new TitledBorder(null, "Kanal", TitledBorder.LEADING, TitledBorder.TOP, null, null)); |
|||
GridBagConstraints gbc_panel_2 = new GridBagConstraints(); |
|||
gbc_panel_2.insets = new Insets(0, 0, 5, 0); |
|||
gbc_panel_2.fill = GridBagConstraints.BOTH; |
|||
gbc_panel_2.gridx = 0; |
|||
gbc_panel_2.gridy = 1; |
|||
contentPane.add(panel_2, gbc_panel_2); |
|||
GridBagLayout gbl_panel_2 = new GridBagLayout(); |
|||
gbl_panel_2.columnWidths = new int[]{0, 0}; |
|||
gbl_panel_2.rowHeights = new int[]{0, 0}; |
|||
gbl_panel_2.columnWeights = new double[]{1.0, Double.MIN_VALUE}; |
|||
gbl_panel_2.rowWeights = new double[]{0.0, Double.MIN_VALUE}; |
|||
panel_2.setLayout(gbl_panel_2); |
|||
|
|||
cbChannel = new JComboBoxEx(); |
|||
cbChannel.addActionListener(new ActionListener() { |
|||
@Override |
|||
public void actionPerformed(ActionEvent arg0) { |
|||
selectChannel(); |
|||
} |
|||
} |
|||
); |
|||
GridBagConstraints gbc_cbChannel = new GridBagConstraints(); |
|||
gbc_cbChannel.fill = GridBagConstraints.HORIZONTAL; |
|||
gbc_cbChannel.gridx = 0; |
|||
gbc_cbChannel.gridy = 0; |
|||
panel_2.add(cbChannel, gbc_cbChannel); |
|||
|
|||
JPanel panel_1 = new JPanel(); |
|||
GridBagConstraints gbc_panel_1 = new GridBagConstraints(); |
|||
gbc_panel_1.fill = GridBagConstraints.BOTH; |
|||
gbc_panel_1.gridx = 0; |
|||
gbc_panel_1.gridy = 2; |
|||
contentPane.add(panel_1, gbc_panel_1); |
|||
GridBagLayout gbl_panel_1 = new GridBagLayout(); |
|||
gbl_panel_1.columnWidths = new int[]{0, 0}; |
|||
gbl_panel_1.rowHeights = new int[]{0, 0}; |
|||
gbl_panel_1.columnWeights = new double[]{1.0, Double.MIN_VALUE}; |
|||
gbl_panel_1.rowWeights = new double[]{1.0, Double.MIN_VALUE}; |
|||
panel_1.setLayout(gbl_panel_1); |
|||
|
|||
JScrollPane scrollPane = new JScrollPane(); |
|||
GridBagConstraints gbc_scrollPane = new GridBagConstraints(); |
|||
gbc_scrollPane.fill = GridBagConstraints.BOTH; |
|||
gbc_scrollPane.gridx = 0; |
|||
gbc_scrollPane.gridy = 0; |
|||
panel_1.add(scrollPane, gbc_scrollPane); |
|||
|
|||
flexibleJTable = new FlexibleJTable(WorkShiftRecord.ChannelRecords.ChannelRecord.class); |
|||
scrollPane.setViewportView(flexibleJTable); |
|||
|
|||
this.initialize(); |
|||
} |
|||
|
|||
void initialize(){ |
|||
for (WorkShift shift: PulsCounter.getInspectorApplication().getWorkShifts()){ |
|||
cbWorkShift.addItem(shift); |
|||
} |
|||
|
|||
flexibleJTable.addColumn("timestamp"); |
|||
flexibleJTable.addColumn("value"); |
|||
|
|||
|
|||
|
|||
selectDatum(new Date()); |
|||
} |
|||
|
|||
void selectDatum(Date date){ |
|||
tfDatum.setText(date.getSQLDate()); |
|||
selectedDate = date; |
|||
|
|||
selectionChanged(); |
|||
} |
|||
|
|||
void selectionChanged(){ |
|||
if (cbWorkShift.getSelectedItem()==null) |
|||
return; |
|||
if (selectedDate == null) |
|||
return; |
|||
|
|||
WorkShift shift = (WorkShift)cbWorkShift.getSelectedItem(); |
|||
|
|||
tfBegins.setText(shift.getShiftBegins(selectedDate).getSQLDateTime()); |
|||
tfEnds.setText(shift.getShiftEnds(selectedDate).getSQLDateTime()); |
|||
|
|||
WorkShiftRecord workShiftRecord = new WorkShiftRecord(shift, selectedDate); |
|||
|
|||
selectedWorkShift = null; |
|||
|
|||
flexibleJTable.setRows(new LinkedList<WorkShiftRecord.ChannelRecords.ChannelRecord>()); |
|||
cbChannel.setItems(workShiftRecord.getChannels()); |
|||
|
|||
selectedWorkShift = workShiftRecord; |
|||
} |
|||
|
|||
void selectChannel(){ |
|||
if (selectedWorkShift != null){ |
|||
Integer ch = (Integer)cbChannel.getSelectedItem(); |
|||
flexibleJTable.setRows(selectedWorkShift.getChannelRecords(ch).getRecords()); |
|||
} |
|||
} |
|||
|
|||
} |
@ -0,0 +1,122 @@ |
|||
package org.hwo.pulscounter.ui; |
|||
|
|||
import java.awt.BorderLayout; |
|||
import java.awt.EventQueue; |
|||
|
|||
import javax.swing.JFrame; |
|||
import javax.swing.JPanel; |
|||
import javax.swing.border.EmptyBorder; |
|||
|
|||
import java.awt.GridBagLayout; |
|||
|
|||
import javax.swing.JButton; |
|||
|
|||
import java.awt.GridBagConstraints; |
|||
import java.awt.Insets; |
|||
|
|||
import javax.swing.border.TitledBorder; |
|||
|
|||
import org.hwo.datetime.Date; |
|||
import org.hwo.pulscounter.PulsCounter; |
|||
import org.hwo.pulscounter.elements.WorkShift; |
|||
|
|||
import java.awt.event.ActionListener; |
|||
import java.awt.event.ActionEvent; |
|||
|
|||
public class InspectionMainFrame extends JFrame { |
|||
|
|||
private JPanel contentPane; |
|||
|
|||
/** |
|||
* Launch the application. |
|||
*/ |
|||
public static void main(String[] args) { |
|||
EventQueue.invokeLater(new Runnable() { |
|||
public void run() { |
|||
try { |
|||
InspectionMainFrame frame = new InspectionMainFrame(); |
|||
frame.setVisible(true); |
|||
} catch (Exception e) { |
|||
e.printStackTrace(); |
|||
} |
|||
} |
|||
}); |
|||
} |
|||
|
|||
/** |
|||
* Create the frame. |
|||
*/ |
|||
public InspectionMainFrame() { |
|||
setTitle("Inspektor"); |
|||
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); |
|||
setBounds(100, 100, 841, 607); |
|||
contentPane = new JPanel(); |
|||
contentPane.setBorder(new EmptyBorder(5, 5, 5, 5)); |
|||
setContentPane(contentPane); |
|||
GridBagLayout gbl_contentPane = new GridBagLayout(); |
|||
gbl_contentPane.columnWidths = new int[]{0, 0}; |
|||
gbl_contentPane.rowHeights = new int[]{0, 0, 0}; |
|||
gbl_contentPane.columnWeights = new double[]{1.0, Double.MIN_VALUE}; |
|||
gbl_contentPane.rowWeights = new double[]{1.0, 1.0, Double.MIN_VALUE}; |
|||
contentPane.setLayout(gbl_contentPane); |
|||
|
|||
JPanel panel = new JPanel(); |
|||
GridBagConstraints gbc_panel = new GridBagConstraints(); |
|||
gbc_panel. |