diff --git a/apps/cassioWatch/ChangeLog b/apps/cassioWatch/ChangeLog new file mode 100644 index 000000000..6eae6605e --- /dev/null +++ b/apps/cassioWatch/ChangeLog @@ -0,0 +1,3 @@ +1.0.0: Main App. +1.0.1: Performance Fixes. +1.0.2: Correct Screen Clear and Draw. \ No newline at end of file diff --git a/apps/cassioWatch/README.md b/apps/cassioWatch/README.md new file mode 100644 index 000000000..f4dad48f8 --- /dev/null +++ b/apps/cassioWatch/README.md @@ -0,0 +1,10 @@ +# cassioWatch + +![Screenshot](screens/main.png) + +Clock with Space Cassio Watch Style. + +It displays current temperature,day,steps,battery.heartbeat and weather. + +**To-do**: +Integrate heartbeat and Weather,Dinamic Day and Month Text by Clock Language or by an Options Page, and Align and change size of some elements. diff --git a/apps/cassioWatch/app.js b/apps/cassioWatch/app.js new file mode 100644 index 000000000..d9c3b490c --- /dev/null +++ b/apps/cassioWatch/app.js @@ -0,0 +1,183 @@ +require("Font6x12").add(Graphics); +require("Font8x12").add(Graphics); +require("Font7x11Numeric7Seg").add(Graphics); + +let ClockInterval; +let RocketInterval; +let BatteryInterval; + +function bigThenSmall(big, small, x, y) { + g.setFont("7x11Numeric7Seg", 2); + g.drawString(big, x, y); + x += g.stringWidth(big); + g.setFont("8x12"); + g.drawString(small, x, y); +} + +function ClearIntervals(inoreclock){ + if (RocketInterval) clearInterval(RocketInterval); + if (BatteryInterval) clearInterval(BatteryInterval); + RocketInterval = undefined; + BatteryInterval = undefined; + if (inoreclock) return; + if (ClockInterval) clearInterval(ClockInterval); + ClockInterval = undefined; +} + +let background = require("heatshrink").decompress( + atob( + "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" + ) +); + +let Rocket = { + 1: require("heatshrink").decompress( + atob( + "qFGwkCkQAiiEBEkUgKQhPhE8ogCE8YhCiQoEE7pKEPIgncTQ4neEwpQCPoh1eJYYwCJ7QmHKAh1hZIpOjPAUBJ0ZQCTzEhExZ1lPAZ1kKDQmOJ65O2E65OPOy5O2E64mPOyxO/J2wnPJyx2QJ35O/J2khE0p2POq52PEy4nOiQnlOrEhiSfMJrEggQnLJzB1CPBQmZkInMEzBQDPBImbPBR1ZEoRMCZYImhgQgEE0BzFKAgmaDwLDFKAbqdYQwHBOrcgDgLBFJrsiiRNGYbpLBY4Ymhd4omkkUhE0pQEEwUBJjrHBd4QmCdzoiBDwYrCPLyZHF4QnagQeCE8UgJwYniJwgnIOzwfFO0wJCJzMQE4gyFEzR2FBQombkInDQI4AakAnBTYS+ZE5BMDE0LEES7YnLE0R3FAEQA=" + ) + ), + 2: require("heatshrink").decompress( + atob( + "qFGwkCkQAikMAgIliKYon/AA0gEAQniEwIhCAgYndEIjqBE8CaGKogmgKAp1fKAgncExBQBBQR1gKAp7BJ0IndExR4CE0idaOpYnbExqeYJxxPYEx0BJ0x2XExx2XJ20QE6xONJi5OPGwJOlBwLFkLoLFlBwJOkOwJOlE4JOkTjBOOE/52Pdi5OPEy7FnE5wmXE5xOZT5gmYEoMiiB1lgR4KTLAkDPBJ1WIAYDDKA4mWJwchDwYEDTjQiDJQh4GYLAhHFosSJy6OCTIxaEEywbBKYwjEEzMgUQxQFBogAURwZOGOjTKJdTYnOEryfHE0JQEfIpQgYQMAgJLeAgrtfTI4ndgSaFE4h0bdQkSZQpOfEAgIBO0AnEdrh2FJAb1EdbInEBIpObOwhOEEzYnFXzZ2HE4QlhE4QlDFMKcDYooniO0QnDT0YnCE0ciA" + ) + ), + 3: require("heatshrink").decompress( + atob( + "qFGwkEogAjiMUEkVAKYgnhPYolgOQIniOYZ4FOcLqBE8CaGKojpgKAomhEYUQE7gmHKAIxCE0QkCPYR1gZIgnZExR4CJ0idmE7ZONYzImNgEUJ0p3YJRh2ZJJwnXOpQhBdkpaETsMEGQhOhE7jFLUYpOfTzgmKE4hOiE4hOigEUJ0rvCEywnPEqx2OTjBOOE7ImOTsqeZE5zFYoJOmT5kBJzEAih4LdK5mBAQInKOqoYDEgR4JEypHDEYbxJOq5ABdgZ7CEzZOEJQgnGihOYEIzJFTionCKYxWGEy9ADAYnGUIYmWog/EdBFAEy7KIKAwnjKwLqWE5pMeT48CVQpQfgMjKEtEiAnfEQJQCgJSCTcB6FJzkEdYcUE8FAdQghDOzonKTjh2EZAidcDoInHJzodBOwx/BE8JxcOwsAOwQmhJgSXDObwnFEwUUO0LFGE8aeiE4YmiokQE0tE" + ) + ), + 4: require("heatshrink").decompress( + atob( + "qFGwkCkQAjiMSEkRTFE/4AGkMAgQCBE8MgEIYEDE7whDdQIngTQxVEE0ChFTjxQFE7jnFKAgxCOsBQFZgJ1gE7wmKPAROkTrTEHGAwnYiBHJFAaeXOoyXBEQZPac5AsFgJOhAoh2XJwwnFKoROdE4J9GJzwnIiQmVkInPAC0QE5AJFE64mHY5DFdE4SBEYr5JDJ0hKDJ0jCZJxoACgInmKLAmOTq5OOEy5OPTsxOYE5wmXO5wlYkAnMOqshiRNCgR4LOC8CkJCCEzxHDAgYnJOqpAEDoZ4HEyodDEQpQHdCsQOwwFHEyzoCPYzJGEy0gEwaZGA4acVEQSjHKAomXkQYEYAwlZeRKYDE8gjCYa7zJEwcCkImfKAb4FAD0hdTh4LgRSBOcR0CJz0gYYrrgN4QnEYrxOEE4bEeiAnGF4J2idL6VDE8ohBE0gnFE0J0BE4QGBiROgdIQABgJ2hJoTtjYgZSEE8ScgE4omikUQTcQADA=" + ) + ), + 5: require("heatshrink").decompress( + atob( + "qFGwkCkQAikMAgIliKYonhiAnjkEATIIniEwIhCAgYndEIhQFYUZVEE0BQFOr5QEeQQmiKAL1DOr5QEE7ROCDgZVEAoInZDwchFQQoDPAJOdEQYrBdrZFDOYwncEJDsDVIpOXgJxEE4pObEAgGFgJOaE48BaIhOZJ5ZObY5ROcE441CE6xOGPAwtCJzpGCJ0hHDkI1DJzwoEJzInLFg52dUo5O/J35OzE54mWOx4mXJxx1XE54mXkUhExkSJzCfMOrAlBPBiZXgQDBAQQmgJgh4JOqoYEFYwmaDoZzEFgh1YDgkiiAFEKAroXJJAGFiQmVkCNDTIz5EJy57HKAomXkQYEJoqaYeRadEJrAnJEQUAgJPiAoYmeT4cCkAnBE0BKCJkT1EkDCeJYYiDOkLDFFL5wBE4guCPDhEBEwQiDY70CkInDiQnCJzkhOwhKDdzp2Idb4nEE0B0Bdo4niE0J0CeYhOhgESUYYnidsgnEE0KeCE0gnDE0ciA" + ) + ), + 6: require("heatshrink").decompress( + atob( + "qFGwkCkQA/ABEgKQZPhEwgABEsAoGJkBxBE8JKEAowAbJIhQEgLDiPooAdKA4ncTZAndSwhQEFoInaJQkSKAwlZdgwnfSgYADE4h1ZDwInlcggnIOzAdCE8i7EY5J3XDgYhGd4pOZEI52bSYwGCOAJ2bYIodEOzZOFFAjFcEwwAIE6xOHABBO/J34ndEyx2PJ00BJ00SJ0p1XE54mXOxxO/J5wmYgQnMOrB2BPBgkWiJ1CPBbBYAYR4KiTAXRwIrFTjgZDJYZ4IEyoiEIwrDcEJJQFOqwiBDARxFFwgmXkAYDEogsBF4QmXEQJ7GUYYkBEzDKJAgYmdEQbKFEzonEKYgngJwgmfZggmjKQghgiBRGkBzeTgUikJRgc47LDErTnDEAkQJzkCJwYnEJzonEJIaddOwhJEJzgdBE4hYEJzieJADgnEE0KUCXzoAGkJLEiB2hOgQDBT0TsDT0YmlE4YmjkQ=" + ) + ), + 7: require("heatshrink").decompress( + atob( + "qFGwkCkQAhkIpBiQlhkBSEJ8InlEIIoFE7whEE8pQFE7giBJQoneI4MCTYhQDE7YdCYYondEQYnEPwZ1bE5BQCJzonHkR2ZEAkBE4pNBE7zHFYrYhFUgonaXAQeEEwruZEYcgiROHJ7AfDAwxOeAAURiAmHE65HIOzwmOJ35OPE6xOPO35O/J35O/J1gnPEyx2PEy5OOOq5OnE5xOYO5omZgJQMJrQnLiQnagR4JOq5nCDgZ1fEYRLDE5DoZkUQNoZ4GOrJKGAoomXOw7lCAwYmYDgJSEAAUBA4QDBJzB6FOQrDXJwTJFdLjJKE9jDYZRAmkKAwmhKAgmiKAYmBkApdJIgjCKYIncOQYvJYTovGE84lagR2DE4xOakBOEgJXFOjYnEJAbtdOwggEkAmbDgInDE0B0BE4QgcE5AkiXYbpCOLonGYo4nhPMYnCUEgnBY0kiA==" + ) + ), + 8: require("heatshrink").decompress( + atob( + "qFGwkCkQA/ABBSEJ8MgE4kBEsBPFE7xMCOIJ3hOYgFEE7rCGE70gE4pQBiAndYQwjBUohOZD4ZQFE7YkBE5AICYbZ2GE7sggJRCAA8iYzZOITroALE7EhExh4CAC0QExpPXOponZExx2XJ24nWdh52XdhzF/Yu5O/J35O0E55OXOx5O/J2omXE5x1XO54mYgQnMJrR4LOrciiAmiJgR4KEzIjDPBAlYiAiEeI51YkEBE4J5CD4KceTQQcBJgRQFdTZDCJIjDcNIqhGdTQmCkByFTTInDKgoAEE7ZEEJwhPdE1R1FE0InEE0R3DEwTGcDwomEE7hKFPYqafE8ROCE5DJbE5B/IEqh2ED4gnCJrMCJwgnEiB2bE4qeFEzUggQmIBQLEaEQImHLIImaE4YfcOw4lEFMLECS7onJO8wmkE4QljAAIA==" + ) + ), +}; +let rocket_sequence = 1; + +g.clear(); + +let DayMap = ["DOM","SEG", "TER", "QUA", "QUI", "SEX", "SAB"]; +let MonthMap = [ + "JAN", + "FEV", + "MAR", + "ABR", + "MAI", + "JUN", + "JUL", + "AUG", + "SET", + "OUT", + "NOV", + "DEZ", +]; +let GetCurrentDay = (current_day) => { + if (current_day < 10) { + current_day = "0" + current_day; + } + return current_day; +}; + +function DrawClock() { + let d = new Date(); + let h = d.getHours(), + m = d.getMinutes(); + let time = h + ":" + ("0" + m).substr(-2); + g.setFont("7x11Numeric7Seg", 3); + g.drawString(time, 70, 60); + g.setFont("8x12", 2); + g.drawString(DayMap[d.getDay()], 20, 130); + g.setFont("8x12"); + g.drawString(MonthMap[d.getMonth() - 1], 80, 126); + g.setFont("8x12", 2); + g.drawString(GetCurrentDay(d.getDate()), 78, 137); +} + +function DrawBattery() { + bigThenSmall(E.getBattery(), "%", 135, 21); +} + +function DrawRocket() { + g.clearRect(5, 62,63,115); + g.setColor(0, 255, 255); + g.drawRect(5, 62,63,115); + g.fillRect(5, 62,63,115); + g.drawImage(Rocket[rocket_sequence], 5, 65, { scale: 0.7 }); + g.setColor(0, 0, 0); + rocket_sequence = rocket_sequence + 1; + if (rocket_sequence > 8) { + rocket_sequence = 1; + } +} + +function DrawScene() { + g.reset(); + g.clear(); + g.setColor(0, 255, 255); + g.fillRect(0, 0, g.getWidth(), g.getHeight()); + g.drawImage(background, 0, 0, { scale: 1 }); + g.setColor(0, 0, 0); + g.setFont("6x12"); + g.drawString("Launching Process", 30, 20); + g.setFont("8x12"); + g.drawString("ACTIVATE", 40, 35); + g.setFont("8x12", 2); + g.drawString("30", 142, 132); + g.drawString("55", 95, 98); + g.setFont("8x12", 1); + g.drawString(Bangle.getStepCount(), 143, 104); + ClockInterval = setInterval(DrawClock, 30000); + DrawClock(); + RocketInterval = setInterval(DrawRocket, 700); + DrawRocket(); + BatteryInterval = setInterval(DrawBattery, 5 * 60000); + DrawBattery(); +} + +Bangle.on("lcdPower", (on) => { + if (!on) { + g.clear(); + ClearIntervals(true); + } +}); + + +Bangle.on("lock", (locked) => { + if (locked) { + ClearIntervals(true); + } else { + ClearIntervals(); + DrawScene(); + } +}); + +g.reset(); +g.clear(); +Bangle.setUI("clock"); +Bangle.loadWidgets(); +Bangle.drawWidgets(); +DrawScene(); + +if (Bangle.isLocked()) { + ClearIntervals(true); +} diff --git a/apps/cassioWatch/app.png b/apps/cassioWatch/app.png new file mode 100644 index 000000000..3f9bbb36e Binary files /dev/null and b/apps/cassioWatch/app.png differ diff --git a/apps/cassioWatch/icon.js b/apps/cassioWatch/icon.js new file mode 100644 index 000000000..af61cd562 --- /dev/null +++ b/apps/cassioWatch/icon.js @@ -0,0 +1,5 @@ +require("heatshrink").decompress( + atob( + "lksxH+ACUPh80AQMQDKYANEoQAJmgoanQoLAAhdYFKAAEFNKJUFTAsRCwyxRQ6IUHsosBmc0nQAEmgsWN5QoFAAszCxE6FREQCQ8zEg1erwIGLCJUME4IABsgABAoRaMFRwpHr0zmQABmddFoosHmgqENA5VDKQVdlkyq2A1WkwFWlldxAsDLBirKJQUyleA6vV52AAAOr1YtBLIkIh7PELAiBJFQUsqvUAAWq0d/v9VwHPvQsFFYIsEFQU0QJCACFQXO5wCBF4fUv+p6osBsk6mggDFoZWOmdPEQIrDAAYuD6tWldVAAcrg6HCQgQnEAYT8BFYMr1InDFxAGB1VOvGczmdvOjzkrFYMQFYgkBQQUzrtkmasCKQoDFAoVVg8zh8IgHH44rCEYK2EQQuJmd/J47eDMQmqmc6YYJWCQYQAIFYczQQYBFEgWqWAeqVQN5QgNPhAqFcobnCWIMsp9ypwfBVIgFCE4d/qt5ud5zt4p8sDwJVJBQMJHwdzlQrEE4ooCFIIAClczZQL6CFREPg9y4Gdp8ynUyQYImCE4QmBFAd5qtVBQMysoqBbwIrJlec4MrhEQr1ellOJowDDFASyCFYLGBnIoH/wqBhNy5t5ldWqtPJooADA4InBRYnUqtXr0ymZaBFQorBAAMruWdVoIACFINOO4ImB0ZPCAAbkC0csryCBWA0QFYbaChEIlgABNgMzlfNExBXD5sqTAIrCQIs6FYIzDFoMQiwTBC4Nkq8qFgInBFAQCE5tOmdkCwKAFQQaEEGwgABmVdxBZB0YrCAAujlUzxBWJFZYsDLIVeldU0fNE4PN5ujqkrnIqDKw6CCFhMzFggABmcsqoADXwILCFRJWELBIsDFoRMBr1dmddMQYPDOpArFFhpbEAAYMEDQ5WGAAIREEYIECmggEABDWHFRIsFEwIUEFpQpJFRQABiAWJFwQAECJasHFiQAPFRoABI5q7DQCgAGQpb/JFShaOGxAqUWqYpYRJ8QFDiKHL4YZSA==" + ) +); diff --git a/apps/cassioWatch/metadata.json b/apps/cassioWatch/metadata.json new file mode 100644 index 000000000..6a9cff447 --- /dev/null +++ b/apps/cassioWatch/metadata.json @@ -0,0 +1,17 @@ +{ + "id": "cassioWatch", + "name": "Cassio Watch", + "description": "Clock with Space Cassio Watch Style", + "screenshots": [{ "url": "screens/screen1.png" }], + "icon": "app.png", + "version": "1.0.2", + "type": "clock", + "tags": "clock, weather, cassio, retro", + "supports": ["BANGLEJS2"], + "allow_emulator": true, + "readme": "README.md", + "storage": [ + { "name": "cassioWatch.app.js", "url": "app.js" }, + { "name": "cassioWatch.img", "url": "icon.js", "evaluate": true } + ] +} diff --git a/apps/cassioWatch/screens/main.png b/apps/cassioWatch/screens/main.png new file mode 100644 index 000000000..a5d348575 Binary files /dev/null and b/apps/cassioWatch/screens/main.png differ