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 // Si es un SET lo proceso
22 switch (elp_command.var)
25 // Si es GET, sólo calculamos tamaño de respuesta
27 return 0; // En este caso no tiene sentido un GET
28 // Si es SET procesamos (apagamos las luces y nos vamos a dormir)
29 leds_write(0x0000); // Apago leds
30 EA = 0; // Ignoramos interrupciones (por si el micro no soporta PD)
31 PCON = 0x02; // Bit PD (Power Down) prendido
32 while (1); // Nos negamos a seguir trabajando ( " )
33 // FIXME: No es del todo elegante esto, porque nunca vamos a
34 // responder el paquete
37 // Si es GET, sólo calculamos tamaño de respuesta
39 // Vamos a devolver la matriz (2 bytes por columna) y su tamaño
40 return len + sizeof(leds_matrix_len) + leds_matrix_len * 2;
41 // Si es SET procesamos
42 netdev_read_start(sizeof(leds_matrix_len)); // tamaño
45 // Verifico cantidad de columnas
46 if ((i < LEDS_MIN_COLS) || (i > LEDS_MAX_COLS))
49 netdev_read_start(leds_matrix_len * 2); // matriz
50 for (i = 0; i < leds_matrix_len; ++i)
52 byte low = udp_read_byte();
53 leds_matrix[i] = WORD(udp_read_byte(), low);
56 leds_delay_update(); // Seteamos un delay bueno
60 // Si es GET, sólo calculamos tamaño de respuesta
62 return len + 1 /* booleano de 1 byte */;
63 // Si es SET procesamos
64 netdev_read_start(1); // booleano de 1 byte
65 if (udp_read_byte() == 0x00) // si viene 0 reanuda
70 leds_write(0x0000); // Si pausa apaga leds
76 // Si es GET, sólo calculamos tamaño de respuesta
78 return len + LEDS_DELAY_SIZE;
79 // Si es SET procesamos
80 netdev_read_start(LEDS_DELAY_SIZE);
81 leds_delay_set(udp_read_byte());
91 void elp_write_response()
94 // Escribimos cabecera
95 netdev_write_start(ELP_HEADER_SIZE);
96 // Escribimos el bitfield a lo guapo como un byte.
97 udp_write_byte(*((byte*) &elp_command));
99 // Si era un SET acá termino nuestro trabajo, nunca tiene datos
102 // Si era un GET escribimos lo que nos pidieron
103 switch (elp_command.var)
106 // Transferimos tamaño (1 byte) + matriz (2 bytes por columna)
107 netdev_write_start(sizeof(leds_matrix_len) + leds_matrix_len * 2);
108 udp_write_byte(leds_matrix_len);
109 for (i = 0; i < leds_matrix_len; ++i)
111 udp_write_byte(LOW(leds_matrix[i]));
112 udp_write_byte(HIGH(leds_matrix[i]));
118 netdev_write_start(1 /* booleano de 1 byte */);
119 udp_write_byte(!ET2);
124 netdev_write_start(LEDS_DELAY_SIZE);
125 udp_write_byte(leds_delay_get());