Skip to content

Commit

Permalink
IanniX 0.9.14 alpha 1
Browse files Browse the repository at this point in the history
- websockets for remote control
  • Loading branch information
gjacquemin committed Aug 20, 2013
1 parent 5ecb4d2 commit 08dea76
Show file tree
Hide file tree
Showing 28 changed files with 3,918 additions and 180 deletions.
19 changes: 15 additions & 4 deletions IanniX.pro
Original file line number Diff line number Diff line change
Expand Up @@ -72,23 +72,34 @@ SOURCES += items/uitreeview.cpp items/uitreeviewwidget.cpp items/uitreedelegate
HEADERS += items/uitreeview.h items/uitreeviewwidget.h items/uitreedelegate.h items/uifileitem.h items/uicoloritem.h items/uipathpointsitem.h items/uitextureitem.h
FORMS += items/uitreeview.ui

HEADERS += interfaces/interfacehttp.h interfaces/interfacemidi.h interfaces/interfaceosc.h interfaces/interfaceserial.h interfaces/interfacetcp.h interfaces/interfaceudp.h interfaces/interfacedirect.h interfaces/interfacesyphon.h
SOURCES += interfaces/interfacehttp.cpp interfaces/interfacemidi.cpp interfaces/interfaceosc.cpp interfaces/interfaceserial.cpp interfaces/interfacetcp.cpp interfaces/interfaceudp.cpp interfaces/interfacedirect.cpp
FORMS += interfaces/interfacehttp.ui interfaces/interfacemidi.ui interfaces/interfaceosc.ui interfaces/interfaceserial.ui interfaces/interfacetcp.ui interfaces/interfaceudp.ui interfaces/interfacedirect.ui interfaces/interfacesyphon.ui
HEADERS += interfaces/extscriptvariableask.h interfaces/extoscpatternask.h interfaces/extoscpatterneditor.h
SOURCES += interfaces/extscriptvariableask.cpp interfaces/extoscpatternask.cpp interfaces/extoscpatterneditor.cpp
FORMS += interfaces/extscriptvariableask.ui interfaces/extoscpatternask.ui interfaces/extoscpatterneditor.ui


#Native interfaces
HEADERS += interfaces/interfacehttp.h interfaces/interfacemidi.h interfaces/interfaceosc.h interfaces/interfaceserial.h interfaces/interfacetcp.h interfaces/interfaceudp.h interfaces/interfacedirect.h interfaces/interfacesyphon.h
SOURCES += interfaces/interfacehttp.cpp interfaces/interfacemidi.cpp interfaces/interfaceosc.cpp interfaces/interfaceserial.cpp interfaces/interfacetcp.cpp interfaces/interfaceudp.cpp interfaces/interfacedirect.cpp
FORMS += interfaces/interfacehttp.ui interfaces/interfacemidi.ui interfaces/interfaceosc.ui interfaces/interfaceserial.ui interfaces/interfacetcp.ui interfaces/interfaceudp.ui interfaces/interfacedirect.ui interfaces/interfacesyphon.ui

#Serial
HEADERS += interfaces/qextserialport/qextserialport.h interfaces/qextserialport/qextserialenumerator.h interfaces/qextserialport/qextserialport_global.h interfaces/qextserialport/qextserialport_p.h interfaces/qextserialport/qextserialenumerator_p.h
SOURCES += interfaces/qextserialport/qextserialport.cpp interfaces/qextserialport/qextserialenumerator.cpp

#MIDI
HEADERS += interfaces/qrtmidi/RtMidi.h interfaces/qrtmidi/RtError.h
SOURCES += interfaces/qrtmidi/RtMidi.cpp
debug:DEFINES += __RTMIDI_DEBUG__

#Websockets
SOURCES += interfaces/qwebsockets/websocket.cpp interfaces/qwebsockets/websocketserver.cpp interfaces/qwebsockets/websocketprotocol.cpp interfaces/qwebsockets/handshakerequest.cpp interfaces/qwebsockets/handshakeresponse.cpp interfaces/qwebsockets/dataprocessor.cpp
HEADERS += interfaces/qwebsockets/websocket.h interfaces/qwebsockets/websocketserver.h interfaces/qwebsockets/websocketprotocol.h interfaces/qwebsockets/handshakerequest.h interfaces/qwebsockets/handshakeresponse.h interfaces/qwebsockets/dataprocessor.h




