<commit_before>package sibtra.predictivo;

import java.awt.BasicStroke;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Label;
import java.awt.event.MouseEvent;
import java.awt.geom.GeneralPath;
import java.awt.geom.Line2D;
import java.awt.geom.Point2D;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.ObjectInputStream;

import javax.swing.JCheckBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JProgressBar;
import javax.swing.JSpinner;
import javax.swing.SpinnerNumberModel;
import javax.swing.SwingConstants;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;

import sibtra.gps.Ruta;
import sibtra.log.Logger;
import sibtra.log.LoggerDouble;
import sibtra.log.LoggerFactory;
import sibtra.log.VentanaLoggers;
import sibtra.util.PanelMuestraTrayectoria;

/**
 * Panel para mostrar la información del control predictivo y poder depurarlo.
 * @author alberto
 *
 */
@SuppressWarnings("serial")
public class PanelMuestraPredictivo extends PanelMuestraTrayectoria implements ChangeListener {

    /** Largo de la flecha que marcará orientación final de la predicción */
    private static final double largoFlecha = 2;
    /** Valor máximo de la barra de progreso */
    private static final int pbMax = 100;
    private static final double COTA_ANGULO = Math.toRadians(30);
    /** Puntero al controlador predicctivo a mostrar */
    ControlPredictivo CP = null;
    /** Barra progreso para comando a la izquierda */
    private JProgressBar jpbComandoI;
    /** Label que presentará el comando calculado */
    private JLabel jlComando;
    /** Barra progreso para comando a la izquierda */
    private JProgressBar jpbComandoD;
    private JLabel jlDistancia;
    private SpinnerNumberModel jsModHPred;
    private SpinnerNumberModel jsModHCont;
    private SpinnerNumberModel jsModLanda;
    private SpinnerNumberModel jsModDistMax;
    private Ruta rutaAux;

    /** Constructor necesita el controlador predictivo */
    public PanelMuestraPredictivo(ControlPredictivo contPredic, Ruta rutaIn) {
        super();
        rutaAux = new Ruta();
        rutaAux = rutaIn;
        CP = contPredic;
        setTr(CP.ruta);
        {//nuevo panel para añadir debajo
            JPanel jpPre = new JPanel(new FlowLayout(FlowLayout.LEADING));
            //barra de progreso para el comando
            jpbComandoI = new JProgressBar(-pbMax, 0);
            jpPre.add(jpbComandoI);

            jlComando = new JLabel("+##.##º");
            jlComando.setHorizontalAlignment(SwingConstants.TRAILING);
            //jlComando.setMinimumSize(new Dimension(50, 20));
            jlComando.setPreferredSize(new Dimension(60, 20));
            jpPre.add(jlComando);

            //barra de progreso para el comando derecho
            jpbComandoD = new JProgressBar(0, pbMax);
            jpPre.add(jpbComandoD);

            jlDistancia = new JLabel("DL: +###.##");
            //jlDistancia.setMinimumSize(new Dimension(60, 20));
            jlDistancia.setPreferredSize(new Dimension(80, 20));
            //jlDistancia.setSize(new Dimension(60, 20));
            jlDistancia.setHorizontalAlignment(SwingConstants.TRAILING);
            jpPre.add(jlDistancia);

            jpPre.add(new Label("H Pred"));
            jsModHPred = new SpinnerNumberModel(1, 1, 25, 1);
            JSpinner jsHorPred = new JSpinner(jsModHPred);
            jsModHPred.addChangeListener(this);
            jpPre.add(jsHorPred);

            jpPre.add(new Label("H Cont"));
            jsModHCont = new SpinnerNumberModel(1, 1, 25, 1);
            JSpinner jsHorCont = new JSpinner(jsModHCont);
            jsModHCont.addChangeListener(this);
            jpPre.add(jsHorCont);

            jpPre.add(new Label("Landa"));
            jsModLanda = new SpinnerNumberModel(0, 0, 100, 0.1);
            JSpinner jsLanda = new JSpinner(jsModLanda);
            jsModLanda.addChangeListener(this);
            jpPre.add(jsLanda);

            jpPre.add(new Label("Dist Max"));
            jsModDistMax = new SpinnerNumberModel(0.7, 0.05, 1, 0.05);
            JSpinner jsDistMax = new JSpinner(jsModDistMax);
            jsModDistMax.addChangeListener(this);
            jpPre.add(jsDistMax);

            jpPre.setMinimumSize(new Dimension(Short.MAX_VALUE, 40));
//			jpPre.setBorder(BorderFactory.createCompoundBorder(
//	                   BorderFactory.createLineBorder(Color.red),
//	                   jpPre.getBorder()));

            add(jpPre);
        }
    }

