Stap 2:
Broncode
Zoals gewoonlijk zal ik beginnen met de broncode, die op github. Hier is een lokale mirror, in het geval dat de broncode voor een gepatchte volgende Muni gem is hier.
How to Run
Er is een kleine documentatie in het README bestand, en monster opdrachtregels zijn in de daemon opstartscript voor deze spec. in principe, dat u selecteert een stop op nextmuni.com te vinden uw stop-ID, en uitvoeren van client/client.rb--stopId 12345. Alternatief, kunt u een ochtend dashboard uitvoeren door te geven van maximaal twee routes en stopt in tekst, en voeg een URL om te halen weer fromweather.gov:
PI configuratie notities
Tijdens de eerste run, sluit u de muis, het toetsenbord en Wi-Fi-kaart via de USB-hub. Volg de gids aan de slag om eerste afbeelding naar SD kaart te downloaden. Schoen op opwaarts, installeren de standaard Raspbian Debian-gebaseerde distributie. Kies "automatisch opstarten desktop omgeving bij het opstarten" wanneer gevraagd. Terwijl u het niet hoeft, is het de gemakkelijkste manier om het configureren van de Wi-Fi. Eenmaal op het bureaublad, selecteer "Wi-Fi-configuratie" onder een van de menu's toegankelijk via de knop Start en de wi-fi-kaart die u ingevoegd om verbinding met de router te configureren. Zorg ervoor dat u ook configureren om te starten van wi-fi automatisch tijdens het opstarten. Configureren van SSH-server, en zorg ervoor dat het opstart tijdens het opstarten. Configureren van hostname of IP-adres noteren. Reboot en probeer te SSH vanaf een andere machine. Als dit werkt, verbreken muis, het toetsenbord en HDMI: u hoeft ze niet meer. Controleer of git is geïnstalleerd via sudo apt-get install git, de bronnen downloaden en volg de instructies van de README te installeren taal runtimes. Spelen met script van command line opties om erachter te komen wat u wilt uitvoeren en een daemon configureren door het installeren van de initscript. Zodra genoeg vertrouwen in de veerkracht van de setup, mount dit op uw muur.
Resultaten
Dus de oplossing geholpen: ik gestopt als een Japanse schooljongen, en begon te controle van mijn ochtend uitstel, ook. Als een bonus, ik had een ruwe schatting van hoeveel het zou kosten belastingbetalers om te programmeren van dit teken, en, natuurlijk, ik had veel plezier, ook. Tot slot, ik heb nu een geeky item in mijn woonkamer... Hoewel het lijkt aan anderen als een gegevensstroom van de aandelenkoersen, in plaats van Muni aankomsttijden.
Notities
De rest is minder "hot" secties, waarin mijn ervaring met de tools die ik voor de baan gebruikte.
Ruby
Raspberry Pi's standaard Linux, als een Debian afgeleide, bevatten fatsoenlijke ondersteuning voor Ruby, met inbegrip van 1.9. die is een beetje oud al, wel. Het duurt enkele seconden om te laden van de interpreter en een dozijn van edelstenen die ik nodig had voor dit teken Pi, maar het is OK, aangezien het programma opstart slechts eenmaal wanneer het systeem is ingeschakeld.
LED Sign
Dus ik gebruikte teken verzorgd een Perl-API, dus zou het natuurlijk het clientprogramma in Perl te schrijven... niet echt. Terwijl ik heb een heleboel ervaring programmeren in Perl, ik zou veel liever schrijven in een interessanter taal, zoals Python of Ruby. Dat was een van de redenen waarom ik een kleine wrapper schreef over de Perl API, zodat ik kon exec dit eenvoudige programma vanuit een andere taal. Een andere reden waarom ik schreef dit API was dat het teken niet twee regels tekst in de ingebouwde tekst renderer ondersteunt. Met de API kunt u een regel tekst, en het teken zal gelukkig maken, en zelfs sommige effecten toevoegen, maar ik wilde twee regels in een kleiner lettertype in plaats daarvan. API hoeft niet een "render image"-functie, maar het teken kunt u uw eigen lettertype glyphs te maken en hen in tekst invoegen. Het voor de hand liggende idee van afdrukken een 16 x 96 "symbool" gewerkt. De wrapper doet precies dit. Het bord kan ook doorlopen van meerdere afbeeldingen--net als het echte Muni teken. API maakt dit zeer eenvoudig te programmeren: dit gebeurt automatisch wanneer u meerdere berichten verzenden. Integratie met Pi ging vlot: gewoon gebruik maken van $sign -> verzenden (apparaat = > '/ dev/ttyUSB0'); in uw programma. Er waren al verschillende glitches. Eerst, elke glyph wordt automatisch gecentreerd, tenzij het is meer dan ongeveer 80 pixels breed, in welk geval het wordt uitgelijnd aan de linkerkant. Anders in een lus doorlopen uitgelijnd berichten ziet er slecht, zodat ik alle afbeeldingen die ik stuur het teken als 16 x 96, hen met zwarte pixels opvulling dwingen. Ten tweede, er is geen manier om stroom uit het teken via programmacode. Voor het aandrijven van het uit, moet ik fysiek verwijderen van de USB-aansluiting en zwenking op vandoor, omdat het begint met behulp van de batterij anders. Van de fabrikant van de teken bedoeling was waarschijnlijk dat u het teken niet vaak opnieuw programmeren zodat u zou het programma eens en opnieuw in te schakelen in- en uitschakelen handmatig. Maar we programmeurs ook; ons brood en boter rond dingen niet werkt? Een all-black-beeld weergeven did naar de truc van het uitschakelen van het teken "". Ten derde, ik vernieuwen het teken elke 30 seconden om tijdige voorspelling, maar duurt het 1-2 seconden te werken van het teken. Ik verzenden veronderstel dit is omdat het teken bevat een eigen CPU en programmering, of omdat ik niet probeert te spelen met functieargumenten. Hoewel de interne loodgieterswerk waarschijnlijk van invloed op de snelheid van de update, en zag ik voorbeelden van verlading van alle de synchronisatie en het opvlammen van de lichten Raspberry Pi compleet met verschillende, meer low-level tekenen, dat zou te tijdrovend voor me om met moeite. Ik weet ook niet hoelang het teken zal duren wanneer twee keer een minuut opnieuw geprogrammeerd. Tot nu toe ben ik heel blij met het teken van de Bright LED die ik gebruikte en haar API.
Font Rendering
Ik verwacht nul om tijd te besteden van font rendering, maar het duurde veel, veel langer dan ik had verwacht. Nou, ik was van plan om te schrijven van mijn eigen eenvoudige font rendering-engine, maar verschillende verborgen rotsen zaten te wachten voor mij onder het dunne zand. Eerst kon ik niet vinden een "raster"-lettertype dat is gewoon een verzameling van bitmaps. Uiteindelijk heb ik "korrelig" TTF lettertypen downloaden en hen te renderen met FontConfig bibliotheek. Ik wilde niet het teken dat een heleboel afhankelijkheden, dus ik pre-rendeded de glyphs op mijn Pi in een kant-en-klare manier met dit script, en schreef een kleine bibliotheek om te werken hen. Het leukste deel is dat ik gemakkelijk nieuwe glyphs, zoals regenval indicatoren toevoegen kon. Wij ook een heleboel font rendering voor verleend nemen, zoals uitlijnen naar midden, woord verpakken, spatiëring. Ik uitgevoerd sommige van hen op een zeer eenvoudige manier (in Ruby!) maar ik denk dat een paar meer functies me ragequit ten gunste van een echte font rendering bibliotheek in plaats daarvan maken zou.
Toegang tot Muni voorspellingen
Een andere reden waarom mij chose Ruby was de Muni bibliotheek in Ruby, kant-en-klare om voorspellingen van het NextBus systeem. Of zo ik dacht: de bibliotheek miste sommige functies, zoals raffinage routes of het krijgen van voorspellingen voor alle routes van stilstand (dit is wat een Muni teken wordt weergegeven). Ook trok hij in de hele Rail stack alleen weer te geven van de tijd fraai opgemaakte tekenreeks! (zoals, converteren interval in seconden aan iets fancy als "meer dan 1 uur"). Ik vaste sommige van deze dingen, en het juweel met de oorspronkelijke bron voor uw gemak gebundeld, omdat het was makkelijker dan het afsplitsen en in een officiële repository toe te voegen.
Opgeven routeConfig!
Blijkbaar, officiële Muni monitoren werken in dezelfde bewoordingen: routeConfig is een van de opdrachten van de API van NextBus dienst.
Anyway, NextBus systeem heeft een leuke API, die schijnbaar vrij is te gebruiken als het gebruik is beperkt of gedistribueerd onder cliënten. Een spawn van deze site, nextmuni.com is gewijd aan SF Muni. Het enige wat ik niet vind was de werkelijke namen van de
Weerbericht ophalen
Oh, Nou, hier komt het makkelijke gedeelte,"Ik dacht toen ik klaar met alles, en besloten om te gooien in de voorspelling. Ik was verkeerd in een zeer interessante manier. Blijkt, weer voorspelling dat API 's zijn meestal niet gratis. De websites die ik op de top van Google gevonden zoeken alle vereiste aanmeldingen en met inbegrip van uw persoonlijke sleutel tot alle API-aanroepen. Velen hadden vrij beperkte versies maar vereist betaling voor elk uur prognose-- en ik was vooral geïnteresseerd in voorwaarden op een specifieke plaats op een bepaald uur van de dag (San Francisco weer is niet erg stabiel). Niet dat ik ben tegen betaalde diensten, per se, of naar webpagina's met regexps parseren, maar ik hoef niet dat veel van hen te betalen, kan ik? Ik ging met een vrije regering weather.gov dienst, die eigenlijk soort van cool ondanks de webdesign van de vorige eeuw is. De service is beperkt tot de VS, maar San Francisco Muni voorspellingen zijn niet handig buiten het land. Om het te gebruiken, moet u een link naar de XML-tabel opgeven voor uw stad/gebied, die er als volgt uitzien: http://forecast.weather.gov/MapClick.php?lat=37.77493 & lon =-122.41942 & FcstType = digitalDWML. Ik niet het gebruiken van hun API, want het is een volwaardige zeep, en is niet niemand tijd daarvoor kreeg.