]> git.llucax.com Git - z.facultad/66.09/etherled.git/blobdiff - doc/protocolo.txt
Se mejora notablemente la interfaz de línea de comandos.
[z.facultad/66.09/etherled.git] / doc / protocolo.txt
index 016f27bfb9fae2940da673095c4f1f21c071c871..fb925bcf80b3e150e9d3e62ca916e41b3d7134e1 100644 (file)
@@ -1,5 +1,5 @@
-petherled - Protocolo de comunicación del dispositivo etherled
-==============================================================
+ELP - Etherled Protocol (protocolo de comunicación del dispositivo etherled)
+============================================================================
 
 
 Objetivo
@@ -15,11 +15,11 @@ Introducci
 ------------
 
 Este protocolo está pensado para funcionar sobre UDP, es por esto que posee
-algunos mecanismos básicos para control de errores y confirmación de entrega.
-Para esto utiliza un identificador de paquete pequeño por cada tipo de
-operación y un CRC que abarca tanto a la cabecera como a los datos. El
-identificador de paquete se utiliza para saber a que paquete pertenece una
-respuesta.
+algunos mecanismos básicos para confirmación de entrega.
+Para esto utiliza un identificador de paquete pequeño por cada tipo de operación
+que se utiliza para saber a que paquete pertenece una respuesta (ACK).
+No se realiza control de errores ya que la capa de transporte (UDP) nos provee
+de un CRC.
 
 El protocolo, como se dijo anteriormente diferencia bien entre el dispositivo
 etherled (servidor) y la PC u otro dispositivo que le envía comandos (cliente).
@@ -43,32 +43,33 @@ variable VAR, con identificador ID pero sin datos. Es decir, se utiliza como
 ACK al mismo paquete recibido (sólo que sin los datos).
 
 
-Paquete petherled
------------------
+Paquete ELP
+-----------
+0                1                                N
++----------------+--------------------------------+
+|    CABECERA    |        DATOS (opcional)        |
++----------------+--------------------------------+
+/---- 1 byte ----/----------- Variable -----------/
 
-+----------------+--------------------------------+----------------+
-|    Cabecera    |        Datos (opcional)        |      CRC       |
-+----------------+--------------------------------+----------------+
-/---- 1 byte ----/---------- 0-64 bytes ----------/---- 1 byte ----/
 
-
-Cabecera
+CABECERA
 --------
 La cabecera está compuesta por los siguientes campos:
 
-+-----+--------------------+---------------+
-| GS  |      Variable      | Identificador |
-+-----+--------------------+---------------+
-/- 1 -/------ 4 bits ------/--- 3 bits ----/
+   7     6     5     4     3     2     1     0
++-----+-----------------------+-----------------+
+| GS  |        VAR            |      ID         |
++-----+-----------------------+-----------------+
+/- 1 -/------- 4 bits --------/---- 3 bits -----/
 
 GS:
        Este bit indica si la operación es GET (0) o SET (1).
 
-Variable:
+VAR:
        Es un número de 0 a 15 que indica la variable sobre la cual se está
        operando. Ver sección Variables Definidas.
 
-Identificador:
+ID:
        Es un número de 0 a 7 que indentifica al paquete. Para extender la
        cantidad de identificadores efectivos disponibles, se utiliza un
        contador por cada tupla (GS,Variable), por lo tanto, en el caso ideal de
@@ -77,21 +78,18 @@ Identificador:
        efectivos de 8 bits completo (256 posibilidades).
 
 
-Datos
+DATOS
 -----
 Los datos se envían para cada operación SET en sentido cliente->servidor y para
 cada operación GET en sentido contrario (servidor->cliente). Pueden haber
-variables que no posean datos en absoluto (una variable booleana tipo switch).
-Los datos no son codificados de ninguna manera en particular, ya que la cantidad
-de datos enviados está predefinido para cada Variable (ver sección Variables
-Definidas).
-
+variables que no posean datos en absoluto (una variable booleana tipo switch,
+que active algo si estaba desactivado o a la inversa).
+Los datos no son codificados de ninguna manera en particular ni requiere (en
+términos generales) un campo de longitud, ya que la cantidad de datos enviados
+está predefinido para cada VARiable (ver sección Variables Definidas).
 
-CRC
----
-El CRC es de un byte y se utiliza el mismo CRC que utiliza IP y UDP (complemento
-a 1 de la suma). Se aplica tanto a las cabeceras como a los datos (de existir) y
-al mismo CRC. A efectos de calcular el CRC, se toma el CRC como todo en 0.
+La máxima cantidad de bytes que se pueden enviar está determinada por la
+implementación del dispositivo.
 
 
 Variables Definidas
@@ -99,13 +97,19 @@ Variables Definidas
 
  Id | Nombre      | Descripción      | Datos
 ----+-------------+------------------+------------------------------------------
