Commit e7fca3d5 authored by Martin Cífka's avatar Martin Cífka
Browse files

joined websocket with http server, improved connecting and receiver

parent 3f69f321
Loading
Loading
Loading
Loading
Loading
+41 −16
Original line number Diff line number Diff line
@@ -17,6 +17,8 @@ function waitFor(conditionFunction) {
  return new Promise(poll);
}



function connect()
{
    if (!("WebSocket" in window))
@@ -24,28 +26,47 @@ function connect()
        notify("Sorry, WebSockets not supported by your browser!", true)
        return;
    }
    ws = new WebSocket("ws://192.168.42.1:9001");
    ws = new WebSocket("ws://192.168.42.1:80");
    ws.onopen = function(e)
    {
        notify("Connection established.");
        enableForm(true);
        notify("Connected, waiting for confirmation", false, 1000);
        connected = true;
    };

    ws.onmessage = function(event)
    {
        if (event.data === "")
        // ignore empty messages
        if (event.data.length === 0)
            return;
        
        try
        {
            var json = JSON.parse(event.data);
            /*if (json.hasOwnProperty("connected"))
            notify(`[message] JSON data received from server: ${event.data}`, false);
            switch(json["cmd"])
            {
                case "CONNECT":
                {
                    document.getElementById("buttonConnect").disabled = false;
                    if (json["param"] === true)
                    {
                if (json["connected"] === true)
                        enableForm(true);
                else
                        notify("Connected!",false, 1000)
                    }
                    else if (json["param"] === false)
                    {
                        enableForm(false);
                        ws.close();
            }*/
                        notify("Couldn't connect. Maybe someone else is using the camera?", true, 2000);
                    }
                    else
                        break;
                    return;
                }
                default:
                    break;
            }
            
        }
        catch
        {
@@ -58,6 +79,8 @@ function connect()
    }
    ws.onclose = function(event)
    {
        document.getElementById("buttonConnect").disabled = false;
        
        if (event.wasClean)
        {
            if (event.code === 1000)
@@ -67,18 +90,17 @@ function connect()
        {
            // e.g. server process killed or network down
            // event.code is usually 1006 in this case
            
            if (!connected)
                notify("Couldn't connect. Maybe anothe user is using the app or you are not connected to the network?", true, 4000);
                notify("Couldn't connect. Maybe anothe user is using the app or you are not connected to the network?", true, 3000);
            else
                notify('Connection died.', true);
                notify("Connection died.", true);
        }

        enableForm(false);
        connected = false;
    };

    ws.onerror = function(error)
    {};
    ws.onerror = function(error){};
}

function enableForm(enable)
@@ -88,11 +110,11 @@ function enableForm(enable)
        {
            elements[i].disabled = !enable;
        }
        
        if (enable)
            document.getElementById("buttonConnect").innerHTML = "Disconnect";
        else
            document.getElementById("buttonConnect").innerHTML = "Connect";
        connected = enable;
}

function disconnect()
@@ -107,8 +129,11 @@ function buttonConnect_onClick()
    if (ws != undefined && ws.readyState === WebSocket.OPEN)
        disconnect();
    else
    {
        document.getElementById("buttonConnect").disabled = true;
        connect();
    }
}

