#ifndef SEARCHLEDSOUTPUT_H
#define SEARCHLEDSOUTPUT_H

#include "output.h"
#include "../recognition/findleds.h"
#include <string>

extern "C"
{
  #include <opencv/highgui.h>
}

namespace seemicro
{

/**
  * Zeichnet die gefundenen Schwerpunkte in src->img ein
  */
class FindLEDSOutput : public OutputModule
{
  FindLEDSModule& src;
  static FindLEDSOutput *home;
  string windowname;
  IplImage *img;
  CvFont *font;

public:
  /*
   * Legt fest, welches Bild als Hintergrund verwendet wird
   *  0 = Ausgabebild von FloodFill
   *  1 = Eingabebild von FloodFill
   */
  int whichSrc;

  FindLEDSOutput(FindLEDSModule& Asrc, string Awindowname, CvFont *Af) :
    src(Asrc), windowname(Awindowname), font(Af)
  {
    home = this;
    cvNamedWindow(windowname.c_str(), 1);
    img = cvCreateImage(cvSize(src.img->width, src.img->height), IPL_DEPTH_8U, 3);
    whichSrc=1;// verwende FloodFills Eingabebild
  };

  ~FindLEDSOutput()
  {
    cvDestroyWindow(windowname.c_str());
    cvReleaseImage(&img);
  }

  void output(bool keyframe)
  {
    if(!src.outputChanged) return;
    //if(!keyframe) return;


    if(whichSrc==0)
      // Ausgabebild von FloodFill (Markerbild) als Hintergrund
      src.FloodFillMarks2Colors(img);
    else if(whichSrc==1)
      // Eingabebild von FloodFill (Kamerabild) als Hintergrund
      cvConvertImage(src.src.img, img);

    cvCircle(img, src.micro.mitte, 3, CV_RGB(200, 255, 150));
    cvCircle(img, src.micro.mitte, int(src.micro.radius), CV_RGB(100, 155, 150));

    char text[100];
    for(int i=0; i<src.markiert; i++)
    {
      // Schwerpunkt markieren
      if(src.anzahl[i] == 0) continue;// als gelöscht gekennzeichneter Schwerpunkt
      cvCircle(img, src.micro.mitte+src.markierungen[i], 5,
        CV_RGB(200, 200, 250));

      if(src.eva) // nur im Eva-Modus
      {
	// Ansatzpunkt markieren
	double c = CV_RGB(155, 50, 50);
	if(src.gewaehlt[i]) c = CV_RGB(255, 150, 150);

	mypoint p0 = src.micro.mitte + mypoint(
	    int(cos(src.gamma0[i])*src.micro.radius),
	    -int(sin(src.gamma0[i])*src.micro.radius) );
	//cerr << "gamma: " << int(src.gamma0[i]/M_PI*180) << "° p: " << p0 << endl;
	cvCircle(img, p0, 5, CV_RGB(255, 100, 100));

	if(src.gewaehlt[i])
	{
	  p0 = src.micro.mitte + mypoint(
	      int(cos(src.gamma0[i])*src.micro.radius*1.3),
	      -int(sin(src.gamma0[i])*src.micro.radius*1.3) );
	  sprintf(text, "#%d", src.armnummer[i]);
	  cvPutText(img, text, p0, font, CV_RGB(255, 255, 255));
	}
      }
    }

    // blaues Rechteck um ROI zeichnen
    cvRectangle(img, src.ROI.p1(), src.ROI.p2(), CV_RGB(0, 0, 255));

    sprintf(text, "Alpha=%d", int(src.micro.alpha*180/M_PI));
    cvPutText(img, text, cvPoint(img->width-110, 30), font, CV_RGB(255, 255, 255));

    cvShowImage(windowname.c_str(), img);
    cvResizeWindow(windowname.c_str(), img->width+15, img->height+55);
    src.outputChanged = false;
  }

  static void callback(int dummy=0)
  {
    if(!home) return;
  }

}; // SearchLEDSOutput

} // seemicro

#endif

