Skip to content
SerialLink.cc 37.1 KiB
Newer Older
pixhawk's avatar
pixhawk committed
bool SerialLink::setBaudRateType(int rateIndex)
{
    bool reconnect = false;
    bool accepted = true; // This is changed if none of the data rates matches
    if(isConnected()) reconnect = true;
    disconnect();

    // These minimum and maximum baud rates were based on those enumerated in qportsettings.h.
#if defined(Q_OS_WIN32) || defined(Q_OS_WINCE)
    const int minBaud = (int)QPortSettings::BAUDR_110;
    const int maxBaud = (int)QPortSettings::BAUDR_921600;
    const int minBaud = (int)QPortSettings::BAUDR_50;
    const int maxBaud = (int)QPortSettings::BAUDR_921600;
#elif defined(Q_OS_UNIX) || defined(Q_OS_DARWIN)
    const int minBaud = (int)QPortSettings::BAUDR_50;
    const int maxBaud = (int)QPortSettings::BAUDR_921600;
    if (rateIndex >= minBaud && rateIndex <= maxBaud)
    {
        portSettings.setBaudRate((QPortSettings::BaudRate)rateIndex);
pixhawk's avatar
pixhawk committed
    }

    if(reconnect) connect();
    return accepted;
}

bool SerialLink::setBaudRateString(const QString& rate)
{
    bool ok;
    int intrate = rate.toInt(&ok);
    if (!ok) return false;
    return setBaudRate(intrate);
}
pixhawk's avatar
pixhawk committed

bool SerialLink::setBaudRate(int rate)
{
    bool reconnect = false;
    bool accepted = true; // This is changed if none of the data rates matches
    if(isConnected()) {
pixhawk's avatar
pixhawk committed
        reconnect = true;
    }
    // This switch-statment relies on the mapping given in qportsettings.h from the QSerialPort library.
    switch (rate) {
    // Baud rates supported only by non-Windows systems
#if defined(Q_OS_UNIX) || defined(Q_OS_LINUX) || defined(Q_OS_DARWIN)
pixhawk's avatar
pixhawk committed
    case 50:
        portSettings.setBaudRate(QPortSettings::BAUDR_50);
pixhawk's avatar
pixhawk committed
        break;
    case 75:
        portSettings.setBaudRate(QPortSettings::BAUDR_75);
pixhawk's avatar
pixhawk committed
        break;
    case 134:
        portSettings.setBaudRate(QPortSettings::BAUDR_134);
pixhawk's avatar
pixhawk committed
        break;
    case 150:
        portSettings.setBaudRate(QPortSettings::BAUDR_150);
pixhawk's avatar
pixhawk committed
        break;
    case 200:
        portSettings.setBaudRate(QPortSettings::BAUDR_200);
pixhawk's avatar
pixhawk committed
        break;
    case 1800:
        portSettings.setBaudRate(QPortSettings::BAUDR_1800);
        break;
#endif

        // Baud rates supported only by windows
#if defined(Q_OS_WIN32) || defined(Q_OS_WINCE)
    case 14400:
        portSettings.setBaudRate(QPortSettings::BAUDR_14400);
        break;
    case 56000:
        portSettings.setBaudRate(QPortSettings::BAUDR_56000);
        break;
    case 128000:
        portSettings.setBaudRate(QPortSettings::BAUDR_128000);
        break;
    case 256000:
        portSettings.setBaudRate(QPortSettings::BAUDR_256000);
        break;
        // Supported by all OSes:
    case 110:
        portSettings.setBaudRate(QPortSettings::BAUDR_110);
        break;
pixhawk's avatar
pixhawk committed
    case 300:
        portSettings.setBaudRate(QPortSettings::BAUDR_300);
pixhawk's avatar
pixhawk committed
        break;
    case 600:
        portSettings.setBaudRate(QPortSettings::BAUDR_600);
pixhawk's avatar
pixhawk committed
        break;
    case 1200:
        portSettings.setBaudRate(QPortSettings::BAUDR_1200);
pixhawk's avatar
pixhawk committed
        break;
    case 2400:
        portSettings.setBaudRate(QPortSettings::BAUDR_2400);
pixhawk's avatar
pixhawk committed
        break;
    case 4800:
        portSettings.setBaudRate(QPortSettings::BAUDR_4800);
pixhawk's avatar
pixhawk committed
        break;
    case 9600:
        portSettings.setBaudRate(QPortSettings::BAUDR_9600);
pixhawk's avatar
pixhawk committed
        break;
    case 19200:
        portSettings.setBaudRate(QPortSettings::BAUDR_19200);
pixhawk's avatar
pixhawk committed
        break;
    case 38400:
        portSettings.setBaudRate(QPortSettings::BAUDR_38400);
pixhawk's avatar
pixhawk committed
        break;
    case 57600:
        portSettings.setBaudRate(QPortSettings::BAUDR_57600);
pixhawk's avatar
pixhawk committed
        break;
    case 115200:
        portSettings.setBaudRate(QPortSettings::BAUDR_115200);
pixhawk's avatar
pixhawk committed
        break;
    case 230400:
        portSettings.setBaudRate(QPortSettings::BAUDR_230400);
        break;
    case 460800:
        portSettings.setBaudRate(QPortSettings::BAUDR_460800);
        break;
    case 500000:
        portSettings.setBaudRate(QPortSettings::BAUDR_500000);
        break;
    case 576000:
        portSettings.setBaudRate(QPortSettings::BAUDR_576000);
        break;
    case 921600:
        portSettings.setBaudRate(QPortSettings::BAUDR_921600);
        break;
pixhawk's avatar
pixhawk committed
    default:
        // If none of the above cases matches, there must be an error
        accepted = false;
        break;
    }

    if(reconnect) connect();
    return accepted;

pixhawk's avatar
pixhawk committed
}

