• R/O
  • HTTP
  • SSH
  • HTTPS

提交

標籤

Frequently used words (click to add to your profile)

javac++androidlinuxc#windowsobjective-ccocoa誰得qtpythonphprubygameguibathyscaphec計画中(planning stage)翻訳omegatframeworktwitterdomtestvb.netdirectxゲームエンジンbtronarduinopreviewer

QSerialPortTerminalにKOZOS用XMODEM送信機能追加


Commit MetaInfo

修訂ff58497b318e4611a382ff99a7d2099379bed005 (tree)
時間2012-05-17 20:51:15
作者arakaki <alucky4416@user...>
Commiterarakaki

Log Message

ADD: XMODEM FileSend for KOZOS study

Change Summary

差異

--- a/QSerialPortTerminal.pro
+++ b/QSerialPortTerminal.pro
@@ -1,48 +1,54 @@
1-unix : OBJECTS_DIR = build/.o/unix
2-win32 : OBJECTS_DIR = build/.o/win32
3-mac : OBJECTS_DIR = build/.o/mac
4-UI_DIR = build/.ui
5-MOC_DIR = build/.moc
6-RCC_DIR = build/.rcc
7-
8-AUTHOR = VIANNEY-LIAUD Philippe
9-EMAIL = philippe.vianney.liaud gmail.com
10-LICENSE = GPL
11-LANGUAGE = C++
12-
13-TEMPLATE = app
14-win32 : DEFINES += _TTY_WIN_ QWT_DLL QT_DLL
15-unix : DEFINES += _TTY_POSIX_
16-QT = gui core
17-INCLUDEPATH = . src
18-CONFIG += qt warn_on debug app_bundle thread x11
19-
20-SOURCES = src/QSerialPortTerminal/main.cpp \
21- src/QSerialPortTerminal/ui/QSerialPortTerminal.cpp \
22- src/SerialPort/qextserialbase.cpp \
23- src/SerialPort/qextserialport.cpp \
24- src/SerialPort/ManageSerialPort.cpp
25-
26-win32 : SOURCES += src/SerialPort/win_qextserialport.cpp
27-
28-unix : SOURCES += src/SerialPort/posix_qextserialport.cpp
29-
30-FORMS = src/QSerialPortTerminal/ui/QSerialPortTerminal.ui
31-
32-OPENEDFILES = src/QSerialPortTerminal/ui/QSerialPortTerminal.h \
33- src/QSerialPortTerminal/ui/QSerialPortTerminal.cpp \
34- src/SerialPort/ManageSerialPort.h \
35- src/SerialPort/ManageSerialPort.cpp
36-
37-HEADERS = src/QSerialPortTerminal/ui/QSerialPortTerminal.h \
38- src/SerialPort/qextserialbase.h \
39- src/SerialPort/qextserialport.h \
40- src/SerialPort/ManageSerialPort.h
41-
42-win32 : HEADERS += src/SerialPort/win_qextserialport.h
43-
44-unix : HEADERS += src/SerialPort/posix_qextserialport.h
45-SOURCES -= src/QSerialPortTerminal/ui/ConsoleTerminal.cpp
46-
47-HEADERS -= src/QSerialPortTerminal/ui/ConsoleTerminal.h
48-
1+unix : OBJECTS_DIR = build/.o/unix
2+win32 : OBJECTS_DIR = build/.o/win32
3+mac : OBJECTS_DIR = build/.o/mac
4+UI_DIR = build/.ui
5+MOC_DIR = build/.moc
6+RCC_DIR = build/.rcc
7+
8+AUTHOR = VIANNEY-LIAUD Philippe
9+EMAIL = philippe.vianney.liaud gmail.com
10+LICENSE = GPL
11+LANGUAGE = C++
12+
13+TEMPLATE = app
14+win32 : DEFINES += _TTY_WIN_ QWT_DLL QT_DLL
15+unix : DEFINES += _TTY_POSIX_
16+QT = gui core
17+INCLUDEPATH = . src
18+CONFIG += qt warn_on debug app_bundle thread x11
19+
20+SOURCES = src/QSerialPortTerminal/main.cpp \
21+ src/QSerialPortTerminal/ui/QSerialPortTerminal.cpp \
22+ src/QSerialPortTerminal/ui/sendfile_dialog.cpp \
23+ src/SerialPort/qextserialbase.cpp \
24+ src/SerialPort/qextserialport.cpp \
25+ src/SerialPort/ManageSerialPort.cpp
26+
27+win32 : SOURCES += src/SerialPort/win_qextserialport.cpp
28+
29+unix : SOURCES += src/SerialPort/posix_qextserialport.cpp
30+
31+FORMS = src/QSerialPortTerminal/ui/QSerialPortTerminal.ui \
32+ src/QSerialPortTerminal/ui/sendfile_dialog.ui
33+
34+OPENEDFILES = src/QSerialPortTerminal/ui/QSerialPortTerminal.h \
35+ src/SerialPort/ManageSerialPort.cpp \
36+ src/QSerialPortTerminal/ui/QSerialPortTerminal.cpp \
37+ src/SerialPort/ManageSerialPort.h
38+
39+HEADERS = src/QSerialPortTerminal/ui/QSerialPortTerminal.h \
40+ src/QSerialPortTerminal/ui/sendfile_dialog.h \
41+ src/SerialPort/qextserialbase.h \
42+ src/SerialPort/qextserialport.h \
43+ src/SerialPort/ManageSerialPort.h
44+
45+win32 : HEADERS += src/SerialPort/win_qextserialport.h
46+
47+unix : HEADERS += src/SerialPort/posix_qextserialport.h
48+SOURCES -= src/QSerialPortTerminal/ui/ConsoleTerminal.cpp
49+
50+HEADERS -= src/QSerialPortTerminal/ui/ConsoleTerminal.h
51+
52+
53+
54+
--- a/src/QSerialPortTerminal/ui/QSerialPortTerminal.cpp
+++ b/src/QSerialPortTerminal/ui/QSerialPortTerminal.cpp
@@ -16,16 +16,21 @@ QSerialPortTerminal::QSerialPortTerminal( QWidget* parent )
1616
1717 serialPort=serialPort = new ManageSerialPort;
1818 connect(serialPort, SIGNAL(newDataReceived(const QByteArray &)), this, SLOT(slot_newDataReceived(const QByteArray &)));
19+ connect(serialPort, SIGNAL(sendEnded(int)), this, SLOT(slot_sendEnded(int)));
20+ connect(serialPort, SIGNAL(progress_status(int)), this, SLOT(slot_progress_status(int)));
1921
2022 #ifdef _TTY_WIN_
2123 comboBoxPortName->addItem("COM1", QVariant::fromValue(QString("COM1")));
2224 comboBoxPortName->addItem("COM2", QVariant::fromValue(QString("COM2")));
25+ comboBoxPortName->addItem("COM11", QVariant::fromValue(QString("COM11")));
26+ comboBoxPortName->addItem("COM21", QVariant::fromValue(QString("COM21")));
2327 comboBoxPortName->setCurrentIndex(0); //COM1
2428 #endif
2529
2630 #ifdef _TTY_POSIX_
2731 comboBoxPortName->addItem("ttyS0", QVariant::fromValue(QString("/dev/ttyS0")));
2832 comboBoxPortName->addItem("ttyS1", QVariant::fromValue(QString("/dev/ttyS1")));
33+ comboBoxPortName->addItem("ttyUSB0", QVariant::fromValue(QString("/dev/ttyUSB0")));
2934 comboBoxPortName->setCurrentIndex(0); //COM1
3035 #endif
3136
@@ -67,6 +72,8 @@ QSerialPortTerminal::QSerialPortTerminal( QWidget* parent )
6772 connect(pushButtonOpen, SIGNAL(clicked()), this, SLOT(slot_openPort()));
6873 connect(pushButtonClose, SIGNAL(clicked()), this, SLOT(slot_closePort()));
6974 connect(pushButtonSend, SIGNAL(clicked()), this, SLOT(slot_sendPort()));
75+ connect(pushButtonSendFile, SIGNAL(clicked()), this, SLOT(slot_sendPortToFile()));
76+ connect(pushButtonClear, SIGNAL(clicked()), this, SLOT(slot_clear()));
7077
7178 /*Codecs list*/
7279 QMap<QString, QTextCodec *> codecMap;
@@ -137,6 +144,7 @@ void QSerialPortTerminal::slot_openPort()
137144 pushButtonOpen->setEnabled(false);
138145 pushButtonClose->setEnabled(true);
139146 pushButtonSend->setEnabled(true);
147+ pushButtonSendFile->setEnabled(true);
140148
141149 if (serialPort->isOpen())
142150 serialPort->close();
@@ -168,7 +176,9 @@ void QSerialPortTerminal::slot_openPort()
168176
169177 serialPort->open();
170178 serialPort->receiveData();
171-};
179+
180+// this->slot_clear();
181+}
172182
173183
174184 void QSerialPortTerminal::slot_closePort()
@@ -179,7 +189,8 @@ void QSerialPortTerminal::slot_closePort()
179189 pushButtonOpen->setEnabled(true);
180190 pushButtonClose->setEnabled(false);
181191 pushButtonSend->setEnabled(false);
182-};
192+ pushButtonSendFile->setEnabled(false);
193+}
183194
184195 void QSerialPortTerminal::slot_sendPort()
185196 {
@@ -194,7 +205,8 @@ void QSerialPortTerminal::slot_sendPort()
194205 if (checkBoxLF->checkState() == Qt::Checked)
195206 Message += "\x0A";
196207
197- QByteArray temp(Message.toUtf8());
208+// QByteArray temp(Message.toUtf8());
209+ QByteArray temp(Message.toLocal8Bit());
198210 serialPort->sendData(temp);
199211
200212 lineEditSend->clear();
@@ -217,3 +229,58 @@ void QSerialPortTerminal::slot_newDataReceived(const QByteArray &dataReceived)
217229 textEditReceive->insertPlainText(decodedStr);
218230 }
219231
232+void QSerialPortTerminal::slot_clear()
233+{
234+ textEditReceive->clear();
235+}
236+
237+void QSerialPortTerminal::slot_sendPortToFile()
238+{
239+ // select FileDialog
240+ QString filepath = QFileDialog::getOpenFileName(this, tr("Select Send File"),"","");
241+ if (filepath.isEmpty()) return;
242+
243+// pushButtonOpen->setEnabled(false);
244+ pushButtonClose->setEnabled(false);
245+ pushButtonSend->setEnabled(false);
246+ pushButtonSendFile->setEnabled(false);
247+
248+ status_dlg = new SendFile_Dialog(this, filepath);
249+ connect(status_dlg, SIGNAL(stopSendFile()), this, SLOT(slot_stopSendPortToFile()));
250+ status_dlg->open();
251+
252+ // Send File by XMODEM
253+ serialPort->setFlagKOZOS(checkBox4KOZOS->isChecked());
254+ serialPort->startXferFile_XMODEM(filepath);
255+}
256+
257+void QSerialPortTerminal::slot_stopSendPortToFile()
258+{
259+ // if sending?
260+ serialPort->stopXferFile_XMODEM();
261+}
262+
263+// SerialPort -> MainPanel -> Dialog
264+void QSerialPortTerminal::slot_sendEnded(int result)
265+{
266+ qDebug() << QString("SendEnded, code = %1").arg(result);
267+
268+ if (status_dlg) {
269+ status_dlg->close();
270+ delete status_dlg;
271+ status_dlg = NULL;
272+ }
273+
274+ // pushButtonOpen->setEnabled(false);
275+ pushButtonClose->setEnabled(true);
276+ pushButtonSend->setEnabled(true);
277+ pushButtonSendFile->setEnabled(true);
278+}
279+
280+// SerialPort -> MainPanel -> Dialog
281+void QSerialPortTerminal::slot_progress_status(int progress)
282+{
283+ if (status_dlg) {
284+ status_dlg->updateProgressbar(progress);
285+ }
286+}
--- a/src/QSerialPortTerminal/ui/QSerialPortTerminal.h
+++ b/src/QSerialPortTerminal/ui/QSerialPortTerminal.h
@@ -11,7 +11,8 @@
1111 //
1212 #include <QMainWindow>
1313 #include "ui_QSerialPortTerminal.h"
14-#include "src/SerialPort/ManageSerialPort.h"
14+#include "sendfile_dialog.h"
15+#include "src/SerialPort/ManageSerialPort.h"
1516
1617 class QextSerialPort;
1718
@@ -29,13 +30,20 @@ private slots:
2930 void slot_openPort();
3031 void slot_closePort();
3132 void slot_sendPort();
33+ void slot_clear();
34+ void slot_sendPortToFile();
35+ void slot_stopSendPortToFile();
3236
33- //SerialPort
37+ // SerialPort
3438 void slot_newDataReceived(const QByteArray &dataReceived);
39+ void slot_sendEnded(int); // SerialPort -> MainPanel
40+ void slot_progress_status(int progress); // SerialPort -> MainPanel -> Dialog
3541
3642 private:
3743 ManageSerialPort *serialPort;
3844 QByteArray allDataReceived;
45+
46+ SendFile_Dialog *status_dlg;
3947 };
4048
4149 #endif // QSERIALPORTTERMINAL_H
--- a/src/QSerialPortTerminal/ui/QSerialPortTerminal.ui
+++ b/src/QSerialPortTerminal/ui/QSerialPortTerminal.ui
@@ -1,285 +1,308 @@
1-<ui version="4.0" >
2- <class>QSerialPortTerminal</class>
3- <widget class="QMainWindow" name="QSerialPortTerminal" >
4- <property name="geometry" >
5- <rect>
6- <x>0</x>
7- <y>0</y>
8- <width>613</width>
9- <height>319</height>
10- </rect>
11- </property>
12- <property name="windowTitle" >
13- <string>QSerialPortTerminal</string>
14- </property>
15- <widget class="QWidget" name="centralwidget" >
16- <property name="geometry" >
17- <rect>
18- <x>0</x>
19- <y>0</y>
20- <width>613</width>
21- <height>319</height>
22- </rect>
23- </property>
24- <layout class="QHBoxLayout" name="horizontalLayout" >
25- <item>
26- <layout class="QVBoxLayout" name="verticalLayout" >
27- <item>
28- <widget class="QGroupBox" name="groupBoxSettings" >
29- <property name="title" >
30- <string>Settings...</string>
31- </property>
32- <layout class="QGridLayout" name="gridLayout" >
33- <item row="0" column="0" >
34- <widget class="QLabel" name="labelPort" >
35- <property name="sizePolicy" >
36- <sizepolicy vsizetype="Preferred" hsizetype="Fixed" >
37- <horstretch>0</horstretch>
38- <verstretch>0</verstretch>
39- </sizepolicy>
40- </property>
41- <property name="text" >
42- <string>Port :</string>
43- </property>
44- </widget>
45- </item>
46- <item row="0" column="1" >
47- <widget class="QComboBox" name="comboBoxPortName" />
48- </item>
49- <item row="1" column="0" >
50- <widget class="QLabel" name="labelBaudRate" >
51- <property name="sizePolicy" >
52- <sizepolicy vsizetype="Preferred" hsizetype="Fixed" >
53- <horstretch>0</horstretch>
54- <verstretch>0</verstretch>
55- </sizepolicy>
56- </property>
57- <property name="text" >
58- <string>Baud rate :</string>
59- </property>
60- </widget>
61- </item>
62- <item row="1" column="1" >
63- <widget class="QComboBox" name="comboBoxBaudRate" />
64- </item>
65- <item row="2" column="0" >
66- <widget class="QLabel" name="labelData" >
67- <property name="sizePolicy" >
68- <sizepolicy vsizetype="Preferred" hsizetype="Fixed" >
69- <horstretch>0</horstretch>
70- <verstretch>0</verstretch>
71- </sizepolicy>
72- </property>
73- <property name="text" >
74- <string>Data :</string>
75- </property>
76- </widget>
77- </item>
78- <item row="2" column="1" >
79- <widget class="QComboBox" name="comboBoxDataBits" />
80- </item>
81- <item row="3" column="0" >
82- <widget class="QLabel" name="labelParity" >
83- <property name="sizePolicy" >
84- <sizepolicy vsizetype="Preferred" hsizetype="Fixed" >
85- <horstretch>0</horstretch>
86- <verstretch>0</verstretch>
87- </sizepolicy>
88- </property>
89- <property name="text" >
90- <string>Parity :</string>
91- </property>
92- </widget>
93- </item>
94- <item row="3" column="1" >
95- <widget class="QComboBox" name="comboBoxParity" />
96- </item>
97- <item row="4" column="0" >
98- <widget class="QLabel" name="labelStop" >
99- <property name="sizePolicy" >
100- <sizepolicy vsizetype="Preferred" hsizetype="Fixed" >
101- <horstretch>0</horstretch>
102- <verstretch>0</verstretch>
103- </sizepolicy>
104- </property>
105- <property name="text" >
106- <string>Stop :</string>
107- </property>
108- </widget>
109- </item>
110- <item row="4" column="1" >
111- <widget class="QComboBox" name="comboBoxStopBits" />
112- </item>
113- <item row="5" column="0" >
114- <widget class="QLabel" name="labelFlowControl" >
115- <property name="sizePolicy" >
116- <sizepolicy vsizetype="Preferred" hsizetype="Fixed" >
117- <horstretch>0</horstretch>
118- <verstretch>0</verstretch>
119- </sizepolicy>
120- </property>
121- <property name="text" >
122- <string>Flow control :</string>
123- </property>
124- </widget>
125- </item>
126- <item row="5" column="1" >
127- <widget class="QComboBox" name="comboBoxFlowControl" />
128- </item>
129- </layout>
130- </widget>
131- </item>
132- <item>
133- <widget class="QGroupBox" name="groupBoxOptions" >
134- <property name="enabled" >
135- <bool>true</bool>
136- </property>
137- <property name="title" >
138- <string>Options</string>
139- </property>
140- <layout class="QGridLayout" name="gridLayout_2" >
141- <property name="topMargin" >
142- <number>4</number>
143- </property>
144- <property name="bottomMargin" >
145- <number>4</number>
146- </property>
147- <property name="horizontalSpacing" >
148- <number>5</number>
149- </property>
150- <property name="verticalSpacing" >
151- <number>4</number>
152- </property>
153- <item row="0" column="0" >
154- <widget class="QLabel" name="labelCodec" >
155- <property name="text" >
156- <string>Codec :</string>
157- </property>
158- </widget>
159- </item>
160- <item row="0" column="1" >
161- <widget class="QComboBox" name="comboBoxCodecs" />
162- </item>
163- <item row="1" column="1" >
164- <spacer name="verticalSpacer" >
165- <property name="orientation" >
166- <enum>Qt::Vertical</enum>
167- </property>
168- <property name="sizeHint" stdset="0" >
169- <size>
170- <width>20</width>
171- <height>17</height>
172- </size>
173- </property>
174- </spacer>
175- </item>
176- </layout>
177- </widget>
178- </item>
179- </layout>
180- </item>
181- <item>
182- <widget class="QFrame" name="frame_2" >
183- <property name="frameShape" >
184- <enum>QFrame::NoFrame</enum>
185- </property>
186- <property name="frameShadow" >
187- <enum>QFrame::Raised</enum>
188- </property>
189- <layout class="QVBoxLayout" >
190- <property name="spacing" >
191- <number>4</number>
192- </property>
193- <property name="leftMargin" >
194- <number>0</number>
195- </property>
196- <property name="topMargin" >
197- <number>9</number>
198- </property>
199- <property name="rightMargin" >
200- <number>0</number>
201- </property>
202- <property name="bottomMargin" >
203- <number>0</number>
204- </property>
205- <item>
206- <layout class="QHBoxLayout" >
207- <item>
208- <widget class="QPushButton" name="pushButtonOpen" >
209- <property name="text" >
210- <string>Open</string>
211- </property>
212- </widget>
213- </item>
214- <item>
215- <spacer>
216- <property name="orientation" >
217- <enum>Qt::Horizontal</enum>
218- </property>
219- <property name="sizeHint" stdset="0" >
220- <size>
221- <width>40</width>
222- <height>20</height>
223- </size>
224- </property>
225- </spacer>
226- </item>
227- <item>
228- <widget class="QPushButton" name="pushButtonClose" >
229- <property name="enabled" >
230- <bool>false</bool>
231- </property>
232- <property name="text" >
233- <string>Close</string>
234- </property>
235- </widget>
236- </item>
237- </layout>
238- </item>
239- <item>
240- <widget class="QTextEdit" name="textEditReceive" >
241- <property name="readOnly" >
242- <bool>true</bool>
243- </property>
244- </widget>
245- </item>
246- <item>
247- <layout class="QHBoxLayout" >
248- <item>
249- <widget class="QLineEdit" name="lineEditSend" />
250- </item>
251- <item>
252- <widget class="QCheckBox" name="checkBoxCR" >
253- <property name="text" >
254- <string>CR</string>
255- </property>
256- </widget>
257- </item>
258- <item>
259- <widget class="QCheckBox" name="checkBoxLF" >
260- <property name="text" >
261- <string>LF</string>
262- </property>
263- </widget>
264- </item>
265- </layout>
266- </item>
267- <item>
268- <widget class="QPushButton" name="pushButtonSend" >
269- <property name="enabled" >
270- <bool>false</bool>
271- </property>
272- <property name="text" >
273- <string>Send</string>
274- </property>
275- </widget>
276- </item>
277- </layout>
278- </widget>
279- </item>
280- </layout>
281- </widget>
282- </widget>
283- <resources/>
284- <connections/>
285-</ui>
1+<?xml version="1.0" encoding="UTF-8"?>
2+<ui version="4.0">
3+ <class>QSerialPortTerminal</class>
4+ <widget class="QMainWindow" name="QSerialPortTerminal">
5+ <property name="geometry">
6+ <rect>
7+ <x>0</x>
8+ <y>0</y>
9+ <width>613</width>
10+ <height>352</height>
11+ </rect>
12+ </property>
13+ <property name="windowTitle">
14+ <string>QSerialPortTerminal</string>
15+ </property>
16+ <widget class="QWidget" name="centralwidget">
17+ <layout class="QHBoxLayout" name="horizontalLayout">
18+ <item>
19+ <layout class="QVBoxLayout" name="verticalLayout">
20+ <item>
21+ <widget class="QGroupBox" name="groupBoxSettings">
22+ <property name="title">
23+ <string>Settings...</string>
24+ </property>
25+ <layout class="QGridLayout" name="gridLayout">
26+ <item row="0" column="0">
27+ <widget class="QLabel" name="labelPort">
28+ <property name="sizePolicy">
29+ <sizepolicy hsizetype="Fixed" vsizetype="Preferred">
30+ <horstretch>0</horstretch>
31+ <verstretch>0</verstretch>
32+ </sizepolicy>
33+ </property>
34+ <property name="text">
35+ <string>Port :</string>
36+ </property>
37+ </widget>
38+ </item>
39+ <item row="0" column="1">
40+ <widget class="QComboBox" name="comboBoxPortName"/>
41+ </item>
42+ <item row="1" column="0">
43+ <widget class="QLabel" name="labelBaudRate">
44+ <property name="sizePolicy">
45+ <sizepolicy hsizetype="Fixed" vsizetype="Preferred">
46+ <horstretch>0</horstretch>
47+ <verstretch>0</verstretch>
48+ </sizepolicy>
49+ </property>
50+ <property name="text">
51+ <string>Baud rate :</string>
52+ </property>
53+ </widget>
54+ </item>
55+ <item row="1" column="1">
56+ <widget class="QComboBox" name="comboBoxBaudRate"/>
57+ </item>
58+ <item row="2" column="0">
59+ <widget class="QLabel" name="labelData">
60+ <property name="sizePolicy">
61+ <sizepolicy hsizetype="Fixed" vsizetype="Preferred">
62+ <horstretch>0</horstretch>
63+ <verstretch>0</verstretch>
64+ </sizepolicy>
65+ </property>
66+ <property name="text">
67+ <string>Data :</string>
68+ </property>
69+ </widget>
70+ </item>
71+ <item row="2" column="1">
72+ <widget class="QComboBox" name="comboBoxDataBits"/>
73+ </item>
74+ <item row="3" column="0">
75+ <widget class="QLabel" name="labelParity">
76+ <property name="sizePolicy">
77+ <sizepolicy hsizetype="Fixed" vsizetype="Preferred">
78+ <horstretch>0</horstretch>
79+ <verstretch>0</verstretch>
80+ </sizepolicy>
81+ </property>
82+ <property name="text">
83+ <string>Parity :</string>
84+ </property>
85+ </widget>
86+ </item>
87+ <item row="3" column="1">
88+ <widget class="QComboBox" name="comboBoxParity"/>
89+ </item>
90+ <item row="4" column="0">
91+ <widget class="QLabel" name="labelStop">
92+ <property name="sizePolicy">
93+ <sizepolicy hsizetype="Fixed" vsizetype="Preferred">
94+ <horstretch>0</horstretch>
95+ <verstretch>0</verstretch>
96+ </sizepolicy>
97+ </property>
98+ <property name="text">
99+ <string>Stop :</string>
100+ </property>
101+ </widget>
102+ </item>
103+ <item row="4" column="1">
104+ <widget class="QComboBox" name="comboBoxStopBits"/>
105+ </item>
106+ <item row="5" column="0">
107+ <widget class="QLabel" name="labelFlowControl">
108+ <property name="sizePolicy">
109+ <sizepolicy hsizetype="Fixed" vsizetype="Preferred">
110+ <horstretch>0</horstretch>
111+ <verstretch>0</verstretch>
112+ </sizepolicy>
113+ </property>
114+ <property name="text">
115+ <string>Flow control :</string>
116+ </property>
117+ </widget>
118+ </item>
119+ <item row="5" column="1">
120+ <widget class="QComboBox" name="comboBoxFlowControl"/>
121+ </item>
122+ </layout>
123+ </widget>
124+ </item>
125+ <item>
126+ <widget class="QGroupBox" name="groupBoxOptions">
127+ <property name="enabled">
128+ <bool>true</bool>
129+ </property>
130+ <property name="title">
131+ <string>Options</string>
132+ </property>
133+ <layout class="QGridLayout" name="gridLayout_2">
134+ <property name="topMargin">
135+ <number>4</number>
136+ </property>
137+ <property name="bottomMargin">
138+ <number>4</number>
139+ </property>
140+ <property name="horizontalSpacing">
141+ <number>5</number>
142+ </property>
143+ <property name="verticalSpacing">
144+ <number>4</number>
145+ </property>
146+ <item row="0" column="0">
147+ <widget class="QLabel" name="labelCodec">
148+ <property name="text">
149+ <string>Codec :</string>
150+ </property>
151+ </widget>
152+ </item>
153+ <item row="0" column="1">
154+ <widget class="QComboBox" name="comboBoxCodecs"/>
155+ </item>
156+ <item row="1" column="1">
157+ <spacer name="verticalSpacer">
158+ <property name="orientation">
159+ <enum>Qt::Vertical</enum>
160+ </property>
161+ <property name="sizeHint" stdset="0">
162+ <size>
163+ <width>20</width>
164+ <height>17</height>
165+ </size>
166+ </property>
167+ </spacer>
168+ </item>
169+ </layout>
170+ </widget>
171+ </item>
172+ </layout>
173+ </item>
174+ <item>
175+ <widget class="QFrame" name="frame_2">
176+ <property name="frameShape">
177+ <enum>QFrame::NoFrame</enum>
178+ </property>
179+ <property name="frameShadow">
180+ <enum>QFrame::Raised</enum>
181+ </property>
182+ <layout class="QVBoxLayout">
183+ <property name="spacing">
184+ <number>4</number>
185+ </property>
186+ <property name="leftMargin">
187+ <number>0</number>
188+ </property>
189+ <property name="topMargin">
190+ <number>9</number>
191+ </property>
192+ <property name="rightMargin">
193+ <number>0</number>
194+ </property>
195+ <property name="bottomMargin">
196+ <number>0</number>
197+ </property>
198+ <item>
199+ <layout class="QHBoxLayout">
200+ <item>
201+ <widget class="QPushButton" name="pushButtonOpen">
202+ <property name="text">
203+ <string>Open</string>
204+ </property>
205+ </widget>
206+ </item>
207+ <item>
208+ <widget class="QPushButton" name="pushButtonClose">
209+ <property name="enabled">
210+ <bool>false</bool>
211+ </property>
212+ <property name="text">
213+ <string>Close</string>
214+ </property>
215+ </widget>
216+ </item>
217+ <item>
218+ <widget class="QPushButton" name="pushButtonClear">
219+ <property name="text">
220+ <string>Clear</string>
221+ </property>
222+ </widget>
223+ </item>
224+ </layout>
225+ </item>
226+ <item>
227+ <widget class="QTextEdit" name="textEditReceive">
228+ <property name="readOnly">
229+ <bool>true</bool>
230+ </property>
231+ </widget>
232+ </item>
233+ <item>
234+ <layout class="QHBoxLayout">
235+ <item>
236+ <widget class="QLineEdit" name="lineEditSend"/>
237+ </item>
238+ <item>
239+ <widget class="QCheckBox" name="checkBoxCR">
240+ <property name="text">
241+ <string>CR</string>
242+ </property>
243+ </widget>
244+ </item>
245+ <item>
246+ <widget class="QCheckBox" name="checkBoxLF">
247+ <property name="text">
248+ <string>LF</string>
249+ </property>
250+ <property name="checked">
251+ <bool>true</bool>
252+ </property>
253+ </widget>
254+ </item>
255+ </layout>
256+ </item>
257+ <item>
258+ <widget class="QPushButton" name="pushButtonSend">
259+ <property name="enabled">
260+ <bool>false</bool>
261+ </property>
262+ <property name="text">
263+ <string>Send</string>
264+ </property>
265+ </widget>
266+ </item>
267+ <item>
268+ <layout class="QHBoxLayout" name="horizontalLayout_2">
269+ <property name="topMargin">
270+ <number>0</number>
271+ </property>
272+ <item>
273+ <widget class="QCheckBox" name="checkBox4KOZOS">
274+ <property name="sizePolicy">
275+ <sizepolicy hsizetype="Fixed" vsizetype="Fixed">
276+ <horstretch>0</horstretch>
277+ <verstretch>0</verstretch>
278+ </sizepolicy>
279+ </property>
280+ <property name="text">
281+ <string>forKOZOS</string>
282+ </property>
283+ <property name="checked">
284+ <bool>true</bool>
285+ </property>
286+ </widget>
287+ </item>
288+ <item>
289+ <widget class="QPushButton" name="pushButtonSendFile">
290+ <property name="enabled">
291+ <bool>false</bool>
292+ </property>
293+ <property name="text">
294+ <string>XMODEM SendFile</string>
295+ </property>
296+ </widget>
297+ </item>
298+ </layout>
299+ </item>
300+ </layout>
301+ </widget>
302+ </item>
303+ </layout>
304+ </widget>
305+ </widget>
306+ <resources/>
307+ <connections/>
308+</ui>
--- /dev/null
+++ b/src/QSerialPortTerminal/ui/sendfile_dialog.cpp
@@ -0,0 +1,35 @@
1+
2+#include <QFileInfo>
3+#include <QCloseEvent>
4+
5+#include "sendfile_dialog.h"
6+#include "ui_sendfile_dialog.h"
7+
8+SendFile_Dialog::SendFile_Dialog(QWidget *parent, QString path) :
9+ QDialog(parent),
10+ ui(new Ui::SendFile_Dialog)
11+{
12+ ui->setupUi(this);
13+
14+ connect(ui->pushButtonCancel, SIGNAL(clicked()), this, SIGNAL(stopSendFile()));
15+
16+ this->filepath = path;
17+ QFileInfo fi(this->filepath);
18+ ui->lineEditFileName->setText(fi.fileName());
19+ ui->label_3->setText(QString(tr("FileSize: %1 bytes")).arg(fi.size()));
20+ ui->progressBar->setValue(0);
21+}
22+
23+SendFile_Dialog::~SendFile_Dialog()
24+{
25+ delete ui;
26+}
27+
28+void SendFile_Dialog::closeEvent(QCloseEvent* e){
29+ e->ignore(); // ignore window title bar close button
30+}
31+
32+void SendFile_Dialog::updateProgressbar(int progress)
33+{
34+ ui->progressBar->setValue(progress);
35+}
--- /dev/null
+++ b/src/QSerialPortTerminal/ui/sendfile_dialog.h
@@ -0,0 +1,32 @@
1+#ifndef SENDFILE_DIALOG_H
2+#define SENDFILE_DIALOG_H
3+
4+#include <QDialog>
5+
6+namespace Ui {
7+ class SendFile_Dialog;
8+}
9+
10+class SendFile_Dialog : public QDialog
11+{
12+ Q_OBJECT
13+
14+public:
15+ explicit SendFile_Dialog(QWidget *parent = 0, QString path = "");
16+ ~SendFile_Dialog();
17+
18+ void closeEvent(QCloseEvent* evt);
19+ void updateProgressbar(int);
20+
21+private:
22+ Ui::SendFile_Dialog *ui;
23+
24+ QString filepath;
25+
26+private slots:
27+
28+signals:
29+ void stopSendFile();
30+};
31+
32+#endif // SENDFILE_DIALOG_H
--- /dev/null
+++ b/src/QSerialPortTerminal/ui/sendfile_dialog.ui
@@ -0,0 +1,130 @@
1+<?xml version="1.0" encoding="UTF-8"?>
2+<ui version="4.0">
3+ <class>SendFile_Dialog</class>
4+ <widget class="QDialog" name="SendFile_Dialog">
5+ <property name="windowModality">
6+ <enum>Qt::ApplicationModal</enum>
7+ </property>
8+ <property name="geometry">
9+ <rect>
10+ <x>0</x>
11+ <y>0</y>
12+ <width>292</width>
13+ <height>186</height>
14+ </rect>
15+ </property>
16+ <property name="minimumSize">
17+ <size>
18+ <width>292</width>
19+ <height>186</height>
20+ </size>
21+ </property>
22+ <property name="maximumSize">
23+ <size>
24+ <width>292</width>
25+ <height>186</height>
26+ </size>
27+ </property>
28+ <property name="contextMenuPolicy">
29+ <enum>Qt::NoContextMenu</enum>
30+ </property>
31+ <property name="windowTitle">
32+ <string>SendFile Status</string>
33+ </property>
34+ <widget class="QPushButton" name="pushButtonCancel">
35+ <property name="geometry">
36+ <rect>
37+ <x>30</x>
38+ <y>140</y>
39+ <width>211</width>
40+ <height>31</height>
41+ </rect>
42+ </property>
43+ <property name="text">
44+ <string>Cancel</string>
45+ </property>
46+ </widget>
47+ <widget class="QProgressBar" name="progressBar">
48+ <property name="geometry">
49+ <rect>
50+ <x>30</x>
51+ <y>102</y>
52+ <width>241</width>
53+ <height>21</height>
54+ </rect>
55+ </property>
56+ <property name="value">
57+ <number>0</number>
58+ </property>
59+ </widget>
60+ <widget class="QLineEdit" name="lineEditFileName">
61+ <property name="enabled">
62+ <bool>true</bool>
63+ </property>
64+ <property name="geometry">
65+ <rect>
66+ <x>30</x>
67+ <y>40</y>
68+ <width>231</width>
69+ <height>21</height>
70+ </rect>
71+ </property>
72+ <property name="font">
73+ <font>
74+ <pointsize>12</pointsize>
75+ </font>
76+ </property>
77+ <property name="text">
78+ <string>filename</string>
79+ </property>
80+ </widget>
81+ <widget class="QLabel" name="label">
82+ <property name="geometry">
83+ <rect>
84+ <x>30</x>
85+ <y>10</y>
86+ <width>231</width>
87+ <height>21</height>
88+ </rect>
89+ </property>
90+ <property name="font">
91+ <font>
92+ <pointsize>12</pointsize>
93+ <weight>75</weight>
94+ <bold>true</bold>
95+ </font>
96+ </property>
97+ <property name="text">
98+ <string>Send...</string>
99+ </property>
100+ </widget>
101+ <widget class="QLabel" name="label_2">
102+ <property name="geometry">
103+ <rect>
104+ <x>30</x>
105+ <y>90</y>
106+ <width>50</width>
107+ <height>12</height>
108+ </rect>
109+ </property>
110+ <property name="text">
111+ <string>Progress</string>
112+ </property>
113+ </widget>
114+ <widget class="QLabel" name="label_3">
115+ <property name="geometry">
116+ <rect>
117+ <x>40</x>
118+ <y>60</y>
119+ <width>221</width>
120+ <height>20</height>
121+ </rect>
122+ </property>
123+ <property name="text">
124+ <string>FileSize: </string>
125+ </property>
126+ </widget>
127+ </widget>
128+ <resources/>
129+ <connections/>
130+</ui>
--- a/src/SerialPort/ManageSerialPort.cpp
+++ b/src/SerialPort/ManageSerialPort.cpp
@@ -441,14 +441,65 @@ void ManageSerialPort::stopReceiving()
441441 }
442442 }
443443
444+// Transfer File by XMODEM protcol
445+void ManageSerialPort::startXferFile_XMODEM(QString filepath)
446+{
447+ // Enable Thread Send&Receive
448+ this->stopSending();
449+ this->stopReceiving();
450+
451+ this->disableReceiving();
452+ this->disableSending();
453+
454+ char resp[1024];
455+ if (flagKOZOS) {
456+ extSerialPort.write("load\n", 5);
457+ extSerialPort.readLine(resp, sizeof(resp)); // read echo back, prompt
458+ }
444459
460+ thSendXModem = new ThreadSendXModem(extSerialPort);
445461
462+ connect(thSendXModem, SIGNAL(sendEnded(int)), this, SLOT(slot_sendEnded(int)));
463+ connect(thSendXModem, SIGNAL(progress_status(int)), this, SIGNAL(progress_status(int)));
446464
465+ thSendXModem->setSendFilePath(filepath);
447466
467+ thSendXModem->start();
468+
469+}
448470
471+// Transfer File by XMODEM protcol
472+void ManageSerialPort::stopXferFile_XMODEM()
473+{
474+ thSendXModem->stopSendXModem();
475+}
449476
477+ // send KOZOS load command, before FileSend
478+void ManageSerialPort::setFlagKOZOS(bool flag)
479+{
480+ this->flagKOZOS = flag; // true is KOZOS option enable
481+}
450482
483+void ManageSerialPort::slot_sendEnded(int result)
484+{
485+ qDebug() << QString("slot_SendEnded. code = %1").arg(result);
451486
487+ // Enable Thread Send&Receive
488+ this->enableSending();
489+ this->enableReceiving();
490+ this->receiveData();
491+
492+ thSendXModem->stopSendXModem();
493+ thSendXModem->wait();
494+ delete (thSendXModem);
495+ thSendXModem = NULL;
496+
497+ emit sendEnded(result);
498+}
499+//void ManageSerialPort::slot_progress_status(int progress)
500+//{
501+// qDebug() << QString("slot_progress_status : pregress = %1").arg(progress);
502+//}
452503
453504
454505 /********************************************************************************************************
@@ -558,7 +609,212 @@ void ThreadReceive::run()
558609 mutexReceive.unlock();
559610
560611 emit newDataReceived(dataReceived);
561- }
612+ } else {
613+ this->msleep(100);
614+ }
562615 }
563616 }
564617
618+
619+/********************************************************************************************************
620+ * Classe ThreadSendXModem
621+ *****************************************************************************************************/
622+
623+ThreadSendXModem::ThreadSendXModem(QextSerialPort &addressSerialPort) : extSerialPort(addressSerialPort)
624+{
625+ stopped=false;
626+ filepath = "";
627+}
628+
629+ThreadSendXModem::~ThreadSendXModem()
630+{
631+ if (isRunning())
632+ {
633+ stopSendXModem();
634+ wait();
635+ }
636+}
637+
638+void ThreadSendXModem::stopSendXModem()
639+{
640+ stopped = true;
641+}
642+
643+void ThreadSendXModem::setSendFilePath(QString path)
644+{
645+ filepath = path;
646+}
647+
648+bool ThreadSendXModem::XMODEM_DataBlock(char *buff, unsigned char blknum, char *data, int datalen)
649+{
650+ memset(&buff[3], 0x1A, 128); // Padding EOF(0x1F)
651+ buff[0] = 0x01; // SOH
652+ buff[1] = blknum;
653+ buff[2] = ~blknum;
654+ memcpy(&buff[3], data, datalen);
655+ unsigned char chksum = 0;
656+ for (int i = 0; i < 128; i++) {
657+ chksum += buff[i+3];
658+ }
659+ buff[128+3] = chksum;
660+
661+ return false;
662+}
663+
664+void ThreadSendXModem::run()
665+{
666+ enum {
667+ CODE_SOH = 0x01,
668+ CODE_STX = 0x02,
669+ CODE_ETX = 0x03,
670+ CODE_EOT = 0x04,
671+ CODE_ACK = 0x06,
672+ CODE_NAK = 0x15,
673+ CODE_CAN = 0x18,
674+ BLOCK_SIZE = 128
675+ };
676+ int ret = 0;
677+ int numBytes=0;
678+
679+ char buff[BLOCK_SIZE];
680+ char data[BLOCK_SIZE+4]; // SOH(1) + BLK#(1) + ~BLK#(1) + DATA(128) + CHKSUM(1)
681+ char senddata[BLOCK_SIZE];
682+ int senddata_len;
683+
684+ int i;
685+
686+ int BlockCount = 1;
687+ int LeastBytes = 0;
688+ unsigned char BlockNumber;
689+ bool flag_retry = false;
690+
691+ // fileopen failed then return true;
692+ qDebug() << filepath;
693+ QFile file(filepath);
694+ qint64 filesize = file.size();
695+
696+ qDebug() << QString("FileSize is %1 bytes").arg(filesize);
697+ BlockCount = (int)((int)filesize / BLOCK_SIZE);
698+ LeastBytes = (int)((int)filesize % BLOCK_SIZE);
699+ if (LeastBytes) BlockCount++;
700+ qDebug() << QString("BlockCount = %1, LeastBytes = %2").arg(BlockCount).arg(LeastBytes);
701+
702+ if (!(file.open(QIODevice::ReadOnly))) {
703+ qDebug() << "FileOpenError";
704+ buff[0] = CODE_CAN; // CAN
705+ extSerialPort.write(buff, 1); // SendCAN
706+ ret = 1; // FileOpen error
707+ goto failure;
708+ }
709+
710+ // 1.Wait for NAK
711+ while (1) {
712+ if (stopped) {
713+ buff[0] = CODE_CAN; // CAN
714+ extSerialPort.write(buff, 1); // SendCAN
715+ ret = 2; // 1stNAK error
716+ goto failure;
717+ }
718+ numBytes = extSerialPort.bytesAvailable();
719+ if (numBytes > 0) {
720+ data[0] = 0x00;
721+ extSerialPort.read(data, 1);
722+ if (data[0] == CODE_NAK) break; // Rcv NAK
723+ }
724+ this->msleep(100);
725+ }
726+ // this->sleep(1);
727+ extSerialPort.flush(); // Flush Recv NAK
728+
729+ // 2.SendData, Wait for ACK
730+ flag_retry = false;
731+ BlockNumber = 1;
732+ for (i = 0; i < BlockCount;) {
733+ if (stopped) {
734+ buff[0] = CODE_CAN; // CAN
735+ extSerialPort.write(buff, 1); // SendCAN
736+ ret = 3; // Cancel
737+ goto failure;
738+ }
739+ if (!flag_retry) {
740+ if (LeastBytes != 0 && (i + 1) == BlockCount) { // LastData?
741+ senddata_len = LeastBytes;
742+ } else {
743+ senddata_len = BLOCK_SIZE;
744+ }
745+ file.read(senddata, senddata_len);
746+ this->XMODEM_DataBlock(data, BlockNumber, senddata, senddata_len);
747+ }
748+ extSerialPort.write(data, BLOCK_SIZE+4); // Send BlockData
749+
750+ this->msleep(200);
751+
752+ // WaitFor ACK
753+ while (1) {
754+ if (stopped) {
755+ buff[0] = CODE_CAN; // CAN
756+ extSerialPort.write(buff, 1); // SendCAN
757+ ret = 4; // DataACK error
758+ goto failure;
759+ }
760+ numBytes = extSerialPort.bytesAvailable();
761+ if (numBytes > 0) {
762+ data[0] = 0x00;
763+ extSerialPort.read(data, 1);
764+ if (data[0] == CODE_ACK || data[0] == CODE_NAK) break; // Rcv ACK or NAK
765+ }
766+ this->msleep(100);
767+ }
768+
769+ if (data[0] == CODE_ACK) { // Rcv Ack, goto NextBlock
770+ emit progress_status((int)((float)(i + 1)/(float)BlockCount*100.0));
771+ qDebug() << QString("Rcv DataAck, BlkNum = %1").arg(BlockNumber);
772+ flag_retry = false;
773+ BlockNumber++;
774+ i++;
775+ } else if (data[0] == CODE_NAK) {
776+ qDebug() << "Rcv DataNAK";
777+ flag_retry = true;
778+ }
779+ }
780+
781+ // 3.Send EOT, Wait for ACKorNAK
782+ buff[0] = CODE_EOT; // EOT
783+ extSerialPort.write(buff, 1); // SendEOT
784+ qDebug() << QString("Send EOT");
785+ this->msleep(100);
786+
787+ // WaitFor EndACK
788+ while (1) {
789+ if (stopped) {
790+ buff[0] = CODE_CAN; // CAN
791+ extSerialPort.write(buff, 1); // SendCAN
792+ ret = 5; // EndACK error
793+ goto failure;
794+ }
795+ numBytes = extSerialPort.bytesAvailable();
796+ if (numBytes > 0) {
797+ extSerialPort.read(data, 1);
798+ break;
799+ }
800+ this->msleep(100);
801+ }
802+ qDebug() << QString("RcvEOT Ack");
803+
804+ // File Close
805+ file.close();
806+ extSerialPort.flush();
807+
808+ emit sendEnded(0); // NoError
809+ stopped = false;
810+ return;
811+
812+failure:
813+ // File Close
814+ file.close();
815+ extSerialPort.flush();
816+
817+ emit sendEnded(ret); // Error
818+ stopped = false;
819+}
820+
--- a/src/SerialPort/ManageSerialPort.h
+++ b/src/SerialPort/ManageSerialPort.h
@@ -13,6 +13,7 @@
1313 #include <QQueue>
1414 #include <QMetaType>
1515 #include <QMutex>
16+#include <QString>
1617 #include "qextserialport.h"
1718
1819 Q_DECLARE_METATYPE(BaudRateType);
@@ -23,6 +24,7 @@ Q_DECLARE_METATYPE(FlowType);
2324
2425 class ThreadSend;
2526 class ThreadReceive;
27+class ThreadSendXModem;
2628
2729
2830 class ManageSerialPort : public QObject
@@ -242,14 +244,21 @@ public:
242244
243245 void stopReceiving();
244246
247+ void startXferFile_XMODEM(QString filepath); // Transfer File by XMODEM protcol
248+ void stopXferFile_XMODEM(); // Transfer File by XMODEM protcol
249+ void setFlagKOZOS(bool); // send KOZOS load command, before FileSend.
250+
245251 signals:
246252 void newDataReceived(const QByteArray &dataReceived);
253+ void sendEnded(int);
254+ void progress_status(int progress);
247255
248256 private:
249257 //Variables privees
250258 QextSerialPort extSerialPort;
251259 ThreadSend *threadSend;
252260 ThreadReceive *threadReceive;
261+ ThreadSendXModem *thSendXModem;
253262
254263 bool sendingEnabled;
255264 bool receivingEnabled;
@@ -259,6 +268,11 @@ private:
259268 bool saveStateReceivedEnabled;
260269 bool saveStateReceiveData;
261270
271+ bool flagKOZOS;
272+
273+private slots:
274+ void slot_sendEnded(int); // slot XMODEM Send End
275+// void slot_progress_status(int);
262276 };
263277
264278 #endif // MANAGESERIALPORT_H
@@ -320,3 +334,34 @@ private :
320334 signals:
321335 void newDataReceived(const QByteArray &dataReceived);
322336 };
337+
338+
339+
340+
341+
342+class ThreadSendXModem : public QThread
343+{
344+ Q_OBJECT
345+
346+public:
347+ ThreadSendXModem(QextSerialPort &addressSerialPort);
348+ ~ThreadSendXModem();
349+ void stopSendXModem();
350+ void setSendFilePath(QString);
351+
352+protected:
353+ void run();
354+
355+private :
356+ QMutex mutexSendXModem;
357+ QextSerialPort &extSerialPort;
358+ bool stopped;
359+
360+ QString filepath;
361+
362+ bool XMODEM_DataBlock(char *buff, unsigned char blknum, char *data, int datalen);
363+
364+signals:
365+ void sendEnded(int resultcode);
366+ void progress_status(int progress);
367+};