Gustavo Martinez 1c36e0990c | 2 years ago | |
---|---|---|
.gitignore | 2 years ago | |
Readme.md | 2 years ago | |
bbled.png | 2 years ago | |
main.c | 2 years ago |
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.
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.
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
Se define la dirección dónde se encuentran los registros del LED 3 que modificaremos para controlar su estado.
#define LED3_PATH "/sys/class/leds/beaglebone:green:usr3"
#define bled "/brightness"
#define tled "/trigger"
Se establecen los prototipos de las funciones que usaremos: la función que modificará los registros del LED y la que deshabilitará el trigger.
void writeLED(char fileName[], char value[]);
void removeTrigger();
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.
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.
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.
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;
}
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.
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");
}
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