Développez des applications Palm OS
Transcription
Développez des applications Palm OS
Ceci est un extrait électronique d'une publication de Diamond Editions : http://www.ed-diamond.com Ce fichier ne peut être distribué que sur le CDROM offert accompagnant le numéro 100 de GNU/Linux Magazine France. La reproduction totale ou partielle des articles publiés dans Linux Magazine France et présents sur ce CDROM est interdite sans accord écrit de la société Diamond Editions. Retrouvez sur le site tous les anciens numéros en vente par correspondance ainsi que les tarifs d'abonnement. Pour vous tenir au courant de l'actualité du magazine, visitez : http://www.gnulinuxmag.com Ainsi que : http://www.linux-pratique.com et http://www.miscmag.com embarqué palm os Développez des applications Palm OS Denis Bodor EN DEUX MOTS Il y a fort longtemps, le développement d’applications pour Palm et compatibles avait déjà rempli les colonnes de GNU/Linux Magazine. Depuis janvier 2001, les choses ont bien changé. l’époque où j’avais abordé le sujet, le Palm était en concurrence avec le Psion et les PocketPC venaient d’apparaître. Depuis, les PDA ont gagné en puissance et en mémoire. Les écrans ont également été améliorés tout comme la connectivité de ces chères petites machines. La concurrence des PocketPC a poussé les fabricants de périphériques Palm à créer des machines plus puissantes, plus esthétiques, plus communicantes... tout en restant compatibles avec l’énorme bibliothèque d’applications existantes. C’est ainsi que les périphériques compatibles Palm OS sont maintenant équipés de processeurs ARM tout en émulant pour la totalité des applications une architecture 68k (Motorola Dragonball, M68VZ328, M68EN302, etc.). Ce système, nommé PACE (Palm application compatibility environment) fait fonctionner l’ensemble du parc actuel de machines récentes Palm OS. Le système d’exploitation le plus avancé, Palm OS Garnet (Palm OS 5), permet l’utilisation de routines spécifiques aux processeurs ARM, mais une application native n’est pas encore possible. On parle alors d’objet natif PACE (PNO, PACE native objects) qui sont des sous-routines dédiées ARM, lancées depuis un code 68k. Palm OS Cobalt (Palm OS 6) est le prochain Palm OS entièrement dédié à l’ARM. Il contiendra un nouveau framework de gestion pour le réseau, la sécurité, le multimédia, etc. reposant entièrement sur l’API Protein (entièrement en code natif ARM). Nous ne traiterons ici ni de PNO, ni de Cobalt puisqu’il s’agit d’une simple introduction au développement pour Palm OS. Notre plateforme cible sera donc Garnet et l’architecture 68K.A la charge de PACE de s’occuper de nos applications sur des périphériques récents et au Palm OS « normal » de faire de même sur les machines les plus anciennes. 86 Outils de Développement La diversité et la disponibilité des outils de développement pour Palm OS ont été des facteurs importants dans la popularisation du système. US Robotics puis 3Com, sociétés à l’origine des PDA Palm avaient compris qu’en rendant disponible facilement les suites de développement, de nombreux programmeurs allaient créer une masse d’applications importante qui allait faire le succès du système. Des outils de développement sont disponibles sur les trois plateformes principales du marché : Windows, Mac OS et GNU/Linux (et les autres UNIX libres). Nous ne nous intéresserons, bien sûr, qu’à GNU/Linux, mais sachez que les outils présentés ici peuvent également fonctionner sous Windows (via Cygwin). Un environnement de développement pour Palm OS se compose de plusieurs éléments : La chaîne de compilation croisée. Il s’agit du projet PRCtools qui regroupe le compilateur GCC, l’assembleur, l’éditeur de liens et le débugger. Il s’agit des outils GNU modifiés afin de supporter les spécificités propres à Palm OS. Avec PRCtools, vous serez à même de créer et construire vos binaires au format spécifique PRC. Le SDK (Software Development Kit) Palm OS. Pour cet élément vous n’aurez pas le choix, il vous faudra le télécharger depuis le site PalmSource dédié aux développeurs Palm OS (http://www.palmsource.com/developers/ ). Pour pouvoir télécharger et utiliser le SDK, vous devrez ouvrir un compte (gratuit) sur le site et accepter les conditions d’utilisation. Cette acceptation vous donnera non seulement accès au téléchargement des SDK et des outils de développement mais également à un forum de développeurs, aux ROM Palm OS, etc. Lisez attentivement les conditions d’utilisation et les différentes clauses limitatives pour être sûr que cela correspond à vos besoins. Le compilateur de ressources PilRC (http://sourceforge. net/projects/pilrc/ ). Comme nous le verrons plus loin, une application Palm OS se construit de manière très spécifique. On compile le code et l’interface séparément pour les fusionner et obtenir un binaire utilisable. La création et la compilation des ressources décrivant l’interface d’une application sont le travail d’un outil spécifique : PilRC de Aaron Ardiri. Un émulateur. Il ne s’agit pas là d’un élément indispensable, mais le test d’applications en cours de développement est bien plus aisé via un émulateur que sur une véritable machine. L’un des émulateurs les plus utilisés sous GNU/Linux est Pose. Il permet d’émuler un grand nombre de périphériques Palm OS. Pose comme tout émulateur Palm OS nécessite d’utiliser un fichier image d’une ROM spécifique contenant le système. Une fois inscrit sur PalmSource, vous pourrez, en toute légalité télécharger l’une d’elles. Malheureusement, le choix est très limité. Le téléchargement d’autres ROM n’est pas possible, en raison, semble-t-il, de problèmes de brevets et de copyright concernant Graffiti 2. Actuellement GNU Linux Magazine France les seules images de ROM téléchargeables sur PalmSource sont celles d’un Palm OS 4.1.2 sans support de couleurs. C’est très regrettable sachant que la plupart des périphériques Palm récents disposent d’un écran couleur. Vous pourrez cependant tenter d’utiliser une image de la ROM de votre périphérique qu’il vous sera possible de récupérer avec les outils Pose ou Pilot-Link. On notera que les outils de développements pour Windows sont largement mis en avant sur le site des développeurs Palm OS. Beaucoup d’éléments ne sont, en effet, disponibles que pour ce système d’exploitation et pour Mac OS. Notre GNU/Linux est un peu « à la traîne ». Il n’existe, par exemple, pas de simulateur pour notre système. Les simulateurs se différencient des émulateurs comme Pose par le fait qu’ils n’émulent non pas un périphérique mais un système. Sont disponibles au téléchargement des simulateurs Garnet 5.1 à 5.4 et Cobalt 6.0 à 6.1. Il en va de même pour le SDK qui ne concerne que Garnet (68K) et non Protein/Cobalt. Ceux-ci sont uniquement disponibles avec la « Palm OS Developer Suite », un fichier auto-installable pour Windows de quelque 270 Mo comprenant outils et SDK. Avec cette suite, vous pourrez développer aussi bien pour Garnet que pour Cobalt ou profiter du support PNO pour PACE très simplement... à condition d’utiliser Windows. Sachant que cette suite repose en partie sur Cygwin, c’est un peu dommage, même si le système Microsoft représente encore la grande majorité des OS installés. Installation de l’environnement de développement Sous GNU/Linux, nous n’avons besoin que du SDK fourni sur PalmSource. En effet, avec presque toutes les distributions, les PRC-tools sont disponibles sous forme de paquets. C’est le cas, bien entendu, pour la distribution Debian qui livre ces outils sous la forme de plusieurs paquets (prc-tools, prc-tools-arm, prc-tools-doc, prc-tools-m68k, prc-toolsutils). On notera que le paquet prc-tools-arm permettra de développer des « armlets », ces fameux morceaux de code natif ARM embarqués dans des applications 68K. Le paquet prc-tools-utils contient un élément très important. Comme vous vous en doutez, il est quasiment impossible de développer une application Palm OS sans SDK. Ce paquet intègre un utilitaire permettant de simplifier la prise en charge du ou des SDK installés sur votre système. Jusqu’alors, il était très délicat de compiler des programmes reposant sur l’API Palm OS. Il était, en effet, nécessaire de construire des fichiers Makefile prenant en compte l’emplacement des fichiers en-têtes et des bibliothèques statiques à lier et ce, pour chaque projet et chaque SDK. prc-tools-utils fournit palmdev-prep, un utilitaire permettant de préparer un arbre de dépendances facilitant l’utilisation des PRC-tools. Une fois le SDK téléchargé depuis le site PalmSource sous la forme d’un fichier palmos-sdk-5.0r3-1.tar. gz.tar, vous n’aurez qu’à le désarchiver dans l’emplacement PalmDev par défaut : /opt/palmdev selon la page de manuel, Numéro 77 / Novembre 2005 mais /usr/local/share/palmdev dans la pratique (avec une Debian Etch/testing et les PRC-tools 2.3). Dans tous les cas, lancez un palmdev-prep -v pour connaître le répertoire configuré au moment de la compilation des outils pour votre distribution. Une fois le SDK désarchivé, lancez simplement palmdev-prep pour mettre à jours les chemins : % sudo palmdev-prep Checking SDKs in /usr/local/share/palmdev sdk-5r3 headers in ‘include’, libraries in ‘lib’ When GCC is given no -palmos options, SDK ‘5r3’ will be used by default Writing SDK details to configuration files... ...done Les fichiers modifiés sont les fichiers specs de GCC.Ainsi, les chemins par défaut seront automatiquement les bons et aucune autre configuration ne sera nécessaire.Vous pouvez installer plusieurs SDK dans l’emplacement par défaut et relancer palmdev-prep. Ce dernier vous précisera les SDK détectés et celui utilisé par défaut en l’absence d’option -palmos passée à au compilateur. Personnellement, j’ai conservé le SDK 3.5 utilisé lors du précédent article sur le développement Palm d’il y a quelques années. Malheureusement, aujourd’hui il n’est plus possible (ni utile) de récupérer ces vieilleries sur PalmSource. Néanmoins, cela m’aura permis de vérifier la viabilité palmdev-prep en compilant très facilement un code pour Palm OS 3.5 ou 3.1 avec les SDK correspondants. Notez toutefois que le SDL 5r3 actuellement en téléchargement permet de développer des applications parfaitement fonctionnelles sur un vieux Palm IIIxe sous Palm OS 3.5. Architecture A l’heure actuelle, Palm OS est un système mono-tâche. Il n’en sera pas de même avec Cobalt (voir en fin d’article) mais ce n’est pas ce qui nous préoccupe à présent. La structure d’un programme Palm OS est donc relativement étrange pour un développeur GNU/Linux. A l’instar des codes pour microcontrôleurs, une application Palm OS est composée d’une boucle consommant allègrement des ressources CPU pour rien. Ce n’est pas bien grave puisqu’au moment où notre application est lancée, c’est elle qui a la main et rien d’autre n’intervient en même temps (sauf si 87 embarqué palm os elle relaie l’information). Certains prétendent que Garnet est multitâche car, sur un Tréo par exemple, il est possible de recevoir un appel téléphonique tout en utilisant une application. Il s’agit de multitâche coopératif ou d’astuces de conception spécifiques aux Smartphone Palm OS. Cela n’a rien à voir avec ce dont nous disposons sous Linux ou ce que proposera Cobalt d’ici peu. La boucle principale constituant l’application permet de traiter des évènements. Il peut s’agir d’évènements système, d’actions de l’utilisateur sur un menu ou sur l’interface graphique (Formulaire), etc. L’application doit alors identifier le type d’évènement et réagir en conséquence. Une autre spécificité du développement Palm OS concerne l’interface graphique. La plupart des écrans des périphériques compatibles Palm OS se composent d’un carré de 160 pixels de coté. Il est possible, directement depuis votre code, de dessiner sur l’écran à l’aide de fonctions comme WinDrawChars() ou WinDrawLine(). Cependant, les applications Palm OS se composent habituellement de zones de saisie, de menus et de boutons. Ces éléments ne sont pas pris en charge directement par le code du développeur mais font l’objet d’un traitement particulier. On parle alors de ressources qui seront compilées et fusionnées avec l’application. Un « écran » d’application Palm OS, par exemple, est un formulaire possédant un certain nombre de caractéristiques. Enfin, il faut savoir que dans le système Palm OS tout est base de donnée. Une application est composée de code exécutable, de ressources graphiques et de liens vers d’autres bases.Toutes ces informations sont stockées dans le système Palm OS en tant qu’enregistrements de manière à optimiser l’utilisation de la mémoire. La documentation officielle explique qu’un système de fichiers traditionnel ne serait pas adapté pour ce type de périphériques. Premier programme Assez de théorie, passons sans plus attendre à la pratique avec un premier programme relativement simpliste. Je considèrerai, à partir d’ici, que l’environnement de développement complet (SDK inclus) est correctement installé et configuré sur votre système. Notre premier code, hello.c , sera extrêmement court : 88 #include <PalmOS.h> UInt32 PilotMain( UInt16 cmd, void *cmdPBP, UInt16 launchFlags ) { EventType event; char *toto=»Coucou !»; if (cmd == sysAppLaunchCmdNormalLaunch) { WinDrawChars( toto, StrLen(toto), 55, 60 ); do { EvtGetEvent( &event, evtWaitForever ); SysHandleEvent( &event ); } while (event.eType != appStopEvent); } } return(0); On retrouve ici la boucle do...while formant le corps de l’application. Celle-ci reste infinie à moins que le type d’évènement reçu soit appStopEvent, la fin de l’exécution du programme. Le contenu de la boucle est très concis, notre application ne fait rien d’utile : Nous tentons de récupérer le prochain évènement. Le second argument de la fonction EvtGetEvent() est le délai d’attente en « tick » système. Ici evtWaitForever permet d’attendre indéfiniment. Si vous spécifiez une valeur supérieure à 0 et qu’aucun évènement n’est reçu entre temps, un évènement nul est généré (nilEvent). Comme spécifié dans la documentation du développeur Palm OS, immédiatement après un EvtGetEvent(), nous utilisons la fonction SysHandleEvent en lui passant en argument un pointeur sur l’évènement reçu. Cette fonction donne une chance au système de gérer l’évènement. Si cela se produit, la fonction retourne 1. La seule raison légitime de ne pas utiliser cette fonction est de gérer dans notre application des évènements destinés au système. En effet, n’oubliez pas que nous sommes en multitâche coopératif et lorsque notre application fonctionne, rien d’autre n’est exécuté. Oubliez SysHandleEvent et c’est le reset obligatoire sur le PDA. Prenons du recul et regardons ce qui se trouve en dehors de cette fameuse boucle. La fonction PilotMain est le main() de tout programme C. Oublions les argv et argc, cette fonction reçoit de la part du système plusieurs valeurs en argument : Un code de lancement. Celui-ci sera, dans la plupart des cas sysAppLaunchCmdNormalLaunch, une exécution « normale » provoquée par l’utilisateur. On notera au passage qu’il existe un code sysAppLaunchCmdCardLaunch permettant à l’application de détecter un lancement depuis une carte d’extention SD par exemple et de réagir en conséquence. Un pointeur sur une structure de paramètres spécifiques au lancement (équivalent au argv). La structure et son contenu dépendent du code de lancement. Un ensemble de drapeaux permettant de connaître les conditions de lancement de l’application. GNU Linux Magazine France Développez des applications Palm OS Nous utilisons ici la fonction WinDrawChars permettant d’écrire arbitrairement des caractères sur l’écran. La fonction prend en argument un pointeur sur une chaîne de caractères, la taille en octets de la chaîne et les coordonnées X et Y du début de la chaîne à l’écran. J’aurais tout aussi bien pu utiliser WinDrawChars(«Coucou !», 8, 55, 60), mais je tenais à utiliser StrLen. Cela peut sembler trivial mais lorsqu’on développe depuis GNU/Linux pour une autre plate-forme, on oublie parfois que la libc n’est pas là. Cette fonction est un bel exemple, il est important de le relever, car dans vos premières applications, vous aurez sans doute tendance à utiliser strlen tout comme vous le faites sous GNU/Linux. Gardez un œil sur la documentation de l’API est un réflexe à prendre pour faire passer les vilaines habitudes (http://www. palmos.com/dev/support/docs/palmos/PalmOSReference/ ReferenceTOC.html). Notre code se compilera très facilement avec : % m68k-palmos-gcc -Wall hello.c -o hello % m68k-palmos-obj-res hello % build-prc hello.prc «Test» ESSA *.grc *.bin La première commande compile le code et génère un binaire au format mc68k COFF. La seconde utilise le binaire pour générer des fichiers de ressources. Ces fichiers possèdent l’extention grc et nous servent pour créer le fichier PRC spécifique à l’environnement Palm OS. Un fichier PRC n’est qu’un « emballage », le système le transformera en une base de données de ressources Palm OS. Voilà pourquoi nous devons préparer notre application, un peu comme le format ELF qui n’est pas une image du programme en mémoire. build-prc est utilisé pour empaqueter les ressources. Les arguments sont, dans l’ordre, le fichier PRC à créer, le nom de l’application, l’identifiant du créateur (crid, pour creator ID) et les fichiers de ressources à combiner. Le crid pourra être choisi arbitrairement en phase de développement, mais si vous compter distribuer vos applications, il vous faudra enregistrer votre crid sur le site PalmSource. La commande figurant ici est donnée à l’ancien format. Ce n’est qu’à partir du quatrième argument qu’on spécifie les fichiers à traiter. La page de manuel recommande toutefois d’utiliser une nouvelle syntaxe reposant sur des options : % build-prc -o hello.prc -c ESSA -n Test *.grc *.bin Notez que nous spécifions ici d’éventuels fichiers à l’extention bin. Il s’agit de ressources provenant de données externes à la compilation du code. Le fichier PRC créé est parfaitement fonctionnel, mais loin d’être idéal, un certain nombre d’informations peuvent être ajoutées. Certaines informations utilisées par les applications Palm OS sont spécifiées via un fichier de ressources : ICON «icon.bmp» VERSION «1.0 beta» Numéro 77 / Novembre 2005 Nous enregistrons ces lignes dans un fichier hello.rcp destiné à être compilé par PilRC : % pilrc hello.rcp PilRC v3.2 Copyright 1997-1999 Wes Cherry ([email protected]) Copyright 2000-2005 Aaron Ardiri ([email protected]) Generating 68K resources from ‘hello.rcp’. Writing tAIB03e8.bin (104 bytes) Writing tver0001.bin (9 bytes) PilRC permet de générer à partir du hello. rcp des fichiers de ressources que nous utiliserons ensuite avec build-prc. Ici, nous spécifions un fichier au format BMP noir et blanc (1 bit) qui sera l’icône de l’application. Nous renseignons également la version qui figurera dans les informations concernant notre application. Il s’agit, là encore, de l’ancienne syntaxe. Avec l’arrivé des périphériques gérant la couleur, il devient possible de compiler dans une seule ressource plusieurs versions de l’icône en utilisant ICONFAMILY suivi de quatre noms de fichier BMP contenant l’image dans des formats différents : 1bpp, 2bpp, 4bpp et 256 couleurs. Ainsi, l’icône de votre application sera toujours correctement affichée quel que soit le PDA utilisé. Fig. 1 : La version d’une application est spécifiée via un fichier de ressources compilé avec PilRC. Présenté de la sorte, PilRC peut sembler être un outil « cosmétique », mais il ne faut pas oublier que, pour l’heure, notre application ne fait absolument rien de spécial. Dès son lancement, elle affiche, sans plus de fioritures, une simple chaîne de caractères sur l’écran et attend de recevoir un évènement de type appStopEvent. Difficile de parler sérieusement d’application Palm OS pour l’instant. 89 embarqué palm os Interface graphique PilRC est indispensable pour créer de véritables applications. Le fichier de ressources permet de définir des formulaires qui seront utilisés par l’application pour afficher convenablement les informations et répondre aux actions de l’utilisateur. Nous allons, tout d’abord étoffer notre fichier de ressources en ajoutant un formulaire : FORM ID mainForm AT (2 2 156 156) USABLE FRAME MODAL BEGIN TITLE “Coucou le Palm” END Nous créons ici un formulaire qui sera le cadre de notre application. Ce formulaire est désigné par l’identifiant mainForm et possède un certain nombre de caractéristiques (voir documentation de PilRC). Un formulaire est un conteneur qui peut regrouper plusieurs objets qui seront énumérés entre des tags BEGIN et END. Ici, le seul objet en présence est le titre du formulaire. Utilisons immédiatement la commande pilrc pour obtenir les fichiers de ressources et, plus important encore, un fichier resource. h contenant simplement #define mainForm 9998 : l’identifiant numérique du formulaire créé automatiquement par PilRC. Incluons immédiatement le fichier d’en-tête dans notre hello.c avant de nous attacher à la gestion de la ressource. Modifions notre fonction PilotMain : UInt32 PilotMain( UInt16 cmd, void *cmdPBP, UInt16 launchFlags ) { if (cmd == sysAppLaunchCmdNormalLaunch) { FrmGotoForm(mainForm); EventLoop(); } FrmCloseAllForms(); return(0); } Nous commençons par utiliser FrmGotoForm permettant en un seul mouvement d’envoyer un frmCloseEvent au formulaire actif puis un frmLoadEvent et un frmOpenEvent à la ressource spécifiée en argument. frmLoadEvent demande le chargement du formulaire en mémoire, mais c’est à notre application de traiter l’évènement. 90 Ensuite, nous remplaçons notre boucle de gestion d’évènement par une fonction dédiée. Ce n’est pas critique ici, mais la structuration du code est quelque chose de capital pour le développement d’applications Palm. Nous reviendrons plus loin sur la fonction FrmCloseAllForms. Voici notre fonction de gestion des évènements. C’est ici que le code bouclera indéfiniment en l’attente d’évènements à traiter : void EventLoop(void) { EventType event; int formID; FormPtr form; do { EvtGetEvent( &event, evtWaitForever ); if(SysHandleEvent(&event)) continue; } if(event.eType == frmLoadEvent) { formID = event.data.frmLoad.formID; form = FrmInitForm(formID); FrmSetActiveForm(form); switch(formID) { case mainForm: FrmSetEventHandler(form, &MainFrmHandler); break; } } FrmDispatchEvent(&event); } while (event.eType != appStopEvent); On reconnaît la fonction de récupération du prochain évènement suivie immédiatement par celle permettant de laisser une chance au système de le gérer. On ajoutera une condition permettant de sortir de la boucle si c’est le cas. On détecte ensuite s’il s’agit d’un type évènement frmLoadEvent. C’est normalement le cas immédiatement après le démarrage de l’application. C’est nous-même qui venons de le provoquer. Si c’est le cas, un certain nombre de manipulations s’imposent pour initialiser correctement le formulaire. On commence par récupérer l’identifiant de la ressource concernée et on le stocke dans formID puis utilise cet identifiant pour charger la ressource. On obtient en retour un identifiant du formulaire (par opposition à l’identifiant de la ressource) qui nous sert à activer ce dernier. On switche ensuite pour ne traiter que notre mainForm. Une condition if aurait suffit dans ce cas, mais une application peut se composer de plusieurs formulaires chargés à des moments différents. S’il s’agit bien d’un frmLoadEvent sur notre mainForm, nous pouvons définir une fonction callback permettant de gérer les évènements qui lui sont propres : MainFrmHandler, notre gestionnaire d’évènements. Finalement nous utilisons la fonction FrmDispatchEvent permettant de passer l’évènement au gestionnaire concerné. GNU Linux Magazine France Développez des applications Palm OS Gestionnaire que voici : static Boolean MainFrmHandler(EventPtr event) { int handled = 0; FormPtr form; switch(event->eType) { case frmOpenEvent: form = FrmGetActiveForm(); FrmDrawForm(form); handled = 1; break; case penDownEvent: WinDrawChars( «coucou», 6, 55, 60 ); handled = 1; break; } return handled; } Nous ne gérons ici que deux évènements. Le premier est l’ouverture du formulaire. Là encore, c’est notre application qui a généré l’évènement via FrmGotoForm(). En réponse, nous affichons le formulaire à l’écran. Nous répondons également à un évènement penDownEvent correspondant à l’utilisation du stylet sur le formulaire. En réponse, nous affichons simplement la chaîne coucou à l’écran. Pour construire le fichier PRC, nous utiliserons cette fois un fichier Makefile : all: hello.prc ressources: hello.rcp icon1bpp.bmp icon8bpp.bmp pilrc -H resource.h hello.rcp binary: hello.c resource.h m68k-palmos-gcc -Wall -g hello.c -o hello m68k-palmos-obj-res hello hello.prc: ressources binary build-prc hello.prc «Test» ESSA *.grc *.bin clean: rm -rf hello *.grc *.bin hello.prc resource.h Le compilateur ne manquera pas de nous rappeler que notre gestionnaire ne traite qu’une faible partie des évènements. Ceci n’est qu’un simple avertissement, mais mieux vaudra en tenir compte pour une application finalisée. Revenons sur la fonction FrmCloseAllForms() utilisée juste avant de sortir de PilotMain. Palm OS fonctionne sur des périphériques dont la mémoire et les ressources sont limitées. La chasse aux fuites de mémoire représente un point important. En l’absence de cette fonction permettant de clore l’utilisation des formulaires, la mémoire allouée n’est pas libérée. L’émulateur Pose ne manque pas de le signaler. C’est là un autre avantage de l’utilisation d’un émulateur dans la phase de développement. Celui-ci permet de debugger les applications bien plus efficacement qu’un PDA. En plus de fournir des indications sur des violations de mémoire et des Numéro 77 / Novembre 2005 Fig; 2 : Notre première application utilisant un formulaire. fuites, il vous permettra d’utiliser GDB en mode client/serveur. Fonctionnalité non négligeable lorsqu’on fait ses premiers pas dans un environnement aussi exotique que Palm OS. Menu du jour Notre formulaire est la base graphique de notre application. Dans le fichier décrivant les ressources, nous pouvons définir d’autres objets que nous rattacherons ensuite au formulaire.Ainsi, nous définissons une entrée de menu : MENU ID mainMenu BEGIN PULLDOWN «Options» BEGIN MENUITEM «About» ID menuItemAbout «a» END END Identifiée par mainMenu, celle-ci se compose d’une entrée ou branche «Options» dans laquelle se trouve l’entrée identifiée par menuItemAbout. Pour lier ce menu au formulaire, il nous suffit d’ajouter MENUID mainMenu dans la définition de ce dernier (avant BEGIN... END). Nous disposons à présent d’un menu et d’une entrée identifiée. Poursuivons en définissant une autre ressource : ALERT ID aboutbox INFORMATION BEGIN TITLE “A propos de Coucou” MESSAGE «(c) Denis Bodor» BUTTONS „Done“ END 91 embarqué palm os Il s’agit d’une ressource de type ALERT identifiée comme aboutbox. Elle possède un titre, un message et un bouton. Cette ressource n’est pas liée avec le formulaire ou tout autre élément. Elle sera chargée par notre code et affichée au besoin. Le fichier resource.h généré par PilRC regroupera les identifiants numériques de toutes nos nouvelles ressources. Nous n’avons plus qu’à les utiliser. Notre code ne change quasiment pas. En réalité, la seule partie devant prendre en compte les nouvelles ressources est notre gestionnaire d’évènements. Nous remplacerons ici, tout simplement, notre condition penDownEvent du switch par ceci : Un pointeur vers une structure MenuBarType. Inutile ici, notre ressource est un menu déroulant. Un pointeur sur la structure décrivant l’évènement à traiter. Un pointeur vers un entier court non signé (UInt16) qui contiendra le code erreur (en réalité, celui-ci est toujours égal à zéro selon la documentation officielle). Tout ce qui nous reste à faire se résume à déclarer la variable pour le code d’erreur (UInt16 err;), puis à utiliser cette fonction juste après SysHandleEvent : if(MenuHandleEvent(NULL,&event,&err)) continue; C’est tout. Il n’en faut pas plus pour construire et gérer un menu déroulant affichant une boîte de dialogue. Comme vous pouvez le voir, seule l’ossature de départ est délicate. Si celle-ci est bien faite, on peut, à souhait, ajouter toutes sortes d’éléments sans changements trop important dans le code. case menuEvent: switch(event->data.menu.itemID) { case menuItemAbout: FrmAlert(aboutbox); handled = 1; break; } break; Si le type d’évènement reçu est un menuEvent, nous cherchons à savoir sur quel élément il porte. Si c’est menuItemAbout, l’identifiant défini pour l’entrée «About» dans le fichier de ressources, nous réagissons. La fonction FrmAlert est très efficace. Elle permet de créer et d’afficher une alerte jusqu’à ce que l’utilisateur clique sur un bouton dans la boîte de dialogue. Elle prend en argument l’identifiant de la ressource à utiliser. Si vous compilez et construisez un PRC en vous arrêtant là, votre menu et, en toute logique, la boîte de dialogue, n’apparaîtront jamais. En effet, notre application de gère pas la navigation dans les menus. Pas de panique, il n’est pas nécessaire de traiter cela manuellement. Il suffit d’utiliser la fonction MenuHandleEvent. Celle-ci demande au système de gérer le menu déroulant à notre place. Si un évènement penDownEvent est reçu dans un menu, cette fonction suivra le stylet. Si ce dernier est levé sur une entrée du menu, un menuEvent est généré contenant l’identifiant de l’entrée. Le reste de la gestion (navigation, surbrillance, sortie du menu, etc.) est effectué par MenuHandleEvent à notre place. Les arguments utilisés sont : 92 Fig. 3 : Notre application Palm OS minimaliste et sa boîte de dialogue. Une base pour le développement d’une application plus utile... Arrêtons là cette longue introduction. Pour poursuivre l’exploration par vous-même, il n’existe qu’une seule solution : vous connecter sur le site PalmSource et parcourir les différentes documentations développeurs concernant Garnet.Absolument tout ce que vous avez besoin de savoir s’y trouve. Un coup d’œil sur Cobalt Bien qu’il y ait fort à parier que Garnet reste encore l’OS le plus utilisé dans les prochains temps, Cobalt (alias Palm OS 6.1) est d’ores et déjà prêt. Il s’agit d’une refonte radicale par rapport aux versions précédentes du système. La montée en puissance et les nouveautés apportées sont principalement dues à l’utilisation de processeurs plus puissants comme l’ARM ou le Xscale. La présence d’une MMU (Memory Management Unit), l’unité de gestion de mémoire GNU Linux Magazine France Développez des applications Palm OS qui fait défaut à tout la lignée 68K, permet des innovations importantes parmi lesquelles : Une architecture permettant la protection mémoire.Alors qu’une application Palm OS peut, pour l’heure, faire ce qui lui chante (ou presque) de la mémoire, Cobalt en se reposant sur la MMU du processeur pourra mettre en œuvre des mécanismes de protection comme on en trouve que sur les machines de bureau. Il en découlera une plus grande sécurité et stabilité pour l’ensemble du système. L’arrivée du multithreading. Il ne s’agit plus d’astuces de développement mais de véritables multitâches. Une application reposant sur l’API Protein pourra exécuter et gérer plusieurs threads, tout comme avec un système GNU/Linux. Coté utilisateur cela signifie des choses simples comme la lecture de MP3 en tâche de fond. Côté développeur, cela signifie l’ouverture vers un tout autre domaine technologique à exploiter. Ceci ne représente que la partie la plus importante des nouveautés proposées par Cobalt. Vous trouverez une liste plus complète sur le site PalmSource (http://www.palmos. com/dev/tech/oses/cobalt60.html). Si vous comptez porter des applications vers Cobalt (sans utiliser PACE), la documentation « Porting Applications to Palm OS Cobalt » vous guidera... à condition de digérer les quelques 598 pages du PDF. Du côté des chaînes de développement pour GNU/Linux rien n’est vraiment clair. Pour l’heure, l’intégralité du support semble ne concerner que le système Microsoft. Pire encore, il semblerait, selon la documentation que les PRC-Tools ne servent plus qu’au code 68K, GCC pour le développement d’applications Protein destinées au simulateur et PACC, le « Palm OS Protein C/C++ Compiler » pour les applications pouvant fonctionner sur les périphériques Cobalt. Ne jurons de rien, mais le peu de support Protein/Cobalt concernant GNU/Linux et l’absence complète d’une mention de ce système dans la documentation développeur laissent clairement penser que PACC ne serait pas porté sous GNU/Linux. 2 Fig. 4 : Notre application Palm OS minimaliste et sa boîte de dialogue. Une base pour le développement d’une application plus utile... Si tel était effectivement le cas, nous pourrions toujours nous consoler en remarquant qu’une machine incluant quelques 256 Mo de Flash et de RAM pilotée par un ARM7 sera bien capable de faire fonctionner un GNU/Linux en lieu et place de Cobalt... Denis Bodor, sites incontournables: / / p www.gnulinuxmag.com t t w H www.ed-diamond.com w Toute l’actualité du magazine sur : Abonnements et anciens numéros en vente sur :