X-Git-Url: https://git.llucax.com/z.facultad/66.09/etherled.git/blobdiff_plain/f0f474d63aaf8201f50ad2903565ddae1a673298..f19e1e709f98c38cc5454339e58a0b13ba3cfbe0:/doc/protocolo.txt?ds=sidebyside diff --git a/doc/protocolo.txt b/doc/protocolo.txt index 016f27b..66ff69f 100644 --- a/doc/protocolo.txt +++ b/doc/protocolo.txt @@ -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,32 @@ 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 EPL +----------- -+----------------+--------------------------------+----------------+ -| Cabecera | Datos (opcional) | CRC | -+----------------+--------------------------------+----------------+ -/---- 1 byte ----/---------- 0-64 bytes ----------/---- 1 byte ----/ ++----------------+--------------------------------+ +| CABECERA | DATOS (opcional) | ++----------------+--------------------------------+ +/---- 1 byte ----/---------- 0-64 bytes ----------/ -Cabecera +CABECERA -------- La cabecera está compuesta por los siguientes campos: +-----+--------------------+---------------+ -| GS | Variable | Identificador | +| 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 +77,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 +96,16 @@ 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. @@ -118,40 +118,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 +208,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 :