Subversion Repositories Code-Repo

Rev

Rev 348 | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 348 Rev 351
Line 1... Line 1...
1
#include "SerialController.h"
1
#include "SerialController.h"
2
 
2
 
3
SerialController::SerialController(QObject *parent) : QObject(parent)
3
SerialController::SerialController(QWidget *parent) : QWidget(parent)
4
{
4
{
5
    connected = false;
5
    // Serial connection UI
-
 
6
    btnSerialConnect = new QPushButton("&Connect");
-
 
7
    btnSerialRefresh = new QPushButton("&Refresh");
-
 
8
    labelSerialPort = new QLabel("Serial Port:");
-
 
9
    labelSerialSpeed = new QLabel("Baud Rate:");
-
 
10
    labelSerialDataBits = new QLabel("Data:");
-
 
11
    labelSerialStopBits = new QLabel("Stop:");
-
 
12
    labelSerialParity = new QLabel("Parity Bit:");
-
 
13
    labelSerialFlowControl = new QLabel("Flow Control:");
-
 
14
    cboxSerialPort = new QComboBox();
-
 
15
    cboxSerialPort->setMinimumWidth(80);
-
 
16
    cboxSerialSpeed = new QComboBox();
-
 
17
    cboxSerialSpeed->setEditable(true);
6
    speeds << "9600" << "19200" << "38400" << "57600" << "115200" << "230400" << "250000";
18
    cboxSerialSpeed->setValidator(new QIntValidator(0, 100000000, this));
7
    dataBits << "8 Bits" << "7 Bits" << "6 Bits" << "5 Bits";
19
    cboxSerialDataBits = new QComboBox();
-
 
20
    cboxSerialDataBits->setMaximumWidth(60);
8
    stopBits << "1 Bit" << "1.5 Bits" << "2 Bits";
21
    cboxSerialStopBits = new QComboBox();
-
 
22
    cboxSerialStopBits->setMaximumWidth(60);
-
 
23
    cboxSerialParity = new QComboBox();
-
 
24
    cboxSerialFlowControl = new QComboBox();
-
 
25
    cboxSerialFlowControl->setMinimumWidth(70);
-
 
26
 
9
    parity << "None" << "Even" << "Odd" << "Space" << "Mark";
27
    QGridLayout *serialSettingsLayout = new QGridLayout();
-
 
28
    serialSettingsLayout->addWidget(btnSerialConnect, 0, 0);
-
 
29
    serialSettingsLayout->addWidget(labelSerialPort, 0, 1);
-
 
30
    serialSettingsLayout->addWidget(cboxSerialPort, 0, 2);
-
 
31
    serialSettingsLayout->addWidget(labelSerialDataBits, 0, 3);
-
 
32
    serialSettingsLayout->addWidget(cboxSerialDataBits, 0, 4);
-
 
33
    serialSettingsLayout->addWidget(labelSerialParity, 0, 5);
-
 
34
    serialSettingsLayout->addWidget(cboxSerialParity, 0, 6);
-
 
35
 
-
 
36
    serialSettingsLayout->addWidget(btnSerialRefresh, 1, 0);
-
 
37
    serialSettingsLayout->addWidget(labelSerialSpeed, 1, 1);
-
 
38
    serialSettingsLayout->addWidget(cboxSerialSpeed, 1, 2);
-
 
39
    serialSettingsLayout->addWidget(labelSerialStopBits, 1, 3);
-
 
40
    serialSettingsLayout->addWidget(cboxSerialStopBits, 1, 4);
-
 
41
    serialSettingsLayout->addWidget(labelSerialFlowControl, 1, 5);
-
 
42
    serialSettingsLayout->addWidget(cboxSerialFlowControl, 1, 6);
-
 
43
 
-
 
44
    setLayout(serialSettingsLayout);
-
 
45
 
-
 
46
    serialHelper = new SerialHelper();
-
 
47
    serialThread = new QThread();
10
    flowControl << "None" << "Hardware" << "Software";
48
    serialHelper->moveToThread(serialThread);
-
 
49
 
-
 
50
    connect(serialHelper, SIGNAL(UpdateStatus(QString)), this, SIGNAL(UpdateStatus(QString)));
-
 
51
 
-
 
52
    // Parameters
-
 
53
    connect(this, SIGNAL(Serial_QueryParameters()), serialHelper, SLOT(Serial_QueryParameters()));
-
 
54
    connect(serialHelper, SIGNAL(Serial_UpdateParameters(QStringList,QStringList,QStringList,QStringList,QStringList,QStringList)),
-
 
55
            this, SLOT(Serial_UpdateParameters(QStringList,QStringList,QStringList,QStringList,QStringList,QStringList)));
-
 
56
 
-
 
57
    // Connect
-
 
58
    connect(this, SIGNAL(Serial_Connect(QString,QString,QString,QString,QString,QString)),
-
 
59
            serialHelper, SLOT(Serial_Connect(QString,QString,QString,QString,QString,QString)));
-
 
60
    connect(serialHelper, SIGNAL(Serial_Connected()), this, SIGNAL(Serial_Connected()));
-
 
61
    connect(serialHelper, SIGNAL(Serial_Connected()), this, SLOT(Serial_LocalConnected()));
-
 
62
 
11
    bufferInIndex = 0;
63
    // Disconnect
-
 
64
    connect(this, SIGNAL(Serial_Disconnect()), serialHelper, SLOT(Serial_Disconnect()));
-
 
65
    connect(serialHelper, SIGNAL(Serial_Disconnected()), this, SIGNAL(Serial_Disconnected()));
-
 
66
    connect(serialHelper, SIGNAL(Serial_Disconnected()), this, SLOT(Serial_LocalDisconnected()));
-
 
67
 
-
 
68
    // Transmit
-
 
69
    connect(this, SIGNAL(Serial_TransmitString(QString)), serialHelper, SLOT(Serial_TransmitString(QString)));
-
 
70
    connect(this, SIGNAL(Serial_TransmitByteArray(QByteArray)), serialHelper, SLOT(Serial_TransmitByteArray(QByteArray)));
-
 
71
 
-
 
72
    // Receive
-
 
73
    connect(serialHelper, SIGNAL(Serial_ReceivedByte(char)), this, SIGNAL(Serial_ReceivedByte(char)));
-
 
74
 
-
 
75
    // Threading
-
 
76
    connect(serialThread, SIGNAL(finished()), serialHelper, SLOT(deleteLater()));
12
    bufferInOverflow = false;
77
    serialThread->start();
13
}
78
 
-
 
79
    // Local GUI
-
 
80
    connect(btnSerialConnect, SIGNAL(clicked()), this, SLOT(Serial_ConnectToggleBtn()));
-
 
81
    connect(btnSerialRefresh, SIGNAL(clicked()), this, SIGNAL(Serial_QueryParameters()));
14
 
82
 
15
SerialController::~SerialController()
83
    emit Serial_QueryParameters();
16
{
-
 
17
    serialPort->close();
84
    Serial_LocalDisconnected();
18
    delete serialPort;
-
 
19
}
85
}
20
 
