X-Git-Url: https://git.llucax.com/z.facultad/66.09/etherled.git/blobdiff_plain/6add33161e732ed834469f217a7ba97200694d63..d6c5f7cf0e7f53c9251477b092e8b208a313e928:/src/main.c?ds=sidebyside diff --git a/src/main.c b/src/main.c index f980df1..9714789 100644 --- a/src/main.c +++ b/src/main.c @@ -7,6 +7,7 @@ #include "eth.h" #include "ip.h" #include "udp.h" +#include "elp.h" void main(void) { @@ -26,7 +27,7 @@ void main(void) // Comienza a 'dibujar' EA = 1; // Habilita interrupciones globalmente - TR2 = 1; // Pone a correr el 'dibujado' + ET2 = 1; // Pone a correr el 'dibujado' // Inicializo IP ip_addr_local[0] = 10; @@ -35,24 +36,20 @@ void main(void) ip_addr_local[3] = 100; // Inicializo puerto UDP - udp_port_local = 9876; + udp_port_local = ELP_PORT; while (1) // Forever { - byte i; //XXX - byte len; - - len = netdev_recv_start(); + byte len = netdev_recv_start(); + //printb(len, 0x10); if (!len) // no recibimos nada (válido) continue; // Probamos de nuevo // Tenemos algo! - //print(0x2); // Parseamos cabecera ethernet if (!eth_read_frame_header()) // No es un buen header goto drop; // Tiramos el paquete - //print(0x4); // Vemos que protocolo transporta switch (eth_proto) @@ -61,11 +58,9 @@ void main(void) goto drop; // Tiramos el paquete case ETH_IP: - //print(0x8); // Parseamos cabecera IP if (!ip_read_packet_header()) // No es un buen header goto drop; // Tiramos el paquete - //print(0x10); // Vemos que protocolo transporta switch (ip_proto) @@ -74,37 +69,44 @@ void main(void) goto drop; // Tiramos el paquete case IP_UDP: - //print(0x20); // Parseamos cabecera UDP if (!udp_read_dgram_header()) // No es un buen header goto drop; // Tiramos el paquete - //printb(udp_dgram_len, 0x40); - // TODO - // Nuestro protocolo, por ahora un simple echo! - len = udp_dgram_len - UDP_HEADER_SIZE; - netdev_read_start(len); - leds_matrix_len = len; - for (i = 0; i < len; ++i) - leds_matrix[i] = udp_read_byte(); - netdev_read_end(); + // Procesamos comando ELP y obtenemos tamaño de la + // respuesta + len = elp_read_process_command(); + //printb(len, 0x02); + + // Si el tamaño es 0, hubo error o no está soportado + if (!len) + goto drop; + //print(0x0004); + + // FIXME por ahora no tenemos forma de 'abortar' el + // comando si el checksum es incorrecto, lo verificamos + // por deporte. if (!udp_checksum_ok()) goto drop; + //print(0x0008); + + // Terminamos recepción netdev_recv_end(); + //print(0x0010); // Respuesta netdev_send_start(); eth_write_frame_header(); - //udp_dgram_len = UDP_HEADER_SIZE+len; - //ip_packet_len = IP_HEADER_SIZE+udp_dgram_len; + ip_packet_len = UDP_HEADER_SIZE + len; + //printb(ip_packet_len, 0x20); ip_write_packet_header(); + udp_dgram_len = len; + //printb(udp_dgram_len, 0x40); udp_write_dgram_header(); - netdev_write_start(len); - for (i = 0; i < len; ++i) - udp_write_byte(leds_matrix[i]); - netdev_write_end(); - udp_write_checksum(ETH_HEADER_SIZE+IP_HEADER_SIZE); - netdev_send_end(ETH_HEADER_SIZE+IP_HEADER_SIZE+udp_dgram_len); + elp_write_response(); + udp_write_checksum(ETH_HEADER_SIZE + IP_HEADER_SIZE); + netdev_send_end(ETH_HEADER_SIZE + IP_HEADER_SIZE + + UDP_HEADER_SIZE + len); } } continue;