#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <iostream>
#include <sstream>
#include <getopt.h>
#include <sys/mman.h>

extern "C" {
#include <native/task.h>
#include <nucleus/sched.h>
#include <analogy/analogy.h>
#include <analogy/descriptor.h>
#include <analogy/subdevice.h>
}

#define FILENAME "analogy0"
#define NB_CHANNELS 16
#include <iostream>


int main ()
{
  a4l_desc_t *descriptor;
  descriptor = new a4l_desc_t();
  descriptor->sbdata = NULL;

  a4l_open(descriptor, FILENAME);
  a4l_sbinfo_t *sbinfo = NULL;

  uint8_t writingBuffer[NB_CHANNELS];
  uint8_t maskBuffer[NB_CHANNELS];


  descriptor->sbdata = malloc(descriptor->sbsize);
  a4l_fill_desc(descriptor);

  for (int i=0; i<descriptor->nb_subd; i++)
    {
      a4l_get_subdinfo(descriptor, i , &sbinfo);
      if ((sbinfo->flags & A4L_SUBD_TYPES) == A4L_SUBD_DIO) 
	{
	  std::cout << "Found DIO" << std::endl;
	  descriptor->idx_write_subd = i;
	  break;
	}
      if (i == descriptor->nb_subd -1) 
	std::cout << "No Digital Output found" << std::endl;
    }

  for (int i=0; i < NB_CHANNELS*NB_DATA*2; ++i)
    {
      writingBuffer[i] = 0xffffffff;
      maskBuffer[i] = 0xffffffff;
    }

  int re = a4l_sync_dio(descriptor, 
			descriptor->idx_write_subd,
			maskBuffer,
			writingBuffer);

  sleep(3);

  for (int i=0; i < NB_CHANNELS*NB_DATA*2; ++i)
    {
      writingBuffer[i] = 0x00000000;
    }

  re = a4l_sync_dio(descriptor, 
			descriptor->idx_write_subd,
			maskBuffer,
			writingBuffer);


  return(re);

}
