// Se actualizan los �tems en la tabla
robotsTable.removeAll();
for (int i=0; i<Simulation.getCurrent().getRobotArray().size(); i++)
{
Robot robot = (Robot)Simulation.getCurrent().getRobotArray().get(i);
TableItem tableItem = new TableItem(robotsTable, SWT.NONE);
tableItem.setText(1, robot.getName());
if ( robot.getStatus() == Defines.STATE_ROBOT_NOT_CALIBRATED )
{
tableItem.setText(2, robot.getStatusText() );
tableItem.setChecked(false);
tableItem.setImage(2,SWTResourceManager
.getImage("resources/icons/icon16x16/enable/Symbol error.png"));
}
else
{
tableItem.setBackground(0,robot.getColor());
tableItem.setText(2, robot.getStatusText() );
tableItem.setChecked(true);
tableItem.setImage(2,SWTResourceManager
.getImage("resources/icons/icon16x16/enable/Symbol check 2.png"));
}
}
///////////////////////////////////////////////////////////////
break;
case Defines.GPS_TUNER_SET_ICONS:
// PASO 3: Reconocimiento de los �conos coloreados.
if ( !allRobotRecognized() )
{
ErrorMessage.errorMessage(Defines.ERROR_NOT_ALL_ROBOT_RECOGNIZED, getParent());
nextStep = Defines.GPS_TUNER_SET_ROBOTS;
okButtonWidgetSelected(null); // TODO: ojo con esta llamada recursiva!
break;
}
step1.setImage(SWTResourceManager
.getImage("resources/icons/icon24x24/disable/1-disable.png"));
step2.setImage(SWTResourceManager
.getImage("resources/icons/icon24x24/disable/2-disable.png"));
step3.setImage(SWTResourceManager
.getImage("resources/icons/icon24x24/enable/3-enable.png"));
step4.setImage(SWTResourceManager
.getImage("resources/icons/icon24x24/disable/4-disable.png"));
capturaButton.setEnabled(false);
step2Pannel.setVisible(true); step2Pannel.setEnabled(false);
step3Pannel.setVisible(true); step3Pannel.setEnabled(true);
step3bisPannel.setVisible(false); step3bisPannel.setEnabled(false);
step4Pannel.setVisible(false); step4Pannel.setEnabled(false);
backButton.setVisible(true);
okButton.setText("Siguiente >>");
hintText.setText("Seleccione clickeando y formando un rectangulo sobre todos los iconos coloreados.");
if(Simulation.getCurrent().getType() == Defines.REAL_SIMULATION)
nextStep = Defines.GPS_TUNER_SET_CONNECTIONS;
else
nextStep = Defines.GPS_TUNER_SET_WALLS;
//////////////////// L�GICA PARA EL PASO 3 ////////////////////
step3Pannel.setEnabled(true);
///////////////////////////////////////////////////////////////
break;
case Defines.GPS_TUNER_SET_CONNECTIONS:
// PASO 3bis: conexi�n entre lugares
capturaButton.setEnabled(false);
step2Pannel.setVisible(true); step2Pannel.setEnabled(false);
step3Pannel.setVisible(true); step3Pannel.setEnabled(false);
step3bisPannel.setVisible(true); step3bisPannel.setEnabled(true);
step4Pannel.setVisible(false); step4Pannel.setEnabled(false);
backButton.setVisible(true);
okButton.setText("Siguiente >>");
hintText.setText("Seleccione clickeando y uniendo con una linea los iconos coloreados.");
nextStep = Defines.GPS_TUNER_SET_WALLS;
//////////////////// L�GICA PARA EL PASO 3 ////////////////////
step3bisPannel.setEnabled(true);
///////////////////////////////////////////////////////////////
break;
case Defines.GPS_TUNER_SET_WALLS:
// PASO 4: Reconocimiento de las paredes.
step1.setImage(SWTResourceManager
.getImage("resources/icons/icon24x24/disable/1-disable.png"));
step2.setImage(SWTResourceManager
.getImage("resources/icons/icon24x24/disable/2-disable.png"));
step3.setImage(SWTResourceManager
.getImage("resources/icons/icon24x24/disable/3-disable.png"));
step4.setImage(SWTResourceManager
.getImage("resources/icons/icon24x24/enable/4-enable.png"));
capturaButton.setEnabled(false);
step2Pannel.setVisible(true); step2Pannel.setEnabled(false);
step3Pannel.setVisible(true); step3Pannel.setEnabled(true);
step4Pannel.setVisible(true); step4Pannel.setEnabled(true);
backButton.setVisible(true);
okButton.setText("Finalizar");
if(Simulation.getCurrent().getType() == Defines.REAL_SIMULATION)
hintText.setText("Seleccione clickeando y formando un rectangulo sobre el riel.");
else
hintText.setText("Seleccione clickeando y formando un rectangulo sobre la pared.");
nextStep = Defines.GPS_TUNER_FINISH;
//////////////////// L�GICA PARA EL PASO 4 ////////////////////
step3Pannel.setEnabled(false);
if (iconsTable.getItemCount() < 1)
ErrorMessage.warningMessage(Defines.WARNING_NO_ICON_RECOGNIZED, getParent());
Simulation.getCurrent().removePlaces();
///////////////////////////////////////////////////////////////
break;
case Defines.GPS_TUNER_FINISH:
RecognizedItems mazeItems = Simulation.getCurrent().getGps().getMazeItems();
boolean resolved = false;
// [EB2] Si la simulacion es real, leemos la info de conexiones que se recolect�
if(Simulation.getCurrent().getType() == Defines.REAL_SIMULATION) {
// si el grafo est� conectado, voy seteando la matriz de conexiones
int min=Integer.MAX_VALUE;
int max=Integer.MIN_VALUE;
for (int i = 0; i < mazeItems.recognizedColoredIcons.length; i++) {
min = Math.min(min,Integer.parseInt(mazeItems.recognizedColoredIcons[i].shapeId));
max = Math.max(min,Integer.parseInt(mazeItems.recognizedColoredIcons[i].shapeId));
}
resolved = true; //graphIsConnected(min,max);
boolean places[][] = new boolean[max][max];
for (int i = 0; i < places.length; i++) {
for (int j = 0; j < places.length; j++) {
places[i][j] = false;
}
}
if(resolved){
Set<Integer> keys = linkedIcons.keySet();
Simulation simulation = Simulation.getCurrent();
for (Integer placeId : keys) {
Set<Integer> connections = linkedIcons.get(placeId);
for (Integer destiny : connections) {
places[placeId-1][destiny-1]=true;
places[destiny-1][placeId-1]=true;
}
}
for (int i = 0; i < places.length; i++) {
for (int j = 0; j < places.length; j++) {
if(places[i][j]) simulation.setPlace(i+1,j+1);
}
}
}
}
else {
// En este punto, ya fueron reconocidos todos los �conos coloreados
// y todas las paredes. Por lo tanto, se ejecuta el proceso para
// averiguar qu� colores son apreciados desde cada lugar (esta
// informaci�n se cargar� en la simulaci�n, para ser utilizada por
// la red neuronal).
if ( mazeItems != null )
{
// Se corrigen los "puntos de visi�n" de aquellos �conos
// coloreados que as� lo requieran.
RecognizedShape[] icons = mazeItems.recognizedColoredIcons;
for (int i=0; i<icons.length; i++)
{
// Se verifica si el punto de visi�n est� libre.
if ( ! icons[i].contains( icons[i].vx , icons[i].vy ) )
continue;
// El punto de visi�n no est� libre => se lo corrige.
// Para esto, se parte desde el centroide, mirando
// hacia el norte, sur, este y oeste, para detectar
// d�nde no hay pared.
double vxNew;
double vyNew;
double deltaX = Math.abs( icons[i].x - icons[i].bx );
double deltaY = Math.abs( icons[i].y - icons[i].by );
deltaX += Defines.FRONT_SENSOR_DISTANCE;
deltaY += Defines.FRONT_SENSOR_DISTANCE;
boolean free = true;
vxNew = icons[i].x; // NORTE
vyNew = icons[i].y - deltaY;
for (int j=0; free && j<mazeItems.recognizedWalls.length; j++)
if ( mazeItems.recognizedWalls[j].contains(vxNew, vyNew) )
free = false;
if ( ! free )
{
free = true;
vxNew = icons[i].x; // SUR
vyNew = icons[i].y + deltaY;
for (int j=0; free && j<mazeItems.recognizedWalls.length; j++)
if ( mazeItems.recognizedWalls[j].contains(vxNew, vyNew) )
free = false;
}
if ( ! free )
{
free = true;
vxNew = icons[i].x + deltaX; // ESTE
vyNew = icons[i].y;
for (int j=0; free && j<mazeItems.recognizedWalls.length; j++)
if ( mazeItems.recognizedWalls[j].contains(vxNew, vyNew) )
free = false;
}
if ( ! free )
{
free = true;
vxNew = icons[i].x - deltaX; // OESTE
vyNew = icons[i].y;
for (int j=0; free && j<mazeItems.recognizedWalls.length; j++)
if ( mazeItems.recognizedWalls[j].contains(vxNew, vyNew) )
free = false;
}
if ( free )
{
icons[i].vx = vxNew;
icons[i].vy = vyNew;
}
else
{
// Error grave! No hay un punto de
// visi�n libre...
Logger.error(
"Error grave! No hay un punto " +
"de visi�n libre para el �cono " +
"coloreado " + icons[i].shapeId );
}
}
int width = ic.getImageResolution().width;
int height = ic.getImageResolution().height;
for (int i=0; i<icons.length; i++)
{
double vx = icons[i].vx;
double vy = icons[i].vy;
resolved = false;
for (double phi=0.0; phi<2.0*Math.PI; phi+=0.5*Math.PI)
{
// Se recorre la l�nea para ver si choca contra
// una pared o contra otro �cono coloreado.
double x = vx;
double y = vy;
boolean finished1 = false;
boolean finished2 = false;
while ( !finished1 && !finished2 )
{
for (int j=0; !finished1 && j<mazeItems.recognizedWalls.length; j++)
if ( mazeItems.recognizedWalls[j].contains(x, y) )
// Hay una pared
finished1 = true;
for (int j=0; !finished1 && !finished2 && j<mazeItems.recognizedColoredIcons.length; j++)
if ( j != i && mazeItems.recognizedColoredIcons[j].contains(x, y) )
{
// Encontr� un color
int fromPlace = Integer.valueOf(icons[i].shapeId).intValue();
int toPlace = Integer.valueOf(mazeItems.recognizedColoredIcons[j].shapeId).intValue();
Simulation.getCurrent().setPlace( fromPlace , toPlace );
finished2 = true;
resolved = true;
}
x += Defines.STEP_SIZE * Math.cos( phi );
y += Defines.STEP_SIZE * Math.sin( phi );
if ( x < 0 || x > width || y < 0 || y > height )
// Se fue del rango de la imagen...
finished1 = true;
}
}
if ( !resolved )
break;
}
}
}
// Una vez seteados los lugares, se crea una red neuronal
// para cada robot.
int[][] places = Simulation.getCurrent().getPlaces();
if ( !resolved )
{
ErrorMessage.errorMessage(Defines.ERROR_NO_PLACE_RESOLVED, getParent());
step4.setImage(SWTResourceManager
.getImage("resources/icons/icon24x24/disable/4-disable.png"));
step4Pannel.setVisible(false);
nextStep = Defines.GPS_TUNER_SET_ICONS;
okButtonWidgetSelected(evt);
}
else if ( places == null )
{
ErrorMessage.errorMessage(Defines.ERROR_NO_PLACES_RESOLVED, getParent());
step4.setImage(SWTResourceManager
.getImage("resources/icons/icon24x24/disable/4-disable.png"));
step4Pannel.setVisible(false);
nextStep = Defines.GPS_TUNER_SET_ICONS;
okButtonWidgetSelected(evt);
}
else
{
Simulation.getCurrent().setTargetPlace( places.length );
Vector robots = Simulation.getCurrent().getRobotArray();
for (int i=0; robots!=null && i<robots.size(); i++)
{
try
{
Robot robot = (Robot)robots.get(i);
robot.getNeuralNetwork().setPlaces( places );
}
catch (NeuralNetworkException e)
{
Logger.error( e.getMessage() );
}