-  0 | Matriz      | Matriz a dibujar | 1 byte para la cantidad de columnas
+  0 | OFF         | Apaga el         | Ninguno, esta operación sólo tiene
+    |             | dispositivo      | sentido haciendo un SET
+----+-------------+------------------+------------------------------------------
+  1 | MATRIX      | Matriz a dibujar | 1 byte para la cantidad de columnas
     |             |                  | (ancho) más 2*ancho bytes con el
     |             |                  | contenido de la matriz organizado
     |             |                  | como se indica en la sección Matriz
 ----+-------------+------------------+------------------------------------------
-  1 | Funcionando | Prendido/apagado | 1 byte con conteniendo 0xFF para prender
-    |             | del dispositivo  | o con 0x00 para apagar
+  2 | PAUSE       | Pausa el dibuja- | 1 byte contenido 0x00 para reanudar el    
+    |             | do de la matriz  | dibujado, cualquier otro para pausarlo
+----+-------------+------------------+------------------------------------------
+  3 | DELAY       | Tiempo de retar- | 1 byte sin signo con la cantidad de 0.05
+    |             | do del dibujado  | ms a esperar entre refresco de columnas
 ----+-------------+------------------+------------------------------------------
 
 El resto de las variables quedan para futuras extensiones.
@@ -118,40 +122,85 @@ Para convertir la matriz a un array de bits se utiliza el siguiente esquema:
 
 Suponemos una matriz chica, de 4x4 para simplificar el ejemplo. Para organizar
 dicha matriz como un array de bits, simplemente hay que rotarla en sentido
