BangleApps/apps/imageclock
Rob Pilling 76b7a1194a Add data:[...] entries to apps using storage 2023-06-20 22:07:17 +01:00
..
ChangeLog imageclock - Bump version 2022-11-21 20:47:58 +01:00
README.md Update README 2022-06-02 16:20:29 +02:00
app-icon.js customclock - Initial work on easily customizable clock 2022-06-02 16:20:28 +02:00
app.js Fixing warnings 2022-12-09 09:52:34 +00:00
app.png customclock - Initial work on easily customizable clock 2022-06-02 16:20:28 +02:00
custom.html imageclock - Combine drawing code into app file on upload 2022-11-21 20:47:57 +01:00
demomode.js Temporarily load widgets and overwrite their draw methods to hide them 2022-06-02 16:20:28 +02:00
digitalretro.zip Update demo watchfaces 2022-06-02 16:20:29 +02:00
metadata.json Add data:[...] entries to apps using storage 2023-06-20 22:07:17 +01:00
settings.js Use default Bangle formatter for booleans 2022-06-18 22:08:51 +02:00
simpleanalog.zip Update demo watchface 2022-06-02 16:20:29 +02:00

README.md

Imageclock

This app is a highly customizable watchface. To use it, you need to select a watchface from another source. There is a native format as described here. You can also load decompiled watchfaces for Amazfit BIP fitness trackers.

Usage

Install a watchface

Choose the folder which contains the watchface, then clock "Upload to watch".

Usage on the watch

Slide up/down to hide/show widgets. Press button to start launcher.

Design watch faces

Folder structure

  • watchfacename
    • resources/
    • face.json
    • info.json

resources

This folder contains image files. It can have subfolders. These files will be read and converted into a resource bundle used by the clock

Folder types:

  • Number
    • Contains files named 0.ext to 9.ext and minus.ext
  • CodedImage
    • Contains files named with only digits for codes, i.e. 721.ext
    • Contains a file named fallback.ext in case no code matches
    • Codes are evaluated as follows: 721 -> if not found check 720 -> if not found check 700 -> if found use
  • MultiState
    • Notifications: sound.ext, silent.ext, vibrate.ext
    • other status icons: on.ext, off.ext
  • Scale
    • Contains the components of the scale, named 0.ext to y.ext, y beeing the last element of the scale

face.json

This file contains the description of the watch face elements.

Object types:

Properties
Properties: {
  "Redraw": {
    "Unlocked": 5000,
    "Locked": 60000,
    "Default": "Always",
    "Events": ["HRM"],
    "Clear": true
  },
  "Events": ["lock","HRM"]
}

Possible values for Default are Always, Change.

Images
"Image": {
  "X": 0,
  "Y": 0,
  "Scale": 1,
  "RotationValue": "Seconds",
  "MinRotationValue": 0,
  "MaxRotationValue": 60,
  "ImagePath": [ "path", "in", "resources", "file" ]
}

RotationValue references one of the implemented numerical values. Mandatory:

  • ImagePath
"Image": {
  "X": 0,
  "Y": 0,
  "Value": "BatteryPercentage",
  "Steps": 7,
  "ImagePath": [ "path", "in", "resources", "file" ]
}

If Value and Stepsare given, the value is scaled and Steps number of images starting at 0 are used to display the value.

Coded Images
"CodedImage": {
  "X": 0,
  "Y": 0,
  "Value": "WeatherCode",
  "ImagePath": [ "path", "in", "resources", "file" ]
}

The Value field is one of the implemented numerical values.

Number

Can be aligned to bottom left, top left, bottom right, top right and center. Will currently force all numbers to be integer.

"Number": {
  "X": 123,
  "Y": 123,
  "Alignment": "BottomRight",
  "Value": "Temperature",
  "Spacing": 1,
  "ImagePath": [ "path", "to", "numbers", "folder" ]
}

The Value field is one of the implemented numerical values. Alignment is either BottomRight or TopLeft

Mandatory:

  • ImagePath
  • Value
Scale
"Scale": {
  "X": 123,
  "Y": 123,
  "Value": "Temperature",
  "MinValue": "-20",
  "MaxValue": "50",
  "ImagePath": [ "path", "to", "scale", "folder" ],
  "Segments": [
    { "X": 5, "Y": 5},
    { "X": 10, "Y": 10 }
  ]
}

The Value field is one of the implemented numerical values. MaxValue and MinValue set the start and endpoints of the scale.

Mandatory:

  • ImagePath
  • Value
MultiState
"MultiState": {
  "X": 0,
  "Y": 0,
  "Value": "Lock",
  "ImagePath": ["icons", "status", "lock"]
}

The Value field is one of the implemented multi state values.

Mandatory:

  • ImagePath
  • Value
Poly
"Poly":{
  "Filled": true,
  "RotationValue": "Second",
  "MinRotationValue": "0",
  "MaxRotationValue": "60",
  "ForegroundColor": "#00f",
  "BackgroundColor": "#008",
  "Vertices":[
    {"X":-1, "Y":13},
    {"X":0, "Y":15},
    {"X":1, "Y":13},
    {"X":2, "Y":0},
    {"X":1, "Y":-75},
    {"X":0, "Y":-80},
    {"X":-1, "Y":-75},
    {"X":-2, "Y":0}
  ]
}

The RotationValue field is one of the implemented numeric values.

Rect
"Rect":{
  "X": 10,
  "Y": 20,
  "Width": 30,
  "Height": 40,
  "Filled": true,
  "ForegroundColor": "#00f",
  "BackgroundColor": "#008"
}

The RotationValue field is one of the implemented numeric values.

Nesting
"Container": {
  "X": 10,
  "Y": 10,
  "OtherContainer": {
    "X": 5,
    "Y": 5,
    "SomeElement": {
      "X": 2,
      "Y": 2,
      <Content>
    }
  }
}

SomeElement will be drawn at X- and Y-position 2+5+10=17, because positions are relative to parent element. Container names can be everything but other object names.

Implemented data sources

Numerical
  • Hour
  • Hour12Analog
  • Hour12
  • HourTens
  • HourOnes
  • Minute
  • MinuteAnalog
  • MinuteTens
  • MinuteOnes
  • Second
  • SecondAnalog
  • SecondTens
  • SecondOnes
  • WeekDay
  • WeekDayMondayFirst
  • Day
  • DayTens
  • DayOnes
  • Month
  • MonthTens
  • MonthOnes
  • Pulse
  • Steps
  • Temperature
  • Pressure
  • Altitude
  • BatteryPercentage
  • BatteryVoltage
  • StepsGoal
  • WeatherCode
  • WeatherTemperature
Multistate
  • on/off
    • Lock
    • Charge
    • Alarm
    • Bluetooth
    • BluetoothPeripheral
    • HRM
    • Barometer
    • Compass
    • GPS
    • StepsGoal
    • WeatherTemperatureNegative
  • on/off/vibrate
    • Notifications
  • celsius/fahrenheit/unknown
    • WeatherTemperatureUnit

info.json

This file contains information for the conversion process, it will not be stored on the watch

TODO

  • Handle events and redraws better
  • Performance improvements
    • Mark elements with how often they need to be redrawn
  • Finalize the file format
  • Localization

Creator

halemmerich