int main(int argc, char* argv[]) { std::shared_ptr<Empty> blank; std::shared_ptr<Program> prg(new Program()); std::shared_ptr<SharedDecl> shDecl1(new SharedDecl("y", blank)); prg->Add(shDecl1); std::shared_ptr<Node> initX(new Atom("2")); std::shared_ptr<SharedDecl> shDecl2(new SharedDecl("x", initX)); prg->Add(shDecl2); std::shared_ptr<Sub> sub1(new Sub("Main")); sub1->AddParam("a"); sub1->AddParam("b"); prg->Add(sub1); std::shared_ptr<Atom> atomA(new Atom("a")); std::shared_ptr<Atom> atomB(new Atom("b")); std::shared_ptr<BinaryOp> initRes(new BinaryOp("add", atomA, atomB)); std::shared_ptr<VarDecl> resDecl(new VarDecl("res", initRes)); sub1->Add(resDecl); std::shared_ptr<Atom> atom3i(new Atom("3")); std::shared_ptr<Atom> atom5i(new Atom("5")); std::shared_ptr<BinaryOp> newParam(new BinaryOp("add", atom3i, atom5i)); std::shared_ptr<Allocation> allocat(new Allocation(newParam)); std::shared_ptr<Atom> atomArr(new Atom("arr")); std::shared_ptr<Assignation> asignNew3(new Assignation(atomArr, allocat)); sub1->Add(asignNew3); std::shared_ptr<Atom> atomArrBis(new Atom("arr")); std::shared_ptr<Deallocation> deallocat(new Deallocation(atomArrBis)); sub1->Add(deallocat); std::shared_ptr<Atom> atomC(new Atom("res")); std::shared_ptr<BinaryOp> subCsumAB(new BinaryOp("substract", atomC, initRes)); std::shared_ptr<Assignation> incC(new Assignation(atomC, subCsumAB)); sub1->Add(incC); std::shared_ptr<Atom> atom0(new Atom("0")); std::shared_ptr<BinaryOp> cond1cond(new BinaryOp("equals", atomC, atom0)); std::shared_ptr<If> cond1(new If(cond1cond, "10", "20")); sub1->Add(cond1); std::shared_ptr<Atom> atom1(new Atom("1")); std::shared_ptr<Atom> atom10(new Atom("10")); std::shared_ptr<For> for1(new For("i", atom1, atom10, atom1)); sub1->Add(for1); std::shared_ptr<BinaryOp> addC1(new BinaryOp("add", atomC, atom1)); std::shared_ptr<Assignation> incResActually(new Assignation(atomC, addC1)); for1->Add(incResActually); std::shared_ptr<Loop> loop1(new Loop(cond1cond)); loop1->Add(for1); // don't double reference ever in practice... loop1->Add(addC1); sub1->Add(loop1); std::shared_ptr<Call> call1(new Call("testFun", "")); call1->AddParam(atomA); call1->AddParam(addC1); sub1->Add(call1); std::shared_ptr<Return> ret1(new Return(atom0)); sub1->Add(ret1); XMLDumpVisitor v; prg->Accept(&v); return 0; }
MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow), // open_button_text(tr(OPEN_BUTTON_TEXT)), // close_button_text(tr(CLOSE_BUTTON_TEXT)), open_button_text(tr("Open")), close_button_text(tr("Close / Reset")), absoluteAfterAxisAdj(false), checkLogWrite(false), sliderPressed(false), sliderTo(0.0), sliderZCount(0), scrollRequireMove(true), scrollPressed(false) { // Setup our application information to be used by QSettings QCoreApplication::setOrganizationName(COMPANY_NAME); QCoreApplication::setOrganizationDomain(DOMAIN_NAME); QCoreApplication::setApplicationName(APPLICATION_NAME); // required if passing the object by reference into signals/slots qRegisterMetaType<Coord3D>("Coord3D"); qRegisterMetaType<PosItem>("PosItem"); qRegisterMetaType<ControlParams>("ControlParams"); ui->setupUi(this); readSettings(); info("%s has started", GRBL_CONTROLLER_NAME_AND_VERSION); // see http://blog.qt.digia.com/2010/06/17/youre-doing-it-wrong/ // The thread points out that the documentation for QThread is wrong :) and // you should NOT subclass from QThread and override run(), rather, // attach your QOBJECT to a thread and use events (signals/slots) to communicate. gcode.moveToThread(&gcodeThread); runtimeTimer.moveToThread(&runtimeTimerThread); ui->lcdWorkNumberX->setDigitCount(8); ui->lcdMachNumberX->setDigitCount(8); ui->lcdWorkNumberY->setDigitCount(8); ui->lcdMachNumberY->setDigitCount(8); ui->lcdWorkNumberZ->setDigitCount(8); ui->lcdMachNumberZ->setDigitCount(8); ui->lcdWorkNumberC->setDigitCount(8); ui->lcdMachNumberC->setDigitCount(8); if (!controlParams.useFourAxis) { ui->DecCBtn->hide(); ui->IncCBtn->hide(); ui->lblCJog->hide(); ui->lcdWorkNumberC->hide(); ui->lcdWorkNumberC->setAttribute(Qt::WA_DontShowOnScreen, true); ui->lcdMachNumberC->hide(); ui->lcdMachNumberC->setAttribute(Qt::WA_DontShowOnScreen, true); ui->lblC->hide(); ui->lblC->setAttribute(Qt::WA_DontShowOnScreen, true); } //buttons connect(ui->btnOpenPort,SIGNAL(clicked()),this,SLOT(openPort())); connect(ui->btnGRBL,SIGNAL(clicked()),this,SLOT(setGRBL())); connect(ui->DecXBtn,SIGNAL(clicked()),this,SLOT(decX())); connect(ui->DecYBtn,SIGNAL(clicked()),this,SLOT(decY())); connect(ui->DecZBtn,SIGNAL(clicked()),this,SLOT(decZ())); connect(ui->IncXBtn,SIGNAL(clicked()),this,SLOT(incX())); connect(ui->IncYBtn,SIGNAL(clicked()),this,SLOT(incY())); connect(ui->IncZBtn,SIGNAL(clicked()),this,SLOT(incZ())); connect(ui->DecCBtn,SIGNAL(clicked()),this,SLOT(decC())); connect(ui->IncCBtn,SIGNAL(clicked()),this,SLOT(incC())); connect(ui->btnSetHome,SIGNAL(clicked()),this,SLOT(setHome())); connect(ui->comboCommand->lineEdit(),SIGNAL(editingFinished()),this,SLOT(gotoXYZC())); connect(ui->Begin,SIGNAL(clicked()),this,SLOT(begin())); connect(ui->openFile,SIGNAL(clicked()),this,SLOT(openFile())); connect(ui->Stop,SIGNAL(clicked()),this,SLOT(stop())); connect(ui->SpindleOn,SIGNAL(toggled(bool)),this,SLOT(toggleSpindle())); connect(ui->chkRestoreAbsolute,SIGNAL(toggled(bool)),this,SLOT(toggleRestoreAbsolute())); connect(ui->actionOptions,SIGNAL(triggered()),this,SLOT(getOptions())); connect(ui->actionExit,SIGNAL(triggered()),this,SLOT(close())); connect(ui->actionAbout,SIGNAL(triggered()),this,SLOT(showAbout())); connect(ui->btnResetGrbl,SIGNAL(clicked()),this,SLOT(grblReset())); connect(ui->btnUnlockGrbl,SIGNAL(clicked()),this,SLOT(grblUnlock())); connect(ui->btnGoHomeSafe,SIGNAL(clicked()),this,SLOT(goHomeSafe())); connect(ui->verticalSliderZJog,SIGNAL(valueChanged(int)),this,SLOT(zJogSliderDisplay(int))); connect(ui->verticalSliderZJog,SIGNAL(sliderPressed()),this,SLOT(zJogSliderPressed())); connect(ui->verticalSliderZJog,SIGNAL(sliderReleased()),this,SLOT(zJogSliderReleased())); connect(this, SIGNAL(sendFile(QString)), &gcode, SLOT(sendFile(QString))); connect(this, SIGNAL(openPort(QString,QString)), &gcode, SLOT(openPort(QString,QString))); connect(this, SIGNAL(closePort(bool)), &gcode, SLOT(closePort(bool))); connect(this, SIGNAL(sendGcode(QString)), &gcode, SLOT(sendGcode(QString))); connect(this, SIGNAL(gotoXYZC(QString)), &gcode, SLOT(gotoXYZC(QString))); connect(this, SIGNAL(axisAdj(char, float, bool, bool, int)), &gcode, SLOT(axisAdj(char, float, bool, bool, int))); connect(this, SIGNAL(setResponseWait(ControlParams)), &gcode, SLOT(setResponseWait(ControlParams))); connect(this, SIGNAL(shutdown()), &gcodeThread, SLOT(quit())); connect(this, SIGNAL(shutdown()), &runtimeTimerThread, SLOT(quit())); connect(this, SIGNAL(setProgress(int)), ui->progressFileSend, SLOT(setValue(int))); connect(this, SIGNAL(setRuntime(QString)), ui->outputRuntime, SLOT(setText(QString))); connect(this, SIGNAL(sendSetHome()), &gcode, SLOT(grblSetHome())); connect(this, SIGNAL(sendGrblReset()), &gcode, SLOT(sendGrblReset())); connect(this, SIGNAL(sendGrblUnlock()), &gcode, SLOT(sendGrblUnlock())); connect(this, SIGNAL(goToHome()), &gcode, SLOT(goToHome())); connect(this, SIGNAL(setItems(QList<PosItem>)), ui->wgtVisualizer, SLOT(setItems(QList<PosItem>))); connect(&gcode, SIGNAL(sendMsg(QString)),this,SLOT(receiveMsg(QString))); connect(&gcode, SIGNAL(portIsClosed(bool)), this, SLOT(portIsClosed(bool))); connect(&gcode, SIGNAL(portIsOpen(bool)), this, SLOT(portIsOpen(bool))); connect(&gcode, SIGNAL(addList(QString)),this,SLOT(receiveList(QString))); connect(&gcode, SIGNAL(addListFull(QStringList)),this,SLOT(receiveListFull(QStringList))); connect(&gcode, SIGNAL(addListOut(QString)),this,SLOT(receiveListOut(QString))); connect(&gcode, SIGNAL(stopSending()), this, SLOT(stopSending())); connect(&gcode, SIGNAL(setCommandText(QString)), ui->comboCommand->lineEdit(), SLOT(setText(QString))); connect(&gcode, SIGNAL(setProgress(int)), ui->progressFileSend, SLOT(setValue(int))); connect(&gcode, SIGNAL(adjustedAxis()), this, SLOT(adjustedAxis())); connect(&gcode, SIGNAL(resetTimer(bool)), &runtimeTimer, SLOT(resetTimer(bool))); connect(&gcode, SIGNAL(enableGrblDialogButton()), this, SLOT(enableGrblDialogButton())); connect(&gcode, SIGNAL(updateCoordinates(Coord3D,Coord3D)), this, SLOT(updateCoordinates(Coord3D,Coord3D))); connect(&gcode, SIGNAL(setLastState(QString)), ui->outputLastState, SLOT(setText(QString))); connect(&gcode, SIGNAL(setUnitsWork(QString)), ui->outputUnitsWork, SLOT(setText(QString))); connect(&gcode, SIGNAL(setUnitsMachine(QString)), ui->outputUnitsMachine, SLOT(setText(QString))); connect(&gcode, SIGNAL(setLivePoint(double, double, bool)), ui->wgtVisualizer, SLOT(setLivePoint(double, double, bool))); connect(&gcode, SIGNAL(setVisCurrLine(int)), ui->wgtVisualizer, SLOT(setVisCurrLine(int))); connect(&runtimeTimer, SIGNAL(setRuntime(QString)), ui->outputRuntime, SLOT(setText(QString))); // This code generates too many messages and chokes operation on raspberry pi. Do not use. //connect(ui->statusList->model(), SIGNAL(rowsInserted(const QModelIndex&, int, int)), ui->statusList, SLOT(scrollToBottom())); // instead, use this one second timer-based approach scrollTimer = new QTimer(this); connect(scrollTimer, SIGNAL(timeout()), this, SLOT(doScroll())); scrollTimer->start(1000); connect(ui->statusList->verticalScrollBar(), SIGNAL(sliderPressed()), this, SLOT(statusSliderPressed())); connect(ui->statusList->verticalScrollBar(), SIGNAL(sliderReleased()), this, SLOT(statusSliderReleased())); runtimeTimerThread.start(); gcodeThread.start(); ui->comboStep->addItem("0.01"); ui->comboStep->addItem("0.1"); ui->comboStep->addItem("1"); ui->comboStep->addItem("10"); ui->comboStep->addItem("100"); ui->comboStep->setCurrentIndex(3); // Don't use - it will not show horizontal scrollbar for small app size //ui->statusList->setUniformItemSizes(true); // Does not work correctly for horizontal scrollbar: //MyItemDelegate *scrollDelegate = new MyItemDelegate(ui->statusList); //scrollDelegate->setWidth(600); //ui->statusList->setItemDelegate(scrollDelegate); scrollStatusTimer.start(); // Cool utility class off Google code that enumerates COM ports in platform-independent manner QList<QextPortInfo> ports = QextSerialEnumerator::getPorts(); int portIndex = -1; for (int i = 0; i < ports.size(); i++) { ui->cmbPort->addItem(ports.at(i).portName.toLocal8Bit().constData()); if (ports.at(i).portName == lastOpenPort) portIndex = i; //diag("port name: %s\n", ports.at(i).portName.toLocal8Bit().constData()); //diag("friendly name: %s\n", ports.at(i).friendName.toLocal8Bit().constData()); //diag("physical name: %s\n", ports.at(i).physName.toLocal8Bit().constData()); //diag("enumerator name: %s\n", ports.at(i).enumName.toLocal8Bit().constData()); //diag("===================================\n\n"); } if (portIndex >= 0) { // found matching port ui->cmbPort->setCurrentIndex(portIndex); } else if (lastOpenPort.size() > 0) { // did not find matching port // This code block is used to restore a port to view that isn't visible to QextSerialEnumerator ui->cmbPort->addItem(lastOpenPort.toLocal8Bit().constData()); if (ports.size() > 0) ui->cmbPort->setCurrentIndex(ports.size()); else ui->cmbPort->setCurrentIndex(0); } int baudRates[] = { 9600, 19200, 38400, 57600, 115200 }; int baudRateCount = sizeof baudRates / sizeof baudRates[0]; int baudRateIndex = 0; for (int i = 0; i < baudRateCount; i++) { QString baudRate = QString::number(baudRates[i]); ui->comboBoxBaudRate->addItem(baudRate); if (baudRate == lastBaudRate) { baudRateIndex = i; } } ui->comboBoxBaudRate->setCurrentIndex(baudRateIndex); ui->tabAxisVisualizer->setEnabled(false); if (!controlParams.useFourAxis) { ui->lcdWorkNumberC->setEnabled(false);; ui->lcdMachNumberC->setEnabled(false);; ui->IncCBtn->setEnabled(false); ui->DecCBtn->setEnabled(false); ui->lblCJog->setEnabled(false); } ui->groupBoxSendFile->setEnabled(true); ui->comboCommand->setEnabled(false); ui->labelCommand->setEnabled(false); ui->Begin->setEnabled(false); ui->Stop->setEnabled(false); ui->progressFileSend->setEnabled(false); ui->outputRuntime->setEnabled(false); ui->labelRuntime->setEnabled(false); ui->btnGRBL->setEnabled(false); ui->btnSetHome->setEnabled(false); ui->btnResetGrbl->setEnabled(false); ui->btnUnlockGrbl->setEnabled(false); ui->btnGoHomeSafe->setEnabled(false); styleSheet = ui->btnOpenPort->styleSheet(); ui->statusList->setEnabled(true); ui->openFile->setEnabled(true); this->setWindowTitle(GRBL_CONTROLLER_NAME_AND_VERSION); this->setWindowFlags(Qt::CustomizeWindowHint | Qt::WindowMinMaxButtonsHint | Qt::WindowCloseButtonHint); QSettings settings; QString useAggrPreload = settings.value(SETTINGS_USE_AGGRESSIVE_PRELOAD, "true").value<QString>(); controlParams.useAggressivePreload = useAggrPreload == "true"; if (!controlParams.useAggressivePreload && !promptedAggrPreload) { QMessageBox msgBox; msgBox.setText(tr("You appear to have upgraded to the latest version of Grbl Controller. " "Please be aware that as of version 3.4 the default behavior of sending commands " "to Grbl has been changed to send them as fast as possible (Aggressive preload mode).\n\n" "Your settings have been changed to enable this mode. Why? Because it provides the most " "optimal use of Grbl and greatly reduces the time to finish a typical job.\n\n" "What does this mean to you? " "Arc commands will now run smoother and faster than before, which may " "cause your spindle to work slightly harder, so please run some tests first. " "Alternately, go to the Options dialog and manually disable Aggressive Preload") ); msgBox.exec(); controlParams.useAggressivePreload = true; settings.setValue(SETTINGS_USE_AGGRESSIVE_PRELOAD, controlParams.useAggressivePreload); } promptedAggrPreload = true; emit setResponseWait(controlParams); }