-antihorario y recorrer por filas de arriba hacia abajo (agrupando por bytes).
-
-    7   6   5   4   3   2   1   0  cols   filas 7   6   5   4   3   2   1   0
-  +---+---+---+---+---+---+---+---+           +---+---+---+---+---+---+---+---+
-7 |   |   |   |   |   |   |   |   |         0 |   |   |   |   |   |   |   |   |
-  +---+---+---+---+---+---+---+---+           +---+---+---+---+---+---+---+---+
-6 |   |   |   |   |   |   |   |   |         1 |   |   |   |   |   |   |   |   |
-  +---+---+---+---+---+---+---+---+           +---+---+---+---+---+---+---+---+
-5 |   |   |   |   |   |   |   |   |         2 |   |   |   |   |   |   |   |   |
-  +---+---+---+---+---+---+---+---+           +---+---+---+---+---+---+---+---+
-4 |   |   |   |   |   |   |   |   |         3 |   |   |   |   |   |   |   |   |
-  +---+---+---+---+---+---+---+---+ ======>   +---+---+---+---+---+---+---+---+
-3 |   |   |   |   |   |   |   |   |         4 |   |   |   |   |   |   |   |   |
-  +---+---+---+---+---+---+---+---+           +---+---+---+---+---+---+---+---+
-2 |   |   |   |   |   |   |   |   |         5 |   |   |   |   |   |   |   |   |
-  +---+---+---+---+---+---+---+---+           +---+---+---+---+---+---+---+---+
-1 |   |   |   |   |   |   |   |   |         6 |   |   |   |   |   |   |   |   |
-  +---+---+---+---+---+---+---+---+           +---+---+---+---+---+---+---+---+
-0 |   |   |   |   |   |   |   |   |         7 |   |   |   |   |   |   |   |   |
-  +---+---+---+---+---+---+---+---+           +---+---+---+---+---+---+---+---+
-filas                                       cols
-
-Quedando por resultado las columnas desde la 0 a la 7 en cada byte del stream de
-bits:
-
-+-----+-----+-----+-----+-----+-----+-----+-----+
-| 7,0 | 6,0 | 5,0 | 4,0 | 3,0 | 2,0 | 1,0 | 0,0 | byte 0 == col 0
-+-----+-----+-----+-----+-----+-----+-----+-----+
-
-+-----+-----+-----+-----+-----+-----+-----+-----+
-| 7,1 | 6,1 | 5,1 | 4,1 | 3,1 | 2,1 | 1,1 | 0,1 | byte 1 == col 1
-+-----+-----+-----+-----+-----+-----+-----+-----+
-
-etc., etc., etc.
+horario y recorrer por filas de arriba hacia abajo (agrupando por bytes).
+
+Por ejemplo:
+
+
+0           columna          15
+
+0 0 0 0 1 1 1 1 1 1 1 1 0 0 0 0   fila 0
+0 0 1 1 1 1 1 1 1 1 1 1 1 1 0 0   fila 1
+0 1 1 1 0 0 0 0 0 0 0 0 1 1 1 0   fila 2
+0 1 1 0 0 0 0 0 0 0 0 0 0 1 1 0   fila 3
+1 1 0 0 0 1 1 0 0 1 1 0 0 0 1 1   fila 4
+1 1 0 0 0 1 1 0 0 1 1 0 0 0 1 1   fila 5
+1 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1   fila 6
+1 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1   fila 7
+1 1 0 0 1 0 0 0 0 0 0 1 0 0 1 1   fila 8
+1 1 0 0 1 1 0 0 0 0 1 1 0 0 1 1   fila 9
+1 1 0 0 0 1 1 1 1 1 1 0 0 0 1 1   fila 10
+1 1 0 0 0 0 1 1 1 1 0 0 0 0 1 1   fila 11
+0 1 1 0 0 0 0 0 0 0 0 0 0 1 1 0   fila 12
+0 1 1 1 0 0 0 0 0 0 0 0 1 1 1 0   fila 13
+0 0 1 1 1 1 1 1 1 1 1 1 1 1 0 0   fila 14
+0 0 0 0 1 1 1 1 1 1 1 1 0 0 0 0   fila 15
+
+               |
+               |
+               V
+
+15           fila             0
+/--------------/--------------/
+      HIGH           LOW
+
+0 0 0 0 1 1 1 1 1 1 1 1 0 0 0 0   columna 0
+0 0 1 1 1 1 1 1 1 1 1 1 1 1 0 0   columna 1
+0 1 1 1 0 0 0 0 0 0 0 0 1 1 1 0   columna 2
+0 1 1 0 0 0 0 0 0 0 0 0 0 1 1 0   columna 3
+1 1 0 0 0 0 1 1 0 0 0 0 0 0 1 1   columna 4
+1 1 0 0 0 1 1 0 0 0 1 1 0 0 1 1   columna 5
+1 1 0 0 1 1 0 0 0 0 1 1 0 0 1 1   columna 6
+1 1 0 0 1 1 0 0 0 0 0 0 0 0 1 1   columna 7
+1 1 0 0 1 1 0 0 0 0 0 0 0 0 1 1   columna 8
+1 1 0 0 1 1 0 0 0 0 1 1 0 0 1 1   columna 9
+1 1 0 0 0 1 1 0 0 0 1 1 0 0 1 1   columna 10
+1 1 0 0 0 0 1 1 0 0 0 0 0 0 1 1   columna 11
+0 1 1 0 0 0 0 0 0 0 0 0 0 1 1 0   columna 12
+0 1 1 1 0 0 0 0 0 0 0 0 1 1 1 0   columna 13
+0 0 1 1 1 1 1 1 1 1 1 1 1 1 0 0   columna 14
+0 0 0 0 1 1 1 1 1 1 1 1 0 0 0 0   columna 15
+
+
+Para serializarlo se convierte en este stream de bytes (fila;columna):
+
+/-------------------------- byte 0 -----------------------------/
++-------+-------+-------+-------+-------+-------+-------+-------+
+| cols7 | cols6 | cols5 | cols4 | cols3 | cols2 | cols1 | cols0 | == cant. cols
++-------+-------+-------+-------+-------+-------+-------+-------+
+
+/-------------------------- byte 1 -----------------------------/
++-------+-------+-------+-------+-------+-------+-------+-------+
+|  8;0  |  9;0  | 10;0  | 11;0  | 12;0  | 13;0  | 14;0  | 15;0  | == HIGH(col0)
++-------+-------+-------+-------+-------+-------+-------+-------+
+
+/-------------------------- byte 2 -----------------------------/
++-------+-------+-------+-------+-------+-------+-------+-------+
+|  0;0  |  1;0  |  2;0  |  3;0  |  4;0  |  5;0  |  6;0  |  7;0  | == LOW(col0)
++-------+-------+-------+-------+-------+-------+-------+-------+
+
+...
+
+/-------------------------- byte 31 ----------------------------/
++-------+-------+-------+-------+-------+-------+-------+-------+
+|  8; 5 |  9;15 | 10;15 | 11;15 | 12;15 | 13;15 | 14;15 | 15;15 | == HIGH(col15)
++-------+-------+-------+-------+-------+-------+-------+-------+
+
+/-------------------------- byte 32 ----------------------------/
++-------+-------+-------+-------+-------+-------+-------+-------+
+|  0;15 |  1;15 |  2;15 |  3;15 |  4;15 |  5;15 |  6;15 |  7;15 | == LOW(col15)
++-------+-------+-------+-------+-------+-------+-------+-------+
+
 
 En el protocolo la cantidad de filas es _SIEMPRE_ 16, ya que está limitada
 físicamente por la cantidad de leds del dispositivo. Por lo tanto, siempre
@@ -163,3 +212,15 @@ HIGH(col0), LOW(col0), HIGH(col1), LOW(col1), ... , HIGH(colN), LOW(colN)
 
 Siendo HIGH(colI) la parte alta de la columan I y LOW(colI) su parte baja.
 
+Finalmente, los DATOS de una matriz tienen la siguiente estructura:
++----------------+------------------------------------------------+
+|      LEN       | HIGH(col0) LOW(col0) ...  HIGH(colN) LOW(colN) |
++----------------+------------------------------------------------+
+/---- 1 byte ----/------------------- variable -------------------/
+
+Siendo LEN la cantidad columnas de la matriz.
+
+
+
+
+vim: set encoding=iso-8859-1 :