-petherled - Protocolo de comunicación del dispositivo etherled
-==============================================================
+ELP - Etherled Protocol (protocolo de comunicación del dispositivo etherled)
+============================================================================
Objetivo
------------
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 que se utiliza para saber a que paquete pertenece una respuesta (ACK).
-Para control de errores se utiliza por un lado un bit de paridad en la cabecera
-y por otro un CRC para los datos (de haber).
+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).
--------
La cabecera está compuesta por los siguientes campos:
-+-----+---------------+---------------+-----+
-| GS | VAR | ID | PAR |
-+-----+---------------+---------------+-----+
-/- 1 -/--- 3 bits ----/--- 3 bits ----/- 1 -/
++-----+--------------------+---------------+
+| GS | VAR | ID |
++-----+--------------------+---------------+
+/- 1 -/------ 4 bits ------/--- 3 bits ----/
GS:
Este bit indica si la operación es GET (0) o SET (1).
VAR:
- Es un número de 0 a 7 que indica la variable sobre la cual se está
+ Es un número de 0 a 15 que indica la variable sobre la cual se está
operando. Ver sección Variables Definidas.
ID:
variables y GET y SET, se tendría una cantidad de indentificadores
efectivos de 8 bits completo (256 posibilidades).
-PAR:
- Es un bit que indica la paridad (par) de la cabecera, utilizado para
- control de errores.
DATOS
-----
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).
-Para control de errores los datos finalizan con un CRC.
-+--------------------------------+----------------+
-| DATOS | CRC |
-+--------------------------------+----------------+
-/---------- 0-63 bytes ----------/---- 1 byte ----/
-
-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 sólo en los datos (no en las cabeceras, que utilizan
-el bit de paridad). 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
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 | DRAW | Prendido/apagado | 1 byte con conteniendo 0xFF para prender
+ | | del dibujado | o con 0x00 para apagar
----+-------------+------------------+------------------------------------------
El resto de las variables quedan para futuras extensiones.
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 7 6 5 4 3 2 1 0 filas
-7 o---o---o---o---o---o---o---o 0 o---o---o---o---o---o---o---o
- | | | | | | | | | | | | | | | |
-6 o---o---o---o---o---o---o---o 1 o---o---o---o---o---o---o---o
- | | | | | | | | | | | | | | | |
-5 o---o---o---o---o---o---o---o 2 o---o---o---o---o---o---o---o
- | | | | | | | | | | | | | | | |
-4 o---o---o---o---o---o---o---o 3 o---o---o---o---o---o---o---o
- | | | | | | | | =====> | | | | | | | |
-3 o---o---o---o---o---o---o---o 4 o---o---o---o---o---o---o---o
- | | | | | | | | | | | | | | | |
-2 o---o---o---o---o---o---o---o 5 o---o---o---o---o---o---o---o
- | | | | | | | | | | | | | | | |
-1 o---o---o---o---o---o---o---o 6 o---o---o---o---o---o---o---o
- | | | | | | | | | | | | | | | |
-0 o---o---o---o---o---o---o---o 7 o---o---o---o---o---o---o---o
-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
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 | H(col0)L(col0)..H(colN)L(colN) | CRC |
-+----------------+--------------------------------+----------------+
-/---- 1 byte ----/---------- 0-62 bytes ----------/---- 1 byte ----/
++----------------+------------------------------------------------+
+| 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 :