Example #1
0
uart_input::uart_input()
{
    conf = Global.uart_conf;

    if (sp_get_port_by_name(conf.port.c_str(), &port) != SP_OK)
        throw std::runtime_error("uart: cannot find specified port");

    if (sp_open(port, SP_MODE_READ_WRITE) != SP_OK)
        throw std::runtime_error("uart: cannot open port");

	sp_port_config *config;

    if (sp_new_config(&config) != SP_OK ||
		sp_set_config_baudrate(config, conf.baud) != SP_OK ||
		sp_set_config_flowcontrol(config, SP_FLOWCONTROL_NONE) != SP_OK ||
		sp_set_config_bits(config, 8) != SP_OK ||
		sp_set_config_stopbits(config, 1) != SP_OK ||
		sp_set_config_parity(config, SP_PARITY_NONE) != SP_OK ||
		sp_set_config(port, config) != SP_OK)
        throw std::runtime_error("uart: cannot set config");

	sp_free_config(config);

    if (sp_flush(port, SP_BUF_BOTH) != SP_OK)
        throw std::runtime_error("uart: cannot flush");

    old_packet.fill(0);
    last_update = std::chrono::high_resolution_clock::now();
}
Example #2
0
int get_serial_adapter(struct sp_port **my_port, struct sp_port_config *my_port_config) {

  int ret;

  // Get pointer to port
  char port_name[] = "/dev/ttyAMA0";

  ret = sp_get_port_by_name(port_name, my_port);
  if (ret != SP_OK) {
    printf("Failed to get port: %s.  Exiting now.\n",port_name);
    return 0;
  }

  // Open port
  ret = sp_open((*my_port), SP_MODE_READ_WRITE);
  if (ret == SP_OK) {
    printf("Successfully opened port!\n");
  } else {
    printf("Failed to open port :(\n");
    sp_free_port(*my_port);
    return 0;
  }

  // Initialize port config
  ret = sp_new_config(&my_port_config);
  if (ret != SP_OK) {
    printf("Failed to initialize port config.\n");
    sp_free_port(*my_port);
    return 0;
  }

  return 1;
}
Example #3
0
/**
 * Open the specified serial port.
 *
 * @param serial Previously initialized serial port structure.
 * @param flags Flags to use when opening the serial port. Possible flags
 *              include SERIAL_RDWR, SERIAL_RDONLY, SERIAL_NONBLOCK.
 *
 * If the serial structure contains a serialcomm string, it will be
 * passed to serial_set_paramstr() after the port is opened.
 *
 * @return SR_OK on success, SR_ERR on failure.
 */
