WIP161026

WIP-PC2
Harald Wolff 2016-10-26 19:21:57 +02:00
parent ccf6e4d9f7
commit a7e43ec0b4
15 changed files with 723 additions and 140 deletions

1
.gitignore vendored
View File

@ -7,3 +7,4 @@ chnames.prop
*.log
*.old
*.cfg
synololog-hsql.*

View File

@ -8,6 +8,8 @@ import java.util.Date;
import java.util.Hashtable;
import java.util.Iterator;
import org.hwo.ObjectTable;
import org.hwo.ObjectTable.ObjectSet;
import org.hwo.configuration.ConfigurableAttribute;
import org.hwo.configuration.ConfigurableObject;
import org.hwo.csv.CSV;
@ -117,93 +119,82 @@ public class ExportSetting {
this.recordDelta = recordDelta;
}
private String calculateFileName(String filename,SnapShot ss){
Date d = new Date(((long)ss.getTimestamp())*1000);
private String calculateFileName(String filename, ObjectSet row, int deviceSerial){
Date d = new Date(((long)row.getInteger(0))*1000);
Calendar c = Calendar.getInstance();
c.setTime(d);
filename = filename
.replaceAll("\\%S", String.format("%d", ss.getDeviceSerial()))
.replaceAll("\\%S", String.format("%d", deviceSerial))
.replaceAll("\\%Y", String.format("%04d", new Integer(c.get(Calendar.YEAR))))
.replaceAll("\\%M", String.format("%02d", new Integer(c.get(Calendar.MONTH)+1)))
.replaceAll("\\%D", String.format("%02d", new Integer(c.get(Calendar.DAY_OF_MONTH))));
.replaceAll("\\%D", String.format("%02d", new Integer(c.get(Calendar.DAY_OF_MONTH))))
.replaceAll("\\%h", String.format("%02d", new Integer(c.get(Calendar.HOUR))))
.replaceAll("\\%m", String.format("%02d", new Integer(c.get(Calendar.MINUTE))))
.replaceAll("\\%s", String.format("%02d", new Integer(c.get(Calendar.SECOND))));
log(DEBUG, "exportFileName for Snapshot %s from [%s: %04d-%02d-%02d %02d:%02d:%02d] is %s", ss, ss.getDeviceSerial(), c.get(Calendar.YEAR), c.get(Calendar.MONTH), c.get(Calendar.DAY_OF_MONTH), c.get(Calendar.HOUR_OF_DAY), c.get(Calendar.MINUTE), c.get(Calendar.SECOND),filename);
// log(DEBUG, "exportFileName for Snapshot %s from [%s: %04d-%02d-%02d %02d:%02d:%02d] is %s", ss, ss.getDeviceSerial(), c.get(Calendar.YEAR), c.get(Calendar.MONTH), c.get(Calendar.DAY_OF_MONTH), c.get(Calendar.HOUR_OF_DAY), c.get(Calendar.MINUTE), c.get(Calendar.SECOND),filename);
return filename;
}
public void export(){
Hashtable<String, CSV> hash = new Hashtable<String, CSV>();
for (SnapShot ss: PulsCounterApplication.getApplication().getDatabase().loadSnapshots(0))
{
String fn = calculateFileName(fileName, ss);
if ((triggerType==TriggerType.ALL)||(ss.getTriggerType()==triggerType)){
if (triggerSource.equals(-1) || triggerSource.equals(ss.getSource())){
if (!hash.containsKey(fn)){
hash.put(fn, new CSV());
if (extended){
hash.get(fn).getRecords().add(new CSVRecord(new Object[]{
"Zeitstempel", "Datum/Zeit", "Trigger", "Quelle",
"CH0","CH1","CH2","CH3","CH4","CH5","CH6","CH7",
"CH8","CH9","CH10","CH11","CH12","CH13","CH14","CH15",
"CH16","CH17","CH18","CH19","CH20","CH21","CH22","CH23",
"CH24","CH25","CH26","CH27","CH28","CH29","CH30","CH31",
"AN0","AN1","AN2","AN3","AN4","AN5","AN6","AN7"}));
} else {
hash.get(fn).getRecords().add(new CSVRecord(new Object[]{
"Datum/Zeit",
"CH0","CH1","CH2","CH3","CH4","CH5","CH6","CH7",
"CH8","CH9","CH10","CH11","CH12","CH13","CH14","CH15",
"CH16","CH17","CH18","CH19","CH20","CH21","CH22","CH23",
"CH24","CH25","CH26","CH27","CH28","CH29","CH30","CH31",
"AN0","AN1","AN2","AN3","AN4","AN5","AN6","AN7"}));
}
}
hash.get(fn).getRecords().add(ss.getCSVRecord(extended));
}
}
}
for (String fn: hash.keySet()){
for (int deviceSerial: PulsCounterApplication.getApplication().getDatabase().getKnownDevices()){
ObjectTable ot = PulsCounterApplication.getApplication().getDatabase().getSnapshotsAsTable(deviceSerial);
if (recordDelta){
CSV csv = hash.get(fn);
if (!csv.getRecords().isEmpty()){
Iterator<CSVRecord> iter = csv.getRecords().iterator();
iter.next();
CSVRecord n = iter.next();
Integer[] vals = new Integer[32];
for (int i=0;i<32;i++){
vals[i] = n.getIntegerValue(extended ? i + 4 : i + 1 );
}
while (iter.hasNext()){
n = iter.next();
for (int i=0;i<32;i++){
Integer v = n.getIntegerValue(extended ? i + 4 : i + 1 );
n.setValue(extended ? i + 4 : i + 1 , v - vals[i]);
vals[i] = v;
}
}
csv.getRecords().remove(1);
}
PulsCounterApplication.getApplication().getDatabase().calulateTableDeltas(ot);
}
Hashtable<String, CSV> hash = new Hashtable<String, CSV>();
int[] simpleSelection = new int[]{
1,
4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,
34,35,36,37,38,39,40,41
};
for (ObjectSet row: ot.getRows()){
String fn = calculateFileName(fileName, row, deviceSerial);
if ((triggerType==TriggerType.ALL)||(triggerType.getValue().equals(row.getInteger(2)))){
if (triggerSource.equals(-1) || triggerSource.equals( row.getInteger(3) )){
if (!hash.containsKey(fn)){
hash.put(fn, new CSV());
if (extended){
hash.get(fn).getRecords().add(new CSVRecord(new Object[]{
"Zeitstempel", "Datum/Zeit", "Trigger", "Quelle",
"CH0","CH1","CH2","CH3","CH4","CH5","CH6","CH7",
"CH8","CH9","CH10","CH11","CH12","CH13","CH14","CH15",
"CH16","CH17","CH18","CH19","CH20","CH21","CH22","CH23",
"CH24","CH25","CH26","CH27","CH28","CH29","CH30","CH31",
"AN0","AN1","AN2","AN3","AN4","AN5","AN6","AN7"}));
} else {
hash.get(fn).getRecords().add(new CSVRecord(new Object[]{
"Datum/Zeit",
"CH0","CH1","CH2","CH3","CH4","CH5","CH6","CH7",
"CH8","CH9","CH10","CH11","CH12","CH13","CH14","CH15",
"CH16","CH17","CH18","CH19","CH20","CH21","CH22","CH23",
"CH24","CH25","CH26","CH27","CH28","CH29","CH30","CH31",
"AN0","AN1","AN2","AN3","AN4","AN5","AN6","AN7"}));
}
}
hash.get(fn).getRecords().add(new CSVRecord( extended ? row.getValues() : row.selectColums(simpleSelection)));
}
}
}
for (String fn: hash.keySet()){
hash.get(fn).saveToFile(new File(path,fn));
}
hash.get(fn).saveToFile(new File(path,fn));
}
}

View File

@ -3,6 +3,7 @@ package org.hwo.pulscounter;
import static org.hwo.logging.Logging.log;
import static org.hwo.logging.LogLevel.*;
import java.awt.Component;
import java.awt.EventQueue;
import java.awt.Frame;
import java.io.FileInputStream;
@ -39,6 +40,7 @@ import org.hwo.pulscounter.device.SimulatedCounter;
import org.hwo.pulscounter.ui.AppSettingsListener;
import org.hwo.pulscounter.ui.BatchRunner;
import org.hwo.pulscounter.ui.NewMainWindow;
import org.hwo.pulscounter.ui.ShutdownNotification;
import org.hwo.scheduler.Scheduler;
public class PulsCounterApplication implements ServiceLinkListener{
@ -178,6 +180,8 @@ public class PulsCounterApplication implements ServiceLinkListener{
log(ERROR,"I/O Error reading synololog.cfg");
}
applicationConfiguration.setProperty("ui.class", NewMainWindow.class.getCanonicalName());
}
public Properties getApplicationConfiguration(){
@ -208,14 +212,15 @@ public class PulsCounterApplication implements ServiceLinkListener{
public void start(){
initialize();
String uiClassName = applicationConfiguration.getProperty("ui.class");
Object ui = null;
try {
Class uiClazz = PulsCounterApplication.class.getClassLoader().loadClass(uiClassName);
Constructor<?> constructor = uiClazz.getConstructor(PulsCounterApplication.class);
Object ui = (Object) constructor.newInstance(this);
ui = (Object) constructor.newInstance(this);
} catch (ClassNotFoundException e) {
log(FATAL,"user interface class could not be loaded [%s] %s",uiClassName,e.getMessage());
@ -230,13 +235,21 @@ public class PulsCounterApplication implements ServiceLinkListener{
waitUiFinished();
ShutdownNotification sn = new ShutdownNotification();
if (Component.class.isInstance(ui)){
sn.setLocationRelativeTo((Component)ui);
}
sn.setVisible(true);
try {
shutdown();
} catch (Exception e){
log(e);
}
sn.setVisible(false);
}
private void initialize(){

View File

@ -4,17 +4,26 @@ import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.sql.Array;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import java.util.UUID;
import org.hsqldb.jdbc.JDBCArrayBasic;
import org.hsqldb.types.Type;
import org.hwo.ArrayHelper;
import org.hwo.ObjectTable;
import org.hwo.ObjectTable.ObjectSet;
import org.hwo.pulscounter.PulsCounterApplication;
import org.hwo.pulscounter.SnapShot;
import org.hwo.pulscounter.simplescript.SimpleScript;
import org.hwo.sql.Schema;
import static org.hwo.logging.Logging.*;
import static org.hwo.logging.LogLevel.*;
@ -28,6 +37,10 @@ public class PulsCounterDatabase {
try {
getClass().getClassLoader().loadClass("org.hsqldb.jdbcDriver");
dbConnection = DriverManager.getConnection("jdbc:hsqldb:file:synololog-hsql", "SA", "");
log(INFO,"HSQLDB Version: %s",dbConnection.getMetaData().getDatabaseProductVersion());
Schema schema = new Schema(dbConnection);
schema.print();
} catch (SQLException e) {
e.printStackTrace();
@ -76,11 +89,19 @@ public class PulsCounterDatabase {
try {
PreparedStatement stmt = dbConnection.prepareStatement(query);
int i = 0;
for (int i=0;i<args.length;i++){
stmt.setObject(i+1, args[i]);
try {
for (i=0;i<args.length;i++){
if (Array.class.isInstance(args[i]))
stmt.setArray(i+1, (Array)args[i]);
else
stmt.setObject(i+1, args[i]);
}
} catch (SQLException e){
log(ERROR,"Exception while binding: %d = %s",i,args[i]);
throw e;
}
stmt.execute();
ResultSet result = stmt.getResultSet();
@ -92,6 +113,12 @@ public class PulsCounterDatabase {
} catch (SQLException e) {
log(ERROR,"SQL Statement failed: %s",query);
log(ERROR,"Exception: %s", e.toString());
e.printStackTrace();
if (e.getCause() != null){
log(ERROR,"Caused-By: %s",e.getCause().toString());
e.getCause().printStackTrace();
}
}
return null;
@ -174,10 +201,24 @@ public class PulsCounterDatabase {
}
}
public SnapShot[] loadSnapshots(int fromTimestamp){
public Integer[] getKnownDevices(){
List<Integer> devices = new LinkedList<>();
ResultSet result = executeSimpleSQL("SELECT DISTINCT device FROM snapshots ORDER BY device");
try {
while (result.next()){
devices.add( result.getInt(1));
}
} catch (SQLException e) {
log(e);
}
return devices.toArray(new Integer[0]);
}
public SnapShot[] loadSnapshots(int fromTimestamp,int deviceSerial){
List<SnapShot> snapshots = new LinkedList<>();
ResultSet result = executeSimpleSQL("SELECT id,device,snap_id,timestamp,counters,analogs,inputs,outputs,pullups,inverts,field0 FROM snapshots WHERE timestamp >= ?", fromTimestamp);
ResultSet result = executeSimpleSQL("SELECT id,device,snap_id,timestamp,counters,analogs,inputs,outputs,pullups,inverts,field0 FROM snapshots WHERE timestamp >= ? AND device = ? ORDER BY device,timestamp", fromTimestamp, deviceSerial);
try {
while (result.next()){
@ -192,8 +233,66 @@ public class PulsCounterDatabase {
}
public SimpleScript[] getSimpleScripts(){
return null;
ResultSet result = executeSimpleSQL("SELECT id,name,description,elements FROM scripts");
ArrayList<SimpleScript> r = new ArrayList<>();
try {
while (result.next()){
r.add(new SimpleScript(UUID.fromString(result.getString(1)), result.getString(2), result.getString(3), ArrayHelper.cast((Object[])result.getArray(4).getArray(),new Integer[0])));
}
} catch (SQLException e) {
log(e);
}
return r.toArray(new SimpleScript[0]);
}
public void removeSimpleScript(UUID id){
executeSimpleQueryObject("DELETE FROM scripts WHERE id=?", id);
}
public void storeSimpleScript(SimpleScript simpleScript){
/* executeSimpleQueryObject("MERGE INTO scripts USING (VALUES ?,?,?,?) AS ins(uid,name,desc,elements) ON scripts.id=ins.uid WHEN MATCHED THEN UPDATE SET scripts.name=ins.name,scripts.description=ins.desc,scripts.elements=ins.elements WHEN NOT MATCHED THEN INSERT (id,name,description,elements) VALUES(ins.uid,ins.name,ins.desc,ins.elements)",
simpleScript.getId().toString(),
simpleScript.getName(),
simpleScript.getDescription(),
simpleScript.getSimpleScriptElementsAsInt()
);
*/
executeSimpleSQL("DELETE FROM scripts WHERE id=?",simpleScript.getId());
executeSimpleSQL("INSERT INTO scripts VALUES(?,?,?,?)",
simpleScript.getId(),
simpleScript.getName(),
simpleScript.getDescription(),
simpleScript.getSimpleScriptElementsAsInt()
);
}
public ObjectTable getSnapshotsAsTable(int deviceSerial){
ObjectTable ot = new ObjectTable();
for (SnapShot ss: loadSnapshots(0,deviceSerial)){
ot.add( ss.getCSVRecord(true).getValuesAsArray() );
}
return ot;
}
public void calulateTableDeltas(ObjectTable objectTable){
ObjectSet tmp = objectTable.new ObjectSet();
for (ObjectSet row: objectTable.getRows()){
for (int p=4;p<36;p++){
int i = row.getInteger(p) - tmp.getInteger(p);
tmp.set(p,row.getInteger(p));
row.set(p,i);;
}
}
}
}

View File

@ -8,7 +8,7 @@ create table if not exists props (id uuid primary key,name varchar(255) unique,v
create table if not exists devices (id uuid,serial varchar(12));
create table if not exists snapshots (id uuid,device integer,snap_id integer,timestamp integer,counters integer array[32],analogs integer array[8],inputs integer,outputs integer,pullups integer,inverts integer,field0 integer);
create table if not exists scripts (id uuid primary key,name varchar(128),description text,elements integer ARRAY default ARRAY[]);
create table if not exists scripts (id uuid primary key,name varchar(128),description longvarchar,elements integer ARRAY[512] default ARRAY[]);
delete from props where name='db.schema.version';
insert into props (id,name,value) values(uuid(),'db.schema.version','0');

View File

@ -15,19 +15,32 @@ public class SimpleScript {
public SimpleScript(){
id = UUID.randomUUID();
name = "";
description = "";
name = "SimpleScript";
description = "-";
simpleScriptElements = new ArrayList<>();
simpleScriptElements.add(new SimpleScriptElement(0));
}
public SimpleScript(String name,String description,SimpleScriptElement elements[]){
this.id = UUID.randomUUID();
public SimpleScript(UUID uuid,String name,String description,SimpleScriptElement elements[]){
this.id = uuid;
this.name = name;
this.description = description;
this.simpleScriptElements = new ArrayList<>();
this.simpleScriptElements.addAll(Arrays.asList(elements));
}
public SimpleScript(UUID uuid,String name,String description,Integer[] elementCodes){
this.id = uuid;
this.name = name;
this.description = description;
this.simpleScriptElements = new ArrayList<>();
for (Integer code: elementCodes){
this.simpleScriptElements.add(new SimpleScriptElement(code));
}
}
public UUID getId() {
return id;
}
@ -35,6 +48,7 @@ public class SimpleScript {
this.id = id;
}
@TableColumn(label="name",order=10,width=120)
public String getName() {
return name;
}
@ -42,6 +56,7 @@ public class SimpleScript {
this.name = name;
}
@TableColumn(label="Bezeichnung",order=20)
public String getDescription() {
return description;
}
@ -53,6 +68,20 @@ public class SimpleScript {
return simpleScriptElements;
}
public Integer[] getSimpleScriptElementsAsInt(){
Integer[] sse = new Integer[simpleScriptElements.size()];
for (int i=0;i<sse.length;i++){
sse[i] = simpleScriptElements.get(i).getCode();
}
return sse;
}
public void setSimpleScriptElements(SimpleScriptElement[] elements){
this.simpleScriptElements.clear();
this.simpleScriptElements.addAll(Arrays.asList(elements));
}
public enum ScriptOperation {
@ -188,16 +217,28 @@ public class SimpleScript {
}
@TableColumn(label="A",order=0)
public String getHumanA(){
return SimpleScriptAddress.toString(getA());
}
public int getA(){
return code & 0xff;
}
@TableColumn(label="B",order=10)
public String getHumanB(){
return SimpleScriptAddress.toString(getB());
}
public int getB(){
return (code >> 8) & 0xff;
}
@TableColumn(label="Z",order=90)
public String getHumanZ(){
return SimpleScriptAddress.toString(getZ());
}
public int getZ(){
return (code >> 16) & 0xff;
}
@ -254,6 +295,6 @@ public class SimpleScript {
}
}
}
}

View File

@ -0,0 +1,37 @@
package org.hwo.pulscounter.simplescript;
public class SimpleScriptAddress{
private int address;
public SimpleScriptAddress(){
this.address = 0;
}
public SimpleScriptAddress(int a){
this.address = a;
}
@Override
public String toString() {
return toString(address);
}
public static String toString(int address) {
if (address < 32){
return String.format("Zählerstand %d",address);
} else if (address < 40){
return String.format("Analogspannung %d", address - 32);
} else if (address < 64){
return String.format("Merker %d", address - 40);
} else if (address < 96){
return String.format("PullUp %d", address - 64);
} else if (address < 128){
return String.format("Ausgang %d", address - 96);
} else if (address < 160){
return String.format("Inverter %d", address - 128);
} else {
return String.format("Variable %d", address - 160);
}
}
}

View File

@ -4,6 +4,8 @@ import org.hwo.pulscounter.ExportSetting;
import org.hwo.pulscounter.PulsCounterApplication;
import org.hwo.pulscounter.PulsCounterApplicationListener;
import org.hwo.servicelink.ServiceLinkException;
import static org.hwo.logging.Logging.*;
import static org.hwo.logging.LogLevel.*;
public class BatchRunner implements PulsCounterApplicationListener{
@ -14,45 +16,39 @@ public class BatchRunner implements PulsCounterApplicationListener{
pulsCounterApplication.addPulsCounterApplicationListener(this);
pulsCounterApplication.notifyUiIsFinished(true);
try {
run();
} catch (Exception e){
log(e);
}
// run();
pulsCounterApplication.notifyUiIsFinished(true);
}
public void run(){
/*
try {
for (ExportSetting es: pulsCounterApplication.getExportSettings()){
if (es.getAutostart()){
es.export();
}
PulsCounterApplication.getApplication().checkForSnapShots();
for (ExportSetting es: PulsCounterApplication.getApplication().getExportSettings()){
if (es.getAutostart()){
es.export();
}
} catch (ServiceLinkException e) {
e.printStackTrace();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
*/
pulsCounterApplication.notifyUiIsFinished(false);
}
@Override
public void messageArrived(String message) {
System.err.println(message);
}
@Override
public void interfaceClassesChanged(PulsCounterApplication pulsCounterApplication) {
// TODO Auto-generated method stub
}
@Override
public void interfacesChanged(PulsCounterApplication pulsCounterApplication) {
// TODO Auto-generated method stub
}

View File

@ -70,7 +70,7 @@ public class ExportFilesFrame extends JFrame {
gbc_toolBar.gridy = 0;
contentPane.add(toolBar, gbc_toolBar);
bAdd = new JButton("+");
bAdd = new JButton("Export hinzufügen");
bAdd.setToolTipText("<html>\n<b>Neue Exportkonfiguration hinzufügen</b><br/>\n</html>");
bAdd.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
@ -80,7 +80,7 @@ public class ExportFilesFrame extends JFrame {
});
toolBar.add(bAdd);
bEdit = new JButton("e");
bEdit = new JButton("Einstellungen");
bEdit.setToolTipText("<html>\n<b>Ausgewählte Exportkonfiguration bearbeiten</b>\n</html>");
bEdit.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
@ -95,7 +95,7 @@ public class ExportFilesFrame extends JFrame {
bEdit.setEnabled(false);
toolBar.add(bEdit);
bRemove = new JButton("-");
bRemove = new JButton("Export löschen");
bRemove.setToolTipText("<html>\n<b>Ausgewählte Exportkonfiguration entfernen</b>\n</html>");
bRemove.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
@ -111,7 +111,7 @@ public class ExportFilesFrame extends JFrame {
separator = new JSeparator();
toolBar.add(separator);
btnExec = new JButton("EXEC");
btnExec = new JButton("Export ausführen");
btnExec.setToolTipText("<html>\n<b>Ausgewählte Exportkonfiguration jetzt ausführen</b><br/>\n</html>");
btnExec.setEnabled(false);
btnExec.addActionListener(new ActionListener() {
@ -119,15 +119,15 @@ public class ExportFilesFrame extends JFrame {
doExport();
}
});
toolBar.add(btnExec);
btnBatch = new JButton("BATCH");
btnBatch = new JButton("Automatik");
btnBatch.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
doBatchExport();
}
});
toolBar.add(btnBatch);
toolBar.add(btnExec);
JScrollPane scrollPane = new JScrollPane();
scrollPane.setToolTipText("<html>\n<b>Exportkonfigurationen</b><br/>\nZeigt eine Übersicht über die aktuell vorhandenen Exportkonfigurationen\n</html>");

View File

@ -132,7 +132,7 @@ public class NewMainWindow implements PulsCounterApplicationListener, TaskletLis
try {
// Set cross-platform Java L&F (also called "Metal")
UIManager.setLookAndFeel(
UIManager.setLookAndFeel(
UIManager.getCrossPlatformLookAndFeelClassName());
}
catch (UnsupportedLookAndFeelException e) {
@ -167,27 +167,6 @@ public class NewMainWindow implements PulsCounterApplicationListener, TaskletLis
pulsCounterApplication.addPulsCounterApplicationListener(this);
if (false){
this.connected = false;
knownTasklets = new DefaultListModel<Tasklet>();
lTasklets.setModel(knownTasklets);
TaskletManager.instance().addTaskletListener(this);
messageListModel = new DefaultListModel<String>();
lMessages.setModel(messageListModel);
timerReconnect = new Timer("ReconnectThread",true);
application().addPulsCounterApplicationListener(this);
application().message("Synololog Applikation wurde gestartet.");
}
frmSynolog.addWindowListener(new WindowAdapter() {
@Override
@ -334,8 +313,9 @@ public class NewMainWindow implements PulsCounterApplicationListener, TaskletLis
btnSkripte = new JButton("Skripte");
btnSkripte.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
SimpleScriptEditor editor = new SimpleScriptEditor();
editor.setVisible(true);
SimpleScriptSetup sss = new SimpleScriptSetup();
sss.setLocationRelativeTo(frmSynolog);
sss.setVisible(true);
}
});
toolBar.add(btnSkripte);

View File

@ -0,0 +1,38 @@
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 javax.swing.JLabel;
import java.awt.Dialog.ModalExclusionType;
import java.awt.Window.Type;
import java.awt.Font;
import javax.swing.SwingConstants;
public class ShutdownNotification extends JFrame {
private JPanel contentPane;
/**
* Create the frame.
*/
public ShutdownNotification() {
setModalExclusionType(ModalExclusionType.APPLICATION_EXCLUDE);
setTitle("Synolo-Log Software wird beendet");
setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
setBounds(100, 100, 770, 162);
contentPane = new JPanel();
contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
contentPane.setLayout(new BorderLayout(0, 0));
setContentPane(contentPane);
JLabel lblEinenMomentBittedie = new JLabel("<html>Einen Moment bitte.<br/>Die Synolo-Log Software wartet noch auf die Fertigstellung von Hintergrunddiensten...</html>");
lblEinenMomentBittedie.setHorizontalAlignment(SwingConstants.CENTER);
lblEinenMomentBittedie.setFont(new Font("DejaVu Sans", Font.BOLD | Font.ITALIC, 14));
contentPane.add(lblEinenMomentBittedie, BorderLayout.CENTER);
}
}

View File

@ -0,0 +1,75 @@
package org.hwo.pulscounter.ui;
import javax.swing.JPanel;
import java.awt.GridBagLayout;
import javax.swing.JComboBox;
import java.awt.GridBagConstraints;
import java.awt.Insets;
import javax.swing.JSpinner;
public class SimpleScriptAddressEditor extends JPanel {
AddressRange[] addressRanges = new AddressRange[]{
new AddressRange("Zähler", 0, 32),
new AddressRange("Analogspannung", 32, 8),
new AddressRange("Merker", 40, 24),
new AddressRange("PullUp Status", 64, 32),
new AddressRange("Ausgang", 96, 32),
new AddressRange("Inverter", 128, 32),
new AddressRange("Variable", 160, 96)
};
/**
* Create the panel.
*/
public SimpleScriptAddressEditor() {
GridBagLayout gridBagLayout = new GridBagLayout();
gridBagLayout.columnWidths = new int[]{0, 0, 0};
gridBagLayout.rowHeights = new int[]{0, 0};
gridBagLayout.columnWeights = new double[]{1.0, 1.0, Double.MIN_VALUE};
gridBagLayout.rowWeights = new double[]{1.0, Double.MIN_VALUE};
setLayout(gridBagLayout);
JComboBox comboBox = new JComboBox();
GridBagConstraints gbc_comboBox = new GridBagConstraints();
gbc_comboBox.insets = new Insets(0, 0, 0, 5);
gbc_comboBox.fill = GridBagConstraints.BOTH;
gbc_comboBox.gridx = 0;
gbc_comboBox.gridy = 0;
add(comboBox, gbc_comboBox);
JSpinner spinner = new JSpinner();
GridBagConstraints gbc_spinner = new GridBagConstraints();
gbc_spinner.fill = GridBagConstraints.BOTH;
gbc_spinner.gridx = 1;
gbc_spinner.gridy = 0;
add(spinner, gbc_spinner);
}
private class AddressRange{
private String name;
private int base;
private int size;
public AddressRange(String name,int base,int size){
this.name = name;
this.size = size;
this.base = base;
}
public int getBase() {
return base;
}
public int getSize() {
return size;
}
public String getName() {
return name;
}
}
}

View File

@ -1,6 +1,7 @@
package org.hwo.pulscounter.ui;
import java.awt.BorderLayout;
import java.awt.Component;
import java.awt.FlowLayout;
import javax.swing.JButton;
@ -24,9 +25,30 @@ import javax.swing.JLabel;
import java.awt.Insets;
import javax.swing.JTextField;
import javax.swing.JTextArea;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import java.awt.Dialog.ModalExclusionType;
import java.awt.Dialog.ModalityType;
public class SimpleScriptEditor extends JDialog {
public static boolean show(SimpleScript simpleScript){
return show(null,simpleScript);
}
public static boolean show(Component parent,SimpleScript simpleScript){
SimpleScriptEditor sse = new SimpleScriptEditor();
sse.setSimpleScript(simpleScript);
if (parent != null){
sse.setLocationRelativeTo(parent);
}
sse.setVisible(true);
return sse.isAccepted();
}
private SimpleScript simpleScript;
private boolean accepted;
@ -39,6 +61,8 @@ public class SimpleScriptEditor extends JDialog {
* Create the dialog.
*/
public SimpleScriptEditor() {
setModalityType(ModalityType.APPLICATION_MODAL);
setModalExclusionType(ModalExclusionType.APPLICATION_EXCLUDE);
setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
setBounds(100, 100, 921, 474);
getContentPane().setLayout(new BorderLayout());
@ -94,7 +118,6 @@ public class SimpleScriptEditor extends JDialog {
JScrollPane scrollPane = new JScrollPane();
GridBagConstraints gbc_scrollPane = new GridBagConstraints();
gbc_scrollPane.gridwidth = 2;
gbc_scrollPane.insets = new Insets(0, 0, 0, 5);
gbc_scrollPane.fill = GridBagConstraints.BOTH;
gbc_scrollPane.gridx = 0;
gbc_scrollPane.gridy = 2;
@ -110,12 +133,22 @@ public class SimpleScriptEditor extends JDialog {
getContentPane().add(buttonPane, BorderLayout.SOUTH);
{
JButton okButton = new JButton("OK");
okButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
accept();
}
});
okButton.setActionCommand("OK");
buttonPane.add(okButton);
getRootPane().setDefaultButton(okButton);
}
{
JButton cancelButton = new JButton("Cancel");
cancelButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
cancel();
}
});
cancelButton.setActionCommand("Cancel");
buttonPane.add(cancelButton);
}
@ -126,6 +159,11 @@ public class SimpleScriptEditor extends JDialog {
}
private void accept(){
simpleScript.setName(tfName.getText());
simpleScript.setDescription(taDescription.getText());
accepted = true;
setVisible(false);
}
@ -138,16 +176,15 @@ public class SimpleScriptEditor extends JDialog {
}
private void initialize(){
if (simpleScript == null){
simpleScript = new SimpleScript("Ein Skript", "Eine Beschreibung", new SimpleScriptElement[]{
new SimpleScriptElement(),
new SimpleScriptElement()
});
if (this.simpleScript == null){
this.simpleScript = new SimpleScript();
}
tfName.setText(simpleScript.getName());
taDescription.setText(simpleScript.getDescription());
mtScriptElements.getTableMapper().setRows(simpleScript.getSimpleScriptElements());
mtScriptElements.getTableMapper().setRows(simpleScript.getSimpleScriptElements().toArray(new SimpleScriptElement[0]));
mtScriptElements.getTableMapper().setSortingEnabled(false);
}
public SimpleScript getSimpleScript(){

View File

@ -0,0 +1,80 @@
package org.hwo.pulscounter.ui;
import java.awt.BorderLayout;
import java.awt.Component;
import java.awt.FlowLayout;
import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;
import org.hwo.pulscounter.simplescript.SimpleScript.SimpleScriptElement;
import java.awt.Dialog.ModalExclusionType;
import java.awt.Dialog.ModalityType;
public class SimpleScriptElementEditor extends JDialog {
public static boolean show(Component parent,SimpleScriptElement simpleScriptElement){
return false;
}
private SimpleScriptElement simpleScriptElement;
private boolean accepted;
private final JPanel contentPanel = new JPanel();
/**
* Create the dialog.
*/
public SimpleScriptElementEditor() {
setTitle("Skriptelement bearbeiten");
setModalityType(ModalityType.APPLICATION_MODAL);
setModalExclusionType(ModalExclusionType.APPLICATION_EXCLUDE);
setBounds(100, 100, 519, 370);
getContentPane().setLayout(new BorderLayout());
contentPanel.setLayout(new FlowLayout());
contentPanel.setBorder(new EmptyBorder(5, 5, 5, 5));
getContentPane().add(contentPanel, BorderLayout.CENTER);
{
JPanel buttonPane = new JPanel();
buttonPane.setLayout(new FlowLayout(FlowLayout.RIGHT));
getContentPane().add(buttonPane, BorderLayout.SOUTH);
{
JButton okButton = new JButton("OK");
okButton.setActionCommand("OK");
buttonPane.add(okButton);
getRootPane().setDefaultButton(okButton);
}
{
JButton cancelButton = new JButton("Cancel");
cancelButton.setActionCommand("Cancel");
buttonPane.add(cancelButton);
}
}
}
public SimpleScriptElement getSimpleScriptElement() {
return simpleScriptElement;
}
public void setSimpleScriptElement(SimpleScriptElement simpleScriptElement) {
this.simpleScriptElement = simpleScriptElement;
}
private void accept(){
accepted = true;
setVisible(false);
}
private void cancel(){
setVisible(false);
}
public boolean isAccepted() {
return accepted;
}
}

View File

@ -0,0 +1,195 @@
package org.hwo.pulscounter.ui;
import static org.hwo.logging.LogLevel.*;
import java.awt.BorderLayout;
import java.awt.EventQueue;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
import java.awt.GridBagLayout;
import java.awt.GridBagConstraints;
import java.awt.Insets;
import java.util.ArrayList;
import java.util.Arrays;
import javax.swing.border.BevelBorder;
import javax.swing.JButton;
import java.awt.FlowLayout;
import org.hwo.models.TableMapper.TableMapper;
import org.hwo.models.TableMapper.TableMapperListener;
import org.hwo.pulscounter.PulsCounterApplication;
import org.hwo.pulscounter.simplescript.SimpleScript;
import org.hwo.ui.JMappedTable;
import javax.swing.JScrollPane;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import static org.hwo.logging.Logging.*;
import java.awt.BorderLayout;
import java.awt.EventQueue;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
import java.awt.GridBagLayout;
import java.awt.GridBagConstraints;
import java.awt.Insets;
import java.util.ArrayList;
import java.util.Arrays;
import javax.swing.border.BevelBorder;
import javax.swing.JButton;
import java.awt.FlowLayout;
import org.hwo.models.TableMapper.TableMapper;
import org.hwo.models.TableMapper.TableMapperListener;
import org.hwo.pulscounter.PulsCounterApplication;
import org.hwo.pulscounter.simplescript.SimpleScript;
import org.hwo.ui.JMappedTable;
import javax.swing.JScrollPane;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
public class SimpleScriptSetup extends JFrame {
private JPanel contentPane;
private JMappedTable scriptTable;
private ArrayList<SimpleScript> simpleScripts;
private JButton btnEntfernen;
private JButton btnBearbeiten;
private JButton btnNeu;
public SimpleScriptSetup() {
setTitle("Formeln");
setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
setBounds(100, 100, 831, 406);
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, 1.0, 0.0, Double.MIN_VALUE};
contentPane.setLayout(gbl_contentPane);
JPanel panel = new JPanel();
FlowLayout flowLayout = (FlowLayout) panel.getLayout();
flowLayout.setAlignment(FlowLayout.LEFT);
panel.setBorder(new BevelBorder(BevelBorder.LOWERED, null, null, 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);
btnNeu = new JButton("neu...");
btnNeu.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
scriptTable.getTableMapper().addRow(new SimpleScript());
}
});
panel.add(btnNeu);
btnBearbeiten = new JButton("bearbeiten...");
btnBearbeiten.setEnabled(false);
panel.add(btnBearbeiten);
btnEntfernen = new JButton("entfernen");
btnEntfernen.setEnabled(false);
btnEntfernen.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
SimpleScript sscript = scriptTable.getTableMapper().getSelectedRow(SimpleScript.class);
PulsCounterApplication.getApplication().getDatabase().removeSimpleScript( sscript.getId() );
scriptTable.getTableMapper().removeRow(sscript);
}
});
panel.add(btnEntfernen);
JScrollPane scrollPane = new JScrollPane();
GridBagConstraints gbc_scrollPane = new GridBagConstraints();
gbc_scrollPane.fill = GridBagConstraints.BOTH;
gbc_scrollPane.insets = new Insets(0, 0, 5, 0);
gbc_scrollPane.gridx = 0;
gbc_scrollPane.gridy = 1;
contentPane.add(scrollPane, gbc_scrollPane);
scriptTable = new JMappedTable(SimpleScript.class);
scrollPane.setViewportView(scriptTable);
JPanel panel_1 = new JPanel();
FlowLayout flowLayout_1 = (FlowLayout) panel_1.getLayout();
flowLayout_1.setAlignment(FlowLayout.RIGHT);
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);
JButton btnSchliessen = new JButton("schliessen");
btnSchliessen.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
setVisible(false);
}
});
panel_1.add(btnSchliessen);
initialize();
}
private void initialize(){
this.simpleScripts = new ArrayList<>();
this.simpleScripts.addAll(Arrays.asList(PulsCounterApplication.getApplication().getDatabase().getSimpleScripts()));
this.scriptTable.getTableMapper().setRows(simpleScripts);
this.scriptTable.getTableMapper().setReadOnly(true);
this.scriptTable.getTableMapper().setEditorEnabled(true);
this.scriptTable.getTableMapper().addListSelectionListener(new ListSelectionListener() {
@Override
public void valueChanged(ListSelectionEvent e) {
if (scriptTable.getTableMapper().getSelectedRow() == null){
btnBearbeiten.setEnabled(false);
btnEntfernen.setEnabled(false);
} else {
btnBearbeiten.setEnabled(true);
btnEntfernen.setEnabled(true);
}
}
});
this.scriptTable.getTableMapper().addTableMapperListener(new TableMapperListener() {
@Override
public boolean editorRequest(TableMapper tableMapper, Object row) {
if (row != null){
if (SimpleScriptEditor.show(SimpleScriptSetup.this,(SimpleScript)row)){
log(INFO,"store SimpleScript");
PulsCounterApplication.getApplication().getDatabase().storeSimpleScript((SimpleScript)row);
}
return true;
}
return false;
}
@Override
public void ValueChanged(int row, int column) {
// TODO Auto-generated method stub
}
});
}
}