示例#1
0
        public void addEventoGPS(string id_hh, EventoGPS v_evento)
        {
            try
            {
                StaticTools.obtenerMutex_ListaEventosGPS();
                if (!listaEventosGPS.ContainsKey(id_hh))
                {
                    listaEventosGPS.Add(id_hh, new List<EventoGPS>());
                }

                if (listaEventosGPS.ContainsKey(id_hh))
                {
                    List<EventoGPS> eventos = listaEventosGPS[id_hh];
                    eventos.Add(v_evento);

                }
            }
            catch (Exception ex)
            {
                loguearString("Excepcion en addEventoGPS: " + ex.Message,TiposLOG.HH);
            }
            finally
            {
                StaticTools.liberarMutex_ListaEventosGPS();
            }

            SqlConnection cnn = new SqlConnection(conexion);
            SqlCommand cmd = new SqlCommand("AgregarEventosGps", cnn);

            try
            {
                cnn.Open();

                cmd = cnn.CreateCommand();
                cmd.CommandText = "insert into EventosGps(hhid,latitud,longitud,Hora)values('" + v_evento.HHID+ "','" + v_evento.Latitud + "','"+v_evento.Longitud+"','" + v_evento.Hora+"')";

                cmd.CommandType = CommandType.Text;

                cmd.ExecuteNonQuery();
            }
            catch (Exception ex)
            {
                loguearString("Excepcion en addEventoGPS del HH: " + id_hh + " - " + ex.Message, TiposLOG.HH);
            }
            finally
            {
                cnn.Close();
            }
        }
        /// <summary>
        /// Actualiza localmente el ultimo dato GPS recibido y lanza el evento que verifica los accesos a las Virtual gates.
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="v_eventArgs"></param>
        void actualizeGPS(object sender, stringEventArgs v_eventArgs)
        {
            string HHID = v_eventArgs.textData["HHID"];
            string latitud = v_eventArgs.textData["LATITUD"];
            string longitud = v_eventArgs.textData["LONGITUD"];
            string hora = v_eventArgs.textData["HORA"];

            EventoGPS nuevoEvento = new EventoGPS(HHID, mainApp.InterpretarLatitud(latitud), mainApp.InterpretarLongitud(longitud), hora);

            EventoGPS ultimoEvento = mainApp.DataManager.getLastEventoGPS(HHID);

            mainApp.DataManager.addEventoGPS(HHID, nuevoEvento);

            mainApp.DataManager.updateVirtualGateEvents(ultimoEvento, nuevoEvento);
        }
示例#3
0
        /// <summary>
        /// 
        /// </summary>
        public Dictionary<string, List<EventoGPS>> LoadEventosGPS()
        {
            //Aca cargo todos los eventos gps desde base de datos Sql Server.

            int id = 0;
            string hhid = "";
            string latitud = "";
            string longitud = "";
            string hora = "";

            SqlConnection cnn = new SqlConnection(conexion);

            try
            {
                StaticTools.obtenerMutex_ListaEventosGPS();

                SqlCommand cmd = new SqlCommand("ListarGpsEventos", cnn);
                cmd.CommandType = CommandType.StoredProcedure;
                cnn.Open();
                SqlDataReader lector = cmd.ExecuteReader();
                while (lector.Read())
                {
                    id = Convert.ToInt32(lector["id"].ToString());
                    hhid = lector["hhid"].ToString();
                    latitud = lector["latitud"].ToString();
                    longitud = lector["longitud"].ToString();
                    hora = lector["hora"].ToString();
                    if (!listaEventosGPS.ContainsKey(hhid))
                    {
                        List<EventoGPS> listaEvento = new List<EventoGPS>();
                        listaEventosGPS.Add(hhid, listaEvento);
                    }

                    EventoGPS nuevoEvento = new EventoGPS(hhid, latitud, longitud, hora);

                    listaEventosGPS[hhid].Add(nuevoEvento);
                }
            }
            catch (Exception ex)
            {
                loguearString("Excepcion en LoadEventosGPS() - " + ex.Message,TiposLOG.HH);
            }
            finally
            {
                cnn.Close();
                StaticTools.liberarMutex_ListaEventosGPS();
            }

            return listaEventosGPS;
        }
