| @ -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 | 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 | |||||
| ``` | |||||