    /** Lo que añadimos al panel */
    protected void cosasAPintar(Graphics g0) {
        //colocamos el coche en su posición actual
        situaCoche(CP.carroOriginal.getX(), CP.carroOriginal.getY(), CP.carroOriginal.getTita());
        super.cosasAPintar(g0);
        Graphics2D g = (Graphics2D) g0;

        //pintamos la trayectoria predicha
        GeneralPath gpPred = pathArrayXY(CP.prediccionPosicion);
        if (gpPred != null) {
            g.setStroke(new BasicStroke());
            g.setColor(Color.WHITE);
            g.draw(gpPred);
        }

        //pintamos la orientación final
        {
            double[] pini = CP.prediccionPosicion[CP.horPrediccion - 1];
            double ori = CP.predicOrientacion[CP.horPrediccion - 1];
            g.setStroke(new BasicStroke());
            g.setColor(Color.RED);
            double[] pfin = {pini[0] + largoFlecha * Math.cos(ori), pini[1] + largoFlecha * Math.sin(ori)};
            g.draw(new Line2D.Double(point2Pixel(pini), point2Pixel(pfin)));

        }
    }

    /** Atiende cambios en los spiners de los parámetros del controlador */
    public void stateChanged(ChangeEvent ce) {
        if (ce.getSource() == jsModHPred) {
            CP.setHorPrediccion(jsModHPred.getNumber().intValue());
        }
        if (ce.getSource() == jsModHCont) {
            int hc = jsModHCont.getNumber().intValue();
            int hp = jsModHPred.getNumber().intValue();
            if (hc > hp) {
                jsModHCont.setValue(hp);
            }
            CP.setHorControl(hc);
        }
        if (ce.getSource() == jsModLanda) {
            CP.setLanda(jsModLanda.getNumber().doubleValue());
        }
        if (ce.getSource() == jsModDistMax) {
            double distMax = jsModDistMax.getNumber().doubleValue();
            CP.setRuta(rutaAux.toTr(distMax));
        }
    }

