diff --git a/.classpath b/.classpath index 0eb4515..a52aa1a 100644 --- a/.classpath +++ b/.classpath @@ -3,5 +3,7 @@ + + diff --git a/postgresql-9.1-901.jdbc4.jar b/postgresql-9.1-901.jdbc4.jar new file mode 100755 index 0000000..203d5a1 Binary files /dev/null and b/postgresql-9.1-901.jdbc4.jar differ diff --git a/src/org/hwo/pulscounter/DeviceControlChannel.java b/src/org/hwo/pulscounter/DeviceControlChannel.java deleted file mode 100644 index 140886d..0000000 --- a/src/org/hwo/pulscounter/DeviceControlChannel.java +++ /dev/null @@ -1,182 +0,0 @@ -package org.hwo.pulscounter; - -import java.io.IOException; -import java.io.InputStream; -import java.io.OutputStream; -import java.nio.ByteBuffer; - -/* DeviceControlChannel - * - * Binary Serial Protocol based on telegrams - * - * telegram: - * - * byte length of next telegram - * byte request - * byte options - * byte reserve - * int32 parameter1 - * int32 parameter2 - * - * - */ - -public class DeviceControlChannel { - - public class Telegram - { - private byte[] buffer; - - private byte request; - private byte options; - - private Integer parameter1; - private Integer parameter2; - - public Telegram() - { - buffer = new byte[12]; - request = 0; - options = 0; - parameter1 = 0; - parameter2 = 0; - } - - public Telegram(byte request) - { - this.request = request; - options = 0; - parameter1 = 0; - parameter2 = 0; - } - public Telegram(byte request,byte options) - { - this.request = request; - this.options = options; - parameter1 = 0; - parameter2 = 0; - } - public Telegram(byte request,byte options,int parameter1,int parameter2) - { - this.request = request; - this.options = options; - this.parameter1 = parameter1; - this.parameter2 = parameter2; - } - - public byte[] getBuffer() - { - return this.buffer; - } - - public void decodeBuffer() - { - ByteBuffer bb = ByteBuffer.wrap(buffer); - bb.get(); - request = bb.get(); - options = bb.get(); - bb.get(); - parameter1 = bb.getInt(); - parameter2 = bb.getInt(); - } - - public Telegram(byte[] buffer) - { - this.buffer = buffer; - decodeBuffer(); - } - - public byte[] toArray() - { - return ByteBuffer.allocate(12) - .put((byte)11) - .put(request) - .put(options) - .put((byte)0) - .putInt(parameter1) - .putInt(parameter2) - .array(); - } - - public byte getRequest() { - return request; - } - - public void setRequest(byte request) { - this.request = request; - } - - public byte getOptions() { - return options; - } - - public void setOptions(byte options) { - this.options = options; - } - - public Integer getParameter1() { - return parameter1; - } - - public void setParameter1(Integer parameter1) { - this.parameter1 = parameter1; - } - - public Integer getParameter2() { - return parameter2; - } - - public void setParameter2(Integer parameter2) { - this.parameter2 = parameter2; - } - - } - - public static byte NOOP = 0; - public static byte READ = 1; - public static byte WRITE = 2; - public static byte COMMAND = 3; - public static byte REPLY = 8; - - private InputStream inputStream; - private OutputStream outputStream; - - public DeviceControlChannel(InputStream input,OutputStream output) - { - this.inputStream = input; - this.outputStream = output; - } - - public Telegram sendRequest(Telegram request) - { - Telegram response = new Telegram(); - - try { - outputStream.write(request.toArray()); - inputStream.read(response.getBuffer()); - } catch (IOException e) { - e.printStackTrace(); - } - - if (request.getRequest() != response.getRequest()) - System.err.println("DDC Error!"); - - - return response; - } - - - public void noop() - { - sendRequest(new Telegram()); - } - - public int readInteger() - { - return 0; - } - - - - -} diff --git a/src/org/hwo/pulscounter/IPCController.java b/src/org/hwo/pulscounter/IPCController.java new file mode 100644 index 0000000..fa129d5 --- /dev/null +++ b/src/org/hwo/pulscounter/IPCController.java @@ -0,0 +1,7 @@ +package org.hwo.pulscounter; + +public interface IPCController { + + void shutdownService(int exitCode); + +} diff --git a/src/org/hwo/pulscounter/IPulsCounter.java b/src/org/hwo/pulscounter/IPulsCounter.java index 82748d0..85498c8 100644 --- a/src/org/hwo/pulscounter/IPulsCounter.java +++ b/src/org/hwo/pulscounter/IPulsCounter.java @@ -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 String getChannelName(Integer channel); - public void setChannelName(Integer channel,String name); + public int getChannels() throws SerialPortExeption; + + 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; } diff --git a/src/org/hwo/pulscounter/NewPulsCounterDevice.java b/src/org/hwo/pulscounter/NewPulsCounterDevice.java index bf95897..db9fcbc 100644 --- a/src/org/hwo/pulscounter/NewPulsCounterDevice.java +++ b/src/org/hwo/pulscounter/NewPulsCounterDevice.java @@ -14,7 +14,9 @@ import java.util.List; import java.util.Properties; import java.util.Random; +import org.hwo.bitfields.BitField; import org.hwo.io.SerialPort; +import org.hwo.io.SerialPortExeption; import org.hwo.io.servicelink.ServiceLink; import org.hwo.io.servicelink.ServiceLinkException; import org.hwo.io.servicelink.ServiceLinkRequestFailedException; @@ -41,22 +43,12 @@ public class NewPulsCounterDevice implements IPulsCounter { setPhysicalInterfaceName(defaultPort); } - - synchronized public void reset(int ch) - { + + public void close(){ + if (this.serviceLink != null) + this.serviceLink.close(); } - - synchronized public void reset() - { - } - - - synchronized public void update() - { - System.err.println(String.format("BRKVAL: 0x%04x", serviceLink.getServiceRegisterCache().getCachedInteger((byte)0, (byte)0, (short)0x200))); - System.err.println(String.format("SPLIM : 0x%04x", serviceLink.getServiceRegisterCache().getCachedInteger((byte)0, (byte)0, (short)0x201))); - } - + private void saveProps(){ File pf = new File("chnames.prop"); try { @@ -72,6 +64,13 @@ public class NewPulsCounterDevice implements IPulsCounter { if (!serviceLink.isOpen()) try { serviceLink.open(); + serviceLink.getSerialPort().setTimeout(250); + try { + Thread.sleep(500); + } catch (InterruptedException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } } catch (ServiceLinkException e) { e.printStackTrace(); } @@ -101,16 +100,18 @@ public class NewPulsCounterDevice implements IPulsCounter { this.serviceLink.setSerialPort(serialPort);; this.serviceLink.open(); + this.serviceLink.getSerialPort().setTimeout(500); - try { +/* try { this.serviceLink.readInt((byte)0, (byte)0, 0); } catch (IOException e) { e.printStackTrace(); } - + */ System.err.println("BRKVAL: " + this.serviceLink.getServiceRegisterCache().getCachedInteger(13, 0, 0x0020)); System.err.println("SPLIM: " + this.serviceLink.getServiceRegisterCache().getCachedInteger(13, 0, 0x0021)); - + System.err.println("tCounter: " + this.serviceLink.getServiceRegisterCache().getCachedInteger(13, 0, 0x0500)); + System.err.println("tInterface:" + this.serviceLink.getServiceRegisterCache().getCachedInteger(13, 0, 0x0501)); } @Override @@ -135,9 +136,13 @@ public class NewPulsCounterDevice implements IPulsCounter { int[] counters = new int[ nch ]; for (int i=0;i options = Arrays.asList(args).iterator(); while (options.hasNext()) { @@ -81,39 +124,181 @@ public class PulsCounter { if (no.equals("-s")) { serverMode = true; + guiMode = false; + } else if (no.equals("-bo")) { + serverMode = false; + startLocalService = false; + } else if (no.equals("-b")) { + batchMode = true; + } else if (no.equals("-c")) { + batchConvert = true; + batchConvertTarget = options.next(); + } else if (no.equals("-f")){ + batchFilename = options.next(); + } else if (no.equals("-n")){ + networkName = options.next(); + startLocalService = false; + } else if (no.equals("-l")){ + logFile = options.next(); + } else if (no.equals("-u")){ + startLocalService = true; + } else if (no.equals("-d")){ + debugMode = true; + } + } + + if (logFile != null){ + try { + PrintStream logStream = new PrintStream(new FileOutputStream(logFile, true)); + System.setErr(logStream); + + } catch (FileNotFoundException e) { + // TODO Auto-generated catch block + e.printStackTrace(); } } - - deviceConnection = null; - beacon = new Beacon(44556); - beacon.getProperties().setProperty("rpc.simple.interfaces", "org.hwo.pulsecounter"); - beacon.getProperties().setProperty("rpc.simple.port", "44352"); - beacon.setServerOnly(serverMode); - beacon.start(); - - try { - NewPulsCounterDevice device = new NewPulsCounterDevice(); - - SimpleRPCServer rpcserver = new SimpleRPCServer(InetAddress.getByName("0.0.0.0"), 44352); - rpcserver.registerObject(IPulsCounter.class, device); - rpcserver.start(); + + + + if (batchMode) + guiMode = false; + + + + localService = new PulsCounterService(); + + if (startLocalService){ + localService.start(); - } catch (UnknownHostException e) { - e.printStackTrace(); - } catch (IOException e) { - e.printStackTrace(); } - - if (!serverMode) { + + if (batchMode) { + batchrun(); + } else if (guiMode){ PulsCounterWindow window = new PulsCounterWindow(); window.setVisible(true); } + if (batchConvert) { + batchConvert(batchFilename,batchConvertTarget); + } + } + + private static void batchrun(){ + + if (networkName == null) { + // TODO: Use UUID from preferences to select network service + } else { + Beacon clientBeacon = new Beacon(44556); + clientBeacon.setClientOnly(true); + clientBeacon.start(); + + for (int i=0;i<120;i++){ + if (clientBeacon.getSenderByName(networkName) != null) + break; + + try { + Thread.sleep(100); + } catch (InterruptedException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + + BeaconSender sender = clientBeacon.getSenderByName(networkName); + if (sender == null) { + System.err.println("Networknode: " + networkName + " is offline."); + clientBeacon.exit(); + return; + } + + IPulsCounter ipc = createProxyFromBeaconSender(sender); + + Date d = new Date(); + String time = String.format("%04d-%02d-%02d %02d:%02d:%02d",d.getYear()+1900,d.getMonth()+1,d.getDate(),d.getHours(),d.getMinutes(),d.getSeconds()); + + + try { + + CounterChannel[] channels = new CounterChannel[ ipc.getChannels() ]; + int[] values = ipc.getChannelCounters(); + + try { + File csvfile = new File(batchFilename); + boolean newfile = !csvfile.exists(); + BufferedWriter writer = new BufferedWriter(new FileWriter(csvfile,true)); + + if (newfile){ + + writer.write("Zeitpunkt"); + + for (int i=0;i0) + writer.write("\t"); + + writer.write(String.format("%d",values[i])); + } + writer.write("\r\n"); + writer.flush(); + + writer.close(); + + } catch (IOException e) { + e.printStackTrace(); + } + } catch (SerialPortExeption sex){ + System.err.println(sex); + sex.printStackTrace(); + } catch (Exception e) { + System.err.println(e); + e.printStackTrace(); + } + + + clientBeacon.exit(); + } + + } + + public static void batchConvert(String source,String target){ + + CSV csv = new CSV(); + csv.setSeparator('\t'); + csv.readFromFile(source); + + for (int i=csv.getRecords().size()-1;i>1;--i){ + for (int j=1;j channels; // Aktuelle ZŠhlerstŠnde - private List timeBarriers; // TageszeitabhŠngige Wertespeicher - - private Random random; - - private SerialPort serialPort; - - public PulsCounterDevice() - { - random = new Random(); - - channels = new ArrayList(); - timeBarriers = new ArrayList(); - - for (int n=0;n<32;n++) - { - channels.add(new CounterChannel(n + 1)); - } - - for (int n=0;n<10;n++) - { - timeBarriers.add(new TimeBarrier(0)); - } - - } - - synchronized public void reset(int ch) - { - if (serialPort == null) - return; - - try - { - ServiceLink sl = new ServiceLink(serialPort); - - sl.writeInt((byte)0, (byte)0, (short)(0x1000 + ch), 0); - - } catch (Exception e) - { - System.err.println("Exception: " + e); - e.printStackTrace(); - } - - if (serialPort.isOpen()) - serialPort.close(); - } - - synchronized public void reset() - { - if (serialPort == null) - return; - - try - { - ServiceLink sl = new ServiceLink(serialPort); - - for (int i=0;i<32;i++) - sl.writeInt((byte)0, (byte)0, (short)(0x1000 + i), 0); - - } catch (Exception e) - { - System.err.println("Exception: " + e); - e.printStackTrace(); - } - - if (serialPort.isOpen()) - serialPort.close(); - } - - - synchronized public void update() - { - if (serialPort == null) - return; - - try - { - ServiceLink sl = new ServiceLink(serialPort); - - System.err.println(String.format("BRKVAL: 0x%04x", sl.readInt((byte)0, (byte)0, (short)0x200))); - System.err.println(String.format("SPLIM : 0x%04x", sl.readInt((byte)0, (byte)0, (short)0x201))); - - - for (int i=0;i<32;i++) - { - channels.get(i).setValue( sl.readInt((byte)0x0D, (byte)0, (short)(0x1000 + i)) ); - } - } catch (Exception e) - { - System.err.println("Exception: " + e); - e.printStackTrace(); - } - - if (serialPort.isOpen()) - serialPort.close(); - } - - - public String getDeviceName() - { - return "PulsCounter Board"; - } - - public Date getDeviceTime() - { - return new Date(); - } - - public List getChannels() - { - return channels; - } - - public List getTimeBarriers() - { - return timeBarriers; - } - - public SerialPort getSerialPort() { - return serialPort; - } - - public void setSerialPort(SerialPort serialPort) { - this.serialPort = serialPort; - } -} diff --git a/src/org/hwo/pulscounter/PulsCounterInterface.java b/src/org/hwo/pulscounter/PulsCounterInterface.java deleted file mode 100644 index a11263f..0000000 --- a/src/org/hwo/pulscounter/PulsCounterInterface.java +++ /dev/null @@ -1,36 +0,0 @@ -package org.hwo.pulscounter; - -import java.io.RandomAccessFile; -import java.util.ArrayList; -import java.util.Date; -import java.util.List; -import java.util.ServiceLoader; - -public class PulsCounterInterface { - - - public PulsCounterInterface(String portName) - { - - } - - public List readCounter() - { - ArrayList counter = new ArrayList(); - - /* - if (port.open()) - { - port.close(); - } - */ - for (int i=0;i<32;i++) - counter.add( i * i); - - return counter; - } - - - - -} diff --git a/src/org/hwo/pulscounter/TimeBarrier.java b/src/org/hwo/pulscounter/TimeBarrier.java index 6878390..37b4bae 100644 --- a/src/org/hwo/pulscounter/TimeBarrier.java +++ b/src/org/hwo/pulscounter/TimeBarrier.java @@ -41,7 +41,7 @@ public class TimeBarrier { CSV csv = new CSV(); for (CounterChannel channel: channels) { - csv.getCells().add(new String[]{channel.getChannel().toString(),channel.getValue().toString(),channel.getCorrect().toString(),channel.correctedValue().toString()}); +// csv.getRecords().add(new String[]{channel.getChannel().toString(),channel.getValue().toString(),channel.getCorrect().toString(),channel.correctedValue().toString()}); } csv.saveToStream(output); } diff --git a/src/org/hwo/pulscounter/application/InspectorApplication.java b/src/org/hwo/pulscounter/application/InspectorApplication.java new file mode 100644 index 0000000..b477206 --- /dev/null +++ b/src/org/hwo/pulscounter/application/InspectorApplication.java @@ -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 workShifts; + + Connection db; + + public InspectorApplication(){ + workShifts = new LinkedList(); +/* + 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", ); +***/ \ No newline at end of file diff --git a/src/org/hwo/pulscounter/elements/RawValueEntry.java b/src/org/hwo/pulscounter/elements/RawValueEntry.java new file mode 100644 index 0000000..6fdaad0 --- /dev/null +++ b/src/org/hwo/pulscounter/elements/RawValueEntry.java @@ -0,0 +1,11 @@ +package org.hwo.pulscounter.elements; + +import org.hwo.datetime.DateTime; + +public class RawValueEntry { + + int channel; + DateTime dateTime; + int value; + +} diff --git a/src/org/hwo/pulscounter/elements/WorkShift.java b/src/org/hwo/pulscounter/elements/WorkShift.java new file mode 100644 index 0000000..f93c354 --- /dev/null +++ b/src/org/hwo/pulscounter/elements/WorkShift.java @@ -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; + } + +} diff --git a/src/org/hwo/pulscounter/elements/WorkShiftRecord.java b/src/org/hwo/pulscounter/elements/WorkShiftRecord.java new file mode 100644 index 0000000..8c1707e --- /dev/null +++ b/src/org/hwo/pulscounter/elements/WorkShiftRecord.java @@ -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 values; + + public ChannelRecords(int channel){ + this.channel = channel; + this.values = new LinkedList(); + } + + public void addValue(DateTime timestamp,int value){ + this.values.add(new ChannelRecord(timestamp, value)); + } + + public void sort(){ +/* List sorted = new LinkedList(); + + for (ChannelRecord r: values){ + if (values.size() == 0) + sorted.add(r); + } + + this.values = sorted; + */ + } + + public List getRecords(){ + return this.values; + } + + } + + WorkShift workShift; + Date date; + + Hashtable + records; + + public WorkShiftRecord(WorkShift shift,Date date){ + workShift = shift; + this.date = date; + records = new Hashtable(); + + 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); + } +} diff --git a/src/org/hwo/pulscounter/service/PulsCounterService.java b/src/org/hwo/pulscounter/service/PulsCounterService.java new file mode 100644 index 0000000..a02fe54 --- /dev/null +++ b/src/org/hwo/pulscounter/service/PulsCounterService.java @@ -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; + } + + +} diff --git a/src/org/hwo/pulscounter/ui/CheckWorkshiftRecords.java b/src/org/hwo/pulscounter/ui/CheckWorkshiftRecords.java new file mode 100644 index 0000000..4aff814 --- /dev/null +++ b/src/org/hwo/pulscounter/ui/CheckWorkshiftRecords.java @@ -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 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()); + cbChannel.setItems(workShiftRecord.getChannels()); + + selectedWorkShift = workShiftRecord; + } + + void selectChannel(){ + if (selectedWorkShift != null){ + Integer ch = (Integer)cbChannel.getSelectedItem(); + flexibleJTable.setRows(selectedWorkShift.getChannelRecords(ch).getRecords()); + } + } + +} diff --git a/src/org/hwo/pulscounter/ui/InspectionMainFrame.java b/src/org/hwo/pulscounter/ui/InspectionMainFrame.java new file mode 100644 index 0000000..4f21695 --- /dev/null +++ b/src/org/hwo/pulscounter/ui/InspectionMainFrame.java @@ -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.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}; + gbl_panel.rowHeights = new int[]{0, 0}; + gbl_panel.columnWeights = new double[]{0.0, Double.MIN_VALUE}; + gbl_panel.rowWeights = new double[]{0.0, Double.MIN_VALUE}; + panel.setLayout(gbl_panel); + + JButton btnNewButton = new JButton("Schichtdaten prüfen..."); + btnNewButton.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + WorkShift[] shifts = PulsCounter.getInspectorApplication().getWorkShifts(); + Date d = new Date(); + d.addDays(10); + for (int i=0;i<40;i++){ + + for (int s = 0;s