Skript für LED Ansteuerung



  • Hallo Forum,

    ich habe ein bestehendes Skript, welches unter Ubuntu (oder anderen linux-Dist.) ein LED-Meter über die parallele Schnittstelle ansteuert. Je nach CPU-Auslastung läuft das Meter schneller oder langsamer.

    Da meine C-Aktivitäten lang lang her sind und auch nie bis zum ansprechen von parallelen Schnittstellen reichten, brauche ich eure Hilfe.

    Ich möchte das bestehende Skript einfach nur um die Funktion erweitern, dass ich per Parameter eine bestimmte LED blinken lassen kann. Danach soll sich das Skript
    beenden. (Sinn: Anzeige des Status von bestimmten Programmen)

    Vielleicht kann mir jemand einen Tipp geben wo ich in das Skript eingreifen muss? Ich schaue da nämlich rein wie die Sau ins Uhrwerk 😉

    Ich wäre euch wirklich sehr dankbar...

    MfG deZerver

    #include <stdio.h>
    #include <stdlib.h>    /* exit()    */
    #include <string.h>    /* strncmp() */
    #include <unistd.h>    /* sleep()   */
    #include <fcntl.h>     /* open()    */
    #include <sys/ioctl.h> /* ioctl() */
    
    #include "ppdev.h"
    
    /* We get cpu usage by reading /proc/stat on Linux */
    /* the cpu line totals all of the values, cpu0-cpuX are individual cpu stats */
    /*
        - user: normal processes executing in user mode
        - nice: niced processes executing in user mode
        - system: processes executing in kernel mode
        - idle: twiddling thumbs
        - iowait: waiting for I/O to complete
        - irq: servicing interrupts
        - softirq: servicing softirqs
    
      We read the idle field and 100-idle = cpu usage
    
    */
    
       static int parport;
    
    #define BARGRAPH 0
    #define CYLON    1
    #define RANDOM   2
    
    #define SCREEN  0
    #define PARPORT 1
    
    #define UPDATES 50
    
    unsigned char bargraph_lut[8]= { 0x0,0x80,0xc0,0xe0,0xf8,0xfc,0xfe,0xff};
    unsigned char cylon_lut[8]= {0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01};
    unsigned big_cylon_lut[14]={0,1,2,3,4,5,6,7,6,5,4,3,2,1};
    
    static unsigned char bargraph(int percent) {
    
       int temp;
    
          /* 25 = USER_HZ /4 ... 7 = number of values */
       temp = percent/(25/7);
       if (temp>7) temp=7;
    
       return bargraph_lut[temp];
    }
    
    static unsigned char cylon(int percent) {
    
       static int cylon_count=0;
    
       cylon_count+=3+((percent*97)/100);
    
       if (cylon_count>=1400) cylon_count=0;
    
       return cylon_lut[big_cylon_lut[cylon_count/100]];
    }
    
    static unsigned char rando(int percent) {
    
       static int random_count=0;
       static char pattern=0;
    
       random_count+=4+((percent*96)/100);
    
       if (random_count>100) {
          random_count=0;
          pattern=rand()&0xff;
       }
    
       return pattern;
    
    }
    
    static void screen_output(unsigned char bitmap) {
    
       int i;
    
         /* clear scren ANSI code */
       printf("%c[H%c[2J",27,27);
    
       for(i=7;i>=0;i--) {
          if (bitmap & (1<<i)) printf("*"); else printf(" ");
       }
       printf("\n");
    
    }
    
    static void parport_output(unsigned char bitmap) {
    
       ioctl(parport,PPWDATA,&bitmap);
    
    }
    
    #define POLLING 25
    
    int main(int argc, char **argv) {
    
       FILE *stat;
       long idle_cpu,old_idle,num_cpus=-1,idle_total,percent=0;
       long pattern_type=CYLON,output_type=PARPORT;
       char temp_string[BUFSIZ],pattern=0;
       int polling=0;
    
          /*******************************/
          /* scan command line arguments */
          /*******************************/
       /* TODO */
    
          /************************************/
          /* get initial info from /proc/stat */
          /************************************/
    
       stat=fopen("/proc/stat","r");
       if (stat==NULL) {
          printf("Error opening stats file!\n");
          exit(1);
       }
    
       while(1) {
          fgets(temp_string,BUFSIZ,stat);
    
             /* Count number of cpus */
             /* start at -1 because always have a total "cpu" line */
          if (!strncmp(temp_string,"cpu",3)) {
    	 if (num_cpus<0) {
    	    sscanf(temp_string,"%*s %*i %*i %*i %li",&old_idle);
    	 }
    	 num_cpus++;
          }
    
          if (feof(stat)) break;
       }
    
       fclose(stat);
    
          /* This depends on USER_HZ == 100 */
       idle_total=(100/(UPDATES/POLLING))*num_cpus;
    
          /********************************/
          /* Parallel Port Initialization */
          /********************************/
       if (output_type==PARPORT) {
          parport=open("/dev/parport0",O_RDWR);
          if (parport<0) {
    	 printf("Error opening parallel port!\n");
    	 exit(1);
          }
          ioctl(parport,PPCLAIM,NULL);
       }
    
          /********************/
          /* Main Loop        */
          /********************/
    
       while(1) {
    
          polling++;
    
          if (polling==POLLING) {
    	 polling=0;
    
             stat=fopen("/proc/stat","r");
             fscanf(stat,"%*s %*i %*i %*i %li",&idle_cpu);
             fclose(stat);
    
             percent=(idle_total-(idle_cpu-old_idle))*(UPDATES/POLLING);
    	 if (percent<0) percent=0;
    	 if (percent>100) percent=100;
             old_idle=idle_cpu;
          }
    
    //      printf("Percent=%i\n",percent);
    
          switch(pattern_type) {
           case BARGRAPH: pattern=bargraph(percent); break;
           case CYLON:    pattern=cylon(percent); break;
           case RANDOM:   pattern=rando(percent); break;
           default: printf("Error!\n");
          }
    
          switch(output_type) {
           case PARPORT: parport_output(pattern); break;
           case SCREEN: screen_output(pattern); break;
           default: printf("ERROR!\n");
          }
    
          usleep(1000000/UPDATES);
       }
    
       return 0;
    }
    


  • Du solltest dir auf jeden Fall zuerst mal den mit "wichtig" gekennzeichneten Thread "Du brauhcst Hilfe?" durchlesen. Danach wirst du feststellen, dass
    - du im falschen Forum gepostet hast (C ist nicht C++)
    - sich so viel Code niemand durchlesen wird
    - dir hier keine Komplettlösung geliefert wird. Wenn du in C++ bzw. C programmieren willst solltest du dich auch wenigstens ein bisschen damit auskennen, was aber anscheinend nicht der Fall ist. (Tip: es gibt ne Menge gute Tutorials im Netz, wo man recht schnell einen Einstieg bekommt)

    PS: weder C noch C++ sind Scriptsprachen.



  • Dieser Thread wurde von Moderator/in pumuckl aus dem Forum C++ in das Forum ANSI C verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • Hallo Du,

    steht ja alles schon da mit parport_output().
    Nacheinander mit 1, 2, 4, 8, 16, 32 usw. (2er- Potenzen) füttern, sollte die Dioden einzeln zum Leuchten bringen (evtl. invertiert, hab's nicht genauer angesehen).
    Aber wie Pumuckl schon sagte: Ohne C- Grundkenntnisse Deinerseits wird das für uns alle zu einem zähen und unerquicklichen Unterfangen.



  • Das ich den Beitrag in das falsche Forum gepostet habe, tud mir leid! Ich habe das ANSI C Forum nicht bemerkt... Ist doch mein erstes mal 😉

    Ich muss doch den kompletten Code posten... Ich sehe doch keinen Ansatz. Grundkenntnisse in C++ habe ich, aber nicht in ANSI C und nicht für die Ansteuerung einer parallelen Schnittstelle.

    Ich möchte auch keine Komplettlösung (habe ich in keiner Art und Weise angedeutet!).

    MfG deZerver



  • Danke, dass werde ich dann gleich einmal probieren. Ich hätte die richtige Funktion nicht so schnell gefunden... 🙂



  • Ja, dann mach doch hinne!

    Du ersetzt parport_output(pattern) durch parport_output(1), dann durch parport_output(2) usw. und guckst Du, was passiert. In parport_output selbst findest Du den Hardware- Zugriff (die Zeilen 160ff öffnen den Port).

    Was brauchst Du mehr?



  • Jajaja, ich mache ja schon 😉

    Aber erstmal muss ich mich wieder einarbeiten was man unter Ubuntu für das compilieren braucht und wie das nochmal ging 😉

    MfG deZerver



  • Danke!

    Genau wie ihr es vorausgesagt habt!

    Nun habe ich noch zwei Fragen. Ich möchte das Programm danach automatisch beenden lassen, kennt jemand den Befehl dafür? Ist bestimmt sehr einfach...

    Tante Edit: Ok, exit(0); war der Befehl... 😉

    Und, dann ist es mit der Funktion parport_output nicht möglich zwei LED's gelichzeitig ansteuern zu lassen, hat das schonmal jemand gemacht?

    Tante Edit: Jetzt habe ich es gefressen, parport_output(255) lässt alle Leds angehen...

    MfG deZerver



  • deZerver schrieb:

    Tante Edit: Jetzt habe ich es gefressen, parport_output(255) lässt alle Leds angehen...

    Yep, Stichworte Dualsystem, Binärsystem usw. könnten Dich beim wikigoogeln weiterbringen.
    Der Parallelport ist übrigens am ersten PC über den alten Hund 8255 realisiert worden, heute so um die 10 Zeilen VHDL. Im Prinzip geht das aber immer noch so.

    Viel Spaß mit Deinem LED-O-Graph!
    😃


Anmelden zum Antworten