Getting ready for checksum support

This commit is contained in:
NeoTheFox 2015-03-06 17:44:32 +03:00
parent 3bb5133ea9
commit 763bc62b26
4 changed files with 121 additions and 46 deletions

View File

@ -25,13 +25,14 @@ MainWindow::MainWindow(QWidget *parent) :
ui->baudbox->addItem(QString::number(250000)); ui->baudbox->addItem(QString::number(250000));
ui->baudbox->addItem(QString::number(460800)); ui->baudbox->addItem(QString::number(460800));
ui->baudbox->addItem(QString::number(500000)); ui->baudbox->addItem(QString::number(500000));
if(settings.value("printer/baudrateindex").toInt()) ui->baudbox->setCurrentIndex(settings.value("printer/baudrateindex").toInt()); if(settings.value("printer/baudrateindex").toInt())
ui->baudbox->setCurrentIndex(settings.value("printer/baudrateindex").toInt());
else ui->baudbox->setCurrentIndex(2); else ui->baudbox->setCurrentIndex(2);
ui->extruderlcd->setPalette(Qt::red); ui->extruderlcd->setPalette(Qt::red);
ui->bedlcd->setPalette(Qt::red); ui->bedlcd->setPalette(Qt::red);
if(!settings.value("core/firstrun").toBool()) firstrun = true; firstrun = !settings.value("core/firstrun").toBool(); //firstrun is inverted!
checkingTemperature = settings.value("core/checktemperature").toBool(); checkingTemperature = settings.value("core/checktemperature").toBool();
ui->checktemp->setChecked(checkingTemperature); ui->checktemp->setChecked(checkingTemperature);
@ -43,10 +44,10 @@ MainWindow::MainWindow(QWidget *parent) :
else echo = false; else echo = false;
autolock = settings.value("core/lockcontrols").toBool(); autolock = settings.value("core/lockcontrols").toBool();
sendingChecksum = settings.value("core/checksums").toBool();
sending = false; sending = false;
paused = false; paused = false;
injectingCommand = false;
readingFiles = false; readingFiles = false;
sdprinting = false; sdprinting = false;
sdBytes = 0; sdBytes = 0;
@ -56,11 +57,11 @@ MainWindow::MainWindow(QWidget *parent) :
temperatureRegxp.setCaseSensitivity(Qt::CaseInsensitive); temperatureRegxp.setCaseSensitivity(Qt::CaseInsensitive);
temperatureRegxp.setPatternSyntax(QRegExp::RegExp); temperatureRegxp.setPatternSyntax(QRegExp::RegExp);
temperatureRegxp.setPattern("\\d+\\.\\d+"); temperatureRegxp.setPattern("\\d+\\.\\d+"); // Find float in string
SDStatusRegxp.setCaseSensitivity(Qt::CaseInsensitive); SDStatusRegxp.setCaseSensitivity(Qt::CaseInsensitive);
SDStatusRegxp.setPatternSyntax(QRegExp::RegExp); SDStatusRegxp.setPatternSyntax(QRegExp::RegExp);
SDStatusRegxp.setPattern("\\d+"); SDStatusRegxp.setPattern("\\d+"); //First number
serialupdate(); serialupdate();
@ -94,11 +95,12 @@ MainWindow::~MainWindow()
if(gfile.isOpen()) gfile.close(); if(gfile.isOpen()) gfile.close();
if(printer.isOpen()) printer.close(); if(printer.isOpen()) printer.close();
if(firstrun) settings.setValue("core/firstrun", true); //firstrun is inverted!
settings.setValue("printer/baudrateindex", ui->baudbox->currentIndex()); settings.setValue("printer/baudrateindex", ui->baudbox->currentIndex());
settings.setValue("core/checktemperature", ui->checktemp->isChecked()); settings.setValue("core/checktemperature", ui->checktemp->isChecked());
settings.setValue("user/extrudertemp", ui->etmpspin->value()); settings.setValue("user/extrudertemp", ui->etmpspin->value());
settings.setValue("user/bedtemp", ui->btmpspin->value()); settings.setValue("user/bedtemp", ui->btmpspin->value());
if(firstrun) settings.setValue("core/firstrun", true);
settings.beginWriteArray("user/recentfiles"); settings.beginWriteArray("user/recentfiles");
for(int i = 0; i < recentFiles.size(); i++) for(int i = 0; i < recentFiles.size(); i++)
@ -136,11 +138,21 @@ void MainWindow::parseFile(QFile &file)
if (file.open(QIODevice::ReadOnly)) if (file.open(QIODevice::ReadOnly))
{ {
QTextStream in(&file); QTextStream in(&file);
int n = 0;
while (!in.atEnd()) while (!in.atEnd())
{ {
QString line = in.readLine(); QString line = in.readLine();
if(!line.startsWith(";")) if(!line.startsWith(";"))
{ {
if(sendingChecksum)
{
line = "N"+QString::number(n)+line+"*";
int cs = 0;
for(int i = 0; line.at(i) != '*'; i++) cs = cs ^ line.at(i).toLatin1();
cs &= 0xff;
line += QString::number(cs);
n++;
}
gcode.append(line); gcode.append(line);
} }
@ -174,13 +186,13 @@ void MainWindow::serialupdate()
ui->serialBox->clear(); ui->serialBox->clear();
QList<QSerialPortInfo> list = QSerialPortInfo::availablePorts(); QList<QSerialPortInfo> list = QSerialPortInfo::availablePorts();
for(int i = 0; i < list.size(); i++) for(int i = 0; i < list.size(); i++)
{
ui->serialBox->addItem(list.at(i).portName()); ui->serialBox->addItem(list.at(i).portName());
}
} }
void MainWindow::serialconnect() void MainWindow::serialconnect()
{ {
userCommands.clear();
if(!printer.isOpen()) if(!printer.isOpen())
{ {
foreach (const QSerialPortInfo &info, QSerialPortInfo::availablePorts()) foreach (const QSerialPortInfo &info, QSerialPortInfo::availablePorts())
@ -224,7 +236,7 @@ void MainWindow::serialconnect()
ui->consoleGroup->setDisabled(false); ui->consoleGroup->setDisabled(false);
ui->actionPrint_from_SD->setEnabled("true"); ui->actionPrint_from_SD->setEnabled("true");
ui->actionSet_SD_printing_mode->setEnabled("true"); ui->actionSet_SD_printing_mode->setEnabled("true");
if(checkingTemperature) injectCommand("M105"); //if(checkingTemperature) injectCommand("M105");
} }
} }
@ -415,6 +427,7 @@ void MainWindow::on_flowbutton_clicked()
void MainWindow::on_haltbtn_clicked() void MainWindow::on_haltbtn_clicked()
{ {
if(sending && !paused)ui->pauseBtn->click(); if(sending && !paused)ui->pauseBtn->click();
userCommands.clear();
injectCommand("M112"); injectCommand("M112");
} }
//Buttons end //Buttons end
@ -445,10 +458,21 @@ void MainWindow::readSerial()
else if(data.startsWith("wait")) readyRecieve = 1; else if(data.startsWith("wait")) readyRecieve = 1;
else if(data.startsWith("Resend")) //Handle resend if requested else if(data.startsWith("Resend")) //Handle resend if requested
{ {
if(currentLine > 0) currentLine -= data.split(':')[1].toInt(); if(gcode.isEmpty())
if(currentLine < 0) currentLine = 0; {
injectCommand("M110"); //This means we rebooted, file is gone, so we need to reset counter
return;
}
int err = data.split(':')[1].toInt();
if(!sendingChecksum)
{
if(currentLine > 0) currentLine -= err;
if(currentLine < 0) currentLine = 0;
}
else injectCommand(gcode.at(err));
} }
else if(data.startsWith("Done")) sdprinting = false; else if(data.startsWith("Done")) sdprinting = false;
else if(data.startsWith("start") && checkingTemperature) injectCommand("M105");
else if(data.startsWith("SD printing byte") && sdWatcher.isFinished()) else if(data.startsWith("SD printing byte") && sdWatcher.isFinished())
{ {
QFuture<double> parseSDThread = QtConcurrent::run(this, &MainWindow::parseSDStatus, data); QFuture<double> parseSDThread = QtConcurrent::run(this, &MainWindow::parseSDStatus, data);
@ -488,6 +512,7 @@ void MainWindow::printMsg(QString text)
void MainWindow::on_sendBtn_clicked() void MainWindow::on_sendBtn_clicked()
{ {
userCommands.clear();
if(sending && !sdprinting) if(sending && !sdprinting)
{ {
sending = false; sending = false;
@ -522,11 +547,10 @@ void MainWindow::on_sendBtn_clicked()
void MainWindow::sendNext() void MainWindow::sendNext()
{ {
if(injectingCommand && printer.isWritable() && readyRecieve > 0) if(!userCommands.isEmpty() && printer.isWritable() && readyRecieve > 0)
{ {
sendLine(userCommand); sendLine(userCommands.dequeue());
readyRecieve--; readyRecieve--;
injectingCommand=false;
return; return;
} }
else if(sending && !paused && readyRecieve > 0 && !sdprinting && printer.isWritable()) else if(sending && !paused && readyRecieve > 0 && !sdprinting && printer.isWritable())
@ -609,8 +633,7 @@ void MainWindow::on_actionAbout_triggered()
void MainWindow::injectCommand(QString command) void MainWindow::injectCommand(QString command)
{ {
injectingCommand = true; userCommands.enqueue(command);
userCommand = command;
} }
void MainWindow::updateRecent() void MainWindow::updateRecent()
@ -627,6 +650,8 @@ void MainWindow::serialError(QSerialPort::SerialPortError error)
if(sending) paused = true; if(sending) paused = true;
userCommands.clear();
ui->connectBtn->setText("Connect"); ui->connectBtn->setText("Connect");
ui->sendBtn->setDisabled(true); ui->sendBtn->setDisabled(true);
ui->pauseBtn->setDisabled(true); ui->pauseBtn->setDisabled(true);
@ -700,13 +725,9 @@ TemperatureReadings MainWindow::parseStatus(QByteArray data)
TemperatureReadings r; TemperatureReadings r;
if(temperatureRegxp.indexIn(QString(data)) != -1) if(temperatureRegxp.indexIn(QString(data)) != -1)
{
r.e = temperatureRegxp.cap(0).toDouble(); r.e = temperatureRegxp.cap(0).toDouble();
}
if(temperatureRegxp.indexIn(QString(data), temperatureRegxp.matchedLength()) != -1) if(temperatureRegxp.indexIn(QString(data), temperatureRegxp.matchedLength()) != -1)
{
r.b = temperatureRegxp.cap(0).toDouble(); r.b = temperatureRegxp.cap(0).toDouble();
}
else else
{ {
r.e = -1; r.e = -1;
@ -755,7 +776,8 @@ double MainWindow::parseSDStatus(QByteArray data)
} }
*/ */
if(SDStatusRegxp.indexIn(QString(data)) != 0) return SDStatusRegxp.cap(0).toDouble(); if(SDStatusRegxp.indexIn(QString(data)) != 0)
return SDStatusRegxp.cap(0).toDouble();
else return -1; else return -1;
} }

View File

@ -39,6 +39,7 @@ public:
QFile gfile; QFile gfile;
QVector<QString> gcode; QVector<QString> gcode;
QQueue <QString> userCommands;
QTimer sendTimer; QTimer sendTimer;
QTimer progressSDTimer; QTimer progressSDTimer;
QTimer statusTimer; QTimer statusTimer;
@ -63,11 +64,11 @@ private:
bool sending; bool sending;
bool paused; bool paused;
bool checkingTemperature; bool checkingTemperature;
bool injectingCommand;
bool readingFiles; bool readingFiles;
bool sdprinting; bool sdprinting;
bool echo; bool echo;
int currentLine; bool sendingChecksum;
long int currentLine;
int readyRecieve; int readyRecieve;
double sdBytes; double sdBytes;
QString userCommand; QString userCommand;

View File

@ -7,10 +7,12 @@ SettingsWindow::SettingsWindow(QWidget *parent) :
{ {
ui->setupUi(this); ui->setupUi(this);
if(!settings.value("core/firstrun").toBool()) ui->senderbox->setValue(4); bool firstrun = !settings.value("core/firstrun").toBool(); //firstrun is inverted!
if(firstrun) ui->senderbox->setValue(4);
else ui->senderbox->setValue(settings.value("core/senderinterval").toFloat()); else ui->senderbox->setValue(settings.value("core/senderinterval").toFloat());
if(!settings.value("core/firstrun").toBool()) ui->echobox->setChecked(false); if(firstrun) ui->echobox->setChecked(false);
else ui->echobox->setChecked(settings.value("core/echo").toBool()); else ui->echobox->setChecked(settings.value("core/echo").toBool());
if(settings.value("core/statusinterval").toInt()) ui->statusbox->setValue(settings.value("core/statusinterval").toInt()); if(settings.value("core/statusinterval").toInt()) ui->statusbox->setValue(settings.value("core/statusinterval").toInt());
@ -23,6 +25,7 @@ SettingsWindow::SettingsWindow(QWidget *parent) :
else ui->bedybox->setValue(200); else ui->bedybox->setValue(200);
ui->lockbox->setChecked(settings.value("core/lockcontrols").toBool()); ui->lockbox->setChecked(settings.value("core/lockcontrols").toBool());
ui->checksumbox->setChecked(settings.value("core/checksums").toBool());
} }
@ -39,4 +42,5 @@ void SettingsWindow::on_buttonBox_accepted()
settings.setValue("printer/bedx", ui->bedxbox->value()); settings.setValue("printer/bedx", ui->bedxbox->value());
settings.setValue("core/echo", ui->echobox->isChecked()); settings.setValue("core/echo", ui->echobox->isChecked());
settings.setValue("core/lockcontrols", ui->lockbox->isChecked()); settings.setValue("core/lockcontrols", ui->lockbox->isChecked());
settings.setValue("core/checksums", ui->checksumbox->isChecked());
} }

View File

@ -7,7 +7,7 @@
<x>0</x> <x>0</x>
<y>0</y> <y>0</y>
<width>253</width> <width>253</width>
<height>242</height> <height>330</height>
</rect> </rect>
</property> </property>
<property name="windowTitle"> <property name="windowTitle">
@ -24,14 +24,17 @@
<string>Internal</string> <string>Internal</string>
</property> </property>
<layout class="QGridLayout" name="gridLayout"> <layout class="QGridLayout" name="gridLayout">
<item row="0" column="0"> <item row="3" column="0" colspan="3">
<widget class="QLabel" name="label"> <widget class="QCheckBox" name="echobox">
<property name="toolTip">
<string>Show every sent command in console</string>
</property>
<property name="text"> <property name="text">
<string>Sender</string> <string>Echo commands</string>
</property> </property>
</widget> </widget>
</item> </item>
<item row="0" column="1"> <item row="1" column="1">
<widget class="QDoubleSpinBox" name="senderbox"> <widget class="QDoubleSpinBox" name="senderbox">
<property name="toolTip"> <property name="toolTip">
<string>A good default is 2, lower = fater, higher = less CPU load. 0 would execute as soon as possible.</string> <string>A good default is 2, lower = fater, higher = less CPU load. 0 would execute as soon as possible.</string>
@ -51,23 +54,26 @@
<property name="singleStep"> <property name="singleStep">
<double>0.100000000000000</double> <double>0.100000000000000</double>
</property> </property>
<property name="value">
<double>2.000000000000000</double>
</property>
</widget> </widget>
</item> </item>
<item row="0" column="2"> <item row="2" column="2">
<widget class="QLabel" name="label_3"> <widget class="QLabel" name="label_4">
<property name="text"> <property name="text">
<string>ms</string> <string>ms</string>
</property> </property>
</widget> </widget>
</item> </item>
<item row="1" column="0"> <item row="2" column="0">
<widget class="QLabel" name="label_2"> <widget class="QLabel" name="label_2">
<property name="text"> <property name="text">
<string>Status</string> <string>Status</string>
</property> </property>
</widget> </widget>
</item> </item>
<item row="1" column="1"> <item row="2" column="1">
<widget class="QSpinBox" name="statusbox"> <widget class="QSpinBox" name="statusbox">
<property name="toolTip"> <property name="toolTip">
<string>A good default is 5000. More = less interruptions, less = better temperature monitoring</string> <string>A good default is 5000. More = less interruptions, less = better temperature monitoring</string>
@ -84,19 +90,55 @@
</widget> </widget>
</item> </item>
<item row="1" column="2"> <item row="1" column="2">
<widget class="QLabel" name="label_4"> <widget class="QLabel" name="label_3">
<property name="text"> <property name="text">
<string>ms</string> <string>ms</string>
</property> </property>
</widget> </widget>
</item> </item>
<item row="2" column="0" colspan="3"> <item row="4" column="0" colspan="3">
<widget class="QCheckBox" name="echobox"> <widget class="QCheckBox" name="lockbox">
<property name="toolTip"> <property name="text">
<string>Show every sent command in console</string> <string>Lock controls when printing</string>
</property>
</widget>
</item>
<item row="1" column="0">
<widget class="QLabel" name="label">
<property name="text">
<string>Sender</string>
</property>
</widget>
</item>
<item row="5" column="0">
<widget class="QCheckBox" name="checksumbox">
<property name="enabled">
<bool>false</bool>
</property> </property>
<property name="text"> <property name="text">
<string>Echo commands</string> <string>Checksums</string>
</property>
</widget>
</item>
<item row="0" column="0" colspan="3">
<widget class="QLabel" name="label_7">
<property name="minimumSize">
<size>
<width>0</width>
<height>28</height>
</size>
</property>
<property name="text">
<string>This settings are applied after restart</string>
</property>
<property name="textFormat">
<enum>Qt::AutoText</enum>
</property>
<property name="wordWrap">
<bool>true</bool>
</property>
<property name="margin">
<number>1</number>
</property> </property>
</widget> </widget>
</item> </item>
@ -105,14 +147,20 @@
</item> </item>
<item row="1" column="0"> <item row="1" column="0">
<widget class="QGroupBox" name="groupBox"> <widget class="QGroupBox" name="groupBox">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Minimum">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="title"> <property name="title">
<string>Printer</string> <string>Printer</string>
</property> </property>
<layout class="QGridLayout" name="gridLayout_2"> <layout class="QGridLayout" name="gridLayout_2">
<item row="0" column="2"> <item row="0" column="0">
<widget class="QLabel" name="label_6"> <widget class="QLabel" name="label_5">
<property name="text"> <property name="text">
<string>X</string> <string>Bed size</string>
</property> </property>
</widget> </widget>
</item> </item>
@ -126,10 +174,10 @@
</property> </property>
</widget> </widget>
</item> </item>
<item row="0" column="0"> <item row="0" column="2">
<widget class="QLabel" name="label_5"> <widget class="QLabel" name="label_6">
<property name="text"> <property name="text">
<string>Bed size</string> <string>X</string>
</property> </property>
</widget> </widget>
</item> </item>