Étape 2 :
Code source
Comme d’habitude, je vais commencer avec le code source, qui se trouve sur github. Voici un miroir local, juste au cas où le code source d’un bijou Muni de prochaine patché est ici.
Comment faire pour exécuter
Il y a une petite documentation dans le fichier README, et exemples de ligne de commande sont dans le script de démarrage du démon pour ce spec. fondamentalement, que vous sélectionnez un arrêt sur nextmuni.com pour trouver votre ID d’arrêt et exécuter client/client.rb--stopId 12345. Alternativement, vous pouvez exécuter un tableau de bord de matin en spécifiant jusqu'à deux itinéraires et des arrêts en texte et ajouter une URL pour récupérer la météo fromweather.gov :
Notes de configuration PI
Au cours de la première manche, connectez la souris, le clavier et la carte Wi-Fi par le biais de l’USB-hub. Suivi le guide mise en route pour télécharger l’image initiale sur carte SD. Redémarrez-le, installer la distribution basée sur Raspbian Debian de défaut. Sélectionnez l’option « boot automatiquement l’environnement de bureau au démarrage » lorsque demandé. Alors que vous n’en avez pas besoin, c’est la meilleure façon de configurer une connexion Wi-Fi. Une fois sur le bureau, sélectionnez « configuration Wi-Fi » en vertu d’un des menus accédés via le bouton Démarrer et configurer la carte wi-fi que vous avez inséré pour se connecter au routeur. Assurez-vous que vous configurer également au démarrage d’une connexion wi-fi automatiquement au démarrage. Configurer le serveur SSH et assurez-vous qu’il démarre au démarrage. Configurer le nom d’hôte, ou écrivez à l’adresse IP. Redémarrer et essayer de SSH depuis une autre machine. Si cela fonctionne, déconnectez la souris, le clavier et HDMI : vous n’avez plus besoin. Assurez-vous que git est installé via sudo apt-get install git, télécharger les sources et suivez les instructions du README pour installer les runtimes de langue. Jouer avec les options de ligne de commande du script pour comprendre ce que vous voulez exécuter et configurer un démon en installant l’initscript. Une fois suffisamment confiance dans la résilience de l’installation, ce monter sur votre mur.
Résultats
Donc la solution aidé : J’ai arrêté de courir comme un écolier japonais et a commencé à contrôler ma procrastination matin, aussi. En prime, j’ai eu une estimation approximatives de combien il devrait coûter aux contribuables pour programmer ce signe, et, bien sûr, j’ai eu beaucoup de plaisir, aussi. Enfin, j’ai maintenant un élément geek dans mon salon... même si elle ressemble aux autres sous forme de flux du cours des actions, plutôt que des heures d’arrivée Muni.
Notes
Les autres sont moins sections « à chaud », racontant mon expérience avec les outils que j’ai utilisé pour le travail.
Ruby
Défaut de l’IP framboise Linux, comme un dérivé de Debian, contiennent support décent pour Ruby, dont 1,9. qui est un peu vieux déjà, cependant. Il faut Pi plusieurs secondes pour charger l’interprète et une douzaine de pierres précieuses, j’avais besoin pour ce signe, mais c’est OK, étant donné que le programme démarre seulement une fois lorsque le système est mis sous tension.
Signe de LED
Donc le signe que j’ai utilisé fourni une API Perl, et il serait donc naturel d’écrire le programme client en Perl, trop... pas vraiment. Alors que j’ai beaucoup d’expérience de programmation en Perl, je préférerais de beaucoup préfèrent plutôt écrit dans un langage plus intéressant, tels que Python ou Ruby. C’est l’une des raisons pourquoi j’ai écrit un petit wrapper sur l’API Perl, pour que je puisse exec ce programme simple de n’importe quelle autre langue. Une autre raison pourquoi j’ai écrit cette API a été que le signe ne supporte pas les deux lignes de texte dans son moteur de rendu de texte intégré. L’API permet de fournir une ligne de texte et le signe sera rendre heureux et même ajouter des effets, mais je voulais plutôt que deux lignes dans une police plus petite. API n’est pas une fonction « rendu l’image », mais le signe permet de créer vos propres glyphes de la police et les insérer dans le texte. L’idée évidente d’impression 16 x un 96 « symbole » travaillé. Le wrapper fait exactement cela. Le signe peut également parcourir plusieurs images--tout comme le signe réel Muni. API, c’est très facile à programmer : cela produit automatiquement lorsque vous envoyez plusieurs messages. Intégration avec Pi s’est bien passé : il suffit d’utiliser $sign -> send (appareil = > "/ dev/ttyUSB0") ; dans votre programme. Il y avait plusieurs problèmes, cependant. Tout d’abord, chaque glyphe est automatiquement centrée, sauf si elle est supérieure à environ 80 pixels de large, auquel cas il est aligné à gauche. Parcourant différemment alignés messages semble mal, donc j’ai forcer toutes les images, que j’ai envoyer le signe comme 16 x 96, leur remplissage avec des pixels noirs. Deuxièmement, il est impossible d’éteindre le signe par programme. Pour alimenter l’éteindre, j’ai besoin de physiquement supprimer la connexion USB et éteindre car il commence à utiliser la batterie dans le cas contraire. Intention du fabricant signe était probablement que vous ne re-programmez le signe souvent, donc vous il programmerait une fois et puis le tourner sous et hors tension manuellement. Mais nous sommes programmeurs trop ; ne fonctionne pas autour des choses notre pain quotidien ? Affichage d’une image tout en noir, a fait le tour d’éteindre le signe « ». Troisièmement, j’actualise le signe chaque 30 secondes pour s’assurer de prédiction en temps voulu, mais il faut 1-2 secondes pour mettre à jour le signe. Je suppose que c’est parce que le signe contient sa propre programmation et CPU, ou parce que je n’essaie de jouer avec envoyer arguments d’une fonction. Bien que sa plomberie interne affecte probablement la vitesse de mise à jour, et j’ai vu des exemples de déchargement la synchronisation et le clignotement des feux à Raspberry Pi complètement avec des signes différents, plus bas niveau, ce serait trop de temps pour moi de vous embêtez pas avec. Aussi, je ne sais pas combien de temps dure le signe quand elle est re-programmée deux fois une minute. Jusqu’ici, je suis très heureux avec le signe de Bright LED que j’ai utilisé et son API.
Rendu des polices
Je m’attendais à passer le temps zéro sur le rendu des polices, mais il a fallu beaucoup, beaucoup plus de temps que je m’y attendais. Eh bien, j’avais l’intention d’écrire mon propre moteur de rendu de polices simple, mais plusieurs roches cachées m’attendaient sous le sable fin. Tout d’abord, je ne pouvais pas trouver une police « raster » c’est juste un ensemble d’images bitmap. J’ai fini le téléchargement de polices TTF « pixélisé » et rendant avec la bibliothèque FontConfig. Je ne voulais pas le signe d’avoir beaucoup de dépendances, alors j’ai pré-rendeded les glyphes sur mon Pi de manière prêt-à-utiliser avec ce script et a écrit une petite bibliothèque pour les actionner. Le plus amusant est que je pourrais ajouter facilement de nouveaux glyphes, tels que des indicateurs de la pluie. Nous prenons également beaucoup de rendu des polices pour acquis, comme l’alignement au centre, mot d’emballage, de crénage. J’ai mis en œuvre de certains d'entre eux d’une manière très simple (en Ruby!) mais je pense que quelques fonctionnalités plus me ferait ragequit en faveur d’une bibliothèque de rendu de polices réel au lieu de cela.
Pour accéder aux prévisions Muni
Une autre raison pourquoi j’ai choisi Ruby était la bibliothèque Muni en Ruby, prêt à l’emploi pour obtenir des prédictions du système NextBus. Ou alors j’ai pensé : la bibliothèque manquait certaines fonctionnalités, telles que les routes de raffinage ou d’obtenir des prédictions pour toutes les voies d’un arrêt (c’est ce qu’affiche un panneau Muni). Il a également tiré dans la pile entière de Rail que pour afficher la chaîne heure bien formaté ! (comme, convertir intervalle en secondes à quelque chose de fantaisie comme « plus de 1 heure »). J’ai corrigé certaines de ces choses et livré la gemme avec la source d’origine pour votre commodité, parce qu’il était plus facile que la fourche il et en l’ajoutant dans un référentiel officiel.
Spécifiez routeConfig !
Apparemment, les moniteurs Muni officiels exploiter dans les mêmes termes : routeConfig est une des commandes API du service NextBus.
De toute façon, NextBus système a une API de nice, qui est apparemment libre de l’utiliser si l’utilisation est limitée ou est répartie entre les clients. Un Ponte de ce site nextmuni.com est consacré à SF Muni. La seule chose que je n’ai pas trouvé était les noms réels de la
Prévisions météo Retrieval
Oh, Eh bien, voici la partie la plus facile,"J’ai pensé quand j’ai fini avec tout le reste et a décidé de jeter dans les prévisions météorologiques. J’ai eu tort de façon très intéressante. Il s’avère que, la prévision Qu'api ne sont généralement pas gratuit. Les sites Internet que j’ai trouvé en haut de Google recherche d’images toutes inscriptions et votre touche personnelle pour tous les appels API, y compris. Beaucoup ont eu des versions gratuites limitées mais paiement requis pour les prévisions horaires--et je m’intéressais surtout dans des conditions à un endroit précis à une heure spécifique de la journée (temps de San Francisco n’est pas très stable). Non pas que je suis opposé aux services payants en soi, ou à l’analyse des pages web avec des expressions régulières, mais je n’ai qu’une grande partie de leur faire payer, je fais ? J’ai procédé à un service de weather.gov gouvernement libre, qui est en fait sorte de cool malgré la conception web du siècle dernier. Le service est limité aux États-Unis, mais San Francisco Muni prédictions ne sont pas non plus très utiles à l’extérieur du pays. Pour l’utiliser, vous devez fournir un lien vers tableau XML pour votre ville/région, qui ressemblerait à ceci : http://forecast.weather.gov/MapClick.php?lat=37.77493 & lon =-122.41942 & FcstType = digitalDWML. Je n’utiliser leur API, car c’est un savon à part entière, et personne n’as pas le temps.