/* globals draw, navigation, utils */ // eslint-disable-next-line no-unused-vars const currentWeatherScroll = (() => { // constants const degree = String.fromCharCode(176); // local variables let context; // currently active context let blankDrawArea; // original state of context let interval; let screenIndex = 0; // start drawing conditions // reset starts from the first item in the text scroll list const start = (_context) => { // store see if the context is new if (context && _context !== context) { // clean the outgoing context cleanLastContext(); // store the new blank context blankDrawArea = _context.getImageData(0, 405, 640, 75); } // store the context locally context = _context; // set up the interval if needed if (!interval) { interval = setInterval(incrementInterval, 4000); } // draw the data drawScreen(); }; const stop = (reset) => { cleanLastContext(); if (interval) interval = clearInterval(interval); if (reset) screenIndex = 0; }; const cleanLastContext = () => { if (!context) return; if (blankDrawArea) context.putImageData(blankDrawArea, 0, 405); blankDrawArea = undefined; context = undefined; }; // increment interval, roll over const incrementInterval = () => { screenIndex = (screenIndex + 1) % (screens.length); // draw new text drawScreen(); }; const drawScreen = async () => { // get the conditions const data = await navigation.getCurrentWeather(); // nothing to do if there's no data yet if (!data) return; // clean up any old text if (context) context.putImageData(blankDrawArea, 0, 405); drawCondition(screens[screenIndex](data)); }; // the "screens" are stored in an array for easy addition and removal const screens = [ // station name (data) => `Conditions at ${utils.string.locationCleanup(data.station.properties.name).substr(0, 20)}`, // temperature (data) => { let text = `Temp: ${data.Temperature}${degree} ${data.TemperatureUnit}`; if (data.observations.heatIndex.value) { text += ` Heat Index: ${data.HeatIndex}${degree} ${data.TemperatureUnit}`; } else if (data.observations.windChill.value) { text += ` Wind Chill: ${data.WindChill}${degree} ${data.TemperatureUnit}`; } return text; }, // humidity (data) => `Humidity: ${data.Humidity}${degree} ${data.TemperatureUnit} Dewpoint: ${data.DewPoint}${degree} ${data.TemperatureUnit}`, // barometric pressure (data) => `Barometric Pressure: ${data.Pressure} ${data.PressureDirection}`, // wind (data) => { let text = ''; if (data.WindSpeed > 0) { text = `Wind: ${data.WindDirection} ${data.WindSpeed} ${data.WindUnit}`; } else { text = 'Wind: Calm'; } if (data.WindGust > 0) { text += ` Gusts to ${data.WindGust}`; } return text; }, // visibility (data) => `Visib: ${data.Visibility} ${data.VisibilityUnit} Ceiling: ${data.Ceiling === 0 ? 'Unlimited' : `${data.Ceiling} ${data.CeilingUnit}`}`, ]; // internal draw function with preset parameters const drawCondition = (text) => { if (context) { draw.text(context, 'Star4000', '24pt', '#ffffff', 70, 430, text, 2); } // update all html scroll elements utils.elem.forEach('.weather-display .scroll .fixed', (elem) => { elem.innerHTML = text; }); }; // return the api return { start, stop, }; })();