MOBDrone_app/app/src/main/java/com/dji/ux/beta/sample/utils/DroneState.java

295 lines
13 KiB
Java

package com.dji.ux.beta.sample.utils;
/*
Util class that provides info onm drone status such as battery charge, altitude, speed, etc..
*/
import android.content.Context;
import android.content.SharedPreferences;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.drawable.Drawable;
import android.util.Log;
import androidx.annotation.NonNull;
import androidx.core.content.ContextCompat;
import com.dji.mapkit.core.models.DJIBitmapDescriptor;
import com.dji.mapkit.core.models.DJIBitmapDescriptorFactory;
import com.dji.ux.beta.sample.R;
import com.dji.ux.beta.sample.SampleApplication;
import com.dji.ux.beta.sample.mission.GPSPlancia;
import com.google.android.gms.maps.model.LatLng;
import org.jetbrains.annotations.NotNull;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Locale;
import java.util.concurrent.TimeUnit;
import dji.common.battery.BatteryState;
import dji.common.error.DJIError;
import dji.common.flightcontroller.FlightControllerState;
import dji.common.model.LocationCoordinate2D;
import dji.common.util.CommonCallbacks;
import dji.sdk.base.BaseProduct;
import dji.sdk.flightcontroller.FlightController;
import dji.sdk.flighthub.FlightHubManager;
import dji.sdk.flighthub.model.RealTimeFlightData;
import dji.sdk.products.Aircraft;
import dji.sdk.sdkmanager.DJISDKManager;
public class DroneState {
private static final String TAG = DroneState.class.getSimpleName();
protected static StringBuilder stringState = new StringBuilder();
protected static StringBuilder stringStatePlancia = new StringBuilder();
protected static StringBuilder stringStream = new StringBuilder();
protected static StringBuilder stringJetson;
protected static String altitude;
protected static String latitude;
protected static String longitude;
protected static String whichLatitude;
protected static int batteryCharge;
private static FlightController flightController;
private static String tracking;
private static String searching;
private static String following;
private static String serialNumber;
private static String speed;
private static LatLng homeLocation;
public static LatLng getHomeLocation(){
BaseProduct product = SampleApplication.getProductInstance();
if (product instanceof Aircraft) { flightController = ((Aircraft) product).getFlightController(); }
if(flightController != null){
flightController.getHomeLocation(new CommonCallbacks.CompletionCallbackWith<LocationCoordinate2D>() {
@Override
public void onSuccess(LocationCoordinate2D locationCoordinate2D) {
homeLocation = new LatLng(locationCoordinate2D.getLatitude(), locationCoordinate2D.getLongitude());
}
@Override
public void onFailure(DJIError djiError) {
}
});
} else{
homeLocation = new LatLng(43.719259015524976, 10.421048893480233);
}
return homeLocation;
}
private static void getDroneLocation(BaseProduct product){
if (product instanceof Aircraft) { flightController = ((Aircraft) product).getFlightController(); }
if (flightController !=null){
flightController.setStateCallback(new FlightControllerState.Callback() {
@Override
public void onUpdate(@NonNull @NotNull FlightControllerState flightControllerState) {
if (flightControllerState.getAircraftLocation() != null) {
if(!Double.isNaN(flightControllerState.getAircraftLocation().getLatitude()) && !Double.isNaN(flightControllerState.getAircraftLocation().getLongitude())) {
latitude = String.valueOf(flightControllerState.getAircraftLocation().getLatitude());
longitude = String.valueOf(flightControllerState.getAircraftLocation().getLongitude());
altitude = String.valueOf(flightControllerState.getAircraftLocation().getAltitude());
} else {
latitude = "0.0";
longitude = "0.0";
latitude = "0.0";
}
}
}
});
}
}
public static void getDroneBattery(){
try {
SampleApplication.getProductInstance().getBattery().setStateCallback(new BatteryState.Callback() {
@Override
public void onUpdate(BatteryState batteryState) {
batteryCharge = batteryState.getChargeRemainingInPercent();
}
});
} catch (Exception ignored){
}
}
public static void setTracking(){
whichLatitude = "Drone Latitude: ";
//tracking = DJISDKManager.getInstance().getMissionControl().getWaypointMissionOperator().getCurrentState().toString();
tracking = DJISDKManager.getInstance().getMissionControl().getHotpointMissionOperator().getCurrentState().toString();
searching = DJISDKManager.getInstance().getMissionControl().getWaypointMissionOperator().getCurrentState().toString();
if(searching.equals("EXECUTING")){
whichLatitude = "Searching Drone Latitude: ";
}
following = DJISDKManager.getInstance().getMissionControl().getFollowMeMissionOperator().getCurrentState().toString();
}
public static StringBuilder getDroneState(){
BaseProduct product = SampleApplication.getProductInstance();
if (product != null && product.isConnected()) {
getDroneLocation(product);
getDroneBattery();
setTracking();
stringState.delete(0, stringState.length());
stringState.append("\n");
stringState.append("Product Connected!").append("\n");
stringState.append("Product Name: ").append(product.getModel().getDisplayName()).append("\n");
stringState.append("Battery charge: ").append(batteryCharge).append("%\n");
stringState.append(whichLatitude).append(altitude).append("m\n");
stringState.append("Drone latitude: ").append(latitude).append("\n");
stringState.append("Drone longitude: ").append(longitude).append("\n");
stringState.append("Flight State: ").append(tracking).append("\n");
stringState.append("Following State: ").append(following).append("\n");
} else {
stringState.delete(0, stringState.length());
stringState.append("No product connected.").append("\n");
}
return stringState;
}
public static StringBuilder getStreamInfo(){
BaseProduct product = SampleApplication.getProductInstance();
if (product != null && product.isConnected()) {
if(DJISDKManager.getInstance().getLiveStreamManager().isStreaming()) {
stringStream.append("Streaming live on: ").append(DJISDKManager.getInstance().getLiveStreamManager().getLiveUrl()).append("\n");
long startTime = DJISDKManager.getInstance().getLiveStreamManager().getStartTime();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.getDefault());
String sd = sdf.format(new Date(Long.parseLong(String.valueOf(startTime))));
stringStream.append("Start Time: ").append(sd).append("\n");;
stringStream.append("Video Resolution: ").append(DJISDKManager.getInstance().getLiveStreamManager().getLiveVideoResolution()).append("\n");;
stringStream.append("Video BitRate:").append(DJISDKManager.getInstance().getLiveStreamManager().getLiveVideoBitRate()).append(" kpbs\n");
stringStream.append("Audio BitRate:").append(DJISDKManager.getInstance().getLiveStreamManager().getLiveAudioBitRate()).append(" kpbs\n");
stringStream.append("Video FPS:").append(DJISDKManager.getInstance().getLiveStreamManager().getLiveVideoFps()).append("\n");
stringStream.append("Video Cache size:").append(DJISDKManager.getInstance().getLiveStreamManager().getLiveVideoCacheSize()).append(" frame");
} else {
stringStream.append("No streaming available.").append("\n");
}
} else {
stringStream.append("No product connected.").append("\n");
}
return stringStream;
}
public static StringBuilder getDroneStatePlancia(boolean disableConsole){
BaseProduct product = SampleApplication.getProductInstance();
if (product != null && product.isConnected()) {
getDroneLocation(product);
getDroneBattery();
setTracking();
// getRealTimeData();
getSpeed();
stringStatePlancia.delete(0, stringStatePlancia.length());
// stringStatePlancia.append("\n");
stringStatePlancia.append("true").append("#");
stringStatePlancia.append(disableConsole).append("#");
stringStatePlancia.append(batteryCharge).append("#");
stringStatePlancia.append(speed).append("#");
// stringStatePlancia.append("0").append("#");
stringStatePlancia.append(altitude).append("#");
stringStatePlancia.append(latitude).append("#");
stringStatePlancia.append(longitude).append("#");
if(tracking != null && tracking.equals("EXECUTING"))
stringStatePlancia.append("true").append("#");
else
stringStatePlancia.append("false").append("#");
if(following != null && following.equals("EXECUTING"))
stringStatePlancia.append("true").append("#");
else
stringStatePlancia.append("false").append("#");
if(searching != null && searching.equals("EXECUTING"))
stringStatePlancia.append("true").append("#");
else
stringStatePlancia.append("false").append("#");
if(DJISDKManager.getInstance().getLiveStreamManager().isStreaming()) {
stringStatePlancia.append(DJISDKManager.getInstance().getLiveStreamManager().getLiveUrl()).append("#");
} else {
stringStatePlancia.append("NoStream").append("#");
}
} else {
stringStatePlancia.delete(0, stringStatePlancia.length());
stringStatePlancia.append("False").append("#");
}
return stringStatePlancia;
}
public static StringBuilder getGPSJetson(){
stringJetson = new StringBuilder();
BaseProduct product = SampleApplication.getProductInstance();
if (product != null && product.isConnected()) {
getDroneLocation(product);
stringJetson.delete(0, stringJetson.length());
//stringJetson.append("hotpoint_coordinates").append("-"); if we want to automatic search
stringJetson.append("hotpoint_jetson").append("-");
stringJetson.append(latitude).append("-");
stringJetson.append(longitude).append("-");
stringJetson.append(altitude).append("-");
stringJetson.append("5").append("\n\r");
} else {
stringJetson.append("no_connected").append("\n\r");
}
return stringJetson;
}
private static void getSpeed() {
String velX = Float.toString(flightController.getState().getVelocityX());
String velY = Float.toString(flightController.getState().getVelocityY());
String velZ = Float.toString(flightController.getState().getVelocityZ());
speed = velX + ":" + velY + ":" + velZ;
// Log.i(TAG, "speed " + speed);
}
// gets real time flight data of the aircraft with the given serial number
private static void getRealTimeData() {
//TODO:se non va togliere commento
BaseProduct product = SampleApplication.getProductInstance();
if (product instanceof Aircraft) { flightController = ((Aircraft) product).getFlightController(); }
flightController.getSerialNumber(new CommonCallbacks.CompletionCallbackWith<String>() {
@Override
public void onSuccess(String s) {
serialNumber = s;
}
@Override
public void onFailure(DJIError djiError) {
}
});
final ArrayList<String> serialNumbers = new ArrayList<>(1);
serialNumbers.add(serialNumber);
try {
DJISDKManager.getInstance().getFlightHubManager().getAircraftRealTimeFlightData(serialNumbers, new CommonCallbacks.CompletionCallbackWith<List<RealTimeFlightData>>() {
@Override
public void onSuccess(List<RealTimeFlightData> realTimeFlightData) {
for (RealTimeFlightData s : realTimeFlightData) {
speed = String.valueOf(s.getSpeed());
Log.i(TAG, "speed " + s.getSpeed());
}
}
@Override
public void onFailure(DJIError error) {
Log.i(TAG, "getAircraftRealTimeFlightData failed: " + error.getDescription());
}
});
} catch (Exception e) {
e.printStackTrace();
}
}
}