From f681987dbea69005bc3313d02559ecc0b2087187 Mon Sep 17 00:00:00 2001 From: Georgi Tushev Date: Fri, 4 Jan 2019 17:13:48 +0100 Subject: [PATCH] add microtome commands --- BrainATUMtome/microtome.cpp | 55 ++++++++++++++++++++++++++++++++++-- BrainATUMtome/microtome.h | 27 ++++++++++++++++++ BrainATUMtome/serialport.cpp | 8 +++--- config/settings.ini | 2 +- 4 files changed, 84 insertions(+), 8 deletions(-) diff --git a/BrainATUMtome/microtome.cpp b/BrainATUMtome/microtome.cpp index 5feb039..b5b4ee5 100644 --- a/BrainATUMtome/microtome.cpp +++ b/BrainATUMtome/microtome.cpp @@ -1,7 +1,8 @@ #include "microtome.h" Microtome::Microtome(QObject *parent) : QObject(parent), - m_serialPort(nullptr) + m_serialPort(nullptr), + m_cutter_requestStop(false) { } @@ -22,28 +23,76 @@ void Microtome::open(const QString &portName, int baudRate) } ); m_serialPort->open(portName, baudRate); + connect(this, &Microtome::schedule, m_serialPort, &SerialPort::on_scheduleMessage); } void Microtome::on_uirequest_cuttingMotor(bool state) { - QString textState = (state) ? "on" : "off"; - emit log(EventLogType::Notify, "Microtome :: cutting motor is " + textState); + // request mottor stop at a retraction position + if (!state) { + m_cutter_requestStop = true; + return; + } + + // ask for feedrate advance + QString command = SerialPackage::pack(ADDRESS_COMMAND_STEPPER) + + SerialPackage::pack(STEPPER_FEEDRATE_MOTOR_CONTROL) + + SerialPackage::pack(STATUS_GET); + QString buffer = SerialPackage::package(command); + emit schedule(buffer.toUtf8()); + + // start cutting motor + m_cutter_requestStop = false; + emit log(EventLogType::Notify, "Microtome :: cutting motor is on"); + command = SerialPackage::pack(ADDRESS_COMMAND_CUTTER) + + SerialPackage::pack(CUTTER_MOTOR) + + SerialPackage::pack(STATUS_SET); + buffer = SerialPackage::package(command); + + emit schedule(buffer.toUtf8()); } void Microtome::on_uirequest_cuttingSpeed(int cuttingSpeed) { emit log(EventLogType::Notify, "Microtome :: cutting speed is " + QString::number(cuttingSpeed)); + + // 1 digit = 10 um/sec + quint16 valueCuttingSpeed = static_cast(cuttingSpeed / 10); + QString command = SerialPackage::pack(ADDRESS_COMMAND_CUTTER) + + SerialPackage::pack(CUTTER_SPEED_CUTTING) + + SerialPackage::pack(STATUS_SET) + + SerialPackage::pack(valueCuttingSpeed); + QString buffer = SerialPackage::package(command); + emit schedule(buffer.toUtf8()); } void Microtome::on_uirequest_returnSpeed(int returnSpeed) { emit log(EventLogType::Notify, "Microtome :: return speed is " + QString::number(returnSpeed)); + + // 1 digit = 10 um/sec + quint16 valueReturnSpeed = static_cast(returnSpeed / 10); + QString command = SerialPackage::pack(ADDRESS_COMMAND_CUTTER) + + SerialPackage::pack(CUTTER_SPEED_RETURN) + + SerialPackage::pack(STATUS_SET) + + SerialPackage::pack(valueReturnSpeed); + QString buffer = SerialPackage::package(command); + emit schedule(buffer.toUtf8()); } void Microtome::on_uirequest_feedStep(int feedStep) { emit log(EventLogType::Notify, "Microtome :: feed step is " + QString::number(feedStep)); + + // 1 digit == 1 nm + quint16 valueFeedStep = static_cast(feedStep); + QString command = SerialPackage::pack(ADDRESS_COMMAND_STEPPER) + + SerialPackage::pack(STEPPER_FEED) + + SerialPackage::pack(STATUS_SET) + + SerialPackage::pack(valueFeedStep); + QString buffer = SerialPackage::package(command); + emit schedule(buffer.toUtf8()); } diff --git a/BrainATUMtome/microtome.h b/BrainATUMtome/microtome.h index b3375f8..7062bb8 100644 --- a/BrainATUMtome/microtome.h +++ b/BrainATUMtome/microtome.h @@ -19,6 +19,32 @@ class Microtome : public QObject private: SerialPort *m_serialPort; + bool m_cutter_requestStop; + + const quint8 ADDRESS_COMMAND_SYSTEM = 0x81; + const quint8 ADDRESS_RESPOND_SYSTEM = 0x18; + const quint8 ADDRESS_COMMAND_STEPPER = 0x41; + const quint8 ADDRESS_RESPOND_STEPPER = 0x14; + const quint8 ADDRESS_COMMAND_CUTTER = 0x51; + const quint8 ADDRESS_RESPOND_CUTTER = 0x15; + + const quint8 SYSTEM_GET_PARTID = 0xF1; + const quint8 SYSTEM_COMMAND_TRANSMISSION_ERROR = 0xF3; + const quint8 SYSTEM_GET_VERSION = 0xF5; + + const quint8 STEPPER_FEEDRATE_MOTOR_CONTROL = 0x20; + const quint8 STEPPER_FEED = 0x23; + + const quint8 CUTTER_MOTOR = 0x20; + const quint8 CUTTER_SPEED_CUTTING = 0x30; + const quint8 CUTTER_SPEED_RETURN = 0x31; + const quint8 CUTTER_HANDWHEEL_POSITION = 0x40; + + const quint8 STATUS_NULL = 0x00; + const quint8 STATUS_SET = 0x01; + const quint8 STATUS_GET = 0xFF; + const quint8 STATUS_INVALID_CALIBRATION = 0xE0; + public slots: void on_uirequest_cuttingMotor(bool state); @@ -28,6 +54,7 @@ public slots: signals: void log(EventLogType type, const QString &message); + void schedule(const QByteArray &message); }; diff --git a/BrainATUMtome/serialport.cpp b/BrainATUMtome/serialport.cpp index 502eabf..d18d04d 100644 --- a/BrainATUMtome/serialport.cpp +++ b/BrainATUMtome/serialport.cpp @@ -24,9 +24,9 @@ SerialPort::SerialPort(QObject *parent) : QObject(parent), connect(m_timerRespond, &QTimer::timeout, [this](){emit log(EventLogType::Warn, "SerialPort :: respond timeout.");}); - connect(stateListener, &QState::entered, [this](){emit log(EventLogType::Notify, "SerialPort ::Dispatcher::Listener");}); - connect(stateSender, &QState::entered, [this](){emit log(EventLogType::Notify, "SerialPort ::Dispatcher::Sender");}); - connect(stateReceiver, &QState::entered, [this](){emit log(EventLogType::Notify, "SerialPort ::Dispatcher::Receiver");}); + //connect(stateListener, &QState::entered, [this](){emit log(EventLogType::Notify, "SerialPort ::Dispatcher::Listener");}); + //connect(stateSender, &QState::entered, [this](){emit log(EventLogType::Notify, "SerialPort ::Dispatcher::Sender");}); + //connect(stateReceiver, &QState::entered, [this](){emit log(EventLogType::Notify, "SerialPort ::Dispatcher::Receiver");}); } @@ -135,7 +135,7 @@ void SerialPort::on_bufferWrite() else { m_timerRespond->start(); - emit log(EventLogType::Notify, "SerialPort :: message " + QString::fromUtf8(packageBuffer)); + emit log(EventLogType::Respond, "SerialPort :: message " + QString::fromUtf8(packageBuffer)); emit sent(); } } diff --git a/config/settings.ini b/config/settings.ini index 5574d8c..8406467 100644 --- a/config/settings.ini +++ b/config/settings.ini @@ -1,5 +1,5 @@ [microtome] -#deviceName=Leica +#deviceName=LeicaEMUC7 #port=COM2 #baudRate=19200 deviceName=Arduino