    /** programa el repintado del panel actulizando los valores de los spiners, etiquetas etc.*/
    public void actualiza() {
        //barra de progreso con el comando
        if (CP.comandoCalculado > 0) {
            jpbComandoI.setValue(pbMax);
            jpbComandoD.setValue((int) (CP.comandoCalculado * pbMax / (Math.PI / 4)));
        } else {
            jpbComandoD.setValue(0);
            jpbComandoI.setValue((int) (CP.comandoCalculado * pbMax / (Math.PI / 4)));
        }
        //texto con el comando<commit_msg>Añadidos spinners para el peso del vector de error y para alpha(parámetro que permite pesar más unos componentes del vector que otros dependiendo de si están más o menos cerca del instante actual)<commit_after>package sibtra.predictivo;

import java.awt.BasicStroke;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Label;
import java.awt.event.MouseEvent;
import java.awt.geom.GeneralPath;
import java.awt.geom.Line2D;
import java.awt.geom.Point2D;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.ObjectInputStream;

import javax.swing.JCheckBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JProgressBar;
import javax.swing.JSpinner;
import javax.swing.SpinnerNumberModel;
import javax.swing.SwingConstants;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;

import sibtra.gps.Ruta;
import sibtra.log.Logger;
import sibtra.log.LoggerDouble;
import sibtra.log.LoggerFactory;
import sibtra.log.VentanaLoggers;
import sibtra.util.PanelMuestraTrayectoria;

/**
 * Panel para mostrar la información del control predictivo y poder depurarlo.
 * @author alberto
 *
 */
@SuppressWarnings("serial")
public class PanelMuestraPredictivo extends PanelMuestraTrayectoria implements ChangeListener {

    /** Largo de la flecha que marcará orientación final de la predicción */
    private static final double largoFlecha = 2;
    /** Valor máximo de la barra de progreso */
    private static final int pbMax = 100;
    private static final double COTA_ANGULO = Math.toRadians(30);
    /** Puntero al controlador predicctivo a mostrar */
    ControlPredictivo CP = null;
    /** Barra progreso para comando a la izquierda */
    private JProgressBar jpbComandoI;
    /** Label que presentará el comando calculado */
    private JLabel jlComando;
    /** Barra progreso para comando a la izquierda */
    private JProgressBar jpbComandoD;
    private JLabel jlDistancia;
    private SpinnerNumberModel jsModHPred;
    private SpinnerNumberModel jsModHCont;
    private SpinnerNumberModel jsModLanda;
    private SpinnerNumberModel jsModDistMax;
    private SpinnerNumberModel jsModAlpha;
    private SpinnerNumberModel jsModPesoError;
    private Ruta rutaAux;

    /** Constructor necesita el controlador predictivo */
    public PanelMuestraPredictivo(ControlPredictivo contPredic, Ruta rutaIn) {
        super();
        rutaAux = new Ruta();
        rutaAux = rutaIn;
        CP = contPredic;
        setTr(CP.ruta);
        {//nuevo panel para añadir debajo
            JPanel jpPre = new JPanel(new FlowLayout(FlowLayout.LEADING));
            //barra de progreso para el comando
            jpbComandoI = new JProgressBar(-pbMax, 0);
            jpPre.add(jpbComandoI);

            jlComando = new JLabel("+##.##º");
            jlComando.setHorizontalAlignment(SwingConstants.TRAILING);
            //jlComando.setMinimumSize(new Dimension(50, 20));
            jlComando.setPreferredSize(new Dimension(60, 20));
            jpPre.add(jlComando);

            //barra de progreso para el comando derecho
            jpbComandoD = new JProgressBar(0, pbMax);
            jpPre.add(jpbComandoD);

            jlDistancia = new JLabel("DL: +###.##");
            //jlDistancia.setMinimumSize(new Dimension(60, 20));
            jlDistancia.setPreferredSize(new Dimension(80, 20));
            //jlDistancia.setSize(new Dimension(60, 20));
            jlDistancia.setHorizontalAlignment(SwingConstants.TRAILING);
            jpPre.add(jlDistancia);

            jpPre.add(new Label("H Pred"));
            jsModHPred = new SpinnerNumberModel(1, 1, 25, 1);
            JSpinner jsHorPred = new JSpinner(jsModHPred);
            jsModHPred.addChangeListener(this);
            jpPre.add(jsHorPred);

            jpPre.add(new Label("H Cont"));
            jsModHCont = new SpinnerNumberModel(1, 1, 25, 1);
            JSpinner jsHorCont = new JSpinner(jsModHCont);
            jsModHCont.addChangeListener(this);
            jpPre.add(jsHorCont);

            jpPre.add(new Label("Landa"));
            jsModLanda = new SpinnerNumberModel(0, 0, 100, 0.1);
            JSpinner jsLanda = new JSpinner(jsModLanda);
            jsModLanda.addChangeListener(this);
            jpPre.add(jsLanda);

            jpPre.add(new Label("Dist Max"));
            jsModDistMax = new SpinnerNumberModel(0.7, 0.05, 1, 0.05);
            JSpinner jsDistMax = new JSpinner(jsModDistMax);
            jsModDistMax.addChangeListener(this);
            jpPre.add(jsDistMax);

            jpPre.add(new Label("Alpha"));          
            jsModAlpha = new SpinnerNumberModel(1.05,0.01,2,0.01);
            JSpinner jsAlpha = new JSpinner(jsModAlpha);
            jsModAlpha.addChangeListener(this);
            jpPre.add(jsAlpha);
            
            jpPre.add(new Label("Peso Error"));          
            jsModPesoError = new SpinnerNumberModel(CP.getPesoError(),0.01,10,0.01);
            JSpinner jsPesoError = new JSpinner(jsModPesoError);
            jsModPesoError.addChangeListener(this);
            jpPre.add(jsPesoError);
            
            jpPre.setMinimumSize(new Dimension(Short.MAX_VALUE, 40));
//			jpPre.setBorder(BorderFactory.createCompoundBorder(
//	                   BorderFactory.createLineBorder(Color.red),
//	                   jpPre.getBorder()));

            add(jpPre);
        }
    }

    /** Lo que añadimos al panel */
    protected void cosasAPintar(Graphics g0) {
        //colocamos el coche en su posición actual
        situaCoche(CP.carroOriginal.getX(), CP.carroOriginal.getY(), CP.carroOriginal.getTita());
        super.cosasAPintar(g0);
        Graphics2D g = (Graphics2D) g0;

        //pintamos la trayectoria predicha
        GeneralPath gpPred = pathArrayXY(CP.prediccionPosicion);
        if (gpPred != null) {
            g.setStroke(new BasicStroke());
            g.setColor(Color.WHITE);
            g.draw(gpPred);
        }

        //pintamos la orientación final
        {
            double[] pini = CP.prediccionPosicion[CP.horPrediccion - 1];
            double ori = CP.predicOrientacion[CP.horPrediccion - 1];
            g.setStroke(new BasicStroke());
            g.setColor(Color.RED);
            double[] pfin = {pini[0] + largoFlecha * Math.cos(ori), pini[1] + largoFlecha * Math.sin(ori)};
            g.draw(new Line2D.Double(point2Pixel(pini), point2Pixel(pfin)));

        }
    }

    /** Atiende cambios en los spiners de los parámetros del controlador */
    public void stateChanged(ChangeEvent ce) {
        if (ce.getSource() == jsModHPred) {
            CP.setHorPrediccion(jsModHPred.getNumber().intValue());
        }
        if (ce.getSource() == jsModHCont) {
            int hc = jsModHCont.getNumber().intValue();
            int hp = jsModHPred.getNumber().intValue();
            if (hc > hp) {
                jsModHCont.setValue(hp);
            }
            CP.setHorControl(hc);
        }
        if (ce.getSource() == jsModLanda) {
            CP.setLanda(jsModLanda.getNumber().doubleValue());
        }
        if (ce.getSource() == jsModDistMax) {
            double distMax = jsModDistMax.getNumber().doubleValue();
            CP.setRuta(rutaAux.toTr(distMax));
        }
        if (ce.getSource() == jsModAlpha){
        	double alpha = jsModAlpha.getNumber().doubleValue();
        	CP.setAlpha(alpha);
        }
        if (ce.getSource() == jsModPesoError){
        	double pesoError = jsModPesoError.getNumber().doubleValue();
        	CP.setPesoError(pesoError);
        }
    }

    /** programa el repintado del panel actulizando los valores de los spiners, etiquetas etc.*/
    public void actualiza() {
        //barra de progreso con el comando
        if (CP.comandoCalculado > 0) {
            jpbComandoI.setValue(pbMax);
            jpbComandoD.setValue((int) (CP.comandoCalculado * pbMax / (Math.PI / 4)));
        } else {
            jpbComandoD.setValue(0);
            jpbComandoI.setValue((int) (CP.comandoCalculado * pbMax / (Math.PI / 4)));
        }
        //texto con el comando
{'fraction_non_alphanumeric': 0.10585321340112111, 'fraction_numerical': 0.010950332420805632, 'mean_word_length': 2.548334875115634, 'pattern_counts': {'":': 0, '<': 3, '<?xml version=': 0, '>': 7, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '3014616', 'n_tokens_mistral': 4999, 'n_tokens_neox': 4829, 'n_words': 1016}