1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107
|
#include "virtualdisplay.h"
#include <QDebug>
#include <QLoggingCategory>
#include "flipperzero.h"
#include "devicestate.h"
#include "protobufsession.h"
#include "rpc/guistartvirtualdisplayoperation.h"
#include "rpc/guistopvirtualdisplayoperation.h"
#include "rpc/guiscreenframeoperation.h"
Q_LOGGING_CATEGORY(LOG_VIRTDISPLAY, "DPY")
using namespace Flipper;
using namespace Zero;
VirtualDisplay::VirtualDisplay(QObject *parent):
QObject(parent),
m_displayState(DisplayState::Stopped),
m_device(nullptr)
{}
void VirtualDisplay::setDevice(FlipperZero *device)
{
if(device == m_device) {
return;
}
m_device = device;
if(device) {
connect(device->rpc(), &ProtobufSession::sessionStateChanged, this, &VirtualDisplay::onProtobufSessionStateChanged);
}
}
VirtualDisplay::DisplayState VirtualDisplay::displayState() const
{
return m_displayState;
}
void VirtualDisplay::start(const QByteArray &firstFrame)
{
if(m_displayState != DisplayState::Stopped) {
return;
}
setDisplayState(DisplayState::Starting);
auto *operation = m_device->rpc()->guiStartVirtualDisplay(firstFrame);
connect(operation, &AbstractOperation::finished, this, [=]() {
if(operation->isError()) {
qCDebug(LOG_VIRTDISPLAY).noquote() << "Failed to start virtual display:" << operation->errorString();
setDisplayState(DisplayState::Stopped);
} else {
setDisplayState(DisplayState::Running);
}
});
}
void VirtualDisplay::sendFrame(const QByteArray &screenFrame)
{
auto *operation = m_device->rpc()->guiSendScreenFrame(screenFrame);
connect(operation, &AbstractOperation::finished, this, [=]() {
if(operation->isError()) {
qCDebug(LOG_VIRTDISPLAY).noquote() << "Failed to send screen frame:" << operation->errorString();
}
});
}
void VirtualDisplay::stop()
{
if(m_displayState != DisplayState::Running) {
return;
}
setDisplayState(DisplayState::Stopping);
auto *operation = m_device->rpc()->guiStopVirtualDisplay();
connect(operation, &AbstractOperation::finished, this, [=]() {
if(operation->isError()) {
qCDebug(LOG_VIRTDISPLAY).noquote() << "Failed to stop virtual display:" << operation->errorString();
}
setDisplayState(DisplayState::Stopped);
});
}
void VirtualDisplay::onProtobufSessionStateChanged()
{
if(!m_device->rpc()->isSessionUp()) {
setDisplayState(Stopped);
}
}
void VirtualDisplay::setDisplayState(DisplayState newState)
{
if(newState == m_displayState) {
return;
}
m_displayState = newState;
emit displayStateChanged();
}
|