int main() {

   Setup::SetupProgram(KEYBOARD | MOUSE );
   Setup::SetupScreen( 1050, 650,WINDOWED, 8 );
   Settings::SetAntialiasing( true );

   install_joystick(JOY_TYPE_AUTODETECT);
   calibrate_joystick_name(0);

   install_timer();

   LOCK_VARIABLE(ticks);
   LOCK_FUNCTION(ticker);
   install_int_ex(ticker , ticker_rate);
   LOCK_VARIABLE(ticks_move);
   LOCK_FUNCTION(ticker_move);

   if(install_int_ex(ticker_move , ticker_rate)!=0){sprintf(string_joystick_state,"Error Initializing Joystick !");};
   if(!num_joysticks){sprintf(string_joystick_state,"No Joystick detected!");}
   else { sprintf(string_joystick_state,"%d Joysticks detected",num_joysticks);}

   Load_Fonts();





 if(set_display_switch_mode(SWITCH_BACKGROUND))
 {set_display_switch_mode(SWITCH_BACKAMNESIA);}



Load_Tracker();
prepare_move_values(dock_move_selected);//prepa
Prepare_Cross_Spline(dock_move_selected);



char udp_buffer[UDPMAX_CAR];

int sinsize;
int nbrbytessended=0;
SOCKET sock;

char broadcast='1';
WSADATA wsa;
WSAStartup(MAKEWORD(2,0),&wsa);
SOCKADDR_IN sin;
sin.sin_family=AF_INET;

sin.sin_addr.s_addr=inet_addr(ip);
sin.sin_port=htons(udp_port);
sock=socket(AF_INET,SOCK_DGRAM,0); //On initialise le socket avec SOCK_DGRAM pour dire qu'on est en UDP
sprintf(string_Last_Order,"INIT socket");
 if (setsockopt(sock, SOL_SOCKET, SO_BROADCAST, &broadcast,
        sizeof broadcast) == -1) {
        perror("\a\nsetsockopt (SO_BROADCAST)");
        exit(1);
    }

bind(sock,(SOCKADDR*)&sin,sizeof(sin)); //Liaison entre la structure et la socket
sprintf(string_Last_Order,"BIDING socket");
sinsize=sizeof(sin);
memset(udp_buffer,0,sizeof(udp_buffer));


int old_iris=0;
int old_focus=0;
int old_zoom=0;
int old_iris_fine=0;
int old_focus_fine=0;
int old_zoom_fine=0;

     sprintf(string_infos,"Compilation 14nov 09 / Pan= %d Tilt= %d Iris= %d Focus= %d Zoom= %d/ IP: %s / Port: %d",xadress,yadress,irisadress,focusadress,zoomadress,ip, udp_port);


 while(index_quit!=1)
 {


      while(ticks == 0) {rest(1);}
      ticks_passed = ticks;
      ticks = 0;
      poll_joystick();



       Canvas::Fill(CouleurFond);

       petitchiffre.Print(string_infos,10,10);


       tracker_box(xtrack_window, ytrack_window);






       if(Thetracker_X!=old_trackerX || Thetracker_Y!=old_trackerY ||
       Thetracker_X_fine!=old_trackerX_fine || Thetracker_Y_fine!=old_trackerY_fine
       || iris_state!= old_iris   ||  focus_state!=old_focus  || zoom_state!=old_zoom
       )
      {

      if(index_rescale_signal==0)
      {
      udp_buffer[xadress-1]=buffer_tracker[xadress]+position_defaut[0];  udp_buffer[yadress-1]=buffer_tracker[yadress]+position_defaut[1];

      if (buffer_tracker[xadress]+position_defaut[0]<0) {udp_buffer[xadress-1]=0;}
      if (buffer_tracker[xadress]+position_defaut[0]>255) {udp_buffer[xadress-1]=255;}
      if (buffer_tracker[yadress]+position_defaut[1]<0) {udp_buffer[yadress-1]=0;}
      if (buffer_tracker[yadress]+position_defaut[1]>255) {udp_buffer[yadress-1]=255;}
      }

      else if(index_rescale_signal==1)
      {udp_buffer[xadress-1]=buffer_tracker_rescaled[xadress];  udp_buffer[yadress-1]=buffer_tracker_rescaled[yadress];}

      if(tracker_mode==1){udp_buffer[xadress]=buffer_tracker[xadress+1];  udp_buffer[yadress]=buffer_tracker[yadress+1];}

      udp_buffer[irisadress-1]=iris_state;
      udp_buffer[focusadress-1]=focus_state;
      udp_buffer[zoomadress-1]=zoom_state;


      nbrbytessended=sendto(sock,udp_buffer,UDPMAX_CAR,0,(SOCKADDR*)&sin,sinsize);

      old_trackerX=Thetracker_X; old_trackerY=Thetracker_Y;
      old_trackerX_fine=Thetracker_X_fine; old_trackerY_fine=Thetracker_Y_fine;
      old_iris=iris_state;
      old_focus=focus_state;
      old_zoom=zoom_state;
      old_iris_fine=iris_state_fine;
      old_focus_fine=focus_state_fine;
      old_zoom_fine=zoom_state_fine;

      }

     Line( Vec2D( mouse_x-1,mouse_y-1), Vec2D( mouse_x+20,mouse_y+30),3.0).Draw( CouleurFader );
     Line( Vec2D( mouse_x+20,mouse_y+30), Vec2D( mouse_x+30,mouse_y+10),3.0).Draw( CouleurFader );
     Line( Vec2D( mouse_x+30,mouse_y+10), Vec2D( mouse_x-1,mouse_y-1),3.0).Draw( CouleurFader );
     triangle(screen,mouse_x,mouse_y, mouse_x+20,mouse_y+30,mouse_x+30,mouse_y+10,makecol(255,255,255));
     if(mouse_b)
     {triangle(screen,mouse_x,mouse_y, mouse_x+20,mouse_y+30,mouse_x+30,mouse_y+10,makecol(0,0,0)); }


      Canvas::Refresh();

}


remove_timer();
shutdown(sock,2);
closesocket(sock);
allegro_exit();
return 0;
}