# Control de LED de usuario por medio de script en C El objetivo de este script en lenguaje C es controlar uno de los LED's de usuario integrados en la BeagleBone Black por medio de los registros del sistema. ![BeagleBone Black y sus LED's de usuario](bbled.png) ## Header ### Librerías En el encabezado de nuestro script se importan las librerías necesarias para realizar las operaciones de entrada y salida en la terminal de la Beaglebone, manejo de archivos, así como otras operaciones estandar y el manejo de strings. ```C #include #include #include ``` ### Registros del LED 3 de usuario Se define la dirección dónde se encuentran los registros del LED 3 que modificaremos para controlar su estado. ```C #define LED3_PATH "/sys/class/leds/beaglebone:green:usr3" #define bled "/brightness" #define tled "/trigger" ``` ### Prototipos de funciones Se establecen los prototipos de las funciones que usaremos: la función que modificará los registros del LED y la que deshabilitará el trigger. ```C void writeLED(char fileName[], char value[]); void removeTrigger(); ``` ## Main En nuestro ciclo principal las argumentos serán *argc* y *argv*, dónde argc cuenta el número de argumentos en la terminal, mientras argv almacena el valor de los argumentos. argc nos ayudará a determinar si el usario ingresó el número correcto de argumentos a nuestra función siendo este 1. ```C int main(int argc, char* argv[]){ printf("Starting app \n"); if(argc!=2){ printf("Incorrect number of arguments"); return 2; } ``` Se utiliza un ciclo if para seleccionar la acción del LED, comparando el valor de argumento en la terminal con unos comandos definidos: ***on***, ***off*** y ***blink*** Para prender o apagar el LED, se deshabilita el trigger y se modifica el registro de *brightness*. ```C if(strcmp(argv[1], "on")==0){ printf("LED on \n"); removeTrigger(); writeLED(bled, "1"); printf("Done"); } else if (strcmp(argv[1], "off")==0){ printf("LED off \n"); removeTrigger(); writeLED(bled, "0"); printf("Done"); } ``` En el caso del parpadeo del LED, el trigger se modifica para activar el timer y se utilizan los registro de *delay_on* y *delay_off* para establecer el tiempo de encendido y apagado. ```C else if (strcmp(argv[1], "blink")==0){ printf("LED blinking \n"); writeLED(tled, "timer"); writeLED("/delay_on", "500"); writeLED("/delay_off", "500"); } else printf("Invalid command!\n"); return 0; } ``` ## Funciones Se desarrollan las funciones anterior mente mencionadas, para esto se necesita un puntero de archivo fp y la función fopen de las librerías que importamos, el argumento de la función será el directorio y los registros que definimos en el encabezado. ```C void writeLED(char fileName[], char value[]){ FILE* fp; char fullName[150]; sprintf(fullName, LED3_PATH "%s", fileName); fp = fopen(fullName, "w+"); fprintf(fp, "%s", value); fclose(fp); } void removeTrigger(){ writeLED(tled, "none"); } ``` ## Ejecución Se compila el archivo main.c ``` gcc main.c -o led ``` Se cambian los permisos de nuestro ejecutable. ``` sudo chmod u+x led ``` Y se ejecuta con cualquiera de los argumentos mencionados anteriormente. ``` sudo ./led blink ```