fontkorean and jclock (#3357)
* Create app.js * Create app-icon.js * Create README.md * Add files via upload * Create metadata.json * Update README.md * Update metadata.json * Create ChangeLog * Rename ChangeLog to ChangeLog * Rename README.md to README.md * Rename app-icon.js to app-icon.js * Rename app.js to app.js * Rename app.png to app.png * Rename metadata.json to metadata.json * Update README.md * Update app.js * Update app.js * Update app.js * Update app.js * Update app.js * Update app.js * Update app.js * Update app.js * Update app.js * Update app.js * Update app.js * Update app.js * Update app.js * Update app.js * Update app.js * Create font_Korean * Delete apps/font_Korean * Update app-icon.js * Add files via upload * Update README.md * Update app.js * Add files via upload * Update app.js * Delete apps/jclock/jclock_screenshot_BT.png * Delete apps/jclock/jclock_screenshot_no_BT.png * Update README.md * Update app.js * Add files via upload * Update README.md * Update metadata.json * Update metadata.json * Update metadata.json * Create app.js * Create metadata.json * Update metadata.json * Add files via upload * Delete apps/font_Korean/app.js * Create boot.js * Add files via upload * Create lib.js * Create Changelog * Create README.md * Delete apps/font_Korean/Changelog * Create ChangeLog * Update metadata.json * Update README.md * Update metadata.json * Update app.js * Delete apps/jclock/jclock_screenshot_BT.png * Delete apps/jclock/jclock_screenshot_no_BT.png * Add files via upload * Update ChangeLog * Update metadata.json * Update app.js * Update ChangeLog * Delete apps/jclock/jclock_screenshot_BT.png * Delete apps/jclock/jclock_screenshot_no_BT.png * Add files via upload * Delete apps/jclock/jclock_screenshot_BT.png * Delete apps/jclock/jclock_screenshot_no_BT.png * Add files via upload * Update and rename README.md to README.md * Update and rename metadata.json to metadata.json * Update and rename boot.js to boot.js * Update and rename ChangeLog to ChangeLog * Update metadata.json * Rename font_Korean_icon.png to fontKorean_icon.png * Rename lib.js to lib.js * Rename font_Korean.pbf to fontKorean.pbf * Delete apps/fontKorean directory * Create boot.js * Add files via upload * Create ChangeLog * Create ChangeLog * Update metadata.json * Delete apps/font_Korean directory * Update metadata.json * Rename ChangeLog to ChangeLog * Add files via upload * Delete apps/fontKorean directory * Add files via upload * Update metadata.json * Delete apps/fontkorean/fontkorean.pbf * Update app.js * Update README.mdmaster
parent
4efad187fc
commit
f02c3a53a8
|
|
@ -0,0 +1 @@
|
||||||
|
0.01: First release
|
||||||
|
|
@ -0,0 +1,17 @@
|
||||||
|
# Fonts (Korean)
|
||||||
|
|
||||||
|
This library provides an Korean font that can be used to display messages.
|
||||||
|
|
||||||
|
The font is the 16px high [GNU Unifont](https://unifoundry.com/unifont/index.html).
|
||||||
|
Korean characters from Unicode codepoint 32-255, 0x1100-0x11FF, 0x3130-0x318F, 0xA960-0xA97F
|
||||||
|
|
||||||
|
## Usage
|
||||||
|
|
||||||
|
See [the BangleApps README file](https://github.com/espruino/BangleApps/blob/master/README.md#api-reference)
|
||||||
|
for more information on fonts.
|
||||||
|
|
||||||
|
|
||||||
|
## Recreating fontkorean.pbf
|
||||||
|
|
||||||
|
* Go to `bin` directory
|
||||||
|
* Run `./font_creator.js "Korean" ../apps/fontkorean/font.pbf`
|
||||||
|
|
@ -0,0 +1 @@
|
||||||
|
Graphics.prototype.setFontIntl = function() { return this.setFontPBF(require("Storage").read("fontkorean.pbf")); };
|
||||||
Binary file not shown.
Binary file not shown.
|
After Width: | Height: | Size: 494 B |
|
|
@ -0,0 +1,3 @@
|
||||||
|
exports.getFont = (options) => {
|
||||||
|
return "Intl"; // placeholder for now - see https://github.com/espruino/BangleApps/issues/3109
|
||||||
|
};
|
||||||
|
|
@ -0,0 +1,16 @@
|
||||||
|
{ "id": "fontkorean",
|
||||||
|
"name": "Korean font",
|
||||||
|
"version":"0.01",
|
||||||
|
"description": "Installs a font data, Unifont characters for Korean **Requires 420 KB storage**",
|
||||||
|
"icon": "fontkorean_icon.png",
|
||||||
|
"tags": "font",
|
||||||
|
"type": "module",
|
||||||
|
"provides_modules" : ["font"],
|
||||||
|
"supports" : ["BANGLEJS2"],
|
||||||
|
"readme": "README.md",
|
||||||
|
"storage": [
|
||||||
|
{"name":"font","url":"lib.js"},
|
||||||
|
{"name":"fontkorean.boot.js","url":"boot.js"},
|
||||||
|
{"name":"fontkorean.pbf","url":"font.pbf"}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,2 @@
|
||||||
|
0.01: Created
|
||||||
|
0.02: Changed side bar color to blue for better clarity when it's locked
|
||||||
|
|
@ -0,0 +1,26 @@
|
||||||
|
# jclock
|
||||||
|
|
||||||
|
I have used Rebble clock since I bought my Banglejs 2, and wanted to make my own clock with much simpler features and to switch the time window and the feature window because I'm wearing my watch on my left wrist and about a half (left side) of the screen is covered by the sleeve of my jacket or shirts. Of course it won't happen during summer, but I decided to make my first Bagle app with these changes. See Features below for the items displayed on the screen.
|
||||||
|
- The layout is inspired by the Rebble clock.
|
||||||
|
- The big font KdamThmor is copied from the Rebble clock.
|
||||||
|
|
||||||
|
## Features
|
||||||
|
- Single screen
|
||||||
|
- No settings
|
||||||
|
- Time on the right side with big font
|
||||||
|
- On the sidebar on the left
|
||||||
|
- Day of week
|
||||||
|
- Day
|
||||||
|
- Month
|
||||||
|
- Steps
|
||||||
|
- Bluetooth connection status
|
||||||
|
- Battery %
|
||||||
|
- Update time and status every 1 minute
|
||||||
|
|
||||||
|
## Screenshots
|
||||||
|

|
||||||
|

|
||||||
|
|
||||||
|
## Creator
|
||||||
|
|
||||||
|
Written by [JeonLab](https://jeonlab.wordpress.com)
|
||||||
|
|
@ -0,0 +1 @@
|
||||||
|
require("heatshrink").decompress(atob("mEw4f/AAIHB7ue4cYrPO0cQtUy2WUHU0kyVJARAQEhIRLkgQCgQOKAQWACIYbHIImQAYMSpQRLgmSCIVSCJcACIWSKJARPzO9gETm+4BwNACI8Etu28GN23fIgIRIg14hnw/UI7wRGltvCIMjuEO7BCBCI97twRCsEICIMO7gRKnYRCju2/A1Hr4RHEY5ZDGokJzeACJRZB+EAgPbCIxrDgd4g347kBEY8rLIUHUIPA9qhICIcA/LFBj830ARLAAwR/CMkd3wOBozXHCIcE5oRCswRLg/RCIMD3gRLcoIRBgOwCJ8Z+ARIfYQRDx8ACI97CI1uCI9K7YRFglt23b4ARGuQROpPXAQI1EAAJHHkgCCg4gB+ARVyQRIdI+SdgVSCKFKCJcEyADBgVJlIRJhMkCIUAEQgCIwAXECJUgHYoRJPQIAlA="))
|
||||||
|
|
@ -0,0 +1,68 @@
|
||||||
|
// single screen, clock on the right, sidebar without image (date/steps/bluetooth connection status/batt%)
|
||||||
|
|
||||||
|
// Large font KdamThmor taken from Rebble clock
|
||||||
|
Graphics.prototype.setFontKdamThmor = function(scale) {
|
||||||
|
// Actual height 70 (69 - 0)
|
||||||
|
this.setFontCustom(
|
||||||
|
E.toString(require('heatshrink').decompress(atob('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'))),
|
||||||
|
46,
|
||||||
|
atob("GBo2NjY2NjY2NjY2Gg=="),
|
||||||
|
94+(scale<<8)+(1<<16)
|
||||||
|
);
|
||||||
|
return this;
|
||||||
|
};
|
||||||
|
|
||||||
|
var drawTimeout;
|
||||||
|
|
||||||
|
// schedule a draw for the next minute
|
||||||
|
function queueDraw() {
|
||||||
|
if (drawTimeout) clearTimeout(drawTimeout);
|
||||||
|
drawTimeout = setTimeout(function() {
|
||||||
|
drawTimeout = undefined;
|
||||||
|
draw();
|
||||||
|
}, 60000 - (Date.now() % 60000));
|
||||||
|
}
|
||||||
|
|
||||||
|
const zeroPad = (num, places) => String(num).padStart(places, '0');
|
||||||
|
|
||||||
|
function draw() {
|
||||||
|
let barWidth = 64;
|
||||||
|
let date = new Date();
|
||||||
|
|
||||||
|
// queue next draw in one minute
|
||||||
|
queueDraw();
|
||||||
|
|
||||||
|
// clean screen
|
||||||
|
g.reset().clearRect(Bangle.appRect);
|
||||||
|
|
||||||
|
// draw side bar in blue
|
||||||
|
g.setColor('#00f');
|
||||||
|
g.fillRect(0, 0, barWidth, g.getHeight());
|
||||||
|
|
||||||
|
// show time on the right
|
||||||
|
g.setColor(g.theme.fg);
|
||||||
|
g.setFontKdamThmor().setFontAlign(0,-1).drawString(zeroPad(date.getHours(),2), 120, 10);
|
||||||
|
g.setFontKdamThmor().setFontAlign(0,-1).drawString(zeroPad(date.getMinutes(),2), 120, g.getHeight()/2+10);
|
||||||
|
|
||||||
|
// show date
|
||||||
|
g.setFont('Vector', 20).setFontAlign(0, -1).setColor('#fff');
|
||||||
|
g.drawString(require("date_utils").dow(date.getDay(),1).toUpperCase(), barWidth/2, 3);
|
||||||
|
g.drawString(date.getDate(), barWidth/2, 28);
|
||||||
|
g.drawString(require("date_utils").month(date.getMonth()+1,1).toUpperCase(), barWidth/2, 53);
|
||||||
|
|
||||||
|
// divider, place holder for any other info
|
||||||
|
g.drawString('=====', barWidth/2, 78);
|
||||||
|
|
||||||
|
// show daily steps
|
||||||
|
g.drawString(Bangle.getHealthStatus("day").steps, barWidth/2, 103);
|
||||||
|
|
||||||
|
// show battery remaining percentage
|
||||||
|
g.drawString(E.getBattery() + '%', barWidth/2, 153);
|
||||||
|
|
||||||
|
// Bluetooth connection status
|
||||||
|
if (NRF.getSecurityStatus().connected) g.drawString('>BT<', barWidth/2, 128);
|
||||||
|
}
|
||||||
|
|
||||||
|
draw();
|
||||||
|
|
||||||
|
Bangle.setUI("clock");
|
||||||
Binary file not shown.
|
After Width: | Height: | Size: 824 B |
Binary file not shown.
|
After Width: | Height: | Size: 3.6 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 2.2 KiB |
|
|
@ -0,0 +1,16 @@
|
||||||
|
{ "id":"jclock",
|
||||||
|
"name":"jclock",
|
||||||
|
"shortName":"jclock",
|
||||||
|
"icon":"app.png",
|
||||||
|
"version":"0.02",
|
||||||
|
"description":"Similar layout to Rebble clock, but much simpler features with switched time and the feature window. The time is on the right side. This is my first Bangle app.",
|
||||||
|
"type": "clock",
|
||||||
|
"tags": "clock",
|
||||||
|
"supports" : ["BANGLEJS2"],
|
||||||
|
"screenshots": [{"url":"jclock_screenshot_no_BT.png"},{"url":"jclock_screenshot_BT.png"}],
|
||||||
|
"storage": [
|
||||||
|
{"name":"jclock.app.js","url":"app.js"},
|
||||||
|
{"name":"jclock.img","url":"app-icon.js","evaluate":true}
|
||||||
|
],
|
||||||
|
"readme":"README.md"
|
||||||
|
}
|
||||||
Loading…
Reference in New Issue