Added a command line tool to set GPIOs
Here is the tool in action on gpio0:
root@mylinkit:~/Code# ./mraa_gpio.run -gpio 0 -dir out -val 1
gpio0 write is 1
root@mylinkit:~/Code# ./mraa_gpio.run -gpio 0 -dir in
gpio0 read is 1
root@mylinkit:~/Code# ./mraa_gpio.run -gpio 0 -dir out -val 0
gpio0 write is 0
root@mylinkit:~/Code# ./mraa_gpio.run -gpio 0 -dir in
gpio0 read is 0
root@mylinkit:~/Code# ./mraa_gpio.run -gpio 0 -dir close
gpio0 closed
So it works as expected. It also works on the WiFi LED (gpio44).
I note that the LED logic is inverted.
Here is the code:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdbool.h>
#include <mraa.h>
int main(int argc, char** argv)
{
// Pin No GPIO No Function
// P1 43 Eth LED
// P8 20 UART TX2, PWM2
// P9 21 UART RX2, PWM3
// P10 2 I2S WS
// P11 3 I2S CLK
// P12 0 I2S SDI
// P13 1 I2S SDO
// P14 37 REF_CLK
// P15 44 WiFi LED
// P16 46 UART RX1
// P17 45 UART TX1
// P18 13 UART RX0
// P19 12 UART TX0
// P20 5 I2C SDA
// P21 4 I2C SCL
// P25 6 SPI CS
// P26 18 PWM0
// P27 19 PWM1
// P28 17 SPIS MOSI
// P29 16 SPIS MISO
// P30 15 SPIS SCK
// P31 14 SPIS CS
bool gpioFlag=false;
bool dirFlag=false;
bool valFlag=false;
bool helpFlag=false;
int gpio=-1;
int pin=-1;
char dir[16]="";
int val=-1;
// Get parameters
{
long k;
double f1;
for (k=1;k<argc;k++) {
if (strcmp(argv[k],"-pin")==0) {
if (k+1<argc) sscanf(argv[k+1],"%lf",&f1);
gpio=-1;
pin=(int)f1;
if (pin==1) gpio=43;
if (pin==8) gpio=20;
if (pin==9) gpio=21;
if (pin==10) gpio=2;
if (pin==11) gpio=3;
if (pin==12) gpio=0;
if (pin==13) gpio=1;
if (pin==14) gpio=37;
if (pin==15) gpio=44;
if (pin==16) gpio=16;
if (pin==17) gpio=45;
if (pin==18) gpio=13;
if (pin==19) gpio=12;
if (pin==20) gpio=5;
if (pin==21) gpio=4;
if (pin==25) gpio=6;
if (pin==26) gpio=18;
if (pin==27) gpio=19;
if (pin==28) gpio=17;
if (pin==29) gpio=16;
if (pin==30) gpio=15;
if (pin==31) gpio=14;
if (gpio!=-1) gpioFlag=true;
}
if (strcmp(argv[k],"-gpio")==0) {
gpioFlag=false;
if (k+1<argc) sscanf(argv[k+1],"%lf",&f1);
gpio=(int)f1;
if ((gpio>=0)&&(gpio<=6)) {
gpioFlag=true;
} else if ((gpio>=12)&&(gpio<=21)) {
gpioFlag=true;
} else if (gpio==37) {
gpioFlag=true;
} else if ((gpio>=43)&&(gpio<=46)) {
gpioFlag=true;
}
if (gpioFlag) gpio=(int)f1;
}
if (strcmp(argv[k],"-dir")==0) {
dirFlag=true;
if (k+1<argc) strcpy(dir,argv[k+1]);
}
if (strcmp(argv[k],"-val")==0) {
valFlag=true;
if (k+1<argc) sscanf(argv[k+1],"%lf",&f1);
val=(int)f1;
if (val<0) val=0;
if (val>1) val=1;
}
if (strcmp(argv[k],"-help")==0) {
helpFlag=true;
}
}
}
// Do it
if ((gpioFlag)&&(dirFlag)&&(!helpFlag)) {
mraa_gpio_context mraa_gpio=NULL;
mraa_result_t mraa_res;
mraa_gpio=mraa_gpio_init(gpio);
if (mraa_gpio==NULL) {
printf("gpio%d error\n",gpio);
return(-1);
}
if (strcmp(dir,"in")==0) {
mraa_gpio_dir(mraa_gpio,MRAA_GPIO_IN);
printf("gpio%d read is %d\n",gpio,mraa_gpio_read(mraa_gpio));
return (0);
} else if (strcmp(dir,"close")==0) {
mraa_res=mraa_gpio_close(mraa_gpio);
if (mraa_res==MRAA_SUCCESS) {
printf("gpio%d closed\n",gpio);
return(0);
} else {
printf("gpio%d closed with error\n",gpio);
return(-1);
}
} else if ((valFlag)&&(strcmp(dir,"out")==0)) {
mraa_gpio_dir(mraa_gpio,MRAA_GPIO_OUT);
mraa_gpio_write(mraa_gpio,val);
printf("gpio%d write is %d\n",gpio,val);
return(0);
} else {
return(-1);
}
} else {
printf("mraa gpio - Written by Alan Cooper (agp.cooper@gmail.com)\n");
printf("usage: ./mraa_gpio.run -gpio n -pin n -dir [in|out|close] -val [0|1]\n");
printf("options: -gpio n Set gpio number\n");
printf(" -pin n Set gpio number by using pin number\n");
printf(" -dir [in|out|close] Set gpio as input, output or close the gpio\n");
printf(" -val [0|1] Set gpio output value\n");
}
}
The command line format is:
./mraa_gpio.run -gpio n -pin n -dir [in|out|close] -val [0|1]
The parameter order is not important and are only as required.
Note you can use pin number instead of gpio. There is a "-help" option, if I forget!
The PHP code:
<!-- Preprocessor -->
<html>
<body>
<form action="btnLED.php" method="get">
<?php
if (isset($_GET['on'])) {
echo '<input type="submit" name="on" value="on" style="color:red; height:150px; width:300px; font-size:72px">';
} else {
echo '<input type="submit" name="on" value="on" style="color:blue; height:150px; width:300px; font-size:72px">';
}
if (isset($_GET['off'])) {
echo '<input type="submit" name="off" value="off" style="color:red; height:150px; width:300px; font-size:72px">';
} else {
echo '<input type="submit" name="off" value="off" style="color:blue; height:150px; width:300px; font-size:72px">';
}
if (isset($_GET['end'])) {
echo '<input type="submit" name="end" value="end" style="color:red; height:150px; width:300px; font-size:72px">';
} else {
echo '<input type="submit" name="end" value="end" style="color:blue; height:150px; width:300px; font-size:72px">';
}
?>
</form>
</body>
</html>
<!-- Postprocessor -->
<?php
$GPIO=44;
if (isset($_GET['on'])) {
onFunc();
} elseif (isset($_GET['off'])) {
offFunc();
} elseif (isset($_GET['end'])) {
endFunc();
} else {
startFunc();
}
# Functions
function onFunc() {
global $GPIO;
echo "<font size='32' face='Arial'>";
echo "Turned On GPIO$GPIO<br>";
// Turn on GPIO
if ($GPIO==44) {
exec("./mraa_gpio.run -gpio ".$GPIO." -dir out -val 0");
} else {
exec("./mraa_gpio.run -gpio ".$GPIO." -dir out -val 1");
}
}
function offFunc() {
global $GPIO;
echo "<font size='32' face='Arial'>";
echo "Turned Off GPIO$GPIO<br>";
// Turn off GPIO
if ($GPIO==44) {
exec("./mraa_gpio.run -gpio ".$GPIO." -dir out -val 1");
} else {
exec("./mraa_gpio.run -gpio ".$GPIO." -dir out -val 0");
}
}
function endFunc() {
global $GPIO;
echo "<font size='32' face='Arial'>";
echo "Close GPIO$GPIO<br>";
// Remove GPIO
exec("./mraa_gpio.run -gpio ".$GPIO." -dir close");
}
function startFunc() {
global $GPIO;
echo "<font size='32' face='Arial'>";
echo "Ready to use GPIO$GPIO<br>";
}
?>
Works fine.
AlanX
Discussions
Become a Hackaday.io Member
Create an account to leave a comment. Already have an account? Log In.