domingo, 5 de abril de 2009

Siguiendo bien las líneas con comportamientos

Después de andar trasteando un poco y aunque al final conseguimos solucionar la práctica de los comportamientos, se nos quedo una espinita clavada con el maldito "ismoving". Última solución, mirar los fuentes.
Hemos revisado el código fuente de Arbitrator, Navigator, Motor y BasicMotor. Resulta que los motores tienen en principio tres (que nos importen) estados, FORWARD, BACKWARD y STOP. Su ismoving significa simplemente que no este ni en FORWARD ni en BACKWARD (puede estar también en estado FLOAT, pero este no le utilizamos, en este caso el motor va suelto, se deja que pare el solo).
Sin embargo, en Motor, añaden la funcionalidad de rotateTo, que luego utiliza Navigator.
Para esto añaden una variable booleana _isrotating. Y su ismoving es que no este ni FORWARD ni BACKWARD y que además _isrotating sea falso.
El método Stop actualiza el estado del motor a Stop y se supone que siempre que se cambia un estado, _isrotating es puesto a false.
El problema es que tienen un Thread corriendo, que se encarga de que si se pasa rotando, de la vuelta, y así indefinidamente, aunque con ciertos límites. Este Thread cambia velocidades, modos (FORWARD, BACKWARD y STOP) y hace un montón de cosas, un poco complicado.

Nuestro problema (comprobado y depurado) es que no salía de un bucle porque se quedaba parado (al ejecutarse un supress) y no estaba en la línea negra, sin embargo ismoving seguía devolviendo true. Probamos cambiando el supress de avanzar (que era parar cada motor por separado) por navigator.stop; pero esto tampoco funciona (un rápido vistazo del código muestra que parar cada motor es lo que hace navigator.stop). Lo que dedicimos al final fue no utilizar el método ismoving de motor, sino el metodo isStopped (que pertenece a BasicMotor) del motor que movemos. De esta forma, pasamos del _isrotating, lo que en principio sería peligroso, aunque no tanto, porque para rotar lo hace con FORWARD y BACKWARD.

Y bueno, parece que funciona:




Y por cierto, algo curioso. El método suppress no se ejecuta siempre, sino solo cuando cambiamos a un comportamiento con más prioridad. Si pasamos por ejemplo del comportamiento cero del array, al uno, no se ejecuta ningún supress.

No hay comentarios:

Publicar un comentario