#include <iclWidget.h>
#include <iclDrawWidget.h>
#include <iclDCGrabber.h>
#include <QApplication>
#include <iclThread.h>
#include <iclTestImages.h>
#include <iclMutex.h>
#include <iclFileWriter.h>

using namespace icl;
using namespace std;

Size size(320,240);

class MyThread : public Thread{
public:
  MyThread(){
    std::vector<DCDevice> devs = DCGrabber::getDeviceList();
    if(!devs.size()){
      ERROR_LOG("no dc device found -> exiting!");
      exit(-1);
    }
    w = new ICLWidget(0);
    w->setGeometry(100,100,640,480);
    w->show();
    
    for(unsigned int i=0;i<devs.size();i++){
      gs.push_back(new DCGrabber(devs[i]));
      printf("adding camera %s \n",devs[i].getModelID().c_str());
      gs[gs.size()-1]->setDesiredSize(Size(640,480));
      gs[gs.size()-1]->setDesiredFormat(formatRGB);
      gs[gs.size()-1]->setProperty("format","DC1394_VIDEO_MODE_640x480_MONO8@DC1394_FRAMERATE_15");
    }
    image = new Img8u(Size(devs.size()*640,480),formatRGB);
  }
  
  ~MyThread(){
    m.lock();
    stop();
    msleep(250);
    for(unsigned int i=0;i<gs.size();i++){
      delete gs[i];
    }
    delete w;
    gs.clear();
    m.unlock();
  }
  
  virtual void run(){
    while(1){
      m.lock();
      for(unsigned int i=0;i<gs.size();i++){
        image->setROI(Rect(i*640,0,640,480));
        gs[i]->grab()->deepCopyROI(&image);
      }
      //  static icl::FileWriter soWriter("Frame###.ppm");
      // soWriter.write(image);
      w->setImage(image);
      w->update();
      m.unlock();
      msleep(gs.size()*10);
    }
  }
  int device;
  ICLWidget* w;
  std::vector<DCGrabber*> gs;
  Mutex m;
  ImgBase *image;
};


int main(int nArgs, char **ppcArg){
  QApplication a(nArgs,ppcArg);
  
  MyThread *x=new MyThread;
  x->start();
  a.exec();
  delete x;

  return 0;
  
}