SR_PRIV int serial_open(struct sr_serial_dev_inst *serial, int flags)
{
	int ret;
	char *error;
	int sp_flags = 0;

	if (!serial) {
		sr_dbg("Invalid serial port.");
		return SR_ERR;
	}

	sr_spew("Opening serial port '%s' (flags %d).", serial->port, flags);

	sp_get_port_by_name(serial->port, &serial->data);

	if (flags & SERIAL_RDWR)
		sp_flags = (SP_MODE_READ | SP_MODE_WRITE);
	else if (flags & SERIAL_RDONLY)
		sp_flags = SP_MODE_READ;

	serial->nonblocking = (flags & SERIAL_NONBLOCK) ? 1 : 0;

	ret = sp_open(serial->data, sp_flags);

	switch (ret) {
	case SP_ERR_ARG:
		sr_err("Attempt to open serial port with invalid parameters.");
		return SR_ERR_ARG;
	case SP_ERR_FAIL:
		error = sp_last_error_message();
		sr_err("Error opening port: %s.", error);
		sp_free_error_message(error);
		return SR_ERR;
	}

#ifndef _WIN32
	sp_get_port_handle(serial->data, &serial->fd);
#endif

	if (serial->serialcomm)
		return serial_set_paramstr(serial, serial->serialcomm);
	else
		return SR_OK;
}
Example #4
0
int navilink_open_device_from_name(const char* serial_port_name, NavilinkDevice* device)
{
  assert(serial_port_name != NULL);
  assert(serial_port_name != NULL);

  struct sp_port* port = NULL;
  enum sp_return result = sp_get_port_by_name(serial_port_name, &port);
  if (result < 0) {
    goto serial_error;
  }

  result = navilink_open_sp_port(port, device);
  if (result < 0) {
    goto serial_error;
  }
  return 0;
serial_error:
  CATCH_LIBSERIAL_ERROR(device);
  return -1;
}
int Arduino_connect(const char *serialPortName, int baudrate)
{
    struct sp_port_config *serialPortConfiguration;
    enum sp_return r;

    if(serialPort) sp_free_port(serialPort);

    // Find the specified serial port
    if(sp_get_port_by_name(serialPortName, &serialPort) != SP_OK)
    {
        fprintf(stderr, "Cannot find the serial port\n");
        return 0;
    }

    // Open the serial port
    if(sp_open(serialPort, SP_MODE_READ_WRITE) != SP_OK)
    {
        fprintf(stderr, "Cannot open the serial port\n");
        return 0;
    }

    // Configure the serial port
    sp_new_config(&serialPortConfiguration);
    sp_set_config_baudrate(serialPortConfiguration, 9600);
    sp_set_config_parity(serialPortConfiguration, SP_PARITY_NONE);
    sp_set_config_bits(serialPortConfiguration, 8);
    sp_set_config_stopbits(serialPortConfiguration, 1);
    sp_set_config_flowcontrol(serialPortConfiguration, SP_FLOWCONTROL_NONE);

    if(sp_set_config(serialPort, serialPortConfiguration) != SP_OK)
    {
        fprintf(stderr, "Cannot configure the serial port\n");
        return 0;
    }

    sp_free_config(serialPortConfiguration);

    return 1;
}
Example #6
0
int serial_open(struct serial_device_t *serial, int flags)
{
  if (!serial) {
    log_error("serial_open: invalid serial port device.");
    return -DEVICE_CONN_ERROR;
  }
  log_info("serial_open: opening serial port '%s' (flags %d).",
           serial->port, flags);
  sp_get_port_by_name(serial->port, &serial->data);
  int ret = sp_open(serial->data, flags);
  char *error;
  switch (ret) {
  case SP_ERR_ARG:
    log_error("serial_open: invalid serial port parameters.");
    return -DEVICE_CONF_ERROR;
  case SP_ERR_FAIL:
    error = sp_last_error_message();
    log_error("serial_open: error opening serial port (%d): %s.",
              sp_last_error_code(), error);
    sp_free_error_message(error);
    return -DEVICE_CONN_ERROR;
  }
  return NO_ERROR;
}
Example #7
0
/**
 * Open the specified serial port.
 *
 * @param serial Previously initialized serial port structure.
 * @param flags Flags to use when opening the serial port. Possible flags
 *              include SERIAL_RDWR, SERIAL_RDONLY, SERIAL_NONBLOCK.
 *
 * If the serial structure contains a serialcomm string, it will be
 * passed to serial_set_paramstr() after the port is opened.
 *
 * @return SR_OK on success, SR_ERR on failure.
 */
