@@ -86,10 +86,15 @@ byte Cnosos::siguiente() {
8686byte 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 */
142155void 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 */
150163void 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
171214void 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
191234void Cnosos::error () {
192- robot.BLUETOOTH . enviaLinea ( " ¡ERROR! " );
235+ robot.para ( );
193236 while (true ){
237+ robot.BLUETOOTH .enviaLinea (" ¡ERROR!" );
194238 robot.MORSE .sos ();
195239 }
196240}
0 commit comments