From adb8de97546a6dd07773717d6380ea1a8f7a7f56 Mon Sep 17 00:00:00 2001 From: Thomas Bachmann Date: Wed, 4 Jan 2017 10:46:31 +0100 Subject: [PATCH 1/9] Enabled newsfeed default module for gesture events from https://github.com/thobach/MMM-Gestures --- modules/default/newsfeed/newsfeed.js | 101 ++++++++++++++++++++++++--- 1 file changed, 93 insertions(+), 8 deletions(-) diff --git a/modules/default/newsfeed/newsfeed.js b/modules/default/newsfeed/newsfeed.js index 74014208..152505dc 100644 --- a/modules/default/newsfeed/newsfeed.js +++ b/modules/default/newsfeed/newsfeed.js @@ -89,7 +89,8 @@ Module.register("newsfeed",{ if (this.newsItems.length > 0) { - if (this.config.showSourceTitle || this.config.showPublishDate) { + // this.config.showFullArticle is a run-time configuration, triggered by optional gestures + if (!this.config.showFullArticle && (this.config.showSourceTitle || this.config.showPublishDate)) { var sourceAndTimestamp = document.createElement("div"); sourceAndTimestamp.className = "light small dimmed"; @@ -151,18 +152,32 @@ Module.register("newsfeed",{ } } - - var title = document.createElement("div"); - title.className = "bright medium light"; - title.innerHTML = this.newsItems[this.activeItem].title; - wrapper.appendChild(title); - + + if(!this.config.showFullArticle){ + var title = document.createElement("div"); + title.className = "bright medium light"; + title.innerHTML = this.newsItems[this.activeItem].title; + wrapper.appendChild(title); + } + if (this.config.showDescription) { var description = document.createElement("div"); description.className = "small light"; description.innerHTML = this.newsItems[this.activeItem].description; wrapper.appendChild(description); } + + if (this.config.showFullArticle) { + var fullArticle = document.createElement("iframe"); + fullArticle.className = ""; + fullArticle.style.width = "100%"; + fullArticle.style.height = "1735px"; + fullArticle.style.border = "none"; + fullArticle.src = this.newsItems[this.activeItem].url; + wrapper.appendChild(fullArticle); + } + + } else { wrapper.innerHTML = this.translate("LOADING"); @@ -256,7 +271,7 @@ Module.register("newsfeed",{ self.updateDom(self.config.animationSpeed); - setInterval(function() { + timer = setInterval(function() { self.activeItem++; self.updateDom(self.config.animationSpeed); }, this.config.updateInterval); @@ -272,6 +287,76 @@ Module.register("newsfeed",{ capitalizeFirstLetter: function(string) { return string.charAt(0).toUpperCase() + string.slice(1); }, + + notificationReceived: function(notification, payload, sender) { + Log.info(this.name + " - received event"); + if(notification == 'GESTURE'){ + Log.info(this.name + " - received gesture"); + var gesture = payload.gesture; + // actually RIGHT, because gesture sensor is built in upside down + if(gesture == 'LEFT'){ + Log.info(this.name + " - received right"); + var before = this.activeItem; + this.activeItem++; + if (this.activeItem >= this.newsItems.length) { + this.activeItem = 0; + } + this.config.showDescription = false; + this.config.showFullArticle = false; + if(!timer){ + this.scheduleUpdateInterval(); + } + Log.info(this.name + " - going from " + before + " to " + this.activeItem + " (of " + this.newsItems.length + ")"); + this.updateDom(100); + } + // actually LEFT, because gesture sensor is built in upside down + else if(gesture == 'RIGHT'){ + Log.info(this.name + " - received left"); + var before = this.activeItem; + this.activeItem--; + if (this.activeItem < 0) { + this.activeItem = this.newsItems.length - 1; + } + this.config.showDescription = false; + this.config.showFullArticle = false; + if(!timer){ + this.scheduleUpdateInterval(); + } + Log.info(this.name + " - going from " + before + " to " + this.activeItem + " (of " + this.newsItems.length + ")"); + this.updateDom(100); + } + // actually UP, because gesture sensor is built in upside down + else if(gesture == 'DOWN' && !this.config.showDescription){ + Log.info(this.name + " - received up"); + this.config.showDescription = true; + this.config.showFullArticle = false; + clearInterval(timer); + timer = null; + this.updateDom(100); + } + // actually DOWN, because gesture sensor is built in upside down + else if(gesture == 'UP'){ + Log.info(this.name + " - received down"); + this.config.showDescription = false; + this.config.showFullArticle = false; + if(!timer){ + this.scheduleUpdateInterval(); + } + this.updateDom(100); + } + // actually UP, because gesture sensor is built in upside down + else if(gesture == 'DOWN' && this.config.showDescription){ + Log.info(this.name + " - received up again"); + this.config.showFullArticle = true; + this.config.showDescription = false; + clearInterval(timer); + timer = null; + this.updateDom(100); + } else { + Log.info(this.name + " - received other: " + gesture); + } + } + }, }); From 0099b6d4a2df5f9741560a237420b57f98cde343 Mon Sep 17 00:00:00 2001 From: Thomas Bachmann Date: Wed, 4 Jan 2017 10:56:03 +0100 Subject: [PATCH 2/9] Added change to CHANGELOG.md --- CHANGELOG.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index b9551b79..fea09a07 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,9 @@ All notable changes to this project will be documented in this file. This project adheres to [Semantic Versioning](http://semver.org/). +## [develop] - release date to be defined +- Made default newsfeed module aware of gesture events from https://github.com/thobach/MMM-Gestures + ## [2.1.0] - 2016-12-31 **Note:** This update uses new dependencies. Please update using the following command: `git pull && npm install` From 6251b77b288c43e235ba6b0e6baacc20073bcf64 Mon Sep 17 00:00:00 2001 From: Thomas Bachmann Date: Wed, 4 Jan 2017 11:01:07 +0100 Subject: [PATCH 3/9] Fixed code formatting issues --- modules/default/newsfeed/newsfeed.js | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/modules/default/newsfeed/newsfeed.js b/modules/default/newsfeed/newsfeed.js index 152505dc..0fdc9220 100644 --- a/modules/default/newsfeed/newsfeed.js +++ b/modules/default/newsfeed/newsfeed.js @@ -152,21 +152,21 @@ Module.register("newsfeed",{ } } - + if(!this.config.showFullArticle){ var title = document.createElement("div"); title.className = "bright medium light"; title.innerHTML = this.newsItems[this.activeItem].title; wrapper.appendChild(title); } - + if (this.config.showDescription) { var description = document.createElement("div"); description.className = "small light"; description.innerHTML = this.newsItems[this.activeItem].description; wrapper.appendChild(description); } - + if (this.config.showFullArticle) { var fullArticle = document.createElement("iframe"); fullArticle.className = ""; @@ -176,8 +176,8 @@ Module.register("newsfeed",{ fullArticle.src = this.newsItems[this.activeItem].url; wrapper.appendChild(fullArticle); } - - + + } else { wrapper.innerHTML = this.translate("LOADING"); @@ -287,14 +287,14 @@ Module.register("newsfeed",{ capitalizeFirstLetter: function(string) { return string.charAt(0).toUpperCase() + string.slice(1); }, - + notificationReceived: function(notification, payload, sender) { Log.info(this.name + " - received event"); - if(notification == 'GESTURE'){ + if(notification == "GESTURE"){ Log.info(this.name + " - received gesture"); var gesture = payload.gesture; // actually RIGHT, because gesture sensor is built in upside down - if(gesture == 'LEFT'){ + if(gesture == "LEFT"){ Log.info(this.name + " - received right"); var before = this.activeItem; this.activeItem++; @@ -310,7 +310,7 @@ Module.register("newsfeed",{ this.updateDom(100); } // actually LEFT, because gesture sensor is built in upside down - else if(gesture == 'RIGHT'){ + else if(gesture == "RIGHT"){ Log.info(this.name + " - received left"); var before = this.activeItem; this.activeItem--; @@ -326,7 +326,7 @@ Module.register("newsfeed",{ this.updateDom(100); } // actually UP, because gesture sensor is built in upside down - else if(gesture == 'DOWN' && !this.config.showDescription){ + else if(gesture == "DOWN" && !this.config.showDescription){ Log.info(this.name + " - received up"); this.config.showDescription = true; this.config.showFullArticle = false; @@ -335,7 +335,7 @@ Module.register("newsfeed",{ this.updateDom(100); } // actually DOWN, because gesture sensor is built in upside down - else if(gesture == 'UP'){ + else if(gesture == "UP"){ Log.info(this.name + " - received down"); this.config.showDescription = false; this.config.showFullArticle = false; @@ -345,7 +345,7 @@ Module.register("newsfeed",{ this.updateDom(100); } // actually UP, because gesture sensor is built in upside down - else if(gesture == 'DOWN' && this.config.showDescription){ + else if(gesture == "DOWN" && this.config.showDescription){ Log.info(this.name + " - received up again"); this.config.showFullArticle = true; this.config.showDescription = false; From 09531b399a5b992b9c7080c0371487ae899ffcb7 Mon Sep 17 00:00:00 2001 From: Thomas Bachmann Date: Wed, 4 Jan 2017 11:04:33 +0100 Subject: [PATCH 4/9] Fixed Link formatting in MD --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index fea09a07..bcb6b70a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,7 +3,7 @@ All notable changes to this project will be documented in this file. This project adheres to [Semantic Versioning](http://semver.org/). ## [develop] - release date to be defined -- Made default newsfeed module aware of gesture events from https://github.com/thobach/MMM-Gestures +- Made default newsfeed module aware of gesture events from [MMM-Gestures](https://github.com/thobach/MMM-Gestures) ## [2.1.0] - 2016-12-31 From b8a72245dc93d59f026a499dfe76883e877a21e2 Mon Sep 17 00:00:00 2001 From: Thomas Bachmann Date: Fri, 6 Jan 2017 21:57:30 +0100 Subject: [PATCH 5/9] Using generic news feed events as notifications, instead of more implementation specific gestures from sensor --- modules/default/newsfeed/newsfeed.js | 114 ++++++++++++--------------- 1 file changed, 51 insertions(+), 63 deletions(-) diff --git a/modules/default/newsfeed/newsfeed.js b/modules/default/newsfeed/newsfeed.js index 0fdc9220..28bc4a0e 100644 --- a/modules/default/newsfeed/newsfeed.js +++ b/modules/default/newsfeed/newsfeed.js @@ -89,7 +89,7 @@ Module.register("newsfeed",{ if (this.newsItems.length > 0) { - // this.config.showFullArticle is a run-time configuration, triggered by optional gestures + // this.config.showFullArticle is a run-time configuration, triggered by optional notifications if (!this.config.showFullArticle && (this.config.showSourceTitle || this.config.showPublishDate)) { var sourceAndTimestamp = document.createElement("div"); sourceAndTimestamp.className = "light small dimmed"; @@ -289,74 +289,62 @@ Module.register("newsfeed",{ }, notificationReceived: function(notification, payload, sender) { - Log.info(this.name + " - received event"); - if(notification == "GESTURE"){ - Log.info(this.name + " - received gesture"); - var gesture = payload.gesture; - // actually RIGHT, because gesture sensor is built in upside down - if(gesture == "LEFT"){ - Log.info(this.name + " - received right"); - var before = this.activeItem; - this.activeItem++; - if (this.activeItem >= this.newsItems.length) { - this.activeItem = 0; - } - this.config.showDescription = false; - this.config.showFullArticle = false; - if(!timer){ - this.scheduleUpdateInterval(); - } - Log.info(this.name + " - going from " + before + " to " + this.activeItem + " (of " + this.newsItems.length + ")"); - this.updateDom(100); + Log.info(this.name + " - received notification: " + notification); + if(notification == "ARTICLE_NEXT"){ + var before = this.activeItem; + this.activeItem++; + if (this.activeItem >= this.newsItems.length) { + this.activeItem = 0; } - // actually LEFT, because gesture sensor is built in upside down - else if(gesture == "RIGHT"){ - Log.info(this.name + " - received left"); - var before = this.activeItem; - this.activeItem--; - if (this.activeItem < 0) { - this.activeItem = this.newsItems.length - 1; - } - this.config.showDescription = false; - this.config.showFullArticle = false; - if(!timer){ - this.scheduleUpdateInterval(); - } - Log.info(this.name + " - going from " + before + " to " + this.activeItem + " (of " + this.newsItems.length + ")"); - this.updateDom(100); + this.config.showDescription = false; + this.config.showFullArticle = false; + if(!timer){ + this.scheduleUpdateInterval(); } - // actually UP, because gesture sensor is built in upside down - else if(gesture == "DOWN" && !this.config.showDescription){ - Log.info(this.name + " - received up"); - this.config.showDescription = true; - this.config.showFullArticle = false; - clearInterval(timer); - timer = null; - this.updateDom(100); + Log.info(this.name + " - going from article #" + before + " to #" + this.activeItem + " (of " + this.newsItems.length + ")"); + this.updateDom(100); + } else if(notification == "ARTICLE_PREVIOUS"){ + var before = this.activeItem; + this.activeItem--; + if (this.activeItem < 0) { + this.activeItem = this.newsItems.length - 1; } - // actually DOWN, because gesture sensor is built in upside down - else if(gesture == "UP"){ - Log.info(this.name + " - received down"); - this.config.showDescription = false; - this.config.showFullArticle = false; - if(!timer){ - this.scheduleUpdateInterval(); - } - this.updateDom(100); + this.config.showDescription = false; + this.config.showFullArticle = false; + if(!timer){ + this.scheduleUpdateInterval(); } - // actually UP, because gesture sensor is built in upside down - else if(gesture == "DOWN" && this.config.showDescription){ - Log.info(this.name + " - received up again"); - this.config.showFullArticle = true; - this.config.showDescription = false; - clearInterval(timer); - timer = null; - this.updateDom(100); - } else { - Log.info(this.name + " - received other: " + gesture); + Log.info(this.name + " - going from article #" + before + " to #" + this.activeItem + " (of " + this.newsItems.length + ")"); + this.updateDom(100); + } + // received "more details" the first time, so showing article summary + else if(notification == "ARTICLE_MORE_DETAILS" && !this.config.showDescription){ + this.config.showDescription = true; + this.config.showFullArticle = false; + clearInterval(timer); + timer = null; + Log.info(this.name + " - showing article description"); + this.updateDom(100); + } else if(notification == "ARTICLE_LESS_DETAILS"){ + this.config.showDescription = false; + this.config.showFullArticle = false; + if(!timer){ + this.scheduleUpdateInterval(); } + Log.info(this.name + " - showing only article titles again"); + this.updateDom(100); + } + // received "more details" a second time, so showing full article + else if(notification == "ARTICLE_MORE_DETAILS" && this.config.showDescription){ + this.config.showFullArticle = true; + this.config.showDescription = false; + clearInterval(timer); + timer = null; + Log.info(this.name + " - showing full article"); + this.updateDom(100); + } else { + Log.info(this.name + " - unknown notification, ignoring: " + notification); } }, - }); From 443a90c7baec08f3254912ba428e2eea717eb887 Mon Sep 17 00:00:00 2001 From: Thomas Bachmann Date: Sat, 7 Jan 2017 22:42:11 +0100 Subject: [PATCH 6/9] Made full article view of news full-screen on any screen size --- modules/default/newsfeed/newsfeed.js | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/modules/default/newsfeed/newsfeed.js b/modules/default/newsfeed/newsfeed.js index 28bc4a0e..55f2de58 100644 --- a/modules/default/newsfeed/newsfeed.js +++ b/modules/default/newsfeed/newsfeed.js @@ -171,7 +171,10 @@ Module.register("newsfeed",{ var fullArticle = document.createElement("iframe"); fullArticle.className = ""; fullArticle.style.width = "100%"; - fullArticle.style.height = "1735px"; + fullArticle.style.top = "0"; + fullArticle.style.left = "0"; + fullArticle.style.position = "fixed"; + fullArticle.height = window.innerHeight; fullArticle.style.border = "none"; fullArticle.src = this.newsItems[this.activeItem].url; wrapper.appendChild(fullArticle); From 456502893ca94234bba8965b04e86db61158edd4 Mon Sep 17 00:00:00 2001 From: Thomas Bachmann Date: Sun, 8 Jan 2017 14:38:16 +0100 Subject: [PATCH 7/9] Addressed code review comments to reduce redundant lines --- modules/default/newsfeed/newsfeed.js | 45 ++++++++++------------------ 1 file changed, 16 insertions(+), 29 deletions(-) diff --git a/modules/default/newsfeed/newsfeed.js b/modules/default/newsfeed/newsfeed.js index 55f2de58..aed917f8 100644 --- a/modules/default/newsfeed/newsfeed.js +++ b/modules/default/newsfeed/newsfeed.js @@ -291,6 +291,14 @@ Module.register("newsfeed",{ return string.charAt(0).toUpperCase() + string.slice(1); }, + resetDescrOrFullArticleAndTimer: function() { + this.config.showDescription = false; + this.config.showFullArticle = false; + if(!timer){ + this.scheduleUpdateInterval(); + } + }, + notificationReceived: function(notification, payload, sender) { Log.info(this.name + " - received notification: " + notification); if(notification == "ARTICLE_NEXT"){ @@ -299,11 +307,7 @@ Module.register("newsfeed",{ if (this.activeItem >= this.newsItems.length) { this.activeItem = 0; } - this.config.showDescription = false; - this.config.showFullArticle = false; - if(!timer){ - this.scheduleUpdateInterval(); - } + this.resetDescrOrFullArticleAndTimer(); Log.info(this.name + " - going from article #" + before + " to #" + this.activeItem + " (of " + this.newsItems.length + ")"); this.updateDom(100); } else if(notification == "ARTICLE_PREVIOUS"){ @@ -312,39 +316,22 @@ Module.register("newsfeed",{ if (this.activeItem < 0) { this.activeItem = this.newsItems.length - 1; } - this.config.showDescription = false; - this.config.showFullArticle = false; - if(!timer){ - this.scheduleUpdateInterval(); - } + this.resetDescrOrFullArticleAndTimer(); Log.info(this.name + " - going from article #" + before + " to #" + this.activeItem + " (of " + this.newsItems.length + ")"); this.updateDom(100); } - // received "more details" the first time, so showing article summary - else if(notification == "ARTICLE_MORE_DETAILS" && !this.config.showDescription){ - this.config.showDescription = true; - this.config.showFullArticle = false; + // if "more details" is received the first time: show article summary, on second time show full article + else if(notification == "ARTICLE_MORE_DETAILS"){ + this.config.showDescription = !this.config.showDescription; + this.config.showFullArticle = !this.config.showDescription; clearInterval(timer); timer = null; - Log.info(this.name + " - showing article description"); + Log.info(this.name + " - showing " + this.config.showDescription ? "article description" : "full article"); this.updateDom(100); } else if(notification == "ARTICLE_LESS_DETAILS"){ - this.config.showDescription = false; - this.config.showFullArticle = false; - if(!timer){ - this.scheduleUpdateInterval(); - } + this.resetDescrOrFullArticleAndTimer(); Log.info(this.name + " - showing only article titles again"); this.updateDom(100); - } - // received "more details" a second time, so showing full article - else if(notification == "ARTICLE_MORE_DETAILS" && this.config.showDescription){ - this.config.showFullArticle = true; - this.config.showDescription = false; - clearInterval(timer); - timer = null; - Log.info(this.name + " - showing full article"); - this.updateDom(100); } else { Log.info(this.name + " - unknown notification, ignoring: " + notification); } From c302030301900c037e9bb089a819afc08608875c Mon Sep 17 00:00:00 2001 From: Thomas Bachmann Date: Wed, 11 Jan 2017 11:19:33 +0100 Subject: [PATCH 8/9] Added documentation on supported notifications and related third party modules --- modules/default/newsfeed/README.md | 48 +++++++++++++++++++++++++++++- 1 file changed, 47 insertions(+), 1 deletion(-) diff --git a/modules/default/newsfeed/README.md b/modules/default/newsfeed/README.md index 58c7b9ae..8a0fec25 100644 --- a/modules/default/newsfeed/README.md +++ b/modules/default/newsfeed/README.md @@ -1,9 +1,10 @@ # Module: News Feed The `newsfeed ` module is one of the default modules of the MagicMirror. -This module displays news headlines based on an RSS feed. +This module displays news headlines based on an RSS feed. Scrolling through news headlines happens time-based (````updateInterval````), but can also be controlled by sending news feed specific notifications to the module. ## Using the module +### Configuration To use this module, add it to the modules array in the `config/config.js` file: ````javascript modules: [ @@ -30,6 +31,51 @@ modules: [ ] ```` +### Notifications +#### Interacting with the module +MagicMirror's [notification mechanism](https://github.com/MichMich/MagicMirror/tree/master/modules#thissendnotificationnotification-payload) allows to send notifications to the ````newsfeed```` module. The following notifications are supported: + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Notification IdentifierDescription
ARTICLE_NEXTShows the next news title (hiding the summary or previously fully displayed article)
ARTICLE_PREVIOUSShows the previous news title (hiding the summary or previously fully displayed article)
ARTICLE_MORE_DETAILS

