01-14-2018 10:06
- Mark as New
- Bookmark
- Subscribe
- Permalink
- Report this post

01-14-2018 10:06
- Mark as New
- Bookmark
- Subscribe
- Permalink
- Report this post
- Who Voted for this post?
No examples are provided and I am doing some error tracing. Is this line written correctly? myImage.href is assigned a .jpg file.
jpeg.decodeSync(myImage.href, "/resources/default.txi", delete=true);
Thanks
Answered! Go to the Best Answer.
Accepted Solutions
01-20-2018 12:07
- Mark as New
- Bookmark
- Subscribe
- Permalink
- Report this post


01-20-2018 12:07
- Mark as New
- Bookmark
- Subscribe
- Permalink
- Report this post
- Who Voted for this post?
Yes. Here's snippets from something of mine:
function saveState() { let state = {"progressReadingFormat": progressReadingFormat, "heartReadingFormat": heartReadingFormat}; filesystem.writeFileSync("state.txt", state, "json"); } function loadState() { let state; try { state = filesystem.readFileSync("state.txt", "json"); } catch(err) { return; } if (state.progressReadingFormat !== null) progressReadingFormat = state.progressReadingFormat; if (state.heartReadingFormat !== null) heartReadingFormat = state.heartReadingFormat; if (progressReadingFormat === readingFormatEnum.TRACK) { energyGauge.setTrackMode(true); distGauge.setTrackMode(true); activeGauge.setTrackMode(true); } }
Obviously you want to call loadState() when your app starts (but after you've initialised relevant state variables to default initial values).
You probably want to call saveState() whenever any state variable changes. In theory, this could be deferred until your app is closed, but that slows down the app transition process which can make users complain.
In retrospect, I should probably just have kept all the state variables in the state object throughout the app, rather than creating and unpacking the state object as above.
And on terminology: I used the term 'state' to differentiate between 'settings' because the latter has a specific meaning. Some of your state variables may indeed correspond to companion-based settings, but others may only exist on the watch.
This would be a good candidate for a design pattern. I should tart it up and github it.
Gondwana Software
01-16-2018 00:10
- Mark as New
- Bookmark
- Subscribe
- Permalink
- Report this post

01-16-2018 00:10
- Mark as New
- Bookmark
- Subscribe
- Permalink
- Report this post
Also tried that with no luck as well. It also sucks that you can't dynamically load PNGs. JPEGs don't support alpha channels I was hoping converting it to TXI can do something about it.

01-16-2018 00:37
- Mark as New
- Bookmark
- Subscribe
- Permalink
- Report this post


01-16-2018 00:37
- Mark as New
- Bookmark
- Subscribe
- Permalink
- Report this post
You can do some simple transparency stuff like this:
https://dev.fitbit.com/build/guides/user-interface/svg/#mask
If your needs aren't too fancy, that may suffice.
Gondwana Software

01-16-2018 06:27
- Mark as New
- Bookmark
- Subscribe
- Permalink
- Report this post

01-16-2018 06:27
- Mark as New
- Bookmark
- Subscribe
- Permalink
- Report this post
Catplace,
Thank you for the suggestion, but I don't think that will do what I am trying.
The background image of my clockface can be selected by the user. The system re-loads the image on each start-up if the Ionic is talking to the phone. The problem comes with the sync dependability or availability of the phone. As a stand alone watch (no comms with the phone...like in airplane mode), I have a pre-defined image which loads up. I was trying to come up with a way to store this image without converting from messaging to file transfer for data transfer.

01-16-2018 12:21
- Mark as New
- Bookmark
- Subscribe
- Permalink
- Report this post


01-16-2018 12:21
- Mark as New
- Bookmark
- Subscribe
- Permalink
- Report this post
If your predefined image is baked into your watch app, it shouldn't need storing separately. Even uploaded images (eg, done with file transfer) remain on the watch unless explicitly deleted or the app is uninstalled.
Perhaps you just need to save some state info on the watch so it knows what filename to look for (assuming that's variable), when comms are not available.
Gondwana Software

01-18-2018 16:35
- Mark as New
- Bookmark
- Subscribe
- Permalink
- Report this post

01-18-2018 16:35
- Mark as New
- Bookmark
- Subscribe
- Permalink
- Report this post
That the last selected image would be retained on the watch was also my assumption. I do store the available images on the watch (under the resources folder). What I have found is that if the watch does not have a connection with the phone (like in airplane mode), the watch fails to load the last selected background image. Currently, I give it a default image that it 'fails' to. What I was wanting to do was to use this function to convert the jpeg into "default.txi".

01-18-2018 16:43
- Mark as New
- Bookmark
- Subscribe
- Permalink
- Report this post


01-18-2018 16:43
- Mark as New
- Bookmark
- Subscribe
- Permalink
- Report this post
Are you sure the issue is that the file is missing, and not that the chosen filename (presumably stored as a JS variable) is missing? Whenever an app restarts (eg, after any other app has been run), all its local variables will be undefined; in this regard, it's as though the app were being run for the first time. If you want any variable (eg, usersSelectedFilename) to pick up the value it had previously, you have to explicitly write code to do so.
Files are retained across restarts; variables are not.
Gondwana Software

01-18-2018 17:59
- Mark as New
- Bookmark
- Subscribe
- Permalink
- Report this post

01-18-2018 17:59
- Mark as New
- Bookmark
- Subscribe
- Permalink
- Report this post
It is the variable defined in the settings that is losing its' value with the re-start. That is why I am trying to create the .txi file from the returned variable (which contains the file name).

01-18-2018 20:29
- Mark as New
- Bookmark
- Subscribe
- Permalink
- Report this post


01-18-2018 20:29
- Mark as New
- Bookmark
- Subscribe
- Permalink
- Report this post
Then I think there are easier ways to do what you want. Perhaps easiest would be to rename the user-selected .jpg to something like chosen.jpg, then always display the file with that name.
But I still feel that the most elegant solution is to save any necessary state variables (eg, the chosen filename) in local storage whenever they change, and restore them from local storage (if found) whenever your app starts. This would avoid renaming files, which could get messy if the user changes their preference.
Gondwana Software

01-20-2018 06:06
- Mark as New
- Bookmark
- Subscribe
- Permalink
- Report this post

01-20-2018 06:06
- Mark as New
- Bookmark
- Subscribe
- Permalink
- Report this post
Okay...So then how do you save a variable to local storage? Are you talking about using the writeFileSync or a different function?

01-20-2018 12:07
- Mark as New
- Bookmark
- Subscribe
- Permalink
- Report this post


01-20-2018 12:07
- Mark as New
- Bookmark
- Subscribe
- Permalink
- Report this post
- Who Voted for this post?
Yes. Here's snippets from something of mine:
function saveState() { let state = {"progressReadingFormat": progressReadingFormat, "heartReadingFormat": heartReadingFormat}; filesystem.writeFileSync("state.txt", state, "json"); } function loadState() { let state; try { state = filesystem.readFileSync("state.txt", "json"); } catch(err) { return; } if (state.progressReadingFormat !== null) progressReadingFormat = state.progressReadingFormat; if (state.heartReadingFormat !== null) heartReadingFormat = state.heartReadingFormat; if (progressReadingFormat === readingFormatEnum.TRACK) { energyGauge.setTrackMode(true); distGauge.setTrackMode(true); activeGauge.setTrackMode(true); } }
Obviously you want to call loadState() when your app starts (but after you've initialised relevant state variables to default initial values).
You probably want to call saveState() whenever any state variable changes. In theory, this could be deferred until your app is closed, but that slows down the app transition process which can make users complain.
In retrospect, I should probably just have kept all the state variables in the state object throughout the app, rather than creating and unpacking the state object as above.
And on terminology: I used the term 'state' to differentiate between 'settings' because the latter has a specific meaning. Some of your state variables may indeed correspond to companion-based settings, but others may only exist on the watch.
This would be a good candidate for a design pattern. I should tart it up and github it.
Gondwana Software
01-21-2018 10:44
- Mark as New
- Bookmark
- Subscribe
- Permalink
- Report this post

01-21-2018 10:44
- Mark as New
- Bookmark
- Subscribe
- Permalink
- Report this post
Thank you. I was able to use the FS API, using your sample, to get my clockface to work how I wanted it to. Amaizingly enough, this also fixed my other problem located here https://community.fitbit.com/t5/SDK-Development/Extra-info-received-on-first-run-of-clockface-settin...
where I was getting extra junk back from the settings process.
Of course...I still do not have a good example of how to use the JPEG API.

01-21-2018 11:46
- Mark as New
- Bookmark
- Subscribe
- Permalink
- Report this post


01-21-2018 11:46
- Mark as New
- Bookmark
- Subscribe
- Permalink
- Report this post
Well done.
Given the paucity of info on TXI, I can't help but wonder whether that format is really intended just for internal use. I have a suspicion that the watch creates TXI files automatically. That decodeSync() API call should perhaps not be public.
Gondwana Software

