Réminiscences d’un développement sur la console PSP

Il y a de ça presque trois années je rentrais en DUT informatique, sans grande conviction, sans savoir ce qu’était un geek, un byte ou même MSN. Très vite je me suis senti à l’aise avec les matières informatiques enseignées telles l’algorithmique, le langage C, les bases de données, etc…

Auparavant, j’avais tenté la création de sites sous Voila.fr (RIP) ou encore Wanadoo.fr, j’avais une bonne expérience de Médiator, un logiciel qui permettait de créer différents contenus multimédia que l’on m’avait enseigné au collège. Je ne sais pas ce que devient ce logiciel mais à l’époque c’était la révolution.

Puis quelques temps après j’ai touché à PHP dans sa version 4. Création de sites (dont j’aurais aujourd’hui honte), développement de petits scripts et autres, j’ai vite appri à utiliser une base de données et tout ce qui gravite autour de PHP4.

Lors de cette première année de DUT on m’a enseigné le C et le C++ (dont je ne me rappelle guère). Dans le même temps, j’ai reçu une PSP en cadeau. C’est certainement là que mon avenir a basculé, une sorte de transformation qui m’amène aujourd’hui à être extrêmement passionné par mes études et mon travail.

Ma PSP je l’ai modifié pour recevoir des jeux et applications « Homebrews » (faits-maison). Puis j’ai installé tout un environnement de développement et je suis devenu actif sur pas mal de forums et IRC (que j’ai découvert à ce moment-là). C’est dans cette période que j’ai beaucoup appri par moi-même et que j’ai aimé ça. Au final, j’ai participé à la réalisation d’un jeu en 3D qui n’est malheuresement jamais sorti, j’ai pu aidé pas mal de personnes et développé quelques applications.

Déjà, j’étais attiré par la VoIP et je voulais la porter sur PSP. Un autre projet que j’ai avancé mais qui n’a pas abouti. Mon domaine sur PSP était la connexion à distance, Adhoc avec le wifi de la PSP ou Infrastructure via Internet. J’ai développé une série de librairies permettant de simplifier les échanges entre deux PSP ou entre une PSP et un serveur.

J’ai perdu pas mal de mes petits travaux et j’ai complètement abandonné ce type de développement. Néanmoins j’ai retrouvé quelques sources d’un projet que j’avais sorti au public. Il s’agit d’un programme pour envoyer des données sur PSP via le wifi. Ce projet comporte un programme Client sur la PSP et un programme Serveur sur l’ordinateur. Il est traduit en 4 langues et comporte un semblant d’interface graphique.

I – Présentation

Le projet se nomme wifiConnect. Il a eu deux versions v0.1 et v1.

L’application cliente sur l’ordinateur est écrit en C. Il s’agit d’un client qui se connecte sur la PSP et qui peut envoyer des données. Un interface en VB a été écrite pour plus de simplicité sous Windows. Le client est compilé pour windows et linux.

L’application serveur sur la PSP est également écrit en C. Il reçoit les données de l’ordinateur. C’est un homebrew qui se lance depuis le menu Jeu de la PSP. Il est graphique et en 4 langues.

Le principe de connexion repose sur les threads et les sockets. De multiples vérifications sont faites pour assurer la bonne transmission des données : vérification de l’état de la batterie, du nombre d’octets transférés, de l’extension, et backup du fichier si écrasement.

Voilà les fonctionnalités principales :

  • interface graphique sur le programme psp
  • demande de confirmation sur la psp, pour tout ce qui va dans la flash
  • sauvegarde des fichiers qui seront écrasés lors d’un transfert et donc s’il y a un probleme on les remet en place
  • multilangues Anglais/Français/Italien/Espagnol
  • vérification batterie chargée
  • vérification ajoutées sur le programme pc : adresse IP, destination
  • vérifiation de l’intégrité des fichiers : verification du nombre d’octets envoyés/reçus
  • ajout d’un « Debride » mode pour bypasser la vérification de l’extension pour ce qui va dans la flash0

II – Illustrations

Voici les illustrations du programme :

L’image qui apparait dans le menu Jeu de la PSP

ICON0 : L’icone qui apparait également dans le menu Jeu de la PSP

Le menu de sélection d’une langue (ici le français)

Idem que ci-dessus avec cette fois l’espagnol sélectionné

La PSP fonctionne comme Serveur, elle attend une connexion de l’ordinateur distant

La connexion est établie (elle se déroule en 4 phases)

Transfert d’un fichier dans la flash0 de la PSP, une confirmation est nécessaire, c’est le coeur de la PSP, l’endroit le plus risqué (à l’époque du moins)

Le transfert est terminé

Ces graphismes ont été fait par Angelfall aka Baptiste Rouleau en 2007.

III – Le code

Ce programme a été écrit en C, voici le main() de l’application PSP :

#include "define.h"
#include "thread_net.h"
#include "choix_lang.h"

/*---------------------------------------------------------------------------*/
/*---------------------------------------------------------------------------*/

PSP_MODULE_INFO(MODULE_NAME, 0x1000, 1, 1);

/*------------- Define the main thread's attribute value --------------------*/

PSP_MAIN_THREAD_ATTR(0);

/*------------- dump_threadstatus() -----------------------------------------*/

void dump_threadstatus(void);

/*------------- Rappel de service de sortie ---------------------------------*/

