Add files via upload
|
|
@ -1,2 +1,3 @@
|
||||||
0.01: (2023-02-23) initial alpha upload
|
0.01: (2024-02-23) initial alpha upload
|
||||||
0.02: (2023-02-23) fixing minor issues with settings
|
0.02: (2024-02-23) fixed minor issues with settings
|
||||||
|
0.03: (2024-03-01) advanced settings, rearanged ui elements, fixed rendering problems
|
||||||
|
|
|
||||||
|
|
@ -3,7 +3,7 @@
|
||||||
## Modes
|
## Modes
|
||||||
|
|
||||||
* **Idle**
|
* **Idle**
|
||||||
On startup the application is in idle mode showing a large 5 in the centre of the screen.
|
On startup the application is in idle mode showing a large 5 in the centre of the screen and the time of day below.
|
||||||
`Button` switches to start mode.
|
`Button` switches to start mode.
|
||||||
* **Start**
|
* **Start**
|
||||||
During the countdown, the screen changes the layout several times to use as much space as
|
During the countdown, the screen changes the layout several times to use as much space as
|
||||||
|
|
@ -11,29 +11,55 @@
|
||||||
When time is up the buzzer sounds and the application switches to race mode.
|
When time is up the buzzer sounds and the application switches to race mode.
|
||||||
`Button` switches to idle mode.
|
`Button` switches to idle mode.
|
||||||
* **Race**
|
* **Race**
|
||||||
Race time, local time, SOA and number of GPS satellites available are displayed.
|
Race time, local time, SOA, number reachable GPS satellites and battery level are shown.
|
||||||
`Button` switches to "stopped mode".
|
`Button` switches to "stopped mode".
|
||||||
* **Stoped**
|
* **Stoped**
|
||||||
|
The race counter stops.
|
||||||
`Button` switches to idle mode.
|
`Button` switches to idle mode.
|
||||||
|
|
||||||
## Screenshots
|
## Screenshots
|
||||||
|
|
||||||

|
*Idle mode: showing a big 5 and time of day below*
|
||||||

|

|
||||||
|
|
||||||
|
*Start mode: minutes and seconds*
|
||||||
|

|
||||||
|
|
||||||
|
*Start mode: seconds*
|
||||||
|

|
||||||
|
|
||||||
|
*Race mode: elapsed time, time of day, speed, satellites, battery*
|
||||||
|

|
||||||
|
|
||||||
|
*Race mode: with german abbreviations*
|
||||||
|

|
||||||
|
|
||||||
|
*Settings page: main*
|
||||||
|

|
||||||
|
|
||||||
|
*Settings page: choose the theme*
|
||||||
|

