2013-12-20 16:31:41 +01:00
/ *
* 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.
* /
2013-10-22 03:31:12 +02:00
function UpdatePanel ( ) {
this . wifiboxURL ;
this . element ;
this . statusCheckInterval = 1000 ;
this . statusCheckDelayer ; // setTimout instance
2013-12-18 14:47:52 +01:00
this . installedDelay = 90 * 1000 ; // Since we can't retrieve status during installation we show the installed text after a fixed delay
2013-10-22 03:31:12 +02:00
this . installedDelayer ; // setTimout instance
this . retryDelay = 1000 ;
this . retryDelayer ; // setTimout instance
//this.timeoutTime = 3000;
this . canUpdate = false ;
this . currentVersion = "" ;
this . newestVersion ;
this . progress ;
this . imageSize ;
2014-02-07 12:35:15 +01:00
var _inAccessPointMode ;
2013-10-22 03:31:12 +02:00
// states from api, see Doodle3D firmware src/script/d3d-updater.lua
UpdatePanel . NONE = 1 ; // default state
UpdatePanel . DOWNLOADING = 2 ;
UpdatePanel . DOWNLOAD _FAILED = 3 ;
UpdatePanel . IMAGE _READY = 4 ; // download successfull and checked
UpdatePanel . INSTALLING = 5 ;
UpdatePanel . INSTALLED = 6 ;
UpdatePanel . INSTALL _FAILED = 7 ;
this . state ; // update state from api
this . stateText = "" ; // update state text from api
var self = this ;
this . init = function ( wifiboxURL , updatePanelElement ) {
this . wifiboxURL = wifiboxURL ;
this . element = updatePanelElement ;
2014-01-02 16:46:36 +01:00
this . retainCheckbox = this . element . find ( "#retainConfiguration" ) ;
2013-10-22 03:31:12 +02:00
this . btnUpdate = this . element . find ( "#update" ) ;
this . statusDisplay = this . element . find ( "#updateState" ) ;
this . infoDisplay = this . element . find ( "#updateInfo" ) ;
2014-01-02 16:46:36 +01:00
this . retainCheckbox . change ( this . retainChanged ) ;
2013-10-22 03:31:12 +02:00
this . btnUpdate . click ( this . update ) ;
this . checkStatus ( false ) ;
}
2014-01-02 16:46:36 +01:00
this . retainChanged = function ( e ) {
console . log ( "UpdatePanel:retainChanged" ) ;
2013-12-23 17:40:14 +01:00
self . setState ( self . state , true ) ;
}
2013-10-22 03:31:12 +02:00
this . update = function ( ) {
console . log ( "UpdatePanel:update" ) ;
self . downloadUpdate ( ) ;
}
this . downloadUpdate = function ( ) {
console . log ( "UpdatePanel:downloadUpdate" ) ;
$ . ajax ( {
url : self . wifiboxURL + "/update/download" ,
type : "POST" ,
dataType : 'json' ,
success : function ( response ) {
console . log ( "UpdatePanel:downloadUpdate response: " , response ) ;
}
} ) . fail ( function ( ) {
console . log ( "UpdatePanel:downloadUpdate: failed" ) ;
} ) ;
self . setState ( UpdatePanel . DOWNLOADING ) ;
self . startCheckingStatus ( ) ;
}
this . installUpdate = function ( ) {
console . log ( "UpdatePanel:installUpdate" ) ;
2013-12-23 17:40:14 +01:00
2014-01-02 16:46:36 +01:00
// should personal sketches and settings be retained over update?
var retain = self . retainCheckbox . prop ( 'checked' ) ;
console . log ( " retain: " , retain ) ;
2013-12-23 17:40:14 +01:00
2013-10-22 03:31:12 +02:00
self . stopCheckingStatus ( ) ;
2014-01-02 16:46:36 +01:00
postData = { no _retain : ! retain }
2013-10-22 03:31:12 +02:00
$ . ajax ( {
url : self . wifiboxURL + "/update/install" ,
type : "POST" ,
2013-12-23 17:40:14 +01:00
data : postData ,
2013-10-22 03:31:12 +02:00
dataType : 'json' ,
success : function ( response ) {
console . log ( "UpdatePanel:installUpdate response: " , response ) ;
}
} ) . fail ( function ( ) {
console . log ( "UpdatePanel:installUpdate: no respons (there shouldn't be)" ) ;
} ) ;
self . setState ( UpdatePanel . INSTALLING ) ;
clearTimeout ( self . installedDelayer ) ;
self . installedDelayer = setTimeout ( function ( ) { self . setState ( UpdatePanel . INSTALLED ) } , self . installedDelay ) ;
}
this . startCheckingStatus = function ( ) {
clearTimeout ( self . statusCheckDelayer ) ;
clearTimeout ( self . retryDelayer ) ;
self . statusCheckDelayer = setTimeout ( function ( ) { self . checkStatus ( true ) } , self . statusCheckInterval ) ;
}
this . stopCheckingStatus = function ( ) {
clearTimeout ( self . statusCheckDelayer ) ;
clearTimeout ( self . retryDelayer ) ;
}
this . checkStatus = function ( keepChecking ) {
if ( ! communicateWithWifibox ) return ;
$ . ajax ( {
url : self . wifiboxURL + "/update/status" ,
type : "GET" ,
dataType : 'json' ,
//timeout: self.timeoutTime,
success : function ( response ) {
console . log ( "UpdatePanel:checkStatus response: " , response ) ;
// Keep checking ?
if ( keepChecking ) {
switch ( self . state ) {
case UpdatePanel . DOWNLOADING :
case UpdatePanel . INSTALLING :
clearTimeout ( self . statusCheckDelayer ) ;
self . statusCheckDelayer = setTimeout ( function ( ) { self . checkStatus ( keepChecking ) } , self . statusCheckInterval ) ;
break ;
}
}
if ( response . status != "error" ) {
var data = response . data ;
self . handleStatusData ( data ) ;
}
}
} ) . fail ( function ( ) {
//console.log("UpdatePanel:checkStatus: failed");
if ( keepChecking ) {
clearTimeout ( self . retryDelayer ) ;
self . retryDelayer = setTimeout ( function ( ) { self . checkStatus ( keepChecking ) } , self . retryDelay ) ; // retry after delay
}
} ) ;
}
this . handleStatusData = function ( data ) {
//console.log("UpdatePanel:handleStatusData");
self . canUpdate = data . can _update ;
if ( self . currentVersion != data . current _version || self . newestVersion != data . newest _version ) {
self . currentVersion = data . current _version ;
self . newestVersion = data . newest _version ;
self . updateInfoDisplay ( ) ;
}
self . stateText = data . state _text ;
self . progress = data . progress ; // not always available
self . imageSize = data . image _size ; // not always available
self . setState ( data . state _code ) ;
switch ( this . state ) {
case UpdatePanel . IMAGE _READY :
self . installUpdate ( ) ;
break ;
}
}
2013-12-23 17:40:14 +01:00
this . setState = function ( newState , refresh ) {
console . log ( "UpdatePanel:setState" ) ;
if ( ! refresh && this . state == newState ) return ;
2014-02-07 12:35:15 +01:00
console . log ( "UpdatePanel:setState: " , this . state , " > " , newState , "(" , this . stateText , ") (in Access Point Mode: " , _inAccessPointMode , ") (newestVersion: " , self . newestVersion , ") (refresh: " , refresh , ")" ) ;
2013-10-22 03:31:12 +02:00
this . state = newState ;
2014-01-02 16:46:36 +01:00
// should personal sketches and settings be retained over update?
var retain = self . retainCheckbox . prop ( 'checked' ) ;
console . log ( " retain" , retain ) ;
2013-12-23 17:40:14 +01:00
2013-10-22 03:31:12 +02:00
// download button
// if there isn't newestVersion data something went wrong,
2013-12-23 17:40:14 +01:00
// probably accessing the internet
console . log ( " self.newestVersion: " , self . newestVersion ) ;
2013-10-22 03:31:12 +02:00
if ( self . newestVersion != undefined ) {
2013-12-23 17:40:14 +01:00
console . log ( " this.state: " , this . state ) ;
2013-10-22 03:31:12 +02:00
switch ( this . state ) {
case UpdatePanel . NONE :
case UpdatePanel . DOWNLOAD _FAILED :
case UpdatePanel . INSTALL _FAILED :
2013-12-23 17:40:14 +01:00
console . log ( " self.canUpdate: " , self . canUpdate ) ;
2014-01-02 16:46:36 +01:00
if ( self . canUpdate || ! retain ) {
2013-10-22 03:31:12 +02:00
self . btnUpdate . removeAttr ( "disabled" ) ;
} else {
self . btnUpdate . attr ( "disabled" , true ) ;
}
break ;
default :
self . btnUpdate . attr ( "disabled" , true ) ;
break ;
}
} else {
self . btnUpdate . attr ( "disabled" , true ) ;
}
this . updateStatusDisplay ( ) ;
}
this . updateStatusDisplay = function ( ) {
var text = "" ;
if ( self . newestVersion != undefined ) {
switch ( this . state ) {
case UpdatePanel . NONE :
if ( self . canUpdate ) {
text = "Update(s) available." ;
} else {
text = "You're up to date." ;
}
break ;
case UpdatePanel . DOWNLOADING :
text = "Downloading update..." ;
break ;
case UpdatePanel . DOWNLOAD _FAILED :
text = "Downloading update failed." ;
break ;
case UpdatePanel . IMAGE _READY :
text = "Update downloaded." ;
break ;
case UpdatePanel . INSTALLING :
text = "Installing update... (will take a minute)" ;
break ;
case UpdatePanel . INSTALLED :
2013-10-30 21:21:12 +01:00
text = "Update complete, please reconnect by connecting your device to the access point of your WiFi box and going to <a href='http://draw.doodle3d.com'>draw.doodle3d.com</a>" ;
2013-10-30 20:26:16 +01:00
//text = "Update complete, please <a href='javascript:location.reload(true);'>refresh Page</a>.";
2013-10-22 03:31:12 +02:00
break ;
case UpdatePanel . INSTALL _FAILED :
text = "Installing update failed." ;
break ;
}
} else {
2014-02-07 12:35:15 +01:00
if ( _inAccessPointMode ) {
2013-10-22 03:31:12 +02:00
text = "Can't access internet in access point mode." ;
} else {
text = "Can't access internet." ;
}
}
this . statusDisplay . html ( text ) ;
}
this . updateInfoDisplay = function ( ) {
2013-12-12 14:14:34 +01:00
var html = 'Current version: ' + self . currentVersion +
' (<a target="d3d-curr-relnotes" href="ReleaseNotes.html">release notes</a>). ' ;
2013-10-22 03:31:12 +02:00
if ( self . canUpdate ) {
2013-12-12 14:14:34 +01:00
html += 'Latest version: ' + self . newestVersion +
' (<a target="d3d-new-relnotes" href="http://doodle3d.com/updates/images/ReleaseNotes.md">release notes</a>).' ;
2013-10-22 03:31:12 +02:00
}
2013-12-12 14:14:34 +01:00
self . infoDisplay . html ( html ) ;
2013-10-22 03:31:12 +02:00
}
2014-02-07 12:35:15 +01:00
this . setInAccessPointMode = function ( inAccessPointMode ) {
_inAccessPointMode = inAccessPointMode ;
self . updateStatusDisplay ( ) ;
2013-10-22 03:31:12 +02:00
}
2013-12-12 14:14:34 +01:00
}