int exit_callback(int arg1, int arg2, void *common)
{
  sceKernelExitGame();
  return 0;
}

/*------------- Rappel de service -------------------------------------------*/

int CallbackThread(SceSize args, void *argp)
{
  int cbid;

  cbid = sceKernelCreateCallback("Exit Callback", exit_callback, NULL);
  sceKernelRegisterExitCallback(cbid);
  sceKernelSleepThreadCB();
  return 0;
}

/*------------- Monte le Rappel de service et envoie son ID -----------------*/

int SetupCallbacks(void)
{
  int thid = 0;

  thid = sceKernelCreateThread("update_thread", CallbackThread, 0x11, 0xFA0, 0, 0);
  if(thid >= 0)
  {
    sceKernelStartThread(thid, 0, 0);
  }

  return thid;
}

/*---------------------------------------------------------------------------*/
/*---------------------------------------------------------------------------*/

int main(void)
{
  SceUID thid;
  int choix = 1;
  char choixL[30];

  pspDebugScreenInit();
  SetupCallbacks();

  if((choix=choix_lang()) < 0)
  {
    printfC(ROUGEA,"Failed : choix_lang() returns < 0. Exit...");
    sceKernelDelayThread(3000 * 1000); //3s
    sceKernelExitGame();
  }

  if(choix == 0)
    sceKernelExitGame();
  else if(choix == 1)
    sprintf(choixL,"%s","Data/langFR.txt");
  else if(choix == 2)
    sprintf(choixL,"%s","Data/langEN.txt");
  else if(choix == 3)
    sprintf(choixL,"%s","Data/langES.txt");
  else if(choix == 4)
    sprintf(choixL,"%s","Data/langIT.txt");
  else
    sprintf(choixL,"%s","Data/langFR.txt");

  if(openLangCfg(choixL,lang) != 0)
  {
    printfC(ROUGEA,"Failed : could not open language file ! Exit...");
    sceKernelDelayThread(3000 * 1000); //3s
    sceKernelExitGame();
  }

  if (pspSdkLoadInetModules() < 0)
  {
    printf("Failed pspSdkLoadInetModules()\n");
    printfC(ROUGEA,lang[24]);
    sceKernelDelayThread(3000 * 1000); //3s
    sceKernelExitGame();
  }

  thid = sceKernelCreateThread("thread_net", thread_net, 0x18, 0x10000, PSP_THREAD_ATTR_USER, NULL);

  if (thid < 0)
  {
    printf("Failed createThread()\n");
    printfC(ROUGEA,lang[25]);
    sceKernelSleepThread();
  }

  sceKernelStartThread(thid, 0, 0);

  while(sceKernelWaitThreadEnd(thid,NULL) != 0) ;;

  free(lang);
  sceKernelExitGame();

  return 0;
}

Et le Makefile d’un projet type PSP :

PSPLIBSDIR = $(PSPSDK)/..
TARGET = WifiConnectv1
OBJS = main.o connect_to_apctl.o choix_apctl.o create_socket.o initialiseNetwork.o thread_net.o transfert.o fonctions.o graphics.o framebuffer.o choix_lang.o
YOURLIBS=

#USE_PSPSDK_LIBC = 1

INCDIR =
CFLAGS = -G0 -Wall -O2
CXXFLAGS = $(CFLAGS) -fno-exceptions -fno-rtti
ASFLAGS = $(CFLAGS)

LIBDIR = ./libj
LDFLAGS =
STDLIBS= -lpspgu -lpng -lz -lm -lpspwlan -lpsppower -lpspdebug -lpspdisplay -lpspge -lpspctrl -lpspsdk -lc -lpspnet -lpspnet_inet -lpspnet_apctl -lpspnet_resolver -lpsputility -lpspuser -lpspkernel
LIBS=$(STDLIBS)$(YOURLIBS)

EXTRA_TARGETS = EBOOT.PBP
PSP_EBOOT_TITLE = Wifi Connect v1
PSP_EBOOT_ICON= ICON0.PNG
PSP_EBOOT_PIC1= PIC1.PNG
PSPSDK=$(shell psp-config --pspsdk-path)
include $(PSPSDK)/lib/build.mak

IV – Sources et liens

Les sources de ce projet sont en téléchargement libre, pas de droits ni de licences. C’est à vous même si je doute que ça serve encore. Il suffit de me les demander par mail :-)

Et voici quelques articles :

http://www.planetepsp.fr/wificonnect-v01-par-couac/2318

http://www.planetepsp.fr/wificonnect-v1/2355

psptests.wordpress.com/2007/06/18/wificonnect-v01/

www.pspgen.com/forums/wifi-connect-v1-t73472.html

  • Print
  • Digg
  • StumbleUpon
  • del.icio.us
  • Facebook
  • Twitter
  • Google Bookmarks
  • FriendFeed
  • LinkedIn
  • MySpace
  • Netvibes
  • PDF
  • Ping.fm
  • RSS
  • Technorati
  • viadeo FR
  • Wikio
  • Yahoo! Buzz

Related Posts

Cet article a été publié dans Ancien blog avec les mots-clefs : , , , . Bookmarker le permalien. Laisser un commentaire ou faire un trackback : URL de trackback.

Laisser un commentaire

Votre e-mail ne sera jamais publié ni communiqué. Les champs obligatoires sont indiqués par *

*
*

Vous pouvez utiliser ces balises et attributs HTML : <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

Subscribe without commenting