示例#4
0
        /// <summary>
        /// Nueva version: Utiliza las tablas originales del ALUTRACK para chequear los accesos a puertas virtuales.
        /// </summary>
        /// <param name="GPSDesde"></param>
        /// <param name="GPSHacia"></param>
        public void updateVirtualGateEvents(EventoGPS GPSDesde, EventoGPS GPSHacia)
        {
            // El movimiento se obtuvo desde A hacia B en coordenadas cartesianas
            Punto A = new Punto(float.Parse(GPSDesde.Latitud, CultureInfo.InvariantCulture.NumberFormat), float.Parse(GPSDesde.Longitud, CultureInfo.InvariantCulture.NumberFormat));
            Punto B = new Punto(float.Parse(GPSHacia.Latitud, CultureInfo.InvariantCulture.NumberFormat), float.Parse(GPSHacia.Longitud, CultureInfo.InvariantCulture.NumberFormat));

            string HHID = GPSDesde.HHID;

            int orgID = obtenerOrganizationIDFromHHID(HHID);

            if (orgID > 0)      // Tengo la Organizacion y el Nombre del Device GPS.
            {
                // Busco la tarjeta asociada a ese empleadoGPS, de esa organizacion: Busco por Nombre y Organizacion... weak...

                int IDEmpleadoGPS = obtenerEmpleadoGPS(HHID,orgID);         // El ID del empleado correspondiente al GPS

                if (IDEmpleadoGPS >0)
                {
                    string TarjetaEmpleadoGPS = obtenerTarjetaGPS(IDEmpleadoGPS, orgID);        // La tarjeta de ese empleado

                    if (TarjetaEmpleadoGPS != "")

                    {

                        // Ahora obtengo la lista de idFeatures de la organizacion.

                        Dictionary<int, string> listaIDFeatures = obtenerListaFeatures(orgID);

                        // Ahora cargo las zonas correspondientes a las features

                        Dictionary<string, Zone> listaZonas = LoadZonasFromFeatures(listaIDFeatures);

                        // Ahora chequeo la interseccion de las Zonas....

                        foreach (KeyValuePair<string, Zone> zone in listaZonas)
                        {
                            foreach (KeyValuePair<string, Zone.GateDefinition> gate in zone.Value.listaPuertas)
                            {
                                Punto C = new Punto(float.Parse(gate.Value.from.position.latitude, CultureInfo.InvariantCulture.NumberFormat), float.Parse(gate.Value.from.position.longitude, CultureInfo.InvariantCulture.NumberFormat));
                                Punto D = new Punto(float.Parse(gate.Value.to.position.latitude, CultureInfo.InvariantCulture.NumberFormat), float.Parse(gate.Value.to.position.longitude, CultureInfo.InvariantCulture.NumberFormat));

                                if (intersecta(A, B, C, D))
                                {
                                    TiposAcceso tipoAcceso;

                                    // El punto intersecto un segmento.
                                    // Uso el algoritmo Ray Casting para saber si quedo dentro o fuera de la zona.
                                    //Algoritmo RAYCAST: devuelve la cantidad de intersecciones al  poligono: Si es un numero impar, es entrada. Si es un numero par, es salida
                                    int numInter = RayCast(zone.Value, B);

                                    if (numInter % 2 != 0)      // Chequea si es impar, entonces es entrada
                                    {
                                        tipoAcceso = TiposAcceso.Entrada;
                                    }
                                    else                                // Si es par es salida.
                                    {
                                        tipoAcceso = TiposAcceso.Salida;
                                    }

                                    TiposAcceso tipoEvento = TiposAcceso.INVALIDO;      // Por defecto...

                                    switch (gate.Value.type)
                                    {
                                        case GateAccessType.Granted:
                                            tipoEvento = tipoAcceso;
                                            break;
                                        case GateAccessType.Forbidden:
                                            tipoEvento = TiposAcceso.INVALIDO;
                                            break;
                                        case GateAccessType.Entrance:
                                            if (tipoAcceso == TiposAcceso.Entrada)
                                            {
                                                tipoEvento = TiposAcceso.Entrada;
                                            }
                                            else
                                            {
                                                tipoEvento = TiposAcceso.EINVALIDO;
                                            }
                                            break;
                                        case GateAccessType.Exit:
                                            if (tipoAcceso == TiposAcceso.Salida)
                                            {
                                                tipoEvento = TiposAcceso.Salida;
                                            }
                                            else
                                            {
                                                tipoEvento = TiposAcceso.SINVALIDO;
                                            }
                                            break;
                                    }

                                    //ZoneAccess nuevoAcceso = new ZoneAccess(GPSDesde.HHID, zone.Key, gate.Value.ID, GPSHacia.Hora, tipoEvento);

                                    agregarAccesoDesdeGPS(IDEmpleadoGPS, GPSHacia.Latitud, GPSHacia.Longitud, HHID, GPSHacia.Hora, tipoEvento, TarjetaEmpleadoGPS, orgID,gate.Value.LNLPanelID,gate.Value.LNLReaderID);

                                    //addAccesoZona(nuevoAcceso);

                                }

                            }

                        }
                    }
                }
            }
        }
        /// <summary>
        /// 
        /// </summary>
        private void LoadEventosGPS()
        {
            if (File.Exists(dataSource + @"\\eventosGPS.xml"))
            {
                XmlDocument xDoc = new XmlDocument();
                xDoc.Load(dataSource + @"\\eventosGPS.xml");

                // toma el recurso de lista de eventos.
                //Aplicacion.semaforo_GPS.WaitOne();

                listaEventosGPS.Clear();
                foreach (XmlElement elem in xDoc.SelectNodes("/EventosGPS/Evento"))
                {
                    string HHID = elem.Attributes["HHID"].Value;
                    string latitud = elem.Attributes["latitud"].Value;
                    string longitud = elem.Attributes["longitud"].Value;
                    string hora = elem.Attributes["hora"].Value;

                    if (!listaEventosGPS.ContainsKey(HHID))
                    {
                        List<EventoGPS> listaEvento = new List<EventoGPS>();
                        listaEventosGPS.Add(HHID, listaEvento);
                    }

                    EventoGPS nuevoEvento = new EventoGPS(HHID,latitud,longitud,hora);

                    listaEventosGPS[HHID].Add(nuevoEvento);
                }
               // Aplicacion.semaforo_GPS.Release();
            }
        }
        public void updateVirtualGateEvents(EventoGPS GPSDesde, EventoGPS GPSHacia)
        {
            Punto A = new Punto(float.Parse(GPSDesde.Latitud), float.Parse(GPSDesde.Longitud));
            Punto B = new Punto(float.Parse(GPSHacia.Latitud), float.Parse(GPSHacia.Longitud));

            foreach (KeyValuePair<string, Zone> pair in listaZonas)
            {
                foreach (KeyValuePair<string, Zone.GateDefinition> gate in pair.Value.listaPuertas)
                {
                    Punto C = new Punto(float.Parse(gate.Value.from.position.latitude), float.Parse(gate.Value.from.position.longitude));
                    Punto D = new Punto(float.Parse(gate.Value.to.position.latitude), float.Parse(gate.Value.to.position.longitude));

                    if (intersecta(A, B, C, D))
                    {
                        GateAccessType tipoAcceso;

                        tipoAcceso = gate.Value.type;

                        VehicleAccess nuevoAcceso = new VehicleAccess(GPSDesde.HHID, gate.Value.ID, GPSHacia.Hora, tipoAcceso);

                        mainApp.DataManager.addAccesoVehiculo(nuevoAcceso);
                        mainApp.ComunicationSystem.actualizeListViewAccesosVirtualGates = true;

                    }
                }
            }
        }
        public void addEventoGPS(string id_hh, EventoGPS v_evento)
        {
            if (!listaEventosGPS.ContainsKey(id_hh))
            {
                listaEventosGPS.Add(id_hh, new List<EventoGPS>());
            }

            if (listaEventosGPS.ContainsKey(id_hh))
            {
                List<EventoGPS> eventos = listaEventosGPS[id_hh];
                eventos.Add(v_evento);
                SaveEventosGPS(id_hh);
            }
        }
