private void Calentar(string msg, string topicRecibido, Topic topic)
        {
            try
            {
                ConsumoPrensa consumo = JsonConvert.DeserializeObject <ConsumoPrensa>(msg);

                if (consumo == null)
                {
                    Log.Write(new Exception("Consumo recibido nulo " + msg));
                }

                string tipoBancada = topicRecibido.Split('/')[topic.IndiceTipoBancada].Trim();
                string ipPlc       = topicRecibido.Split('/')[topic.IndiceIdTopic].Trim();
                consumo.IpPlc = ipPlc;

                Maquinas maquina = Store.Bancada.Maquinas.FirstOrDefault(x => x.IpAutomata == ipPlc && x.Posicion == consumo.Prensa);

                if (maquina != null)
                {
                    maquina.CargarInformacion(consumo);
                    if (maquina.Modo != ModoMaquina.Calentamiento)
                    {
                        maquina.CambiarModo(ModoMaquina.Calentamiento);
                    }
                }
            }
            catch (Exception ex)
            {
                Log.Write(ex);
            }
        }
        private void TopicCalentar_OnMensajeRecibido(object sender, Entidades.Eventos.MqttMensajeRecibidoEventArgs e)
        {
            try
            {
                ConsumoPrensa consumo = JsonConvert.DeserializeObject <ConsumoPrensa>(e.Cuerpo);

                if (consumo.Prensa == this.Maquina.Posicion)
                {
                    timerCalentamiento.Start();
                }
            }
            catch (Exception ex)
            {
                new Log().Escribir(ex);
            }
        }
        public void CargarInformacion(ConsumoPrensa consumo)
        {
            bool infoActualizada = false;

            if (
                consumo.SgCiclo != this.SgCiclo ||
                consumo.Tinf != this.Tinf ||
                consumo.Tmed != this.Tmed ||
                consumo.Tsup != this.Tsup)
            {
                infoActualizada = true;
            }

            this.SgCiclo   = consumo.SgCiclo;
            this.NumMoldes = consumo.NumMoldes;
            this.Tinf      = consumo.Tinf;
            this.Tmed      = consumo.Tmed;
            this.Tsup      = consumo.Tsup;
            this.SetInf    = consumo.SetInf;
            this.SetMed    = consumo.SetMed;
            this.SetSup    = consumo.SetSup;

            int nuevosParesCiclo = consumo.NumMoldes * consumo.ParesUtillaje;

            if (this.ParesCiclo != nuevosParesCiclo)
            {
                this.ParesCiclo = nuevosParesCiclo;
                this.ColaTrabajoActualizada();
            }
            else
            {
                this.ParesCiclo = nuevosParesCiclo;
            }

            this.InfoEjecucionActualizada();
            Notifica();
        }
        private void Normal(string msg, string topicRecibido, Topic topic)
        {
            try
            {
                // recibo consumo
                ConsumoPrensa consumo = JsonConvert.DeserializeObject <ConsumoPrensa>(msg);

                if (consumo == null)
                {
                    Log.Write(new Exception("Consumo recibido nulo " + msg));
                    return;
                }

                string tipoBancada = topicRecibido.Split('/')[topic.IndiceTipoBancada].Trim();
                string ipPlc       = topicRecibido.Split('/')[topic.IndiceIdTopic].Trim();
                consumo.IpPlc = ipPlc;


                // busco la maquina
                Maquinas maquina = Store.Bancada.Maquinas.FirstOrDefault(x => x.IpAutomata == ipPlc && x.Posicion == consumo.Prensa);

                // si encuentro la maquina
                if (maquina != null)
                {
                    // si la maquina no esta en modo normal
                    if (maquina.Modo != ModoMaquina.Normal)
                    {
                        // la pongo en modo normal
                        maquina.CambiarModo(ModoMaquina.Normal);
                    }

                    // si hay operario loggeado
                    if (SesionManager.Sesion.Operario != null)
                    {
                        // pongo en marcha si no estaba la visibilidad del cuadrante de prima
                        Dispatcher.Invoke(() =>
                        {
                            this.primaActual.Visibility  = Visibility.Visible;
                            this.temporizador.Visibility = Visibility.Hidden;
                        });
                        // reseteo el timer de actividad
                        this.timerInactividad.Stop();
                        this.timerInactividad.Start();

                        // cargo informacion del consumo en la maquina por si acaso no estaba
                        maquina.CargarInformacion(consumo);
                        // aƱado el pulso a la maquina
                        maquina.Pulsos.Add(new PulsoMaquina
                        {
                            CodigoEtiqueta = maquina.TrabajoEjecucion.CodigoEtiquetaFichada,
                            // previamente busco el control en la tienda
                            Control        = BuscarControl(maquina.IdOperacion, maquina),
                            Ciclo          = consumo.SgCiclo,
                            Fecha          = consumo.HoraLocal,
                            Pares          = consumo.ParesUtillaje * consumo.NumMoldes,
                            PosicionGlobal = maquina.PosicionGlobal ?? 0,
                            IdOperario     = SesionManager.Sesion.Operario.Id,
                        });



                        // si lo hemos encontrado y ademas se introdujo una pieza
                        if (maquina.TrabajoEjecucion != null)
                        {
                            if (consumo.PiezaIntroducida == 1)
                            {
                                // insertamos pieza
                                bool insertados = maquina.InsertarPares(maquina.TrabajoEjecucion, consumo.NumMoldes * consumo.ParesUtillaje);
                            }
                        }
                        else
                        {
                            //(background) recuperar cola y publicarla
                            BackgroundWorker            bw          = new BackgroundWorker();
                            List <MaquinasColasTrabajo> colaTrabajo = new List <MaquinasColasTrabajo>();
                            bw.DoWork += (se, ev) =>
                            {
                                colaTrabajo = SelectColaTrabajo.ObtenerColaTrabajoMaquinaPorId(maquina.ID);
                            };
                            bw.RunWorkerCompleted += (se, ev) =>
                            {
                                if (colaTrabajo.Count == 0)
                                {
                                    ClienteMQTT.Publicar(string.Format("/moldeado/fallo/{0}", maquina.IpAutomata.PadLeft(3)),
                                                         string.Format("El automata {0} con maquina {1} no tiene cola de trabajo", maquina.IpAutomata, maquina.Posicion), 1);
                                }
                                maquina.AsignarColaTrabajo(colaTrabajo);
                            };
                            bw.RunWorkerAsync();


                            maquina.ErrorTareaSinEjecutar();
                            maquina.ParesConsumidos();
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                Log.Write(ex);
            }
        }
        private void TopicNormal_OnMensajeRecibido(object sender, Entidades.Eventos.MqttMensajeRecibidoEventArgs e)
        {
            timerCalentamiento.Stop();
            try
            {
                ConsumoPrensa consumo = JsonConvert.DeserializeObject <ConsumoPrensa>(e.Cuerpo);
                if (consumo == null)
                {
                    new Log().Escribir("consumo nulo");
                }

                if (consumo.Prensa != this.Maquina.Posicion)
                {
                    return;
                }

                if (this.Maquina.Modo != Entidades.Enum.ModoMaquina.Normal)
                {
                    this.Maquina.CambiarModo(Entidades.Enum.ModoMaquina.Normal);
                }

                this.Maquina.CargarInformacion(consumo);

                if (this.Maquina.TrabajoEjecucion != null)
                {
                    this.Maquina.Pulsos.Add(new PulsoMaquina
                    {
                        PiezaIntroducida = consumo.PiezaIntroducida == 1,
                        CodigoEtiqueta   = this.Maquina.TrabajoEjecucion.CodigoEtiquetaFichada,
                        Control          = new OperacionesControles
                        {
                            IdTipoMaquina           = 1,
                            TiempoBaseEjecucion     = 0.01,
                            TiempoCambioBarquilla   = 0.3,
                            TiempoInicio            = 0,
                            TiempoUtillajeEjecucion = 0.1,
                        },
                        Ciclo          = consumo.SgCiclo,
                        Fecha          = DateTime.Now,
                        IdOperario     = Maquina.OperarioACargo.Id,
                        PosicionGlobal = Maquina.PosicionGlobal ?? 0,
                        Pares          = (consumo.ParesUtillaje == 0?1:consumo.ParesUtillaje) * consumo.NumMoldes,
                    });

                    if (consumo.PiezaIntroducida == 1)
                    {
                        this.Maquina.InsertarPares(this.Maquina.TrabajoEjecucion, consumo.NumMoldes * (consumo.ParesUtillaje == 0 ? 1 : consumo.ParesUtillaje));
                    }

                    Notifica("Maquina");
                }
                else
                {
                    BackgroundWorker            bw          = new BackgroundWorker();
                    List <MaquinasColasTrabajo> colaTrabajo = new List <MaquinasColasTrabajo>();
                    bw.DoWork += (se, ev) =>
                    {
                        colaTrabajo = daoPuesto.ObtenerColaTrabajoMaquina(this.Maquina.ID);
                    };
                    bw.RunWorkerCompleted += (se, ev) =>
                    {
                        if (colaTrabajo.Count == 0)
                        {
                            ClienteMqtt.Publicar(string.Format("/{0}/fallo/{1}", Maquina.Tipo, this.Maquina.IpAutomata.PadLeft(3)),
                                                 string.Format("El automata {0} con maquina {1} no tiene cola de trabajo", Maquina.IpAutomata, Maquina.Posicion), 1);
                        }
                        Maquina.AsignarColaTrabajo(colaTrabajo);
                    };
                    bw.RunWorkerAsync();
                }
            }catch (Exception ex)
            {
                new Log().Escribir(ex);
            }
        }