mirror of
https://github.com/netbymatt/ws4kp.git
synced 2026-04-17 09:09:30 -07:00
change to airbnb eslint plugin
This commit is contained in:
@@ -4,8 +4,8 @@
|
||||
|
||||
// eslint-disable-next-line no-unused-vars
|
||||
class Almanac extends WeatherDisplay {
|
||||
constructor(navId,elemId) {
|
||||
super(navId,elemId,'Almanac');
|
||||
constructor(navId, elemId) {
|
||||
super(navId, elemId, 'Almanac');
|
||||
|
||||
// pre-load background images (returns promises)
|
||||
this.backgroundImage0 = utils.image.load('images/BackGround3_1.png');
|
||||
@@ -20,12 +20,11 @@ class Almanac extends WeatherDisplay {
|
||||
];
|
||||
|
||||
this.timing.totalScreens = 2;
|
||||
|
||||
}
|
||||
|
||||
async getData(weatherParameters) {
|
||||
super.getData(weatherParameters);
|
||||
if (!weatherParameters) weatherParameters = this.weatherParameters;
|
||||
async getData(_weatherParameters) {
|
||||
super.getData(_weatherParameters);
|
||||
const weatherParameters = _weatherParameters ?? this.weatherParameters;
|
||||
|
||||
// get images for outlook
|
||||
const imagePromises = [
|
||||
@@ -34,15 +33,15 @@ class Almanac extends WeatherDisplay {
|
||||
];
|
||||
|
||||
// get sun/moon data
|
||||
const {sun, moon} = this.calcSunMoonData(weatherParameters);
|
||||
const { sun, moon } = this.calcSunMoonData(weatherParameters);
|
||||
|
||||
// process images for outlook
|
||||
const [outlookTemp, outlookPrecip] = await Promise.all(imagePromises);
|
||||
|
||||
const outlook = this.parseOutlooks(weatherParameters.latitude, weatherParameters.longitude, outlookTemp, outlookPrecip);
|
||||
const outlook = Almanac.parseOutlooks(weatherParameters.latitude, weatherParameters.longitude, outlookTemp, outlookPrecip);
|
||||
|
||||
// store the data
|
||||
this.data = {
|
||||
this.data = {
|
||||
sun,
|
||||
moon,
|
||||
outlook,
|
||||
@@ -52,28 +51,27 @@ class Almanac extends WeatherDisplay {
|
||||
|
||||
// share data
|
||||
this.getDataCallback();
|
||||
|
||||
}
|
||||
|
||||
calcSunMoonData(weatherParameters) {
|
||||
const {DateTime} = luxon;
|
||||
const { DateTime } = luxon;
|
||||
|
||||
const sun = [
|
||||
SunCalc.getTimes(new Date(), weatherParameters.latitude, weatherParameters.longitude),
|
||||
SunCalc.getTimes(DateTime.local().plus({days:1}).toJSDate(), weatherParameters.latitude, weatherParameters.longitude),
|
||||
SunCalc.getTimes(DateTime.local().plus({ days: 1 }).toJSDate(), weatherParameters.latitude, weatherParameters.longitude),
|
||||
];
|
||||
|
||||
// brute force the moon phases by scanning the next 30 days
|
||||
const moon = [];
|
||||
// start with yesterday
|
||||
let moonDate = DateTime.local().minus({days:1});
|
||||
let phase = SunCalc.getMoonIllumination(moonDate.toJSDate()).phase;
|
||||
let moonDate = DateTime.local().minus({ days: 1 });
|
||||
let { phase } = SunCalc.getMoonIllumination(moonDate.toJSDate());
|
||||
let iterations = 0;
|
||||
do {
|
||||
// get yesterday's moon info
|
||||
const lastPhase = phase;
|
||||
// calculate new values
|
||||
moonDate = moonDate.plus({days:1});
|
||||
moonDate = moonDate.plus({ days: 1 });
|
||||
phase = SunCalc.getMoonIllumination(moonDate.toJSDate()).phase;
|
||||
// check for 4 cases
|
||||
if (lastPhase < 0.25 && phase >= 0.25) moon.push(this.getMoonTransition(0.25, 'First', moonDate));
|
||||
@@ -82,7 +80,7 @@ class Almanac extends WeatherDisplay {
|
||||
if (lastPhase > phase) moon.push(this.getMoonTransition(0.00, 'New', moonDate));
|
||||
|
||||
// stop after 30 days or 4 moon phases
|
||||
iterations++;
|
||||
iterations += 1;
|
||||
} while (iterations <= 30 && moon.length < 4);
|
||||
|
||||
return {
|
||||
@@ -94,19 +92,19 @@ class Almanac extends WeatherDisplay {
|
||||
// get moon transition from one phase to the next by drilling down by hours, minutes and seconds
|
||||
getMoonTransition(threshold, phaseName, start, iteration = 0) {
|
||||
let moonDate = start;
|
||||
let phase = SunCalc.getMoonIllumination(moonDate.toJSDate()).phase;
|
||||
let { phase } = SunCalc.getMoonIllumination(moonDate.toJSDate());
|
||||
let iterations = 0;
|
||||
const step = {
|
||||
hours: iteration === 0 ? -1:0,
|
||||
minutes: iteration === 1 ? 1:0,
|
||||
seconds: iteration === 2 ? -1:0,
|
||||
milliseconds: iteration === 3 ? 1:0,
|
||||
hours: iteration === 0 ? -1 : 0,
|
||||
minutes: iteration === 1 ? 1 : 0,
|
||||
seconds: iteration === 2 ? -1 : 0,
|
||||
milliseconds: iteration === 3 ? 1 : 0,
|
||||
};
|
||||
|
||||
// increasing test
|
||||
let test = (lastPhase,phase,threshold) => lastPhase < threshold && phase >= threshold;
|
||||
let test = (lastPhase, testPhase) => lastPhase < threshold && testPhase >= threshold;
|
||||
// decreasing test
|
||||
if (iteration%2===0) test = (lastPhase,phase,threshold) => lastPhase > threshold && phase <= threshold;
|
||||
if (iteration % 2 === 0) test = (lastPhase, testPhase) => lastPhase > threshold && testPhase <= threshold;
|
||||
|
||||
do {
|
||||
// store last phase
|
||||
@@ -117,42 +115,42 @@ class Almanac extends WeatherDisplay {
|
||||
// wrap phases > 0.9 to -0.1 for ease of detection
|
||||
if (phase > 0.9) phase -= 1.0;
|
||||
// compare
|
||||
if (test(lastPhase, phase, threshold)) {
|
||||
if (test(lastPhase, phase)) {
|
||||
// last iteration is three, return value
|
||||
if (iteration >= 3) break;
|
||||
// iterate recursively
|
||||
return this.getMoonTransition(threshold, phaseName, moonDate, iteration+1);
|
||||
return this.getMoonTransition(threshold, phaseName, moonDate, iteration + 1);
|
||||
}
|
||||
iterations++;
|
||||
iterations += 1;
|
||||
} while (iterations < 1000);
|
||||
|
||||
return {phase: phaseName, date: moonDate};
|
||||
return { phase: phaseName, date: moonDate };
|
||||
}
|
||||
|
||||
// use the color of the pixel to determine the outlook
|
||||
parseOutlooks(lat, lon, temp, precip) {
|
||||
const {DateTime} = luxon;
|
||||
static parseOutlooks(lat, lon, temp, precip) {
|
||||
const { DateTime } = luxon;
|
||||
const month = DateTime.local();
|
||||
const thisMonth = month.toLocaleString({month: 'short'});
|
||||
const nextMonth = month.plus({months: 1}).toLocaleString({month: 'short'});
|
||||
const thisMonth = month.toLocaleString({ month: 'short' });
|
||||
const nextMonth = month.plus({ months: 1 }).toLocaleString({ month: 'short' });
|
||||
|
||||
// draw the images on the canvases
|
||||
const tempContext = utils.image.drawLocalCanvas(temp);
|
||||
const precipContext = utils.image.drawLocalCanvas(precip);
|
||||
|
||||
// get the color from each canvas
|
||||
const tempColor = this.getOutlookColor(lat, lon, tempContext);
|
||||
const precipColor = this.getOutlookColor(lat, lon, precipContext);
|
||||
const tempColor = Almanac.getOutlookColor(lat, lon, tempContext);
|
||||
const precipColor = Almanac.getOutlookColor(lat, lon, precipContext);
|
||||
|
||||
return {
|
||||
thisMonth,
|
||||
nextMonth,
|
||||
temperature: this.getOutlookTemperatureIndicator(tempColor),
|
||||
precipitation: this.getOutlookPrecipitationIndicator(precipColor),
|
||||
temperature: Almanac.getOutlookTemperatureIndicator(tempColor),
|
||||
precipitation: Almanac.getOutlookPrecipitationIndicator(precipColor),
|
||||
};
|
||||
}
|
||||
|
||||
getOutlookColor (lat, lon, context) {
|
||||
static getOutlookColor(lat, lon, context) {
|
||||
let x = 0;
|
||||
let y = 0;
|
||||
|
||||
@@ -195,11 +193,11 @@ class Almanac extends WeatherDisplay {
|
||||
|
||||
// Determine if there is any "non-white" colors around the area.
|
||||
// Search a 16x16 region.
|
||||
for (let colorX = x - 8; colorX <= x + 8; colorX++) {
|
||||
for (let colorY = y - 8; colorY <= y + 8; colorY++) {
|
||||
const pixelColor = this.getPixelColor(context, colorX, colorY);
|
||||
if ((pixelColor.r !== 0 && pixelColor.g !== 0 && pixelColor.b !== 0) ||
|
||||
(pixelColor.r !== 255 && pixelColor.g !== 255 && pixelColor.b !== 255)) {
|
||||
for (let colorX = x - 8; colorX <= x + 8; colorX += 1) {
|
||||
for (let colorY = y - 8; colorY <= y + 8; colorY += 1) {
|
||||
const pixelColor = Almanac.getPixelColor(context, colorX, colorY);
|
||||
if ((pixelColor.r !== 0 && pixelColor.g !== 0 && pixelColor.b !== 0)
|
||||
|| (pixelColor.r !== 255 && pixelColor.g !== 255 && pixelColor.b !== 255)) {
|
||||
return pixelColor;
|
||||
}
|
||||
}
|
||||
@@ -209,7 +207,7 @@ class Almanac extends WeatherDisplay {
|
||||
}
|
||||
|
||||
// get rgb values of a pixel
|
||||
getPixelColor (context, x, y) {
|
||||
static getPixelColor(context, x, y) {
|
||||
const pixelData = context.getImageData(x, y, 1, 1).data;
|
||||
return {
|
||||
r: pixelData[0],
|
||||
@@ -219,33 +217,31 @@ class Almanac extends WeatherDisplay {
|
||||
}
|
||||
|
||||
// get temperature outlook from color
|
||||
getOutlookTemperatureIndicator(pixelColor) {
|
||||
static getOutlookTemperatureIndicator(pixelColor) {
|
||||
if (pixelColor.b > pixelColor.r) {
|
||||
return 'Below Normal';
|
||||
} else if (pixelColor.r > pixelColor.b) {
|
||||
} if (pixelColor.r > pixelColor.b) {
|
||||
return 'Above Normal';
|
||||
} else {
|
||||
return 'Normal';
|
||||
}
|
||||
return 'Normal';
|
||||
}
|
||||
|
||||
// get precipitation outlook from color
|
||||
getOutlookPrecipitationIndicator (pixelColor) {
|
||||
static getOutlookPrecipitationIndicator(pixelColor) {
|
||||
if (pixelColor.g > pixelColor.r) {
|
||||
return 'Above Normal';
|
||||
} else if (pixelColor.r > pixelColor.g) {
|
||||
} if (pixelColor.r > pixelColor.g) {
|
||||
return 'Below Normal';
|
||||
} else {
|
||||
return 'Normal';
|
||||
}
|
||||
return 'Normal';
|
||||
}
|
||||
|
||||
async drawCanvas() {
|
||||
super.drawCanvas();
|
||||
const info = this.data;
|
||||
const {DateTime} = luxon;
|
||||
const { DateTime } = luxon;
|
||||
const Today = DateTime.local();
|
||||
const Tomorrow = Today.plus({days: 1});
|
||||
const Tomorrow = Today.plus({ days: 1 });
|
||||
|
||||
// extract moon images
|
||||
const [FullMoonImage, LastMoonImage, NewMoonImage, FirstMoonImage] = await Promise.all(this.moonImages);
|
||||
@@ -261,8 +257,8 @@ class Almanac extends WeatherDisplay {
|
||||
|
||||
draw.titleText(this.context, 'Almanac', 'Astronomical');
|
||||
|
||||
draw.text(this.context, 'Star4000', '24pt', '#FFFF00', 320, 120, Today.toLocaleString({weekday: 'long'}), 2, 'center');
|
||||
draw.text(this.context, 'Star4000', '24pt', '#FFFF00', 500, 120, Tomorrow.toLocaleString({weekday: 'long'}), 2, 'center');
|
||||
draw.text(this.context, 'Star4000', '24pt', '#FFFF00', 320, 120, Today.toLocaleString({ weekday: 'long' }), 2, 'center');
|
||||
draw.text(this.context, 'Star4000', '24pt', '#FFFF00', 500, 120, Tomorrow.toLocaleString({ weekday: 'long' }), 2, 'center');
|
||||
|
||||
draw.text(this.context, 'Star4000', '24pt', '#FFFFFF', 70, 150, 'Sunrise:', 2);
|
||||
draw.text(this.context, 'Star4000', '24pt', '#FFFFFF', 270, 150, DateTime.fromJSDate(info.sun[0].sunrise).toLocaleString(DateTime.TIME_SIMPLE).toLowerCase(), 2);
|
||||
@@ -274,12 +270,11 @@ class Almanac extends WeatherDisplay {
|
||||
|
||||
draw.text(this.context, 'Star4000', '24pt', '#FFFF00', 70, 220, 'Moon Data:', 2);
|
||||
|
||||
|
||||
info.moon.forEach((MoonPhase, Index) => {
|
||||
const date = MoonPhase.date.toLocaleString({month: 'short', day: 'numeric'});
|
||||
const date = MoonPhase.date.toLocaleString({ month: 'short', day: 'numeric' });
|
||||
|
||||
draw.text(this.context, 'Star4000', '24pt', '#FFFFFF', 120+Index*130, 260, MoonPhase.phase, 2, 'center');
|
||||
draw.text(this.context, 'Star4000', '24pt', '#FFFFFF', 120+Index*130, 390, date, 2, 'center');
|
||||
draw.text(this.context, 'Star4000', '24pt', '#FFFFFF', 120 + Index * 130, 260, MoonPhase.phase, 2, 'center');
|
||||
draw.text(this.context, 'Star4000', '24pt', '#FFFFFF', 120 + Index * 130, 390, date, 2, 'center');
|
||||
|
||||
const image = (() => {
|
||||
switch (MoonPhase.phase) {
|
||||
@@ -294,11 +289,11 @@ class Almanac extends WeatherDisplay {
|
||||
return FirstMoonImage;
|
||||
}
|
||||
})();
|
||||
this.context.drawImage(image, 75+Index*130, 270);
|
||||
this.context.drawImage(image, 75 + Index * 130, 270);
|
||||
});
|
||||
break;
|
||||
|
||||
case 1:
|
||||
case 1: {
|
||||
this.context.drawImage(await this.backgroundImage1, 0, 0);
|
||||
draw.horizontalGradientSingle(this.context, 0, 30, 500, 90, draw.topColor1, draw.topColor2);
|
||||
draw.triangle(this.context, 'rgb(28, 10, 87)', 500, 30, 450, 90, 500, 90);
|
||||
@@ -309,14 +304,15 @@ class Almanac extends WeatherDisplay {
|
||||
|
||||
draw.text(this.context, 'Star4000', '24pt', '#FFFFFF', 320, 180, '30 Day Outlook', 2, 'center');
|
||||
|
||||
var DateRange = 'MID-' + info.outlook.thisMonth.toUpperCase() + ' TO MID-' + info.outlook.nextMonth.toUpperCase();
|
||||
const DateRange = `MID-${info.outlook.thisMonth.toUpperCase()} TO MID-${info.outlook.nextMonth.toUpperCase()}`;
|
||||
draw.text(this.context, 'Star4000', '24pt', '#FFFFFF', 320, 220, DateRange, 2, 'center');
|
||||
|
||||
var Temperature = info.outlook.temperature;
|
||||
draw.text(this.context, 'Star4000', '24pt', '#FFFFFF', 70, 300, 'Temperatures: ' + Temperature, 2);
|
||||
const Temperature = info.outlook.temperature;
|
||||
draw.text(this.context, 'Star4000', '24pt', '#FFFFFF', 70, 300, `Temperatures: ${Temperature}`, 2);
|
||||
|
||||
var Precipitation = info.outlook.precipitation;
|
||||
draw.text(this.context, 'Star4000', '24pt', '#FFFFFF', 70, 380, 'Precipitation: ' + Precipitation, 2);
|
||||
const Precipitation = info.outlook.precipitation;
|
||||
draw.text(this.context, 'Star4000', '24pt', '#FFFFFF', 70, 380, `Precipitation: ${Precipitation}`, 2);
|
||||
}
|
||||
}
|
||||
|
||||
this.finishDraw();
|
||||
@@ -331,4 +327,4 @@ class Almanac extends WeatherDisplay {
|
||||
this.getDataCallbacks.push(resolve);
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user