/************************************************/
/*                                              */
/* File        : dmap2tcl2.c                    */
/* Description : tcl script creator             */
/*                                              */
/* Author: Sfiligoi Igor                        */
/*                                              */
/* Created      : 07.04.1997                    */
/* Last modified: 11.07.1997                    */
/*                                              */
/************************************************/


#include <stdio.h>
#include <stdlib.h>
#include <Error.h>
#include <GeoVme.h>
#include <dmap.h>

void dmap_write_tcl_title_slot(FILE *fmain,char *system_name, int chain_nr,int crate_nr, int board_nr)
{
  fprintf(fmain," if {[window_exist $win]} {\n\treturn 1;\n }\n\n");

  fprintf(fmain," toplevel $win\n");
  fprintf(fmain," wm title $win \"%s Chain %i Crate %i Slot %i Type $btype\"\n\n",system_name,chain_nr,crate_nr,board_nr);

  fprintf(fmain," #title frame\n");
  fprintf(fmain," set ftitle $win.ftitle\n");
  fprintf(fmain," frame $ftitle -relief groove -borderwidth 1\n\n");

  fprintf(fmain," global image_name\n");
  fprintf(fmain," label $ftitle.limage -image [image create photo -file $image_name ]\n\n");

  fprintf(fmain," label $ftitle.lchain -text \"Chain: %i\"\n",chain_nr);
  fprintf(fmain," label $ftitle.lcrate -text \"Crate: %i\"\n",crate_nr);
  fprintf(fmain," label $ftitle.lslot -text \"Slot: %i\"\n",board_nr);
  fprintf(fmain," label $ftitle.lbtype -text \"Board type: $btype\"\n\n");

  fprintf(fmain," pack $ftitle.limage -side right\n");
  fprintf(fmain," pack $ftitle.lchain -side top -anchor nw\n");
  fprintf(fmain," pack $ftitle.lcrate -side top -anchor nw\n");
  fprintf(fmain," pack $ftitle.lslot -side top -anchor nw\n");
  fprintf(fmain," pack $ftitle.lbtype -side top -anchor nw\n\n");
  
  fprintf(fmain," pack $ftitle -side top -padx 5 -pady 5 -fill x\n\n");

  fprintf(fmain," #data frame\n");
  fprintf(fmain," set fdata $win.fdata\n");
  fprintf(fmain," frame $fdata\n\n");
}

void dmap_write_tcl_row(FILE *fmain, char *framename, int width, char *textname)
{
  fprintf(fmain," ##%s frame\n",framename);
  fprintf(fmain," set f%s $fdata.f%s\n",framename,framename);
  fprintf(fmain," frame $f%s\n\n",framename);
  
  fprintf(fmain," label $f%s.ltitle -text \"%s\"\n",framename,textname);
  fprintf(fmain," listbox $f%s.ldata -width %i -yscrollcommand \"$fdata.sy set\"\n\n",framename,width);
  
  fprintf(fmain," pack $f%s.ltitle -side top -anchor nw\n",framename);
  fprintf(fmain," pack $f%s.ldata -side top -fill both -expand 1 -anchor n\n\n",framename);

  fprintf(fmain," pack $f%s -side left -fill both -expand 1\n\n",framename);
}  

void dmap_write_tcl_exit(FILE *fmain)
{
  fprintf(fmain," #exit frame\n");
  fprintf(fmain," set fexit $win.fexit\n");
  fprintf(fmain," frame $fexit\n\n");

  fprintf(fmain," button $fexit.bexit -text \"Exit\" -command \"destroy $win\"\n");
  fprintf(fmain," button $fexit.bparent -text \"Parent\" -command \"window_show $basewin\"\n\n");

  fprintf(fmain," pack $fexit.bexit -side left -padx 10\n");
  fprintf(fmain," pack $fexit.bparent -side left -padx 10\n\n");

  fprintf(fmain," pack $fexit -side top -pady 5\n\n");
}

