Skip to content

Commit 1af0af2

Browse files
committed
Cnosos refactorizado y documentado; bug constructor Robot arreglado
1 parent 178fea2 commit 1af0af2

5 files changed

Lines changed: 137 additions & 57 deletions

File tree

Codigo/RobotAlgoritmica/Cnosos.cpp

Lines changed: 72 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -86,10 +86,15 @@ byte Cnosos::siguiente() {
8686
byte Cnosos::lee_numero() {
8787
byte x = 0;
8888
for (byte i = 0; i < BITS; i++) {
89+
//Desplaza el numero a la izquierda.
90+
//Si x = 0, despues de la operacion x = 0
91+
//Si x = 0b1, despues de la operacion x = 0b10
8992
x = x << 1;
93+
//Si encuentra un cruce, suma 1 a x
9094
if(siguiente() == 1){
9195
x++;
9296
}
97+
//Si no encuentra un cruce, como ya se introduce un 0, dejalo como esta
9398
}
9499
return x;
95100
}
@@ -100,76 +105,114 @@ byte Cnosos::lee_numero() {
100105
* Este metodo no sabe desde que parte del nodo empieza, por lo que
101106
* crucesEncontrados es menor o igual que el grado.
102107
*/
103-
byte lee_nodo_A(Cnosos* cn, byte &etiq) {
108+
byte lee_nodo_A(Cnosos* cn, byte &id) {
104109
byte crucesEncontrados = 0; // caminos contados desde la entrada
105-
while (cn->siguiente()){
110+
//Mientras siguiente() encuentre cintas cruzadas
111+
while (cn->siguiente() == 1){
106112
crucesEncontrados++;
107113
}
108114

109-
etiq = cn->lee_numero();
115+
//Cuando siguiente() encuentre un hueco en la cinta
116+
//Empieza a leer el identificador
117+
id = cn->lee_numero();
110118

119+
//Devuelve los cruces que haya encontrado
111120
return crucesEncontrados;
112121
}
113122

114123
/*
115-
* Despues de lee_nodo_A sabemos que estamos detras del identificador de nodo.
124+
* Despues de lee_nodo_A sabemos que el robot esta detras del identificador de nodo.
116125
*
117126
* Calcula el grado del nodo (numero aristas), y lo devuelve por referencia.
118-
* Calcula la arista desde la que ha empezado contando desde despues de la etiqueta
119-
* (Si ha empezado lee_nodo() 2 aristas despues del identificador, entrada = 2).
120127
* El identificador leido en lee_nodo_A debe ser el mismo que el leido en lee_nodo_B.
128+
* Calcula la arista desde la que ha empezado contando desde despues de la etiqueta, con la ayuda de crucesEncontrados.
129+
* (Si ha empezado lee_nodo() 2 aristas despues del identificador, entrada = 2).
121130
*/
122-
void lee_nodo_B(Cnosos* cn, byte crucesEncontrados, byte &grado, byte &entrada,
123-
byte etiq) {
131+
void lee_nodo_B(Cnosos* cn, byte crucesEncontrados, byte id,
132+
byte &grado, byte &entrada) {
133+
//Calcula el grado del nodo
124134
grado = 0;
125-
while (cn->siguiente()){
135+
while (cn->siguiente() == 1){
126136
grado++;
127137
}
128138

139+
// Calcula el cruce por el que ha entrado el robot
129140
entrada = grado - crucesEncontrados + 1;
130141

131-
if (etiq != cn->lee_numero()){
142+
//Si el id leido es distinto del recibido por argumentos
143+
if (id != cn->lee_numero()){
144+
//Salta error
132145
cn->error();
133146
}
134147
}
135148

136149
/*
137150
* Despues de dos vueltas al nodo, devuelve por referencia
138151
* el identificador del nodo, el grado del nodo,
139-
* y cuantos cruces debe saltarse para llegar desde el final del identificador
140-
* al cruce por el que ha empezado a investigar el nodo.
152+
* y cuantos cruces debe saltarse el robot para llegar desde el final del identificador
153+
* al cruce por el que el robot ha empezado a investigar el nodo.
141154
*/
142155
void Cnosos::lee_nodo(byte &etiq, byte &grado, byte &entrada) {
143156
byte aux = lee_nodo_A(this, etiq);
144-
lee_nodo_B(this, aux, grado, entrada, etiq);
157+
lee_nodo_B(this, aux, etiq, grado, entrada);
145158
}
146159

147160
/*
148-
*
161+
* Dos giros a la izquierda.
149162
*/
150163
void Cnosos::sal_aqui() {
151-
sal_izq();
152-
if (this->siguiente()){
153-
sal_izq();
164+
this->sal_izq();
165+
if (this->siguiente() == 1){
166+
this->sal_izq();
167+
}else{
168+
this->error();
154169
}
155-
else error();
156170
}
157171

158-
void Cnosos::sal(byte i, byte grado, byte pos) {
159-
while (pos != i) {
160-
pos++;
161-
if (pos == grado + 1) {
162-
if (this->siguiente()) error();
172+
void Cnosos::sal(byte aristaATomar, byte grado, byte posicionInicial) {
173+
//Arista saltado representa los cruces que el robot se ha saltado hasta el momento.
174+
//Si las aristas estan identificadas en el intervalo {1..n},
175+
//el robot puede haberse saltado {0..n} aristas al recorrer el perimetro del nodo,
176+
//siendo "0" el tramo entre el identificador y la primera arista,
177+
//y "n" el tramo entre la ultima arista y el identificador.
178+
byte aristaSaltada = posicionInicial;
179+
180+
//Mientras la arista que el robot se ha saltado no sea la arista anterior a la que se quiere tomar:
181+
while (aristaSaltada != aristaATomar - 1) {
182+
//Si la arista actual supera o iguala el grado:
183+
//Esta en la zona de identificadores
184+
if (aristaSaltada >= grado) {
185+
//Si no encuentra el identificador, error
186+
if (this->siguiente() == 1) {
187+
error();
188+
}
189+
//Descarta el identificador, no lo necesitamos ahora
163190
lee_numero();
164-
pos = 1;
191+
//La arista actual es 0 (no nos hemos saltado ninguna)
192+
aristaActual = 0;
193+
}else{
194+
//El robot no esta en zona de identificadores
195+
//Si encuentra un identificador, error
196+
if (this->siguiente() == 0){
197+
this->error();
198+
}
199+
//El robot acaba de saltarse un cruce
200+
//La arista actual aumenta en 1
201+
aristaActual++;
165202
}
166-
if (!this->siguiente()) error();
167203
}
168-
sal_aqui();
204+
205+
//Si se ha salido del bucle, es que se quiere tomar el siguiente cruce.
206+
//El robot toma el siguiente cruce.
207+
if (this->siguiente() == 1){
208+
this->sal_aqui();
209+
}else{
210+
this->error();
211+
}
169212
}
170213

171214
void Cnosos::sal_izq() {
172-
//TODO
215+
//TODO probar en vivo
173216
robot.rotaIzda();
174217
robot.alante();
175218
robot.rotaIzda();
@@ -189,8 +232,9 @@ void Cnosos::luce_numero(byte n) {
189232
// Necesita modulo Morse inicializado para que suene/luzca
190233
// Necesita modulo Bluetooth inicializado para mandar mensajes
191234
void Cnosos::error() {
192-
robot.BLUETOOTH.enviaLinea("¡ERROR!");
235+
robot.para();
193236
while (true){
237+
robot.BLUETOOTH.enviaLinea("¡ERROR!");
194238
robot.MORSE.sos();
195239
}
196240
}

Codigo/RobotAlgoritmica/Cnosos.h

Lines changed: 55 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -14,71 +14,104 @@
1414
#include "robot.h"
1515

1616
class Cnosos {
17-
//TODO
17+
/// Redefiniciones de metodos que se usaran a lo largo de la clase.
18+
// Reducen y hacen mas intuitivo el codigo.
1819
#define SENSOR_IZDA robot.SIGUELINEAS.readIzda()
1920
#define SENSOR_CENTRO robot.SIGUELINEAS.readCentro()
2021
#define SENSOR_DCHA robot.SIGUELINEAS.readDcha()
21-
//TODO
22+
23+
/// Cada vez que tiene que procesar una entrada, el robot "pensara" (se quedara quieto) este numero de milisegundos.
2224
#define TIEMPO_PENSAR 500
2325
private:
24-
//TODO
26+
/// Guarda la configuracion del robot que se va a usar en este objeto.
2527
Robot robot;
26-
//TODO
28+
/// Numero de bits que usaran los nodos para identificarse.
2729
byte BITS;
2830
public:
29-
//Constructores
31+
//Constructor
3032
/**
31-
* TODO
32-
* @param
33-
* @param
33+
* Constructor de la libreria Cnosos.
34+
* No necesita inicializarse, dado que los parametros ya deberian estar inicializados.
35+
* @param Robot a controlar
36+
* Objeto Robot con el que se va a trabajar.
37+
* Se espera que el Robot este inicializado, asi como su Siguelineas.
38+
* Si se necesita debuggear o que el robot se comunique con el usuario,
39+
* es necesario inicializar o el modulo Morse o el modulo Bluetooth.
40+
* @param Numero bits en las etiquetas
41+
* Numero de bits que se usaran para identificar cada nodo del mapa.
42+
* Se espera que el tamaño del parametro sea adecuado, dado que si se utiliza el valor maximo (255),
43+
* se podrian identificar 2^255 nodos, que son mas de 10^76 nodos.
44+
* Por defecto, se utilizaran 3 marcas para el identificador de cada nodo.
3445
*/
3546
Cnosos(Robot, byte = 3);
3647
//Destructor
3748

3849

3950
//Funciones
4051
/**
41-
* TODO
52+
* Avanza por la linea hasta encontrar un hueco en la cinta o una cinta atravesada. Sobrepasa el indicador.
53+
* @return 0 si ha encontrado un hueco en la cinta, 1 si ha encontrado una cinta atravesada.
4254
*/
4355
byte siguiente();
4456

4557
/**
46-
* TODO
58+
* Lee un identificador de nodo.
59+
* Este metodo supone que se acaba de cruzar el marcador de comienzo del identificador.
60+
* Por defecto, ese marcador es un hueco en la cinta.
4761
*/
4862
byte lee_numero();
4963

5064
/**
51-
* TODO
65+
* Recorre dos veces el perimetro del nodo para obtener gran cantidad de datos.
66+
* El robot quedara despues del identificador del nodo.
67+
* @param[out] Identificador del nodo
68+
* Devuelve el numero que identifica a este nodo.
69+
* @param[out] Grado del nodo
70+
* Devuelve el grado (o el numero de cruces) que tiene este nodo.
71+
* @param[out] Cruce por el que ha entrado el robot al nodo
72+
* Devuelve el numero del cruce por el que ha entrado el nodo.
73+
* Si el robot empezo a recorrer el nodo justo detras del identificador, este numero sera 0,
74+
* si se empezo detras del primer cruce sera 1...
75+
* asi hasta 'grado', que significaria que el robot
76+
* ha empezado a recorrer el nodo antes del identificador.
5277
*/
5378
void lee_nodo(byte&, byte&, byte&);
5479

5580
/**
56-
* TODO
57-
*/
58-
byte calcula_entrada(byte, byte);
59-
60-
/**
61-
* TODO
81+
* En cuanto se encuentre un cruce, toma ese cruce y el robot pasa al siguiente nodo.
6282
*/
6383
void sal_aqui();
6484

6585
/**
66-
* TODO
86+
* Toma un cruce en concreto desde la posicion en la que este el robot.
87+
* @param Cruce a tomar
88+
* Numero del cruce que se quiere tomar, siendo 1 el primer cruce de la etiqueta.
89+
* @param Grado del nodo
90+
* Ultimo cruce que puede tomar el robot.
91+
* Tambien representa el grado (o el numero de cruces) que hay en el nodo.
92+
* @param Cruce actual
93+
* Indica cual es el ultimo cruce que el robot se ha saltado.
94+
* Por defecto, se considera que el robot esta justo detras de la etiqueta,
95+
* por lo que no se ha saltado ningun cruce (este valor es 0).
6796
*/
68-
void sal(byte, byte, byte);
97+
void sal(byte, byte, byte = 0);
6998

7099
/**
71-
* TODO
100+
* Toma una salida a la izquierda.
72101
*/
73102
void sal_izq();
74103

75104
/**
76-
* TODO
105+
* Comunica un numero al usuario por medio de modulos.
106+
* Necesita tener inicializado el modulo Morse o el modulo Bluetooth para comunicarse con el usuario.
107+
* @param Numero a comunicar
108+
* Envia este numero, ya sea con el mismo numero de pitidos, o con un mensaje Bluetooth.
77109
*/
78110
void luce_numero(byte);
79111

80112
/**
81-
* TODO
113+
* Se ha encontrado un suceso inesperado. Se para y grita SOS.
114+
* Necesita tener inicializado el modulo Morse o el modulo Bluetooth para comunicarse con el usuario.
82115
*/
83116
void error();
84117
};

Codigo/RobotAlgoritmica/robot.cpp

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414

1515
#include "robot.h"
1616

17-
//Constructor
17+
//Constructores
1818
Robot::Robot(byte pinIzdaAlante, byte pinIzdaAtras, byte pinDchaAlante, byte pinDchaAtras,
1919
byte pinVelIzda, byte pinVelDcha,
2020
byte tiempoArranque) {
@@ -29,6 +29,9 @@ Robot::Robot(byte pinIzdaAlante, byte pinIzdaAtras, byte pinDchaAlante, byte pin
2929

3030
TIEMPO_ARRANQUE = tiempoArranque;
3131
}
32+
Robot::Robot(){
33+
Robot(255, 255, 255, 255, 255, 255, 0);
34+
}
3235
//Destructores
3336

3437

Codigo/RobotAlgoritmica/robot.h

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -93,7 +93,7 @@ class Robot {
9393
//Destructores
9494

9595

96-
//Inicializar
96+
//Inicializar
9797
/**
9898
* Inicializa los pines para que el robot pueda alimentar los motores.
9999
*/
@@ -145,7 +145,7 @@ class Robot {
145145
void maxVelocidad();
146146

147147

148-
//Cambios de direccion
148+
//Cambios de direccion
149149
/**
150150
* El robot deja de alimentar los motores de la izquierda para poder girar a la izquierda.
151151
* Permite girar mientras el robot va marcha atras.
@@ -155,7 +155,7 @@ class Robot {
155155
*/
156156
void giraIzda(byte = VELOCIDAD_GIRO);
157157

158-
/**
158+
/**
159159
* El robot deja de alimentar los motores de la derecha para poder girar a la derecha.
160160
* Permite girar mientras el robot va marcha atras.
161161
* @param Velocidad

Codigo/RobotAlgoritmica/siguelineas.h

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -69,19 +69,19 @@ class Siguelineas {
6969
//Funciones
7070
/**
7171
* Accede al sensor izquierdo y devuelve su lectura.
72-
* @return true si hay una linea debajo del sensor izquierdo.
72+
* @return TRUE si hay una linea debajo del sensor izquierdo.
7373
*/
7474
bool readIzda();
7575

7676
/**
7777
* Accede al sensor central y devuelve su lectura.
78-
* @return true si hay una linea debajo del sensor central.
78+
* @return TRUE si hay una linea debajo del sensor central.
7979
*/
8080
bool readCentro();
8181

8282
/**
8383
* Accede al sensor derecho y devuelve su lectura.
84-
* @return true si hay una linea debajo del sensor derecho.
84+
* @return TRUE si hay una linea debajo del sensor derecho.
8585
*/
8686
bool readDcha();
8787
};

0 commit comments

Comments
 (0)