L'exemple d'urbiimage

URBIimage est un petit programme écrit en C++ avec la liburbi-C++ pour acquérir et afficher des images d'un serveur URBI. URBIimage fait deux choses: il place un callback sur l'étiquette uimg pour recevoir les images, et puis les affiche. Examinons le code. Commençons par l'interface de callback:

Monitor *mon;

/* Notre fonction-callback */
UCallbackAction showImage(const UMessage &msg)
{
  ...
}

Et maintenant, le programme principal :

int main(int argc, char *argv[])
{
  mon = NULL;
  client = new UClient(argv[2]);
  if (client->error() != 0)
    exit(0);

  client->setCallback(showImage, "uimg");

  // Some image initialization
  client->send("camera.resolution = 0;");
  client->send("camera.jpegfactor = 80;");

  // Start the loop
  client->send("loop uimg: camera,");
  urbi::execute();
}

Le code gérant l'image est stocké dans "showImage":

UCallbackAction showImage(const UMessage &msg)
{
  if (msg.binaryType != BINARYMESSAGE_IMAGE)
    return URBI_CONTINUE;

  unsigned char buffer[500000];
  int sz = 500000;
  static int tme = 0;

  if (!mon)
    mon = new Monitor(msg.image.width, msg.image.height);

  convertJPEGtoRGB((const byte *) msg.image.data,
                   msg.image.size, (byte *) buffer, sz);

  mon->setImage((bits8 *) buffer, sz);
  return URBI_CONTINUE;
}

Il commence par tester le type du message, et retourne sans rien faire dans le cas où l'on ne se trouve pas face à un message de type BINARYMESSAGE_IMAGE (par exemple, si le callback est réveillé sur un message d'erreur).

Ensuite, la fonction de conversion convertJPEGtoRGB est utilisée pour transformer le tampon d'image en quelquechose d'exploitable par l'objet Monitor, qui reçoit ensuite l'image.

Enfin, URBI_CONTINUE est retourné pour prendre en charge d'éventuels futurs callbacks.

Ce petit programme illustre très bien l'organisation d'un programme basé sur la liburbi: on place des callbacks, on envoie des scripts URBI et on reçoit les callbacks dans des fonctions écrites pour l'occasion. Vous pouvez jeter un oeil au code source GPL d'URBILab, ce dernier étant construit avec la liburbi-C++. Il montre un usage plus poussé de cette méthodologie.