diff --git a/Android/AndroidManifest.xml b/Android/AndroidManifest.xml index 740a1631ef..178a567348 100644 --- a/Android/AndroidManifest.xml +++ b/Android/AndroidManifest.xml @@ -2,7 +2,7 @@ 1) notifBuilder.setNumber(numUploaded); @@ -91,21 +90,20 @@ public void onUploadFailure(File f, Exception ex) { if (ex instanceof HttpResponseException) msg = ex.getMessage(); - if(failedUploadNotification == null) { - failedUploadNotification = generateNotificationBuilder() - .setContentText(msg) - .setSubText(getString(R.string.uploader_fail_retry_message)) - .build(); - } - updateUploadStatusNotification(failedUploadNotification); - - if(!NetworkConnectivityReceiver.isNetworkAvailable(getApplicationContext())){ - //Activating the network connectivity receiver so we can be restarted when - // connectivity is restored. - Log.d(TAG, "Activating connectivity receiver"); - NetworkConnectivityReceiver.enableConnectivityReceiver(getApplicationContext(), - true); - } + if (failedUploadNotification == null) { + failedUploadNotification = generateNotificationBuilder().setContentText(msg) + .setSubText(getString(R.string.uploader_fail_retry_message)).build(); + } + updateUploadStatusNotification(failedUploadNotification); + + if (!NetworkConnectivityReceiver.isNetworkAvailable(getApplicationContext())) { + // Activating the network connectivity receiver so we can be + // restarted when + // connectivity is restored. + Log.d(TAG, "Activating connectivity receiver"); + NetworkConnectivityReceiver.enableConnectivityReceiver(getApplicationContext(), + true); + } } }; @@ -119,45 +117,45 @@ public UploaderService() { public void onCreate() { super.onCreate(); - prefs = new DroidPlannerPrefs(this); - notifyManager = NotificationManagerCompat.from(getApplicationContext()); + prefs = new DroidPlannerPrefs(this); + notifyManager = NotificationManagerCompat.from(getApplicationContext()); } @Override protected void onHandleIntent(Intent intent) { - //Check if droneshare is enabled, and the login credentials set before trying to do - // anything. - if(prefs.getDroneshareEnabled() && areLoginCredentialsSet()) { - - // Any time we receive an intent - rescan the directory - if (NetworkConnectivityReceiver.isNetworkAvailable(this)) { - Log.i(TAG, "Scanning for new uploads"); - doUploads(); - } - else { - Log.v(TAG, "Not scanning - network offline"); - - //Activating the network connectivity receiver so we can be restarted when - // connectivity is restored. - Log.d(TAG, "Activating connectivity receiver"); - NetworkConnectivityReceiver.enableConnectivityReceiver(getApplicationContext(), - true); - } - } + // Check if droneshare is enabled, and the login credentials set before + // trying to do + // anything. + if (prefs.getDroneshareEnabled() && areLoginCredentialsSet()) { + + // Any time we receive an intent - rescan the directory + if (NetworkConnectivityReceiver.isNetworkAvailable(this)) { + Log.i(TAG, "Scanning for new uploads"); + doUploads(); + } else { + Log.v(TAG, "Not scanning - network offline"); + + // Activating the network connectivity receiver so we can be + // restarted when + // connectivity is restored. + Log.d(TAG, "Activating connectivity receiver"); + NetworkConnectivityReceiver.enableConnectivityReceiver(getApplicationContext(), + true); + } + } } - private NotificationCompat.Builder generateNotificationBuilder(){ - return new NotificationCompat.Builder(getApplicationContext()) - .setContentTitle(getString(R.string.uploader_notification_title)) - .setSmallIcon(R.drawable.ic_launcher) - // .setProgress(fileSize, 0, false) - .setAutoCancel(true) - .setPriority(NotificationCompat.PRIORITY_HIGH); - } + private NotificationCompat.Builder generateNotificationBuilder() { + return new NotificationCompat.Builder(getApplicationContext()) + .setContentTitle(getString(R.string.uploader_notification_title)) + .setSmallIcon(R.drawable.ic_launcher) + // .setProgress(fileSize, 0, false) + .setAutoCancel(true).setPriority(NotificationCompat.PRIORITY_HIGH); + } - private boolean areLoginCredentialsSet(){ - return !prefs.getDroneshareLogin().isEmpty() && !prefs.getDronesharePassword().isEmpty(); - } + private boolean areLoginCredentialsSet() { + return !prefs.getDroneshareLogin().isEmpty() && !prefs.getDronesharePassword().isEmpty(); + } private void doUploads() { File srcDir = DirectoryPath.getTLogPath(); @@ -167,26 +165,25 @@ private void doUploads() { String password = prefs.getDronesharePassword(); if (!login.isEmpty() && !password.isEmpty()) { - DirectoryUploader up = new DirectoryUploader(srcDir, destDir, - callback, login, password, prefs.getVehicleId(), apiKey, "DEFAULT"); + DirectoryUploader up = new DirectoryUploader(srcDir, destDir, callback, login, + password, prefs.getVehicleId(), apiKey, "DEFAULT"); - final Notification notification = generateNotificationBuilder() - .setContentText("Uploading log file") - .build(); - startForeground(ONGOING_UPLOAD_NOTIFICATION_ID, notification); + final Notification notification = generateNotificationBuilder().setContentText( + "Uploading log file").build(); + startForeground(ONGOING_UPLOAD_NOTIFICATION_ID, notification); up.run(); - stopForeground(true); + stopForeground(true); } } - private void updateUploadStatusNotification(Notification notification) { - notifyManager.notify(UPLOAD_STATUS_NOTIFICATION_ID, notification); - } + private void updateUploadStatusNotification(Notification notification) { + notifyManager.notify(UPLOAD_STATUS_NOTIFICATION_ID, notification); + } - /** - * Create an Intent that will start this service - */ - static public Intent createIntent(Context context) { + /** + * Create an Intent that will start this service + */ + static public Intent createIntent(Context context) { return new Intent(context, UploaderService.class); } } diff --git a/Android/src/org/droidplanner/android/dialogs/DroneshareDialog.java b/Android/src/org/droidplanner/android/dialogs/DroneshareDialog.java index 01dd003f8b..dd2c2fa56f 100644 --- a/Android/src/org/droidplanner/android/dialogs/DroneshareDialog.java +++ b/Android/src/org/droidplanner/android/dialogs/DroneshareDialog.java @@ -38,12 +38,9 @@ public Dialog onCreateDialog(Bundle savedInstanceState) { final EditText username = (EditText) root.findViewById(R.id.username); final EditText password = (EditText) root.findViewById(R.id.password); final EditText email = (EditText) root.findViewById(R.id.email); - final RadioButton createNew = (RadioButton) root - .findViewById(R.id.radioCreateNew); - final RadioButton loginExisting = (RadioButton) root - .findViewById(R.id.radioLoginExisting); - final RadioButton noDroneshare = (RadioButton) root - .findViewById(R.id.radioNoDroneshare); + final RadioButton createNew = (RadioButton) root.findViewById(R.id.radioCreateNew); + final RadioButton loginExisting = (RadioButton) root.findViewById(R.id.radioLoginExisting); + final RadioButton noDroneshare = (RadioButton) root.findViewById(R.id.radioNoDroneshare); username.setText(prefs.getDroneshareLogin()); password.setText(prefs.getDronesharePassword()); @@ -51,8 +48,7 @@ public Dialog onCreateDialog(Bundle savedInstanceState) { username.requestFocus(); if (prefs.getDroneshareEnabled()) { - if (!prefs.getDroneshareLogin().isEmpty() - && !prefs.getDronesharePassword().isEmpty()) + if (!prefs.getDroneshareLogin().isEmpty() && !prefs.getDronesharePassword().isEmpty()) loginExisting.setSelected(true); else createNew.setSelected(true); @@ -69,10 +65,8 @@ public void onClick(DialogInterface dialog, int id) { prefs.setDroneshareEnabled(false); else { prefs.setDroneshareEnabled(true); - prefs.setDroneshareLogin(username.getText() - .toString()); - prefs.setDronesharePassword(password.getText() - .toString()); + prefs.setDroneshareLogin(username.getText().toString()); + prefs.setDronesharePassword(password.getText().toString()); prefs.setDroneshareEmail(email.getText().toString()); } } @@ -88,8 +82,7 @@ static public void perhapsShow(FragmentActivity parent) { // the app some... if (prefs.getNumberOfRuns() > numRuns && prefs.getDroneshareEnabled() - && (prefs.getDroneshareLogin().isEmpty() || prefs - .getDronesharePassword().isEmpty())) { + && (prefs.getDroneshareLogin().isEmpty() || prefs.getDronesharePassword().isEmpty())) { // Create an instance of the dialog fragment and show it DialogFragment dialog = new DroneshareDialog(); dialog.show(parent.getSupportFragmentManager(), "DroneshareDialog"); diff --git a/Android/src/org/droidplanner/android/fragments/ChecklistFragment.java b/Android/src/org/droidplanner/android/fragments/ChecklistFragment.java index 9963dd9a45..0271826140 100644 --- a/Android/src/org/droidplanner/android/fragments/ChecklistFragment.java +++ b/Android/src/org/droidplanner/android/fragments/ChecklistFragment.java @@ -12,9 +12,9 @@ import org.droidplanner.android.widgets.checklist.CheckListSysLink; import org.droidplanner.android.widgets.checklist.CheckListXmlParser; import org.droidplanner.android.widgets.checklist.xml.ListXmlParser.OnXmlParserError; -import org.droidplanner.core.model.Drone; import org.droidplanner.core.drone.DroneInterfaces.DroneEventsType; import org.droidplanner.core.drone.DroneInterfaces.OnDroneListener; +import org.droidplanner.core.model.Drone; import android.app.Activity; import android.content.Context; diff --git a/Android/src/org/droidplanner/android/fragments/DroneMap.java b/Android/src/org/droidplanner/android/fragments/DroneMap.java index bb294cf3ae..17d40fefdb 100644 --- a/Android/src/org/droidplanner/android/fragments/DroneMap.java +++ b/Android/src/org/droidplanner/android/fragments/DroneMap.java @@ -12,10 +12,10 @@ import org.droidplanner.android.proxy.mission.MissionProxy; import org.droidplanner.android.utils.Utils; import org.droidplanner.android.utils.prefs.AutoPanMode; -import org.droidplanner.core.model.Drone; import org.droidplanner.core.drone.DroneInterfaces.DroneEventsType; import org.droidplanner.core.drone.DroneInterfaces.OnDroneListener; import org.droidplanner.core.helpers.coordinates.Coord2D; +import org.droidplanner.core.model.Drone; import android.app.Activity; import android.content.Context; diff --git a/Android/src/org/droidplanner/android/fragments/EditorListFragment.java b/Android/src/org/droidplanner/android/fragments/EditorListFragment.java index 8c5e30be71..cb382ee0b7 100644 --- a/Android/src/org/droidplanner/android/fragments/EditorListFragment.java +++ b/Android/src/org/droidplanner/android/fragments/EditorListFragment.java @@ -14,9 +14,9 @@ import org.droidplanner.android.proxy.mission.MissionSelection; import org.droidplanner.android.proxy.mission.item.MissionItemProxy; import org.droidplanner.android.widgets.adapterViews.MissionItemProxyView; -import org.droidplanner.core.model.Drone; import org.droidplanner.core.drone.DroneInterfaces.DroneEventsType; import org.droidplanner.core.drone.DroneInterfaces.OnDroneListener; +import org.droidplanner.core.model.Drone; import android.app.Activity; import android.os.Bundle; diff --git a/Android/src/org/droidplanner/android/fragments/EditorToolsFragment.java b/Android/src/org/droidplanner/android/fragments/EditorToolsFragment.java index 2f18bca9d9..ae1840f1b0 100644 --- a/Android/src/org/droidplanner/android/fragments/EditorToolsFragment.java +++ b/Android/src/org/droidplanner/android/fragments/EditorToolsFragment.java @@ -67,7 +67,6 @@ public void onViewCreated(View view, Bundle savedInstanceState) { .findViewById(R.id.editor_tools_poly); final RadioButtonCenter buttonTrash = (RadioButtonCenter) view .findViewById(R.id.editor_tools_trash); - for (View vv : new View[] { buttonDraw, buttonMarker, buttonPoly, buttonTrash }) { vv.setOnClickListener(this); @@ -93,8 +92,8 @@ public void onAttach(Activity activity) { throw new IllegalStateException("Parent activity must be an instance of " + OnEditorToolSelected.class.getName()); } - - mMissionProxy = ((DroidPlannerApp)activity.getApplication()).missionProxy; + + mMissionProxy = ((DroidPlannerApp) activity.getApplication()).missionProxy; listener = (OnEditorToolSelected) activity; } @@ -167,8 +166,7 @@ private void setTool(EditorTools tool, boolean notifyListeners) { case RTL: tool = EditorTools.NONE; mEditorRadioGroup.clearCheck(); - Toast.makeText(getActivity(), - getString(R.string.editor_err_land_rtl_added), + Toast.makeText(getActivity(), getString(R.string.editor_err_land_rtl_added), Toast.LENGTH_SHORT).show(); return; default: diff --git a/Android/src/org/droidplanner/android/fragments/FlightActionsFragment.java b/Android/src/org/droidplanner/android/fragments/FlightActionsFragment.java index d99a0d1bbc..b378df949f 100644 --- a/Android/src/org/droidplanner/android/fragments/FlightActionsFragment.java +++ b/Android/src/org/droidplanner/android/fragments/FlightActionsFragment.java @@ -3,8 +3,8 @@ import org.droidplanner.R; import org.droidplanner.android.DroidPlannerApp; import org.droidplanner.android.utils.analytics.GAUtils; -import org.droidplanner.core.model.Drone; import org.droidplanner.core.gcs.follow.Follow; +import org.droidplanner.core.model.Drone; import android.app.Activity; import android.os.Bundle; @@ -115,33 +115,33 @@ public void onClick(View v) { case R.id.mc_follow: final int result = followMe.toggleFollowMeState(); - String eventLabel = null; - switch(result){ - case Follow.FOLLOW_START: - eventLabel = "FollowMe enabled"; - break; - - case Follow.FOLLOW_END: - eventLabel = "FollowMe disabled"; - break; - - case Follow.FOLLOW_INVALID_STATE: - eventLabel = "FollowMe error: invalid state"; - break; - - case Follow.FOLLOW_DRONE_DISCONNECTED: - eventLabel = "FollowMe error: drone not connected"; - break; - - case Follow.FOLLOW_DRONE_NOT_ARMED: - eventLabel = "FollowMe error: drone not armed"; - break; - } - - if(eventLabel != null){ - eventBuilder.setAction("FollowMe selected").setLabel(eventLabel); - Toast.makeText(getActivity(), eventLabel, Toast.LENGTH_SHORT).show(); - } + String eventLabel = null; + switch (result) { + case Follow.FOLLOW_START: + eventLabel = "FollowMe enabled"; + break; + + case Follow.FOLLOW_END: + eventLabel = "FollowMe disabled"; + break; + + case Follow.FOLLOW_INVALID_STATE: + eventLabel = "FollowMe error: invalid state"; + break; + + case Follow.FOLLOW_DRONE_DISCONNECTED: + eventLabel = "FollowMe error: drone not connected"; + break; + + case Follow.FOLLOW_DRONE_NOT_ARMED: + eventLabel = "FollowMe error: drone not armed"; + break; + } + + if (eventLabel != null) { + eventBuilder.setAction("FollowMe selected").setLabel(eventLabel); + Toast.makeText(getActivity(), eventLabel, Toast.LENGTH_SHORT).show(); + } break; default: diff --git a/Android/src/org/droidplanner/android/fragments/FlightMapFragment.java b/Android/src/org/droidplanner/android/fragments/FlightMapFragment.java index 520c50a61f..2167523ef4 100644 --- a/Android/src/org/droidplanner/android/fragments/FlightMapFragment.java +++ b/Android/src/org/droidplanner/android/fragments/FlightMapFragment.java @@ -7,10 +7,10 @@ import org.droidplanner.android.utils.DroneHelper; import org.droidplanner.android.utils.prefs.AutoPanMode; import org.droidplanner.android.utils.prefs.DroidPlannerPrefs; -import org.droidplanner.core.model.Drone; import org.droidplanner.core.drone.DroneInterfaces.DroneEventsType; import org.droidplanner.core.drone.DroneInterfaces.OnDroneListener; import org.droidplanner.core.helpers.coordinates.Coord2D; +import org.droidplanner.core.model.Drone; import android.content.SharedPreferences; import android.os.Bundle; diff --git a/Android/src/org/droidplanner/android/fragments/ParamsFragment.java b/Android/src/org/droidplanner/android/fragments/ParamsFragment.java index 2a7d8cfa21..c9f5a1b512 100644 --- a/Android/src/org/droidplanner/android/fragments/ParamsFragment.java +++ b/Android/src/org/droidplanner/android/fragments/ParamsFragment.java @@ -13,10 +13,10 @@ import org.droidplanner.android.utils.file.IO.ParameterWriter; import org.droidplanner.android.widgets.adapterViews.ParamsAdapter; import org.droidplanner.android.widgets.adapterViews.ParamsAdapterItem; -import org.droidplanner.core.model.Drone; import org.droidplanner.core.drone.DroneInterfaces; import org.droidplanner.core.drone.DroneInterfaces.DroneEventsType; import org.droidplanner.core.drone.DroneInterfaces.OnDroneListener; +import org.droidplanner.core.model.Drone; import org.droidplanner.core.parameters.Parameter; import org.droidplanner.core.parameters.ParameterMetadata; diff --git a/Android/src/org/droidplanner/android/fragments/SettingsFragment.java b/Android/src/org/droidplanner/android/fragments/SettingsFragment.java index 8e184f288c..3a86583817 100644 --- a/Android/src/org/droidplanner/android/fragments/SettingsFragment.java +++ b/Android/src/org/droidplanner/android/fragments/SettingsFragment.java @@ -14,12 +14,11 @@ import org.droidplanner.android.activities.helpers.MapPreferencesActivity; import org.droidplanner.android.communication.service.UploaderService; import org.droidplanner.android.maps.providers.DPMapProvider; -import org.droidplanner.android.notifications.TTSNotificationProvider; import org.droidplanner.android.utils.file.DirectoryPath; -import org.droidplanner.core.model.Drone; import org.droidplanner.core.drone.DroneInterfaces; import org.droidplanner.core.drone.DroneInterfaces.DroneEventsType; import org.droidplanner.core.drone.variables.HeartBeat; +import org.droidplanner.core.model.Drone; import android.content.ActivityNotFoundException; import android.content.Context; @@ -36,7 +35,6 @@ import android.preference.Preference.OnPreferenceClickListener; import android.preference.PreferenceCategory; import android.preference.PreferenceManager; -import android.preference.PreferenceScreen; import android.util.Log; import android.widget.Toast; @@ -135,7 +133,8 @@ public boolean onPreferenceChange(Preference preference, Object newValue) { updateMapSettingsPreference(defaultProviderName); } - // update the summary for the preferences in the mDefaultSummaryPrefs hash table. + // update the summary for the preferences in the mDefaultSummaryPrefs + // hash table. for (String prefKey : mDefaultSummaryPrefs) { final Preference pref = findPreference(prefKey); if (pref != null) { @@ -195,115 +194,112 @@ public boolean onPreferenceChange(Preference preference, Object newValue) { updateMavlinkVersionPreference(null); setupPebblePreference(); - setDronesharePreferencesListeners(); + setDronesharePreferencesListeners(); + } + + /** + * When a droneshare preference is updated, the listener will kick start the + * droneshare uploader service to see if any action is needed. + */ + private void setDronesharePreferencesListeners() { + final Context context = getActivity().getApplicationContext(); + + CheckBoxPreference dshareTogglePref = (CheckBoxPreference) findPreference(getString(R.string.pref_dshare_enabled_key)); + if (dshareTogglePref != null) { + dshareTogglePref + .setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() { + @Override + public boolean onPreferenceChange(Preference preference, Object newValue) { + if ((Boolean) newValue) { + context.startService(UploaderService.createIntent(context)); + } + return true; + } + }); + } + + EditTextPreference dshareUsernamePref = (EditTextPreference) findPreference(getString(R.string.pref_dshare_username_key)); + if (dshareUsernamePref != null) { + dshareUsernamePref + .setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() { + @Override + public boolean onPreferenceChange(Preference preference, Object newValue) { + if (!newValue.toString().isEmpty()) { + context.startService(UploaderService.createIntent(context)); + } + return true; + } + }); + } + + EditTextPreference dsharePasswordPref = (EditTextPreference) findPreference(getString(R.string.pref_dshare_password_key)); + if (dsharePasswordPref != null) { + dsharePasswordPref + .setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() { + @Override + public boolean onPreferenceChange(Preference preference, Object newValue) { + if (!newValue.toString().isEmpty()) { + context.startService(UploaderService.createIntent(context)); + } + return true; + } + }); + } } - /** - * When a droneshare preference is updated, the listener will kick start the droneshare - * uploader service to see if any action is needed. - */ - private void setDronesharePreferencesListeners() { - final Context context = getActivity().getApplicationContext(); - - CheckBoxPreference dshareTogglePref = (CheckBoxPreference) findPreference(getString(R - .string.pref_dshare_enabled_key)); - if(dshareTogglePref != null){ - dshareTogglePref.setOnPreferenceChangeListener(new Preference - .OnPreferenceChangeListener() { - @Override - public boolean onPreferenceChange(Preference preference, Object newValue) { - if((Boolean) newValue){ - context.startService(UploaderService.createIntent(context)); - } - return true; - } - }); - } - - EditTextPreference dshareUsernamePref = (EditTextPreference) findPreference(getString(R - .string.pref_dshare_username_key)); - if(dshareUsernamePref != null){ - dshareUsernamePref.setOnPreferenceChangeListener(new Preference - .OnPreferenceChangeListener() { - @Override - public boolean onPreferenceChange(Preference preference, Object newValue) { - if(!newValue.toString().isEmpty()){ - context.startService(UploaderService.createIntent(context)); - } - return true; - } - }); - } - - EditTextPreference dsharePasswordPref = (EditTextPreference) findPreference(getString(R - .string.pref_dshare_password_key)); - if(dsharePasswordPref != null){ - dsharePasswordPref.setOnPreferenceChangeListener(new Preference - .OnPreferenceChangeListener() { - @Override - public boolean onPreferenceChange(Preference preference, Object newValue) { - if(!newValue.toString().isEmpty()){ - context.startService(UploaderService.createIntent(context)); - } - return true; - } - }); - } - } - - /** - * Pebble Install Button. When clicked, will check for pebble if pebble - * is not present, error displayed. If it is, the pbw (pebble bundle) - * will be copied from assets to external memory (makes sure to - * overwrite), and sends pbw intent for pebble app to install bundle. - */ - private void setupPebblePreference(){ - final Context context = getActivity().getApplicationContext(); - - Preference pebblePreference = findPreference(getString(R.string.pref_pebble_install_key)); - pebblePreference.setOnPreferenceClickListener(new OnPreferenceClickListener() { - @Override - public boolean onPreferenceClick(Preference pref) { - if (PebbleKit.isWatchConnected(context)) { - InputStream in = null; - OutputStream out = null; - try { - in = context.getAssets().open("Pebble/DroidPlanner.pbw"); - File outFile = new File(DirectoryPath.getDroidPlannerPath(), - "DroidPlanner.pbw"); - out = new FileOutputStream(outFile); - byte[] buffer = new byte[1024]; - int read; - while ((read = in.read(buffer)) != -1) { - out.write(buffer, 0, read); - } - in.close(); - in = null; - out.flush(); - out.close(); - out = null; - - Intent intent = new Intent(Intent.ACTION_VIEW); - intent.setData(Uri.fromFile(outFile)); - intent.setClassName("com.getpebble.android", - "com.getpebble.android.ui.UpdateActivity"); - startActivity(intent); - } catch (IOException e) { - Log.e("pebble", "Failed to copy pbw asset", e); - Toast.makeText(context, "Failed to copy pbw asset", Toast.LENGTH_SHORT) - .show(); - } catch (ActivityNotFoundException e) { - Log.e("pebble", "Pebble App Not installed", e); - Toast.makeText(context, "Pebble App Not installed", Toast.LENGTH_SHORT) - .show(); - } - } else { - Toast.makeText(context, "No Pebble Connected", Toast.LENGTH_SHORT).show(); - } - return true; - } - }); - } + /** + * Pebble Install Button. When clicked, will check for pebble if pebble is + * not present, error displayed. If it is, the pbw (pebble bundle) will be + * copied from assets to external memory (makes sure to overwrite), and + * sends pbw intent for pebble app to install bundle. + */ + private void setupPebblePreference() { + final Context context = getActivity().getApplicationContext(); + + Preference pebblePreference = findPreference(getString(R.string.pref_pebble_install_key)); + pebblePreference.setOnPreferenceClickListener(new OnPreferenceClickListener() { + @Override + public boolean onPreferenceClick(Preference pref) { + if (PebbleKit.isWatchConnected(context)) { + InputStream in = null; + OutputStream out = null; + try { + in = context.getAssets().open("Pebble/DroidPlanner.pbw"); + File outFile = new File(DirectoryPath.getDroidPlannerPath(), + "DroidPlanner.pbw"); + out = new FileOutputStream(outFile); + byte[] buffer = new byte[1024]; + int read; + while ((read = in.read(buffer)) != -1) { + out.write(buffer, 0, read); + } + in.close(); + in = null; + out.flush(); + out.close(); + out = null; + + Intent intent = new Intent(Intent.ACTION_VIEW); + intent.setData(Uri.fromFile(outFile)); + intent.setClassName("com.getpebble.android", + "com.getpebble.android.ui.UpdateActivity"); + startActivity(intent); + } catch (IOException e) { + Log.e("pebble", "Failed to copy pbw asset", e); + Toast.makeText(context, "Failed to copy pbw asset", Toast.LENGTH_SHORT) + .show(); + } catch (ActivityNotFoundException e) { + Log.e("pebble", "Pebble App Not installed", e); + Toast.makeText(context, "Pebble App Not installed", Toast.LENGTH_SHORT) + .show(); + } + } else { + Toast.makeText(context, "No Pebble Connected", Toast.LENGTH_SHORT).show(); + } + return true; + } + }); + } private void initSummaryPerPrefs() { mDefaultSummaryPrefs.clear(); @@ -384,25 +380,34 @@ public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, Strin } } - if(key.equals(getString(R.string.pref_tts_periodic_period_key))){ + if (key.equals(getString(R.string.pref_tts_periodic_period_key))) { setupPeriodicControls(); - int val = Integer.parseInt(sharedPreferences.getString(getString(R.string.pref_tts_periodic_period_key), null)); - if(droidPlannerApp.getDrone().getMavClient().isConnected()) { - droidPlannerApp.mNotificationHandler.getTtsNotification().setupPeriodicSpeechOutput(val, droidPlannerApp.getDrone()); + int val = Integer.parseInt(sharedPreferences.getString( + getString(R.string.pref_tts_periodic_period_key), null)); + if (droidPlannerApp.getDrone().getMavClient().isConnected()) { + droidPlannerApp.mNotificationHandler.getTtsNotification() + .setupPeriodicSpeechOutput(val, droidPlannerApp.getDrone()); } } } - private void setupPeriodicControls(){ - final PreferenceCategory periodicSpeechPrefs = (PreferenceCategory) findPreference(getActivity().getApplicationContext().getString(R.string.pref_tts_periodic_key)); + private void setupPeriodicControls() { + final PreferenceCategory periodicSpeechPrefs = (PreferenceCategory) findPreference(getActivity() + .getApplicationContext().getString(R.string.pref_tts_periodic_key)); ListPreference periodic = ((ListPreference) periodicSpeechPrefs.getPreference(0)); - int val = Integer.parseInt(periodic.getValue()); - if(val != 0) { + int val; + try { + val = Integer.parseInt(periodic.getValue()); + } catch (NumberFormatException e) { + val = 0; + } + + if (val != 0) { periodic.setSummary("Status every " + val + " seconds"); - }else{ + } else { periodic.setSummary("Status disabled"); } - for(int i = 1; i < periodicSpeechPrefs.getPreferenceCount(); i ++) { + for (int i = 1; i < periodicSpeechPrefs.getPreferenceCount(); i++) { periodicSpeechPrefs.getPreference(i).setEnabled(val != 0); } } diff --git a/Android/src/org/droidplanner/android/fragments/TelemetryFragment.java b/Android/src/org/droidplanner/android/fragments/TelemetryFragment.java index b8b387e806..69f20b80b7 100644 --- a/Android/src/org/droidplanner/android/fragments/TelemetryFragment.java +++ b/Android/src/org/droidplanner/android/fragments/TelemetryFragment.java @@ -3,9 +3,9 @@ import org.droidplanner.R; import org.droidplanner.android.DroidPlannerApp; import org.droidplanner.android.widgets.AttitudeIndicator; -import org.droidplanner.core.model.Drone; import org.droidplanner.core.drone.DroneInterfaces.DroneEventsType; import org.droidplanner.core.drone.DroneInterfaces.OnDroneListener; +import org.droidplanner.core.model.Drone; import android.content.SharedPreferences; import android.os.Bundle; @@ -100,9 +100,12 @@ public void onOrientationUpdate(Drone drone) { } public void onSpeedAltitudeAndClimbRateUpdate(Drone drone) { - airSpeed.setText(String.format("%3.1f", drone.getSpeed().getAirSpeed().valueInMetersPerSecond())); - groundSpeed.setText(String.format("%3.1f", drone.getSpeed().getGroundSpeed().valueInMetersPerSecond())); - climbRate.setText(String.format("%3.1f", drone.getSpeed().getVerticalSpeed().valueInMetersPerSecond())); + airSpeed.setText(String.format("%3.1f", drone.getSpeed().getAirSpeed() + .valueInMetersPerSecond())); + groundSpeed.setText(String.format("%3.1f", drone.getSpeed().getGroundSpeed() + .valueInMetersPerSecond())); + climbRate.setText(String.format("%3.1f", drone.getSpeed().getVerticalSpeed() + .valueInMetersPerSecond())); double alt = drone.getAltitude().getAltitude(); double targetAlt = drone.getAltitude().getTargetAltitude(); altitude.setText(String.format("%3.1f", alt)); diff --git a/Android/src/org/droidplanner/android/fragments/TuningFragment.java b/Android/src/org/droidplanner/android/fragments/TuningFragment.java index bb27febb52..6169cc5866 100644 --- a/Android/src/org/droidplanner/android/fragments/TuningFragment.java +++ b/Android/src/org/droidplanner/android/fragments/TuningFragment.java @@ -5,9 +5,9 @@ import org.droidplanner.android.widgets.graph.Chart; import org.droidplanner.android.widgets.graph.ChartSeries; import org.droidplanner.core.MAVLink.MavLinkStreamRates; -import org.droidplanner.core.model.Drone; import org.droidplanner.core.drone.DroneInterfaces.DroneEventsType; import org.droidplanner.core.drone.DroneInterfaces.OnDroneListener; +import org.droidplanner.core.model.Drone; import android.graphics.Color; import android.os.Bundle; @@ -77,7 +77,8 @@ public void onStop() { private void setupDataStreamingForTuning() { // Sets the nav messages at 50Hz and other messages at a low rate 1Hz - MavLinkStreamRates.setupStreamRates(drone.getMavClient(), 1, 0, 1, 1, 1, 0, 0, NAV_MSG_RATE); + MavLinkStreamRates + .setupStreamRates(drone.getMavClient(), 1, 0, 1, 1, 1, 0, 0, NAV_MSG_RATE); } private void setupLocalViews(View view) { diff --git a/Android/src/org/droidplanner/android/fragments/calibration/flightmodes/FragmentSetupFM.java b/Android/src/org/droidplanner/android/fragments/calibration/flightmodes/FragmentSetupFM.java index 341931cc91..14f65b7891 100644 --- a/Android/src/org/droidplanner/android/fragments/calibration/flightmodes/FragmentSetupFM.java +++ b/Android/src/org/droidplanner/android/fragments/calibration/flightmodes/FragmentSetupFM.java @@ -6,8 +6,8 @@ import org.droidplanner.android.fragments.helpers.SuperSetupMainPanel; import org.droidplanner.android.helpers.calibration.CalParameters; import org.droidplanner.android.helpers.calibration.FM_CalParameters; -import org.droidplanner.core.model.Drone; import org.droidplanner.core.drone.DroneInterfaces.DroneEventsType; +import org.droidplanner.core.model.Drone; import android.view.View; import android.widget.ArrayAdapter; diff --git a/Android/src/org/droidplanner/android/fragments/calibration/imu/FragmentSetupIMU.java b/Android/src/org/droidplanner/android/fragments/calibration/imu/FragmentSetupIMU.java index aa755e5ec0..17177fb3a2 100644 --- a/Android/src/org/droidplanner/android/fragments/calibration/imu/FragmentSetupIMU.java +++ b/Android/src/org/droidplanner/android/fragments/calibration/imu/FragmentSetupIMU.java @@ -4,10 +4,10 @@ import org.droidplanner.android.fragments.SetupSensorFragment; import org.droidplanner.android.fragments.calibration.SetupMainPanel; import org.droidplanner.android.fragments.calibration.SetupSidePanel; -import org.droidplanner.core.model.Drone; import org.droidplanner.core.drone.DroneInterfaces.DroneEventsType; import org.droidplanner.core.drone.DroneInterfaces.OnDroneListener; import org.droidplanner.core.drone.variables.Calibration; +import org.droidplanner.core.model.Drone; import android.graphics.drawable.Drawable; import android.os.Handler; diff --git a/Android/src/org/droidplanner/android/fragments/calibration/rc/FragmentSetupRC.java b/Android/src/org/droidplanner/android/fragments/calibration/rc/FragmentSetupRC.java index b457232f00..5ca0b80c4d 100644 --- a/Android/src/org/droidplanner/android/fragments/calibration/rc/FragmentSetupRC.java +++ b/Android/src/org/droidplanner/android/fragments/calibration/rc/FragmentSetupRC.java @@ -12,8 +12,8 @@ import org.droidplanner.android.helpers.calibration.RC_CalParameters; import org.droidplanner.android.widgets.FillBar.FillBar; import org.droidplanner.android.widgets.RcStick.RcStick; -import org.droidplanner.core.model.Drone; import org.droidplanner.core.drone.DroneInterfaces.DroneEventsType; +import org.droidplanner.core.model.Drone; import android.os.Bundle; import android.view.View; diff --git a/Android/src/org/droidplanner/android/fragments/helpers/SuperSetupFragment.java b/Android/src/org/droidplanner/android/fragments/helpers/SuperSetupFragment.java index 417993906b..83b8ef2781 100644 --- a/Android/src/org/droidplanner/android/fragments/helpers/SuperSetupFragment.java +++ b/Android/src/org/droidplanner/android/fragments/helpers/SuperSetupFragment.java @@ -5,9 +5,9 @@ import org.droidplanner.android.activities.ConfigurationActivity; import org.droidplanner.android.fragments.calibration.SetupMainPanel; import org.droidplanner.android.fragments.calibration.SetupSidePanel; -import org.droidplanner.core.model.Drone; import org.droidplanner.core.drone.DroneInterfaces.DroneEventsType; import org.droidplanner.core.drone.DroneInterfaces.OnDroneListener; +import org.droidplanner.core.model.Drone; import android.app.Activity; import android.os.Bundle; diff --git a/Android/src/org/droidplanner/android/fragments/helpers/SuperSetupMainPanel.java b/Android/src/org/droidplanner/android/fragments/helpers/SuperSetupMainPanel.java index d87eacabd0..b754904b12 100644 --- a/Android/src/org/droidplanner/android/fragments/helpers/SuperSetupMainPanel.java +++ b/Android/src/org/droidplanner/android/fragments/helpers/SuperSetupMainPanel.java @@ -7,9 +7,9 @@ import org.droidplanner.android.fragments.calibration.SetupSidePanel; import org.droidplanner.android.helpers.calibration.CalParameters; import org.droidplanner.android.helpers.calibration.CalParameters.OnCalibrationEvent; -import org.droidplanner.core.model.Drone; import org.droidplanner.core.drone.DroneInterfaces.DroneEventsType; import org.droidplanner.core.drone.DroneInterfaces.OnDroneListener; +import org.droidplanner.core.model.Drone; import android.os.Bundle; diff --git a/Android/src/org/droidplanner/android/fragments/mode/FlightModePanel.java b/Android/src/org/droidplanner/android/fragments/mode/FlightModePanel.java index 47d82b0cc5..c3b925c234 100644 --- a/Android/src/org/droidplanner/android/fragments/mode/FlightModePanel.java +++ b/Android/src/org/droidplanner/android/fragments/mode/FlightModePanel.java @@ -3,9 +3,9 @@ import org.droidplanner.R; import org.droidplanner.android.DroidPlannerApp; import org.droidplanner.android.activities.helpers.SuperUI; -import org.droidplanner.core.model.Drone; import org.droidplanner.core.drone.DroneInterfaces; import org.droidplanner.core.drone.DroneInterfaces.OnDroneListener; +import org.droidplanner.core.model.Drone; import android.app.Activity; import android.os.Bundle; diff --git a/Android/src/org/droidplanner/android/fragments/mode/ModeFollowFragment.java b/Android/src/org/droidplanner/android/fragments/mode/ModeFollowFragment.java index e45810a1e6..ebb892a3aa 100644 --- a/Android/src/org/droidplanner/android/fragments/mode/ModeFollowFragment.java +++ b/Android/src/org/droidplanner/android/fragments/mode/ModeFollowFragment.java @@ -2,12 +2,12 @@ import org.droidplanner.R; import org.droidplanner.android.DroidPlannerApp; -import org.droidplanner.core.model.Drone; import org.droidplanner.core.drone.DroneInterfaces.DroneEventsType; import org.droidplanner.core.drone.DroneInterfaces.OnDroneListener; import org.droidplanner.core.gcs.follow.Follow; import org.droidplanner.core.gcs.follow.FollowAlgorithm.FollowModes; import org.droidplanner.core.helpers.units.Length; +import org.droidplanner.core.model.Drone; import android.os.Bundle; import android.view.LayoutInflater; diff --git a/Android/src/org/droidplanner/android/graphic/map/GraphicDrone.java b/Android/src/org/droidplanner/android/graphic/map/GraphicDrone.java index a96b6164c7..f3452f3eaa 100644 --- a/Android/src/org/droidplanner/android/graphic/map/GraphicDrone.java +++ b/Android/src/org/droidplanner/android/graphic/map/GraphicDrone.java @@ -2,8 +2,8 @@ import org.droidplanner.R; import org.droidplanner.android.maps.MarkerInfo; -import org.droidplanner.core.model.Drone; import org.droidplanner.core.helpers.coordinates.Coord2D; +import org.droidplanner.core.model.Drone; import android.content.res.Resources; import android.graphics.Bitmap; diff --git a/Android/src/org/droidplanner/android/graphic/map/GraphicGuided.java b/Android/src/org/droidplanner/android/graphic/map/GraphicGuided.java index 41bc983cd1..147e18520f 100644 --- a/Android/src/org/droidplanner/android/graphic/map/GraphicGuided.java +++ b/Android/src/org/droidplanner/android/graphic/map/GraphicGuided.java @@ -7,10 +7,10 @@ import org.droidplanner.android.maps.DPMap.PathSource; import org.droidplanner.android.maps.MarkerInfo; import org.droidplanner.android.maps.MarkerWithText; -import org.droidplanner.core.model.Drone; import org.droidplanner.core.drone.variables.GPS; import org.droidplanner.core.drone.variables.GuidedPoint; import org.droidplanner.core.helpers.coordinates.Coord2D; +import org.droidplanner.core.model.Drone; import android.content.res.Resources; import android.graphics.Bitmap; diff --git a/Android/src/org/droidplanner/android/graphic/map/GraphicHome.java b/Android/src/org/droidplanner/android/graphic/map/GraphicHome.java index 36417b15a0..9030e9b13c 100644 --- a/Android/src/org/droidplanner/android/graphic/map/GraphicHome.java +++ b/Android/src/org/droidplanner/android/graphic/map/GraphicHome.java @@ -2,9 +2,9 @@ import org.droidplanner.R; import org.droidplanner.android.maps.MarkerInfo; -import org.droidplanner.core.model.Drone; import org.droidplanner.core.drone.variables.Home; import org.droidplanner.core.helpers.coordinates.Coord2D; +import org.droidplanner.core.model.Drone; import android.content.res.Resources; import android.graphics.Bitmap; diff --git a/Android/src/org/droidplanner/android/maps/DPMap.java b/Android/src/org/droidplanner/android/maps/DPMap.java index eb5be29052..157c5ce486 100644 --- a/Android/src/org/droidplanner/android/maps/DPMap.java +++ b/Android/src/org/droidplanner/android/maps/DPMap.java @@ -140,25 +140,25 @@ interface OnMarkerDragListener { */ public void clearFlightPath(); - /** - * @return the map center coordinates. - */ - public Coord2D getMapCenter(); - - /** - * @return the map current zoom level. - */ - public float getMapZoomLevel(); - - /** - * @return the map maximum zoom level. - */ - public float getMaxZoomLevel(); - - /** - * @return the map minimum zoom level. - */ - public float getMinZoomLevel(); + /** + * @return the map center coordinates. + */ + public Coord2D getMapCenter(); + + /** + * @return the map current zoom level. + */ + public float getMapZoomLevel(); + + /** + * @return the map maximum zoom level. + */ + public float getMaxZoomLevel(); + + /** + * @return the map minimum zoom level. + */ + public float getMinZoomLevel(); /** * @return this map's provider. @@ -187,13 +187,13 @@ interface OnMarkerDragListener { */ public void saveCameraPosition(); - /** - * Enable map auto panning on the passed target type. - * - * @param mode - * auto pan target (user / drone / disabled). - */ - public void selectAutoPanMode(AutoPanMode mode); + /** + * Enable map auto panning on the passed target type. + * + * @param mode + * auto pan target (user / drone / disabled). + */ + public void selectAutoPanMode(AutoPanMode mode); /** * Adds padding around the edges of the map. diff --git a/Android/src/org/droidplanner/android/maps/providers/DPMapProvider.java b/Android/src/org/droidplanner/android/maps/providers/DPMapProvider.java index 69cee1864c..701e41c8df 100644 --- a/Android/src/org/droidplanner/android/maps/providers/DPMapProvider.java +++ b/Android/src/org/droidplanner/android/maps/providers/DPMapProvider.java @@ -26,20 +26,20 @@ public MapProviderPreferences getMapProviderPreferences() { } }, - /** - * Provides access to mapbox map. - */ - MAPBOX{ - @Override - public DPMap getMapFragment(){ - return new MapBoxFragment(); - } + /** + * Provides access to mapbox map. + */ + MAPBOX { + @Override + public DPMap getMapFragment() { + return new MapBoxFragment(); + } - @Override - public MapProviderPreferences getMapProviderPreferences(){ - return new MapBoxProviderPreferences(); - } - }; + @Override + public MapProviderPreferences getMapProviderPreferences() { + return new MapBoxProviderPreferences(); + } + }; /** * @return the fragment implementing the map. diff --git a/Android/src/org/droidplanner/android/maps/providers/google_map/GoogleMapFragment.java b/Android/src/org/droidplanner/android/maps/providers/google_map/GoogleMapFragment.java index 960270770b..cb9f9a7931 100644 --- a/Android/src/org/droidplanner/android/maps/providers/google_map/GoogleMapFragment.java +++ b/Android/src/org/droidplanner/android/maps/providers/google_map/GoogleMapFragment.java @@ -14,9 +14,9 @@ import org.droidplanner.android.utils.DroneHelper; import org.droidplanner.android.utils.prefs.AutoPanMode; import org.droidplanner.android.utils.prefs.DroidPlannerPrefs; -import org.droidplanner.core.model.Drone; import org.droidplanner.core.drone.DroneInterfaces; import org.droidplanner.core.helpers.coordinates.Coord2D; +import org.droidplanner.core.model.Drone; import android.content.Context; import android.content.IntentSender; @@ -188,27 +188,27 @@ public void clearFlightPath() { } } - @Override - public Coord2D getMapCenter() { - return DroneHelper.LatLngToCoord(mMap.getCameraPosition().target); - } + @Override + public Coord2D getMapCenter() { + return DroneHelper.LatLngToCoord(mMap.getCameraPosition().target); + } - @Override - public float getMapZoomLevel() { - return mMap.getCameraPosition().zoom; - } + @Override + public float getMapZoomLevel() { + return mMap.getCameraPosition().zoom; + } - @Override - public float getMaxZoomLevel() { - return mMap.getMaxZoomLevel(); - } + @Override + public float getMaxZoomLevel() { + return mMap.getMaxZoomLevel(); + } - @Override - public float getMinZoomLevel() { - return mMap.getMinZoomLevel(); - } + @Override + public float getMinZoomLevel() { + return mMap.getMinZoomLevel(); + } - @Override + @Override public void selectAutoPanMode(AutoPanMode target) { final AutoPanMode currentMode = mPanMode.get(); if (currentMode == target) diff --git a/Android/src/org/droidplanner/android/maps/providers/mapbox/ItemizedDraggableIconOverlay.java b/Android/src/org/droidplanner/android/maps/providers/mapbox/ItemizedDraggableIconOverlay.java index 6a8d8d8d11..eb08971206 100644 --- a/Android/src/org/droidplanner/android/maps/providers/mapbox/ItemizedDraggableIconOverlay.java +++ b/Android/src/org/droidplanner/android/maps/providers/mapbox/ItemizedDraggableIconOverlay.java @@ -1,5 +1,7 @@ package org.droidplanner.android.maps.providers.mapbox; +import java.util.List; + import android.content.Context; import android.graphics.Point; import android.graphics.PointF; @@ -12,117 +14,118 @@ import com.mapbox.mapboxsdk.views.MapView; import com.mapbox.mapboxsdk.views.util.Projection; -import java.util.List; - /** * Provides support for draggable markers. */ public class ItemizedDraggableIconOverlay extends ItemizedIconOverlay { - public interface OnMarkerDragListener{ - abstract void onMarkerDrag(Marker marker); - abstract void onMarkerDragEnd(Marker marker); - abstract void onMarkerDragStart(Marker marker); - } - - private Marker mDragMarker; - private OnMarkerDragListener mMarkerDragListener; - - public ItemizedDraggableIconOverlay(Context pContext, List pList, OnItemGestureListener pOnItemGestureListener) { - super(pContext, pList, pOnItemGestureListener); - } - - public void setMarkerDragListener(OnMarkerDragListener markerDragListener){ - mMarkerDragListener = markerDragListener; - } - - @Override - public boolean onTouchEvent(final MotionEvent event, final MapView mapView){ - if(mDragMarker != null){ - if(event.getAction() == MotionEvent.ACTION_UP){ - if(mMarkerDragListener != null){ - mMarkerDragListener.onMarkerDragEnd(mDragMarker); - } - mDragMarker = null; - } - else if(event.getAction() == MotionEvent.ACTION_MOVE){ - moveToEventPosition(event, mapView, mDragMarker); - if(mMarkerDragListener != null){ - mMarkerDragListener.onMarkerDrag(mDragMarker); - } - } - else{ - return false; - } - return true; - } - return false; - } - - @Override - public boolean onLongPress(final MotionEvent event, final MapView mapView){ - return (activateSelectedItems(event, mapView, new ActiveItem() { - @Override - public boolean run(int index) { - final Marker pressedMarker = getItem(index); - mDragMarker = pressedMarker; - if(mMarkerDragListener != null){ - mMarkerDragListener.onMarkerDragStart(pressedMarker); - } - moveToEventPosition(event, mapView, pressedMarker); - return true; - } - })); - } - - public void moveToEventPosition(final MotionEvent event, final MapView mapView, - final Marker marker){ - final Projection pj = mapView.getProjection(); - marker.setPoint((LatLng)pj.fromPixels(event.getX(), event.getY())); - mapView.invalidate(); - } - - /** - * When a content sensitive action is performed the content item needs to be identified. This - * method does that and then performs the assigned task on that item. - * - * @return true if event is handled false otherwise - */ - protected boolean activateSelectedItems(final MotionEvent event, final MapView mapView, - final ActiveItem task) { - final Projection projection = mapView.getProjection(); - final float x = event.getX(); - final float y = event.getY(); - for (int i = 0; i < this.mItemList.size(); ++i) { - final Marker item = getItem(i); - if (markerHitTest(item, projection, x, y)) { - if (task.run(i)) { - this.setFocus(item); - return true; - } - } - } - return false; - } - - @Override - protected boolean markerHitTest(final Marker pMarker, final Projection pProjection, - final float pX, final float pY) { - RectF rect = getMarkerDrawingBounds(pProjection, null, pMarker); - return rect.contains(pX, pY); - } - - private static RectF getMarkerDrawingBounds(final Projection projection, RectF reuse, Marker marker) { - if (reuse == null) { - reuse = new RectF(); - } - final PointF position = marker.getPositionOnScreen(projection, null); - final int w = marker.getWidth(); - final int h = marker.getHeight(); - final Point anchor = marker.getAnchor(); - final float x = position.x + anchor.x; - final float y = position.y + anchor.y; - reuse.set(x, y, x + w, y + h * 2); - return reuse; - } + public interface OnMarkerDragListener { + abstract void onMarkerDrag(Marker marker); + + abstract void onMarkerDragEnd(Marker marker); + + abstract void onMarkerDragStart(Marker marker); + } + + private Marker mDragMarker; + private OnMarkerDragListener mMarkerDragListener; + + public ItemizedDraggableIconOverlay(Context pContext, List pList, + OnItemGestureListener pOnItemGestureListener) { + super(pContext, pList, pOnItemGestureListener); + } + + public void setMarkerDragListener(OnMarkerDragListener markerDragListener) { + mMarkerDragListener = markerDragListener; + } + + @Override + public boolean onTouchEvent(final MotionEvent event, final MapView mapView) { + if (mDragMarker != null) { + if (event.getAction() == MotionEvent.ACTION_UP) { + if (mMarkerDragListener != null) { + mMarkerDragListener.onMarkerDragEnd(mDragMarker); + } + mDragMarker = null; + } else if (event.getAction() == MotionEvent.ACTION_MOVE) { + moveToEventPosition(event, mapView, mDragMarker); + if (mMarkerDragListener != null) { + mMarkerDragListener.onMarkerDrag(mDragMarker); + } + } else { + return false; + } + return true; + } + return false; + } + + @Override + public boolean onLongPress(final MotionEvent event, final MapView mapView) { + return (activateSelectedItems(event, mapView, new ActiveItem() { + @Override + public boolean run(int index) { + final Marker pressedMarker = getItem(index); + mDragMarker = pressedMarker; + if (mMarkerDragListener != null) { + mMarkerDragListener.onMarkerDragStart(pressedMarker); + } + moveToEventPosition(event, mapView, pressedMarker); + return true; + } + })); + } + + public void moveToEventPosition(final MotionEvent event, final MapView mapView, + final Marker marker) { + final Projection pj = mapView.getProjection(); + marker.setPoint((LatLng) pj.fromPixels(event.getX(), event.getY())); + mapView.invalidate(); + } + + /** + * When a content sensitive action is performed the content item needs to be + * identified. This method does that and then performs the assigned task on + * that item. + * + * @return true if event is handled false otherwise + */ + protected boolean activateSelectedItems(final MotionEvent event, final MapView mapView, + final ActiveItem task) { + final Projection projection = mapView.getProjection(); + final float x = event.getX(); + final float y = event.getY(); + for (int i = 0; i < this.mItemList.size(); ++i) { + final Marker item = getItem(i); + if (markerHitTest(item, projection, x, y)) { + if (task.run(i)) { + this.setFocus(item); + return true; + } + } + } + return false; + } + + @Override + protected boolean markerHitTest(final Marker pMarker, final Projection pProjection, + final float pX, final float pY) { + RectF rect = getMarkerDrawingBounds(pProjection, null, pMarker); + return rect.contains(pX, pY); + } + + private static RectF getMarkerDrawingBounds(final Projection projection, RectF reuse, + Marker marker) { + if (reuse == null) { + reuse = new RectF(); + } + final PointF position = marker.getPositionOnScreen(projection, null); + final int w = marker.getWidth(); + final int h = marker.getHeight(); + final Point anchor = marker.getAnchor(); + final float x = position.x + anchor.x; + final float y = position.y + anchor.y; + reuse.set(x, y, x + w, y + h * 2); + return reuse; + } } diff --git a/Android/src/org/droidplanner/android/maps/providers/mapbox/MapBoxFragment.java b/Android/src/org/droidplanner/android/maps/providers/mapbox/MapBoxFragment.java index 9c32dfee9c..4768e8b371 100644 --- a/Android/src/org/droidplanner/android/maps/providers/mapbox/MapBoxFragment.java +++ b/Android/src/org/droidplanner/android/maps/providers/mapbox/MapBoxFragment.java @@ -1,5 +1,21 @@ package org.droidplanner.android.maps.providers.mapbox; +import java.util.ArrayList; +import java.util.List; +import java.util.concurrent.atomic.AtomicReference; + +import org.droidplanner.R; +import org.droidplanner.android.DroidPlannerApp; +import org.droidplanner.android.maps.DPMap; +import org.droidplanner.android.maps.MarkerInfo; +import org.droidplanner.android.maps.providers.DPMapProvider; +import org.droidplanner.android.utils.DroneHelper; +import org.droidplanner.android.utils.prefs.AutoPanMode; +import org.droidplanner.android.utils.prefs.DroidPlannerPrefs; +import org.droidplanner.core.drone.DroneInterfaces; +import org.droidplanner.core.helpers.coordinates.Coord2D; +import org.droidplanner.core.model.Drone; + import android.app.Activity; import android.content.SharedPreferences; import android.content.res.Resources; @@ -28,494 +44,478 @@ import com.mapbox.mapboxsdk.views.MapViewListener; import com.mapbox.mapboxsdk.views.util.Projection; -import org.droidplanner.R; -import org.droidplanner.android.DroidPlannerApp; -import org.droidplanner.android.maps.DPMap; -import org.droidplanner.android.maps.MarkerInfo; -import org.droidplanner.android.maps.providers.DPMapProvider; -import org.droidplanner.android.utils.DroneHelper; -import org.droidplanner.android.utils.prefs.AutoPanMode; -import org.droidplanner.android.utils.prefs.DroidPlannerPrefs; -import org.droidplanner.core.drone.DroneInterfaces; -import org.droidplanner.core.helpers.coordinates.Coord2D; -import org.droidplanner.core.model.Drone; - -import java.util.ArrayList; -import java.util.List; -import java.util.concurrent.atomic.AtomicReference; - /** * MapBox implementation of the DPMap interface. */ public class MapBoxFragment extends Fragment implements DPMap { - private final HashBiMap mMarkers = HashBiMap.create(); - - private final ItemizedDraggableIconOverlay.OnMarkerDragListener mMarkerDragHandler = new ItemizedDraggableIconOverlay.OnMarkerDragListener() { - @Override - public void onMarkerDrag(Marker marker) { - if(mMarkerDragListener != null){ - final MarkerInfo markerInfo = getMarkerInfo(marker); - markerInfo.setPosition(DroneHelper.ILatLngToCoord(marker.getPoint())); - mMarkerDragListener.onMarkerDrag(markerInfo); - } - } - - @Override - public void onMarkerDragEnd(Marker marker) { - if(mMarkerDragListener != null){ - final MarkerInfo markerInfo = getMarkerInfo(marker); - markerInfo.setPosition(DroneHelper.ILatLngToCoord(marker.getPoint())); - mMarkerDragListener.onMarkerDragEnd(markerInfo); - } - } - - @Override - public void onMarkerDragStart(Marker marker) { - if(mMarkerDragListener != null){ - final MarkerInfo markerInfo = getMarkerInfo(marker); - markerInfo.setPosition(DroneHelper.ILatLngToCoord(marker.getPoint())); - mMarkerDragListener.onMarkerDragStart(markerInfo); - } - } - }; - - private final MapViewListener mMapViewListener = new MapViewListener() { - @Override - public void onShowMarker(MapView pMapView, Marker pMarker) { - } - - @Override - public void onHidemarker(MapView pMapView, Marker pMarker) { - } - - @Override - public void onTapMarker(MapView pMapView, final Marker pMarker) { - if (mMarkerClickListener != null) { - mMarkerClickListener.onMarkerClick(getMarkerInfo(pMarker)); - } - } - - @Override - public void onLongPressMarker(MapView pMapView, Marker pMarker) {} - - @Override - public void onTapMap(MapView pMapView, final ILatLng pPosition) { - if (mMapClickListener != null) { - mMapClickListener.onMapClick(DroneHelper.ILatLngToCoord(pPosition)); - } - } - - @Override - public void onLongPressMap(MapView pMapView, final ILatLng pPosition) { - if (mMapLongClickListener != null) { - mMapLongClickListener.onMapLongClick(DroneHelper.ILatLngToCoord(pPosition)); - } - } - }; - - private Drone mDrone; - private DroidPlannerPrefs mPrefs; - - private final AtomicReference mPanMode = new AtomicReference - (AutoPanMode.DISABLED); - - /** - * Mapbox map view handle - */ - private MapView mMapView; - private TrackingMode mUserLocationTrackingMode = TrackingMode.NONE; - private ItemizedDraggableIconOverlay mMarkersOverlay; - - private PathOverlay mFlightPath; - private PathOverlay mMissionPath; - private PathOverlay mDroneLeashPath; - - /** - * Listeners - */ - private OnMapClickListener mMapClickListener; - private OnMapLongClickListener mMapLongClickListener; - private OnMarkerDragListener mMarkerDragListener; - private OnMarkerClickListener mMarkerClickListener; - - @Override - public View onCreateView(LayoutInflater inflater, ViewGroup container, - Bundle savedInstanceState) { - return inflater.inflate(R.layout.fragment_mapbox, container, false); - } - - @Override - public void onViewCreated(View view, Bundle savedInstanceState) { - super.onViewCreated(view, savedInstanceState); - - final Activity activity = getActivity(); - mDrone = ((DroidPlannerApp) activity.getApplication()).getDrone(); - mPrefs = new DroidPlannerPrefs(activity.getApplicationContext()); - mMapView = (MapView) view.findViewById(R.id.mapbox_mapview); - } - - @Override - public void onStart() { - super.onStart(); - setupMap(); - - mMapView.setUserLocationEnabled(true); - final UserLocationOverlay userLocation = mMapView.getUserLocationOverlay(); - if (userLocation != null) { - userLocation.setDrawAccuracyEnabled(true); - - if (mUserLocationTrackingMode == TrackingMode.NONE) { - userLocation.disableFollowLocation(); - } else { - userLocation.enableFollowLocation(); - } - } - } - - private void setupMap() { - //TODO complete - mMapView.setMapViewListener(mMapViewListener); - - final RotationGestureOverlay rotationOverlay = new RotationGestureOverlay(mMapView); - rotationOverlay.setEnabled(false); - - mMapView.getOverlays().add(rotationOverlay); - resetMarkersOverlay(); - } - - private void resetMarkersOverlay() { - if (mMarkersOverlay != null) { - mMarkersOverlay.removeAllItems(); - mMapView.removeOverlay(mMarkersOverlay); - } - - mMarkersOverlay = new ItemizedDraggableIconOverlay(getActivity().getApplicationContext(), - new ArrayList(), new ItemizedIconOverlay.OnItemGestureListener() { - @Override - public boolean onItemSingleTapUp(int index, Marker item) { - mMapView.selectMarker(item); - return true; - } - - @Override - public boolean onItemLongPress(int index, Marker item) { - mMapViewListener.onLongPressMarker(mMapView, item); - return true; - } - }); - mMarkersOverlay.setMarkerDragListener(mMarkerDragHandler); - mMapView.addItemizedOverlay(mMarkersOverlay); - } - - @Override - public void onStop() { - super.onStop(); - - final UserLocationOverlay userLocation = mMapView.getUserLocationOverlay(); - if (userLocation != null) { - userLocation.disableFollowLocation(); - } - - mMapView.setUserLocationEnabled(false); - } - - /** - * Used to retrieve the info for the given marker. - * - * @param marker marker whose info to retrieve - * @return marker's info - */ - private MarkerInfo getMarkerInfo(Marker marker) { - return mMarkers.inverse().get(marker); - } - - @Override - public void addFlightPathPoint(Coord2D coord) { - if (mFlightPath == null) { - mFlightPath = new PathOverlay(FLIGHT_PATH_DEFAULT_COLOR, FLIGHT_PATH_DEFAULT_WIDTH); - mMapView.getOverlays().add(mFlightPath); - } - - mFlightPath.addPoint(DroneHelper.CoordToLatLng(coord)); - } - - @Override - public void cleanMarkers() { - resetMarkersOverlay(); - mMarkers.clear(); - mMapView.invalidate(); - } - - @Override - public void clearFlightPath() { - if (mFlightPath != null) { - mFlightPath.clearPath(); - } - } - - @Override - public Coord2D getMapCenter() { - return DroneHelper.ILatLngToCoord(mMapView.getCenter()); - } - - @Override - public float getMapZoomLevel() { - return mMapView.getZoomLevel(); - } - - @Override - public float getMaxZoomLevel() { - return mMapView.getMaxZoomLevel(); - } - - @Override - public float getMinZoomLevel() { - return mMapView.getMinZoomLevel(); - } - - @Override - public DPMapProvider getProvider() { - return DPMapProvider.MAPBOX; - } - - @Override - public void goToDroneLocation() { - final float currentZoomLevel = getMapZoomLevel(); - final Coord2D droneLocation = mDrone.getGps().getPosition(); - updateCamera(droneLocation, currentZoomLevel); - } - - @Override - public void goToMyLocation() { - final UserLocationOverlay userLocation = mMapView.getUserLocationOverlay(); - if (userLocation != null) { - userLocation.goToMyPosition(true); - } - } - - @Override - public void loadCameraPosition() { - final float centerLat = mPrefs.prefs.getFloat(PREF_LAT, 0); - final float centerLng = mPrefs.prefs.getFloat(PREF_LNG, 0); - mMapView.setCenter(new LatLng(centerLat, centerLng)); - - final float zoom = mPrefs.prefs.getFloat(PREF_ZOOM, 0); - mMapView.setZoom(zoom); - - final float rotation = mPrefs.prefs.getFloat(PREF_BEA, 0); - mMapView.setRotation(rotation); - } - - @Override - public List projectPathIntoMap(List pathPoints) { - final List coords = new ArrayList(); - - Projection projection = mMapView.getProjection(); - for (Coord2D point : pathPoints) { - ILatLng coord = projection.fromPixels((float) point.getX(), (float) point.getY()); - coords.add(DroneHelper.ILatLngToCoord(coord)); - } - return coords; - } - - @Override - public void saveCameraPosition() { - SharedPreferences.Editor editor = mPrefs.prefs.edit(); - final ILatLng mapCenter = mMapView.getCenter(); - editor.putFloat(PREF_LAT, (float) mapCenter.getLatitude()) - .putFloat(PREF_LNG, (float) mapCenter.getLongitude()) - .putFloat(PREF_BEA, mMapView.getRotation()) - .putFloat(PREF_ZOOM, mMapView.getZoomLevel()) - .apply(); - } - - @Override - public void selectAutoPanMode(AutoPanMode target) { - final AutoPanMode currentMode = mPanMode.get(); - if (currentMode == target) - return; - - setAutoPanMode(currentMode, target); - } - - private void setAutoPanMode(AutoPanMode current, AutoPanMode update) { - if (mPanMode.compareAndSet(current, update)) { - switch (current) { - case DRONE: - mDrone.removeDroneListener(this); - break; - - case USER: - mUserLocationTrackingMode = TrackingMode.NONE; - final UserLocationOverlay userLocation = mMapView.getUserLocationOverlay(); - if (userLocation != null) { - userLocation.disableFollowLocation(); - } - break; - - case DISABLED: - default: - break; - } - - switch (update) { - case DRONE: - mDrone.addDroneListener(this); - break; - - case USER: - mUserLocationTrackingMode = TrackingMode.FOLLOW; - final UserLocationOverlay userLocation = mMapView.getUserLocationOverlay(); - if (userLocation != null) { - userLocation.enableFollowLocation(); - } - break; - - case DISABLED: - default: - break; - } - } - } - - @Override - public void setMapPadding(int left, int top, int right, int bottom) { - } - - @Override - public void setOnMapClickListener(OnMapClickListener listener) { - mMapClickListener = listener; - } - - @Override - public void setOnMapLongClickListener(OnMapLongClickListener listener) { - mMapLongClickListener = listener; - } - - @Override - public void setOnMarkerClickListener(OnMarkerClickListener listener) { - mMarkerClickListener = listener; - } - - @Override - public void setOnMarkerDragListener(OnMarkerDragListener listener) { - mMarkerDragListener = listener; - } - - @Override - public void updateCamera(Coord2D coord, float zoomLevel) { - MapController mapController = mMapView.getController(); - if (mapController != null) { - mapController.setZoomAnimated(zoomLevel, DroneHelper.CoordToLatLng(coord), true, false); - } - } - - @Override - public void updateDroneLeashPath(PathSource pathSource) { - final List pathCoords = pathSource.getPathPoints(); - - if (mDroneLeashPath == null) { - mDroneLeashPath = new PathOverlay(DRONE_LEASH_DEFAULT_COLOR, DRONE_LEASH_DEFAULT_WIDTH); - mMapView.getOverlays().add(mDroneLeashPath); - } - - mDroneLeashPath.clearPath(); - for (Coord2D coord : pathCoords) { - mDroneLeashPath.addPoint(DroneHelper.CoordToLatLng(coord)); - } - } - - @Override - public void updateMarker(MarkerInfo markerInfo) { - updateMarker(markerInfo, markerInfo.isDraggable()); - } - - @Override - public void updateMarker(MarkerInfo markerInfo, boolean isDraggable) { - final LatLng position = DroneHelper.CoordToLatLng(markerInfo.getPosition()); - Marker marker = mMarkers.get(markerInfo); - if (marker == null) { - marker = new Marker(mMapView, markerInfo.getTitle(), markerInfo.getSnippet(), position); - mMarkersOverlay.addItem(marker); - mMarkers.put(markerInfo, marker); - } else { - marker.setTitle(markerInfo.getTitle()); - marker.setDescription(markerInfo.getSnippet()); - marker.setPoint(position); - } - - //Update the marker - final Resources res = getResources(); - Bitmap markerIcon = markerInfo.getIcon(res); - if (markerIcon == null) { - markerIcon = BitmapFactory.decodeResource(res, R.drawable.ic_action_location); - } - - marker.setIcon(new Icon(new BitmapDrawable(res, markerIcon))); - - marker.setAnchor(new PointF(markerInfo.getAnchorU(), markerInfo.getAnchorV())); - marker.invalidate(); - mMapView.invalidate(); - } - - @Override - public void updateMarkers(List markersInfos) { - for (MarkerInfo info : markersInfos) { - updateMarker(info); - } - } - - @Override - public void updateMarkers(List markersInfos, boolean isDraggable) { - for (MarkerInfo info : markersInfos) { - updateMarker(info, isDraggable); - } - } - - @Override - public void updateMissionPath(PathSource pathSource) { - final List pathCoords = pathSource.getPathPoints(); - - if (mMissionPath == null) { - mMissionPath = new PathOverlay(MISSION_PATH_DEFAULT_COLOR, MISSION_PATH_DEFAULT_WIDTH); - mMapView.getOverlays().add(mMissionPath); - } - - mMissionPath.clearPath(); - for (Coord2D coord : pathCoords) { - mMissionPath.addPoint(DroneHelper.CoordToLatLng(coord)); - } - } - - @Override - public void zoomToFit(List coords) { - if(coords.isEmpty()){ - return; - } - - final ArrayList boxCoords = new ArrayList(coords.size()); - for(Coord2D coord: coords){ - boxCoords.add(DroneHelper.CoordToLatLng(coord)); - } - - final BoundingBox enclosingBounds = BoundingBox.fromLatLngs(boxCoords); - mMapView.zoomToBoundingBox(enclosingBounds, true, true, true); - } - - @Override - public void onDroneEvent(DroneInterfaces.DroneEventsType event, Drone drone) { - switch (event) { - case GPS: - if (mPanMode.get() == AutoPanMode.DRONE) { - final float currentZoomLevel = getMapZoomLevel(); - final Coord2D droneLocation = drone.getGps().getPosition(); - updateCamera(droneLocation, currentZoomLevel); - } - break; - - default: - break; - } - } + private final HashBiMap mMarkers = HashBiMap.create(); + + private final ItemizedDraggableIconOverlay.OnMarkerDragListener mMarkerDragHandler = new ItemizedDraggableIconOverlay.OnMarkerDragListener() { + @Override + public void onMarkerDrag(Marker marker) { + if (mMarkerDragListener != null) { + final MarkerInfo markerInfo = getMarkerInfo(marker); + markerInfo.setPosition(DroneHelper.ILatLngToCoord(marker.getPoint())); + mMarkerDragListener.onMarkerDrag(markerInfo); + } + } + + @Override + public void onMarkerDragEnd(Marker marker) { + if (mMarkerDragListener != null) { + final MarkerInfo markerInfo = getMarkerInfo(marker); + markerInfo.setPosition(DroneHelper.ILatLngToCoord(marker.getPoint())); + mMarkerDragListener.onMarkerDragEnd(markerInfo); + } + } + + @Override + public void onMarkerDragStart(Marker marker) { + if (mMarkerDragListener != null) { + final MarkerInfo markerInfo = getMarkerInfo(marker); + markerInfo.setPosition(DroneHelper.ILatLngToCoord(marker.getPoint())); + mMarkerDragListener.onMarkerDragStart(markerInfo); + } + } + }; + + private final MapViewListener mMapViewListener = new MapViewListener() { + @Override + public void onShowMarker(MapView pMapView, Marker pMarker) { + } + + @Override + public void onHidemarker(MapView pMapView, Marker pMarker) { + } + + @Override + public void onTapMarker(MapView pMapView, final Marker pMarker) { + if (mMarkerClickListener != null) { + mMarkerClickListener.onMarkerClick(getMarkerInfo(pMarker)); + } + } + + @Override + public void onLongPressMarker(MapView pMapView, Marker pMarker) { + } + + @Override + public void onTapMap(MapView pMapView, final ILatLng pPosition) { + if (mMapClickListener != null) { + mMapClickListener.onMapClick(DroneHelper.ILatLngToCoord(pPosition)); + } + } + + @Override + public void onLongPressMap(MapView pMapView, final ILatLng pPosition) { + if (mMapLongClickListener != null) { + mMapLongClickListener.onMapLongClick(DroneHelper.ILatLngToCoord(pPosition)); + } + } + }; + + private Drone mDrone; + private DroidPlannerPrefs mPrefs; + + private final AtomicReference mPanMode = new AtomicReference( + AutoPanMode.DISABLED); + + /** + * Mapbox map view handle + */ + private MapView mMapView; + private TrackingMode mUserLocationTrackingMode = TrackingMode.NONE; + private ItemizedDraggableIconOverlay mMarkersOverlay; + + private PathOverlay mFlightPath; + private PathOverlay mMissionPath; + private PathOverlay mDroneLeashPath; + + /** + * Listeners + */ + private OnMapClickListener mMapClickListener; + private OnMapLongClickListener mMapLongClickListener; + private OnMarkerDragListener mMarkerDragListener; + private OnMarkerClickListener mMarkerClickListener; + + @Override + public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { + return inflater.inflate(R.layout.fragment_mapbox, container, false); + } + + @Override + public void onViewCreated(View view, Bundle savedInstanceState) { + super.onViewCreated(view, savedInstanceState); + + final Activity activity = getActivity(); + mDrone = ((DroidPlannerApp) activity.getApplication()).getDrone(); + mPrefs = new DroidPlannerPrefs(activity.getApplicationContext()); + mMapView = (MapView) view.findViewById(R.id.mapbox_mapview); + } + + @Override + public void onStart() { + super.onStart(); + setupMap(); + + mMapView.setUserLocationEnabled(true); + final UserLocationOverlay userLocation = mMapView.getUserLocationOverlay(); + if (userLocation != null) { + userLocation.setDrawAccuracyEnabled(true); + + if (mUserLocationTrackingMode == TrackingMode.NONE) { + userLocation.disableFollowLocation(); + } else { + userLocation.enableFollowLocation(); + } + } + } + + private void setupMap() { + // TODO complete + mMapView.setMapViewListener(mMapViewListener); + + final RotationGestureOverlay rotationOverlay = new RotationGestureOverlay(mMapView); + rotationOverlay.setEnabled(false); + + mMapView.getOverlays().add(rotationOverlay); + resetMarkersOverlay(); + } + + private void resetMarkersOverlay() { + if (mMarkersOverlay != null) { + mMarkersOverlay.removeAllItems(); + mMapView.removeOverlay(mMarkersOverlay); + } + + mMarkersOverlay = new ItemizedDraggableIconOverlay(getActivity().getApplicationContext(), + new ArrayList(), new ItemizedIconOverlay.OnItemGestureListener() { + @Override + public boolean onItemSingleTapUp(int index, Marker item) { + mMapView.selectMarker(item); + return true; + } + + @Override + public boolean onItemLongPress(int index, Marker item) { + mMapViewListener.onLongPressMarker(mMapView, item); + return true; + } + }); + mMarkersOverlay.setMarkerDragListener(mMarkerDragHandler); + mMapView.addItemizedOverlay(mMarkersOverlay); + } + + @Override + public void onStop() { + super.onStop(); + + final UserLocationOverlay userLocation = mMapView.getUserLocationOverlay(); + if (userLocation != null) { + userLocation.disableFollowLocation(); + } + + mMapView.setUserLocationEnabled(false); + } + + /** + * Used to retrieve the info for the given marker. + * + * @param marker + * marker whose info to retrieve + * @return marker's info + */ + private MarkerInfo getMarkerInfo(Marker marker) { + return mMarkers.inverse().get(marker); + } + + @Override + public void addFlightPathPoint(Coord2D coord) { + if (mFlightPath == null) { + mFlightPath = new PathOverlay(FLIGHT_PATH_DEFAULT_COLOR, FLIGHT_PATH_DEFAULT_WIDTH); + mMapView.getOverlays().add(mFlightPath); + } + + mFlightPath.addPoint(DroneHelper.CoordToLatLng(coord)); + } + + @Override + public void cleanMarkers() { + resetMarkersOverlay(); + mMarkers.clear(); + mMapView.invalidate(); + } + + @Override + public void clearFlightPath() { + if (mFlightPath != null) { + mFlightPath.clearPath(); + } + } + + @Override + public Coord2D getMapCenter() { + return DroneHelper.ILatLngToCoord(mMapView.getCenter()); + } + + @Override + public float getMapZoomLevel() { + return mMapView.getZoomLevel(); + } + + @Override + public float getMaxZoomLevel() { + return mMapView.getMaxZoomLevel(); + } + + @Override + public float getMinZoomLevel() { + return mMapView.getMinZoomLevel(); + } + + @Override + public DPMapProvider getProvider() { + return DPMapProvider.MAPBOX; + } + + @Override + public void goToDroneLocation() { + final float currentZoomLevel = getMapZoomLevel(); + final Coord2D droneLocation = mDrone.getGps().getPosition(); + updateCamera(droneLocation, currentZoomLevel); + } + + @Override + public void goToMyLocation() { + final UserLocationOverlay userLocation = mMapView.getUserLocationOverlay(); + if (userLocation != null) { + userLocation.goToMyPosition(true); + } + } + + @Override + public void loadCameraPosition() { + final float centerLat = mPrefs.prefs.getFloat(PREF_LAT, 0); + final float centerLng = mPrefs.prefs.getFloat(PREF_LNG, 0); + mMapView.setCenter(new LatLng(centerLat, centerLng)); + + final float zoom = mPrefs.prefs.getFloat(PREF_ZOOM, 0); + mMapView.setZoom(zoom); + + final float rotation = mPrefs.prefs.getFloat(PREF_BEA, 0); + mMapView.setRotation(rotation); + } + + @Override + public List projectPathIntoMap(List pathPoints) { + final List coords = new ArrayList(); + + Projection projection = mMapView.getProjection(); + for (Coord2D point : pathPoints) { + ILatLng coord = projection.fromPixels((float) point.getX(), (float) point.getY()); + coords.add(DroneHelper.ILatLngToCoord(coord)); + } + return coords; + } + + @Override + public void saveCameraPosition() { + SharedPreferences.Editor editor = mPrefs.prefs.edit(); + final ILatLng mapCenter = mMapView.getCenter(); + editor.putFloat(PREF_LAT, (float) mapCenter.getLatitude()) + .putFloat(PREF_LNG, (float) mapCenter.getLongitude()) + .putFloat(PREF_BEA, mMapView.getRotation()) + .putFloat(PREF_ZOOM, mMapView.getZoomLevel()).apply(); + } + + @Override + public void selectAutoPanMode(AutoPanMode target) { + final AutoPanMode currentMode = mPanMode.get(); + if (currentMode == target) + return; + + setAutoPanMode(currentMode, target); + } + + private void setAutoPanMode(AutoPanMode current, AutoPanMode update) { + if (mPanMode.compareAndSet(current, update)) { + switch (current) { + case DRONE: + mDrone.removeDroneListener(this); + break; + + case USER: + mUserLocationTrackingMode = TrackingMode.NONE; + final UserLocationOverlay userLocation = mMapView.getUserLocationOverlay(); + if (userLocation != null) { + userLocation.disableFollowLocation(); + } + break; + + case DISABLED: + default: + break; + } + + switch (update) { + case DRONE: + mDrone.addDroneListener(this); + break; + + case USER: + mUserLocationTrackingMode = TrackingMode.FOLLOW; + final UserLocationOverlay userLocation = mMapView.getUserLocationOverlay(); + if (userLocation != null) { + userLocation.enableFollowLocation(); + } + break; + + case DISABLED: + default: + break; + } + } + } + + @Override + public void setMapPadding(int left, int top, int right, int bottom) { + } + + @Override + public void setOnMapClickListener(OnMapClickListener listener) { + mMapClickListener = listener; + } + + @Override + public void setOnMapLongClickListener(OnMapLongClickListener listener) { + mMapLongClickListener = listener; + } + + @Override + public void setOnMarkerClickListener(OnMarkerClickListener listener) { + mMarkerClickListener = listener; + } + + @Override + public void setOnMarkerDragListener(OnMarkerDragListener listener) { + mMarkerDragListener = listener; + } + + @Override + public void updateCamera(Coord2D coord, float zoomLevel) { + MapController mapController = mMapView.getController(); + if (mapController != null) { + mapController.setZoomAnimated(zoomLevel, DroneHelper.CoordToLatLng(coord), true, false); + } + } + + @Override + public void updateDroneLeashPath(PathSource pathSource) { + final List pathCoords = pathSource.getPathPoints(); + + if (mDroneLeashPath == null) { + mDroneLeashPath = new PathOverlay(DRONE_LEASH_DEFAULT_COLOR, DRONE_LEASH_DEFAULT_WIDTH); + mMapView.getOverlays().add(mDroneLeashPath); + } + + mDroneLeashPath.clearPath(); + for (Coord2D coord : pathCoords) { + mDroneLeashPath.addPoint(DroneHelper.CoordToLatLng(coord)); + } + } + + @Override + public void updateMarker(MarkerInfo markerInfo) { + updateMarker(markerInfo, markerInfo.isDraggable()); + } + + @Override + public void updateMarker(MarkerInfo markerInfo, boolean isDraggable) { + final LatLng position = DroneHelper.CoordToLatLng(markerInfo.getPosition()); + Marker marker = mMarkers.get(markerInfo); + if (marker == null) { + marker = new Marker(mMapView, markerInfo.getTitle(), markerInfo.getSnippet(), position); + mMarkersOverlay.addItem(marker); + mMarkers.put(markerInfo, marker); + } else { + marker.setTitle(markerInfo.getTitle()); + marker.setDescription(markerInfo.getSnippet()); + marker.setPoint(position); + } + + // Update the marker + final Resources res = getResources(); + Bitmap markerIcon = markerInfo.getIcon(res); + if (markerIcon == null) { + markerIcon = BitmapFactory.decodeResource(res, R.drawable.ic_action_location); + } + + marker.setIcon(new Icon(new BitmapDrawable(res, markerIcon))); + + marker.setAnchor(new PointF(markerInfo.getAnchorU(), markerInfo.getAnchorV())); + marker.invalidate(); + mMapView.invalidate(); + } + + @Override + public void updateMarkers(List markersInfos) { + for (MarkerInfo info : markersInfos) { + updateMarker(info); + } + } + + @Override + public void updateMarkers(List markersInfos, boolean isDraggable) { + for (MarkerInfo info : markersInfos) { + updateMarker(info, isDraggable); + } + } + + @Override + public void updateMissionPath(PathSource pathSource) { + final List pathCoords = pathSource.getPathPoints(); + + if (mMissionPath == null) { + mMissionPath = new PathOverlay(MISSION_PATH_DEFAULT_COLOR, MISSION_PATH_DEFAULT_WIDTH); + mMapView.getOverlays().add(mMissionPath); + } + + mMissionPath.clearPath(); + for (Coord2D coord : pathCoords) { + mMissionPath.addPoint(DroneHelper.CoordToLatLng(coord)); + } + } + + @Override + public void zoomToFit(List coords) { + if (coords.isEmpty()) { + return; + } + + final ArrayList boxCoords = new ArrayList(coords.size()); + for (Coord2D coord : coords) { + boxCoords.add(DroneHelper.CoordToLatLng(coord)); + } + + final BoundingBox enclosingBounds = BoundingBox.fromLatLngs(boxCoords); + mMapView.zoomToBoundingBox(enclosingBounds, true, true, true); + } + + @Override + public void onDroneEvent(DroneInterfaces.DroneEventsType event, Drone drone) { + switch (event) { + case GPS: + if (mPanMode.get() == AutoPanMode.DRONE) { + final float currentZoomLevel = getMapZoomLevel(); + final Coord2D droneLocation = drone.getGps().getPosition(); + updateCamera(droneLocation, currentZoomLevel); + } + break; + + default: + break; + } + } } diff --git a/Android/src/org/droidplanner/android/maps/providers/mapbox/MapBoxProviderPreferences.java b/Android/src/org/droidplanner/android/maps/providers/mapbox/MapBoxProviderPreferences.java index 13af4e86a5..417f229fd0 100644 --- a/Android/src/org/droidplanner/android/maps/providers/mapbox/MapBoxProviderPreferences.java +++ b/Android/src/org/droidplanner/android/maps/providers/mapbox/MapBoxProviderPreferences.java @@ -1,24 +1,24 @@ package org.droidplanner.android.maps.providers.mapbox; -import android.os.Bundle; - import org.droidplanner.R; import org.droidplanner.android.maps.providers.DPMapProvider; import org.droidplanner.android.maps.providers.MapProviderPreferences; +import android.os.Bundle; + /** * Provides access to the mapbox map preferences. */ public class MapBoxProviderPreferences extends MapProviderPreferences { - @Override - public void onCreate(Bundle savedInstanceState){ - super.onCreate(savedInstanceState); - addPreferencesFromResource(R.xml.preferences_mapbox); - } + @Override + public void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + addPreferencesFromResource(R.xml.preferences_mapbox); + } - @Override - public DPMapProvider getMapProvider() { - return DPMapProvider.MAPBOX; - } + @Override + public DPMapProvider getMapProvider() { + return DPMapProvider.MAPBOX; + } } diff --git a/Android/src/org/droidplanner/android/maps/providers/mapbox/RotationGestureDetector.java b/Android/src/org/droidplanner/android/maps/providers/mapbox/RotationGestureDetector.java index a25e8d2db5..ee955e3ded 100644 --- a/Android/src/org/droidplanner/android/maps/providers/mapbox/RotationGestureDetector.java +++ b/Android/src/org/droidplanner/android/maps/providers/mapbox/RotationGestureDetector.java @@ -34,7 +34,7 @@ public boolean onTouch(MotionEvent e) { float delta = rotation - mRotation; mRotation += delta; mListener.onRotate(delta); - return true; + return true; } } diff --git a/Android/src/org/droidplanner/android/maps/providers/mapbox/RotationGestureOverlay.java b/Android/src/org/droidplanner/android/maps/providers/mapbox/RotationGestureOverlay.java index 827937f48c..0b5c473c13 100644 --- a/Android/src/org/droidplanner/android/maps/providers/mapbox/RotationGestureOverlay.java +++ b/Android/src/org/droidplanner/android/maps/providers/mapbox/RotationGestureOverlay.java @@ -7,33 +7,32 @@ import com.mapbox.mapboxsdk.views.safecanvas.ISafeCanvas; public class RotationGestureOverlay extends SafeDrawOverlay implements - RotationGestureDetector.RotationListener { - - private final RotationGestureDetector mRotationDetector; - private MapView mMapView; - - public RotationGestureOverlay(MapView mapView) { - mMapView = mapView; - mRotationDetector = new RotationGestureDetector(this); - } - - @Override - protected void drawSafe(ISafeCanvas canvas, MapView mapView, boolean shadow) { - // No drawing necessary - } - - @Override - public boolean onTouchEvent(MotionEvent event, MapView mapView) { - if (this.isEnabled()) { - return mRotationDetector.onTouch(event); - } - return super.onTouchEvent(event, mapView); - } - - @Override - public void onRotate(float deltaAngle) { - mMapView.setMapOrientation(mMapView.getMapOrientation() + deltaAngle); - } - + RotationGestureDetector.RotationListener { + + private final RotationGestureDetector mRotationDetector; + private MapView mMapView; + + public RotationGestureOverlay(MapView mapView) { + mMapView = mapView; + mRotationDetector = new RotationGestureDetector(this); + } + + @Override + protected void drawSafe(ISafeCanvas canvas, MapView mapView, boolean shadow) { + // No drawing necessary + } + + @Override + public boolean onTouchEvent(MotionEvent event, MapView mapView) { + if (this.isEnabled()) { + return mRotationDetector.onTouch(event); + } + return super.onTouchEvent(event, mapView); + } + + @Override + public void onRotate(float deltaAngle) { + mMapView.setMapOrientation(mMapView.getMapOrientation() + deltaAngle); + } } diff --git a/Android/src/org/droidplanner/android/notifications/NotificationHandler.java b/Android/src/org/droidplanner/android/notifications/NotificationHandler.java index b6a109c992..d07a674711 100644 --- a/Android/src/org/droidplanner/android/notifications/NotificationHandler.java +++ b/Android/src/org/droidplanner/android/notifications/NotificationHandler.java @@ -1,8 +1,9 @@ package org.droidplanner.android.notifications; -import org.droidplanner.core.model.Drone; import org.droidplanner.core.drone.DroneInterfaces; import org.droidplanner.core.drone.DroneInterfaces.Handler; +import org.droidplanner.core.model.Drone; + import android.content.Context; /** @@ -19,7 +20,6 @@ interface NotificationProvider extends DroneInterfaces.OnDroneListener { void quickNotify(String feedback); } - /** * Handles Droidplanner's audible notifications. */ @@ -51,7 +51,7 @@ public void onDroneEvent(DroneInterfaces.DroneEventsType event, Drone drone) { /** * Sends a quick notification to the user. Uses toasts for written * notification, and speech if voice notification is enabled. - * + * * @param feedback * short message to show the user. */ diff --git a/Android/src/org/droidplanner/android/notifications/PebbleNotificationProvider.java b/Android/src/org/droidplanner/android/notifications/PebbleNotificationProvider.java index aa4a476ce5..6c6cb59d1d 100644 --- a/Android/src/org/droidplanner/android/notifications/PebbleNotificationProvider.java +++ b/Android/src/org/droidplanner/android/notifications/PebbleNotificationProvider.java @@ -3,10 +3,10 @@ import java.util.UUID; import org.droidplanner.android.DroidPlannerApp; -import org.droidplanner.core.model.Drone; import org.droidplanner.core.drone.DroneInterfaces; import org.droidplanner.core.gcs.follow.Follow; import org.droidplanner.core.gcs.follow.FollowAlgorithm.FollowModes; +import org.droidplanner.core.model.Drone; import android.content.Context; import android.widget.Toast; @@ -111,8 +111,11 @@ else if (((DroidPlannerApp) applicationContext).followMe.isEnabled() && mode == } else data.addString(KEY_FOLLOW_TYPE, "none"); - String bat = "Bat:" + Double.toString(roundToOneDecimal(drone.getBattery().getBattVolt())) + "V"; - String speed = "Speed: " + Double.toString(roundToOneDecimal(drone.getSpeed().getAirSpeed().valueInMetersPerSecond())); + String bat = "Bat:" + Double.toString(roundToOneDecimal(drone.getBattery().getBattVolt())) + + "V"; + String speed = "Speed: " + + Double.toString(roundToOneDecimal(drone.getSpeed().getAirSpeed() + .valueInMetersPerSecond())); String altitude = "Alt: " + Double.toString(roundToOneDecimal(drone.getAltitude().getAltitude())); String telem = bat + "\n" + altitude + "\n" + speed; @@ -144,54 +147,54 @@ public void receiveData(Context context, int transactionId, PebbleDictionary dat Follow followMe = ((DroidPlannerApp) applicationContext).followMe; PebbleKit.sendAckToPebble(applicationContext, transactionId); int request = (data.getInteger(KEY_PEBBLE_REQUEST).intValue()); - switch (request) { - - case KEY_REQUEST_MODE_FOLLOW: - final int result = followMe.toggleFollowMeState(); - String eventLabel = null; - switch (result) { - case Follow.FOLLOW_START: - eventLabel = "FollowMe enabled"; - break; - - case Follow.FOLLOW_END: - eventLabel = "FollowMe disabled"; - break; - - case Follow.FOLLOW_INVALID_STATE: - eventLabel = "FollowMe error: invalid state"; - break; - - case Follow.FOLLOW_DRONE_DISCONNECTED: - eventLabel = "FollowMe error: drone not connected"; - break; - - case Follow.FOLLOW_DRONE_NOT_ARMED: - eventLabel = "FollowMe error: drone not armed"; - break; - } - - if (eventLabel != null) { - Toast.makeText(applicationContext, eventLabel, Toast.LENGTH_SHORT).show(); - } - break; - - case KEY_REQUEST_CYCLE_FOLLOW_TYPE: - followMe.cycleType(); - break; - - case KEY_REQUEST_MODE_LOITER: - ((DroidPlannerApp) applicationContext).getDrone().getState() - .changeFlightMode(ApmModes.ROTOR_LOITER); - break; - - case KEY_REQUEST_MODE_RTL: - ((DroidPlannerApp) applicationContext).getDrone().getState() - .changeFlightMode(ApmModes.ROTOR_RTL); - break; - } - } - } + switch (request) { + + case KEY_REQUEST_MODE_FOLLOW: + final int result = followMe.toggleFollowMeState(); + String eventLabel = null; + switch (result) { + case Follow.FOLLOW_START: + eventLabel = "FollowMe enabled"; + break; + + case Follow.FOLLOW_END: + eventLabel = "FollowMe disabled"; + break; + + case Follow.FOLLOW_INVALID_STATE: + eventLabel = "FollowMe error: invalid state"; + break; + + case Follow.FOLLOW_DRONE_DISCONNECTED: + eventLabel = "FollowMe error: drone not connected"; + break; + + case Follow.FOLLOW_DRONE_NOT_ARMED: + eventLabel = "FollowMe error: drone not armed"; + break; + } + + if (eventLabel != null) { + Toast.makeText(applicationContext, eventLabel, Toast.LENGTH_SHORT).show(); + } + break; + + case KEY_REQUEST_CYCLE_FOLLOW_TYPE: + followMe.cycleType(); + break; + + case KEY_REQUEST_MODE_LOITER: + ((DroidPlannerApp) applicationContext).getDrone().getState() + .changeFlightMode(ApmModes.ROTOR_LOITER); + break; + + case KEY_REQUEST_MODE_RTL: + ((DroidPlannerApp) applicationContext).getDrone().getState() + .changeFlightMode(ApmModes.ROTOR_RTL); + break; + } + } + } @Override public void quickNotify(String feedback) { diff --git a/Android/src/org/droidplanner/android/notifications/StatusBarNotificationProvider.java b/Android/src/org/droidplanner/android/notifications/StatusBarNotificationProvider.java index 78cbc68309..44d69714b4 100644 --- a/Android/src/org/droidplanner/android/notifications/StatusBarNotificationProvider.java +++ b/Android/src/org/droidplanner/android/notifications/StatusBarNotificationProvider.java @@ -5,8 +5,8 @@ import org.droidplanner.android.activities.helpers.SuperUI; import org.droidplanner.android.utils.TextUtils; import org.droidplanner.android.utils.prefs.DroidPlannerPrefs; -import org.droidplanner.core.model.Drone; import org.droidplanner.core.drone.DroneInterfaces; +import org.droidplanner.core.model.Drone; import android.app.PendingIntent; import android.content.Context; @@ -91,97 +91,95 @@ public void run() { FlightActivity.class), 0); mToggleConnectionIntent = PendingIntent.getActivity(mContext, 0, new Intent(mContext, - FlightActivity.class).setAction(SuperUI.ACTION_TOGGLE_DRONE_CONNECTION), 0); + FlightActivity.class).setAction(SuperUI.ACTION_TOGGLE_DRONE_CONNECTION), 0); } - @Override - public void onDroneEvent(DroneInterfaces.DroneEventsType event, Drone drone) { - boolean showNotification = true; - - switch (event) { - case CONNECTED: - // Cancel the notification dismissal - mHandler.removeCallbacks(mDismissNotification); - - final String summaryText = mContext.getString(R.string.connected); - - mInboxBuilder = new InboxStyleBuilder().setSummary(summaryText); - mNotificationBuilder = new NotificationCompat.Builder(mContext) - .addAction(R.drawable.ic_action_io, mContext.getText(R.string.menu_disconnect), - mToggleConnectionIntent).setContentIntent(mNotificationIntent) - .setContentText(summaryText).setOngoing(mAppPrefs.isNotificationPermanent()) - .setSmallIcon(R.drawable.ic_launcher); - - updateFlightMode(drone); - updateDroneState(drone); - updateBattery(drone); - updateGps(drone); - updateHome(drone); - updateRadio(drone); - break; - - case BATTERY: - updateBattery(drone); - break; - - case GPS_FIX: - case GPS_COUNT: - updateGps(drone); - break; - - case GPS: - case HOME: - updateHome(drone); - break; - - case RADIO: - updateRadio(drone); - break; - - case STATE: - updateDroneState(drone); - break; - - case MODE: - case TYPE: - updateFlightMode(drone); - break; - - case DISCONNECTED: - mInboxBuilder = null; - - if (mNotificationBuilder != null) { - mNotificationBuilder = new NotificationCompat.Builder(mContext) - .addAction(R.drawable.ic_action_io, - mContext.getText(R.string.menu_connect), mToggleConnectionIntent) - .setContentIntent(mNotificationIntent) - .setContentTitle(mContext.getString(R.string.disconnected)) - .setOngoing(false).setContentText("") - .setSmallIcon(R.drawable.ic_launcher_bw); - - // Schedule the notification dismissal - mHandler.postDelayed(mDismissNotification, COUNTDOWN_TO_DISMISSAL); - } - break; - - default: - showNotification = false; - break; - } - - if (showNotification) { - showNotification(); - } - } + @Override + public void onDroneEvent(DroneInterfaces.DroneEventsType event, Drone drone) { + boolean showNotification = true; + + switch (event) { + case CONNECTED: + // Cancel the notification dismissal + mHandler.removeCallbacks(mDismissNotification); + + final String summaryText = mContext.getString(R.string.connected); + + mInboxBuilder = new InboxStyleBuilder().setSummary(summaryText); + mNotificationBuilder = new NotificationCompat.Builder(mContext) + .addAction(R.drawable.ic_action_io, mContext.getText(R.string.menu_disconnect), + mToggleConnectionIntent).setContentIntent(mNotificationIntent) + .setContentText(summaryText).setOngoing(mAppPrefs.isNotificationPermanent()) + .setSmallIcon(R.drawable.ic_launcher); + + updateFlightMode(drone); + updateDroneState(drone); + updateBattery(drone); + updateGps(drone); + updateHome(drone); + updateRadio(drone); + break; + + case BATTERY: + updateBattery(drone); + break; + + case GPS_FIX: + case GPS_COUNT: + updateGps(drone); + break; + + case GPS: + case HOME: + updateHome(drone); + break; + + case RADIO: + updateRadio(drone); + break; + + case STATE: + updateDroneState(drone); + break; + + case MODE: + case TYPE: + updateFlightMode(drone); + break; + + case DISCONNECTED: + mInboxBuilder = null; + + if (mNotificationBuilder != null) { + mNotificationBuilder = new NotificationCompat.Builder(mContext) + .addAction(R.drawable.ic_action_io, + mContext.getText(R.string.menu_connect), mToggleConnectionIntent) + .setContentIntent(mNotificationIntent) + .setContentTitle(mContext.getString(R.string.disconnected)) + .setOngoing(false).setContentText("") + .setSmallIcon(R.drawable.ic_launcher_bw); + + // Schedule the notification dismissal + mHandler.postDelayed(mDismissNotification, COUNTDOWN_TO_DISMISSAL); + } + break; + + default: + showNotification = false; + break; + } + + if (showNotification) { + showNotification(); + } + } private void updateRadio(Drone drone) { if (mInboxBuilder == null) return; - mInboxBuilder.setLine( - 4, - TextUtils.normal("Signal: ", - TextUtils.bold(String.format("%d%%", drone.getRadio().getSignalStrength())))); + mInboxBuilder.setLine(4, TextUtils.normal("Signal: ", + TextUtils.bold(String.format("%d%%", drone.getRadio().getSignalStrength())))); } private void updateHome(Drone drone) { @@ -198,24 +196,17 @@ private void updateGps(Drone drone) { if (mInboxBuilder == null) return; - mInboxBuilder.setLine( - 1, - TextUtils.normal( - "Satellite: ", - TextUtils.bold(String.format("%d, %s", drone.getGps().getSatCount(), - drone.getGps().getFixType())))); + mInboxBuilder.setLine(1, TextUtils.normal("Satellite: ", TextUtils.bold(String.format( + "%d, %s", drone.getGps().getSatCount(), drone.getGps().getFixType())))); } private void updateBattery(Drone drone) { if (mInboxBuilder == null) return; - mInboxBuilder.setLine( - 3, - TextUtils.normal( - "Battery: ", - TextUtils.bold(String.format("%2.1fv (%2.0f%%)", - drone.getBattery().getBattVolt(), drone.getBattery().getBattRemain())))); + mInboxBuilder.setLine(3, TextUtils.normal("Battery: ", TextUtils.bold(String.format( + "%2.1fv (%2.0f%%)", drone.getBattery().getBattVolt(), drone.getBattery() + .getBattRemain())))); } private void updateDroneState(Drone drone) { diff --git a/Android/src/org/droidplanner/android/notifications/TTSNotificationProvider.java b/Android/src/org/droidplanner/android/notifications/TTSNotificationProvider.java index 5c55833bb2..8f878c50d7 100644 --- a/Android/src/org/droidplanner/android/notifications/TTSNotificationProvider.java +++ b/Android/src/org/droidplanner/android/notifications/TTSNotificationProvider.java @@ -4,12 +4,11 @@ import java.util.Map; import org.droidplanner.R; -import org.droidplanner.android.DroidPlannerApp; import org.droidplanner.android.utils.prefs.DroidPlannerPrefs; -import org.droidplanner.core.model.Drone; import org.droidplanner.core.drone.DroneInterfaces.DroneEventsType; -import org.droidplanner.core.drone.variables.Calibration; import org.droidplanner.core.drone.DroneInterfaces.Handler; +import org.droidplanner.core.drone.variables.Calibration; +import org.droidplanner.core.model.Drone; import android.content.Context; import android.content.SharedPreferences; @@ -28,7 +27,7 @@ public class TTSNotificationProvider implements OnInitListener, NotificationHandler.NotificationProvider { - private static final String TAG = TTSNotificationProvider.class.getSimpleName(); + private static final String TAG = TTSNotificationProvider.class.getSimpleName(); private static final double BATTERY_DISCHARGE_NOTIFICATION_EVERY_PERCENT = 10; @@ -39,16 +38,19 @@ public class TTSNotificationProvider implements OnInitListener, private Context context; private Handler handler; private int statusInterval; - private class Watchdog implements Runnable{ + + private class Watchdog implements Runnable { private Drone drone; + public void run() { speakPeriodic(drone); } - public void setDrone(Drone drone){ + public void setDrone(Drone drone) { this.drone = drone; } } + public Watchdog watchdogCallback = new Watchdog(); TTSNotificationProvider(Context context, Handler handler) { @@ -60,39 +62,39 @@ public void setDrone(Drone drone){ @Override public void onInit(int status) { - if(status == TextToSpeech.SUCCESS) { - //TODO: check if the language is available - Locale ttsLanguage; - if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR2) { - ttsLanguage = tts.getDefaultLanguage(); - } - else{ - ttsLanguage = tts.getLanguage(); - } + if (status == TextToSpeech.SUCCESS) { + // TODO: check if the language is available + Locale ttsLanguage; + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR2) { + ttsLanguage = tts.getDefaultLanguage(); + } else { + ttsLanguage = tts.getLanguage(); + } - if(ttsLanguage == null){ - ttsLanguage = Locale.US; - } + if (ttsLanguage == null) { + ttsLanguage = Locale.US; + } - int supportStatus = tts.setLanguage(ttsLanguage); - switch(supportStatus){ - case TextToSpeech.LANG_MISSING_DATA: - case TextToSpeech.LANG_NOT_SUPPORTED: - tts.shutdown(); - tts = null; + int supportStatus = tts.setLanguage(ttsLanguage); + switch (supportStatus) { + case TextToSpeech.LANG_MISSING_DATA: + case TextToSpeech.LANG_NOT_SUPPORTED: + tts.shutdown(); + tts = null; - Log.e(TAG, "TTS Language data is not available."); - Toast.makeText(context, "Unable to set 'Text to Speech' language!", - Toast.LENGTH_LONG).show(); - break; - } - } - else{ - //Notify the user that the tts engine is not available. - Log.e(TAG, "TextToSpeech initialization failed."); - Toast.makeText(context, "Please make sure 'Text to Speech' is enabled in the " + - "system accessibility settings.", Toast.LENGTH_LONG).show(); - } + Log.e(TAG, "TTS Language data is not available."); + Toast.makeText(context, "Unable to set 'Text to Speech' language!", + Toast.LENGTH_LONG).show(); + break; + } + } else { + // Notify the user that the tts engine is not available. + Log.e(TAG, "TextToSpeech initialization failed."); + Toast.makeText( + context, + "Please make sure 'Text to Speech' is enabled in the " + + "system accessibility settings.", Toast.LENGTH_LONG).show(); + } } private void speak(String string) { @@ -167,7 +169,7 @@ public void onDroneEvent(DroneEventsType event, Drone drone) { break; case FAILSAFE: String failsafe = drone.getState().getWarning(); - if(drone.getState().isWarning()){ + if (drone.getState().isWarning()) { speak(failsafe); } default: @@ -235,38 +237,41 @@ private void speakGpsMode(int fix) { } } - private void speakPeriodic(Drone drone){ + private void speakPeriodic(Drone drone) { DroidPlannerPrefs preferences = new DroidPlannerPrefs(context); - Map speechPrefs = preferences.getPeriodicSpeechPrefs(); + Map speechPrefs = preferences.getPeriodicSpeechPrefs(); StringBuilder message = new StringBuilder(); - if(speechPrefs.get("battery voltage")){ + if (speechPrefs.get("battery voltage")) { message.append("battery " + drone.getBattery().getBattVolt() + " volts. "); } - if(speechPrefs.get("altitude")){ - message.append("altitude, " + (int)(drone.getAltitude().getAltitude()*10.0)/10.0 + " meters. "); + if (speechPrefs.get("altitude")) { + message.append("altitude, " + (int) (drone.getAltitude().getAltitude() * 10.0) / 10.0 + + " meters. "); } - if(speechPrefs.get("airspeed")){ - message.append("airspeed, " + (int)(drone.getSpeed().getAirSpeed().valueInMetersPerSecond()*10.0)/10.0 + " meters per second. "); + if (speechPrefs.get("airspeed")) { + message.append("airspeed, " + + (int) (drone.getSpeed().getAirSpeed().valueInMetersPerSecond() * 10.0) / 10.0 + + " meters per second. "); } - if(speechPrefs.get("rssi")){ + if (speechPrefs.get("rssi")) { message.append("r s s i, " + drone.getRadio().getRssi() + " decibels"); } speak(message.toString()); - if(preferences.getSpokenStatusInterval() != 0) { + if (preferences.getSpokenStatusInterval() != 0) { handler.postDelayed(watchdogCallback, statusInterval * 1000); - }else{ + } else { handler.removeCallbacks(watchdogCallback); } } - public void setupPeriodicSpeechOutput(int interval, Drone drone){ + public void setupPeriodicSpeechOutput(int interval, Drone drone) { watchdogCallback.setDrone(drone); - if(interval == 0){ + if (interval == 0) { handler.removeCallbacks(watchdogCallback); - }else{ + } else { statusInterval = interval; handler.removeCallbacks(watchdogCallback); - handler.postDelayed(watchdogCallback,interval*1000); + handler.postDelayed(watchdogCallback, interval * 1000); } } diff --git a/Android/src/org/droidplanner/android/proxy/mission/item/fragments/MissionCircleFragment.java b/Android/src/org/droidplanner/android/proxy/mission/item/fragments/MissionCircleFragment.java index c4c5549da8..2e9364efad 100644 --- a/Android/src/org/droidplanner/android/proxy/mission/item/fragments/MissionCircleFragment.java +++ b/Android/src/org/droidplanner/android/proxy/mission/item/fragments/MissionCircleFragment.java @@ -16,7 +16,7 @@ public class MissionCircleFragment extends MissionDetailFragment implements private SeekBarWithText altitudeSeekBar; private SeekBarWithText loiterTurnSeekBar; - //private CheckBox loiterCCW; + // private CheckBox loiterCCW; private CheckBox checkBoxAdvanced; private SeekBarWithText altitudeStepSeekBar; private SeekBarWithText numberStepSeekBar; diff --git a/Android/src/org/droidplanner/android/proxy/mission/item/fragments/MissionDetailFragment.java b/Android/src/org/droidplanner/android/proxy/mission/item/fragments/MissionDetailFragment.java index 8653adefef..21d659a530 100644 --- a/Android/src/org/droidplanner/android/proxy/mission/item/fragments/MissionDetailFragment.java +++ b/Android/src/org/droidplanner/android/proxy/mission/item/fragments/MissionDetailFragment.java @@ -123,12 +123,13 @@ public void onViewCreated(View view, Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); mMissionProxy = itemRender.getMissionProxy(); - List list = new LinkedList(Arrays.asList(MissionItemType.values())); - if (mMissionProxy.getItems().indexOf(itemRender) != 0){ + List list = new LinkedList(Arrays.asList(MissionItemType + .values())); + if (mMissionProxy.getItems().indexOf(itemRender) != 0) { list.remove(MissionItemType.TAKEOFF); } - - if (mMissionProxy.getItems().indexOf(itemRender) != (mMissionProxy.getItems().size() - 1)){ + + if (mMissionProxy.getItems().indexOf(itemRender) != (mMissionProxy.getItems().size() - 1)) { list.remove(MissionItemType.LAND); list.remove(MissionItemType.RTL); } diff --git a/Android/src/org/droidplanner/android/proxy/mission/item/fragments/MissionLandFragment.java b/Android/src/org/droidplanner/android/proxy/mission/item/fragments/MissionLandFragment.java index d85006dde0..ebc8f91610 100644 --- a/Android/src/org/droidplanner/android/proxy/mission/item/fragments/MissionLandFragment.java +++ b/Android/src/org/droidplanner/android/proxy/mission/item/fragments/MissionLandFragment.java @@ -6,7 +6,7 @@ import android.os.Bundle; import android.view.View; -public class MissionLandFragment extends MissionDetailFragment{ +public class MissionLandFragment extends MissionDetailFragment { @Override protected int getResource() { @@ -19,6 +19,4 @@ public void onViewCreated(View view, Bundle savedInstanceState) { typeSpinner.setSelection(commandAdapter.getPosition(MissionItemType.LAND)); } - - } diff --git a/Android/src/org/droidplanner/android/proxy/mission/item/fragments/MissionSurveyFragment.java b/Android/src/org/droidplanner/android/proxy/mission/item/fragments/MissionSurveyFragment.java index 418442358f..80f5c1bd1f 100644 --- a/Android/src/org/droidplanner/android/proxy/mission/item/fragments/MissionSurveyFragment.java +++ b/Android/src/org/droidplanner/android/proxy/mission/item/fragments/MissionSurveyFragment.java @@ -6,11 +6,11 @@ import org.droidplanner.android.proxy.mission.item.adapters.CamerasAdapter; import org.droidplanner.android.widgets.SeekBarWithText.SeekBarWithText; import org.droidplanner.android.widgets.spinners.SpinnerSelfSelect; -import org.droidplanner.core.model.Drone; import org.droidplanner.core.drone.DroneInterfaces; import org.droidplanner.core.helpers.units.Altitude; import org.droidplanner.core.mission.MissionItemType; import org.droidplanner.core.mission.survey.Survey; +import org.droidplanner.core.model.Drone; import android.content.Context; import android.graphics.Color; diff --git a/Android/src/org/droidplanner/android/utils/DroneHelper.java b/Android/src/org/droidplanner/android/utils/DroneHelper.java index b09d85b0fc..7c1f9721e7 100644 --- a/Android/src/org/droidplanner/android/utils/DroneHelper.java +++ b/Android/src/org/droidplanner/android/utils/DroneHelper.java @@ -13,17 +13,17 @@ static public LatLng CoordToLatLang(Coord2D coord) { return new LatLng(coord.getLat(), coord.getLng()); } - public static com.mapbox.mapboxsdk.geometry.LatLng CoordToLatLng(Coord2D coord){ - return new com.mapbox.mapboxsdk.geometry.LatLng(coord.getLat(), coord.getLng()); - } + public static com.mapbox.mapboxsdk.geometry.LatLng CoordToLatLng(Coord2D coord) { + return new com.mapbox.mapboxsdk.geometry.LatLng(coord.getLat(), coord.getLng()); + } public static Coord2D LatLngToCoord(LatLng point) { return new Coord2D(point.latitude, point.longitude); } - public static Coord2D ILatLngToCoord(ILatLng point){ - return new Coord2D(point.getLatitude(), point.getLongitude()); - } + public static Coord2D ILatLngToCoord(ILatLng point) { + return new Coord2D(point.getLatitude(), point.getLongitude()); + } public static Coord2D LocationToCoord(Location location) { return new Coord2D(location.getLatitude(), location.getLongitude()); diff --git a/Android/src/org/droidplanner/android/utils/file/IO/MissionReader.java b/Android/src/org/droidplanner/android/utils/file/IO/MissionReader.java index 60156dac79..cfb30643ec 100644 --- a/Android/src/org/droidplanner/android/utils/file/IO/MissionReader.java +++ b/Android/src/org/droidplanner/android/utils/file/IO/MissionReader.java @@ -1,12 +1,5 @@ package org.droidplanner.android.utils.file.IO; -import com.MAVLink.Messages.ardupilotmega.msg_mission_item; - -import org.droidplanner.android.dialogs.openfile.OpenFileDialog; -import org.droidplanner.android.utils.file.DirectoryPath; -import org.droidplanner.android.utils.file.FileList; -import org.droidplanner.android.utils.file.FileManager; - import java.io.BufferedReader; import java.io.FileInputStream; import java.io.IOException; @@ -14,6 +7,13 @@ import java.util.ArrayList; import java.util.List; +import org.droidplanner.android.dialogs.openfile.OpenFileDialog; +import org.droidplanner.android.utils.file.DirectoryPath; +import org.droidplanner.android.utils.file.FileList; +import org.droidplanner.android.utils.file.FileManager; + +import com.MAVLink.Messages.ardupilotmega.msg_mission_item; + /** * Read msg_mission_item list as... * diff --git a/Android/src/org/droidplanner/android/utils/file/IO/MissionWriter.java b/Android/src/org/droidplanner/android/utils/file/IO/MissionWriter.java index 076f37cbd6..5c5c645591 100644 --- a/Android/src/org/droidplanner/android/utils/file/IO/MissionWriter.java +++ b/Android/src/org/droidplanner/android/utils/file/IO/MissionWriter.java @@ -1,15 +1,15 @@ package org.droidplanner.android.utils.file.IO; -import com.MAVLink.Messages.ardupilotmega.msg_mission_item; - -import org.droidplanner.android.utils.file.FileManager; -import org.droidplanner.android.utils.file.FileStream; - import java.io.FileOutputStream; import java.io.IOException; import java.util.List; import java.util.Locale; +import org.droidplanner.android.utils.file.FileManager; +import org.droidplanner.android.utils.file.FileStream; + +import com.MAVLink.Messages.ardupilotmega.msg_mission_item; + /** * Write msg_mission_item list as... * @@ -54,7 +54,8 @@ private static void writeMissionItems(FileOutputStream out, // write msg (TAB delimited) out.write(String.format(Locale.ENGLISH, - "%d\t%d\t%d\t%d\t%f\t%f\t%f\t%f\t%f\t%f\t%f\t%d\n", i, + "%d\t%d\t%d\t%d\t%f\t%f\t%f\t%f\t%f\t%f\t%f\t%d\n", + i, i == 0 ? 1 : 0, // set CURRENT_WP = 1 for 'home' - msg[0], 0 // for all others msg.frame, msg.command, msg.param1, msg.param2, msg.param3, msg.param4, msg.x, diff --git a/Android/src/org/droidplanner/android/utils/prefs/DroidPlannerPrefs.java b/Android/src/org/droidplanner/android/utils/prefs/DroidPlannerPrefs.java index 7c5447c7cc..333d0fae4d 100644 --- a/Android/src/org/droidplanner/android/utils/prefs/DroidPlannerPrefs.java +++ b/Android/src/org/droidplanner/android/utils/prefs/DroidPlannerPrefs.java @@ -60,7 +60,7 @@ public String getDroneshareLogin() { public void setDroneshareLogin(String b) { prefs.edit().putString(context.getString(R.string.pref_dshare_username_key), b.trim()) - .apply(); + .apply(); } public String getDroneshareEmail() { @@ -77,7 +77,7 @@ public String getDronesharePassword() { public void setDronesharePassword(String b) { prefs.edit().putString(context.getString(R.string.pref_dshare_password_key), b.trim()) - .apply(); + .apply(); } public boolean getDroneshareEnabled() { @@ -258,18 +258,22 @@ public String getMapProviderName() { return prefs.getString(context.getString(R.string.pref_maps_providers_key), null); } - public Map getPeriodicSpeechPrefs(){ - Map speechPrefs = new HashMap(); - speechPrefs.put("battery voltage", prefs.getBoolean(context.getString(R.string.pref_tts_periodic_bat_volt_key),true)); - speechPrefs.put("altitude", prefs.getBoolean(context.getString(R.string.pref_tts_periodic_alt_key),true)); - speechPrefs.put("airspeed", prefs.getBoolean(context.getString(R.string.pref_tts_periodic_airspeed_key),true)); - speechPrefs.put("rssi", prefs.getBoolean(context.getString(R.string.pref_tts_periodic_rssi_key),true)); + public Map getPeriodicSpeechPrefs() { + Map speechPrefs = new HashMap(); + speechPrefs.put("battery voltage", + prefs.getBoolean(context.getString(R.string.pref_tts_periodic_bat_volt_key), true)); + speechPrefs.put("altitude", + prefs.getBoolean(context.getString(R.string.pref_tts_periodic_alt_key), true)); + speechPrefs.put("airspeed", + prefs.getBoolean(context.getString(R.string.pref_tts_periodic_airspeed_key), true)); + speechPrefs.put("rssi", + prefs.getBoolean(context.getString(R.string.pref_tts_periodic_rssi_key), true)); return speechPrefs; } - public int getSpokenStatusInterval(){ - return Integer.parseInt(prefs.getString(context.getString(R.string.pref_tts_periodic_period_key), null)); + public int getSpokenStatusInterval() { + return Integer.parseInt(prefs.getString( + context.getString(R.string.pref_tts_periodic_period_key), null)); } - } diff --git a/Android/src/org/droidplanner/android/widgets/actionProviders/InfoBarActionProvider.java b/Android/src/org/droidplanner/android/widgets/actionProviders/InfoBarActionProvider.java index b7ce24dfa9..2c7558bf23 100644 --- a/Android/src/org/droidplanner/android/widgets/actionProviders/InfoBarActionProvider.java +++ b/Android/src/org/droidplanner/android/widgets/actionProviders/InfoBarActionProvider.java @@ -8,9 +8,9 @@ import org.droidplanner.android.widgets.actionProviders.InfoBarItem.HomeInfo; import org.droidplanner.android.widgets.actionProviders.InfoBarItem.PhoneExtraInfo; import org.droidplanner.android.widgets.actionProviders.InfoBarItem.SignalInfo; -import org.droidplanner.core.model.Drone; import org.droidplanner.core.drone.DroneInterfaces; import org.droidplanner.core.drone.DroneInterfaces.OnDroneListener; +import org.droidplanner.core.model.Drone; import android.content.Context; import android.view.ActionProvider; @@ -77,65 +77,65 @@ public void setDrone(Drone drone) { mDrone = drone; } - @Override - public void onDroneEvent(DroneInterfaces.DroneEventsType event, Drone drone) { - setDrone(drone); - - boolean updateExtra = true; - switch (event) { - case BATTERY: - if (mBatteryInfo != null) - mBatteryInfo.updateItemView(mContext, mDrone); - break; - - case CONNECTED: - updateInfoBar(); - updateExtra = false; - break; - - case DISCONNECTED: - setDrone(null); - updateInfoBar(); - updateExtra = false; - break; - - case GPS_FIX: - case GPS_COUNT: - if (mGpsInfo != null) - mGpsInfo.updateItemView(mContext, mDrone); - break; - - case GPS: - case HOME: - if (mHomeInfo != null) - mHomeInfo.updateItemView(mContext, mDrone); - break; - - case RADIO: - if (mSignalInfo != null) - mSignalInfo.updateItemView(mContext, mDrone); - break; - - case STATE: - if (mFlightTimeInfo != null) - mFlightTimeInfo.updateItemView(mContext, mDrone); - break; - - case MODE: - case TYPE: - if (mFlightModesInfo != null) - mFlightModesInfo.updateItemView(mContext, mDrone); - break; - - default: - updateExtra = false; - break; - } - - if (mPhoneExtraInfo != null && updateExtra) { - mPhoneExtraInfo.updateItemView(mContext, mDrone); - } - } + @Override + public void onDroneEvent(DroneInterfaces.DroneEventsType event, Drone drone) { + setDrone(drone); + + boolean updateExtra = true; + switch (event) { + case BATTERY: + if (mBatteryInfo != null) + mBatteryInfo.updateItemView(mContext, mDrone); + break; + + case CONNECTED: + updateInfoBar(); + updateExtra = false; + break; + + case DISCONNECTED: + setDrone(null); + updateInfoBar(); + updateExtra = false; + break; + + case GPS_FIX: + case GPS_COUNT: + if (mGpsInfo != null) + mGpsInfo.updateItemView(mContext, mDrone); + break; + + case GPS: + case HOME: + if (mHomeInfo != null) + mHomeInfo.updateItemView(mContext, mDrone); + break; + + case RADIO: + if (mSignalInfo != null) + mSignalInfo.updateItemView(mContext, mDrone); + break; + + case STATE: + if (mFlightTimeInfo != null) + mFlightTimeInfo.updateItemView(mContext, mDrone); + break; + + case MODE: + case TYPE: + if (mFlightModesInfo != null) + mFlightModesInfo.updateItemView(mContext, mDrone); + break; + + default: + updateExtra = false; + break; + } + + if (mPhoneExtraInfo != null && updateExtra) { + mPhoneExtraInfo.updateItemView(mContext, mDrone); + } + } /** * Go through the list of action bar item, and initialize their view. diff --git a/Android/src/org/droidplanner/android/widgets/actionProviders/InfoBarItem.java b/Android/src/org/droidplanner/android/widgets/actionProviders/InfoBarItem.java index 5b49ae2816..7152eca908 100644 --- a/Android/src/org/droidplanner/android/widgets/actionProviders/InfoBarItem.java +++ b/Android/src/org/droidplanner/android/widgets/actionProviders/InfoBarItem.java @@ -133,11 +133,11 @@ public void updateItemView(final Context context, final Drone drone) { if (drone == null) { update = "--"; } else if (mAppPrefs.shouldGpsHdopBeDisplayed()) { - update = String.format(Locale.ENGLISH, "Satellite\n%d, %.1f", - drone.getGps().getSatCount(), drone.getGps().getGpsEPH()); + update = String.format(Locale.ENGLISH, "Satellite\n%d, %.1f", drone.getGps() + .getSatCount(), drone.getGps().getGpsEPH()); } else { - update = String.format(Locale.ENGLISH, "Satellite\n%d, %s", - drone.getGps().getSatCount(), drone.getGps().getFixType()); + update = String.format(Locale.ENGLISH, "Satellite\n%d, %s", drone.getGps() + .getSatCount(), drone.getGps().getFixType()); } ((TextView) mItemView).setText(update); @@ -267,8 +267,8 @@ public BatteryInfo(Context context, View parentView, Drone drone) { public void updateItemView(Context context, Drone drone) { if (mItemView != null) { String update = drone == null ? "--" : String.format(Locale.ENGLISH, - "%2.1fv\n%2.0f%%", drone.getBattery().getBattVolt(), - drone.getBattery().getBattRemain()); + "%2.1fv\n%2.0f%%", drone.getBattery().getBattVolt(), drone.getBattery() + .getBattRemain()); ((TextView) mItemView).setText(update); } @@ -352,13 +352,14 @@ public void updateItemView(Context context, final Drone drone) { infoUpdate = String.format("%d%%", drone.getRadio().getSignalStrength()); mRssiView.setText(String.format("RSSI %2.0f dB", drone.getRadio().getRssi())); - mRemRssiView.setText(String.format("RemRSSI %2.0f dB", drone.getRadio().getRemRssi())); + mRemRssiView.setText(String.format("RemRSSI %2.0f dB", drone.getRadio() + .getRemRssi())); mNoiseView.setText(String.format("Noise %2.0f dB", drone.getRadio().getNoise())); - mRemNoiseView - .setText(String.format("RemNoise %2.0f dB", drone.getRadio().getRemNoise())); + mRemNoiseView.setText(String.format("RemNoise %2.0f dB", drone.getRadio() + .getRemNoise())); mFadeView.setText(String.format("Fade %2.0f dB", drone.getRadio().getFadeMargin())); - mRemFadeView.setText(String.format("RemFade %2.0f dB", - drone.getRadio().getRemFadeMargin())); + mRemFadeView.setText(String.format("RemFade %2.0f dB", drone.getRadio() + .getRemFadeMargin())); } mPopup.update(); @@ -438,7 +439,8 @@ public void updateItemView(final Context context, final Drone drone) { } if (mDrone != null) - modesSpinner.forcedSetSelection(mModeAdapter.getPosition(mDrone.getState().getMode())); + modesSpinner.forcedSetSelection(mModeAdapter.getPosition(mDrone.getState() + .getMode())); } } diff --git a/Android/src/org/droidplanner/android/widgets/adapterViews/ParamsAdapter.java b/Android/src/org/droidplanner/android/widgets/adapterViews/ParamsAdapter.java index 1a9bf88634..1d40b435a0 100644 --- a/Android/src/org/droidplanner/android/widgets/adapterViews/ParamsAdapter.java +++ b/Android/src/org/droidplanner/android/widgets/adapterViews/ParamsAdapter.java @@ -8,8 +8,8 @@ import org.droidplanner.R; import org.droidplanner.android.utils.file.IO.ParameterMetadataMapReader; -import org.droidplanner.core.model.Drone; import org.droidplanner.core.drone.profiles.VehicleProfile; +import org.droidplanner.core.model.Drone; import org.droidplanner.core.parameters.Parameter; import org.droidplanner.core.parameters.ParameterMetadata; @@ -134,13 +134,13 @@ public void loadParameters(Drone drone, List parameters) { private void addParameter(Parameter parameter) { try { - Parameter.checkParameterName(parameter.name); + Parameter.checkParameterName(parameter.name); - // paramters from AC 3.2 may contain duplicates - add only if unique - if(!containsParameterWithName(parameter.name)) - add(new ParamsAdapterItem(parameter, getMetadata(parameter.name))); + // paramters from AC 3.2 may contain duplicates - add only if unique + if (!containsParameterWithName(parameter.name)) + add(new ParamsAdapterItem(parameter, getMetadata(parameter.name))); - } catch (Exception ex) { + } catch (Exception ex) { // eat it } } @@ -155,15 +155,14 @@ public void loadMetadata(Drone drone) { notifyDataSetChanged(); } - private boolean containsParameterWithName(String name) - { - final int count = getCount(); - for(int i = 0; i < count; i++) { - if (name.equals(getItem(i).getParameter().name)) - return true; - } - return false; - } + private boolean containsParameterWithName(String name) { + final int count = getCount(); + for (int i = 0; i < count; i++) { + if (name.equals(getItem(i).getParameter().name)) + return true; + } + return false; + } private void loadMetadataInternal(Drone drone) { metadataMap = null; diff --git a/Android/src/org/droidplanner/android/widgets/checklist/CheckListSysLink.java b/Android/src/org/droidplanner/android/widgets/checklist/CheckListSysLink.java index 5b5c59fff7..f7bf8446cb 100644 --- a/Android/src/org/droidplanner/android/widgets/checklist/CheckListSysLink.java +++ b/Android/src/org/droidplanner/android/widgets/checklist/CheckListSysLink.java @@ -1,9 +1,9 @@ package org.droidplanner.android.widgets.checklist; import org.droidplanner.core.MAVLink.MavLinkArm; -import org.droidplanner.core.model.Drone; import org.droidplanner.core.drone.DroneInterfaces.DroneEventsType; import org.droidplanner.core.helpers.units.Altitude; +import org.droidplanner.core.model.Drone; public class CheckListSysLink { private Drone drone; diff --git a/Android/src/org/droidplanner/android/widgets/viewPager/TabPageIndicator.java b/Android/src/org/droidplanner/android/widgets/viewPager/TabPageIndicator.java index 21c5a30fc9..bf8244d221 100644 --- a/Android/src/org/droidplanner/android/widgets/viewPager/TabPageIndicator.java +++ b/Android/src/org/droidplanner/android/widgets/viewPager/TabPageIndicator.java @@ -85,7 +85,8 @@ public TabPageIndicator(Context context, AttributeSet attrs) { setHorizontalScrollBarEnabled(false); mTabLayout = new LinearLayout(getContext()); - addView(mTabLayout, new ViewGroup.LayoutParams(WRAP_CONTENT, ViewGroup.LayoutParams.MATCH_PARENT)); + addView(mTabLayout, new ViewGroup.LayoutParams(WRAP_CONTENT, + ViewGroup.LayoutParams.MATCH_PARENT)); } public void setOnTabReselectedListener(OnTabReselectedListener listener) { @@ -160,7 +161,8 @@ private void addTab(CharSequence text, int index) { tabView.setOnClickListener(mTabClickListener); tabView.setText(text); - mTabLayout.addView(tabView, new LinearLayout.LayoutParams(0, ViewGroup.LayoutParams.MATCH_PARENT, 1)); + mTabLayout.addView(tabView, new LinearLayout.LayoutParams(0, + ViewGroup.LayoutParams.MATCH_PARENT, 1)); } @Override diff --git a/ChangeLog.md b/ChangeLog.md index 120018a1fa..4f30fbc2fa 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -9,6 +9,10 @@ All the changes are logged below (preferable with the pull request numbers in pa # Releases +## Droidplanner v2.7.1 +* Fix sporadic bug on logging code (#1000) +* Fix problem on settings screen (#998) + ## Droidplanner v2.7.0 * Development of a desktop App (#982) * Periodic voice notifications (#996) diff --git a/Core/src/org/droidplanner/core/MAVLink/MavLinkMsgHandler.java b/Core/src/org/droidplanner/core/MAVLink/MavLinkMsgHandler.java index 4b13870f72..5e1ba357f6 100644 --- a/Core/src/org/droidplanner/core/MAVLink/MavLinkMsgHandler.java +++ b/Core/src/org/droidplanner/core/MAVLink/MavLinkMsgHandler.java @@ -1,7 +1,7 @@ package org.droidplanner.core.MAVLink; -import org.droidplanner.core.model.Drone; import org.droidplanner.core.helpers.coordinates.Coord2D; +import org.droidplanner.core.model.Drone; import com.MAVLink.Messages.ApmModes; import com.MAVLink.Messages.MAVLinkMessage; @@ -39,8 +39,8 @@ public void receiveData(MAVLinkMessage msg) { switch (msg.msgid) { case msg_attitude.MAVLINK_MSG_ID_ATTITUDE: msg_attitude m_att = (msg_attitude) msg; - drone.getOrientation().setRollPitchYaw(m_att.roll * 180.0 / Math.PI, m_att.pitch * 180.0 - / Math.PI, m_att.yaw * 180.0 / Math.PI); + drone.getOrientation().setRollPitchYaw(m_att.roll * 180.0 / Math.PI, + m_att.pitch * 180.0 / Math.PI, m_att.yaw * 180.0 / Math.PI); break; case msg_vfr_hud.MAVLINK_MSG_ID_VFR_HUD: msg_vfr_hud m_hud = (msg_vfr_hud) msg; @@ -53,13 +53,15 @@ public void receiveData(MAVLinkMessage msg) { case msg_nav_controller_output.MAVLINK_MSG_ID_NAV_CONTROLLER_OUTPUT: msg_nav_controller_output m_nav = (msg_nav_controller_output) msg; drone.setDisttowpAndSpeedAltErrors(m_nav.wp_dist, m_nav.alt_error, m_nav.aspd_error); - drone.getNavigation().setNavPitchRollYaw(m_nav.nav_pitch, m_nav.nav_roll, m_nav.nav_bearing); + drone.getNavigation().setNavPitchRollYaw(m_nav.nav_pitch, m_nav.nav_roll, + m_nav.nav_bearing); break; case msg_heartbeat.MAVLINK_MSG_ID_HEARTBEAT: msg_heartbeat msg_heart = (msg_heartbeat) msg; drone.setType(msg_heart.type); - drone.getState().setIsFlying(((msg_heartbeat) msg).system_status==MAV_STATE.MAV_STATE_ACTIVE); + drone.getState().setIsFlying( + ((msg_heartbeat) msg).system_status == MAV_STATE.MAV_STATE_ACTIVE); processState(msg_heart); ApmModes newMode = ApmModes.getMode(msg_heart.custom_mode, drone.getType()); drone.getState().setMode(newMode); @@ -67,22 +69,23 @@ public void receiveData(MAVLinkMessage msg) { break; case msg_global_position_int.MAVLINK_MSG_ID_GLOBAL_POSITION_INT: - drone.getGps().setPosition(new Coord2D(((msg_global_position_int) msg).lat / 1E7, - ((msg_global_position_int) msg).lon / 1E7)); + drone.getGps().setPosition( + new Coord2D(((msg_global_position_int) msg).lat / 1E7, + ((msg_global_position_int) msg).lon / 1E7)); break; case msg_sys_status.MAVLINK_MSG_ID_SYS_STATUS: msg_sys_status m_sys = (msg_sys_status) msg; - drone.getBattery().setBatteryState(m_sys.voltage_battery / 1000.0, m_sys.battery_remaining, - m_sys.current_battery / 100.0); + drone.getBattery().setBatteryState(m_sys.voltage_battery / 1000.0, + m_sys.battery_remaining, m_sys.current_battery / 100.0); break; case msg_radio.MAVLINK_MSG_ID_RADIO: msg_radio m_radio = (msg_radio) msg; drone.getRadio().setRadioState(m_radio.rxerrors, m_radio.fixed, m_radio.rssi, - m_radio.remrssi, m_radio.txbuf, m_radio.noise, m_radio.remnoise); + m_radio.remrssi, m_radio.txbuf, m_radio.noise, m_radio.remnoise); break; case msg_gps_raw_int.MAVLINK_MSG_ID_GPS_RAW_INT: drone.getGps().setGpsState(((msg_gps_raw_int) msg).fix_type, - ((msg_gps_raw_int) msg).satellites_visible, ((msg_gps_raw_int) msg).eph); + ((msg_gps_raw_int) msg).satellites_visible, ((msg_gps_raw_int) msg).eph); break; case msg_rc_channels_raw.MAVLINK_MSG_ID_RC_CHANNELS_RAW: drone.getRC().setRcInputValues((msg_rc_channels_raw) msg); @@ -91,10 +94,11 @@ public void receiveData(MAVLinkMessage msg) { drone.getRC().setRcOutputValues((msg_servo_output_raw) msg); break; case msg_statustext.MAVLINK_MSG_ID_STATUSTEXT: - msg_statustext msg_statustext = (msg_statustext)msg; + msg_statustext msg_statustext = (msg_statustext) msg; String message = msg_statustext.getText(); - if(message.length()>7){ - if(message.substring(0,7).equals("PreArm:")||message.substring(0,4).equals("Arm:")){ + if (message.length() > 7) { + if (message.substring(0, 7).equals("PreArm:") + || message.substring(0, 4).equals("Arm:")) { drone.getState().setWarning(message); } } @@ -109,13 +113,14 @@ public void processState(msg_heartbeat msg_heart) { private void checkFailsafe(msg_heartbeat msg_heart) { boolean failsafe2 = msg_heart.system_status == (byte) MAV_STATE.MAV_STATE_CRITICAL; - if(failsafe2){ + if (failsafe2) { drone.getState().setWarning("Failsafe"); } } private void checkArmState(msg_heartbeat msg_heart) { drone.getState() - .setArmed((msg_heart.base_mode & (byte) MAV_MODE_FLAG.MAV_MODE_FLAG_SAFETY_ARMED) == (byte) MAV_MODE_FLAG.MAV_MODE_FLAG_SAFETY_ARMED); + .setArmed( + (msg_heart.base_mode & (byte) MAV_MODE_FLAG.MAV_MODE_FLAG_SAFETY_ARMED) == (byte) MAV_MODE_FLAG.MAV_MODE_FLAG_SAFETY_ARMED); } } diff --git a/Core/src/org/droidplanner/core/MAVLink/MavLinkParameters.java b/Core/src/org/droidplanner/core/MAVLink/MavLinkParameters.java index 7ff4e93155..f7e686d46f 100644 --- a/Core/src/org/droidplanner/core/MAVLink/MavLinkParameters.java +++ b/Core/src/org/droidplanner/core/MAVLink/MavLinkParameters.java @@ -32,8 +32,8 @@ public static void readParameter(Drone drone, String name) { msg.target_component = 1; msg.setParam_Id(name); drone.getMavClient().sendMavPacket(msg.pack()); - } - + } + public static void readParameter(Drone drone, int index) { msg_param_request_read msg = new msg_param_request_read(); msg.target_system = 1; diff --git a/Core/src/org/droidplanner/core/MAVLink/MavLinkROI.java b/Core/src/org/droidplanner/core/MAVLink/MavLinkROI.java index 79e1d902a0..d7bb9a6eb4 100644 --- a/Core/src/org/droidplanner/core/MAVLink/MavLinkROI.java +++ b/Core/src/org/droidplanner/core/MAVLink/MavLinkROI.java @@ -1,7 +1,7 @@ package org.droidplanner.core.MAVLink; -import org.droidplanner.core.model.Drone; import org.droidplanner.core.helpers.coordinates.Coord3D; +import org.droidplanner.core.model.Drone; import com.MAVLink.Messages.ardupilotmega.msg_command_long; import com.MAVLink.Messages.enums.MAV_CMD; diff --git a/Core/src/org/droidplanner/core/MAVLink/WaypointManager.java b/Core/src/org/droidplanner/core/MAVLink/WaypointManager.java index 8777ddbb23..3d2f33e5ab 100644 --- a/Core/src/org/droidplanner/core/MAVLink/WaypointManager.java +++ b/Core/src/org/droidplanner/core/MAVLink/WaypointManager.java @@ -5,10 +5,10 @@ import java.util.Timer; import java.util.TimerTask; -import org.droidplanner.core.model.Drone; import org.droidplanner.core.drone.DroneInterfaces.OnTimeout; import org.droidplanner.core.drone.DroneInterfaces.OnWaypointManagerListener; import org.droidplanner.core.drone.DroneVariable; +import org.droidplanner.core.model.Drone; import com.MAVLink.Messages.MAVLinkMessage; import com.MAVLink.Messages.ardupilotmega.msg_mission_ack; diff --git a/Core/src/org/droidplanner/core/drone/DroneImpl.java b/Core/src/org/droidplanner/core/drone/DroneImpl.java index c84abadc2d..f2ae4a5f80 100644 --- a/Core/src/org/droidplanner/core/drone/DroneImpl.java +++ b/Core/src/org/droidplanner/core/drone/DroneImpl.java @@ -1,7 +1,5 @@ package org.droidplanner.core.drone; -import com.MAVLink.Messages.ardupilotmega.msg_heartbeat; - import org.droidplanner.core.MAVLink.MAVLinkStreams; import org.droidplanner.core.MAVLink.WaypointManager; import org.droidplanner.core.drone.profiles.Parameters; @@ -26,206 +24,208 @@ import org.droidplanner.core.mission.Mission; import org.droidplanner.core.model.Drone; +import com.MAVLink.Messages.ardupilotmega.msg_heartbeat; + /** * Created by fhuya on 8/20/14. */ public class DroneImpl implements Drone { - private final DroneEvents events = new DroneEvents(this); - private final Type type = new Type(this); - private VehicleProfile profile; - private final org.droidplanner.core.drone.variables.GPS GPS = new GPS(this); - - private final org.droidplanner.core.drone.variables.RC RC = new RC(this); - private final Speed speed = new Speed(this); - private final Battery battery = new Battery(this); - private final Radio radio = new Radio(this); - private final Home home = new Home(this); - private final Mission mission = new Mission(this); - private final MissionStats missionStats = new MissionStats(this); - private final StreamRates streamRates = new StreamRates(this); - private final Altitude altitude = new Altitude(this); - private final Orientation orientation = new Orientation(this); - private final Navigation navigation = new Navigation(this); - private final GuidedPoint guidedPoint = new GuidedPoint(this); - private final Calibration calibrationSetup = new Calibration(this); - private final WaypointManager waypointManager = new WaypointManager(this); - - private final State state; - private final HeartBeat heartbeat; - private final Parameters parameters; - - private final MAVLinkStreams.MAVLinkOutputStream MavClient; - private final Preferences preferences; - - public DroneImpl(MAVLinkStreams.MAVLinkOutputStream mavClient, DroneInterfaces.Clock clock, - DroneInterfaces.Handler handler, Preferences pref) { - this.MavClient = mavClient; - this.preferences = pref; - state = new State(this, clock, handler); - heartbeat = new HeartBeat(this, handler); - parameters = new Parameters(this, handler); - loadVehicleProfile(); - } - - @Override - public void setAltitudeGroundAndAirSpeeds(double altitude, double groundSpeed, double airSpeed, - double climb) { - this.altitude.setAltitude(altitude); - speed.setGroundAndAirSpeeds(groundSpeed, airSpeed, climb); - events.notifyDroneEvent(DroneInterfaces.DroneEventsType.SPEED); - } - - @Override - public void setDisttowpAndSpeedAltErrors(double disttowp, double alt_error, double aspd_error) { - missionStats.setDistanceToWp(disttowp); - altitude.setAltitudeError(alt_error); - speed.setSpeedError(aspd_error); - events.notifyDroneEvent(DroneInterfaces.DroneEventsType.ORIENTATION); - } - - @Override - public void addDroneListener(DroneInterfaces.OnDroneListener listener) { - events.addDroneListener(listener); - } - - @Override - public void removeDroneListener(DroneInterfaces.OnDroneListener listener) { - events.removeDroneListener(listener); - } - - @Override - public void notifyDroneEvent(DroneInterfaces.DroneEventsType event) { - events.notifyDroneEvent(event); - } - - @Override - public GPS getGps() { - return GPS; - } - - @Override - public int getMavlinkVersion() { - return heartbeat.getMavlinkVersion(); - } - - @Override - public void onHeartbeat(msg_heartbeat msg) { - heartbeat.onHeartbeat(msg); - } - - @Override - public State getState() { - return state; - } - - @Override - public Parameters getParameters() { - return parameters; - } - - @Override - public void setType(int type) { - this.type.setType(type); - } - - @Override - public int getType() { - return type.getType(); - } - - @Override - public FirmwareType getFirmwareType() { - return type.getFirmwareType(); - } - - @Override - public void loadVehicleProfile() { - preferences.loadVehicleProfile(getFirmwareType()); - } - - @Override - public VehicleProfile getVehicleProfile() { - return profile; - } - - @Override - public MAVLinkStreams.MAVLinkOutputStream getMavClient() { - return MavClient; - } - - @Override - public Preferences getPreferences() { - return preferences; - } - - @Override - public WaypointManager getWaypointManager() { - return waypointManager; - } - - @Override - public RC getRC() { - return RC; - } - - @Override - public Speed getSpeed() { - return speed; - } - - @Override - public Battery getBattery() { - return battery; - } - - @Override - public Radio getRadio() { - return radio; - } - - @Override - public Home getHome() { - return home; - } - - @Override - public Mission getMission() { - return mission; - } - - @Override - public MissionStats getMissionStats() { - return missionStats; - } - - @Override - public StreamRates getStreamRates() { - return streamRates; - } - - @Override - public Altitude getAltitude() { - return altitude; - } - - @Override - public Orientation getOrientation() { - return orientation; - } - - @Override - public Navigation getNavigation() { - return navigation; - } - - @Override - public GuidedPoint getGuidedPoint() { - return guidedPoint; - } - - @Override - public Calibration getCalibrationSetup() { - return calibrationSetup; - } + private final DroneEvents events = new DroneEvents(this); + private final Type type = new Type(this); + private VehicleProfile profile; + private final org.droidplanner.core.drone.variables.GPS GPS = new GPS(this); + + private final org.droidplanner.core.drone.variables.RC RC = new RC(this); + private final Speed speed = new Speed(this); + private final Battery battery = new Battery(this); + private final Radio radio = new Radio(this); + private final Home home = new Home(this); + private final Mission mission = new Mission(this); + private final MissionStats missionStats = new MissionStats(this); + private final StreamRates streamRates = new StreamRates(this); + private final Altitude altitude = new Altitude(this); + private final Orientation orientation = new Orientation(this); + private final Navigation navigation = new Navigation(this); + private final GuidedPoint guidedPoint = new GuidedPoint(this); + private final Calibration calibrationSetup = new Calibration(this); + private final WaypointManager waypointManager = new WaypointManager(this); + + private final State state; + private final HeartBeat heartbeat; + private final Parameters parameters; + + private final MAVLinkStreams.MAVLinkOutputStream MavClient; + private final Preferences preferences; + + public DroneImpl(MAVLinkStreams.MAVLinkOutputStream mavClient, DroneInterfaces.Clock clock, + DroneInterfaces.Handler handler, Preferences pref) { + this.MavClient = mavClient; + this.preferences = pref; + state = new State(this, clock, handler); + heartbeat = new HeartBeat(this, handler); + parameters = new Parameters(this, handler); + loadVehicleProfile(); + } + + @Override + public void setAltitudeGroundAndAirSpeeds(double altitude, double groundSpeed, double airSpeed, + double climb) { + this.altitude.setAltitude(altitude); + speed.setGroundAndAirSpeeds(groundSpeed, airSpeed, climb); + events.notifyDroneEvent(DroneInterfaces.DroneEventsType.SPEED); + } + + @Override + public void setDisttowpAndSpeedAltErrors(double disttowp, double alt_error, double aspd_error) { + missionStats.setDistanceToWp(disttowp); + altitude.setAltitudeError(alt_error); + speed.setSpeedError(aspd_error); + events.notifyDroneEvent(DroneInterfaces.DroneEventsType.ORIENTATION); + } + + @Override + public void addDroneListener(DroneInterfaces.OnDroneListener listener) { + events.addDroneListener(listener); + } + + @Override + public void removeDroneListener(DroneInterfaces.OnDroneListener listener) { + events.removeDroneListener(listener); + } + + @Override + public void notifyDroneEvent(DroneInterfaces.DroneEventsType event) { + events.notifyDroneEvent(event); + } + + @Override + public GPS getGps() { + return GPS; + } + + @Override + public int getMavlinkVersion() { + return heartbeat.getMavlinkVersion(); + } + + @Override + public void onHeartbeat(msg_heartbeat msg) { + heartbeat.onHeartbeat(msg); + } + + @Override + public State getState() { + return state; + } + + @Override + public Parameters getParameters() { + return parameters; + } + + @Override + public void setType(int type) { + this.type.setType(type); + } + + @Override + public int getType() { + return type.getType(); + } + + @Override + public FirmwareType getFirmwareType() { + return type.getFirmwareType(); + } + + @Override + public void loadVehicleProfile() { + preferences.loadVehicleProfile(getFirmwareType()); + } + + @Override + public VehicleProfile getVehicleProfile() { + return profile; + } + + @Override + public MAVLinkStreams.MAVLinkOutputStream getMavClient() { + return MavClient; + } + + @Override + public Preferences getPreferences() { + return preferences; + } + + @Override + public WaypointManager getWaypointManager() { + return waypointManager; + } + + @Override + public RC getRC() { + return RC; + } + + @Override + public Speed getSpeed() { + return speed; + } + + @Override + public Battery getBattery() { + return battery; + } + + @Override + public Radio getRadio() { + return radio; + } + + @Override + public Home getHome() { + return home; + } + + @Override + public Mission getMission() { + return mission; + } + + @Override + public MissionStats getMissionStats() { + return missionStats; + } + + @Override + public StreamRates getStreamRates() { + return streamRates; + } + + @Override + public Altitude getAltitude() { + return altitude; + } + + @Override + public Orientation getOrientation() { + return orientation; + } + + @Override + public Navigation getNavigation() { + return navigation; + } + + @Override + public GuidedPoint getGuidedPoint() { + return guidedPoint; + } + + @Override + public Calibration getCalibrationSetup() { + return calibrationSetup; + } } diff --git a/Core/src/org/droidplanner/core/drone/DroneInterfaces.java b/Core/src/org/droidplanner/core/drone/DroneInterfaces.java index 02b6075e3e..aa65d1c3d3 100644 --- a/Core/src/org/droidplanner/core/drone/DroneInterfaces.java +++ b/Core/src/org/droidplanner/core/drone/DroneInterfaces.java @@ -98,8 +98,8 @@ public enum DroneEventsType { HOME, /** - * Broadcast to notify of updates to the drone's gps location. - */ + * Broadcast to notify of updates to the drone's gps location. + */ GPS, /** @@ -173,14 +173,14 @@ public enum DroneEventsType { MISSION_WP_UPDATE, /** - * 'Follow' mode has been enabled. - */ + * 'Follow' mode has been enabled. + */ FOLLOW_START, - /** - * 'Follow' mode has been disabled. - */ - FOLLOW_STOP, + /** + * 'Follow' mode has been disabled. + */ + FOLLOW_STOP, /** * diff --git a/Core/src/org/droidplanner/core/drone/profiles/Parameters.java b/Core/src/org/droidplanner/core/drone/profiles/Parameters.java index 33d83be598..61fe36cec9 100644 --- a/Core/src/org/droidplanner/core/drone/profiles/Parameters.java +++ b/Core/src/org/droidplanner/core/drone/profiles/Parameters.java @@ -5,12 +5,12 @@ import java.util.List; import org.droidplanner.core.MAVLink.MavLinkParameters; -import org.droidplanner.core.model.Drone; import org.droidplanner.core.drone.DroneInterfaces; import org.droidplanner.core.drone.DroneInterfaces.DroneEventsType; import org.droidplanner.core.drone.DroneInterfaces.Handler; import org.droidplanner.core.drone.DroneInterfaces.OnDroneListener; import org.droidplanner.core.drone.DroneVariable; +import org.droidplanner.core.model.Drone; import org.droidplanner.core.parameters.Parameter; import com.MAVLink.Messages.MAVLinkMessage; @@ -149,23 +149,23 @@ private void killWatchdog() { @Override public void onDroneEvent(DroneEventsType event, Drone drone) { - switch(event){ + switch (event) { case HEARTBEAT_FIRST: if (drone.getState().isFlying() == false) { - getAllParameters(); + getAllParameters(); } - break; + break; case DISCONNECTED: case HEARTBEAT_TIMEOUT: killWatchdog(); break; default: break; - + } } - public void setParameterListener(DroneInterfaces.OnParameterManagerListener parameterListener) { - this.parameterListener = parameterListener; - } + public void setParameterListener(DroneInterfaces.OnParameterManagerListener parameterListener) { + this.parameterListener = parameterListener; + } } diff --git a/Core/src/org/droidplanner/core/drone/variables/Altitude.java b/Core/src/org/droidplanner/core/drone/variables/Altitude.java index 3fcc4bb409..98fa579237 100644 --- a/Core/src/org/droidplanner/core/drone/variables/Altitude.java +++ b/Core/src/org/droidplanner/core/drone/variables/Altitude.java @@ -1,7 +1,7 @@ package org.droidplanner.core.drone.variables; -import org.droidplanner.core.model.Drone; import org.droidplanner.core.drone.DroneVariable; +import org.droidplanner.core.model.Drone; public class Altitude extends DroneVariable { private double altitude = 0; diff --git a/Core/src/org/droidplanner/core/drone/variables/Battery.java b/Core/src/org/droidplanner/core/drone/variables/Battery.java index 553be30607..c2e2f17c61 100644 --- a/Core/src/org/droidplanner/core/drone/variables/Battery.java +++ b/Core/src/org/droidplanner/core/drone/variables/Battery.java @@ -1,8 +1,8 @@ package org.droidplanner.core.drone.variables; -import org.droidplanner.core.model.Drone; import org.droidplanner.core.drone.DroneInterfaces.DroneEventsType; import org.droidplanner.core.drone.DroneVariable; +import org.droidplanner.core.model.Drone; public class Battery extends DroneVariable { private double battVolt = -1; diff --git a/Core/src/org/droidplanner/core/drone/variables/Calibration.java b/Core/src/org/droidplanner/core/drone/variables/Calibration.java index eebfdcb2c6..90dcc52a30 100644 --- a/Core/src/org/droidplanner/core/drone/variables/Calibration.java +++ b/Core/src/org/droidplanner/core/drone/variables/Calibration.java @@ -1,9 +1,9 @@ package org.droidplanner.core.drone.variables; import org.droidplanner.core.MAVLink.MavLinkCalibration; -import org.droidplanner.core.model.Drone; import org.droidplanner.core.drone.DroneInterfaces.DroneEventsType; import org.droidplanner.core.drone.DroneVariable; +import org.droidplanner.core.model.Drone; import com.MAVLink.Messages.MAVLinkMessage; import com.MAVLink.Messages.ardupilotmega.msg_statustext; diff --git a/Core/src/org/droidplanner/core/drone/variables/GPS.java b/Core/src/org/droidplanner/core/drone/variables/GPS.java index e270fe1be2..e0e5177566 100644 --- a/Core/src/org/droidplanner/core/drone/variables/GPS.java +++ b/Core/src/org/droidplanner/core/drone/variables/GPS.java @@ -1,9 +1,9 @@ package org.droidplanner.core.drone.variables; -import org.droidplanner.core.model.Drone; import org.droidplanner.core.drone.DroneInterfaces.DroneEventsType; import org.droidplanner.core.drone.DroneVariable; import org.droidplanner.core.helpers.coordinates.Coord2D; +import org.droidplanner.core.model.Drone; public class GPS extends DroneVariable { public final static int LOCK_2D = 2; diff --git a/Core/src/org/droidplanner/core/drone/variables/GuidedPoint.java b/Core/src/org/droidplanner/core/drone/variables/GuidedPoint.java index b9aacbc54e..287827fe1f 100644 --- a/Core/src/org/droidplanner/core/drone/variables/GuidedPoint.java +++ b/Core/src/org/droidplanner/core/drone/variables/GuidedPoint.java @@ -1,12 +1,12 @@ package org.droidplanner.core.drone.variables; import org.droidplanner.core.MAVLink.MavLinkModes; -import org.droidplanner.core.model.Drone; import org.droidplanner.core.drone.DroneInterfaces.DroneEventsType; import org.droidplanner.core.drone.DroneInterfaces.OnDroneListener; import org.droidplanner.core.drone.DroneVariable; import org.droidplanner.core.helpers.coordinates.Coord2D; import org.droidplanner.core.helpers.units.Altitude; +import org.droidplanner.core.model.Drone; import com.MAVLink.Messages.ApmModes; @@ -20,7 +20,7 @@ private enum GuidedStates { UNINITIALIZED, IDLE, ACTIVE } - public GuidedPoint(Drone myDrone) { + public GuidedPoint(Drone myDrone) { super(myDrone); myDrone.addDroneListener(this); } diff --git a/Core/src/org/droidplanner/core/drone/variables/HeartBeat.java b/Core/src/org/droidplanner/core/drone/variables/HeartBeat.java index c1251094e0..27649394af 100644 --- a/Core/src/org/droidplanner/core/drone/variables/HeartBeat.java +++ b/Core/src/org/droidplanner/core/drone/variables/HeartBeat.java @@ -1,10 +1,10 @@ package org.droidplanner.core.drone.variables; -import org.droidplanner.core.model.Drone; import org.droidplanner.core.drone.DroneInterfaces.DroneEventsType; import org.droidplanner.core.drone.DroneInterfaces.Handler; import org.droidplanner.core.drone.DroneInterfaces.OnDroneListener; import org.droidplanner.core.drone.DroneVariable; +import org.droidplanner.core.model.Drone; import com.MAVLink.Messages.ardupilotmega.msg_heartbeat; @@ -16,7 +16,7 @@ public class HeartBeat extends DroneVariable implements OnDroneListener { public static final int INVALID_MAVLINK_VERSION = -1; public HeartbeatState heartbeatState = HeartbeatState.FIRST_HEARTBEAT; - public int droneID = 1; + public int droneID = 1; /** * Stores the version of the mavlink protocol. diff --git a/Core/src/org/droidplanner/core/drone/variables/Home.java b/Core/src/org/droidplanner/core/drone/variables/Home.java index 86d25bc637..e1a075eff8 100644 --- a/Core/src/org/droidplanner/core/drone/variables/Home.java +++ b/Core/src/org/droidplanner/core/drone/variables/Home.java @@ -1,12 +1,12 @@ package org.droidplanner.core.drone.variables; -import org.droidplanner.core.model.Drone; import org.droidplanner.core.drone.DroneInterfaces.DroneEventsType; import org.droidplanner.core.drone.DroneVariable; import org.droidplanner.core.helpers.coordinates.Coord2D; import org.droidplanner.core.helpers.geoTools.GeoTools; import org.droidplanner.core.helpers.units.Altitude; import org.droidplanner.core.helpers.units.Length; +import org.droidplanner.core.model.Drone; import com.MAVLink.Messages.ardupilotmega.msg_mission_item; import com.MAVLink.Messages.enums.MAV_CMD; diff --git a/Core/src/org/droidplanner/core/drone/variables/MissionStats.java b/Core/src/org/droidplanner/core/drone/variables/MissionStats.java index c16ca1d2ec..1dfcd3292b 100644 --- a/Core/src/org/droidplanner/core/drone/variables/MissionStats.java +++ b/Core/src/org/droidplanner/core/drone/variables/MissionStats.java @@ -1,9 +1,9 @@ package org.droidplanner.core.drone.variables; -import org.droidplanner.core.model.Drone; import org.droidplanner.core.drone.DroneInterfaces.DroneEventsType; import org.droidplanner.core.drone.DroneVariable; import org.droidplanner.core.helpers.units.Length; +import org.droidplanner.core.model.Drone; public class MissionStats extends DroneVariable { private double distanceToWp = 0; diff --git a/Core/src/org/droidplanner/core/drone/variables/Navigation.java b/Core/src/org/droidplanner/core/drone/variables/Navigation.java index 83f4dae6e1..b2f527e6f3 100644 --- a/Core/src/org/droidplanner/core/drone/variables/Navigation.java +++ b/Core/src/org/droidplanner/core/drone/variables/Navigation.java @@ -1,8 +1,8 @@ package org.droidplanner.core.drone.variables; -import org.droidplanner.core.model.Drone; import org.droidplanner.core.drone.DroneInterfaces.DroneEventsType; import org.droidplanner.core.drone.DroneVariable; +import org.droidplanner.core.model.Drone; public class Navigation extends DroneVariable { diff --git a/Core/src/org/droidplanner/core/drone/variables/Orientation.java b/Core/src/org/droidplanner/core/drone/variables/Orientation.java index ec0259e2a0..20b82ea0c1 100644 --- a/Core/src/org/droidplanner/core/drone/variables/Orientation.java +++ b/Core/src/org/droidplanner/core/drone/variables/Orientation.java @@ -1,8 +1,8 @@ package org.droidplanner.core.drone.variables; -import org.droidplanner.core.model.Drone; import org.droidplanner.core.drone.DroneInterfaces.DroneEventsType; import org.droidplanner.core.drone.DroneVariable; +import org.droidplanner.core.model.Drone; public class Orientation extends DroneVariable { private double roll = 0; diff --git a/Core/src/org/droidplanner/core/drone/variables/RC.java b/Core/src/org/droidplanner/core/drone/variables/RC.java index 77b6767b04..2d02e50621 100644 --- a/Core/src/org/droidplanner/core/drone/variables/RC.java +++ b/Core/src/org/droidplanner/core/drone/variables/RC.java @@ -1,8 +1,8 @@ package org.droidplanner.core.drone.variables; -import org.droidplanner.core.model.Drone; import org.droidplanner.core.drone.DroneInterfaces.DroneEventsType; import org.droidplanner.core.drone.DroneVariable; +import org.droidplanner.core.model.Drone; import com.MAVLink.Messages.ardupilotmega.msg_rc_channels_raw; import com.MAVLink.Messages.ardupilotmega.msg_servo_output_raw; diff --git a/Core/src/org/droidplanner/core/drone/variables/Radio.java b/Core/src/org/droidplanner/core/drone/variables/Radio.java index f4f6e97dcf..784cda7552 100644 --- a/Core/src/org/droidplanner/core/drone/variables/Radio.java +++ b/Core/src/org/droidplanner/core/drone/variables/Radio.java @@ -1,9 +1,9 @@ package org.droidplanner.core.drone.variables; -import org.droidplanner.core.model.Drone; import org.droidplanner.core.drone.DroneInterfaces.DroneEventsType; import org.droidplanner.core.drone.DroneVariable; import org.droidplanner.core.helpers.math.MathUtil; +import org.droidplanner.core.model.Drone; public class Radio extends DroneVariable { private static final int MAX_FADE_MARGIN = 50; diff --git a/Core/src/org/droidplanner/core/drone/variables/Speed.java b/Core/src/org/droidplanner/core/drone/variables/Speed.java index 9583a9ccf3..fc53699561 100644 --- a/Core/src/org/droidplanner/core/drone/variables/Speed.java +++ b/Core/src/org/droidplanner/core/drone/variables/Speed.java @@ -1,13 +1,17 @@ package org.droidplanner.core.drone.variables; -import org.droidplanner.core.model.Drone; import org.droidplanner.core.drone.DroneVariable; +import org.droidplanner.core.model.Drone; public class Speed extends DroneVariable { - private org.droidplanner.core.helpers.units.Speed verticalSpeed = new org.droidplanner.core.helpers.units.Speed(0);; - private org.droidplanner.core.helpers.units.Speed groundSpeed = new org.droidplanner.core.helpers.units.Speed(0);; - private org.droidplanner.core.helpers.units.Speed airSpeed = new org.droidplanner.core.helpers.units.Speed(0);; - private org.droidplanner.core.helpers.units.Speed targetSpeed = new org.droidplanner.core.helpers.units.Speed(0); + private org.droidplanner.core.helpers.units.Speed verticalSpeed = new org.droidplanner.core.helpers.units.Speed( + 0);; + private org.droidplanner.core.helpers.units.Speed groundSpeed = new org.droidplanner.core.helpers.units.Speed( + 0);; + private org.droidplanner.core.helpers.units.Speed airSpeed = new org.droidplanner.core.helpers.units.Speed( + 0);; + private org.droidplanner.core.helpers.units.Speed targetSpeed = new org.droidplanner.core.helpers.units.Speed( + 0); public Speed(Drone myDrone) { super(myDrone); @@ -30,7 +34,8 @@ public org.droidplanner.core.helpers.units.Speed getTargetSpeed() { } public void setSpeedError(double aspd_error) { - targetSpeed = new org.droidplanner.core.helpers.units.Speed(aspd_error + airSpeed.valueInMetersPerSecond()); + targetSpeed = new org.droidplanner.core.helpers.units.Speed(aspd_error + + airSpeed.valueInMetersPerSecond()); } public void setGroundAndAirSpeeds(double groundSpeed, double airSpeed, double climb) { diff --git a/Core/src/org/droidplanner/core/drone/variables/State.java b/Core/src/org/droidplanner/core/drone/variables/State.java index 5f9cae911f..2aa1d7be02 100644 --- a/Core/src/org/droidplanner/core/drone/variables/State.java +++ b/Core/src/org/droidplanner/core/drone/variables/State.java @@ -1,11 +1,11 @@ package org.droidplanner.core.drone.variables; import org.droidplanner.core.MAVLink.MavLinkModes; -import org.droidplanner.core.model.Drone; import org.droidplanner.core.drone.DroneInterfaces.Clock; import org.droidplanner.core.drone.DroneInterfaces.DroneEventsType; import org.droidplanner.core.drone.DroneInterfaces.Handler; import org.droidplanner.core.drone.DroneVariable; +import org.droidplanner.core.model.Drone; import com.MAVLink.Messages.ApmModes; @@ -21,7 +21,7 @@ public class State extends DroneVariable { private long startTime = 0; private long elapsedFlightTime = 0; private Clock clock; - + public Handler watchdog; public Runnable watchdogCallback = new Runnable() { @Override @@ -33,11 +33,10 @@ public void run() { public State(Drone myDrone, Clock clock, Handler handler) { super(myDrone); this.clock = clock; - this.watchdog=handler; + this.watchdog = handler; resetFlightTimer(); } - public boolean isWarning() { return !warning.equals(""); } @@ -53,8 +52,8 @@ public boolean isFlying() { public ApmModes getMode() { return mode; } - - public String getWarning(){ + + public String getWarning() { return warning; } @@ -101,7 +100,7 @@ public void changeFlightMode(ApmModes mode) { MavLinkModes.changeFlightMode(myDrone, mode); } } - + protected void removeWarning() { setWarning(""); } diff --git a/Core/src/org/droidplanner/core/drone/variables/StreamRates.java b/Core/src/org/droidplanner/core/drone/variables/StreamRates.java index 391357445c..9f571f8fda 100644 --- a/Core/src/org/droidplanner/core/drone/variables/StreamRates.java +++ b/Core/src/org/droidplanner/core/drone/variables/StreamRates.java @@ -1,11 +1,11 @@ package org.droidplanner.core.drone.variables; import org.droidplanner.core.MAVLink.MavLinkStreamRates; -import org.droidplanner.core.model.Drone; import org.droidplanner.core.drone.DroneInterfaces.DroneEventsType; import org.droidplanner.core.drone.DroneInterfaces.OnDroneListener; import org.droidplanner.core.drone.DroneVariable; import org.droidplanner.core.drone.Preferences.Rates; +import org.droidplanner.core.model.Drone; public class StreamRates extends DroneVariable implements OnDroneListener { @@ -29,9 +29,9 @@ public void onDroneEvent(DroneEventsType event, Drone drone) { public void setupStreamRatesFromPref() { Rates rates = myDrone.getPreferences().getRates(); - MavLinkStreamRates.setupStreamRates(myDrone.getMavClient(), rates.extendedStatus, rates.extra1, - rates.extra2, rates.extra3, rates.position, rates.rcChannels, rates.rawSensors, - rates.rawController); + MavLinkStreamRates.setupStreamRates(myDrone.getMavClient(), rates.extendedStatus, + rates.extra1, rates.extra2, rates.extra3, rates.position, rates.rcChannels, + rates.rawSensors, rates.rawController); } } diff --git a/Core/src/org/droidplanner/core/drone/variables/Type.java b/Core/src/org/droidplanner/core/drone/variables/Type.java index 035cbfa718..a6a7ceacd5 100644 --- a/Core/src/org/droidplanner/core/drone/variables/Type.java +++ b/Core/src/org/droidplanner/core/drone/variables/Type.java @@ -1,9 +1,9 @@ package org.droidplanner.core.drone.variables; -import org.droidplanner.core.model.Drone; import org.droidplanner.core.drone.DroneInterfaces.DroneEventsType; import org.droidplanner.core.drone.DroneVariable; import org.droidplanner.core.firmware.FirmwareType; +import org.droidplanner.core.model.Drone; import com.MAVLink.Messages.enums.MAV_TYPE; @@ -27,31 +27,32 @@ public int getType() { return type; } - public FirmwareType getFirmwareType() { - if (myDrone.getMavClient().isConnected()) { - switch (this.type) { - - case MAV_TYPE.MAV_TYPE_FIXED_WING: - return FirmwareType.ARDU_PLANE; - - case MAV_TYPE.MAV_TYPE_GENERIC: - case MAV_TYPE.MAV_TYPE_QUADROTOR: - case MAV_TYPE.MAV_TYPE_COAXIAL: - case MAV_TYPE.MAV_TYPE_HELICOPTER: - case MAV_TYPE.MAV_TYPE_HEXAROTOR: - case MAV_TYPE.MAV_TYPE_OCTOROTOR: - case MAV_TYPE.MAV_TYPE_TRICOPTER: - return FirmwareType.ARDU_COPTER; - - case MAV_TYPE.MAV_TYPE_GROUND_ROVER: - case MAV_TYPE.MAV_TYPE_SURFACE_BOAT: - return FirmwareType.ARDU_ROVER; - - default: - // unsupported - fall thru to offline condition - } - } - return myDrone.getPreferences().getVehicleType(); // offline or unsupported - } + public FirmwareType getFirmwareType() { + if (myDrone.getMavClient().isConnected()) { + switch (this.type) { + + case MAV_TYPE.MAV_TYPE_FIXED_WING: + return FirmwareType.ARDU_PLANE; + + case MAV_TYPE.MAV_TYPE_GENERIC: + case MAV_TYPE.MAV_TYPE_QUADROTOR: + case MAV_TYPE.MAV_TYPE_COAXIAL: + case MAV_TYPE.MAV_TYPE_HELICOPTER: + case MAV_TYPE.MAV_TYPE_HEXAROTOR: + case MAV_TYPE.MAV_TYPE_OCTOROTOR: + case MAV_TYPE.MAV_TYPE_TRICOPTER: + return FirmwareType.ARDU_COPTER; + + case MAV_TYPE.MAV_TYPE_GROUND_ROVER: + case MAV_TYPE.MAV_TYPE_SURFACE_BOAT: + return FirmwareType.ARDU_ROVER; + + default: + // unsupported - fall thru to offline condition + } + } + return myDrone.getPreferences().getVehicleType(); // offline or + // unsupported + } } \ No newline at end of file diff --git a/Core/src/org/droidplanner/core/firmware/FirmwareType.java b/Core/src/org/droidplanner/core/firmware/FirmwareType.java index 2ac45113ae..fed222c4ab 100644 --- a/Core/src/org/droidplanner/core/firmware/FirmwareType.java +++ b/Core/src/org/droidplanner/core/firmware/FirmwareType.java @@ -1,30 +1,28 @@ package org.droidplanner.core.firmware; public enum FirmwareType { - ARDU_PLANE("ArduPlane"), - ARDU_COPTER("ArduCopter"), - ARDU_ROVER("ArduRover"); + ARDU_PLANE("ArduPlane"), ARDU_COPTER("ArduCopter"), ARDU_ROVER("ArduRover"); - private final String type; + private final String type; - FirmwareType(String type) { - this.type = type; - } + FirmwareType(String type) { + this.type = type; + } - @Override - public String toString() { - return type; - } + @Override + public String toString() { + return type; + } - public static FirmwareType firmwareFromString(String str) { - if (str.equalsIgnoreCase(ARDU_PLANE.type)) { - return ARDU_PLANE; - } + public static FirmwareType firmwareFromString(String str) { + if (str.equalsIgnoreCase(ARDU_PLANE.type)) { + return ARDU_PLANE; + } - if (str.equalsIgnoreCase(ARDU_ROVER.type)) { - return ARDU_ROVER; - } else { - return ARDU_COPTER; - } - } + if (str.equalsIgnoreCase(ARDU_ROVER.type)) { + return ARDU_ROVER; + } else { + return ARDU_COPTER; + } + } } diff --git a/Core/src/org/droidplanner/core/gcs/follow/Follow.java b/Core/src/org/droidplanner/core/gcs/follow/Follow.java index 02772aba1d..76382a3ca6 100644 --- a/Core/src/org/droidplanner/core/gcs/follow/Follow.java +++ b/Core/src/org/droidplanner/core/gcs/follow/Follow.java @@ -1,27 +1,27 @@ package org.droidplanner.core.gcs.follow; -import org.droidplanner.core.drone.variables.State; -import org.droidplanner.core.model.Drone; import org.droidplanner.core.drone.DroneInterfaces.DroneEventsType; import org.droidplanner.core.drone.DroneInterfaces.Handler; import org.droidplanner.core.drone.DroneInterfaces.OnDroneListener; +import org.droidplanner.core.drone.variables.State; import org.droidplanner.core.gcs.follow.FollowAlgorithm.FollowModes; import org.droidplanner.core.gcs.location.Location; import org.droidplanner.core.gcs.location.Location.LocationFinder; import org.droidplanner.core.gcs.location.Location.LocationReceiver; import org.droidplanner.core.gcs.roi.ROIEstimator; import org.droidplanner.core.helpers.units.Length; +import org.droidplanner.core.model.Drone; import com.MAVLink.Messages.ApmModes; public class Follow implements OnDroneListener, LocationReceiver { - //Set of return value for the 'toggleFollowMeState' method. - public static final int FOLLOW_INVALID_STATE = -1; - public static final int FOLLOW_DRONE_NOT_ARMED = -2; - public static final int FOLLOW_DRONE_DISCONNECTED = -3; - public static final int FOLLOW_START = 0; - public static final int FOLLOW_END = 1; + // Set of return value for the 'toggleFollowMeState' method. + public static final int FOLLOW_INVALID_STATE = -1; + public static final int FOLLOW_DRONE_NOT_ARMED = -2; + public static final int FOLLOW_DRONE_DISCONNECTED = -3; + public static final int FOLLOW_START = 0; + public static final int FOLLOW_END = 1; private boolean followMeEnabled = false; private Drone drone; @@ -40,29 +40,26 @@ public Follow(Drone drone, Handler handler, LocationFinder locationFinder) { } public int toggleFollowMeState() { - final State droneState = drone.getState(); - if(droneState == null){ - return FOLLOW_INVALID_STATE; - } + final State droneState = drone.getState(); + if (droneState == null) { + return FOLLOW_INVALID_STATE; + } if (isEnabled()) { disableFollowMe(); drone.getState().changeFlightMode(ApmModes.ROTOR_LOITER); - return FOLLOW_END; - } - else { + return FOLLOW_END; + } else { if (drone.getMavClient().isConnected()) { if (drone.getState().isArmed()) { drone.getState().changeFlightMode(ApmModes.ROTOR_GUIDED); enableFollowMe(); - return FOLLOW_START; + return FOLLOW_START; + } else { + return FOLLOW_DRONE_NOT_ARMED; } - else { - return FOLLOW_DRONE_NOT_ARMED; - } - } - else { - return FOLLOW_DRONE_DISCONNECTED; + } else { + return FOLLOW_DRONE_DISCONNECTED; } } } @@ -70,14 +67,14 @@ public int toggleFollowMeState() { private void enableFollowMe() { locationFinder.enableLocationUpdates(); followMeEnabled = true; - drone.notifyDroneEvent(DroneEventsType.FOLLOW_START); + drone.notifyDroneEvent(DroneEventsType.FOLLOW_START); } private void disableFollowMe() { - locationFinder.disableLocationUpdates(); + locationFinder.disableLocationUpdates(); if (followMeEnabled) { followMeEnabled = false; - drone.notifyDroneEvent(DroneEventsType.FOLLOW_STOP); + drone.notifyDroneEvent(DroneEventsType.FOLLOW_STOP); } } @@ -106,7 +103,7 @@ public Length getRadius() { @Override public void onLocationChanged(Location location) { - if(location.getAccuracy()<10.0){ + if (location.getAccuracy() < 10.0) { followAlgorithm.processNewLocation(location); } roiEstimator.onLocationChanged(location); diff --git a/Core/src/org/droidplanner/core/gcs/follow/FollowAbove.java b/Core/src/org/droidplanner/core/gcs/follow/FollowAbove.java index 965024db1c..89e457ea42 100644 --- a/Core/src/org/droidplanner/core/gcs/follow/FollowAbove.java +++ b/Core/src/org/droidplanner/core/gcs/follow/FollowAbove.java @@ -17,7 +17,7 @@ public FollowModes getType() { @Override public void processNewLocation(Location location) { - drone.getGuidedPoint().newGuidedCoord(location.getCoord()); + drone.getGuidedPoint().newGuidedCoord(location.getCoord()); } } diff --git a/Core/src/org/droidplanner/core/gcs/follow/FollowAlgorithm.java b/Core/src/org/droidplanner/core/gcs/follow/FollowAlgorithm.java index ad2f9be8e6..3f60e27077 100644 --- a/Core/src/org/droidplanner/core/gcs/follow/FollowAlgorithm.java +++ b/Core/src/org/droidplanner/core/gcs/follow/FollowAlgorithm.java @@ -1,8 +1,8 @@ package org.droidplanner.core.gcs.follow; -import org.droidplanner.core.model.Drone; import org.droidplanner.core.gcs.location.Location; import org.droidplanner.core.helpers.units.Length; +import org.droidplanner.core.model.Drone; public abstract class FollowAlgorithm { public abstract void processNewLocation(Location location); diff --git a/Core/src/org/droidplanner/core/gcs/follow/FollowLeash.java b/Core/src/org/droidplanner/core/gcs/follow/FollowLeash.java index bb549d734c..7e25b94faf 100644 --- a/Core/src/org/droidplanner/core/gcs/follow/FollowLeash.java +++ b/Core/src/org/droidplanner/core/gcs/follow/FollowLeash.java @@ -1,10 +1,10 @@ package org.droidplanner.core.gcs.follow; -import org.droidplanner.core.model.Drone; import org.droidplanner.core.gcs.location.Location; import org.droidplanner.core.helpers.coordinates.Coord2D; import org.droidplanner.core.helpers.geoTools.GeoTools; import org.droidplanner.core.helpers.units.Length; +import org.droidplanner.core.model.Drone; public class FollowLeash extends FollowAlgorithm { @@ -19,13 +19,12 @@ public FollowModes getType() { @Override public void processNewLocation(Location location) { - if (GeoTools.getDistance(location.getCoord(), drone.getGps().getPosition()).valueInMeters() > - radius + if (GeoTools.getDistance(location.getCoord(), drone.getGps().getPosition()).valueInMeters() > radius .valueInMeters()) { double headingGCStoDrone = GeoTools.getHeadingFromCoordinates(location.getCoord(), drone.getGps().getPosition()); - Coord2D goCoord = GeoTools.newCoordFromBearingAndDistance(location.getCoord(), headingGCStoDrone, - radius.valueInMeters()); + Coord2D goCoord = GeoTools.newCoordFromBearingAndDistance(location.getCoord(), + headingGCStoDrone, radius.valueInMeters()); drone.getGuidedPoint().newGuidedCoord(goCoord); } } diff --git a/Core/src/org/droidplanner/core/gcs/location/Location.java b/Core/src/org/droidplanner/core/gcs/location/Location.java index d7662430dc..d00b4c57a7 100644 --- a/Core/src/org/droidplanner/core/gcs/location/Location.java +++ b/Core/src/org/droidplanner/core/gcs/location/Location.java @@ -2,8 +2,7 @@ import org.droidplanner.core.helpers.coordinates.Coord2D; - -public class Location{ +public class Location { public interface LocationReceiver { public void onLocationChanged(Location location); @@ -11,17 +10,20 @@ public interface LocationReceiver { public interface LocationFinder { public void enableLocationUpdates(); + public void disableLocationUpdates(); + public void setLocationListner(LocationReceiver receiver); } - + private Coord2D coordinate; private double accuracy = 0.0; - + public Location(Coord2D coord2d) { coordinate = coord2d; } - public Location(Coord2D coord2d, double accuracy){ + + public Location(Coord2D coord2d, double accuracy) { coordinate = coord2d; this.accuracy = accuracy; } @@ -29,6 +31,9 @@ public Location(Coord2D coord2d, double accuracy){ public Coord2D getCoord() { return coordinate; } - public double getAccuracy() { return accuracy; } + + public double getAccuracy() { + return accuracy; + } } diff --git a/Core/src/org/droidplanner/core/gcs/roi/ROIEstimator.java b/Core/src/org/droidplanner/core/gcs/roi/ROIEstimator.java index 56af2b3005..649e85bccc 100644 --- a/Core/src/org/droidplanner/core/gcs/roi/ROIEstimator.java +++ b/Core/src/org/droidplanner/core/gcs/roi/ROIEstimator.java @@ -1,13 +1,12 @@ package org.droidplanner.core.gcs.roi; import org.droidplanner.core.MAVLink.MavLinkROI; -import org.droidplanner.core.model.Drone; import org.droidplanner.core.drone.DroneInterfaces.Handler; import org.droidplanner.core.gcs.location.Location; import org.droidplanner.core.gcs.location.Location.LocationReceiver; import org.droidplanner.core.helpers.coordinates.Coord3D; import org.droidplanner.core.helpers.units.Altitude; - +import org.droidplanner.core.model.Drone; public class ROIEstimator implements LocationReceiver { private Drone drone; diff --git a/Core/src/org/droidplanner/core/helpers/coordinates/Coord2D.java b/Core/src/org/droidplanner/core/helpers/coordinates/Coord2D.java index 09a958bb87..e1c2e50af7 100644 --- a/Core/src/org/droidplanner/core/helpers/coordinates/Coord2D.java +++ b/Core/src/org/droidplanner/core/helpers/coordinates/Coord2D.java @@ -37,9 +37,9 @@ public double getLat() { return latitude; } - public boolean isEmpty() { - return latitude == 0 || longitude == 0; - } + public boolean isEmpty() { + return latitude == 0 || longitude == 0; + } @Override public String toString() { diff --git a/Core/src/org/droidplanner/core/helpers/geoTools/GeoTools.java b/Core/src/org/droidplanner/core/helpers/geoTools/GeoTools.java index a1b6e78e70..76d1a8a0b8 100644 --- a/Core/src/org/droidplanner/core/helpers/geoTools/GeoTools.java +++ b/Core/src/org/droidplanner/core/helpers/geoTools/GeoTools.java @@ -109,7 +109,6 @@ public static Length get3DDistance(Coord3D end, Coord3D start) { return MathUtil.hypot(horizontalDistance, altitudeDiff); } - /** * Computes the heading between two coordinates * diff --git a/Core/src/org/droidplanner/core/helpers/geoTools/spline/SplinePath.java b/Core/src/org/droidplanner/core/helpers/geoTools/spline/SplinePath.java index a20e4fe80b..bec524fbb0 100644 --- a/Core/src/org/droidplanner/core/helpers/geoTools/spline/SplinePath.java +++ b/Core/src/org/droidplanner/core/helpers/geoTools/spline/SplinePath.java @@ -22,8 +22,7 @@ public class SplinePath { * describing the spline path. * * @param points - * map coordinates - * decimation factor + * map coordinates decimation factor * @return set of coordinates describing the spline path */ public static List process(List points) { diff --git a/Core/src/org/droidplanner/core/helpers/math/MathUtil.java b/Core/src/org/droidplanner/core/helpers/math/MathUtil.java index 46af40efe3..d2f4918bd7 100644 --- a/Core/src/org/droidplanner/core/helpers/math/MathUtil.java +++ b/Core/src/org/droidplanner/core/helpers/math/MathUtil.java @@ -35,6 +35,6 @@ public static double bisectAngle(double a, double b, double alpha) { } public static Length hypot(Length altDelta, Length distDelta) { - return new Length(Math.hypot(altDelta.valueInMeters(),distDelta.valueInMeters())); + return new Length(Math.hypot(altDelta.valueInMeters(), distDelta.valueInMeters())); } } diff --git a/Core/src/org/droidplanner/core/helpers/units/Speed.java b/Core/src/org/droidplanner/core/helpers/units/Speed.java index 5c64ca7891..0bbebc8f90 100644 --- a/Core/src/org/droidplanner/core/helpers/units/Speed.java +++ b/Core/src/org/droidplanner/core/helpers/units/Speed.java @@ -18,7 +18,7 @@ public void set(double speedInMetersPerSecond) { } public String toStringInMetersPerSecond() { - return String.format(Locale.US, "%2.1f m/s", speedInMetersPerSecond); + return String.format(Locale.US, "%2.1f m/s", speedInMetersPerSecond); } @Override @@ -40,5 +40,4 @@ public boolean equals(Object o) { return false; } - } diff --git a/Core/src/org/droidplanner/core/mission/Mission.java b/Core/src/org/droidplanner/core/mission/Mission.java index 29ab5b08c4..d4d235f7bf 100644 --- a/Core/src/org/droidplanner/core/mission/Mission.java +++ b/Core/src/org/droidplanner/core/mission/Mission.java @@ -4,7 +4,6 @@ import java.util.Collections; import java.util.List; -import org.droidplanner.core.model.Drone; import org.droidplanner.core.drone.DroneInterfaces.DroneEventsType; import org.droidplanner.core.drone.DroneVariable; import org.droidplanner.core.helpers.geoTools.GeoTools; @@ -18,6 +17,7 @@ import org.droidplanner.core.mission.waypoints.SpatialCoordItem; import org.droidplanner.core.mission.waypoints.SplineWaypoint; import org.droidplanner.core.mission.waypoints.Waypoint; +import org.droidplanner.core.model.Drone; import com.MAVLink.Messages.ardupilotmega.msg_mission_ack; import com.MAVLink.Messages.ardupilotmega.msg_mission_item; @@ -200,16 +200,16 @@ public void onMissionReceived(List msgs) { } } - public void onMissionLoaded(List msgs) { - if (msgs != null) { - myDrone.getHome().setHome(msgs.get(0)); - msgs.remove(0); // Remove Home waypoint - items.clear(); - items.addAll(processMavLinkMessages(msgs)); - myDrone.notifyDroneEvent(DroneEventsType.MISSION_RECEIVED); - notifyMissionUpdate(); - } - } + public void onMissionLoaded(List msgs) { + if (msgs != null) { + myDrone.getHome().setHome(msgs.get(0)); + msgs.remove(0); // Remove Home waypoint + items.clear(); + items.addAll(processMavLinkMessages(msgs)); + myDrone.notifyDroneEvent(DroneEventsType.MISSION_RECEIVED); + notifyMissionUpdate(); + } + } private List processMavLinkMessages(List msgs) { List received = new ArrayList(); @@ -249,15 +249,15 @@ private List processMavLinkMessages(List msgs) { * Sends the mission to the drone using the mavlink protocol. */ public void sendMissionToAPM() { - myDrone.getWaypointManager().writeWaypoints(getMsgMissionItems()); + myDrone.getWaypointManager().writeWaypoints(getMsgMissionItems()); } - public List getMsgMissionItems() { - final List data = new ArrayList(); - data.add(myDrone.getHome().packMavlink()); - for (MissionItem item : items) { - data.addAll(item.packMissionItem()); - } - return data; - } + public List getMsgMissionItems() { + final List data = new ArrayList(); + data.add(myDrone.getHome().packMavlink()); + for (MissionItem item : items) { + data.addAll(item.packMissionItem()); + } + return data; + } } diff --git a/Core/src/org/droidplanner/core/mission/waypoints/Circle.java b/Core/src/org/droidplanner/core/mission/waypoints/Circle.java index fbb81328a2..0e6068663f 100644 --- a/Core/src/org/droidplanner/core/mission/waypoints/Circle.java +++ b/Core/src/org/droidplanner/core/mission/waypoints/Circle.java @@ -36,7 +36,6 @@ public Circle(msg_mission_item msg, Mission mission) { public void setTurns(int turns) { this.turns = Math.abs(turns); } - public void setRadius(double radius) { this.radius = Math.abs(radius); diff --git a/Core/src/org/droidplanner/core/model/Drone.java b/Core/src/org/droidplanner/core/model/Drone.java index 05d3c5d0c3..ccb7512a92 100644 --- a/Core/src/org/droidplanner/core/model/Drone.java +++ b/Core/src/org/droidplanner/core/model/Drone.java @@ -1,7 +1,5 @@ package org.droidplanner.core.model; -import com.MAVLink.Messages.ardupilotmega.msg_heartbeat; - import org.droidplanner.core.MAVLink.MAVLinkStreams; import org.droidplanner.core.MAVLink.WaypointManager; import org.droidplanner.core.drone.DroneInterfaces; @@ -25,68 +23,70 @@ import org.droidplanner.core.firmware.FirmwareType; import org.droidplanner.core.mission.Mission; +import com.MAVLink.Messages.ardupilotmega.msg_heartbeat; + public interface Drone { - public void addDroneListener(DroneInterfaces.OnDroneListener listener); + public void addDroneListener(DroneInterfaces.OnDroneListener listener); - public void removeDroneListener(DroneInterfaces.OnDroneListener listener); + public void removeDroneListener(DroneInterfaces.OnDroneListener listener); - public void notifyDroneEvent(DroneInterfaces.DroneEventsType event); + public void notifyDroneEvent(DroneInterfaces.DroneEventsType event); - public GPS getGps(); + public GPS getGps(); - public int getMavlinkVersion(); + public int getMavlinkVersion(); - public void onHeartbeat(msg_heartbeat msg); + public void onHeartbeat(msg_heartbeat msg); - public State getState(); + public State getState(); - public Parameters getParameters(); + public Parameters getParameters(); - public void setType(int type); + public void setType(int type); - public int getType(); + public int getType(); - public FirmwareType getFirmwareType(); + public FirmwareType getFirmwareType(); - public void loadVehicleProfile(); + public void loadVehicleProfile(); - public VehicleProfile getVehicleProfile(); + public VehicleProfile getVehicleProfile(); - public MAVLinkStreams.MAVLinkOutputStream getMavClient(); + public MAVLinkStreams.MAVLinkOutputStream getMavClient(); - public Preferences getPreferences(); + public Preferences getPreferences(); - public WaypointManager getWaypointManager(); + public WaypointManager getWaypointManager(); - public Speed getSpeed(); + public Speed getSpeed(); - public Battery getBattery(); + public Battery getBattery(); - public Radio getRadio(); + public Radio getRadio(); - public Home getHome(); + public Home getHome(); - public Altitude getAltitude(); + public Altitude getAltitude(); - public Orientation getOrientation(); + public Orientation getOrientation(); - public Navigation getNavigation(); + public Navigation getNavigation(); - public Mission getMission(); + public Mission getMission(); - public StreamRates getStreamRates(); + public StreamRates getStreamRates(); - public MissionStats getMissionStats(); + public MissionStats getMissionStats(); - public GuidedPoint getGuidedPoint(); + public GuidedPoint getGuidedPoint(); - public Calibration getCalibrationSetup(); + public Calibration getCalibrationSetup(); - public RC getRC(); + public RC getRC(); - public void setAltitudeGroundAndAirSpeeds(double altitude, double groundSpeed, double airSpeed, - double climb); + public void setAltitudeGroundAndAirSpeeds(double altitude, double groundSpeed, double airSpeed, + double climb); - public void setDisttowpAndSpeedAltErrors(double disttowp, double alt_error, double aspd_error); + public void setDisttowpAndSpeedAltErrors(double disttowp, double alt_error, double aspd_error); } diff --git a/Core/src/org/droidplanner/core/parameters/Parameter.java b/Core/src/org/droidplanner/core/parameters/Parameter.java index 77cdf01d83..b35d11f554 100644 --- a/Core/src/org/droidplanner/core/parameters/Parameter.java +++ b/Core/src/org/droidplanner/core/parameters/Parameter.java @@ -4,7 +4,7 @@ import com.MAVLink.Messages.ardupilotmega.msg_param_value; -public class Parameter{ +public class Parameter { public String name; public double value; @@ -61,7 +61,7 @@ public static void checkParameterName(String name) throws Exception { } else if (name.contains("FORMAT_VERSION")) { throw new Exception("ExludedName"); } else { - } + } } public static DecimalFormat getFormat() { diff --git a/Core/src/org/droidplanner/core/parameters/ParameterMetadata.java b/Core/src/org/droidplanner/core/parameters/ParameterMetadata.java index 75b346b18a..2c4d78d5cb 100644 --- a/Core/src/org/droidplanner/core/parameters/ParameterMetadata.java +++ b/Core/src/org/droidplanner/core/parameters/ParameterMetadata.java @@ -5,7 +5,7 @@ import java.util.LinkedHashMap; import java.util.Map; -public class ParameterMetadata{ +public class ParameterMetadata { public static final int RANGE_LOW = 0; public static final int RANGE_HIGH = 1; diff --git a/Core/src/org/droidplanner/core/polygon/Polygon.java b/Core/src/org/droidplanner/core/polygon/Polygon.java index d77c9cfb9a..6384cde966 100644 --- a/Core/src/org/droidplanner/core/polygon/Polygon.java +++ b/Core/src/org/droidplanner/core/polygon/Polygon.java @@ -58,7 +58,7 @@ public void checkIfValid() throws Exception { if (points.size() < 3) { throw new InvalidPolygon(points.size()); } else { - } + } } public class InvalidPolygon extends Exception { diff --git a/Core/test/org/droidplanner/core/helpers/geoTools/GeoToolsTest.java b/Core/test/org/droidplanner/core/helpers/geoTools/GeoToolsTest.java index 903b25acf6..f624abef7a 100644 --- a/Core/test/org/droidplanner/core/helpers/geoTools/GeoToolsTest.java +++ b/Core/test/org/droidplanner/core/helpers/geoTools/GeoToolsTest.java @@ -20,7 +20,7 @@ public void testGetDistance() { assertEquals(dist2DP1toP2, GeoTools.getDistance(p1, p2).valueInMeters(), tolerance); assertEquals(dist2DP1toP2, GeoTools.getDistance(p2, p1).valueInMeters(), tolerance); } - + public void testGet3DDistance() { double tolerance = dist2DP1toP2 * 0.0005; assertEquals(dist3DP1toP2, GeoTools.get3DDistance(p1, p2).valueInMeters(), tolerance); diff --git a/Desktop/src/org/droidplanner/desktop/Application.java b/Desktop/src/org/droidplanner/desktop/Application.java index fa57ad06a0..f4ee1c98b8 100644 --- a/Desktop/src/org/droidplanner/desktop/Application.java +++ b/Desktop/src/org/droidplanner/desktop/Application.java @@ -1,8 +1,8 @@ package org.droidplanner.desktop; import org.droidplanner.desktop.logic.Logic; -import org.droidplanner.desktop.ui.UI; import org.droidplanner.desktop.ui.Menu; +import org.droidplanner.desktop.ui.UI; public class Application { diff --git a/Desktop/src/org/droidplanner/desktop/communication/Connection.java b/Desktop/src/org/droidplanner/desktop/communication/Connection.java index 3cbfa8d142..7dc5e70687 100644 --- a/Desktop/src/org/droidplanner/desktop/communication/Connection.java +++ b/Desktop/src/org/droidplanner/desktop/communication/Connection.java @@ -26,8 +26,7 @@ public Connection(int port) { } public byte[] readDataBlock() throws IOException { - DatagramPacket receivePacket = new DatagramPacket(receiveData, - receiveData.length); + DatagramPacket receivePacket = new DatagramPacket(receiveData, receiveData.length); socket.receive(receivePacket); length = receivePacket.getLength(); hostAdd = receivePacket.getAddress(); @@ -44,8 +43,8 @@ public void getUdpStream() throws SocketException { public void sendBuffer(byte[] buffer) { try { if (hostAdd != null) { - DatagramPacket udpPacket = new DatagramPacket(buffer, - buffer.length, hostAdd, hostPort); + DatagramPacket udpPacket = new DatagramPacket(buffer, buffer.length, hostAdd, + hostPort); socket.send(udpPacket); } } catch (IOException e) { @@ -53,7 +52,6 @@ public void sendBuffer(byte[] buffer) { } } - @Override public void toggleConnectionState() { // TODO Auto-generated method stub @@ -71,6 +69,6 @@ public void queryConnectionState() { @Override public boolean isConnected() { - return hostAdd!=null; + return hostAdd != null; } } \ No newline at end of file diff --git a/Desktop/src/org/droidplanner/desktop/location/FakeLocation.java b/Desktop/src/org/droidplanner/desktop/location/FakeLocation.java index d4fd2d5746..000ecfb797 100644 --- a/Desktop/src/org/droidplanner/desktop/location/FakeLocation.java +++ b/Desktop/src/org/droidplanner/desktop/location/FakeLocation.java @@ -29,11 +29,11 @@ public void enableLocationUpdates() { @Override public void run() { long now = System.currentTimeMillis(); - double dt = (now - lastTime)/1000.0; + double dt = (now - lastTime) / 1000.0; lastTime = now; - if (((now/(90*1000))%2)==0) { + if (((now / (90 * 1000)) % 2) == 0) { loc = GeoTools.newCoordFromBearingAndDistance(loc, 90, SPEED * dt); - }else{ + } else { loc = GeoTools.newCoordFromBearingAndDistance(loc, 90, -SPEED * dt); } receiver.onLocationChanged(new Location(loc)); diff --git a/Desktop/src/org/droidplanner/desktop/ui/Graph.java b/Desktop/src/org/droidplanner/desktop/ui/Graph.java index a5b0368bc0..9f2aef47d8 100644 --- a/Desktop/src/org/droidplanner/desktop/ui/Graph.java +++ b/Desktop/src/org/droidplanner/desktop/ui/Graph.java @@ -11,7 +11,7 @@ import org.droidplanner.core.model.Drone; import org.droidplanner.desktop.ui.widgets.GraphPanel; -public class Graph implements OnDroneListener{ +public class Graph implements OnDroneListener { public List data = new ArrayList(); public GraphPanel graph; @@ -26,14 +26,14 @@ public Graph(String title) { @Override public void onDroneEvent(DroneEventsType event, Drone drone) { - switch (event) { + switch (event) { case SPEED: data.add(drone.getSpeed().getGroundSpeed().valueInMetersPerSecond()); graph.repaint(); break; default: break; - } + } } static void createGraph(org.droidplanner.core.model.Drone drone) { @@ -41,5 +41,4 @@ static void createGraph(org.droidplanner.core.model.Drone drone) { drone.addDroneListener(mGraph); } - } \ No newline at end of file diff --git a/Desktop/src/org/droidplanner/desktop/ui/Map.java b/Desktop/src/org/droidplanner/desktop/ui/Map.java index d47d09579b..4d890b2e72 100644 --- a/Desktop/src/org/droidplanner/desktop/ui/Map.java +++ b/Desktop/src/org/droidplanner/desktop/ui/Map.java @@ -38,7 +38,7 @@ public Map() { } @Override - public void onDroneEvent(DroneEventsType event, org.droidplanner.core.model.Drone drone) { + public void onDroneEvent(DroneEventsType event, org.droidplanner.core.model.Drone drone) { Coord2D position = drone.getGps().getPosition(); switch (event) { case GPS: @@ -69,9 +69,9 @@ public void onDroneEvent(DroneEventsType event, org.droidplanner.core.model.Dron break; default: break; - } + } } - + static Map createMap(org.droidplanner.core.model.Drone drone) { Map mMap = new Map(); drone.addDroneListener(mMap); diff --git a/Desktop/src/org/droidplanner/desktop/ui/ParametersDialog.java b/Desktop/src/org/droidplanner/desktop/ui/ParametersDialog.java index da3e3d6a13..df38bd8ac6 100644 --- a/Desktop/src/org/droidplanner/desktop/ui/ParametersDialog.java +++ b/Desktop/src/org/droidplanner/desktop/ui/ParametersDialog.java @@ -37,12 +37,11 @@ public ParametersDialog(ArrayList parameterList) { frame.pack(); frame.setVisible(true); - if (parameterList!=null) { - - for (Parameter parameter : parameterList) { - tableModel.addRow(new String[] { parameter.name, - parameter.getValue() }); - } + if (parameterList != null) { + + for (Parameter parameter : parameterList) { + tableModel.addRow(new String[] { parameter.name, parameter.getValue() }); + } } } } diff --git a/Desktop/src/org/droidplanner/desktop/ui/TelemetryPanel.java b/Desktop/src/org/droidplanner/desktop/ui/TelemetryPanel.java index 8ebe4475ed..c07d0db3e1 100644 --- a/Desktop/src/org/droidplanner/desktop/ui/TelemetryPanel.java +++ b/Desktop/src/org/droidplanner/desktop/ui/TelemetryPanel.java @@ -53,9 +53,9 @@ public void onDroneEvent(DroneEventsType event, org.droidplanner.core.model.Dron labelLongitude.setText(LONGITUDE + position.getLng()); break; case SPEED: - labelSpeed.setText(SPEED + drone.getSpeed().getGroundSpeed().toStringInMetersPerSecond()); - labelAltitude.setText(ALTITUDE - + new Length(drone.getAltitude().getAltitude())); + labelSpeed.setText(SPEED + + drone.getSpeed().getGroundSpeed().toStringInMetersPerSecond()); + labelAltitude.setText(ALTITUDE + new Length(drone.getAltitude().getAltitude())); break; case MODE: labelMode.setText(MODE + drone.getState().getMode().toString()); diff --git a/Desktop/src/org/droidplanner/desktop/ui/UI.java b/Desktop/src/org/droidplanner/desktop/ui/UI.java index 4fb8433d59..3e88c587b7 100644 --- a/Desktop/src/org/droidplanner/desktop/ui/UI.java +++ b/Desktop/src/org/droidplanner/desktop/ui/UI.java @@ -17,8 +17,8 @@ public UI(org.droidplanner.core.model.Drone drone) { super("Map"); setSize(800, 600); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); - setLayout(new BorderLayout()); - + setLayout(new BorderLayout()); + telemetryData = TelemetryPanel.createTelemetryPanel(drone); telemetryData.setPreferredSize(new Dimension(200, 0)); add(telemetryData, BorderLayout.WEST); diff --git a/Desktop/src/org/droidplanner/desktop/ui/widgets/GraphPanel.java b/Desktop/src/org/droidplanner/desktop/ui/widgets/GraphPanel.java index bd9de9d06d..be5bd5f8ce 100644 --- a/Desktop/src/org/droidplanner/desktop/ui/widgets/GraphPanel.java +++ b/Desktop/src/org/droidplanner/desktop/ui/widgets/GraphPanel.java @@ -22,166 +22,176 @@ * and open the template in the editor. */ /** - * + * * @author Rodrigo */ public class GraphPanel extends JPanel { private static final long serialVersionUID = -1482667735083881060L; - - private int padding = 25; - private int labelPadding = 25; - private Color lineColor = new Color(44, 102, 230, 180); - private Color pointColor = new Color(100, 100, 100, 180); - private Color gridColor = new Color(200, 200, 200, 200); - private static final Stroke GRAPH_STROKE = new BasicStroke(2f); - private int pointWidth = 4; - private int numberYDivisions = 10; - private List scores; - - public GraphPanel(List scores) { - this.scores = scores; - } - - @Override - protected void paintComponent(Graphics g) { - super.paintComponent(g); - Graphics2D g2 = (Graphics2D) g; - g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); - - double xScale = ((double) getWidth() - (2 * padding) - labelPadding) / (scores.size() - 1); - double yScale = ((double) getHeight() - 2 * padding - labelPadding) / (getMaxScore() - getMinScore()); - - List graphPoints = new ArrayList<>(); - for (int i = 0; i < scores.size(); i++) { - int x1 = (int) (i * xScale + padding + labelPadding); - int y1 = (int) ((getMaxScore() - scores.get(i)) * yScale + padding); - graphPoints.add(new Point(x1, y1)); - } - - // draw white background - g2.setColor(Color.WHITE); - g2.fillRect(padding + labelPadding, padding, getWidth() - (2 * padding) - labelPadding, getHeight() - 2 * padding - labelPadding); - g2.setColor(Color.BLACK); - - // create hatch marks and grid lines for y axis. - for (int i = 0; i < numberYDivisions + 1; i++) { - int x0 = padding + labelPadding; - int x1 = pointWidth + padding + labelPadding; - int y0 = getHeight() - ((i * (getHeight() - padding * 2 - labelPadding)) / numberYDivisions + padding + labelPadding); - int y1 = y0; - if (scores.size() > 0) { - g2.setColor(gridColor); - g2.drawLine(padding + labelPadding + 1 + pointWidth, y0, getWidth() - padding, y1); - g2.setColor(Color.BLACK); - String yLabel = ((int) ((getMinScore() + (getMaxScore() - getMinScore()) * ((i * 1.0) / numberYDivisions)) * 100)) / 100.0 + ""; - FontMetrics metrics = g2.getFontMetrics(); - int labelWidth = metrics.stringWidth(yLabel); - g2.drawString(yLabel, x0 - labelWidth - 5, y0 + (metrics.getHeight() / 2) - 3); - } - g2.drawLine(x0, y0, x1, y1); - } - - // and for x axis - for (int i = 0; i < scores.size(); i++) { - if (scores.size() > 1) { - int x0 = i * (getWidth() - padding * 2 - labelPadding) / (scores.size() - 1) + padding + labelPadding; - int x1 = x0; - int y0 = getHeight() - padding - labelPadding; - int y1 = y0 - pointWidth; - if ((i % ((int) ((scores.size() / 20.0)) + 1)) == 0) { - g2.setColor(gridColor); - g2.drawLine(x0, getHeight() - padding - labelPadding - 1 - pointWidth, x1, padding); - g2.setColor(Color.BLACK); - String xLabel = i + ""; - FontMetrics metrics = g2.getFontMetrics(); - int labelWidth = metrics.stringWidth(xLabel); - g2.drawString(xLabel, x0 - labelWidth / 2, y0 + metrics.getHeight() + 3); - } - g2.drawLine(x0, y0, x1, y1); - } - } - - // create x and y axes - g2.drawLine(padding + labelPadding, getHeight() - padding - labelPadding, padding + labelPadding, padding); - g2.drawLine(padding + labelPadding, getHeight() - padding - labelPadding, getWidth() - padding, getHeight() - padding - labelPadding); - - Stroke oldStroke = g2.getStroke(); - g2.setColor(lineColor); - g2.setStroke(GRAPH_STROKE); - for (int i = 0; i < graphPoints.size() - 1; i++) { - int x1 = graphPoints.get(i).x; - int y1 = graphPoints.get(i).y; - int x2 = graphPoints.get(i + 1).x; - int y2 = graphPoints.get(i + 1).y; - g2.drawLine(x1, y1, x2, y2); - } - - g2.setStroke(oldStroke); - g2.setColor(pointColor); - for (int i = 0; i < graphPoints.size(); i++) { - int x = graphPoints.get(i).x - pointWidth / 2; - int y = graphPoints.get(i).y - pointWidth / 2; - int ovalW = pointWidth; - int ovalH = pointWidth; - g2.fillOval(x, y, ovalW, ovalH); - } - } - -// @Override -// public Dimension getPreferredSize() { -// return new Dimension(width, heigth); -// } - - private double getMinScore() { - double minScore = Double.MAX_VALUE; - for (Double score : scores) { - minScore = Math.min(minScore, score); - } - return minScore; - } - - private double getMaxScore() { - double maxScore = Double.MIN_VALUE; - for (Double score : scores) { - maxScore = Math.max(maxScore, score); - } - return maxScore; - } - - public void setScores(List scores) { - this.scores = scores; - invalidate(); - this.repaint(); - } - - public List getScores() { - return scores; - } - - private static void createAndShowGui() { - List scores = new ArrayList<>(); - Random random = new Random(); - int maxDataPoints = 40; - int maxScore = 10; - for (int i = 0; i < maxDataPoints; i++) { - scores.add((double) random.nextDouble() * maxScore); -// scores.add((double) i); - } - GraphPanel mainPanel = new GraphPanel(scores); - mainPanel.setPreferredSize(new Dimension(800, 600)); - JFrame frame = new JFrame("DrawGraph"); - frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); - frame.getContentPane().add(mainPanel); - frame.pack(); - frame.setLocationRelativeTo(null); - frame.setVisible(true); - } - - public static void main(String[] args) { - SwingUtilities.invokeLater(new Runnable() { - public void run() { - createAndShowGui(); - } - }); - } + + private int padding = 25; + private int labelPadding = 25; + private Color lineColor = new Color(44, 102, 230, 180); + private Color pointColor = new Color(100, 100, 100, 180); + private Color gridColor = new Color(200, 200, 200, 200); + private static final Stroke GRAPH_STROKE = new BasicStroke(2f); + private int pointWidth = 4; + private int numberYDivisions = 10; + private List scores; + + public GraphPanel(List scores) { + this.scores = scores; + } + + @Override + protected void paintComponent(Graphics g) { + super.paintComponent(g); + Graphics2D g2 = (Graphics2D) g; + g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); + + double xScale = ((double) getWidth() - (2 * padding) - labelPadding) / (scores.size() - 1); + double yScale = ((double) getHeight() - 2 * padding - labelPadding) + / (getMaxScore() - getMinScore()); + + List graphPoints = new ArrayList<>(); + for (int i = 0; i < scores.size(); i++) { + int x1 = (int) (i * xScale + padding + labelPadding); + int y1 = (int) ((getMaxScore() - scores.get(i)) * yScale + padding); + graphPoints.add(new Point(x1, y1)); + } + + // draw white background + g2.setColor(Color.WHITE); + g2.fillRect(padding + labelPadding, padding, getWidth() - (2 * padding) - labelPadding, + getHeight() - 2 * padding - labelPadding); + g2.setColor(Color.BLACK); + + // create hatch marks and grid lines for y axis. + for (int i = 0; i < numberYDivisions + 1; i++) { + int x0 = padding + labelPadding; + int x1 = pointWidth + padding + labelPadding; + int y0 = getHeight() + - ((i * (getHeight() - padding * 2 - labelPadding)) / numberYDivisions + + padding + labelPadding); + int y1 = y0; + if (scores.size() > 0) { + g2.setColor(gridColor); + g2.drawLine(padding + labelPadding + 1 + pointWidth, y0, getWidth() - padding, y1); + g2.setColor(Color.BLACK); + String yLabel = ((int) ((getMinScore() + (getMaxScore() - getMinScore()) + * ((i * 1.0) / numberYDivisions)) * 100)) + / 100.0 + ""; + FontMetrics metrics = g2.getFontMetrics(); + int labelWidth = metrics.stringWidth(yLabel); + g2.drawString(yLabel, x0 - labelWidth - 5, y0 + (metrics.getHeight() / 2) - 3); + } + g2.drawLine(x0, y0, x1, y1); + } + + // and for x axis + for (int i = 0; i < scores.size(); i++) { + if (scores.size() > 1) { + int x0 = i * (getWidth() - padding * 2 - labelPadding) / (scores.size() - 1) + + padding + labelPadding; + int x1 = x0; + int y0 = getHeight() - padding - labelPadding; + int y1 = y0 - pointWidth; + if ((i % ((int) ((scores.size() / 20.0)) + 1)) == 0) { + g2.setColor(gridColor); + g2.drawLine(x0, getHeight() - padding - labelPadding - 1 - pointWidth, x1, + padding); + g2.setColor(Color.BLACK); + String xLabel = i + ""; + FontMetrics metrics = g2.getFontMetrics(); + int labelWidth = metrics.stringWidth(xLabel); + g2.drawString(xLabel, x0 - labelWidth / 2, y0 + metrics.getHeight() + 3); + } + g2.drawLine(x0, y0, x1, y1); + } + } + + // create x and y axes + g2.drawLine(padding + labelPadding, getHeight() - padding - labelPadding, padding + + labelPadding, padding); + g2.drawLine(padding + labelPadding, getHeight() - padding - labelPadding, getWidth() + - padding, getHeight() - padding - labelPadding); + + Stroke oldStroke = g2.getStroke(); + g2.setColor(lineColor); + g2.setStroke(GRAPH_STROKE); + for (int i = 0; i < graphPoints.size() - 1; i++) { + int x1 = graphPoints.get(i).x; + int y1 = graphPoints.get(i).y; + int x2 = graphPoints.get(i + 1).x; + int y2 = graphPoints.get(i + 1).y; + g2.drawLine(x1, y1, x2, y2); + } + + g2.setStroke(oldStroke); + g2.setColor(pointColor); + for (int i = 0; i < graphPoints.size(); i++) { + int x = graphPoints.get(i).x - pointWidth / 2; + int y = graphPoints.get(i).y - pointWidth / 2; + int ovalW = pointWidth; + int ovalH = pointWidth; + g2.fillOval(x, y, ovalW, ovalH); + } + } + + // @Override + // public Dimension getPreferredSize() { + // return new Dimension(width, heigth); + // } + + private double getMinScore() { + double minScore = Double.MAX_VALUE; + for (Double score : scores) { + minScore = Math.min(minScore, score); + } + return minScore; + } + + private double getMaxScore() { + double maxScore = Double.MIN_VALUE; + for (Double score : scores) { + maxScore = Math.max(maxScore, score); + } + return maxScore; + } + + public void setScores(List scores) { + this.scores = scores; + invalidate(); + this.repaint(); + } + + public List getScores() { + return scores; + } + + private static void createAndShowGui() { + List scores = new ArrayList<>(); + Random random = new Random(); + int maxDataPoints = 40; + int maxScore = 10; + for (int i = 0; i < maxDataPoints; i++) { + scores.add((double) random.nextDouble() * maxScore); + // scores.add((double) i); + } + GraphPanel mainPanel = new GraphPanel(scores); + mainPanel.setPreferredSize(new Dimension(800, 600)); + JFrame frame = new JFrame("DrawGraph"); + frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); + frame.getContentPane().add(mainPanel); + frame.pack(); + frame.setLocationRelativeTo(null); + frame.setVisible(true); + } + + public static void main(String[] args) { + SwingUtilities.invokeLater(new Runnable() { + public void run() { + createAndShowGui(); + } + }); + } }