86
 
21
void SerialController::Serial_QueryParameters()
87
SerialController::~SerialController()
22
{
88
{
23
    QList<QSerialPortInfo> portsList = QSerialPortInfo::availablePorts();
-
 
24
    QStringList ports;
89
    serialThread->quit();
25
    for (int i = 0; i < portsList.size(); i++) {
-
 
26
        ports.append(portsList[i].portName());
-
 
27
    }
-
 
28
    emit Serial_UpdateParameters(ports, speeds, dataBits, stopBits, parity, flowControl);
-
 
29
}
90
}
30
 
91
 
31
void SerialController::Serial_Connect(QString port, QString speed, QString dataBits,
92
void SerialController::Serial_UpdateParameters(QStringList ports, QStringList speeds, QStringList dataBits,
32
                            QString stopBits, QString parity, QString flowControl)
93
                                               QStringList stopBits, QStringList parity, QStringList flowControl)
33
{
94
{
34
    if (!connected) {
95
    QString currPort = cboxSerialPort->currentText();
35
        serialPort = new QSerialPort();
96
    cboxSerialPort->clear();
36
        connect(serialPort, SIGNAL(readyRead()), this, SLOT(Serial_ProcessIncomingData()));
97
    cboxSerialPort->addItems(ports);
37
        serialPort->setPortName(port);
98
    if (currPort != "" && ports.contains(currPort))
38
        if (!serialPort->open(QIODevice::ReadWrite)) {
99
        cboxSerialPort->setCurrentText(currPort);
-
 
100
 
39
            Serial_Disconnect();
101
    QString currSpeed = cboxSerialSpeed->currentText();
40
        } else {
102
    cboxSerialSpeed->clear();
41
            connected = true;
103
    cboxSerialSpeed->addItems(speeds);
42
            bool ok = false;
104
    if (currSpeed != "") cboxSerialSpeed->setCurrentText(currSpeed);
43
 
105
 
-
 
106
    int currData = cboxSerialDataBits->currentIndex();
-
 
107
    cboxSerialDataBits->clear();
44
            int baud = speed.toInt(&ok);
108
    cboxSerialDataBits->addItems(dataBits);
45
            if (ok) serialPort->setBaudRate(baud);
109
    if (currData >= 0) cboxSerialDataBits->setCurrentIndex(currData);
46
 
110
 
47
            if (dataBits == "5 Bits")
111
    int currStop = cboxSerialStopBits->currentIndex();
48
                serialPort->setDataBits(QSerialPort::Data5);
112
    cboxSerialStopBits->clear();
49
            else if (dataBits == "6 Bits")
113
    cboxSerialStopBits->addItems(stopBits);
50
                serialPort->setDataBits(QSerialPort::Data6);
114
    if (currStop >= 0) cboxSerialStopBits->setCurrentIndex(currStop);
-
 
115
 
51
            else if (dataBits == "7 Bits")
116
    int currParity = cboxSerialParity->currentIndex();
52
                serialPort->setDataBits(QSerialPort::Data7);
117
    cboxSerialParity->clear();
53
            else
118
    cboxSerialParity->addItems(parity);
54
                serialPort->setDataBits(QSerialPort::Data8);
119
    if (currParity >= 0) cboxSerialParity->setCurrentIndex(currParity);
55
 
120
 
56
            if (stopBits == "1.5 Bits")
121
    int currFlow = cboxSerialFlowControl->currentIndex();
57
                serialPort->setStopBits(QSerialPort::OneAndHalfStop);
122
    cboxSerialFlowControl->clear();
58
            else if (stopBits == "2 Bits")
123
    cboxSerialFlowControl->addItems(flowControl);
59
                serialPort->setStopBits(QSerialPort::TwoStop);
124
    if (currFlow >= 0) cboxSerialFlowControl->setCurrentIndex(currFlow);
60
            else
125
}
-
 
126
 
61
                serialPort->setStopBits(QSerialPort::OneStop);
127
void SerialController::Serial_LocalConnected()
62
 
128
{
63
            if (parity == "Even")
129
    btnSerialConnect->setText("&Disconnect");
64
                serialPort->setParity(QSerialPort::EvenParity);
130
//    cboxSerialPort->setEnabled(false);
65
            else if (parity == "Odd")
131
//    cboxSerialSpeed->setEnabled(false);
66
                serialPort->setParity(QSerialPort::OddParity);
132
//    cboxSerialDataBits->setEnabled(false);
67
            else if (parity == "Space")
133
//    cboxSerialStopBits->setEnabled(false);
68
                serialPort->setParity(QSerialPort::SpaceParity);
134
//    cboxSerialParity->setEnabled(false);
-
 
135
//    cboxSerialFlowControl->setEnabled(false);
-
 
136
//    btnSerialRefresh->setEnabled(false);
-
 
137
    btnSerialRefresh->hide();
-
 
138
    labelSerialPort->hide();
-
 
139
    labelSerialSpeed->hide();
-
 
140
    labelSerialDataBits->hide();
-
 
141
    labelSerialStopBits->hide();
69
            else if (parity == "Mark")
142
    labelSerialParity->hide();
-
 
143
    labelSerialFlowControl->hide();
70
                serialPort->setParity(QSerialPort::MarkParity);
144
    cboxSerialPort->hide();
71
            else
145
    cboxSerialSpeed->hide();
-
 
146
    cboxSerialDataBits->hide();
-
 
147
    cboxSerialStopBits->hide();
-
 
148
    cboxSerialParity->hide();
-
 
149
    cboxSerialFlowControl->hide();
72
                serialPort->setParity(QSerialPort::NoParity);
150
    emit UpdateStatus("Serial: Connected");
-
 
151
}
73
 
152
 
-
 
153
void SerialController::Serial_LocalDisconnected()
-
 
154
{
-
 
155
    btnSerialConnect->setText("&Connect");
-
 
156
//    cboxSerialPort->setEnabled(true);
-
 
157
//    cboxSerialSpeed->setEnabled(true);
-
 
158
//    cboxSerialDataBits->setEnabled(true);
-
 
159
//    cboxSerialStopBits->setEnabled(true);
-
 
160
//    cboxSerialParity->setEnabled(true);
74
            if (flowControl == "Hardware")
161
//    cboxSerialFlowControl->setEnabled(true);
75
                serialPort->setFlowControl(QSerialPort::HardwareControl);
162
//    btnSerialRefresh->setEnabled(true);
-
 
163
    btnSerialRefresh->show();
-
 
164
    labelSerialPort->show();
-
 
165
    labelSerialSpeed->show();
-
 
166
    labelSerialDataBits->show();
-
 
167
    labelSerialStopBits->show();
-
 
168
    labelSerialParity->show();
76
            else if (flowControl == "Software")
169
    labelSerialFlowControl->show();
77
                serialPort->setFlowControl(QSerialPort::SoftwareControl);
170
    cboxSerialPort->show();
78
            else
171
    cboxSerialSpeed->show();
-
 
172
    cboxSerialDataBits->show();
-
 
173
    cboxSerialStopBits->show();
-
 
174
    cboxSerialParity->show();
-
 
175
    cboxSerialFlowControl->show();
79
                serialPort->setFlowControl(QSerialPort::NoFlowControl);
176
    emit UpdateStatus("Serial: Disconnected");
-
 
177
}
80
 
178
 
81
            // See http://umforum.ultimaker.com/index.php?/topic/5886-um2-controller-resetreboot-when-opening-usb-port-on-linux/
-
 
82
            serialPort->setDataTerminalReady(1);
179
void SerialController::Serial_ConnectToggleBtn()
83
 
180
{
84
            if (ok) emit Serial_Connected();
181
    if (serialHelper->connected) {
85
            else Serial_Disconnect();
182
        emit Serial_Disconnect();
-
 
183
    } else {
-
 
184
        if (cboxSerialPort->currentText() != "" && cboxSerialSpeed->currentText() != "") {
-
 
185
            emit Serial_Connect(cboxSerialPort->currentText(), cboxSerialSpeed->currentText(), cboxSerialDataBits->currentText(),
-
 
186
                                cboxSerialStopBits->currentText(), cboxSerialParity->currentText(), cboxSerialFlowControl->currentText());
86
        }
187
        }
87
    }
188
    }
88
}
189
}
89
 
