Add write que to microcontroller to avoid overringing the mcu buffer while not stalling the applicaiton
This commit is contained in:
parent
24c168cf64
commit
34769049f9
2 changed files with 34 additions and 19 deletions
|
|
@ -1,8 +1,5 @@
|
|||
#include "microcontroller.h"
|
||||
|
||||
#include <chrono>
|
||||
#include <thread>
|
||||
|
||||
void Microcontroller::relayToggle(int state, int relay)
|
||||
{
|
||||
char buffer[8];
|
||||
|
|
@ -49,22 +46,34 @@ void Microcontroller::setAuxPwm(int duty)
|
|||
|
||||
void Microcontroller::write(const QByteArray& buffer)
|
||||
{
|
||||
if(_port != nullptr)
|
||||
writeQue.enqueue(buffer);
|
||||
if(!writeTimer.isActive())
|
||||
{
|
||||
_port->write(buffer);
|
||||
_port->waitForBytesWritten(1000);
|
||||
writeTimer.setInterval(0);
|
||||
writeTimer.start();
|
||||
}
|
||||
std::this_thread::sleep_for(std::chrono::milliseconds(40));
|
||||
}
|
||||
|
||||
void Microcontroller::write(char* buffer, const size_t length)
|
||||
{
|
||||
if(_port != nullptr)
|
||||
{
|
||||
_port->write(buffer, length);
|
||||
_port->waitForBytesWritten(1000);
|
||||
write(QByteArray(buffer, length));
|
||||
}
|
||||
|
||||
void Microcontroller::onWriteTimerTimeout()
|
||||
{
|
||||
writeTimer.setInterval(50);
|
||||
if(connected())
|
||||
{
|
||||
if(!writeQue.empty())
|
||||
{
|
||||
QByteArray data = writeQue.dequeue();
|
||||
_port->write(data);
|
||||
}
|
||||
else
|
||||
{
|
||||
writeTimer.stop();
|
||||
}
|
||||
}
|
||||
std::this_thread::sleep_for(std::chrono::milliseconds(40));
|
||||
}
|
||||
|
||||
void Microcontroller::setPattern(int pattern)
|
||||
|
|
@ -82,8 +91,10 @@ void Microcontroller::startSunrise()
|
|||
|
||||
bool Microcontroller::connected()
|
||||
{
|
||||
if(_port != nullptr) return _port->isOpen();
|
||||
else return false;
|
||||
if(_port != nullptr)
|
||||
return _port->isOpen();
|
||||
else
|
||||
return false;
|
||||
}
|
||||
|
||||
void Microcontroller::refresh()
|
||||
|
|
@ -93,13 +104,17 @@ void Microcontroller::refresh()
|
|||
|
||||
//housekeeping
|
||||
|
||||
Microcontroller::Microcontroller(QIODevice* port)
|
||||
Microcontroller::Microcontroller(QIODevice* port): Microcontroller()
|
||||
{
|
||||
setIODevice(port);
|
||||
}
|
||||
|
||||
Microcontroller::Microcontroller()
|
||||
{
|
||||
writeTimer.setInterval(50);
|
||||
writeTimer.setSingleShot(false);
|
||||
connect(&writeTimer, &QTimer::timeout, this, &Microcontroller::onWriteTimerTimeout);
|
||||
qDebug()<<__func__<<writeTimer.isActive();
|
||||
}
|
||||
|
||||
Microcontroller::~Microcontroller()
|
||||
|
|
|
|||
|
|
@ -7,9 +7,9 @@
|
|||
#include <QString>
|
||||
#include <QRunnable>
|
||||
#include <QDebug>
|
||||
#include <QEventLoop>
|
||||
#include <QTimer>
|
||||
#include <QAbstractButton>
|
||||
#include <QByteArray>
|
||||
#include <QQueue>
|
||||
#include <vector>
|
||||
#include <memory>
|
||||
#include "items/item.h"
|
||||
|
|
@ -32,13 +32,12 @@ private:
|
|||
|
||||
bool listMode = false;
|
||||
|
||||
//uint8_t _auxState = 0;
|
||||
|
||||
QIODevice* _port = nullptr;
|
||||
QQueue<QByteArray> writeQue;
|
||||
QTimer writeTimer;
|
||||
|
||||
std::vector< std::shared_ptr<Item> > relayList;
|
||||
|
||||
QScopedPointer<QEventLoop> loop;
|
||||
QString _buffer;
|
||||
|
||||
void processMicroReturn();
|
||||
|
|
@ -75,6 +74,7 @@ public slots:
|
|||
private slots:
|
||||
|
||||
void isReadyRead();
|
||||
void onWriteTimerTimeout();
|
||||
|
||||
signals:
|
||||
void textRecived(const QString string);
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue