using Toybox.Graphics as Gfx; using Toybox.WatchUi as Ui; using Toybox.Time; using Toybox.Time.Gregorian as Cal; using C as C; class Moon { var phase; var year; var month; var day; private var mo_cumm = [ 0, 0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334, 365 ]; private var icon_off; private var icons = [ Rez.Drawables.moon0, Rez.Drawables.moon1, Rez.Drawables.moon2, Rez.Drawables.moon3, Rez.Drawables.moon4, Rez.Drawables.moon5, Rez.Drawables.moon6, Rez.Drawables.moon7, Rez.Drawables.moon8, Rez.Drawables.moon9, Rez.Drawables.moon10, Rez.Drawables.moon11, Rez.Drawables.moon12, Rez.Drawables.moon13, Rez.Drawables.moon14, Rez.Drawables.moon15, Rez.Drawables.moon16, Rez.Drawables.moon17, Rez.Drawables.moon18, Rez.Drawables.moon19, Rez.Drawables.moon20, Rez.Drawables.moon21, Rez.Drawables.moon22, Rez.Drawables.moon23, Rez.Drawables.moon24, Rez.Drawables.moon25, Rez.Drawables.moon26, Rez.Drawables.moon27, Rez.Drawables.moon28, Rez.Drawables.moon29 ]; public function initialize() { if (C.radius < 150) { icon_off = 24 / 2; } else { icon_off = 60 / 2; } year = 0; get_phase(Time.now()); } public function show(now, x, y, dc) { var bits = new Ui.Bitmap({ :rezId => get_phase(now), :locX => x - icon_off, :locY => y - icon_off }); bits.draw(dc); } function epoch_days(d) { var yr = d.year; if (d.month < 2) { yr = yr - 1; } var leaps = (yr/4).toNumber() - (yr/100).toNumber() + (yr/400).toNumber(); var days = (d.year * 365) + d.day + mo_cumm[d.month]; return days + leaps; } function moon_day(d) { // // Should return d % 29.530588853 but Monkey C // doesn't know how to do a floating mod. We'll do // the % operation in 2 calculations instead. // // // Monkey C keeps days a 1 based but we want the moon // phase to be 0 based. You'd think you should subtrace // 1 but adding is empirically correct. // d += 1; var n = (d / 29.530588853).toNumber(); return (d - (n * 29.530588853)).toNumber(); } function get_phase(now) { var t = Cal.info(now, Time.FORMAT_SHORT); if (t.year == year && t.month == month && t.day == day) { return phase; } year = t.year; month = t.month; day = t.day; var ref = Cal.moment({:year => 2000, :month => 1, :day => 6, :hour => 12 }); var info = Cal.info(ref, Time.FORMAT_SHORT); var ndays = epoch_days(t) - epoch_days(info); var idx = moon_day(ndays); if (C.debug && (idx > 29)) { C.logger("get_phase:" + year + "/" + month + "/" + day + " => " + idx); idx = 29; } phase = icons[idx]; return phase; } }