commit
282ff71577
|
|
@ -15,8 +15,8 @@
|
|||
{ "id": "moonphase",
|
||||
"name": "Moonphase",
|
||||
"icon": "app.png",
|
||||
"version":"0.01",
|
||||
"description": "Shows current moon phase. Currently only with fixed coordinates (northern hemisphere).",
|
||||
"version":"0.02",
|
||||
"description": "Shows current moon phase. Now with GPS function.",
|
||||
"tags": "",
|
||||
"allow_emulator":true,
|
||||
"storage": [
|
||||
|
|
|
|||
|
|
@ -1 +1,2 @@
|
|||
0.01: New App!
|
||||
0.02: Added GPS to obtain coordinates, added buttons
|
||||
|
|
@ -1,6 +1,26 @@
|
|||
//Icons from https://icons8.com
|
||||
//Sun and Moon calculations from https://github.com/mourner/suncalc and https://gist.github.com/endel/dfe6bb2fbe679781948c
|
||||
|
||||
//varibales
|
||||
const storage = require('Storage');
|
||||
let coords;
|
||||
var timer;
|
||||
var fix;
|
||||
|
||||
var PI = Math.PI,
|
||||
sin = Math.sin,
|
||||
cos = Math.cos,
|
||||
tan = Math.tan,
|
||||
asin = Math.asin,
|
||||
atan = Math.atan2,
|
||||
acos = Math.acos,
|
||||
rad = PI / 180,
|
||||
dayMs = 1000 * 60 * 60 * 24,
|
||||
J1970 = 2440588,
|
||||
J2000 = 2451545;
|
||||
|
||||
var SunCalc = {};
|
||||
|
||||
//pictures
|
||||
function getImg(i) {
|
||||
var data = {
|
||||
|
|
@ -25,26 +45,8 @@ function getImg(i) {
|
|||
buffer : E.toArrayBuffer(atob(data[i]))
|
||||
};
|
||||
}
|
||||
|
||||
//coordinates (will get from GPS later on real device)
|
||||
var lat = 52.96236,
|
||||
lon = 7.62571;
|
||||
|
||||
var PI = Math.PI,
|
||||
sin = Math.sin,
|
||||
cos = Math.cos,
|
||||
tan = Math.tan,
|
||||
asin = Math.asin,
|
||||
atan = Math.atan2,
|
||||
acos = Math.acos,
|
||||
rad = PI / 180;
|
||||
|
||||
// sun calculations are based on http://aa.quae.nl/en/reken/zonpositie.html formulas
|
||||
// date/time constants and conversions
|
||||
var dayMs = 1000 * 60 * 60 * 24,
|
||||
J1970 = 2440588,
|
||||
J2000 = 2451545;
|
||||
|
||||
function toJulian(date) { return date.valueOf() / dayMs - 0.5 + J1970; }
|
||||
function fromJulian(j) { return new Date((j + 0.5 - J1970) * dayMs); }
|
||||
function toDays(date) { return toJulian(date) - J2000; }
|
||||
|
|
@ -76,17 +78,15 @@ function getImg(i) {
|
|||
}
|
||||
|
||||
function sunCoords(d) {
|
||||
|
||||
var M = solarMeanAnomaly(d),
|
||||
L = eclipticLongitude(M);
|
||||
|
||||
return {
|
||||
dec: declination(L, 0),
|
||||
ra: rightAscension(L, 0)
|
||||
};
|
||||
}
|
||||
|
||||
var SunCalc = {};
|
||||
|
||||
|
||||
// adds a custom time to the times config
|
||||
SunCalc.addTime = function (angle, riseName, setName) {
|
||||
|
|
@ -131,7 +131,6 @@ function getImg(i) {
|
|||
// calculations for illumination parameters of the moon,
|
||||
// based on http://idlastro.gsfc.nasa.gov/ftp/pro/astro/mphase.pro formulas and
|
||||
// Chapter 48 of "Astronomical Algorithms" 2nd edition by Jean Meeus (Willmann-Bell, Richmond) 1998.
|
||||
|
||||
SunCalc.getMoonIllumination = function (date) {
|
||||
var year = date.getFullYear();
|
||||
var month = date.getMonth();
|
||||
|
|
@ -156,7 +155,6 @@ function getImg(i) {
|
|||
jd -= b; // subtract integer part to leave fractional part of original jd
|
||||
b = Math.round(jd * 8); // scale fraction from 0-8 and round
|
||||
if (b >= 8) b = 0; // 0 and 8 are the same so turn 8 into 0
|
||||
//print ({phase: b, name: Moon.phases[b]});
|
||||
return {phase: b, name: Moon.phases[b]};
|
||||
}
|
||||
};
|
||||
|
|
@ -168,7 +166,6 @@ function getImg(i) {
|
|||
}
|
||||
|
||||
// calculations for moon rise/set times are based on http://www.stargazing.net/kepler/moonrise.html article
|
||||
|
||||
SunCalc.getMoonTimes = function (date, lat, lng, inUTC) {
|
||||
var t = new Date(date);
|
||||
if (inUTC) t.setUTCHours(0, 0, 0, 0);
|
||||
|
|
@ -237,7 +234,7 @@ function getImg(i) {
|
|||
}
|
||||
|
||||
function drawMoonPhase(offset, x, y){
|
||||
if (lat >= 0 && lat <= 90){ //Northern hemisphere
|
||||
if (coords.lat >= 0 && coords.lat <= 90){ //Northern hemisphere
|
||||
if (getMPhaseSim(offset) == "new") {g.drawImage(getImg("NewMoon"), x, y);}
|
||||
if (getMPhaseSim(offset) == "waxing-crescent") {g.drawImage(getImg("WaxingCrescentNorth"), x, y);}
|
||||
if (getMPhaseSim(offset) == "first-quarter") {g.drawImage(getImg("FirstQuarterNorth"), x, y);}
|
||||
|
|
@ -262,35 +259,95 @@ function getImg(i) {
|
|||
function drawMoon(offset, x, y) {
|
||||
g.setFont("6x8");
|
||||
g.clear();
|
||||
g.drawString("Key1: increase day, Key3:decrease day",10,10);
|
||||
g.drawString(getMPhaseComp(offset),x,y-10);
|
||||
drawMoonPhase(offset, x, y);
|
||||
g.drawString("Key1: day+, Key2:today, Key3:day-",x,y-30);
|
||||
g.drawString("Last known coordinates: " + coords.lat.toFixed(4) + " " + coords.lon.toFixed(4), x, y-20);
|
||||
g.drawString("Press BTN4 to update",x, y-10);
|
||||
|
||||
g.drawString(getMPhaseComp(offset+2),x,y+40);
|
||||
drawMoonPhase(offset+2, x, y+50);
|
||||
g.drawString(getMPhaseComp(offset),x,y+30);
|
||||
drawMoonPhase(offset, x+35, y+40);
|
||||
|
||||
g.drawString(getMPhaseComp(offset+4),x,y+90);
|
||||
drawMoonPhase(offset+4, x, y+100);
|
||||
g.drawString(getMPhaseComp(offset+2),x,y+70);
|
||||
drawMoonPhase(offset+2, x+35, y+80);
|
||||
|
||||
g.drawString(getMPhaseComp(offset+6),x,y+140);
|
||||
drawMoonPhase(offset+6, x, y+150);
|
||||
g.drawString(getMPhaseComp(offset+4),x,y+110);
|
||||
drawMoonPhase(offset+4, x+35, y+120);
|
||||
|
||||
g.drawString(getMPhaseComp(offset+6),x,y+150);
|
||||
drawMoonPhase(offset+6, x+35, y+160);
|
||||
}
|
||||
|
||||
//Write coordinates to file
|
||||
function updateCoords() {
|
||||
storage.write('coords.json', coords);
|
||||
}
|
||||
|
||||
//set coordinates to default (city where I live)
|
||||
function resetCoords() {
|
||||
coords = {
|
||||
lat : 52.96236,
|
||||
lon : 7.62571,
|
||||
};
|
||||
updateCoords();
|
||||
}
|
||||
|
||||
function getGpsFix() {
|
||||
Bangle.on('GPS', function(fix) {
|
||||
g.clear();
|
||||
|
||||
if (fix.fix == 1) {
|
||||
var gpsString = "lat: " + fix.lat.toFixed(4) + " lon: " + fix.lon.toFixed(4);
|
||||
coords.lat = fix.lat;
|
||||
coords.lon = fix.lon;
|
||||
updateCoords();
|
||||
g.drawString("Got GPS fix and wrote coords to file",10,20);
|
||||
g.drawString(gpsString,10,30);
|
||||
g.drawString("Press BTN5 to return to app",10,40);
|
||||
clearInterval(timer);
|
||||
timer = undefined;
|
||||
}
|
||||
else {
|
||||
g.drawString("Searching satellites...",10,20);
|
||||
g.drawString("Press BTN5 to stop GPS",10, 30);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
function start() {
|
||||
var x = 10;
|
||||
var y = 40;
|
||||
var y = 50;
|
||||
var offsetMoon = 0;
|
||||
coords = storage.readJSON('coords.json',1); //read coordinates from file
|
||||
if (!coords) resetCoords(); //if coordinates could not be read, reset them
|
||||
drawMoon(offsetMoon, x, y); //offset, x, y
|
||||
|
||||
//define button functions
|
||||
setWatch(function() {
|
||||
setWatch(function() { //BTN1
|
||||
offsetMoon++; //jump to next day
|
||||
drawMoon(offsetMoon, x, y); //offset, x, y
|
||||
}, BTN1, {edge:"rising", debounce:50, repeat:true});
|
||||
setWatch(function() {
|
||||
|
||||
setWatch(function() { //BTN2
|
||||
offsetMoon = 0; //jump to today
|
||||
drawMoon(offsetMoon, x, y); //offset, x, y
|
||||
}, BTN2, {edge:"rising", debounce:50, repeat:true});
|
||||
|
||||
setWatch(function() { //BTN3
|
||||
offsetMoon--; //jump to next day
|
||||
drawMoon(offsetMoon, x, y); //offset, x, y
|
||||
}, BTN3, {edge:"rising", debounce:50, repeat:true});
|
||||
|
||||
setWatch(function() { //BTN4
|
||||
g.drawString("--- Getting GPS signal ---",x, y);
|
||||
Bangle.setGPSPower(1);
|
||||
timer = setInterval(getGpsFix, 10000);
|
||||
}, BTN4, {edge:"rising", debounce:50, repeat:true});
|
||||
|
||||
setWatch(function() { //BTN5
|
||||
if (timer) clearInterval(timer);
|
||||
timer = undefined;
|
||||
Bangle.setGPSPower(0);
|
||||
drawMoon(offsetMoon, x, y); //offset, x, y
|
||||
}, BTN5, {edge:"rising", debounce:50, repeat:true});
|
||||
}
|
||||
|
||||
start();
|
||||
Loading…
Reference in New Issue