void testUsingDeviceFile(const char* deviceFile) { printf("Testing communications using device-file %s\n", deviceFile); int fd = configuredDescriptor(deviceFile); FRGarminPacketRef requestInfo = FRGarminPacketCreateFromData(Pid_Product_Rqst, NULL, 0); writeSerialPacket(fd, requestInfo, 1); FRGarminPacketRef ackPacket = readSerialPacket(fd); printf("Response packet: %s\n", ackPacket->typeID == FR_ACK ? "Acknowledged." : "NotACK!"); FRGarminPacketDestroy(ackPacket); FRGarminPacketRef infoPacket = readSerialPacket(fd); printf("Received %i bytes in infoPacket\n", (int)infoPacket->dataSize); printf("Device ID: %s\n", infoPacket->data+4); FRGarminPacketDestroy(ackPacket); finishDescriptor(fd); }
static int nextSerialPacket (BrailleDisplay *brl, unsigned char code, unsigned char *buffer, int size, int wait) { int length; if (wait) if (!awaitBrailleInput(brl, SERIAL_WAIT_TIMEOUT)) return 0; while ((length = readSerialPacket(brl, buffer, size))) { if (buffer[0] == code) return length; logUnexpectedPacket(buffer, length); } return 0; }
static int nextSerialPacket (unsigned char code, unsigned char *buffer, int size, int wait) { int length; if (wait) if (!gioAwaitInput(gioEndpoint, SERIAL_WAIT_TIMEOUT)) return 0; while ((length = readSerialPacket(buffer, size))) { if (buffer[0] == code) return length; logUnexpectedPacket(buffer, length); } return 0; }
int initDV3K(int fd, int hwReset) { struct dv3k_packet responsePacket; char prodId[17]; char version[49]; struct dv3k_packet ctrlPacket = { .start_byte = DV3K_START_BYTE, .header.packet_type = DV3K_TYPE_CONTROL, .header.payload_length = htons(1), .payload.ctrl.field_id = DV3K_CONTROL_RESET }; if(hwReset == 1) { if(hardwareReset() == 0) return 0; } else { if(write(fd, &ctrlPacket, dv3k_packet_size(ctrlPacket)) == -1) { fprintf(stderr, "AMBEserver: error writing reset packet: %s\n", strerror(errno)); return 0; } } if(readSerialPacket(fd, &responsePacket) == 0) { fprintf(stderr, "AMBEserver: error receiving response to reset\n"); return 0; } if(checkResponse(&responsePacket, DV3K_CONTROL_READY) == 0) { fprintf(stderr, "AMBEserver: invalid response to reset\n"); return 0; } ctrlPacket.payload.ctrl.field_id = DV3K_CONTROL_PRODID; if(write(fd, &ctrlPacket, dv3k_packet_size(ctrlPacket)) == -1) { fprintf(stderr, "AMBEserver: error writing product id packet: %s\n", strerror(errno)); return 0; } if(readSerialPacket(fd, &responsePacket) == 0) { fprintf(stderr, "AMBEserver: error receiving response to product id request\n"); return 0; } if(checkResponse(&responsePacket, DV3K_CONTROL_PRODID) == 0) { fprintf(stderr, "AMBEserver: invalid response to product id query\n"); dump("ProdID Response:", &responsePacket, sizeof(responsePacket)); return 0; } strncpy(prodId, responsePacket.payload.ctrl.data.prodid, sizeof(prodId)); ctrlPacket.payload.ctrl.field_id = DV3K_CONTROL_VERSTRING; if(write(fd, &ctrlPacket, dv3k_packet_size(ctrlPacket)) == -1) { fprintf(stderr, "AMBEserver: error writing version packet: %s\n", strerror(errno)); return 0; } if(readSerialPacket(fd, &responsePacket) == 0) { fprintf(stderr, "AMBEserver: error receiving response to version request\n"); return 0; } if(checkResponse(&responsePacket, DV3K_CONTROL_VERSTRING) == 0) { fprintf(stderr, "AMBEserver: invalid response to version query\n"); return 0; } strncpy(version, responsePacket.payload.ctrl.data.version, sizeof(version)); fprintf(stdout, "AMBEserver: Initialized %s version %s.\n", prodId, version); return 1; } int openSerial(char *ttyname, long baud) { struct termios tty; int fd; ssize_t bytesWritten; fd = open(ttyname, O_RDWR | O_NOCTTY | O_SYNC); if (fd < 0) { fprintf(stderr, "AMBEserver: error when opening %s: %s\n", ttyname, strerror(errno)); return fd; } if (tcgetattr(fd, &tty) != 0) { fprintf(stderr, "AMBEserver tcgetattr: %s\n", strerror(errno)); return -1; } if(debug) fprintf(stderr, "Baud %ld\n", baud); // Input speed = output speed cfsetispeed(&tty, B0); switch(baud) { case 230400: cfsetospeed(&tty, B230400); break; case 460800: cfsetospeed(&tty, B460800); break; default: fprintf(stderr, "AMBEserver: unsupported baud rate %ld\n", baud); return -1; } tty.c_lflag &= ~(ECHO | ECHOE | ICANON | IEXTEN | ISIG); tty.c_iflag &= ~(BRKINT | ICRNL | INPCK | ISTRIP | IXON | IXOFF | IXANY); tty.c_cflag &= ~(CSIZE | CSTOPB | PARENB); tty.c_cflag |= CS8 | CRTSCTS; tty.c_oflag &= ~(OPOST); tty.c_cc[VMIN] = 0; tty.c_cc[VTIME] = 1; if (tcsetattr(fd, TCSANOW, &tty) != 0) { fprintf(stderr, "AMBEserver: tcsetattr: %s\n", strerror(errno)); return -1; } if (debug) fprintf(stdout, "opened %s %ld\n", ttyname, baud); return fd; } int openSocket(in_port_t port) { struct sockaddr_in sa = { 0 }; int fd; fd = socket(AF_INET, SOCK_DGRAM, 0); if (fd < 0) { fprintf(stderr, "AMBEserver: error when creating the socket: %s\n", strerror(errno)); return fd; } sa.sin_family = AF_INET; sa.sin_port = htons(port); sa.sin_addr.s_addr = htonl(INADDR_ANY); if (bind(fd, (struct sockaddr *) &sa, sizeof(sa)) < 0) { fprintf(stderr, "AMBEserver: error when binding the socket to port %u: %s\n", port, strerror(errno)); return -1; } if (debug) fprintf(stdout, "opened the UDP socket on port %u\n", port); return fd; } int processSerial(int sockFd, int serialFd) { struct dv3k_packet packet; if(readSerialPacket(serialFd, &packet) == 0) { fprintf(stderr, "AMBEserver: processSerial failed to read packet\n"); return 0; } if (debug) dump("Serial data", &packet, dv3k_packet_size(packet)); if (sa.sin_port != 0U) if (sendto(sockFd, &packet, dv3k_packet_size(packet), 0, (struct sockaddr *)&sa, sizeof(struct sockaddr_in)) != dv3k_packet_size(packet)) { fprintf(stderr, "AMBEserver: error when writing to the socket: %s\n", strerror(errno)); return 0; } return 1; } int processSocket(int sockFd, int serialFd) { socklen_t addrLen = sizeof(struct sockaddr_in); ssize_t bytesRead; struct dv3k_packet packet; bytesRead = recvfrom(sockFd, &packet, sizeof(packet), 0, (struct sockaddr *) &sa, &addrLen); if (bytesRead < 0) { fprintf(stderr, "AMBEserver: error when reading from the socket: %s\n", strerror(errno)); return 0; } if (debug) dump("Socket data", &packet, bytesRead); if (packet.start_byte != DV3K_START_BYTE) { fprintf(stderr, "AMBEserver: invalid start byte when reading from the socket, 0x%02X", packet.start_byte); return 1; } if (bytesRead != dv3k_packet_size(packet)) { fprintf(stderr, "AMBEserver: invalid length when reading from the socket, %zd=%zd", bytesRead, dv3k_packet_size(packet)); return 1; } if (write(serialFd, &packet, dv3k_packet_size(packet)) != dv3k_packet_size(packet)) { fprintf(stderr, "AMBEserver: error when writing to the serial port: %s\n", strerror(errno)); return 0; } return 1; }