added gps

master
Christian Hemker 2020-04-02 21:23:04 +02:00
parent 8d84d4d0dd
commit 5ad34face0
1 changed files with 293 additions and 242 deletions

View File

@ -1,6 +1,26 @@
//Icons from https://icons8.com //Icons from https://icons8.com
//Sun and Moon calculations from https://github.com/mourner/suncalc and https://gist.github.com/endel/dfe6bb2fbe679781948c //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 //pictures
function getImg(i) { function getImg(i) {
var data = { var data = {
@ -18,134 +38,113 @@ function getImg(i) {
"LastQuarterSouth" : "AD8AAH/4AHx/gDwf8BwH/g4B/8MAf/HAH/5gB/+YAf/sAH//AB//wAf/8AH//AB//wAf/2AH/5gB/+cAf/jAH/w4B/8HAf+A8H/AHx/gAf/gAA/AAA==", "LastQuarterSouth" : "AD8AAH/4AHx/gDwf8BwH/g4B/8MAf/HAH/5gB/+YAf/sAH//AB//wAf/8AH//AB//wAf/2AH/5gB/+cAf/jAH/w4B/8HAf+A8H/AHx/gAf/gAA/AAA==",
"WaningCrescentNorth" : "AD8AAH/4AH8PgD+A8B/ADg/gAcP4ADH+AA5/AAGfwABv8AAP/AAD/wAA/8AAP/AAD/wAA38AAZ/AAGf4ADj+AAw/gAcH8AOA/gPAH8PgAf/gAA/AAA==", "WaningCrescentNorth" : "AD8AAH/4AH8PgD+A8B/ADg/gAcP4ADH+AA5/AAGfwABv8AAP/AAD/wAA/8AAP/AAD/wAA38AAZ/AAGf4ADj+AAw/gAcH8AOA/gPAH8PgAf/gAA/AAA==",
"WaxingCrescentSouth" : "AD8AAH/4AH8PgD+A8B/ADg/gAcP4ADH+AA5/AAGfwABv8AAP/AAD/wAA/8AAP/AAD/wAA38AAZ/AAGf4ADj+AAw/gAcH8AOA/gPAH8PgAf/gAA/AAA==" "WaxingCrescentSouth" : "AD8AAH/4AH8PgD+A8B/ADg/gAcP4ADH+AA5/AAGfwABv8AAP/AAD/wAA/8AAP/AAD/wAA38AAZ/AAGf4ADj+AAw/gAcH8AOA/gPAH8PgAf/gAA/AAA=="
}; };
return { return {
width : 26, height : 26, bpp : 1, width : 26, height : 26, bpp : 1,
transparent : 0, transparent : 0,
buffer : E.toArrayBuffer(atob(data[i])) buffer : E.toArrayBuffer(atob(data[i]))
}; };
} }
// sun calculations are based on http://aa.quae.nl/en/reken/zonpositie.html formulas
// date/time constants and conversions
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; }
//coordinates (will get from GPS later on real device) // general calculations for position
var lat = 52.96236, var e = rad * 23.4397; // obliquity of the Earth
lon = 7.62571; function rightAscension(l, b) { return atan(sin(l) * cos(e) - tan(b) * sin(e), cos(l)); }
function declination(l, b) { return asin(sin(b) * cos(e) + cos(b) * sin(e) * sin(l)); }
function azimuth(H, phi, dec) { return atan(sin(H), cos(H) * sin(phi) - tan(dec) * cos(phi)); }
function altitude(H, phi, dec) { return asin(sin(phi) * sin(dec) + cos(phi) * cos(dec) * cos(H)); }
function siderealTime(d, lw) { return rad * (280.16 + 360.9856235 * d) - lw; }
function astroRefraction(h) {
if (h < 0) // the following formula works for positive altitudes only.
h = 0; // if h = -0.08901179 a div/0 would occur.
// formula 16.4 of "Astronomical Algorithms" 2nd edition by Jean Meeus (Willmann-Bell, Richmond) 1998.
// 1.02 / tan(h + 10.26 / (h + 5.10)) h in degrees, result in arc minutes -> converted to rad:
return 0.0002967 / Math.tan(h + 0.00312536 / (h + 0.08901179));
}
var PI = Math.PI, // general sun calculations
sin = Math.sin, function solarMeanAnomaly(d) { return rad * (357.5291 + 0.98560028 * d); }
cos = Math.cos, function eclipticLongitude(M) {
tan = Math.tan,
asin = Math.asin, var C = rad * (1.9148 * sin(M) + 0.02 * sin(2 * M) + 0.0003 * sin(3 * M)), // equation of center
atan = Math.atan2, P = rad * 102.9372; // perihelion of the Earth
acos = Math.acos,
rad = PI / 180; return M + C + P + PI;
}
// sun calculations are based on http://aa.quae.nl/en/reken/zonpositie.html formulas function sunCoords(d) {
// date/time constants and conversions var M = solarMeanAnomaly(d),
var dayMs = 1000 * 60 * 60 * 24, L = eclipticLongitude(M);
J1970 = 2440588, return {
J2000 = 2451545; dec: declination(L, 0),
ra: rightAscension(L, 0)
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; }
// general calculations for position
var e = rad * 23.4397; // obliquity of the Earth
function rightAscension(l, b) { return atan(sin(l) * cos(e) - tan(b) * sin(e), cos(l)); }
function declination(l, b) { return asin(sin(b) * cos(e) + cos(b) * sin(e) * sin(l)); }
function azimuth(H, phi, dec) { return atan(sin(H), cos(H) * sin(phi) - tan(dec) * cos(phi)); }
function altitude(H, phi, dec) { return asin(sin(phi) * sin(dec) + cos(phi) * cos(dec) * cos(H)); }
function siderealTime(d, lw) { return rad * (280.16 + 360.9856235 * d) - lw; }
function astroRefraction(h) {
if (h < 0) // the following formula works for positive altitudes only.
h = 0; // if h = -0.08901179 a div/0 would occur.
// formula 16.4 of "Astronomical Algorithms" 2nd edition by Jean Meeus (Willmann-Bell, Richmond) 1998.
// 1.02 / tan(h + 10.26 / (h + 5.10)) h in degrees, result in arc minutes -> converted to rad:
return 0.0002967 / Math.tan(h + 0.00312536 / (h + 0.08901179));
}
// general sun calculations
function solarMeanAnomaly(d) { return rad * (357.5291 + 0.98560028 * d); }
function eclipticLongitude(M) {
var C = rad * (1.9148 * sin(M) + 0.02 * sin(2 * M) + 0.0003 * sin(3 * M)), // equation of center
P = rad * 102.9372; // perihelion of the Earth
return M + C + P + PI;
}
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) {
times.push([angle, riseName, setName]);
}; };
}
// moon calculations, based on http://aa.quae.nl/en/reken/hemelpositie.html formulas
function moonCoords(d) { // geocentric ecliptic coordinates of the moon
var L = rad * (218.316 + 13.176396 * d), // ecliptic longitude
M = rad * (134.963 + 13.064993 * d), // mean anomaly
F = rad * (93.272 + 13.229350 * d), // mean distance
l = L + rad * 6.289 * sin(M), // longitude
b = rad * 5.128 * sin(F), // latitude
dt = 385001 - 20905 * cos(M); // distance to the moon in km
return {
ra: rightAscension(l, b),
dec: declination(l, b),
dist: dt
};
}
SunCalc.getMoonPosition = function (date, lat, lng) { // adds a custom time to the times config
SunCalc.addTime = function (angle, riseName, setName) {
times.push([angle, riseName, setName]);
};
var lw = rad * -lng, // moon calculations, based on http://aa.quae.nl/en/reken/hemelpositie.html formulas
phi = rad * lat, function moonCoords(d) { // geocentric ecliptic coordinates of the moon
d = toDays(date), var L = rad * (218.316 + 13.176396 * d), // ecliptic longitude
c = moonCoords(d), M = rad * (134.963 + 13.064993 * d), // mean anomaly
H = siderealTime(d, lw) - c.ra, F = rad * (93.272 + 13.229350 * d), // mean distance
h = altitude(H, phi, c.dec), l = L + rad * 6.289 * sin(M), // longitude
// formula 14.1 of "Astronomical Algorithms" 2nd edition by Jean Meeus (Willmann-Bell, Richmond) 1998. b = rad * 5.128 * sin(F), // latitude
pa = atan(sin(H), tan(phi) * cos(c.dec) - sin(c.dec) * cos(H)); dt = 385001 - 20905 * cos(M); // distance to the moon in km
h = h + astroRefraction(h); // altitude correction for refraction
return { return {
azimuth: azimuth(H, phi, c.dec), ra: rightAscension(l, b),
altitude: h, dec: declination(l, b),
distance: c.dist, dist: dt
parallacticAngle: pa
};
}; };
}
// calculations for illumination parameters of the moon, SunCalc.getMoonPosition = function (date, lat, lng) {
// 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. var lw = rad * -lng,
phi = rad * lat,
d = toDays(date),
c = moonCoords(d),
H = siderealTime(d, lw) - c.ra,
h = altitude(H, phi, c.dec),
// formula 14.1 of "Astronomical Algorithms" 2nd edition by Jean Meeus (Willmann-Bell, Richmond) 1998.
pa = atan(sin(H), tan(phi) * cos(c.dec) - sin(c.dec) * cos(H));
h = h + astroRefraction(h); // altitude correction for refraction
return {
azimuth: azimuth(H, phi, c.dec),
altitude: h,
distance: c.dist,
parallacticAngle: pa
};
};
SunCalc.getMoonIllumination = function (date) { // calculations for illumination parameters of the moon,
var year = date.getFullYear(); // based on http://idlastro.gsfc.nasa.gov/ftp/pro/astro/mphase.pro formulas and
var month = date.getMonth(); // Chapter 48 of "Astronomical Algorithms" 2nd edition by Jean Meeus (Willmann-Bell, Richmond) 1998.
var day = date.getDate(); SunCalc.getMoonIllumination = function (date) {
var Moon = { var year = date.getFullYear();
phases: ['new', 'waxing-crescent', 'first-quarter', 'waxing-gibbous', 'full', 'waning-gibbous', 'last-quarter', 'waning-crescent'], var month = date.getMonth();
phase: function (year, month, day) { var day = date.getDate();
var Moon = {
phases: ['new', 'waxing-crescent', 'first-quarter', 'waxing-gibbous', 'full', 'waning-gibbous', 'last-quarter', 'waning-crescent'],
phase: function (year, month, day) {
let c = 0; let c = 0;
let e = 0; let e = 0;
let jd = 0; let jd = 0;
let b = 0; let b = 0;
if (month < 3) { if (month < 3) {
year--; year--;
month += 12; month += 12;
} }
++month; ++month;
c = 365.25 * year; c = 365.25 * year;
@ -156,147 +155,199 @@ function getImg(i) {
jd -= b; // subtract integer part to leave fractional part of original jd jd -= b; // subtract integer part to leave fractional part of original jd
b = Math.round(jd * 8); // scale fraction from 0-8 and round 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 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]}; return {phase: b, name: Moon.phases[b]};
} }
}; };
return (Moon.phase(year, month, day)); return (Moon.phase(year, month, day));
}; };
function hoursLater(date, h) { function hoursLater(date, h) {
return new Date(date.valueOf() + h * dayMs / 24); return new Date(date.valueOf() + h * dayMs / 24);
} }
// calculations for moon rise/set times are based on http://www.stargazing.net/kepler/moonrise.html article // calculations for moon rise/set times are based on http://www.stargazing.net/kepler/moonrise.html article
SunCalc.getMoonTimes = function (date, lat, lng, inUTC) {
SunCalc.getMoonTimes = function (date, lat, lng, inUTC) { var t = new Date(date);
var t = new Date(date); if (inUTC) t.setUTCHours(0, 0, 0, 0);
if (inUTC) t.setUTCHours(0, 0, 0, 0); else t.setHours(0, 0, 0, 0);
else t.setHours(0, 0, 0, 0); var hc = 0.133 * rad,
var hc = 0.133 * rad, h0 = SunCalc.getMoonPosition(t, lat, lng).altitude - hc,
h0 = SunCalc.getMoonPosition(t, lat, lng).altitude - hc, h1, h2, rise, set, a, b, xe, ye, d, roots, x1, x2, dx;
h1, h2, rise, set, a, b, xe, ye, d, roots, x1, x2, dx;
// go in 2-hour chunks, each time seeing if a 3-point quadratic curve crosses zero (which means rise or set)
// go in 2-hour chunks, each time seeing if a 3-point quadratic curve crosses zero (which means rise or set) for (var i = 1; i <= 24; i += 2) {
for (var i = 1; i <= 24; i += 2) { h1 = SunCalc.getMoonPosition(hoursLater(t, i), lat, lng).altitude - hc;
h1 = SunCalc.getMoonPosition(hoursLater(t, i), lat, lng).altitude - hc; h2 = SunCalc.getMoonPosition(hoursLater(t, i + 1), lat, lng).altitude - hc;
h2 = SunCalc.getMoonPosition(hoursLater(t, i + 1), lat, lng).altitude - hc; a = (h0 + h2) / 2 - h1;
a = (h0 + h2) / 2 - h1; b = (h2 - h0) / 2;
b = (h2 - h0) / 2; xe = -b / (2 * a);
xe = -b / (2 * a); ye = (a * xe + b) * xe + h1;
ye = (a * xe + b) * xe + h1; d = b * b - 4 * a * h1;
d = b * b - 4 * a * h1; roots = 0;
roots = 0; if (d >= 0) {
if (d >= 0) { dx = Math.sqrt(d) / (Math.abs(a) * 2);
dx = Math.sqrt(d) / (Math.abs(a) * 2); x1 = xe - dx;
x1 = xe - dx; x2 = xe + dx;
x2 = xe + dx; if (Math.abs(x1) <= 1) roots++;
if (Math.abs(x1) <= 1) roots++; if (Math.abs(x2) <= 1) roots++;
if (Math.abs(x2) <= 1) roots++; if (x1 < -1) x1 = x2;
if (x1 < -1) x1 = x2;
}
if (roots === 1) {
if (h0 < 0) rise = i + x1;
else set = i + x1;
} else if (roots === 2) {
rise = i + (ye < 0 ? x2 : x1);
set = i + (ye < 0 ? x1 : x2);
}
if (rise && set) break;
h0 = h2;
} }
var result = {}; if (roots === 1) {
if (rise) result.rise = hoursLater(t, rise); if (h0 < 0) rise = i + x1;
if (set) result.set = hoursLater(t, set); else set = i + x1;
if (!rise && !set) result[ye > 0 ? 'alwaysUp' : 'alwaysDown'] = true; } else if (roots === 2) {
return result; rise = i + (ye < 0 ? x2 : x1);
set = i + (ye < 0 ? x1 : x2);
}
if (rise && set) break;
h0 = h2;
}
var result = {};
if (rise) result.rise = hoursLater(t, rise);
if (set) result.set = hoursLater(t, set);
if (!rise && !set) result[ye > 0 ? 'alwaysUp' : 'alwaysDown'] = true;
return result;
};
function getMPhaseComp (offset) {
var date = new Date();
date.setDate(date.getDate() + offset);
var dd = String(date.getDate());
if(dd<10){dd='0'+dd;}
var mm = String(date.getMonth() + 1);
if(mm<10){mm='0'+mm;}
var yyyy = date.getFullYear();
var phase = SunCalc.getMoonIllumination(date);
return dd + "." + mm + "." + yyyy + ": "+ phase.name;
}
function getMPhaseSim (offset) {
var date = new Date();
date.setDate(date.getDate() + offset);
var dd = String(date.getDate());
if(dd<10){dd='0'+dd;}
var mm = String(date.getMonth() + 1);
if(mm<10){mm='0'+mm;}
var yyyy = date.getFullYear();
var phase = SunCalc.getMoonIllumination(date);
return phase.name;
}
function drawMoonPhase(offset, x, y){
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);}
if (getMPhaseSim(offset) == "waxing-gibbous") {g.drawImage(getImg("WaxingGibbousNorth"), x, y);}
if (getMPhaseSim(offset) == "full") {g.drawImage(getImg("FullMoon"), x, y);}
if (getMPhaseSim(offset) == "waning-gibbous") {g.drawImage(getImg("WaningGibbousNorth"), x, y);}
if (getMPhaseSim(offset) == "last-quarter") {g.drawImage(getImg("LastQuarterNorth"), x, y);}
if (getMPhaseSim(offset) == "waning-crescent") {g.drawImage(getImg("WaningCrescentNorth"), x, y);}
}
else { //Southern hemisphere
if (getMPhaseSim(offset) == "new") {g.drawImage(getImg("NewMoon"), x, y);}
if (getMPhaseSim(offset) == "waxing-crescent") {g.drawImage(getImg("WaxingCrescentSouth"), x, y);}
if (getMPhaseSim(offset) == "first-quarter") {g.drawImage(getImg("FirstQuarterSouth"), x, y);}
if (getMPhaseSim(offset) == "waxing-gibbous") {g.drawImage(getImg("WaxingGibbousSouth"), x, y);}
if (getMPhaseSim(offset) == "full") {g.drawImage(getImg("FullMoon"), x, y);}
if (getMPhaseSim(offset) == "waning-gibbous") {g.drawImage(getImg("WaningGibbousSouth"), x, y);}
if (getMPhaseSim(offset) == "last-quarter") {g.drawImage(getImg("LastQuarterSouth"), x, y);}
if (getMPhaseSim(offset) == "waning-crescent") {g.drawImage(getImg("WaningCrescentSouth"), x, y);}
}
}
function drawMoon(offset, x, y) {
g.setFont("6x8");
g.clear();
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),x,y+30);
drawMoonPhase(offset, x+35, y+40);
g.drawString(getMPhaseComp(offset+2),x,y+70);
drawMoonPhase(offset+2, x+35, y+80);
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 getMPhaseComp (offset) { function getGpsFix() {
var date = new Date(); Bangle.on('GPS', function(fix) {
date.setDate(date.getDate() + offset); g.clear();
var dd = String(date.getDate());
if(dd<10){dd='0'+dd;} if (fix.fix == 1) {
var mm = String(date.getMonth() + 1); var gpsString = "lat: " + fix.lat.toFixed(4) + " lon: " + fix.lon.toFixed(4);
if(mm<10){mm='0'+mm;} coords.lat = fix.lat;
var yyyy = date.getFullYear(); coords.lon = fix.lon;
var phase = SunCalc.getMoonIllumination(date); updateCoords();
return dd + "." + mm + "." + yyyy + ": "+ phase.name; 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 getMPhaseSim (offset) { function start() {
var date = new Date(); var x = 10;
date.setDate(date.getDate() + offset); var y = 50;
var dd = String(date.getDate()); var offsetMoon = 0;
if(dd<10){dd='0'+dd;} coords = storage.readJSON('coords.json',1); //read coordinates from file
var mm = String(date.getMonth() + 1); if (!coords) resetCoords(); //if coordinates could not be read, reset them
if(mm<10){mm='0'+mm;} drawMoon(offsetMoon, x, y); //offset, x, y
var yyyy = date.getFullYear();
var phase = SunCalc.getMoonIllumination(date); //define button functions
return phase.name; setWatch(function() { //BTN1
} offsetMoon++; //jump to next day
drawMoon(offsetMoon, x, y); //offset, x, y
}, BTN1, {edge:"rising", debounce:50, repeat:true});
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});
}
function drawMoonPhase(offset, x, y){ start();
if (lat >= 0 && 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);}
if (getMPhaseSim(offset) == "waxing-gibbous") {g.drawImage(getImg("WaxingGibbousNorth"), x, y);}
if (getMPhaseSim(offset) == "full") {g.drawImage(getImg("FullMoon"), x, y);}
if (getMPhaseSim(offset) == "waning-gibbous") {g.drawImage(getImg("WaningGibbousNorth"), x, y);}
if (getMPhaseSim(offset) == "last-quarter") {g.drawImage(getImg("LastQuarterNorth"), x, y);}
if (getMPhaseSim(offset) == "waning-crescent") {g.drawImage(getImg("WaningCrescentNorth"), x, y);}
}
else { //Southern hemisphere
if (getMPhaseSim(offset) == "new") {g.drawImage(getImg("NewMoon"), x, y);}
if (getMPhaseSim(offset) == "waxing-crescent") {g.drawImage(getImg("WaxingCrescentSouth"), x, y);}
if (getMPhaseSim(offset) == "first-quarter") {g.drawImage(getImg("FirstQuarterSouth"), x, y);}
if (getMPhaseSim(offset) == "waxing-gibbous") {g.drawImage(getImg("WaxingGibbousSouth"), x, y);}
if (getMPhaseSim(offset) == "full") {g.drawImage(getImg("FullMoon"), x, y);}
if (getMPhaseSim(offset) == "waning-gibbous") {g.drawImage(getImg("WaningGibbousSouth"), x, y);}
if (getMPhaseSim(offset) == "last-quarter") {g.drawImage(getImg("LastQuarterSouth"), x, y);}
if (getMPhaseSim(offset) == "waning-crescent") {g.drawImage(getImg("WaningCrescentSouth"), x, y);}
}
}
function drawMoon(offset, x, y) {
g.setFont("6x8");
g.clear();
g.drawString("Key1: day+, Key2:today, Key3:day-",x,y-30);
g.drawString(getMPhaseComp(offset),x,y+30);
drawMoonPhase(offset, x+35, y+40);
g.drawString(getMPhaseComp(offset+2),x,y+70);
drawMoonPhase(offset+2, x+35, y+80);
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);
}
function start() {
var x = 10;
var y = 50;
var offsetMoon = 0;
drawMoon(offsetMoon, x, y); //offset, x, y
//define button functions
setWatch(function() {
offsetMoon++; //jump to next day
drawMoon(offsetMoon, x, y); //offset, x, y
}, BTN1, {edge:"rising", debounce:50, repeat:true});
setWatch(function() {
offsetMoon = 0; //jump to today
drawMoon(offsetMoon, x, y); //offset, x, y
}, BTN2, {edge:"rising", debounce:50, repeat:true});
setWatch(function() {
offsetMoon--; //jump to next day
drawMoon(offsetMoon, x, y); //offset, x, y
}, BTN3, {edge:"rising", debounce:50, repeat:true});
}
start();