/*
  Programmatore:     Matteo Lanini
  Titolo:            hash.c
 
  Data di creazione: 01.02.2001

  Descrizione:     simula l'interfaccia grafica di un motore passo-passo
  Compilazione:    cc grafica_motore.c -lXm -lXt -lX11
  Riga di comando: a.out
  Opzioni da riga di comando: -bg colore (background)
                              -fg colore (foreground)
			      
			      es: a.out -bg yellow -fg red  

*/

#include <stdio.h>
#include <unistd.h>
#include <time.h>

#include <Xm/Xm.h>
#include <Xm/MainW.h>
#include <Xm/CascadeB.h>
#include <Xm/Label.h>
#include <Xm/PushB.h>
#include <Xm/Form.h>
#include <Xm/Scale.h>
#include <Xm/DrawingA.h>

Widget label,draw;
Display *display;
Screen *screen_ptr;
GC gc;
XGCValues gcv;
String rotazione[] = { "Senso orario",  "Senso antiorario"};
int pos,rot;

void avanza_giro()
{
/*routine non completata*/
}

void avanza_passo()
{   
  /*esegue la grafica del motore in X11 nell'area draw*/
  
  /*impostazioni*/

  Window win = XtWindow(draw);
  pos=pos+1;
  pos=pos%72;

  gcv.foreground = BlackPixelOfScreen(screen_ptr);
  XtVaGetValues(draw,XmNuserData,&gc,NULL);

  /*grafica (imposta il colore degli oggetti e li disegna)*/

  XSetForeground(display,gc,190000);
  XDrawArc(display,win,gc,1,1,198,198,0*64,360*64);	 
  XSetForeground(display,gc,1200);
  XFillArc(display,win,gc,4,4,192,192,0*64,360*64);	
  
  
  XSetForeground(display,gc,1);
  if(rot==1)
    {      
      XFillArc(display,win,gc,4,4,192,192,0*64,((pos)*5)*64);
      XSetForeground(display,gc,1200);
      XFillArc(display,win,gc,4,4,192,192,0*64,(pos-1)*5*64);	
    }
  else
    {
      XFillArc(display,win,gc,4,4,192,192,(0)*64,(360-((1*pos-1)*5))*64);
      XSetForeground(display,gc,1200);
      XFillArc(display,win,gc,4,4,192,192,0*64,(360-(1*pos)*5)*64);	
    }
  XSetForeground(display,gc,190000);
  XFillArc(display,win,gc,30,30,140,140,0*64,360*64);	  
}

void scale_cbk(Widget w, int data, XmScaleCallbackStruct *scale_struct)     
{
  /*imposta il valore di ritardo (teorico) per gli output*/ 
  printf("valore scale: %3d\n",scale_struct->value);
}

void  menu_call(Widget w, int index)
{
  /*scelta del senso di rotazione*/
  int n =0;
  Arg args[1];
  
  XmString   label_str;     
  label_str = XmStringCreateLocalized(rotazione[index]);
  
  XtSetArg(args[n],XmNlabelString, label_str);      
  ++n;
  XtSetValues(label, args, n);  
 
  if (index==0)
    rot=-1;
  else
    rot=1;
}

void help_call()     
{
  printf("\nArrangiati, non posso mica dirti tutto... !!!\n");  
}

void quit_call(Widget w, int index) /* w = menu item selezionato, index = indice all'interno del menu selezionato */     
{  
  /*routine di fine programma*/
  if (index == 0)
    exit(0);  
}

