Skip to content
Projects
Groups
Snippets
Help
Loading...
Sign in
Toggle navigation
S
sfp-plus-i2c
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
9
Issues
9
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
Wiki
Wiki
image/svg+xml
Discourse
Discourse
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Commits
Issue Boards
Open sidebar
Projects
sfp-plus-i2c
Commits
f1fe12db
Commit
f1fe12db
authored
Mar 07, 2017
by
Vincent van Beveren
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Finished selecting of values
Can now choose update interval Can now save to file
parent
3dc0a5ff
Hide whitespace changes
Inline
Side-by-side
Showing
8 changed files
with
331 additions
and
26 deletions
+331
-26
ExtendedAbstractAction.java
...park/src/nl/nikhef/safaripark/ExtendedAbstractAction.java
+16
-0
Monitor.java
sw/safaripark/src/nl/nikhef/safaripark/monitor/Monitor.java
+210
-2
MonitorModel.java
...ripark/src/nl/nikhef/safaripark/monitor/MonitorModel.java
+71
-11
media-playback-stop-2.png
...rk/src/nl/nikhef/safaripark/res/media-playback-stop-2.png
+0
-0
media-record-2.png
...afaripark/src/nl/nikhef/safaripark/res/media-record-2.png
+0
-0
table-gear.png
sw/safaripark/src/nl/nikhef/safaripark/res/table-gear.png
+0
-0
table-save.png
sw/safaripark/src/nl/nikhef/safaripark/res/table-save.png
+0
-0
ValueSelectionPane.java
...park/src/nl/nikhef/safaripark/vsp/ValueSelectionPane.java
+34
-13
No files found.
sw/safaripark/src/nl/nikhef/safaripark/ExtendedAbstractAction.java
0 → 100644
View file @
f1fe12db
package
nl
.
nikhef
.
safaripark
;
import
javax.swing.AbstractAction
;
import
javax.swing.Action
;
import
javax.swing.Icon
;
@SuppressWarnings
(
"serial"
)
public
abstract
class
ExtendedAbstractAction
extends
AbstractAction
{
public
ExtendedAbstractAction
(
String
name
,
Icon
icon
,
String
shortDescription
)
{
super
(
name
,
icon
);
putValue
(
Action
.
SHORT_DESCRIPTION
,
shortDescription
);
}
}
\ No newline at end of file
sw/safaripark/src/nl/nikhef/safaripark/monitor/Monitor.java
View file @
f1fe12db
package
nl
.
nikhef
.
safaripark
.
monitor
;
import
java.awt.BorderLayout
;
import
java.awt.Dimension
;
import
java.awt.event.ActionEvent
;
import
java.awt.event.ActionListener
;
import
java.io.File
;
import
java.io.FileNotFoundException
;
import
java.io.FileWriter
;
import
java.io.PrintWriter
;
import
java.text.DateFormat
;
import
java.text.SimpleDateFormat
;
import
java.util.Date
;
import
javax.swing.Action
;
import
javax.swing.JFileChooser
;
import
javax.swing.JLabel
;
import
javax.swing.JPanel
;
import
javax.swing.JScrollPane
;
import
javax.swing.JSpinner
;
import
javax.swing.JTable
;
import
javax.swing.JToolBar
;
import
javax.swing.SpinnerListModel
;
import
javax.swing.SpinnerModel
;
import
javax.swing.SpinnerNumberModel
;
import
javax.swing.Timer
;
import
javax.swing.UIManager
;
import
javax.swing.event.ChangeEvent
;
import
javax.swing.event.ChangeListener
;
import
javax.swing.filechooser.FileNameExtensionFilter
;
import
javax.swing.table.DefaultTableCellRenderer
;
import
javax.swing.table.TableColumnModel
;
import
nl.nikhef.safaripark.ExtendedAbstractAction
;
import
nl.nikhef.safaripark.res.Resources
;
import
nl.nikhef.safaripark.vsp.ValueSelectionPane
;
import
nl.nikhef.sfp.ddmi.DDMI
;
import
nl.nikhef.sfp.ddmi.DDMIElement
;
import
nl.nikhef.sfp.ddmi.DDMIValue
;
import
nl.nikhef.tools.Filter
;
@SuppressWarnings
(
"serial"
)
public
class
Monitor
extends
JPanel
implements
ActionListener
{
public
class
Monitor
extends
JPanel
implements
ActionListener
,
ChangeListener
{
private
JTable
_table
;
private
JToolBar
_tbar
;
private
Timer
_timer
;
private
ValueSelectionPane
_vsp
;
private
JFileChooser
_fcStore
;
private
DateFormat
_fileDateFormat
=
new
SimpleDateFormat
(
"yyMMdd_HHmmss"
);
private
PrintWriter
_logFile
;
private
static
class
Rate
{
private
final
String
name
;
private
final
int
interval
;
public
Rate
(
String
name
,
int
interval
)
{
this
.
interval
=
interval
;
this
.
name
=
name
;
}
@Override
public
String
toString
()
{
return
this
.
name
;
}
@Override
public
int
hashCode
()
{
final
int
prime
=
31
;
int
result
=
1
;
result
=
prime
*
result
+
interval
;
return
result
;
}
@Override
public
boolean
equals
(
Object
obj
)
{
if
(
this
==
obj
)
return
true
;
if
(
obj
==
null
)
return
false
;
if
(
getClass
()
!=
obj
.
getClass
())
return
false
;
Rate
other
=
(
Rate
)
obj
;
if
(
interval
!=
other
.
interval
)
return
false
;
return
true
;
}
}
private
Rate
[]
updateRates
=
new
Rate
[]
{
new
Rate
(
"1 second"
,
1
),
new
Rate
(
"2 seconds"
,
2
),
new
Rate
(
"5 seconds"
,
5
),
new
Rate
(
"10 seconds"
,
10
),
new
Rate
(
"30 seconds"
,
30
),
new
Rate
(
"1 minute"
,
60
),
new
Rate
(
"5 minutes"
,
300
),
new
Rate
(
"10 minutes"
,
600
)
};
private
JSpinner
_interval
;
private
Action
_selectColumns
=
new
ExtendedAbstractAction
(
"Columns"
,
Resources
.
getIcon
(
"table-gear"
),
"Select which columns to show and log"
)
{
@Override
public
void
actionPerformed
(
ActionEvent
e
)
{
_vsp
.
setSelection
(
_mm
.
getColumns
());
if
(
_vsp
.
showModel
(
Monitor
.
this
))
{
_mm
.
setColumns
(
_vsp
.
getSelection
());
}
}
};
private
Action
_recData
=
new
ExtendedAbstractAction
(
"Record"
,
Resources
.
getIcon
(
"media-record-2"
),
"Record data to file"
)
{
@Override
public
void
actionPerformed
(
ActionEvent
e
)
{
startRecord
();
}
};
private
Action
_stopData
=
new
ExtendedAbstractAction
(
"Stop"
,
Resources
.
getIcon
(
"media-playback-stop-2"
),
"Stop recording data to file"
)
{
@Override
public
void
actionPerformed
(
ActionEvent
e
)
{
stopRecord
();
}
};
private
MonitorModel
_mm
;
public
Monitor
()
{
...
...
@@ -45,18 +151,120 @@ public class Monitor extends JPanel implements ActionListener {
JScrollPane
sp
=
new
JScrollPane
(
_table
);
_tbar
=
new
JToolBar
(
"Monitor"
);
_tbar
.
add
(
_selectColumns
);
_tbar
.
add
(
_recData
);
_tbar
.
add
(
_stopData
);
_stopData
.
setEnabled
(
false
);
_tbar
.
addSeparator
();
_tbar
.
add
(
new
JLabel
(
" Update rate "
));
_interval
=
new
JSpinner
(
new
SpinnerListModel
(
updateRates
));
_interval
.
setValue
(
updateRates
[
2
]);
((
JSpinner
.
DefaultEditor
)
_interval
.
getEditor
()).
getTextField
().
setEditable
(
false
);
Dimension
d
=
_interval
.
getPreferredSize
();
d
.
width
=
100
;
_interval
.
setPreferredSize
(
d
);
_interval
.
setMaximumSize
(
d
);
_tbar
.
add
(
_interval
);
_interval
.
addChangeListener
(
this
);
_tbar
.
setFloatable
(
false
);
_vsp
=
new
ValueSelectionPane
();
_vsp
.
init
(
new
Filter
<
DDMIElement
>()
{
@Override
public
boolean
match
(
DDMIElement
other
)
{
if
(!(
other
instanceof
DDMIValue
))
{
return
false
;
}
DDMIValue
v
=
DDMIValue
.
class
.
cast
(
other
);
return
v
.
isMonitor
();
}
@Override
public
Class
<
DDMIElement
>
getFilterClass
()
{
return
DDMIElement
.
class
;
}
},
"monitor_cols"
);
add
(
_tbar
,
BorderLayout
.
NORTH
);
add
(
sp
,
BorderLayout
.
CENTER
);
_fcStore
=
new
JFileChooser
();
FileNameExtensionFilter
filter
=
new
FileNameExtensionFilter
(
"Column Separated Values"
,
"csv"
);
_fcStore
.
setFileFilter
(
filter
);
_fcStore
.
setFileSelectionMode
(
JFileChooser
.
FILES_ONLY
);
_fcStore
.
setDialogTitle
(
"Specify name of recording file"
);
_timer
=
new
Timer
(
5000
,
this
);
_timer
.
setRepeats
(
true
);
_timer
.
start
();
}
private
void
startRecord
()
{
String
filename
=
"sfpdata_"
+
_fileDateFormat
.
format
(
new
Date
())
+
".csv"
;
_fcStore
.
setSelectedFile
(
new
File
(
filename
));
if
(
_fcStore
.
showSaveDialog
(
Monitor
.
this
)
!=
JFileChooser
.
APPROVE_OPTION
)
return
;
try
{
_logFile
=
new
PrintWriter
(
_fcStore
.
getSelectedFile
());
_mm
.
writeHeader
(
_logFile
);
}
catch
(
FileNotFoundException
e
)
{
// TODO logging and error stuff
e
.
printStackTrace
();
if
(
_logFile
!=
null
)
{
try
{
_logFile
.
close
();
}
catch
(
Exception
e2
)
{};
_logFile
=
null
;
}
return
;
}
_recData
.
setEnabled
(
false
);
_stopData
.
setEnabled
(
true
);
_selectColumns
.
setEnabled
(
false
);
_interval
.
setEnabled
(
false
);
}
private
void
stopRecord
()
{
if
(
_logFile
!=
null
)
{
_logFile
.
close
();
_logFile
=
null
;
}
_recData
.
setEnabled
(
true
);
_stopData
.
setEnabled
(
false
);
_selectColumns
.
setEnabled
(
true
);
_interval
.
setEnabled
(
true
);
}
@Override
public
void
actionPerformed
(
ActionEvent
e
)
{
_mm
.
fireTableDataChangedPreserveSelect
();
_mm
.
updateData
();
if
(
_logFile
!=
null
)
{
_mm
.
writeData
(
_logFile
);
}
}
@Override
public
void
stateChanged
(
ChangeEvent
e
)
{
_timer
.
setInitialDelay
(
Rate
.
class
.
cast
(
_interval
.
getValue
()).
interval
*
1000
);
_timer
.
setDelay
(
Rate
.
class
.
cast
(
_interval
.
getValue
()).
interval
*
1000
);
_timer
.
restart
();
}
}
sw/safaripark/src/nl/nikhef/safaripark/monitor/MonitorModel.java
View file @
f1fe12db
package
nl
.
nikhef
.
safaripark
.
monitor
;
import
java.io.IOException
;
import
java.io.PrintWriter
;
import
java.util.ArrayList
;
import
java.util.List
;
import
java.util.SortedSet
;
...
...
@@ -35,6 +36,7 @@ public class MonitorModel extends AbstractTableModel implements SFPDeviceListene
final
SFPDevice
dev
;
final
int
bay
;
DDMIContext
ctx
;
private
String
[]
data
;
public
DevAndBay
(
SFPDevice
dev
,
int
bay
)
throws
IOException
{
...
...
@@ -68,6 +70,15 @@ public class MonitorModel extends AbstractTableModel implements SFPDeviceListene
}
public
List
<
DDMIValue
>
getColumns
()
{
return
_columns
;
}
public
void
setColumns
(
List
<
DDMIValue
>
columns
)
{
_columns
=
columns
;
fireTableStructureChanged
();
}
@Override
public
int
getColumnCount
()
{
return
_columns
.
size
()
+
1
;
...
...
@@ -84,6 +95,35 @@ public class MonitorModel extends AbstractTableModel implements SFPDeviceListene
return
_rows
.
size
();
}
public
void
updateData
()
{
for
(
int
i
=
0
;
i
<
_rows
.
size
();
i
++)
{
DevAndBay
dab
=
_rows
.
get
(
i
);
if
(
dab
.
data
==
null
||
dab
.
data
.
length
!=
_columns
.
size
())
{
dab
.
data
=
new
String
[
_columns
.
size
()];
}
for
(
int
j
=
0
;
j
<
_columns
.
size
();
j
++)
{
DDMIValue
val
=
_columns
.
get
(
j
);
if
(
val
.
isValid
(
dab
.
ctx
))
{
try
{
dab
.
data
[
j
]
=
val
.
getValueAsSting
(
dab
.
ctx
);
}
catch
(
Exception
e
)
{
dab
.
data
[
j
]
=
"?"
;
}
}
else
{
dab
.
data
[
j
]
=
"-"
;
}
}
}
fireTableDataChangedPreserveSelect
();
}
@Override
public
Object
getValueAt
(
int
row
,
int
col
)
{
...
...
@@ -92,19 +132,12 @@ public class MonitorModel extends AbstractTableModel implements SFPDeviceListene
if
(
col
==
0
)
{
return
dab
.
dev
.
getModuleSerial
(
dab
.
bay
);
}
else
{
DDMIValue
val
=
_columns
.
get
(
col
-
1
);
if
(
val
.
isValid
(
dab
.
ctx
))
{
try
{
return
val
.
getValueAsSting
(
dab
.
ctx
);
}
catch
(
Exception
e
)
{
return
"?"
;
}
}
else
{
return
"-"
;
if
(
dab
.
data
!=
null
&&
(
col
-
1
)
<
dab
.
data
.
length
)
{
return
dab
.
data
[
col
-
1
];
}
return
"?"
;
}
}
...
...
@@ -170,6 +203,33 @@ public class MonitorModel extends AbstractTableModel implements SFPDeviceListene
dev
.
removeDeviceListener
(
this
);
}
public
void
writeHeader
(
PrintWriter
logFile
)
{
logFile
.
print
(
"Module Serial"
);
for
(
DDMIValue
val
:
_columns
)
{
logFile
.
print
(
";"
+
val
.
getName
());
}
logFile
.
println
();
}
public
void
writeData
(
PrintWriter
logFile
)
{
for
(
int
i
=
0
;
i
<
_rows
.
size
();
i
++)
{
DevAndBay
dab
=
_rows
.
get
(
i
);
logFile
.
print
(
dab
.
dev
.
getModuleSerial
(
dab
.
bay
));
for
(
int
j
=
0
;
j
<
_columns
.
size
();
j
++)
{
logFile
.
print
(
";"
);
logFile
.
print
(
dab
.
data
[
j
]);
}
logFile
.
println
();
}
}
}
sw/safaripark/src/nl/nikhef/safaripark/res/media-playback-stop-2.png
0 → 100644
View file @
f1fe12db
653 Bytes
sw/safaripark/src/nl/nikhef/safaripark/res/media-record-2.png
0 → 100644
View file @
f1fe12db
1.08 KB
sw/safaripark/src/nl/nikhef/safaripark/res/table-gear.png
0 → 100644
View file @
f1fe12db
1.16 KB
sw/safaripark/src/nl/nikhef/safaripark/res/table-save.png
0 → 100644
View file @
f1fe12db
1.16 KB
sw/safaripark/src/nl/nikhef/safaripark/vsp/ValueSelectionPane.java
View file @
f1fe12db
...
...
@@ -18,11 +18,10 @@ import java.util.Vector;
import
java.util.prefs.BackingStoreException
;
import
java.util.prefs.Preferences
;
import
javax.swing.AbstractAction
;
import
javax.swing.Action
;
import
javax.swing.DefaultComboBoxModel
;
import
javax.swing.Icon
;
import
javax.swing.JComboBox
;
import
javax.swing.JComponent
;
import
javax.swing.JFrame
;
import
javax.swing.JLabel
;
import
javax.swing.JOptionPane
;
...
...
@@ -35,6 +34,7 @@ import javax.swing.UnsupportedLookAndFeelException;
import
javax.swing.tree.DefaultMutableTreeNode
;
import
javax.swing.tree.DefaultTreeModel
;
import
nl.nikhef.safaripark.ExtendedAbstractAction
;
import
nl.nikhef.safaripark.res.Resources
;
import
nl.nikhef.sfp.ddmi.DDMI
;
import
nl.nikhef.sfp.ddmi.DDMIElement
;
...
...
@@ -55,16 +55,7 @@ public class ValueSelectionPane extends JPanel implements ItemListener {
private
Map
<
String
,
CheckableTreeNode
>
_pathMapping
=
new
HashMap
<
String
,
CheckableTreeNode
>();
private
boolean
_ignorePresetEvents
=
false
;
private
abstract
class
ExtendedAbstractAction
extends
AbstractAction
{
public
ExtendedAbstractAction
(
String
name
,
Icon
icon
,
String
shortDescription
)
{
super
(
name
,
icon
);
putValue
(
Action
.
SHORT_DESCRIPTION
,
shortDescription
);
}
}
@SuppressWarnings
(
"serial"
)
private
Action
_saveAction
=
new
ExtendedAbstractAction
(
"Save"
,
Resources
.
getIcon
(
"disk"
),
"Save preset"
)
{
@Override
...
...
@@ -114,6 +105,7 @@ public class ValueSelectionPane extends JPanel implements ItemListener {
};
@SuppressWarnings
(
"serial"
)
private
Action
_deleteAction
=
new
ExtendedAbstractAction
(
"Delete"
,
Resources
.
getIcon
(
"bin-delete"
),
"Delete current preset"
)
{
@Override
...
...
@@ -298,7 +290,7 @@ public class ValueSelectionPane extends JPanel implements ItemListener {
}
public
Collection
<
DDMIValue
>
getSelection
()
public
List
<
DDMIValue
>
getSelection
()
{
List
<
DDMIValue
>
values
=
new
ArrayList
<
DDMIValue
>();
...
...
@@ -321,8 +313,25 @@ public class ValueSelectionPane extends JPanel implements ItemListener {
}
}
}
private
void
crawlSetSelected
(
CheckableTreeNode
tn
,
Collection
<
DDMIValue
>
values
)
{
for
(
int
i
=
0
;
i
<
tn
.
getChildCount
();
i
++)
{
CheckableTreeNode
child
=
CheckableTreeNode
.
class
.
cast
(
tn
.
getChildAt
(
i
));
if
(
child
.
isLeaf
())
{
if
(
values
.
contains
(
child
.
getUserObject
()))
{
child
.
check
();
}
else
{
child
.
uncheck
();
}
}
else
{
crawlSetSelected
(
child
,
values
);
}
}
}
static
ValueSelectionPane
vsp
;
public
static
void
main
(
String
[]
args
)
{
...
...
@@ -409,4 +418,16 @@ public class ValueSelectionPane extends JPanel implements ItemListener {
updateActions
();
}
public
boolean
showModel
(
JComponent
parent
)
{
return
JOptionPane
.
showOptionDialog
(
parent
,
new
JComponent
[]
{
this
},
"Select elements"
,
JOptionPane
.
OK_CANCEL_OPTION
,
JOptionPane
.
INFORMATION_MESSAGE
,
null
,
null
,
null
)
==
JOptionPane
.
OK_OPTION
;
}
public
void
setSelection
(
List
<
DDMIValue
>
columns
)
{
crawlSetSelected
(
_root
,
columns
);
}
}
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment