Wed, 24 Oct 2018 23:15:04 +0200
Update /spiffs via internet. http://update.mbse.eu is now the update server.
image/files.list | file | annotate | diff | comparison | revisions | |
image/version.txt | file | annotate | diff | comparison | revisions | |
image/w/chart.html | file | annotate | diff | comparison | revisions | |
image/w/index.html | file | annotate | diff | comparison | revisions | |
image/w/index.html.gz | file | annotate | diff | comparison | revisions | |
image/w/logfiles.json | file | annotate | diff | comparison | revisions | |
image/w/vnc.html.orig | file | annotate | diff | comparison | revisions | |
main/task_sdcard.c | file | annotate | diff | comparison | revisions | |
main/updates.c | file | annotate | diff | comparison | revisions |
--- a/image/files.list Wed Oct 24 11:55:39 2018 +0200 +++ b/image/files.list Wed Oct 24 23:15:04 2018 +0200 @@ -1,81 +1,75 @@ -/fonts/BigFont.fon -/fonts/DejaVuSans12.fon -/fonts/DejaVuSans18.fon -/fonts/DejaVuSans24.fon -/fonts/DotMatrix_M.fon -/fonts/Grotesk24x48.fon -/fonts/SmallFont.fon -/fonts/Ubuntu.fon -/fonts/arial_bold.fon -/fonts/ocrfont.c -/fonts/swiss721_outline.fon -/www/app/error-handler.js.gz -/www/app/localization.js.gz -/www/app/ui.js.gz -/www/app/webutil.js.gz -/www/app/images/clipboard.svg.gz -/www/app/images/connect.svg.gz -/www/app/images/disconnect.svg.gz -/www/app/images/drag.svg.gz -/www/app/images/error.svg.gz -/www/app/images/expander.svg.gz -/www/app/images/fullscreen.svg.gz -/www/app/images/handle.svg.gz -/www/app/images/handle_bg.svg.gz -/www/app/images/info.svg.gz -/www/app/images/mouse_left.svg.gz -/www/app/images/mouse_middle.svg.gz -/www/app/images/mouse_none.svg.gz -/www/app/images/mouse_right.svg.gz -/www/app/images/settings.svg.gz -/www/app/images/warning.svg.gz -/www/app/locale/de.json -/www/app/locale/el.json -/www/app/locale/es.json -/www/app/locale/nl.json -/www/app/locale/pl.json -/www/app/locale/sv.json -/www/app/locale/tr.json -/www/app/locale/zh.json -/www/app/sounds/bell.mp3 -/www/app/sounds/bell.oga -/www/app/styles/base.css -/www/app/styles/web.css -/www/core/base64.js.gz -/www/core/des.js.gz -/www/core/display.js.gz -/www/core/encodings.js.gz -/www/core/inflator.js.gz -/www/core/rfb.js.gz -/www/core/websock.js.gz -/www/core/input/mouse.js.gz -/www/core/util/browser.js.gz -/www/core/util/events.js.gz -/www/core/util/eventtarget.js.gz -/www/core/util/logging.js.gz -/www/core/util/polyfill.js.gz -/www/core/util/strings.js.gz -www/css/style.css -www/js/Chart.min.js.gz -www/js/ch-plug-anno.min.js.gz -www/js/jquery-1.12.4.min.js.gz -www/js/webui.js -www/js/modl/babel.js.gz -www/js/modl/brloader.js.gz -www/js/utils/common.js.gz -www/js/zlib/adler32.js.gz -www/js/zlib/constants.js.gz -www/js/zlib/crc32.js.gz -www/js/zlib/deflate.js.gz -www/js/zlib/gzheader.js.gz -www/js/zlib/inffast.js.gz -www/js/zlib/inflate.js.gz -www/js/zlib/inftrees.js.gz -www/js/zlib/messages.js.gz -www/js/zlib/trees.js.gz -www/js/zlib/zstream.js.gz -www/chart.html -www/index.html -www/logs.html -www/vnc.html.gz -www/webui.html +fonts/DejaVuSans18.fon +fonts/DejaVuSans24.fon +fonts/Grotesk24x48.fon +fonts/SmallFont.fon +fonts/Ubuntu.fon +w/app/error-handler.js.gz +w/app/localization.js.gz +w/app/ui.js.gz +w/app/webutil.js.gz +w/app/images/clipboard.svg.gz +w/app/images/connect.svg.gz +w/app/images/disconnect.svg.gz +w/app/images/drag.svg.gz +w/app/images/error.svg.gz +w/app/images/expander.svg.gz +w/app/images/fullscreen.svg.gz +w/app/images/handle.svg.gz +w/app/images/handle_bg.svg.gz +w/app/images/info.svg.gz +w/app/images/mouse_left.svg.gz +w/app/images/mouse_middle.svg.gz +w/app/images/mouse_none.svg.gz +w/app/images/mouse_right.svg.gz +w/app/images/settings.svg.gz +w/app/images/warning.svg.gz +w/app/locale/de.json +w/app/locale/el.json +w/app/locale/es.json +w/app/locale/nl.json +w/app/locale/pl.json +w/app/locale/sv.json +w/app/locale/tr.json +w/app/locale/zh.json +w/app/sounds/bell.mp3 +w/app/sounds/bell.oga +w/app/styles/base.css +w/app/styles/web.css +w/core/base64.js.gz +w/core/des.js.gz +w/core/display.js.gz +w/core/encodings.js.gz +w/core/inflator.js.gz +w/core/rfb.js.gz +w/core/websock.js.gz +w/core/input/mouse.js.gz +w/core/util/browser.js.gz +w/core/util/events.js.gz +w/core/util/eventtarget.js.gz +w/core/util/logging.js.gz +w/core/util/polyfill.js.gz +w/core/util/strings.js.gz +w/css/style.css +w/js/Chart.min.js.gz +w/js/ch-plug-anno.min.js.gz +w/js/jquery-1.12.4.min.js.gz +w/js/webui.js +w/js/modl/babel.js.gz +w/js/modl/brloader.js.gz +w/js/utils/common.js.gz +w/js/zlib/adler32.js.gz +w/js/zlib/constants.js.gz +w/js/zlib/crc32.js.gz +w/js/zlib/deflate.js.gz +w/js/zlib/gzheader.js.gz +w/js/zlib/inffast.js.gz +w/js/zlib/inflate.js.gz +w/js/zlib/inftrees.js.gz +w/js/zlib/messages.js.gz +w/js/zlib/trees.js.gz +w/js/zlib/zstream.js.gz +w/chart.html +w/index.html.gz +w/logs.html +w/vnc.html.gz +w/webui.html
--- a/image/version.txt Wed Oct 24 11:55:39 2018 +0200 +++ b/image/version.txt Wed Oct 24 23:15:04 2018 +0200 @@ -1,1 +1,1 @@ -0.2.4 +0.0.g
--- a/image/w/chart.html Wed Oct 24 11:55:39 2018 +0200 +++ b/image/w/chart.html Wed Oct 24 23:15:04 2018 +0200 @@ -1,34 +1,35 @@ <!DOCTYPE html> <html lang="en"> <head> - <title>Brew Log</title> - <meta charset="utf-8" /> - <meta http-equiv="X-UA-Compatible" content="IE=edge" /> - <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no" /> - <script src="js/jquery-1.12.4.min.js"></script> - <script src="js/Chart.min.js"></script> - <script src="js/ch-plug-anno.min.js"></script> - <link rel="stylesheet" href="app/styles/web.css"> - <style> + <title>Brew Log</title> + <meta charset="utf-8" /> + <meta http-equiv="X-UA-Compatible" content="IE=edge" /> + <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no" /> + <script src="js/jquery-1.12.4.min.js"></script> + <script src="js/Chart.min.js"></script> + <script src="js/ch-plug-anno.min.js"></script> + <link rel="stylesheet" href="app/styles/web.css"> + <style> canvas{ -moz-user-select: none; -webkit-user-select: none; -ms-user-select: none; background: white; } - </style> + </style> </head> <body> - <div id="tmap"></div> + <div id="tmap"></div> <div style="width:95%; margin:0 auto; margin-top: 20px;"> <canvas id="myChart"></canvas> </div> - <br> - <form action="index.html"><input type="submit" class="button" value="Hoofdmenu"></form> + <div class="menu"> + <form action="index.html"><input type="submit" class="button" value="Hoofdmenu"></form> + <form action="logs.html"><input type="submit" class="button" value="Brouw logs"></form> + </div> <script> - var tokens = []; var query = location.search; query = query.slice(1); @@ -40,7 +41,6 @@ tokens[key] = data; }); - var logfile = tokens["show"]; $('#tmap').append(logfile);
--- a/image/w/index.html Wed Oct 24 11:55:39 2018 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,24 +0,0 @@ -<!DOCTYPE HTML> -<HTML> - <HEAD> - <title>BrewBoard</title> - <meta charset="utf-8" /> - <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1" /> - <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no" /> - <link rel="stylesheet" href="app/styles/web.css" /> - </HEAD> - <BODY> - - <div class="columns menu"> - <ul> - <li><input type="none" class="button" value="BrewBoard menu"></li> - <li><form action="vnc.html"><input type="submit" class="button" value="Touch Scherm"></form></li> - <li><form action="logs.html"><input type="submit" class="button" value="Brouw logs"></form></li> - <li><form action="webui.html"><input type="submit" class="button" value="Web User Interface"></form></li> - <li><form action="#"><input type="submit" class="button" value="Menu 3"></form></li> - </ul> - </div> - - </BODY> -</HTML> -
--- a/image/w/logfiles.json Wed Oct 24 11:55:39 2018 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,1 +0,0 @@ -{"Dir":[{"Folder":"/log","Files":[{"File":"br1806302319.json","Size":1073,"Date":1530397502},{"File":"br1807011111.json","Size":11510,"Date":1530445220},{"File":"br1806301536.json","Size":761,"Date":1530369610},{"File":"br1806301624.json","Size":8165,"Date":1530375054},{"File":"br1806301750.json","Size":18921,"Date":1530384530},{"File":"br1806302023.json","Size":9399,"Date":1530390360}]}]}
--- a/image/w/vnc.html.orig Wed Oct 24 11:55:39 2018 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,336 +0,0 @@ -<!DOCTYPE html> -<html class="noVNC_loading"> -<head> - - <!-- - noVNC example: simple example using default UI - Copyright (C) 2012 Joel Martin - Copyright (C) 2016 Samuel Mannehed for Cendio AB - Copyright (C) 2016 Pierre Ossman for Cendio AB - noVNC is licensed under the MPL 2.0 (see LICENSE.txt) - This file is licensed under the 2-Clause BSD license (see LICENSE.txt). - - Connect parameters are provided in query string: - http://example.com/?host=HOST&port=PORT&encrypt=1 - or the fragment: - http://example.com/#host=HOST&port=PORT&encrypt=1 - --> - <title>noVNC</title> - - <meta charset="utf-8" /> - - <!-- Always force latest IE rendering engine (even in intranet) & Chrome Frame - Remove this if you use the .htaccess --> - <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1" /> - - <!-- Icons (see Makefile for what the sizes are for) --> - <link rel="icon" sizes="16x16" type="image/png" href="app/images/icons/novnc-16x16.png"> - <link rel="icon" sizes="24x24" type="image/png" href="app/images/icons/novnc-24x24.png"> - <link rel="icon" sizes="32x32" type="image/png" href="app/images/icons/novnc-32x32.png"> - <link rel="icon" sizes="48x48" type="image/png" href="app/images/icons/novnc-48x48.png"> - <link rel="icon" sizes="60x60" type="image/png" href="app/images/icons/novnc-60x60.png"> - <link rel="icon" sizes="64x64" type="image/png" href="app/images/icons/novnc-64x64.png"> - <link rel="icon" sizes="72x72" type="image/png" href="app/images/icons/novnc-72x72.png"> - <link rel="icon" sizes="76x76" type="image/png" href="app/images/icons/novnc-76x76.png"> - <link rel="icon" sizes="96x96" type="image/png" href="app/images/icons/novnc-96x96.png"> - <link rel="icon" sizes="120x120" type="image/png" href="app/images/icons/novnc-120x120.png"> - <link rel="icon" sizes="144x144" type="image/png" href="app/images/icons/novnc-144x144.png"> - <link rel="icon" sizes="152x152" type="image/png" href="app/images/icons/novnc-152x152.png"> - <link rel="icon" sizes="192x192" type="image/png" href="app/images/icons/novnc-192x192.png"> - <!-- Firefox currently mishandles SVG, see #1419039 - <link rel="icon" sizes="any" type="image/svg+xml" href="app/images/icons/novnc-icon.svg"> - --> - <!-- Repeated last so that legacy handling will pick this --> - <link rel="icon" sizes="16x16" type="image/png" href="app/images/icons/novnc-16x16.png"> - - <!-- Apple iOS Safari settings --> - <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no" /> - <meta name="apple-mobile-web-app-capable" content="yes" /> - <meta name="apple-mobile-web-app-status-bar-style" content="black-translucent" /> - <!-- Home Screen Icons (favourites and bookmarks use the normal icons) --> - <link rel="apple-touch-icon" sizes="60x60" type="image/png" href="app/images/icons/novnc-60x60.png"> - <link rel="apple-touch-icon" sizes="76x76" type="image/png" href="app/images/icons/novnc-76x76.png"> - <link rel="apple-touch-icon" sizes="120x120" type="image/png" href="app/images/icons/novnc-120x120.png"> - <link rel="apple-touch-icon" sizes="152x152" type="image/png" href="app/images/icons/novnc-152x152.png"> - - <!-- Stylesheets --> - <link rel="stylesheet" href="app/styles/base.css" /> - - <!-- - <script type='text/javascript' - src='http://getfirebug.com/releases/lite/1.2/firebug-lite-compressed.js'></script> - --> - - <!-- this is included as a normal file in order to catch script-loading errors as well --> - <script type="text/javascript" src="app/error-handler.js"></script> - - <!-- begin scripts --> - <!-- promise polyfills promises for IE11 --> - <script src="js/promise.js"></script> - <!-- ES2015/ES6 modules polyfill --> - <script type="module"> - window._noVNC_has_module_support = true; - </script> - <script> - window.addEventListener("load", function() { - if (window._noVNC_has_module_support) return; - var loader = document.createElement("script"); - loader.src = "js/modl/brloader.js"; - document.head.appendChild(loader); - }); - </script> - <!-- actual script modules --> - <script type="module" crossorigin="anonymous" src="app/ui.js"></script> - <!-- end scripts --> -</head> - -<body> - - <div id="noVNC_fallback_error" class="noVNC_center"> - <div> - <div>noVNC encountered an error:</div> - <br> - <div id="noVNC_fallback_errormsg"></div> - </div> - </div> - - <!-- noVNC Control Bar --> - <div id="noVNC_control_bar_anchor" class="noVNC_vcenter"> - - <div id="noVNC_control_bar"> - <div id="noVNC_control_bar_handle" title="Hide/Show the control bar"><div></div></div> - - <div class="noVNC_scroll"> - - <h1 class="noVNC_logo" translate="no"><span>no</span><br />VNC</h1> - - <!-- Drag/Pan the viewport --> - <input type="image" alt="viewport drag" src="app/images/drag.svg" - id="noVNC_view_drag_button" class="noVNC_button noVNC_hidden" - title="Move/Drag Viewport" /> - - <!--noVNC Touch Device only buttons--> - <div id="noVNC_mobile_buttons"> - <input type="image" alt="No mousebutton" src="app/images/mouse_none.svg" - id="noVNC_mouse_button0" class="noVNC_button" - title="Active Mouse Button"/> - <input type="image" alt="Left mousebutton" src="app/images/mouse_left.svg" - id="noVNC_mouse_button1" class="noVNC_button" - title="Active Mouse Button"/> - <input type="image" alt="Middle mousebutton" src="app/images/mouse_middle.svg" - id="noVNC_mouse_button2" class="noVNC_button" - title="Active Mouse Button"/> - <input type="image" alt="Right mousebutton" src="app/images/mouse_right.svg" - id="noVNC_mouse_button4" class="noVNC_button" - title="Active Mouse Button"/> - <input type="image" alt="Keyboard" src="app/images/keyboard.svg" - id="noVNC_keyboard_button" class="noVNC_button" - value="Keyboard" title="Show Keyboard" /> - </div> - - <!-- Extra manual keys --> - <div id="noVNC_extra_keys"> - <input type="image" alt="Extra keys" src="app/images/toggleextrakeys.svg" - id="noVNC_toggle_extra_keys_button" class="noVNC_button" - title="Show Extra Keys"/> - <div class="noVNC_vcenter"> - <div id="noVNC_modifiers" class="noVNC_panel"> - <input type="image" alt="Ctrl" src="app/images/ctrl.svg" - id="noVNC_toggle_ctrl_button" class="noVNC_button" - title="Toggle Ctrl"/> - <input type="image" alt="Alt" src="app/images/alt.svg" - id="noVNC_toggle_alt_button" class="noVNC_button" - title="Toggle Alt"/> - <input type="image" alt="Tab" src="app/images/tab.svg" - id="noVNC_send_tab_button" class="noVNC_button" - title="Send Tab"/> - <input type="image" alt="Esc" src="app/images/esc.svg" - id="noVNC_send_esc_button" class="noVNC_button" - title="Send Escape"/> - <input type="image" alt="Ctrl+Alt+Del" src="app/images/ctrlaltdel.svg" - id="noVNC_send_ctrl_alt_del_button" class="noVNC_button" - title="Send Ctrl-Alt-Del" /> - </div> - </div> - </div> - - <!-- Shutdown/Reboot --> - <input type="image" alt="Shutdown/Reboot" src="app/images/power.svg" - id="noVNC_power_button" class="noVNC_button" - title="Shutdown/Reboot..." /> - <div class="noVNC_vcenter"> - <div id="noVNC_power" class="noVNC_panel"> - <div class="noVNC_heading"> - <img src="app/images/power.svg"> Power - </div> - <input type="button" id="noVNC_shutdown_button" value="Shutdown" /> - <input type="button" id="noVNC_reboot_button" value="Reboot" /> - <input type="button" id="noVNC_reset_button" value="Reset" /> - </div> - </div> - - <!-- Clipboard --> - <input type="image" alt="Clipboard" src="app/images/clipboard.svg" - id="noVNC_clipboard_button" class="noVNC_button" - title="Clipboard" /> - <div class="noVNC_vcenter"> - <div id="noVNC_clipboard" class="noVNC_panel"> - <div class="noVNC_heading"> - <img src="app/images/clipboard.svg"> Clipboard - </div> - <textarea id="noVNC_clipboard_text" rows=5></textarea> - <br /> - <input id="noVNC_clipboard_clear_button" type="button" - value="Clear" class="noVNC_submit" /> - </div> - </div> - - <!-- Toggle fullscreen --> - <input type="image" alt="Fullscreen" src="app/images/fullscreen.svg" - id="noVNC_fullscreen_button" class="noVNC_button noVNC_hidden" - title="Fullscreen" /> - - <!-- Settings --> - <input type="image" alt="Settings" src="app/images/settings.svg" - id="noVNC_settings_button" class="noVNC_button" - title="Settings" /> - <div class="noVNC_vcenter"> - <div id="noVNC_settings" class="noVNC_panel"> - <ul> - <li class="noVNC_heading"> - <img src="app/images/settings.svg"> Settings - </li> - <li> - <label><input id="noVNC_setting_shared" type="checkbox" /> Shared Mode</label> - </li> - <li> - <label><input id="noVNC_setting_view_only" type="checkbox" /> View Only</label> - </li> - <li><hr></li> - <li> - <label><input id="noVNC_setting_view_clip" type="checkbox" /> Clip to Window</label> - </li> - <li> - <label for="noVNC_setting_resize">Scaling Mode:</label> - <select id="noVNC_setting_resize" name="vncResize"> - <option value="off">None</option> - <option value="scale">Local Scaling</option> - <option value="remote">Remote Resizing</option> - </select> - </li> - <li><hr></li> - <li> - <div class="noVNC_expander">Advanced</div> - <div><ul> - <li> - <label for="noVNC_setting_repeaterID">Repeater ID:</label> - <input id="noVNC_setting_repeaterID" type="input" value="" /> - </li> - <li> - <div class="noVNC_expander">WebSocket</div> - <div><ul> - <li> - <label><input id="noVNC_setting_encrypt" type="checkbox" /> Encrypt</label> - </li> - <li> - <label for="noVNC_setting_host">Host:</label> - <input id="noVNC_setting_host" /> - </li> - <li> - <label for="noVNC_setting_port">Port:</label> - <input id="noVNC_setting_port" type="number" /> - </li> - <li> - <label for="noVNC_setting_path">Path:</label> - <input id="noVNC_setting_path" type="input" value="websockify" /> - </li> - </ul></div> - </li> - <li><hr></li> - <li> - <label><input id="noVNC_setting_reconnect" type="checkbox" /> Automatic Reconnect</label> - </li> - <li> - <label for="noVNC_setting_reconnect_delay">Reconnect Delay (ms):</label> - <input id="noVNC_setting_reconnect_delay" type="number" /> - </li> - <li><hr></li> - <!-- Logging selection dropdown --> - <li> - <label>Logging: - <select id="noVNC_setting_logging" name="vncLogging"> - </select> - </label> - </li> - </ul></div> - </li> - </ul> - </div> - </div> - - <!-- Connection Controls --> - <input type="image" alt="Disconnect" src="app/images/disconnect.svg" - id="noVNC_disconnect_button" class="noVNC_button" - title="Disconnect" /> - - </div> - </div> - - <div id="noVNC_control_bar_hint"></div> - - </div> <!-- End of noVNC_control_bar --> - - <!-- Status Dialog --> - <div id="noVNC_status"></div> - - <!-- Connect button --> - <div class="noVNC_center"> - <div id="noVNC_connect_dlg"> - <div class="noVNC_logo" translate="no"><span>no</span>VNC</div> - <div id="noVNC_connect_button"><div> - <img src="app/images/connect.svg"> Connect - </div></div> - </div> - </div> - - <!-- Password Dialog --> - <div class="noVNC_center noVNC_connect_layer"> - <div id="noVNC_password_dlg" class="noVNC_panel"><form> - <ul> - <li> - <label>Password:</label> - <input id="noVNC_password_input" type="password" /> - </li> - <li> - <input id="noVNC_password_button" type="submit" value="Send Password" class="noVNC_submit" /> - </li> - </ul> - </form></div> - </div> - - <!-- Transition Screens --> - <div id="noVNC_transition"> - <div id="noVNC_transition_text"></div> - <div> - <input type="button" id="noVNC_cancel_reconnect_button" value="Cancel" class="noVNC_submit" /> - </div> - <div class="noVNC_spinner"></div> - </div> - - <!-- This is where the RFB elements will attach --> - <div id="noVNC_container"> - <!-- Note that Google Chrome on Android doesn't respect any of these, - html attributes which attempt to disable text suggestions on the - on-screen keyboard. Let's hope Chrome implements the ime-mode - style for example --> - <textarea id="noVNC_keyboardinput" autocapitalize="off" - autocorrect="off" autocomplete="off" spellcheck="false" - mozactionhint="Enter" tabindex="-1"></textarea> - </div> - - <audio id="noVNC_bell"> - <source src="app/sounds/bell.oga" type="audio/ogg"> - <source src="app/sounds/bell.mp3" type="audio/mpeg"> - </audio> - </body> -</html>
--- a/main/task_sdcard.c Wed Oct 24 11:55:39 2018 +0200 +++ b/main/task_sdcard.c Wed Oct 24 23:15:04 2018 +0200 @@ -374,6 +374,7 @@ * @param fromdir Source directory * @param todir Destination directory */ +#if 0 void SyncDirs(char *fromdir, char *todir) { char ff[64], tf[64]; @@ -425,6 +426,7 @@ } closedir(dir); } +#endif @@ -499,15 +501,14 @@ DIR* dir = opendir("/sdcard/w/log"); if (dir == NULL) { ret = mkdir("/sdcard/w/log", 0755); - printf("Dir created ret=%d\n", ret); } else { closedir(dir); } - SyncDirs("/sdcard/w", "/spiffs/w"); - SyncDirs("/sdcard/w/js", "/spiffs/w/js"); - SyncDirs("/sdcard/w/css", "/spiffs/w/css"); +// SyncDirs("/sdcard/w", "/spiffs/w"); +// SyncDirs("/sdcard/w/js", "/spiffs/w/js"); +// SyncDirs("/sdcard/w/css", "/spiffs/w/css"); // SyncDirs("/sdcard/w/js/modl" , "/spiffs/w/js/modl"); // // SyncDirs("/sdcard/w/js/utils", "/spiffs/w/js/utils"); // SyncDirs("/sdcard/w/js/zlib", "/spiffs/w/js/zlib"); @@ -518,7 +519,7 @@ // SyncDirs("/sdcard/w/app/images", "/spiffs/w/app/images"); // SyncDirs("/sdcard/w/app/locale", "/spiffs/w/app/locale"); // SyncDirs("/sdcard/w/app/sounds", "/spiffs/w/app/sounds"); // - SyncDirs("/sdcard/w/app/styles", "/spiffs/w/app/styles"); +// SyncDirs("/sdcard/w/app/styles", "/spiffs/w/app/styles"); // SyncDirs("/sdcard/fonts", "/spiffs/fonts"); // }
--- a/main/updates.c Wed Oct 24 11:55:39 2018 +0200 +++ b/main/updates.c Wed Oct 24 23:15:04 2018 +0200 @@ -24,9 +24,9 @@ /** - * @brief Run update procedure + * @brief Run binary update procedure */ -void run_update(void) +void bin_update(void) { char temp[64]; esp_err_t err; @@ -38,13 +38,13 @@ const esp_partition_t *running = esp_ota_get_running_partition(); snprintf(temp, 63, "Running part.type %d sub %d,\r\nat offset 0x%08x\r\n", running->type, running->subtype, running->address); - TFT_print(temp, 0, 25); + TFT_print(temp, 0, LASTY); /* * Don't use https because it costs more then 100K memory. */ esp_http_client_config_t update = { - .url = "http://seaport.mbse.ym/update/brewboard.bin", + .url = "http://update.mbse.eu/ap1/fw/brewboard.bin", }; esp_http_client_handle_t client = esp_http_client_init(&update); @@ -60,7 +60,13 @@ goto updateerr; } - esp_http_client_fetch_headers(client); + int content_length = esp_http_client_fetch_headers(client); + int status_code = esp_http_client_get_status_code(client); + if (status_code != 200) { + ESP_LOGE(TAG, "GET %s error %d", update.url, status_code); + esp_http_client_cleanup(client); + goto updateerr; + } update_partition = esp_ota_get_next_update_partition(NULL); if (update_partition == NULL) { ESP_LOGE(TAG, "No update partition"); @@ -77,7 +83,7 @@ } TFT_print("Begin download.\r\n", 0, LASTY); - ESP_LOGI(TAG, "Download update %s", update.url); + ESP_LOGI(TAG, "Download update %s size %d", update.url, content_length); int binary_file_length = 0; /*deal with all receive packet*/ while (1) { @@ -140,6 +146,183 @@ +/** + * @brief Download a file to /spiffs + * @param filename The name and path of the file to download. + * @return Return 0 if ok, negative if errors. + */ +int DownloadSpiffs(char *filename) +{ + esp_err_t err; + static char theurl[73], thefile[41]; + FILE *f; + +// static char todel[41]; +// snprintf(todel, 40, "/spiffs//%s", filename); +// unlink(todel); +// return 0; + + snprintf(theurl, 72, "http://update.mbse.eu/ap1/image/%s", filename); + snprintf(thefile, 40, "/spiffs/%s", filename); + + esp_http_client_config_t update = { + .url = theurl, + }; + + esp_http_client_handle_t client = esp_http_client_init(&update); + if (client == NULL) { + ESP_LOGE(TAG, "Failed to init HTTP connection"); + return -1; + } + + err = esp_http_client_open(client, 0); + if (err != ESP_OK) { + ESP_LOGE(TAG, "Failed to open HTTP connection: %s", esp_err_to_name(err)); + esp_http_client_cleanup(client); + return -1; + } + + int content_length = esp_http_client_fetch_headers(client); + int status_code = esp_http_client_get_status_code(client); + if (status_code != 200) { + ESP_LOGE(TAG, "GET %s error %d", update.url, status_code); + esp_http_client_cleanup(client); + return -1; + } + + /* + * Remove a possible stale download. + */ + unlink("/spiffs/tmpfile"); + f = fopen("/spiffs/tmpfile", "w"); + if (f == NULL) { + ESP_LOGE(TAG, "Cannot create /spiffs/tmpfile"); + esp_http_client_cleanup(client); + return -1; + } + + int read_length = 0; + int write_length = 0; + while (1) { + int data_read = esp_http_client_read(client, ota_write_data, BUFFSIZE); + if (data_read < 0) { + ESP_LOGE(TAG, "Error: data read error %s", theurl); + http_cleanup(client); + return -1; + } else if (data_read > 0) { + size_t bytes = fwrite(ota_write_data, 1, data_read, f); + if (bytes != data_read) { + ESP_LOGE(TAG, "fwrite %s %d/%d at %d", theurl, bytes, data_read, write_length); + } + write_length += bytes; + read_length += data_read; + } else if (data_read == 0) { + break; + } + vTaskDelay(5 / portTICK_PERIOD_MS); + } + fclose(f); + + if (content_length != write_length) { + ESP_LOGE(TAG, "Download %s size %d but got %d bytes", theurl, content_length, write_length); + unlink("/spiffs/tmpfile"); + return -1; + } + + ESP_LOGI(TAG, "Download %s size %d Ok", theurl, content_length); + unlink(thefile); + rename("/spiffs/tmpfile", thefile); + esp_http_client_cleanup(client); + return 0; +} + + + +/** + * @brief Update /spiffs filesystem + */ +void spiffs_update(void) +{ + int rc; + FILE *f; + char v1[12], v2[12], fn[41]; + + TFT_setFont(DEJAVU18_FONT, NULL); + _fg = TFT_CYAN; + TFT_print("Update /spiffs ", 0, 25); + + rc = rename("/spiffs/version.txt", "/spiffs/version.old"); + if ((rc != 0) && (errno == ENOENT)) { + /* No old file. */ + ESP_LOGI(TAG, "No old /spiffs/version.txt"); + /* Download, install old and new */ + DownloadSpiffs("version.txt"); + rename("/spiffs/version.txt", "/spiffs/version.old"); + DownloadSpiffs("version.txt"); + goto spiffs_update; + } + + if (DownloadSpiffs("version.txt") < 0) + goto spiffs_error; + + /* Compare spiffs/version.old and /spiffs/version.txt */ + v1[0] = '\0'; + v2[0] = '\0'; + f = fopen("/spiffs/version.old", "r"); + if (f) { + fgets(v1, 11, f); + fclose(f); + } + f = fopen("/spiffs/version.txt", "r"); + if (f) { + fgets(v2, 11, f); + fclose(f); + } +// ESP_LOG_BUFFER_HEXDUMP(TAG, v1, strlen(v1), ESP_LOG_INFO); +// ESP_LOG_BUFFER_HEXDUMP(TAG, v2, strlen(v2), ESP_LOG_INFO); + if (strcmp(v1, v2) == 0) { + ESP_LOGI(TAG, "/spiffs is up to date"); + TFT_print("Ok\r\n", LASTX, LASTY); + unlink("/spiffs/version.old"); + return; + } + +spiffs_update: + /* + * Run the update, get the filelist. + */ + ESP_LOGI(TAG, "Full /spiffs update"); + rc = DownloadSpiffs("files.list"); + if (rc < 0) { + unlink("/spiffs/version.txt"); + rename("/spiffs/version.old", "/spiffs/version.txt"); // So next time we try again. + goto spiffs_error; + } + + f = fopen("/spiffs/files.list", "r"); + while (fgets(fn, 40, f)) { + fn[strlen(fn)-1] = '\0'; + rc = DownloadSpiffs(fn); + if (rc < 0) { + ESP_LOGE(TAG, "Updates failed"); + fclose(f); + goto spiffs_error; + } +// vTaskDelay(10 / portTICK_PERIOD_MS); + } + fclose(f); + unlink("/spiffs/version.old"); + TFT_print("updated\r\n", LASTX, LASTY); + return; + +spiffs_error: + _fg = TFT_RED; + TFT_print("error\r\n", LASTX, LASTY); + +} + + + /* * Files init function, only runs once a new screen is entered. */ @@ -166,7 +349,8 @@ switch (Main_Screen) { case MAIN_TOOLS_UPDATES: - run_update(); + spiffs_update(); + bin_update(); Main_Screen = MAIN_TOOLS; break;