190
 
90
void SerialController::Serial_Disconnect()
-
 
91
{
-
 
92
    serialPort->close();
-
 
93
    delete serialPort;
-
 
94
    connected = false;
-
 
95
    emit Serial_Disconnected();
-
 
96
}
-
 
97
 
-
 
98
void SerialController::Serial_TransmitString(QString string)
-
 
99
{
-
 
100
    serialPort->write(string.toStdString().c_str());
-
 
101
    serialPort->write(SERIAL_NEWLINE_CHAR);
-
 
102
}
-
 
103
 
-
 
104
void SerialController::Serial_ProcessIncomingData()
191
//void SerialController::Serial_ProcessIncomingData()
105
{
192
//{
106
    char tmpBuffer[SERIAL_BUFFER_SIZE];
193
//    char tmpBuffer[SERIAL_BUFFER_SIZE];
107
    int len = serialPort->read(tmpBuffer, sizeof(tmpBuffer));
194
//    int len = serialPort->read(tmpBuffer, sizeof(tmpBuffer));
108
    while (len > 0) {
195
//    while (len > 0) {
109
        for (int i = 0; i < len; i++) {
196
//        for (int i = 0; i < len; i++) {
110
            // Save received data into local buffer
197
//            // Save received data into local buffer
111
            bufferIn[bufferInIndex] = tmpBuffer[i];
198
//            bufferIn[bufferInIndex] = tmpBuffer[i];
112
 
199
 
113
            // If newline char is received, end current string
200
//            // If newline char is received, end current string
114
            if (tmpBuffer[i] == '\n') {
201
//            if (tmpBuffer[i] == '\n') {
115
                if (bufferInOverflow)
202
//                if (bufferInOverflow)
116
                    currString.append(QString::fromLocal8Bit(bufferIn, bufferInIndex));
203
//                    currString.append(QString::fromLocal8Bit(bufferIn, bufferInIndex));
117
                else
204
//                else
118
                    currString = QString::fromLocal8Bit(bufferIn, bufferInIndex);
205
//                    currString = QString::fromLocal8Bit(bufferIn, bufferInIndex);
119
                bufferInOverflow = false;
206
//                bufferInOverflow = false;
120
                bufferInIndex = 0;
207
//                bufferInIndex = 0;
121
                emit Serial_ReceivedString(currString);
208
//                emit Serial_ReceivedString(currString);
122
            } else {
209
//            } else {
123
                bufferInIndex++;
210
//                bufferInIndex++;
124
            }
211
//            }
125
 
212
 
126
            // If received string is larger than our serial buffer, append to previous data
213
//            // If received string is larger than our serial buffer, append to previous data
127
            if (bufferInIndex == SERIAL_BUFFER_SIZE-1) {
214
//            if (bufferInIndex == SERIAL_BUFFER_SIZE-1) {
128
                bufferIn[SERIAL_BUFFER_SIZE-1] = 0x0;
215
//                bufferIn[SERIAL_BUFFER_SIZE-1] = 0x0;
129
                if (bufferInOverflow)
216
//                if (bufferInOverflow)
130
                    currString.append(QString::fromLocal8Bit(bufferIn, bufferInIndex));
217
//                    currString.append(QString::fromLocal8Bit(bufferIn, bufferInIndex));
131
                else
218
//                else
132
                    currString = QString::fromLocal8Bit(bufferIn, bufferInIndex);
219
//                    currString = QString::fromLocal8Bit(bufferIn, bufferInIndex);
133
                bufferInOverflow = true;
220
//                bufferInOverflow = true;
134
                bufferInIndex = 0;
221
//                bufferInIndex = 0;
135
            }
222
//            }
136
        }
223
//        }
137
        // Check if there is more data to be read from the serial port
224
//        // Check if there is more data to be read from the serial port
138
        len = serialPort->read(tmpBuffer, sizeof(tmpBuffer));
225
//        len = serialPort->read(tmpBuffer, sizeof(tmpBuffer));
139
    }
226
//    }
140
}
227
//}