| @ -1,7 +1,134 @@ | |||
| # Control de LED de usuario por medio de script en Control de LED de usuario por medio de script en | |||
| # 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 delos registros del sistema. | |||
| integrados en la BeagleBone Black por medio de los registros del sistema. | |||
|  | |||
|  | |||
| ## 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<stdio.h> | |||
| #include<stdlib.h> | |||
| #include<string.h> | |||
| ``` | |||
| ### 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 arguemntos mencionados anteriormente. | |||
| ``` | |||
| sudo ./led blink | |||
| ``` | |||