pixhawk's avatar
pixhawk committed
    bool reconnect = false;
    bool accepted = true;
    if(isConnected()) reconnect = true;
    disconnect();
pixhawk's avatar
pixhawk committed

    switch (flow) {
    case (int)QPortSettings::FLOW_OFF:
        portSettings.setFlowControl(QPortSettings::FLOW_OFF);
pixhawk's avatar
pixhawk committed
        break;
    case (int)QPortSettings::FLOW_HARDWARE:
        portSettings.setFlowControl(QPortSettings::FLOW_HARDWARE);
pixhawk's avatar
pixhawk committed
        break;
    case (int)QPortSettings::FLOW_XONXOFF:
        portSettings.setFlowControl(QPortSettings::FLOW_XONXOFF);
pixhawk's avatar
pixhawk committed
        break;
    default:
        // If none of the above cases matches, there must be an error
        accepted = false;
        break;
    }
pixhawk's avatar
pixhawk committed
    if(reconnect) connect();
    return accepted;
}

bool SerialLink::setParityType(int parity)
{
pixhawk's avatar
pixhawk committed
    bool reconnect = false;
    bool accepted = true;
    if (isConnected()) reconnect = true;
    disconnect();
pixhawk's avatar
pixhawk committed

    switch (parity) {
    case (int)QPortSettings::PAR_NONE:
        portSettings.setParity(QPortSettings::PAR_NONE);
pixhawk's avatar
pixhawk committed
        break;
    case (int)QPortSettings::PAR_ODD:
        portSettings.setParity(QPortSettings::PAR_ODD);
pixhawk's avatar
pixhawk committed
        break;
    case (int)QPortSettings::PAR_EVEN:
        portSettings.setParity(QPortSettings::PAR_EVEN);
pixhawk's avatar
pixhawk committed
        break;
    case (int)QPortSettings::PAR_SPACE:
        portSettings.setParity(QPortSettings::PAR_SPACE);
pixhawk's avatar
pixhawk committed
        break;
    default:
        // If none of the above cases matches, there must be an error
        accepted = false;
        break;
    }

    if (reconnect) connect();
pixhawk's avatar
pixhawk committed
    return accepted;
}

bool SerialLink::setDataBits(int dataBits)
    //qDebug() << "Setting" << dataBits << "data bits";
    bool reconnect = false;
    if (isConnected()) reconnect = true;
pixhawk's avatar
pixhawk committed
    bool accepted = true;
pixhawk's avatar
pixhawk committed

    switch (dataBits) {
pixhawk's avatar
pixhawk committed
    case 5:
        portSettings.setDataBits(QPortSettings::DB_5);
pixhawk's avatar
pixhawk committed
        break;
    case 6:
        portSettings.setDataBits(QPortSettings::DB_6);
pixhawk's avatar
pixhawk committed
        break;
    case 7:
        portSettings.setDataBits(QPortSettings::DB_7);
pixhawk's avatar
pixhawk committed
        break;
    case 8:
        portSettings.setDataBits(QPortSettings::DB_8);
pixhawk's avatar
pixhawk committed
        break;
    default:
        // If none of the above cases matches, there must be an error
        accepted = false;
        break;
    }

    if(reconnect) connect();
pixhawk's avatar
pixhawk committed

    return accepted;
}

bool SerialLink::setStopBits(int stopBits)
pixhawk's avatar
pixhawk committed
    bool reconnect = false;
    bool accepted = true;
    if(isConnected()) reconnect = true;
    disconnect();
pixhawk's avatar
pixhawk committed

    switch (stopBits) {
pixhawk's avatar
pixhawk committed
    case 1:
        portSettings.setStopBits(QPortSettings::STOP_1);
pixhawk's avatar
pixhawk committed
        break;
    case 2:
        portSettings.setStopBits(QPortSettings::STOP_2);
pixhawk's avatar
pixhawk committed
        break;
    default:
        // If none of the above cases matches, there must be an error
        accepted = false;
        break;
    }

    if(reconnect) connect();
    return accepted;
}

bool SerialLink::setDataBitsType(int dataBits)
{
    bool reconnect = false;
    bool accepted = false;

    if (isConnected()) reconnect = true;
    disconnect();
    if (dataBits >= (int)QPortSettings::DB_5 && dataBits <= (int)QPortSettings::DB_8) {
        portSettings.setDataBits((QPortSettings::DataBits) dataBits);
        if(reconnect) connect();
        accepted = true;
    }

    return accepted;
}

bool SerialLink::setStopBitsType(int stopBits)
{
    bool reconnect = false;
    bool accepted = false;
    if(isConnected()) reconnect = true;
    disconnect();
    if (stopBits >= (int)QPortSettings::STOP_1 && stopBits <= (int)QPortSettings::STOP_2) {
        portSettings.setStopBits((QPortSettings::StopBits) stopBits);
        if(reconnect) connect();
        accepted = true;
    }

    if(reconnect) connect();
    return accepted;
}