void main(int argc, char **argv)     
{
  Widget top_wid, main_w, help, label1,label2,label3;
  Widget menubar, menu, form,scale;
  Widget CmdPasso,CmdGira;
  XtAppContext app;
  
  XColor back, fore, spare;
  XmString  quit,menu_str,help_str,orario,antiorario,label_str,label1_str,label2_str,label3_str;
  
  int n = 0;
  Arg args[2];
  
  printf("argomenti da riga di comando:%d\n",argc);
  
  
  /* Inizializza il toolkit */
  
  top_wid = XtVaAppInitialize(&app, "Demos",NULL, 0, &argc, argv, NULL, NULL);
  
  form = XtVaCreateWidget("form", xmFormWidgetClass, top_wid,
			  XmNfractionBase,     12,
			  //crea una griglia di 12 x 12 
			  NULL);
  
  XtManageChild(form);  
  
  /* Crea una DrawingArea widget. */

  draw = XtVaCreateWidget("draw",
			  xmDrawingAreaWidgetClass, form,
			  XmNtopAttachment,    XmATTACH_POSITION,
			  XmNtopPosition,      2,
			  XmNleftAttachment,   XmATTACH_POSITION,
			  XmNleftPosition,     8,			  
			  XmNwidth,            200,
			  XmNheight,           200,
			  NULL);
  
  /* prende XLib Display Screen e Window ID's  per l'oggetto draw */
  
  display = XtDisplay(draw);
  screen_ptr = XtScreen(draw);
  
  gcv.foreground = BlackPixelOfScreen(screen_ptr);
  gc = XCreateGC(display,
		 RootWindowOfScreen(screen_ptr), GCForeground, &gcv);
  XtVaSetValues(draw, XmNuserData, gc, NULL);
  
  XtManageChild(draw);
  
  
  /* la finestra principale conterra' un  MenuBar e una Label  */
  
  /* Crea un MenuBar che contiene due menu */

  quit = XmStringCreateLocalized("Quit");
  menu_str = XmStringCreateLocalized("Rotazione");
  
  
  menubar = XmVaCreateSimpleMenuBar(form, "menubar",
				    XmVaCASCADEBUTTON, quit, 'Q',
				    XmVaCASCADEBUTTON, menu_str, 'R',
				    XmNtopAttachment,    XmATTACH_POSITION,
				    XmNtopPosition,      0,
				    XmNbottomAttachment, XmATTACH_POSITION,
				    XmNbottomPosition,   1,
				    XmNleftAttachment,   XmATTACH_POSITION,
				    XmNleftPosition,     0,
				    XmNrightAttachment,   XmATTACH_POSITION,
				    XmNrightPosition,    15,
				    NULL);
  
  
  XmStringFree(menu_str);
  
  /* Il primo menu serve per il l'operazione quit -- la callback e' quit_call() */
  
  XmVaCreateSimplePulldownMenu(menubar, "quit_menu", 0, quit_call,
			       XmVaPUSHBUTTON, quit, 'Q', NULL, NULL,
			       NULL);
  XmStringFree(quit);
    
  /* Il secondo menu serva e selezionare il senso di rotazione menu -- la callback e' menu_call() */
 
  orario =     XmStringCreateLocalized(rotazione[0]);
  antiorario = XmStringCreateLocalized(rotazione[1]);
  
  menu = XmVaCreateSimplePulldownMenu(menubar, "edit_menu", 1, 
				      menu_call,
				      XmVaRADIOBUTTON, orario, 'O', NULL, NULL,
				      XmVaRADIOBUTTON, antiorario, 'A', NULL, NULL,
				      XmNradioBehavior, True,    
				      /* select radio behavior in Menu */ 
				      XmNradioAlwaysOne, True, 
				      NULL);
  
  CmdPasso = XtVaCreateManagedWidget("passo",
				     xmPushButtonWidgetClass, form,
				     XmNtopAttachment,    XmATTACH_POSITION,
				     XmNtopPosition,      2,
				     XmNbottomAttachment, XmATTACH_POSITION,
				     XmNbottomPosition,   3,
				     XmNleftAttachment,   XmATTACH_POSITION,
				     XmNleftPosition,     1,
				     XmNrightAttachment,   XmATTACH_POSITION,
				     XmNrightPosition,    3,				    
				     NULL); 
  
  CmdGira =XtVaCreateManagedWidget("giro",
				   xmPushButtonWidgetClass, form,
				   XmNtopAttachment,    XmATTACH_POSITION,
				   XmNtopPosition,      4,
				   XmNbottomAttachment, XmATTACH_POSITION,
				   XmNbottomPosition,   5,
				   XmNleftAttachment,   XmATTACH_POSITION,
				   XmNleftPosition,     1,
				   XmNrightAttachment,   XmATTACH_POSITION,
				   XmNrightPosition,    3,				    
				   NULL); 
  
  XmStringFree(orario);
  XmStringFree(antiorario);  
  
  help = XtVaCreateManagedWidget( "Aiuto",
				  xmCascadeButtonWidgetClass, menubar,
				  XmNmnemonic, 'A',
				  NULL);
  
  XtAddCallback(help,     XmNactivateCallback, help_call, NULL);
  XtAddCallback(CmdPasso, XmNactivateCallback, avanza_passo, NULL);
  XtAddCallback(CmdGira,  XmNactivateCallback, avanza_giro, NULL);
  
  /* Dice al menubar qual'e' il pulsante di help (da mettere a destra)*/
    
  XtSetArg(args[n],XmNmenuHelpWidget,help);
  n++;
  XtSetValues(menubar,args,n);
  n=0; /* reset n */
    
  XtManageChild(menubar);
  
  /* crea le label text widget */
  
  label_str = XmStringCreateLocalized ("Seleziona\nil senso di rotazione");
  label1_str = XmStringCreateLocalized("Clicca qui per avanzare\ndi un passo");
  label2_str = XmStringCreateLocalized("Clicca qui per avanzare\ndi un giro");
  label3_str = XmStringCreateLocalized("Impostazione del ritardo\nper outport");
  
  label = XtVaCreateManagedWidget("main_window",
				  xmLabelWidgetClass,  form,
				  XmNtopAttachment,    XmATTACH_POSITION,
				  XmNtopPosition,      9,
				  XmNbottomAttachment, XmATTACH_POSITION,
				  XmNbottomPosition,   10,
				  XmNleftAttachment,   XmATTACH_POSITION,
				  XmNleftPosition,     8,
				  XmNrightAttachment,  XmATTACH_POSITION,
				  XmNrightPosition,    11,
				  XmNlabelString, label_str,
				  NULL);

  label1 = XtVaCreateManagedWidget("etichetta1",
			    xmLabelWidgetClass,  form,
			    XmNtopAttachment,    XmATTACH_POSITION,
			    XmNtopPosition,      2,
			    XmNbottomAttachment, XmATTACH_POSITION,
			    XmNbottomPosition,   3,
			    XmNleftAttachment,   XmATTACH_POSITION,
			    XmNleftPosition,     4,
			    XmNrightAttachment,  XmATTACH_POSITION,
			    XmNrightPosition,    9,
			    XmNlabelString,      label1_str,
			    XmNalignment,        XmALIGNMENT_BEGINNING,
			    NULL);

  label2 = XtVaCreateManagedWidget("etichetta2",
				   xmLabelWidgetClass,  form,
				   XmNtopAttachment,    XmATTACH_POSITION,
				   XmNtopPosition,      4,
				   XmNbottomAttachment, XmATTACH_POSITION,
				   XmNbottomPosition,   5,
				   XmNleftAttachment,   XmATTACH_POSITION,
				   XmNleftPosition,     4,
				   XmNrightAttachment,  XmATTACH_POSITION,
				   XmNrightPosition,    9,
				   XmNlabelString,      label2_str,
				   XmNalignment,        XmALIGNMENT_BEGINNING,
				   NULL);
 
  label3 = XtVaCreateManagedWidget("etichetta3",
				   xmLabelWidgetClass,  form,
				   XmNtopAttachment,    XmATTACH_POSITION,
				   XmNtopPosition,      6,
				   XmNbottomAttachment, XmATTACH_POSITION,
				   XmNbottomPosition,   7,
				   XmNleftAttachment,   XmATTACH_POSITION,
				   XmNleftPosition,     4,
				   XmNrightAttachment,  XmATTACH_POSITION,
				   XmNrightPosition,    9,
				   XmNlabelString,      label3_str,
				   XmNalignment,        XmALIGNMENT_BEGINNING,
				   NULL);

  scale = XtVaCreateManagedWidget("scale",
				  xmScaleWidgetClass,  form,
				  XmNorientation,      XmHORIZONTAL,
				  XmNmaximum,          32000,
				  XmNdecimalPoints,    0,
				  XmNheight,           100,
				  XmNtopAttachment,    XmATTACH_POSITION,
				  XmNtopPosition,      6,
	      			  XmNleftAttachment,   XmATTACH_POSITION,
				  XmNleftPosition,     1,
				  XmNrightAttachment,  XmATTACH_POSITION,
				  XmNrightPosition,    3,	
				  XmNshowValue,        True,
				  NULL);
 
  XtAddCallback(scale,XmNvalueChangedCallback, scale_cbk,NULL);
  
  XtRealizeWidget(top_wid);
  XtAppMainLoop(app);
}