SR_PRIV int serial_open(struct sr_serial_dev_inst *serial, int flags)
{
	int ret;
	char *error;

	if (!serial) {
		sr_dbg("Invalid serial port.");
		return SR_ERR;
	}

	sr_spew("Opening serial port '%s' (flags %d).", serial->port, flags);

	sp_get_port_by_name(serial->port, &serial->data);

	ret = sp_open(serial->data, flags);

	switch (ret) {
	case SP_ERR_ARG:
		sr_err("Attempt to open serial port with invalid parameters.");
		return SR_ERR_ARG;
	case SP_ERR_FAIL:
		error = sp_last_error_message();
		sr_err("Error opening port: %s.", error);
		sp_free_error_message(error);
		return SR_ERR;
	}

#ifndef _WIN32
	serial->fd = serial->data->fd;
#endif

	if (serial->serialcomm)
		return serial_set_paramstr(serial, serial->serialcomm);
	else
		return SR_OK;
}
Example #8
0
int main(int argc, char **argv)
{
  int opt;
  int result = 0;

  sbp_state_t s;

  if (argc <= 1) {
    usage(argv[0]);
    exit(EXIT_FAILURE);
  }

  while ((opt = getopt(argc, argv, "p:")) != -1) {
    switch (opt) {
    case 'p':
      serial_port_name = (char *)calloc(strlen(optarg) + 1, sizeof(char));
      if (!serial_port_name) {
        fprintf(stderr, "Cannot allocate memory!\n");
        exit(EXIT_FAILURE);
      }
      strcpy(serial_port_name, optarg);
      break;
    case 'h':
      usage(argv[0]);
      exit(EXIT_FAILURE);
    }
  }

  if (!serial_port_name) {
    fprintf(stderr, "Please supply the serial port path where the Piksi is " \
            "connected!\n");
    exit(EXIT_FAILURE);
  }

  result = sp_get_port_by_name(serial_port_name, &piksi_port);
  if (result != SP_OK) {
    fprintf(stderr, "Cannot find provided serial port!\n");
    exit(EXIT_FAILURE);
  }

  result = sp_open(piksi_port, SP_MODE_READ);
  if (result != SP_OK) {
    fprintf(stderr, "Cannot open %s for reading!\n", serial_port_name);
    exit(EXIT_FAILURE);
  }

  setup_port();

  sbp_state_init(&s);
  #if 0

  /* Register a node and callback, and associate them with a specific message ID. */
  sbp_register_callback(&s, SBP_MSG_HEARTBEAT, &hearbeat_callback, NULL,
                        &heartbeat_callback_node);
  sbp_register_callback(&s, SBP_MSG_GPS_TIME, &sbp_gps_time_callback,
                        NULL, &gps_time_node);
  sbp_register_callback(&s, SBP_MSG_POS_LLH, &sbp_pos_llh_callback,
                        NULL, &pos_llh_node);
  sbp_register_callback(&s, SBP_MSG_BASELINE_NED, &sbp_baseline_ned_callback,
                        NULL, &baseline_ned_node);
  sbp_register_callback(&s, SBP_MSG_VEL_NED, &sbp_vel_ned_callback,
                        NULL, &vel_ned_node);
  sbp_register_callback(&s, SBP_MSG_DOPS, &sbp_dops_callback,
                        NULL, &dops_node);

  /* Use sprintf to right justify floating point prints. */
  char rj[30];
  /* Only want 1 call to SH_SendString as semihosting is quite slow.
   * sprintf everything to this array and then print using array. */
  char str[1000];
  int str_i;
#endif
  while (1) {
    // sbp_process(&s, &piksi_port_read);

    sleep(1);
    fprintf(stdout, "hello\n");
    
    #if 0
    str_i = 0;
    memset(str, 0, sizeof(str));

    str_i += sprintf(str + str_i, "\n\n\n\n");

    /* Print GPS time. */
    str_i += sprintf(str + str_i, "GPS Time:\n");
    str_i += sprintf(str + str_i, "\tWeek\t\t: %6d\n", (int)gps_time.wn);
    sprintf(rj, "%6.2f", ((float)gps_time.tow) / 1e3);
    str_i += sprintf(str + str_i, "\tSeconds\t: %9s\n", rj);
    str_i += sprintf(str + str_i, "\n");

    /* Print absolute position. */
    str_i += sprintf(str + str_i, "Absolute Position:\n");
    sprintf(rj, "%4.10lf", pos_llh.lat);
    str_i += sprintf(str + str_i, "\tLatitude\t: %17s\n", rj);
    sprintf(rj, "%4.10lf", pos_llh.lon);
    str_i += sprintf(str + str_i, "\tLongitude\t: %17s\n", rj);
    sprintf(rj, "%4.10lf", pos_llh.height);
    str_i += sprintf(str + str_i, "\tHeight\t: %17s\n", rj);
    str_i += sprintf(str + str_i, "\tSatellites\t:     %02d\n", pos_llh.n_sats);
    str_i += sprintf(str + str_i, "\n");

    /* Print NED (North/East/Down) baseline (position vector from base to rover). */
    str_i += sprintf(str + str_i, "Baseline (mm):\n");
    str_i += sprintf(str + str_i, "\tNorth\t\t: %6d\n", (int)baseline_ned.n);
    str_i += sprintf(str + str_i, "\tEast\t\t: %6d\n", (int)baseline_ned.e);
    str_i += sprintf(str + str_i, "\tDown\t\t: %6d\n", (int)baseline_ned.d);
    str_i += sprintf(str + str_i, "\n");

    /* Print NED velocity. */
    str_i += sprintf(str + str_i, "Velocity (mm/s):\n");
    str_i += sprintf(str + str_i, "\tNorth\t\t: %6d\n", (int)vel_ned.n);
    str_i += sprintf(str + str_i, "\tEast\t\t: %6d\n", (int)vel_ned.e);
    str_i += sprintf(str + str_i, "\tDown\t\t: %6d\n", (int)vel_ned.d);
    str_i += sprintf(str + str_i, "\n");

    /* Print Dilution of Precision metrics. */
    str_i += sprintf(str + str_i, "Dilution of Precision:\n");
    sprintf(rj, "%4.2f", ((float)dops.gdop / 100));
    str_i += sprintf(str + str_i, "\tGDOP\t\t: %7s\n", rj);
    sprintf(rj, "%4.2f", ((float)dops.hdop / 100));
    str_i += sprintf(str + str_i, "\tHDOP\t\t: %7s\n", rj);
    sprintf(rj, "%4.2f", ((float)dops.pdop / 100));
    str_i += sprintf(str + str_i, "\tPDOP\t\t: %7s\n", rj);
    sprintf(rj, "%4.2f", ((float)dops.tdop / 100));
    str_i += sprintf(str + str_i, "\tTDOP\t\t: %7s\n", rj);
    sprintf(rj, "%4.2f", ((float)dops.vdop / 100));
    str_i += sprintf(str + str_i, "\tVDOP\t\t: %7s\n", rj);
    str_i += sprintf(str + str_i, "\n");
    #endif
  }

  result = sp_close(piksi_port);
  if (result != SP_OK) {
    fprintf(stderr, "Cannot close %s properly!\n", serial_port_name);
  }

  sp_free_port(piksi_port);

  free(serial_port_name);

  return 0;
}