package nav; import java.io.File; import java.io.FileReader; import java.io.FileWriter; import java.io.IOException; import java.text.DecimalFormat; import java.text.NumberFormat; import java.util.Calendar; import java.util.Collections; import java.util.HashMap; import java.util.Map; import java.util.Random; import org.xmlpull.v1.XmlPullParser; import org.xmlpull.v1.XmlPullParserException; import org.xmlpull.v1.XmlPullParserFactory; import org.xmlpull.v1.XmlSerializer; import android.app.AlertDialog; import android.app.ProgressDialog; import android.content.Context; import android.content.DialogInterface; import android.content.DialogInterface.OnClickListener; import android.content.Intent; import android.content.pm.PackageManager.NameNotFoundException; import android.media.AudioManager; import android.net.Uri; import android.os.Bundle; import android.os.Environment; import android.os.Handler; import android.os.Vibrator; import android.support.v4.app.ActionBarDrawerToggle; import android.support.v4.view.GravityCompat; import android.support.v4.widget.DrawerLayout; import android.util.Log; import android.util.Xml; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.view.WindowManager; import android.widget.AdapterView; import android.widget.AdapterView.OnItemClickListener; import android.widget.ArrayAdapter; import android.widget.EditText; import android.widget.ImageView; import android.widget.ListView; import android.widget.TextView; import android.widget.Toast; import com.actionbarsherlock.app.SherlockFragmentActivity; import com.actionbarsherlock.view.ActionMode; import com.actionbarsherlock.view.Menu; import com.actionbarsherlock.view.MenuItem; import com.ezio.multiwii.R; import com.ezio.multiwii.app.App; import com.ezio.multiwii.helpers.FilePickerActivity; import com.ezio.sec.Sec; import com.google.android.gms.common.ConnectionResult; import com.google.android.gms.common.GooglePlayServicesUtil; import com.google.android.gms.maps.CameraUpdate; import com.google.android.gms.maps.CameraUpdateFactory; import com.google.android.gms.maps.GoogleMap.OnCameraChangeListener; import com.google.android.gms.maps.GoogleMap.OnInfoWindowClickListener; import com.google.android.gms.maps.GoogleMap.OnMapLongClickListener; import com.google.android.gms.maps.GoogleMap.OnMarkerClickListener; import com.google.android.gms.maps.GoogleMap.OnMarkerDragListener; import com.google.android.gms.maps.SupportMapFragment; import com.google.android.gms.maps.model.CameraPosition; import com.google.android.gms.maps.model.LatLng; import com.google.android.gms.maps.model.LatLngBounds; import com.google.android.gms.maps.model.Marker; public class NavActivity extends SherlockFragmentActivity { String supportedWinGuiMissionFiles = "2.3 pre7"; MapHelperClass mapHelperClass; Menu ActionBarMenu; ActionMode mMode; private DrawerLayout mDrawerLayout; private ActionBarDrawerToggle mDrawerToggle; private ListView mDrawerList; int defaultAltitude = 25; int defaultAction = 1; // float CircleRadius = 0; // int CirclePointsCount = 10; boolean ShowWaypointControls = true; boolean CenterMap = false; private long centerPeriod = 0; // int CurrentWaypointNumber = -1; final int CircleAroundWPinMeters = 5; boolean killme = false; boolean killed = false; Random random = new Random(); // for test App app; Handler mHandler = new Handler(); TextView TVWPInfo; NumberFormat format = new DecimalFormat("0.00"); private Runnable update = new Runnable() { @Override public void run() { app.mw.ProcessSerialData(app.loggingON); app.frskyProtocol.ProcessSerialData(false); // simulation if (app.D) { app.mw.GPS_latitude += random.nextInt(50) - 1; app.mw.GPS_longitude += random.nextInt(50) - 1; app.mw.GPS_fix = 1; app.mw.head++; if (app.mw.head > 360) app.mw.head = 0; } LatLng copterPositionLatLng = new LatLng(app.mw.GPS_latitude / Math.pow(10, 7), app.mw.GPS_longitude / Math.pow(10, 7)); // Map centering if (CenterMap && centerPeriod < System.currentTimeMillis()) { if (app.mw.GPS_fix == 1) { mapHelperClass.map.animateCamera(CameraUpdateFactory.newCameraPosition(new CameraPosition(copterPositionLatLng, app.MapZoomLevel, 0, app.mw.head))); } else { mapHelperClass.map.animateCamera(CameraUpdateFactory.newCameraPosition(new CameraPosition(new LatLng(app.sensors.PhoneLatitude, app.sensors.PhoneLongitude), app.MapZoomLevel, 0, 0))); } centerPeriod = System.currentTimeMillis() + app.MapCenterPeriod * 1000; } mapHelperClass.SetCopterLocation(copterPositionLatLng, app.mw.head, app.mw.alt); // mapHelperClass.SetCopterLocation(app.sensors.MapCurrentPosition, // app.sensors.Heading, 0); mapHelperClass.DrawFlightPath(copterPositionLatLng); mapHelperClass.PositionHoldMarker.setPosition(app.mw.Waypoints[16].Lat_Lng()); mapHelperClass.HomeMarker.setPosition(app.mw.Waypoints[0].Lat_Lng()); // DisplayInfo(); app.Frequentjobs(); app.mw.SendRequest(app.MainRequestMethod); if (!killme) { mHandler.postDelayed(update, app.RefreshRate); } else { mHandler.removeCallbacksAndMessages(null); killed = true; Log.d("nav", "Killed"); } } }; void DisplayInfo() { TVWPInfo.setText(""); TVWPInfo.setText(getString(R.string.MaxNumberOfWP) + String.valueOf(app.mw.NAVmaxWpNumber)); mDrawerList.setAdapter(new ArrayAdapter<WaypointNav>(this, R.layout.nav_drawer_list_item, app.mw.WaypointsList) { // @Override public View getView(int position, View convertView, ViewGroup parent) { // 1. Create inflater LayoutInflater inflater = (LayoutInflater) getApplicationContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE); // 2. Get rowView from inflater View rowView = null; // if(!modelsArrayList.get(position).isGroupHeader()){ rowView = inflater.inflate(R.layout.nav_drawer_list_item, parent, false); // 3. Get icon,title & counter views from the rowView ImageView imgView = (ImageView) rowView.findViewById(R.id.item_icon); TextView titleView = (TextView) rowView.findViewById(R.id.item_title); // 4. Set the text for textView switch (app.mw.WaypointsList.get(position).Action) { case WaypointNav.WP_ACTION_LAND: imgView.setImageResource(R.drawable.land); break; case WaypointNav.WP_ACTION_SET_HEAD: imgView.setImageResource(R.drawable.set_heading); break; case WaypointNav.WP_ACTION_RTH: imgView.setImageResource(R.drawable.rth); break; case WaypointNav.WP_ACTION_POSHOLD_UNLIM: imgView.setImageResource(R.drawable.poshold_unlim); break; case WaypointNav.WP_ACTION_POSHOLD_TIME: imgView.setImageResource(R.drawable.poshold_time); break; case WaypointNav.WP_ACTION_JUMP: imgView.setImageResource(R.drawable.jump); break; case WaypointNav.WP_ACTION_WAYPOINT: imgView.setImageResource(R.drawable.waypoint); break; case WaypointNav.WP_ACTION_SET_POI: imgView.setImageResource(R.drawable.poi); break; default: imgView.setImageResource(R.drawable.green_light); break; } titleView.setText(app.mw.WaypointsList.get(position).toString()); return rowView; } }); } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); if (GooglePlayServicesUtil.isGooglePlayServicesAvailable(getApplicationContext()) != ConnectionResult.SUCCESS) { Toast.makeText(this, getString(R.string.GooglePlayServiecesError), Toast.LENGTH_LONG).show(); finish(); } app = (App) getApplication(); app.ForceLanguage(); getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); setContentView(R.layout.nav_layout); getSupportActionBar().setDisplayHomeAsUpEnabled(true); getSupportActionBar().setHomeButtonEnabled(true); getSupportActionBar().setTitle(getString(R.string.Navigation)); TVWPInfo = (TextView) findViewById(R.id.TextViewWPinfo); mDrawerList = (ListView) findViewById(R.id.ListViewWPList); mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout); mDrawerLayout.setDrawerShadow(R.drawable.drawer_shadow, GravityCompat.START); mDrawerToggle = new ActionBarDrawerToggle(this, mDrawerLayout, R.drawable.ic_drawer, R.string.drawer_open, R.string.drawer_close) { /** Called when a drawer has settled in a completely closed state. */ public void onDrawerClosed(View view) { getSupportActionBar().setTitle(getString(R.string.Navigation)); } /** Called when a drawer has settled in a completely open state. */ public void onDrawerOpened(View drawerView) { getSupportActionBar().setTitle(getString(R.string.Options)); DisplayInfo(); } @Override public void onDrawerSlide(View drawerView, float slideOffset) { super.onDrawerSlide(drawerView, slideOffset); mDrawerLayout.bringChildToFront(drawerView); mDrawerLayout.requestLayout(); } }; mDrawerToggle.syncState(); mDrawerLayout.setDrawerListener(mDrawerToggle); mDrawerList.setOnItemClickListener(new OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { openMWEditor(app.mw.WaypointsList.get(position).MarkerId); } }); // mapHelperClass//////////////////////////////////////////////// mapHelperClass = new MapHelperClass(getApplicationContext(), ((SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map)).getMap(), CircleAroundWPinMeters, app.mw.multiType); mapHelperClass.map.setOnCameraChangeListener(new OnCameraChangeListener() { @Override public void onCameraChange(CameraPosition position) { if (app.mw.GPS_fix == 1) app.MapZoomLevel = (int) position.zoom; } }); mapHelperClass.map.setOnMarkerClickListener(new OnMarkerClickListener() { @Override public boolean onMarkerClick(Marker marker) { return false; } }); mapHelperClass.map.setOnMarkerDragListener(new OnMarkerDragListener() { @Override public void onMarkerDragStart(Marker marker) { // Toast.makeText(getApplicationContext(), marker.getId(), // Toast.LENGTH_LONG).show(); } @Override public void onMarkerDragEnd(Marker marker) { for (WaypointNav WP : app.mw.WaypointsList) { if (WP.MarkerId.equals(marker.getId())) { WP.setLatLng(marker.getPosition()); } } mapHelperClass.RedrawLines(); } @Override public void onMarkerDrag(Marker marker) { mapHelperClass.RedrawLines(); } }); mapHelperClass.map.setOnMapLongClickListener(new OnMapLongClickListener() { @Override public void onMapLongClick(LatLng point) { if (app.mw.NAVmaxWpNumber == 0 || app.mw.WaypointsList.size() <= app.mw.NAVmaxWpNumber) { AddNewWP(point); Vibrator vibrator = (Vibrator) getSystemService(VIBRATOR_SERVICE); if (vibrator != null) { vibrator.vibrate(50); } } else { DisplayInfoDialog(getString(R.string.Info), getString(R.string.MaxNumberWPreached), getString(R.string.OK)); } } }); mapHelperClass.map.setOnInfoWindowClickListener(new OnInfoWindowClickListener() { @Override public void onInfoWindowClick(Marker marker) { openMWEditor(marker.getId()); } }); mapHelperClass.map.animateCamera(CameraUpdateFactory.newCameraPosition(new CameraPosition(new LatLng(0, 0), mapHelperClass.map.getMinZoomLevel(), 0, 0))); // mapHelperClass///END///////////////////////////////////////////// } @Override public boolean onOptionsItemSelected(MenuItem item) { if (item.getItemId() == android.R.id.home) { if (mDrawerLayout.isDrawerOpen(GravityCompat.START)) { mDrawerLayout.closeDrawer(GravityCompat.START); } else { mDrawerLayout.openDrawer(GravityCompat.START); } } // Handle your other action bar items... return super.onOptionsItemSelected(item); } @Override protected void onResume() { super.onResume(); app.ForceLanguage(); app.Say(getString(R.string.Navigation)); killme = false; mHandler.removeCallbacksAndMessages(null); setVolumeControlStream(AudioManager.STREAM_MUSIC); LoadMarkersFromWPlist(); DisplayInfo(); if (Sec.VerifyDeveloperID(Sec.GetDeviceID(getApplicationContext()), Sec.TestersIDs) || Sec.Verify(getApplicationContext(), "D..3")) { mHandler.postDelayed(update, app.RefreshRate); } else { AlertDialog.Builder dlgAlert = new AlertDialog.Builder(this); dlgAlert.setTitle(getString(R.string.Locked)); dlgAlert.setMessage(getString(R.string.DoYouWantToUnlock)); // dlgAlert.setPositiveButton(getString(R.string.Yes), null); dlgAlert.setCancelable(false); dlgAlert.setPositiveButton(getString(R.string.Yes), new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int which) { try { Intent LaunchIntent = getPackageManager().getLaunchIntentForPackage("com.ezio.ez_gui_unlocker"); startActivity(LaunchIntent); } catch (Exception e) { Intent goToMarket = null; goToMarket = new Intent(Intent.ACTION_VIEW, Uri.parse("market://details?id=com.ezio.ez_gui_unlocker")); startActivity(goToMarket); } finish(); } }); dlgAlert.setNegativeButton(getString(R.string.No), new OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { finish(); } }); dlgAlert.create().show(); } //app.sensors.startMagACC(); if (app.Protocol != App.PROTOCOL_NAV) { DisplayInfoDialog("Protocol", "This requires selected NAV Protocol in Settings", getString(R.string.OK)); } } @Override protected void onPause() { super.onPause(); mHandler.removeCallbacks(null); killme = true; if (app.mw.GPS_fix == 1) { app.MapZoomLevel = mapHelperClass.map.getCameraPosition().zoom; app.SaveSettings(true); } //app.sensors.stopMagACC(); } private WaypointNav getWPfromMarkerId(String markerId) { for (WaypointNav WP : app.mw.WaypointsList) { if (WP.MarkerId.equals(markerId)) { return WP; } } return null; } void AddNewWP(LatLng point) { app.mw.WaypointsList.add(new WaypointNav(app.mw.WaypointsList.size() + 1, point, defaultAction, 0, 0, 0, defaultAltitude, 0)); LoadMarkersFromWPlist(); } void ClearMap() { mapHelperClass.CleanMap(); app.mw.WaypointsList.clear(); } void ZoomToShawAllMarkers() { if (mapHelperClass.markers.size() > 0) { LatLngBounds.Builder builder = new LatLngBounds.Builder(); for (Marker marker : mapHelperClass.markers) { builder.include(marker.getPosition()); } LatLngBounds bounds = builder.build(); int padding = 50; // offset from edges of the map in pixels CameraUpdate cu = CameraUpdateFactory.newLatLngBounds(bounds, padding); mapHelperClass.map.animateCamera(cu); } } void SortAndPrepareWPs() { if (app.mw.WaypointsList.size() > 0) { Collections.sort(app.mw.WaypointsList); int i = 0; for (i = 0; i < app.mw.WaypointsList.size(); i++) { app.mw.WaypointsList.get(i).Number = i + 1; app.mw.WaypointsList.get(i).Flag = 0; } app.mw.WaypointsList.get(i - 1).Flag = WaypointNav.MISSION_FLAG_END; } } boolean IsWPLastToDownload(int WPNumber) { for (WaypointNav wp : app.mw.WaypointsList) { if (wp.Number == WPNumber && wp.Flag == WaypointNav.MISSION_FLAG_END) return true; } return false; } int isWPhasBeenDownloaded(int WPNumber) { for (int i = 0; i < app.mw.WaypointsList.size(); i++) { if (app.mw.WaypointsList.get(i).Number == WPNumber) return i; } return -1; } void CheckWPErrors() { for (int i = 0; i < app.mw.WaypointsList.size(); i++) { if (app.mw.WaypointsList.get(i).Flag == WaypointNav.ERROR_ERROR) { app.mw.WaypointsList.get(i).Error = WaypointNav.ERROR_ERROR; DisplayInfoDialog(getString(R.string.WPError), "WP" + String.valueOf(app.mw.WaypointsList.get(i).Number) + " " + getString(R.string.isNotCorrect), getString(R.string.OK)); } if (app.mw.WaypointsList.get(i).Flag == WaypointNav.ERROR_CRC) { app.mw.WaypointsList.get(i).Error = WaypointNav.ERROR_CRC; DisplayInfoDialog(getString(R.string.WPError), "WP" + String.valueOf(app.mw.WaypointsList.get(i).Number) + " " + getString(R.string.CRCisNotCorrect), getString(R.string.OK)); } } } void DownloadMission() { if (app.commMW.Connected) { Log.d("nav", "download mission"); ClearMap(); final ProgressDialog progress = ProgressDialog.show(this, getString(R.string.Downloading), getString(R.string.PleaseWait), true); new Thread(new Runnable() { @Override public void run() { boolean finished = false; int i = 1; boolean error = false; killme = true; killed = false; mHandler.removeCallbacks(null); while (!killed) { try { Thread.sleep(app.RefreshRate); } catch (InterruptedException e) { e.printStackTrace(); } } while (!finished) { app.mw.SendRequestMSP_WP(i); Log.d("nav", "send request " + String.valueOf(i)); int t = 0; int t1 = 0; while (isWPhasBeenDownloaded(i) < 0) { Log.d("nav", "waiting..." + String.valueOf(i)); try { Thread.sleep(app.RefreshRate); } catch (InterruptedException e) { // e.printStackTrace(); } app.mw.ProcessSerialData(false); t++; if (t > 20) { app.mw.SendRequestMSP_WP(i); Log.d("nav", "send request " + String.valueOf(i)); t = 0; t1++; if (t1 > 5) { finished = true; error = true; } } } Log.d("nav", "2"); if (IsWPLastToDownload(i)) finished = true; i++; if (i > 255) finished = true; } runOnUiThread(new Runnable() { @Override public void run() { CheckWPErrors(); LoadMarkersFromWPlist(); progress.dismiss(); ZoomToShawAllMarkers(); DisplayInfo(); killme = false; killed = false; mHandler.postDelayed(update, app.RefreshRate); } }); } }).start(); } } void UploadMission() { Log.d("nav", "upload mission"); final ProgressDialog progress = ProgressDialog.show(this, getString(R.string.Uploading), getString(R.string.PleaseWait), true); new Thread(new Runnable() { @Override public void run() { SortAndPrepareWPs(); killme = true; killed = false; mHandler.removeCallbacks(null); while (!killed) { try { Thread.sleep(app.RefreshRate); } catch (InterruptedException e) { // e.printStackTrace(); } } if (app.mw.WaypointsList.size() == 0) { app.mw.SendRequestMSP_SET_WP_NAV(new WaypointNav(1, 0, 0, WaypointNav.WP_ACTION_RTH, 0, 0, 0, defaultAltitude, WaypointNav.MISSION_FLAG_END)); Log.d("nav", "RTH upladed"); killme = false; mHandler.postDelayed(update, app.RefreshRate); progress.dismiss(); } else { for (WaypointNav wp : app.mw.WaypointsList) { app.mw.SendRequestMSP_SET_WP_NAV(wp); Log.d("nav", "send request " + String.valueOf(wp.Number)); try { Thread.sleep(app.RefreshRate); } catch (InterruptedException e) { // e.printStackTrace(); } } } runOnUiThread(new Runnable() { @Override public void run() { progress.dismiss(); killme = false; killed = false; mHandler.postDelayed(update, app.RefreshRate); } }); } }).start(); } void LoadMarkersFromWPlist() { mapHelperClass.CleanMap(); SortAndPrepareWPs(); if (app.mw.WaypointsList.size() > 0) { for (WaypointNav WP : app.mw.WaypointsList) { if (WP.ShowMarkerForThisWP()) WP.MarkerId = mapHelperClass.AddMarker(WP.getLatLng(), WP.getMarkerTitle(), WP.getMarkerSnippet(), WP.Action); if (WP.Action == WaypointNav.WP_ACTION_RTH || WP.Action == WaypointNav.WP_ACTION_POSHOLD_UNLIM || WP.Action == WaypointNav.WP_ACTION_LAND) return; } } DisplayInfo(); } public void ClearMapOnClick(View v) { ClearMap(); DisplayInfo(); } public void DownloadMissionOnClick(View v) { DownloadMission(); } public void UploadMissionOnClick(View v) { UploadMission(); } public void ZoomInOnClick(View v) { ZoomToShawAllMarkers(); mDrawerLayout.closeDrawers(); } public void LoadMissionOnClick(View v) { Intent i = new Intent(this, FilePickerActivity.class); startActivityForResult(i, 1); } void openMWEditor(String markerId) { Intent i = new Intent(getApplicationContext(), WPEditorActivity.class); // i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); i.putExtra("MARKERID", markerId); startActivityForResult(i, 2); } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); Log.d("nav", "onActivityResult"); if (requestCode == 1) { if (resultCode == RESULT_OK) { String result = data.getStringExtra("fileName"); try { LoadMission(result); } catch (XmlPullParserException e) { // e.printStackTrace(); } catch (IOException e) { // e.printStackTrace(); } } if (resultCode == RESULT_CANCELED) { // Write your code if there's no result } } if (requestCode == 2) { if (resultCode == RESULT_OK) { createCircle(data.getStringExtra("MarkerId"), data.getStringExtra("RADIUS"), data.getStringExtra("NRPOINTS"), data.getStringExtra("DIRECTION")); } if (resultCode == RESULT_CANCELED) { // Write your code if there's no result } } } public void LoadMission(String filePath) throws XmlPullParserException, IOException { ClearMap(); XmlPullParserFactory factory = XmlPullParserFactory.newInstance(); factory.setNamespaceAware(true); XmlPullParser xpp = factory.newPullParser(); File file = new File(filePath); xpp.setInput(new FileReader(file)); int eventType = xpp.getEventType(); while (eventType != XmlPullParser.END_DOCUMENT) { if (eventType == XmlPullParser.START_DOCUMENT) { Log.d("xml", "Start document"); } else if (eventType == XmlPullParser.END_DOCUMENT) { Log.d("xml", "End document"); } else if (eventType == XmlPullParser.START_TAG) { if (xpp.getName().equals("MISSIONITEM")) { Log.d("xml", "Start tag " + xpp.getName()); try { Map<String, String> attributes = getAttributes(xpp); int no = Integer.parseInt(attributes.get("no")); String action = attributes.get("action"); int parameter1 = Integer.parseInt(attributes.get("parameter1")); int parameter2 = Integer.parseInt(attributes.get("parameter2")); int parameter3 = Integer.parseInt(attributes.get("parameter3")); double lat = Double.parseDouble(attributes.get("lat").replace(",", ".")); double lon = Double.parseDouble(attributes.get("lon").replace(",", ".")); int alt = Integer.parseInt(attributes.get("alt")); app.mw.WaypointsList.add(new WaypointNav(no, new LatLng(lat, lon), WaypointNav.getActionNumberFromString(action), parameter1, parameter2, parameter3, alt, 0)); } catch (Exception e) { // e.printStackTrace(); } } if (xpp.getName().equals("VERSION")) { Log.d("xml", "Start tag " + xpp.getName()); try { Map<String, String> attributes = getAttributes(xpp); String version = attributes.get("value"); Log.d("xml", "version= " + version); if (!version.equals(supportedWinGuiMissionFiles)) { DisplayInfoDialog(getString(R.string.Info), getString(R.string.FileVersionMismach), getString(R.string.OK)); return; } } catch (Exception e) { // e.printStackTrace(); } } } else if (eventType == XmlPullParser.END_TAG) { Log.d("xml", "End tag " + xpp.getName()); } else if (eventType == XmlPullParser.TEXT) { Log.d("xml", "Text " + xpp.getText()); } eventType = xpp.next(); } LoadMarkersFromWPlist(); ZoomToShawAllMarkers(); mDrawerLayout.closeDrawers(); } private Map<String, String> getAttributes(XmlPullParser parser) throws Exception { Map<String, String> attrs = null; int acount = parser.getAttributeCount(); if (acount != -1) { Log.d("xml", "Attributes for [" + parser.getName() + "]"); attrs = new HashMap<String, String>(acount); for (int x = 0; x < acount; x++) { Log.d("xml", "\t[" + parser.getAttributeName(x) + "]=" + "[" + parser.getAttributeValue(x) + "]"); attrs.put(parser.getAttributeName(x), parser.getAttributeValue(x)); } } else { throw new Exception("Required entity attributes missing"); } return attrs; } void saveMission(String filePath) throws IllegalArgumentException, IllegalStateException, IOException { XmlSerializer s = Xml.newSerializer(); FileWriter writer = new FileWriter(filePath, false); s.setOutput(writer); s.setFeature("http://xmlpull.org/v1/doc/features.html#indent-output", true); s.startDocument("UTF-8", true); String app_ver = ""; int app_ver_code = 0; try { app_ver = getPackageManager().getPackageInfo(this.getPackageName(), 0).versionName; app_ver_code = getPackageManager().getPackageInfo(this.getPackageName(), 0).versionCode; } catch (NameNotFoundException e1) { e1.printStackTrace(); } s.comment(getString(R.string.app_name) + ", Version " + app_ver + "." + String.valueOf(app_ver_code)); s.comment("MultiWii mission"); s.startTag("", "MISSION"); s.startTag("", "VERSION"); s.attribute("", "value", supportedWinGuiMissionFiles); s.endTag("", "VERSION"); for (WaypointNav wp : app.mw.WaypointsList) { s.startTag("", "MISSIONITEM"); s.attribute("", "no", String.valueOf(wp.Number)); s.attribute("", "action", WaypointNav.WP_ACTION_NAMES[wp.Action]); s.attribute("", "parameter1", String.valueOf(wp.Parameter1)); s.attribute("", "parameter2", String.valueOf(wp.Parameter2)); s.attribute("", "parameter3", String.valueOf(wp.Parameter3)); s.attribute("", "lat", String.valueOf(wp.getLatLng().latitude)); s.attribute("", "lon", String.valueOf(wp.getLatLng().longitude)); s.attribute("", "alt", String.valueOf(wp.Altitude)); s.endTag("", "MISSIONITEM"); } s.endTag("", "MISSION"); s.endDocument(); writer.close(); // Log.d("xml", writer.toString()); } public void SaveMissionOnClick(View v) { AlertDialog.Builder alert = new AlertDialog.Builder(this); alert.setTitle(getString(R.string.EnterFileName)); final EditText input = new EditText(this); Calendar c = Calendar.getInstance(); final String s = String.valueOf(c.get(Calendar.DAY_OF_MONTH)) + String.valueOf(c.get(Calendar.MONTH) + 1) + String.valueOf(c.get(Calendar.YEAR)) + "-" + String.valueOf(c.get(Calendar.HOUR)) + String.valueOf(c.get(Calendar.MINUTE)); input.setText(s); alert.setView(input); alert.setPositiveButton(getString(R.string.Save), new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int whichButton) { try { saveMission(Environment.getExternalStorageDirectory() + "/MultiWiiLogs/" + input.getText().toString() + ".mission"); } catch (Exception e) { e.printStackTrace(); } } }); alert.setNegativeButton(getString(R.string.Cancel), new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int whichButton) { // Canceled. } }); alert.show(); } private final void DisplayInfoDialog(String title, String text, String buttonText) { AlertDialog.Builder builder = new AlertDialog.Builder(this); builder.setTitle(title).setMessage(text).setCancelable(false).setNegativeButton(buttonText, new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int id) { dialog.cancel(); } }); AlertDialog alert = builder.create(); alert.show(); } private void createCircle(String MarkerId, String RadiusIn, String Pointsin, String Directionin) { Log.d("nav", "create circle"); LatLng center = getWPfromMarkerId(MarkerId).getLatLng(); int Points = 0; int Radius = 0; int Direction = 1; Radius = Integer.parseInt(RadiusIn); if (Radius < 20) { DisplayInfoDialog(getString(R.string.Info), "Invalid Radius", getString(R.string.OK)); return; } Points = Integer.parseInt(Pointsin); if (Points < 5 || Points > 30) { DisplayInfoDialog(getString(R.string.Info), "Invalid Number of points", getString(R.string.OK)); return; } Direction = Integer.parseInt(Directionin); if (Direction != -1 && Direction != 1) { DisplayInfoDialog(getString(R.string.Info), "Invalid Direction value", getString(R.string.OK)); return; } double a = 0; double step = 360.0f / Points; if (Direction == -1) { a = 360; step *= -1; } for (; a <= 360 && a >= 0; a += step) { float d = Radius; float R = 6371000; final float rad2deg = (float) (180 / Math.PI); final float deg2rad = (float) (1.0 / rad2deg); double lat2 = Math.asin(Math.sin(center.latitude * deg2rad) * Math.cos(d / R) + Math.cos(center.latitude * deg2rad) * Math.sin(d / R) * Math.cos(a * deg2rad)); double lon2 = center.longitude * deg2rad + Math.atan2(Math.sin(a * deg2rad) * Math.sin(d / R) * Math.cos(center.latitude * deg2rad), Math.cos(d / R) - Math.sin(center.latitude * deg2rad) * Math.sin(lat2)); LatLng pll = new LatLng(lat2 * rad2deg, lon2 * rad2deg); app.mw.WaypointsList.add(new WaypointNav(app.mw.WaypointsList.size() + 1, pll, defaultAction, 0, 0, 0, defaultAltitude, 0)); // AddNewWP(pll); } LoadMarkersFromWPlist(); ZoomToShawAllMarkers(); } }