]> 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
 
 
 Objetivo
@@ -15,11 +15,11 @@ Introducci
 ------------
 
 Este protocolo está pensado para funcionar sobre UDP, es por esto que posee
 ------------
 
 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).
 
 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).
 
 
 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:
 
 --------
 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).
 
 
 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.
 
        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
        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).
 
 
        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
 -----
 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
 
 
 Variables Definidas
@@ -99,13 +97,19 @@ Variables Definidas
 
  Id | Nombre      | Descripción      | Datos
 ----+-------------+------------------+------------------------------------------
 
  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
 ----+-------------+------------------+------------------------------------------
     |             |                  | (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.
 ----+-------------+------------------+------------------------------------------
 
 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
 
 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
 
 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.
 
 
 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 :