From a2caf7554dfee898272a5c5ca9e1593bba2643fd Mon Sep 17 00:00:00 2001 From: peteruithoven Date: Thu, 24 Apr 2014 12:46:26 +0200 Subject: [PATCH] First jqm version --- js/Box.js | 192 ++++++++++----- js/JoinNetwork.js | 71 ++++++ js/api/ConnectAPI.js | 128 ++++++++++ js/api/NetworkAPI.js | 7 +- js/boxes.js | 68 ++++++ js/main.js | 237 ++++++------------ less/styles.less | 31 +++ www/img/Connect to home.png | Bin 0 -> 7840 bytes www/img/Step_1.png | Bin 0 -> 13374 bytes www/index.html | 462 ++++++++++++++++++++++++++++++++++++ 10 files changed, 970 insertions(+), 226 deletions(-) create mode 100644 js/JoinNetwork.js create mode 100644 js/boxes.js create mode 100644 less/styles.less create mode 100644 www/img/Connect to home.png create mode 100644 www/img/Step_1.png create mode 100644 www/index.html diff --git a/js/Box.js b/js/Box.js index 42999e4..b782aa2 100644 --- a/js/Box.js +++ b/js/Box.js @@ -5,75 +5,137 @@ * This software is licensed under the terms of the GNU GPL v2 or later. * See file LICENSE.txt or visit http://www.gnu.org/licenses/gpl.html for full license details. */ -function Box() { - - this.localip; - this.wifiboxid; - this.connecting = false; - this.destroyedHandler; - - var _element; - var _networkPanel; - var _delayedDestroy; - var _self = this; - this.init = function(boxData,parentElement) { +var BoxPage = (function (w) { + var _page; + var _title; + var _intro; + var _networkStatus; + var _networkAPI = new NetworkAPI(); + var _boxData = {}; + var _retryRetrieveStatusDelay; + var _retryRetrieveStatusDelayTime = 3000; + var PAGE_ID = "#box"; + + var _self = this; + + $.mobile.document.on( "pageinit", PAGE_ID, function( event, data ) { + //console.log("Box page pageinit"); + _page = $(this); + _title = _page.find(".ui-title"); + _intro = _page.find(".intro"); - _self.localip = boxData.localip; - _self.wifiboxid = boxData.wifiboxid; - var url = "http://"+_self.localip; + }); + $.mobile.document.on( "pagebeforeshow", PAGE_ID, function( event, data ) { + console.log("Box page pagebeforeshow"); + _boxData = d3d.util.getPageParams(PAGE_ID); + var boxURL = "http://"+_boxData.localip; + console.log(" _boxData: ",_boxData); - // create box dom element - var link = (boxData.link)? boxData.link : url; - var linkElement = $(""+_self.wifiboxid+""); - _element = $("
  • "); - _element.append(linkElement); - _element.hide().appendTo(parentElement).fadeIn(500); + _title.text(_boxData.wifiboxid); + _intro.text(""); - // create network panel dom element - var networkPanelElement = $("#networkForm").clone(); - networkPanelElement.addClass(networkPanelElement.attr("id")); - networkPanelElement.removeAttr("id"); - _element.append(networkPanelElement); + var drawLink = (_boxData.link)? _boxData.link : boxURL; + _page.find("#drawItem a").attr("href",drawLink); - // create network panel - _networkPanel = new NetworkPanel(); - _networkPanel.id = _self.localip; - _networkPanel.init(url,networkPanelElement, networkStatusChangeHandler); - - } - function networkStatusChangeHandler(networkStatus) { - console.log("Box:networkStatusChangeHandler: ",networkStatus); - _self.connecting = (networkStatus == NetworkAPI.STATUS.CONNECTING); - - // because openwrt can be slow to update it's ssid, a box might - // report it failed connecting but is then slightly later connects - // so we correct CONNECTING_FAILED to CONNECTED unless the box is connected by wire - if(_self.localip != "192.168.5.1" && networkStatus == NetworkAPI.STATUS.CONNECTING_FAILED) { - networkStatus = NetworkAPI.STATUS.CONNECTED; - } - - _element.toggleClass("complex",(networkStatus !== NetworkAPI.STATUS.CONNECTED)); - - if(_self.connecting) { - clearTimeout(_delayedDestroy); - _delayedDestroy = setTimeout(function() { - console.log("delayed remove"); - //removeBox(box,true); - _self.destroy() - }, 10000); - } - } - this.destroy = function() { - console.log("Box:destroy"); - clearTimeout(_delayedDestroy); - - _networkPanel.destroy(); - - _element.fadeOut(500,function() { - _element.remove(); + _networkAPI.init(boxURL); + retrieveNetworkStatus(); + }); + + function retrieveNetworkStatus() { + console.log("retrieveNetworkStatus"); + _networkAPI.status(function(data) { + console.log("_networkAPI.status complete"); + console.log(" data: ",data); + if(data.status !== "" && typeof data.status === 'string') { + data.status = parseInt(data.status,10); + } + //console.log(_self.id,"NetworkPanel:retrievedStatus status: ",data.status,data.statusMessage); + //console.log(" networkPanel ",_element[0]," parent: ",_element.parent()[0]); + // ToDo: update _currentNetwork when available + + setNetworkStatus(data.status,data); + + /*// Keep checking for updates? + switch(data.status) { + case NetworkAPI.STATUS.CONNECTING: + case NetworkAPI.STATUS.CREATING: + clearTimeout(_retryRetrieveStatusDelay); + _retryRetrieveStatusDelay = setTimeout(_self.retrieveStatus,_retryRetrieveStatusDelayTime); // retry after delay + break; + }*/ + //if(completeHandler) completeHandler(data.status); + }, function() { + //console.log("NetworkPanel:retrieveStatus failed"); + clearTimeout(_retryRetrieveStatusDelay); + _retryRetrieveStatusDelay = setTimeout(_self.retrieveStatus, _retryRetrieveStatusDelayTime); // retry after delay }); - - if(_self.destroyedHandler) _self.destroyedHandler(_self); } -} \ No newline at end of file + function setNetworkStatus(status,data) { + console.log("setNetworkStatus: ",status,data); + if(status === NetworkAPI.STATUS.CONNECTED) { // online + _page.find("#drawItem a").text("Draw"); + // ToDo: Link to update page (auto retrieve if available) + // ToDo: Link to your app here? + // ToDo: Status + // ToDo: Control + _page.find("#joinNetworkItem").toggleClass("ui-screen-hidden",true); + + } else { // offline + _intro.text("Please connect your WiFi-Box to the internet. You can also use it offline but then you aren't able to update."); + + var joinNetworkItem = _page.find("#joinNetworkItem"); + joinNetworkItem.toggleClass("ui-screen-hidden",false); + + var joinLink = joinNetworkItem.find("a").attr("href"); + joinLink = d3d.util.replaceURLParameters(joinLink,_boxData); + joinNetworkItem.find("a").attr("href",joinLink); + + _page.find("#drawItem a").text("Draw (offline)"); + + // ToDo: Status + // ToDo: Control + } + + // update info + /*switch(status) { + case NetworkAPI.STATUS.CONNECTED: + //console.log(" data.ssid: ",data.ssid); + if(data.ssid == "") { + _currentNetwork = undefined; + //data.status = NetworkAPI.STATUS.NOT_CONNECTED; + setStatus(NetworkAPI.STATUS.NOT_CONNECTED); + } else { + _currentNetwork = data.ssid; + } + break; + case NetworkAPI.STATUS.CONNECTING: + if(_selectedNetwork != undefined) { + targetNetwork = _selectedNetwork; + } else if(_currentNetwork != undefined) { + targetNetwork = _currentNetwork; + } + case NetworkAPI.STATUS.CREATING: + case NetworkAPI.STATUS.CREATED: + _currentNetwork = undefined; + break; + }*/ + _networkStatus = data.status; + } + + // to get to the box data we need the url + // only pagecontainer events contain url's + /*$.mobile.document.on( "pagecontainerbeforetransition", function( event, data ) { + //console.log("Box page pagebeforetransition"); + var url = d3d.util.processURL(data.absUrl); + console.log(" url: ",url); + if(url.hash == PAGE_ID) { + _boxData = { + localip: url.parameters.localip, + wifiboxid: url.parameters.wifiboxid, + link: url.parameters.link, + url: "http://"+url.parameters.localip + } + } + });*/ +})(window); \ No newline at end of file diff --git a/js/JoinNetwork.js b/js/JoinNetwork.js new file mode 100644 index 0000000..1162407 --- /dev/null +++ b/js/JoinNetwork.js @@ -0,0 +1,71 @@ +/* + * This file is part of the Doodle3D project (http://doodle3d.com). + * + * Copyright (c) 2013, Doodle3D + * This software is licensed under the terms of the GNU GPL v2 or later. + * See file LICENSE.txt or visit http://www.gnu.org/licenses/gpl.html for full license details. + */ + +(function (w) { + var _page; + var _list; + var _networks; +// var _networkStatus; +// var _networkAPI = new NetworkAPI(); +// var _boxData = {}; +// var _retryRetrieveStatusDelay; +// var _retryRetrieveStatusDelayTime = 3000; + var PAGE_ID = "#join_network"; + + var _self = this; + + $.mobile.document.on( "pageinit", PAGE_ID, function( event, data ) { + console.log("Join network page pageinit"); + _page = $(this); + _list = _page.find("ul[data-role=listview]"); + console.log(" list: ",_list); + }); + $.mobile.document.on( "pagebeforeshow", PAGE_ID, function( event, data ) { + console.log("Join network page pagebeforeshow"); + _boxData = d3d.util.getPageParams(PAGE_ID); + var boxURL = "http://"+_boxData.localip; + console.log(" _boxData: ",_boxData); + + _networkAPI.init(boxURL); + refreshNetworks(); + }); + function refreshNetworks(completeHandler) { + console.log("JoinNetwork:refreshNetworks"); + _api.scan(function(data) { // completed + console.log("JoinNetwork:refreshNetworks:scanned"); + + fillNetworks(data.networks) + _networks = {}; + $.each(data.networks, function(index,network) { + _networks[network.ssid] = network; + }); + + if(completeHandler) completeHandler(); + }); + } + function fillNetworks(networks) { + _list.empty(); + $.each(networks, function(index,network) { + + var joinLink = joinNetworkItem.find("a").attr("href"); + joinLink = d3d.util.replaceURLParameters(joinLink,_boxData); + joinNetworkItem.find("a").attr("href",joinLink); + + + var link = "#network_connecting"; + link = d3d.util.replaceURLParameters(link,_boxData); + //var item = $("
  • "); + + _list.append( + //$("").val(network.ssid).html(network.ssid) + ); + }); + _list.listview('refresh'); // jQuery mobile enhance content + } + +})(window); \ No newline at end of file diff --git a/js/api/ConnectAPI.js b/js/api/ConnectAPI.js index b54a4ec..4ca1688 100644 --- a/js/api/ConnectAPI.js +++ b/js/api/ConnectAPI.js @@ -7,9 +7,31 @@ */ function ConnectAPI() { + // callbacks + this.refreshing; // I'm refreshing my list + this.listUpdated; // the list of boxes is updated / changed + this.boxAppeared; // a new box appeared + this.boxDisapeared; // a box disappeared + //this.boxUpdated; // a box is updated / changed + var _apiURL = "http://connect.doodle3d.com/api"; + var _networkAPI = new NetworkAPI(); var _timeoutTime = 3000; + var _refreshDelay; + var _refreshInterval = 3000; + var _running; + var _listChanged = false; + + var _wiredBox = {localip:"192.168.5.1",wifiboxid:"Wired WiFi-Box"}; + var _apBox = {localip:"192.168.10.1",wifiboxid:"WiFi-Box",link:"http://draw.doodle3d.com"}; + + var _boxTimeoutTime = 500; + var _numBoxesChecking = 0; // count how many boxes we are checking + var _numBoxesFound = 0; // count how many boxes responded + var _boxes = {}; // current list of boxes + var _numBoxes = 0; // current number of boxes + var _self = this; this.list = function(completeHandler,failedHandler) { @@ -33,4 +55,110 @@ function ConnectAPI() { if(failedHandler) failedHandler(); }); }; + + this.start = function(interval,listUpdated) { + if(interval) { + _refreshInterval = interval; + } + if(listUpdated) { + _self.listUpdated = listUpdated; + } + _running = true; + _self.refresh(); + } + this.stop = function() { + _running = false; + clearTimeout(_refreshDelay); + } + this.refresh = function(listUpdated) { + if(listUpdated) { + _self.listUpdated = listUpdated; + } + if(_self.refreshing) { + _self.refreshing(); + } + + _self.list(function(foundBoxes) { + //console.log(" foundBoxes: ",foundBoxes); + foundBoxes.push(_wiredBox); // always check for a wired box + updateList(foundBoxes); + if(_running) { + clearTimeout(_refreshDelay); + _refreshDelay = setTimeout(_self.refresh, _refreshInterval); + } + //removeBox(_apBox.localip,true); // TODO: why again? + }, function() { + // if web is not accessible try to find a box as an accesspoint + // if not found, we look for a wired box + _networkAPI.alive(_apBox.localip,_boxTimeoutTime,function() { + updateList([_apBox]); + }, function() { + updateList([_wiredBox]); + }); + if(_running) { + clearTimeout(_refreshDelay); + _refreshDelay = setTimeout(_self.refresh, _refreshInterval); + } + }); + } + + function updateList(foundBoxes) { + //console.log("updateList"); + _numBoxesChecking = 0; + _numBoxesFound = 0; + _listChanged = false; + + // remove stored, but not found boxes + jQuery.each(_boxes, function (index,box) { + var found = false; + jQuery.each(foundBoxes, function (index,foundBox) { + if(foundBox.localip == box.localip && + foundBox.wifiboxid == box.wifiboxid) found = true; + }); + if(!found) removeBox(box.localip); + }) + + // check if all found boxes are alive + jQuery.each(foundBoxes, function (index,foundBox) { + checkBox(foundBox); + }); + + if(foundBoxes.length == 0 && _self.listUpdated) { + _self.listUpdated(_boxes); + } + } + function checkBox(boxData) { + //console.log(" checkBox: ",boxData.localip); + _numBoxesChecking++; + + _networkAPI.alive(boxData.localip,_boxTimeoutTime,function() { + addBox(boxData); + _numBoxesFound++; + }, function() { + removeBox(boxData.localip); + },function(){ + _numBoxesChecking--; + if(_numBoxesChecking <= 0 && _listChanged && _self.listUpdated) { + _self.listUpdated(_boxes); + } + }); + } + function getBox(localip) { + return _boxes[localip]; + } + function addBox(box) { + if(getBox(box.localip) !== undefined) return; + _boxes[box.localip] = box; + _numBoxes++; + if(_self.boxAppeared) _self.boxAppeared(box); + _listChanged = true; + } + function removeBox(localip) { + var box = getBox(localip); + if(box === undefined) return; + delete _boxes[localip]; + _numBoxes--; + if(_self.boxDisapeared) _self.boxDisapeared(box); + _listChanged = true; + } } \ No newline at end of file diff --git a/js/api/NetworkAPI.js b/js/api/NetworkAPI.js index db0c6e1..d029c21 100644 --- a/js/api/NetworkAPI.js +++ b/js/api/NetworkAPI.js @@ -123,7 +123,7 @@ function NetworkAPI() { }); }; - this.alive = function(wifiboxURL,timeoutTime,completeHandler,failedHandler) { + this.alive = function(wifiboxURL,timeoutTime,successHandler,failedHandler, completeHandler) { if(wifiboxURL.indexOf("http://") != 0) { wifiboxURL = "http://" + wifiboxURL; } @@ -138,13 +138,16 @@ function NetworkAPI() { //console.log("NetworkAPI:alive response: ",response); if(response.status == "error" || response.status == "fail") { if(failedHandler) failedHandler(response); + if(completeHandler) completeHandler(false, response); } else { - completeHandler(response.data); + successHandler(response.data); + if(completeHandler) completeHandler(true, response.data); } } }).fail(function() { //console.log("NetworkAPI:alive failed"); if(failedHandler) failedHandler(); + if(completeHandler) completeHandler(false); }); }; } \ No newline at end of file diff --git a/js/boxes.js b/js/boxes.js new file mode 100644 index 0000000..9780c54 --- /dev/null +++ b/js/boxes.js @@ -0,0 +1,68 @@ +/* + * This file is part of the Doodle3D project (http://doodle3d.com). + * + * Copyright (c) 2013, Doodle3D + * This software is licensed under the terms of the GNU GPL v2 or later. + * See file LICENSE.txt or visit http://www.gnu.org/licenses/gpl.html for full license details. + */ + +var BoxesPage = (function (w) { + var connectAPI = new ConnectAPI(); // TODO add _ + + var _page; + var _list; + var _findItem; + var PAGE_ID = "#boxes"; + + $.mobile.document.on( "pageinit", PAGE_ID, function( event, data ) { + //console.log("Boxes page pageinit"); + _page = $(this); + _list = _page.find("#boxeslist"); + _findItem = _list.find("#findItem"); + + connectAPI.refreshing = onRefreshing; + connectAPI.listUpdated = onListUpdated; + connectAPI.boxAppeared = onBoxAppeared; + connectAPI.boxDisapeared = onBoxDisapeared; + }); + $.mobile.document.on( "pagebeforeshow", PAGE_ID, function( event, data ) { + //console.log("Boxes page pagebeforeshow"); + connectAPI.start(); + }); + $.mobile.document.on( "pagehide", PAGE_ID, function( event, data ) { + //console.log("Boxes page pagehide"); + connectAPI.stop(); + }); + + function onRefreshing() { + //console.log("onRefreshing"); + d3d.util.showLoader(true); + } + function onListUpdated(boxesData) { + console.log("onListUpdated: ",boxesData); + _list.append(_findItem); // make sure find is the last item + _list.listview('refresh'); // jQuery mobile enhance content + } + function onBoxAppeared(boxData) { + console.log("onBoxAppeared: ",boxData.localip); + + var link = "#box?localip="+boxData.localip+"&wifiboxid="+boxData.wifiboxid; + if(boxData.link) { link += "&link="+boxData.link; } + var id = boxData.localip.replace(/\./g,"-"); + var linkElement = $(""+boxData.wifiboxid+""); + var box = $("
  • "); + box.append(linkElement); + box.hide().appendTo(_list).fadeIn(500); + } + function onBoxDisapeared(boxData) { + console.log("onBoxDisapeared: ",boxData.localip); + + var id = boxData.localip.replace(/\./g,"-"); + var box = _list.find("#"+id); + console.log(" box: ",box); + box.fadeOut(500,function() { + box.remove(); + //_list.listview('refresh'); + }); + } +})(window); \ No newline at end of file diff --git a/js/main.js b/js/main.js index fbc3129..e5d4200 100644 --- a/js/main.js +++ b/js/main.js @@ -5,165 +5,84 @@ * This software is licensed under the terms of the GNU GPL v2 or later. * See file LICENSE.txt or visit http://www.gnu.org/licenses/gpl.html for full license details. */ -var retrieveListInterval = 3000; -var retrieveListDelay; // retry setTimout instance -var boxTimeoutTime = 500; -var numBoxesChecking = 0; // count how many boxes we are checking -var numBoxesFound = 0; // count how many boxes responded - -var connectedBox = {localip:"192.168.5.1",wifiboxid:"Wired WiFi-Box"}; -var apBox = {localip:"192.168.10.1",wifiboxid:"WiFi-Box",link:"http://draw.doodle3d.com"}; -var connectAPI = "http://connect.doodle3d.com/api" - -var $list; -var $intro; -var $hint; -var $preloader; -var spinner; - -var boxes = {}; -var numBoxes = 0; - -var networkAPI = new NetworkAPI(); -var connectAPI = new ConnectAPI(); - -$(function() { -// console.log("ready"); - - networkAPI.init(); - - $intro = $("#intro"); - $list = $("#list"); - - $hint = $("#hint"); - $preloader = $("#preloader"); - - var spinnerSettings = { - lines: 7, // The number of lines to draw - length: 0, // The length of each line - width: 14, // The line thickness - radius: 15, // The radius of the inner circle - corners: 1, // Corner roundness (0..1) - rotate: 0, // The rotation offset - direction: 1, // 1: clockwise, -1: counterclockwise - color: '#57BF42', // #rgb or #rrggbb or array of colors - speed: 1.2, // Rounds per second - trail: 69, // Afterglow percentage - shadow: false, // Whether to render a shadow - hwaccel: false, // Whether to use hardware acceleration - className: 'spinner', // The CSS class to assign to the spinner - zIndex: 2e9, // The z-index (defaults to 2000000000) - top: 'auto', // Top position relative to parent in px - left: 'auto' // Left position relative to parent in px - }; - spinner = new Spinner(spinnerSettings); - spinner.spin($preloader[0]); - - retrieveList(); - - // make sure all links are opened in same WebApp (added to homescreen) - // and they don't start a browser - $.stayInWebApp('a',true); -}); - -function retrieveList() { - $preloader.show(); - //spinner.spin($preloader[0]); - connectAPI.list(function(foundBoxes) { - //console.log(" foundBoxes: ",foundBoxes); - foundBoxes.push(connectedBox); - updateList(foundBoxes); - clearTimeout(retrieveListDelay); - retrieveListDelay = setTimeout(retrieveList, retrieveListInterval); - removeBox(apBox.localip,true); - }, function() { - // if web is not accessible try to find the box as an accesspoint - // if not found, we look for a wired box - networkAPI.alive(apBox.localip,boxTimeoutTime,function() { - updateList([apBox]); - }, function() { - updateList([connectedBox]); +var d3d = {}; +d3d.util = { + // Helper function that splits a URL just the way we want it + parseURL:function(url) { + var parsed = $.mobile.path.parseUrl( url ); + var hashParts = parsed.hash.split( "?" ); + var parameters = {}; + // Assemble query parameters object from the query string + if (hashParts.length > 1) { + $.each(hashParts[1].split( "&" ), function( index, value ) { + var pair = value.split( "=" ); + if ( pair.length > 0 && pair[ 0 ] ) { + parameters[ pair[ 0 ] ] = + ( pair.length > 1 ? pair[ 1 ] : true ); + } + }); + } + return { + parsed: parsed, + hash: ( hashParts.length > 0 ? hashParts[ 0 ] : "" ), + parameters: parameters + }; + }, + getPageParams:function(pageID) { + return d3d.pageParams[pageID]; + }, + replaceURLParameters:function(href,parameters){ + //console.log("replaceURLParameters: ",href,parameters); + href = href.split("?")[0]; + var i = 0; + jQuery.each(parameters, function (key,value) { + href += (i===0)? "?" : "&"; + href += key+"="+value; + i++; }); - clearTimeout(retrieveListDelay); - retrieveListDelay = setTimeout(retrieveList, retrieveListInterval); // retry after delay - }); -} - -function updateList(foundBoxes) { - //console.log("updateList"); - numBoxesChecking = 0; - numBoxesFound = 0; - - if (foundBoxes===undefined) foundBoxes = []; - - // remove displayed, but not found boxes - jQuery.each(boxes, function (index,box) { - var found = false; - jQuery.each(foundBoxes, function (index,foundBox) { - if(foundBox.localip == box.localip && - foundBox.wifiboxid == box.wifiboxid) found = true; - }); - if(!found) removeBox(box.localip); - }) - - // check if all found boxes are alive - jQuery.each(foundBoxes, function (index,foundBox) { - checkBox(foundBox); - }); - - updateIntro(); -} - -function checkBox(boxData) { - //console.log(" checkBox: ",boxData.localip); - numBoxesChecking++; - - networkAPI.alive(boxData.localip,boxTimeoutTime,function() { - addBox(boxData); - numBoxesFound++; - numBoxesChecking--; - }, function() { - removeBox(boxData.localip); - numBoxesChecking--; - }); -} -function getBox(localip) { - return boxes[localip]; -} -function addBox(boxData) { - if(getBox(boxData.localip) !== undefined) return; - //console.log("addBox: ",boxData.localip); - var box = new Box(); - box.init(boxData,$list); - box.destroyedHandler = boxDestroyedHandler; - boxes[box.localip] = box; - numBoxes++; - updateIntro(); -} -function removeBox(localip,force) { - var box = getBox(localip); - if(box === undefined) return; - //console.log("removeBox: ",localip," force: ",force); - if(!force && box.connecting) return; - //console.log(" calling destroyed"); - box.destroy(); -} -function boxDestroyedHandler(box) { - //console.log("boxDestroyedHandler"); - delete boxes[box.localip]; - numBoxes--; - updateIntro(); -} - -function updateIntro() { - //console.log("updateIntro, numBoxes: ",numBoxes); - if(numBoxes > 0) { - $intro.html("Found the following boxes near you:"); - $hint.fadeOut(); - } else { - $intro.html("No boxes found near you."); - $hint.fadeIn(); + return href; + }, + showLoader:function(autoHide) { + setTimeout(function(){ + $.mobile.loading('show'); + if(autoHide) { + setTimeout(function() { + $.mobile.loading('hide'); + },1000); + } + }, 1); + }, + hideLoader:function() { + $.mobile.loading('hide'); } - $preloader.fadeOut(1000); -} \ No newline at end of file +}; + +(function (w) { + + /*$.mobile.document.on( "pagebeforechange", function( event, data ) { + console.log("pagebeforechange"); + //console.log(" event: ",event); + //console.log(" data: ",data); + d3d.pageParams[pageID] + + if ($.type(data.toPage) === "string") { + console.log(" data.toPage: ",data.toPage); + //var url = d3d.util.processURL(data.toPage); + //data.url = url; + // add to data attribute of target page ? + } + });*/ + + // to get to url parameters we need the url + // only pagecontainer events contain url's + // we parse the parameters and store them in a global object + $.mobile.document.on( "pagecontainerbeforetransition", function( event, data ) { + //console.log("pagecontainerbeforetransition"); + var url = d3d.util.parseURL(data.absUrl); + //console.log(" url: ",url); + if(!d3d.pageParams) { d3d.pageParams = {}; } + d3d.pageParams[url.hash] = url.parameters; + }); + +})(window); \ No newline at end of file diff --git a/less/styles.less b/less/styles.less new file mode 100644 index 0000000..fcd7020 --- /dev/null +++ b/less/styles.less @@ -0,0 +1,31 @@ +body { + text-align: center; +} + +#logo { + + margin: 10px 5px 5px 5px; + max-width: 200px; +} + +.ui-content{ +text-align: center; +} + +.ui-content p{ + text-align: left; +} + +#drawingCanvas { + border: 2px solid black; + height: 20em; + width: 100%; + border-radius: 15px; +} + +@media only screen and (min-width: 768px) { + body { + padding-left: 20em; + padding-right: 20em; + } +} diff --git a/www/img/Connect to home.png b/www/img/Connect to home.png new file mode 100644 index 0000000000000000000000000000000000000000..fea74991fefa72c31c2fae21c08c151c359b19a5 GIT binary patch literal 7840 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 literal 0 HcmV?d00001 diff --git a/www/img/Step_1.png b/www/img/Step_1.png new file mode 100644 index 0000000000000000000000000000000000000000..17e4a1d955fccf9c939f48d34a1cdc8d10cc5aba GIT binary patch literal 13374 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 + + + Doodle3D Connect + + + + + + + + + + + + + + + + + + + + + + + +
    + + +

    makes 3D printing very easy

    + + + +
    + + + +
    + +
    + + +
    + + +
    + Back +

    +
    + +
    +

    + + +
    + +
    + + + +
    + + +
    + Back +

    Find a WiFi-Box

    +
    + + +
    + + +

    Step 1 of 2

    +

    There's a big chance the Doodle3D WiFi-Box you're looking for is running it's own network. Please open your network settings and connect to a network like 'Doodle3D-...'. Once connected return to this page. (problems?) + + Next + +

    +
    + + + +
    + + +
    + Back +

    Find a WiFi-Box

    +
    + +
    + +

    Step 2 of 2

    + +

    We found your Doodle3D WiFi-Box. Please connect your WiFi-Box to the internet. You can also use it offline but then you aren't able to update.

    +
    + + +
    +
    + + +
    + + +
    + Back +

    Troubleshooting

    +
    + + +
    + +

    Having troubles getting started with your WiFi-Box?

    + +

    Make sure that:

    +
      +
    • The box gets power (green lights should be on).

    • +
    • The box has fully started (takes a minute or two)?

    • +
    • You are looking for the WiFi-Box in your local WiFi list. more info

    • +
    + +

    That is not the problem?

    +
      +
    • Is your box connected to another network? more info

    • +
    • If your computer has an ethernet (network) port you can connect it directly to the Doodle3D WiFi-Box using the supplied ethernet cable. more info

    • + +
    + +

    Got stuck?

    + + + +
    +
    + +
    + + +
    + Back +

    Troubleshooting

    +
    + + +
    +

    If your computer has an Ethernet port you are able to connect to the WiFi-Box through the Ethernet cable. Use the Ethernet cable that is provided with the WiFi-Box. Plug one end of the cable in the WiFi-Box and the other in your computer. Usually this forces the connection of your WiFi-Box over the connection of the internet, making you able to connect to the WiFi-Box but unable to connect to the internet.

    If this is not the case, search for a connection icon (on WINDOWS usually in the lower right corner and for MAC usually in the upper right corner). Click on the icon and search for options to change your current network(probably wireless) to a cable connection.

    Once your computer is connected to the WiFi-Box, return to this page. The 'Find' page will automatically change if you have a connection to a WiFi-Box and will guide you further.

    +
    +
    + +
    + + +
    + Back +

    Troubleshooting

    +
    + + +
    +

    Locate WiFi-Box

    +

    If you are able to connect to connect.doodle3d.com through the internet this means you are connected to a network.

    +
      +
    • If your device can connect to the internet wirelessly it is able to connect to the WiFi-Box through WiFi.

    • +
    • If your device is only able to connect to the internet through a cable it is usaully able to connect to the WiFi-Box through the Ethernet cable. In that case you are able to find more info here.

    • +
    +

    If you run the WiFi-Box for the first time it creates its own network. So aside of the network you are using right now to access the internet there is another network named 'Doodle3D-...' followed by the last 6 characters of the code that is printed on the side of the WiFi-Box.

    +

    To access this network you have to connect to the WiFi-Box network instead of your own network. How you are able to switch between a network differs from device you are using, here is a list of the most common used devices:

    +
      +
    • SMARTPHONE/TABLET: Smartphones or tablets usually have a settings option in their main menu. Within the settings menu there usually is an option to change settings about your WiFi connection. Usually you are able to switch between different WiFi-spots (Networks) within these settings. Look for a list with different WiFi-spots, if everything works fine, and your WiFi-Box is on, there should be a WiFi-spot called 'Doodle3D...' followed by the last 6 characters of the code that is printed on the side of the WiFi-Box. Connect to this WiFi-spot and return to this page.

    • +
    • WINDOWS COMPUTER/LAPTOP: Windows computers usually (from windows Vista and above) have a small icon in the right lower corner of the screen which displays if you are currently connected to the internet (and if your connection is wireless or not). If you click on this icon a list will display with the network you are currently using and the networks that your computer is able to connect to. If everything works fine, and your WiFi-Box is on, there should be a WiFi-spot called 'Doodle3D...' followed by the last 6 characters of the code that is printed on the side of the WiFi-Box within this list. Connect to this WiFi-spot and return to this page.

    • +
    • MAC COMPUTER/LAPTOP: For most MAC computers there is a small WiFi icon in the upper right corner of their screen. If the WiFi connection is on you can click on the icon and a list with possible networks would appear. If everything works fine, and your WiFi-Box is on, there should be a WiFi-spot called 'Doodle3D...' followed by the last 6 characters of the code that is printed on the side of the WiFi-Box. Connect to this WiFi-spot and return to this page.

    • +
    + +

    Once you are connect to the WiFi-spot, the 'Find' page will automatically change and will guide you through the next steps.

    +
    +
    + + +
    + + +
    + Back +

    Doodle3D-987654 (accesspoint)

    +
    + + +
    + + + + +
    + + +
    + Back +

    Troubleshooting

    +
    + +
    + +

    If your WiFi-Box is already connected to another network, it is possible to reset the WiFi-Box and make it run it's own network again.

    +
      +
    • You can do this by press and holding the green light button on the top of the WiFi-Box. By holding this button for 3 seconds the WiFi-Box will reset its own network.

    • + +
    • If you have a device with an Ethernet port, it is always possible to connect your WiFi-Box through the ethernet cable.

    • +
    + +
    +
    + + +
    + + +
    + Back +

    Ultimaker @ Doodle3D-123456

    +
    + +
    + +
      +
    • temperature
    • +
    • nozzle: 223
    • +
    • bed: 85
    • +
    • progress
    • +
    • printing time: 20m
    • +
    • time left: 2h30
    • +
    + + +
    + +
    + + +
    + + +
    + Back +

    Join network

    +
    + +
    +

    Select your own network from the following list:

    +
    +
      + +
    +
    + +
    + + +
    + +
    + Back +

    Connect

    +
    +
    +

    Join a hidden network

    + + + +
    +
    + +
    + +
    + Back +

    Connect

    +
    +
    +

    Join a secured network

    + + +
    +
    + +
    + +
    + Back +

    Connect

    +
    +
    + +

    Connecting to network...

    +

    Your WiFi-Box is trying to connect to your local network. To use your WiFi-Box, reconnect to the network you directed the WiFi-Box to. Once you are connected return to this page.

    + +
    +
    + +
    + + +
    +
    +
    + +
    + + +
    + + + +
    +

    Settings

    + +
    + +
    + + +
    + + + +
    + Back +

    Ultimaker @ Doodle3D-123456

    +
    + +
    + +

    Tune [current value's]

    +
    + + +
    + +
    + + +
    + +
    + + +
    + +
    + + +
    + +
    + + +
    +
    +
    +
    +
    +
    +
    + +
    +
    + + +
    + + + +
    + Back +

    Ultimaker @ Doodle3D-123456

    +
    + +
    + +

    Control

    + +
    +
    +
    +
    + +
    +
    +
    +
    + +
    +
    +
    +
    + +
    + +
    + + +
    + + + +
    + Back +

    Update

    +
    + +
    + +
    + +
    + + + + + + \ No newline at end of file