|
||||||
|
|
||||||
## Localization
|
## Localization
|
||||||
|
|
||||||
Localization is done by the Bangle.js 2 app "Languages"
|
Localization is done by the Bangle.js 2 app "Languages"
|
||||||
* Go to: https://banglejs.com/apps/
|
* Go to [banglejs.com/apps](https://banglejs.com/apps/)
|
||||||
* Search for app: Languages
|
* Search for app "Languages"
|
||||||
* Click the "arrow up" or "burger" icon
|
* Click the "arrow up" or "burger" icon
|
||||||
* Choose your language from the dropdown
|
* Choose your language from the dropdown
|
||||||
* Click `upload`
|
* Click `upload`
|
||||||
|
|
||||||
|
**Some nautical abbreviations which are not part of the banglejs2 Languages packages are stored in `translations.json`.**
|
||||||
|
|
||||||
## Feedback
|
## Feedback
|
||||||
|
|
||||||
Report bugs, request a feature at https://www.github.com/naden
|
Report bugs or request a feature at [github.com/naden](https://github.com/naden)
|
||||||
|
|
||||||
|
## Roadmap
|
||||||
|
* adding a seconds coundown layout to mimic a classic regatta chronograph
|
||||||
|
|
||||||
## Created by
|
## Created by
|
||||||
|
|
||||||
© 2021 - 2023 https://naden.de
|
© 2021 - 2024 [naden.de](https://naden.de)
|
||||||
|
|
||||||
|
Icons by [Icons8](https://icons8.com/)
|
||||||
|
|
|
||||||
|
|
@ -1 +1 @@
|
||||||
require("heatshrink").decompress(atob("mEwxH+AH4A/ACaaCBRAIQ/2sF6IKSBBGsAAJfRBKQHGxAvCMKohEBBgACwQuDSLJfPwIuESCJAQAAouGMCQuVdgYvowIuJGEYuCF9YuNF53OAAS6PAAQvKGBguDGBouQF7iLDF9QuTGBgvNFwwvad5XB4OkCYwuOF5gAIFwPB4QvqFwRfYGBQmDAA6/CFyovVd4YvqBoYvXGBIqE3QOIGAgvbGAm6Lggvp3e7MBYuSF5RgRF6aQYGAQveeQoAEF7AtKF6GBFbYwTFbgAGsYAZF9xfvF/4wJrtdEIoHMFKNeAAQvDA4YmDA5ofHFpWCwQSDA7wvHBgOI1utxAFBA74vHBgIAlF/4v/F64A/AH4A7A"))
|
require("heatshrink").decompress(atob("mEw4n/8H/BAWlsEI0ExkFj0H34GcgHnwGUsHO4H/kEhkGl4He8HeI8dgCyvTiM0ruABxNoxAACwwIC4MRAAMUkAWHgoNCAAMdBIVBBAccuAXGsIXIwtEmIxD0AXFhgXIAAMI6oZCnIXFh1VqtRC44AB2RkCqBiHC5UAhIxBip5KC5EA8gwIyMRiYXKgyWBjIIEhQgBpIXKgEEEwKSEA4MU3IXLhYwBoAHDuMRn8JC5cA8cRi4eDTIOQC5oNBjgFChoFChEx4wXKgApB6BeDiQEBxVgC5chMAeBiM7CZYAD2cRjAEB6L3JAA7oBNwVRJgYANOQMVAgKtBwAXPhDRBAgMxiYDBylEB4lk+C3D6gnBCYYbDrAnFrngIgeUDoKoBgEGC4dHyxWEqgXDXAIXBLYNgC4ldykAhWoIwNk8EL1TIBC4pHEBYOAgV+gFV6mbg13C4hHCMYcGqEMd4fXuhOEC4R3DU4eUpLPFL4kFwCnEa6/RiNQC58FiMdAgOBiM7C5+ziMYMwURiQXPkMRoAEBgURjgXPUwJyDAoOQCxsJFIOwAwVxiM+C5vjiMXY4itBaoYAIgzRBLwQABhUxA4oAHE4MT0AIEyIwMFwRGEYwcRpwXJ8gNBdA9RHIKSIhJVBir3JTIMrBQuyWoIuIAAOTBgMTruAA4MI6otBiM3KZMKNYIZC4lMCoSDBRgoAFg4+CAAscuDjMhoxDFofQfZpaCoYVBmhkDACEGbpQAY"))
|
||||||
|
|
|
||||||
|
Before Width: | Height: | Size: 3.3 KiB After Width: | Height: | Size: 1.4 KiB |
|
|
@ -2,18 +2,17 @@
|
||||||
"id": "regattatimer",
|
"id": "regattatimer",
|
||||||
"name": "Regatta Timer",
|
"name": "Regatta Timer",
|
||||||
"shortName": "RegattaTimer",
|
"shortName": "RegattaTimer",
|
||||||
"version": "0.2",
|
"version": "0.3",
|
||||||
"description": "Regatta Timer with 5-4-1 Countdown",
|
"description": "Regatta Timer with 5-4-1 Countdown",
|
||||||
"icon": "icon.png",
|
"icon": "icon.png",
|
||||||
"screenshots": [{"url":"screenshot.png"}],
|
|
||||||
"tags": "tool,outdoors,sailing,race,regatta,boat,timer",
|
"tags": "tool,outdoors,sailing,race,regatta,boat,timer",
|
||||||
"supports": ["BANGLEJS2"],
|
"supports": ["BANGLEJS2"],
|
||||||
"readme": "README.md",
|
"readme": "README.md",
|
||||||
"storage": [
|
"storage": [
|
||||||
{"name": "regattatimer.app.js", "url": "app.js"},
|
{"name": "regattatimer.app.js", "url": "app.js"},
|
||||||
{"name": "regattatimer.settings.js", "url": "settings.js"},
|
{"name": "regattatimer.settings.js", "url": "settings.js"},
|
||||||
{"name":"regattatimer.img","url":"app-icon.js","evaluate":true}
|
{"name": "regattatimer.img", "url": "app-icon.js", "evaluate": true},
|
||||||
],
|
],
|
||||||
"data": [{"name": "regattatimer.json"}],
|
"data": [{"name": "regattatimer.json"}],
|
||||||
"screenshots": [{"url":"screenshot.png"},{"url":"screenshot-1.png"},{"url":"screenshot-2.png"}]
|
"screenshots": [{"url": "screenshot.png"},{"url": "screenshot-1.png"},{"url": "screenshot-2.png"},{"url": "screenshot-3.png"},{"url": "screenshot-4.png"},{"url": "screenshot-5.png"},{"url": "screenshot-6.png"},{"url": "screenshot-7.png"}]
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,8 +1,10 @@
|
||||||
{
|
{
|
||||||
"debug": false,
|
"debug": false,
|
||||||
"dial": "numeric",
|
"buzzer": true,
|
||||||
|
"dial": "Numeric",
|
||||||
"gps": false,
|
"gps": false,
|
||||||
"compass": false,
|
"record": false,
|
||||||
|
"theme": "Dark",
|
||||||
"fgColor": "#FFFF00",
|
"fgColor": "#FFFF00",
|
||||||
"bgColor": "#000000"
|
"bgColor": "#000000"
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
Before Width: | Height: | Size: 1.9 KiB After Width: | Height: | Size: 1.8 KiB |
|
Before Width: | Height: | Size: 2.1 KiB After Width: | Height: | Size: 2.1 KiB |
|
After Width: | Height: | Size: 1.8 KiB |
|
After Width: | Height: | Size: 2.8 KiB |
|
After Width: | Height: | Size: 2.7 KiB |
|
After Width: | Height: | Size: 2.8 KiB |
|
After Width: | Height: | Size: 2.3 KiB |
|
Before Width: | Height: | Size: 1.8 KiB After Width: | Height: | Size: 2.8 KiB |
|
|
@ -1,52 +1,79 @@
|
||||||
(function(back) {
|
(function(back) {
|
||||||
var file = "regattatimer.json";
|
var
|
||||||
// Load settings
|
file = "regattatimer.json",
|
||||||
var settings = Object.assign({
|
|
||||||
|
storage = require("Storage"),
|
||||||
|
|
||||||
|
dials = ["Numeric", "Discs"],
|
||||||
|
|
||||||
|
themes = ["Light", "Dark"],
|
||||||
|
|
||||||
|
settings = Object.assign({
|
||||||
"debug": false,
|
"debug": false,
|
||||||
"dial": "numeric",
|
"buzzer": true,
|
||||||
|
"dial": "Numeric",
|
||||||
"gps": false,
|
"gps": false,
|
||||||
"compass": false,
|
"record": false,
|
||||||
|
"theme": "Dark",
|
||||||
"fgColor": "#FFFF00",
|
"fgColor": "#FFFF00",
|
||||||
"bgColor": "#000000"
|
"bgColor": "#000000"
|
||||||
}, require('Storage').readJSON(file, true) || {});
|
}, storage.readJSON(file, true) || {});
|
||||||
|
|
||||||
function writeSettings() {
|
function save(key, value) {
|
||||||
require('Storage').writeJSON(file, settings);
|
settings[key] = value;
|
||||||
|
storage.writeJSON(file, settings);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Show the menu
|
|
||||||
E.showMenu({
|
E.showMenu({
|
||||||
"" : { "title" : "Regatta Timer" },
|
"" : { "title" : "Regatta Timer" },
|
||||||
"< Back" : () => back(),
|
"< Back" : () => back(),
|
||||||
'GPS': {
|
"GPS": {
|
||||||
value: !!settings.gps, // !! converts undefined to false
|
value: !!settings.gps, // !! converts undefined to false
|
||||||
onchange: v => {
|
onchange: v => {
|
||||||
settings.gps = v;
|
save("gps", v);
|
||||||
writeSettings();
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
'COMPASS': {
|
"THEME": {
|
||||||
value: !!settings.compass, // 0| converts undefined to 0
|
value: themes.indexOf(settings.theme),
|
||||||
onchange: v => {
|
|
||||||
settings.compass = v;
|
|
||||||
writeSettings();
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"DIAL": {
|
|
||||||
value: settings.dial,
|
|
||||||
min: 0,
|
min: 0,
|
||||||
max: 1,
|
max: themes.length - 1,
|
||||||
format: v => ["Numeric", "Disc"][v],
|
step: 1,
|
||||||
onchange: v => {
|
wrap: true,
|
||||||
settings.dial = v;
|
format: v => themes[v],
|
||||||
writeSettings();
|
onchange: (d) => {
|
||||||
|
save("theme", themes[d]);
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
'DEBUG': {
|
"BUZZER": {
|
||||||
|
value: !!settings.buzzer, // !! converts undefined to false
|
||||||
|
onchange: v => {
|
||||||
|
save("buzzer", v);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
/*
|
||||||
|
"DIAL": {
|
||||||
|
value: dials.indexOf(settings.dial),
|
||||||
|
min: 0,
|
||||||
|
max: dials.length - 1,
|
||||||
|
step: 1,
|
||||||
|
wrap: true,
|
||||||
|
format: v => dials[v],
|
||||||
|
onchange: (d) => {
|
||||||
|
save("dial", dials[d]);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"RECORD": {
|
||||||
|
value: !!settings.record, // 0| converts undefined to 0
|
||||||
|
onchange: v => {
|
||||||
|
settings.record = v;
|
||||||
|
save("record", v);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
*/
|
||||||
|
"DEBUG": {
|
||||||
value: !!settings.debug, // 0| converts undefined to 0
|
value: !!settings.debug, // 0| converts undefined to 0
|
||||||
onchange: v => {
|
onchange: v => {
|
||||||
settings.debug = v;
|
save("debug", v);
|
||||||
writeSettings();
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
|
||||||