Add files via upload
|
@ -1,2 +1,3 @@
|
|||
0.01: (2023-02-23) initial alpha upload
|
||||
0.02: (2023-02-23) fixing minor issues with settings
|
||||
0.01: (2024-02-23) initial alpha upload
|
||||
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
|
||||
|
||||
* **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.
|
||||
* **Start**
|
||||
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.
|
||||
`Button` switches to idle mode.
|
||||
* **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".
|
||||
* **Stoped**
|
||||
The race counter stops.
|
||||
`Button` switches to idle mode.
|
||||
|
||||
## 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 is done by the Bangle.js 2 app "Languages"
|
||||
* Go to: https://banglejs.com/apps/
|
||||
* Search for app: Languages
|
||||
* Go to [banglejs.com/apps](https://banglejs.com/apps/)
|
||||
* Search for app "Languages"
|
||||
* Click the "arrow up" or "burger" icon
|
||||
* Choose your language from the dropdown
|
||||
* Click `upload`
|
||||
|
||||
**Some nautical abbreviations which are not part of the banglejs2 Languages packages are stored in `translations.json`.**
|
||||
|
||||
## 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
|
||||
|
||||
© 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",
|
||||
"name": "Regatta Timer",
|
||||
"shortName": "RegattaTimer",
|
||||
"version": "0.2",
|
||||
"version": "0.3",
|
||||
"description": "Regatta Timer with 5-4-1 Countdown",
|
||||
"icon": "icon.png",
|
||||
"screenshots": [{"url":"screenshot.png"}],
|
||||
"tags": "tool,outdoors,sailing,race,regatta,boat,timer",
|
||||
"supports": ["BANGLEJS2"],
|
||||
"readme": "README.md",
|
||||
"storage": [
|
||||
{"name":"regattatimer.app.js","url":"app.js"},
|
||||
{"name":"regattatimer.settings.js","url":"settings.js"},
|
||||
{"name":"regattatimer.img","url":"app-icon.js","evaluate":true}
|
||||
{"name": "regattatimer.app.js", "url": "app.js"},
|
||||
{"name": "regattatimer.settings.js", "url": "settings.js"},
|
||||
{"name": "regattatimer.img", "url": "app-icon.js", "evaluate": true},
|
||||
],
|
||||
"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,
|
||||
"dial": "numeric",
|
||||
"buzzer": true,
|
||||
"dial": "Numeric",
|
||||
"gps": false,
|
||||
"compass": false,
|
||||
"record": false,
|
||||
"theme": "Dark",
|
||||
"fgColor": "#FFFF00",
|
||||
"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) {
|
||||
var file = "regattatimer.json";
|
||||
// Load settings
|
||||
var settings = Object.assign({
|
||||
"debug": false,
|
||||
"dial": "numeric",
|
||||
"gps": false,
|
||||
"compass": false,
|
||||
"fgColor": "#FFFF00",
|
||||
"bgColor": "#000000"
|
||||
}, require('Storage').readJSON(file, true) || {});
|
||||
var
|
||||
file = "regattatimer.json",
|
||||
|
||||
function writeSettings() {
|
||||
require('Storage').writeJSON(file, settings);
|
||||
storage = require("Storage"),
|
||||
|
||||
dials = ["Numeric", "Discs"],
|
||||
|
||||
themes = ["Light", "Dark"],
|
||||
|
||||
settings = Object.assign({
|
||||
"debug": false,
|
||||
"buzzer": true,
|
||||
"dial": "Numeric",
|
||||
"gps": false,
|
||||
"record": false,
|
||||
"theme": "Dark",
|
||||
"fgColor": "#FFFF00",
|
||||
"bgColor": "#000000"
|
||||
}, storage.readJSON(file, true) || {});
|
||||
|
||||
function save(key, value) {
|
||||
settings[key] = value;
|
||||
storage.writeJSON(file, settings);
|
||||
}
|
||||
|
||||
// Show the menu
|
||||
E.showMenu({
|
||||
"" : { "title" : "Regatta Timer" },
|
||||
"< Back" : () => back(),
|
||||
'GPS': {
|
||||
"GPS": {
|
||||
value: !!settings.gps, // !! converts undefined to false
|
||||
onchange: v => {
|
||||
settings.gps = v;
|
||||
writeSettings();
|
||||
save("gps", v);
|
||||
}
|
||||
},
|
||||
'COMPASS': {
|
||||
value: !!settings.compass, // 0| converts undefined to 0
|
||||
onchange: v => {
|
||||
settings.compass = v;
|
||||
writeSettings();
|
||||
}
|
||||
},
|
||||
"DIAL": {
|
||||
value: settings.dial,
|
||||
"THEME": {
|
||||
value: themes.indexOf(settings.theme),
|
||||
min: 0,
|
||||
max: 1,
|
||||
format: v => ["Numeric", "Disc"][v],
|
||||
onchange: v => {
|
||||
settings.dial = v;
|
||||
writeSettings();
|
||||
max: themes.length - 1,
|
||||
step: 1,
|
||||
wrap: true,
|
||||
format: v => themes[v],
|
||||
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
|
||||
onchange: v => {
|
||||
settings.debug = v;
|
||||
writeSettings();
|
||||
save("debug", v);
|
||||
}
|
||||
},
|
||||
});
|
||||
|
|