2018-05-22 11:15:59 -07:00
# include "mainwindow.h"
# include "ui_mainwindow.h"
# include <QDir>
2018-05-29 16:09:57 -07:00
# include <QFile>
2018-05-24 15:51:57 -07:00
# include <QStringList>
2018-05-23 17:57:14 -07:00
# include <QTimer>
2018-05-23 18:34:05 -07:00
# include <QImage>
# include <QPixmap>
2018-05-22 11:15:59 -07:00
# include <QFileDialog>
2018-05-29 16:09:57 -07:00
# include <QHostInfo>
2018-05-22 11:15:59 -07:00
# include <QNetworkConfiguration>
2018-05-29 16:09:57 -07:00
# include <QIntValidator>
2018-05-22 11:15:59 -07:00
2018-05-22 15:08:11 -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"
2018-05-22 15:08:11 -07:00
# 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 ) ;
2018-05-22 15:08:11 -07:00
2018-05-29 16:09:57 -07:00
ui - > relayPort - > setValidator ( new QIntValidator ( 0 , 65535 , this ) ) ;
2018-05-22 15:08:11 -07:00
serialOut = nullptr ;
userTerminal = nullptr ;
systemInterface = nullptr ;
2018-05-23 17:57:14 -07:00
2018-05-23 19:10:51 -07:00
dependencyBlob = " " ;
testProgram = " " ;
2018-05-29 13:51:09 -07:00
//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 ( ) {
2018-05-23 18:34:05 -07:00
while ( userTerminal - > stringAvailableCxx ( ) )
ui - > receiveText - > setText ( ui - > receiveText - > toPlainText ( ) + userTerminal - > readStringCxx ( ) + ' \n ' ) ;
systemInterface - > systemData . lock ( ) ;
2018-05-23 19:10:51 -07:00
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 ( ) ;
2018-05-23 18:34:05 -07:00
2018-05-23 19:10:51 -07:00
//javascript program has stopped, window updating service no longer needed
2018-05-29 11:10:43 -07:00
if ( ! testEnv . running ( ) ) {
ui - > receiveText - > setText ( ui - > receiveText - > toPlainText ( ) + " PROGRAM FINISHED! " + ' \n ' ) ;
2018-05-23 19:10:51 -07:00
refreshWindow - > stop ( ) ;
2018-05-29 11:10:43 -07:00
}
2018-05-22 15:08:11 -07:00
}
2018-05-23 17:57:14 -07:00
void MainWindow : : launchJs ( bool serialOverWifi ) {
2018-05-29 11:10:43 -07:00
testEnv . finish ( ) ;
2018-05-22 15:08:11 -07:00
testEnv . clearExecutionEnviroment ( ) ;
2018-05-29 11:10:43 -07:00
ui - > framebuffer - > clear ( ) ;
2018-05-22 15:08:11 -07:00
systemInterface = new JSSystem ( ) ;
2018-05-23 17:57:14 -07:00
testEnv . installClass ( " jsSystem " , systemInterface ) ;
2018-05-29 16:09:57 -07:00
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 ( ) ;
2018-05-29 11:10:43 -07:00
refreshWindow - > start ( 16 ) ; //update the window every 16.67miliseconds = 60 * second
2018-05-22 15:08:11 -07:00
}
2018-05-29 16:09:57 -07:00
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 ;
2018-05-29 16:09:57 -07:00
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 ( ) {
2018-05-26 17:40:42 -07:00
QString lastTestProgramPath = appSettings . value ( " lastTestProgramPath " , QDir : : root ( ) . path ( ) ) . toString ( ) ;
QString programPath = QFileDialog : : getOpenFileName ( this , " Select Test Program " , lastTestProgramPath , 0 ) ;
2018-05-29 16:09:57 -07:00
QFile testProgramData ( programPath ) ;
2018-05-26 17:40:42 -07:00
2018-05-29 16:09:57 -07:00
if ( testProgramData . open ( QFile : : ReadOnly ) ) {
testProgram = testProgramData . readAll ( ) ;
testProgramData . close ( ) ;
}
else {
2018-05-22 11:15:59 -07:00
testProgram = " " ;
2018-05-29 16:09:57 -07:00
}
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
2018-05-29 16:09:57 -07:00
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 ( ) {
2018-05-26 17:40:42 -07:00
QString lastDependencyBlobPath = appSettings . value ( " lastDependencyBlobPath " , QDir : : root ( ) . path ( ) ) . toString ( ) ;
QString blobPath = QFileDialog : : getOpenFileName ( this , " Select Dependency Blob " , lastDependencyBlobPath , 0 ) ;
2018-05-29 16:09:57 -07:00
QFile dependencyBlobData ( blobPath ) ;
2018-05-26 17:40:42 -07:00
2018-05-29 16:09:57 -07:00
if ( dependencyBlobData . open ( QFile : : ReadOnly ) ) {
dependencyBlob = dependencyBlobData . readAll ( ) ;
dependencyBlobData . close ( ) ;
}
else {
2018-05-22 11:15:59 -07:00
dependencyBlob = " " ;
2018-05-29 16:09:57 -07:00
}
2018-05-22 11:15:59 -07:00
}
void MainWindow : : on_pickSslCertificate_clicked ( ) {
2018-05-26 17:40:42 -07:00
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 ] ) ;
}
2018-05-26 17:40:42 -07:00
void MainWindow : : on_sendText_returnPressed ( ) {
if ( testEnv . running ( ) ) {
userTerminal - > writeStringCxx ( ui - > sendText - > text ( ) ) ;
ui - > sendText - > clear ( ) ;
}
}
2018-05-29 11:10:43 -07:00
void MainWindow : : on_clearTerminal_clicked ( ) {
ui - > receiveText - > clear ( ) ;
}