Esempio n. 1
0
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);
}
Esempio n. 2
0
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;
}
Esempio n. 3
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;
}
Esempio n. 4
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;
}