diff --git a/main_window.cpp b/main_window.cpp index f7497d0..1531c86 100755 --- a/main_window.cpp +++ b/main_window.cpp @@ -18,6 +18,9 @@ static bool check_exist(QString str) { return false; } +QTextStream receivefileStream; + + void main_window::config_enable(bool ena) { portsComboBox->setEnabled(ena); stopbitsComboBox->setEnabled(ena); @@ -29,11 +32,18 @@ void main_window::config_enable(bool ena) { portOpenBtn->setText("open"), is_open = false; if (receivefile.isOpen()) receivefile.close(); + if (rawDataFile.isOpen()) + rawDataFile.close(); } else { portOpenBtn->setText("close"), is_open = true; auto filename = tmpFilenameEdit->text(); receivefile.setFileName(filename); receivefile.open(QIODevice::Append); + receivefileStream.setDevice(&receivefile); + rawDataFile.setFileName(filename + "raw"); + rawDataFile.open(QIODevice::Append); + + } } @@ -174,61 +184,78 @@ void main_window::open_port() { } -static uint64_t rest = 0; static int cnt = 0; -static long long line_cnt = 0; -QByteArray zero_finder; -int zero_pos = -1; -int buf_cnt = 0; -int receive_cnt = 0; +QByteArray first_frame; +bool first = true; + void main_window::read_data() { - auto data = port.readAll(); + static int receive_num_cnt = 0; + static int receive_byte_cnt = 0; static int val = 0; - if (zero_pos == -1) { - if (zero_finder.size() < 10) - zero_finder += data; - if (zero_finder.size() < 10) { + auto data = port.readAll(); + if (first) { + if (data.length() < 10) { + first_frame += data; return; } + while (first_frame[0] != 0) { + first_frame.remove(0, 1); + } int zero_cnt = 0; - for (int i = 0; i < 4; i++) { - if (zero_finder[i] == 0) { - zero_cnt++; - zero_pos = i; + do { + zero_cnt = 0; + while (first_frame[0] != 0) { + first_frame.remove(0, 1); } - } - for (int i = 4; i < zero_finder.size(); i++) { - if (zero_cnt == 1) { - break; + + for (int i = 0; i < 4; i++) { + zero_cnt += first_frame[i] == 0 ? 1 : 0; } - if (zero_finder[i - 4] == 0) - zero_cnt--; - if (zero_finder[i] == 0) { - zero_cnt++; - zero_pos = i; - } - } - - for (int i = zero_pos+1; i < zero_finder.size(); i++) { - - - } + first_frame.remove(0, 1); + } while (zero_cnt != 0); + data = first_frame; + first = false; + } + rawDataFile.write(data); + for (int i = 0; i < data.size(); i++) { + if (receive_byte_cnt % 4 == 0) { + if (data[i] != 0) { + // TODO: raise error + return; + } + receive_num_cnt++; + int real_number = val; + if (real_number & 0x800000) { + // negtive number + real_number = -(~real_number & 0x7fffff + 1); + } + receivefileStream << real_number << " "; + double scaled = (double) real_number / (double) (0x7fffff) * 2.5; + lineChart.data->append((double) receive_byte_cnt / 1000.0, scaled); + while (lineChart.data->count() > 5000) { + // data more than 5000 second, remove first data + lineChart.data->remove(0); + } + val = 0; + continue; + } + val <<= 8; + val |= data[i]; + receive_byte_cnt++; } - - - asciiTextEdit->append(QString(data)); - cnt += data.size(); QString new_text = QString(data.toHex(' ').toUpper()) + " "; hexTextEdit->moveCursor(QTextCursor::End); hexTextEdit->insertPlainText(new_text); - auto val = hexTextEdit->toPlainText(); - receivefile.write(val.toUtf8()); - if (hexTextEdit->toPlainText().length() > 1e3) { - hexTextEdit->clear(); - asciiTextEdit->clear(); + auto tmp = hexTextEdit->toPlainText(); + if (tmp.length() > 1e3) { + hexTextEdit->setPlainText(tmp.last((int) 1e3)); + hexTextEdit->moveCursor(QTextCursor::End); + } + tmp = asciiTextEdit->toPlainText(); + if (tmp.length() > 1e3) { + asciiTextEdit->setPlainText(tmp.last(int(1e3))); + asciiTextEdit->moveCursor(QTextCursor::End); } - lineChart.data->append(0, 0.5); - lineChart.data->append(0.5, 1); } diff --git a/main_window.h b/main_window.h index 5a0b462..b4b7923 100755 --- a/main_window.h +++ b/main_window.h @@ -39,6 +39,7 @@ private: bool is_open = false; QSerialPort port; QFile receivefile; + QFile rawDataFile; QWidget *centralwidget; QHBoxLayout *horizontalLayout; @@ -64,8 +65,6 @@ private: QChartView *plotChartView; QMessageBox box; -// QChart* chart; -// QLineSeries* linedata; GLineChart lineChart; private: