diff --git a/apps/gpstrek/app.js b/apps/gpstrek/app.js index 95db86aaf..21259c522 100644 --- a/apps/gpstrek/app.js +++ b/apps/gpstrek/app.js @@ -7,25 +7,12 @@ const MODE_SLICES = 2; const STORAGE = require("Storage"); const BAT_FULL = require("Storage").readJSON("setting.json").batFullVoltage || 0.3144; -const SETTINGS = { - mapCompass: true, - mapScale:0.2, //initial value - mapRefresh:1000, //minimum time in ms between refreshs of the map - mapChunkSize: 5, //render this many waypoints at a time - overviewScroll: 30, //scroll this amount on swipe in pixels - overviewScale: 0.02, //initial value - refresh:500, //general refresh interval in ms - refreshLocked:3000, //general refresh interval when Bangle is locked - cacheMinFreeMem:2000, - cacheMaxEntries:0, - minCourseChange: 5, //course change needed in degrees before redrawing the map - minPosChange: 5, //position change needed in pixels before redrawing the map - waypointChangeDist: 50, //distance in m to next waypoint before advancing automatically - queueWaitingTime: 5, // waiting time during processing of task queue items when running with timeouts - autosearch: true, - maxDistForAutosearch: 300, - autosearchLimit: 3 -}; + + +const SETTINGS = Object.assign( + require('Storage').readJSON("gpstrek.default.json", true) || {}, + require('Storage').readJSON("gpstrek.json", true) || {} +); let init = function(){ global.screen = 1; @@ -38,7 +25,6 @@ let init = function(){ Bangle.loadWidgets(); WIDGETS.gpstrek.start(false); - if (!WIDGETS.gpstrek.getState().numberOfSlices) WIDGETS.gpstrek.getState().numberOfSlices = 2; if (!WIDGETS.gpstrek.getState().mode) WIDGETS.gpstrek.getState().mode = MODE_MENU; }; @@ -459,7 +445,7 @@ let getMapSlice = function(){ if (!isMapOverview){ drawCurrentPos(); } - if (!isMapOverview && renderInTimeouts){ + if (SETTINGS.mapCompass && !isMapOverview && renderInTimeouts){ drawMapCompass(); } if (renderInTimeouts) drawInterface(); @@ -1254,11 +1240,6 @@ let showMenu = function(){ "Background" : showBackgroundMenu, "Calibration": showCalibrationMenu, "Reset" : ()=>{ E.showPrompt("Do Reset?").then((v)=>{ if (v) {WIDGETS.gpstrek.resetState(); removeMenu();} else {E.showMenu(mainmenu);}}).catch(()=>{E.showMenu(mainmenu);});}, - "Info rows" : { - value : WIDGETS.gpstrek.getState().numberOfSlices, - min:1,max:6,step:1, - onchange : v => { WIDGETS.gpstrek.getState().numberOfSlices = v; } - }, }; E.showMenu(mainmenu); @@ -1374,7 +1355,7 @@ const finishData = { }; let getSliceHeight = function(number){ - return Math.floor(Bangle.appRect.h/WIDGETS.gpstrek.getState().numberOfSlices); + return Math.floor(Bangle.appRect.h/SETTINGS.numberOfSlices); }; let compassSlice = getCompassSlice(); @@ -1455,7 +1436,6 @@ let updateRouting = function() { lastSearch = Date.now(); autosearchCounter++; } - let counter = 0; while (hasNext(s.route) && distance(s.currentPos,get(s.route)) < SETTINGS.waypointChangeDist) { next(s.route); minimumDistance = Number.MAX_VALUE; @@ -1479,7 +1459,7 @@ let updateSlices = function(){ slices.push(healthSlice); slices.push(systemSlice); slices.push(system2Slice); - maxSlicePages = Math.ceil(slices.length/s.numberOfSlices); + maxSlicePages = Math.ceil(slices.length/SETTINGS.numberOfSlices); }; let page_slices = 0; @@ -1515,9 +1495,9 @@ let drawSlices = function(){ if (force){ clear(); } - let firstSlice = page_slices*s.numberOfSlices; + let firstSlice = page_slices*SETTINGS.numberOfSlices; let sliceHeight = getSliceHeight(); - let slicesToDraw = slices.slice(firstSlice,firstSlice + s.numberOfSlices); + let slicesToDraw = slices.slice(firstSlice,firstSlice + SETTINGS.numberOfSlices); for (let slice of slicesToDraw) { g.reset(); if (!slice.refresh || slice.refresh() || force) diff --git a/apps/gpstrek/default.json b/apps/gpstrek/default.json new file mode 100644 index 000000000..985efc94e --- /dev/null +++ b/apps/gpstrek/default.json @@ -0,0 +1,20 @@ +{ + "mapCompass": true, + "mapScale":0.5, + "mapRefresh":1000, + "mapChunkSize": 15, + "overviewScroll": 30, + "overviewScale": 0.02, + "refresh":500, + "refreshLocked":3000, + "cacheMinFreeMem":2000, + "cacheMaxEntries":0, + "minCourseChange": 5, + "minPosChange": 5, + "waypointChangeDist": 50, + "queueWaitingTime": 5, + "autosearch": true, + "maxDistForAutosearch": 300, + "autosearchLimit": 3, + "numberOfSlices": 3 +} diff --git a/apps/gpstrek/metadata.json b/apps/gpstrek/metadata.json index 0ec3a8bfe..1f2279fda 100644 --- a/apps/gpstrek/metadata.json +++ b/apps/gpstrek/metadata.json @@ -12,8 +12,13 @@ "interface" : "interface.html", "storage": [ {"name":"gpstrek.app.js","url":"app.js"}, + {"name":"gpstrek.settings.js","url":"settings.js"}, + {"name":"gpstrek.default.json","url":"default.json"}, {"name":"gpstrek.wid.js","url":"widget.js"}, {"name":"gpstrek.img","url":"app-icon.js","evaluate":true} ], - "data": [{"name":"gpstrek.state.json"}] + "data": [ + {"name":"gpstrek.state.json"}, + {"name":"gpstrek.json"} + ] } diff --git a/apps/gpstrek/settings.js b/apps/gpstrek/settings.js new file mode 100644 index 000000000..ebd9c13bb --- /dev/null +++ b/apps/gpstrek/settings.js @@ -0,0 +1,156 @@ +(function(back) { + const FILE="gpstrek.json"; + let settings; + + function writeSettings(key, value) { + var s = require('Storage').readJSON(FILE, true) || {}; + s[key] = value; + require('Storage').writeJSON(FILE, s); + readSettings(); + } + + function readSettings(){ + settings = Object.assign( + require('Storage').readJSON("gpstrek.default.json", true) || {}, + require('Storage').readJSON(FILE, true) || {} + ); + } + + + function showMapMenu(){ + var menu = { + '': { 'title': 'Map', back: showMainMenu }, + 'Show compass on map': { + value: !!settings.mapCompass, + onchange: v => { + writeSettings("mapCompass",v); + }, + }, + 'Initial map scale': { + value: settings.mapScale, + min: 0.01,max: 2, step:0.01, + onchange: v => { + writeSettings("mapScale",v); + }, + }, + 'Rendered waypoints': { + value: settings.mapChunkSize, + min: 5,max: 60, step:5, + onchange: v => { + writeSettings("mapChunkSize",v); + } + }, + 'Overview scroll': { + value: settings.overviewScroll, + min: 10,max: 100, step:10, + format: v => v + "px", + onchange: v => { + writeSettings("overviewScroll",v); + } + }, + 'Initial overview scale': { + value: settings.overviewScale, + min: 0.005,max: 0.1, step:0.005, + onchange: v => { + writeSettings("overviewScale",v); + } + } + }; + E.showMenu(menu); + } + + function showRoutingMenu(){ + var menu = { + '': { 'title': 'Routing', back: showMainMenu }, + 'Auto search closest waypoint': { + value: !!settings.autosearch, + onchange: v => { + writeSettings("autosearch",v); + }, + }, + 'Auto search limit': { + value: settings.autosearchLimit, + onchange: v => { + writeSettings("autosearchLimit",v); + }, + }, + 'Waypoint change distance': { + value: settings.waypointChangeDist, + format: v => v + "m", + min: 5,max: 200, step:5, + onchange: v => { + writeSettings("waypointChangeDist",v); + }, + } + }; + E.showMenu(menu); + } + + function showRefreshMenu(){ + var menu = { + '': { 'title': 'Refresh', back: showMainMenu }, + 'Unlocked refresh': { + value: settings.refresh, + format: v => v + "ms", + min: 250,max: 5000, step:250, + onchange: v => { + writeSettings("refresh",v); + } + }, + 'Locked refresh': { + value: settings.refreshLocked, + min: 1000,max: 60000, step:1000, + format: v => v + "ms", + onchange: v => { + writeSettings("refreshLocked",v); + } + }, + 'Minimum refresh': { + value: settings.mapRefresh, + format: v => v + "ms", + min: 250,max: 5000, step:250, + onchange: v => { + writeSettings("mapRefresh",v); + } + }, + 'Minimum course change': { + value: settings.minCourseChange, + min: 0,max: 180, step:1, + format: v => v + "°", + onchange: v => { + writeSettings("minCourseChange",v); + } + }, + 'Minimum position change': { + value: settings.minPosChange, + min: 0,max: 50, step:1, + format: v => v + "px", + onchange: v => { + writeSettings("minPosChange",v); + } + } + }; + E.showMenu(menu); + } + + + function showMainMenu(){ + var mainmenu = { + '': { 'title': 'GPS Trekking', back: back }, + 'Map': showMapMenu, + 'Routing': showRoutingMenu, + 'Refresh': showRefreshMenu, + "Info rows" : { + value : settings.numberOfSlices, + min:1,max:6,step:1, + onchange : v => { + writeSettings("numberOfSlices",v); + } + }, + }; + E.showMenu(mainmenu); + } + + readSettings(); + showMainMenu(); +}) \ No newline at end of file