#include <pthread.h>
#include <stdio.h>
#include <unistd.h>
#include "dioctl_api.h"

int waiting = 0;

void *thread(void *ptr) {
  char **argv = ptr;
  int i,d = dio_open(argv[1]?argv[1]:"");
  int group,gled,rled;
	
  group = dio_groupinit(d);
  dio_groupadd(d,group,"GREEN_LED");
  dio_groupadd(d,group,"RED_LED");

  printf("Watching LEDs\n");
  dio_groupisync(d,group);
  waiting = 1;
  printf("GREEN_LED starts %d\n",dio_get(d,"GREEN_LED"));
  printf("RED_LED starts %d\n",dio_get(d,"RED_LED"));
  for (i=0;i<4;i++) {
    gled = !dio_get(d,"GREEN_LED");
    rled = !dio_get(d,"RED_LED");
    dio_groupwaitirq(d,group,(gled?1:0)+(rled?2:0),3);
    if (dio_get(d,"GREEN_LED") == gled) {
      printf("GREEN_LED turned %s\n",gled?"ON":"OFF");
    }
    if (dio_get(d,"RED_LED") == rled) {
      printf("RED_LED turned %s\n",rled?"ON":"OFF");
    }
  }
  printf("Done watching LEDs\n");
}

int main(int argc,char *argv[]) {
  int d = dio_open(argc>1?argv[1]:"");
  int i,group,gled,rled;
  pthread_t thread2;

  group = dio_groupinit(d);
  dio_groupadd(d,group,"GREEN_LED");
  dio_groupadd(d,group,"RED_LED");

  if (!dio_grouptrylock(d,group)) {
    printf("failed to lock LEDs\n");
    return 1;
  }

  pthread_create( &thread2, NULL, thread, argv);
  while (!waiting) { // give other thread a chance to start
    usleep(20000);
  }
  printf("Napping...\n");
  usleep(100000); // now wait for it to really be listening

  printf("Driving LEDs\n");
  for (i=0;i<2;i++) {
    dio_set(d,"RED_LED",1);
    dio_groupsync(d,group);
    usleep(100000);
    dio_set(d,"RED_LED",0);
    dio_groupsync(d,group);
    usleep(100000);
    dio_set(d,"GREEN_LED",1);
    dio_groupsync(d,group);
    usleep(100000);
    dio_set(d,"GREEN_LED",0);
    dio_groupsync(d,group);
    usleep(100000);
  }

  printf("Waiting for thread to finish\n");
  pthread_join( thread2, NULL); 
  printf("Exiting\n");
  return 0;
}
/*
int main(int argc,char *argv[]) {


	} else {
	}
	dio_close(d);
}
*/
/*
  Author: Michael Schmidt (michael@embeddedARM.com)
 */
