Close

Update: Controlling the LED

A project log for Setting up the LinkIt C cross-compiler

Are you a "dyed in the wool" C programmer. Love your Arduino but want something more powerful. The LinkIt Smart MT7688 board may for you!

agpcooperagp.cooper 12/05/2017 at 12:010 Comments

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