Sivujenaktiivisuusledi (päivitetty versio, 2007-09-14)
Tässä oppaassa neuvotaan miten viritellään sivujenaktiivisuusledi, eli ledi, joka vilkahtaa aina, kun joku omalla palvelimella sijaitseva filu ladataan. Homma on melko simppeli, mutta tein tämän kuitenkin, koska tällaista kysyttiin.
Itse asiassa tämä käy nyt (päivityksen jälkeen) minkä tahansa logia tekevän softan aktiivisuuden näyttämiseen ledillä. Muutat vain ohjelman kurkkiman logifilun.
Wut?
Perusajatus on siis softa, joka tutkii jatkuvasti onko logiin tullut lisää tavaraa ja vilkauttaa printteriporttiin kiinnitettyä lediä silloin kun on.
Tarvittavat jutskat
- mielellään joku linux-palvelin (tai joku unix) (tai jos esim. windows, joudut varmaankin koodailemaan oman softan. Palvelimen tarvitset kuitenkin.)
- LPT-portti (ko. palvelimessa)
- kaksi- tai useampinapaista johtoa (ledillä on kaksi jalkaa)
- ledi
- etuvastus ledille. Ei pakollinen. Itse en ole käräyttänyt yhtäkään lediä enkä printteriporttia tökkimällä ledejä suoraan portteihin.
- jotain perustuntemusta elektroniikasta ja osaus muokata/tehdä ja kääntää softa
Näin:
-
Tässä on esimerkkisofta. Se tutkii jatkuvasti onko sille annetussa logifilussa muutoksia ja muutoksen tullessa pitää lpt-portin datapinnit +5V:ssä tai whatever hetken ajan, jolloin niihin kytketty ledi palaa hetken.
#include <stdio.h> #include <unistd.h> #include <sys/io.h> #include <string.h> #define BASE 0x378 #define FNAMELEN 4096 #define ROW_MAX_LENGTH 4096 char logfilename[FNAMELEN]; long pos = -1; int check_if_changed() { char row[ROW_MAX_LENGTH]; FILE *f; long newpos; int ret = 0; f = fopen(logfilename, "r"); if(f==NULL){ printf("could not open %s\n", logfilename); return 0; } if(pos==-1){ fseek(f, 0, SEEK_END); pos = ftell(f); } fseek(f, pos, SEEK_SET); fseek(f, 0, SEEK_END); newpos = ftell(f); if(newpos!=pos){ pos = newpos; printf("something changed, pos now at %d\n", pos); ret = 1; } fclose(f); return ret; } int main(int argc, char **argv) { int polltime = 1000000; if(argc<2){ printf("needs at least log file name"); return 1; } memcpy(logfilename, argv[1], strlen(argv[1])); if(argc==3){ if(strcmp(argv[2], "-fastpoll")==0) polltime = 100000; else{ printf("available parameters: -fastpoll (100ms log polling rate)\n"); return 1; } } if(ioperm(BASE, 3, 1)){ printf("ioperm didn't give rights to use lpt-port at 0x%x :----(\n", BASE); return 0; } for(;;){ if(check_if_changed()) outb(0xff, BASE); usleep(polltime); outb(0x00, BASE); } return 0; }
Softalle pitää antaa ensimmäiseksi parametriksi tarkkailtava logifilu ja toiseksi voi antaa -fastpoll jos haluaa 100ms filunlukuraten 1s:n sijaan. Apachen logitiedosto on ainakin gentoossa /var/log/apache2/access_log
Muokkaa sitä itsellesi sopivaksi ja laita ajoon ja lisää tarvittaessa jonnekin josta se käynnistyy koneen käynnistyessä. Softa tarvitsee rootin oikeudet (printteriportin käpistelyyn).
-
Kiinnitä johto jollain tapaa printteriporttiin. Datapinnit on portissa pinnit 2-9 ja maat 18-25. Toinen johdon napa johonkin dataan ja toinen johonkin maahan.
Kuvassa punainen on datapinnissä 0, keltainen datapinnissä 1 ja musta eräässä maassa. (Johdossa sattui olemaan jotain hassuja liittimenpaloja päässä valmiina kiinni ja käytin niitä vaikka ne eivät oikein pysy kiinni. Oikeaakin liitintä voi käyttää.)
Ja ledin voi kiinnittää esim. näin. Etuvastus toki väliin jos sellaista haluaa käyttää.
-
Sitten vain varmistat kaiken toiminnan ja käynnistät printteriportinhiplaajasoftan.
-
Jos tästä oli tai ei ollut jotain hyötyä, ottaisin mielelläni vastaan jotain palautetta. Tuolla alhaalla on jotain yhteystietoja.
Vanha, ehkä vähän huonompi, ajatus
Wut?
Perusidea on siis tehdä nettisivuille skripti, joka asettaa tiedostoon arvon, jota toinen C:llä tehty ohjelma voi tutkia ja vilkauttaa lpt-porttiin kiinnitettyä lediä tiedoston sisällön mukaan.
Tarvittavat jutskat
- mielellään joku linux-palvelin (tai joku unix) (tai jos esim. windows, joudut varmaankin koodailemaan oman softan. Palvelimen tarvitset kuitenkin.)
- LPT-portti (ko. palvelimessa)
- kaksi- tai useampinapaista johtoa (ledillä on kaksi jalkaa)
- ledi
- etuvastus ledille. Ei pakollinen. Itse en ole käräyttänyt yhtäkään lediä enkä printteriporttia tökkimällä ledejä suoraan portteihin.
- jotain perustuntemusta elektroniikasta ja osaus muokata/tehdä ja kääntää softa
Näin:
-
Säädä sivuillesi joku skripti joka muuttaa aina sivun latautuessa tietyn tiedoston sisällön ykköseksi+rivinvaihdoksi, eli "1\n":ksi. Voit toki käyttää jotain muutakin, mutta esimerkkisofta tutkii onko ykköstä ja muuttaa sen sitten "0\n":ksi.
Muista säätää filun oikeudet niin, että sekä palvelinsoftan ajama skripti että seuraava softa voi käsitellä sitä.
-
Tässä on esimerkkisofta. Se on aika purkka. Se tutkii jatkuvasti 1s väliajoin onko filussa ykkönen ja niin ollessa muuttaa ykkösen nollaksi ja pitää lpt-portin datapinnit +5V:ssä tai whatever sekunnin ajan.
#include <stdio.h> #include <unistd.h> #include <sys/io.h> //muuta kivaksi const char *serverstatfilename = "/sivuilla/olevan/skriptin/sörkkimä/filu"; //muuta tämä sopivaksi. yleensä 0x378 on ensimmäinen lpt-portti. //voi olla myös 0x278, joka on kai toisen portin oletuspaikka. #define BASE 0x378 int main(int argc, char **argv) { FILE *f; char c; int i; if(ioperm(BASE, 3, 1)){ printf("ioperm didn't give rights to use lpt-port at 0x%x :----(\n", BASE); return 0; } for(i=0;; i++){ usleep(1000000); printf("reading (%d)\n", i); f = fopen(serverstatfilename, "r"); if(f==NULL) continue; fread(&c, sizeof(char), 1, f); fclose(f); if(c=='1'){ //joku sivu on ladattu f = fopen(serverstatfilename, "w"); if(f==NULL) continue; c = '0'; fwrite(&c, sizeof(char), 1, f); c = '\n'; fwrite(&c, sizeof(char), 1, f); fclose(f); outb(0xff, BASE); usleep(1000000); outb(0x00, BASE); } } return 0; }
Muokkaa sitä itsellesi sopivaksi ja laita ajoon ja lisää tarvittaessa jonnekin josta se käynnistyy koneen käynnistyessä. Softa tarvitsee rootin oikeudet (printteriportin käpistelyyn).
-
Kiinnitä johto jollain tapaa printteriporttiin. Datapinnit on portissa pinnit 2-9 ja maat 18-25. Toinen johdon napa johonkin dataan ja toinen johonkin maahan.
Kuvassa punainen on datapinnissä 0, keltainen datapinnissä 1 ja musta eräässä maassa. (Johdossa sattui olemaan jotain hassuja liittimenpaloja päässä valmiina kiinni ja käytin niitä vaikka ne eivät oikein pysy kiinni. Oikeaakin liitintä voi käyttää.)
Ja ledin voi kiinnittää esim. näin. Etuvastus toki väliin jos sellaista haluaa käyttää.
-
Sitten vain varmistat kaiken toiminnan ja käynnistät printteriportinhiplaajasoftan.
-
Jos tästä oli tai ei ollut jotain hyötyä, ottaisin mielelläni vastaan jotain palautetta. Tuolla alhaalla on jotain yhteystietoja.