package org.schmivits.airball.airdata;
import org.schmivits.airball.airdata.XPlanePacketInterpreter.XPlaneUdpBlock;
import org.schmivits.airball.util.ValueModel;
public class XPlaneNetworkFlightData
implements FlightData, XPlanePacketInterpreter.BlockReceiver {
private final UpdateSourceHelper mUpdateSourceHelper = new UpdateSourceHelper();
private abstract class SimpleValueModel implements ValueModel<Float> {
@Override
public boolean isValid() {
return true;
}
}
private final ValueModel<Float> mAirspeedValueModel = new SimpleValueModel() {
@Override
public Float getValue() {
return mAirspeed;
}
};
private final ValueModel<Float> mAlphaValueModel = new SimpleValueModel() {
@Override
public Float getValue() {
return mAlpha;
}
};
private final ValueModel<Float> mBetaValueModel = new SimpleValueModel() {
@Override
public Float getValue() {
return mBeta;
}
};
private final ValueModel<Float> mAltitudeValueModel = new SimpleValueModel() {
@Override
public Float getValue() {
return mAltitude;
}
};
private final ValueModel<Float> mClimbRateValueModel = new SimpleValueModel() {
@Override
public Float getValue() {
return mClimbRate;
}
};
private final Airdata mAirdata = new Airdata() {
@Override
public ValueModel<Float> getAirspeed() {
return mAirspeedValueModel;
}
@Override
public ValueModel<Float> getAlpha() {
return mAlphaValueModel;
}
@Override
public ValueModel<Float> getBeta() {
return mBetaValueModel;
}
@Override
public ValueModel<Float> getAltitude() {
return mAltitudeValueModel;
}
@Override
public ValueModel<Float> getClimbRate() {
return mClimbRateValueModel;
}
};
private final ValueModel<Aircraft> mAircraftValueModel = new ValueModel<Aircraft>() {
@Override
public boolean isValid() {
return true;
}
@Override
public Aircraft getValue() {
return mAircraft;
}
};
private Aircraft mAircraft;
private float mAlpha;
private float mBeta;
private float mAirspeed;
private float mAltitude;
private float mClimbRate;
private final NetworkListener mNetworkListener;
public XPlaneNetworkFlightData(Aircraft aircraft, int port, boolean isUdp) {
mAircraft = aircraft;
XPlanePacketInterpreter packetInterpreter = new XPlanePacketInterpreter(this);
mNetworkListener = isUdp
? new UdpListener(port, packetInterpreter)
: new TcpListener(port, packetInterpreter);
mNetworkListener.start();
}
private static final int SPEEDS = 3;
private static final int SPEEDS_IAS = 0;
private static final int MACHANDVERT = 4;
private static final int MACHANDVERT_VERTICALSPEED = 2;
private static final int AOASIDESLIP = 18;
private static final int AOASIDESLIP_ALPHA = 0;
private static final int AOASIDESLIP_BETA = 1;
private static final int POSITION = 20;
private static final int POSITION_ALTMSL = 2;
@Override
public void blockReceived(XPlaneUdpBlock block) {
switch (block.mIndex) {
case AOASIDESLIP:
mAlpha = block.mData[AOASIDESLIP_ALPHA];
mBeta = - block.mData[AOASIDESLIP_BETA];
break;
case MACHANDVERT:
mClimbRate = block.mData[MACHANDVERT_VERTICALSPEED];
break;
case SPEEDS:
mAirspeed = block.mData[SPEEDS_IAS];
break;
case POSITION:
mAltitude = block.mData[POSITION_ALTMSL];
default:
return;
}
mUpdateSourceHelper.fire();
}
@Override
public ValueModel<Aircraft> getAircraft() {
return mAircraftValueModel;
}
@Override
public Airdata getAirdata() {
return mAirdata;
}
@Override
public String getConnectionStatus() {
return null;
}
@Override
public void addUpdateListener(Runnable r) {
mUpdateSourceHelper.addUpdateListener(r);
}
@Override
public void removeUpdateListener(Runnable r) {
mUpdateSourceHelper.removeUpdateListener(r);
}
@Override
public void destroy() {
mNetworkListener.stop();
}
}