Added Utils.readStorageJSON and relaxed JSON parser, and swap all interface.html over

to using it.

This allows Bangle.js 2v20 (or cutting edge) and later to store a relaxed
'JSON' on internal storage which (while still normal JS) is smaller and faster
(and preserves unicode better)

See https://github.com/espruino/Espruino/issues/2429
pull/3110/head
Gordon Williams 2023-11-23 12:52:48 +00:00
parent 0e4fa182eb
commit fcebbf3ef4
14 changed files with 54 additions and 71 deletions

View File

@ -178,9 +178,8 @@ function getData() {
})()\n`, contents => {
const fileNames = JSON.parse(contents);
if (fileNames.length > 0) {
Util.readStorage('calendar.days.json',data=>{
holidays = JSON.parse(data || "[]") || [];
Util.readStorageJSON('calendar.days.json',data=>{
holidays = data || [];
Util.hideModal();
render();
});

View File

@ -83,11 +83,8 @@
function onInit() {
Util.showModal("Loading...");
Util.readStorage("espruinoterm.json", function(j) {
Util.readStorageJSON("espruinoterm.json", function(options) {
Util.hideModal();
try {
options = JSON.parse(j);
} catch (e) {}
if (!Array.isArray(options)) setDefaults();
refresh();
});

View File

@ -76,11 +76,11 @@
function getData() {
// show loading window
Util.showModal("Loading...");
Util.readStorage('grocery_list.json', data=>{
Util.readStorageJSON('grocery_list.json', data=>{
// remove window
Util.hideModal();
settings = JSON.parse(data || '{"products": []}');
settings = data || {"products": []};
products = settings.products;
renderProducts();
});

View File

@ -211,9 +211,9 @@
this.editSong = song;
},
loadSongs: function () {
Util.readStorage('guitar_songs.json', (contents) => {
Util.readStorageJSON('guitar_songs.json', (contents) => {
this.songsState = 'loaded';
this.localSongs = JSON.parse(contents) || [];
this.localSongs = contents || [];
this.watchSongs = JSON.parse(JSON.stringify(this.localSongs));
});
window.setTimeout(() => {

View File

@ -98,11 +98,10 @@
function onInit() {
// read existing location
Util.readStorage("mylocation.json", function(data) {
Util.readStorageJSON("mylocation.json", function(data) {
if (data===undefined) return; // no file
try {
var j = JSON.parse(data);
setPosition(j);
setPosition(data);
} catch (e) {
console.error(e);
}

View File

@ -26,8 +26,8 @@ function disableFormInput() {
function getData() {
// show loading window
Util.showModal("Loading...");
Util.readStorage(`noteify.json`,data=>{
notes = JSON.parse(data || "[]");
Util.readStorageJSON(`noteify.json`,data=>{
notes = data || [];
// remove window
Util.hideModal();

View File

@ -150,15 +150,9 @@ TODO:
files.trim().split(",").forEach(filename => {
if (filename=="") return;
promise = promise.then(() => new Promise(resolve => {
Util.readStorage(filename, fileContents => {
console.log(filename + " => " + fileContents);
Util.readStorageJSON(filename, mapInfo => {
console.log(filename + " => " + mapInfo);
let mapNumber = filename.match(/\d+/)[0]; // figure out what map number we are
let mapInfo;
try {
mapInfo = JSON.parse(fileContents);
} catch (e) {
console.error(e);
}
loadedMaps[mapNumber] = mapInfo;
if (mapInfo!==undefined) {
let latlon = L.latLng(mapInfo.lat, mapInfo.lon);

View File

@ -2,35 +2,34 @@
<head>
<link rel="stylesheet" href="../../css/spectre.min.css">
</head>
<body>
<body>
<h3>Set OpenWeatherMap (OWM) API key</h3>
<p><input id="apikey" onkeyup="checkInput()" style="width:90%; margin: 3px"></input><button id="upload" class="btn btn-primary">Save key</button></p>
<h4>Where to get your personal API key?</h4>
<p>Go to <a href="https://home.openweathermap.org/users/sign_up">https://home.openweathermap.org/users/sign_up</a> and sign up for a free account.<br>
After registration you can login and optain your personal API key.</p>
<script src="../../core/lib/interface.js"></script>
<script>
function checkInput() {
if(document.getElementById("apikey").value==="") {
document.getElementById('upload').disabled = true;
} else {
if(document.getElementById("apikey").value==="") {
document.getElementById('upload').disabled = true;
} else {
document.getElementById('upload').disabled = false;
}
}
checkInput();
var settings = {};
function onInit(){
console.log("Loading settings from BangleJs...");
try {
Util.readStorage("owmweather.json", data=>{
if(data.length > 0){
settings = JSON.parse(data);
Util.readStorageJSON("owmweather.json", settings=>{
if("settings){
console.log("Got settings", settings);
document.getElementById("apikey").value = settings.apikey;
console.log("Loaded apikey from BangleJs.");
@ -41,9 +40,9 @@
console.log("(Warning) Could not load apikey from BangleJs.");
console.log(ex);
}
}
document.getElementById("upload").addEventListener("click", function() {
try {
settings.apikey = document.getElementById("apikey").value;

View File

@ -2,7 +2,7 @@
<head>
<link rel="stylesheet" href="../../css/spectre.min.css">
<style>
<style>
.table_wrapper{
display: block;
overflow-x: auto;
@ -101,11 +101,9 @@ function viewDeferredTable(filename) {
Puck.eval(`require("Storage").list("powermanager.def.json").length > 0`, (f)=>{
if (f) {
Util.showModal("Reading summarized info...");
Util.readStorage(
filename, data => {
Util.readStorageJSON(
filename, parsed => {
Util.hideModal();
let parsed = JSON.parse(data);
let sum = 0;
let rows = [];
for (var i in parsed.deferred) {
@ -128,7 +126,7 @@ function viewDeferredTable(filename) {
<button class="btn btn-primary" id="back" style="float: right;margin-right: 5px;margin-left: 10px;">Back</button>
<div>
This are functions used in timeouts and intervals and their accumulated execution times. Recorded in a time span of <b>${timeFormat(duration)}</b>. Timeouts/intervals have run for <b>${timeFormat(sum)} (${(sum/duration*100).toFixed(2)}%)</b>. Percentages are calculated from summarized timeout/interval running time.
</div>
</div>
<div class="table_wrapper">
@ -181,13 +179,12 @@ function viewHardwareTable(filename) {
Puck.eval(`require("Storage").list("powermanager.hw.json").length > 0`, (f)=>{
if (f) {
Util.showModal("Reading hardware info...");
Util.readStorage(
filename, data => {
Util.readStorageJSON(
filename, parsed => {
Util.hideModal();
let parsed = JSON.parse(data);
console.log("Hardware", parsed);
let duration = parsed.saved - parsed.start;
let rows = [];
for (var i in parsed.power) {
rows.push({func: i, time: parsed.power[i]});
@ -244,7 +241,7 @@ function viewDetailsTable(filename) {
Util.readStorageFile(
filename, data => {
Util.hideModal();
var htmlOverview = `<h1>Detailed logging</h1>
<button class="btn btn-primary" id="back" style="float: right;margin-right: 5px;">Back</button>
<div>