#Zeroconf
macx {
DEFINES += ZEROCONF_INSTALLED
#DEFINES += ZEROCONF_AS_SERVICE
INCLUDEPATH += interfaces/zeroconf
SOURCES += interfaces/zeroconf/bonjourserviceregister.cpp interfaces/zeroconf/bonjourserviceresolver.cpp interfaces/zeroconf/bonjourservicebrowser.cpp
Expand Down
2 changes: 1 addition & 1 deletion IanniX.pro.user
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE QtCreatorProject>
<!-- Written by QtCreator 2.7.1, 2013-08-14T06:44:44. -->
<!-- Written by QtCreator 2.7.1, 2013-08-20T16:18:50. -->
<qtcreator>
<data>
<variable>ProjectExplorer.Project.ActiveTarget</variable>
Expand Down
18 changes: 9 additions & 9 deletions Patches/Max/Max Sound Example.maxpat
Original file line number Diff line number Diff line change
Expand Up @@ -51,7 +51,7 @@
"numoutlets" : 1,
"outlettype" : [ "" ],
"patching_rect" : [ 513.520386, 105.0, 92.387787, 18.0 ],
"text" : "000:00.000"
"text" : "000:00:000"
}

}
Expand Down Expand Up @@ -211,7 +211,7 @@
"numoutlets" : 1,
"outlettype" : [ "" ],
"patching_rect" : [ 82.36731, 376.0, 71.040863, 18.0 ],
"text" : "cue 4"
"text" : "cue 8"
}

}
Expand Down Expand Up @@ -581,7 +581,7 @@
"numoutlets" : 1,
"outlettype" : [ "" ],
"patching_rect" : [ 435.908173, 398.5, 170.0, 18.0 ],
"text" : "0.585983 562.986572"
"text" : "0.006006 519.044312"
}

}
Expand Down Expand Up @@ -855,11 +855,11 @@
"fontsize" : 12.0,
"id" : "obj-50",
"maxclass" : "newobj",
"numinlets" : 5,
"numinlets" : 6,
"numoutlets" : 1,
"outlettype" : [ "" ],
"patching_rect" : [ 548.928589, 326.0, 142.5, 20.0 ],
"text" : "zmap 0. 1. 0. 1."
"patching_rect" : [ 548.928589, 326.0, 142.734619, 20.0 ],
"text" : "scale 0. 1. 0. 1."
}

}
Expand All @@ -869,11 +869,11 @@
"fontsize" : 12.0,
"id" : "obj-48",
"maxclass" : "newobj",
"numinlets" : 5,
"numinlets" : 6,
"numoutlets" : 1,
"outlettype" : [ "" ],
"patching_rect" : [ 397.928589, 296.0, 142.5, 20.0 ],
"text" : "zmap 0. 1. -1. 1."
"patching_rect" : [ 397.928589, 296.0, 96.0, 20.0 ],
"text" : "scale 0. 1. -1. 1."
}

}
Expand Down
275 changes: 150 additions & 125 deletions Tools/HTML Template.html

Large diffs are not rendered by default.

2 changes: 1 addition & 1 deletion gui/uiview.ui
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
<x>0</x>
<y>0</y>
<width>1094</width>
<height>700</height>
<height>740</height>
</rect>
</property>
<property name="windowTitle">
Expand Down
13 changes: 8 additions & 5 deletions iannix.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1135,18 +1135,21 @@ void IanniX::send(const Message &message, QStringList *sentMessage) {
MessageManager::logReceive(message, sentMessage);
}