示例#8
0
        /// <summary>
        /// Analiza la diferencia de espacio y horario entre los dos eventos GPS e indica si el track se separó o no.
        /// El criterio para determinarlo es que la velocidad calculada entre los dos eventos no sea mayor a MAXVEL kilometros por hora.
        /// </summary>
        /// <param name="evento1"></param>
        /// <param name="evento2"></param>
        /// <returns></returns>
        private bool dividirTrack(EventoGPS evento1, EventoGPS evento2)
        {
            bool res = false;
            if (evento1 != null && evento2 != null)
            {
                DateTime hora1 = DateTime.Parse(evento1.Hora, CultureInfo.InvariantCulture.DateTimeFormat);
                DateTime hora2 = DateTime.Parse(evento2.Hora, CultureInfo.InvariantCulture.DateTimeFormat);

                TimeSpan delta = hora1.Subtract(hora2);
                float horas = (float)Math.Abs(delta.TotalHours);

                float lat1 = float.Parse(evento1.Latitud, CultureInfo.InvariantCulture.NumberFormat);
                float lat2 = float.Parse(evento2.Latitud, CultureInfo.InvariantCulture.NumberFormat);
                float deltaLat = Math.Abs(lat1 - lat2);

                float long1 = float.Parse(evento1.Longitud, CultureInfo.InvariantCulture.NumberFormat);
                float long2 = float.Parse(evento2.Longitud, CultureInfo.InvariantCulture.NumberFormat);
                float deltaLong = Math.Abs(long1 - long2);

                float distance = (float)Math.Sqrt(deltaLat * deltaLat + deltaLong * deltaLong);

                float distanceKiloMetros = ((distance / 0.0006f) * 50) / 1000.0f;       // Distancia en kilometros

                float vel = distanceKiloMetros / horas;

                if (vel > Zone.MAXVEL)
                {
                   // MessageBox.Show("vel = " + vel.ToString());
                }

                if (distanceKiloMetros > 0.5)
                {
                   // MessageBox.Show("distanceKiloMetros = " + distanceKiloMetros.ToString());
                }

                return (vel > Zone.MAXVEL)||(distanceKiloMetros > 0.5);     // Es la velocidad mayor que la permitida? o es la distancia > que la permitida?
            }
            return res;
        }
示例#9
0
        private void button4_Click(object sender, EventArgs e)
        {
            // latitud="-34.89684" longitud="-56.18095" hora="2012-10-16 15:41:34"
            string latitud = "-34.89684";
            string longitud = "-56.18095";
            string hora = "2012-10-16 15:41:30";
            string HHID = "Nacho";

            EventoGPS nuevoEvento = new EventoGPS(HHID, latitud, longitud, hora);

            EventoGPS ultimoEvento = mainApp.DataManager.getLastEventoGPS(HHID);

            mainApp.DataManager.addEventoGPS(HHID, nuevoEvento);

            if (ultimoEvento != null)
            {
                mainApp.DataManager.updateVirtualGateEvents(ultimoEvento, nuevoEvento);
            }

            actualizarTrackEnMapa(HHID,true,true);
        }