/************************************************/
/*                                              */
/* File        : dmap2tcl.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)
{
  fprintf(fmain," if {[window_exist $win]} {\n\treturn 1;\n }\n\n");

  fprintf(fmain," toplevel $win\n");
  fprintf(fmain," wm title $win \"$title Chain $chain_nr Crate $crate_nr Slot $slot_nr Type $btype\"\n\n");

  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: $chain_nr\"\n");
  fprintf(fmain," label $ftitle.lcrate -text \"Crate: $crate_nr\"\n");
  fprintf(fmain," label $ftitle.lslot -text \"Slot: $slot_nr\"\n");
  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,"set dmap_title \"%s\"\n\n",system_name);

    fprintf(fmain,"set dmap_data {\n");

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

	fprintf(fmain,"{\n");

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

	    fprintf(fmain,"{\n");
	    
	    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);

		fprintf(fmain,"{");
	    
		if (btype!=DMAP_ERROR_EMPTY)
		  {
		    switch (btype)
		      {
		      case DMAP_BTYPE_CALTDC:
		      case DMAP_BTYPE_CALADC:
			{
			  int chan_nr;
			  char acard[16];

			  fprintf(fmain,"cal ");
			  if (btype==DMAP_BTYPE_CALADC)
			    fprintf(fmain,"CALADC");
			  else
			    fprintf(fmain,"CALTDC");

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

			      fprintf(fmain,"{");

			      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,"%s %i %i %i %i",
					  adetector,amodule,aplane,acolumn,aside);
				}
			      fprintf(fmain,"} ");
			    }
			  fprintf(fmain,"} ");
			}
			break;
		      case DMAP_BTYPE_CHATDC:
			{
			  int chan_nr;

			  fprintf(fmain,"chamb {");

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

			      fprintf(fmain,"{");
			      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,"%i %i",
					  alayer,awire);
				}
			      fprintf(fmain,"} ");
			    }
			  fprintf(fmain,"} ");
			}
			break;
		      case DMAP_BTYPE_QCALTDC:
		      case DMAP_BTYPE_QCALADC:
			{
			  int chan_nr;
			  char acard[16];

			  fprintf(fmain,"qcal ");
			  if (btype==DMAP_BTYPE_QCALADC)
			    fprintf(fmain,"QCALADC");
			  else
			    fprintf(fmain,"QCALTDC");

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

			      fprintf(fmain,"{");
			      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,"%s %i",
					  adetector,amodule);
				}
			      fprintf(fmain,"} ");
			    }
			  fprintf(fmain,"} ");
			}
			break;
		      }
		  }
		fprintf(fmain,"}\n");
	      }
	    fprintf(fmain,"}\n");
	  }

	fprintf(fmain,"}\n");
      }

    fprintf(fmain,"}\n\n");

    fprintf(fmain,"#####################################\n");
    fprintf(fmain,"#                                   #\n");
    fprintf(fmain,"#           Slot window             #\n");
    fprintf(fmain,"#                                   #\n");
    fprintf(fmain,"#####################################\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_cal {basewin chain_nr crate_nr slot_nr title slot_data} {\n");
    fprintf(fmain," set btype [lindex $slot_data 1]\n\n");
    fprintf(fmain," set win $basewin.wslot$slot_nr\n\n");

    dmap_write_tcl_title_slot(fmain);

    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);

    fprintf(fmain," set i 0\n");
    fprintf(fmain," foreach {chan_data} [lindex $slot_data 2] {\n");
    fprintf(fmain,"   if {$chan_data!=\"\"} {\n");
    fprintf(fmain,"     $fchan.ldata insert end $i\n");
    fprintf(fmain,"     $fdet.ldata insert end [lindex $chan_data 0]\n");
    fprintf(fmain,"     $fmodule.ldata insert end [lindex $chan_data 1]\n");
    fprintf(fmain,"     $fplane.ldata insert end [lindex $chan_data 2]\n");
    fprintf(fmain,"     $fcolumn.ldata insert end [lindex $chan_data 3]\n");
    fprintf(fmain,"     $fside.ldata insert end [lindex $chan_data 4]\n");
    fprintf(fmain,"    }\n\n");

    fprintf(fmain,"   incr i\n");
    fprintf(fmain," }; #end for\n");
    fprintf(fmain,"}; #end dmap_slot_cal\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_chamb {basewin chain_nr crate_nr slot_nr title slot_data} {\n");
    fprintf(fmain," set btype \"CHATDC\"\n\n");
    fprintf(fmain," set win $basewin.wslot$slot_nr\n\n");

    fprintf(fmain," if {[window_exist $win]} {\n\treturn 1;\n}\n\n");

    fprintf(fmain," toplevel $win\n");
    fprintf(fmain," wm title $win \"$title Chain $chain_nr Crate $crate_nr Slot $slot_nr Type $btype\"\n\n");

    dmap_write_tcl_title_slot(fmain);

    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);

    fprintf(fmain," set i 0\n");
    fprintf(fmain," foreach {chan_data} [lindex $slot_data 2] {\n");
    fprintf(fmain,"   if {$chan_data!=\"\"} {\n");
    fprintf(fmain,"     $fchan.ldata insert end $i\n");
    fprintf(fmain,"     $flayer.ldata insert end [lindex $chan_data 0]\n");
    fprintf(fmain,"     $fwire.ldata insert end [lindex $chan_data 1]\n");
    fprintf(fmain,"    }\n\n");

    fprintf(fmain,"   incr i\n");
    fprintf(fmain," }; #end for\n");
    fprintf(fmain,"}; #end dmap_slot_chamb\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");

    fprintf(fmain,"proc dmap_slot_qcal {basewin chain_nr crate_nr slot_nr title slot_data} {\n");
    fprintf(fmain," set btype [lindex $slot_data 1]\n\n");
    fprintf(fmain," set win $basewin.wslot$slot_nr\n\n");

    dmap_write_tcl_title_slot(fmain);

    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);

    fprintf(fmain," set i 0\n");
    fprintf(fmain," foreach {chan_data} [lindex $slot_data 2] {\n");
    fprintf(fmain,"   if {$chan_data!=\"\"} {\n");
    fprintf(fmain,"     $fchan.ldata insert end $i\n");
    fprintf(fmain,"     $fdet.ldata insert end [lindex $chan_data 0]\n");
    fprintf(fmain,"     $fmodule.ldata insert end [lindex $chan_data 1]\n");
    fprintf(fmain,"    }\n\n");

    fprintf(fmain,"   incr i\n");
    fprintf(fmain," }; #end for\n");
    fprintf(fmain,"}; #end dmap_slot_qcal\n");

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

    fprintf(fmain,"proc dmap_crate {basewin chain_nr crate_nr title crate_data} {\n");
    fprintf(fmain," set win $basewin.wcrate$crate_nr\n\n");
    fprintf(fmain," if {[window_exist $win]} {\n\treturn 1;\n }\n\n");

    fprintf(fmain," toplevel $win\n");
    fprintf(fmain," wm title $win \"$title Chain $chain_nr Crate $crate_nr\"\n\n");

    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: $chain_nr\"\n");
    fprintf(fmain," label $ftitle.lcrate -text \"Crate: $crate_nr\"\n\n");

    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");

    fprintf(fmain," set i 0\n");
    fprintf(fmain," foreach {slot_data} $crate_data {\n");
    fprintf(fmain,"   if {$slot_data!=\"\"} {\n");
    fprintf(fmain,"     button $fbut.b$i -text \"Slot $i\" -command \"dmap_slot_[lindex $slot_data 0] $win $chain_nr $crate_nr $i \\\"$title\\\" \\\"$slot_data\\\"\"\n");
    fprintf(fmain,"     pack $fbut.b$i -side top -fill x -expand 1\n");
    fprintf(fmain,"   }\n\n");

    fprintf(fmain,"   incr i\n");
    fprintf(fmain," }; #end for\n\n");

    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 window            #\n");
    fprintf(fmain,"#                                   #\n");
    fprintf(fmain,"#####################################\n\n");

    fprintf(fmain,"proc dmap_chain {chain_nr title chain_data} {\n");
    fprintf(fmain," set basewin .\n");
    fprintf(fmain," set win .wchain$chain_nr\n\n");
    fprintf(fmain," if {[window_exist $win]} {\n\treturn 1;\n }\n\n");

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

    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: $chain_nr\"\n");
    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");

    fprintf(fmain," set i 1\n");
    fprintf(fmain," foreach {crate_data} $chain_data {\n");
    fprintf(fmain,"   button $fbut.b$i -text \"Crate $i\" -command \"dmap_crate $win $chain_nr $i \\\"$title\\\" \\\"$crate_data\\\"\"\n\n");
    fprintf(fmain,"   pack $fbut.b$i -side top -fill x -expand 1\n");
    fprintf(fmain,"   incr i\n");
    fprintf(fmain," }; #end for\n\n");

    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 . $dmap_title\n\n");

    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,"    set chain_data [lindex $dmap_data [expr $k-1]]\n");
    fprintf(fmain,"    button $fbut.b$i -text \"Chain $k\" -command \"dmap_chain $k \\\"$dmap_title\\\" \\\"$chain_data\\\"\"\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: dmap2tcl 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;
}