jueves, 21 de febrero de 2013

Implementar LX200 (server) en C con Ragel (FSM compiler) sobre microcontroladores AVR (2)

Definiciones:

Empezamos por   lo mas sencillo seleccionar velocidad y mover el telescopio:
Comandos de selección de velocidad:
  • :RC# Seleccionar velocidad de Guiado (guide).
  • :RG#  Seleccionar velocidad de Centrado (center).
  • :RM# Seleccionar velocidad de Búsqueda.(find).
  • :RS# Seleccionar velocidad de Desplazamiento.(slew).
Comandos de movimiento y dirección:
  • :Me#  Mueve Telescopio al Este a velocidad seleccionada. 
  • :Mn#  Mueve Telescopio al Norte a velocidad seleccionada. 
  • :Ms#  Mueve Telescopio al Sur a velocidad seleccionada.
  • :Mw#  Mueve Telescopio al Oeste a velocidad seleccionada.
  • :MS# Mueve hasta  Objeto / Coordenadas Destino
    •  Devuelve:
    • 0  si el desplazamiento es posible
    • 1<cadena># Object Below Horizon
    • 2<scadena># Object Below Higher
Código Ragel mas simple que reconoce las expresiones:
%%{
 machine LX200;
 write data;
}%%
//Definicion comandos 
%%{
Rate ="R" [GCMS];
Move = "M" [enswS];
main := ':' (Rate|Move) '#';
# Initialize and execute.
  write init;
  write exec;
 }%%

Traducida a lenguaje natural:
  • Rate:
    • Acepto cualquier cadena que empieza por la letra 'R'seguida de una 'G' o 'C' o'M' o 'S' .
  • Move:
    • Acepto cualquier cadena que empieza por la letra 'M'seguida de una 'e' o 'n' o 's' o'w' o 'S' .
  • main:(Regla principal)
    • Acepto cualquier comando Rate o Move si van precedidos de ':' y les sigue '#';
Y aquí el grafo de la máquina de estado finito que reconoce el lenguaje.





Reconocer comandos está muy bien pero no suele ser suficiente,  además queremos que estos tengan algún efecto en el mundo real.
Veremos como en la próxima entrada.

No hay comentarios:

Publicar un comentario