Loading sdk/build/www/index.html +2 −2 Original line number Diff line number Diff line Loading @@ -146,7 +146,7 @@ </tr> </table> <table id="wsFormTable2"> <!--<table id="wsFormTable2"> <tr> <td><label for="checkboxWifiOff">Turn off Wifi when shooting<br> timelapse above 1 minute</label></td> <td><label class="switch"> Loading @@ -154,7 +154,7 @@ </label> </td> </tr> </table> </table>--> <button type="button" id="buttonShoot" onclick="wsFormSubmit();" name="cmd" value="SHOOT" disabled>Shoot!</button> </form> Loading sdk/build/www/script.js +11 −6 Original line number Diff line number Diff line Loading @@ -9,7 +9,7 @@ var notifying = false; var connected = false; var state = CameraState.DISCONNECTED; var host = "192.168.42.1"; var notifyQueue = []; function sleep(ms) { Loading Loading @@ -155,7 +155,7 @@ function setCameraState(newState) //SHOOTING -> READY case CameraState.SHOOTING: notify("Shooting has finished!",false, 1000); // notify("Shooting has finished!",false, 1000); break; } break; Loading @@ -170,7 +170,6 @@ function setCameraState(newState) elements[i].disabled = disabled; // disable/enable additional buttons outside form //document.getElementById("checkboxWifiOff").disabled = disabled; document.getElementById("buttonTurnOffApp").disabled = disabled; document.getElementById("buttonPowerOff").disabled = disabled; Loading Loading @@ -237,10 +236,15 @@ async function notify(text, error = false, time = 1500) else console.log(text); notifyQueue.push([text, time]); // wait until prevous notifications dissapeared await waitFor(_ => notifying == false ); notifying = true; [text,time] = notifyQueue.shift(); //set text let x = document.getElementById("notification"); x.innerHTML = text; Loading Loading @@ -284,13 +288,14 @@ function wsFormToJson() { { json["timelapseCount"] = 0; json["timelapseInterval"] = 0; json["wifiOff"] = false; //json["wifiOff"] = false; } else /*else { if (json["timelapseInterval"] * json["timelapseCount"] < 60) json["wifiOff"] = false; } }*/ delete json[""] return json; Loading sdk/src/codes.h +14 −2 Original line number Diff line number Diff line Loading @@ -33,7 +33,9 @@ public: QuerySessionHolder = 1793, PowerOff = 6155, GetSetAutoPowerOff = 6151 //TODO GetSetAutoPowerOff = 6151, //TODO CameraOverheated = 6158 }; Loading Loading @@ -170,7 +172,17 @@ public: }; static int getSpeedMs(Speed speed) { if ((int)speed < 32768) { return 1000*(int)speed; } else { return 1000/((int)speed-32768); } }; static std::string stateToString(int state) { Loading sdk/src/commander.cpp +135 −81 Original line number Diff line number Diff line Loading @@ -14,6 +14,7 @@ Commander::Commander() : _sock(TcpSocket(&_reader, this)), _token(0), _autoPowerOff(-1), _iso((Codes::ISO)-1), _speed((Codes::Speed)-1), _photoWB((Codes::ParamWB)(-1)), Loading Loading @@ -144,6 +145,7 @@ bool Commander::getCameraSettings() cerr << "Error: unexpected JSON response: \"" << key << "\" = " << (*jsonPtr)[key] << endl; return false; } _speed = (Codes::Speed)(int)(*jsonPtr)[key]; return true; Loading @@ -159,7 +161,7 @@ bool Commander::setISO(Codes::ISO iso) _iso = iso; else { _server->wsSendNotification("Error: Setting ISO failed."); _server->wsSendNotification("Error: Setting ISO failed.", true); return false; } Loading @@ -181,7 +183,7 @@ bool Commander::setSpeed(Codes::Speed speed) } else { _server->wsSendNotification("Error: Setting shutter speed failed."); _server->wsSendNotification("Error: Setting shutter speed failed.", true); return false; } } Loading @@ -190,7 +192,7 @@ bool Commander::setSpeed(Codes::Speed speed) } bool Commander::setBracketingBuiltIn(Codes::ParamBracketingBuiltIn bracketing) /*bool Commander::setBracketingBuiltIn(Codes::ParamBracketingBuiltIn bracketing) { if (_bracketingBuiltIn != bracketing) { Loading @@ -200,7 +202,7 @@ bool Commander::setBracketingBuiltIn(Codes::ParamBracketingBuiltIn bracketing) return false; } return true; } }*/ bool Commander::setMode(Codes::ParamMode mode) Loading @@ -215,6 +217,23 @@ bool Commander::setMode(Codes::ParamMode mode) return true; } bool Commander::setAutoPowerOff(size_t minutes) { if (_autoPowerOff != minutes) { if (setParam(Codes::MsgId::GetSetAutoPowerOff, minutes)) _autoPowerOff = minutes; else return false; } return true; } bool Commander::getAutoPowerOff() { return getParam(Codes::MsgId::GetSetAutoPowerOff, _autoPowerOff); } bool Commander::getMode() { int mode; Loading Loading @@ -256,6 +275,14 @@ bool Commander::getParam(Codes::MsgId msgid, T& param_out) return true; } chrono::milliseconds Commander::sumBracketingVector() { int ms = 0; for (auto&& s : _bracketingVector) ms += Codes::getSpeedMs(s); return chrono::milliseconds(ms); } bool Commander::setBracketing(size_t evStep, size_t halfCount) { Loading @@ -276,8 +303,7 @@ bool Commander::setBracketing(size_t evStep, size_t halfCount) { // TODO: shoot, read metadata and set exposure cerr << "Error: Bracketing not supported with Auto speed." << endl; _server->wsSendNotification("Error: Bracketing not supported with Auto speed."); _server->wsSendNotification("Error: Bracketing not supported with Auto speed.", true); return false; } Loading @@ -293,12 +319,12 @@ bool Commander::setBracketing(size_t evStep, size_t halfCount) last < speedOrder.begin() || last >= speedOrder.end() ) { cerr << "Error: Bracketing out o range!." << endl; _server->wsSendNotification("Error: Bracketing out o range!"); _server->wsSendNotification("Error: Bracketing out o range!", true); return false; } _bracketingVector = {}; it = first; for (int i = 0; i < 1 + halfCount * 2; ++i) { _bracketingVector.push_back(*it); Loading Loading @@ -331,7 +357,7 @@ bool Commander::setPhotoWB(Codes::ParamWB wb) _photoWB = wb; else { _server->wsSendNotification("Error: Setting whitebalance failed."); _server->wsSendNotification("Error: Setting whitebalance failed.", true); return false; } } Loading @@ -350,7 +376,9 @@ bool Commander::shootNormal() { make_pair(Codes::MsgId::ShootNormal, Codes::Rval::CommandOk), make_pair(Codes::MsgId::ImgCaptured, Codes::Rval::NotificationOk) }) }, DEFAULT_TIMEOUT+chrono::milliseconds(Codes::getSpeedMs(_speed)) ) ) return false; Loading @@ -361,7 +389,18 @@ bool Commander::shootNormal() return false; } cout << "Image captured: " << (*vectorJsonPtr[1])[key] << endl; // Send image path to client string path = (*vectorJsonPtr[1])[key]; // C:\DCIM\20200923\IMG_20200923_000753.JPG path = path.substr(8, path.size()-8); // 20200923\IMG_20200923_000753.JPG path.replace(8, 1, "/"); // 20200923/IMG_20200923_000753.JPG cout << path << endl; _server->wsSendNotification( "Captured: <a href=\"http://192.168.42.1:50422/" + path + "\" target=\"_blank\">" + path.substr(9, path.size()-9) + "</a>" ); return true; } Loading Loading @@ -398,7 +437,7 @@ bool Commander::shootBracketing() } bool Commander::shootBracketingBuiltIn() /*bool Commander::shootBracketingBuiltIn() { vector<shared_ptr<DynamicJsonDocument>> vectorJsonPtr; if (!_sock.sendRecvVerify( Loading Loading @@ -431,7 +470,7 @@ bool Commander::shootBracketingBuiltIn() cout << "Image captured: " << (*vectorJsonPtr[i])[key] << endl; } return true; } }*/ bool Commander::shootTimelapse(bool bracketing) Loading Loading @@ -576,7 +615,7 @@ void Commander::disconnectSocket() bool Commander::connectCommander() { if (getToken() && getCameraSettings() && getMode()) if (getToken() && getCameraSettings() && getMode() && getAutoPowerOff()) { return true; } Loading Loading @@ -710,8 +749,7 @@ void Commander::runExecutor() (*jsonPtr)["bracketingEV"].is<int>() && (*jsonPtr)["timelapseCount"].is<int>() && (*jsonPtr)["timelapseInterval"].is<int>() && (*jsonPtr)["photoWB"].is<int>() && (*jsonPtr)["wifiOff"].is<bool>())) (*jsonPtr)["photoWB"].is<int>())) // compensation // { Loading @@ -720,16 +758,29 @@ void Commander::runExecutor() cerr << "Invalid data from user: " << str << endl; continue; } // try to set ISO, speed, wb, bracketing and timelapse settings if (!setISO((Codes::ISO)(int)(*jsonPtr)["iso"]) || !setSpeed((Codes::Speed)(int)(*jsonPtr)["speed"]) || !setPhotoWB((Codes::ParamWB)(int)(*jsonPtr)["photoWB"]) || !setBracketing((int)(*jsonPtr)["bracketingEV"], (int)(*jsonPtr)["bracketingHalf"])) { _server->wsSendNotification("Error: Couldn't set some settings...", true); continue; } setTimelapse((int)(*jsonPtr)["timelapseInterval"], (int)(*jsonPtr)["timelapseCount"]); // Set auto power-off auto autoPowerOff = _autoPowerOff; if (_autoPowerOff == 0){} // Do nothing else if (_timelapseInterval-10 > _autoPowerOff*60) { if (!setAutoPowerOff( (_timelapseInterval-10 > 5*60 ? 10 : 0) )) { _server->wsSendNotification("Error: Couldn't set auto power-off...", true); continue; } } // turn of wifi if requested and shoot _server->wsSendState(Server::State::SHOOTING); Loading @@ -744,9 +795,14 @@ void Commander::runExecutor() if (!shoot()) { cerr << "Shooting failed." << endl; _server->wsSendNotification("Error while shooting..."); _server->wsSendNotification("Error while shooting...", true); } this_thread::sleep_for(chrono::milliseconds(300)); // set auto power-off to original value if (autoPowerOff != _autoPowerOff) setAutoPowerOff(autoPowerOff); _server->wsSendState(Server::State::READY); Loading @@ -761,8 +817,7 @@ void Commander::runExecutor() else { _server->wsSendNotification("Error: Turning Wifi off failed."); cerr << "Error: Turning off Wifi failed." << endl; _server->wsSendNotification("Error: Turning Wifi off failed.", true); } } Loading @@ -772,8 +827,7 @@ void Commander::runExecutor() cout << "Power off..." << endl; else { _server->wsSendNotification("Error: Powering off failed."); cerr << "Error: Powering off failed." << endl; _server->wsSendNotification("Error: Powering off failed.", true); } } } Loading sdk/src/commander.h +7 −3 Original line number Diff line number Diff line Loading @@ -47,6 +47,7 @@ private: CustomReader _reader; TcpSocket _sock; int _token; int _autoPowerOff; Codes::ISO _iso; Codes::Speed _speed; Loading Loading @@ -97,17 +98,21 @@ private: bool wifiControl(bool on); bool powerOff(); bool setAutoPowerOff(size_t minutes); bool getAutoPowerOff(); bool shootNormal(); bool shootBracketing(); bool shootBracketing(const std::vector<Codes::Speed>& speeds); bool shootBracketingBuiltIn(); //bool shootBracketingBuiltIn(); bool shootTimelapse(bool bracketing); template <typename T> bool setParam(Codes::MsgId msgid, T param); template <typename T> bool getParam(Codes::MsgId msgid, T& param_out); std::chrono::milliseconds sumBracketingVector(); /** * Set commander's bracketing settings - Loading @@ -122,13 +127,12 @@ private: * @return true if setting was successful, otherwise false */ bool setBracketing(size_t evStep, size_t halfCount); bool setBracketingBuiltIn(Codes::ParamBracketingBuiltIn); //bool setBracketingBuiltIn(Codes::ParamBracketingBuiltIn); bool setISO(Codes::ISO iso); bool setSpeed(Codes::Speed speed); void setTimelapse(size_t interval, size_t count); bool setPhotoWB(Codes::ParamWB wb); bool setMode(Codes::ParamMode mode); bool setAutoTurnOff(size_t minutes); bool getToken(); bool getCameraSettings(); Loading Loading
sdk/build/www/index.html +2 −2 Original line number Diff line number Diff line Loading @@ -146,7 +146,7 @@ </tr> </table> <table id="wsFormTable2"> <!--<table id="wsFormTable2"> <tr> <td><label for="checkboxWifiOff">Turn off Wifi when shooting<br> timelapse above 1 minute</label></td> <td><label class="switch"> Loading @@ -154,7 +154,7 @@ </label> </td> </tr> </table> </table>--> <button type="button" id="buttonShoot" onclick="wsFormSubmit();" name="cmd" value="SHOOT" disabled>Shoot!</button> </form> Loading
sdk/build/www/script.js +11 −6 Original line number Diff line number Diff line Loading @@ -9,7 +9,7 @@ var notifying = false; var connected = false; var state = CameraState.DISCONNECTED; var host = "192.168.42.1"; var notifyQueue = []; function sleep(ms) { Loading Loading @@ -155,7 +155,7 @@ function setCameraState(newState) //SHOOTING -> READY case CameraState.SHOOTING: notify("Shooting has finished!",false, 1000); // notify("Shooting has finished!",false, 1000); break; } break; Loading @@ -170,7 +170,6 @@ function setCameraState(newState) elements[i].disabled = disabled; // disable/enable additional buttons outside form //document.getElementById("checkboxWifiOff").disabled = disabled; document.getElementById("buttonTurnOffApp").disabled = disabled; document.getElementById("buttonPowerOff").disabled = disabled; Loading Loading @@ -237,10 +236,15 @@ async function notify(text, error = false, time = 1500) else console.log(text); notifyQueue.push([text, time]); // wait until prevous notifications dissapeared await waitFor(_ => notifying == false ); notifying = true; [text,time] = notifyQueue.shift(); //set text let x = document.getElementById("notification"); x.innerHTML = text; Loading Loading @@ -284,13 +288,14 @@ function wsFormToJson() { { json["timelapseCount"] = 0; json["timelapseInterval"] = 0; json["wifiOff"] = false; //json["wifiOff"] = false; } else /*else { if (json["timelapseInterval"] * json["timelapseCount"] < 60) json["wifiOff"] = false; } }*/ delete json[""] return json; Loading
sdk/src/codes.h +14 −2 Original line number Diff line number Diff line Loading @@ -33,7 +33,9 @@ public: QuerySessionHolder = 1793, PowerOff = 6155, GetSetAutoPowerOff = 6151 //TODO GetSetAutoPowerOff = 6151, //TODO CameraOverheated = 6158 }; Loading Loading @@ -170,7 +172,17 @@ public: }; static int getSpeedMs(Speed speed) { if ((int)speed < 32768) { return 1000*(int)speed; } else { return 1000/((int)speed-32768); } }; static std::string stateToString(int state) { Loading
sdk/src/commander.cpp +135 −81 Original line number Diff line number Diff line Loading @@ -14,6 +14,7 @@ Commander::Commander() : _sock(TcpSocket(&_reader, this)), _token(0), _autoPowerOff(-1), _iso((Codes::ISO)-1), _speed((Codes::Speed)-1), _photoWB((Codes::ParamWB)(-1)), Loading Loading @@ -144,6 +145,7 @@ bool Commander::getCameraSettings() cerr << "Error: unexpected JSON response: \"" << key << "\" = " << (*jsonPtr)[key] << endl; return false; } _speed = (Codes::Speed)(int)(*jsonPtr)[key]; return true; Loading @@ -159,7 +161,7 @@ bool Commander::setISO(Codes::ISO iso) _iso = iso; else { _server->wsSendNotification("Error: Setting ISO failed."); _server->wsSendNotification("Error: Setting ISO failed.", true); return false; } Loading @@ -181,7 +183,7 @@ bool Commander::setSpeed(Codes::Speed speed) } else { _server->wsSendNotification("Error: Setting shutter speed failed."); _server->wsSendNotification("Error: Setting shutter speed failed.", true); return false; } } Loading @@ -190,7 +192,7 @@ bool Commander::setSpeed(Codes::Speed speed) } bool Commander::setBracketingBuiltIn(Codes::ParamBracketingBuiltIn bracketing) /*bool Commander::setBracketingBuiltIn(Codes::ParamBracketingBuiltIn bracketing) { if (_bracketingBuiltIn != bracketing) { Loading @@ -200,7 +202,7 @@ bool Commander::setBracketingBuiltIn(Codes::ParamBracketingBuiltIn bracketing) return false; } return true; } }*/ bool Commander::setMode(Codes::ParamMode mode) Loading @@ -215,6 +217,23 @@ bool Commander::setMode(Codes::ParamMode mode) return true; } bool Commander::setAutoPowerOff(size_t minutes) { if (_autoPowerOff != minutes) { if (setParam(Codes::MsgId::GetSetAutoPowerOff, minutes)) _autoPowerOff = minutes; else return false; } return true; } bool Commander::getAutoPowerOff() { return getParam(Codes::MsgId::GetSetAutoPowerOff, _autoPowerOff); } bool Commander::getMode() { int mode; Loading Loading @@ -256,6 +275,14 @@ bool Commander::getParam(Codes::MsgId msgid, T& param_out) return true; } chrono::milliseconds Commander::sumBracketingVector() { int ms = 0; for (auto&& s : _bracketingVector) ms += Codes::getSpeedMs(s); return chrono::milliseconds(ms); } bool Commander::setBracketing(size_t evStep, size_t halfCount) { Loading @@ -276,8 +303,7 @@ bool Commander::setBracketing(size_t evStep, size_t halfCount) { // TODO: shoot, read metadata and set exposure cerr << "Error: Bracketing not supported with Auto speed." << endl; _server->wsSendNotification("Error: Bracketing not supported with Auto speed."); _server->wsSendNotification("Error: Bracketing not supported with Auto speed.", true); return false; } Loading @@ -293,12 +319,12 @@ bool Commander::setBracketing(size_t evStep, size_t halfCount) last < speedOrder.begin() || last >= speedOrder.end() ) { cerr << "Error: Bracketing out o range!." << endl; _server->wsSendNotification("Error: Bracketing out o range!"); _server->wsSendNotification("Error: Bracketing out o range!", true); return false; } _bracketingVector = {}; it = first; for (int i = 0; i < 1 + halfCount * 2; ++i) { _bracketingVector.push_back(*it); Loading Loading @@ -331,7 +357,7 @@ bool Commander::setPhotoWB(Codes::ParamWB wb) _photoWB = wb; else { _server->wsSendNotification("Error: Setting whitebalance failed."); _server->wsSendNotification("Error: Setting whitebalance failed.", true); return false; } } Loading @@ -350,7 +376,9 @@ bool Commander::shootNormal() { make_pair(Codes::MsgId::ShootNormal, Codes::Rval::CommandOk), make_pair(Codes::MsgId::ImgCaptured, Codes::Rval::NotificationOk) }) }, DEFAULT_TIMEOUT+chrono::milliseconds(Codes::getSpeedMs(_speed)) ) ) return false; Loading @@ -361,7 +389,18 @@ bool Commander::shootNormal() return false; } cout << "Image captured: " << (*vectorJsonPtr[1])[key] << endl; // Send image path to client string path = (*vectorJsonPtr[1])[key]; // C:\DCIM\20200923\IMG_20200923_000753.JPG path = path.substr(8, path.size()-8); // 20200923\IMG_20200923_000753.JPG path.replace(8, 1, "/"); // 20200923/IMG_20200923_000753.JPG cout << path << endl; _server->wsSendNotification( "Captured: <a href=\"http://192.168.42.1:50422/" + path + "\" target=\"_blank\">" + path.substr(9, path.size()-9) + "</a>" ); return true; } Loading Loading @@ -398,7 +437,7 @@ bool Commander::shootBracketing() } bool Commander::shootBracketingBuiltIn() /*bool Commander::shootBracketingBuiltIn() { vector<shared_ptr<DynamicJsonDocument>> vectorJsonPtr; if (!_sock.sendRecvVerify( Loading Loading @@ -431,7 +470,7 @@ bool Commander::shootBracketingBuiltIn() cout << "Image captured: " << (*vectorJsonPtr[i])[key] << endl; } return true; } }*/ bool Commander::shootTimelapse(bool bracketing) Loading Loading @@ -576,7 +615,7 @@ void Commander::disconnectSocket() bool Commander::connectCommander() { if (getToken() && getCameraSettings() && getMode()) if (getToken() && getCameraSettings() && getMode() && getAutoPowerOff()) { return true; } Loading Loading @@ -710,8 +749,7 @@ void Commander::runExecutor() (*jsonPtr)["bracketingEV"].is<int>() && (*jsonPtr)["timelapseCount"].is<int>() && (*jsonPtr)["timelapseInterval"].is<int>() && (*jsonPtr)["photoWB"].is<int>() && (*jsonPtr)["wifiOff"].is<bool>())) (*jsonPtr)["photoWB"].is<int>())) // compensation // { Loading @@ -720,16 +758,29 @@ void Commander::runExecutor() cerr << "Invalid data from user: " << str << endl; continue; } // try to set ISO, speed, wb, bracketing and timelapse settings if (!setISO((Codes::ISO)(int)(*jsonPtr)["iso"]) || !setSpeed((Codes::Speed)(int)(*jsonPtr)["speed"]) || !setPhotoWB((Codes::ParamWB)(int)(*jsonPtr)["photoWB"]) || !setBracketing((int)(*jsonPtr)["bracketingEV"], (int)(*jsonPtr)["bracketingHalf"])) { _server->wsSendNotification("Error: Couldn't set some settings...", true); continue; } setTimelapse((int)(*jsonPtr)["timelapseInterval"], (int)(*jsonPtr)["timelapseCount"]); // Set auto power-off auto autoPowerOff = _autoPowerOff; if (_autoPowerOff == 0){} // Do nothing else if (_timelapseInterval-10 > _autoPowerOff*60) { if (!setAutoPowerOff( (_timelapseInterval-10 > 5*60 ? 10 : 0) )) { _server->wsSendNotification("Error: Couldn't set auto power-off...", true); continue; } } // turn of wifi if requested and shoot _server->wsSendState(Server::State::SHOOTING); Loading @@ -744,9 +795,14 @@ void Commander::runExecutor() if (!shoot()) { cerr << "Shooting failed." << endl; _server->wsSendNotification("Error while shooting..."); _server->wsSendNotification("Error while shooting...", true); } this_thread::sleep_for(chrono::milliseconds(300)); // set auto power-off to original value if (autoPowerOff != _autoPowerOff) setAutoPowerOff(autoPowerOff); _server->wsSendState(Server::State::READY); Loading @@ -761,8 +817,7 @@ void Commander::runExecutor() else { _server->wsSendNotification("Error: Turning Wifi off failed."); cerr << "Error: Turning off Wifi failed." << endl; _server->wsSendNotification("Error: Turning Wifi off failed.", true); } } Loading @@ -772,8 +827,7 @@ void Commander::runExecutor() cout << "Power off..." << endl; else { _server->wsSendNotification("Error: Powering off failed."); cerr << "Error: Powering off failed." << endl; _server->wsSendNotification("Error: Powering off failed.", true); } } } Loading
sdk/src/commander.h +7 −3 Original line number Diff line number Diff line Loading @@ -47,6 +47,7 @@ private: CustomReader _reader; TcpSocket _sock; int _token; int _autoPowerOff; Codes::ISO _iso; Codes::Speed _speed; Loading Loading @@ -97,17 +98,21 @@ private: bool wifiControl(bool on); bool powerOff(); bool setAutoPowerOff(size_t minutes); bool getAutoPowerOff(); bool shootNormal(); bool shootBracketing(); bool shootBracketing(const std::vector<Codes::Speed>& speeds); bool shootBracketingBuiltIn(); //bool shootBracketingBuiltIn(); bool shootTimelapse(bool bracketing); template <typename T> bool setParam(Codes::MsgId msgid, T param); template <typename T> bool getParam(Codes::MsgId msgid, T& param_out); std::chrono::milliseconds sumBracketingVector(); /** * Set commander's bracketing settings - Loading @@ -122,13 +127,12 @@ private: * @return true if setting was successful, otherwise false */ bool setBracketing(size_t evStep, size_t halfCount); bool setBracketingBuiltIn(Codes::ParamBracketingBuiltIn); //bool setBracketingBuiltIn(Codes::ParamBracketingBuiltIn); bool setISO(Codes::ISO iso); bool setSpeed(Codes::Speed speed); void setTimelapse(size_t interval, size_t count); bool setPhotoWB(Codes::ParamWB wb); bool setMode(Codes::ParamMode mode); bool setAutoTurnOff(size_t minutes); bool getToken(); bool getCameraSettings(); Loading