123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157 |
- /*
- * Network HID library
- * Very simple network program that reads for HID codes
- * and forwards them to the HID fifo (after some parsing in case of an escape character)
- */
- // uses wiz5500.c
- // uses hidfifo.c
- // Port for network bootloader
- #define NETHID_PORT 3222
- // Socket to listen to (0-7)
- #define NETHID_SOCKET 7
- word NETHID_isInitialized = 0;
- // Buffer to read the RX buffer from W5500
- char NETHID_rxBuf[WIZNET_MAX_RBUF];
- // Handle session for socket s
- // Data can contain multiple buffered inputs
- void NETHID_handleSession(word s)
- {
- // Size of received data
- // Double check to reduce error rate
- word rsize = 0;
- word rsizeValidate = 0;
- do {
- rsize = wiz_get_sock_reg_16(s, WIZNET_SnRX_RSR);
- if (rsize != 0)
- {
- // twice on purpose
- rsizeValidate = wiz_get_sock_reg_16(s, WIZNET_SnRX_RSR);
- rsizeValidate = wiz_get_sock_reg_16(s, WIZNET_SnRX_RSR);
- }
- }
- while (rsize != rsizeValidate);
- if (rsize == 0)
- {
- // ignore, probably no data yet
- return;
- }
- // receive data
- wiz_read_recv_data(s, NETHID_rxBuf, rsize);
- NETHID_rxBuf[rsize] = 0; //terminate
- // echo data back to confirm receive
- wiz_write_data(s, NETHID_rxBuf, rsize);
- // loop through the received data
- word isEscaped = 0;
- word ignoreThis = 0;
- word i;
- for (i = 0; i < rsize; i++)
- {
- if (ignoreThis)
- {
- ignoreThis--;
- }
- else
- {
- if (isEscaped)
- {
- isEscaped = 0;
- switch (NETHID_rxBuf[i])
- {
- case 65: // up
- HID_FifoWrite(258);
- break;
- case 66: // down
- HID_FifoWrite(259);
- break;
- case 67: // right
- HID_FifoWrite(257);
- break;
- case 68: // left
- HID_FifoWrite(256);
- break;
- }
- }
- else
- {
- // check for escape code
- if (NETHID_rxBuf[i] == 27)
- {
- ignoreThis = 1; // skip the next one
- isEscaped = 1;
- // do real escape if this is the final character in buffer
- // since we do not expect anything quickly after an escape
- if (i == rsize-1)
- {
- HID_FifoWrite(NETHID_rxBuf[i]);
- }
- }
- else if (NETHID_rxBuf[i] == 127) // backspace
- {
- HID_FifoWrite(8);
- }
- else // no parsing needed
- {
- HID_FifoWrite(NETHID_rxBuf[i]);
- }
- }
- }
- }
- }
- // Initialize netHID on socket s
- void NETHID_init(word s)
- {
- // Open socket in TCP Server mode
- wiz_init_socket_tcp_host(s, NETHID_PORT);
- NETHID_isInitialized = 1;
- }
- // Check for a change in the socket status
- // Handles change if exists
- void NETHID_loop(word s)
- {
- // Get status for socket s
- word sxStatus = wiz_get_sock_reg_8(s, WIZNET_SnSR);
- if (sxStatus == WIZNET_SOCK_CLOSED)
- {
- // Open the socket when closed
- wiz_init_socket_tcp_host(s, NETHID_PORT);
- }
- else if (sxStatus == WIZNET_SOCK_ESTABLISHED)
- {
- // Handle session when a connection is established
- NETHID_handleSession(s);
- }
- else if (sxStatus == WIZNET_SOCK_LISTEN)
- {
- // Keep on listening
- }
- else if (sxStatus == WIZNET_SOCK_SYNSENT || sxStatus == WIZNET_SOCK_SYNRECV || sxStatus == WIZNET_SOCK_FIN_WAIT || sxStatus == WIZNET_SOCK_TIME_WAIT)
- {
- // Do nothing in these cases
- }
- else
- {
- /*
- uprintln("Got unknown status:");
- uprintlnHex(sxStatus);
- */
- // In other cases, reset the socket
- wiz_init_socket_tcp_host(s, NETHID_PORT);
- }
- return;
- }
|