QString IanniX::incomingMessage(const MessageIncomming &source, bool needOutput) {
QString IanniX::incomingMessage(const MessageIncomming &source, bool needOutput, bool needToScript) {
if(needOutput) {
QString retour;
retour += execute(source, false, true).toString();
QString retourScript = getCurrentDocument()->incomingMessage(source, true);
if(retourScript != "undefined")
retourScript += retourScript;
if(needToScript) {
QString retourScript = getCurrentDocument()->incomingMessage(source, true);
if(retourScript != "undefined")
retour += retourScript;
}
return retour;
}
else {
execute(source, ExecuteSourceNetwork);
getCurrentDocument()->incomingMessage(source);
if(needToScript)
getCurrentDocument()->incomingMessage(source);
}
return QString();
}
Expand Down
2 changes: 1 addition & 1 deletion iannix.h
Original file line number Diff line number Diff line change
Expand Up @@ -151,7 +151,7 @@ public slots:
if(index < argv.count()) return argv.at(index).toDouble();
else return 0;
}
QString incomingMessage(const MessageIncomming &source, bool needOutput = false);
QString incomingMessage(const MessageIncomming &source, bool needOutput = false, bool needToScript = true);
void openMessageEditor();
void send(const Message &message, QStringList *sentMessage = 0);
QMainWindow* getMainWindow() { return view; }
Expand Down
64 changes: 61 additions & 3 deletions interfaces/interfacehttp.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -5,12 +5,18 @@ InterfaceHttp::InterfaceHttp(QWidget *parent) :
NetworkInterface(parent),
ui(new Ui::InterfaceHttp) {
ui->setupUi(this);

connect(ui->examples, SIGNAL(released()), SLOT(openExamples()));

//HTTP server
httpServer = new InterfaceHttpServer(this);
connect(httpServer, SIGNAL(parseRequest(QNetworkReply*)), SLOT(parseRequest(QNetworkReply*)));
connect(httpServer, SIGNAL(parseSocket(QTcpSocket*)), SLOT(parseSocket(QTcpSocket*)));

//Websockets server
webSocketServer = new WebSocketServer(this);
connect(webSocketServer, SIGNAL(newConnection()), SLOT(webSocketsNewConnection()));

//Html template
QFile htmlTemplateFile("Tools/HTML Template.html");
if(htmlTemplateFile.open(QFile::ReadOnly)) {
Expand All @@ -23,6 +29,9 @@ InterfaceHttp::InterfaceHttp(QWidget *parent) :
port.setAction(ui->port, "interfaceHttpPort");
connect(&port, SIGNAL(triggered(qreal)), SLOT(portChanged()));
port = 1236;
webSocketsPort.setAction(ui->portWebSockets, "interfaceHttpWebSocketsPort");
connect(&webSocketsPort, SIGNAL(triggered(qreal)), SLOT(portWebSocketsChanged()));
webSocketsPort = 1237;
}

InterfaceHttpServer::InterfaceHttpServer(QObject *parent) :
Expand All @@ -35,7 +44,11 @@ InterfaceHttpServer::InterfaceHttpServer(QObject *parent) :
void InterfaceHttp::portChanged() {
if(httpServer->portChanged(port.val())) ui->port->setStyleSheet(ihmFeedbackOk);
else ui->port->setStyleSheet(ihmFeedbackNok);

}
void InterfaceHttp::portWebSocketsChanged() {
webSocketServer->close();
if(webSocketServer->listen(QHostAddress::Any, webSocketsPort.val())) ui->portWebSockets->setStyleSheet(ihmFeedbackOk);
else ui->portWebSockets->setStyleSheet(ihmFeedbackNok);
}
bool InterfaceHttpServer::portChanged(quint16 port) {
//Initialization
Expand All @@ -44,9 +57,55 @@ bool InterfaceHttpServer::portChanged(quint16 port) {
}


void InterfaceHttp::webSocketsNewConnection() {
WebSocket *webSocket = webSocketServer->nextPendingConnection();
connect(webSocket, SIGNAL(textMessageReceived(QString)), SLOT(webSocketsProcessMessage(QString)));
connect(webSocket, SIGNAL(binaryMessageReceived(QByteArray)), SLOT(webSocketsProcessBinaryMessage(QByteArray)));
connect(webSocket, SIGNAL(disconnected()), SLOT(webSocketsSocketDisconnected()));
webSocketClients << webSocket;
webSocketsUpdateConnectedClients();
}
void InterfaceHttp::webSocketsProcessMessage(const QString &message) {
WebSocket *webSocket = qobject_cast<WebSocket *>(sender());
if(webSocket) {
QStringList commandItems = message.split(COMMAND_END, QString::SkipEmptyParts);;
QString response;
foreach(const QString & command, commandItems)
response += MessageManager::incomingMessage(MessageIncomming("http", webSocket->peerAddress().toString(), webSocket->peerPort(), "", command, command.split(" ", QString::SkipEmptyParts)), true, (command != "goto"));
if(!response.isEmpty())
webSocket->send(response);
}
}
void InterfaceHttp::webSocketsProcessBinaryMessage(const QByteArray &message) {
WebSocket *webSocket = qobject_cast<WebSocket *>(sender());
if(webSocket) {
}
}
void InterfaceHttp::webSocketsSocketDisconnected() {
WebSocket *webSocket = qobject_cast<WebSocket *>(sender());
if(webSocket) {
webSocketClients.removeAll(webSocket);
webSocket->deleteLater();
}
webSocketsUpdateConnectedClients();
}
void InterfaceHttp::webSocketsUpdateConnectedClients() {
QString clientsWebSockets;
foreach(WebSocket *webSocket, webSocketClients)
clientsWebSockets += QString("%1:%2\n").arg(webSocket->peerAddress().toString()).arg(webSocket->peerPort());
clientsWebSockets.chop(1);
if(webSocketClients.count() == 0) ui->clientsWebSockets->setText(tr("No websocket connected"));
else if(webSocketClients.count() == 1) ui->clientsWebSockets->setText(tr("1 websocket connected\n(%1)").arg(clientsWebSockets));
else ui->clientsWebSockets->setText(tr("%1 websockets connected").arg(webSocketClients.count()));
ui->clientsWebSockets->setToolTip(clientsWebSockets);
}



bool InterfaceHttp::send(const Message &message, QStringList *messageSent) {
if(!enable)
return false;

return httpServer->send(message, messageSent);
}
bool InterfaceHttpServer::send(const Message &message, QStringList *messageSent) {
Expand All @@ -73,7 +132,6 @@ void InterfaceHttp::parseRequest(QNetworkReply *reply) {
}



//HTTP reception
void InterfaceHttpServer::incomingConnection(int socketDescriptor) {
QTcpSocket *socket = new QTcpSocket(this);
Expand Down Expand Up @@ -124,7 +182,7 @@ void InterfaceHttp::parseSocket(QTcpSocket *socket) {

QString response;
foreach(const QString & command, commands)
response += MessageManager::incomingMessage(MessageIncomming("http", socket->peerAddress().toString(), socket->peerPort(), url.path(), command, command.split(" ", QString::SkipEmptyParts)), true) + "\n";
response += MessageManager::incomingMessage(MessageIncomming("http", socket->peerAddress().toString(), socket->peerPort(), url.path(), command, command.split(" ", QString::SkipEmptyParts)), true, (command != "goto")) + "\n";

os << response;
}
Expand Down
28 changes: 25 additions & 3 deletions interfaces/interfacehttp.h
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,9 @@
#include <QApplication>
#include "misc/options.h"
#include "messages/messagemanager.h"
#include "qwebsockets/websocketserver.h"
#include "qwebsockets/websocket.h"


namespace Ui {
class InterfaceHttp;
Expand Down Expand Up @@ -41,6 +44,8 @@ private slots:
void parseSocket(QTcpSocket*);
};



class InterfaceHttp : public NetworkInterface {
Q_OBJECT

Expand All @@ -50,20 +55,37 @@ class InterfaceHttp : public NetworkInterface {

private:
InterfaceHttpServer *httpServer;
UiReal port;
UiBool enable;
QString htmlTemplate;
private slots:
void portChanged();
void parseRequest(QNetworkReply*);
void parseSocket(QTcpSocket*);

private:
WebSocketServer* webSocketServer;
QList<WebSocket*> webSocketClients;
private slots:
void portWebSocketsChanged();
void webSocketsNewConnection();
void webSocketsProcessMessage(const QString &message);
void webSocketsProcessBinaryMessage(const QByteArray &message);
void webSocketsSocketDisconnected();
void webSocketsUpdateConnectedClients();


private:
UiReal port, webSocketsPort;
UiBool enable;
QString htmlTemplate;
private slots:
void openExamples() {
QDesktopServices::openUrl(QUrl("http://127.0.0.1:" + QString::number(port) + "/"));
}


public:
bool send(const Message &message, QStringList *messageSent = 0);


private:
Ui::InterfaceHttp *ui;
};
Expand Down
Loading

0 comments on commit 08dea76

Please sign in to comment.