#include "click_panel.h"
#include <math.h>
#include "Click.h"
#include "Osc.h"
#include "RTWvOut.h"

#define DELTA 32

Osc *osc;

Click *clk;



Fl_Value_Slider *Aclk=(Fl_Value_Slider *)0;

static void cb_Aclk(Fl_Value_Slider* o, void*) {
  clk->setAmp(o->value());
}

Fl_Value_Slider *Asin=(Fl_Value_Slider *)0;

static void cb_Asin(Fl_Value_Slider* o, void*) {
  osc->setAmp(o->value());
  return;
}

Fl_Button *LNK=(Fl_Button *)0;

Fl_Slider *Fclk=(Fl_Slider *)0;

static void cb_Fsin(Fl_Slider* o, void*) {
  double val = int(pow(900,o->value())*10); 
  Vsin->value(val);
  Vsin->redraw();
  osc->setFreq(val);
}

static void cb_Fclk(Fl_Slider* o, void*) {
  double val = int(pow(900,o->value())*10); 
  Vclk->value(val);
  Vclk->redraw();
  clk->setFreq(val);
  if (LNK->value()) {
     Fsin->value(Fclk->value());
     cb_Fsin(Fsin, (void*)0);
  }
}

Fl_Slider *Fsin=(Fl_Slider *)0;

Fl_Value_Output *Vsin=(Fl_Value_Output *)0;

Fl_Value_Output *Vclk=(Fl_Value_Output *)0;

int main() 
{
  RTWvOut output;
  osc = new Osc();
  clk = new Click();
  osc->setAmp(0.5);
  clk->setAmp(0.5);
  osc->setFreq(10);
  clk->setFreq(10);

  int i;
  Fl_Window* w;
  { Fl_Window* o = new Fl_Window(224, 188, "Click vs sine");
    w = o;
    o->color(53);
    o->selection_color(34);
    o->labeltype(FL_NORMAL_LABEL);
    o->labelsize(12);
    o->labelcolor(1);
    { Fl_Box* o = new Fl_Box(23, 8, 65, 25, "Frequency");
      o->labelsize(12);
    }
    { Fl_Value_Slider* o = Aclk = new Fl_Value_Slider(129, 26, 25, 125, "Click");
      o->type(4);
      o->box(FL_FLAT_BOX);
      o->color(53);
      o->selection_color(0);
      o->labelsize(12);
      o->minimum(1);
      o->maximum(0);
      o->value(0.5);
      o->callback((Fl_Callback*)cb_Aclk);
    }
    { Fl_Value_Slider* o = Asin = new Fl_Value_Slider(176, 26, 25, 125, "Sine");
      o->type(4);
      o->box(FL_FLAT_BOX);
      o->color(53);
      o->selection_color(0);
      o->labelsize(12);
      o->minimum(1);
      o->maximum(0);
      o->value(0.5);
      o->callback((Fl_Callback*)cb_Asin);
    }
    { Fl_Box* o = new Fl_Box(131, 8, 65, 25, "Amplitude");
      o->labelsize(12);
    }
    { Fl_Button* o = LNK = new Fl_Button(37, 167, 35, 15, "Link");
      o->type(1);
      o->down_box(FL_DOWN_BOX);
      o->color(50);
      o->labelsize(12);
    }
    { Fl_Slider* o = Fclk = new Fl_Slider(22, 50, 25, 101, "Click");
      o->type(4);
      o->box(FL_FLAT_BOX);
      o->color(53);
      o->selection_color(0);
      o->labelsize(12);
      o->minimum(1);
      o->maximum(0);
      o->callback((Fl_Callback*)cb_Fclk);
    }
    { Fl_Slider* o = Fsin = new Fl_Slider(65, 50, 25, 101, "Sine");
      o->type(4);
      o->box(FL_FLAT_BOX);
      o->color(53);
      o->selection_color(0);
      o->labelsize(12);
      o->minimum(1);
      o->maximum(0);
      o->callback((Fl_Callback*)cb_Fsin);
    }
    { Fl_Value_Output* o = Vsin = new Fl_Value_Output(64, 26, 26, 25, "Hz");
      o->box(FL_FLAT_BOX);
      o->color(53);
      o->labeltype(FL_NO_LABEL);
      o->labelsize(11);
      o->minimum(9000);
      o->maximum(10);
      o->value(10);
      o->textsize(11);
      o->align(FL_ALIGN_RIGHT);
    }
    { Fl_Value_Output* o = Vclk = new Fl_Value_Output(21, 26, 28, 25, "Hz");
      o->box(FL_FLAT_BOX);
      o->color(53);
      o->labeltype(FL_NO_LABEL);
      o->labelsize(11);
      o->minimum(9000);
      o->maximum(10);
      o->value(10);
      o->textsize(11);
      o->align(FL_ALIGN_RIGHT);
    }
    o->end();
  }
  w->show();
  while (Fl::check())
  { 
    for (i=0;i<DELTA;i++)
       output.tick((osc->tick()+clk->tick())/2);
  }
  // return 0;
}




