Loading sdk/build/www/script.js +41 −16 Original line number Diff line number Diff line Loading @@ -17,6 +17,8 @@ function waitFor(conditionFunction) { return new Promise(poll); } function connect() { if (!("WebSocket" in window)) Loading @@ -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 { Loading @@ -58,6 +79,8 @@ function connect() } ws.onclose = function(event) { document.getElementById("buttonConnect").disabled = false; if (event.wasClean) { if (event.code === 1000) Loading @@ -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) Loading @@ -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() Loading @@ -107,8 +129,11 @@ function buttonConnect_onClick() if (ws != undefined && ws.readyState === WebSocket.OPEN) disconnect(); else { document.getElementById("buttonConnect").disabled = true; connect(); } } function wsFormSubmit() { Loading sdk/src/commander.cpp +73 −42 Original line number Diff line number Diff line Loading @@ -10,6 +10,7 @@ using namespace std; Commander::Commander() : _isReceiverRunning(false), _sock(TcpSocket(&_reader, this)), _token(0), Loading Loading @@ -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"; Loading @@ -88,6 +93,11 @@ bool Commander::getToken() return true; } bool Commander::holdSession() { return _sock.sendString(this->generateJSON(Codes::MsgId::QuerySessionHolder)); } bool Commander::getCameraSettings() { Loading Loading @@ -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; Loading @@ -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; } Loading sdk/src/commander.h +24 −13 Original line number Diff line number Diff line Loading @@ -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); Loading @@ -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; Loading Loading @@ -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(); Loading Loading @@ -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, Loading sdk/src/customReader.cpp +6 −0 Original line number Diff line number Diff line Loading @@ -56,3 +56,9 @@ void CustomReader::resetHistory() { history = ""; } void CustomReader::clean() { q = {}; } No newline at end of file sdk/src/customReader.h +2 −0 Original line number Diff line number Diff line Loading @@ -19,6 +19,8 @@ struct CustomReader void resetHistory(); void clean(); std::queue<char> q; std::string history; TcpSocket* sock; Loading Loading
sdk/build/www/script.js +41 −16 Original line number Diff line number Diff line Loading @@ -17,6 +17,8 @@ function waitFor(conditionFunction) { return new Promise(poll); } function connect() { if (!("WebSocket" in window)) Loading @@ -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 { Loading @@ -58,6 +79,8 @@ function connect() } ws.onclose = function(event) { document.getElementById("buttonConnect").disabled = false; if (event.wasClean) { if (event.code === 1000) Loading @@ -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) Loading @@ -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() Loading @@ -107,8 +129,11 @@ function buttonConnect_onClick() if (ws != undefined && ws.readyState === WebSocket.OPEN) disconnect(); else { document.getElementById("buttonConnect").disabled = true; connect(); } } function wsFormSubmit() { Loading
sdk/src/commander.cpp +73 −42 Original line number Diff line number Diff line Loading @@ -10,6 +10,7 @@ using namespace std; Commander::Commander() : _isReceiverRunning(false), _sock(TcpSocket(&_reader, this)), _token(0), Loading Loading @@ -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"; Loading @@ -88,6 +93,11 @@ bool Commander::getToken() return true; } bool Commander::holdSession() { return _sock.sendString(this->generateJSON(Codes::MsgId::QuerySessionHolder)); } bool Commander::getCameraSettings() { Loading Loading @@ -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; Loading @@ -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; } Loading
sdk/src/commander.h +24 −13 Original line number Diff line number Diff line Loading @@ -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); Loading @@ -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; Loading Loading @@ -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(); Loading Loading @@ -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, Loading
sdk/src/customReader.cpp +6 −0 Original line number Diff line number Diff line Loading @@ -56,3 +56,9 @@ void CustomReader::resetHistory() { history = ""; } void CustomReader::clean() { q = {}; } No newline at end of file
sdk/src/customReader.h +2 −0 Original line number Diff line number Diff line Loading @@ -19,6 +19,8 @@ struct CustomReader void resetHistory(); void clean(); std::queue<char> q; std::string history; TcpSocket* sock; Loading