int XisbRead (XISBuffer *b) { int ret; if (b->current >= b->end) { if (b->block_duration >= 0) { if (xf86WaitForInput (b->fd, b->block_duration) < 1) return (-1); } else { /* * automatically clear it so if XisbRead is called in a loop * the next call will make sure there is data with select and * thus prevent a blocking read */ b->block_duration = 0; } ret = xf86ReadSerial (b->fd, b->buf, b->buffer_size); switch (ret) { case 0: return (-1); /* timeout */ case -1: return (-2); /* error */ default: b->end = ret; b->current = 0; break; } } if (b->trace) ErrorF ("read 0x%02x (%c)\n", b->buf[b->current], isprint(b->buf[b->current])?b->buf[b->current]:'.'); return (b->buf[b->current++]); }
/* *************************************************************************** * * xf86EloGetPacket -- * Read a packet from the port. Try to synchronize with start of * packet and compute checksum. * The packet structure read by this function is as follow: * Byte 0 : ELO_SYNC_BYTE * Byte 1 * ... * Byte 8 : packet data * Byte 9 : checksum of bytes 0 to 8 * * This function returns if a valid packet has been assembled in * buffer or if no more data is available. * * Returns Success if a packet is successfully assembled including * testing checksum. If a packet checksum is incorrect, it is discarded. * Bytes preceding the ELO_SYNC_BYTE are also discarded. * Returns !Success if out of data while reading. The start of the * partially assembled packet is left in buffer, buffer_p and * checksum reflect the current state of assembly. * *************************************************************************** */ static Bool xf86EloGetPacket(unsigned char *buffer, int *buffer_p, int *checksum, int fd) { int num_bytes; int readable; Bool ok; DBG(4, ErrorF("Entering xf86EloGetPacket with checksum == %d and buffer_p == %d\n", *checksum, *buffer_p)); /* * Check if there is any data on the serial port to read. */ if ((readable = xf86WaitForInput(fd, 0)) < 0) { Error("System error while checking Elographics touchscreen for available data."); return !Success; } else if (readable == 0) { return !Success; } /* * Try to read enough bytes to fill up the packet buffer. */ DBG(4, ErrorF("buffer_p is %d, Trying to read %d bytes from link\n", *buffer_p, ELO_PACKET_SIZE - *buffer_p)); SYSCALL(num_bytes = read(fd, (char *) (buffer + *buffer_p), ELO_PACKET_SIZE - *buffer_p)); /* * Okay, give up. */ if (num_bytes < 0) { Error("System error while reading from Elographics touchscreen."); return !Success; } DBG(4, ErrorF("Read %d bytes\n", num_bytes)); while (num_bytes) { /* * Sync with the start of a packet. */ if ((*buffer_p == 0) && (buffer[0] != ELO_SYNC_BYTE)) { /* * No match, shift data one byte toward the start of the buffer. */ ErrorF("Elographics: Dropping one byte in an attempt to synchronize: '%c' 0x%X\n", buffer[0], buffer[0]); memcpy(&buffer[0], &buffer[1], num_bytes-1); } else { /* * Compute checksum in assembly buffer. */ if (*buffer_p < ELO_PACKET_SIZE-1) { *checksum = *checksum + buffer[*buffer_p]; *checksum = *checksum % 256; DBG(4, ErrorF(" 0x%X-->0x%X ", buffer[*buffer_p], *checksum)); } (*buffer_p)++; } num_bytes--; } if (*buffer_p == ELO_PACKET_SIZE) { /* * Got a packet, validate checksum and reset state. */ ok = (*checksum == buffer[ELO_PACKET_SIZE-1]); DBG(3, ErrorF("Expecting checksum %d, got %d\n", *checksum, buffer[ELO_PACKET_SIZE-1])); *checksum = ELO_INIT_CHECKSUM; *buffer_p = 0; if (!ok) { ErrorF("Checksum error on Elographics touchscreen link\n"); return !Success; } /* * Valid packet received report it. */ return Success; } else { return !Success; } }