unit Unit1;

interface

uses
 Windows, Messages, Graphics, Controls, Forms, Dialogs, IdWinsock2, stdctrls,
  SysUtils, Classes, IdBaseComponent, IdAntiFreezeBase, IdAntiFreeze,
  IdComponent, IdUDPBase, IdUDPClient, IdStack, IdUDPServer, IdSocketHandle,
  ExtCtrls, Buttons, Spin;



type
  TForm1 = class(TForm)
    IdUDPClient1: TIdUDPClient;
    Memo2: TMemo;
    GroupBox2: TGroupBox;
    GroupBox1: TGroupBox;
    SpinEdit1: TSpinEdit;
    SpinEdit2: TSpinEdit;
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    SpinEdit3: TSpinEdit;
    Button1: TButton;
    GroupBox3: TGroupBox;
    Button2: TButton;
    Label4: TLabel;
    Label5: TLabel;
    SpinEdit4: TSpinEdit;
    SpinEdit5: TSpinEdit;
    Label6: TLabel;
    SpinEdit6: TSpinEdit;
    Label7: TLabel;
    SpinEdit7: TSpinEdit;
    Label8: TLabel;
    SpinEdit8: TSpinEdit;
    GroupBox4: TGroupBox;
    Button3: TButton;
    Label9: TLabel;
    Label10: TLabel;
    Label11: TLabel;
    Label12: TLabel;
    Label13: TLabel;
    SpinEdit9: TSpinEdit;
    SpinEdit10: TSpinEdit;
    SpinEdit11: TSpinEdit;
    SpinEdit12: TSpinEdit;
    SpinEdit13: TSpinEdit;
    GroupBox5: TGroupBox;
    Label14: TLabel;
    SpinEdit14: TSpinEdit;
    Label15: TLabel;
    SpinEdit15: TSpinEdit;
    Label16: TLabel;
    SpinEdit16: TSpinEdit;
    Label17: TLabel;
    SpinEdit17: TSpinEdit;
    Label18: TLabel;
    SpinEdit18: TSpinEdit;
    Button4: TButton;
    GroupBox6: TGroupBox;
    Button5: TButton;
    Label19: TLabel;
    SpinEdit19: TSpinEdit;
    Label20: TLabel;
    SpinEdit20: TSpinEdit;
    Label21: TLabel;
    SpinEdit21: TSpinEdit;
    Label22: TLabel;
    SpinEdit22: TSpinEdit;
    GroupBox7: TGroupBox;
    Button6: TButton;
    Label23: TLabel;
    SpinEdit23: TSpinEdit;
    Label24: TLabel;
    SpinEdit24: TSpinEdit;
    Label25: TLabel;
    SpinEdit25: TSpinEdit;
    Label26: TLabel;
    SpinEdit26: TSpinEdit;
    GroupBox8: TGroupBox;
    Button7: TButton;
    Label27: TLabel;
    SpinEdit27: TSpinEdit;
    Label28: TLabel;
    SpinEdit28: TSpinEdit;
    Label29: TLabel;
    SpinEdit29: TSpinEdit;
    Edit1: TEdit;
    Label30: TLabel;
    Panel1: TPanel;
    Button8: TButton;
    GroupBox9: TGroupBox;
    Button9: TButton;
    GroupBox10: TGroupBox;
    Button10: TButton;
    procedure FormCreate(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    procedure Button4Click(Sender: TObject);
    procedure Button5Click(Sender: TObject);
    procedure Button6Click(Sender: TObject);
    procedure Button7Click(Sender: TObject);
    procedure Button8Click(Sender: TObject);
    procedure Button9Click(Sender: TObject);
    procedure Button10Click(Sender: TObject);
  private
    { Déclarations privées }
  public
    { Déclarations publiques }
  end;

var
  Form1: TForm1;
  MDP : String;
  x  : String;
  y  : String;
  x1 : String;
  y1 : String;
  x2 : String;
  y2 : String;
  c  : String;
  n  : String;
  r  : String;


implementation

const
  RECIEVETIMEOUT=5000;   // Temps de non réponse maxi donné pour recevoir une réponse du ENC28J60 de 5 secondes.

 // URl : http://www.developpez.net/forums/d648698/environnements-developpement/delphi/web-reseau/indy-communication-udp/

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
  IdUDPClient1.Port:=5030;            // Port
  IdUDPClient1.Host:='192.168.0.9';   // Adresse IP
  MDP:='ABCDEFGHIJKLMNOP';            // Mot de passe par défaut composé de 16 caractères alpha-numériques. Doit toujours contenir 16 caractères obligatoirement !!!


  IdUDPClient1.ReceiveTimeout:=RECIEVETIMEOUT;   // Temps maximum donné au programme en cas de non réponse du ENC28J60.

  Memo2.Clear;       // Efface le contenu de Memo 2

  Edit1.Text:='';  // Efface le contenu de Edit1.

  SpinEdit3.Value :=1;   // Affichage par défaut du Point
  SpinEdit8.Value :=1;   // Affichage par défaut de la ligne
  SpinEdit13.Value :=1;   // Affichage par défaut du rectangle vide
  SpinEdit18.Value :=1;   // Affichage par défaut du rectangle plein
  SpinEdit22.Value :=1;   // Affichage par défaut du cercle vide
  SpinEdit26.Value :=1;   // Affichage par défaut du cercle plein
  SpinEdit29.Value :=1;   // Affichage par défaut du texte
end;



//***********************************************************
//***********************************************************
//** Procedures de transfert des données du PC vers le PIC **
//***********************************************************
//***********************************************************

//*********************
//* Afficher un point *
//*********************
procedure TForm1.Button1Click(Sender: TObject);
var
  ReceivedString: String;
begin
  x:=IntToStr(SpinEdit1.Value);  // Valeur de X comprise entre 0 et 127
  y:=IntToStr(SpinEdit2.Value);  // Valeur de Y comprise entre 0 et 63
  c:=IntToStr(SpinEdit3.Value);  // Valeur de l'affichage comprise entre 0 et 2

  IdUDPClient1.Send(MDP+'P'+x+'Z'+y+'Y'+c+'$');      // Envoie le mot de passe MDP + commande.

  ReceivedString := IdUDPClient1.ReceiveString();    // Reçoit le message en retour du ENC28J60

  if ReceivedString = '' then                        // A-t-on reçu aucun message du ENC28J60 ?
  begin
    Memo2.Lines.Add('Pas de réponse du ENC28C60 après un temps d''attente   ' + IntToStr(IdUDPClient1.ReceiveTimeout) + ' millsecondes.')
  end
  else
  begin
    Memo2.Clear;       // Efface le contenu de Memo 2
    Memo2.Lines.Add(ReceivedString);    // Affiche le message envoyé par le ENC28J60
  end;
end;


//***********************
//* Afficher une droite *
//***********************
procedure TForm1.Button2Click(Sender: TObject);
var
  ReceivedString: String;
begin
  x1:=IntToStr(SpinEdit4.Value);  // Valeur de X comprise entre 0 et 127
  y1:=IntToStr(SpinEdit5.Value);  // Valeur de Y comprise entre 0 et 63
  x2:=IntToStr(SpinEdit6.Value);  // Valeur de X comprise entre 0 et 127
  y2:=IntToStr(SpinEdit7.Value);  // Valeur de Y comprise entre 0 et 63
  c:=IntToStr(SpinEdit8.Value);  // Valeur de l'affichage comprise entre 0 et 2

  IdUDPClient1.Send(MDP+'L'+x1+'Z'+y1+'Y'+x2+'X'+y2+'W'+c+'$');  // Envoie le mot de passe MDP + commande.

  ReceivedString := IdUDPClient1.ReceiveString();    // Reçoit le message en retour du ENC28J60

  if ReceivedString = '' then                        // A-t-on reçu aucun message du ENC28J60 ?
  begin
    Memo2.Lines.Add('Pas de réponse du ENC28C60 après un temps d''attente   ' + IntToStr(IdUDPClient1.ReceiveTimeout) + ' millsecondes.')
  end
  else
  begin
    Memo2.Clear;       // Efface le contenu de Memo 2
    Memo2.Lines.Add(ReceivedString);    // Affiche le message envoyé par le ENC28J60
  end;
end;



//******************************
//* Afficher le rectangle vide *
//******************************
procedure TForm1.Button3Click(Sender: TObject);
var
  ReceivedString: String;
begin
  x1:=IntToStr(SpinEdit9.Value);   // Valeur de X comprise entre 0 et 127
  y1:=IntToStr(SpinEdit10.Value);  // Valeur de Y comprise entre 0 et 63
  x2:=IntToStr(SpinEdit11.Value);  // Valeur de X comprise entre 0 et 127
  y2:=IntToStr(SpinEdit12.Value);  // Valeur de Y comprise entre 0 et 63
  c:=IntToStr(SpinEdit13.Value);   // Valeur de l'affichage comprise entre 0 et 2

  IdUDPClient1.Send(MDP+'R'+x1+'Z'+y1+'Y'+x2+'X'+y2+'W'+c+'$');  // Envoie le mot de passe MDP + commande.

  ReceivedString := IdUDPClient1.ReceiveString();    // Reçoit le message en retour du ENC28J60

  if ReceivedString = '' then                        // A-t-on reçu aucun message du ENC28J60 ?
  begin
    Memo2.Lines.Add('Pas de réponse du ENC28C60 après un temps d''attente   ' + IntToStr(IdUDPClient1.ReceiveTimeout) + ' millsecondes.')
  end
  else
  begin
    Memo2.Clear;       // Efface le contenu de Memo 2
    Memo2.Lines.Add(ReceivedString);    // Affiche le message envoyé par le ENC28J60
  end;
end;




//*******************************
//* Afficher le rectangle plein *
//*******************************
procedure TForm1.Button4Click(Sender: TObject);
var
  ReceivedString: String;
begin
  x1:=IntToStr(SpinEdit14.Value);   // Valeur de X comprise entre 0 et 127
  y1:=IntToStr(SpinEdit15.Value);  // Valeur de Y comprise entre 0 et 63
  x2:=IntToStr(SpinEdit16.Value);  // Valeur de X comprise entre 0 et 127
  y2:=IntToStr(SpinEdit17.Value);  // Valeur de Y comprise entre 0 et 63
  c:=IntToStr(SpinEdit18.Value);   // Valeur de l'affichage comprise entre 0 et 2

  IdUDPClient1.Send(MDP+'B'+x1+'Z'+y1+'Y'+x2+'X'+y2+'W'+c+'$');  // Envoie le mot de passe MDP + commande.

  ReceivedString := IdUDPClient1.ReceiveString();    // Reçoit le message en retour du ENC28J60

  if ReceivedString = '' then                        // A-t-on reçu aucun message du ENC28J60 ?
  begin
    Memo2.Lines.Add('Pas de réponse du ENC28C60 après un temps d''attente   ' + IntToStr(IdUDPClient1.ReceiveTimeout) + ' millsecondes.')
  end
  else
  begin
    Memo2.Clear;       // Efface le contenu de Memo 2
    Memo2.Lines.Add(ReceivedString);    // Affiche le message envoyé par le ENC28J60
  end;

end;



//***************************
//* Afficher le cercle vide *
//***************************
procedure TForm1.Button5Click(Sender: TObject);
var
  ReceivedString: String;
begin
  x:=IntToStr(SpinEdit19.Value);   // Valeur de X comprise entre 0 et 127
  y:=IntToStr(SpinEdit20.Value);   // Valeur de Y comprise entre 0 et 63
  r:=IntToStr(SpinEdit21.Value);   // Valeur de r comprise entre 0 et 127
  c:=IntToStr(SpinEdit22.Value);   // Valeur de l'affichage comprise entre 0 et 2

  IdUDPClient1.Send(MDP+'C'+x+'Z'+y+'Y'+r+'X'+c+'$');  // Envoie le mot de passe MDP + commande.

  ReceivedString := IdUDPClient1.ReceiveString();    // Reçoit le message en retour du ENC28J60

  if ReceivedString = '' then                        // A-t-on reçu aucun message du ENC28J60 ?
  begin
    Memo2.Lines.Add('Pas de réponse du ENC28C60 après un temps d''attente   ' + IntToStr(IdUDPClient1.ReceiveTimeout) + ' millsecondes.')
  end
  else
  begin
    Memo2.Clear;       // Efface le contenu de Memo 2
    Memo2.Lines.Add(ReceivedString);    // Affiche le message envoyé par le ENC28J60
  end;
end;


//***************************
//* Afficher le cercle plein*
//***************************
procedure TForm1.Button6Click(Sender: TObject);
var
  ReceivedString: String;
begin
  x:=IntToStr(SpinEdit23.Value);   // Valeur de X comprise entre 0 et 127
  y:=IntToStr(SpinEdit24.Value);   // Valeur de Y comprise entre 0 et 63
  r:=IntToStr(SpinEdit25.Value);   // Valeur de r comprise entre 0 et 127
  c:=IntToStr(SpinEdit26.Value);   // Valeur de l'affichage comprise entre 0 et 2

  IdUDPClient1.Send(MDP+'F'+x+'Z'+y+'Y'+r+'X'+c+'$');  // Envoie le mot de passe MDP + commande.

  ReceivedString := IdUDPClient1.ReceiveString();    // Reçoit le message en retour du ENC28J60

  if ReceivedString = '' then                        // A-t-on reçu aucun message du ENC28J60 ?
  begin
    Memo2.Lines.Add('Pas de réponse du ENC28C60 après un temps d''attente   ' + IntToStr(IdUDPClient1.ReceiveTimeout) + ' millsecondes.')
  end
  else
  begin
    Memo2.Clear;       // Efface le contenu de Memo 2
    Memo2.Lines.Add(ReceivedString);    // Affiche le message envoyé par le ENC28J60
  end;
end;



//***********************
//* Paramètres du texte *
//***********************
procedure TForm1.Button7Click(Sender: TObject);
var
  ReceivedString: String;
begin
  x:=IntToStr(SpinEdit27.Value);   // Valeur de X comprise entre 0 et 127
  n:=IntToStr(SpinEdit28.Value);   // Valeur de n comprise entre 0 et 7
  c:=IntToStr(SpinEdit29.Value);   // Valeur de l'affichage comprise entre 0 et 2

  IdUDPClient1.Send(MDP+'T'+x+'Z'+n+'Y'+c+'$');  // Envoie le mot de passe MDP + commande.

  ReceivedString := IdUDPClient1.ReceiveString();    // Reçoit le message en retour du ENC28J60

  if ReceivedString = '' then                        // A-t-on reçu aucun message du ENC28J60 ?
  begin
    Memo2.Lines.Add('Pas de réponse du ENC28C60 après un temps d''attente   ' + IntToStr(IdUDPClient1.ReceiveTimeout) + ' millsecondes.')
  end
  else
  begin
    Memo2.Clear;       // Efface le contenu de Memo 2
    Memo2.Lines.Add(ReceivedString);    // Affiche le message envoyé par le ENC28J60
  end;
end;



//**********************
//* Transfert du texte *
//**********************
procedure TForm1.Button8Click(Sender: TObject);
var
  ReceivedString: String;
begin
  IdUDPClient1.Send(MDP+'Q'+edit1.Text);  // Envoie le mot de passe MDP + Commande + TEXTE pour LCD

  ReceivedString := IdUDPClient1.ReceiveString();    // Reçoit le message en retour du ENC28J60

  if ReceivedString = '' then                        // A-t-on reçu aucun message du ENC28J60 ?
  begin
    Memo2.Lines.Add('Pas de réponse du ENC28C60 après un temps d''attente   ' + IntToStr(IdUDPClient1.ReceiveTimeout) + ' millsecondes.')
  end
  else
  begin
    Memo2.Clear;       // Efface le contenu de Memo 2
    Memo2.Lines.Add(ReceivedString);    // Affiche le message envoyé par le ENC28J60
  end;
end;



//******************
//* Effacer le LCD *
//******************
procedure TForm1.Button9Click(Sender: TObject);
var
  ReceivedString: String;
begin
  IdUDPClient1.Send(MDP+'A');  // Envoie le mot de passe MDP + Commande

  ReceivedString := IdUDPClient1.ReceiveString();    // Reçoit le message en retour du ENC28J60

  if ReceivedString = '' then                        // A-t-on reçu aucun message du ENC28J60 ?
  begin
    Memo2.Lines.Add('Pas de réponse du ENC28C60 après un temps d''attente   ' + IntToStr(IdUDPClient1.ReceiveTimeout) + ' millsecondes.')
  end
  else
  begin
    Memo2.Clear;       // Efface le contenu de Memo 2
    Memo2.Lines.Add(ReceivedString);    // Affiche le message envoyé par le ENC28J60
  end;

end;




//**************************
//* Retro-éclairage ON/OFF *
//**************************
procedure TForm1.Button10Click(Sender: TObject);
var
  ReceivedString: String;
begin
  IdUDPClient1.Send(MDP+'N');  // Envoie le mot de passe MDP + Commande

  ReceivedString := IdUDPClient1.ReceiveString();    // Reçoit le message en retour du ENC28J60

  if ReceivedString = '' then                        // A-t-on reçu aucun message du ENC28J60 ?
  begin
    Memo2.Lines.Add('Pas de réponse du ENC28C60 après un temps d''attente   ' + IntToStr(IdUDPClient1.ReceiveTimeout) + ' millsecondes.')
  end
  else
  begin
    Memo2.Clear;       // Efface le contenu de Memo 2
    Memo2.Lines.Add(ReceivedString);    // Affiche le message envoyé par le ENC28J60
  end;

end;

end.