Changeset - b6ca403cf7f8
[Not reviewed]
tip default
0 1 0
mkanning@CL-ENS241-10.cedarville.edu - 13 years ago 2013-04-18 22:17:46
mkanning@CL-ENS241-10.cedarville.edu
recalculates humidity corectly
1 file changed with 9 insertions and 24 deletions:
0 comments (0 inline, 0 general)
Demo.WindowsForms/Forms/MainForm.cs
Show inline comments
 
@@ -135,1606 +135,1591 @@ namespace Demo.WindowsForms
 
 
                routes.Routes.CollectionChanged += new GMap.NET.ObjectModel.NotifyCollectionChangedEventHandler(Routes_CollectionChanged);
 
                objects.Markers.CollectionChanged += new GMap.NET.ObjectModel.NotifyCollectionChangedEventHandler(Markers_CollectionChanged);
 
 
 
                // set current marker
 
                currentMarker = new GMarkerGoogle(MainMap.Position, GMarkerGoogleType.arrow);
 
                currentMarker.IsHitTestVisible = false;
 
                currentMarker.ToolTipText = "Current Marker";
 
                top.Markers.Add(currentMarker);
 
 
                if (objects.Markers.Count > 0)
 
                {
 
                    MainMap.ZoomAndCenterMarkers(null);
 
                }
 
 
                try
 
                {
 
                    GMapOverlay overlay = DeepClone<GMapOverlay>(objects);
 
                    Debug.WriteLine("ISerializable status for markers: OK");
 
 
                    GMapOverlay overlay3 = DeepClone<GMapOverlay>(routes);
 
                    Debug.WriteLine("ISerializable status for routes: OK");
 
                }
 
                catch (Exception ex)
 
                {
 
                    Debug.WriteLine("ISerializable failure: " + ex.Message);
 
 
#if DEBUG
 
                    if (Debugger.IsAttached)
 
                    {
 
                        Debugger.Break();
 
                    }
 
#endif
 
                }
 
            }
 
        }
 
 
        //runs during init - MDKfunctional
 
        public T DeepClone<T>(T obj)
 
        {
 
            using (var ms = new System.IO.MemoryStream())
 
            {
 
                var formatter = new System.Runtime.Serialization.Formatters.Binary.BinaryFormatter();
 
 
                formatter.Serialize(ms, obj);
 
 
                ms.Position = 0;
 
 
                return (T)formatter.Deserialize(ms);
 
            }
 
        }
 
 
        // runs on form load  - MDKfunctional
 
        private void MainForm_Load(object sender, EventArgs e)
 
        {
 
            trackBarZoomLevel.Value = (int)MainMap.Zoom * 100;
 
            Activate();
 
            TopMost = true;
 
            TopMost = false;
 
 
            PrepareGraphs();
 
        }
 
 
        //updates the count of markers - MDKfunctional
 
        void Markers_CollectionChanged(object sender, GMap.NET.ObjectModel.NotifyCollectionChangedEventArgs e)
 
        {
 
            //textBoxMarkerCount.Text = objects.Markers.Count.ToString();
 
        }
 
 
        //updates the count of routes - MDKfunctional
 
        void Routes_CollectionChanged(object sender, GMap.NET.ObjectModel.NotifyCollectionChangedEventArgs e)
 
        {
 
            textBoxrouteCount.Text = routes.Routes.Count.ToString();
 
        }
 
 
        #region -- map events --
 
 
        // details unknown- MDKfunctional
 
        void OnTileCacheComplete()
 
        {
 
            Debug.WriteLine("OnTileCacheComplete");
 
            long size = 0;
 
            int db = 0;
 
            try
 
            {
 
                DirectoryInfo di = new DirectoryInfo(MainMap.CacheLocation);
 
                var dbs = di.GetFiles("*.gmdb", SearchOption.AllDirectories);
 
                foreach (var d in dbs)
 
                {
 
                    size += d.Length;
 
                    db++;
 
                }
 
            }
 
            catch
 
            {
 
            }
 
 
            if (!IsDisposed)
 
            {
 
                MethodInvoker m = delegate
 
                {
 
                    textBoxCacheSize.Text = string.Format(CultureInfo.InvariantCulture, "{0} db in {1:00} MB", db, size / (1024.0 * 1024.0));
 
                    textBoxCacheStatus.Text = "all tiles saved!";
 
                };
 
                Invoke(m);
 
            }
 
        }
 
 
        //details unknown - MDKfunctional
 
        void OnTileCacheStart()
 
        {
 
            Debug.WriteLine("OnTileCacheStart");
 
 
            if (!IsDisposed)
 
            {
 
                MethodInvoker m = delegate
 
                {
 
                    textBoxCacheStatus.Text = "saving tiles...";
 
                };
 
                // MDKEdit
 
                //Invoke(m);
 
            }
 
        }
 
 
        //details unknown - MDKfunctional
 
        void OnTileCacheProgress(int left)
 
        {
 
            if (!IsDisposed)
 
            {
 
                MethodInvoker m = delegate
 
                {
 
                    textBoxCacheStatus.Text = left + " tile to save...";
 
                };
 
                Invoke(m);
 
            }
 
        }
 
 
        //runs when cursor leaves a marker - MDKfunctional
 
        void MainMap_OnMarkerLeave(GMapMarker item)
 
        {
 
            if (item is GMapMarkerRect)
 
            {
 
                CurentRectMarker = null;
 
 
                GMapMarkerRect rc = item as GMapMarkerRect;
 
                rc.Pen.Color = Color.Blue;
 
 
                Debug.WriteLine("OnMarkerLeave: " + item.Position);
 
            }
 
        }
 
 
        //runs when cursor enters a marker - MDKfunctional
 
        void MainMap_OnMarkerEnter(GMapMarker item)
 
        {
 
            if (item is GMapMarkerRect)
 
            {
 
                GMapMarkerRect rc = item as GMapMarkerRect;
 
                rc.Pen.Color = Color.Red;
 
 
                CurentRectMarker = rc;
 
 
                Debug.WriteLine("OnMarkerEnter: " + item.Position);
 
            }
 
        }
 
 
        //runs when cursor leaves a route - MDKfunctional
 
        void MainMap_OnRouteLeave(GMapRoute item)
 
        {
 
            currentRoute = null;
 
            item.Stroke.Color = Color.MidnightBlue;
 
            Debug.WriteLine("OnRouteLeave: " + item.Name);
 
        }
 
 
        //runs when cursor enters a route - MDKfunctional
 
        void MainMap_OnRouteEnter(GMapRoute item)
 
        {
 
            currentRoute = item;
 
            item.Stroke.Color = Color.Red;
 
            Debug.WriteLine("OnRouteEnter: " + item.Name);
 
        }
 
 
        // - MDKfunctional
 
        void MainMap_OnMapTypeChanged(GMapProvider type)
 
        {
 
            comboBoxMapType.SelectedItem = type;
 
 
            trackBarZoomLevel.Minimum = MainMap.MinZoom * 100;
 
            trackBarZoomLevel.Maximum = MainMap.MaxZoom * 100;
 
        }
 
 
        //updates current marker coordinate dislpay - MDKfunctional
 
        void MainMap_MouseUp(object sender, MouseEventArgs e)
 
        {
 
            // MDKAdd
 
            textBoxLatCurrent.Text = currentMarker.Position.Lat.ToString();
 
            textBoxLngCurrent.Text = currentMarker.Position.Lng.ToString();
 
            if (e.Button == MouseButtons.Left)
 
            {
 
                isMouseDown = false;
 
            }
 
        }
 
 
        // - MDKfunctional
 
        void MainMap_MouseDown(object sender, MouseEventArgs e)
 
        {
 
            if (e.Button == MouseButtons.Left)
 
            {
 
                isMouseDown = true;
 
 
                if (currentMarker.IsVisible)
 
                {
 
                    currentMarker.Position = MainMap.FromLocalToLatLng(e.X, e.Y);
 
                    // MDKAdd
 
                    textBoxLatCurrent.Text = currentMarker.Position.Lat.ToString();
 
                    textBoxLngCurrent.Text = currentMarker.Position.Lng.ToString();
 
 
                    var px = MainMap.MapProvider.Projection.FromLatLngToPixel(currentMarker.Position.Lat, currentMarker.Position.Lng, (int)MainMap.Zoom);
 
                    var tile = MainMap.MapProvider.Projection.FromPixelToTileXY(px);
 
 
                    Debug.WriteLine("MouseDown: geo: " + currentMarker.Position + " | px: " + px + " | tile: " + tile);
 
                }
 
            }
 
        }
 
 
        // move current marker with left holding - MDKfunctional
 
        void MainMap_MouseMove(object sender, MouseEventArgs e)
 
        {
 
            if (e.Button == MouseButtons.Left && isMouseDown)
 
            {
 
                if (CurentRectMarker == null)
 
                {
 
                    if (currentMarker.IsVisible)
 
                    {
 
                        // MDKAdd
 
                        textBoxLatCurrent.Text = currentMarker.Position.Lat.ToString();
 
                        textBoxLngCurrent.Text = currentMarker.Position.Lng.ToString();
 
 
                        currentMarker.Position = MainMap.FromLocalToLatLng(e.X, e.Y);
 
                    }
 
                }
 
                else // move rect marker
 
                {
 
                    PointLatLng pnew = MainMap.FromLocalToLatLng(e.X, e.Y);
 
 
                    int? pIndex = (int?)CurentRectMarker.Tag;
 
                    if (pIndex.HasValue)
 
                    {
 
                        //if (pIndex < polygon.Points.Count)
 
                        //{
 
                        //    polygon.Points[pIndex.Value] = pnew;
 
                        //    MainMap.UpdatePolygonLocalPosition(polygon);
 
                        //}
 
                    }
 
 
                    if (currentMarker.IsVisible)
 
                    {
 
                        currentMarker.Position = pnew;
 
                        // MDKAdd
 
                        textBoxLatCurrent.Text = currentMarker.Position.Lat.ToString();
 
                        textBoxLngCurrent.Text = currentMarker.Position.Lng.ToString();
 
                    }
 
                    CurentRectMarker.Position = pnew;
 
 
                    if (CurentRectMarker.InnerMarker != null)
 
                    {
 
                        CurentRectMarker.InnerMarker.Position = pnew;
 
                    }
 
                }
 
 
                MainMap.Refresh(); // force instant invalidation
 
                // MDKAdd
 
                textBoxLatCurrent.Refresh();
 
                textBoxLngCurrent.Refresh();
 
            }
 
        }
 
 
        // MapZoomChanged - MDKfunctional
 
        void MainMap_OnMapZoomChanged()
 
        {
 
            trackBarZoomLevel.Value = (int)(MainMap.Zoom * 100.0);
 
            textBoxZoomCurrent.Text = MainMap.Zoom.ToString();
 
        }
 
 
        // click on a marker - MDKfunctional
 
        void MainMap_OnMarkerClick(GMapMarker item, MouseEventArgs e)
 
        {
 
            if (e.Button == System.Windows.Forms.MouseButtons.Left)
 
            {
 
                if (item is GMapMarkerRect)
 
                {
 
                    GeoCoderStatusCode status;
 
                    var pos = GMapProviders.GoogleMap.GetPlacemark(item.Position, out status);
 
                    if (status == GeoCoderStatusCode.G_GEO_SUCCESS && pos != null)
 
                    {
 
                        GMapMarkerRect v = item as GMapMarkerRect;
 
                        {
 
                            v.ToolTipText = pos.Value.Address;
 
                        }
 
                        MainMap.Invalidate(false);
 
                    }
 
                }
 
                else
 
                {
 
                    //if (item.Tag != null)
 
                    //{
 
                    //    if (currentTransport != null)
 
                    //    {
 
                    //        currentTransport.ToolTipMode = MarkerTooltipMode.OnMouseOver;
 
                    //        currentTransport = null;
 
                    //    }
 
                    //    currentTransport = item;
 
                    //    currentTransport.ToolTipMode = MarkerTooltipMode.OnMouseOver;
 
                    //}
 
                }
 
            }
 
        }
 
 
        // loader start loading tiles - MDKfunctional
 
        void MainMap_OnTileLoadStart()
 
        {
 
            MethodInvoker m = delegate()
 
            {
 
                panelMenu.Text = "Menu: loading tiles...";
 
            };
 
            try
 
            {
 
                BeginInvoke(m);
 
            }
 
            catch
 
            {
 
            }
 
        }
 
 
        // loader end loading tiles  - MDKfunctional
 
        void MainMap_OnTileLoadComplete(long ElapsedMilliseconds)
 
        {
 
            MainMap.ElapsedMilliseconds = ElapsedMilliseconds;
 
 
            MethodInvoker m = delegate()
 
            {
 
                panelMenu.Text = "Menu, last load in " + MainMap.ElapsedMilliseconds + "ms";
 
 
                textBoxMemory.Text = string.Format(CultureInfo.InvariantCulture, "{0:0.00} MB of {1:0.00} MB", MainMap.Manager.MemoryCache.Size, MainMap.Manager.MemoryCache.Capacity);
 
            };
 
            try
 
            {
 
                BeginInvoke(m);
 
            }
 
            catch
 
            {
 
            }
 
        }
 
 
        #endregion
 
 
        #region -- menu panels expanders --
 
        // - MDKfunctional
 
        private void xPanderPanel1_Click(object sender, EventArgs e)
 
        {
 
            xPanderPanelList1.Expand(xPanderPanelMain);
 
        }
 
 
        // - MDKfunctional
 
        private void xPanderPanelCache_Click(object sender, EventArgs e)
 
        {
 
            xPanderPanelList1.Expand(xPanderPanelCache);
 
        }
 
 
        // - MDKfunctional
 
        private void xPanderPanelInfo_Click(object sender, EventArgs e)
 
        {
 
            xPanderPanelList1.Expand(xPanderPanelInfo);
 
        }
 
        #endregion
 
 
        #region -- ui events --
 
 
        // change map type - MDKfunctional
 
        private void comboBoxMapType_DropDownClosed(object sender, EventArgs e)
 
        {
 
            if (!UserAcceptedLicenseOnce)
 
            {
 
                if (File.Exists(AppDomain.CurrentDomain.BaseDirectory + Path.DirectorySeparatorChar + "License.txt"))
 
                {
 
                    string ctn = File.ReadAllText(AppDomain.CurrentDomain.BaseDirectory + Path.DirectorySeparatorChar + "License.txt");
 
                    int li = ctn.IndexOf("License");
 
                    string txt = ctn.Substring(li);
 
 
                    var d = new Demo.WindowsForms.Forms.Message();
 
                    d.richTextBox1.Text = txt;
 
 
                    if (DialogResult.Yes == d.ShowDialog())
 
                    {
 
                        UserAcceptedLicenseOnce = true;
 
                        this.Text += " - license accepted by " + Environment.UserName + " at " + DateTime.Now;
 
                    }
 
                }
 
                else
 
                {
 
                    // user deleted License.txt ;}
 
                    UserAcceptedLicenseOnce = true;
 
                }
 
            }
 
 
            if (UserAcceptedLicenseOnce)
 
            {
 
                MainMap.MapProvider = comboBoxMapType.SelectedItem as GMapProvider;
 
            }
 
            else
 
            {
 
                MainMap.MapProvider = GMapProviders.OpenStreetMap;
 
                comboBoxMapType.SelectedItem = MainMap.MapProvider;
 
            }
 
        }
 
 
        // change mdoe - MDKfunctional
 
        private void comboBoxMode_DropDownClosed(object sender, EventArgs e)
 
        {
 
            MainMap.Manager.Mode = (AccessMode)comboBoxMode.SelectedValue;
 
            MainMap.ReloadMap();
 
        }
 
 
        // zoom - MDKfunctional
 
        private void trackBar1_ValueChanged(object sender, EventArgs e)
 
        {
 
            MainMap.Zoom = trackBarZoomLevel.Value / 100.0;
 
        }
 
 
        // go to coordinates- MDKfunctional
 
        private void btnGoToCoords_Click(object sender, EventArgs e)
 
        {
 
            try
 
            {
 
                double lat = double.Parse(textBoxLat.Text, CultureInfo.InvariantCulture);
 
                double lng = double.Parse(textBoxLng.Text, CultureInfo.InvariantCulture);
 
 
                MainMap.Position = new PointLatLng(lat, lng);
 
            }
 
            catch (Exception ex)
 
            {
 
                MessageBox.Show("incorrect coordinate format: " + ex.Message);
 
            }
 
        }
 
 
        // reload map - MDKfunctional
 
        private void btnReload_Click(object sender, EventArgs e)
 
        {
 
            MainMap.ReloadMap();
 
        }
 
 
        // cache config - MDKfunctional
 
        private void checkBoxUseCache_CheckedChanged(object sender, EventArgs e)
 
        {
 
            MainMap.Manager.UseRouteCache = checkBoxUseRouteCache.Checked;
 
            MainMap.Manager.UseGeocoderCache = checkBoxUseRouteCache.Checked;
 
            MainMap.Manager.UsePlacemarkCache = checkBoxUseRouteCache.Checked;
 
            MainMap.Manager.UseDirectionsCache = checkBoxUseRouteCache.Checked;
 
        }
 
 
        // set route start  - MDKfunctional
 
        bool hasStartMarker = false;
 
        private void buttonSetStart_Click(object sender, EventArgs e)
 
        {
 
            start = currentMarker.Position;
 
            // - MDKAdd
 
            GMarkerGoogle m = new GMarkerGoogle(currentMarker.Position, GMarkerGoogleType.green_small);
 
            
 
            //prevent multiple start markers from existing
 
            if(hasStartMarker){
 
                objects.Markers.RemoveAt(0);
 
            }
 
 
            //add the marker
 
            m.ToolTipText = "Start";
 
            m.ToolTipMode = MarkerTooltipMode.OnMouseOver;
 
            objects.Markers.Insert(0, m);
 
 
            hasStartMarker = true;
 
        }
 
 
        // set route end - MDKfunctional
 
        bool hasEndMarker = false;
 
        private void buttonSetEnd_Click(object sender, EventArgs e)
 
        {
 
            end = currentMarker.Position;
 
            // - MDKAdd
 
            GMarkerGoogle m = new GMarkerGoogle(currentMarker.Position, GMarkerGoogleType.red_small);
 
 
            //prevent multiple start markers from existing
 
            if (hasEndMarker)
 
            {
 
                objects.Markers.RemoveAt(1);
 
            }
 
            m.ToolTipText = "End";
 
            m.ToolTipMode = MarkerTooltipMode.OnMouseOver;
 
 
            //add the marker
 
            if (hasStartMarker)
 
            {
 
                objects.Markers.Insert(1, m);
 
            }
 
            else
 
            {
 
                objects.Markers.Insert(0, m);
 
            }
 
            hasEndMarker = true;
 
        }
 
 
        // add route - MDKfunctional
 
        private void btnAddRoute_Click(object sender, EventArgs e)
 
        {
 
            RoutingProvider rp = MainMap.MapProvider as RoutingProvider;
 
            if (rp == null)
 
            {
 
                rp = GMapProviders.GoogleMap; // use google if provider does not implement routing
 
            }
 
 
            MapRoute route = rp.GetRoute(start, end, false, false, (int)MainMap.Zoom);
 
            if (route != null)
 
            {
 
                // add route
 
                GMapRoute r = new GMapRoute(route.Points, route.Name);
 
                r.IsHitTestVisible = true;
 
                routes.Routes.Add(r);
 
 
                // add route start/end marks
 
                GMapMarker m1 = new GMarkerGoogle(start, GMarkerGoogleType.green_big_go);
 
                m1.ToolTipText = "Start: " + route.Name;
 
                m1.ToolTipMode = MarkerTooltipMode.OnMouseOver;
 
 
                GMapMarker m2 = new GMarkerGoogle(end, GMarkerGoogleType.red_big_stop);
 
                m2.ToolTipText = "End: " + end.ToString();
 
                m2.ToolTipMode = MarkerTooltipMode.OnMouseOver;
 
 
                objects.Markers.Add(m1);
 
                objects.Markers.Add(m2);
 
            }
 
        }
 
 
        // add marker on current position - MDKfunctional
 
        private void addUserMarker(object sender, EventArgs e)
 
        {
 
            GMarkerGoogle m = new GMarkerGoogle(currentMarker.Position, GMarkerGoogleType.blue_small);
 
 
            m.ToolTipText = "User";
 
            m.ToolTipMode = MarkerTooltipMode.OnMouseOver;
 
            objects.Markers.Add(m);
 
        }
 
 
        // add marker from APRS transmission - MDKEdit - TODO: Function not needed; addUserMarker() replaces it ??
 
        private void addMarkerFromButton(object sender, EventArgs e)
 
        {
 
            GMarkerGoogle m = new GMarkerGoogle(currentMarker.Position, GMarkerGoogleType.blue_small);
 
 
            m.ToolTipText = "Tracker";
 
            m.ToolTipMode = MarkerTooltipMode.OnMouseOver;
 
            objects.Markers.Add(m);
 
        }
 
 
        // clear routes - MDKfunctional
 
        private void btnClearRoutes_Click(object sender, EventArgs e)
 
        {
 
            routes.Routes.Clear();
 
 
            //remove start/end markes of this route
 
            string markerText = "";
 
            int count = objects.Markers.Count;
 
            for (int i = count-1; i >= 0; i--)
 
            {
 
                markerText = objects.Markers[i].ToolTipText.ToString();
 
                if (markerText.StartsWith("Start"))
 
                {
 
                    objects.Markers.RemoveAt(i);
 
                }
 
                else if (markerText.StartsWith("End"))
 
                {
 
                    objects.Markers.RemoveAt(i); 
 
                    //objects.Markers[i].Dispose();
 
                }                
 
            }
 
            hasEndMarker = false;
 
            hasStartMarker = false;
 
        }
 
 
        // clear markers - MDKfunctional
 
        private void btnClearMarkers_Click(object sender, EventArgs e)
 
        {
 
            //preserve stert/end markes of this route
 
            string markerText = ""; 
 
            int count = objects.Markers.Count;
 
            for (int i = (count - 1); i >= 0; i--)
 
            {
 
                markerText = objects.Markers[i].ToolTipText.ToString();
 
                if (markerText.StartsWith("User"))
 
                {
 
                    objects.Markers.RemoveAt(i); 
 
                }
 
            }
 
        }
 
 
        //clears all markers and routes - MDKfunctional
 
        private void btnClearAll_Click(object sender, EventArgs e)
 
        {
 
            objects.Markers.Clear();
 
            routes.Routes.Clear();
 
            hasEndMarker = false;
 
            hasStartMarker = false;
 
        }
 
 
        // show current marker - MDKfunctional
 
        private void checkBoxCurrentMarker_CheckedChanged(object sender, EventArgs e)
 
        {
 
            currentMarker.IsVisible = xboxCurrentMarker.Checked;
 
        }
 
 
        // can drag - MDKfunctional
 
        private void checkBoxCanDrag_CheckedChanged(object sender, EventArgs e)
 
        {
 
            MainMap.CanDragMap = xboxCanDrag.Checked;
 
        }
 
 
        // zoom to max for markers - MDKfunctional
 
        private void button7_Click(object sender, EventArgs e)
 
        {
 
            MainMap.ZoomAndCenterMarkers("objects");
 
        }
 
 
        // saves current map view - MDKfunctional
 
        private void btnSaveView_Click(object sender, EventArgs e)
 
        {
 
            try
 
            {
 
                using (SaveFileDialog sfd = new SaveFileDialog())
 
                {
 
                    sfd.Filter = "PNG (*.png)|*.png";
 
                    sfd.FileName = "GMap.NET image";
 
 
                    Image tmpImage = MainMap.ToImage();
 
                    if (tmpImage != null)
 
                    {
 
                        using (tmpImage)
 
                        {
 
                            if (sfd.ShowDialog() == DialogResult.OK)
 
                            {
 
                                tmpImage.Save(sfd.FileName);
 
 
                                MessageBox.Show("Image saved: " + sfd.FileName, "GMap.NET", MessageBoxButtons.OK, MessageBoxIcon.Information);
 
                            }
 
                        }
 
                    }
 
                }
 
            }
 
            catch (Exception ex)
 
            {
 
                MessageBox.Show("Image failed to save: " + ex.Message, "GMap.NET", MessageBoxButtons.OK, MessageBoxIcon.Error);
 
            }
 
        }
 
 
        // debug tile grid - MDKfunctional
 
        private void showGridlines(object sender, EventArgs e)
 
        {
 
            MainMap.ShowTileGridLines = xboxGrid.Checked;
 
        }
 
 
        // saves image of selected area - MDKfunctional
 
        private void btnGetStatic_Click(object sender, EventArgs e)
 
        {
 
            StaticImage st = new StaticImage(this);
 
            st.Owner = this;
 
            st.Show();
 
        }
 
 
        // key-up events - MDKfunctional
 
        private void MainForm_KeyUp(object sender, KeyEventArgs e)
 
        {
 
            int offset = -22;
 
 
            if (e.KeyCode == Keys.Left)
 
            {
 
                MainMap.Offset(-offset, 0);
 
            }
 
            else if (e.KeyCode == Keys.Right)
 
            {
 
                MainMap.Offset(offset, 0);
 
            }
 
            else if (e.KeyCode == Keys.Up)
 
            {
 
                MainMap.Offset(0, -offset);
 
            }
 
            else if (e.KeyCode == Keys.Down)
 
            {
 
                MainMap.Offset(0, offset);
 
            }
 
            else if (e.KeyCode == Keys.Delete)
 
            {
 
 
                if (currentRoute != null)
 
                {
 
                    routes.Routes.Remove(currentRoute);
 
                    currentRoute = null;
 
                }
 
 
                if (CurentRectMarker != null)
 
                {
 
                    objects.Markers.Remove(CurentRectMarker);
 
 
                    if (CurentRectMarker.InnerMarker != null)
 
                    {
 
                        objects.Markers.Remove(CurentRectMarker.InnerMarker);
 
                    }
 
                    CurentRectMarker = null;
 
 
                    //RegeneratePolygon();
 
                }
 
            }
 
            else if (e.KeyCode == Keys.Escape)
 
            {
 
                MainMap.Bearing = 0;
 
 
                //if (currentTransport != null && !MainMap.IsMouseOverMarker)
 
                //{
 
                //    currentTransport.ToolTipMode = MarkerTooltipMode.OnMouseOver;
 
                //    currentTransport = null;
 
                //}
 
            }
 
        }
 
 
        // key-press events - MDKfunctional
 
        private void MainForm_KeyPress(object sender, KeyPressEventArgs e)
 
        {
 
            if (MainMap.Focused)
 
            {
 
                if (e.KeyChar == '+')
 
                {
 
                    MainMap.Zoom = ((int)MainMap.Zoom) + 1;
 
                }
 
                else if (e.KeyChar == '-')
 
                {
 
                    MainMap.Zoom = ((int)(MainMap.Zoom + 0.99)) - 1;
 
                }
 
                else if (e.KeyChar == 'a')
 
                {
 
                    MainMap.Bearing--;
 
                }
 
                else if (e.KeyChar == 'z')
 
                {
 
                    MainMap.Bearing++;
 
                }
 
            }
 
        }
 
 
        //changes zoom - MDKfunctional
 
        private void buttonZoomUp_Click(object sender, EventArgs e)
 
        {
 
            MainMap.Zoom = ((int)MainMap.Zoom) + 1;
 
        }
 
 
        //changes zoom - MDKfunctional
 
        private void buttonZoomDown_Click(object sender, EventArgs e)
 
        {
 
            MainMap.Zoom = ((int)(MainMap.Zoom + 0.99)) - 1;
 
        }
 
 
 
 
        #endregion
 
 
        #region -- caching --
 
        #region caching
 
 
        // import map data - MDKfunctional
 
        private void btnCacheImport_Click(object sender, EventArgs e)
 
        {
 
            MainMap.ShowImportDialog();
 
        }
 
 
        // export map data - MDKfunctional
 
        private void btnCacheExport_Click(object sender, EventArgs e)
 
        {
 
            MainMap.ShowExportDialog();
 
        }
 
 
        // prefetch - MDKfunctional
 
        private void btnCachePrefetch_Click(object sender, EventArgs e)
 
        {
 
            RectLatLng area = MainMap.SelectedArea;
 
            if (!area.IsEmpty)
 
            {
 
                int zoom = (int)MainMap.Zoom;
 
                DialogResult res = MessageBox.Show("Ready ripp at Zoom = " + zoom + " and greater?", "GMap.NET Cache", MessageBoxButtons.YesNoCancel);
 
                if (res == DialogResult.Yes)
 
                {
 
                    for (int i = zoom; i <= 17; i++)
 
                    {
 
                        using (TilePrefetcher obj = new TilePrefetcher())
 
                        {
 
                            obj.Owner = this;
 
                            obj.ShowCompleteMessage = false;
 
                            obj.Start(area, i, MainMap.MapProvider, 100);
 
                        }
 
                    }
 
                }
 
            }
 
            else
 
            {
 
                MessageBox.Show("Select map area holding ALT", "GMap.NET", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
 
            }
 
        }
 
 
        // clear cache - MDKfunctional
 
        private void btnCacheClear_Click(object sender, EventArgs e)
 
        {
 
            if (MessageBox.Show("Are You sure?", "Clear GMap.NET cache?", MessageBoxButtons.OKCancel, MessageBoxIcon.Warning) == DialogResult.OK)
 
            {
 
                try
 
                {
 
                    MainMap.Manager.PrimaryCache.DeleteOlderThan(DateTime.Now, null);
 
                    MessageBox.Show("Done. Cache is clear.");
 
                }
 
                catch (Exception ex)
 
                {
 
                    MessageBox.Show(ex.Message);
 
                }
 
            }
 
        }
 
 
        // open disk cache location - MDKfunctional
 
        private void btnCacheLocationOpen_Click(object sender, EventArgs e)
 
        {
 
            try
 
            {
 
                string argument = "/select, \"" + MainMap.CacheLocation + "TileDBv5\"";
 
                System.Diagnostics.Process.Start("explorer.exe", argument);
 
            }
 
            catch (Exception ex)
 
            {
 
                MessageBox.Show("Failed to open: " + ex.Message, "GMap.NET", MessageBoxButtons.OK, MessageBoxIcon.Error);
 
            }
 
        }
 
 
        #endregion
 
 
        #region chart click events
 
 
        //this method clears the background of all charts
 
        private void ResetChartColors()
 
        {
 
            chrtTopLeft.BackColor = Color.LightGray;
 
            chrtTopRight.BackColor = Color.LightGray;
 
            chrtBottomLeft.BackColor = Color.LightGray;
 
            chrtBottomRight.BackColor = Color.LightGray;
 
        }
 
 
        ///TODO: check min/max/average with real data
 
 
        //highlight Top Left chart on click and set text box values based on this chart
 
        private void chrtTopLeft_Click(object sender, EventArgs e)
 
        {
 
            ResetChartColors();
 
            chrtTopLeft.BackColor = Color.Gray;
 
            tboxChartData.Text = "Altitude";
 
            tboxCurrent.Text = tboxAtmoAltitude.Text;
 
            tboxAverage.Text = (velocitySum / chrtBottomRight.Series.FindByName("altitudeTrend").Points.Count).ToString();
 
            tboxMax.Text = chrtBottomRight.Series.FindByName("altitudeTrend").Points.FindMaxByValue().ToString();
 
            tboxMin.Text = chrtBottomRight.Series.FindByName("altitudeTrend").Points.FindMinByValue().ToString();
 
        }
 
 
        //highlight Top Right chart on click and set text box values based on this chart
 
        private void chrtTopRight_Click(object sender, EventArgs e)
 
        {
 
            ResetChartColors();
 
            chrtTopRight.BackColor = Color.Gray;
 
            tboxChartData.Text = "Humidity";
 
            tboxCurrent.Text = tboxAtmoHumidity.Text;
 
            tboxAverage.Text = (humiditySum / chrtBottomRight.Series.FindByName("humidityTrend").Points.Count).ToString();
 
            tboxMax.Text = chrtBottomRight.Series.FindByName("humidityTrend").Points.FindMaxByValue().ToString();
 
            tboxMin.Text = chrtBottomRight.Series.FindByName("humidityTrend").Points.FindMinByValue().ToString();
 
        }
 
 
        //highlight Bottom Left chart on click and set text box values based on this chart
 
        private void chrtBottomLeft_Click(object sender, EventArgs e)
 
        {
 
            ResetChartColors();
 
            chrtBottomLeft.BackColor = Color.Gray;
 
            tboxChartData.Text = "Pressure";
 
            tboxCurrent.Text = tboxAtmoPressure.Text;
 
            tboxAverage.Text = (pressureSum / chrtBottomRight.Series.FindByName("pressureTrend").Points.Count).ToString();
 
            tboxMax.Text = chrtBottomRight.Series.FindByName("pressureTrend").Points.FindMaxByValue().ToString();
 
            tboxMin.Text = chrtBottomRight.Series.FindByName("pressureTrend").Points.FindMinByValue().ToString();
 
        }
 
 
        //highlight Bottom Right chart on click and set text box values based on this chart
 
        private void chrtBottomRight_Click(object sender, EventArgs e)
 
        {
 
            ResetChartColors();
 
            chrtBottomRight.BackColor = Color.Gray;
 
            tboxChartData.Text = "Velocity";
 
            tboxCurrent.Text = tboxMasterVelocity.Text;
 
            tboxAverage.Text = (velocitySum / chrtBottomRight.Series.FindByName("velocityTrend").Points.Count).ToString();
 
            tboxMax.Text = chrtBottomRight.Series.FindByName("velocityTrend").Points.FindMaxByValue().ToString();
 
            tboxMin.Text = chrtBottomRight.Series.FindByName("velocityTrend").Points.FindMinByValue().ToString();
 
        }
 
 
        #endregion
 
 
        #region transmission handling
 
 
        //variable declarations
 
        string latitude;
 
        string longitude;
 
        bool firstTransmissionDatum = false;
 
        double velocitySum = 0;
 
        double humiditySum = 0;
 
        double altitudeSum = 0;
 
        double pressureSum = 0;
 
        
 
        //runs on init 
 
        public void PrepareGraphs(){
 
 
            //set up for graphs MDKEdit
 
            // http://www.youtube.com/watch?v=zTod4-Fg6Ew - split containers
 
            // http://www.youtube.com/watch?v=bMXtgPk875I - chart controls
 
 
            chrtTopLeft.ChartAreas.Add("altitudeArea");
 
            chrtTopLeft.Series.Add("altitudeTrend");
 
 
            chrtTopRight.ChartAreas.Add("humidityArea");
 
            chrtTopRight.Series.Add("humidityTrend");
 
 
            chrtBottomLeft.ChartAreas.Add("pressureArea");
 
            chrtBottomLeft.Series.Add("pressureTrend");
 
            
 
            chrtBottomRight.ChartAreas.Add("velocityArea");
 
            chrtBottomRight.Series.Add("velocityTrend");
 
 
            // declare all series, data points to be modified dynamically at run
 
 
            //---------prep altitude area BEGIN 
 
            chrtTopLeft.Series["altitudeTrend"].ChartType = System.Windows.Forms.DataVisualization.Charting.SeriesChartType.Line;
 
            chrtTopLeft.Series["altitudeTrend"].Color = Color.Green;
 
            System.Windows.Forms.DataVisualization.Charting.AxisName.X.Equals("Time");
 
            System.Windows.Forms.DataVisualization.Charting.AxisName.Y.Equals("Altitude");
 
            
 
            ///required initial value
 
            chrtTopLeft.Series["altitudeTrend"].Points.AddXY(0, 140);
 
            //---------prep altitude area END 
 
 
 
            //-----------prep humidity area BEGIN
 
            chrtTopRight.Series["humidityTrend"].ChartType = System.Windows.Forms.DataVisualization.Charting.SeriesChartType.Line;
 
            chrtTopRight.Series["humidityTrend"].Color = Color.Red;
 
            System.Windows.Forms.DataVisualization.Charting.AxisName.X.Equals("Time");
 
            System.Windows.Forms.DataVisualization.Charting.AxisName.Y.Equals("Humidity");
 
 
            ///required initial value
 
            chrtTopRight.Series["humidityTrend"].Points.AddXY(0, 50);
 
            //-----------prep humidity area END
 
 
 
            //-----------prep pressure area BEGIN
 
            chrtBottomLeft.Series["pressureTrend"].ChartType = System.Windows.Forms.DataVisualization.Charting.SeriesChartType.Line;
 
            chrtBottomLeft.Series["pressureTrend"].Color = Color.Blue;
 
            System.Windows.Forms.DataVisualization.Charting.AxisName.X.Equals("Time");
 
            System.Windows.Forms.DataVisualization.Charting.AxisName.Y.Equals("Pressure");
 
 
            ///required initial value
 
            chrtBottomLeft.Series["pressureTrend"].Points.AddXY(0, 100000);
 
            //-----------prep pressure area END
 
 
 
            //----------prep velocity area BEGIN
 
            chrtBottomRight.Series["velocityTrend"].ChartType = System.Windows.Forms.DataVisualization.Charting.SeriesChartType.Line;
 
            chrtBottomRight.Series["velocityTrend"].Color = Color.Green;
 
            System.Windows.Forms.DataVisualization.Charting.AxisName.X.Equals("Time");
 
            System.Windows.Forms.DataVisualization.Charting.AxisName.Y.Equals("Altitude");
 
 
            ///required initial value
 
            chrtBottomRight.Series["velocityTrend"].Points.AddXY(0, 0);
 
            //----------prep velocity area END
 
 
            //put chart displays in a ready state
 
            ResetChartColors();
 
        }
 
        
 
        //parses transmissions and saves data to CSV file
 
        public void ParseIncomingData(string rawDataReceived)
 
        {
 
            //check to see if data should be processed
 
            if (!cboxCollectData.Checked )
 
            {
 
                AddTextDelegate("Transmission not saved: " + rawDataReceived +"\r\n");
 
                return;
 
            }
 
            else if (!rawDataReceived.StartsWith(callsign)) //reject other callsigns
 
            {
 
                AddTextDelegate("Foreign transmission: " + rawDataReceived + "\r\n");
 
                return;
 
            }
 
 
            /* sample stansmissions
 
             * KD8TDF-9>APRS,WIDE2-1:/191950zN/WO/ T79 S00 V H99.99 _ |
 
             * KD8TDF-9>APRS,WIDE2-1:/151916z3944.87N/08348.75WO005/0.013 SV:09 A-30.5 B45.64 C99542
 
             */
 
 
            //find and store latitude string
 
            int indexStart = rawDataReceived.IndexOf("z");
 
            int indexEnd = rawDataReceived.IndexOf("N/");
 
            latitude = rawDataReceived.Substring(indexStart + 1, indexEnd - indexStart - 1);
 
 
            //find and store longitude string
 
            indexStart = rawDataReceived.IndexOf("N/");
 
            indexEnd = rawDataReceived.IndexOf("WO");
 
            longitude = rawDataReceived.Substring(indexStart + 2, indexEnd - indexStart - 2);
 
            
 
            //remove APRS overhead from string
 
            string transmissionCommentField = rawDataReceived.Substring(rawDataReceived.IndexOf(" ") + 1); 
 
 
            //place each datum in its own variable
 
            string[] dataTransmission;
 
            dataTransmission = transmissionCommentField.Split('~');
 
 
            //variables for processing datums
 
            string typeCode;
 
            string data;
 
            string csvData = "";
 
            string testString = "";
 
 
            //loop through all datums in the transmission and send them to the chart builder
 
            for (int i = 1; i < dataTransmission.Length; i++)
 
            {
 
                if (i == 1)
 
                {
 
                    firstTransmissionDatum = true;
 
                }
 
                else
 
                {
 
                    firstTransmissionDatum = false;
 
                }
 
 
                //remove unwanted characters
 
                dataTransmission[i] = dataTransmission[i].Trim();
 
 
                //zero not always trasmitted properly so add '0.0' to any transmission with no data
 
                if (dataTransmission[i].Length == 1) 
 
                {
 
                    dataTransmission[i] += "0";
 
                }
 
                
 
                //pull out data and data type and send to processing function
 
                typeCode = dataTransmission[i].Substring(0, 1);
 
                if (typeCode != "e")
 
                {
 
                    testString = dataTransmission[i].Substring(1);
 
                    data = dataTransmission[i].Substring(1);
 
                    processTransmissionDatum(typeCode, data);
 
 
                    //append data to string for CSV write
 
                    csvData += typeCode + data + ",";
 
                }
 
                else
 
                {
 
                    AddTextDelegate("Error Message: " + dataTransmission[i].Substring(1) + "\r\n");
 
                }
 
            }
 
 
            //handle case of no GPS fix
 
            if (latitude == "" || longitude == "")
 
            {
 
                AddTextDelegate("No GPS fix: ");
 
            }
 
            else
 
            {
 
                //marker added here so extra accuracy can be added
 
                addTrackerMarker(latitude, longitude);
 
            }
 
 
            //display transmission in message box
 
            AddTextDelegate(rawDataReceived + "\r\n");
 
 
            //write the data to CSV file
 
            WriteToCSV(csvData);
 
        }
 
 
        //method to process data from transmissions (usually chart inserts)
 
        private void processTransmissionDatum(string dataType, string data)
 
        {
 
            //TODO: add inserts for all charts. altitude is finished and is a template
 
            ///data types organized by listing in google doc
 
            //MASTER MODULE DATA VALUES
 
            ChartDelegate(dataType, data);
 
 
        }
 
 
        //write the data to CSV file -- usually seniordesign-ui\Demo.WindowsForms\bin\Debug
 
        private void WriteToCSV(string data)
 
        {
 
            string path = Directory.GetCurrentDirectory();
 
            string filename = path+"\\TransmissionData" + unixTime.Milliseconds + ".csv";
 
            using (StreamWriter writer = new StreamWriter(filename, true))
 
            {
 
                writer.WriteLine(data);
 
            }
 
        }
 
        
 
        //must change lat/long coords to properly place map marker
 
        float conv_coords(float in_coords)
 
        {
 
            //Initialize the location.
 
            float f = in_coords;
 
            // Get the first two digits by turning f into an integer, then doing an integer divide by 100;
 
            // firsttowdigits should be 77 at this point.
 
            int firsttwodigits = ((int)f) / 100;                               //This assumes that f < 10000.
 
            float nexttwodigits = f - (float)(firsttwodigits * 100);
 
            float theFinalAnswer = (float)(firsttwodigits + nexttwodigits / 60.0);
 
            return theFinalAnswer;
 
        }
 
 
        // add marker from an APRS transmission - MDKEdit
 
        private void addTrackerMarker(string lat, string lng)
 
        {
 
 
            double latitude = double.Parse(lat), longitude = double.Parse(lng);
 
            PointLatLng APRSloc = new PointLatLng();
 
            APRSloc.Lat = conv_coords((float)latitude);
 
            APRSloc.Lng = conv_coords((float)longitude)*-1;
 
 
            GMarkerGoogle m = new GMarkerGoogle(APRSloc, GMarkerGoogleType.blue_small);
 
 
            m.ToolTipText = "Tracker";
 
            m.ToolTipMode = MarkerTooltipMode.OnMouseOver;
 
            objects.Markers.Add(m);
 
        }
 
        
 
        //places text in the message box
 
        delegate void SetTextDelegate(string value);
 
        public void AddTextDelegate(string value)
 
        {
 
            if (InvokeRequired)
 
            {
 
                Invoke(new SetTextDelegate(AddTextDelegate), value);
 
            }
 
            else
 
            {
 
                tboxMessageBox.AppendText(value);// += value;
 
                textBoxMarkerCount.Text = objects.Markers.Count.ToString();
 
            }
 
        }
 
 
        //this is where most of the transmission processing is done
 
        delegate void ChartDataDelegate(string dataType, string data);
 
        public void ChartDelegate(string dataType, string data)
 
        {
 
            if (InvokeRequired)
 
            {
 
                Invoke(new ChartDataDelegate(ChartDelegate), dataType, data);
 
            }
 
            else
 
            {
 
                if (firstTransmissionDatum)
 
                {
 
                    ClearTboxColor();
 
                }
 
                ///UNIVERSAL DATA TYPES
 
                if (dataType.Equals("t"))  //board temperature
 
                {
 
                    string dataString = data.ToString();
 
                    if (dataString.StartsWith("9")) //Master Module
 
                    {
 
                        tboxMasterBoardTemp.Text = dataString.Substring(1);
 
                        tboxMasterBoardTemp.BackColor = Color.Chartreuse;
 
                    }
 
                    else if (dataString.StartsWith("0")) //Atmo Module
 
                    {
 
                        tboxAtmoBoardTemp.Text = dataString.Substring(1);
 
                        tboxAtmoBoardTemp.BackColor = Color.Chartreuse;
 
                    }
 
                    else if (dataString.StartsWith("1")) //Geiger Module
 
                    {
 
                        tboxGeigerBoardTemp.Text = dataString.Substring(1);
 
                        tboxGeigerBoardTemp.BackColor = Color.Chartreuse;
 
                    }
 
                    else if (dataString.StartsWith("2")) //Camera Module
 
                    {
 
                        tboxCameraBoardTemp.Text = dataString.Substring(1);
 
                        tboxCameraBoardTemp.BackColor = Color.Chartreuse;
 
                    }
 
                }
 
                else if (dataType.Equals("l"))  //battery level
 
                else if (dataType.Equals("b"))  //battery level
 
                {
 
                    string dataString = data.ToString();
 
                    string dataString = data.Substring(0, data.Length - 1) + "." + data.Substring(data.Length-1);
 
 
                    if (dataString.StartsWith("9")) //Master Module
 
                    {
 
                        tboxMasterBatteryLevel.Text = dataString.Substring(1);
 
                        tboxMasterBatteryLevel.BackColor = Color.Chartreuse;
 
                    }
 
                    else if (dataString.StartsWith("0")) //Atmo Module
 
                    {
 
                        tboxAtmoBatteryLevel.Text = dataString.Substring(1);
 
                        tboxAtmoBatteryLevel.BackColor = Color.Chartreuse;
 
                    }
 
                    else if (dataString.StartsWith("1"))  //Geiger Module
 
                    {
 
                        tboxGeigerBatteryLevel.Text = dataString.Substring(1);
 
                        tboxGeigerBatteryLevel.BackColor = Color.Chartreuse;
 
                    }
 
                    else if (dataString.StartsWith("2")) //Camera Module
 
                    {
 
                        tboxCameraBatteryLevel.Text = dataString.Substring(1);
 
                        tboxCameraBatteryLevel.BackColor = Color.Chartreuse;
 
                    }
 
                }
 
                else if (dataType.Equals("i")) //Info Message
 
                {
 
                    AddTextDelegate("Info: " + data + "\r\n");
 
                }
 
                
 
                ///MASTER MODULE DATA TYPES
 
                else if (dataType.Equals("_"))  //latitude extra accuracy
 
                {
 
                    //TODO: check math and decimal placement
 
                    latitude += data.ToString();
 
                    tboxMasterLatitude.Text = latitude;
 
                    tboxMasterLatitude.BackColor = Color.Chartreuse;
 
                }
 
                else if (dataType.Equals("|"))  //longitude extra accuracy
 
                {
 
                    //TODO: check math and decimal placement
 
                    longitude += data.ToString();
 
                    tboxMasterLongitude.Text = longitude;
 
                    tboxMasterLongitude.BackColor = Color.Chartreuse;
 
                }
 
                else if (dataType.Equals("h"))  //HDOP
 
                {
 
                    tboxMasterHDOP.Text = data.ToString();
 
                    tboxMasterHDOP.BackColor = Color.Chartreuse;
 
                }
 
                else if (dataType.Equals("v"))  //Velocity
 
                {
 
                    chrtBottomRight.Series.FindByName("velocityTrend").Points.AddY(double.Parse(data));
 
                    velocitySum += double.Parse(data);
 
                    tboxMasterVelocity.Text = data.ToString();
 
                    tboxMasterVelocity.BackColor = Color.Chartreuse;
 
                }
 
                else if (dataType.Equals("s"))  //satellites in view
 
                {
 
                    tboxMasterSatellites.Text = data.ToString();
 
                    tboxMasterSatellites.BackColor = Color.Chartreuse;
 
                }
 
 
                ///ATMOSPHERIC MODULE DATA VALUES
 
                else if (dataType.Equals("C"))  //Air Temperature
 
                {
 
                    tboxAtmoAirTemp.Text = data.ToString();
 
                    tboxAtmoAirTemp.BackColor = Color.Chartreuse;
 
                }
 
                else if (dataType.Equals("L"))  //Ambient Light
 
                {
 
                    tboxAtmoLight.Text = data.ToString();
 
                    tboxAtmoLight.BackColor = Color.Chartreuse;
 
                }
 
                else if (dataType.Equals("H"))  //Humidity
 
                {
 
                    chrtTopRight.Series.FindByName("humidityTrend").Points.AddY(double.Parse(data));
 
                    humiditySum += double.Parse(data);
 
                    tboxAtmoHumidity.Text = data.ToString();
 
                    tboxAtmoHumidity.BackColor = Color.Chartreuse;
 
                }
 
                else if (dataType.Equals("P"))  //Pressure
 
                {
 
                    chrtBottomLeft.Series.FindByName("pressureTrend").Points.AddY(double.Parse(data));
 
                    pressureSum += double.Parse(data);
 
                    tboxAtmoPressure.Text = data.ToString();
 
                    tboxAtmoPressure.BackColor = Color.Chartreuse;
 
                }
 
                else if (dataType.Equals("A"))  //Altitude
 
                {
 
                    chrtTopLeft.Series.FindByName("altitudeTrend").Points.AddY(double.Parse(data));
 
                    altitudeSum += double.Parse(data);
 
                    tboxAtmoAltitude.Text = data.ToString();
 
                    tboxAtmoAltitude.BackColor = Color.Chartreuse;
 
                }
 
                
 
                ///GEIGER MODULE DATA VALUES
 
                else if (dataType.Equals("R"))  //radiation (CPM)
 
                {
 
                    tboxGeigerRads.Text = data.ToString();
 
                    tboxGeigerRads.BackColor = Color.Chartreuse;
 
                }
 
 
                /// CAMERA MODULE DATA VALUES
 
 
                //INVALID DATA TYPE
 
                else
 
                {
 
                    AddTextDelegate("Info: " + data + "\r\n");
 
                }
 
            }
 
        }
 
 
        private void ClearTboxColor()
 
        {
 
            //tboxAtmoHumidity.BorderStyle = BorderStyle.FixedSingle;
 
            tboxMasterBoardTemp.BackColor = Color.White;
 
            tboxAtmoBoardTemp.BackColor = Color.White;
 
            tboxGeigerBoardTemp.BackColor = Color.White;
 
            tboxCameraBoardTemp.BackColor = Color.White;
 
            tboxMasterBatteryLevel.BackColor = Color.White;
 
            tboxAtmoBatteryLevel.BackColor = Color.White;
 
            tboxGeigerBatteryLevel.BackColor = Color.White;
 
            tboxCameraBatteryLevel.BackColor = Color.White;
 
            tboxMasterLatitude.BackColor = Color.White;
 
            tboxMasterLongitude.BackColor = Color.White;
 
            tboxMasterHDOP.BackColor = Color.White;
 
            tboxMasterVelocity.BackColor = Color.White;
 
            tboxMasterSatellites.BackColor = Color.White;
 
            tboxAtmoAirTemp.BackColor = Color.White;
 
            tboxAtmoLight.BackColor = Color.White;
 
            tboxAtmoHumidity.BackColor = Color.White;
 
            tboxAtmoPressure.BackColor = Color.White;
 
            tboxAtmoAltitude.BackColor = Color.White;
 
            tboxGeigerRads.BackColor = Color.White;
 
            return;
 
        }
 
 
        #endregion
 
 
        #region testing
 
        
 
        //currently simulates serial inputs
 
        string testData;
 
        int testIteration = 0;
 
        int testIteration = 50;
 
        private void btnTest_Click(object sender, EventArgs e)
 
        {
 
            switch (testIteration)
 
            {
 
                case 0:
 
                    testData = "KD8TDF-11>APRS,N8NQH-1,WIDE2*:/051919z3921.07N/08357.76WO63.36/41.178 ~v41.178~_937~|229~t929~s10~h0.79~t024~l056~t111~l10~P3411~C0~H999~A69147";
 
                    ParseIncomingData(testData);
 
                    break;
 
                case 1:
 
                    testData = "KD8TDF-11>APRS,N8NQH-1,WIDE2*:/051919z3921.20N/08357.31WO72.82/44.951 ~v44.951~_836~|685";
 
                    ParseIncomingData(testData);
 
                    break;
 
                case 2:
 
                    testData = "KD8TDF-11>APRS,N8NQH-1,WIDE2*:/051921z3921.71N/08355.84WO68.07/35.951 ~v35.951~_022~|024~t929~s10~h0.79~t022~l057~t111~l10~P3147~C0~H999~A70308";
 
                    ParseIncomingData(testData);
 
                    break;
 
                case 3:
 
                    testData = "KD8TDF-11>APRS,WC8EMA,WIDE2*:/051921z3921.71N/08355.84WO68.07/35.951 ~v35.951~_022~|024~t929~s10~h0.79~t022~l057~t111~l10~P3147~C0~H999~A70308";
 
                    ParseIncomingData(testData);
 
                    break;
 
                case 4:
 
                    testData = "KD8TDF-11>APRS,WIDE2-1:/051923z3922.04N/08354.25WO86.93/42.990 ~v42.990~_349~|968";
 
                    ParseIncomingData(testData);
 
                    break;
 
                case 5:
 
                    testData = "KD8TDF-11>APRS,WIDE2-1:/051924z3922.21N/08353.23WO84.56/30.156 ~v30.156~_164~|009";
 
                    ParseIncomingData(testData);
 
                    break;
 
                case 6:
 
                    testData = "KD8TDF-11>APRS,WC8EMA,WIDE2*:/051924z3922.21N/08353.23WO84.56/30.156 ~v30.156~_164~|009";
 
                    ParseIncomingData(testData);
 
                    break;
 
                case 7:
 
                    testData = "KD8TDF-11>APRS,WC8EMA,WIDE2*:/051925z3922.29N/08352.75WO70.13/40.926 ~v40.926~_762~|813~t930~s11~h0.74~t024~l056~t111~l10~P2814~C0~H999~A71889";
 
                    ParseIncomingData(testData);
 
                    break;
 
                case 8:
 
                    testData = "KD8TDF-11>APRS,WIDE2-1:/051928z3922.77N/08349.49WO80.58/48.331 ~v48.331~_045~|896~t930~s11~h0.73~t024~l056~t113~l10~P3205~C0~H999~A70046";
 
                    ParseIncomingData(testData);
 
                    break;
 
                case 9:
 
                    testData = "KD8TDF-11>APRS,N8NQH-1,WIDE2*:/051928z3922.77N/08349.49WO80.58/48.331 ~v48.331~_045~|896~t930~s11~h0.73~t024~l056~t113~l10~P3205~C0~H999~A70046";
 
                    ParseIncomingData(testData);
 
                    break;
 
                case 10:
 
                    testData = "KD8TDF-11>APRS,WIDE2-1:/051933z3923.24N/08346.56WO103.57/31.550 ~v31.550~_165~|142~t930~s10~h0.78~t022~l056~t113~l10~P7153~C0~H999~A57607";
 
                    ParseIncomingData(testData);
 
                    break;
 
                case 11:
 
                    testData = "KD8TDF-11>APRS,WIDE2-1:/051934z3923.38N/08345.75WO87.77/44.916 ~v44.916~_934~|738~t932~s10~h0.78~t022~l056~t113~l10~P8471~C0~H999~A54733";
 
                    ParseIncomingData(testData);
 
                    break;
 
                case 12:
 
                    testData = "KD8TDF-11>APRS,WIDE2-1:/051935z3923.42N/08345.41WO84.64/25.176 ~v25.176~_260~|774";
 
                    ParseIncomingData(testData);
 
                    break;
 
                case 13:
 
                    testData = "KD8TDF-11>APRS,WIDE2-1:/051937z3923.33N/08342.85WO87.66/35.760 ~v35.760~_489~|460~t929~s10~h0.87~t020~l056~t110~l10~P13239~C0~H999~A46693";
 
                    ParseIncomingData(testData);
 
                    break;
 
                case 14:
 
                    testData = "KD8TDF-11>APRS,WC8EMA,WIDE2*:/051937z3923.33N/08342.85WO87.66/35.760 ~v35.760~_489~|460~t929~s10~h0.87~t020~l056~t110~l10~P13239~C0~H999~A46693";
 
                    ParseIncomingData(testData);
 
                    break;
 
                case 15:
 
                    testData = "KD8TDF-11>APRS,WIDE2-1:/051938z3923.30N/08342.29WO93.89/39.613 ~v39.613~_208~|441";
 
                    ParseIncomingData(testData);
 
                    break;
 
                case 16:
 
                    testData = "KD8TDF-11>APRS,WIDE2-1:/051939z3923.28N/08341.71WO89.80/47.399 ~v47.399~_382~|785~t929~s10~h0.81~t020~l056~t110~l10~P15171~C0~H999~A44101";
 
                    ParseIncomingData(testData);
 
                    break;
 
                case 17:
 
                    testData = "KD8TDF-11>APRS,WC8EMA,WIDE2*:/051939z3923.28N/08341.71WO89.80/47.399 ~v47.399~_382~|785~t929~s10~h0.81~t020~l056~t110~l10~P15171~C0~H999~A44101";
 
                    ParseIncomingData(testData);
 
                    break;
 
                case 18:
 
                    testData = "KD8TDF-11>APRS,WIDE2-1:/051939z3923.29N/08341.21WO89.68/42.977 ~v42.977~_049~|692";
 
                    ParseIncomingData(testData);
 
                    break;
 
                case 19:
 
                    testData = "KD8TDF-11>APRS,WIDE2-1:/051940z3923.17N/08340.68WO104.09/41.096 ~v41.096~_196~|818~t928~s10~h0.81~t019~l056~t18~l10~P17216~C0~H999~A41631";
 
                    ParseIncomingData(testData);
 
                    break;
 
                case 20:
 
                    testData = "KD8TDF-11>APRS,WIDE2-1:/051940z3923.08N/08340.12WO99.91/40.414 ~v40.414~_749~|332";
 
                    ParseIncomingData(testData);
 
                    break;
 
                case 21:
 
                    testData = "KD8TDF-11>APRS,WIDE2-1:/051941z3923.06N/08339.67WO105.12/26.372 ~v26.372~_625~|764~t928~s10~h0.81~t019~l056~t16~l10~P19373~C0~H999~A39276";
 
                    ParseIncomingData(testData);
 
                    break;
 
                case 22:
 
                    testData = "KD8TDF-11>APRS,WIDE2-1:/051942z3922.93N/08339.26WO128.58/35.021 ~v35.021~_092~|564";
 
                    ParseIncomingData(testData);
 
                    break;
 
                case 23:
 
                    testData = "KD8TDF-11>APRS,WIDE2-1:/051942z3922.68N/08338.87WO136.93/37.963 ~v37.963~_409~|785~t926~s09~h0.87~t017~l056~t14~l10~P21733~C0~H999~A36927";
 
                    ParseIncomingData(testData);
 
                    break;
 
                case 24:
 
                    testData = "KD8TDF-11>APRS,WC8EMA,WIDE2*:/051942z3922.68N/08338.87WO136.93/37.963 ~v37.963~_409~|785~t926~s09~h0.87~t017~l056~t14~l10~P21733~C0~H999~A36927";
 
                    ParseIncomingData(testData);
 
                    break;
 
                case 25:
 
                    testData = "KD8TDF-11>APRS,WIDE2-1:/051943z3922.03N/08338.26WO160.38/56.614 ~v56.614~_060~|181~t924~s09~h0.87~t017~l056~t12~l10~P24231~C0~H999~A34657";
 
                    ParseIncomingData(testData);
 
                    break;
 
                case 26:
 
                    testData = "KD8TDF-11>APRS,WIDE2-1:/051944z3921.35N/08337.97WO163.68/88.044 ~v88.044~_733~|114";
 
                    ParseIncomingData(testData);
 
                    break;
 
                case 27:
 
                    testData = "KD8TDF-11>APRS,WIDE2-1:/051945z3920.52N/08337.69WO165.97/86.908 ~v86.908~_646~|070~t922~s09~h0.87~t015~l056~t11~l10~P26698~C0~H999~A32594";
 
                    ParseIncomingData(testData);
 
                    break;
 
                case 28:
 
                    testData = "KD8TDF-11>APRS,WC8EMA,WIDE2*:/051945z3920.52N/08337.69WO165.97/86.908 ~v86.908~_646~|070~t922~s09~h0.87~t015~l056~t11~l10~P26698~C0~H999~A32594";
 
                    ParseIncomingData(testData);
 
                    break;
 
                case 29:
 
                    testData = "KD8TDF-11>APRS,WIDE2-1:/051945z3919.65N/08337.35WO155.12/91.951 ~v91.951~_048~|484";
 
                    ParseIncomingData(testData);
 
                    break;
 
                case 30:
 
                    testData = "KD8TDF-11>APRS,WIDE2-1:/051946z3918.82N/08337.00WO159.97/90.062 ~v90.062~_362~|669~t920~s09~h0.96~t015~l056~t1-1~l10~P29320~C0~H999~A30566";
 
                    ParseIncomingData(testData);
 
                    break;
 
                case 31:
 
                    testData = "KD8TDF-11>APRS,WIDE2-1:/051946z3918.00N/08336.65WO158.88/83.565 ~v83.565~_177~|836";
 
                    ParseIncomingData(testData);
 
                    break;
 
                case 32:
 
                    testData = "KD8TDF-11>APRS,WIDE2-1:/051947z3917.24N/08336.30WO160.33/75.922 ~v75.922~_318~|316~t919~s09~h0.96~t013~l056~t11~l10~P31996~C0~H999~A28641";
 
                    ParseIncomingData(testData);
 
                    break;
 
                case 33:
 
                    testData = "KD8TDF-11>APRS,WIDE2-1:/051947z3916.50N/08335.94WO162.38/72.423 ~v72.423~_912~|245";
 
                    ParseIncomingData(testData);
 
                    break;
 
                case 34:
 
                    testData = "KD8TDF-11>APRS,WC8EMA,WIDE2*:/051947z3916.50N/08335.94WO162.38/72.423 ~v72.423~_912~|245";
 
                    ParseIncomingData(testData);
 
                    break;
 
                case 35:
 
                    testData = "KD8TDF-11>APRS,WIDE2-1:/051948z3915.80N/08335.61WO162.44/80.541 ~v80.541~_756~|326~t917~s08~h0.97~t013~l056~t12~l10~P34716~C0~H999~A26813";
 
                    ParseIncomingData(testData);
 
                    break;
 
                case 36:
 
                    testData = "KD8TDF-11>APRS,WIDE2-1:/051949z3915.10N/08335.30WO161.20/82.223 ~v82.223~_935~|370";
 
                    ParseIncomingData(testData);
 
                    break;
 
                case 37:
 
                    testData = "KD8TDF-11>APRS,WIDE2-1:/051949z3914.43N/08334.98WO159.63/62.921 ~v62.921~_493~|370~t915~s09~h0.89~t011~l056~t14~l10~P37541~C0~H999~A25036";
 
                    ParseIncomingData(testData);
 
                    break;
 
                case 38:
 
                    testData = "KD8TDF-11>APRS,WIDE2-1:/051950z3913.80N/08334.71WO164.45/64.565 ~v64.565~_434~|297";
 
                    ParseIncomingData(testData);
 
                    break;
 
                case 39:
 
                    testData = "KD8TDF-11>APRS,WIDE2-1:/051950z3913.22N/08334.46WO163.22/57.953 ~v57.953~_077~|680~t915~s09~h0.89~t011~l056~t16~l10~P40480~C0~H999~A23294";
 
                    ParseIncomingData(testData);
 
                    break;
 
                case 40:
 
                    testData = "KD8TDF-11>APRS,WIDE2-1:/051951z3912.62N/08334.20WO162.48/62.928 ~v62.928~_018~|886";
 
                    ParseIncomingData(testData);
 
                    break;
 
                case 41:
 
                    testData = "KD8TDF-11>APRS,WIDE2-1:/051952z3912.09N/08333.98WO158.93/62.192 ~v62.192~_550~|711~t913~s09~h0.90~t010~l056~t14~l10~P43509~C0~H999~A21607";
 
                    ParseIncomingData(testData);
 
                    break;
 
                case 42:
 
                    testData = "KD8TDF-11>APRS,WIDE2-1:/051952z3911.55N/08333.74WO160.42/53.084 ~v53.084~_827~|212";
 
                    ParseIncomingData(testData);
 
                    break;
 
                case 43:
 
                    testData = "KD8TDF-11>APRS,WIDE2-1:/051953z3911.02N/08333.46WO157.50/60.661 ~v60.661~_647~|296~t913~s09~h0.90~t010~l056~t12~l10~P46544~C0~H999~A20007";
 
                    ParseIncomingData(testData);
 
                    break;
 
                case 44:
 
                    testData = "KD8TDF-11>APRS,WIDE2-1:/051953z3910.49N/08333.21WO150.50/52.105 ~v52.105~_520~|688";
 
                    ParseIncomingData(testData);
 
                    break;
 
                case 45:
 
                    testData = "KD8TDF-11>APRS,WIDE2-1:/051954z3910.04N/08332.97WO146.63/42.412 ~v42.412~_652~|898~t911~s09~h0.99~t010~l056~t12~l10~P49829~C0~H999~A18370";
 
                    ParseIncomingData(testData);
 
                    break;
 
                case 46:
 
                    testData = "KD8TDF-11>APRS,WIDE2-1:/051955z3909.67N/08332.70WO147.20/47.361 ~v47.361~_446~|617";
 
                    ParseIncomingData(testData);
 
                    break;
 
                default:
 
                    break;
 
            }
 
            testIteration++;
 
            testIteration--;
 
        }
 
 
        public double GetRandomNumber(double minimum, double maximum)
 
        {
 
            Random random = new Random();
 
            return random.NextDouble() * (maximum - minimum) + minimum;
 
        }
 
 
        #endregion
 
 
        #region serial port setup/use
 
        public SerialPort port;// = new SerialPort("COM1", 9600, Parity.None, 8, StopBits.One);
 
        int comPort = 0;
 
        string callsign;
 
 
        //click event for Collect Data checkbox
 
        private void cboxCollectData_Click(object sender, EventArgs e)
 
        {
 
            //sets comPort and callsign, uncheck if parse does not work
 
            if (int.TryParse(tboxCOMPort.Text, out comPort))
 
            {
 
                callsign = tboxAPRSCallsign.Text;
 
                if (cboxCollectData.Checked)
 
                {
 
                    port = new SerialPort("COM" + comPort, 9600, Parity.None, 8, StopBits.One);
 
                    SerialInitialize();
 
                }
 
                else
 
                {
 
                    port.Close();
 
                }
 
                
 
            }
 
            else
 
            {
 
                cboxCollectData.Checked = false;
 
            }
 
 
            //disable callsign and port edits while collecting transmissions
 
            tboxAPRSCallsign.Enabled = !cboxCollectData.Checked;
 
            tboxCOMPort.Enabled = !cboxCollectData.Checked;
 
        }
 
        
 
        //inits the serial port and event handler
 
        public void SerialInitialize()
 
        {
 
            // http://msmvps.com/blogs/coad/archive/2005/03/23/SerialPort-_2800_RS_2D00_232-Serial-COM-Port_2900_-in-C_2300_-.NET.aspx
 
            // Attach a method to be called when there is data waiting in the port's buffer
 
            port.DataReceived += new SerialDataReceivedEventHandler(ReceiveData);
 
 
            // Open the port for communications
 
            port.Open();
 
        }
 
 
        //process received data
 
        public void ReceiveData(object sender, SerialDataReceivedEventArgs e)
 
        {
 
            // Show all the incoming data in the port's buffer
 
            string testChk = port.ReadLine();
 
            ParseIncomingData(testChk);
 
        }
 
 
        //sets and opens the COM port
 
        delegate void SetSerialDelegate(int COM);
 
        public void setSerialPort(int COM)
 
        {
 
            if (InvokeRequired)
 
            {
 
                Invoke(new SetSerialDelegate(setSerialPort), COM);
 
            }
 
            else
 
            {
 
 
            }
 
        }
 
 
        #endregion
 
    }
 
}
 
 
                  
 
\ No newline at end of file
 
//known bugs: clicking on data graph. likely a cross threading issue
 
\ No newline at end of file
0 comments (0 inline, 0 general)