function wsFormSubmit()
{
+73 −42
Original line number Diff line number Diff line
@@ -10,6 +10,7 @@ using namespace std;


Commander::Commander() :
    _isReceiverRunning(false),
    _sock(TcpSocket(&_reader, this)),
    _token(0),
        
@@ -74,7 +75,11 @@ string Commander::generateJSON(Codes::MsgId msg, string param)
bool Commander::getToken()
{
    shared_ptr<DynamicJsonDocument> jsonPtr;
    if (!_sock.sendRecvVerify(generateJSON(Codes::MsgId::GetToken), jsonPtr, make_pair(Codes::MsgId::GetToken,Codes::Rval::CommandOk)))
    if (!_sock.sendRecvVerify(
            generateJSON(Codes::MsgId::GetToken),
            jsonPtr,
            make_pair(Codes::MsgId::GetToken,Codes::Rval::CommandOk)
        ))
        return false;
    
    string key = "param";
@@ -88,6 +93,11 @@ bool Commander::getToken()
    return true;
}

bool Commander::holdSession()
{
    return _sock.sendString(this->generateJSON(Codes::MsgId::QuerySessionHolder));
}


bool Commander::getCameraSettings()
{
@@ -430,24 +440,18 @@ bool Commander::shoot()



bool Commander::start()
void Commander::start()
{
    _receiverThr = thread(&Commander::runReceiver, this);
    _receiverThr = thread(&Commander::initReceiver, this);
    _executorThr = thread(&Commander::runExecutor, this);
    this_thread::sleep_for(chrono::milliseconds(50));
    
    if (!isReceiverRunning() || !getToken() || !getCameraSettings() || !getMode())
        return false;
    
    return true;
}
void Commander::join()
{
    _receiverThr.join();
    _executorThr.join();
    _receiverThr.detach();
    _executorThr.detach();
}

bool Commander::connect()

bool Commander::connectSocket()
{
   if (!_sock.connectTo("127.0.0.1", 7878))
       return false;
@@ -457,51 +461,78 @@ bool Commander::connect()
    return true;
}

void Commander::disconnect()
void Commander::disconnectSocket()
{    
    _token = 0;
    _sock.closeSocket();
}

bool Commander::isReceiverRunning()
bool Commander::connectCommander()
{
    lock_guard lock(_receiverRunningMutex);
    return _receiverRunning;
    return (getToken() && getCameraSettings() && getMode());
}

bool Commander::runReceiver()
{
    while (true)
void Commander::disconnectCommander()
{
        if (!connect())
            return false;
    // drop token
    shared_ptr<DynamicJsonDocument> jsonPtr;
    _sock.sendRecvVerify(
            generateJSON(Codes::MsgId::DropToken),
            jsonPtr,
            make_pair(Codes::MsgId::DropToken,Codes::Rval::CommandOk),
            chrono::milliseconds(3000),
            3);
    
    disconnectSocket();
    
        {
        lock_guard lock(_receiverRunningMutex);
        _receiverRunning = true;
}

        if (_sock.runReceiver())
            break;

void Commander::initReceiver()
{
    while (true)
    {
        // wait until receiver should be running
        {
        lock_guard lock(_receiverRunningMutex);
        _receiverRunning = false;
            unique_lock ulock(_isReceiverRunningMutex);
            _isReceiverRunningCV.wait(ulock, [this](){return _isReceiverRunning;});
        }
        
        //if TcpSocket::runReceiver() returns false, reconnect
        // if cannot connect or _sock.runReceiver() exits correctly, stop receiver
        if (!connectSocket() || _sock.runReceiver())
        {
            stopReceiver();
        }
        else
        {
            // else restart socket & continue
            cerr << "Restarting socket..." << endl;
        disconnect();
            disconnectSocket();
        }
    }
}

void Commander::runReceiver()
{
    cout << "Starting receiver" << endl;
    lock_guard lock(_isReceiverRunningMutex);
    _isReceiverRunning = true;
    _isReceiverRunningCV.notify_all();
}

void Commander::stopReceiver()
{
    lock_guard lock(_receiverRunningMutex);
    _receiverRunning = false;
    cout << "Stopping receiver" << endl;
    lock_guard lock(_isReceiverRunningMutex);
    _isReceiverRunning = false;
    _server->wsClose();
}

    disconnect();

    return true;
bool Commander::isReceiverRunning()
{
    lock_guard lock(_isReceiverRunningMutex); 
    return _isReceiverRunning;
}


+24 −13
Original line number Diff line number Diff line
@@ -20,8 +20,11 @@ class Commander
public:
    Commander();
    
    bool start();
    void join();
    void start();
    void stop();
    
    void runReceiver();
    void stopReceiver();
    
    void enqueueCommand(const std::string& cmd);
    
@@ -30,8 +33,9 @@ private:
    friend class TcpSocket;
    
    std::thread _receiverThr; // thread for receiving messages from camera
    bool _receiverRunning;
    std::mutex _receiverRunningMutex;
    bool _isReceiverRunning;
    std::mutex _isReceiverRunningMutex;
    std::condition_variable _isReceiverRunningCV;
    
    std::thread _executorThr; // thread for executiong commands from user
    std::queue<std::shared_ptr<DynamicJsonDocument>> _executorQueue;
@@ -62,15 +66,25 @@ private:
    Server* _server; // HTTP and WebSocket server

    
    bool connect();
    void disconnect();
    bool connectSocket();
    void disconnectSocket();
    
    bool connectCommander();
    void disconnectCommander();
    
    void runExecutor();
    bool runReceiver();
    
    void initReceiver();
    bool isReceiverRunning();
    
    
    template <typename T>
    std::string generateJSON(Codes::MsgId msg, T param);
    std::string generateJSON(Codes::MsgId msg);
    
    ////// Commands //////
    bool shoot();
    void stopShooting();//TODO
    void stopShooting();
    
    bool shootNormal();
    bool shootBracketing();
@@ -106,12 +120,9 @@ private:
    bool getToken();
    bool getCameraSettings();
    
    bool holdSession();
    
    
    template <typename T>
    std::string generateJSON(Codes::MsgId msg, T param);
    std::string generateJSON(Codes::MsgId msg);
    
    std::vector<Codes::Speed> speedOrder =
    {
        Codes::Speed::S1_6400,
+6 −0
Original line number Diff line number Diff line
@@ -56,3 +56,9 @@ void CustomReader::resetHistory()
{
    history = "";
}


void CustomReader::clean()
{
    q = {};
}
 No newline at end of file
+2 −0
Original line number Diff line number Diff line
@@ -19,6 +19,8 @@ struct CustomReader
    
    void resetHistory();
    
    void clean();
    
    std::queue<char> q;
    std::string history;
    TcpSocket* sock;
Loading