View File

@ -101,10 +101,8 @@ function getData() {
uploadBtn.disabled = true;
Util.showModal("Loading...");
Util.readStorage(repJson, data => {
Util.readStorageJSON(repJson, reps => {
Util.hideModal();
reps = JSON.parse(data);
for(const rep of reps){
renderRep(rep);
}

View File

@ -265,11 +265,11 @@ function addTimer() {
function getData() {
Util.showModal("Loading...");
Util.readStorage('sched.json',data=>{
alarms = JSON.parse(data || "[]") || [];
Util.readStorageJSON('sched.json',data=>{
alarms = data || [];
Util.readStorage('sched.settings.json',data=>{
schedSettings = JSON.parse(data || "{}") || {};
Util.readStorageJSON('sched.settings.json',data=>{
schedSettings = data || {};
Util.hideModal();
alarms.sort((a, b) => {
let x;

View File

@ -25,8 +25,8 @@ function getData() {
// show loading window
Util.showModal("Loading...");
// get the data
Util.readStorage('sleepphasealarm.json',data=>{
let logs = JSON.parse(data || "{}")?.logs || [];
Util.readStorageJSON('sleepphasealarm.json',data=>{
let logs = (data || {})?.logs || [];
// remove window
Util.hideModal();

View File

@ -2,35 +2,35 @@
<head>
<link rel="stylesheet" href="../../css/spectre.min.css">
</head>
<body>
<body>
<h3>Set Coinmarketcap API key</h3>
<p><input id="apikey" onkeyup="checkInput()" style="width:90%; margin: 3px"></input><button id="upload" class="btn btn-primary">Save key</button></p>
<h4>Where to get your personal API key?</h4>
<p>Go to <a href="https://coinmarketcap.com/api/">https://coinmarketcap.com/api/</a> and sign up for a free account.<br>
After registration you can login and obtain your personal API key.</p>
<script src="../../core/lib/interface.js"></script>
<script>
function checkInput() {
if(document.getElementById("apikey").value==="") {
document.getElementById('upload').disabled = true;
} else {
if(document.getElementById("apikey").value==="") {
document.getElementById('upload').disabled = true;
} else {
document.getElementById('upload').disabled = false;
}
}
checkInput();
var settings = {};
function onInit(){
console.log("Loading settings from BangleJs...");
try {
Util.readStorage("tinycmc.json", data=>{
if(data.length > 0){
settings = JSON.parse(data);
Util.readStorageJSON("tinycmc.json", data=>{
if(data){
settings = data;
console.log("Got settings", settings);
document.getElementById("apikey").value = settings.apikey;
console.log("Loaded apikey from BangleJs.");
@ -41,9 +41,9 @@
console.log("(Warning) Could not load apikey from BangleJs.");
console.log(ex);
}
}
document.getElementById("upload").addEventListener("click", function() {
try {
settings.apikey = document.getElementById("apikey").value;

2
core

@ -1 +1 @@
Subproject commit 4422e4a3e808c99e540dc86ac1e3cab0ccb23a82
Subproject commit c97b7851f50cfff4e898c2264a337a17085ce463