package dongfang.mkt.ui.offscreendisplay;
import java.awt.BorderLayout;
import java.awt.Font;
import java.awt.GridLayout;
import java.util.Formatter;
import java.util.Locale;
import java.util.Timer;
import java.util.TimerTask;
import javax.swing.BorderFactory;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JProgressBar;
import javax.swing.JSlider;
import javax.swing.border.Border;
import dongfang.mkt.frames.OSDDataResponseFrame;
public class VariousInfoPane
extends JPanel implements OSDDataConsumer
{
static class BigLabel
extends JLabel {
public BigLabel
() {
super();
setFont
(getFont
().
deriveFont(Font.
BOLD,
16));
}
}
class PositionsPanel
extends JPanel implements OSDDataConsumer
{
class CurrentPositionPanel
extends JPanel {
BigLabel lat
;
BigLabel lon
;
void init
() {
lat =
new BigLabel
();
lon =
new BigLabel
();
}
int getNumRows
() {
return 2;
}
void layoutSubs
() {
add
(new JLabel("lat"));
add
(lat
);
add
(new JLabel("lon"));
add
(lon
);
}
CurrentPositionPanel
() {
setLayout
(new GridLayout(getNumRows
(),
2));
init
();
layoutSubs
();
}
}
class HomePositionPanel
extends CurrentPositionPanel
{
BigLabel home
;
void init
() {
super.
init();
home =
new BigLabel
();
}
int getNumRows
() {
return 3;
}
void layoutSubs
() {
super.
layoutSubs();
add
(new JLabel("home"));
add
(home
);
}
}
CurrentPositionPanel currentPosition =
new CurrentPositionPanel
();
HomePositionPanel homePosition =
new HomePositionPanel
();
public PositionsPanel
() {
Border b =
BorderFactory.
createTitledBorder(
BorderFactory.
createEtchedBorder(),
"Curr pos");
currentPosition.
setBorder(b
);
b =
BorderFactory.
createTitledBorder(
BorderFactory.
createEtchedBorder(),
"Home pos");
homePosition.
setBorder(b
);
setLayout
(new GridLayout(2,
1));
add
(currentPosition
);
add
(homePosition
);
}
public void update
(OSDDataResponseFrame data,
long timestamp
) {
if (data ==
null)
return;
String coordinateFormatString =
"%+10.5f";
StringBuilder sb =
new StringBuilder();
Formatter formatter =
new Formatter(sb,
Locale.
US);
formatter.
format(coordinateFormatString, data.
getCurrentPosition()
.
getLatitude());
currentPosition.
lat.
setText(sb.
toString());
sb.
setLength(0);
formatter.
format(coordinateFormatString, data.
getCurrentPosition()
.
getLongitude());
currentPosition.
lon.
setText(sb.
toString());
sb.
setLength(0);
formatter.
format(coordinateFormatString, data.
getCurrentPosition()
.
getLongitude());
currentPosition.
lon.
setText(sb.
toString());
sb.
setLength(0);
formatter.
format(coordinateFormatString, data.
getHomePosition()
.
getLatitude());
homePosition.
lat.
setText(sb.
toString());
sb.
setLength(0);
formatter.
format(coordinateFormatString, data.
getHomePosition()
.
getLongitude());
homePosition.
lon.
setText(sb.
toString());
homePosition.
home.
setText(data.
getCurrentToHome().
toString());
}
}
class HeightsPanel
extends JPanel implements OSDDataConsumer
{
class HeightPanel
extends JPanel implements OSDDataConsumer
{
BigLabel baroHeight
;
BigLabel GPSHeight
;
BigLabel baroVVI
;
BigLabel GPSVVI
;
void init
() {
baroHeight =
new BigLabel
();
GPSHeight =
new BigLabel
();
baroVVI =
new BigLabel
();
GPSVVI =
new BigLabel
();
}
int getNumRows
() {
return 4;
}
void layoutSubs
() {
add
(new JLabel("BaroHeight"));
add
(baroHeight
);
add
(new JLabel("baroVVI"));
add
(baroVVI
);
add
(new JLabel("GPSHeight"));
add
(GPSHeight
);
add
(new JLabel("GPSVVI"));
add
(GPSVVI
);
}
HeightPanel
() {
setLayout
(new GridLayout(getNumRows
(),
2));
}
public void update
(OSDDataResponseFrame data,
long timestamp
) {
if (data ==
null)
return;
String heightFormatString =
"%+10.1f";
StringBuilder sb =
new StringBuilder();
Formatter formatter =
new Formatter(sb,
Locale.
US);
formatter
.
format(heightFormatString, data.
getHeightByPressure());
baroHeight.
setText(sb.
toString());
sb.
setLength(0);
double vviText = data.
getVerticalVelocityByPressure();
formatter.
format(heightFormatString, vviText
);
baroVVI.
setText(sb.
toString());
sb.
setLength(0);
double height = data.
getCurrentPosition().
getAltitude()
- data.
getHomePosition().
getAltitude();
formatter.
format(heightFormatString, height
);
GPSHeight.
setText(sb.
toString());
sb.
setLength(0);
vviText = data.
getVerticalVelocityByGPS();
formatter.
format(heightFormatString, vviText
);
GPSVVI.
setText(sb.
toString());
}
}
HeightPanel height
;
JSlider vvi
;
HeightsPanel
() {
setLayout
(new BorderLayout());
vvi =
new JSlider(-
100,
100,
0);
vvi.
setOrientation(JSlider.
VERTICAL);
vvi.
setEnabled(false);
add
(vvi,
BorderLayout.
WEST);
height =
new HeightPanel
();
height.
init();
height.
layoutSubs();
add
(height,
BorderLayout.
CENTER);
setBorder
(BorderFactory.
createTitledBorder(
BorderFactory.
createEtchedBorder(),
"Altitude"));
}
public void update
(OSDDataResponseFrame data,
long timestamp
) {
if (data ==
null)
return;
height.
update(data, timestamp
);
vvi.
setValue((int) (data.
getVerticalVelocityByPressure() * 50));
}
}
class SpeedHeadingPanel
extends JPanel implements OSDDataConsumer
{
BigLabel noseDirection
;
BigLabel flightDirection
;
BigLabel speed
;
void init
() {
noseDirection =
new BigLabel
();
flightDirection =
new BigLabel
();
speed =
new BigLabel
();
Border b =
BorderFactory.
createTitledBorder(
BorderFactory.
createEtchedBorder(),
"Speed and heading");
setBorder
(b
);
}
int getNumRows
() {
return 3;
}
void layoutSubs
() {
setLayout
(new GridLayout(getNumRows
(),
2));
add
(new JLabel("Nose"));
add
(noseDirection
);
add
(new JLabel("Flight"));
add
(flightDirection
);
add
(new JLabel("Speed"));
add
(speed
);
}
SpeedHeadingPanel
() {
init
();
layoutSubs
();
}
public void update
(OSDDataResponseFrame data,
long timestamp
) {
if (data ==
null)
return;
String speedFormatString =
"%10.1f";
StringBuilder sb =
new StringBuilder();
Formatter formatter =
new Formatter(sb,
Locale.
US);
noseDirection.
setText("" + data.
getCompassHeading());
flightDirection.
setText("" + data.
getDirectionOfFlight());
formatter.
format(speedFormatString, data.
getGroundSpeed());
speed.
setText(sb.
toString());
}
}
class StatusPanel
extends JPanel implements OSDDataConsumer
{
JProgressBar dataAgeProgress
;
JProgressBar battery
;
BigLabel numberOfSatellites
;
long dataTime =
0;
void init
() {
dataAgeProgress =
new JProgressBar(0,
5000);
battery =
new JProgressBar(100,
130);
numberOfSatellites =
new BigLabel
();
//dataAgeProgress.setEnabled(false);
Border b =
BorderFactory.
createTitledBorder(
BorderFactory.
createEtchedBorder(),
"Status");
setBorder
(b
);
TimerTask dataAgeTask =
new TimerTask() {
@
Override
public void run
() {
long age =
System.
currentTimeMillis() - dataTime
;
if (age
> 5000) age =
5000;
// System.out.println(age);
dataAgeProgress.
setValue((int)age
);
StatusPanel.
this.
repaint();
}
};
Timer t =
new Timer();
t.
schedule(dataAgeTask,
0,
200);
}
int getNumRows
() {
return 3;
}
void layoutSubs
() {
add
(new JLabel("Data age"));
add
(dataAgeProgress
);
add
(new JLabel("Battery"));
add
(battery
);
add
(new JLabel("Satellites"));
add
(numberOfSatellites
);
}
StatusPanel
() {
setLayout
(new GridLayout(getNumRows
(),
2));
init
();
layoutSubs
();
}
public void update
(OSDDataResponseFrame data,
long timestamp
) {
if (data ==
null)
return;
dataTime =
System.
currentTimeMillis();
battery.
setValue(data.
getBatteryVoltage());
numberOfSatellites.
setText("" + data.
getNumberOfSatellites());
}
}
StatusPanel status =
new StatusPanel
();
PositionsPanel positions =
new PositionsPanel
();
SpeedHeadingPanel speedHeading =
new SpeedHeadingPanel
();
HeightsPanel altitudes =
new HeightsPanel
();
public VariousInfoPane
() {
}
public void init
() {
setLayout
(new GridLayout(0,
1));
add
(status
);
add
(positions
);
add
(speedHeading
);
add
(altitudes
);
}
public void update
(OSDDataResponseFrame data,
long timestamp
) {
status.
update(data, timestamp
);
positions.
update(data, timestamp
);
speedHeading.
update(data, timestamp
);
altitudes.
update(data, timestamp
);
}
public void setWidth
(int width
) {
positions.
setSize(width,
(int) positions.
getSize().
getHeight());
altitudes.
setSize(width,
(int) altitudes.
getSize().
getHeight());
}
}