Files
Mu/localTester/LocalTester/mainwindow.cpp

179 lines
5.5 KiB
C++
Raw Normal View History

2018-05-22 11:15:59 -07:00
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QDir>
#include <QFile>
2018-05-24 15:51:57 -07:00
#include <QStringList>
2018-05-23 17:57:14 -07:00
#include <QTimer>
#include <QImage>
#include <QPixmap>
2018-05-22 11:15:59 -07:00
#include <QFileDialog>
#include <QHostInfo>
2018-05-22 11:15:59 -07:00
#include <QNetworkConfiguration>
#include <QIntValidator>
2018-05-22 11:15:59 -07:00
#include <stdint.h>
2018-05-22 11:15:59 -07:00
#include "serialportio.h"
2018-05-22 12:47:09 -07:00
#include "userio.h"
#include "jssystem.h"
2018-05-22 11:15:59 -07:00
#include "testexecutionenviroment.h"
2018-05-22 12:47:09 -07:00
MainWindow::MainWindow(QWidget* parent) :
2018-05-22 11:15:59 -07:00
QMainWindow(parent),
ui(new Ui::MainWindow){
ui->setupUi(this);
ui->relayPort->setValidator(new QIntValidator(0, 65535, this));
serialOut = nullptr;
userTerminal = nullptr;
systemInterface = nullptr;
2018-05-23 17:57:14 -07:00
dependencyBlob = "";
testProgram = "";
//temporary
testEnv.setErrorPath("/Users/Hoppy/Desktop/projects/PalmEmuRedo/libretro-palmm515emu/localTester/jsError.log");
2018-05-23 17:57:14 -07:00
refreshWindow = new QTimer(this);
connect(refreshWindow, SIGNAL(timeout()), this, SLOT(updateWindow()));
2018-05-22 11:15:59 -07:00
}
MainWindow::~MainWindow(){
delete ui;
}
2018-05-23 17:57:14 -07:00
void MainWindow::updateWindow(){
while(userTerminal->stringAvailableCxx())
ui->receiveText->setText(ui->receiveText->toPlainText() + userTerminal->readStringCxx() + '\n');
systemInterface->systemData.lock();
if(systemInterface->framebufferRender)
ui->framebuffer->setPixmap(QPixmap::fromImage(QImage((uchar*)systemInterface->framebufferPixels.data(), systemInterface->framebufferWidth, systemInterface->framebufferHeight, systemInterface->framebufferWidth * sizeof(uint16_t), QImage::Format_RGB16)));
systemInterface->systemData.unlock();
//javascript program has stopped, window updating service no longer needed
if(!testEnv.running()){
ui->receiveText->setText(ui->receiveText->toPlainText() + "PROGRAM FINISHED!" + '\n');
refreshWindow->stop();
}
}
2018-05-23 17:57:14 -07:00
void MainWindow::launchJs(bool serialOverWifi){
testEnv.finish();
testEnv.clearExecutionEnviroment();
ui->framebuffer->clear();
systemInterface = new JSSystem();
2018-05-23 17:57:14 -07:00
testEnv.installClass("jsSystem", systemInterface);
userTerminal = new UserIO();
testEnv.installClass("userIo", userTerminal);
if(serialOverWifi){
wifiSerialOut = new SerialOverWifi(ui->relayIp->text(), ui->relayPort->text().toUInt(), QByteArray());
testEnv.installClass("serialPort", wifiSerialOut);
}
else{
serialOut = new SerialPortIO(ui->serialPort->currentText());
testEnv.installClass("serialPort", serialOut);
}
2018-05-23 17:57:14 -07:00
testEnv.execute(dependencyBlob, "", false);
testEnv.finish();
testEnv.execute(testProgram, ui->sendText->text(), true);
ui->sendText->clear();
refreshWindow->start(16);//update the window every 16.67miliseconds = 60 * second
}
bool MainWindow::wifiValidate(){
//returns IP address if passed an IP address or website name, WiFi connected, SSL cert selected and connection succeeded otherwise returns an empty string
QString location = ui->relayIp->text();
QString port = ui->relayPort->text();
2018-05-22 11:15:59 -07:00
QNetworkConfiguration network;
if(network.state() & QNetworkConfiguration::Active && location != "" && port != "" && sslCertPath != ""){
QHostInfo info = QHostInfo::fromName(location);
if(info.addresses().length() > 0)
return true;
2018-05-22 11:15:59 -07:00
}
return false;
}
void MainWindow::on_pickTestProgram_clicked(){
QString lastTestProgramPath = appSettings.value("lastTestProgramPath", QDir::root().path()).toString();
QString programPath = QFileDialog::getOpenFileName(this, "Select Test Program", lastTestProgramPath, 0);
QFile testProgramData(programPath);
if(testProgramData.open(QFile::ReadOnly)){
testProgram = testProgramData.readAll();
testProgramData.close();
}
else{
2018-05-22 11:15:59 -07:00
testProgram = "";
}
2018-05-22 11:15:59 -07:00
}
void MainWindow::on_startLocalTesting_clicked(){
2018-05-24 15:51:57 -07:00
if(!testEnv.running() && ui->serialPort->currentText() != "")
2018-05-23 17:57:14 -07:00
launchJs(false);
2018-05-22 11:15:59 -07:00
}
void MainWindow::on_startRemoteTesting_clicked(){
//only run if WiFi available and IP address/website URL exists
if(!testEnv.running() && wifiValidate())
2018-05-23 17:57:14 -07:00
launchJs(true);
2018-05-22 11:15:59 -07:00
}
void MainWindow::on_startTestProxy_clicked(){
}
void MainWindow::on_pickDependencyBlob_clicked(){
QString lastDependencyBlobPath = appSettings.value("lastDependencyBlobPath", QDir::root().path()).toString();
QString blobPath = QFileDialog::getOpenFileName(this, "Select Dependency Blob", lastDependencyBlobPath, 0);
QFile dependencyBlobData(blobPath);
if(dependencyBlobData.open(QFile::ReadOnly)){
dependencyBlob = dependencyBlobData.readAll();
dependencyBlobData.close();
}
else{
2018-05-22 11:15:59 -07:00
dependencyBlob = "";
}
2018-05-22 11:15:59 -07:00
}
void MainWindow::on_pickSslCertificate_clicked(){
QString lastSslCertPath = appSettings.value("lastSslCertPath", QDir::root().path()).toString();
sslCertPath = QFileDialog::getOpenFileName(this, "Select SSL Certificate", lastSslCertPath, 0);
appSettings.setValue("lastSslCertPath", sslCertPath);
2018-05-22 11:15:59 -07:00
}
2018-05-24 15:51:57 -07:00
void MainWindow::on_refreshSerialPorts_clicked(){
QDir dev("/dev");
QStringList filters;
QStringList serialPorts;
filters.append("tty.*");//Mac OS serial ports
filters.append("ttyS*");//Linux serial ports
dev.setNameFilters(filters);
serialPorts = dev.entryList(QDir::System | QDir::Files, QDir::Name);
ui->serialPort->clear();
for(uint32_t port = 0; port < serialPorts.length(); port++)
ui->serialPort->addItem("/dev/" + serialPorts[port]);
}
void MainWindow::on_sendText_returnPressed(){
if(testEnv.running()){
userTerminal->writeStringCxx(ui->sendText->text());
ui->sendText->clear();
}
}
void MainWindow::on_clearTerminal_clicked(){
ui->receiveText->clear();
}