1 // vim: set et sw=4 sts=4 :
10 struct elp_command_t elp_command;
12 byte elp_read_process_command()
15 byte len = ELP_HEADER_SIZE;
16 netdev_read_start(ELP_HEADER_SIZE);
17 // Escribimos el bitfield a lo guapo como un byte.
18 *((byte*) &elp_command) = udp_read_byte();
21 printb(*((byte*) &elp_command), 0x01);
23 // Si es un SET lo proceso
24 switch (elp_command.var)
27 // Si es GET, sólo calculamos tamaño de respuesta
29 return 0; // En este caso no tiene sentido un GET
30 // Si es SET procesamos (apagamos las luces y nos vamos a dormir)
31 leds_write(0x0000); // Apago leds
32 EA = 0; // Ignoramos interrupciones (por si el micro no soporta PD)
33 PCON = 0x02; // Bit PD (Power Down) prendido
34 while (1); // Nos negamos a seguir trabajando ( " )
35 // FIXME: No es del todo elegante esto, porque nunca vamos a
36 // responder el paquete
39 // Si es GET, sólo calculamos tamaño de respuesta
41 // Vamos a devolver la matriz (2 bytes por columna) y su tamaño
42 return len + sizeof(leds_matrix_len) + leds_matrix_len * 2;
43 // Si es SET procesamos
44 netdev_read_start(sizeof(leds_matrix_len)); // tamaño
47 // Verifico cantidad de columnas
48 if ((LEDS_MIN_COLS < i) || (i < LEDS_MAX_COLS))
51 netdev_read_start(leds_matrix_len * 2); // matriz
52 for (i = 0; i < leds_matrix_len; ++i)
54 byte low = udp_read_byte();
55 leds_matrix[i] = WORD(udp_read_byte(), low);
58 leds_delay_update(); // Seteamos un delay bueno
62 // Si es GET, sólo calculamos tamaño de respuesta
64 return len + 1 /* booleano de 1 byte */;
65 // Si es SET procesamos
66 netdev_read_start(1); // booleano de 1 byte
67 //XXX if (udp_read_byte() == 0x00) // si viene 0 reanuda
70 if (udp_read_byte() != 0x00)
73 leds_write(0x0000); // Si pausa apaga leds
79 // Si es GET, sólo calculamos tamaño de respuesta
81 return len + sizeof(leds_delay);
82 // Si es SET procesamos
83 netdev_read_start(sizeof(leds_delay));
84 leds_delay = udp_read_byte();
94 void elp_write_response()
97 // Escribimos cabecera
98 netdev_write_start(ELP_HEADER_SIZE);
99 // Escribimos el bitfield a lo guapo como un byte.
100 udp_write_byte(*((byte*) &elp_command));
102 // Si era un SET acá termino nuestro trabajo, nunca tiene datos
105 // Si era un GET escribimos lo que nos pidieron
106 switch (elp_command.var)
109 // Transferimos tamaño (1 byte) + matriz (2 bytes por columna)
110 netdev_write_start(sizeof(leds_matrix_len) + leds_matrix_len * 2);
111 udp_write_byte(leds_matrix_len);
112 for (i = 0; i < leds_matrix_len; ++i)
114 udp_write_byte(LOW(leds_matrix[i]));
115 udp_write_byte(HIGH(leds_matrix[i]));
121 netdev_write_start(1 /* booleano de 1 byte */);
122 udp_write_byte(!TR2);
127 netdev_write_start(sizeof(leds_delay));
128 udp_write_byte(leds_delay);