/* write the map as tcl script(to be used with tcldmap) */
int dmap_write_tcl(char *filename,	/* i.e. "../data/dmap.dmap.tcl" */
		   char *system_name)   /* i.e. "System Test" */
{
  {
    int chain_nr;
    FILE *fmain;

    fmain = fopen(filename,"w");

    if (fmain==NULL)
      {
	ErrorSetF(DMAP_ERROR_UNKNOWN,"dmap_write_dmap","Error creating file %s.",filename);
	return DMAP_ERROR_UNKNOWN;
      }

    fprintf(fmain,"###################\n");
    fprintf(fmain,"# tcl dmap script #\n");
    fprintf(fmain,"###################\n\n");

    fprintf(fmain,"#set working directory\n");
    fprintf(fmain," set work_dir [lindex [array get env DMAPTCL] 1]\n");
    fprintf(fmain," append work_dir \"/\"\n\n");

    fprintf(fmain,"#set tclext library directory\n");
    fprintf(fmain," set tclextlib_dir [lindex [array get env TCLEXTTCL] 1]\n");
    fprintf(fmain," append tclextlib_dir \"/libs/\"\n\n");

    fprintf(fmain,"#set image name\n");
    fprintf(fmain," set image_name $work_dir\n");
    fprintf(fmain," append image_name \"kloe_logo.gif\"\n\n");

    fprintf(fmain,"#load windows library\n");
    fprintf(fmain," set windows_lib_name $tclextlib_dir\n");
    fprintf(fmain," append windows_lib_name \"windows.tcl\"\n");
    fprintf(fmain," source $windows_lib_name\n");
    fprintf(fmain," unset windows_lib_name\n\n");

    fprintf(fmain,"proc dmap_slot_cal_scroll {win args} {\n");
    fprintf(fmain," eval {$win.fchan.ldata yview} $args\n");
    fprintf(fmain," eval {$win.fdet.ldata yview} $args\n");
    fprintf(fmain," eval {$win.fmodule.ldata yview} $args\n");
    fprintf(fmain," eval {$win.fplane.ldata yview} $args\n");
    fprintf(fmain," eval {$win.fcolumn.ldata yview} $args\n");
    fprintf(fmain," eval {$win.fside.ldata yview} $args\n");
    fprintf(fmain,"}; #end dmap_slot_cal_scroll\n\n");

    fprintf(fmain,"proc dmap_slot_chamb_scroll {win args} {\n");
    fprintf(fmain," eval {$win.fchan.ldata yview} $args\n");
    fprintf(fmain," eval {$win.flayer.ldata yview} $args\n");
    fprintf(fmain," eval {$win.fwire.ldata yview} $args\n");
    fprintf(fmain,"}; #end dmap_slot_chamb_scroll\n\n");

    fprintf(fmain,"proc dmap_slot_qcal_scroll {win args} {\n");
    fprintf(fmain," eval {$win.fchan.ldata yview} $args\n");
    fprintf(fmain," eval {$win.fdet.ldata yview} $args\n");
    fprintf(fmain," eval {$win.fmodule.ldata yview} $args\n");
    fprintf(fmain,"}; #end dmap_slot_qcal_scroll\n\n");

    for (chain_nr=1; chain_nr<=dmap_query_nr_chains(); chain_nr++)
      {
	int crate_nr;

	for (crate_nr=1; crate_nr<dmap_query_nr_crates(chain_nr); crate_nr++)
	  {
	    int board_nr;

	    for (board_nr=0; board_nr<dmap_query_nr_slots(chain_nr,crate_nr); board_nr++)
	      {
		int btype = dmap_query_btype(chain_nr,crate_nr,board_nr);
	    
		if (btype!=DMAP_ERROR_EMPTY)
		  {
		    fprintf(fmain,"#####################################\n");
		    fprintf(fmain,"#                                   #\n");
		    fprintf(fmain,"#       Slot %02i@%02i@%02i window        #\n",board_nr,crate_nr,chain_nr);
		    fprintf(fmain,"#                                   #\n");
		    fprintf(fmain,"#####################################\n\n");

		    switch (btype)
		      {
		      case DMAP_BTYPE_CALTDC:
		      case DMAP_BTYPE_CALADC:
			{
			  int chan_nr;
			  char acard[16];

			  fprintf(fmain,"proc dmap_slot_%i_%i_%i {basewin} {\n",chain_nr,crate_nr,board_nr);
			  if (btype==DMAP_BTYPE_CALADC)
			    fprintf(fmain," set btype \"CALADC\"\n\n");
			  else
			    fprintf(fmain," set btype \"CALTDC\"\n\n");

			  fprintf(fmain," set win $basewin.wslot%i\n\n",board_nr);

			  dmap_write_tcl_title_slot(fmain,system_name,chain_nr,crate_nr,board_nr);

			  dmap_write_tcl_row(fmain,"chan",6,"Chan");
			  dmap_write_tcl_row(fmain,"det",8,"Detector");
			  dmap_write_tcl_row(fmain,"module",8,"Module");
			  dmap_write_tcl_row(fmain,"plane",8,"Plane");
			  dmap_write_tcl_row(fmain,"column",8,"Column");
			  dmap_write_tcl_row(fmain,"side",8,"Side");

			  fprintf(fmain," ##scrolbar\n");
			  fprintf(fmain," scrollbar $fdata.sy -orient vertical -command \"dmap_slot_cal_scroll $fdata\"\n\n");

			  fprintf(fmain," pack $fdata.sy -side left -fill y\n\n");

			  fprintf(fmain," pack $fdata -side top -padx 5 -pady 5 -fill both -expand 1\n");

			  dmap_write_tcl_exit(fmain);

			  for (chan_nr=0; chan_nr<dmap_query_nr_chans(chain_nr,crate_nr,board_nr); chan_nr++)
			    {
			      DMAP_CHAN_EL el;

			      if (dmap_get(chain_nr,crate_nr,board_nr,chan_nr,&el)!=DMAP_ERROR_EMPTY)
				{
				  int amodule,aplane,acolumn,aside;
				  char adetector[16];

				  amodule = el.data.cal.module;
				  aplane = el.data.cal.plane;
				  acolumn = el.data.cal.column;
				  aside = el.data.cal.side;

				  if (el.data.cal.detector==DMAP_DET_ECAPA)
				    strcpy(adetector,"ECAPA");
				  else if (el.data.cal.detector==DMAP_DET_ECAPB)
				    strcpy(adetector,"ECAPB");
				  else
				    strcpy(adetector,"BARR");

				  fprintf(fmain," $fchan.ldata insert end %i\n",chan_nr);
				  fprintf(fmain," $fdet.ldata insert end \"%s\"\n",adetector);
				  fprintf(fmain," $fmodule.ldata insert end %i\n",amodule);
				  fprintf(fmain," $fplane.ldata insert end %i\n",aplane);
				  fprintf(fmain," $fcolumn.ldata insert end %i\n",acolumn);
				  fprintf(fmain," $fside.ldata insert end %i\n\n",aside);
				}
			    }
			  fprintf(fmain,"}; #end dmap_slot_cal\n");
			}
			break;
		      case DMAP_BTYPE_CHATDC:
			{
			  int chan_nr;


			  fprintf(fmain,"proc dmap_slot_%i_%i_%i {basewin} {\n",chain_nr,crate_nr,board_nr);
			  fprintf(fmain," set btype \"CHATDC\"\n\n");

			  fprintf(fmain," set win $basewin.wslot%i\n\n",board_nr);

			  dmap_write_tcl_title_slot(fmain,system_name,chain_nr,crate_nr,board_nr);

			  dmap_write_tcl_row(fmain,"chan",6,"Chan");
			  dmap_write_tcl_row(fmain,"layer",8,"Layer");
			  dmap_write_tcl_row(fmain,"wire",8,"Wire");

			  fprintf(fmain," ##scrolbar\n");
			  fprintf(fmain," scrollbar $fdata.sy -orient vertical -command \"dmap_slot_chamb_scroll $fdata\"\n\n");

			  fprintf(fmain," pack $fdata.sy -side left -fill y\n\n");

			  fprintf(fmain," pack $fdata -side top -padx 5 -pady 5 -fill both -expand 1\n");

			  dmap_write_tcl_exit(fmain);

			  for (chan_nr=0; chan_nr<dmap_query_nr_chans(chain_nr,crate_nr,board_nr); chan_nr++)
			    {
			      DMAP_CHAN_EL el;

			      if (dmap_get(chain_nr,crate_nr,board_nr,chan_nr,&el)!=DMAP_ERROR_EMPTY)
				{
				  int alayer,awire;

				  alayer = el.data.chamber.layer;
				  awire = el.data.chamber.wire;
				  fprintf(fmain," $fchan.ldata insert end %i\n",chan_nr);
				  fprintf(fmain," $flayer.ldata insert end %i\n",alayer);
				  fprintf(fmain," $fwire.ldata insert end %i\n\n",awire);
				}
			    }
			  fprintf(fmain,"}; #end dmap_slot_chamb\n");
			}
			break;
		      case DMAP_BTYPE_QCALTDC:
		      case DMAP_BTYPE_QCALADC:
			{
			  int chan_nr;
			  char acard[16];

			  fprintf(fmain,"proc dmap_slot_%i_%i_%i {basewin} {\n",chain_nr,crate_nr,board_nr);
			  if (btype==DMAP_BTYPE_QCALADC)
			    fprintf(fmain," set btype \"QCALADC\"\n\n");
			  else
			    fprintf(fmain," set btype \"QCALTDC\"\n\n");

			  fprintf(fmain," set win $basewin.wslot%i\n\n",board_nr);

			  dmap_write_tcl_title_slot(fmain,system_name,chain_nr,crate_nr,board_nr);

			  dmap_write_tcl_row(fmain,"chan",6,"Chan");
			  dmap_write_tcl_row(fmain,"det",8,"Detector");
			  dmap_write_tcl_row(fmain,"module",8,"Module");

			  fprintf(fmain," ##scrolbar\n");
			  fprintf(fmain," scrollbar $fdata.sy -orient vertical -command \"dmap_slot_qcal_scroll $fdata\"\n\n");

			  fprintf(fmain," pack $fdata.sy -side left -fill y\n\n");

			  fprintf(fmain," pack $fdata -side top -padx 5 -pady 5 -fill both -expand 1\n");

			  dmap_write_tcl_exit(fmain);

			  for (chan_nr=0; chan_nr<dmap_query_nr_chans(chain_nr,crate_nr,board_nr); chan_nr++)
			    {
			      DMAP_CHAN_EL el;

			      if (dmap_get(chain_nr,crate_nr,board_nr,chan_nr,&el)!=DMAP_ERROR_EMPTY)
				{
				  int amodule;
				  char adetector[16];

				  amodule = el.data.qcal.module;

				  if (el.data.qcal.detector==DMAP_DET_QCALA)
				    strcpy(adetector,"QCALA");
				  else
				    strcpy(adetector,"QCALB");

				  fprintf(fmain," $fchan.ldata insert end %i\n",chan_nr);
				  fprintf(fmain," $fdet.ldata insert end \"%s\"\n",adetector);
				  fprintf(fmain," $fmodule.ldata insert end %i\n",amodule);
				}
			    }
			  fprintf(fmain,"}; #end dmap_slot_qcal\n");
			}
			break;
		      }
		  }
	      }
	    fprintf(fmain,"#####################################\n");
	    fprintf(fmain,"#                                   #\n");
	    fprintf(fmain,"#         Crate %02i@%02i window        #\n",crate_nr,chain_nr);
	    fprintf(fmain,"#                                   #\n");
	    fprintf(fmain,"#####################################\n\n");
	    
	    fprintf(fmain,"proc dmap_crate_%i_%i {basewin} {\n",chain_nr,crate_nr);
	    fprintf(fmain," set win $basewin.wcrate%i\n\n",crate_nr);
	    fprintf(fmain," if {[window_exist $win]} {\n\treturn 1;\n }\n\n");
	    
	    fprintf(fmain," toplevel $win\n");
	    fprintf(fmain," wm title $win \"%s Chain %i Crate %i\"\n\n",system_name,chain_nr,crate_nr);
	    
	    fprintf(fmain," #title frame\n");
	    fprintf(fmain," set ftitle $win.ftitle\n");
	    fprintf(fmain," frame $ftitle -relief groove -borderwidth 1\n\n");
	    
	    fprintf(fmain," label $ftitle.lchain -text \"Chain: %i\"\n",chain_nr);
	    fprintf(fmain," label $ftitle.lcrate -text \"Crate: %i\"\n\n",crate_nr);
	    
	    fprintf(fmain," pack $ftitle.lchain -side top -anchor nw\n");
	    fprintf(fmain," pack $ftitle.lcrate -side top -anchor nw\n\n");
	    fprintf(fmain," pack $ftitle -side top -padx 5 -pady 5 -fill x\n\n");
	    
	    fprintf(fmain," #buttons frame\n");
	    fprintf(fmain," set fbut $win.fbut\n");
	    fprintf(fmain," frame $fbut\n\n");
	    
	    for (board_nr=0; board_nr<dmap_query_nr_slots(chain_nr,crate_nr); board_nr++)
	      if (dmap_query_btype(chain_nr,crate_nr,board_nr)!=DMAP_ERROR_EMPTY)
		{
		  fprintf(fmain,"     button $fbut.b%i -text \"Slot %i\" -command \"dmap_slot_%i_%i_%i $win\"\n",board_nr,board_nr,chain_nr,crate_nr,board_nr);
		  fprintf(fmain,"     pack $fbut.b%i -side top -fill x -expand 1\n",board_nr);
		}
	    
	    fprintf(fmain," pack $fbut -side top -padx 5 -pady 5 -fill x -expand 1\n\n");
	    
	    dmap_write_tcl_exit(fmain);
	    
	    fprintf(fmain,"}; #end dmap_crate\n\n");
	  }

	fprintf(fmain,"#####################################\n");
	fprintf(fmain,"#                                   #\n");
	fprintf(fmain,"#         Chain %02i window           #\n",chain_nr);
	fprintf(fmain,"#                                   #\n");
	fprintf(fmain,"#####################################\n\n");

	fprintf(fmain,"proc dmap_chain_%i {} {\n",chain_nr);
	fprintf(fmain," set basewin .\n");
	fprintf(fmain," set win .wchain%s\n\n",chain_nr);
	fprintf(fmain," if {[window_exist $win]} {\n\treturn 1;\n }\n\n");

	fprintf(fmain," toplevel $win\n");
	fprintf(fmain," wm title $win \"%s Chain %i\"\n\n",system_name,chain_nr);

	fprintf(fmain," #title frame\n");
	fprintf(fmain," set ftitle $win.ftitle\n");
	fprintf(fmain," frame $ftitle -relief groove -borderwidth 1\n\n");

	fprintf(fmain," label $ftitle.lchain -text \"Chain: %i\"\n",chain_nr);
	fprintf(fmain," pack $ftitle.lchain -side top -anchor nw\n");
	fprintf(fmain," pack $ftitle -side top -padx 5 -pady 5 -fill x\n\n");

	fprintf(fmain," #buttons frame\n");
	fprintf(fmain," set fbut $win.fbut\n");
	fprintf(fmain," frame $fbut\n\n");

	for (crate_nr=1; crate_nr<dmap_query_nr_crates(chain_nr); crate_nr++)
	  {
	    fprintf(fmain,"   button $fbut.b%i -text \"Crate %i\" -command \"dmap_crate_%i_%i $win\"\n\n",crate_nr,crate_nr,chain_nr,crate_nr);
	    fprintf(fmain,"   pack $fbut.b%i -side top -fill x -expand 1\n",crate_nr);
	  }

	fprintf(fmain," pack $fbut -side top -padx 5 -pady 5 -fill x -expand 1\n\n");

	dmap_write_tcl_exit(fmain);

	fprintf(fmain,"}; #end dmap_chain\n\n");
      }

    fprintf(fmain,"#####################################\n");
    fprintf(fmain,"#                                   #\n");
    fprintf(fmain,"#           Main window             #\n");
    fprintf(fmain,"#                                   #\n");
    fprintf(fmain,"#####################################\n\n");

    fprintf(fmain,"wm title . \"%s\"\n\n",system_name);

    fprintf(fmain,"#all buttons frame\n");
    fprintf(fmain,"set fabut .fabut\n");
    fprintf(fmain,"frame $fabut\n\n");

    fprintf(fmain,"for {set j 0} {$j<3} {incr j} {\n");
    fprintf(fmain,"  #buttons frame\n");
    fprintf(fmain,"  set fbut $fabut.fbut$j\n");
    fprintf(fmain,"  frame $fbut\n\n");

    fprintf(fmain,"  for {set i 1} {$i<=4} {incr i} {\n");
    fprintf(fmain,"    set k [expr $j*4+$i]\n");
    fprintf(fmain,"    button $fbut.b$i -text \"Chain $k\" -command \"dmap_chain_$k\"\n\n");
    fprintf(fmain,"    pack $fbut.b$i -side top -fill x -expand 1\n");
    fprintf(fmain,"  }; #end for\n\n");

    fprintf(fmain,"  pack $fbut -side left -padx 2 -fill x -expand 1\n");
    fprintf(fmain,"}\n\n");

    fprintf(fmain,"pack $fabut -side top -padx 5 -pady 5 -fill x -expand 1\n\n");

    fprintf(fmain,"#exit frame\n");
    fprintf(fmain,"set fexit .fexit\n");
    fprintf(fmain,"frame $fexit\n");
    fprintf(fmain,"button $fexit.bexit -text \"Exit\" -command \"exit\"\n");
    fprintf(fmain,"pack $fexit.bexit\n");
    fprintf(fmain,"pack $fexit -side top -pady 5\n");

    fclose(fmain);
  }

  return DMAP_ERROR_OK;
}

int main(int argc, char *argv[])
{
  int res;
  DMAP_CHAN_EL data;

  if (argc!=5)
    {
      printf("Use: dmap2tcl2 GeoVmeMap dmap filename title\n");
      return 1;
    }

  GeoVmeLoadMap(argv[1]);

  if (dmap_load(argv[2])!=DMAP_ERROR_OK)
    {
      printf("Error in dmap_load\n");
      return 2;
    }

  if (dmap_write_tcl(argv[3],argv[4])!=DMAP_ERROR_OK)

    {
      printf("Error in dmap_write_tcl\n");
      return 3;
    }

  return 0;
}