ファントム4は自由にスピンアップできるスタンドアロンクラスとして実装されているため、何をしてもスタンドアロンクラスをファントム4に接続できないようです。コールバックに到達することはなく、データがデバイスから戻ってくることはありません。
public class DjiManager {
private static DjiManager instance = null;
private Context mContext;
private DJIBaseProduct mProduct;
private SendData mData;
private DJIFlightController mFlightController = null;
private Handler mConnectHandler = null;
private Runnable mConnectRunnable = null;
public DjiManager(Context context) {
mContext = context;
//start eventbus
EventBus.getDefault().register(this);
//set reference to data storage
mData = iOtManager.deviceData;
//Initialize DJI SDK Manager
initSdk();
}
public static DjiManager getIntance(Context context) {
if (instance==null) {
instance = new DjiManager(context);
}
return instance;
}
public void shutDown() {
Log.d("DJI", "DGI Shutting down");
//stop eventbus
EventBus.getDefault().unregister(this);
//stop the sdk
stopSdk();
//clear data buffer reference
mData = null;
//clear instance
instance = null;
}
@Subscribe
public void usbAttached(UsbAttachedEvent event) {
Log.d("DJI", "DGI Usb attached event");
connectDrone();
}
@Subscribe
public void commandSent(SdkCommandSent event) {
}
private void stopSdk() {
Log.d("DJI", "DGI stopSdk");
//shutdown geo interface
DJIFlyZoneManager.getInstance().setGEOSystemEnabled(false, new DJICommonCallbacks.DJICompletionCallback() {
@Override
public void onResult(DJIError djiError) {
if (null != djiError) {
Log.d("DJI", "Stopping Geo interface");
Toast.showError((Activity) mContext, djiError.getDescription());
}
}
});
//stop connection
DJISDKManager.getInstance().stopConnectionToProduct();
}
private void initSdk() {
//Initialize DJI SDK Manager
DJISDKManager.getInstance().initSDKManager(mContext, mDJISDKManagerCallback);
}
private void reInitSdk() {
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
initSdk();
}
},5000);
}
private void connectDrone() {
if (mConnectHandler!=null && mConnectRunnable!=null) {
mConnectHandler.removeCallbacks(mConnectRunnable);
}
mConnectHandler = new Handler();
mConnectRunnable = new Runnable() {
@Override
public void run() {
DJISDKManager.getInstance().startConnectionToProduct();
}
};
mConnectHandler.postDelayed(mConnectRunnable,1000);
}
private void setupCallbacks() {
//start geo sytem interface
Log.d("DJI", "Setting up callbacks");
DJIFlyZoneManager.getInstance().setGEOSystemEnabled(true, new DJICommonCallbacks.DJICompletionCallback() {
@Override
public void onResult(DJIError djiError) {
if (null != djiError) {
Log.d("DJI", "Error in callbacks: " + djiError.getDescription());
Toast.showError((Activity) mContext, djiError.getDescription());
} else {
initFlightController();
}
}
});
}
private void initFlightController() {
if (isFlightControllerSupported()) {
Log.d("DJI", "Flight controller supported");
mFlightController = ((DJIAircraft) DJISDKManager.getInstance().getDJIProduct()).getFlightController();
mFlightController.setUpdateSystemStateCallback(new DJIFlightControllerDelegate.FlightControllerUpdateSystemStateCallback() {
@Override
public void onResult(final DJIFlightControllerCurrentState state) {
mData.sdk_speed_h = String.valueOf(state.getVelocityX());
mData.sdk_speed_v = String.valueOf(state.getVelocityY());
mData.sdk_lat = String.valueOf(state.getAircraftLocation().getLatitude());
mData.sdk_lng = String.valueOf(state.getAircraftLocation().getLongitude());
mData.sdk_altitude = String.valueOf(state.getUltrasonicHeight());
}
});
} else {
Log.d("DJI", "Flight controller not supported");
connectDrone();
}
}
private boolean isFlightControllerSupported() {
return DJISDKManager.getInstance().getDJIProduct() != null &&
DJISDKManager.getInstance().getDJIProduct() instanceof DJIAircraft &&
((DJIAircraft) DJISDKManager.getInstance().getDJIProduct()).getFlightController() != null;
}
//CALLBACKS
private DJISDKManager.DJISDKManagerCallback mDJISDKManagerCallback = new DJISDKManager.DJISDKManagerCallback() {
@Override
public void onGetRegisteredResult(DJIError error) {
Log.d("DJI", error == null ? "success" : error.getDescription());
if(error == DJISDKError.REGISTRATION_SUCCESS) {
connectDrone();
Handler handler = new Handler(Looper.getMainLooper());
handler.post(new Runnable() {
@Override
public void run() {
Log.d("DJI", "DGI Registration Succcessfull!");
}
});
} else {
Handler handler = new Handler(Looper.getMainLooper());
handler.post(new Runnable() {
@Override
public void run() {
Log.d("DJI", "Register App Failed! Please enter your App Key and check the network.");
Toast.showError((Activity) mContext, "The purplebox failed to connect to a Dji Drone");
reInitSdk();
}
});
}
}
@Override
public void onProductChanged(DJIBaseProduct oldProduct, DJIBaseProduct newProduct) {
mProduct = newProduct;
if(mProduct != null) {
Log.d("DJI", "Product found: " + newProduct.getModel());
mProduct.setDJIBaseProductListener(mDJIBaseProductListener);
//setup product
setupCallbacks();
} else {
Log.d("DJI", "Product Not Found, reconnecting...");
//connectDrone();
}
}
};
private DJIBaseProduct.DJIBaseProductListener mDJIBaseProductListener = new DJIBaseProduct.DJIBaseProductListener() {
@Override
public void onComponentChange(DJIBaseProduct.DJIComponentKey key, DJIBaseComponent oldComponent, DJIBaseComponent newComponent) {
Log.d("DJI", "Component Changed");
}
@Override
public void onProductConnectivityChanged(boolean isConnected) {
Log.d("DJI", "DGI Connected: " + isConnected);
}
};
}