When received the *first time*, shows the corresponding description of the currently displayed news title.
The module expects that the module's configuration option ````showDescription```` is set to ````false```` (default value).

+ When received a *second consecutive time*, shows the full news article in an IFRAME.
+ This requires that the news page can be embedded in an IFRAME, e.g. doesn't have the HTTP response header [X-Frame-Options](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/X-Frame-Options) set to e.g. ````DENY````.
ARTICLE_LESS_DETAILSHides the summary or full news article and only displays the news title of the currently viewed news item.
+ +Note the payload of the sent notification event is ignored. + +#### Example +The following example shows how the next news article title can be displayed on the MagicMirror. +````javascript +this.sendNotification('ARTICLE_NEXT'); +```` + +#### ````newsfeed```` specific notification emitting modules +The third party [MMM-Gestures](https://github.com/thobach/MMM-Gestures) module supports above notifications when moving your hand up, down, left or right in front of a gesture sensor attached to the MagicMirror. See module's readme for more details. + ## Configuration options The following properties can be configured: From 3ba16f17734c7da7aa8505943dd03d155bb732e0 Mon Sep 17 00:00:00 2001 From: Thomas Bachmann Date: Wed, 11 Jan 2017 11:32:20 +0100 Subject: [PATCH 9/9] Merge remote-tracking branch 'MichMich/develop' --- .gitignore | 1 + CHANGELOG.md | 12 ++++- LICENSE.md | 2 +- installers/raspberry.sh | 3 ++ js/app.js | 54 ++++++++++++++--------- js/electron.js | 3 +- modules/README.md | 15 +++++++ modules/default/newsfeed/fetcher.js | 7 ++- modules/node_modules/node_helper/index.js | 5 +++ package.json | 2 +- 10 files changed, 79 insertions(+), 25 deletions(-) diff --git a/.gitignore b/.gitignore index 67feae54..1e17ef8b 100644 --- a/.gitignore +++ b/.gitignore @@ -59,6 +59,7 @@ Temporary Items # Ignore all modules except the default modules. /modules/** +!/modules/default !/modules/default/** !/modules/README.md** diff --git a/CHANGELOG.md b/CHANGELOG.md index bcb6b70a..65119703 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,9 +2,19 @@ All notable changes to this project will be documented in this file. This project adheres to [Semantic Versioning](http://semver.org/). -## [develop] - release date to be defined +## [2.1.1] - Unreleased + +### Changed +- Installer: Use init config.js from config.js.sample. + +### Added +- Add loaded function to modules, providing an async callback. - Made default newsfeed module aware of gesture events from [MMM-Gestures](https://github.com/thobach/MMM-Gestures) +### Fixed +- Update .gitignore to not ignore default modules folder. +- Remove white flash on boot up. + ## [2.1.0] - 2016-12-31 **Note:** This update uses new dependencies. Please update using the following command: `git pull && npm install` diff --git a/LICENSE.md b/LICENSE.md index d4765af2..09ac7e6f 100644 --- a/LICENSE.md +++ b/LICENSE.md @@ -1,7 +1,7 @@ The MIT License (MIT) ===================== -Copyright © 2016 Michael Teeuw +Copyright © 2016-2017 Michael Teeuw Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation diff --git a/installers/raspberry.sh b/installers/raspberry.sh index cd995a1e..b970d02e 100644 --- a/installers/raspberry.sh +++ b/installers/raspberry.sh @@ -113,6 +113,9 @@ else exit; fi +# Use sample config for start MagicMirror +cp config/config.js.sample config/config.js + # Check if plymouth is installed (default with PIXEL desktop environment), then install custom splashscreen. echo -e "\e[96mCheck plymouth installation ...\e[0m" if command_exists plymouth; then diff --git a/js/app.js b/js/app.js index ba6cd1a9..91149906 100644 --- a/js/app.js +++ b/js/app.js @@ -66,7 +66,7 @@ var App = function() { * * argument module string - The name of the module (including subpath). */ - var loadModule = function(module) { + var loadModule = function(module, callback) { var elements = module.split("/"); var moduleName = elements[elements.length - 1]; @@ -103,6 +103,10 @@ var App = function() { m.setName(moduleName); m.setPath(path.resolve(moduleFolder)); nodeHelpers.push(m); + + m.loaded(callback); + } else { + callback(); } }; @@ -111,14 +115,24 @@ var App = function() { * * argument module string - The name of the module (including subpath). */ - var loadModules = function(modules) { + var loadModules = function(modules, callback) { console.log("Loading module helpers ..."); - for (var m in modules) { - loadModule(modules[m]); - } + var loadNextModule = function() { + if (modules.length > 0) { + var nextModule = modules[0]; + loadModule(nextModule, function() { + modules = modules.slice(1); + loadNextModule(); + }); + } else { + // All modules are loaded + console.log("All module helpers loaded."); + callback(); + } + }; - console.log("All module helpers loaded."); + loadNextModule(); }; /* cmpVersions(a,b) @@ -164,24 +178,24 @@ var App = function() { } } - loadModules(modules); + loadModules(modules, function() { + var server = new Server(config, function(app, io) { + console.log("Server started ..."); - var server = new Server(config, function(app, io) { - console.log("Server started ..."); + for (var h in nodeHelpers) { + var nodeHelper = nodeHelpers[h]; + nodeHelper.setExpressApp(app); + nodeHelper.setSocketIO(io); + nodeHelper.start(); + } - for (var h in nodeHelpers) { - var nodeHelper = nodeHelpers[h]; - nodeHelper.setExpressApp(app); - nodeHelper.setSocketIO(io); - nodeHelper.start(); - } + console.log("Sockets connected & modules started ..."); - console.log("Sockets connected & modules started ..."); - - if (typeof callback === "function") { - callback(config); - } + if (typeof callback === "function") { + callback(config); + } + }); }); }); }; diff --git a/js/electron.js b/js/electron.js index 173abe68..1f16092b 100644 --- a/js/electron.js +++ b/js/electron.js @@ -28,7 +28,8 @@ function createWindow() { webPreferences: { nodeIntegration: false, zoomFactor: config.zoom - } + }, + backgroundColor: "#000000" } // DEPRECATED: "kioskmode" backwards compatibility, to be removed diff --git a/modules/README.md b/modules/README.md index 42a31dfa..03664b15 100644 --- a/modules/README.md +++ b/modules/README.md @@ -96,6 +96,21 @@ requiresVersion: "2.1.0", ####`init()` This method is called when a module gets instantiated. In most cases you do not need to subclass this method. +####`loaded(callback)` + +*Introduced in version: 2.1.1.* + +This method is called when a module is loaded. Subsequent modules in the config are not yet loaded. The `callback` function MUST be called when the module is done loading. In most cases you do not need to subclass this method. + +**Example:** +````javascript +loaded: function(callback) { + this.finishLoading(); + Log.log(this.name + ' is loaded!'); + callback(); +} +```` + ####`start()` This method is called when all modules are loaded an the system is ready to boot up. Keep in mind that the dom object for the module is not yet created. The start method is a perfect place to define any additional module properties: diff --git a/modules/default/newsfeed/fetcher.js b/modules/default/newsfeed/fetcher.js index b7511de9..f4fb44d9 100644 --- a/modules/default/newsfeed/fetcher.js +++ b/modules/default/newsfeed/fetcher.js @@ -85,7 +85,12 @@ var Fetcher = function(url, reloadInterval, encoding) { nodeVersion = Number(process.version.match(/^v(\d+\.\d+)/)[1]); headers = {"User-Agent": "Mozilla/5.0 (Node.js "+ nodeVersion + ") MagicMirror/" + global.version + " (https://github.com/MichMich/MagicMirror/)"} - request({uri: url, encoding: null, headers: headers}).pipe(iconv.decodeStream(encoding)).pipe(parser); + request({uri: url, encoding: null, headers: headers}) + .on("error", function(error) { + fetchFailedCallback(self, error); + scheduleTimer(); + }) + .pipe(iconv.decodeStream(encoding)).pipe(parser); }; diff --git a/modules/node_modules/node_helper/index.js b/modules/node_modules/node_helper/index.js index dc57ef36..bdeccf8b 100644 --- a/modules/node_modules/node_helper/index.js +++ b/modules/node_modules/node_helper/index.js @@ -14,6 +14,11 @@ NodeHelper = Class.extend({ console.log("Initializing new module helper ..."); }, + loaded: function(callback) { + console.log("Module helper loaded: " + this.name); + callback(); + }, + start: function() { console.log("Staring module helper: " + this.name); }, diff --git a/package.json b/package.json index 118c9837..54c60f92 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "magicmirror", - "version": "2.1.0", + "version": "2.1.1", "description": "A modular interface for smart mirrors.", "main": "js/electron.js", "scripts": {